From 92f140fa7cb09d7382b67f7f9541e218a1dad04d Mon Sep 17 00:00:00 2001 From: Stephen Hall Date: Mon, 11 Mar 2019 15:23:25 +0000 Subject: [PATCH] Sync from upstream (#1) * Fix Select-DbaBackupInformation $_.LastLSN.ToString() -ge $LogBaseLsn $_.LastLSN.ToString() is STRING, but $LogBaseLsn is BIGINT. Powershell converts [BIGINT]$LogBaseLsn to string and after that compare these variables as strings. * Fix masking (#4942) * Added money type * Added txt data type * added min and maxvalue to money type * otsb * Small fixes Import-DbaXESessionTemplate (#4917) * Update Import-DbaXESessionTemplate.ps1 * Update Import-DbaXESessionTemplate.ps1 * 0.9.740 * ApplicationIntent fixes * 0.9.741 * Update ConvertTo-DbaTimeline.ps1 (#4952) Updated example 3; Send-MailMessage only accepts string for -Body * 0.9.742 * Figure out the new name before doing the checks. Otherwise we may check to see if "sourceInstance default profile" exists on the destination then trying to create "destinationInstance default profile" which already exists. * Update Install-DbaMaintenanceSolution.ps1 Fixed path for output directory in Install-DbaMaintenanceSolution #4950 * Fixed "Succesful" typo (#4960) Addresses Status property spelling error for Successful status. * Adjust unit test (#4961) Adjusting the unit test for `tests/Get-DbaTraceFlag.Tests.ps1` * add example * new improved unit tests * removed link for now :( * update variable names and fix example * Do the same replacement check for accounts. * update to new format * Update replace of SQL commands to just update the @account_name and @profile_name fields Also put single quotes around the account and profile name in messages for readability. * command updates * Update to contributing and readme files (#4976) * adjusting content on contributing guide * adjusting readme content * Changed names of jobs and schedules. Fixes #4972 (#4973) * Changed names of jobs and schedules. Fixes #4972 * Added back the source server name in the default copy and restore job * Unit test updates round 2 (#4977) Unit Test Updates, now uniform and simplified * Add missing unit tests (#4979) * add missing unit tests * fix encoding * support hostnames ending with - (#4978) * 0.9.743 * tests every function has a tests file, and our standard unit tets * typo * adjusting example to use splatting * Updating editor settings for VS Code Added additional settings that I found turned off by default in VS Code now. Also added comments so folks can see a bit more info on why we set what. * 0.9.744 * Update Invoke-ManagedComputerCommand.ps1 User must pass permissions * Fix lower case / upper case Also fix this line $sql = $sql.Replace($db.Name, "") This is wrong because of tempdb on the first line will be replaced. * fixing output mismatch for continue * removing comments * 0.9.745 * Get-DbaProductKey: Get-DbaRegistryRoot add -Credential $Credential * 0.9.747 * typo fixes: efficient -> inefficient. accomodating -> accommodating In the CBH context of table parameter. * fixes #4999 fixes #4998 * Sqlupdate 2016 sp2 cu5 (#5006) * Sqlupdate 2016 sp2 cu5 * Sqlupdate 2016 sp2 cu5 * Sqlupdate 2016 sp2 cu5 * 0.9.748 * buildref, keep in sync (#5007) * removing LSN check from backup * 0.9.749 * Add type switch to gbh call to improve chances of gettign the right backup back * resuse server connection for get-dbadefaultpath * fixed bad db killing the bunch * removing allowcontinue * fixing up parameter count test * 0.9.750 * proposed changes * update docs * Changes to Export-DbaScript to resolve Issue 2914 * fix caps * fixed #4847 * fixed #5013 * First attempt at catching up on changelog * Fix data masking on 724 * Fix failsafe on 725 * Fix remainder of off-by-one errors in release numbers * support -Database properly fixes #5015 * Changelog caught up through end of 2018 * Changelog caught up to 0.9.750 * Changelog caught up to 0.9.750 * typo fix in sync-dbaavailabilitygroup (#5027) Typos fixed in `Sync-DbaAvailabilityGroup` * 0.9.751 * Update Backup-DbaDatabase AzureBaseUrl parameter help Changed a reference from NoCopyOnly to Copy to cleanup help and documentation * Get-DbaDbccMemoryStatus - remove dependency on system.data objects and use standard constructs (#5031) * Remove dependancy on system.Data objects * Fix case of variable * Modify to use the .query custom method * Fixed math (#5040) * Fix Set-DbaAgentJobStep (#5030) * Added option to add job step if it doesn't exist * Added try/catch block for new job step Moved job step settings * Changed param type Fixed if statement * Removed comment in param * Added else statements to alter the job step * Fixed job check Added filter for job and job step Fixed check for job Fixed check for Database and DatabaseUsername * Changed if statements to better check for the variables * Added subsystem server. Fixes #4715 * Formatted it to be the dbatools way * Added check if Server value is set * Reformatted the code * Removed aliases * Added parameter to unit test * Added inputobject parameter * Added help * 0.9.752 * Update New-DbaAgentJobCategory.ps1 (#5042) changed $instance to $server to fix authentication issue * fixes piping issue (#5041) * Update settings.json (#5054) * Added check if database from $Database array is accessible or not before getting roles membership (#5046) * Added check if database from $Database array is accessible or not before getting roles membership * add messaging in verbose mode * Invoke-DbatoolsFormatter * add LoginType to returned [PSCustomObject]$user * Revert "add LoginType to returned [PSCustomObject]$user" This reverts commit 9286f97eeaee224e7d42f1b7ac9b08e92efe59e0. revert last commit * Update Get-DbaDbRoleMember.ps1 got rid of try/catch add Logintype to output * Added Stop-Function calls to fix #5050 (#5052) * Added Stop-Function calls to fix #5050 * Simplified catch block to auto pass $EnableException to Stop-Function * Pass -Force through to Set-DbaDbState (#5057) * Fixes for Update-DbaInstance: parallelism, exceptions (#5053) * Changing error handling in internal functions + minor fixes * Removing $EnableException param * 0.9.753 * 0.9.751 Changes * 0.9.752 changes * 0.9.753 changes * Correct EOL date for 2014 SP2 * 0.9.754 * deprecating AllowContinue * fixing tests after putting param back in * buildref, bump date * Initial commit of New-DbaDbMailProfile, need to add integration tests * Add project support for VSCode plugin `markdownlint`. List of rules at https: //github.com/DavidAnson/markdownlint/blob/v0.11.0/doc/Rules.md Various fixes pointed out by markdownlint * fixing type in tests * doubling up on param names fixed * updating Invoke-DbaDbUpgrade for #5047 this fixes #5047 by checking if each object is in the array instead of containing the array. Also applied to the ExcludeDatabase option * 0.9.755 * test for existence first * Get-DecryptedObject - Lowercase sys.credentials * Copy-DbaLinkedServer - check ProductName * Update Get-DecryptedObject.ps1 * 0.9.757 * New function to support multithreading * Tests for advanced update function * Removing lab computer names * fixes issue #5090 and adds test coverage for it * fix for test * 0.9.770 * Clarified comments on sequenceNumber * Fix naming conventions * Removed unused integration tests. Added test for $priority. * Fix wrong variable names in tests * Add new login support for Azure SQL Dbs Fixes #5100 * Correct formatting * Changelog catchup (#5098) * Catch up to 0.9.755 * 757 * Caught up to 0.9.770 * change bom * added account, removed tests for properties that do not exist * 0.9.771 adding current commands and prepping for future command * buildref, added cu2 for 2014sp3 and cu16 for 2014sp2 (#5107) * Changelog for 0.9.771 (#5105) * Fixed self-building process (#5111) * Fixed self-building process * fixed indents * Add handler for AllUserDatabases to resolve Issue 5108 (#5110) * Add handler fro AllUserDatabases to resolve Issue 5108 * Fix OTSB Issue * adding SmartTarget tag to those cmds using it (#5109) * 0.9.772 * Corrected property names for job start & end dates (#5115) * Add namespace variable so that full type name can be resolved (#5114) * Update Install-DbaMaintenanceSolution to fix #5096 (#5112) Changed $instance to $server to fix sql authentication issue during job removal in a -ReplaceExisting scenario * 0.9.773 * Make Backup-DbaDatabase use Database and ExcludeDatabase when piping (#5069) * fixes #5044 * fix one test * in instead of contains * 0.9.773 changelog (#5118) * Pass Login values to Copy-DbaLogin (#5120) Call to `Copy-DbaLogin` simply didn't pass the values. Fixes #5119 * Update Copy-DbaAgentAlert.ps1 Added check to make sure the operator exists at the destination before creating the alert. If not, skip the alert and update the output object. * Update Copy-DbaAgentAlert.ps1 Removed trailing spaces per failed test: "176Describe : dbatools style 177Context : indentation 178Name : It Copy-DbaAgentAlert.ps1 has no trailing spaces (line(s) 154,156) 179Result : Failed 180Message : Expected 0, but got 2." * Fix masking commands (#5071) * Added check for unique indexes * Added procedure to make up what the unique indexes are build with Added check if excluded column is in a unique index * Added table * Added extra options for data generation * Removed unused rowcount Added unique value dictionary creation * Added format for masking types * Added support for using formatting of values * Added check if any masking info is present * Implemented unique index support * Renamed variable * Revert "Renamed variable" This reverts commit 3f7adb8899e54203a26bbe5d242b7ef298154b76. * Renamed variable and applied formatiing * Fixed errors in unique value generation * Added variable for the unique value columns Changed the if statement for the unique columns * Explicitly reset the new value variable * Moved variables to make sure they get cleared in the loop * Removed date selection Added section for finance. Can be used for other types that support max * Revert "Removed date selection" This reverts commit 6ec4f168c7954cb65aab06c30d9d654a104bde19. * Added section for support of max * Added part for finance * Removed finance from other section * Changed if statement to switch * Changed switch back to if statement Removed sections Added finance to other section * Removed section for finance * Added checks for supported data types, masking types and sub types * Moved retrieval of method and properties to begin Changed if statements for types * Changed message of unsupported types * Added new known types Added format key to known types * Added extra known types * Implemented support for text and ntext data types * Added ntext and text data types * Added decimal data type * Moved data retrieval down * Added types and synonyms Rearranged the types to be in alphabetical order * Added types * Added types to automatically assign the right maskingtype * Improved the check for supported data types * Fixed bug missing curly bracket * Moved the retrieval of the data Implemented selective columns for data retrieval * Changed back to SELECT * instead of selective columns * Changed the SELECT * to be selective columns from table and not object * Moved data retrieval Changed where statement build-up * Removed debug query outputs * Moved where build-up * Added special conversion to date and datetime columns * Fixed bug with missing comma * Added error record * Removed unneccesary if statement Fixed bug with TEXT and NTEXT cast in WHERE clause * Implemented handling of temporal values generation Formatted code * Fixed bool handling * Added decimal type * Added fax synonyms * Fixed bool handling * Updates test should statement * Changed back the should statement * Enabled rdp * Changed rdp password * Formatted test * Reset appveyor.yml to original settings * Changed instance * Changed instance * Changed instance back * Added credential * 0.9.773 * change instance * Make Backup-DbaDatabase use Database and ExcludeDatabase when piping (#5069) * fixes #5044 * fix one test * in instead of contains * 0.9.773 changelog (#5118) * Pass Login values to Copy-DbaLogin (#5120) Call to `Copy-DbaLogin` simply didn't pass the values. Fixes #5119 * Updated test to use other instance * Enabled RDP * Set RDP to be started before tests * Removed RDP option again * Added fix for datetime * Formatted code * Added extra check for temporal tables * Changed test back to 2008 instance * 0.9.774 * fix comparison issue * 0.9.775 * Update Copy-DbaAgentAlert.ps1 Incorporated approach by @alevyinroc at https://github.com/alevyinroc/dbatools/commit/8a8a8daa32cca2140071b09aef63abd6db5122e2 . Fixed issues mentioned in review by @wsmelton - thank you! * Update Copy-DbaAgentAlert.ps1 Checked for $null $sourceAlertOperators so Compare-Object wouldn't fail with a $null -ReferenceObject. * Update Copy-DbaAgentAlert.ps1 Removed trailing spaces. * Add testing for skipped wen operator not there * Update Copy-DbaAgentAlert.ps1 Un-did changes using external command Compare-Object which has poor performance and problems with errors and put in approach by @wsmelton. Thanks, Shawn! * fix path issues * Update Backup-DbaDbCertificate.ps1 adding the Certificate param to the call out to Get-DbaDbCertificate * Doc update - correcting example in Export-DbaDacPackage * Doc update - fixing example for Invoke-DbaAdvancedUpdate (#5143) * Doc update - Fix example in Read-DbaBackupHeader * Doc update - Fix example in Get-DbaSsisExecutionHistory (#5140) * Doc update - Fixing command reference in examples and link - Get-DbaDbccUserOption (#5141) * Changes to Restart-DbaService to resolve Issue 5128 (#5145) * Update Get-DbaUserPermission.ps1 (#5135) Changing the cleanup query to run on tempdb * Get-DbaServerRoleMember - Correcting call to child call for Get-DbaLogin (#5132) * format and correcting connect issue to login cmd * remove restart of agent (test don't require runing state) * 0.9.777 * Fixed where statements * Formatted code * Fix bug in Get-DbaDbFile NextGrowthEventSize Update $nextgrowtheventadd calculation for Percent growth types to account for file size being returned in pages. Also, update $nextgrowtheventadd calculation for non-Percent growth types to not account for file size being returned in pages as the "* 8" calculation is already performed in the T-SQL calls when growth is not percent-based. * 0.9.778 * Add Registered Server Support for Core (mac/linux) (#5153) * bulk changes to support CMS / Registered Servers * moved some commands * 0.9.779 * CommandExecute.sql only runs if $Solution = "All" * some additions * yesss * enable azure for .Query() * added for invoke as well * remove comments * 0.9.780 * fixed windows check * make sure it queries something * fixed formatting * formatting * Merge pull request #5157 from SQLGB/patch-1 Update Get-DbaAgentJobHistory.ps1 * Include WindowsGroup login types * remove output * Look at $ads to get domain name instead of parsing from the group's DN. * connstring fixes * formatting * 0.9.781 * Use ProviderPath property to allow for UNC paths * removed default * enable no transaction fixes #5159 * fix found bug * updated and added tests * moved commands to proper location * 0.9.774 changes * 0.9.775 updates * 0.9.777 changes * 0.9.778 updates * 0.9.779 changes * 0.9.780 changes * 0.9.781 changes * Correct date on 0.9.781 * more azure support (#5172) * removed unnecessary params and added azure support * added feature parity to connect-dbainstance * Newazur (#5178) added documentation * 0.9.782 * Connect consolidation (#5180) Connect-SqlInstance -> Connect-DbaInstance * remove extra info * fix tests that take too long * Fix debug and Path is null issues (#5183) * add debug by default and dbatools_enabledebug * remove missing files * discard leftovers * put dac back * A few more azure fixes (#5185) * more azure fixes * return azure connstring * add new db support for azure * remove open requirement * Invoke-DbaDbDataMasking - made azure compliant, probably (#5184) * made azure compliant, probably * fix path for azure * fix - before i was getting null exceptions --- .github/ISSUE_TEMPLATE/Bug_Report.md | 3 + .github/PULL_REQUEST_TEMPLATE.md | 1 + .markdownlint.json | 7 + .vscode/dbatools.code-snippets | 257 + .vscode/settings.json | 14 +- allcommands.ps1 | 115834 +++++++++++++++ allcommands.zip | Bin 873118 -> 0 bytes appveyor.yml | 2 +- bin/build-project.ps1 | 45 +- bin/datamasking/Bogus.dll | Bin 0 -> 1920000 bytes bin/datamasking/columntypes.json | 162 + bin/datamasking/example.tables.json | 48 + bin/datamasking/firstnames_all.txt | 5163 + bin/datamasking/firstnames_female.txt | 4274 + bin/datamasking/firstnames_male.txt | 1219 + bin/datamasking/lastnames_all.txt | 88798 +++++++++++ bin/dbatools-buildref-index.json | 7991 +- bin/dbatools-index.json | 10220 +- bin/dbatools.dll | Bin 140800 -> 140288 bytes bin/dbatools.png | Bin 0 -> 8046 bytes ...QLServerDiagnosticQueries_2005_201901.sql} | 52 +- ...ServerDiagnosticQueries_2008R2_201901.sql} | 49 +- ...QLServerDiagnosticQueries_2008_201901.sql} | 54 +- ...QLServerDiagnosticQueries_2012_201901.sql} | 59 +- ...QLServerDiagnosticQueries_2014_201901.sql} | 228 +- ...erverDiagnosticQueries_2016SP2_201901.sql} | 303 +- ...QLServerDiagnosticQueries_2016_201901.sql} | 254 +- ...QLServerDiagnosticQueries_2017_201901.sql} | 317 +- ...SQLServerDiagnosticQueries_2019_201901.sql | 1997 + ...nosticQueries_AzureSQLDatabase_201901.sql} | 64 +- bin/library.ps1 | 37 +- bin/net452/dbatools.dll | Bin 140800 -> 140288 bytes bin/net452/dbatools.pdb | Bin 392704 -> 392704 bytes bin/netcoreapp2.1/dbatools.deps.json | 4 +- bin/netcoreapp2.1/dbatools.dll | Bin 140800 -> 140800 bytes bin/netcoreapp2.1/dbatools.pdb | Bin 392704 -> 392704 bytes .../dbatools/dbatools/Utility/RegexHelper.cs | 6 +- bin/smo/Microsoft.Build.Framework.dll | Bin 0 -> 120368 bytes bin/smo/Microsoft.Build.Utilities.Core.dll | Bin 0 -> 388144 bytes bin/smo/Microsoft.Data.Tools.Contracts.dll | Bin 101088 -> 0 bytes ...crosoft.Data.Tools.Schema.SqlTasks.targets | 2070 - ...rosoft.Data.Tools.Schema.Utilities.Sql.dll | Bin 1586400 -> 0 bytes ...r.IntegrationServices.SqlTaskScheduler.dll | Bin 39608 -> 0 bytes ...Server.IntegrationServices.WorkerAgent.dll | Bin 163000 -> 0 bytes ...r.Management.Dac.UniversalAuthProvider.dll | Bin 24296 -> 0 bytes ...anagement.InMemoryOLTPMigrationAdvisor.dll | Bin 154344 -> 0 bytes ...oft.SqlServer.Management.SDK.SqlStudio.dll | Bin 135400 -> 0 bytes bin/smo/Microsoft.SqlServer.TransactSql.dll | Bin 0 -> 65752 bytes bin/smo/System.Collections.Immutable.dll | Bin 0 -> 358536 bytes .../Microsoft.Data.Tools.Sql.BatchParser.dll | Bin 47968 -> 47752 bytes .../Microsoft.SqlServer.ConnectionInfo.dll | Bin 151384 -> 151176 bytes .../Microsoft.SqlServer.Management.Dmf.dll | Bin 67416 -> 67208 bytes ...rosoft.SqlServer.Management.PSProvider.dll | Bin 78688 -> 87688 bytes ...crosoft.SqlServer.Management.PSSnapins.dll | Bin 273752 -> 275592 bytes ...SqlServer.Management.RegisteredServers.dll | Bin 0 -> 77448 bytes ...Microsoft.SqlServer.Management.Sdk.Sfc.dll | Bin 523616 -> 524936 bytes .../Microsoft.SqlServer.Management.XEvent.dll | Bin 138080 -> 137864 bytes ...ft.SqlServer.Management.XEventDbScoped.dll | Bin 50016 -> 49800 bytes ...qlServer.Management.XEventDbScopedEnum.dll | Bin 48992 -> 48776 bytes ...rosoft.SqlServer.Management.XEventEnum.dll | Bin 45400 -> 45192 bytes bin/smo/coreclr/Microsoft.SqlServer.Smo.dll | Bin 3716448 -> 3744392 bytes .../Microsoft.SqlServer.SmoExtended.dll | Bin 173408 -> 175240 bytes .../coreclr/Microsoft.SqlServer.SqlEnum.dll | Bin 1448304 -> 1455752 bytes .../coreclr/Microsoft.SqlTools.Hosting.dll | Bin 0 -> 106096 bytes .../Microsoft.SqlTools.ManagedBatchParser.dll | Bin 0 -> 171632 bytes bin/smo/coreclr/System.Data.SqlClient.dll | Bin 0 -> 260344 bytes bin/smo/smo-deps.txt | 1 + bin/stig.sql | 8 +- changelog.md | 411 +- contributing.md | 101 +- dbatools.psd1 | 246 +- dbatools.psm1 | 100 +- functions/Add-DbaAgDatabase.ps1 | 4 +- functions/Add-DbaAgReplica.ps1 | 1 + functions/Backup-DbaDatabase.ps1 | 65 +- functions/Backup-DbaDbCertificate.ps1 | 2 +- functions/Connect-DbaInstance.ps1 | 266 +- functions/ConvertTo-DbaDataTable.ps1 | 4 +- functions/ConvertTo-DbaTimeline.ps1 | 2 +- functions/Copy-DbaAgentAlert.ps1 | 17 + functions/Copy-DbaDatabase.ps1 | 8 +- functions/Copy-DbaDbMail.ps1 | 52 +- functions/Copy-DbaDbTableData.ps1 | 8 +- functions/Copy-DbaLinkedServer.ps1 | 4 +- functions/Copy-DbaSsisCatalog.ps1 | 1 + functions/Disable-DbaTraceFlag.ps1 | 2 +- functions/Enable-DbaTraceFlag.ps1 | 2 +- functions/Export-DbaDacPackage.ps1 | 11 +- functions/Find-DbaBackup.ps1 | 4 + functions/Find-DbaCommand.ps1 | 8 +- functions/Find-DbaLoginInGroup.ps1 | 4 +- functions/Format-DbaBackupInformation.ps1 | 59 +- functions/Get-DbaAgentJobHistory.ps1 | 4 +- functions/Get-DbaAgentSchedule.ps1 | 8 +- functions/Get-DbaBackupHistory.ps1 | 14 +- functions/Get-DbaBackupInformation.ps1 | 70 +- functions/Get-DbaBuildReference.ps1 | 117 +- functions/Get-DbaDatabase.ps1 | 13 +- functions/Get-DbaDbDbccOpenTran.ps1 | 133 + functions/Get-DbaDbFile.ps1 | 235 +- functions/Get-DbaDbIdentity.ps1 | 140 + ...OrphanUser.ps1 => Get-DbaDbOrphanUser.ps1} | 14 +- functions/Get-DbaDbRoleMember.ps1 | 11 +- functions/Get-DbaDbSpace.ps1 | 153 +- functions/Get-DbaDbccMemoryStatus.ps1 | 10 +- functions/Get-DbaDbccProcCache.ps1 | 32 +- functions/Get-DbaDbccSessionBuffer.ps1 | 229 + functions/Get-DbaDbccStatistic.ps1 | 262 + functions/Get-DbaDbccUserOption.ps1 | 10 +- functions/Get-DbaDependency.ps1 | 38 +- functions/Get-DbaLogin.ps1 | 2 +- functions/Get-DbaPowerPlan.ps1 | 2 + functions/Get-DbaProductKey.ps1 | 2 +- functions/Get-DbaServerRoleMember.ps1 | 9 +- functions/Get-DbaSsisExecutionHistory.ps1 | 2 +- functions/Get-DbaTraceFlag.ps1 | 2 +- functions/Get-DbaUserPermission.ps1 | 23 +- functions/Import-DbaCsv.ps1 | 175 +- functions/Import-DbaXESessionTemplate.ps1 | 13 +- functions/Install-DbaMaintenanceSolution.ps1 | 54 +- functions/Invoke-DbaAdvancedRestore.ps1 | 4 +- functions/Invoke-DbaAdvancedUpdate.ps1 | 200 + functions/Invoke-DbaDbClone.ps1 | 12 +- functions/Invoke-DbaDbDataMasking.ps1 | 657 + functions/Invoke-DbaDbDbccCheckConstraint.ps1 | 213 + functions/Invoke-DbaDbDbccCleanTable.ps1 | 161 + functions/Invoke-DbaDbDbccUpdateUsage.ps1 | 195 + functions/Invoke-DbaDbLogShipping.ps1 | 29 +- functions/Invoke-DbaDbMirroring.ps1 | 4 +- functions/Invoke-DbaDbShrink.ps1 | 20 +- functions/Invoke-DbaDbUpgrade.ps1 | 4 +- functions/Invoke-DbaDbccDropCleanBuffer.ps1 | 113 + functions/Invoke-DbaDbccFreeCache.ps1 | 2 +- functions/Invoke-DbaDiagnosticQuery.ps1 | 10 +- functions/Invoke-DbaQuery.ps1 | 26 +- functions/Invoke-SqlCmd2.ps1 | 283 - functions/New-DbaAgentJobCategory.ps1 | 2 +- functions/New-DbaAgentProxy.ps1 | 2 +- functions/New-DbaAvailabilityGroup.ps1 | 2 +- functions/New-DbaConnectionString.ps1 | 65 +- functions/New-DbaDatabase.ps1 | 1 + functions/New-DbaDbMailProfile.ps1 | 101 + functions/New-DbaDbMaskingConfig.ps1 | 660 + functions/New-DbaLogin.ps1 | 8 +- functions/New-DbaXESession.ps1 | 2 +- functions/New-DbaXESmartCsvWriter.ps1 | 2 +- functions/New-DbaXESmartEmail.ps1 | 2 +- functions/New-DbaXESmartQueryExec.ps1 | 2 +- functions/New-DbaXESmartReplay.ps1 | 2 +- functions/New-DbaXESmartTableWriter.ps1 | 2 +- functions/New-DbatoolsSupportPackage.ps1 | 16 +- functions/Publish-DbaDacPackage.ps1 | 134 +- functions/Read-DbaBackupHeader.ps1 | 2 +- functions/Remove-DbaAgReplica.ps1 | 2 +- functions/Remove-DbaDatabaseSafely.ps1 | 2 +- ...hanUser.ps1 => Remove-DbaDbOrphanUser.ps1} | 31 +- functions/Remove-DbaTrace.ps1 | 4 +- ...hanUser.ps1 => Repair-DbaDbOrphanUser.ps1} | 31 +- functions/Reset-DbaAdmin.ps1 | 9 +- functions/Resolve-DbaNetworkName.ps1 | 290 +- functions/Restart-DbaService.ps1 | 2 +- functions/Restore-DbaDatabase.ps1 | 69 +- functions/Save-DbaDiagnosticQueryScript.ps1 | 11 +- functions/Select-DbaBackupInformation.ps1 | 4 +- functions/Set-DbaAgentAlert.ps1 | 4 +- functions/Set-DbaAgentJob.ps1 | 10 +- functions/Set-DbaAgentJobOwner.ps1 | 2 +- functions/Set-DbaAgentJobStep.ps1 | 344 +- functions/Set-DbaAgentSchedule.ps1 | 4 +- functions/Set-DbaDbIdentity.ps1 | 168 + functions/Set-DbaDbState.ps1 | 2 +- functions/Set-DbaLogin.ps1 | 19 + functions/Set-DbaSpn.ps1 | 8 +- functions/Start-DbaMigration.ps1 | 37 +- functions/Start-DbaXESmartTarget.ps1 | 2 +- functions/Sync-DbaAvailabilityGroup.ps1 | 14 +- ...JobOwner.ps1 => Test-DbaAgentJobOwner.ps1} | 0 functions/Test-DbaBackupInformation.ps1 | 17 +- functions/Test-DbaBuild.ps1 | 2 +- functions/Test-DbaConnection.ps1 | 47 +- functions/Test-DbaDbOwner.ps1 | 16 +- functions/Test-DbaDiskSpeed.ps1 | 3 +- functions/Test-DbaLastBackup.ps1 | 7 +- functions/Update-DbaInstance.ps1 | 197 +- functions/Write-DbaDataTable.ps1 | 14 +- internal/configurations/settings/remoting.ps1 | 5 +- internal/functions/Connect-SqlInstance.ps1 | 304 +- internal/functions/Find-SqlServerUpdate.ps1 | 29 +- internal/functions/Get-DecryptedObject.ps1 | 4 +- .../functions/Get-SqlInstanceComponent.ps1 | 26 +- internal/functions/Get-SqlServerUpdate.ps1 | 175 + .../functions/Get-XpDirTreeRestoreFile.ps1 | 6 +- internal/functions/Initialize-CredSSP.ps1 | 3 +- .../functions/Install-SqlServerUpdate.ps1 | 260 - internal/functions/Invoke-Command2.ps1 | 17 +- .../functions/Invoke-CommandWithFallback.ps1 | 52 + ...ruption.ps1 => Invoke-DbaDbCorruption.ps1} | 12 +- .../Invoke-ManagedComputerCommand.ps1 | 4 +- internal/functions/Invoke-Program.ps1 | 126 +- .../New-DbaLogShippingPrimaryDatabase.ps1 | 79 +- .../New-DbaLogShippingSecondaryDatabase.ps1 | 70 +- .../Register-RemoteSessionConfiguration.ps1 | 29 +- internal/functions/Resolve-IpAddress.ps1 | 7 +- internal/functions/Resolve-SqlIpAddress.ps1 | 2 +- internal/functions/Restart-WinRMService.ps1 | 4 +- internal/functions/Test-PSRemoting.ps1 | 2 +- internal/functions/Test-PendingReboot.ps1 | 60 +- .../Unregister-RemoteSessionConfiguration.ps1 | 15 +- internal/functions/Write-ProgressHelper.ps1 | 19 +- .../flowcontrol/Test-ElevationRequirement.ps1 | 2 +- internal/scripts/smoLibraryImport.ps1 | 85 +- readme.md | 61 +- tests/Add-DbaAgDatabase.Tests.ps1 | 18 +- tests/Add-DbaAgListener.Tests.ps1 | 18 +- tests/Add-DbaAgReplica.Tests.ps1 | 14 +- tests/Add-DbaCmsRegServer.Tests.ps1 | 22 +- tests/Add-DbaCmsRegServerGroup.Tests.ps1 | 22 +- tests/Add-DbaComputerCertificate.Tests.ps1 | 14 +- tests/Add-DbaDbMirrorMonitor.Tests.ps1 | 22 +- tests/Add-DbaPfDataCollectorCounter.Tests.ps1 | 14 +- tests/Backup-DbaDatabase.Tests.ps1 | 63 +- tests/Backup-DbaDbCertificate.Tests.ps1 | 14 +- tests/Backup-DbaDbMasterKey.Tests.ps1 | 14 +- tests/Clear-DbaConnectionPool.Tests.ps1 | 14 +- tests/Clear-DbaLatchStatistics.Tests.ps1 | 22 +- tests/Clear-DbaPlanCache.Tests.ps1 | 14 +- tests/Clear-DbaWaitStatistics.Tests.ps1 | 14 +- tests/Connect-DbaInstance.Tests.ps1 | 14 +- tests/Connect-SqlInstance.Tests.ps1 | 12 + tests/ConvertTo-DbaDataTable.Tests.ps1 | 14 +- tests/ConvertTo-DbaTimeline.Tests.ps1 | 14 +- tests/ConvertTo-DbaXESession.Tests.ps1 | 14 +- tests/Copy-DbaAgentAlert.Tests.ps1 | 61 +- tests/Copy-DbaAgentJob.Tests.ps1 | 14 +- tests/Copy-DbaAgentJobCategory.Tests.ps1 | 14 +- tests/Copy-DbaAgentOperator.Tests.ps1 | 14 +- tests/Copy-DbaAgentProxy.Tests.ps1 | 14 +- tests/Copy-DbaAgentSchedule.Tests.ps1 | 14 +- tests/Copy-DbaAgentServer.Tests.ps1 | 14 +- tests/Copy-DbaBackupDevice.Tests.ps1 | 14 +- tests/Copy-DbaCmsRegServer.Tests.ps1 | 14 +- tests/Copy-DbaCredential.Tests.ps1 | 14 +- tests/Copy-DbaCustomError.Tests.ps1 | 14 +- tests/Copy-DbaDataCollector.Tests.ps1 | 14 +- tests/Copy-DbaDatabase.Tests.ps1 | 14 +- tests/Copy-DbaDbAssembly.Tests.ps1 | 14 +- tests/Copy-DbaDbMail.Tests.ps1 | 14 +- tests/Copy-DbaDbQueryStoreOption.Tests.ps1 | 14 +- tests/Copy-DbaDbTableData.Tests.ps1 | 14 +- tests/Copy-DbaEndpoint.Tests.ps1 | 14 +- tests/Copy-DbaLinkedServer.Tests.ps1 | 14 +- tests/Copy-DbaLogin.Tests.ps1 | 14 +- tests/Copy-DbaPolicyManagement.Tests.ps1 | 14 +- tests/Copy-DbaResourceGovernor.Tests.ps1 | 14 +- tests/Copy-DbaServerAudit.Tests.ps1 | 10 +- ...Copy-DbaServerAuditSpecification.Tests.ps1 | 14 +- tests/Copy-DbaServerTrigger.Tests.ps1 | 14 +- tests/Copy-DbaSpConfigure.Tests.ps1 | 14 +- tests/Copy-DbaSsisCatalog.Tests.ps1 | 14 +- tests/Copy-DbaSysDbUserObject.Tests.ps1 | 14 +- tests/Copy-DbaXESession.Tests.ps1 | 14 +- tests/Copy-DbaXESessionTemplate.Tests.ps1 | 14 +- tests/Disable-DbaAgHadr.Tests.ps1 | 18 +- tests/Disable-DbaFilestream.Tests.ps1 | 21 +- ...isable-DbaForceNetworkEncryption.Tests.ps1 | 14 +- tests/Disable-DbaTraceFlag.Tests.ps1 | 14 +- tests/Dismount-DbaDatabase.Tests.ps1 | 14 +- tests/Enable-DbaAgHadr.Tests.ps1 | 18 +- tests/Enable-DbaFilestream.Tests.ps1 | 21 +- ...Enable-DbaForceNetworkEncryption.Tests.ps1 | 14 +- tests/Enable-DbaTraceFlag.Tests.ps1 | 14 +- tests/Expand-DbaDbLogFile.Tests.ps1 | 14 +- tests/Export-DbaAvailabilityGroup.Tests.ps1 | 14 +- tests/Export-DbaCmsRegServer.Tests.ps1 | 22 +- tests/Export-DbaCredential.Tests.ps1 | 14 +- tests/Export-DbaDacPackage.Tests.ps1 | 14 +- tests/Export-DbaDiagnosticQuery.Tests.ps1 | 14 +- tests/Export-DbaExecutionPlan.Tests.ps1 | 14 +- tests/Export-DbaInstance.Tests.ps1 | 14 +- tests/Export-DbaLinkedServer.Tests.ps1 | 14 +- tests/Export-DbaLogin.Tests.ps1 | 14 +- ...rt-DbaPfDataCollectorSetTemplate.Tests.ps1 | 14 +- tests/Export-DbaRepServerSetting.Tests.ps1 | 14 +- tests/Export-DbaScript.Tests.ps1 | 14 +- tests/Export-DbaSpConfigure.Tests.ps1 | 14 +- tests/Export-DbaUser.Tests.ps1 | 14 +- tests/Export-DbaXECsv.Tests.ps1 | 14 +- tests/Export-DbaXESessionTemplate.Tests.ps1 | 14 +- tests/Export-DbatoolsConfig.Tests.ps1 | 19 + tests/Find-DbaAgentJob.Tests.ps1 | 14 +- tests/Find-DbaBackup.Tests.ps1 | 10 +- tests/Find-DbaCommand.Tests.ps1 | 14 +- tests/Find-DbaDatabase.Tests.ps1 | 21 +- tests/Find-DbaDbGrowthEvent.Tests.ps1 | 14 +- tests/Find-DbaDbUnusedIndex.Tests.ps1 | 14 +- tests/Find-DbaDisabledIndex.Tests.ps1 | 14 +- tests/Find-DbaDuplicateIndex.Tests.ps1 | 14 +- tests/Find-DbaInstance.Tests.ps1 | 14 +- tests/Find-DbaLoginInGroup.Tests.ps1 | 14 +- tests/Find-DbaOrphanedFile.Tests.ps1 | 14 +- tests/Find-DbaSimilarTable.Tests.ps1 | 14 +- tests/Find-DbaStoredProcedure.Tests.ps1 | 14 +- tests/Find-DbaTrigger.Tests.ps1 | 14 +- tests/Find-DbaUserObject.Tests.ps1 | 14 +- tests/Find-DbaView.Tests.ps1 | 14 +- tests/Format-DbaBackupInformation.Tests.ps1 | 14 +- tests/Get-DbaAgDatabase.Tests.ps1 | 18 +- tests/Get-DbaAgHadr.Tests.ps1 | 14 +- tests/Get-DbaAgListener.Tests.ps1 | 18 +- tests/Get-DbaAgReplica.Tests.ps1 | 18 +- tests/Get-DbaAgentAlert.Tests.ps1 | 14 +- tests/Get-DbaAgentJob.Tests.ps1 | 14 +- tests/Get-DbaAgentJobCategory.Tests.ps1 | 14 +- tests/Get-DbaAgentJobHistory.Tests.ps1 | 14 +- tests/Get-DbaAgentJobOutputFile.Tests.ps1 | 14 +- tests/Get-DbaAgentJobStep.Tests.ps1 | 10 +- tests/Get-DbaAgentLog.Tests.ps1 | 14 +- tests/Get-DbaAgentOperator.Tests.ps1 | 14 +- tests/Get-DbaAgentProxy.Tests.ps1 | 14 +- tests/Get-DbaAgentSchedule.Tests.ps1 | 48 +- tests/Get-DbaAgentServer.Tests.ps1 | 14 +- tests/Get-DbaAvailabilityGroup.Tests.ps1 | 18 +- tests/Get-DbaAvailableCollation.Tests.ps1 | 14 +- tests/Get-DbaBackupDevice.Tests.ps1 | 18 +- tests/Get-DbaBackupHistory.Tests.ps1 | 29 +- tests/Get-DbaBackupInformation.Tests.ps1 | 14 +- tests/Get-DbaBuildReference.Tests.ps1 | 14 +- tests/Get-DbaClientAlias.Tests.ps1 | 14 +- tests/Get-DbaClientProtocol.Tests.ps1 | 14 +- tests/Get-DbaClusterAvailableDisk.Tests.ps1 | 27 - tests/Get-DbaCmConnection.Tests.ps1 | 14 +- tests/Get-DbaCmObject.Tests.ps1 | 14 +- tests/Get-DbaCmsRegServer.Tests.ps1 | 22 +- tests/Get-DbaCmsRegServerGroup.Tests.ps1 | 22 +- tests/Get-DbaCmsRegServerStore.Tests.ps1 | 22 +- tests/Get-DbaComputerCertificate.Tests.ps1 | 14 +- tests/Get-DbaComputerSystem.Tests.ps1 | 29 +- tests/Get-DbaConnection.Tests.ps1 | 14 +- tests/Get-DbaCpuRingBuffer.Tests.ps1 | 22 +- tests/Get-DbaCpuUsage.Tests.ps1 | 14 +- tests/Get-DbaCredential.Tests.ps1 | 14 +- tests/Get-DbaCustomError.Tests.ps1 | 36 +- tests/Get-DbaDatabase.Tests.ps1 | 14 +- tests/Get-DbaDbAssembly.Tests.ps1 | 14 +- tests/Get-DbaDbCertificate.Tests.ps1 | 14 +- tests/Get-DbaDbCheckConstraint.Tests.ps1 | 14 +- tests/Get-DbaDbCompatibility.Tests.ps1 | 14 +- tests/Get-DbaDbCompression.Tests.ps1 | 14 +- tests/Get-DbaDbDbccOpenTran.Tests.ps1 | 41 + tests/Get-DbaDbEncryption.Tests.ps1 | 14 +- tests/Get-DbaDbExtentDiff.Tests.ps1 | 14 +- tests/Get-DbaDbFeatureUsage.Tests.ps1 | 56 +- tests/Get-DbaDbFile.Tests.ps1 | 14 +- tests/Get-DbaDbForeignKey.Tests.ps1 | 14 +- tests/Get-DbaDbIdentity.Tests.ps1 | 53 + tests/Get-DbaDbLogShipError.Tests.ps1 | 12 +- tests/Get-DbaDbMail.Tests.ps1 | 32 +- tests/Get-DbaDbMailAccount.Tests.ps1 | 18 +- tests/Get-DbaDbMailConfig.Tests.ps1 | 34 +- tests/Get-DbaDbMailHistory.Tests.ps1 | 112 +- tests/Get-DbaDbMailLog.Tests.ps1 | 76 +- tests/Get-DbaDbMailProfile.Tests.ps1 | 18 +- tests/Get-DbaDbMailServer.Tests.ps1 | 14 +- tests/Get-DbaDbMasterKey.Tests.ps1 | 14 +- tests/Get-DbaDbMemoryUsage.Tests.ps1 | 17 +- tests/Get-DbaDbMirror.Tests.ps1 | 14 +- tests/Get-DbaDbMirrorMonitor.Tests.ps1 | 14 +- ...ests.ps1 => Get-DbaDbOrphanUser.Tests.ps1} | 16 +- tests/Get-DbaDbPageInfo.Tests.ps1 | 14 +- tests/Get-DbaDbPartitionFunction.Tests.ps1 | 14 +- tests/Get-DbaDbPartitionScheme.Tests.ps1 | 14 +- tests/Get-DbaDbQueryStoreOption.Tests.ps1 | 14 +- tests/Get-DbaDbRecoveryModel.Tests.ps1 | 14 +- tests/Get-DbaDbRestoreHistory.Tests.ps1 | 14 +- tests/Get-DbaDbRoleMember.Tests.ps1 | 17 +- tests/Get-DbaDbSharePoint.Tests.ps1 | 14 +- tests/Get-DbaDbSnapshot.Tests.ps1 | 14 +- tests/Get-DbaDbSpace.Tests.ps1 | 20 +- tests/Get-DbaDbState.Tests.ps1 | 14 +- tests/Get-DbaDbStoredProcedure.Tests.ps1 | 21 +- tests/Get-DbaDbTable.Tests.ps1 | 14 +- tests/Get-DbaDbTrigger.Tests.ps1 | 14 +- tests/Get-DbaDbUdf.Tests.ps1 | 14 +- tests/Get-DbaDbUser.Tests.ps1 | 14 +- tests/Get-DbaDbView.Tests.ps1 | 15 +- tests/Get-DbaDbVirtualLogFile.Tests.ps1 | 21 +- tests/Get-DbaDbccHelp.Tests.ps1 | 21 +- tests/Get-DbaDbccMemoryStatus.Tests.ps1 | 21 +- tests/Get-DbaDbccProcCache.Tests.ps1 | 21 +- tests/Get-DbaDbccSessionBuffer.Tests.ps1 | 71 + tests/Get-DbaDbccStatistic.Tests.ps1 | 120 + tests/Get-DbaDbccUserOption.Tests.ps1 | 21 +- tests/Get-DbaDefaultPath.Tests.ps1 | 14 +- tests/Get-DbaDependency.Tests.ps1 | 16 +- tests/Get-DbaDeprecatedFeature.Tests.ps1 | 14 +- tests/Get-DbaDetachedDatabaseInfo.Tests.ps1 | 56 +- tests/Get-DbaDiskSpace.Tests.ps1 | 14 +- tests/Get-DbaDump.Tests.ps1 | 14 +- tests/Get-DbaEndpoint.Tests.ps1 | 14 +- tests/Get-DbaErrorLog.Tests.ps1 | 14 +- tests/Get-DbaErrorLogConfig.Tests.ps1 | 14 +- .../Get-DbaEstimatedCompletionTime.Tests.ps1 | 14 +- tests/Get-DbaExecutionPlan.Tests.ps1 | 14 +- tests/Get-DbaFeature.Tests.ps1 | 14 +- tests/Get-DbaFile.Tests.ps1 | 14 +- tests/Get-DbaFilestream.Tests.ps1 | 21 +- tests/Get-DbaForceNetworkEncryption.Tests.ps1 | 14 +- tests/Get-DbaHelpIndex.Tests.ps1 | 14 +- tests/Get-DbaInstanceProperty.Tests.ps1 | 14 +- tests/Get-DbaInstanceUserOption.Tests.ps1 | 35 +- tests/Get-DbaIoLatency.Tests.ps1 | 22 +- tests/Get-DbaLastBackup.Tests.ps1 | 14 +- tests/Get-DbaLastGoodCheckDb.Tests.ps1 | 14 +- tests/Get-DbaLatchStatistic.Tests.ps1 | 22 +- tests/Get-DbaLinkedServer.Tests.ps1 | 68 +- tests/Get-DbaLocaleSetting.Tests.ps1 | 29 +- tests/Get-DbaLogin.Tests.ps1 | 10 +- tests/Get-DbaMaintenanceSolutionLog.Tests.ps1 | 14 +- tests/Get-DbaManagementObject.Tests.ps1 | 14 +- tests/Get-DbaMaxMemory.Tests.ps1 | 14 +- tests/Get-DbaMemoryCondition.Tests.ps1 | 34 + tests/Get-DbaMemoryUsage.Tests.ps1 | 14 +- tests/Get-DbaModule.Tests.ps1 | 14 +- tests/Get-DbaMsdtc.Tests.ps1 | 14 +- tests/Get-DbaNetworkActivity.Tests.ps1 | 29 +- tests/Get-DbaNetworkCertificate.Tests.ps1 | 14 +- tests/Get-DbaOpenTransaction.Tests.ps1 | 14 +- tests/Get-DbaOperatingSystem.Tests.ps1 | 21 +- tests/Get-DbaPageFileSetting.Tests.ps1 | 29 +- tests/Get-DbaPbmCategory.Tests.ps1 | 40 +- .../Get-DbaPbmCategorySubscription.Tests.ps1 | 14 +- tests/Get-DbaPbmCondition.Tests.ps1 | 14 +- tests/Get-DbaPbmObjectSet.Tests.ps1 | 14 +- tests/Get-DbaPbmPolicy.Tests.ps1 | 14 +- tests/Get-DbaPbmStore.Tests.ps1 | 14 +- tests/Get-DbaPermission.Tests.ps1 | 14 +- tests/Get-DbaPfAvailableCounter.Tests.ps1 | 14 +- tests/Get-DbaPfDataCollector.Tests.ps1 | 14 +- tests/Get-DbaPfDataCollectorCounter.Tests.ps1 | 14 +- ...-DbaPfDataCollectorCounterSample.Tests.ps1 | 14 +- tests/Get-DbaPfDataCollectorSet.Tests.ps1 | 14 +- ...et-DbaPfDataCollectorSetTemplate.Tests.ps1 | 14 +- tests/Get-DbaPlanCache.Tests.ps1 | 14 +- tests/Get-DbaPowerPlan.Tests.ps1 | 14 +- tests/Get-DbaPrivilege.Tests.ps1 | 14 +- tests/Get-DbaProcess.Tests.ps1 | 14 +- tests/Get-DbaProductKey.Tests.ps1 | 40 +- tests/Get-DbaQueryExecutionTime.Tests.ps1 | 14 +- tests/Get-DbaRegistryRoot.Tests.ps1 | 14 +- tests/Get-DbaRepDistributor.Tests.ps1 | 14 +- tests/Get-DbaRepPublication.Tests.ps1 | 34 +- tests/Get-DbaRepServer.Tests.ps1 | 14 +- tests/Get-DbaResourceGovernor.Tests.ps1 | 14 +- tests/Get-DbaRgClassifierFunction.Tests.ps1 | 14 +- tests/Get-DbaRgResourcePool.Tests.ps1 | 34 +- tests/Get-DbaRgWorkloadGroup.Tests.ps1 | 14 +- tests/Get-DbaRunningJob.Tests.ps1 | 14 +- tests/Get-DbaSchemaChangeHistory.Tests.ps1 | 14 +- tests/Get-DbaServerAudit.Tests.ps1 | 14 +- .../Get-DbaServerAuditSpecification.Tests.ps1 | 14 +- tests/Get-DbaServerInstallDate.Tests.ps1 | 35 +- tests/Get-DbaServerProtocol.Tests.ps1 | 14 +- tests/Get-DbaServerRole.Tests.ps1 | 39 +- tests/Get-DbaServerRoleMember.Tests.ps1 | 17 +- tests/Get-DbaServerTrigger.Tests.ps1 | 14 +- tests/Get-DbaService.Tests.ps1 | 20 +- tests/Get-DbaSpConfigure.Tests.ps1 | 14 +- tests/Get-DbaSpinLockStatistic.Tests.ps1 | 22 +- tests/Get-DbaSpn.Tests.ps1 | 14 +- .../Get-DbaSsisEnvironmentVariable.Tests.ps1 | 14 +- tests/Get-DbaSsisExecutionHistory.Tests.ps1 | 14 +- tests/Get-DbaStartupParameter.Tests.ps1 | 28 +- tests/Get-DbaSuspectPage.Tests.ps1 | 14 +- tests/Get-DbaTcpPort.Tests.ps1 | 21 +- tests/Get-DbaTempdbUsage.Tests.ps1 | 14 +- tests/Get-DbaTopResourceUsage.Tests.ps1 | 14 +- tests/Get-DbaTrace.Tests.ps1 | 14 +- tests/Get-DbaTraceFlag.Tests.ps1 | 15 +- tests/Get-DbaUpTime.Tests.ps1 | 14 +- tests/Get-DbaUserPermission.Tests.ps1 | 14 +- tests/Get-DbaWaitResource.Tests.ps1 | 14 +- tests/Get-DbaWaitStatistic.Tests.ps1 | 14 +- tests/Get-DbaWaitingTask.Tests.ps1 | 15 +- tests/Get-DbaWindowsLog.Tests.ps1 | 14 +- tests/Get-DbaWsfcAvailableDisk.Tests.ps1 | 23 +- tests/Get-DbaWsfcCluster.Tests.ps1 | 23 +- tests/Get-DbaWsfcDisk.Tests.ps1 | 23 +- tests/Get-DbaWsfcNetwork.Tests.ps1 | 23 +- tests/Get-DbaWsfcNetworkInterface.Tests.ps1 | 23 +- tests/Get-DbaWsfcNode.Tests.ps1 | 23 +- tests/Get-DbaWsfcResource.Tests.ps1 | 23 +- tests/Get-DbaWsfcResourceType.Tests.ps1 | 23 +- tests/Get-DbaWsfcRole.Tests.ps1 | 23 +- tests/Get-DbaWsfcSharedVolume.Tests.ps1 | 23 +- tests/Get-DbaXEObject.Tests.ps1 | 14 +- tests/Get-DbaXESession.Tests.ps1 | 14 +- tests/Get-DbaXESessionTarget.Tests.ps1 | 14 +- tests/Get-DbaXESessionTemplate.Tests.ps1 | 14 +- tests/Get-DbaXESmartTarget.Tests.ps1 | 14 +- tests/Get-DbaXEStore.Tests.ps1 | 14 +- tests/Get-DbatoolsConfig.Tests.ps1 | 14 +- tests/Get-DbatoolsConfigValue.Tests.ps1 | 14 +- tests/Get-DbatoolsLog.Tests.ps1 | 14 +- tests/Get-DirectoryRestoreFile.Tests.ps1 | 18 +- ...p1.ps1 => Grant-DbaAgPermission.Tests.ps1} | 18 +- tests/Import-DbaCmsRegServer.Tests.ps1 | 22 +- tests/Import-DbaCsv.Tests.ps1 | 21 +- ...rt-DbaPfDataCollectorSetTemplate.Tests.ps1 | 14 +- tests/Import-DbaSpConfigure.Tests.ps1 | 14 +- tests/Import-DbaXESessionTemplate.Tests.ps1 | 14 +- tests/Import-DbatoolsConfig.Tests.ps1 | 19 + tests/Install-DbaFirstResponderKit.Tests.ps1 | 14 +- .../Install-DbaMaintenanceSolution.Tests.ps1 | 14 +- tests/Install-DbaSqlWatch.Tests.ps1 | 14 +- tests/Install-DbaWatchUpdate.Tests.ps1 | 14 +- tests/Install-DbaWhoIsActive.Tests.ps1 | 14 +- tests/Invoke-DbaAdvancedRestore.Tests.ps1 | 14 +- tests/Invoke-DbaAdvancedUpdate.Tests.ps1 | 177 + tests/Invoke-DbaAgFailover.Tests.ps1 | 19 + tests/Invoke-DbaBalanceDataFiles.Tests.ps1 | 14 +- tests/Invoke-DbaCycleErrorLog.Tests.ps1 | 14 +- tests/Invoke-DbaDbClone.Tests.ps1 | 14 +- tests/Invoke-DbaDbCorruption.Tests.ps1 | 45 +- tests/Invoke-DbaDbDataMasking.Tests.ps1 | 65 + .../Invoke-DbaDbDbccCheckConstraint.Tests.ps1 | 50 + tests/Invoke-DbaDbDbccCleanTable.Tests.ps1 | 67 + tests/Invoke-DbaDbDbccUpdateUsage.Tests.ps1 | 63 + tests/Invoke-DbaDbDecryptObject.Tests.ps1 | 24 +- tests/Invoke-DbaDbLogShipRecovery.Tests.ps1 | 14 +- tests/Invoke-DbaDbLogShipping.Tests.ps1 | 22 +- tests/Invoke-DbaDbMirrorFailover.Tests.ps1 | 14 +- tests/Invoke-DbaDbMirroring.Tests.ps1 | 11 + tests/Invoke-DbaDbShrink.Tests.ps1 | 14 +- tests/Invoke-DbaDbUpgrade.Tests.ps1 | 14 +- tests/Invoke-DbaDbccDropCleanBuffer.Tests.ps1 | 41 + tests/Invoke-DbaDbccFreeCache.Tests.ps1 | 21 +- tests/Invoke-DbaDiagnosticQuery.Tests.ps1 | 14 +- tests/Invoke-DbaPfRelog.Tests.ps1 | 14 +- tests/Invoke-DbaQuery.Tests.ps1 | 14 +- tests/Invoke-DbaWhoisActive.Tests.ps1 | 14 +- tests/Invoke-DbaXEReplay.Tests.ps1 | 14 +- tests/Invoke-DbatoolsFormatter.Tests.ps1 | 14 +- tests/Invoke-DbatoolsRenameHelper.Tests.ps1 | 14 +- tests/Join-DbaAvailabilityGroup.Tests.ps1 | 19 + tests/Measure-DbaBackupThroughput.Tests.ps1 | 14 +- .../Measure-DbaDiskSpaceRequirement.Tests.ps1 | 14 +- tests/Measure-DbatoolsImport.Tests.ps1 | 15 +- tests/Mount-DbaDatabase.Tests.ps1 | 14 +- tests/Move-DbaCmsRegServer.Tests.ps1 | 22 +- tests/Move-DbaCmsRegServerGroup.Tests.ps1 | 22 +- tests/New-DbaAgentJob.Tests.ps1 | 14 +- tests/New-DbaAgentJobCategory.Tests.ps1 | 14 +- tests/New-DbaAgentJobStep.Tests.ps1 | 14 +- tests/New-DbaAgentProxy.Tests.ps1 | 14 +- tests/New-DbaAgentSchedule.Tests.ps1 | 14 +- tests/New-DbaAvailabilityGroup.Tests.ps1 | 18 +- tests/New-DbaClientAlias.Tests.ps1 | 14 +- tests/New-DbaCmConnection.Tests.ps1 | 14 +- tests/New-DbaComputerCertificate.Tests.ps1 | 14 +- tests/New-DbaConnectionString.Tests.ps1 | 14 +- .../New-DbaConnectionStringBuilder.Tests.ps1 | 14 +- tests/New-DbaCredential.Tests.ps1 | 14 +- tests/New-DbaDacOption.Tests.ps1 | 10 + tests/New-DbaDacProfile.Tests.ps1 | 18 +- tests/New-DbaDatabase.Tests.ps1 | 14 +- tests/New-DbaDbCertificate.Tests.ps1 | 14 +- tests/New-DbaDbMailProfile.Tests.ps1 | 61 + tests/New-DbaDbMaskingConfig.Tests.ps1 | 44 + tests/New-DbaDbMasterKey.Tests.ps1 | 14 +- tests/New-DbaDbSnapshot.Tests.ps1 | 14 +- tests/New-DbaDbUser.Tests.ps1 | 14 +- tests/New-DbaDirectory.Tests.ps1 | 14 +- tests/New-DbaEndpoint.Tests.ps1 | 22 +- tests/New-DbaLogin.Tests.ps1 | 14 +- tests/New-DbaScriptingOption.Tests.ps1 | 14 +- tests/New-DbaServiceMasterKey.Tests.ps1 | 14 +- tests/New-DbaSsisCatalog.Tests.ps1 | 14 +- tests/New-DbaXESession.Tests.ps1 | 14 +- tests/New-DbaXESmartCsvWriter.Tests.ps1 | 14 +- tests/New-DbaXESmartEmail.Tests.ps1 | 14 +- tests/New-DbaXESmartQueryExec.Tests.ps1 | 14 +- tests/New-DbaXESmartReplay.Tests.ps1 | 14 +- tests/New-DbaXESmartTableWriter.Tests.ps1 | 14 +- tests/New-DbatoolsSupportPackage.Tests.ps1 | 14 +- tests/Publish-DbaDacPackage.Tests.ps1 | 28 +- tests/Read-DbaAuditFile.Tests.ps1 | 14 +- tests/Read-DbaBackupHeader.Tests.ps1 | 14 +- tests/Read-DbaTraceFile.Tests.ps1 | 14 +- tests/Read-DbaTransactionLog.Tests.ps1 | 14 +- tests/Read-DbaXEFile.Tests.ps1 | 14 +- tests/Register-DbatoolsConfig.Tests.ps1 | 14 +- tests/Remove-DbaAgDatabase.Tests.ps1 | 18 +- tests/Remove-DbaAgListener.Tests.ps1 | 18 +- tests/Remove-DbaAgReplica.Tests.ps1 | 18 +- tests/Remove-DbaAgentJob.Tests.ps1 | 14 +- tests/Remove-DbaAgentJobCategory.Tests.ps1 | 14 +- tests/Remove-DbaAgentJobStep.Tests.ps1 | 14 +- tests/Remove-DbaAgentSchedule.Tests.ps1 | 14 +- tests/Remove-DbaAvailabilityGroup.Tests.ps1 | 18 +- tests/Remove-DbaBackup.Tests.ps1 | 10 +- tests/Remove-DbaClientAlias.Tests.ps1 | 14 +- tests/Remove-DbaCmConnection.Tests.ps1 | 14 +- tests/Remove-DbaCmsRegServer.Tests.ps1 | 22 +- tests/Remove-DbaCmsRegServerGroup.Tests.ps1 | 22 +- tests/Remove-DbaComputerCertificate.Tests.ps1 | 14 +- tests/Remove-DbaDatabase.Tests.ps1 | 14 +- tests/Remove-DbaDatabaseSafely.Tests.ps1 | 14 +- ...Remove-DbaDbBackupRestoreHistory.Tests.ps1 | 19 + tests/Remove-DbaDbCertificate.Tests.ps1 | 14 +- tests/Remove-DbaDbMasterKey.Tests.ps1 | 14 +- tests/Remove-DbaDbMirror.Tests.ps1 | 14 +- tests/Remove-DbaDbMirrorMonitor.Tests.ps1 | 22 +- tests/Remove-DbaDbOrphanUser.Tests.ps1 | 19 + tests/Remove-DbaDbSnapshot.Tests.ps1 | 14 +- tests/Remove-DbaDbUser.Tests.ps1 | 14 +- tests/Remove-DbaEndpoint.Tests.ps1 | 22 +- tests/Remove-DbaLogin.Tests.ps1 | 14 +- tests/Remove-DbaNetworkCertificate.Tests.ps1 | 14 +- tests/Remove-DbaOrphanUser.Tests.ps1 | 23 - ...Remove-DbaPfDataCollectorCounter.Tests.ps1 | 14 +- tests/Remove-DbaPfDataCollectorSet.Tests.ps1 | 14 +- tests/Remove-DbaSpn.Tests.ps1 | 14 +- tests/Remove-DbaTrace.Tests.ps1 | 14 +- tests/Remove-DbaXESession.Tests.ps1 | 14 +- tests/Remove-DbaXESmartTarget.Tests.ps1 | 14 +- tests/Rename-DbaDatabase.Tests.ps1 | 14 +- tests/Rename-DbaLogin.Tests.ps1 | 14 +- tests/Repair-DbaDbMirror.Tests.ps1 | 14 +- ...s.ps1 => Repair-DbaDbOrphanUser.Tests.ps1} | 18 +- tests/Repair-DbaServerName.Tests.ps1 | 14 +- tests/Reset-DbaAdmin.Tests.ps1 | 14 +- tests/Reset-DbatoolsConfig.Tests.ps1 | 19 + tests/Resolve-DbaNetworkName.Tests.ps1 | 64 +- tests/Restart-DbaService.Tests.ps1 | 14 +- .../Restore-DbaBackupFromDirectory.Tests.ps1 | 14 +- tests/Restore-DbaDatabase.Tests.ps1 | 18 +- tests/Restore-DbaDbCertificate.Tests.ps1 | 14 +- tests/Restore-DbaDbSnapshot.Tests.ps1 | 14 +- tests/Resume-DbaAgDbDataMovement.Tests.ps1 | 18 +- tests/Revoke-DbaAgPermission.Tests.ps1 | 18 +- tests/Save-DbaDiagnosticQueryScript.Tests.ps1 | 14 +- tests/Select-DbaBackupInformation.Tests.ps1 | 30 +- tests/Select-DbaObject.Tests.ps1 | 11 + tests/Set-DbaAgListener.Tests.ps1 | 18 +- tests/Set-DbaAgReplica.Tests.ps1 | 18 +- tests/Set-DbaAgentAlert.Tests.ps1 | 14 +- tests/Set-DbaAgentJob.Tests.ps1 | 14 +- tests/Set-DbaAgentJobCategory.Tests.ps1 | 14 +- tests/Set-DbaAgentJobOutputFile.Tests.ps1 | 14 +- tests/Set-DbaAgentJobOwner.Tests.ps1 | 9 +- tests/Set-DbaAgentJobStep.Tests.ps1 | 14 +- tests/Set-DbaAgentSchedule.Tests.ps1 | 14 +- tests/Set-DbaAgentServer.Tests.ps1 | 14 +- tests/Set-DbaAvailabilityGroup.Tests.ps1 | 18 +- tests/Set-DbaCmConnection.Tests.ps1 | 14 +- tests/Set-DbaDbCompatibility.Tests.ps1 | 19 + tests/Set-DbaDbCompression.Tests.ps1 | 14 +- tests/Set-DbaDbIdentity.Tests.ps1 | 66 + tests/Set-DbaDbMirror.Tests.ps1 | 14 +- tests/Set-DbaDbOwner.Tests.ps1 | 14 +- tests/Set-DbaDbQueryStoreOption.Tests.ps1 | 14 +- tests/Set-DbaDbRecoveryModel.Tests.ps1 | 14 +- tests/Set-DbaDbState.Tests.ps1 | 14 +- tests/Set-DbaEndpoint.Tests.ps1 | 18 +- tests/Set-DbaErrorLogConfig.Tests.ps1 | 14 +- tests/Set-DbaLogin.Tests.ps1 | 13 +- tests/Set-DbaMaxDop.Tests.ps1 | 22 +- tests/Set-DbaMaxMemory.Tests.ps1 | 27 +- tests/Set-DbaNetworkCertificate.Tests.ps1 | 14 +- tests/Set-DbaPowerPlan.Tests.ps1 | 15 +- tests/Set-DbaPrivilege.Tests.ps1 | 14 +- tests/Set-DbaSpConfigure.Tests.ps1 | 14 +- tests/Set-DbaSpn.Tests.ps1 | 14 +- tests/Set-DbaStartupParameter.Tests.ps1 | 14 +- tests/Set-DbaTcpPort.Tests.ps1 | 14 +- tests/Set-DbaTempDbConfig.Tests.ps1 | 14 +- tests/Show-DbaDbList.Tests.ps1 | 14 +- tests/Show-DbaServerFileSystem.Tests.ps1 | 14 +- tests/Start-DbaAgentJob.Tests.ps1 | 14 +- tests/Start-DbaEndpoint.Tests.ps1 | 22 +- tests/Start-DbaMigration.Tests.ps1 | 40 +- tests/Start-DbaPfDataCollectorSet.Tests.ps1 | 14 +- tests/Start-DbaService.Tests.ps1 | 14 +- tests/Start-DbaTrace.Tests.ps1 | 14 +- tests/Start-DbaXESession.Tests.ps1 | 14 +- tests/Start-DbaXESmartTarget.Tests.ps1 | 14 +- tests/Stop-DbaAgentJob.Tests.ps1 | 14 +- tests/Stop-DbaEndpoint.Tests.ps1 | 22 +- tests/Stop-DbaPfDataCollectorSet.Tests.ps1 | 14 +- tests/Stop-DbaProcess.Tests.ps1 | 14 +- tests/Stop-DbaService.Tests.ps1 | 14 +- tests/Stop-DbaTrace.Tests.ps1 | 14 +- tests/Stop-DbaXESession.Tests.ps1 | 55 +- tests/Stop-DbaXESmartTarget.Tests.ps1 | 14 +- tests/Stop-Function.Tests.ps1 | 14 +- tests/Suspend-DbaAgDbDataMovement.Tests.ps1 | 18 +- tests/Sync-DbaAvailabilityGroup.Tests.ps1 | 19 + tests/Sync-DbaLoginPermission.Tests.ps1 | 14 +- ...ts.ps1 => Test-DbaAgentJobOwner.Tests.ps1} | 14 +- tests/Test-DbaBackupInformation.Tests.ps1 | 95 +- tests/Test-DbaBuild.Tests.ps1 | 21 +- tests/Test-DbaCmConnection.Tests.ps1 | 14 +- tests/Test-DbaConnection.Tests.ps1 | 14 +- tests/Test-DbaConnectionAuthScheme.Tests.ps1 | 14 +- tests/Test-DbaDbCollation.Tests.ps1 | 14 +- tests/Test-DbaDbCompatibility.Tests.ps1 | 21 +- tests/Test-DbaDbCompression.Tests.ps1 | 14 +- tests/Test-DbaDbLogShipStatus.Tests.ps1 | 22 +- tests/Test-DbaDbOwner.Tests.ps1 | 17 +- tests/Test-DbaDbRecoveryModel.Tests.ps1 | 21 +- tests/Test-DbaDbVirtualLogFile.Tests.ps1 | 21 +- tests/Test-DbaDeprecatedFeature.Tests.ps1 | 21 +- tests/Test-DbaDiskAlignment.Tests.ps1 | 21 +- tests/Test-DbaDiskAllocation.Tests.ps1 | 21 +- tests/Test-DbaDiskSpeed.Tests.ps1 | 14 +- tests/Test-DbaEndpoint.Tests.ps1 | 22 +- tests/Test-DbaIdentityUsage.Tests.ps1 | 14 +- tests/Test-DbaLastBackup.Tests.ps1 | 14 +- .../Test-DbaLinkedServerConnection.Tests.ps1 | 14 +- tests/Test-DbaLoginPassword.Tests.ps1 | 14 +- tests/Test-DbaLsnChain.Tests.ps1 | 12 + tests/Test-DbaManagementObject.Tests.ps1 | 21 +- tests/Test-DbaMaxDop.Tests.ps1 | 14 +- tests/Test-DbaMaxMemory.Tests.ps1 | 16 +- tests/Test-DbaMigrationConstraint.Tests.ps1 | 14 +- tests/Test-DbaNetworkLatency.Tests.ps1 | 14 +- tests/Test-DbaOptimizeForAdHoc.Tests.ps1 | 14 +- tests/Test-DbaPath.Tests.ps1 | 21 +- tests/Test-DbaPowerPlan.Tests.ps1 | 14 +- tests/Test-DbaRepLatency.Tests.ps1 | 24 +- tests/Test-DbaServerName.Tests.ps1 | 14 +- tests/Test-DbaSpn.Tests.ps1 | 14 +- tests/Test-DbaTempDbConfig.Tests.ps1 | 21 +- tests/Test-DbaWindowsLogin.Tests.ps1 | 21 +- tests/Test-PSRemoting.Tests.ps1 | 20 +- tests/Uninstall-DbaSqlWatch.Tests.ps1 | 14 +- tests/Uninstall-DbaWatchUpdate.Tests.ps1 | 14 +- tests/Unregister-DbatoolsConfig.Tests.ps1 | 19 + tests/Update-DbaInstance.Tests.ps1 | 162 +- tests/Update-DbaServiceAccount.Tests.ps1 | 14 +- tests/Update-dbatools.Tests.ps1 | 14 +- tests/Watch-DbaDbLogin.Tests.ps1 | 21 +- tests/Watch-DbaUpdate.Tests.ps1 | 14 +- tests/Watch-DbaXESession.Tests.ps1 | 14 +- tests/Write-DbaDataTable.Tests.ps1 | 14 +- tests/appveyor.SQL2017.ps1 | 1 - tests/appveyor.pester.ps1 | 13 + tests/dbatools.Tests.ps1 | 16 +- tests/pester.groups.ps1 | 5 +- xml/dbatools.Types.ps1xml | 134 +- 750 files changed, 239663 insertions(+), 19032 deletions(-) create mode 100644 .markdownlint.json create mode 100644 .vscode/dbatools.code-snippets create mode 100644 allcommands.ps1 delete mode 100644 allcommands.zip create mode 100644 bin/datamasking/Bogus.dll create mode 100644 bin/datamasking/columntypes.json create mode 100644 bin/datamasking/example.tables.json create mode 100644 bin/datamasking/firstnames_all.txt create mode 100644 bin/datamasking/firstnames_female.txt create mode 100644 bin/datamasking/firstnames_male.txt create mode 100644 bin/datamasking/lastnames_all.txt create mode 100644 bin/dbatools.png rename bin/diagnosticquery/{SQLServerDiagnosticQueries_2005_201810.sql => SQLServerDiagnosticQueries_2005_201901.sql} (97%) rename bin/diagnosticquery/{SQLServerDiagnosticQueries_2008R2_201810.sql => SQLServerDiagnosticQueries_2008R2_201901.sql} (97%) rename bin/diagnosticquery/{SQLServerDiagnosticQueries_2008_201810.sql => SQLServerDiagnosticQueries_2008_201901.sql} (97%) rename bin/diagnosticquery/{SQLServerDiagnosticQueries_2012_201810.sql => SQLServerDiagnosticQueries_2012_201901.sql} (97%) rename bin/diagnosticquery/{SQLServerDiagnosticQueries_2014_201810.sql => SQLServerDiagnosticQueries_2014_201901.sql} (93%) rename bin/diagnosticquery/{SQLServerDiagnosticQueries_2016SP2_201810.sql => SQLServerDiagnosticQueries_2016SP2_201901.sql} (90%) rename bin/diagnosticquery/{SQLServerDiagnosticQueries_2016_201810.sql => SQLServerDiagnosticQueries_2016_201901.sql} (92%) rename bin/diagnosticquery/{SQLServerDiagnosticQueries_2017_201810.sql => SQLServerDiagnosticQueries_2017_201901.sql} (90%) create mode 100644 bin/diagnosticquery/SQLServerDiagnosticQueries_2019_201901.sql rename bin/diagnosticquery/{SQLServerDiagnosticQueries_AzureSQLDatabase_201810.sql => SQLServerDiagnosticQueries_AzureSQLDatabase_201901.sql} (96%) create mode 100644 bin/smo/Microsoft.Build.Framework.dll create mode 100644 bin/smo/Microsoft.Build.Utilities.Core.dll delete mode 100644 bin/smo/Microsoft.Data.Tools.Contracts.dll delete mode 100644 bin/smo/Microsoft.Data.Tools.Schema.SqlTasks.targets delete mode 100644 bin/smo/Microsoft.Data.Tools.Schema.Utilities.Sql.dll delete mode 100644 bin/smo/Microsoft.SqlServer.IntegrationServices.SqlTaskScheduler.dll delete mode 100644 bin/smo/Microsoft.SqlServer.IntegrationServices.WorkerAgent.dll delete mode 100644 bin/smo/Microsoft.SqlServer.Management.Dac.UniversalAuthProvider.dll delete mode 100644 bin/smo/Microsoft.SqlServer.Management.InMemoryOLTPMigrationAdvisor.dll delete mode 100644 bin/smo/Microsoft.SqlServer.Management.SDK.SqlStudio.dll create mode 100644 bin/smo/Microsoft.SqlServer.TransactSql.dll create mode 100644 bin/smo/System.Collections.Immutable.dll create mode 100644 bin/smo/coreclr/Microsoft.SqlServer.Management.RegisteredServers.dll create mode 100644 bin/smo/coreclr/Microsoft.SqlTools.Hosting.dll create mode 100644 bin/smo/coreclr/Microsoft.SqlTools.ManagedBatchParser.dll create mode 100644 bin/smo/coreclr/System.Data.SqlClient.dll create mode 100644 functions/Get-DbaDbDbccOpenTran.ps1 create mode 100644 functions/Get-DbaDbIdentity.ps1 rename functions/{Get-DbaOrphanUser.ps1 => Get-DbaDbOrphanUser.ps1} (93%) create mode 100644 functions/Get-DbaDbccSessionBuffer.ps1 create mode 100644 functions/Get-DbaDbccStatistic.ps1 create mode 100644 functions/Invoke-DbaAdvancedUpdate.ps1 create mode 100644 functions/Invoke-DbaDbDataMasking.ps1 create mode 100644 functions/Invoke-DbaDbDbccCheckConstraint.ps1 create mode 100644 functions/Invoke-DbaDbDbccCleanTable.ps1 create mode 100644 functions/Invoke-DbaDbDbccUpdateUsage.ps1 create mode 100644 functions/Invoke-DbaDbccDropCleanBuffer.ps1 delete mode 100644 functions/Invoke-SqlCmd2.ps1 create mode 100644 functions/New-DbaDbMailProfile.ps1 create mode 100644 functions/New-DbaDbMaskingConfig.ps1 rename functions/{Remove-DbaOrphanUser.ps1 => Remove-DbaDbOrphanUser.ps1} (94%) rename functions/{Repair-DbaOrphanUser.ps1 => Repair-DbaDbOrphanUser.ps1} (89%) create mode 100644 functions/Set-DbaDbIdentity.ps1 rename functions/{Test-DbaJobOwner.ps1 => Test-DbaAgentJobOwner.ps1} (100%) create mode 100644 internal/functions/Get-SqlServerUpdate.ps1 delete mode 100644 internal/functions/Install-SqlServerUpdate.ps1 create mode 100644 internal/functions/Invoke-CommandWithFallback.ps1 rename internal/functions/{Invoke-DbaDatabaseCorruption.ps1 => Invoke-DbaDbCorruption.ps1} (91%) create mode 100644 tests/Export-DbatoolsConfig.Tests.ps1 delete mode 100644 tests/Get-DbaClusterAvailableDisk.Tests.ps1 create mode 100644 tests/Get-DbaDbDbccOpenTran.Tests.ps1 create mode 100644 tests/Get-DbaDbIdentity.Tests.ps1 rename tests/{Get-DbaOrphanUser.Tests.ps1 => Get-DbaDbOrphanUser.Tests.ps1} (76%) create mode 100644 tests/Get-DbaDbccSessionBuffer.Tests.ps1 create mode 100644 tests/Get-DbaDbccStatistic.Tests.ps1 create mode 100644 tests/Get-DbaMemoryCondition.Tests.ps1 rename tests/{Grant-DbaAgPermission.Tests.p1.ps1 => Grant-DbaAgPermission.Tests.ps1} (59%) create mode 100644 tests/Import-DbatoolsConfig.Tests.ps1 create mode 100644 tests/Invoke-DbaAdvancedUpdate.Tests.ps1 create mode 100644 tests/Invoke-DbaAgFailover.Tests.ps1 create mode 100644 tests/Invoke-DbaDbDataMasking.Tests.ps1 create mode 100644 tests/Invoke-DbaDbDbccCheckConstraint.Tests.ps1 create mode 100644 tests/Invoke-DbaDbDbccCleanTable.Tests.ps1 create mode 100644 tests/Invoke-DbaDbDbccUpdateUsage.Tests.ps1 create mode 100644 tests/Invoke-DbaDbccDropCleanBuffer.Tests.ps1 create mode 100644 tests/Join-DbaAvailabilityGroup.Tests.ps1 create mode 100644 tests/New-DbaDbMailProfile.Tests.ps1 create mode 100644 tests/New-DbaDbMaskingConfig.Tests.ps1 create mode 100644 tests/Remove-DbaDbBackupRestoreHistory.Tests.ps1 create mode 100644 tests/Remove-DbaDbOrphanUser.Tests.ps1 delete mode 100644 tests/Remove-DbaOrphanUser.Tests.ps1 rename tests/{Repair-DbaOrphanUser.Tests.ps1 => Repair-DbaDbOrphanUser.Tests.ps1} (77%) create mode 100644 tests/Reset-DbatoolsConfig.Tests.ps1 create mode 100644 tests/Set-DbaDbCompatibility.Tests.ps1 create mode 100644 tests/Set-DbaDbIdentity.Tests.ps1 create mode 100644 tests/Sync-DbaAvailabilityGroup.Tests.ps1 rename tests/{Test-DbaJobOwner.Tests.ps1 => Test-DbaAgentJobOwner.Tests.ps1} (73%) create mode 100644 tests/Unregister-DbatoolsConfig.Tests.ps1 diff --git a/.github/ISSUE_TEMPLATE/Bug_Report.md b/.github/ISSUE_TEMPLATE/Bug_Report.md index 25d91eae1e..42db7856cd 100644 --- a/.github/ISSUE_TEMPLATE/Bug_Report.md +++ b/.github/ISSUE_TEMPLATE/Bug_Report.md @@ -10,6 +10,9 @@ about: Found errors or unexpected behavior using dbatools module - [ ] Verified this bug is not already reported in an issue - [ ] Verified errors are not related to permissions - [ ] Can reproduce in a clean PowerShell session (_clean = `powershell -NoProfile`_) +- [ ] If issue is with `Copy-DbaDatabase`, using `Backup-DbaDatabase | Restore-DbaDatabase` still does not work + +Note that we do not have the resources to make `Copy-DbaDatabase` work in every environment. Instead, we try to ensure Backup & Restore work in your enviornment. ## Steps to Reproduce diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index fe27d609b3..1295b9c7d1 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -7,6 +7,7 @@ - [ ] Ran manual Pester test and has passed (`.\tests\manual.pester.ps1) - [ ] Adding code coverage to existing functionality - [ ] Pester test is included + - [ ] If new file reference added for test, has is been added to github.com/sqlcollaborative/appveyor-lab ? - [ ] Nunit test is included - [ ] Documentation - [ ] Build system diff --git a/.markdownlint.json b/.markdownlint.json new file mode 100644 index 0000000000..29f8996f57 --- /dev/null +++ b/.markdownlint.json @@ -0,0 +1,7 @@ +{ + "MD024": false, + "MD022": false, + "MD032": false, + "MD013": false, + "MD001": true +} \ No newline at end of file diff --git a/.vscode/dbatools.code-snippets b/.vscode/dbatools.code-snippets new file mode 100644 index 0000000000..aa638b4782 --- /dev/null +++ b/.vscode/dbatools.code-snippets @@ -0,0 +1,257 @@ +{ + // Starting point for project-level snippets for the dbatools contributions. + // These are just a few and will be exapnded as time goes along. + + "Get function for SMO object": { + "scope": "powershell", + "prefix": "getsmo", + "body": [ + "function Get-Dba$0 {", + "<#", + "\t.SYNOPSIS", + "\t\t${1:Short of what command does}", + "", + "\t.DESCRIPTION", + "\t\t${2:Longer of what command does}", + "", + "\t.PARAMETER SqlInstance", + "\t\tSQL Server name or SMO object representing the SQL Server to connect to. This can be a collection and receive pipeline input to allow the function to be executed against multiple SQL Server instances.", + "", + "\t.PARAMETER SqlCredential", + "\t\tLogin to the target instance using alternate Windows or SQL Login Authentication. Accepts credential objects (Get-Credential).", + "", + "\t.PARAMETER EnableException", + "\t\tBy default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message.", + "\t\tThis avoids overwhelming you with a \"sea of red\" exceptions, but is inconvenient because it basically disables advanced scripting.", + "\t\tUsing this switch turns this \"nice by default\" feature off and enables you to catch exceptions with your own try/catch.", + "", + "\t.NOTES", + "\t\tTags: ${3:Singular word for command index}", + "\t\tAuthor: ${4:FirstName} ${5:LastName} (@${6:TwitterHandle}), ${7:blog address}", + "", + "\t\tWebsite: https://dbatools.io", + "\t\tCopyright: (c) 2018 by dbatools, licensed under MIT", + "\t\tLicense: MIT https://opensource.org/licenses/MIT", + "", + "\t.LINK", + "\t\thttps://dbatools.io/Get-Dba$0", + "", + "\t.EXAMPLE", + "\t\tPS C:\\> Get-Dba$0 -SqlInstance localhost", + "", + "\t\t${8:Add minimum example for each parameter}", + "", + "#>", + "\t[CmdletBinding()]", + "\tparam (", + "\t\t[parameter(Position = 0, Mandatory, ValueFromPipeline)]", + "\t\t[Alias(\"ServerInstance\", \"SqlServer\")]", + "\t\t[DbaInstance[]]\\$SqlInstance,", + "\t\t[Alias(\"Credential\")]", + "\t\t[PSCredential]\\$SqlCredential,", + "\t\t[object[]]\\$${9:YourParameter},", + "\t\t[switch]\\$EnableException", + "\t)", + "\tprocess {", + "\t\tforeach (\\$instance in \\$SqlInstance) {", + "\t\t\tWrite-Message -Level Verbose -Message \"Attempting to connect to \\$instance\"", + "\t\t\ttry {", + "\t\t\t\t\\$server = Connect-SqlInstance -SqlInstance \\$instance -SqlCredential \\$SqlCredential", + "\t\t\t}", + "\t\t\tcatch {", + "\t\t\t\tStop-Function -Message \"Failure\" -Category ConnectionError -ErrorRecord \\$_ -Target \\$instance -Continue", + "\t\t\t}", + "", + "\t\t\t# Add in filter code", + "", + "\t\t\t# Add in processing SMO object", + "", + "\t\t\t<# Output must include 3 properties for each object:", + "\t\t\t\t1. ComputerName (\\$server.ComputerName)", + "\t\t\t\t2. InstanceName (\\$server.ServiceName)", + "\t\t\t\t3. SqlInstance (\\$server.DomainInstanceName)", + "", + "\t\t\t\t\"Select_DefaultView -InputObject \\$object -Property ", + "\t\t}", + "\t}", + "}" + ], + "description": "template for building a function to get properties from SMO object" + }, + "Set function": { + "scope": "powershell", + "prefix": "setsmo", + "body": [ + "function Set-Dba$0 {", + "<#", + "\t.SYNOPSIS", + "\t\t${1:Short of what command does}", + "", + "\t.DESCRIPTION", + "\t\t${2:Longer of what command does}", + "", + "\t.PARAMETER SqlInstance", + "\t\tSQL Server name or SMO object representing the SQL Server to connect to. This can be a collection and receive pipeline input to allow the function to be executed against multiple SQL Server instances.", + "", + "\t.PARAMETER SqlCredential", + "\t\tLogin to the target instance using alternate Windows or SQL Login Authentication. Accepts credential objects (Get-Credential).", + "", + "\t.PARAMETER EnableException", + "\t\tBy default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message.", + "\t\tThis avoids overwhelming you with a \"sea of red\" exceptions, but is inconvenient because it basically disables advanced scripting.", + "\t\tUsing this switch turns this \"nice by default\" feature off and enables you to catch exceptions with your own try/catch.", + "", + "\t.NOTES", + "\t\tTags: ${3:Singular word for command index}", + "\t\tAuthor: ${4:FirstName} ${5:LastName} (@${6:TwitterHandle}), ${7:blog address}", + "", + "\t\tWebsite: https://dbatools.io", + "\t\tCopyright: (c) 2018 by dbatools, licensed under MIT", + "\t\tLicense: MIT https://opensource.org/licenses/MIT", + "", + "\t.LINK", + "\t\thttps://dbatools.io/Set-Dba$0", + "", + "\t.EXAMPLE", + "\t\tPS C:\\> Set-Dba$0 -SqlInstance localhost", + "", + "\t\t${8:Add minimum example for each parameter}", + "", + "#>", + "\t[CmdletBinding(SupportsShouldProcess, ConfirmImpact = \"High\")]", + "\tparam (", + "\t\t[parameter(Position = 0, Mandatory, ValueFromPipeline)]", + "\t\t[Alias(\"ServerInstance\", \"SqlServer\")]", + "\t\t[DbaInstance[]]\\$SqlInstance,", + "\t\t[Alias(\"Credential\")]", + "\t\t[PSCredential]\\$SqlCredential,", + "\t\t[object[]]\\$${9:YourParameters},", + "\t\t[switch]\\$EnableException", + "\t)", + "\tprocess {", + "\t\tforeach (\\$instance in \\$SqlInstance) {", + "\t\t\tWrite-Message -Level Verbose -Message \"Attempting to connect to \\$instance\"", + "\t\t\ttry {", + "\t\t\t\t\\$server = Connect-SqlInstance -SqlInstance \\$instance -SqlCredential \\$SqlCredential", + "\t\t\t}", + "\t\t\tcatch {", + "\t\t\t\tStop-Function -Message \"Failure\" -Category ConnectionError -ErrorRecord \\$_ -Target \\$instance -Continue", + "\t\t\t}", + "", + "\t\t\t# Add code for parameter filters", + "", + "\t\t\tforeach (\\$object in \\$objects) {", + "\t\t\t\tif (\\$Pscmdlet.ShouldProcess(\"\\$object on \\$server\", \"What it will do\")) {", + "\t\t\t\t\t\t# Work to be done", + "", + "\t\t\t\t\t\t[PSCustomObject]@{", + "\t\t\t\t\t\t\tComputerName = \\$server.NetName", + "\t\t\t\t\t\t\tInstanceName = \\$server.ServiceName", + "\t\t\t\t\t\t\tSqlInstance = \\$server.DomainInstanceName", + "\t\t\t\t\t\t\tObject = \\$object.Name", + "\t\t\t\t\t\t\tStatus = \"Dropped/Updated/etc\"", + "\t\t\t\t\t\t}", + "\t\t\t\t\t}", + "\t\t\t}", + "\t\t}", + "\t}", + "}" + ], + "description": "template for building a function to set properties from SMO object" + }, + + "Set function": { + "scope": "powershell", + "prefix": "setsql", + "body": [ + "function Set-Dba$0 {", + "<#", + "\t.SYNOPSIS", + "\t\t${1:Short of what command does}", + "", + "\t.DESCRIPTION", + "\t\t${2:Longer of what command does}", + "", + "\t.PARAMETER SqlInstance", + "\t\tSQL Server name or SMO object representing the SQL Server to connect to. This can be a collection and receive pipeline input to allow the function to be executed against multiple SQL Server instances.", + "", + "\t.PARAMETER SqlCredential", + "\t\tLogin to the target instance using alternate Windows or SQL Login Authentication. Accepts credential objects (Get-Credential).", + "", + "\t.PARAMETER EnableException", + "\t\tBy default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message.", + "\t\tThis avoids overwhelming you with a \"sea of red\" exceptions, but is inconvenient because it basically disables advanced scripting.", + "\t\tUsing this switch turns this \"nice by default\" feature off and enables you to catch exceptions with your own try/catch.", + "", + "\t.NOTES", + "\t\tTags: ${3:Singular word for command index}", + "\t\tAuthor: ${4:FirstName} ${5:LastName} (@${6:TwitterHandle}), ${7:blog address}", + "", + "\t\tWebsite: https://dbatools.io", + "\t\tCopyright: (c) 2018 by dbatools, licensed under MIT", + "\t\tLicense: MIT https://opensource.org/licenses/MIT", + "", + "\t.LINK", + "\t\thttps://dbatools.io/Set-Dba$0", + "", + "\t.EXAMPLE", + "\t\tPS C:\\> Set-Dba$0 -SqlInstance localhost", + "", + "\t\t${8:Add minimum example for each parameter}", + "", + "#>", + "\t[CmdletBinding(SupportsShouldProcess, ConfirmImpact = \"High\")]", + "\tparam (", + "\t\t[parameter(Position = 0, Mandatory, ValueFromPipeline)]", + "\t\t[Alias(\"ServerInstance\", \"SqlServer\")]", + "\t\t[DbaInstance[]]\\$SqlInstance,", + "\t\t[Alias(\"Credential\")]", + "\t\t[PSCredential]\\$SqlCredential,", + "\t\t[object[]]\\$${9:YourParameters},", + "\t\t[switch]\\$EnableException", + "\t)", + "\tbegin {", + "\t\t\\$sql = \"--FORMART YOUR T-SQL, poorsql.com", + "\t\t\t\\-- build your query based on parameters passed in", + "\t\t\"", + "\t}", + "\tprocess {", + "\t\tforeach (\\$instance in \\$SqlInstance) {", + "\t\t\tWrite-Message -Level Verbose -Message \"Attempting to connect to \\$instance\"", + "\t\t\ttry {", + "\t\t\t\t\\$server = Connect-SqlInstance -SqlInstance \\$instance -SqlCredential \\$SqlCredential", + "\t\t\t}", + "\t\t\tcatch {", + "\t\t\t\tStop-Function -Message \"Failure\" -Category ConnectionError -ErrorRecord \\$_ -Target \\$instance -Continue", + "\t\t\t}", + "", + "\t\t\t# Add code for parameter filters", + "", + "\t\t\tforeach (\\$object in \\$objects) {", + "\t\t\t\ttry {", + "\t\t\t\t\t\\$results = \\$server.Query(\\$sql)", + "\t\t\t\t}", + "\t\t\t\tcatch {", + "\t\t\t\t\tStop-Function -Message \"Something went wrong\" -Continue -Target \\$object -ErrorRecord \\$_", + "\t\t\t\t}", + "\t\t\t\tforeach (\\$row in \\$results) {", + "\t\t\t\t\t# Work to be done", + "", + "\t\t\t\t\t[PSCustomObject]@{", + "\t\t\t\t\t\tComputerName = \\$server.NetName", + "\t\t\t\t\t\tInstanceName = \\$server.ServiceName", + "\t\t\t\t\t\tSqlInstance = \\$server.DomainInstanceName", + "\t\t\t\t\t\tObject = \\$row.ColumnName", + "\t\t\t\t\t\tStatus = \"Dropped/Updated/Whatever\"", + "\t\t\t\t\t}", + "\t\t\t\t}", + "\t\t\t}", + "\t\t}", + "\t}", + "}" + ], + "description": "template for building a function to set properties from SMO object" + } +} \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json index 27fa3671e3..a4327b7e53 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,9 +1,19 @@ // Place your settings in this file to overwrite default and user settings. { + // cleans up whitespace "files.trimTrailingWhitespace": true, + + // formatting style this project adheres to: https://en.wikipedia.org/wiki/Indentation_style#Variant:_1TBS_(OTBS) "powershell.codeFormatting.preset": "OTBS", + + // editor settings for formatting standards on this project "editor.tabSize": 4, "editor.detectIndentation": false, "editor.insertSpaces": true, - "editor.formatOnSave": true -} \ No newline at end of file + "editor.formatOnSave": true, + + // editor settings that will auto add the closing quote or curly brace + "editor.autoClosingBrackets": "always", + "editor.autoClosingQuotes": "always", + "editor.autoSurround": "languageDefined" +} diff --git a/allcommands.ps1 b/allcommands.ps1 new file mode 100644 index 0000000000..285bc713f3 --- /dev/null +++ b/allcommands.ps1 @@ -0,0 +1,115834 @@ +### DO NOT EDIT THIS FILE DIRECTLY ### +function Export-DbatoolsConfig +{ +<# + .SYNOPSIS + Exports configuration items to a Json file. + + .DESCRIPTION + Exports configuration items to a Json file. + + .PARAMETER FullName + Select the configuration objects to export by filtering by their full name. + + .PARAMETER Module + Select the configuration objects to export by filtering by their module name. + + .PARAMETER Name + Select the configuration objects to export by filtering by their name. + + .PARAMETER Config + The configuration object(s) to export. + Returned by Get-DbatoolsConfig. + + .PARAMETER ModuleName + Exports all configuration pertinent to a module to a predefined path. + Exported configuration items include all settings marked as 'ModuleExport' that have been changed from the default value. + + .PARAMETER ModuleVersion + The configuration version of the module-settings to write. + + .PARAMETER Scope + Which predefined path to write module specific settings to. + Only file scopes are considered. + By default it writes to the suer profile. + + .PARAMETER OutPath + The path (filename included) to export to. + Will fail if the folder does not exist, will overwrite the file if it exists. + + .PARAMETER SkipUnchanged + If set, configuration objects whose value was not changed from its original value will not be exported. + (Note: Settings that were updated with the same value as the original default will still be considered changed) + + .PARAMETER EnableException + This parameters disables user-friendly warnings and enables the throwing of exceptions. + This is less user friendly, but allows catching exceptions in calling scripts. + + .EXAMPLE + PS C:\> Get-DbatoolsConfig | Export-DbatoolsConfig -OutPath '~/export.json' + + Exports all current settings to json. + + .EXAMPLE + Export-DbatoolsConfig -Module message -OutPath '~/export.json' -SkipUnchanged + + Exports all settings of the module 'message' that are no longer the original default values to json. +#> + [CmdletBinding(DefaultParameterSetName = 'FullName')] + Param ( + [Parameter(ParameterSetName = "FullName", Position = 0, Mandatory = $true)] + [string] + $FullName, + + [Parameter(ParameterSetName = "Module", Position = 0, Mandatory = $true)] + [string] + $Module, + + [Parameter(ParameterSetName = "Module", Position = 1)] + [string] + $Name = "*", + + [Parameter(ParameterSetName = "Config", Position = 0, Mandatory = $true, ValueFromPipeline = $true)] + [Sqlcollaborative.Dbatools.Configuration.Config[]] + $Config, + + [Parameter(ParameterSetName = "ModuleName", Mandatory = $true)] + [string] + $ModuleName, + + [Parameter(ParameterSetName = "ModuleName")] + [int] + $ModuleVersion = 1, + + [Parameter(ParameterSetName = "ModuleName")] + [Sqlcollaborative.Dbatools.Configuration.ConfigScope] + $Scope = "FileUserShared", + + [Parameter(Position = 1, Mandatory = $true, ParameterSetName = 'Config')] + [Parameter(Position = 1, Mandatory = $true, ParameterSetName = 'FullName')] + [Parameter(Position = 2, Mandatory = $true, ParameterSetName = 'Module')] + [string] + $OutPath, + + [switch] + $SkipUnchanged, + + [switch] + $EnableException + ) + + begin + { + Write-Message -Level InternalComment -Message "Bound parameters: $($PSBoundParameters.Keys -join ", ")" -Tag 'debug', 'start', 'param' + + $items = @() + + if (($Scope -band 15) -and ($ModuleName)) + { + Stop-Function -Message "Cannot export modulecache to registry! Please pick a file scope for your export destination" -EnableException $EnableException -Category InvalidArgument -Tag 'fail', 'scope', 'registry' + return + } + } + process + { + if (Test-FunctionInterrupt) { return } + + if (-not $ModuleName) + { + foreach ($item in $Config) { $items += $item } + if ($FullName) { $items = Get-DbatoolsConfig -FullName $FullName } + if ($Module) { $items = Get-DbatoolsConfig -Module $Module -Name $Name } + } + } + end + { + if (Test-FunctionInterrupt) { return } + + if (-not $ModuleName) + { + try { Write-DbatoolsConfigFile -Config ($items | Where-Object { -not $SkipUnchanged -or -not $_.Unchanged } ) -Path $OutPath -Replace } + catch + { + Stop-Function -Message "Failed to export to file" -EnableException $EnableException -ErrorRecord $_ -Tag 'fail', 'export' + return + } + } + else + { + if ($Scope -band 16) + { + Write-DbatoolsConfigFile -Config (Get-DbatoolsConfig -Module $ModuleName -Force | Where-Object ModuleExport | Where-Object Unchanged -NE $true) -Path (Join-Path $script:path_FileUserLocal "$($ModuleName.ToLower())-$($ModuleVersion).json") + } + if ($Scope -band 32) + { + Write-DbatoolsConfigFile -Config (Get-DbatoolsConfig -Module $ModuleName -Force | Where-Object ModuleExport | Where-Object Unchanged -NE $true) -Path (Join-Path $script:path_FileUserShared "$($ModuleName.ToLower())-$($ModuleVersion).json") + } + if ($Scope -band 64) + { + Write-DbatoolsConfigFile -Config (Get-DbatoolsConfig -Module $ModuleName -Force | Where-Object ModuleExport | Where-Object Unchanged -NE $true) -Path (Join-Path $script:path_FileSystem "$($ModuleName.ToLower())-$($ModuleVersion).json") + } + } + } +} +function Get-DbatoolsConfig { + <# + .SYNOPSIS + Retrieves configuration elements by name. + + .DESCRIPTION + Retrieves configuration elements by name. + Can be used to search the existing configuration list. + + .PARAMETER FullName + Default: "*" + Search for configurations using the full name + + .PARAMETER Name + Default: "*" + The name of the configuration element(s) to retrieve. + May be any string, supports wildcards. + + .PARAMETER Module + Default: "*" + Search configuration by module. + + .PARAMETER Force + Overrides the default behavior and also displays hidden configuration values. + + .NOTES + Tags: Config, Module + Author: Friedrich Weinmann (@FredWeinmann) + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .EXAMPLE + PS C:\> Get-DbatoolsConfig 'Mail.To' + + Retrieves the configuration element for the key "Mail.To" + + .EXAMPLE + PS C:\> Get-DbatoolsConfig -Force + + Retrieve all configuration elements from all modules, even hidden ones. + + #> + [CmdletBinding(DefaultParameterSetName = "FullName")] + param ( + [Parameter(ParameterSetName = "FullName", Position = 0)] + [string]$FullName = "*", + [Parameter(ParameterSetName = "Module", Position = 1)] + [string]$Name = "*", + [Parameter(ParameterSetName = "Module", Position = 0)] + [string]$Module = "*", + [switch]$Force + ) + + switch ($PSCmdlet.ParameterSetName) { + "Module" { + $Name = $Name.ToLower() + $Module = $Module.ToLower() + + [Sqlcollaborative.Dbatools.Configuration.ConfigurationHost]::Configurations.Values | Where-Object { ($_.Name -like $Name) -and ($_.Module -like $Module) -and ((-not $_.Hidden) -or ($Force)) } | Sort-Object Module, Name + } + + "FullName" { + [Sqlcollaborative.Dbatools.Configuration.ConfigurationHost]::Configurations.Values | Where-Object { ("$($_.Module).$($_.Name)" -like $FullName) -and ((-not $_.Hidden) -or ($Force)) } | Sort-Object Module, Name + } + } + Test-DbaDeprecation -DeprecatedOn "1.0.0" -EnableException:$false -Alias Get-DbaConfig +} +function Get-DbatoolsConfigValue { + <# + .SYNOPSIS + Returns the configuration value stored under the specified name. + + .DESCRIPTION + Returns the configuration value stored under the specified name. + It requires the full name (.) and is usually only called by functions. + + .PARAMETER FullName + The full name (.) of the configured value to return. + + .PARAMETER Fallback + A fallback value to use, if no value was registered to a specific configuration element. + This basically is a default value that only applies on a "per call" basis, rather than a system-wide default. + + .PARAMETER NotNull + By default, this function returns null if one tries to retrieve the value from either a Configuration that does not exist or a Configuration whose value was set to null. + However, sometimes it may be important that some value was returned. + By specifying this parameter, the function will throw an error if no value was found at all. + + .NOTES + Tags: Config, Module + Author: Friedrich Weinmann (@FredWeinmann) + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .EXAMPLE + PS C:\> Get-DbatoolsConfigValue -Name 'System.MailServer' + + Returns the configured value that was assigned to the key 'System.MailServer' + + .EXAMPLE + PS C:\> Get-DbatoolsConfigValue -Name 'Default.CoffeeMilk' -Fallback 0 + + Returns the configured value for 'Default.CoffeeMilk'. If no such value is configured, it returns '0' instead. + + #> + [Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSPossibleIncorrectComparisonWithNull", "")] + [CmdletBinding()] + param ( + [Alias('Name')] + [Parameter(Mandatory)] + [string]$FullName, + [object]$Fallback, + [switch]$NotNull + ) + Test-DbaDeprecation -DeprecatedOn "1.0.0" -EnableException:$false -Alias Get-DbaConfigValue + $FullName = $FullName.ToLower() + + $temp = $null + $temp = [Sqlcollaborative.Dbatools.Configuration.ConfigurationHost]::Configurations[$FullName].Value + if ($temp -eq $null) { $temp = $Fallback } + + if ($NotNull -and ($temp -eq $null)) { + Stop-Function -Message "No Configuration Value available for $Name" -EnableException $true -Category InvalidData -Target $FullName + } else { + return $temp + } +} +function Import-DbatoolsConfig +{ +<# + .SYNOPSIS + Imports a json configuration file into the configuration system. + + .DESCRIPTION + Imports a json configuration file into the configuration system. + + .PARAMETER Path + The path to the json file to import. + + .PARAMETER ModuleName + Import configuration items specific to a module from the default configuration paths. + + .PARAMETER ModuleVersion + The configuration version of the module-settings to load. + + .PARAMETER Scope + Where to import the module specific configuration items form. + Only file-based scopes are supported for this. + By default, all locations are queried, with user settings beating system settings. + + .PARAMETER IncludeFilter + If specified, only elements with names that are similar (-like) to names in this list will be imported. + + .PARAMETER ExcludeFilter + Elements that are similar (-like) to names in this list will not be imported. + + .PARAMETER Peek + Rather than applying the setting, return the configuration items that would have been applied. + + .PARAMETER EnableException + This parameters disables user-friendly warnings and enables the throwing of exceptions. + This is less user friendly, but allows catching exceptions in calling scripts. + + .EXAMPLE + PS C:\> Import-DbatoolsConfig -Path '.\config.json' + + Imports the configuration stored in '.\config.json' + + .EXAMPLE + PS C:\> Import-DbatoolsConfig -ModuleName message + + Imports all the module specific settings that have been persisted in any of the default file system paths. +#> + [Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSAvoidUsingEmptyCatchBlock", "")] + [CmdletBinding(DefaultParameterSetName = "Path")] + param ( + [Parameter(Mandatory = $true, ValueFromPipeline = $true, ParameterSetName = "Path")] + [string[]] + $Path, + + [Parameter(ParameterSetName = "ModuleName", Mandatory = $true)] + [string] + $ModuleName, + + [Parameter(ParameterSetName = "ModuleName")] + [int] + $ModuleVersion = 1, + + [Parameter(ParameterSetName = "ModuleName")] + [Sqlcollaborative.Dbatools.Configuration.ConfigScope] + $Scope = "FileUserLocal, FileUserShared, FileSystem", + + [Parameter(ParameterSetName = "Path")] + [string[]] + $IncludeFilter, + + [Parameter(ParameterSetName = "Path")] + [string[]] + $ExcludeFilter, + + [Parameter(ParameterSetName = "Path")] + [switch] + $Peek, + + [switch] + $EnableException + ) + + begin + { + Write-Message -Level InternalComment -Message "Bound parameters: $($PSBoundParameters.Keys -join ", ")" -Tag 'debug','start','param' + } + process + { + #region Explicit Path + foreach ($item in $Path) + { + try + { + if ($item -like "http*") { $data = Read-DbatoolsConfigFile -Weblink $item -ErrorAction Stop } + else + { + $pathItem = $null + try { $pathItem = Resolve-DbaPath -Path $item -SingleItem -Provider FileSystem } + catch { } + if ($pathItem) { $data = Read-DbatoolsConfigFile -Path $pathItem -ErrorAction Stop } + else { $data = Read-DbatoolsConfigFile -RawJson $item -ErrorAction Stop } + } + } + catch { Stop-Function -Message "Failed to import $item" -EnableException $EnableException -Tag 'fail', 'import' -ErrorRecord $_ -Continue -Target $item } + + :element foreach ($element in $data) + { + #region Exclude Filter + foreach ($exclusion in $ExcludeFilter) + { + if ($element.FullName -like $exclusion) + { + continue element + } + } + #endregion Exclude Filter + + #region Include Filter + if ($IncludeFilter) + { + $isIncluded = $false + foreach ($inclusion in $IncludeFilter) + { + if ($element.FullName -like $inclusion) + { + $isIncluded = $true + break + } + } + + if (-not $isIncluded) { continue } + } + #endregion Include Filter + + if ($Peek) { $element } + else + { + try + { + if (-not $element.KeepPersisted) { Set-DbatoolsConfig -FullName $element.FullName -Value $element.Value -EnableException } + else { Set-DbatoolsConfig -FullName $element.FullName -PersistedValue $element.Value -PersistedType $element.Type } + } + catch + { + Stop-Function -Message "Failed to set '$($element.FullName)'" -ErrorRecord $_ -EnableException $EnableException -Tag 'fail', 'import' -Continue -Target $item + } + } + } + } + #endregion Explicit Path + + if ($ModuleName) + { + $data = Read-DbatoolsConfigPersisted -Module $ModuleName -Scope $Scope -ModuleVersion $ModuleVersion + + foreach ($value in $data.Values) + { + if (-not $value.KeepPersisted) { Set-DbatoolsConfig -FullName $value.FullName -Value $value.Value -EnableException:$EnableException} + else { Set-DbatoolsConfig -FullName $value.FullName -Value ([Sqlcollaborative.Dbatools.Configuration.ConfigurationHost]::ConvertFromPersistedValue($value.Value, $value.Type)) -EnableException:$EnableException } + } + } + } + end + { + + } +} +function Register-DbatoolsConfig +{ +<# + .SYNOPSIS + Registers an existing configuration object in registry. + + .DESCRIPTION + Registers an existing configuration object in registry. + This allows simple persisting of settings across powershell consoles. + It also can be used to generate a registry template, which can then be used to create policies. + + .PARAMETER Config + The configuration object to write to registry. + Can be retrieved using Get-DbatoolsConfig. + + .PARAMETER FullName + The full name of the setting to be written to registry. + + .PARAMETER Module + The name of the module, whose settings should be written to registry. + + .PARAMETER Name + Default: "*" + Used in conjunction with the -Module parameter to restrict the number of configuration items written to registry. + + .PARAMETER Scope + Default: UserDefault + Who will be affected by this export how? Current user or all? Default setting or enforced? + Legal values: UserDefault, UserMandatory, SystemDefault, SystemMandatory + + .PARAMETER EnableException + This parameters disables user-friendly warnings and enables the throwing of exceptions. + This is less user friendly, but allows catching exceptions in calling scripts. + + .EXAMPLE + PS C:\> Get-DbatoolsConfig message.style.* | Register-DbatoolsConfig + + Retrieves all configuration items that that start with message.style. and registers them in registry for the current user. + + .EXAMPLE + PS C:\> Register-DbatoolsConfig -FullName "message.consoleoutput.disable" -Scope SystemDefault + + Retrieves the configuration item "message.consoleoutput.disable" and registers it in registry as the default setting for all users on this machine. + + .EXAMPLE + PS C:\> Register-DbatoolsConfig -Module Message -Scope SystemMandatory + + Retrieves all configuration items of the module Message, then registers them in registry to enforce them for all users on the current system. +#> + [CmdletBinding(DefaultParameterSetName = "Default")] + Param ( + [Parameter(ParameterSetName = "Default", Position = 0, ValueFromPipeline = $true)] + [Sqlcollaborative.Dbatools.Configuration.Config[]] + $Config, + + [Parameter(ParameterSetName = "Default", Position = 0, ValueFromPipeline = $true)] + [string[]] + $FullName, + + [Parameter(Mandatory = $true, ParameterSetName = "Name", Position = 0)] + [string] + $Module, + + [Parameter(ParameterSetName = "Name", Position = 1)] + [string] + $Name = "*", + + [Sqlcollaborative.Dbatools.Configuration.ConfigScope] + $Scope = "UserDefault", + + [switch] + $EnableException + ) + + begin + { + if ($script:NoRegistry -and ($Scope -band 14)) + { + Stop-Function -Message "Cannot register configurations on non-windows machines to registry. Please specify a file-based scope" -Tag 'NotSupported' -Category NotImplemented + return + } + + # Linux and MAC default to local user store file + if ($script:NoRegistry -and ($Scope -eq "UserDefault")) + { + $Scope = [Sqlcollaborative.Dbatools.Configuration.ConfigScope]::FileUserLocal + } + # Linux and MAC get redirection for SystemDefault to FileSystem + if ($script:NoRegistry -and ($Scope -eq "SystemDefault")) + { + $Scope = [Sqlcollaborative.Dbatools.Configuration.ConfigScope]::FileSystem + } + + $parSet = $PSCmdlet.ParameterSetName + + function Write-Config + { + [CmdletBinding()] + Param ( + [Sqlcollaborative.Dbatools.Configuration.Config] + $Config, + + [Sqlcollaborative.Dbatools.Configuration.ConfigScope] + $Scope, + + [bool] + $EnableException, + + [string] + $FunctionName = (Get-PSCallStack)[0].Command + ) + + if (-not $Config -or ($Config.RegistryData -eq "")) + { + Stop-Function -Message "Invalid Input, cannot export $($Config.FullName), type not supported" -EnableException $EnableException -Category InvalidArgument -Tag "config", "fail" -Target $Config -FunctionName $FunctionName + return + } + + try + { + Write-Message -Level Verbose -Message "Registering $($Config.FullName) for $Scope" -Tag "Config" -Target $Config -FunctionName $FunctionName + #region User Default + if (1 -band $Scope) + { + Ensure-RegistryPath -Path $script:path_RegistryUserDefault -ErrorAction Stop + Set-ItemProperty -Path $script:path_RegistryUserDefault -Name $Config.FullName -Value $Config.RegistryData -ErrorAction Stop + } + #endregion User Default + + #region User Mandatory + if (2 -band $Scope) + { + Ensure-RegistryPath -Path $script:path_RegistryUserEnforced -ErrorAction Stop + Set-ItemProperty -Path $script:path_RegistryUserEnforced -Name $Config.FullName -Value $Config.RegistryData -ErrorAction Stop + } + #endregion User Mandatory + + #region System Default + if (4 -band $Scope) + { + Ensure-RegistryPath -Path $script:path_RegistryMachineDefault -ErrorAction Stop + Set-ItemProperty -Path $script:path_RegistryMachineDefault -Name $Config.FullName -Value $Config.RegistryData -ErrorAction Stop + } + #endregion System Default + + #region System Mandatory + if (8 -band $Scope) + { + Ensure-RegistryPath -Path $script:path_RegistryMachineEnforced -ErrorAction Stop + Set-ItemProperty -Path $script:path_RegistryMachineEnforced -Name $Config.FullName -Value $Config.RegistryData -ErrorAction Stop + } + #endregion System Mandatory + } + catch + { + Stop-Function -Message "Failed to export $($Config.FullName), to scope $Scope" -EnableException $EnableException -Tag "config", "fail" -Target $Config -ErrorRecord $_ -FunctionName $FunctionName + return + } + } + + function Ensure-RegistryPath + { + [Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSUseApprovedVerbs", "")] + [CmdletBinding()] + Param ( + [string] + $Path + ) + + if (-not (Test-Path $Path)) + { + $null = New-Item $Path -Force + } + } + + # For file based persistence + $configurationItems = @() + } + process + { + if (Test-FunctionInterrupt) { return } + + #region Registry Based + if ($Scope -band 15) + { + switch ($parSet) + { + "Default" + { + foreach ($item in $Config) + { + Write-Config -Config $item -Scope $Scope -EnableException $EnableException + } + + foreach ($item in $FullName) + { + if ([Sqlcollaborative.Dbatools.Configuration.ConfigurationHost]::Configurations.ContainsKey($item.ToLower())) + { + Write-Config -Config ([Sqlcollaborative.Dbatools.Configuration.ConfigurationHost]::Configurations[$item.ToLower()]) -Scope $Scope -EnableException $EnableException + } + } + } + "Name" + { + foreach ($item in ([Sqlcollaborative.Dbatools.Configuration.ConfigurationHost]::Configurations.Values | Where-Object Module -EQ $Module | Where-Object Name -Like $Name)) + { + Write-Config -Config $item -Scope $Scope -EnableException $EnableException + } + } + } + } + #endregion Registry Based + + #region File Based + else + { + switch ($parSet) + { + "Default" + { + foreach ($item in $Config) + { + if ($configurationItems.FullName -notcontains $item.FullName) { $configurationItems += $item } + } + + foreach ($item in $FullName) + { + if (($configurationItems.FullName -notcontains $item) -and ([Sqlcollaborative.Dbatools.Configuration.ConfigurationHost]::Configurations.ContainsKey($item.ToLower()))) + { + $configurationItems += [Sqlcollaborative.Dbatools.Configuration.ConfigurationHost]::Configurations[$item.ToLower()] + } + } + } + "Name" + { + foreach ($item in ([Sqlcollaborative.Dbatools.Configuration.ConfigurationHost]::Configurations.Values | Where-Object Module -EQ $Module | Where-Object Name -Like $Name)) + { + if ($configurationItems.FullName -notcontains $item.FullName) { $configurationItems += $item } + } + } + } + } + #endregion File Based + } + end + { + if (Test-FunctionInterrupt) { return } + + #region Finish File Based Persistence + if ($Scope -band 16) + { + Write-DbatoolsConfigFile -Config $configurationItems -Path (Join-Path $script:path_FileUserLocal "psf_config.json") + } + if ($Scope -band 32) + { + Write-DbatoolsConfigFile -Config $configurationItems -Path (Join-Path $script:path_FileUserShared "psf_config.json") + } + if ($Scope -band 64) + { + Write-DbatoolsConfigFile -Config $configurationItems -Path (Join-Path $script:path_FileSystem "psf_config.json") + } + #endregion Finish File Based Persistence + } +} +function Reset-DbatoolsConfig +{ +<# + .SYNOPSIS + Reverts a configuration item to its default value. + + .DESCRIPTION + This command can be used to revert a configuration item to the value it was initialized with. + Generally, this amounts to reverting it to its default value. + + In order for a reset to be possible, two conditions must be met: + - The setting must have been initialized. + - The setting cannot have been enforced by policy. + + .PARAMETER ConfigurationItem + A configuration object as returned by Get-DbatoolsConfig. + + .PARAMETER FullName + The full name of the setting to reset, offering the maximum of precision. + + .PARAMETER Module + The name of the module, from which configurations should be reset. + Used in conjunction with the -Name parameter to filter a specific set of items. + + .PARAMETER Name + Used in conjunction with the -Module parameter to select which settings to reset using wildcard comparison. + + .PARAMETER EnableException + This parameters disables user-friendly warnings and enables the throwing of exceptions. + This is less user friendly, but allows catching exceptions in calling scripts. + + .PARAMETER Confirm + If this switch is enabled, you will be prompted for confirmation before executing any operations that change state. + + .PARAMETER WhatIf + If this switch is enabled, no actions are performed but informational messages will be displayed that explain what would happen if the command were to run. + + .EXAMPLE + PS C:\> Reset-DbatoolsConfig -Module MyModule + + Resets all configuration items of the MyModule to default. + + .EXAMPLE + PS C:\> Get-DbatoolsConfig | Reset-DbatoolsConfig + + Resets ALL configuration items to default. + + .EXAMPLE + PS C:\> Reset-DbatoolsConfig -FullName MyModule.Group.Setting1 + + Resets the configuration item named 'MyModule.Group.Setting1'. +#> + [CmdletBinding(DefaultParameterSetName = 'Pipeline')] + param ( + [Parameter(ValueFromPipeline = $true, ParameterSetName = 'Pipeline')] + [Sqlcollaborative.Dbatools.Configuration.Config[]] + $ConfigurationItem, + + [Parameter(ValueFromPipeline = $true, ParameterSetName = 'Pipeline')] + [string[]] + $FullName, + + [Parameter(Mandatory = $true, ParameterSetName = 'Module')] + [string] + $Module, + + [Parameter(ParameterSetName = 'Module')] + [string] + $Name = "*", + + [switch] + $EnableException + ) + + process + { + #region By configuration Item + foreach ($item in $ConfigurationItem) + { + if ($PSCmdlet.ShouldProcess($item.FullName, 'Reset to default value')) + { + try { $item.ResetValue() } + catch { Stop-Function -Message "Failed to reset the configuration item." -ErrorRecord $_ -Continue -EnableException $EnableException } + } + } + #endregion By configuration Item + + #region By FullName + foreach ($nameItem in $FullName) + { + # The configuration items themselves can be cast to string, so they need to be filtered out, + # otherwise on bind they would execute for this code-path as well. + if ($nameItem -ceq "Sqlcollaborative.Dbatools.Configuration.Config") { continue } + + foreach ($item in (Get-DbatoolsConfig -FullName $nameItem)) + { + if ($PSCmdlet.ShouldProcess($item.FullName, 'Reset to default value')) + { + try { $item.ResetValue() } + catch { Stop-Function -Message "Failed to reset the configuration item." -ErrorRecord $_ -Continue -EnableException $EnableException } + } + } + } + #endregion By FullName + if ($Module) + { + foreach ($item in (Get-DbatoolsConfig -Module $Module -Name $Name)) + { + if ($PSCmdlet.ShouldProcess($item.FullName, 'Reset to default value')) + { + try { $item.ResetValue() } + catch { Stop-Function -Message "Failed to reset the configuration item." -ErrorRecord $_ -Continue -EnableException $EnableException } + } + } + } + } +} +function Unregister-DbatoolsConfig +{ +<# + .SYNOPSIS + Removes registered configuration settings. + + .DESCRIPTION + Removes registered configuration settings. + This function can be used to remove settings that have been persisted for either user or computer. + + Note: This command has no effect on configuration setings currently in memory. + + .PARAMETER ConfigurationItem + A configuration object as returned by Get-DbatoolsConfig. + + .PARAMETER FullName + The full name of the configuration setting to purge. + + .PARAMETER Module + The module, amongst which settings should be unregistered. + + .PARAMETER Name + The name of the setting to unregister. + For use together with the module parameter, to limit the amount of settings that are unregistered. + + .PARAMETER Scope + Settings can be set to either default or enforced, for user or the entire computer. + By default, only DefaultSettings for the user are unregistered. + Use this parameter to choose the actual scope for the command to process. + + .EXAMPLE + PS C:\> Get-DbatoolsConfig | Unregister-DbatoolsConfig + + Completely removes all registered configurations currently loaded in memory. + In most cases, this will mean removing all registered configurations. + + .EXAMPLE + PS C:\> Unregister-DbatoolsConfig -Scope SystemDefault -FullName 'MyModule.Path.DefaultExport' + + Unregisters the setting 'MyModule.Path.DefaultExport' from the list of computer-wide defaults. + Note: Changing system wide settings requires running the console with elevation. + + .EXAMPLE + PS C:\> Unregister-DbatoolsConfig -Module MyModule + + Unregisters all configuration settings for the module MyModule. +#> + [CmdletBinding(DefaultParameterSetName = 'Pipeline')] + param ( + [Parameter(ValueFromPipeline = $true, ParameterSetName = 'Pipeline')] + [Sqlcollaborative.Dbatools.Configuration.Config[]] + $ConfigurationItem, + + [Parameter(ValueFromPipeline = $true, ParameterSetName = 'Pipeline')] + [string[]] + $FullName, + + [Parameter(Mandatory = $true, ParameterSetName = 'Module')] + [string] + $Module, + + [Parameter(ParameterSetName = 'Module')] + [string] + $Name = "*", + + [Sqlcollaborative.Dbatools.Configuration.ConfigScope] + $Scope = "UserDefault" + ) + + begin + { + if (($PSVersionTable.PSVersion.Major -ge 6) -and ($PSVersionTable.OS -notlike "*Windows*") -and ($Scope -band 15)) + { + Stop-Function -Message "Cannot unregister configurations from registry on non-windows machines." -Tag 'NotSupported' -Category ResourceUnavailable + return + } + + #region Initialize Collection + $registryProperties = @() + if ($Scope -band 1) + { + if (Test-Path $script:path_RegistryUserDefault) { $registryProperties += Get-ItemProperty -Path $script:path_RegistryUserDefault } + } + if ($Scope -band 2) + { + if (Test-Path $script:path_RegistryUserEnforced) { $registryProperties += Get-ItemProperty -Path $script:path_RegistryUserEnforced } + } + if ($Scope -band 4) + { + if (Test-Path $script:path_RegistryMachineDefault) { $registryProperties += Get-ItemProperty -Path $script:path_RegistryMachineDefault } + } + if ($Scope -band 8) + { + if (Test-Path $script:path_RegistryMachineEnforced) { $registryProperties += Get-ItemProperty -Path $script:path_RegistryMachineEnforced } + } + $pathProperties = @() + if ($Scope -band 16) + { + $fileUserLocalSettings = @() + if (Test-Path (Join-Path $script:path_FileUserLocal "psf_config.json")) { $fileUserLocalSettings = Get-Content (Join-Path $script:path_FileUserLocal "psf_config.json") -Encoding UTF8 | ConvertFrom-Json } + if ($fileUserLocalSettings) + { + $pathProperties += [pscustomobject]@{ + Path = (Join-Path $script:path_FileUserLocal "psf_config.json") + Properties = $fileUserLocalSettings + Changed = $false + } + } + } + if ($Scope -band 32) + { + $fileUserSharedSettings = @() + if (Test-Path (Join-Path $script:path_FileUserShared "psf_config.json")) { $fileUserSharedSettings = Get-Content (Join-Path $script:path_FileUserShared "psf_config.json") -Encoding UTF8 | ConvertFrom-Json } + if ($fileUserSharedSettings) + { + $pathProperties += [pscustomobject]@{ + Path = (Join-Path $script:path_FileUserShared "psf_config.json") + Properties = $fileUserSharedSettings + Changed = $false + } + } + } + if ($Scope -band 64) + { + $fileSystemSettings = @() + if (Test-Path (Join-Path $script:path_FileSystem "psf_config.json")) { $fileSystemSettings = Get-Content (Join-Path $script:path_FileSystem "psf_config.json") -Encoding UTF8 | ConvertFrom-Json } + if ($fileSystemSettings) + { + $pathProperties += [pscustomobject]@{ + Path = (Join-Path $script:path_FileSystem "psf_config.json") + Properties = $fileSystemSettings + Changed = $false + } + } + } + #endregion Initialize Collection + + $common = 'PSPath', 'PSParentPath', 'PSChildName', 'PSDrive', 'PSProvider' + } + process + { + if (Test-FunctionInterrupt) { return } + # Silently skip since no action necessary + if (-not ($pathProperties -or $registryProperties)) { return } + + foreach ($item in $ConfigurationItem) + { + # Registry + foreach ($hive in ($registryProperties | Where-Object { $_.PSObject.Properties.Name -eq $item.FullName })) + { + Remove-ItemProperty -Path $hive.PSPath -Name $item.FullName + } + # Prepare file + foreach ($fileConfig in ($pathProperties | Where-Object { $_.Properties.FullName -contains $item.FullName })) + { + $fileConfig.Properties = $fileConfig.Properties | Where-Object FullName -NE $item.FullName + $fileConfig.Changed = $true + } + } + + foreach ($item in $FullName) + { + # Ignore string-casted configurations + if ($item -ceq "Sqlcollaborative.Dbatools.Configuration.Config") { continue } + + # Registry + foreach ($hive in ($registryProperties | Where-Object { $_.PSObject.Properties.Name -eq $item })) + { + Remove-ItemProperty -Path $hive.PSPath -Name $item + } + # Prepare file + foreach ($fileConfig in ($pathProperties | Where-Object { $_.Properties.FullName -contains $item })) + { + $fileConfig.Properties = $fileConfig.Properties | Where-Object FullName -NE $item + $fileConfig.Changed = $true + } + } + + if ($Module) + { + $compoundName = "{0}.{1}" -f $Module, $Name + + # Registry + foreach ($hive in ($registryProperties | Where-Object { $_.PSObject.Properties.Name -like $compoundName })) + { + foreach ($propName in $hive.PSObject.Properties.Name) + { + if ($propName -in $common) { continue } + + if ($propName -like $compoundName) + { + Remove-ItemProperty -Path $hive.PSPath -Name $propName + } + } + } + # Prepare file + foreach ($fileConfig in ($pathProperties | Where-Object { $_.Properties.FullName -like $compoundName })) + { + $fileConfig.Properties = $fileConfig.Properties | Where-Object FullName -NotLike $compoundName + $fileConfig.Changed = $true + } + } + } + end + { + if (Test-FunctionInterrupt) { return } + + foreach ($fileConfig in $pathProperties) + { + if (-not $fileConfig.Changed) { continue } + + if ($fileConfig.Properties) + { + $fileConfig.Properties | ConvertTo-Json | Set-Content -Path $fileConfig.Path -Encoding UTF8 + } + else + { + Remove-Item $fileConfig.Path + } + } + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function Add-DbaAgDatabase { + <# + .SYNOPSIS + Adds a database to an availability group on a SQL Server instance. + + .DESCRIPTION + Adds a database to an availability group on a SQL Server instance. + + Before joining the replica databases to the availablity group, the databases will be initialized with automatic seeding or full/log backup. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. Server version must be SQL Server version 2012 or higher. + + This should be the primary replica. + + .PARAMETER SqlCredential + Login to the SqlInstance instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Database + The database or databases to add. + + .PARAMETER AvailabilityGroup + The availability group where the databases will be added. + + .PARAMETER Secondary + Not required - the command will figure this out. But if you'd like to be explicit about replicas, this will help. + + .PARAMETER SecondarySqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER InputObject + Enables piping from Get-DbaDatabase, Get-DbaDbSharePoint and more. + + .PARAMETER SeedingMode + Specifies how the secondary replica will be initially seeded. + + Automatic enables direct seeding. This method will seed the secondary replica over the network. This method does not require you to backup and restore a copy of the primary database on the replica. + + Manual requires you to create a backup of the database on the primary replica and manually restore that backup on the secondary replica. + + If not specified, the setting from the availability group replica will be used. Otherwise the setting will be updated. + + .PARAMETER SharedPath + The network share where the backups will be backed up and restored from. + + Each SQL Server service account must have access to this share. + + NOTE: If a backup / restore is performed, the backups will be left in tact on the network share. + + .PARAMETER UseLastBackup + Use the last full backup of database. + + .PARAMETER WhatIf + Shows what would happen if the command were to run. No actions are actually performed. + + .PARAMETER Confirm + Prompts you for confirmation before executing any changing operations within the command. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: AvailabilityGroup, HA, AG + Author: Chrissy LeMaire (@cl), netnerds.net + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Add-DbaAgDatabase + + .EXAMPLE + PS C:\> Add-DbaAgDatabase -SqlInstance sql2017a -AvailabilityGroup ag1 -Database db1, db2 -Confirm + + Adds db1 and db2 to ag1 on sql2017a. Prompts for confirmation. + + .EXAMPLE + PS C:\> Get-DbaDatabase -SqlInstance sql2017a | Out-GridView -Passthru | Add-DbaAgDatabase -AvailabilityGroup ag1 + + Adds selected databases from sql2017a to ag1 + + .EXAMPLE + PS C:\> Get-DbaDbSharePoint -SqlInstance sqlcluster | Add-DbaAgDatabase -AvailabilityGroup SharePoint + + Adds SharePoint databases as found in SharePoint_Config on sqlcluster to ag1 on sqlcluster + + .EXAMPLE + PS C:\> Get-DbaDbSharePoint -SqlInstance sqlcluster -ConfigDatabase SharePoint_Config_2019 | Add-DbaAgDatabase -AvailabilityGroup SharePoint + + Adds SharePoint databases as found in SharePoint_Config_2019 on sqlcluster to ag1 on sqlcluster + #> + [CmdletBinding(SupportsShouldProcess, ConfirmImpact = 'Low')] + param ( + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [parameter(Mandatory)] + [string]$AvailabilityGroup, + [string[]]$Database, + [DbaInstanceParameter[]]$Secondary, + [PSCredential]$SecondarySqlCredential, + [parameter(ValueFromPipeline)] + [Microsoft.SqlServer.Management.Smo.Database[]]$InputObject, + [ValidateSet('Automatic', 'Manual')] + [string]$SeedingMode, + [string]$SharedPath, + [switch]$UseLastBackup, + [switch]$EnableException + ) + process { + if ((Test-Bound -ParameterName SqlInstance)) { + if ((Test-Bound -Not -ParameterName Database) -or (Test-Bound -Not -ParameterName AvailabilityGroup)) { + Stop-Function -Message "You must specify one or more databases and one Availability Group when using the SqlInstance parameter." + return + } + } + + foreach ($instance in $SqlInstance) { + $InputObject += Get-DbaDatabase -SqlInstance $instance -SqlCredential $SqlCredential -Database $Database + } + + foreach ($db in $InputObject) { + $allbackups = @{ + } + + $Primary = $db.Parent + # check primary, should be run against primary + $ag = Get-DbaAvailabilityGroup -SqlInstance $db.Parent -AvailabilityGroup $AvailabilityGroup + + if ($ag.AvailabilityDatabases.Name -contains $db.Name) { + Stop-Function -Message "$($db.Name) is already joined to $($ag.Name)" -Continue + } + + if (-not $Secondary) { + $secondaryReplicas = $ag.AvailabilityReplicas | Where-Object Role -eq Secondary + } else { + $secondaryReplicas = Get-DbaAgReplica -SqlInstance $Secondary -SqlCredential $SecondarySqlCredential -AvailabilityGroup $ag.Name | Where-Object Role -eq Secondary + } + + if ($SeedingMode -eq "Automatic") { + # first check + if ($Pscmdlet.ShouldProcess($Primary, "Backing up $db to NUL")) { + $null = Backup-DbaDatabase -BackupFileName NUL -SqlInstance $Primary -SqlCredential $SqlCredential -Database $db + } + } + + if ($Pscmdlet.ShouldProcess($ag.Parent.Name, "Adding availability group $db to $($db.Parent.Name)")) { + try { + $agdb = New-Object Microsoft.SqlServer.Management.Smo.AvailabilityDatabase($ag, $db.Name) + # something is up with .net create(), force a stop + Invoke-Create -Object $agdb + Get-DbaAgDatabase -SqlInstance $ag.Parent -Database $db.Name + } catch { + Stop-Function -Message "Failure" -ErrorRecord $_ -Continue + } + } + + foreach ($replica in $secondaryReplicas) { + + $agreplica = Get-DbaAgReplica -SqlInstance $Primary -SqlCredential $SqlCredential -AvailabilityGroup $ag.name -Replica $replica.Name + + if ($SeedingMode) { + $agreplica.SeedingMode = $SeedingMode + $agreplica.Alter() + } + $agreplica.Refresh() + $SeedingModeReplica = $agreplica.SeedingMode + + $primarydb = Get-DbaDatabase -SqlInstance $Primary -SqlCredential $SqlCredential -Database $db.name + + if ($SeedingModeReplica -ne 'Automatic') { + try { + if (-not $allbackups[$db]) { + if ($UseLastBackup) { + $allbackups[$db] = Get-DbaBackupHistory -SqlInstance $primarydb.Parent -Database $primarydb.Name -IncludeCopyOnly -Last -EnableException + } else { + $fullbackup = $primarydb | Backup-DbaDatabase -BackupDirectory $SharedPath -Type Full -EnableException + $logbackup = $primarydb | Backup-DbaDatabase -BackupDirectory $SharedPath -Type Log -EnableException + $allbackups[$db] = $fullbackup, $logbackup + } + Write-Message -Level Verbose -Message "Backups still exist on $SharedPath" + } + if ($Pscmdlet.ShouldProcess("$Secondary", "restoring full and log backups of $primarydb from $Primary")) { + # keep going to ensure output is shown even if dbs aren't added well. + $null = $allbackups[$db] | Restore-DbaDatabase -SqlInstance $replica.Parent.Parent -WithReplace -NoRecovery -TrustDbBackupHistory -EnableException + } + } catch { + Stop-Function -Message "Failure" -ErrorRecord $_ -Continue + } + } + + $replicadb = Get-DbaAgDatabase -SqlInstance $replica.Parent.Parent -Database $db.Name -AvailabilityGroup $ag.Name #credential of secondary !! + + if ($replicadb -and -not ($SeedingModeReplica -eq 'Automatic')) { + if ($Pscmdlet.ShouldProcess($ag.Parent.Name, "Joining availability group $db to $($db.Parent.Name)")) { + $timeout = 1 + do { + try { + Write-Message -Level Verbose -Message "Trying to add $($replicadb.Name) to $($replica.Name)" + $timeout++ + $replicadb.JoinAvailablityGroup() + $replicadb.Refresh() + Start-Sleep -Seconds 1 + } catch { + Stop-Function -Message "Error joining database to availability group" -ErrorRecord $_ -Continue + } + } while (-not $replicadb.IsJoined -and $timeout -lt 10) + + if ($replicadb.IsJoined) { + $replicadb + } else { + Stop-Function -Continue -Message "Could not join $($replicadb.Name) to $($replica.Name)" + } + } + } else { + $replicadb + } + } + } + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function Add-DbaAgListener { + <# + .SYNOPSIS + Adds a listener to an availability group on a SQL Server instance. + + .DESCRIPTION + Adds a listener to an availability group on a SQL Server instance. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. Server version must be SQL Server version 2012 or higher. + + .PARAMETER SqlCredential + Login to the SqlInstance instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER AvailabilityGroup + The Availability Group to which a listener will be bestowed upon. + + .PARAMETER IPAddress + Sets the IP address of the availability group listener. + + .PARAMETER SubnetMask + Sets the subnet IP mask of the availability group listener. Defaults to 255.255.255.0. + + .PARAMETER Port + Sets the port number used to communicate with the availability group. Defaults to 1433. + + .PARAMETER Dhcp + Indicates whether the listener uses DHCP. + + .PARAMETER Passthru + Don't create the listener, just pass thru an object that can be further customized before creation. + + .PARAMETER InputObject + Enables piping from Get-DbaAvailabilityGroup + + .PARAMETER WhatIf + Shows what would happen if the command were to run. No actions are actually performed. + + .PARAMETER Confirm + Prompts you for confirmation before executing any changing operations within the command. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: AvailabilityGroup, HA, AG + Author: Chrissy LeMaire (@cl), netnerds.net + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Add-DbaAgListener + + .EXAMPLE + PS C:\> Add-DbaAgListener -SqlInstance sql2017 -AvailabilityGroup SharePoint -IPAddress 10.0.20.20 + + Creates a listener on 10.0.20.20 port 1433 for the SharePoint availability group on sql2017. + + .EXAMPLE + PS C:\> Get-DbaAvailabilityGroup -SqlInstance sql2017 -AvailabilityGroup availabilitygroup1 | Add-DbaAgListener -Dhcp + + Creates a listener on port 1433 with a dynamic IP for the group1 availability group on sql2017. + + #> + [CmdletBinding(SupportsShouldProcess, ConfirmImpact = 'Low')] + param ( + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [string[]]$AvailabilityGroup, + [ipaddress]$IPAddress, + [ipaddress]$SubnetMask = "255.255.255.0", + [int]$Port = 1433, + [switch]$Dhcp, + [switch]$Passthru, + [parameter(ValueFromPipeline)] + [Microsoft.SqlServer.Management.Smo.AvailabilityGroup[]]$InputObject, + [switch]$EnableException + ) + process { + if ((Test-Bound -ParameterName SqlInstance) -and (Test-Bound -Not -ParameterName AvailabilityGroup)) { + Stop-Function -Message "You must specify one or more databases and one or more Availability Groups when using the SqlInstance parameter." + return + } + + if ($SqlInstance) { + $InputObject += Get-DbaAvailabilityGroup -SqlInstance $SqlInstance -SqlCredential $SqlCredential -AvailabilityGroup $AvailabilityGroup + } + + foreach ($ag in $InputObject) { + if ((Test-Bound -Not -ParameterName Name)) { + $Name = $ag.Name + } + if ($Pscmdlet.ShouldProcess($ag.Parent.Name, "Adding $($IPAddress.IPAddressToString) to $($ag.Name)")) { + try { + $aglistener = New-Object Microsoft.SqlServer.Management.Smo.AvailabilityGroupListener -ArgumentList $ag, $Name + $aglistener.PortNumber = $Port + $listenerip = New-Object Microsoft.SqlServer.Management.Smo.AvailabilityGroupListenerIPAddress -ArgumentList $aglistener + + if (Test-Bound -ParameterName IPAddress) { + $listenerip.IPAddress = $IPAddress.IPAddressToString + $listenerip.SubnetMask = $SubnetMask.IPAddressToString + } + + $listenerip.IsDHCP = $Dhcp + $aglistener.AvailabilityGroupListenerIPAddresses.Add($listenerip) + + if ($Passthru) { + return $aglistener + } else { + # something is up with .net create(), force a stop + Invoke-Create -Object $aglistener + } + } catch { + Stop-Function -Message "Failure" -ErrorRecord $_ + } + Get-DbaAgListener -SqlInstance $ag.Parent -AvailabilityGroup $ag.Name -Listener $Name + } + } + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function Add-DbaAgReplica { + <# + .SYNOPSIS + Adds a replica to an availability group on a SQL Server instance. + + .DESCRIPTION + Adds a replica to an availability group on a SQL Server instance. + + Automatically creates a database mirroring endpoint if required. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. Server version must be SQL Server version 2012 or higher. + + .PARAMETER SqlCredential + Login to the SqlInstance instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Name + The name of the replica. Defaults to the SQL Server instance name. + + .PARAMETER AvailabilityMode + Sets the availability mode of the availability group replica. Options are: AsynchronousCommit and SynchronousCommit. SynchronousCommit is default. + + .PARAMETER FailoverMode + Sets the failover mode of the availability group replica. Options are Automatic and Manual. Automatic is default. + + .PARAMETER BackupPriority + Sets the backup priority availability group replica. Default is 50. + + .PARAMETER Endpoint + By default, this command will attempt to find a DatabaseMirror endpoint. If one does not exist, it will create it. + + If an endpoint must be created, the name "hadr_endpoint" will be used. If an alternative is preferred, use Endpoint. + + .PARAMETER Passthru + Don't create the replica, just pass thru an object that can be further customized before creation. + + .PARAMETER InputObject + Enables piping from Get-DbaAvailabilityGroup. + + .PARAMETER ConnectionModeInPrimaryRole + Specifies the connection intent modes of an Availability Replica in primary role. AllowAllConnections by default. + + .PARAMETER ConnectionModeInSecondaryRole + Specifies the connection modes of an Availability Replica in secondary role. AllowAllConnections by default. + + .PARAMETER ReadonlyRoutingConnectionUrl + Sets the read only routing connection url for the availability replica. + + .PARAMETER SeedingMode + Specifies how the secondary replica will be initially seeded. + + Automatic enables direct seeding. This method will seed the secondary replica over the network. This method does not require you to backup and restore a copy of the primary database on the replica. + + Manual requires you to create a backup of the database on the primary replica and manually restore that backup on the secondary replica. + + .PARAMETER Certificate + Specifies that the endpoint is to authenticate the connection using the certificate specified by certificate_name to establish identity for authorization. + + The far endpoint must have a certificate with the public key matching the private key of the specified certificate. + + .PARAMETER WhatIf + Shows what would happen if the command were to run. No actions are actually performed. + + .PARAMETER Confirm + Prompts you for confirmation before executing any changing operations within the command. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: AvailabilityGroup, HA, AG + Author: Chrissy LeMaire (@cl), netnerds.net + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Add-DbaAgReplica + + .EXAMPLE + PS C:\> Get-DbaAvailabilityGroup -SqlInstance sql2017a -AvailabilityGroup SharePoint | Add-DbaAgReplica -SqlInstance sql2017b + + Adds sql2017b to the SharePoint availability group on sql2017a + + .EXAMPLE + PS C:\> Get-DbaAvailabilityGroup -SqlInstance sql2017a -AvailabilityGroup SharePoint | Add-DbaAgReplica -SqlInstance sql2017b -FailoverMode Manual + + Adds sql2017b to the SharePoint availability group on sql2017a with a manual failover mode. + #> + [CmdletBinding(SupportsShouldProcess, ConfirmImpact = 'Low')] + param ( + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [string]$Name, + [ValidateSet('AsynchronousCommit', 'SynchronousCommit')] + [string]$AvailabilityMode = "SynchronousCommit", + [ValidateSet('Automatic', 'Manual', 'External')] + [string]$FailoverMode = "Automatic", + [int]$BackupPriority = 50, + [ValidateSet('AllowAllConnections', 'AllowReadWriteConnections')] + [string]$ConnectionModeInPrimaryRole = 'AllowAllConnections', + [ValidateSet('AllowAllConnections', 'AllowNoConnections', 'AllowReadIntentConnectionsOnly')] + [string]$ConnectionModeInSecondaryRole = 'AllowAllConnections', + [ValidateSet('Automatic', 'Manual')] + [string]$SeedingMode = 'Automatic', + [string]$Endpoint, + [switch]$Passthru, + [string]$ReadonlyRoutingConnectionUrl, + [string]$Certificate, + [parameter(ValueFromPipeline, Mandatory)] + [Microsoft.SqlServer.Management.Smo.AvailabilityGroup]$InputObject, + [switch]$EnableException + ) + process { + foreach ($instance in $SqlInstance) { + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential -MinimumVersion 11 + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + if ($Certificate) { + $cert = Get-DbaDbCertificate -SqlInstance $server -Certificate $Certificate + if (-not $cert) { + Stop-Function -Message "Certificate $Certificate does not exist on $instance" -ErrorRecord $_ -Target $Certificate -Continue + } + } + + $ep = Get-DbaEndpoint -SqlInstance $server -Type DatabaseMirroring + + if (-not $ep) { + if ($Pscmdlet.ShouldProcess($server.Name, "Adding endpoint named $Endpoint to $instance")) { + if (-not $Endpoint) { + $Endpoint = "hadr_endpoint" + } + $ep = New-DbaEndpoint -SqlInstance $server -Name hadr_endpoint -Type DatabaseMirroring -EndpointEncryption Supported -EncryptionAlgorithm Aes -Certificate $Certificate + $null = $ep | Start-DbaEndpoint + } + } + + if ((Test-Bound -Not -ParameterName Name)) { + $Name = $server.DomainInstanceName + } + + if ($Pscmdlet.ShouldProcess($server.Name, "Creating a replica for $($InputObject.Name) named $Name")) { + try { + $replica = New-Object Microsoft.SqlServer.Management.Smo.AvailabilityReplica -ArgumentList $InputObject, $Name + $replica.EndpointUrl = $ep.Fqdn + $replica.FailoverMode = [Microsoft.SqlServer.Management.Smo.AvailabilityReplicaFailoverMode]::$FailoverMode + $replica.AvailabilityMode = [Microsoft.SqlServer.Management.Smo.AvailabilityReplicaAvailabilityMode]::$AvailabilityMode + if ($server.EngineEdition -ne "Standard") { + $replica.ConnectionModeInPrimaryRole = [Microsoft.SqlServer.Management.Smo.AvailabilityReplicaConnectionModeInPrimaryRole]::$ConnectionModeInPrimaryRole + $replica.ConnectionModeInSecondaryRole = [Microsoft.SqlServer.Management.Smo.AvailabilityReplicaConnectionModeInSecondaryRole]::$ConnectionModeInSecondaryRole + } + $replica.BackupPriority = $BackupPriority + + if ($ReadonlyRoutingConnectionUrl) { + $replica.ReadonlyRoutingConnectionUrl = $ReadonlyRoutingConnectionUrl + } + + if ($SeedingMode -and $server.VersionMajor -ge 13) { + $replica.SeedingMode = $SeedingMode + } + + if ($Passthru) { + return $replica + } + + $defaults = 'ComputerName', 'InstanceName', 'SqlInstance', 'AvailabilityGroup', 'Name', 'Role', 'RollupSynchronizationState', 'AvailabilityMode', 'BackupPriority', 'EndpointUrl', 'SessionTimeout', 'FailoverMode', 'ReadonlyRoutingList' + $InputObject.AvailabilityReplicas.Add($replica) + $agreplica = $InputObject.AvailabilityReplicas[$Name] + if ($InputObject.State -eq 'Existing') { + Invoke-Create -Object $replica + $null = Join-DbaAvailabilityGroup -SqlInstance $instance -SqlCredential $SqlCredential -AvailabilityGroup $InputObject.Name + $agreplica.Alter() + } + Add-Member -Force -InputObject $agreplica -MemberType NoteProperty -Name ComputerName -value $agreplica.Parent.ComputerName + Add-Member -Force -InputObject $agreplica -MemberType NoteProperty -Name InstanceName -value $agreplica.Parent.InstanceName + Add-Member -Force -InputObject $agreplica -MemberType NoteProperty -Name SqlInstance -value $agreplica.Parent.SqlInstance + Add-Member -Force -InputObject $agreplica -MemberType NoteProperty -Name AvailabilityGroup -value $agreplica.Parent.Name + Add-Member -Force -InputObject $agreplica -MemberType NoteProperty -Name Replica -value $agreplica.Name # backwards compat + + Select-DefaultView -InputObject $agreplica -Property $defaults + } catch { + $msg = $_.Exception.InnerException.InnerException.Message + if (-not $msg) { + $msg = $_ + } + Stop-Function -Message $msg -ErrorRecord $_ -Continue + } + } + } + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function Add-DbaCmsRegServer { + <# + .SYNOPSIS + Adds registered servers to SQL Server Central Management Server (CMS) + + .DESCRIPTION + Adds registered servers to SQL Server Central Management Server (CMS). If you need more flexiblity, look into Import-DbaCmsRegServer which + accepts multiple kinds of input and allows you to add reg servers from different CMSes. + + .PARAMETER SqlInstance + The target SQL Server instance + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER ServerName + Server Name is the actual SQL instance name (labeled Server Name) + + .PARAMETER Name + Name is basically the nickname in SSMS CMS interface (labeled Registered Server Name) + + .PARAMETER Description + Adds a description for the registered server + + .PARAMETER Group + Adds the registered server to a specific group. + + .PARAMETER InputObject + Allows the piping of a registered server group + + .PARAMETER WhatIf + Shows what would happen if the command were to run. No actions are actually performed. + + .PARAMETER Confirm + Prompts you for confirmation before executing any changing operations within the command. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: RegisteredServer, CMS + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Add-DbaCmsRegServer + + .EXAMPLE + PS C:\> Add-DbaCmsRegServer -SqlInstance sql2008 -ServerName sql01 + + Creates a registered server on sql2008's CMS which points to the SQL Server, sql01. When scrolling in CMS, the name "sql01" will be visible. + + .EXAMPLE + PS C:\> Add-DbaCmsRegServer -SqlInstance sql2008 -ServerName sql01 -Name "The 2008 Clustered Instance" -Description "HR's Dedicated SharePoint instance" + + Creates a registered server on sql2008's CMS which points to the SQL Server, sql01. When scrolling in CMS, "The 2008 Clustered Instance" will be visible. + Clearly this is hard to explain ;) + + .EXAMPLE + PS C:\> Add-DbaCmsRegServer -SqlInstance sql2008 -ServerName sql01 -Group hr\Seattle + + Creates a registered server on sql2008's CMS which points to the SQL Server, sql01. When scrolling in CMS, the name "sql01" will be visible within the Seattle group which is in the hr group. + + .EXAMPLE + PS C:\> Get-DbaCmsRegServerGroup -SqlInstance sql2008 -Group hr\Seattle | Add-DbaCmsRegServer -ServerName sql01111 + + Creates a registered server on sql2008's CMS which points to the SQL Server, sql01. When scrolling in CMS, the name "sql01" will be visible within the Seattle group which is in the hr group. + + #> + [CmdletBinding(SupportsShouldProcess)] + param ( + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [parameter(Mandatory)] + [string]$ServerName, + [string]$Name = $ServerName, + [string]$Description, + [object]$Group, + [parameter(ValueFromPipeline)] + [Microsoft.SqlServer.Management.RegisteredServers.ServerGroup[]]$InputObject, + [switch]$EnableException + ) + process { + if (-not $InputObject -and -not $SqlInstance) { + Stop-Function -Message "You must either pipe in a registered server group or specify a sqlinstance" + return + } + + # double check in case a null name was bound + if (-not $Name) { + $Name = $ServerName + } + + foreach ($instance in $SqlInstance) { + if (($Group)) { + if ($Group -is [Microsoft.SqlServer.Management.RegisteredServers.ServerGroup]) { + $InputObject += Get-DbaCmsRegServerGroup -SqlInstance $instance -SqlCredential $SqlCredential -Group $Group.Name + } else { + $InputObject += Get-DbaCmsRegServerGroup -SqlInstance $instance -SqlCredential $SqlCredential -Group $Group + } + } else { + $InputObject += Get-DbaCmsRegServerGroup -SqlInstance $instance -SqlCredential $SqlCredential -Id 1 + } + + if (-not $InputObject) { + Stop-Function -Message "No matching groups found on $instance" -Continue + } + } + + foreach ($reggroup in $InputObject) { + $parentserver = Get-RegServerParent -InputObject $reggroup + + if ($null -eq $parentserver) { + Stop-Function -Message "Something went wrong and it's hard to explain, sorry. This basically shouldn't happen." -Continue + } + + $server = $parentserver.ServerConnection.SqlConnectionObject + + if ($Pscmdlet.ShouldProcess($parentserver.SqlInstance, "Adding $ServerName")) { + try { + $newserver = New-Object Microsoft.SqlServer.Management.RegisteredServers.RegisteredServer($reggroup, $Name) + $newserver.ServerName = $ServerName + $newserver.Description = $Description + $newserver.Create() + + Get-DbaCmsRegServer -SqlInstance $server -Name $Name -ServerName $ServerName + } catch { + Stop-Function -Message "Failed to add $ServerName on $($parentserver.SqlInstance)" -ErrorRecord $_ -Continue + } + } + } + } + end { + Test-DbaDeprecation -DeprecatedOn "1.0.0" -Alias Add-DbaRegisteredServer + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function Add-DbaCmsRegServerGroup { + <# + .SYNOPSIS + Adds registered server groups to SQL Server Central Management Server (CMS) + + .DESCRIPTION + Adds registered server groups to SQL Server Central Management Server (CMS). If you need more flexibility, look into Import-DbaCmsRegServer which accepts multiple kinds of input and allows you to add reg servers and groups from different CMS. + + .PARAMETER SqlInstance + The target SQL Server instance + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Name + The name of the registered server group + + .PARAMETER Description + The description for the registered server group + + .PARAMETER Group + The SQL Server Central Management Server group. If no groups are specified, the new group will be created at the root. + + .PARAMETER InputObject + Allows results from Get-DbaCmsRegServerGroup to be piped in + + .PARAMETER WhatIf + Shows what would happen if the command were to run. No actions are actually performed. + + .PARAMETER Confirm + Prompts you for confirmation before executing any changing operations within the command. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: RegisteredServer, CMS + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Add-DbaCmsRegServerGroup + + .EXAMPLE + PS C:\> Add-DbaCmsRegServerGroup -SqlInstance sql2012 -Name HR + + Creates a registered server group called HR, in the root of sql2012's CMS + + .EXAMPLE + PS C:\> Add-DbaCmsRegServerGroup -SqlInstance sql2012, sql2014 -Name sub-folder -Group HR + + Creates a registered server group on sql2012 and sql2014 called sub-folder within the HR group + + .EXAMPLE + PS C:\> Get-DbaCmsRegServerGroup -SqlInstance sql2012, sql2014 -Group HR | Add-DbaCmsRegServerGroup -Name sub-folder + + Creates a registered server group on sql2012 and sql2014 called sub-folder within the HR group of each server + + #> + [CmdletBinding(SupportsShouldProcess)] + param ( + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [parameter(Mandatory)] + [string]$Name, + [string]$Description, + [string]$Group, + [parameter(ValueFromPipeline)] + [Microsoft.SqlServer.Management.RegisteredServers.ServerGroup[]]$InputObject, + [switch]$EnableException + ) + process { + if (-not $InputObject -and -not $SqlInstance) { + Stop-Function -Message "You must either pipe in a registered server group or specify a sqlinstance" + return + } + foreach ($instance in $SqlInstance) { + if ((Test-Bound -ParameterName Group)) { + $InputObject += Get-DbaCmsRegServerGroup -SqlInstance $instance -SqlCredential $SqlCredential -Group $Group + } else { + $InputObject += Get-DbaCmsRegServerGroup -SqlInstance $instance -SqlCredential $SqlCredential -Id 1 + } + } + + foreach ($reggroup in $InputObject) { + $parentserver = Get-RegServerParent -InputObject $reggroup + $server = $parentserver.ServerConnection.ServerInstance.SqlConnectionObject + + if ($null -eq $parentserver) { + Stop-Function -Message "Something went wrong and it's hard to explain, sorry. This basically shouldn't happen." -Continue + } + + if ($Pscmdlet.ShouldProcess($parentserver.SqlInstance, "Adding $Name")) { + try { + $newgroup = New-Object Microsoft.SqlServer.Management.RegisteredServers.ServerGroup($reggroup, $Name) + $newgroup.Description = $Description + $newgroup.Create() + + Get-DbaCmsRegServerGroup -SqlInstance $parentserver.ServerConnection.SqlConnectionObject -Group (Get-RegServerGroupReverseParse -object $newgroup) + $parentserver.ServerConnection.Disconnect() + } catch { + Stop-Function -Message "Failed to add $reggroup on $server" -ErrorRecord $_ -Continue + } + } + } + } + end { + Test-DbaDeprecation -DeprecatedOn "1.0.0" -Alias Add-DbaRegisteredServerGroup + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function Add-DbaComputerCertificate { + <# + .SYNOPSIS + Adds a computer certificate - useful for older systems. + + .DESCRIPTION + Adds a computer certificate from a local or remote computer. + + .PARAMETER ComputerName + The target SQL Server instance or instances. Defaults to localhost. + + .PARAMETER Credential + Allows you to login to $ComputerName using alternative credentials. + + .PARAMETER SecurePassword + The password for the certificate, if it is password protected. + + .PARAMETER Certificate + The target certificate object. + + .PARAMETER Path + The local path to the target certificate object. + + .PARAMETER Store + Certificate store. Default is LocalMachine. + + .PARAMETER Folder + Certificate folder. Default is My (Personal). + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .PARAMETER WhatIf + If this switch is enabled, no actions are performed but informational messages will be displayed that explain what would happen if the command were to run. + + .PARAMETER Confirm + If this switch is enabled, you will be prompted for confirmation before executing any operations that change state. + + .NOTES + Tags: Certificate + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .EXAMPLE + PS C:\> Add-DbaComputerCertificate -ComputerName Server1 -Path C:\temp\cert.cer + + Adds the local C:\temp\cert.cer to the remote server Server1 in LocalMachine\My (Personal). + + .EXAMPLE + PS C:\> Add-DbaComputerCertificate -Path C:\temp\cert.cer + + Adds the local C:\temp\cert.cer to the local computer's LocalMachine\My (Personal) certificate store. + + #> + [CmdletBinding(SupportsShouldProcess, ConfirmImpact = "Low")] + param ( + [Alias("ServerInstance", "SqlServer", "SqlInstance")] + [DbaInstance[]]$ComputerName = $env:COMPUTERNAME, + [PSCredential]$Credential, + [Alias("Password")] + [SecureString]$SecurePassword, + [parameter(ValueFromPipeline)] + [System.Security.Cryptography.X509Certificates.X509Certificate2[]]$Certificate, + [string]$Path, + [string]$Store = "LocalMachine", + [string]$Folder = "My", + [Alias('Silent')] + [switch]$EnableException + ) + + begin { + + if ($Path) { + if (!(Test-Path -Path $Path)) { + Stop-Function -Message "Path ($Path) does not exist." -Category InvalidArgument + return + } + + try { + # This may be too much, but oh well + $bytes = [System.IO.File]::ReadAllBytes($Path) + $Certificate = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2 + $Certificate.Import($bytes, $SecurePassword, [System.Security.Cryptography.X509Certificates.X509KeyStorageFlags]::DefaultKeySet) + } catch { + Stop-Function -Message "Can't import certificate." -ErrorRecord $_ + return + } + } + + #region Remoting Script + $scriptBlock = { + + param ( + $CertificateData, + + [SecureString]$SecurePassword, + + $Store, + + $Folder + ) + + $cert = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2 + $cert.Import($CertificateData, $SecurePassword, [System.Security.Cryptography.X509Certificates.X509KeyStorageFlags]::DefaultKeySet) + Write-Message -Level Verbose -Message "Importing cert to $Folder\$Store" + $tempStore = New-Object System.Security.Cryptography.X509Certificates.X509Store($Folder, $Store) + $tempStore.Open('ReadWrite') + $tempStore.Add($cert) + $tempStore.Close() + + Write-Message -Level Verbose -Message "Searching Cert:\$Store\$Folder" + Get-ChildItem "Cert:\$Store\$Folder" -Recurse | Where-Object { $_.Thumbprint -eq $cert.Thumbprint } + } + #endregion Remoting Script + } + process { + if (Test-FunctionInterrupt) { return } + + if (-not $Certificate) { + Stop-Function -Message "You must specify either Certificate or Path" -Category InvalidArgument + return + } + + foreach ($cert in $Certificate) { + + try { + $certData = $cert.Export([System.Security.Cryptography.X509Certificates.X509ContentType]::PFX, $SecurePassword) + } catch { + Stop-Function -Message "Can't export certificate" -ErrorRecord $_ -Continue + } + + foreach ($computer in $ComputerName) { + + if ($PSCmdlet.ShouldProcess("local", "Connecting to $computer to import cert")) { + try { + Invoke-Command2 -ComputerName $computer -Credential $Credential -ArgumentList $certdata, $SecurePassword, $Store, $Folder -ScriptBlock $scriptblock -ErrorAction Stop | + Select-DefaultView -Property FriendlyName, DnsNameList, Thumbprint, NotBefore, NotAfter, Subject, Issuer + } catch { + Stop-Function -Message "Failure" -ErrorRecord $_ -Target $computer -Continue + } + } + } + } + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function Add-DbaDbMirrorMonitor { + <# + .SYNOPSIS + Creates a database mirroring monitor job that periodically updates the mirroring status for every mirrored database on the server instance. + + .DESCRIPTION + Creates a database mirroring monitor job that periodically updates the mirroring status for every mirrored database on the server instance. + + Basically executes sp_dbmmonitoraddmonitoring. + + .PARAMETER SqlInstance + The target SQL Server instance + + .PARAMETER SqlCredential + Login to the target instance using alternate Windows or SQL Login Authentication. Accepts credential objects (Get-Credential). + + .PARAMETER WhatIf + Shows what would happen if the command were to run. No actions are actually performed. + + .PARAMETER Confirm + Prompts you for confirmation before executing any changing operations within the command. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Mirror, HA + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Add-DbaDbMirrorMonitor + + .EXAMPLE + PS C:\> Add-DbaDbMirrorMonitor -SqlInstance sql2008, sql2012 + + Creates a database mirroring monitor job that periodically updates the mirroring status for every mirrored database on sql2008 and sql2012. + + #> + [CmdletBinding(SupportsShouldProcess, ConfirmImpact = 'Low')] + param ( + [parameter(Mandatory, ValueFromPipeline)] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [switch]$EnableException + ) + process { + foreach ($instance in $SqlInstance) { + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential -MinimumVersion 9 + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + if ($Pscmdlet.ShouldProcess($instance, "add mirror monitoring")) { + try { + $server.Query("msdb.dbo.sp_dbmmonitoraddmonitoring") + [pscustomobject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + MonitorStatus = "Added" + } + } catch { + Stop-Function -Message "Failure" -ErrorRecord $_ -Continue + } + } + } + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function Add-DbaPfDataCollectorCounter { + <# + .SYNOPSIS + Adds a Performance Data Collector Counter. + + .DESCRIPTION + Adds a Performance Data Collector Counter. + + .PARAMETER ComputerName + The target computer. Defaults to localhost. + + .PARAMETER Credential + Allows you to login to $ComputerName using alternative credentials. To use: + + $cred = Get-Credential, then pass $cred object to the -Credential parameter. + + .PARAMETER CollectorSet + The Collector Set name. + + .PARAMETER Collector + The Collector name. + + .PARAMETER Counter + The Counter name. This must be in the form of '\Processor(_Total)\% Processor Time'. + + .PARAMETER InputObject + Accepts the object output by Get-DbaPfDataCollector via the pipeline. + + .PARAMETER WhatIf + If this switch is enabled, no actions are performed but informational messages will be displayed that explain what would happen if the command were to run. + + .PARAMETER Confirm + If this switch is enabled, you will be prompted for confirmation before executing any operations that change state. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: PerfMon + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Add-DbaPfDataCollectorCounter + + .EXAMPLE + PS C:\> Add-DbaPfDataCollectorCounter -ComputerName sql2017 -CollectorSet 'System Correlation' -Collector DataCollector01 -Counter '\LogicalDisk(*)\Avg. Disk Queue Length' + + Adds the '\LogicalDisk(*)\Avg. Disk Queue Length' counter within the DataCollector01 collector within the System Correlation collector set on sql2017. + + .EXAMPLE + PS C:\> Get-DbaPfDataCollector | Out-GridView -PassThru | Add-DbaPfDataCollectorCounter -Counter '\LogicalDisk(*)\Avg. Disk Queue Length' -Confirm + + Allows you to select which Data Collector you'd like to add the counter '\LogicalDisk(*)\Avg. Disk Queue Length' on localhost and prompts for confirmation. + + #> + [CmdletBinding(SupportsShouldProcess, ConfirmImpact = "Low")] + param ( + [DbaInstance[]]$ComputerName = $env:COMPUTERNAME, + [PSCredential]$Credential, + [Alias("DataCollectorSet")] + [string[]]$CollectorSet, + [Alias("DataCollector")] + [string[]]$Collector, + [Alias("Name")] + [parameter(Mandatory, ValueFromPipelineByPropertyName)] + [object[]]$Counter, + [parameter(ValueFromPipeline)] + [object[]]$InputObject, + [switch]$EnableException + ) + begin { + $setscript = { + $setname = $args[0]; $Addxml = $args[1] + $set = New-Object -ComObject Pla.DataCollectorSet + $set.SetXml($Addxml) + $set.Commit($setname, $null, 0x0003) #add or modify. + $set.Query($setname, $Null) + } + } + process { + if ($InputObject.Credential -and (Test-Bound -ParameterName Credential -Not)) { + $Credential = $InputObject.Credential + } + + if (($InputObject | Get-Member -MemberType NoteProperty -ErrorAction SilentlyContinue).Count -le 3 -and $InputObject.ComputerName -and $InputObject.Name) { + # it's coming from Get-DbaPfAvailableCounter + $ComputerName = $InputObject.ComputerName + $Counter = $InputObject.Name + $InputObject = $null + } + + if (-not $InputObject -or ($InputObject -and (Test-Bound -ParameterName ComputerName))) { + foreach ($computer in $ComputerName) { + $InputObject += Get-DbaPfDataCollector -ComputerName $computer -Credential $Credential -CollectorSet $CollectorSet -Collector $Collector + } + } + + if ($InputObject) { + if (-not $InputObject.DataCollectorObject) { + Stop-Function -Message "InputObject is not of the right type. Please use Get-DbaPfDataCollector or Get-DbaPfAvailableCounter." + return + } + } + + foreach ($object in $InputObject) { + $computer = $InputObject.ComputerName + $null = Test-ElevationRequirement -ComputerName $computer -Continue + $setname = $InputObject.DataCollectorSet + $collectorname = $InputObject.Name + $xml = [xml]($InputObject.DataCollectorSetXml) + + foreach ($countername in $counter) { + $node = $xml.SelectSingleNode("//Name[.='$collectorname']") + $newitem = $xml.CreateElement('Counter') + $null = $newitem.PsBase.InnerText = $countername + $null = $node.ParentNode.AppendChild($newitem) + $newitem = $xml.CreateElement('CounterDisplayName') + $null = $newitem.PsBase.InnerText = $countername + $null = $node.ParentNode.AppendChild($newitem) + } + $plainxml = $xml.OuterXml + + if ($Pscmdlet.ShouldProcess("$computer", "Adding $counters to $collectorname with the $setname collection set")) { + try { + $results = Invoke-Command2 -ComputerName $computer -Credential $Credential -ScriptBlock $setscript -ArgumentList $setname, $plainxml -ErrorAction Stop + Write-Message -Level Verbose -Message " $results" + Get-DbaPfDataCollectorCounter -ComputerName $computer -Credential $Credential -CollectorSet $setname -Collector $collectorname -Counter $counter + } catch { + Stop-Function -Message "Failure importing $Countername to $computer." -ErrorRecord $_ -Target $computer -Continue + } + } + } + } +} +function Backup-DbaDatabase { + <# + .SYNOPSIS + Backup one or more SQL Sever databases from a single SQL Server SqlInstance. + + .DESCRIPTION + Performs a backup of a specified type of 1 or more databases on a single SQL Server Instance. These backups may be Full, Differential or Transaction log backups. + + .PARAMETER SqlInstance + The SQL Server instance hosting the databases to be backed up. + + .PARAMETER SqlCredential + Credentials to connect to the SQL Server instance if the calling user does not have permission. + + .PARAMETER Database + The database(s) to process. This list is auto-populated from the server. If unspecified, all databases will be processed. + + .PARAMETER ExcludeDatabase + The database(s) to exclude. This list is auto-populated from the server. + + .PARAMETER BackupFileName + The name of the file to backup to. This is only accepted for single database backups. + If no name is specified then the backup files will be named DatabaseName_yyyyMMddHHmm (i.e. "Database1_201714022131") with the appropriate extension. + + If the same name is used repeatedly, SQL Server will add backups to the same file at an incrementing position. + + SQL Server needs permissions to write to the specified location. Path names are based on the SQL Server (C:\ is the C drive on the SQL Server, not the machine running the script). + + Passing in NUL as the BackupFileName will backup to the NUL: device + + .PARAMETER TimeStampFormat + By default the command timestamps backups using the format yyyyMMddHHmm. Using this parameter this can be overridden. The timestamp format should be defined using the Get-Date formats, illegal formats will cause an error to be thrown + + .PARAMETER BackupDirectory + Path in which to place the backup files. If not specified, the backups will be placed in the default backup location for SqlInstance. + If multiple paths are specified, the backups will be striped across these locations. This will overwrite the FileCount option. + + If the path does not exist, Sql Server will attempt to create it. Folders are created by the Sql Instance, and checks will be made for write permissions. + + File Names with be suffixed with x-of-y to enable identifying striped sets, where y is the number of files in the set and x ranges from 1 to y. + + .PARAMETER ReplaceInName + If this switch is set, the following list of strings will be replaced in the BackupFileName and BackupDirectory strings: + instancename - will be replaced with the instance Name + servername - will be replaced with the server name + dbname - will be replaced with the database name + timestamp - will be replaced with the timestamp (either the default, or the format provided) + backuptype - will be replaced with Full, Log or Differential as appropriate + + .PARAMETER CopyOnly + If this switch is enabled, CopyOnly backups will be taken. By default function performs a normal backup, these backups interfere with the restore chain of the database. CopyOnly backups will not interfere with the restore chain of the database. + + For more details please refer to this MSDN article - https://msdn.microsoft.com/en-us/library/ms191495.aspx + + .PARAMETER Type + The type of SQL Server backup to perform. Accepted values are "Full", "Log", "Differential", "Diff", "Database" + + .PARAMETER FileCount + This is the number of striped copies of the backups you wish to create. This value is overwritten if you specify multiple Backup Directories. + + .PARAMETER CreateFolder + If this switch is enabled, each database will be backed up into a separate folder on each of the paths specified by BackupDirectory. + + .PARAMETER CompressBackup + If this switch is enabled, the function will try to perform a compressed backup if supported by the version and edition of SQL Server. Otherwise, this function will use the server(s) default setting for compression. + + .PARAMETER MaxTransferSize + Sets the size of the unit of transfer. Values must be a multiple of 64kb. + + .PARAMETER Blocksize + Specifies the block size to use. Must be one of 0.5KB, 1KB, 2KB, 4KB, 8KB, 16KB, 32KB or 64KB. This can be specified in bytes. + Refer to https://msdn.microsoft.com/en-us/library/ms178615.aspx for more detail + + .PARAMETER BufferCount + Number of I/O buffers to use to perform the operation. + Refer to https://msdn.microsoft.com/en-us/library/ms178615.aspx for more detail + + .PARAMETER Checksum + If this switch is enabled, the backup checksum will be calculated. + + .PARAMETER Verify + If this switch is enabled, the backup will be verified by running a RESTORE VERIFYONLY against the SqlInstance + + .PARAMETER WithFormat + Formats the media as the first step of the backup operation. NOTE: This will set Initialize and SkipTapeHeader to $true. + + .PARAMETER Initialize + Initializes the media as part of the backup operation. + + .PARAMETER SkipTapeHeader + Initializes the media as part of the backup operation. + + .PARAMETER InputObject + Internal parameter + + .PARAMETER AzureBaseUrl + The URL to the base container of an Azure Storage account to write backups to. + + If specified, the only other parameters than can be used are "CopyOnly", "Type", "CompressBackup", "Checksum", "Verify", "AzureCredential", "CreateFolder". + + .PARAMETER AzureCredential + The name of the credential on the SQL instance that can write to the AzureBaseUrl, only needed if using Storage access keys + If using SAS credentials, the command will look for a credential with a name matching the AzureBaseUrl + + .PARAMETER NoRecovery + This is passed in to perform a tail log backup if needed + + .PARAMETER BuildPath + By default this command will not attempt to create missing paths, this switch will change the behaviour so that it will + + .PARAMETER IgnoreFileChecks + This switch stops the function from checking for the validity of paths. This can be useful if SQL Server only has read access to the backup area. + Note, that as we cannot check the path you may well end up with errors. + + .PARAMETER OutputScriptOnly + Switch causes only the T-SQL script for the backup to be generated. Will not create any paths if they do not exist + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .PARAMETER WhatIf + If this switch is enabled, no actions are performed but informational messages will be displayed that explain what would happen if the command were to run. + + .PARAMETER Confirm + If this switch is enabled, you will be prompted for confirmation before executing any operations that change state. + + .NOTES + Tags: DisasterRecovery, Backup, Restore + Author: Stuart Moore (@napalmgram), stuart-moore.com + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .EXAMPLE + PS C:\> Backup-DbaDatabase -SqlInstance Server1 -Database HR, Finance + + This will perform a full database backup on the databases HR and Finance on SQL Server Instance Server1 to Server1 default backup directory. + + .EXAMPLE + PS C:\> Backup-DbaDatabase -SqlInstance sql2016 -BackupDirectory C:\temp -Database AdventureWorks2014 -Type Full + + Backs up AdventureWorks2014 to sql2016 C:\temp folder. + + .EXAMPLE + PS C:\> Backup-DbaDatabase -SqlInstance sql2016 -AzureBaseUrl https://dbatoolsaz.blob.core.windows.net/azbackups/ -AzureCredential dbatoolscred -Type Full -CreateFolder + + Performs a full backup of all databases on the sql2016 instance to their own containers under the https://dbatoolsaz.blob.core.windows.net/azbackups/ container on Azure blog storage using the sql credential "dbatoolscred" registered on the sql2016 instance. + + .EXAMPLE + PS C:\> Backup-DbaDatabase -SqlInstance sql2016 -AzureBaseUrl https://dbatoolsaz.blob.core.windows.net/azbackups/ -Type Full + + Performs a full backup of all databases on the sql2016 instance to the https://dbatoolsaz.blob.core.windows.net/azbackups/ container on Azure blog storage using the Shared Access Signature sql credential "https://dbatoolsaz.blob.core.windows.net/azbackups" registered on the sql2016 instance. + + .EXAMPLE + PS C:\> Backup-Dbadatabase -SqlInstance Server1\Prod -Database db1 -BackupDirectory \\filestore\backups\servername\instancename\dbname\backuptype -Type Full -ReplaceInName + + Performs a full backup of db1 into the folder \\filestore\backups\server1\prod\db1 + + .EXAMPLE + PS C:\> Backup-Dbadatabase -SqlInstance Server1\Prod -BackupDirectory \\filestore\backups\servername\instancename\dbname\backuptype -BackupFileName dbname-backuptype-timestamp.trn -Type Log -ReplaceInName + + Performs a log backup for every database. For the database db1 this would results in backup files in \\filestore\backups\server1\prod\db1\Log\db1-log-31102018.trn + + .EXAMPLE + PS C:\> Backup-DbaDatabase -SqlInstance Sql2017 -Database master -BackupFileName NUL + + Performs a backup of master, but sends the output to the NUL device (ie; throws it away) + #> + [CmdletBinding(DefaultParameterSetName = "Default", SupportsShouldProcess)] + [Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSAvoidUsingPlainTextForPassword", "")] #For AzureCredential + param ( + [parameter(ParameterSetName = "Pipe", Mandatory)] + [DbaInstanceParameter]$SqlInstance, + [PSCredential]$SqlCredential, + [Alias("Databases")] + [object[]]$Database, + [object[]]$ExcludeDatabase, + [string[]]$BackupDirectory, + [string]$BackupFileName, + [switch]$ReplaceInName, + [switch]$CopyOnly, + [ValidateSet('Full', 'Log', 'Differential', 'Diff', 'Database')] + [string]$Type = 'Database', + [parameter(ParameterSetName = "NoPipe", Mandatory, ValueFromPipeline)] + [object[]]$InputObject, + [switch]$CreateFolder, + [int]$FileCount = 0, + [switch]$CompressBackup, + [switch]$Checksum, + [switch]$Verify, + [int]$MaxTransferSize, + [int]$BlockSize, + [int]$BufferCount, + [string]$AzureBaseUrl, + [string]$AzureCredential, + [switch]$NoRecovery, + [switch]$BuildPath, + [switch]$WithFormat, + [switch]$Initialize, + [switch]$SkipTapeHeader, + [string]$TimeStampFormat, + [switch]$IgnoreFileChecks, + [switch]$OutputScriptOnly, + [Alias('Silent')] + [switch]$EnableException + ) + + begin { + if (-not (Test-Bound 'TimeStampFormat')) { + Write-Message -Message 'Setting Default timestampformat' -Level Verbose + $TimeStampFormat = "yyyyMMddHHmm" + } + + if ($SqlInstance) { + try { + $Server = Connect-SqlInstance -SqlInstance $SqlInstance -SqlCredential $SqlCredential -AzureUnsupported + } catch { + Stop-Function -Message "Cannot connect to $SqlInstance" -ErrorRecord $_ + return + } + + $InputObject = $server.Databases | Where-Object Name -ne 'tempdb' + + if ($Database) { + $InputObject = $InputObject | Where-Object Name -in $Database + } + + if ($ExcludeDatabase) { + $InputObject = $InputObject | Where-Object Name -notin $ExcludeDatabase + } + + if ($null -eq $BackupDirectory -and $backupfileName -ne 'NUL') { + Write-Message -Message 'No backupfolder passed in, setting it to instance default' -Level Verbose + $BackupDirectory = (Get-DbaDefaultPath -SqlInstance $server).Backup + } + + if ($BackupDirectory.Count -gt 1) { + Write-Message -Level Verbose -Message "Multiple Backup Directories, striping" + $Filecount = $BackupDirectory.Count + } + + if ($InputObject.Count -gt 1 -and $BackupFileName -ne '' -and $True -ne $ReplaceInFile) { + Stop-Function -Message "1 BackupFile specified, but more than 1 database." + return + } + + if (($MaxTransferSize % 64kb) -ne 0 -or $MaxTransferSize -gt 4mb) { + Stop-Function -Message "MaxTransferSize value must be a multiple of 64kb and no greater than 4MB" + return + } + if ($BlockSize) { + if ($BlockSize -notin (0.5kb, 1kb, 2kb, 4kb, 8kb, 16kb, 32kb, 64kb)) { + Stop-Function -Message "Block size must be one of 0.5kb,1kb,2kb,4kb,8kb,16kb,32kb,64kb" + return + } + } + if ('' -ne $AzureBaseUrl) { + $AzureBaseUrl = $AzureBaseUrl.Trim("/") + if ('' -ne $AzureCredential) { + Write-Message -Message "Azure Credential name passed in, will proceed assuming it's value" -Level Verbose + $FileCount = 1 + } else { + Write-Message -Message "AzureUrl and no credential, testing for SAS credential" + if (Get-DbaCredential -SqlInstance $server -Name $AzureBaseUrl) { + Write-Message -Message "Found a SAS backup credental" -Level Verbose + } else { + Stop-Function -Message "You must provide the credential name for the Azure Storage Account" + return + } + } + $BackupDirectory = $AzureBaseUrl + } + + if ($OutputScriptOnly) { + $IgnoreFileChecks = $true + } + } + } + + process { + if (-not $SqlInstance -and -not $InputObject) { + Stop-Function -Message "You must specify a server and database or pipe some databases" + return + } + + Write-Message -Level Verbose -Message "$($InputObject.Count) database to backup" + + if ($Database) { + $InputObject = $InputObject | Where-Object Name -in $Database + } + + if ($ExcludeDatabase) { + $InputObject = $InputObject | Where-Object Name -notin $ExcludeDatabase + } + + foreach ($db in $InputObject) { + $ProgressId = Get-Random + $failures = @() + $dbname = $db.Name + $server = $db.Parent + + if ($dbname -eq "tempdb") { + Stop-Function -Message "Backing up tempdb not supported" -Continue + } + + if ('Normal' -notin ($db.Status -split ',')) { + Stop-Function -Message "Database status not Normal. $dbname skipped." -Continue + } + + if ($db.DatabaseSnapshotBaseName) { + Stop-Function -Message "Backing up snapshots not supported. $dbname skipped." -Continue + } + + Write-Message -Level Verbose -Message "Backup database $db" + + if ($null -eq $db.RecoveryModel) { + $db.RecoveryModel = $server.Databases[$db.Name].RecoveryModel + Write-Message -Level Verbose -Message "$dbname is in $($db.RecoveryModel) recovery model" + } + + # Fixes one-off cases of StackOverflowException crashes, see issue 1481 + $dbRecovery = $db.RecoveryModel.ToString() + if ($dbRecovery -eq 'Simple' -and $Type -eq 'Log') { + $failreason = "$db is in simple recovery mode, cannot take log backup" + $failures += $failreason + Write-Message -Level Warning -Message "$failreason" + } + + $lastfull = $db.Refresh().LastBackupDate.Year + + if ($Type -notin @("Database", "Full") -and $lastfull -eq 1) { + $failreason = "$db does not have an existing full backup, cannot take log or differentialbackup" + $failures += $failreason + Write-Message -Level Warning -Message "$failreason" + } + + if ($CopyOnly -ne $true) { + $CopyOnly = $false + } + + $server.ConnectionContext.StatementTimeout = 0 + $backup = New-Object Microsoft.SqlServer.Management.Smo.Backup + $backup.Database = $db.Name + $Suffix = "bak" + + if ($CompressBackup) { + if ($db.EncryptionEnabled) { + Write-Message -Level Warning -Message "$dbname is enabled for encryption, will not compress" + $backup.CompressionOption = 2 + } elseif ($server.Edition -like 'Express*' -or ($server.VersionMajor -eq 10 -and $server.VersionMinor -eq 0 -and $server.Edition -notlike '*enterprise*') -or $server.VersionMajor -lt 10) { + Write-Message -Level Warning -Message "Compression is not supported with this version/edition of Sql Server" + } else { + Write-Message -Level Verbose -Message "Compression enabled" + $backup.CompressionOption = 1 + } + } + + if ($Checksum) { + $backup.Checksum = $true + } + + if ($Type -in 'Diff', 'Differential') { + Write-Message -Level VeryVerbose -Message "Creating differential backup" + $SMOBackuptype = "Database" + $backup.Incremental = $true + $outputType = 'Differential' + $gbhSwitch = @{'LastDiff' = $true} + } + $Backup.NoRecovery = $false + if ($Type -eq "Log") { + Write-Message -Level VeryVerbose -Message "Creating log backup" + $Suffix = "trn" + $OutputType = 'Log' + $SMOBackupType = 'Log' + $Backup.NoRecovery = $NoRecovery + $gbhSwitch = @{'LastLog' = $true} + } + + if ($Type -in 'Full', 'Database') { + Write-Message -Level VeryVerbose -Message "Creating full backup" + $SMOBackupType = "Database" + $OutputType = 'Full' + $gbhSwitch = @{'LastFull' = $true} + } + + $backup.CopyOnly = $copyonly + $backup.Action = $SMOBackupType + if ('' -ne $AzureBaseUrl -and $null -ne $AzureCredential) { + $backup.CredentialName = $AzureCredential + } + + Write-Message -Level Verbose -Message "Building file name" + + $BackupFinalName = '' + $FinalBackupPath = @() + $timestamp = Get-Date -Format $TimeStampFormat + if ('NUL' -eq $BackupFileName) { + $FinalBackupPath += 'NUL:' + $IgnoreFileChecks = $true + } elseif ('' -ne $BackupFileName) { + $File = New-Object System.IO.FileInfo($BackupFileName) + $BackupFinalName = $file.Name + $suffix = $file.extension -Replace '^\.', '' + if ( '' -ne (Split-Path $BackupFileName)) { + Write-Message -Level Verbose -Message "Fully qualified path passed in" + $FinalBackupPath += [IO.Path]::GetFullPath($file.DirectoryName) + } + } else { + Write-Message -Level VeryVerbose -Message "Setting filename - $timestamp" + $BackupFinalName = "$($dbname)_$timestamp.$suffix" + } + + Write-Message -Level Verbose -Message "Building backup path" + if ($FinalBackupPath.Count -eq 0) { + $FinalBackupPath += $BackupDirectory + } + + if ($BackupDirectory.Count -eq 1 -and $Filecount -gt 1) { + for ($i = 0; $i -lt ($Filecount - 1); $i++) { + $FinalBackupPath += $FinalBackupPath[0] + } + } + + if ($AzureBaseUrl -or $AzureCredential) { + $slash = "/" + } else { + $slash = "\" + } + if ($FinalBackupPath.Count -gt 1) { + $File = New-Object System.IO.FileInfo($BackupFinalName) + for ($i = 0; $i -lt $FinalBackupPath.Count; $i++) { + $FinalBackupPath[$i] = $FinalBackupPath[$i] + $slash + $($File.BaseName) + "-$($i+1)-of-$FileCount.$suffix" + } + } elseif ($FinalBackupPath[0] -ne 'NUL:') { + $FinalBackupPath[0] = $FinalBackupPath[0] + $slash + $BackupFinalName + } + + if ($CreateFolder -and $FinalBackupPath[0] -ne 'NUL:') { + for ($i = 0; $i -lt $FinalBackupPath.Count; $i++) { + $parent = [IO.Path]::GetDirectoryName($FinalBackupPath[$i]) + $leaf = [IO.Path]::GetFileName($FinalBackupPath[$i]) + $FinalBackupPath[$i] = [IO.Path]::Combine($parent, $dbname, $leaf) + } + } + + if ($True -eq $ReplaceInName) { + for ($i = 0; $i -lt $FinalBackupPath.count; $i++) { + $FinalBackupPath[$i] = $FinalBackupPath[$i] -replace ('dbname', $dbname) + $FinalBackupPath[$i] = $FinalBackupPath[$i] -replace ('instancename', $SqlInstance.InstanceName) + $FinalBackupPath[$i] = $FinalBackupPath[$i] -replace ('servername', $SqlInstance.ComputerName) + $FinalBackupPath[$i] = $FinalBackupPath[$i] -replace ('timestamp', $timestamp) + $FinalBackupPath[$i] = $FinalBackupPath[$i] -replace ('backuptype', $outputType) + } + } + + if (-not $IgnoreFileChecks -and -not $AzureBaseUrl) { + $parentPaths = ($FinalBackupPath | ForEach-Object { Split-Path $_ } | Select-Object -Unique) + foreach ($parentPath in $parentPaths) { + if (-not (Test-DbaPath -SqlInstance $server -Path $parentPath)) { + if (($BuildPath -eq $true) -or ($CreateFolder -eq $True)) { + $null = New-DbaDirectory -SqlInstance $server -Path $parentPath + } else { + $failreason += "SQL Server cannot check if $parentPath exists. You can try disabling this check with -IgnoreFileChecks" + $failures += $failreason + Write-Message -Level Warning -Message "$failreason" + } + } + } + } + + + if ('' -eq $AzureBaseUrl -and $BackupDirectory) { + $FinalBackupPath = $FinalBackupPath | ForEach-Object { [IO.Path]::GetFullPath($_) } + } + + + $script = $null + $backupComplete = $false + + if (!$failures) { + $Filecount = $FinalBackupPath.Count + + foreach ($backupfile in $FinalBackupPath) { + $device = New-Object Microsoft.SqlServer.Management.Smo.BackupDeviceItem + if ('' -ne $AzureBaseUrl) { + $device.DeviceType = "URL" + } else { + $device.DeviceType = "File" + } + + if ($WithFormat) { + Write-Message -Message "WithFormat specified. Ensuring Initialize and SkipTapeHeader are set to true." -Level Verbose + $Initialize = $true + $SkipTapeHeader = $true + } + + $backup.FormatMedia = $WithFormat + $backup.Initialize = $Initialize + $backup.SkipTapeHeader = $SkipTapeHeader + $device.Name = $backupfile + $backup.Devices.Add($device) + } + $humanBackupFile = $FinalBackupPath -Join ',' + Write-Message -Level Verbose -Message "Devices added" + $percent = [Microsoft.SqlServer.Management.Smo.PercentCompleteEventHandler] { + Write-Progress -id $ProgressId -activity "Backing up database $dbname to $humanBackupFile" -percentcomplete $_.Percent -status ([System.String]::Format("Progress: {0} %", $_.Percent)) + } + $backup.add_PercentComplete($percent) + $backup.PercentCompleteNotification = 1 + $backup.add_Complete($complete) + + if ($MaxTransferSize) { + $backup.MaxTransferSize = $MaxTransferSize + } + if ($BufferCount) { + $backup.BufferCount = $BufferCount + } + if ($BlockSize) { + $backup.Blocksize = $BlockSize + } + + Write-Progress -id $ProgressId -activity "Backing up database $dbname to $humanBackupFile" -percentcomplete 0 -status ([System.String]::Format("Progress: {0} %", 0)) + + try { + if ($Pscmdlet.ShouldProcess($server.Name, "Backing up $dbname to $humanBackupFile")) { + if ($OutputScriptOnly -ne $True) { + $Filelist = @() + $FileList += $server.Databases[$dbname].FileGroups.Files | Select-Object @{ Name = "FileType"; Expression = { "D" } }, @{ Name = "Type"; Expression = { "D" } }, @{ Name = "LogicalName"; Expression = { $_.Name } }, @{ Name = "PhysicalName"; Expression = { $_.FileName } } + $FileList += $server.Databases[$dbname].LogFiles | Select-Object @{ Name = "FileType"; Expression = { "L" } }, @{ Name = "Type"; Expression = { "L" } }, @{ Name = "LogicalName"; Expression = { $_.Name } }, @{ Name = "PhysicalName"; Expression = { $_.FileName } } + + $backup.SqlBackup($server) + $script = $backup.Script($server) + Write-Progress -id $ProgressId -activity "Backing up database $dbname to $backupfile" -status "Complete" -Completed + $BackupComplete = $true + if ($server.VersionMajor -eq '8') { + $HeaderInfo = Get-BackupAncientHistory -SqlInstance $server -Database $dbname + } else { + $HeaderInfo = Get-DbaBackupHistory -SqlInstance $server -Database $dbname @gbhSwitch -IncludeCopyOnly -RecoveryFork $db.RecoveryForkGuid | Sort-Object -Property End -Descending | Select-Object -First 1 + } + $Verified = $false + if ($Verify) { + $verifiedresult = [PSCustomObject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + DatabaseName = $dbname + BackupComplete = $BackupComplete + BackupFilesCount = $FinalBackupPath.Count + BackupFile = (Split-Path $FinalBackupPath -Leaf) + BackupFolder = (Split-Path $FinalBackupPath | Sort-Object -Unique) + BackupPath = ($FinalBackupPath | Sort-Object -Unique) + Script = $script + Notes = $failures -join (',') + FullName = ($FinalBackupPath | Sort-Object -Unique) + FileList = $FileList + SoftwareVersionMajor = $server.VersionMajor + Type = $outputType + FirstLsn = $HeaderInfo.FirstLsn + DatabaseBackupLsn = $HeaderInfo.DatabaseBackupLsn + CheckPointLsn = $HeaderInfo.CheckPointLsn + LastLsn = $HeaderInfo.LastLsn + BackupSetId = $HeaderInfo.BackupSetId + LastRecoveryForkGUID = $HeaderInfo.LastRecoveryForkGUID + } | Restore-DbaDatabase -SqlInstance $server -DatabaseName DbaVerifyOnly -VerifyOnly -TrustDbBackupHistory -DestinationFilePrefix DbaVerifyOnly + if ($verifiedResult[0] -eq "Verify successful") { + $failures += $verifiedResult[0] + $Verified = $true + } else { + $failures += $verifiedResult[0] + $Verified = $false + } + } + $HeaderInfo | Add-Member -Type NoteProperty -Name BackupComplete -Value $BackupComplete + $HeaderInfo | Add-Member -Type NoteProperty -Name BackupFile -Value (Split-Path $FinalBackupPath -Leaf) + $HeaderInfo | Add-Member -Type NoteProperty -Name BackupFilesCount -Value $FinalBackupPath.Count + if ($FinalBackupPath[0] -eq 'NUL:') { + $pathresult = "NUL:" + } else { + $pathresult = (Split-Path $FinalBackupPath | Sort-Object -Unique) + } + $HeaderInfo | Add-Member -Type NoteProperty -Name BackupFolder -Value $pathresult + $HeaderInfo | Add-Member -Type NoteProperty -Name BackupPath -Value ($FinalBackupPath | Sort-Object -Unique) + $HeaderInfo | Add-Member -Type NoteProperty -Name DatabaseName -Value $dbname + $HeaderInfo | Add-Member -Type NoteProperty -Name Notes -Value ($failures -join (',')) + $HeaderInfo | Add-Member -Type NoteProperty -Name Script -Value $script + $HeaderInfo | Add-Member -Type NoteProperty -Name Verified -Value $Verified + } else { + $backup.Script($server) + } + } + } catch { + if ($NoRecovery -and ($_.Exception.InnerException.InnerException.InnerException -like '*cannot be opened. It is in the middle of a restore.')) { + Write-Message -Message "Exception thrown by db going into restoring mode due to recovery" -Leve Verbose + } else { + Write-Progress -id $ProgressId -activity "Backup" -status "Failed" -completed + Stop-Function -message "Backup Failed" -ErrorRecord $_ -Continue + $BackupComplete = $false + } + } + } + $OutputExclude = 'FullName', 'FileList', 'SoftwareVersionMajor' + if ($failures.Count -eq 0) { + $OutputExclude += ('Notes', 'FirstLsn', 'DatabaseBackupLsn', 'CheckpointLsn', 'LastLsn', 'BackupSetId', 'LastRecoveryForkGuid') + } + $headerinfo | Select-DefaultView -ExcludeProperty $OutputExclude + $BackupFileName = $null + } + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function Backup-DbaDbCertificate { + <# + .SYNOPSIS + Exports database certificates from SQL Server using SMO. + + .DESCRIPTION + Exports database certificates from SQL Server using SMO and outputs the .cer and .pvk files. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. This can be a collection and receive pipeline input to allow the function to be executed against multiple SQL Server instances. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Certificate + Exports certificate that matches the name(s). + + .PARAMETER Database + Exports the encryptor for specific database(s). + + .PARAMETER ExcludeDatabase + Database(s) to skip when exporting encryptors. + + .PARAMETER EncryptionPassword + A string value that specifies the system path to encrypt the private key. + + .PARAMETER DecryptionPassword + A string value that specifies the system path to decrypt the private key. + + .PARAMETER Path + The path to output the files to. The path is relative to the SQL Server itself. If no path is specified, the default data directory will be used. + + .PARAMETER Suffix + The suffix of the filename of the exported certificate. + + .PARAMETER InputObject + Enables piping from Get-DbaDbCertificate + + .PARAMETER Confirm + If this switch is enabled, you will be prompted for confirmation before executing any operations that change state. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .PARAMETER WhatIf + If this switch is enabled, no actions are performed but informational messages will be displayed that explain what would happen if the command were to run. + + .NOTES + Tags: Migration, Certificate + Author: Jess Pomfret (@jpomfret) + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .EXAMPLE + PS C:\> Backup-DbaDbCertificate -SqlInstance Server1 + + Exports all the certificates on the specified SQL Server to the default data path for the instance. + + .EXAMPLE + PS C:\> $cred = Get-Credential sqladmin + PS C:\> Backup-DbaDbCertificate -SqlInstance Server1 -SqlCredential $cred + + Connects using sqladmin credential and exports all the certificates on the specified SQL Server to the default data path for the instance. + + .EXAMPLE + PS C:\> Backup-DbaDbCertificate -SqlInstance Server1 -Certificate Certificate1 + + Exports only the certificate named Certificate1 on the specified SQL Server to the default data path for the instance. + + .EXAMPLE + PS C:\> Backup-DbaDbCertificate -SqlInstance Server1 -Database AdventureWorks + + Exports only the certificates for AdventureWorks on the specified SQL Server to the default data path for the instance. + + .EXAMPLE + PS C:\> Backup-DbaDbCertificate -SqlInstance Server1 -ExcludeDatabase AdventureWorks + + Exports all certificates except those for AdventureWorks on the specified SQL Server to the default data path for the instance. + + .EXAMPLE + PS C:\> Backup-DbaDbCertificate -SqlInstance Server1 -Path \\Server1\Certificates -EncryptionPassword (ConvertTo-SecureString -force -AsPlainText GoodPass1234!!) + + Exports all the certificates and private keys on the specified SQL Server. + + .EXAMPLE + PS C:\> $EncryptionPassword = ConvertTo-SecureString -AsPlainText "GoodPass1234!!" -force + PS C:\> $DecryptionPassword = ConvertTo-SecureString -AsPlainText "Password4567!!" -force + PS C:\> Backup-DbaDbCertificate -SqlInstance Server1 -EncryptionPassword $EncryptionPassword -DecryptionPassword $DecryptionPassword + + Exports all the certificates on the specified SQL Server using the supplied DecryptionPassword, since an EncryptionPassword is specified private keys are also exported. + + .EXAMPLE + PS C:\> Backup-DbaDbCertificate -SqlInstance Server1 -Path \\Server1\Certificates + + Exports all certificates on the specified SQL Server to the specified path. + + .EXAMPLE + PS C:\> Backup-DbaDbCertificate -SqlInstance Server1 -Suffix DbaTools + + Exports all certificates on the specified SQL Server to the specified path, appends DbaTools to the end of the filenames. + + .EXAMPLE + PS C:\> Get-DbaDbCertificate -SqlInstance sql2016 | Backup-DbaDbCertificate + + Exports all certificates found on sql2016 to the default data directory. + + #> + [CmdletBinding(DefaultParameterSetName = "Default", SupportsShouldProcess, ConfirmImpact = 'Low')] + param ( + [parameter(Mandatory, ParameterSetName = "instance")] + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [parameter(ParameterSetName = "instance")] + [object[]]$Certificate, + [parameter(ParameterSetName = "instance")] + [object[]]$Database, + [parameter(ParameterSetName = "instance")] + [object[]]$ExcludeDatabase, + [Security.SecureString]$EncryptionPassword, + [Security.SecureString]$DecryptionPassword, + [System.IO.FileInfo]$Path, + [string]$Suffix = "$(Get-Date -format 'yyyyMMddHHmmssms')", + [parameter(ValueFromPipeline, ParameterSetName = "collection")] + [Microsoft.SqlServer.Management.Smo.Certificate[]]$InputObject, + [Alias('Silent')] + [switch]$EnableException + ) + + begin { + if (-not $EncryptionPassword -and $DecryptionPassword) { + Stop-Function -Message "If you specify a decryption password, you must also specify an encryption password" -Target $DecryptionPassword + } + + Test-DbaDeprecation -DeprecatedOn "1.0.0" -Alias Backup-DbaDatabaseCertificate + + function export-cert ($cert) { + $certName = $cert.Name + $db = $cert.Parent + $server = $db.Parent + $instance = $server.Name + $actualPath = $Path + + if ($null -eq $actualPath) { + $actualPath = Get-SqlDefaultPaths -SqlInstance $server -filetype Data + } + + $actualPath = "$actualPath".TrimEnd('\') + $fullCertName = "$actualPath\$certName$Suffix" + $exportPathKey = "$fullCertName.pvk" + + if (!(Test-DbaPath -SqlInstance $server -Path $actualPath)) { + Stop-Function -Message "$SqlInstance cannot access $actualPath" -Target $actualPath + } + + if ($Pscmdlet.ShouldProcess($instance, "Exporting certificate $certName from $db on $instance to $actualPath")) { + Write-Message -Level Verbose -Message "Exporting Certificate: $certName to $fullCertName" + try { + + $exportPathCert = "$fullCertName.cer" + + # because the password shouldn't go to memory... + if ($EncryptionPassword.Length -gt 0 -and $DecryptionPassword.Length -gt 0) { + + Write-Message -Level Verbose -Message "Both passwords passed in. Will export both cer and pvk." + + $cert.export( + $exportPathCert, + $exportPathKey, + [System.Runtime.InteropServices.marshal]::PtrToStringAuto([System.Runtime.InteropServices.marshal]::SecureStringToBSTR($EncryptionPassword)), + [System.Runtime.InteropServices.marshal]::PtrToStringAuto([System.Runtime.InteropServices.marshal]::SecureStringToBSTR($DecryptionPassword)) + ) + } elseif ($EncryptionPassword.Length -gt 0 -and $DecryptionPassword.Length -eq 0) { + Write-Message -Level Verbose -Message "Only encryption password passed in. Will export both cer and pvk." + + $cert.export( + $exportPathCert, + $exportPathKey, + [System.Runtime.InteropServices.marshal]::PtrToStringAuto([System.Runtime.InteropServices.marshal]::SecureStringToBSTR($EncryptionPassword)) + ) + } else { + Write-Message -Level Verbose -Message "No passwords passed in. Will export just cer." + $exportPathKey = "Password required to export key" + $cert.export($exportPathCert) + } + + [pscustomobject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + Database = $db.Name + Certificate = $certName + Path = $exportPathCert + Key = $exportPathKey + ExportPath = $exportPathCert + ExportKey = $exportPathKey + exportPathCert = $exportPathCert + exportPathKey = $exportPathKey + Status = "Success" + } | Select-DefaultView -ExcludeProperty exportPathCert, exportPathKey, ExportPath, ExportKey + } catch { + + if ($_.Exception.InnerException) { + $exception = $_.Exception.InnerException.ToString() -Split "System.Data.SqlClient.SqlException: " + $exception = ($exception[1] -Split "at Microsoft.SqlServer.Management.Common.ConnectionManager")[0] + } else { + $exception = $_.Exception + } + [pscustomobject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + Database = $db.Name + Certificate = $certName + Path = $exportPathCert + Key = $exportPathKey + ExportPath = $exportPathCert + ExportKey = $exportPathKey + exportPathCert = $exportPathCert + exportPathKey = $exportPathKey + Status = "Failure: $exception" + } | Select-DefaultView -ExcludeProperty exportPathCert, exportPathKey, ExportPath, ExportKey + Stop-Function -Message "$certName from $db on $instance cannot be exported." -Continue -Target $cert -ErrorRecord $_ + } + } + } + } + + process { + if (Test-FunctionInterrupt) { return } + + if ($SqlInstance) { + $InputObject += Get-DbaDbCertificate -SqlInstance $SqlInstance -SqlCredential $SqlCredential -Database $Database -ExcludeDatabase $ExcludeDatabase -Certificate $Certificate + } + + foreach ($cert in $InputObject) { + if ($cert.Name.StartsWith("##")) { + Write-Message -Level Output -Message "Skipping system cert $cert" + } else { + export-cert $cert + } + } + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function Backup-DbaDbMasterKey { + <# + .SYNOPSIS + Backs up specified database master key. + + .DESCRIPTION + Backs up specified database master key. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. + + .PARAMETER SqlCredential + Allows you to login to SQL Server using alternative credentials. + + .PARAMETER Database + Backup master key from specific database(s). + + .PARAMETER ExcludeDatabase + The database(s) to exclude - this list is auto-populated from the server. + + .PARAMETER Path + The directory to export the key. If no path is specified, the default backup directory for the instance will be used. + + .PARAMETER Credential + Pass a credential object for the password + + .PARAMETER SecurePassword + The password to encrypt the exported key. This must be a SecureString. + + .PARAMETER InputObject + Database object piped in from Get-DbaDatabase + + .PARAMETER WhatIf + Shows what would happen if the command were to run. No actions are actually performed. + + .PARAMETER Confirm + Prompts you for confirmation before executing any changing operations within the command. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Certificate, Database + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .EXAMPLE + PS C:\> Backup-DbaDbMasterKey -SqlInstance server1\sql2016 + ``` + ComputerName : SERVER1 + InstanceName : SQL2016 + SqlInstance : SERVER1\SQL2016 + Database : master + Filename : E:\MSSQL13.SQL2016\MSSQL\Backup\server1$sql2016-master-20170614162311.key + Status : Success + ``` + + Prompts for export password, then logs into server1\sql2016 with Windows credentials then backs up all database keys to the default backup directory. + + .EXAMPLE + PS C:\> Backup-DbaDbMasterKey -SqlInstance Server1 -Database db1 -Path \\nas\sqlbackups\keys + + Logs into sql2016 with Windows credentials then backs up db1's keys to the \\nas\sqlbackups\keys directory. + + #> + [CmdletBinding(SupportsShouldProcess, ConfirmImpact = 'Low')] + param ( + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [PSCredential]$Credential, + [string[]]$Database, + [string[]]$ExcludeDatabase, + [Alias("Password")] + [Security.SecureString]$SecurePassword, + [string]$Path, + [parameter(ValueFromPipeline)] + [Microsoft.SqlServer.Management.Smo.Database[]]$InputObject, + [switch]$EnableException + ) + begin { + if ($Credential) { + $SecurePassword = $Credential.Password + } + } + process { + foreach ($instance in $SqlInstance) { + $InputObject += Get-DbaDatabase -SqlInstance $SqlInstance -SqlCredential $SqlCredential -Database $Database -ExcludeDatabase $ExcludeDatabase + } + + foreach ($db in $InputObject) { + $server = $db.Parent + + if (Test-Bound -ParameterName Path -Not) { + $Path = $server.BackupDirectory + } + + if (-not $Path) { + Stop-Function -Message "Path discovery failed. Please explicitly specify -Path" -Target $server -Continue + } + + if (!(Test-DbaPath -SqlInstance $server -Path $Path)) { + Stop-Function -Message "$instance cannot access $Path" -Target $server -ErrorRecord $_ -Continue + } + + if (!$db.IsAccessible) { + Write-Message -Level Warning -Message "Database $db is not accessible. Skipping." + continue + } + + $masterkey = $db.MasterKey + + if (!$masterkey) { + Write-Message -Message "No master key exists in the $db database on $instance" -Target $db -Level Verbose + continue + } + + # If you pass a password param, then you will not be prompted for each database, but it wouldn't be a good idea to build in insecurity + if (-not $SecurePassword -and -not $Credential) { + $SecurePassword = Read-Host -AsSecureString -Prompt "You must enter Service Key password for $instance" + $SecurePassword2 = Read-Host -AsSecureString -Prompt "Type the password again" + + if (([System.Runtime.InteropServices.marshal]::PtrToStringAuto([System.Runtime.InteropServices.marshal]::SecureStringToBSTR($SecurePassword))) -ne ([System.Runtime.InteropServices.marshal]::PtrToStringAuto([System.Runtime.InteropServices.marshal]::SecureStringToBSTR($SecurePassword2)))) { + Stop-Function -Message "Passwords do not match" -Continue + } + } + + $time = (Get-Date -Format yyyMMddHHmmss) + $dbname = $db.name + $Path = $Path.TrimEnd("\") + $fileinstance = $instance.ToString().Replace('\', '$') + $filename = "$Path\$fileinstance-$dbname-$time.key" + + if ($Pscmdlet.ShouldProcess($instance, "Backing up master key to $filename")) { + try { + $masterkey.Export($filename, [System.Runtime.InteropServices.marshal]::PtrToStringAuto([System.Runtime.InteropServices.marshal]::SecureStringToBSTR($SecurePassword))) + $status = "Success" + } catch { + $status = "Failure" + Write-Message -Level Warning -Message "Backup failure: $($_.Exception.InnerException)" + } + + Add-Member -Force -InputObject $masterkey -MemberType NoteProperty -Name ComputerName -value $server.ComputerName + Add-Member -Force -InputObject $masterkey -MemberType NoteProperty -Name InstanceName -value $server.ServiceName + Add-Member -Force -InputObject $masterkey -MemberType NoteProperty -Name SqlInstance -value $server.DomainInstanceName + Add-Member -Force -InputObject $masterkey -MemberType NoteProperty -Name Database -value $dbname + Add-Member -Force -InputObject $masterkey -MemberType NoteProperty -Name Filename -value $filename + Add-Member -Force -InputObject $masterkey -MemberType NoteProperty -Name Status -value $status + + Select-DefaultView -InputObject $masterkey -Property ComputerName, InstanceName, SqlInstance, Database, 'Filename as Path', Status + } + } + } + end { + Test-DbaDeprecation -DeprecatedOn "1.0.0" -EnableException:$false -Alias Backup-DbaDatabaseMasterKey + } +} +function Clear-DbaConnectionPool { + <# + .SYNOPSIS + Resets (or empties) the connection pool. + + .DESCRIPTION + This command resets (or empties) the connection pool. + + If there are connections in use at the time of the call, they are marked appropriately and will be discarded (instead of being returned to the pool) when Close() is called on them. + + Ref: https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.clearallpools(v=vs.110).aspx + + .PARAMETER ComputerName + Target computer(s). If no computer name is specified, the local computer is targeted. + + .PARAMETER Credential + Alternate credential object to use for accessing the target computer(s). + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Connection + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Clear-DbaConnectionPool + + .EXAMPLE + PS C:\> Clear-DbaConnectionPool + + Clears all local connection pools. + + .EXAMPLE + PS C:\> Clear-DbaConnectionPool -ComputerName workstation27 + + Clears all connection pools on workstation27. + + #> + [CmdletBinding()] + param ( + [Parameter(ValueFromPipeline)] + [Alias("cn", "host", "Server")] + [DbaInstanceParameter[]]$ComputerName = $env:COMPUTERNAME, + [PSCredential]$Credential, + [switch][Alias('Silent')] + $EnableException + ) + + process { + # TODO: https://jamessdixon.wordpress.com/2013/01/22/ado-net-and-connection-pooling + + foreach ($computer in $ComputerName) { + try { + if (-not $computer.IsLocalhost) { + Write-Message -Level Verbose -Message "Clearing all pools on remote computer $computer" + if (Test-Bound 'Credential') { + Invoke-Command2 -ComputerName $computer -Credential $Credential -ScriptBlock { [System.Data.SqlClient.SqlConnection]::ClearAllPools() } + } else { + Invoke-Command2 -ComputerName $computer -ScriptBlock { [System.Data.SqlClient.SqlConnection]::ClearAllPools() } + } + } else { + Write-Message -Level Verbose -Message "Clearing all local pools" + if (Test-Bound 'Credential') { + Invoke-Command2 -Credential $Credential -ScriptBlock { [System.Data.SqlClient.SqlConnection]::ClearAllPools() } + } else { + Invoke-Command2 -ScriptBlock { [System.Data.SqlClient.SqlConnection]::ClearAllPools() } + } + } + } catch { + Stop-Function -Message "Failure" -ErrorRecord $_ -Target $computer -Continue + } + } + } + end { + Test-DbaDeprecation -DeprecatedOn "1.0.0" -EnableException:$false -Alias Clear-DbaSqlConnectionPool + } +} +function Clear-DbaLatchStatistics { + <# + .SYNOPSIS + Clears Latch Statistics + + .DESCRIPTION + Reset the aggregated statistics - basically just executes DBCC SQLPERF (N'sys.dm_os_latch_stats', CLEAR) + + .PARAMETER SqlInstance + Allows you to specify a comma separated list of servers to query. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER WhatIf + If this switch is enabled, no actions are performed but informational messages will be displayed that explain what would happen if the command were to run. + + .PARAMETER Confirm + If this switch is enabled, you will be prompted for confirmation before executing any operations that change state. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: LatchStatistic, Waits + Author: Patrick Flynn (@sqllensman) + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Clear-DbaLatchStatistics + + .EXAMPLE + PS C:\> Clear-DbaLatchStatistics -SqlInstance sql2008, sqlserver2012 + + After confirmation, clears latch statistics on servers sql2008 and sqlserver2012 + + .EXAMPLE + PS C:\> Clear-DbaLatchStatistics -SqlInstance sql2008, sqlserver2012 -Confirm:$false + + Clears latch statistics on servers sql2008 and sqlserver2012, without prompting + + .EXAMPLE + PS C:\> 'sql2008','sqlserver2012' | Clear-DbaLatchStatistics + + After confirmation, clears latch statistics on servers sql2008 and sqlserver2012 + + .EXAMPLE + PS C:\> $cred = Get-Credential sqladmin + PS C:\> Clear-DbaLatchStatistics -SqlInstance sql2008 -SqlCredential $cred + + Connects using sqladmin credential and clears latch statistics on servers sql2008 and sqlserver2012 + #> + [CmdletBinding(ConfirmImpact = 'High', SupportsShouldProcess)] + [Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSUseSingularNouns", "", Justification = "Singular Noun doesn't make sense")] + param ( + [parameter(Mandatory, ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer", "SqlServers")] + [DbaInstance[]]$SqlInstance, + [PSCredential]$SqlCredential, + [Alias('Silent')] + [switch]$EnableException + ) + process { + foreach ($instance in $SqlInstance) { + Write-Message -Level Verbose -Message "Attempting to connect to $instance" + + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential -MinimumVersion 9 + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + if ($Pscmdlet.ShouldProcess($instance, "Performing CLEAR of sys.dm_os_latch_stats")) { + try { + $server.Query("DBCC SQLPERF (N'sys.dm_os_latch_stats' , CLEAR);") + $status = "Success" + } catch { + $status = $_.Exception + } + + [PSCustomObject]@{ + ComputerName = $server.NetName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + Status = $status + } + } + } + } +} +function Clear-DbaPlanCache { + <# + .SYNOPSIS + Removes ad-hoc and prepared plan caches is single use plans are over defined threshold. + + .DESCRIPTION + Checks ad-hoc and prepared plan cache for each database, if over 100 MBs removes from the cache. + + This command automates that process. + + References: https://www.sqlskills.com/blogs/kimberly/plan-cache-adhoc-workloads-and-clearing-the-single-use-plan-cache-bloat/ + + .PARAMETER SqlInstance + The target SQL Server instance or instances. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Threshold + Memory used threshold. + + .PARAMETER InputObject + Enables results to be piped in from Get-DbaPlanCache. + + .PARAMETER WhatIf + If this switch is enabled, no actions are performed but informational messages will be displayed that explain what would happen if the command were to run. + + .PARAMETER Confirm + If this switch is enabled, you will be prompted for confirmation before executing any operations that change state. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Memory + Author: Tracy Boggiano, databasesuperhero.com + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Clear-DbaPlanCache + + .EXAMPLE + PS C:\> Clear-DbaPlanCache -SqlInstance sql2017 -Threshold 200 + + Logs into the SQL Server instance "sql2017" and removes plan caches if over 200 MB. + + .EXAMPLE + PS C:\> Clear-DbaPlanCache -SqlInstance sql2017 -SqlCredential sqladmin + + Logs into the SQL instance using the SQL Login 'sqladmin' and then Windows instance as 'ad\sqldba' + and removes if Threshold over 100 MB. + + .EXAMPLE + PS C:\> Find-DbaInstance -ComputerName localhost | Get-DbaPlanCache | Clear-DbaPlanCache -Threshold 200 + + Scans localhost for instances using the browser service, traverses all instances and gets the plan cache for each, clears them out if they are above 200 MB. + #> + [CmdletBinding(SupportsShouldProcess)] + param ( + [Alias("ServerInstance", "SqlServer", "SqlServers")] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [int]$Threshold = 100, + [parameter(ValueFromPipeline)] + [object[]]$InputObject, + [switch]$EnableException + ) + process { + foreach ($instance in $SqlInstance) { + $InputObject += Get-DbaPlanCache -SqlInstance $instance -SqlCredential $SqlCredential + } + + foreach ($result in $InputObject) { + if ($result.MB -ge $Threshold) { + if ($Pscmdlet.ShouldProcess($($result.SqlInstance), "Cleared SQL Plans plan cache")) { + try { + $server = Connect-SqlInstance -SqlInstance $result.SqlInstance -SqlCredential $SqlCredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + $server.Query("DBCC FREESYSTEMCACHE('SQL Plans')") + [PSCustomObject]@{ + ComputerName = $result.ComputerName + InstanceName = $result.InstanceName + SqlInstance = $result.SqlInstance + Size = $result.Size + Status = "Plan cache cleared" + } + } + } else { + if ($Pscmdlet.ShouldProcess($($result.SqlInstance), "Results $($result.Size) below threshold")) { + [PSCustomObject]@{ + ComputerName = $result.ComputerName + InstanceName = $result.InstanceName + SqlInstance = $result.SqlInstance + Size = $result.Size + Status = "Plan cache size below threshold ($Threshold) " + } + Write-Message -Level Verbose -Message "Plan cache size below threshold ($Threshold) " + } + } + } + } +} +function Clear-DbaWaitStatistics { + <# + .SYNOPSIS + Clears wait statistics + + .DESCRIPTION + Reset the aggregated statistics - basically just executes DBCC SQLPERF (N'sys.dm_os_wait_stats', CLEAR) + + .PARAMETER SqlInstance + The target SQL Server instance or instances. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER WhatIf + If this switch is enabled, no actions are performed but informational messages will be displayed that explain what would happen if the command were to run. + + .PARAMETER Confirm + If this switch is enabled, you will be prompted for confirmation before executing any operations that change state. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: WaitStatistic, Waits + Author: Chrissy LeMaire (@cl) + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Clear-DbaWaitStatistics + + .EXAMPLE + PS C:\> Clear-DbaWaitStatistics -SqlInstance sql2008, sqlserver2012 + + After confirmation, clears wait stats on servers sql2008 and sqlserver2012 + + .EXAMPLE + PS C:\> Clear-DbaWaitStatistics -SqlInstance sql2008, sqlserver2012 -Confirm:$false + + Clears wait stats on servers sql2008 and sqlserver2012, without prompting + + #> + [CmdletBinding(ConfirmImpact = 'High', SupportsShouldProcess)] + [Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSUseSingularNouns", "", Justification = "Singular Noun doesn't make sense")] + param ( + [parameter(Mandatory, ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer", "SqlServers")] + [DbaInstance[]]$SqlInstance, + [PSCredential]$SqlCredential, + [Alias('Silent')] + [switch]$EnableException + ) + process { + foreach ($instance in $SqlInstance) { + + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential -MinimumVersion 9 + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + if ($Pscmdlet.ShouldProcess($instance, "Performing CLEAR of sys.dm_os_wait_stats")) { + try { + $server.Query("DBCC SQLPERF (N'sys.dm_os_wait_stats', CLEAR);") + $status = "Success" + } catch { + $status = $_.Exception + } + + [PSCustomObject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + Status = $status + } + } + } + } +} +function Connect-DbaInstance { + <# + .SYNOPSIS + Creates a robust SMO SQL Server object. + + .DESCRIPTION + This command is robust because it initializes properties that do not cause enumeration by default. It also supports both Windows and SQL Server authentication methods, and detects which to use based upon the provided credentials. + + By default, this command also sets the connection's ApplicationName property to "dbatools PowerShell module - dbatools.io - custom connection". If you're doing anything that requires profiling, you can look for this client name. + + Alternatively, you can pass in whichever client name you'd like using the -ClientName parameter. There are a ton of other parameters for you to explore as well. + + See https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.connectionstring.aspx + and https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnectionstringbuilder.aspx, + and https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.aspx + + To execute SQL commands, you can use $server.ConnectionContext.ExecuteReader($sql) or $server.Databases['master'].ExecuteNonQuery($sql) + + .PARAMETER SqlInstance + The target SQL Server instance or instances. This can be a collection and receive pipeline input to allow the function to be executed against multiple SQL Server instances. + + .PARAMETER SqlCredential + Credential object used to connect to the SQL Server Instance as a different user. This can be a Windows or SQL Server account. Windows users are determined by the existence of a backslash, so if you are intending to use an alternative Windows connection instead of a SQL login, ensure it contains a backslash. + + .PARAMETER Database + The database(s) to process. This list is auto-populated from the server. + + .PARAMETER AccessToken + Gets or sets the access token for the connection. + + .PARAMETER AppendConnectionString + Appends to the current connection string. Note that you cannot pass authentication information using this method. Use -SqlInstance and optionally -SqlCredential to set authentication information. + + .PARAMETER ApplicationIntent + Declares the application workload type when connecting to a server. + + Valid values are "ReadOnly" and "ReadWrite". + + .PARAMETER BatchSeparator + A string to separate groups of SQL statements being executed. By default, this is "GO". + + .PARAMETER ClientName + By default, this command sets the client's ApplicationName property to "dbatools PowerShell module - dbatools.io - custom connection" if you're doing anything that requires profiling, you can look for this client name. Using -ClientName allows you to set your own custom client application name. + + .PARAMETER ConnectTimeout + The length of time (in seconds) to wait for a connection to the server before terminating the attempt and generating an error. + + Valid values are integers between 0 and 2147483647. + + When opening a connection to a Azure SQL Database, set the connection timeout to 30 seconds. + + .PARAMETER EncryptConnection + If this switch is enabled, SQL Server uses SSL encryption for all data sent between the client and server if the server has a certificate installed. + + For more information, see Connection String Syntax. https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/connection-string-syntax + + Beginning in .NET Framework 4.5, when TrustServerCertificate is false and Encrypt is true, the server name (or IP address) in a SQL Server SSL certificate must exactly match the server name (or IP address) specified in the connection string. Otherwise, the connection attempt will fail. For information about support for certificates whose subject starts with a wildcard character (*), see Accepted wildcards used by server certificates for server authentication. https://support.microsoft.com/en-us/help/258858/accepted-wildcards-used-by-server-certificates-for-server-authenticati + + .PARAMETER FailoverPartner + The name of the failover partner server where database mirroring is configured. + + If the value of this key is "" (an empty string), then Initial Catalog must be present in the connection string, and its value must not be "". + + The server name can be 128 characters or less. + + If you specify a failover partner but the failover partner server is not configured for database mirroring and the primary server (specified with the Server keyword) is not available, then the connection will fail. + + If you specify a failover partner and the primary server is not configured for database mirroring, the connection to the primary server (specified with the Server keyword) will succeed if the primary server is available. + + .PARAMETER LockTimeout + Sets the time in seconds required for the connection to time out when the current transaction is locked. + + .PARAMETER MaxPoolSize + Sets the maximum number of connections allowed in the connection pool for this specific connection string. + + .PARAMETER MinPoolSize + Sets the minimum number of connections allowed in the connection pool for this specific connection string. + + .PARAMETER MultipleActiveResultSets + If this switch is enabled, an application can maintain multiple active result sets (MARS). + + If this switch is not enabled, an application must process or cancel all result sets from one batch before it can execute any other batch on that connection. + + .PARAMETER MultiSubnetFailover + If this switch is enabled, and your application is connecting to an AlwaysOn availability group (AG) on different subnets, detection of and connection to the currently active server will be faster. For more information about SqlClient support for Always On Availability Groups, see https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/sql/sqlclient-support-for-high-availability-disaster-recovery + + .PARAMETER NetworkProtocol + Explicitly sets the network protocol used to connect to the server. + + Valid values are "TcpIp","NamedPipes","Multiprotocol","AppleTalk","BanyanVines","Via","SharedMemory" and "NWLinkIpxSpx" + + .PARAMETER NonPooledConnection + If this switch is enabled, a non-pooled connection will be requested. + + .PARAMETER PacketSize + Sets the size in bytes of the network packets used to communicate with an instance of SQL Server. Must match at server. + + .PARAMETER PooledConnectionLifetime + When a connection is returned to the pool, its creation time is compared with the current time and the connection is destroyed if that time span (in seconds) exceeds the value specified by Connection Lifetime. This is useful in clustered configurations to force load balancing between a running server and a server just brought online. + + A value of zero (0) causes pooled connections to have the maximum connection timeout. + + .PARAMETER SqlExecutionModes + The SqlExecutionModes enumeration contains values that are used to specify whether the commands sent to the referenced connection to the server are executed immediately or saved in a buffer. + + Valid values include "CaptureSql", "ExecuteAndCaptureSql" and "ExecuteSql". + + .PARAMETER StatementTimeout + Sets the number of seconds a statement is given to run before failing with a timeout error. + + .PARAMETER TrustServerCertificate + When this switch is enabled, the channel will be encrypted while bypassing walking the certificate chain to validate trust. + + .PARAMETER WorkstationId + Sets the name of the workstation connecting to SQL Server. + + .PARAMETER SqlConnectionOnly + Instead of returning a rich SMO server object, this command will only return a SqlConnection object when setting this switch. + + .PARAMETER AzureUnsupported + Terminate if Azure is detected but not supported + + .PARAMETER MinimumVersion + Terminate if the target SQL Server instance version does not meet version requirements + + .PARAMETER DisableException + By default in most of our commands, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + + This command, however, gifts you with "sea of red" exceptions, by default, because it is useful for advanced scripting. + + Using this switch turns our "nice by default" feature on which makes errors into pretty warnings. + + .NOTES + Tags: Connect, Connection + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Connect-DbaInstance + + .EXAMPLE + PS C:\> Connect-DbaInstance -SqlInstance sql2014 + + Creates an SMO Server object that connects using Windows Authentication + + .EXAMPLE + PS C:\> $wincred = Get-Credential ad\sqladmin + PS C:\> Connect-DbaInstance -SqlInstance sql2014 -SqlCredential $wincred + + Creates an SMO Server object that connects using alternative Windows credentials + + .EXAMPLE + PS C:\> $sqlcred = Get-Credential sqladmin + PS C:\> $server = Connect-DbaInstance -SqlInstance sql2014 -SqlCredential $sqlcred + + Login to sql2014 as SQL login sqladmin. + + .EXAMPLE + PS C:\> $server = Connect-DbaInstance -SqlInstance sql2014 -ClientName "my connection" + + Creates an SMO Server object that connects using Windows Authentication and uses the client name "my connection". So when you open up profiler or use extended events, you can search for "my connection". + + .EXAMPLE + PS C:\> $server = Connect-DbaInstance -SqlInstance sql2014 -AppendConnectionString "Packet Size=4096;AttachDbFilename=C:\MyFolder\MyDataFile.mdf;User Instance=true;" + + Creates an SMO Server object that connects to sql2014 using Windows Authentication, then it sets the packet size (this can also be done via -PacketSize) and other connection attributes. + + .EXAMPLE + PS C:\> $server = Connect-DbaInstance -SqlInstance sql2014 -NetworkProtocol TcpIp -MultiSubnetFailover + + Creates an SMO Server object that connects using Windows Authentication that uses TCP/IP and has MultiSubnetFailover enabled. + + .EXAMPLE + PS C:\> $server = Connect-DbaInstance sql2016 -ApplicationIntent ReadOnly + + Connects with ReadOnly ApplicationIntent. + + #> + [CmdletBinding()] + param ( + [Parameter(Mandatory, ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [Alias("Credential")] + [PSCredential]$SqlCredential, + [string]$Database, + [string]$AccessToken, + [ValidateSet('ReadOnly', 'ReadWrite')] + [string]$ApplicationIntent, + [switch]$AzureUnsupported, + [string]$BatchSeparator, + [string]$ClientName = "dbatools PowerShell module - dbatools.io - custom connection", + [int]$ConnectTimeout = ([Sqlcollaborative.Dbatools.Connection.ConnectionHost]::SqlConnectionTimeout), + [switch]$EncryptConnection, + [string]$FailoverPartner, + [int]$LockTimeout, + [int]$MaxPoolSize, + [int]$MinPoolSize, + [int]$MinimumVersion, + [switch]$MultipleActiveResultSets, + [switch]$MultiSubnetFailover, + [ValidateSet('TcpIp', 'NamedPipes', 'Multiprotocol', 'AppleTalk', 'BanyanVines', 'Via', 'SharedMemory', 'NWLinkIpxSpx')] + [string]$NetworkProtocol, + [switch]$NonPooledConnection, + [int]$PacketSize, + [int]$PooledConnectionLifetime, + [ValidateSet('CaptureSql', 'ExecuteAndCaptureSql', 'ExecuteSql')] + [string]$SqlExecutionModes, + [int]$StatementTimeout, + [switch]$TrustServerCertificate, + [string]$WorkstationId, + [string]$AppendConnectionString, + [switch]$SqlConnectionOnly, + [switch]$DisableException + ) + begin { + #region Utility functions + function Invoke-TEPPCacheUpdate { + [CmdletBinding()] + param ( + [System.Management.Automation.ScriptBlock]$ScriptBlock + ) + + try { + [ScriptBlock]::Create($scriptBlock).Invoke() + } catch { + # If the SQL Server version doesn't support the feature, we ignore it and silently continue + if ($_.Exception.InnerException.InnerException.GetType().FullName -eq "Microsoft.SqlServer.Management.Sdk.Sfc.InvalidVersionEnumeratorException") { + return + } + + if ($ENV:APPVEYOR_BUILD_FOLDER -or ([Sqlcollaborative.Dbatools.Message.MEssageHost]::DeveloperMode)) { Stop-Function -Message } + else { + Write-Message -Level Warning -Message "Failed TEPP Caching: $($scriptBlock.ToString() | Select-String '"(.*?)"' | ForEach-Object { $_.Matches[0].Groups[1].Value })" -ErrorRecord $_ 3>$null + } + } + } + #endregion Utility functions + + #region Ensure Credential integrity + <# + Usually, the parameter type should have been not object but off the PSCredential type. + When binding null to a PSCredential type parameter on PS3-4, it'd then show a prompt, asking for username and password. + + In order to avoid that and having to refactor lots of functions (and to avoid making regular scripts harder to read), we created this workaround. + #> + if ($SqlCredential) { + if ($SqlCredential.GetType() -ne [System.Management.Automation.PSCredential]) { + Stop-Function -Message "The credential parameter was of a non-supported type. Only specify PSCredentials such as generated from Get-Credential. Input was of type $($SqlCredential.GetType().FullName)" + return + } + } + #endregion Ensure Credential integrity + + # In an unusual move, Connect-DbaInstance goes the exact opposite way of all commands when it comes to exceptions + # this means that by default it Stop-Function -Messages, but do not be tempted to Stop-Function -Message + if ($DisableException) { + $EnableException = $false + } else { + $EnableException = $true + } + + Test-DbaDeprecation -DeprecatedOn "1.0.0" -EnableException:$false -Alias Connect-DbaServer + Test-DbaDeprecation -DeprecatedOn "1.0.0" -EnableException:$false -Alias Get-DbaInstance + + $loadedSmoVersion = [AppDomain]::CurrentDomain.GetAssemblies() | Where-Object { + $_.Fullname -like "Microsoft.SqlServer.SMO,*" + } + + if ($loadedSmoVersion) { + $loadedSmoVersion = $loadedSmoVersion | ForEach-Object { + if ($_.Location -match "__") { + ((Split-Path (Split-Path $_.Location) -Leaf) -split "__")[0] + } else { + ((Get-ChildItem -Path $_.Location).VersionInfo.ProductVersion) + } + } + } + + #'PrimaryFilePath' seems the culprit for slow SMO on databases + $Fields2000_Db = 'Collation', 'CompatibilityLevel', 'CreateDate', 'ID', 'IsAccessible', 'IsFullTextEnabled', 'IsSystemObject', 'IsUpdateable', 'LastBackupDate', 'LastDifferentialBackupDate', 'LastLogBackupDate', 'Name', 'Owner', 'ReadOnly', 'RecoveryModel', 'ReplicationOptions', 'Status', 'Version' + $Fields200x_Db = $Fields2000_Db + @('BrokerEnabled', 'DatabaseSnapshotBaseName', 'IsMirroringEnabled', 'Trustworthy') + $Fields201x_Db = $Fields200x_Db + @('ActiveConnections', 'AvailabilityDatabaseSynchronizationState', 'AvailabilityGroupName', 'ContainmentType', 'EncryptionEnabled') + + $Fields2000_Login = 'CreateDate', 'DateLastModified', 'DefaultDatabase', 'DenyWindowsLogin', 'IsSystemObject', 'Language', 'LanguageAlias', 'LoginType', 'Name', 'Sid', 'WindowsLoginAccessType' + $Fields200x_Login = $Fields2000_Login + @('AsymmetricKey', 'Certificate', 'Credential', 'ID', 'IsDisabled', 'IsLocked', 'IsPasswordExpired', 'MustChangePassword', 'PasswordExpirationEnabled', 'PasswordPolicyEnforced') + $Fields201x_Login = $Fields200x_Login + @('PasswordHashAlgorithm') + } + process { + if (Test-FunctionInterrupt) { return } + + foreach ($instance in $SqlInstance) { + #region Safely convert input into instance parameters + # removed for now + #endregion Safely convert input into instance parameters + + # Gracefully handle Azure connections + if ($instance.ComputerName -match "database\.windows\.net" -and -not $instance.InputObject.ConnectionContext.IsOpen) { + if (-not $Database) { + Stop-Function -Message "You must specify -Database when connecting to a SQL Azure databse" -Continue + } + $isAzure = $true + + # Use available command to build the proper connection string + # but first, clean up passed params so that they match + $boundparams = $PSBoundParameters + [object[]]$connstringcmd = (Get-Command New-DbaConnectionString).Parameters.Keys + [object[]]$connectcmd = (Get-Command Connect-DbaInstance).Parameters.Keys + + foreach ($key in $connectcmd) { + if ($key -notin $connstringcmd -and $key -ne "SqlCredential") { + $null = $boundparams.Remove($key) + } + } + # Build connection string + $azureconnstring = New-DbaConnectionString @boundparams + + try { + # this is the way, as recommended by Microsoft + # https://docs.microsoft.com/en-us/sql/relational-databases/security/encryption/configure-always-encrypted-using-powershell?view=sql-server-2017 + $sqlconn = New-Object System.Data.SqlClient.SqlConnection $azureconnstring + $serverconn = New-Object Microsoft.SqlServer.Management.Common.ServerConnection $sqlconn + $null = $serverconn.Connect() + $server = New-Object Microsoft.SqlServer.Management.Smo.Server $serverconn + } catch { + Stop-Function -Message "Failure" -ErrorRecord $_ -Continue + } + } + #region Safely convert input into instance parameters + <# + This is a bit ugly, but: + In some cases functions would directly pass their own input through when the parameter on the calling function was typed as [object[]]. + This would break the base parameter class, as it'd automatically be an array and the parameterclass is not designed to handle arrays (Shouldn't have to). + + Note: Multiple servers in one call were never supported, those old functions were liable to break anyway and should be fixed soonest. + #> + if ($instance.GetType() -eq [Sqlcollaborative.Dbatools.Parameter.DbaInstanceParameter]) { + [DbaInstanceParameter]$instance = $instance + if ($instance.Type -like "SqlConnection") { + [DbaInstanceParameter]$instance = New-Object Microsoft.SqlServer.Management.Smo.Server($instance.InputObject) + } + } else { + [DbaInstanceParameter]$instance = [DbaInstanceParameter]($instance | Select-Object -First 1) + + if ($instance.Count -gt 1) { + Stop-Function -Message "More than on server was specified when calling Connect-SqlInstance from $((Get-PSCallStack)[1].Command)" -Continue + } + } + #endregion Safely convert input into instance parameters + + #region Input Object was a server object + if ($instance.Type -like "Server" -or ($isAzure -and $instance.InputObject.ConnectionContext.IsOpen)) { + if ($instance.InputObject.ConnectionContext.IsOpen -eq $false) { + $instance.InputObject.ConnectionContext.Connect() + } + if ($SqlConnectionOnly) { + $instance.InputObject.ConnectionContext.SqlConnectionObject + continue + } else { + $instance.InputObject + continue + } + } + #endregion Input Object was a server object + + #region Input Object was anything else + if ($instance.Type -like "SqlConnection") { + $server = New-Object Microsoft.SqlServer.Management.Smo.Server($instance.InputObject) + + if ($server.ConnectionContext.IsOpen -eq $false) { + $server.ConnectionContext.Connect() + } + if ($SqlConnectionOnly) { + if ($MinimumVersion -and $server.VersionMajor) { + if ($server.versionMajor -lt $MinimumVersion) { + Stop-Function -Message "SQL Server version $MinimumVersion required - $server not supported." -Continue + } + } + + if ($AzureUnsupported -and $server.DatabaseEngineType -eq "SqlAzureDatabase") { + Stop-Function -Message "Azure SQL Database not supported" -Continue + } + $server.ConnectionContext.SqlConnectionObject + continue + } else { + if (-not $server.ComputerName) { + if (-not $server.NetName -or $instance -match '\.') { + $parsedcomputername = $instance.ComputerName + } else { + $parsedcomputername = $server.NetName + } + Add-Member -InputObject $server -NotePropertyName ComputerName -NotePropertyValue $parsedcomputername -Force + } + if ($MinimumVersion -and $server.VersionMajor) { + if ($server.versionMajor -lt $MinimumVersion) { + Stop-Function -Message "SQL Server version $MinimumVersion required - $server not supported." -Continue + } + } + + if ($AzureUnsupported -and $server.DatabaseEngineType -eq "SqlAzureDatabase") { + Stop-Function -Message "Azure SQL Database not supported" -Continue + } + $server + continue + } + } + + if ($instance.IsConnectionString) { + $server = New-Object Microsoft.SqlServer.Management.Smo.Server($instance.InputObject) + } elseif (-not $isAzure) { + $server = New-Object Microsoft.SqlServer.Management.Smo.Server $instance.FullSmoName + } + + if ($AppendConnectionString) { + $connstring = $server.ConnectionContext.ConnectionString + $server.ConnectionContext.ConnectionString = "$connstring;$appendconnectionstring" + $server.ConnectionContext.Connect() + } elseif (-not $isAzure) { + # It's okay to skip Azure because this is addressed above with New-DbaConnectionString + $server.ConnectionContext.ApplicationName = $ClientName + + if (Test-Bound -ParameterName 'AccessToken') { + $server.ConnectionContext.AccessToken = $AccessToken + } + if (Test-Bound -ParameterName 'BatchSeparator') { + $server.ConnectionContext.BatchSeparator = $BatchSeparator + } + if (Test-Bound -ParameterName 'ConnectTimeout') { + $server.ConnectionContext.ConnectTimeout = $ConnectTimeout + } + if (Test-Bound -ParameterName 'Database') { + $server.ConnectionContext.DatabaseName = $Database + } + if (Test-Bound -ParameterName 'EncryptConnection') { + $server.ConnectionContext.EncryptConnection = $true + } + if (Test-Bound -ParameterName 'LockTimeout') { + $server.ConnectionContext.LockTimeout = $LockTimeout + } + if (Test-Bound -ParameterName 'MaxPoolSize') { + $server.ConnectionContext.MaxPoolSize = $MaxPoolSize + } + if (Test-Bound -ParameterName 'MinPoolSize') { + $server.ConnectionContext.MinPoolSize = $MinPoolSize + } + if (Test-Bound -ParameterName 'MultipleActiveResultSets') { + $server.ConnectionContext.MultipleActiveResultSets = $true + } + if (Test-Bound -ParameterName 'NetworkProtocol') { + $server.ConnectionContext.NetworkProtocol = $NetworkProtocol + } + if (Test-Bound -ParameterName 'NonPooledConnection') { + $server.ConnectionContext.NonPooledConnection = $true + } + if (Test-Bound -ParameterName 'PacketSize') { + $server.ConnectionContext.PacketSize = $PacketSize + } + if (Test-Bound -ParameterName 'PooledConnectionLifetime') { + $server.ConnectionContext.PooledConnectionLifetime = $PooledConnectionLifetime + } + if (Test-Bound -ParameterName 'StatementTimeout') { + $server.ConnectionContext.StatementTimeout = $StatementTimeout + } + if (Test-Bound -ParameterName 'SqlExecutionModes') { + $server.ConnectionContext.SqlExecutionModes = $SqlExecutionModes + } + if (Test-Bound -ParameterName 'TrustServerCertificate') { + $server.ConnectionContext.TrustServerCertificate = $true + } + if (Test-Bound -ParameterName 'WorkstationId') { + $server.ConnectionContext.WorkstationId = $WorkstationId + } + if (Test-Bound -ParameterName 'ApplicationIntent') { + $server.ConnectionContext.ApplicationIntent = $ApplicationIntent + } + + $connstring = $server.ConnectionContext.ConnectionString + if (Test-Bound -ParameterName 'MultiSubnetFailover') { + $connstring = "$connstring;MultiSubnetFailover=True" + } + if (Test-Bound -ParameterName 'FailoverPartner') { + $connstring = "$connstring;Failover Partner=$FailoverPartner" + } + + if ($connstring -ne $server.ConnectionContext.ConnectionString) { + $server.ConnectionContext.ConnectionString = $connstring + } + + try { + # parse out sql credential to figure out if it's Windows or SQL Login + if ($null -ne $SqlCredential.UserName -and -not $isAzure) { + $username = ($SqlCredential.UserName).TrimStart("\") + + # support both ad\username and username@ad + if ($username -like "*\*" -or $username -like "*@*") { + if ($username -like "*\*") { + $domain, $login = $username.Split("\") + $authtype = "Windows Authentication with Credential" + if ($domain) { + $formatteduser = "$login@$domain" + } else { + $formatteduser = $username.Split("\")[1] + } + } else { + $formatteduser = $SqlCredential.UserName + } + + $server.ConnectionContext.LoginSecure = $true + $server.ConnectionContext.ConnectAsUser = $true + $server.ConnectionContext.ConnectAsUserName = $formatteduser + $server.ConnectionContext.ConnectAsUserPassword = ($SqlCredential).GetNetworkCredential().Password + } else { + $authtype = "SQL Authentication" + $server.ConnectionContext.LoginSecure = $false + $server.ConnectionContext.set_Login($username) + $server.ConnectionContext.set_SecurePassword($SqlCredential.Password) + } + } + + if ($NonPooled) { + # When the Connect method is called, the connection is not automatically released. + # The Disconnect method must be called explicitly to release the connection to the connection pool. + # https://docs.microsoft.com/en-us/sql/relational-databases/server-management-objects-smo/create-program/disconnecting-from-an-instance-of-sql-server + $server.ConnectionContext.Connect() + } elseif ($authtype -eq "Windows Authentication with Credential") { + # Make it connect in a natural way, hard to explain. + # See https://docs.microsoft.com/en-us/sql/relational-databases/server-management-objects-smo/create-program/connecting-to-an-instance-of-sql-server + $null = $server.Information.Version + if ($server.ConnectionContext.IsOpen -eq $false) { + # Sometimes, however, the above may not connect as promised. Force it. + # See https://github.com/sqlcollaborative/dbatools/pull/4426 + $server.ConnectionContext.Connect() + } + } else { + if (-not $isAzure) { + # SqlConnectionObject.Open() enables connection pooling does not support + # alternative Windows Credentials and passes default credentials + # See https://github.com/sqlcollaborative/dbatools/pull/3809 + $server.ConnectionContext.SqlConnectionObject.Open() + } + } + } catch { + $originalException = $_.Exception + try { + $message = $originalException.InnerException.InnerException.ToString() + } catch { + $message = $originalException.ToString() + } + $message = ($message -Split '-->')[0] + $message = ($message -Split 'at System.Data.SqlClient')[0] + $message = ($message -Split 'at System.Data.ProviderBase')[0] + + Stop-Function -Message "Can't connect to $instance" -ErrorRecord $_ -Continue + } + } + + # Register the connected instance, so that the TEPP updater knows it's been connected to and starts building the cache + [Sqlcollaborative.Dbatools.TabExpansion.TabExpansionHost]::SetInstance($instance.FullSmoName.ToLower(), $server.ConnectionContext.Copy(), ($server.ConnectionContext.FixedServerRoles -match "SysAdmin")) + + # Update cache for instance names + if ([Sqlcollaborative.Dbatools.TabExpansion.TabExpansionHost]::Cache["sqlinstance"] -notcontains $instance.FullSmoName.ToLower()) { + [Sqlcollaborative.Dbatools.TabExpansion.TabExpansionHost]::Cache["sqlinstance"] += $instance.FullSmoName.ToLower() + } + + # Update lots of registered stuff + if (-not [Sqlcollaborative.Dbatools.TabExpansion.TabExpansionHost]::TeppSyncDisabled) { + $FullSmoName = $instance.FullSmoName.ToLower() + foreach ($scriptBlock in ([Sqlcollaborative.Dbatools.TabExpansion.TabExpansionHost]::TeppGatherScriptsFast)) { + Invoke-TEPPCacheUpdate -ScriptBlock $scriptBlock + } + } + + # By default, SMO initializes several properties. We push it to the limit and gather a bit more + # this slows down the connect a smidge but drastically improves overall performance + # especially when dealing with a multitude of servers + if ($loadedSmoVersion -ge 11 -and -not $isAzure) { + try { + if ($server.VersionMajor -eq 8) { + # 2000 + $initFieldsDb = New-Object System.Collections.Specialized.StringCollection + [void]$initFieldsDb.AddRange($Fields2000_Db) + $initFieldsLogin = New-Object System.Collections.Specialized.StringCollection + [void]$initFieldsLogin.AddRange($Fields2000_Login) + $server.SetDefaultInitFields([Microsoft.SqlServer.Management.Smo.Database], $initFieldsDb) + $server.SetDefaultInitFields([Microsoft.SqlServer.Management.Smo.Login], $initFieldsLogin) + } elseif ($server.VersionMajor -eq 9 -or $server.VersionMajor -eq 10) { + # 2005 and 2008 + $initFieldsDb = New-Object System.Collections.Specialized.StringCollection + [void]$initFieldsDb.AddRange($Fields200x_Db) + $initFieldsLogin = New-Object System.Collections.Specialized.StringCollection + [void]$initFieldsLogin.AddRange($Fields200x_Login) + $server.SetDefaultInitFields([Microsoft.SqlServer.Management.Smo.Database], $initFieldsDb) + $server.SetDefaultInitFields([Microsoft.SqlServer.Management.Smo.Login], $initFieldsLogin) + } else { + # 2012 and above + $initFieldsDb = New-Object System.Collections.Specialized.StringCollection + [void]$initFieldsDb.AddRange($Fields201x_Db) + $initFieldsLogin = New-Object System.Collections.Specialized.StringCollection + [void]$initFieldsLogin.AddRange($Fields201x_Login) + $server.SetDefaultInitFields([Microsoft.SqlServer.Management.Smo.Database], $initFieldsDb) + $server.SetDefaultInitFields([Microsoft.SqlServer.Management.Smo.Login], $initFieldsLogin) + } + } catch { + # perhaps a DLL issue, continue going + } + } + + if ($SqlConnectionOnly) { + $server.ConnectionContext.SqlConnectionObject + continue + } else { + if (-not $server.ComputerName) { + # Make ComputerName easily available in the server object + if (-not $server.NetName -or $instance -match '\.') { + $parsedcomputername = $instance.ComputerName + } else { + $parsedcomputername = $server.NetName + } + Add-Member -InputObject $server -NotePropertyName ComputerName -NotePropertyValue $parsedcomputername -Force + } + } + + if ($MinimumVersion -and $server.VersionMajor) { + if ($server.versionMajor -lt $MinimumVersion) { + Stop-Function -Message "SQL Server version $MinimumVersion required - $server not supported." -Continue + } + } + + if ($AzureUnsupported -and $server.DatabaseEngineType -eq "SqlAzureDatabase") { + Stop-Function -Message "Azure SQL Database not supported" -Continue + } + + $server + continue + } + #endregion Input Object was anything else + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function ConvertTo-DbaDataTable { + <# + .SYNOPSIS + Creates a DataTable for an object. + + .DESCRIPTION + Creates a DataTable based on an object's properties. This allows you to easily write to SQL Server tables. + + Thanks to Chad Miller, this is based on his script. https://gallery.technet.microsoft.com/scriptcenter/4208a159-a52e-4b99-83d4-8048468d29dd + + If the attempt to convert to data table fails, try the -Raw parameter for less accurate datatype detection. + + .PARAMETER InputObject + The object to transform into a DataTable. + + .PARAMETER TimeSpanType + Specifies the type to convert TimeSpan objects into. Default is 'TotalMilliseconds'. Valid options are: 'Ticks', 'TotalDays', 'TotalHours', 'TotalMinutes', 'TotalSeconds', 'TotalMilliseconds', and 'String'. + + .PARAMETER SizeType + Specifies the type to convert DbaSize objects to. Default is 'Int64'. Valid options are 'Int32', 'Int64', and 'String'. + + .PARAMETER IgnoreNull + If this switch is enabled, objects with null values will be ignored (empty rows will be added by default). + + .PARAMETER Raw + If this switch is enabled, the DataTable will be created with strings. No attempt will be made to parse/determine data types. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: DataTable, Table, Data + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io/ + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/ConvertTo-DbaDataTable + + .OUTPUTS + System.Object[] + + .EXAMPLE + PS C:\> Get-Service | ConvertTo-DbaDataTable + + Creates a DataTable from the output of Get-Service. + + .EXAMPLE + PS C:\> ConvertTo-DbaDataTable -InputObject $csv.cheesetypes + + Creates a DataTable from the CSV object $csv.cheesetypes. + + .EXAMPLE + PS C:\> $dblist | ConvertTo-DbaDataTable + + Creates a DataTable from the $dblist object passed in via pipeline. + + .EXAMPLE + PS C:\> Get-Process | ConvertTo-DbaDataTable -TimeSpanType TotalSeconds + + Creates a DataTable with the running processes and converts any TimeSpan property to TotalSeconds. + + #> + [CmdletBinding()] + [Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSUseOutputTypeCorrectly", "", Justification = "PSSA Rule Ignored by BOH")] + [OutputType([System.Object[]])] + param ( + [Parameter(Position = 0, + Mandatory, + ValueFromPipeline)] + [AllowNull()] + [PSObject[]]$InputObject, + [Parameter(Position = 1)] + [ValidateSet("Ticks", + "TotalDays", + "TotalHours", + "TotalMinutes", + "TotalSeconds", + "TotalMilliseconds", + "String")] + [ValidateNotNullOrEmpty()] + [string]$TimeSpanType = "TotalMilliseconds", + [ValidateSet("Int64", "Int32", "String")] + [string]$SizeType = "Int64", + [switch]$IgnoreNull, + [switch]$Raw, + [Alias('Silent')] + [switch]$EnableException + ) + + begin { + Write-Message -Level Debug -Message "Bound parameters: $($PSBoundParameters.Keys -join ", ")" + Write-Message -Level Debug -Message "TimeSpanType = $TimeSpanType | SizeType = $SizeType" + Test-DbaDeprecation -DeprecatedOn 1.0.0 -Alias Out-DbaDataTable + + function Convert-Type { + # This function will check so that the type is an accepted type which could be used when inserting into a table. + # If a type is accepted (included in the $type array) then it will be passed on, otherwise it will first change type before passing it on. + # Special types will have both their types converted as well as the value. + # TimeSpan is a special type and will be converted into the $timespantype. (default: TotalMilliseconds) so that the timespan can be stored in a database further down the line. + [CmdletBinding()] + param ( + $type, + $value, + $timespantype = 'TotalMilliseconds', + $sizetype = 'Int64' + ) + + $types = [System.Collections.ArrayList]@( + 'System.Int32', + 'System.UInt32', + 'System.Int16', + 'System.UInt16', + 'System.Int64', + 'System.UInt64', + 'System.Decimal', + 'System.Single', + 'System.Double', + 'System.Byte', + 'System.SByte', + 'System.Boolean', + 'System.DateTime', + 'System.Guid', + 'System.Char' + ) + + # The $special variable is used to mark the return value if a conversion was made on the value itself. + # If this is set to true the original value will later be ignored when updating the DataTable. + # And the value returned from this function will be used instead. (cannot modify existing properties) + $special = $false + $specialType = "" + + # Special types need to be converted in some way. + # This attempt is to convert timespan into something that works in a table. + # I couldn't decide on what to convert it to so the user can decide. + # If the parameter is not used, TotalMilliseconds will be used as default. + # Ticks are more accurate but I think milliseconds are more useful most of the time. + if (($type -eq 'System.TimeSpan') -or ($type -eq 'Sqlcollaborative.Dbatools.Utility.DbaTimeSpan') -or ($type -eq 'Sqlcollaborative.Dbatools.Utility.DbaTimeSpanPretty')) { + $special = $true + if ($timespantype -eq 'String') { + $value = $value.ToString() + $type = 'System.String' + } else { + # Let's use Int64 for all other types than string. + # We could match the type more closely with the timespantype but that can be added in the future if needed. + $value = $value.$timespantype + $type = 'System.Int64' + } + $specialType = 'Timespan' + } elseif ($type -eq 'Sqlcollaborative.Dbatools.Utility.Size') { + $special = $true + switch ($sizetype) { + 'Int64' { + $value = $value.Byte + $type = 'System.Int64' + } + 'Int32' { + $value = $value.Byte + $type = 'System.Int32' + } + 'String' { + $value = $value.ToString() + $type = 'System.String' + } + } + $specialType = 'Size' + } elseif (-not ($type -in $types)) { + # All types which are not found in the array will be converted into strings. + # In this way we don't ignore it completely and it will be clear in the end why it looks as it does. + $type = 'System.String' + } + + # return a hashtable instead of an object. I like hashtables :) + return @{ type = $type; Value = $value; Special = $special; SpecialType = $specialType } + } + + function Convert-SpecialType { + <# + .SYNOPSIS + Converts a value for a known column. + + .DESCRIPTION + Converts a value for a known column. + + .PARAMETER Value + The value to convert + + .PARAMETER Type + The special type for which to convert + + .PARAMETER SizeType + The size type defined by the user + + .PARAMETER TimeSpanType + The timespan type defined by the user + #> + [CmdletBinding()] + param ( + $Value, + [ValidateSet('Timespan', 'Size')] + [string]$Type, + [string]$SizeType, + [string]$TimeSpanType + ) + + switch ($Type) { + 'Size' { + if ($SizeType -eq 'String') { return $Value.ToString() } + else { return $Value.Byte } + } + 'Timespan' { + if ($TimeSpanType -eq 'String') { + $Value.ToString() + } else { + $Value.$TimeSpanType + } + } + } + } + + function Add-Column { + <# + .SYNOPSIS + Adds a column to the datatable in progress. + + .DESCRIPTION + Adds a column to the datatable in progress. + + .PARAMETER Property + The property for which to add a column. + + .PARAMETER DataTable + Autofilled. The table for which to add a column. + + .PARAMETER TimeSpanType + Autofilled. How should timespans be handled? + + .PARAMETER SizeType + Autofilled. How should sizes be handled? + + .PARAMETER Raw + Autofilled. Whether the column should be string, no matter the input. + #> + [CmdletBinding()] + param ( + [System.Management.Automation.PSPropertyInfo]$Property, + [System.Data.DataTable]$DataTable = $datatable, + [string]$TimeSpanType = $TimeSpanType, + [string]$SizeType = $SizeType, + [bool]$Raw = $Raw + ) + + $type = $property.TypeNameOfValue + try { + if ($Property.MemberType -like 'ScriptProperty') { + $type = $Property.GetType().FullName + } + } catch { $type = 'System.String' } + + $converted = Convert-Type -type $type -value $property.Value -timespantype $TimeSpanType -sizetype $SizeType + + $column = New-Object System.Data.DataColumn + $column.ColumnName = $property.Name.ToString() + if (-not $Raw) { + $column.DataType = [System.Type]::GetType($converted.type) + } + $null = $DataTable.Columns.Add($column) + $converted + } + + $datatable = New-Object System.Data.DataTable + + # Accelerate subsequent lookups of columns and special type columns + $columns = @() + $specialColumns = @() + $specialColumnsType = @{ } + + $ShouldCreateColumns = $true + } + + process { + #region Handle null objects + if ($null -eq $InputObject) { + if (-not $IgnoreNull) { + $datarow = $datatable.NewRow() + $datatable.Rows.Add($datarow) + } + + # Only ends the current process block + return + } + #endregion Handle null objects + + + foreach ($object in $InputObject) { + #region Handle null objects + if ($null -eq $object) { + if (-not $IgnoreNull) { + $datarow = $datatable.NewRow() + $datatable.Rows.Add($datarow) + } + continue + } + #endregion Handle null objects + + #Handle rows already being System.Data.DataRow + if ($object.GetType().FullName -eq 'System.Data.DataRow') { + if ($ShouldCreateColumns) { + $datatable = $object.Table.Copy() + $ShouldCreateColumns = $false + } + continue + } + + # The new row to insert + $datarow = $datatable.NewRow() + + #region Process Properties + $objectProperties = $object.PSObject.Properties + foreach ($property in $objectProperties) { + #region Create Columns as needed + if ($ShouldCreateColumns) { + $newColumn = Add-Column -Property $property + $columns += $property.Name + if ($newColumn.Special) { + $specialColumns += $property.Name + $specialColumnsType[$property.Name] = $newColumn.SpecialType + } + } + #endregion Create Columns as needed + + # Handle null properties, as well as properties with access errors + try { + $propValueLength = $property.value.length + } catch { + $propValueLength = 0 + } + + #region Insert value into column of row + if ($propValueLength -gt 0) { + # If the typename was a special typename we want to use the value returned from Convert-Type instead. + # We might get error if we try to change the value for $property.value if it is read-only. That's why we use $converted.value instead. + if ($property.Name -in $specialColumns) { + $datarow.Item($property.Name) = Convert-SpecialType -Value $property.value -Type $specialColumnsType[$property.Name] -SizeType $SizeType -TimeSpanType $TimeSpanType + } else { + if ($property.value.ToString().length -eq 15) { + if ($property.value.ToString() -eq 'System.Object[]') { + $value = $property.value -join ", " + } elseif ($property.value.ToString() -eq 'System.String[]') { + $value = $property.value -join ", " + } else { + $value = $property.value + } + } else { + $value = $property.value + } + + try { + $datarow.Item($property.Name) = $value + } catch { + if ($property.Name -notin $columns) { + try { + $newColumn = Add-Column -Property $property + $columns += $property.Name + if ($newColumn.Special) { + $specialColumns += $property.Name + $specialColumnsType[$property.Name] = $newColumn.SpecialType + } + + $datarow.Item($property.Name) = $newColumn.Value + } catch { + Stop-Function -Message "Failed to add property $($property.Name) from $object" -ErrorRecord $_ -Target $object + } + } else { + Stop-Function -Message "Failed to add property $($property.Name) from $object" -ErrorRecord $_ -Target $object + } + } + } + } + #endregion Insert value into column of row + } + + $datatable.Rows.Add($datarow) + # If this is the first non-null object then the columns has just been created. + # Set variable to false to skip creating columns from now on. + if ($ShouldCreateColumns) { + $ShouldCreateColumns = $false + } + #endregion Process Properties + } + } + end { + Write-Message -Level InternalComment -Message "Finished." + , $datatable + } +} +function ConvertTo-DbaTimeline { + <# + .SYNOPSIS + Converts InputObject to a html timeline using Google Chart + + .DESCRIPTION + This function accepts input as pipeline from the following dbatools functions: + Get-DbaAgentJobHistory + Get-DbaBackupHistory + (more to come...) + And generates Bootstrap based, HTML file with Google Chart Timeline + + .PARAMETER InputObject + + Pipe input, must an output from the above functions. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Chart + Author: Marcin Gminski (@marcingminski) + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + Dependency: ConvertTo-JsDate, Convert-DbaTimelineStatusColor + + .LINK + https://dbatools.io/ConvertTo-DbaTimeline + + .EXAMPLE + PS C:\> Get-DbaAgentJobHistory -SqlInstance sql-1 -StartDate '2018-08-13 00:00' -EndDate '2018-08-13 23:59' -ExcludeJobSteps | ConvertTo-DbaTimeline | Out-File C:\temp\DbaAgentJobHistory.html -Encoding ASCII + + Creates an output file containing a pretty timeline for all of the agent job history results for sql-1 the whole day of 2018-08-13 + + .EXAMPLE + PS C:\> Get-DbaCmsRegServer -SqlInstance sqlcm | Get-DbaBackupHistory -Since '2018-08-13 00:00' | ConvertTo-DbaTimeline | Out-File C:\temp\DbaBackupHistory.html -Encoding ASCII + + Creates an output file containing a pretty timeline for the agent job history since 2018-08-13 for all of the registered servers on sqlcm + + .EXAMPLE + PS C:\> $messageParameters = @{ + >> Subject = "Backup history for sql2017 and sql2016" + >> Body = Get-DbaBackupHistory -SqlInstance sql2017, sql2016 -Since '2018-08-13 00:00' | ConvertTo-DbaTimeline | Out-String + >> From = "dba@ad.local" + >> To = "dba@ad.local" + >> SmtpServer = "smtp.ad.local" + >> } + >> + PS C:\> Send-MailMessage @messageParameters -BodyAsHtml + + Sends an email to dba@ad.local with the results of Get-DbaBackupHistory. Note that viewing these reports may not be supported in all email clients. + + #> + [CmdletBinding()] + [Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSUseOutputTypeCorrectly", "", Justification = "PSSA Rule Ignored by BOH")] + param ( + [parameter(Mandatory, ValueFromPipeline)] + [object[]]$InputObject, + [switch]$EnableException + ) + begin { + $body = $servers = @() + $begin = @" + + + + + + + + + + + + + + + + +
+

$($CallerName) timeline for server $($servers -join ', ')

+
+
+
+
+
+

dbatools.io - the community's sql powershell module. Find us on Twitter: @psdbatools | Chart by @marcingminski

+
+ + +"@ + $begin, $body, $end + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function ConvertTo-DbaXESession { + <# + .SYNOPSIS + Uses a slightly modified version of sp_SQLskills_ConvertTraceToExtendedEvents.sql to convert Traces to Extended Events. + + .DESCRIPTION + Uses a slightly modified version of sp_SQLskills_ConvertTraceToExtendedEvents.sql to convert Traces to Extended Events. + + T-SQL code by: Jonathan M. Kehayias, SQLskills.com. T-SQL can be found in this module directory and at + https://www.sqlskills.com/blogs/jonathan/converting-sql-trace-to-extended-events-in-sql-server-2012/ + + .PARAMETER InputObject + Specifies a Trace object output by Get-DbaTrace. + + .PARAMETER Name + The name of the Trace to convert. If the name exists, characters will be appended to it. + + .PARAMETER OutputScriptOnly + Outputs the T-SQL script to create the XE session and does not execute it. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Trace, ExtendedEvent + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .EXAMPLE + PS C:\> Get-DbaTrace -SqlInstance sql2017, sql2012 | Where Id -eq 2 | ConvertTo-DbaXESession -Name 'Test' + + Converts Trace with ID 2 to a Session named Test on SQL Server instances named sql2017 and sql2012 and creates the Session on each respective server. + + .EXAMPLE + PS C:\> Get-DbaTrace -SqlInstance sql2014 | Out-GridView -PassThru | ConvertTo-DbaXESession -Name 'Test' | Start-DbaXESession + + Converts selected traces on sql2014 to sessions, creates the session, and starts it. + + .EXAMPLE + PS C:\> Get-DbaTrace -SqlInstance sql2014 | Where Id -eq 1 | ConvertTo-DbaXESession -Name 'Test' -OutputScriptOnly + + Converts trace ID 1 on sql2014 to an Extended Event and outputs the resulting T-SQL. + + #> + [CmdletBinding()] + param ( + [parameter(Mandatory, ValueFromPipeline)] + [object[]]$InputObject, + [parameter(Mandatory)] + [string]$Name, + [switch]$OutputScriptOnly, + [switch]$EnableException + ) + begin { + $rawsql = Get-Content "$script:PSModuleRoot\bin\sp_SQLskills_ConvertTraceToEEs.sql" -Raw + } + process { + foreach ($trace in $InputObject) { + if (-not $trace.id -and -not $trace.Parent) { + Stop-Function -Message "Input is of the wrong type. Use Get-DbaTrace." -Continue + return + } + + $server = $trace.Parent + + if ($server.VersionMajor -lt 11) { + Stop-Function -Message "SQL Server version 2012+ required - $server not supported." + return + } + + $tempdb = $server.Databases['tempdb'] + $traceid = $trace.id + + if ((Get-DbaXESession -SqlInstance $server -Session $PSBoundParameters.Name)) { + $oldname = $name + $Name = "$name-$traceid" + Write-Message -Level Output -Message "XE Session $oldname already exists on $server, trying $name." + } + + if ((Get-DbaXESession -SqlInstance $server -Session $Name)) { + $oldname = $name + $Name = "$name-$(Get-Random)" + Write-Message -Level Output -Message "XE Session $oldname already exists on $server, trying $name." + } + + $sql = $rawsql.Replace("--TRACEID--", $traceid) + $sql = $sql.Replace("--SESSIONNAME--", $name) + + try { + Write-Message -Level Verbose -Message "Executing SQL in tempdb." + $results = $tempdb.ExecuteWithResults($sql).Tables.Rows.SqlString + } catch { + Stop-Function -Message "Issue creating, dropping or executing sp_SQLskills_ConvertTraceToExtendedEvents in tempdb on $server." -Target $server -ErrorRecord $_ + } + + $results = $results -join "`r`n" + + if ($OutputScriptOnly) { + $results + } else { + Write-Message -Level Verbose -Message "Creating XE Session $name." + try { + $tempdb.ExecuteNonQuery($results) + } catch { + Stop-Function -Message "Issue creating extended event $name on $server." -Target $server -ErrorRecord $_ + } + Get-DbaXESession -SqlInstance $server -Session $name + } + } + } +} +function Copy-DbaAgentAlert { + <# + .SYNOPSIS + Copy-DbaAgentAlert migrates alerts from one SQL Server to another. + + .DESCRIPTION + By default, all alerts are copied. The -Alert parameter is auto-populated for command-line completion and can be used to copy only specific alerts. + + If the alert already exists on the destination, it will be skipped unless -Force is used. + + .PARAMETER Source + Source SQL Server. You must have sysadmin access and server version must be SQL Server version 2000 or higher. + + .PARAMETER SourceSqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Destination + Destination SQL Server. You must have sysadmin access and the server must be SQL Server 2000 or higher. + + .PARAMETER DestinationSqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Alert + The alert(s) to process. This list is auto-populated from the server. If unspecified, all alerts will be processed. + + .PARAMETER ExcludeAlert + The alert(s) to exclude. This list is auto-populated from the server. + + .PARAMETER IncludeDefaults + Copy SQL Agent defaults such as FailSafeEmailAddress, ForwardingServer, and PagerSubjectTemplate. + + .PARAMETER WhatIf + If this switch is enabled, no actions are performed but informational messages will be displayed that explain what would happen if the command were to run. + + .PARAMETER Confirm + If this switch is enabled, you will be prompted for confirmation before executing any operations that change state. + + .PARAMETER Force + If this switch is enabled, the Alert will be dropped and recreated on Destination. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Migration, Agent + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + Requires: sysadmin access on SQL Servers + + .LINK + https://dbatools.io/Copy-DbaAgentAlert + + .EXAMPLE + PS C:\> Copy-DbaAgentAlert -Source sqlserver2014a -Destination sqlcluster + + Copies all alerts from sqlserver2014a to sqlcluster using Windows credentials. If alerts with the same name exist on sqlcluster, they will be skipped. + + .EXAMPLE + PS C:\> Copy-DbaAgentAlert -Source sqlserver2014a -Destination sqlcluster -Alert PSAlert -SourceSqlCredential $cred -Force + + Copies a only the alert named PSAlert from sqlserver2014a to sqlcluster using SQL credentials for sqlserver2014a and Windows credentials for sqlcluster. If an alert with the same name exists on sqlcluster, it will be dropped and recreated because -Force was used. + + .EXAMPLE + PS C:\> Copy-DbaAgentAlert -Source sqlserver2014a -Destination sqlcluster -WhatIf -Force + + Shows what would happen if the command were executed using force. + + #> + [cmdletbinding(DefaultParameterSetName = "Default", SupportsShouldProcess)] + param ( + [parameter(Mandatory)] + [DbaInstanceParameter]$Source, + [PSCredential]$SourceSqlCredential, + [parameter(Mandatory)] + [DbaInstanceParameter[]]$Destination, + [PSCredential]$DestinationSqlCredential, + [object[]]$Alert, + [object[]]$ExcludeAlert, + [switch]$IncludeDefaults, + [switch]$Force, + [Alias('Silent')] + [switch]$EnableException + ) + begin { + try { + $sourceServer = Connect-SqlInstance -SqlInstance $Source -SqlCredential $SourceSqlCredential + $serverAlerts = $sourceServer.JobServer.Alerts + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $Source + return + } + } + process { + if (Test-FunctionInterrupt) { return } + foreach ($destinstance in $Destination) { + try { + $destServer = Connect-SqlInstance -SqlInstance $destinstance -SqlCredential $DestinationSqlCredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $destinstance -Continue + } + $destAlerts = $destServer.JobServer.Alerts + + if ($IncludeDefaults -eq $true) { + if ($PSCmdlet.ShouldProcess($destinstance, "Creating Alert Defaults")) { + $copyAgentAlertStatus = [pscustomobject]@{ + SourceServer = $sourceServer.Name + DestinationServer = $destServer.Name + Name = "Alert Defaults" + Type = "Alert Defaults" + Status = $null + Notes = $null + DateTime = [Sqlcollaborative.Dbatools.Utility.DbaDateTime](Get-Date) + } + try { + Write-Message -Message "Creating Alert Defaults" -Level Verbose + $sql = $sourceServer.JobServer.AlertSystem.Script() | Out-String + $sql = $sql -replace [Regex]::Escape("'$source'"), "'$destinstance'" + + Write-Message -Message $sql -Level Debug + $null = $destServer.Query($sql) + + $copyAgentAlertStatus.Status = "Successful" + } catch { + $copyAgentAlertStatus.Status = "Failed" + $copyAgentAlertStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + Stop-Function -Message "Issue creating alert defaults." -Category InvalidOperation -ErrorRecord $_ -Target $destServer -Continue + } + $copyAgentAlertStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + } + } + + foreach ($serverAlert in $serverAlerts) { + $alertName = $serverAlert.name + $copyAgentAlertStatus = [pscustomobject]@{ + SourceServer = $sourceServer.Name + DestinationServer = $destServer.Name + Name = $alertName + Type = "Agent Alert" + Notes = $null + Status = $null + DateTime = [Sqlcollaborative.Dbatools.Utility.DbaDateTime](Get-Date) + } + if (($Alert -and $Alert -notcontains $alertName) -or ($ExcludeAlert -and $ExcludeAlert -contains $alertName)) { + continue + } + + if ($serverAlert.HasNotification) { + $alertOperators = $serverAlert.EnumNotifications() + if ($destServerOperators.Name -notin $alertOperators.OperatorName) { + $missingOperators = ($alertOperators | Where-Object OperatorName -NotIn $destServerOperators.Name).OperatorName + if ($missingOperators.Count -gt 0 -or $missingOperators.Length -gt 0) { + $operatorList = $missingOperators -join ',' + if ($PSCmdlet.ShouldProcess($destinstance, "Missing operator(s) at destination.")) { + $copyAgentAlertStatus.Status = "Skipped" + $copyAgentAlertStatus.Notes = "Operator(s) [$operatorList] do not exist on destination" + $copyAgentAlertStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + Write-Message -Message "One or more operators alerted by [$alertName] is not present at the destination. Alert will not be copied. Use Copy-DbaAgentOperator to copy the operator(s) to the destination. Missing operator(s): $operatorList" -Level Warning + continue + } + } + } + } + + if ($destAlerts.name -contains $serverAlert.name) { + if ($force -eq $false) { + if ($PSCmdlet.ShouldProcess($destinstance, "Alert [$alertName] exists at destination. Use -Force to drop and migrate.")) { + $copyAgentAlertStatus.Status = "Skipped" + $copyAgentAlertStatus.Notes = "Already exists on destination" + $copyAgentAlertStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + Write-Message -Message "Alert [$alertName] exists at destination. Use -Force to drop and migrate." -Level Verbose + } + continue + } + + if ($PSCmdlet.ShouldProcess($destinstance, "Dropping alert $alertName and recreating")) { + try { + Write-Message -Message "Dropping Alert $alertName on $destServer." -Level Verbose + + $sql = "EXEC msdb.dbo.sp_delete_alert @name = N'$($alertname)';" + Write-Message -Message $sql -Level Debug + $null = $destServer.Query($sql) + $destAlerts.Refresh() + } catch { + $copyAgentAlertStatus.Status = "Failed" + $copyAgentAlertStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + Stop-Function -Message "Issue dropping/recreating alert" -Category InvalidOperation -ErrorRecord $_ -Target $destServer -Continue + } + } + } + + if ($destAlerts | Where-Object { $_.Severity -eq $serverAlert.Severity -and $_.MessageID -eq $serverAlert.MessageID -and $_.DatabaseName -eq $serverAlert.DatabaseName -and $_.EventDescriptionKeyword -eq $serverAlert.EventDescriptionKeyword }) { + if ($PSCmdlet.ShouldProcess($destinstance, "Checking for conflicts")) { + $conflictMessage = "Alert [$alertName] has already been defined to use" + if ($serverAlert.Severity -gt 0) { $conflictMessage += " severity $($serverAlert.Severity)" } + if ($serverAlert.MessageID -gt 0) { $conflictMessage += " error number $($serverAlert.MessageID)" } + if ($serverAlert.DatabaseName) { $conflictMessage += " on database '$($serverAlert.DatabaseName)'" } + if ($serverAlert.EventDescriptionKeyword) { $conflictMessage += " with error text '$($serverAlert.Severity)'" } + $conflictMessage += ". Skipping." + + Write-Message -Level Verbose -Message $conflictMessage + $copyAgentAlertStatus.Status = "Skipped" + $copyAgentAlertStatus.Notes = $conflictMessage + $copyAgentAlertStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + } + continue + } + if ($serverAlert.JobName -and $destServer.JobServer.Jobs.Name -NotContains $serverAlert.JobName) { + Write-Message -Level Verbose -Message "Alert [$alertName] has job [$($serverAlert.JobName)] configured as response. The job does not exist on destination $destServer. Skipping." + if ($PSCmdlet.ShouldProcess($destinstance, "Checking for conflicts")) { + $copyAgentAlertStatus.Status = "Skipped" + $copyAgentAlertStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + } + continue + } + + if ($PSCmdlet.ShouldProcess($destinstance, "Creating Alert $alertName")) { + try { + Write-Message -Message "Copying Alert $alertName" -Level Verbose + $sql = $serverAlert.Script() | Out-String + $sql = $sql -replace "@job_id=N'........-....-....-....-............", "@job_id=N'00000000-0000-0000-0000-000000000000" + + Write-Message -Message $sql -Level Debug + $null = $destServer.Query($sql) + + $copyAgentAlertStatus.Status = "Successful" + $copyAgentAlertStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + } catch { + $copyAgentAlertStatus.Status = "Failed" + $copyAgentAlertStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + Stop-Function -Message "Issue creating alert" -Category InvalidOperation -ErrorRecord $_ -Target $destServer -Continue + } + } + + $destServer.JobServer.Alerts.Refresh() + $destServer.JobServer.Jobs.Refresh() + + $newAlert = $destServer.JobServer.Alerts[$alertName] + $notifications = $serverAlert.EnumNotifications() + $jobName = $serverAlert.JobName + + # JobId = 00000000-0000-0000-0000-000 means the Alert does not execute/is attached to a SQL Agent Job. + if ($serverAlert.JobId -ne '00000000-0000-0000-0000-000000000000') { + $copyAgentAlertStatus = [pscustomobject]@{ + SourceServer = $sourceServer.Name + DestinationServer = $destServer.Name + Name = $alertName + Type = "Agent Alert Job Association" + Notes = "Associated with $jobName" + Status = $null + DateTime = [Sqlcollaborative.Dbatools.Utility.DbaDateTime](Get-Date) + } + if ($PSCmdlet.ShouldProcess($destinstance, "Adding $alertName to $jobName")) { + try { + <# THERE needs to be validation within this block to see if the $jobName actually exists on the source server. #> + Write-Message -Message "Adding $alertName to $jobName" -Level Verbose + $newJob = $destServer.JobServer.Jobs[$jobName] + $newJobId = ($newJob.JobId) -replace " ", "" + $sql = $sql -replace '00000000-0000-0000-0000-000000000000', $newJobId + $sql = $sql -replace 'sp_add_alert', 'sp_update_alert' + + Write-Message -Message $sql -Level Debug + $null = $destServer.Query($sql) + + $copyAgentAlertStatus.Status = "Successful" + $copyAgentAlertStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + } catch { + $copyAgentAlertStatus.Status = "Failed" + $copyAgentAlertStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + Stop-Function -Message "Issue adding alert to job" -Category InvalidOperation -ErrorRecord $_ -Target $destServer + } + } + } + + if ($PSCmdlet.ShouldProcess($destinstance, "Moving Notifications $alertName")) { + try { + $copyAgentAlertStatus = [pscustomobject]@{ + SourceServer = $sourceServer.Name + DestinationServer = $destServer.Name + Name = $alertName + Type = "Agent Alert Notification" + Notes = $null + Status = $null + DateTime = [Sqlcollaborative.Dbatools.Utility.DbaDateTime](Get-Date) + } + # can't add them this way, we need to modify the existing one or give all options that are supported. + foreach ($notify in $notifications) { + $notifyCollection = @() + if ($notify.UseNetSend -eq $true) { + Write-Message -Message "Adding net send" -Level Verbose + $notifyCollection += "NetSend" + } + + if ($notify.UseEmail -eq $true) { + Write-Message -Message "Adding email" -Level Verbose + $notifyCollection += "NotifyEmail" + } + + if ($notify.UsePager -eq $true) { + Write-Message -Message "Adding pager" -Level Verbose + $notifyCollection += "Pager" + } + + $notifyMethods = $notifyCollection -join ", " + $newAlert.AddNotification($notify.OperatorName, [Microsoft.SqlServer.Management.Smo.Agent.NotifyMethods]$notifyMethods) + } + $copyAgentAlertStatus.Status = "Successful" + $copyAgentAlertStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + } catch { + $copyAgentAlertStatus.Status = "Failed" + $copyAgentAlertStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + Stop-Function -Message "Issue moving notifications for the alert" -Category InvalidOperation -ErrorRecord $_ -Target $destServer + } + } + } + } + } + end { + Test-DbaDeprecation -DeprecatedOn "1.0.0" -EnableException:$false -Alias Copy-SqlAlert + } +} +function Copy-DbaAgentJob { + <# + .SYNOPSIS + Copy-DbaAgentJob migrates jobs from one SQL Server to another. + + .DESCRIPTION + By default, all jobs are copied. The -Job parameter is auto-populated for command-line completion and can be used to copy only specific jobs. + + If the job already exists on the destination, it will be skipped unless -Force is used. + + .PARAMETER Source + Source SQL Server. You must have sysadmin access and server version must be SQL Server version 2000 or higher. + + .PARAMETER SourceSqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Destination + Destination SQL Server. You must have sysadmin access and the server must be SQL Server 2000 or higher. + + .PARAMETER DestinationSqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Job + The job(s) to process. This list is auto-populated from the server. If unspecified, all jobs will be processed. + + .PARAMETER ExcludeJob + The job(s) to exclude. This list is auto-populated from the server. + + .PARAMETER DisableOnSource + If this switch is enabled, the job will be disabled on the source server. + + .PARAMETER DisableOnDestination + If this switch is enabled, the newly migrated job will be disabled on the destination server. + + .PARAMETER WhatIf + If this switch is enabled, no actions are performed but informational messages will be displayed that explain what would happen if the command were to run. + + .PARAMETER Confirm + If this switch is enabled, you will be prompted for confirmation before executing any operations that change state. + + .PARAMETER Force + If this switch is enabled, the Job will be dropped and recreated on Destination. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Migration, Agent, Job + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Copy-DbaAgentJob + + .EXAMPLE + PS C:\> Copy-DbaAgentJob -Source sqlserver2014a -Destination sqlcluster + + Copies all jobs from sqlserver2014a to sqlcluster, using Windows credentials. If jobs with the same name exist on sqlcluster, they will be skipped. + + .EXAMPLE + PS C:\> Copy-DbaAgentJob -Source sqlserver2014a -Destination sqlcluster -Job PSJob -SourceSqlCredential $cred -Force + + Copies a single job, the PSJob job from sqlserver2014a to sqlcluster, using SQL credentials for sqlserver2014a and Windows credentials for sqlcluster. If a job with the same name exists on sqlcluster, it will be dropped and recreated because -Force was used. + + .EXAMPLE + PS C:\> Copy-DbaAgentJob -Source sqlserver2014a -Destination sqlcluster -WhatIf -Force + + Shows what would happen if the command were executed using force. + + .EXAMPLE + PS C:\> Get-DbaAgentJob -SqlInstance sqlserver2014a | Where-Object Category -eq "Report Server" | ForEach-Object {Copy-DbaAgentJob -Source $_.SqlInstance -Job $_.Name -Destination sqlserver2014b} + + Copies all SSRS jobs (subscriptions) from AlwaysOn Primary SQL instance sqlserver2014a to AlwaysOn Secondary SQL instance sqlserver2014b + #> + [cmdletbinding(DefaultParameterSetName = "Default", SupportsShouldProcess)] + param ( + [parameter(Mandatory)] + [DbaInstanceParameter]$Source, + [PSCredential]$SourceSqlCredential, + [parameter(Mandatory)] + [DbaInstanceParameter[]]$Destination, + [PSCredential]$DestinationSqlCredential, + [object[]]$Job, + [object[]]$ExcludeJob, + [switch]$DisableOnSource, + [switch]$DisableOnDestination, + [switch]$Force, + [Alias('Silent')] + [switch]$EnableException + ) + begin { + try { + $sourceServer = Connect-SqlInstance -SqlInstance $Source -SqlCredential $SourceSqlCredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $Source + return + } + + $serverJobs = $sourceServer.JobServer.Jobs + } + process { + if (Test-FunctionInterrupt) { return } + foreach ($destinstance in $Destination) { + try { + $destServer = Connect-SqlInstance -SqlInstance $destinstance -SqlCredential $DestinationSqlCredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $destinstance -Continue + } + $destJobs = $destServer.JobServer.Jobs + + foreach ($serverJob in $serverJobs) { + $jobName = $serverJob.name + $jobId = $serverJob.JobId + + $copyJobStatus = [pscustomobject]@{ + SourceServer = $sourceServer.Name + DestinationServer = $destServer.Name + Name = $jobName + Type = "Agent Job" + Status = $null + Notes = $null + DateTime = [DbaDateTime](Get-Date) + } + + if ($Job -and $jobName -notin $Job -or $jobName -in $ExcludeJob) { + Write-Message -Level Verbose -Message "Job [$jobName] filtered. Skipping." + continue + } + Write-Message -Message "Working on job: $jobName" -Level Verbose + $sql = " + SELECT sp.[name] AS MaintenancePlanName + FROM msdb.dbo.sysmaintplan_plans AS sp + INNER JOIN msdb.dbo.sysmaintplan_subplans AS sps + ON sps.plan_id = sp.id + WHERE job_id = '$($jobId)'" + Write-Message -Message $sql -Level Debug + + $MaintenancePlanName = $sourceServer.Query($sql).MaintenancePlanName + + if ($MaintenancePlanName) { + if ($Pscmdlet.ShouldProcess($destinstance, "Job [$jobName] is associated with Maintenance Plan: $MaintenancePlanNam")) { + $copyJobStatus.Status = "Skipped" + $copyJobStatus.Notes = "Job is associated with maintenance plan" + $copyJobStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + Write-Message -Level Verbose -Message "Job [$jobName] is associated with Maintenance Plan: $MaintenancePlanName" + } + continue + } + + $dbNames = ($serverJob.JobSteps | where-object {$_.SubSystem -ne 'ActiveScripting'}).DatabaseName | Where-Object { $_.Length -gt 0 } + $missingDb = $dbNames | Where-Object { $destServer.Databases.Name -notcontains $_ } + + if ($missingDb.Count -gt 0 -and $dbNames.Count -gt 0) { + if ($Pscmdlet.ShouldProcess($destinstance, "Database(s) $missingDb doesn't exist on destination. Skipping job [$jobName].")) { + $missingDb = ($missingDb | Sort-Object | Get-Unique) -join ", " + $copyJobStatus.Status = "Skipped" + $copyJobStatus.Notes = "Job is dependent on database: $missingDb" + $copyJobStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + Write-Message -Level Verbose -Message "Database(s) $missingDb doesn't exist on destination. Skipping job [$jobName]." + } + continue + } + + $missingLogin = $serverJob.OwnerLoginName | Where-Object { $destServer.Logins.Name -notcontains $_ } + + if ($missingLogin.Count -gt 0) { + if ($force -eq $false) { + if ($Pscmdlet.ShouldProcess($destinstance, "Login(s) $missingLogin doesn't exist on destination. Use -Force to set owner to [sa]. Skipping job [$jobName].")) { + $missingLogin = ($missingLogin | Sort-Object | Get-Unique) -join ", " + $copyJobStatus.Status = "Skipped" + $copyJobStatus.Notes = "Job is dependent on login $missingLogin" + $copyJobStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + Write-Message -Level Verbose -Message "Login(s) $missingLogin doesn't exist on destination. Use -Force to set owner to [sa]. Skipping job [$jobName]." + } + continue + } + } + + $proxyNames = ($serverJob.JobSteps | Where-Object ProxyName).ProxyName + $missingProxy = $proxyNames | Where-Object { $destServer.JobServer.ProxyAccounts.Name -notcontains $_ } + + if ($missingProxy -and $proxyNames) { + if ($Pscmdlet.ShouldProcess($destinstance, "Proxy Account(s) $missingProxy doesn't exist on destination. Skipping job [$jobName].")) { + $missingProxy = ($missingProxy | Sort-Object | Get-Unique) -join ", " + $copyJobStatus.Status = "Skipped" + $copyJobStatus.Notes = "Job is dependent on proxy $missingProxy" + $copyJobStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + Write-Message -Level Verbose -Message "Proxy Account(s) $missingProxy doesn't exist on destination. Skipping job [$jobName]." + } + continue + } + + $operators = $serverJob.OperatorToEmail, $serverJob.OperatorToNetSend, $serverJob.OperatorToPage | Where-Object { $_.Length -gt 0 } + $missingOperators = $operators | Where-Object { $destServer.JobServer.Operators.Name -notcontains $_ } + + if ($missingOperators.Count -gt 0 -and $operators.Count -gt 0) { + if ($Pscmdlet.ShouldProcess($destinstance, "Operator(s) $($missingOperator) doesn't exist on destination. Skipping job [$jobName]")) { + $missingOperator = ($operators | Sort-Object | Get-Unique) -join ", " + $copyJobStatus.Status = "Skipped" + $copyJobStatus.Notes = "Job is dependent on operator $missingOperator" + $copyJobStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + Write-Message -Level Verbose -Message "Operator(s) $($missingOperator) doesn't exist on destination. Skipping job [$jobName]" + } + continue + } + + if ($destJobs.name -contains $serverJob.name) { + if ($force -eq $false) { + if ($Pscmdlet.ShouldProcess($destinstance, "Job $jobName exists at destination. Use -Force to drop and migrate.")) { + $copyJobStatus.Status = "Skipped" + $copyJobStatus.Notes = "Already exists on destination" + $copyJobStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + Write-Message -Level Verbose -Message "Job $jobName exists at destination. Use -Force to drop and migrate." + } + continue + } else { + if ($Pscmdlet.ShouldProcess($destinstance, "Dropping job $jobName and recreating")) { + try { + Write-Message -Message "Dropping Job $jobName" -Level Verbose + $destServer.JobServer.Jobs[$jobName].Drop() + } catch { + $copyJobStatus.Status = "Failed" + $copyJobStatus.Notes = (Get-ErrorMessage -Record $_).Message + $copyJobStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + Stop-Function -Message "Issue dropping job" -Target $jobName -ErrorRecord $_ -Continue + } + } + } + } + + if ($Pscmdlet.ShouldProcess($destinstance, "Creating Job $jobName")) { + try { + Write-Message -Message "Copying Job $jobName" -Level Verbose + $sql = $serverJob.Script() | Out-String + + if ($missingLogin.Count -gt 0 -and $force) { + $saLogin = Get-SqlSaLogin -SqlInstance $destServer + $sql = $sql -replace [Regex]::Escape("@owner_login_name=N'$missingLogin'"), [Regex]::Escape("@owner_login_name=N'$saLogin'") + } + + Write-Message -Message $sql -Level Debug + $destServer.Query($sql) + + $destServer.JobServer.Jobs.Refresh() + $destServer.JobServer.Jobs[$serverJob.name].IsEnabled = $sourceServer.JobServer.Jobs[$serverJob.name].IsEnabled + $destServer.JobServer.Jobs[$serverJob.name].Alter() + } catch { + $copyJobStatus.Status = "Failed" + $copyJobStatus.Notes = (Get-ErrorMessage -Record $_) + $copyJobStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + Stop-Function -Message "Issue copying job" -Target $jobName -ErrorRecord $_ -Continue + } + } + + if ($DisableOnDestination) { + if ($Pscmdlet.ShouldProcess($destinstance, "Disabling $jobName")) { + Write-Message -Message "Disabling $jobName on $destinstance" -Level Verbose + $destServer.JobServer.Jobs[$serverJob.name].IsEnabled = $False + $destServer.JobServer.Jobs[$serverJob.name].Alter() + } + } + + if ($DisableOnSource) { + if ($Pscmdlet.ShouldProcess($source, "Disabling $jobName")) { + Write-Message -Message "Disabling $jobName on $source" -Level Verbose + $serverJob.IsEnabled = $false + $serverJob.Alter() + } + } + if ($Pscmdlet.ShouldProcess($destinstance, "Reporting status of migration for $jobname")) { + $copyJobStatus.Status = "Successful" + $copyJobStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + } + } + } + } + end { + Test-DbaDeprecation -DeprecatedOn "1.0.0" -EnableException:$false -Alias Copy-SqlJob + } +} +#ValidationTags#Messaging# +function Copy-DbaAgentJobCategory { + <# + .SYNOPSIS + Copy-DbaAgentJobCategory migrates SQL Agent categories from one SQL Server to another. This is similar to sp_add_category. + + https://msdn.microsoft.com/en-us/library/ms181597.aspx + + .DESCRIPTION + By default, all SQL Agent categories for Jobs, Operators and Alerts are copied. + + The -OperatorCategories parameter is auto-populated for command-line completion and can be used to copy only specific operator categories. + The -AgentCategories parameter is auto-populated for command-line completion and can be used to copy only specific agent categories. + The -JobCategories parameter is auto-populated for command-line completion and can be used to copy only specific job categories. + + If the category already exists on the destination, it will be skipped unless -Force is used. + + .PARAMETER Source + Source SQL Server. You must have sysadmin access and server version must be SQL Server version 2000 or higher. + + .PARAMETER SourceSqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Destination + Destination SQL Server. You must have sysadmin access and the server must be SQL Server 2000 or higher. + + .PARAMETER DestinationSqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER CategoryType + Specifies the Category Type to migrate. Valid options are "Job", "Alert" and "Operator". When CategoryType is specified, all categories from the selected type will be migrated. For granular migrations, use the three parameters below. + + .PARAMETER OperatorCategory + This parameter is auto-populated for command-line completion and can be used to copy only specific operator categories. + + .PARAMETER AgentCategory + This parameter is auto-populated for command-line completion and can be used to copy only specific agent categories. + + .PARAMETER JobCategory + This parameter is auto-populated for command-line completion and can be used to copy only specific job categories. + + .PARAMETER WhatIf + If this switch is enabled, no actions are performed but informational messages will be displayed that explain what would happen if the command were to run. + + .PARAMETER Confirm + If this switch is enabled, you will be prompted for confirmation before executing any operations that change state. + + .PARAMETER Force + If this switch is enabled, the Category will be dropped and recreated on Destination. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Migration, Agent + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + Requires: sysadmin access on SQL Servers + + .LINK + https://dbatools.io/Copy-DbaAgentJobCategory + + .EXAMPLE + PS C:\> Copy-DbaAgentJobCategory -Source sqlserver2014a -Destination sqlcluster + + Copies all operator categories from sqlserver2014a to sqlcluster using Windows authentication. If operator categories with the same name exist on sqlcluster, they will be skipped. + + .EXAMPLE + PS C:\> Copy-DbaAgentJobCategory -Source sqlserver2014a -Destination sqlcluster -OperatorCategory PSOperator -SourceSqlCredential $cred -Force + + Copies a single operator category, the PSOperator operator category from sqlserver2014a to sqlcluster using SQL credentials to authenticate to sqlserver2014a and Windows credentials for sqlcluster. If an operator category with the same name exists on sqlcluster, it will be dropped and recreated because -Force was used. + + .EXAMPLE + PS C:\> Copy-DbaAgentJobCategory -Source sqlserver2014a -Destination sqlcluster -WhatIf -Force + + Shows what would happen if the command were executed using force. + + #> + [CmdletBinding(DefaultParameterSetName = "Default", SupportsShouldProcess)] + param ( + [parameter(Mandatory)] + [DbaInstanceParameter]$Source, + [PSCredential]$SourceSqlCredential, + [parameter(Mandatory)] + [DbaInstanceParameter[]]$Destination, + [PSCredential]$DestinationSqlCredential, + [Parameter(ParameterSetName = 'SpecificAlerts')] + [ValidateSet('Job', 'Alert', 'Operator')] + [string[]]$CategoryType, + [string[]]$JobCategory, + [string[]]$AgentCategory, + [string[]]$OperatorCategory, + [switch]$Force, + [Alias('Silent')] + [switch]$EnableException + ) + + begin { + Test-DbaDeprecation -DeprecatedOn "1.0.0" -Alias Copy-DbaAgentCategory + function Copy-JobCategory { + <# + .SYNOPSIS + Copy-JobCategory migrates job categories from one SQL Server to another. + + .DESCRIPTION + By default, all job categories are copied. The -JobCategories parameter is auto-populated for command-line completion and can be used to copy only specific job categories. + + If the associated credential for the category does not exist on the destination, it will be skipped. If the job category already exists on the destination, it will be skipped unless -Force is used. + #> + param ( + [string[]]$jobCategories + ) + + process { + + $serverJobCategories = $sourceServer.JobServer.JobCategories | Where-Object ID -ge 100 + $destJobCategories = $destServer.JobServer.JobCategories | Where-Object ID -ge 100 + + foreach ($jobCategory in $serverJobCategories) { + $categoryName = $jobCategory.Name + + $copyJobCategoryStatus = [pscustomobject]@{ + SourceServer = $sourceServer.Name + DestinationServer = $destServer.Name + Name = $categoryName + Type = "Agent Job Category" + Status = $null + Notes = $null + DateTime = [Sqlcollaborative.Dbatools.Utility.DbaDateTime](Get-Date) + } + + if ($jobCategories.Count -gt 0 -and $jobCategories -notcontains $categoryName) { + continue + } + + if ($destJobCategories.Name -contains $jobCategory.name) { + if ($force -eq $false) { + $copyJobCategoryStatus.Status = "Skipped" + $copyJobCategoryStatus.Notes = "Already exists on destination" + $copyJobCategoryStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + Write-Message -Level Verbose -Message "Job category $categoryName exists at destination. Use -Force to drop and migrate." + continue + } else { + if ($Pscmdlet.ShouldProcess($destinstance, "Dropping job category $categoryName")) { + try { + Write-Message -Level Verbose -Message "Dropping Job category $categoryName" + $destServer.JobServer.JobCategories[$categoryName].Drop() + } catch { + $copyJobCategoryStatus.Status = "Failed" + $copyJobCategoryStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + Stop-Function -Message "Issue dropping job category" -Target $categoryName -ErrorRecord $_ -Continue + } + } + } + } + + if ($Pscmdlet.ShouldProcess($destinstance, "Creating Job category $categoryName")) { + try { + Write-Message -Level Verbose -Message "Copying Job category $categoryName" + $sql = $jobCategory.Script() | Out-String + Write-Message -Level Debug -Message "SQL Statement: $sql" + $destServer.Query($sql) + + $copyJobCategoryStatus.Status = "Successful" + $copyJobCategoryStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + } catch { + $copyJobCategoryStatus.Status = "Failed" + $copyJobCategoryStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + Stop-Function -Message "Issue copying job category" -Target $categoryName -ErrorRecord $_ + } + } + } + } + } + + function Copy-OperatorCategory { + <# + .SYNOPSIS + Copy-OperatorCategory migrates operator categories from one SQL Server to another. + + .DESCRIPTION + By default, all operator categories are copied. The -OperatorCategories parameter is auto-populated for command-line completion and can be used to copy only specific operator categories. + + If the associated credential for the category does not exist on the destination, it will be skipped. If the operator category already exists on the destination, it will be skipped unless -Force is used. + #> + [CmdletBinding(DefaultParameterSetName = "Default", SupportsShouldProcess)] + param ( + [string[]]$operatorCategories + ) + process { + $serverOperatorCategories = $sourceServer.JobServer.OperatorCategories | Where-Object ID -ge 100 + $destOperatorCategories = $destServer.JobServer.OperatorCategories | Where-Object ID -ge 100 + + foreach ($operatorCategory in $serverOperatorCategories) { + $categoryName = $operatorCategory.Name + + $copyOperatorCategoryStatus = [pscustomobject]@{ + SourceServer = $sourceServer.Name + DestinationServer = $destServer.Name + Type = "Agent Operator Category" + Name = $categoryName + Status = $null + Notes = $null + DateTime = [Sqlcollaborative.Dbatools.Utility.DbaDateTime](Get-Date) + } + + if ($operatorCategories.Count -gt 0 -and $operatorCategories -notcontains $categoryName) { + continue + } + + if ($destOperatorCategories.Name -contains $operatorCategory.Name) { + if ($force -eq $false) { + $copyOperatorCategoryStatus.Status = "Skipped" + $copyOperatorCategoryStatus.Notes = "Already exists on destination" + $copyOperatorCategoryStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + Write-Message -Level Verbose -Message "Operator category $categoryName exists at destination. Use -Force to drop and migrate." + continue + } else { + if ($Pscmdlet.ShouldProcess($destinstance, "Dropping operator category $categoryName and recreating")) { + try { + Write-Message -Level Verbose -Message "Dropping Operator category $categoryName" + $destServer.JobServer.OperatorCategories[$categoryName].Drop() + Write-Message -Level Verbose -Message "Copying Operator category $categoryName" + $sql = $operatorCategory.Script() | Out-String + Write-Message -Level Debug -Message $sql + $destServer.Query($sql) + } catch { + $copyOperatorCategoryStatus.Status = "Failed" + $copyOperatorCategoryStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + Stop-Function -Message "Issue dropping operator category" -Target $categoryName -ErrorRecord $_ + } + } + } + } else { + if ($Pscmdlet.ShouldProcess($destinstance, "Creating Operator category $categoryName")) { + try { + Write-Message -Level Verbose -Message "Copying Operator category $categoryName" + $sql = $operatorCategory.Script() | Out-String + Write-Message -Level Debug -Message $sql + $destServer.Query($sql) + + $copyOperatorCategoryStatus.Status = "Successful" + $copyOperatorCategoryStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + } catch { + $copyOperatorCategoryStatus.Status = "Failed" + $copyOperatorCategoryStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + Stop-Function -Message "Issue copying operator category" -Target $categoryName -ErrorRecord $_ + } + } + } + } + } + } + + function Copy-AlertCategory { + <# + .SYNOPSIS + Copy-AlertCategory migrates alert categories from one SQL Server to another. + + .DESCRIPTION + By default, all alert categories are copied. The -AlertCategories parameter is auto-populated for command-line completion and can be used to copy only specific alert categories. + + If the associated credential for the category does not exist on the destination, it will be skipped. If the alert category already exists on the destination, it will be skipped unless -Force is used. + #> + [CmdletBinding(DefaultParameterSetName = "Default", SupportsShouldProcess)] + param ( + [string[]]$AlertCategories + ) + + process { + if ($sourceServer.VersionMajor -lt 9 -or $destServer.VersionMajor -lt 9) { + throw "Server AlertCategories are only supported in SQL Server 2005 and above. Quitting." + } + + $serverAlertCategories = $sourceServer.JobServer.AlertCategories | Where-Object ID -ge 100 + $destAlertCategories = $destServer.JobServer.AlertCategories | Where-Object ID -ge 100 + + foreach ($alertCategory in $serverAlertCategories) { + $categoryName = $alertCategory.Name + + $copyAlertCategoryStatus = [pscustomobject]@{ + SourceServer = $sourceServer.Name + DestinationServer = $destServer.Name + Type = "Agent Alert Category" + Name = $categoryName + Status = $null + Notes = $null + DateTime = [Sqlcollaborative.Dbatools.Utility.DbaDateTime](Get-Date) + } + + if ($alertCategories.Length -gt 0 -and $alertCategories -notcontains $categoryName) { + continue + } + + if ($destAlertCategories.Name -contains $alertCategory.name) { + if ($force -eq $false) { + $copyAlertCategoryStatus.Status = "Skipped" + $copyAlertCategoryStatus.Notes = "Already exists on destination" + $copyAlertCategoryStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + Write-Message -Level Verbose -Message "Alert category $categoryName exists at destination. Use -Force to drop and migrate." + continue + } else { + if ($Pscmdlet.ShouldProcess($destinstance, "Dropping alert category $categoryName and recreating")) { + try { + Write-Message -Level Verbose -Message "Dropping Alert category $categoryName" + $destServer.JobServer.AlertCategories[$categoryName].Drop() + Write-Message -Level Verbose -Message "Copying Alert category $categoryName" + $sql = $alertcategory.Script() | Out-String + Write-Message -Level Debug -Message "SQL Statement: $sql" + $destServer.Query($sql) + } catch { + $copyAlertCategoryStatus.Status = "Failed" + $copyAlertCategoryStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + Stop-Function -Message "Issue dropping alert category" -Target $categoryName -ErrorRecord $_ + } + } + } + } else { + if ($Pscmdlet.ShouldProcess($destinstance, "Creating Alert category $categoryName")) { + try { + Write-Message -Level Verbose -Message "Copying Alert category $categoryName" + $sql = $alertCategory.Script() | Out-String + Write-Message -Level Debug -Message $sql + $destServer.Query($sql) + + $copyAlertCategoryStatus.Status = "Successful" + $copyAlertCategoryStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + } catch { + $copyAlertCategoryStatus.Status = "Failed" + $copyAlertCategoryStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + Stop-Function -Message "Issue creating alert category" -Target $categoryName -ErrorRecord $_ + } + } + } + } + } + } + + try { + $sourceServer = Connect-SqlInstance -SqlInstance $Source -SqlCredential $SourceSqlCredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $Source + return + } + } + process { + if (Test-FunctionInterrupt) { return } + foreach ($destinstance in $Destination) { + try { + $destServer = Connect-SqlInstance -SqlInstance $destinstance -SqlCredential $DestinationSqlCredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $destinstance -Continue + } + + if ($CategoryType.count -gt 0) { + + switch ($CategoryType) { + "Job" { + Copy-JobCategory + } + + "Alert" { + Copy-AlertCategory + } + + "Operator" { + Copy-OperatorCategory + } + } + continue + } + + if (($OperatorCategory.Count + $AlertCategory.Count + $jobCategory.Count) -gt 0) { + + if ($OperatorCategory.Count -gt 0) { + Copy-OperatorCategory -OperatorCategories $OperatorCategory + } + + if ($AlertCategory.Count -gt 0) { + Copy-AlertCategory -AlertCategories $AlertCategory + } + + if ($jobCategory.Count -gt 0) { + Copy-JobCategory -JobCategories $jobCategory + } + continue + } + Copy-OperatorCategory + Copy-AlertCategory + Copy-JobCategory + } + } + end { + Test-DbaDeprecation -DeprecatedOn "1.0.0" -EnableException:$false -Alias Copy-SqlAgentCategory + } +} +function Copy-DbaAgentOperator { + <# + .SYNOPSIS + Copy-DbaAgentOperator migrates operators from one SQL Server to another. + + .DESCRIPTION + By default, all operators are copied. The -Operators parameter is auto-populated for command-line completion and can be used to copy only specific operators. + + If the associated credentials for the operator do not exist on the destination, it will be skipped. If the operator already exists on the destination, it will be skipped unless -Force is used. + + .PARAMETER Source + Source SQL Server. You must have sysadmin access and server version must be SQL Server version 2000 or higher. + + .PARAMETER SourceSqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Destination + Destination SQL Server. You must have sysadmin access and the server must be SQL Server 2000 or higher. + + .PARAMETER DestinationSqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Operator + The operator(s) to process. This list is auto-populated from the server. If unspecified, all operators will be processed. + + .PARAMETER ExcludeOperator + The operators(s) to exclude. This list is auto-populated from the server. + + .PARAMETER WhatIf + If this switch is enabled, no actions are performed but informational messages will be displayed that explain what would happen if the command were to run. + + .PARAMETER Confirm + If this switch is enabled, you will be prompted for confirmation before executing any operations that change state. + + .PARAMETER Force + If this switch is enabled, the Operator will be dropped and recreated on Destination. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Migration, Agent, Operator + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + Requires: sysadmin access on SQL Servers + + .LINK + https://dbatools.io/Copy-DbaAgentOperator + + .EXAMPLE + PS C:\> Copy-DbaAgentOperator -Source sqlserver2014a -Destination sqlcluster + + Copies all operators from sqlserver2014a to sqlcluster using Windows credentials. If operators with the same name exist on sqlcluster, they will be skipped. + + .EXAMPLE + PS C:\> Copy-DbaAgentOperator -Source sqlserver2014a -Destination sqlcluster -Operator PSOperator -SourceSqlCredential $cred -Force + + Copies only the PSOperator operator from sqlserver2014a to sqlcluster using SQL credentials for sqlserver2014a and Windows credentials for sqlcluster. If an operator with the same name exists on sqlcluster, it will be dropped and recreated because -Force was used. + + .EXAMPLE + PS C:\> Copy-DbaAgentOperator -Source sqlserver2014a -Destination sqlcluster -WhatIf -Force + + Shows what would happen if the command were executed using force. + + #> + [CmdletBinding(DefaultParameterSetName = "Default", SupportsShouldProcess)] + param ( + [parameter(Mandatory)] + [DbaInstanceParameter]$Source, + [PSCredential] + $SourceSqlCredential, + [parameter(Mandatory)] + [DbaInstanceParameter[]]$Destination, + [PSCredential] + $DestinationSqlCredential, + [object[]]$Operator, + [object[]]$ExcludeOperator, + [switch]$Force, + [Alias('Silent')] + [switch]$EnableException + ) + + begin { + try { + $sourceServer = Connect-SqlInstance -SqlInstance $Source -SqlCredential $SourceSqlCredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $Source + return + } + $serverOperator = $sourceServer.JobServer.Operators + } + process { + if (Test-FunctionInterrupt) { return } + foreach ($destinstance in $Destination) { + try { + $destServer = Connect-SqlInstance -SqlInstance $destinstance -SqlCredential $DestinationSqlCredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $destinstance -Continue + } + + $destOperator = $destServer.JobServer.Operators + $failsafe = $destServer.JobServer.AlertSystem | Select-Object FailSafeOperator + foreach ($sOperator in $serverOperator) { + $operatorName = $sOperator.Name + + $copyOperatorStatus = [pscustomobject]@{ + SourceServer = $sourceServer.Name + DestinationServer = $destServer.Name + Name = $operatorName + Type = "Agent Operator" + Status = $null + Notes = $null + DateTime = [DbaDateTime](Get-Date) + } + + if ($Operator -and $Operator -notcontains $operatorName -or $ExcludeOperator -in $operatorName) { + continue + } + + if ($destOperator.Name -contains $sOperator.Name) { + if ($force -eq $false) { + if ($Pscmdlet.ShouldProcess($destinstance, "Operator $operatorName exists at destination. Use -Force to drop and migrate.")) { + $copyOperatorStatus.Status = "Skipped" + $copyOperatorStatus.Notes = "Already exists on destination" + $copyOperatorStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + Write-Message -Level Verbose -Message "Operator $operatorName exists at destination. Use -Force to drop and migrate." + } + continue + } else { + if ($failsafe.FailSafeOperator -eq $operatorName) { + Write-Message -Level Verbose -Message "$operatorName is the failsafe operator. Skipping drop." + continue + } + + if ($Pscmdlet.ShouldProcess($destinstance, "Dropping operator $operatorName and recreating")) { + try { + Write-Message -Level Verbose -Message "Dropping Operator $operatorName" + $destServer.JobServer.Operators[$operatorName].Drop() + } catch { + $copyOperatorStatus.Status = "Failed" + $copyOperatorStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + + Stop-Function -Message "Issue dropping operator" -Category InvalidOperation -ErrorRecord $_ -Target $destServer -Continue + } + } + } + } + + if ($Pscmdlet.ShouldProcess($destinstance, "Creating Operator $operatorName")) { + try { + Write-Message -Level Verbose -Message "Copying Operator $operatorName" + $sql = $sOperator.Script() | Out-String + Write-Message -Level Debug -Message $sql + $destServer.Query($sql) + + $copyOperatorStatus.Status = "Successful" + $copyOperatorStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + } catch { + $copyOperatorStatus.Status = "Failed" + $copyOperatorStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + Stop-Function -Message "Issue creating operator." -Category InvalidOperation -ErrorRecord $_ -Target $destServer + } + } + } + } + } + end { + Test-DbaDeprecation -DeprecatedOn "1.0.0" -EnableException:$false -Alias Copy-SqlOperator + } +} +function Copy-DbaAgentProxy { + <# + .SYNOPSIS + Copy-DbaAgentProxy migrates proxy accounts from one SQL Server to another. + + .DESCRIPTION + By default, all proxy accounts are copied. The -ProxyAccounts parameter is auto-populated for command-line completion and can be used to copy only specific proxy accounts. + + If the associated credential for the account does not exist on the destination, it will be skipped. If the proxy account already exists on the destination, it will be skipped unless -Force is used. + + .PARAMETER Source + Source SQL Server. You must have sysadmin access and server version must be SQL Server version 2000 or higher. + + .PARAMETER SourceSqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Destination + Destination SQL Server. You must have sysadmin access and the server must be SQL Server 2000 or higher. + + .PARAMETER DestinationSqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER ProxyAccount + Only migrate specific proxy accounts + + .PARAMETER ExcludeProxyAccount + Migrate all proxy accounts except the ones explicitly excluded + + .PARAMETER WhatIf + If this switch is enabled, no actions are performed but informational messages will be displayed that explain what would happen if the command were to run. + + .PARAMETER Confirm + If this switch is enabled, you will be prompted for confirmation before executing any operations that change state. + + .PARAMETER Force + If this switch is enabled, the Operator will be dropped and recreated on Destination. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Migration, Agent + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + Requires: sysadmin access on SQL Servers + + .LINK + https://dbatools.io/Copy-DbaAgentProxy + + .EXAMPLE + PS C:\> Copy-DbaAgentProxy -Source sqlserver2014a -Destination sqlcluster + + Copies all proxy accounts from sqlserver2014a to sqlcluster using Windows credentials. If proxy accounts with the same name exist on sqlcluster, they will be skipped. + + .EXAMPLE + PS C:\> Copy-DbaAgentProxy -Source sqlserver2014a -Destination sqlcluster -ProxyAccount PSProxy -SourceSqlCredential $cred -Force + + Copies only the PSProxy proxy account from sqlserver2014a to sqlcluster using SQL credentials for sqlserver2014a and Windows credentials for sqlcluster. If a proxy account with the same name exists on sqlcluster, it will be dropped and recreated because -Force was used. + + .EXAMPLE + PS C:\> Copy-DbaAgentProxy -Source sqlserver2014a -Destination sqlcluster -WhatIf -Force + + Shows what would happen if the command were executed using force. + + #> + [CmdletBinding(DefaultParameterSetName = "Default", SupportsShouldProcess)] + param ( + [parameter(Mandatory)] + [DbaInstanceParameter]$Source, + [PSCredential]$SourceSqlCredential, + [parameter(Mandatory)] + [DbaInstanceParameter[]]$Destination, + [PSCredential]$DestinationSqlCredential, + [string[]]$ProxyAccount, + [string[]]$ExcludeProxyAccount, + [switch]$Force, + [Alias('Silent')] + [switch]$EnableException + ) + begin { + Test-DbaDeprecation -DeprecatedOn "1.0.0" -Alias Copy-DbaAgentProxyAccount + try { + $sourceServer = Connect-SqlInstance -SqlInstance $Source -SqlCredential $SourceSqlCredential -MinimumVersion 9 + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $Source + return + } + $serverProxyAccounts = $sourceServer.JobServer.ProxyAccounts + if ($ProxyAccount) { + $serverProxyAccounts | Where-Object Name -in $ProxyAccount + } + if ($ExcludeProxyAccount) { + $serverProxyAccounts | Where-Object Name -notin $ProxyAccount + } + } + process { + if (Test-FunctionInterrupt) { return } + foreach ($destinstance in $Destination) { + try { + $destServer = Connect-SqlInstance -SqlInstance $destinstance -SqlCredential $DestinationSqlCredential -MinimumVersion 9 + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $destinstance -Continue + } + + $destProxyAccounts = $destServer.JobServer.ProxyAccounts + + foreach ($account in $serverProxyAccounts) { + $proxyName = $account.Name + + $copyAgentProxyAccountStatus = [pscustomobject]@{ + SourceServer = $sourceServer.Name + DestinationServer = $destServer.Name + Name = $null + Type = "Agent Proxy" + Status = $null + Notes = $null + DateTime = [Sqlcollaborative.Dbatools.Utility.DbaDateTime](Get-Date) + } + + $credentialName = $account.CredentialName + $copyAgentProxyAccountStatus.Name = $proxyName + $copyAgentProxyAccountStatus.Type = "Credential" + + # Proxy accounts rely on Credential accounts + if (-not $CredentialName) { + $copyAgentProxyAccountStatus.Status = "Skipped" + $copyAgentProxyAccountStatus.Notes = "Skipping migration of $proxyName due to misconfigured (empty) credential name" + $copyAgentProxyAccountStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + Write-Message -Level Verbose -Message "Skipping migration of $proxyName due to misconfigured (empty) credential name" + continue + } + + try { + $credentialtest = $destServer.Credentials[$CredentialName] + } catch { + #here to avoid an empty catch + $null = 1 + } + + if ($null -eq $credentialtest) { + $copyAgentProxyAccountStatus.Status = "Skipped" + $copyAgentProxyAccountStatus.Notes = "Associated credential account, $CredentialName, does not exist on $destinstance" + $copyAgentProxyAccountStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + Write-Message -Level Verbose -Message "Associated credential account, $CredentialName, does not exist on $destinstance" + continue + } + + if ($destProxyAccounts.Name -contains $proxyName) { + $copyAgentProxyAccountStatus.Name = $proxyName + $copyAgentProxyAccountStatus.Type = "ProxyAccount" + + if ($force -eq $false) { + $copyAgentProxyAccountStatus.Status = "Skipped" + $copyAgentProxyAccountStatus.Notes = "Already exists on destination" + $copyAgentProxyAccountStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + Stop-Function -Message "Server proxy account $proxyName exists at destination. Use -Force to drop and migrate." -Continue + } else { + if ($Pscmdlet.ShouldProcess($destinstance, "Dropping server proxy account $proxyName and recreating")) { + try { + Write-Message -Level Verbose -Message "Dropping server proxy account $proxyName" + $destServer.JobServer.ProxyAccounts[$proxyName].Drop() + } catch { + $copyAgentProxyAccountStatus.Status = "Failed" + $copyAgentProxyAccountStatus.Notes = "Could not drop" + $copyAgentProxyAccountStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + Stop-Function -Message "Issue dropping proxy account" -Target $proxyName -ErrorRecord $_ -Continue + } + } + } + } + + if ($Pscmdlet.ShouldProcess($destinstance, "Creating server proxy account $proxyName")) { + $copyAgentProxyAccountStatus.Name = $proxyName + $copyAgentProxyAccountStatus.Type = "ProxyAccount" + + try { + Write-Message -Level Verbose -Message "Copying server proxy account $proxyName" + $sql = $account.Script() | Out-String + Write-Message -Level Debug -Message $sql + $destServer.Query($sql) + + # Will fixing this misspelled status cause problems downstream? + $copyAgentProxyAccountStatus.Status = "Successful" + $copyAgentProxyAccountStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + } catch { + $exceptionstring = $_.Exception.InnerException.ToString() + if ($exceptionstring -match 'subsystem') { + $copyAgentProxyAccountStatus.Status = "Skipping" + $copyAgentProxyAccountStatus.Notes = "Failure" + $copyAgentProxyAccountStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + + Write-Message -Level Verbose -Message "One or more subsystems do not exist on the destination server. Skipping that part." + } else { + $copyAgentProxyAccountStatus.Status = "Failed" + $copyAgentProxyAccountStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + + Stop-Function -Message "Issue creating proxy account" -Target $proxyName -ErrorRecord $_ + } + } + } + } + } + } + end { + Test-DbaDeprecation -DeprecatedOn "1.0.0" -EnableException:$false -Alias Copy-SqlProxyAccount + } +} +function Copy-DbaAgentSchedule { + <# + .SYNOPSIS + Copy-DbaAgentSchedule migrates shared job schedules from one SQL Server to another. + + .DESCRIPTION + All shared job schedules are copied. + + If the associated credential for the account does not exist on the destination, it will be skipped. If the shared job schedule already exists on the destination, it will be skipped unless -Force is used. + + .PARAMETER Source + Source SQL Server. You must have sysadmin access and server version must be SQL Server version 2000 or higher. + + .PARAMETER SourceSqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Destination + Destination SQL Server. You must have sysadmin access and the server must be SQL Server 2000 or higher. + + .PARAMETER DestinationSqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER WhatIf + If this switch is enabled, no actions are performed but informational messages will be displayed that explain what would happen if the command were to run. + + .PARAMETER Confirm + If this switch is enabled, you will be prompted for confirmation before executing any operations that change state. + + .PARAMETER Force + If this switch is enabled, the Operator will be dropped and recreated on Destination. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Migration, Agent + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + Requires: sysadmin access on SQL Servers + + .LINK + https://dbatools.io/Copy-DbaAgentSchedule + + .EXAMPLE + PS C:\> Copy-DbaAgentSchedule -Source sqlserver2014a -Destination sqlcluster + + Copies all shared job schedules from sqlserver2014a to sqlcluster using Windows credentials. If shared job schedules with the same name exist on sqlcluster, they will be skipped. + + .EXAMPLE + PS C:\> Copy-DbaAgentSchedule -Source sqlserver2014a -Destination sqlcluster -WhatIf -Force + + Shows what would happen if the command were executed using force. + + #> + [CmdletBinding(DefaultParameterSetName = "Default", SupportsShouldProcess)] + param ( + [parameter(Mandatory)] + [DbaInstanceParameter]$Source, + [PSCredential] + $SourceSqlCredential, + [parameter(Mandatory)] + [DbaInstanceParameter[]]$Destination, + [PSCredential] + $DestinationSqlCredential, + [switch]$Force, + [Alias('Silent')] + [switch]$EnableException + ) + begin { + Test-DbaDeprecation -DeprecatedOn "1.0.0" -Alias Copy-DbaAgentSharedSchedule + try { + $sourceServer = Connect-SqlInstance -SqlInstance $Source -SqlCredential $SourceSqlCredential -MinimumVersion 9 + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $Source + return + } + $serverSchedules = $sourceServer.JobServer.SharedSchedules + } + process { + if (Test-FunctionInterrupt) { return } + foreach ($destinstance in $Destination) { + try { + $destServer = Connect-SqlInstance -SqlInstance $destinstance -SqlCredential $DestinationSqlCredential -MinimumVersion 9 + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $destinstance -Continue + } + + $destSchedules = $destServer.JobServer.SharedSchedules + foreach ($schedule in $serverSchedules) { + $scheduleName = $schedule.Name + $copySharedScheduleStatus = [pscustomobject]@{ + SourceServer = $sourceServer.Name + DestinationServer = $destServer.Name + Type = "Agent Schedule" + Name = $scheduleName + Status = $null + Notes = $null + DateTime = [Sqlcollaborative.Dbatools.Utility.DbaDateTime](Get-Date) + } + + if ($schedules.Length -gt 0 -and $schedules -notcontains $scheduleName) { + continue + } + + if ($destSchedules.Name -contains $scheduleName) { + if ($force -eq $false) { + if ($Pscmdlet.ShouldProcess($destinstance, "Shared job schedule $scheduleName exists at destination. Use -Force to drop and migrate.")) { + $copySharedScheduleStatus.Status = "Skipped" + $copySharedScheduleStatus.Notes = "Already exists on destination" + $copySharedScheduleStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + Write-Message -Level Verbose -Message "Shared job schedule $scheduleName exists at destination. Use -Force to drop and migrate." + continue + } + } else { + if ($Pscmdlet.ShouldProcess($destinstance, "Schedule [$scheduleName] has associated jobs. Skipping.")) { + if ($destServer.JobServer.Jobs.JobSchedules.Name -contains $scheduleName) { + $copySharedScheduleStatus.Status = "Skipped" + $copySharedScheduleStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + Write-Message -Level Verbose -Message "Schedule [$scheduleName] has associated jobs. Skipping." + } + continue + } else { + if ($Pscmdlet.ShouldProcess($destinstance, "Dropping schedule $scheduleName and recreating")) { + try { + Write-Message -Level Verbose -Message "Dropping schedule $scheduleName" + $destServer.JobServer.SharedSchedules[$scheduleName].Drop() + } catch { + $copySharedScheduleStatus.Status = "Failed" + $copySharedScheduleStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + Stop-Function -Message "Issue dropping schedule" -Target $scheduleName -ErrorRecord $_ -Continue + } + } + } + } + } + + if ($Pscmdlet.ShouldProcess($destinstance, "Creating schedule $scheduleName")) { + try { + Write-Message -Level Verbose -Message "Copying schedule $scheduleName" + $sql = $schedule.Script() | Out-String + + Write-Message -Level Debug -Message $sql + $destServer.Query($sql) + + $copySharedScheduleStatus.Status = "Successful" + $copySharedScheduleStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + } catch { + $copySharedScheduleStatus.Status = "Failed" + $copySharedScheduleStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + Stop-Function -Message "Issue creating schedule" -Target $scheduleName -ErrorRecord $_ -Continue + } + } + } + } + } + end { + Test-DbaDeprecation -DeprecatedOn "1.0.0" -EnableException:$false -Alias Copy-SqlSharedSchedule + } +} +function Copy-DbaAgentServer { + <# + .SYNOPSIS + Copy SQL Server Agent from one server to another. + + .DESCRIPTION + A wrapper function that calls the associated Copy command for each of the object types seen in SSMS under SQL Server Agent. This also copies all of the the SQL Agent properties (job history max rows, DBMail profile name, etc.). + + You must have sysadmin access and server version must be SQL Server version 2000 or greater. + + .PARAMETER Source + Source SQL Server. You must have sysadmin access and server version must be SQL Server version 2000 or higher. + + .PARAMETER SourceSqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Destination + Destination SQL Server. You must have sysadmin access and the server must be SQL Server 2000 or higher. + + .PARAMETER DestinationSqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER DisableJobsOnDestination + If this switch is enabled, the jobs will be disabled on Destination after copying. + + .PARAMETER DisableJobsOnSource + If this switch is enabled, the jobs will be disabled on Source after copying. + + .PARAMETER WhatIf + If this switch is enabled, no actions are performed but informational messages will be displayed that explain what would happen if the command were to run. + + .PARAMETER Confirm + If this switch is enabled, you will be prompted for confirmation before executing any operations that change state. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .PARAMETER Force + If this switch is enabled, existing objects on Destination with matching names from Source will be dropped, then copied. + + .NOTES + Tags: Migration, SqlServerAgent, SqlAgent + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + Requires: sysadmin access on SQL Servers + + .LINK + https://dbatools.io/Copy-DbaAgentServer + + .EXAMPLE + PS C:\> Copy-DbaAgentServer -Source sqlserver2014a -Destination sqlcluster + + Copies all job server objects from sqlserver2014a to sqlcluster using Windows credentials for authentication. If job objects with the same name exist on sqlcluster, they will be skipped. + + .EXAMPLE + PS C:\> Copy-DbaAgentServer -Source sqlserver2014a -Destination sqlcluster -SourceSqlCredential $cred + + Copies all job objects from sqlserver2014a to sqlcluster using SQL credentials to authentication to sqlserver2014a and Windows credentials to authenticate to sqlcluster. + + .EXAMPLE + PS C:\> Copy-DbaAgentServer -Source sqlserver2014a -Destination sqlcluster -WhatIf + + Shows what would happen if the command were executed. + + #> + [cmdletbinding(SupportsShouldProcess)] + param ( + [parameter(Mandatory)] + [DbaInstanceParameter]$Source, + [PSCredential]$SourceSqlCredential, + [parameter(Mandatory)] + [DbaInstanceParameter[]]$Destination, + [PSCredential]$DestinationSqlCredential, + [Switch]$DisableJobsOnDestination, + [Switch]$DisableJobsOnSource, + [switch]$Force, + [Alias('Silent')] + [switch]$EnableException + ) + + begin { + try { + $sourceServer = Connect-SqlInstance -SqlInstance $Source -SqlCredential $SourceSqlCredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $Source + return + } + Invoke-SmoCheck -SqlInstance $sourceServer + $sourceAgent = $sourceServer.JobServer + } + process { + if (Test-FunctionInterrupt) { return } + foreach ($destinstance in $Destination) { + try { + $destServer = Connect-SqlInstance -SqlInstance $destinstance -SqlCredential $DestinationSqlCredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $destinstance -Continue + } + Invoke-SmoCheck -SqlInstance $destServer + # All of these support whatif inside of them + Copy-DbaAgentJobCategory -Source $sourceServer -Destination $destServer -Force:$force + + $destServer.JobServer.JobCategories.Refresh() + $destServer.JobServer.OperatorCategories.Refresh() + $destServer.JobServer.AlertCategories.Refresh() + + Copy-DbaAgentOperator -Source $sourceServer -Destination $destServer -Force:$force + $destServer.JobServer.Operators.Refresh() + + Copy-DbaAgentAlert -Source $sourceServer -Destination $destServer -Force:$force -IncludeDefaults + $destServer.JobServer.Alerts.Refresh() + + Copy-DbaAgentProxy -Source $sourceServer -Destination $destServer -Force:$force + $destServer.JobServer.ProxyAccounts.Refresh() + + Copy-DbaAgentSchedule -Source $sourceServer -Destination $destServer -Force:$force + $destServer.JobServer.SharedSchedules.Refresh() + + $destServer.JobServer.Refresh() + $destServer.Refresh() + Copy-DbaAgentJob -Source $sourceServer -Destination $destServer -Force:$force -DisableOnDestination:$DisableJobsOnDestination -DisableOnSource:$DisableJobsOnSource + + # To do + <# + Copy-DbaAgentMasterServer -Source $sourceServer -Destination $destServer -Force:$force + Copy-DbaAgentTargetServer -Source $sourceServer -Destination $destServer -Force:$force + Copy-DbaAgentTargetServerGroup -Source $sourceServer -Destination $destServer -Force:$force + #> + + <# Here are the properties which must be migrated separately #> + $copyAgentPropStatus = [pscustomobject]@{ + SourceServer = $sourceServer.Name + DestinationServer = $destServer.Name + Name = "Server level properties" + Type = "Agent Properties" + Status = $null + Notes = $null + DateTime = [DbaDateTime](Get-Date) + } + + if ($Pscmdlet.ShouldProcess($destinstance, "Copying Agent Properties")) { + try { + Write-Message -Level Verbose -Message "Copying SQL Agent Properties" + $sql = $sourceAgent.Script() | Out-String + $sql = $sql -replace [Regex]::Escape("'$source'"), "'$destinstance'" + $sql = $sql -replace [Regex]::Escape("@errorlog_file="), [Regex]::Escape("--@errorlog_file=") + $sql = $sql -replace [Regex]::Escape("@auto_start="), [Regex]::Escape("--@auto_start=") + Write-Message -Level Debug -Message $sql + $null = $destServer.Query($sql) + + $copyAgentPropStatus.Status = "Successful" + $copyAgentPropStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + } catch { + $message = $_.Exception.InnerException.InnerException.InnerException.Message + if (-not $message) { $message = $_.Exception.Message } + $copyAgentPropStatus.Status = "Failed" + $copyAgentPropStatus.Notes = $message + $copyAgentPropStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + Stop-Function -Message $message -Target $destinstance + } + } + } + } + end { + Test-DbaDeprecation -DeprecatedOn "1.0.0" -EnableException:$false -Alias Copy-SqlServerAgent + Test-DbaDeprecation -DeprecatedOn "1.0.0" -EnableException:$false -Alias Copy-DbaSqlServerAgent + } +} +function Copy-DbaBackupDevice { + <# + .SYNOPSIS + Copies backup devices one by one. Copies both SQL code and the backup file itself. + + .DESCRIPTION + Backups are migrated using Admin shares. If the destination directory does not exist, SQL Server's default backup directory will be used. + + If a backup device with same name exists on destination, it will not be dropped and recreated unless -Force is used. + + .PARAMETER Source + Source SQL Server. You must have sysadmin access and server version must be SQL Server version 2000 or higher. + + .PARAMETER SourceSqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Destination + Destination SQL Server. You must have sysadmin access and the server must be SQL Server 2000 or higher. + + .PARAMETER DestinationSqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER BackupDevice + BackupDevice to be copied. Auto-populated list of devices. If not provided all BackupDevice(s) will be copied. + + .PARAMETER Force + If this switch is enabled, backup device(s) will be dropped and recreated if they already exists on destination. + + .PARAMETER WhatIf + If this switch is enabled, no actions are performed but informational messages will be displayed that explain what would happen if the command were to run. + + .PARAMETER Confirm + If this switch is enabled, you will be prompted for confirmation before executing any operations that change state. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Migration, Backup + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + Requires: sysadmin access on SQL Servers + + .LINK + https://dbatools.io/Copy-DbaBackupDevice + + .EXAMPLE + PS C:\> Copy-DbaBackupDevice -Source sqlserver2014a -Destination sqlcluster + + Copies all server backup devices from sqlserver2014a to sqlcluster using Windows credentials. If backup devices with the same name exist on sqlcluster, they will be skipped. + + .EXAMPLE + PS C:\> Copy-DbaBackupDevice -Source sqlserver2014a -Destination sqlcluster -BackupDevice backup01 -SourceSqlCredential $cred -Force + + Copies only the backup device named backup01 from sqlserver2014a to sqlcluster using SQL credentials for sqlserver2014a and Windows credentials for sqlcluster. If a backup device with the same name exists on sqlcluster, it will be dropped and recreated because -Force was used. + + .EXAMPLE + PS C:\> Copy-DbaBackupDevice -Source sqlserver2014a -Destination sqlcluster -WhatIf -Force + + Shows what would happen if the command were executed using force. + + #> + [CmdletBinding(DefaultParameterSetName = "Default", SupportsShouldProcess)] + param ( + [parameter(Mandatory)] + [DbaInstanceParameter]$Source, + [PSCredential]$SourceSqlCredential, + [parameter(Mandatory)] + [DbaInstanceParameter[]]$Destination, + [PSCredential]$DestinationSqlCredential, + [object[]]$BackupDevice, + [switch]$Force, + [Alias('Silent')] + [switch]$EnableException + ) + begin { + if (-not $script:isWindows) { + Stop-Function -Message "Copy-DbaBackupDevice does not support Linux yet though it looks doable" + return + } + try { + $sourceServer = Connect-SqlInstance -SqlInstance $Source -SqlCredential $SourceSqlCredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $Source + return + } + $serverBackupDevices = $sourceServer.BackupDevices + $sourceNetBios = $Source.ComputerName + } + process { + if (Test-FunctionInterrupt) { return } + foreach ($destinstance in $Destination) { + try { + $destServer = Connect-SqlInstance -SqlInstance $destinstance -SqlCredential $DestinationSqlCredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $destinstance -Continue + } + $destBackupDevices = $destServer.BackupDevices + $destNetBios = $destinstance.ComputerName + + foreach ($currentBackupDevice in $serverBackupDevices) { + $deviceName = $currentBackupDevice.Name + + $copyBackupDeviceStatus = [pscustomobject]@{ + SourceServer = $sourceServer.Name + DestinationServer = $destServer.Name + Name = $deviceName + Type = "Backup Device" + Status = $null + Notes = $null + DateTime = [Sqlcollaborative.Dbatools.Utility.DbaDateTime](Get-Date) + } + + if ($BackupDevice -and $BackupDevice -notcontains $deviceName) { + continue + } + + if ($destBackupDevices.Name -contains $deviceName) { + if ($force -eq $false) { + $copyBackupDeviceStatus.Status = "Skipped" + $copyBackupDeviceStatus.Notes = "Already exists on destination" + $copyBackupDeviceStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + + Write-Message -Level Verbose -Message "backup device $deviceName exists at destination. Use -Force to drop and migrate." + continue + } else { + if ($Pscmdlet.ShouldProcess($destinstance, "Dropping backup device $deviceName")) { + try { + Write-Message -Level Verbose -Message "Dropping backup device $deviceName" + $destServer.BackupDevices[$deviceName].Drop() + } catch { + $copyBackupDeviceStatus.Status = "Failed" + $copyBackupDeviceStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + + Stop-Function -Message "Issue dropping backup device" -Target $deviceName -ErrorRecord $_ -Continue + } + } + } + } + + if ($Pscmdlet.ShouldProcess($destinstance, "Generating SQL code for $deviceName")) { + Write-Message -Level Verbose -Message "Scripting out SQL for $deviceName" + try { + $sql = $currentBackupDevice.Script() | Out-String + $sql = $sql -replace [Regex]::Escape("'$source'"), "'$destinstance'" + } catch { + $copyBackupDeviceStatus.Status = "Failed" + $copyBackupDeviceStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + + Stop-Function -Message "Issue scripting out backup device" -Target $deviceName -ErrorRecord $_ -Continue + } + } + + if ($Pscmdlet.ShouldProcess("console", "Stating that the actual file copy is about to occur")) { + Write-Message -Level Verbose -Message "Preparing to copy actual backup file" + } + + $path = Split-Path $sourceServer.BackupDevices[$deviceName].PhysicalLocation + $destPath = Join-AdminUnc $destNetBios $path + $sourcepath = Join-AdminUnc $sourceNetBios $sourceServer.BackupDevices[$deviceName].PhysicalLocation + + Write-Message -Level Verbose -Message "Checking if directory $destPath exists" + + if ($(Test-DbaPath -SqlInstance $destServer -Path $path) -eq $false) { + $backupDirectory = $destServer.BackupDirectory + $destPath = Join-AdminUnc $destNetBios $backupDirectory + + if ($Pscmdlet.ShouldProcess($destinstance, "Updating create code to use new path")) { + Write-Message -Level Verbose -Message "$path doesn't exist on $destinstance" + Write-Message -Level Verbose -Message "Using default backup directory $backupDirectory" + + try { + Write-Message -Level Verbose -Message "Updating $deviceName to use $backupDirectory" + $sql = $sql -replace [Regex]::Escape($path), $backupDirectory + } catch { + $copyBackupDeviceStatus.Status = "Failed" + $copyBackupDeviceStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + + Stop-Function -Message "Issue updating script of backup device with new path" -Target $deviceName -ErrorRecord $_ -Continue + } + } + } + + if ($Pscmdlet.ShouldProcess($destinstance, "Copying $sourcepath to $destPath using BITSTransfer")) { + try { + Start-BitsTransfer -Source $sourcepath -Destination $destPath -ErrorAction Stop + Write-Message -Level Verbose -Message "Backup device $deviceName successfully copied" + } catch { + $copyBackupDeviceStatus.Status = "Failed" + $copyBackupDeviceStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + + Stop-Function -Message "Issue copying backup device to destination" -Target $deviceName -ErrorRecord $_ -Continue + } + } + + if ($Pscmdlet.ShouldProcess($destinstance, "Adding backup device $deviceName")) { + Write-Message -Level Verbose -Message "Adding backup device $deviceName on $destinstance" + try { + $destServer.Query($sql) + $destServer.BackupDevices.Refresh() + + $copyBackupDeviceStatus.Status = "Successful" + $copyBackupDeviceStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + } catch { + $copyBackupDeviceStatus.Status = "Failed" + $copyBackupDeviceStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + + Stop-Function -Message "Issue adding backup device" -Target $deviceName -ErrorRecord $_ -Continue + } + } + } + } + } + end { + Test-DbaDeprecation -DeprecatedOn "1.0.0" -EnableException:$false -Alias Copy-SqlBackupDevice + } +} +function Copy-DbaCmsRegServer { + <# + .SYNOPSIS + Migrates SQL Server Central Management groups and server instances from one SQL Server to another. + + .DESCRIPTION + Copy-DbaCmsRegServer copies all groups, subgroups, and server instances from one SQL Server to another. + + .PARAMETER Source + Source SQL Server. You must have sysadmin access and server version must be SQL Server version 2000 or higher. + + .PARAMETER SourceSqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Destination + Destination SQL Server. You must have sysadmin access and the server must be SQL Server 2000 or higher. + + .PARAMETER DestinationSqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Group + This is an auto-populated array that contains your Central Management Server top-level groups on Source. You can specify one, many or none. + + If Group is not specified, all groups in your Central Management Server will be copied. + + .PARAMETER SwitchServerName + If this switch is enabled, all instance names will be changed from Source to Destination. + + Central Management Server does not allow you to add a shared registered server with the same name as the Configuration Server. + + .PARAMETER Force + If this switch is enabled, group(s) will be dropped and recreated if they already exists on destination. + + .PARAMETER WhatIf + If this switch is enabled, no actions are performed but informational messages will be displayed that explain what would happen if the command were to run. + + .PARAMETER Confirm + If this switch is enabled, you will be prompted for confirmation before executing any operations that change state. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Migration + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + Requires: sysadmin access on SQL Servers + + .LINK + https://dbatools.io/Copy-DbaCmsRegServer + + .EXAMPLE + PS C:\> Copy-DbaCmsRegServer -Source sqlserver2014a -Destination sqlcluster + + All groups, subgroups, and server instances are copied from sqlserver2014a CMS to sqlcluster CMS. + + .EXAMPLE + PS C:\> Copy-DbaCmsRegServer -Source sqlserver2014a -Destination sqlcluster -Group Group1,Group3 + + Top-level groups Group1 and Group3 along with their subgroups and server instances are copied from sqlserver to sqlcluster. + + .EXAMPLE + PS C:\> Copy-DbaCmsRegServer -Source sqlserver2014a -Destination sqlcluster -Group Group1,Group3 -SwitchServerName -SourceSqlCredential $SourceSqlCredential -DestinationSqlCredential $DestinationSqlCredential + + Top-level groups Group1 and Group3 along with their subgroups and server instances are copied from sqlserver to sqlcluster. When adding sql instances to sqlcluster, if the server name of the migrating instance is "sqlcluster", it will be switched to "sqlserver". + + If SwitchServerName is not specified, "sqlcluster" will be skipped. + + #> + [CmdletBinding(DefaultParameterSetName = "Default", SupportsShouldProcess)] + param ( + [parameter(Mandatory)] + [DbaInstanceParameter]$Source, + [PSCredential]$SourceSqlCredential, + [parameter(Mandatory)] + [DbaInstanceParameter[]]$Destination, + [PSCredential]$DestinationSqlCredential, + [Alias('CMSGroup')] + [string[]]$Group, + [switch]$SwitchServerName, + [switch]$Force, + [switch]$EnableException + ) + begin { + if (-not $script:isWindows) { + Stop-Function -Message "Copy-DbaCmsRegServer does not support Linux - we're still waiting for the Core SMOs from Microsoft" + return + } + + Test-DbaDeprecation -DeprecatedOn "1.0.0" -Alias Copy-DbaCentralManagementServer + function Invoke-ParseServerGroup { + [cmdletbinding()] + param ( + $sourceGroup, + $destinationGroup, + $SwitchServerName + ) + if ($destinationGroup.Name -eq "DatabaseEngineServerGroup" -and $sourceGroup.Name -ne "DatabaseEngineServerGroup") { + $currentServerGroup = $destinationGroup + $groupName = $sourceGroup.Name + $destinationGroup = $destinationGroup.ServerGroups[$groupName] + + $copyDestinationGroupStatus = [pscustomobject]@{ + SourceServer = $sourceServer.Name + DestinationServer = $destServer.Name + Name = $groupName + Type = "CMS Destination Group" + Status = $null + Notes = $null + DateTime = [Sqlcollaborative.Dbatools.Utility.DbaDateTime](Get-Date) + } + + if ($null -ne $destinationGroup) { + + if ($force -eq $false) { + if ($Pscmdlet.ShouldProcess($destinstance, "Checking to see if $groupName exists")) { + $copyDestinationGroupStatus.Status = "Skipped" + $copyDestinationGroupStatus.Notes = "Already exists on destination" + $copyDestinationGroupStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + Write-Message -Level Verbose -Message "Destination group $groupName exists at destination. Use -Force to drop and migrate." + } + continue + } + if ($Pscmdlet.ShouldProcess($destinstance, "Dropping group $groupName")) { + try { + Write-Message -Level Verbose -Message "Dropping group $groupName" + $destinationGroup.Drop() + } catch { + $copyDestinationGroupStatus.Status = "Failed" + $copyDestinationGroupStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + + Stop-Function -Message "Issue dropping group" -Target $groupName -ErrorRecord $_ -Continue + } + } + } + + if ($Pscmdlet.ShouldProcess($destinstance, "Creating group $groupName")) { + Write-Message -Level Verbose -Message "Creating group $($sourceGroup.Name)" + $destinationGroup = New-Object Microsoft.SqlServer.Management.RegisteredServers.ServerGroup($currentServerGroup, $sourceGroup.Name) + $destinationGroup.Create() + + $copyDestinationGroupStatus.Status = "Successful" + $copyDestinationGroupStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + } + } + + # Add Servers + foreach ($instance in $sourceGroup.RegisteredServers) { + $instanceName = $instance.Name + $serverName = $instance.ServerName + + $copyInstanceStatus = [pscustomobject]@{ + SourceServer = $sourceServer.Name + DestinationServer = $destServer.Name + Name = $instanceName + Type = "CMS Instance" + Status = $null + Notes = $null + DateTime = [Sqlcollaborative.Dbatools.Utility.DbaDateTime](Get-Date) + } + + if ($serverName.ToLower() -eq $toCmStore.DomainInstanceName.ToLower()) { + if ($Pscmdlet.ShouldProcess($destinstance, "Checking to see if server is the CMS equals current server name")) { + if ($SwitchServerName) { + $serverName = $fromCmStore.DomainInstanceName + $instanceName = $fromCmStore.DomainInstanceName + Write-Message -Level Verbose -Message "SwitchServerName was used and new CMS equals current server name. $($toCmStore.DomainInstanceName.ToLower()) changed to $serverName." + } else { + $copyInstanceStatus.Status = "Skipped" + $copyInstanceStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + + Write-Message -Level Verbose -Message "$serverName is Central Management Server. Add prohibited. Skipping." + continue + } + } + } + + if ($destinationGroup.RegisteredServers.Name -contains $instanceName) { + + if ($force -eq $false) { + if ($Pscmdlet.ShouldProcess($destinstance, "Checking to see if $instanceName in $groupName exists")) { + $copyInstanceStatus.Status = "Skipped" + $copyInstanceStatus.Notes = "Already exists on destination" + $copyInstanceStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + + Write-Message -Level Verbose -Message "Instance $instanceName exists in group $groupName at destination. Use -Force to drop and migrate." + } + continue + } + + if ($Pscmdlet.ShouldProcess($destinstance, "Dropping instance $instanceName from $groupName and recreating")) { + try { + Write-Message -Level Verbose -Message "Dropping instance $instance from $groupName" + $destinationGroup.RegisteredServers[$instanceName].Drop() + } catch { + $copyInstanceStatus.Status = "Failed" + $copyInstanceStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + + Stop-Function -Message "Issue dropping instance from group" -Target $instanceName -ErrorRecord $_ -Continue + } + } + } + + if ($Pscmdlet.ShouldProcess($destinstance, "Copying $instanceName")) { + $newServer = New-Object Microsoft.SqlServer.Management.RegisteredServers.RegisteredServer($destinationGroup, $instanceName) + $newServer.ServerName = $serverName + $newServer.Description = $instance.Description + + if ($serverName -ne $fromCmStore.DomainInstanceName) { + $newServer.SecureConnectionString = $instance.SecureConnectionString.ToString() + $newServer.ConnectionString = $instance.ConnectionString.ToString() + } + + try { + $newServer.Create() + + $copyInstanceStatus.Status = "Successful" + $copyInstanceStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + } catch { + $copyInstanceStatus.Status = "Failed" + $copyInstanceStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + if ($_.Exception -match "same name") { + Stop-Function -Message "Could not add Switched Server instance name." -Target $instanceName -ErrorRecord $_ -Continue + } else { + Stop-Function -Message "Failed to add $serverName" -Target $instanceName -ErrorRecord $_ -Continue + } + } + Write-Message -Level Verbose -Message "Added Server $serverName as $instanceName to $($destinationGroup.Name)" + } + } + + # Add Groups + foreach ($fromSubGroup in $sourceGroup.ServerGroups) { + $fromSubGroupName = $fromSubGroup.Name + $toSubGroup = $destinationGroup.ServerGroups[$fromSubGroupName] + + $copyGroupStatus = [pscustomobject]@{ + SourceServer = $sourceServer.Name + DestinationServer = $destServer.Name + Name = $fromSubGroupName + Type = "CMS Group" + Status = $null + Notes = $null + DateTime = [Sqlcollaborative.Dbatools.Utility.DbaDateTime](Get-Date) + } + + if ($null -ne $toSubGroup) { + if ($force -eq $false) { + if ($Pscmdlet.ShouldProcess($destinstance, "Checking to see if subgroup $fromSubGroupName exists")) { + $copyGroupStatus.Status = "Skipped" + $copyGroupStatus.Notes = "Already exists on destination" + $copyGroupStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + + Write-Message -Level Verbose -Message "Subgroup $fromSubGroupName exists at destination. Use -Force to drop and migrate." + } + continue + } + + if ($Pscmdlet.ShouldProcess($destinstance, "Dropping subgroup $fromSubGroupName recreating")) { + try { + Write-Message -Level Verbose -Message "Dropping subgroup $fromSubGroupName" + $toSubGroup.Drop() + } catch { + $copyGroupStatus.Status = "Failed" + $copyGroupStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + + Stop-Function -Message "Issue dropping subgroup" -Target $toSubGroup -ErrorRecord $_ -Continue + } + } + } + + if ($Pscmdlet.ShouldProcess($destinstance, "Creating group $($fromSubGroup.Name)")) { + Write-Message -Level Verbose -Message "Creating group $($fromSubGroup.Name)" + $toSubGroup = New-Object Microsoft.SqlServer.Management.RegisteredServers.ServerGroup($destinationGroup, $fromSubGroup.Name) + $toSubGroup.create() + + $copyGroupStatus.Status = "Successful" + $copyGroupStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + } + + Invoke-ParseServerGroup -sourceGroup $fromSubGroup -destinationgroup $toSubGroup -SwitchServerName $SwitchServerName + } + } + + try { + $sourceServer = Connect-SqlInstance -SqlInstance $Source -SqlCredential $SourceSqlCredential -MinimumVersion 10 + $fromCmStore = Get-DbaCmsRegServerStore -SqlInstance $sourceServer + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $Source + return + } + } + + process { + if (Test-FunctionInterrupt) { return } + foreach ($destinstance in $Destination) { + try { + $destServer = Connect-SqlInstance -SqlInstance $destinstance -SqlCredential $DestinationSqlCredential -MinimumVersion 10 + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $destinstance -Continue + } + $toCmStore = Get-DbaCmsRegServerStore -SqlInstance $destServer + + $stores = $fromCmStore.DatabaseEngineServerGroup + if ($Group) { + $stores = @(); + foreach ($groupName in $Group) { + $stores += $fromCmStore.DatabaseEngineServerGroup.ServerGroups[$groupName] + } + } + + foreach ($store in $stores) { + Invoke-ParseServerGroup -sourceGroup $store -destinationgroup $toCmStore.DatabaseEngineServerGroup -SwitchServerName $SwitchServerName + } + } + } + end { + Test-DbaDeprecation -DeprecatedOn "1.0.0" -EnableException:$false -Alias Copy-SqlCentralManagementServer + } +} +function Copy-DbaCredential { + <# + .SYNOPSIS + Copy-DbaCredential migrates SQL Server Credentials from one SQL Server to another while maintaining Credential passwords. + + .DESCRIPTION + By using password decryption techniques provided by Antti Rantasaari (NetSPI, 2014), this script migrates SQL Server Credentials from one server to another while maintaining username and password. + + Credit: https://blog.netspi.com/decrypting-mssql-database-link-server-passwords/ + + .PARAMETER Source + Source SQL Server. You must have sysadmin access and server version must be SQL Server version 2000 or higher. + + .PARAMETER SourceSqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Destination + Destination SQL Server. You must have sysadmin access and the server must be SQL Server 2000 or higher. + + .PARAMETER DestinationSqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Credential + This command requires access to the Windows OS via PowerShell remoting. Use this credential to connect to Windows using alternative credentials. + + .PARAMETER Name + Only include specific names + Note: if spaces exist in the credential name, you will have to type "" or '' around it. + + .PARAMETER ExcludeName + Excluded credential names + + .PARAMETER Identity + Only include specific identities + Note: if spaces exist in the credential identity, you will have to type "" or '' around it. + + .PARAMETER ExcludeIdentity + Excluded identities + + .PARAMETER Force + If this switch is enabled, the Credential will be dropped and recreated if it already exists on Destination. + + .PARAMETER WhatIf + If this switch is enabled, no actions are performed but informational messages will be displayed that explain what would happen if the command were to run. + + .PARAMETER Confirm + If this switch is enabled, you will be prompted for confirmation before executing any operations that change state. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: WSMan, Migration + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + Requires: + - PowerShell Version 3.0 + - Administrator access on Windows + - sysadmin access on SQL Server. + - DAC access enabled for local (default) + + .LINK + https://dbatools.io/Copy-DbaCredential + + .EXAMPLE + PS C:\> Copy-DbaCredential -Source sqlserver2014a -Destination sqlcluster + + Copies all SQL Server Credentials on sqlserver2014a to sqlcluster. If Credentials exist on destination, they will be skipped. + + .EXAMPLE + PS C:\> Copy-DbaCredential -Source sqlserver2014a -Destination sqlcluster -Name "PowerShell Proxy Account" -Force + + Copies over one SQL Server Credential (PowerShell Proxy Account) from sqlserver to sqlcluster. If the Credential already exists on the destination, it will be dropped and recreated. + + #> + [CmdletBinding(SupportsShouldProcess)] + param ( + [parameter(Mandatory)] + [DbaInstanceParameter]$Source, + [PSCredential] + $SourceSqlCredential, + [PSCredential] + $Credential, + [parameter(Mandatory)] + [DbaInstanceParameter[]]$Destination, + [PSCredential]$DestinationSqlCredential, + [string[]]$Name, + [string[]]$ExcludeName, + [Alias('CredentialIdentity')] + [string[]]$Identity, + [Alias('ExcludeCredentialIdentity')] + [string[]]$ExcludeIdentity, + [switch]$Force, + [Alias('Silent')] + [switch]$EnableException + ) + + begin { + if (-not $script:isWindows) { + Stop-Function -Message "Copy-DbaCredential is only supported on Windows" + return + } + $null = Test-ElevationRequirement -ComputerName $Source.ComputerName + + function Copy-Credential { + <# + .SYNOPSIS + Copies Credentials from one server to another using a combination of SMO's .Script() and manual password updates. + + .OUTPUT + System.Data.DataTable + #> + [Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSAvoidUsingPlainTextForPassword", "", Justification = "For Credentials")] + param ( + [string[]]$Credentials, + [bool]$Force + ) + + Write-Message -Level Verbose -Message "Collecting Credential logins and passwords on $($sourceServer.Name)" + $sourceCredentials = Get-DecryptedObject -SqlInstance $sourceServer -Type Credential + $credentialList = Get-DbaCredential -SqlInstance $sourceServer -Name $Name -ExcludeName $ExcludeName -Identity $Identity -ExcludeIdentity $ExcludeIdentity + + Write-Message -Level Verbose -Message "Starting migration" + foreach ($credential in $credentialList) { + $destServer.Credentials.Refresh() + $credentialName = $credential.Name + + $copyCredentialStatus = [pscustomobject]@{ + SourceServer = $sourceServer.Name + DestinationServer = $destServer.Name + Type = "Credential" + Name = $credentialName + Status = $null + Notes = $null + DateTime = [DbaDateTime](Get-Date) + } + + if ($null -ne $destServer.Credentials[$credentialName]) { + if (!$force) { + $copyCredentialStatus.Status = "Skipping" + $copyCredentialStatus.Notes = "Already exists on destination" + $copyCredentialStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + + Write-Message -Level Verbose -Message "$credentialName exists $($destServer.Name). Skipping." + continue + } else { + if ($Pscmdlet.ShouldProcess($destinstance.Name, "Dropping $identity")) { + $destServer.Credentials[$credentialName].Drop() + $destServer.Credentials.Refresh() + } + } + } + + Write-Message -Level Verbose -Message "Attempting to migrate $credentialName" + try { + $currentCred = $sourceCredentials | Where-Object { $_.Name -eq "[$credentialName]" } + $sqlcredentialName = $credentialName.Replace("'", "''") + $identity = $currentCred.Identity.Replace("'", "''") + $password = $currentCred.Password.Replace("'", "''") + if ($Pscmdlet.ShouldProcess($destinstance.Name, "Copying $identity")) { + $destServer.Query("CREATE CREDENTIAL [$sqlcredentialName] WITH IDENTITY = N'$identity', SECRET = N'$password'") + $destServer.Credentials.Refresh() + Write-Message -Level Verbose -Message "$credentialName successfully copied" + } + + $copyCredentialStatus.Status = "Successful" + $copyCredentialStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + } catch { + $copyCredentialStatus.Status = "Failed" + $copyCredentialStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + + Stop-Function -Message "Error creating credential" -Target $credentialName -ErrorRecord $_ + } + } + } + + try { + $sourceServer = Connect-SqlInstance -SqlInstance $Source -SqlCredential $SourceSqlCredential -MinimumVersion 9 + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance + return + } + + if ($null -ne $SourceSqlCredential.Username) { + Write-Message -Level Verbose -Message "You are using SQL credentials and this script requires Windows admin access to the $Source server. Trying anyway." + } + + $sourceNetBios = Resolve-NetBiosName $sourceServer + + Invoke-SmoCheck -SqlInstance $sourceServer + + Write-Message -Level Verbose -Message "Checking if Remote Registry is enabled on $source" + try { + Invoke-Command2 -ComputerName $sourceNetBios -Credential $credential -ScriptBlock { Get-ItemProperty -Path "HKLM:\SOFTWARE\" } + } catch { + Stop-Function -Message "Can't connect to registry on $source" -Target $sourceNetBios -ErrorRecord $_ + return + } + } + process { + if (Test-FunctionInterrupt) { return } + + foreach ($destinstance in $Destination) { + try { + $destServer = Connect-SqlInstance -SqlInstance $destinstance -SqlCredential $DestinationSqlCredential -MinimumVersion 9 + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $destinstance -Continue + } + Invoke-SmoCheck -SqlInstance $destServer + + Copy-Credential $credentials -force:$force + } + } + end { + Test-DbaDeprecation -DeprecatedOn "1.0.0" -EnableException:$false -Alias Copy-SqlCredential + } +} +function Copy-DbaCustomError { + <# + .SYNOPSIS + Copy-DbaCustomError migrates custom errors (user defined messages), by the custom error ID, from one SQL Server to another. + + .DESCRIPTION + By default, all custom errors are copied. The -CustomError parameter is auto-populated for command-line completion and can be used to copy only specific custom errors. + + If the custom error already exists on the destination, it will be skipped unless -Force is used. The us_english version must be created first. If you drop the us_english version, all the other languages will be dropped for that specific ID as well. + + .PARAMETER Source + Source SQL Server. You must have sysadmin access and server version must be SQL Server version 2000 or higher. + + .PARAMETER SourceSqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Destination + Destination SQL Server. You must have sysadmin access and the server must be SQL Server 2000 or higher. + + .PARAMETER DestinationSqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER CustomError + The custom error(s) to process. This list is auto-populated from the server. If unspecified, all custom errors will be processed. + + .PARAMETER ExcludeCustomError + The custom error(s) to exclude. This list is auto-populated from the server. + + .PARAMETER WhatIf + If this switch is enabled, no actions are performed but informational messages will be displayed that explain what would happen if the command were to run. + + .PARAMETER Confirm + If this switch is enabled, you will be prompted for confirmation before executing any operations that change state. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .PARAMETER Force + If this switch is enabled, the custom error will be dropped and recreated if it already exists on Destination. + + .NOTES + Tags: Migration, CustomError + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + Requires: sysadmin access on SQL Servers + + .LINK + https://dbatools.io/Copy-DbaCustomError + + .EXAMPLE + PS C:\> Copy-DbaCustomError -Source sqlserver2014a -Destination sqlcluster + + Copies all server custom errors from sqlserver2014a to sqlcluster using Windows credentials. If custom errors with the same name exist on sqlcluster, they will be skipped. + + .EXAMPLE + PS C:\> Copy-DbaCustomError -Source sqlserver2014a -SourceSqlCredential $scred -Destination sqlcluster -DestinationSqlCredential $dcred -CustomError 60000 -Force + + Copies only the custom error with ID number 60000 from sqlserver2014a to sqlcluster using SQL credentials for sqlserver2014a and Windows credentials for sqlcluster. If a custom error with the same name exists on sqlcluster, it will be updated because -Force was used. + + .EXAMPLE + PS C:\> Copy-DbaCustomError -Source sqlserver2014a -Destination sqlcluster -ExcludeCustomError 60000 -Force + + Copies all the custom errors found on sqlserver2014a except the custom error with ID number 60000 to sqlcluster. If a custom error with the same name exists on sqlcluster, it will be updated because -Force was used. + + .EXAMPLE + PS C:\> Copy-DbaCustomError -Source sqlserver2014a -Destination sqlcluster -WhatIf -Force + + Shows what would happen if the command were executed using force. + + #> + [CmdletBinding(DefaultParameterSetName = "Default", SupportsShouldProcess)] + param ( + [parameter(Mandatory)] + [DbaInstanceParameter]$Source, + [PSCredential] + $SourceSqlCredential, + [parameter(Mandatory)] + [DbaInstanceParameter[]]$Destination, + [PSCredential] + $DestinationSqlCredential, + [object[]]$CustomError, + [object[]]$ExcludeCustomError, + [switch]$Force, + [Alias('Silent')] + [switch]$EnableException + ) + + begin { + try { + $sourceServer = Connect-SqlInstance -SqlInstance $Source -SqlCredential $SourceSqlCredential -MinimumVersion 9 + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $Source + return + } + $orderedCustomErrors = @($sourceServer.UserDefinedMessages | Where-Object Language -eq "us_english") + $orderedCustomErrors += $sourceServer.UserDefinedMessages | Where-Object Language -ne "us_english" + } + process { + if (Test-FunctionInterrupt) { return } + foreach ($destinstance in $Destination) { + try { + $destServer = Connect-SqlInstance -SqlInstance $destinstance -SqlCredential $DestinationSqlCredential -MinimumVersion 9 + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $destinstance -Continue + } + # US has to go first + $destCustomErrors = $destServer.UserDefinedMessages + + foreach ($currentCustomError in $orderedCustomErrors) { + $customErrorId = $currentCustomError.ID + $language = $currentCustomError.Language.ToString() + + $copyCustomErrorStatus = [pscustomobject]@{ + SourceServer = $sourceServer.Name + DestinationServer = $destServer.Name + Type = "Custom error" + Name = $currentCustomError + Status = $null + Notes = $null + DateTime = [DbaDateTime](Get-Date) + } + + if ($CustomError -and ($customErrorId -notin $CustomError -or $customErrorId -in $ExcludeCustomError)) { + continue + } + + if ($destCustomErrors.ID -contains $customErrorId) { + if ($force -eq $false) { + $copyCustomErrorStatus.Status = "Skipped" + $copyCustomErrorStatus.Notes = "Already exists on destination" + $copyCustomErrorStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + + Write-Message -Level Verbose -Message "Custom error $customErrorId $language exists at destination. Use -Force to drop and migrate." + continue + } else { + If ($Pscmdlet.ShouldProcess($destinstance, "Dropping custom error $customErrorId $language and recreating")) { + try { + Write-Message -Level Verbose -Message "Dropping custom error $customErrorId (drops all languages for custom error $customErrorId)" + $destServer.UserDefinedMessages[$customErrorId, $language].Drop() + } catch { + $copyCustomErrorStatus.Status = "Failed" + $copyCustomErrorStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + + Stop-Function -Message "Issue dropping custom error" -Target $customErrorId -ErrorRecord $_ -Continue + } + } + } + } + + if ($Pscmdlet.ShouldProcess($destinstance, "Creating custom error $customErrorId $language")) { + try { + Write-Message -Level Verbose -Message "Copying custom error $customErrorId $language" + $sql = $currentCustomError.Script() | Out-String + Write-Message -Level Debug -Message $sql + $destServer.Query($sql) + + $copyCustomErrorStatus.Status = "Successful" + $copyCustomErrorStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + } catch { + $copyCustomErrorStatus.Status = "Failed" + $copyCustomErrorStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + + Stop-Function -Message "Issue creating custom error" -Target $customErrorId -ErrorRecord $_ + } + } + } + } + } + end { + Test-DbaDeprecation -DeprecatedOn "1.0.0" -EnableException:$false -Alias Copy-SqlCustomError + } +} +function Copy-DbaDatabase { + <# + .SYNOPSIS + Migrates SQL Server databases from one SQL Server to another. + + .DESCRIPTION + This script provides the ability to migrate databases using detach/copy/attach or backup/restore. This script works with named instances, clusters and SQL Server Express Edition. + + By default, databases will be migrated to the destination SQL Server's default data and log directories. You can override this by specifying -ReuseSourceFolderStructure. Filestreams and filegroups are also migrated. Safety is emphasized. + + If you are experiencing issues with Copy-DbaDatabase, please use Backup-DbaDatabase | Restore-DbaDatabase instead. + + .PARAMETER Source + Source SQL Server. + + .PARAMETER SourceSqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Destination + Destination SQL Server. You may specify multiple servers. + + Note that when using -BackupRestore with multiple servers, the backup will only be performed once and backups will be deleted at the end (if you didn't specify -NoBackupCleanup). + + When using -DetachAttach with multiple servers, -Reattach must be specified. + + .PARAMETER DestinationSqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Database + Migrates only specified databases. This list is auto-populated from the server for tab completion. Multiple databases may be specified as a collection. + + .PARAMETER ExcludeDatabase + Excludes specified databases when performing -AllDatabases migrations. This list is auto-populated from the Source for tab completion. + + .PARAMETER AllDatabases + If this switch is enabled, all user databases will be migrated. System and support databases will not be migrated. Requires -BackupRestore or -DetachAttach. + + .PARAMETER BackupRestore + If this switch is enabled, the copy-only backup and restore method will be used to migrate the database(s). This method requires that you specify -SharedPath in a valid UNC format (\\server\share). + + Backups will be immediately deleted after use unless -NoBackupCleanup is specified. + + .PARAMETER SharedPath + Specifies the network location for the backup files. The SQL Server service accounts must have read/write permission on this path. + + .PARAMETER WithReplace + If this switch is enabled, the restore is executed with WITH REPLACE. + + .PARAMETER NoRecovery + If this switch is enabled, the restore is executed with WITH NORECOVERY. Ideal for staging. + + .PARAMETER NoBackupCleanup + If this switch is enabled, backups generated by this cmdlet will not be deleted after they are restored. The default behavior is to delete these backups. + + .PARAMETER NumberFiles + Number of files to split the backup. Default is 3. + + .PARAMETER DetachAttach + If this switch is enabled, the detach/copy/attach method is used to perform database migrations. No files are deleted on Source. If Destination attachment fails, the Source database will be reattached. File copies are performed over administrative shares (\\server\x$\mssql) using BITS. If a database is being mirrored, the mirror will be broken prior to migration. + + .PARAMETER Reattach + If this switch is enabled, all databases are reattached to Source after DetachAttach migration. + + .PARAMETER SetSourceReadOnly + If this switch is enabled, all migrated databases are set to ReadOnly on Source prior to detach/attach & backup/restore. + + If -Reattach is used, databases are set to read-only after reattaching. + + .PARAMETER ReuseSourceFolderStructure + If this switch is enabled, databases will be migrated to a data and log directory structure on Destination mirroring that used on Source. By default, the default data and log directories for Destination will be used when the databases are migrated. + + The structure on Source will be kept exactly, so consider this if you're migrating between different versions and use part of Microsoft's default Sql structure (MSSql12.INSTANCE, etc) + + To reuse Destination folder structure, use the -WithReplace switch. + + .PARAMETER IncludeSupportDbs + If this switch is enabled, ReportServer, ReportServerTempDb, SSISDB, and distribution databases will be copied if they exist on Source. A log file named $SOURCE-$destinstance-$date-Sqls.csv will be written to the current directory. + + Use of this switch requires -BackupRestore or -DetachAttach as well. + + .PARAMETER InputObject + Enables piped input from Get-DbaDatabase + + .PARAMETER UseLastBackup + Use the last full, diff and logs instead of performing backups. Note that the backups must exist in a location accessible by all destination servers, such a network share. + + .PARAMETER Continue + If specified, will to attempt to restore transaction log backups on top of existing database(s) in Recovering or Standby states. Only usable with -UseLastBackup + + .PARAMETER NoCopyOnly + If this switch is enabled, backups will be taken without COPY_ONLY. This will break the LSN backup chain, which will interfere with the restore chain of the database. + + By default this switch is disabled, so backups will be taken with COPY_ONLY. This will preserve the LSN backup chain. + + For more details please refer to this MSDN article - https://msdn.microsoft.com/en-us/library/ms191495.aspx + + .PARAMETER NewName + If a single database is being copied, this will be used to rename the database during the copy process. Any occurrence of the original database name in the physical file names will be replaced with NewName + If specified with multiple databases a warning will be raised and the copy stopped + + This option is mutually exclusive of Prefix + + .PARAMETER Prefix + All copied database names and physical files will be prefixed with this string + + This option is mutually exclusive of NewName + + .PARAMETER SetSourceOffline + If this switch is enabled, the Source database will be set to Offline after being copied. + + .PARAMETER WhatIf + If this switch is enabled, no actions are performed but informational messages will be displayed that explain what would happen if the command were to run. + + .PARAMETER Confirm + If this switch is enabled, you will be prompted for confirmation before executing any operations that change state. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .PARAMETER Force + If this switch is enabled, existing databases on Destination with matching names from Source will be dropped. + If using -DetachReattach, mirrors will be broken and the database(s) dropped from Availability Groups. + If using -SetSourceReadonly, this will instantly roll back any open transactions that may be stopping the process. + + .NOTES + Tags: Migration, Backup, Restore + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + Requires: sysadmin access on SQL Servers + + Limitations: + - Doesn't cover what it doesn't cover (replication, certificates, etc) + - SQL Server 2000 databases cannot be directly migrated to SQL Server 2012 and above. + - Logins within SQL Server 2012 and above logins cannot be migrated to SQL Server 2008 R2 and below. + + .LINK + https://dbatools.io/Copy-DbaDatabase + + .EXAMPLE + PS C:\> Copy-DbaDatabase -Source sql2014a -Destination sql2014b -Database TestDB -BackupRestore -SharedPath \\fileshare\sql\migration + + Migrates a single user database TestDB using Backup and restore from instance sql2014a to sql2014b. Backup files are stored in \\fileshare\sql\migration. + + .EXAMPLE + PS C:\> Copy-DbaDatabase -Source sql2012 -Destination sql2014, sql2016 -DetachAttach -Reattach + + Databases will be migrated from sql2012 to both sql2014 and sql2016 using the detach/copy files/attach method.The following will be performed: kick all users out of the database, detach all data/log files, move files across the network over an admin share (\\SqlSERVER\M$\MSSql...), attach file on destination server, reattach at source. If the database files (*.mdf, *.ndf, *.ldf) on *destination* exist and aren't in use, they will be overwritten. + + .EXAMPLE + PS C:\> Copy-DbaDatabase -Source sql2014a -Destination sqlcluster, sql2016 -BackupRestore -UseLastBackup -Force + + Migrates all user databases to sqlcluster and sql2016 using the last Full, Diff and Log backups from sql204a. If the databases exists on the destinations, they will be dropped prior to attach. + + Note that the backups must exist in a location accessible by all destination servers, such a network share. + + .EXAMPLE + PS C:\> Copy-DbaDatabase -Source sql2014a -Destination sqlcluster -ExcludeDatabase Northwind, pubs -IncludeSupportDbs -Force -BackupRestore -SharedPath \\fileshare\sql\migration + + Migrates all user databases except for Northwind and pubs by using backup/restore (copy-only). Backup files are stored in \\fileshare\sql\migration. If the database exists on the destination, it will be dropped prior to attach. + + It also includes the support databases (ReportServer, ReportServerTempDb, distribution). + + #> + [CmdletBinding(DefaultParameterSetName = "DbBackup", SupportsShouldProcess)] + [Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSUseOutputTypeCorrectly", "", Justification = "PSSA Rule Ignored by BOH")] + param ( + [DbaInstanceParameter]$Source, + [PSCredential]$SourceSqlCredential, + [parameter(Mandatory)] + [DbaInstanceParameter[]]$Destination, + [PSCredential]$DestinationSqlCredential, + [Alias("Databases")] + [object[]]$Database, + [object[]]$ExcludeDatabase, + [Alias("All")] + [parameter(ParameterSetName = "DbBackup")] + [parameter(ParameterSetName = "DbAttachDetach")] + [switch]$AllDatabases, + [parameter(Mandatory, ParameterSetName = "DbBackup")] + [switch]$BackupRestore, + [Alias("NetworkShare")] + [parameter(ParameterSetName = "DbBackup", + HelpMessage = "Specify a valid network share in the format \\server\share that can be accessed by your account and the SQL Server service accounts for both Source and Destination.")] + [string]$SharedPath, + [parameter(ParameterSetName = "DbBackup")] + [switch]$WithReplace, + [parameter(ParameterSetName = "DbBackup")] + [switch]$NoRecovery, + [parameter(ParameterSetName = "DbBackup")] + [switch]$NoBackupCleanup, + [parameter(ParameterSetName = "DbBackup")] + [ValidateRange(1, 64)] + [int]$NumberFiles = 3, + [parameter(Mandatory, ParameterSetName = "DbAttachDetach")] + [switch]$DetachAttach, + [parameter(ParameterSetName = "DbAttachDetach")] + [switch]$Reattach, + [parameter(ParameterSetName = "DbBackup")] + [parameter(ParameterSetName = "DbAttachDetach")] + [switch]$SetSourceReadOnly, + [Alias("ReuseFolderStructure")] + [parameter(ParameterSetName = "DbBackup")] + [parameter(ParameterSetName = "DbAttachDetach")] + [switch]$ReuseSourceFolderStructure, + [parameter(ParameterSetName = "DbBackup")] + [parameter(ParameterSetName = "DbAttachDetach")] + [switch]$IncludeSupportDbs, + [parameter(ParameterSetName = "DbBackup")] + [switch]$UseLastBackup, + [parameter(ParameterSetName = "DbBackup")] + [switch]$Continue, + [parameter(ValueFromPipeline)] + [Microsoft.SqlServer.Management.Smo.Database[]]$InputObject, + [switch]$NoCopyOnly, + [switch]$SetSourceOffline, + [string]$NewName, + [string]$Prefix, + [switch]$Force, + [switch]$EnableException + ) + begin { + Test-DbaDeprecation -DeprecatedOn 1.0.0 -Parameter NetworkShare -CustomMessage "Using the parameter NetworkShare is deprecated. This parameter will be removed in version 1.0.0 or before. Use SharedPath instead." + + $CopyOnly = -not $NoCopyOnly + + if ($BackupRestore -and (-not $SharedPath -and -not $UseLastBackup)) { + Stop-Function -Message "When using -BackupRestore, you must specify -SharedPath or -UseLastBackup" + return + } + if ($SharedPath -and $UseLastBackup) { + Stop-Function -Message "-SharedPath cannot be used with -UseLastBackup because the backup path is determined by the paths in the last backups" + return + } + if ($DetachAttach -and -not $Reattach -and $Destination.Count -gt 1) { + Stop-Function -Message "When using -DetachAttach with multiple servers, you must specify -Reattach to reattach database at source" + return + } + if ($Continue -and -not $UseLastBackup) { + Stop-Function -Message "-Continue cannot be used without -UseLastBackup" + return + } + + function Join-Path { + <# + An internal command that does not require the local path to exist + + Boo, this does not work, but keeping it for future ref. + #> + [CmdletBinding()] + param ( + [string]$Path, + [string]$ChildPath + ) + process { + try { + [IO.Path]::Combine($Path, $ChildPath) + } catch { + "$Path\$ChildPath" + } + } + } + + function Join-AdminUnc { + <# + .SYNOPSIS + Internal function. Parses a path to make it an admin UNC. + #> + [CmdletBinding()] + param ( + [Parameter(Mandatory)] + [ValidateNotNullOrEmpty()] + [string]$servername, + [Parameter(Mandatory)] + [ValidateNotNullOrEmpty()] + [string]$filepath + + ) + + if ($script:sameserver -or (-not $script:isWindows)) { + return $filepath + } + if (-not $filepath) { + return + } + if ($filepath.StartsWith("\\")) { + return $filepath + } + + $servername = $servername.Split("\")[0] + + if ($filepath -and $filepath -ne [System.DbNull]::Value) { + $newpath = Join-Path "\\$servername\" $filepath.replace(':', '$') + return $newpath + } else { + return + } + } + + function Get-SqlFileStructure { + $dbcollection = @{ + }; + $databaseProgressbar = 0 + + foreach ($db in $databaseList) { + Write-Progress -Id 1 -Activity "Processing database file structure" -PercentComplete ($databaseProgressbar / $dbCount * 100) -Status "Processing $databaseProgressbar of $dbCount." + $dbName = $db.Name + Write-Message -Level Verbose -Message $dbName + + $databaseProgressbar++ + $dbStatus = $db.status.toString() + if ($dbStatus.StartsWith("Normal") -eq $false) { + continue + } + $destinstancefiles = @{ + }; $sourcefiles = @{ + } + + $where = "Filetype <> 'LOG' and Filetype <> 'FULLTEXT'" + + $datarows = $dbFileTable.Tables.Select("dbname = '$dbName' and $where") + + # Data Files + foreach ($file in $datarows) { + # Destination File Structure + $d = @{ + } + if ($ReuseSourceFolderStructure) { + $d.physical = $file.filename + } elseif ($WithReplace) { + $name = $file.Name + $destfile = $remoteDbFileTable.Tables[0].Select("dbname = '$dbName' and name = '$name'") + $d.physical = $destfile.filename + + if ($null -eq $d.physical) { + $directory = Get-SqlDefaultPaths $destServer data + $fileName = Split-Path $file.filename -Leaf + $d.physical = "$directory\$fileName" + } + } else { + $directory = Get-SqlDefaultPaths $destServer data + $fileName = Split-Path $file.filename -Leaf + $d.physical = "$directory\$fileName" + } + $d.logical = $file.Name + + $d.remotefilename = Join-AdminUNC $destNetBios $d.physical + $destinstancefiles.add($file.Name, $d) + + # Source File Structure + $s = @{ + } + $s.logical = $file.Name + $s.physical = $file.filename + $s.remotefilename = Join-AdminUNC $sourceNetBios $s.physical + $sourcefiles.add($file.Name, $s) + } + + # Add support for Full Text Catalogs in SQL Server 2005 and below + if ($sourceServer.VersionMajor -lt 10) { + try { + $fttable = $null = $sourceServer.Databases[$dbName].ExecuteWithResults('sp_help_fulltext_catalogs') + $allrows = $fttable.Tables[0].rows + } catch { + # Nothing, it's just not enabled + # here to avoid an empty catch + $null = 1 + } + + foreach ($ftc in $allrows) { + # Destination File Structure + $d = @{ + } + $pre = "sysft_" + $name = $ftc.Name + $physical = $ftc.Path # RootPath + $logical = "$pre$name" + if ($ReuseSourceFolderStructure) { + $d.physical = $physical + } else { + $directory = Get-SqlDefaultPaths $destServer data + if ($destServer.VersionMajor -lt 10) { + $directory = "$directory\FTDATA" + } + $fileName = Split-Path($physical) -leaf + $d.physical = "$directory\$fileName" + } + $d.logical = $logical + $d.remotefilename = Join-AdminUNC $destNetBios $d.physical + $destinstancefiles.add($logical, $d) + + # Source File Structure + $s = @{ + } + $pre = "sysft_" + $name = $ftc.Name + $physical = $ftc.Path # RootPath + $logical = "$pre$name" + + $s.logical = $logical + $s.physical = $physical + $s.remotefilename = Join-AdminUNC $sourceNetBios $s.physical + $sourcefiles.add($logical, $s) + } + } + + $where = "Filetype = 'LOG'" + $datarows = $dbFileTable.Tables[0].Select("dbname = '$dbName' and $where") + + # Log Files + foreach ($file in $datarows) { + $d = @{ + } + if ($ReuseSourceFolderStructure) { + $d.physical = $file.filename + } elseif ($WithReplace) { + $name = $file.Name + $destfile = $remoteDbFileTable.Tables[0].Select("dbname = '$dbName' and name = '$name'") + $d.physical = $destfile.filename + + if ($null -eq $d.physical) { + $directory = Get-SqlDefaultPaths $destServer data + $fileName = Split-Path $file.filename -Leaf + $d.physical = "$directory\$fileName" + } + } else { + $directory = Get-SqlDefaultPaths $destServer log + $fileName = Split-Path $file.filename -Leaf + $d.physical = "$directory\$fileName" + } + $d.logical = $file.Name + $d.remotefilename = Join-AdminUNC $destNetBios $d.physical + $destinstancefiles.add($file.Name, $d) + + $s = @{ + } + $s.logical = $file.Name + $s.physical = $file.filename + $s.remotefilename = Join-AdminUNC $sourceNetBios $s.physical + $sourcefiles.add($file.Name, $s) + } + + $location = @{ + } + $location.add("Destination", $destinstancefiles) + $location.add("Source", $sourcefiles) + $dbcollection.Add($($db.Name), $location) + } + + $fileStructure = [pscustomobject]@{ + "databases" = $dbcollection + } + Write-Progress -id 1 -Activity "Processing database file structure" -Status "Completed" -Completed + return $fileStructure + } + + function Dismount-SqlDatabase { + [CmdletBinding()] + param ( + [object]$server, + [string]$dbName + ) + + $currentdb = $server.databases[$dbName] + if ($currentdb.IsMirroringEnabled) { + try { + Write-Message -Level Verbose -Message "Breaking mirror for $dbName" + $currentdb.ChangeMirroringState([Microsoft.SqlServer.Management.Smo.MirroringOption]::Off) + $currentdb.Alter() + $currentdb.Refresh() + Write-Message -Level Verbose -Message "Could not break mirror for $dbName. Skipping." + } catch { + Stop-Function -Message "Issue breaking mirror." -Target $dbName -ErrorRecord $_ + return $false + } + } + + if ($currentdb.AvailabilityGroupName) { + $agName = $currentdb.AvailabilityGroupName + Write-Message -Level Verbose -Message "Attempting remove from Availability Group $agName." + try { + $server.AvailabilityGroups[$currentdb.AvailabilityGroupName].AvailabilityDatabases[$dbName].Drop() + Write-Message -Level Verbose -Message "Successfully removed $dbName from detach from $agName on $($server.Name)." + } catch { + Stop-Function -Message "Could not remove $dbName from $agName on $($server.Name)." -Target $dbName -ErrorRecord $_ + return $false + } + } + + Write-Message -Level Verbose -Message "Attempting detach from $dbName from $source." + + ####### Using Sql to detach does not modify the $currentdb collection ####### + + $server.KillAllProcesses($dbName) + + try { + $sql = "ALTER DATABASE [$dbName] SET SINGLE_USER WITH ROLLBACK IMMEDIATE" + Write-Message -Level Verbose -Message $sql + $null = $server.Query($sql) + Write-Message -Level Verbose -Message "Successfully set $dbName to single-user from $source." + } catch { + Stop-Function -Message "Issue setting database to single-user." -Target $dbName -ErrorRecord $_ + } + + try { + $sql = "EXEC master.dbo.sp_detach_db N'$dbName'" + Write-Message -Level Verbose -Message $sql + $null = $server.Query($sql) + Write-Message -Level Verbose -Message "Successfully detached $dbName from $source." + return $true + } catch { + Stop-Function -Message "Issue detaching database." -Target $dbName -ErrorRecord $_ + return $false + } + } + + function Mount-SqlDatabase { + [CmdletBinding()] + param ( + [object]$server, + [string]$dbName, + [object]$fileStructure, + [string]$dbOwner + ) + + if ($null -eq $server.Logins.Item($dbOwner)) { + try { + $dbOwner = ($destServer.logins | Where-Object { + $_.id -eq 1 + }).Name + } catch { + $dbOwner = "sa" + } + } + try { + $null = $server.AttachDatabase($dbName, $fileStructure, $dbOwner, [Microsoft.SqlServer.Management.Smo.AttachOptions]::None) + return $true + } catch { + Stop-Function -Message "Issue mounting database." -ErrorRecord $_ + return $false + } + } + + function Start-SqlFileTransfer { + <# + + SYNOPSIS + Internal function. Uses BITS to transfer detached files (.mdf, .ndf, .ldf, and filegroups) to + another server over admin UNC paths. Locations of data files are kept in the + custom object generated by Get-SqlFileStructure + + #> + [CmdletBinding(SupportsShouldProcess)] + param ( + [object]$fileStructure, + [string]$dbName + ) + $filestructure + $copydb = $fileStructure.databases[$dbName] + $dbsource = $copydb.source + $dbdestination = $copydb.destination + + foreach ($file in $dbsource.keys) { + if ($Pscmdlet.ShouldProcess($file, "Starting Sql File Transfer")) { + $remotefilename = $dbdestination[$file].remotefilename + $from = $dbsource[$file].remotefilename + try { + if (Test-Path $from -pathtype container) { + $null = New-Item -ItemType Directory -Path $remotefilename -Force + Start-BitsTransfer -Source "$from\*.*" -Destination $remotefilename + + $directories = (Get-ChildItem -recurse $from | Where-Object { + $_.PsIsContainer + }).FullName + foreach ($directory in $directories) { + $newdirectory = $directory.replace($from, $remotefilename) + $null = New-Item -ItemType Directory -Path $newdirectory -Force + Start-BitsTransfer -Source "$directory\*.*" -Destination $newdirectory + } + } else { + Write-Message -Level Verbose -Message "Copying $from for $dbName." + Start-BitsTransfer -Source $from -Destination $remotefilename + } + } catch { + try { + # Sometimes BITS trips out temporarily on cloned drives. + Start-BitsTransfer -Source $from -Destination $remotefilename + } catch { + Write-Message -Level Verbose -Message "Start-BitsTransfer did not succeed. Now attempting with Copy-Item - no progress bar will be shown." + try { + Copy-Item -Path $from -Destination $remotefilename -ErrorAction Stop + $remotefilename + } catch { + Write-Message -Level Verbose -Message "Access denied. This can happen for a number of reasons including issues with cloned disks." + Stop-Function -Message "Alternatively, you may need to run PowerShell as Administrator, especially when running on localhost." -Target $from -ErrorRecord $_ + return + } + } + } + } + } + return $true + } + + function Start-SqlDetachAttach { + <# + + .SYNOPSIS + Internal function. Performs checks, then executes Dismount-SqlDatabase on a database, copies its files to the new server, then performs Mount-SqlDatabase. $sourceServer and $destServer are SMO server objects. + + $fileStructure is a custom object generated by Get-SqlFileStructure + + #> + [CmdletBinding(SupportsShouldProcess)] + param ( + [object]$sourceServer, + [object]$destServer, + [object]$fileStructure, + [string]$dbName + ) + if ($Pscmdlet.ShouldProcess($dbname, "Starting detaching and re-attaching from $sourceServer to $destServer")) { + $destfilestructure = New-Object System.Collections.Specialized.StringCollection + $sourceFileStructure = New-Object System.Collections.Specialized.StringCollection + $dbOwner = $sourceServer.databases[$dbName].owner + $destDbName = $fileStructure.databases[$dbName].destinationDbName + + if ($null -eq $dbOwner) { + try { + $dbOwner = ($destServer.logins | Where-Object { + $_.id -eq 1 + }).Name + } catch { + $dbOwner = "sa" + } + } + + foreach ($file in $fileStructure.databases[$dbName].destination.values) { + $null = $destfilestructure.add($file.physical) + } + foreach ($file in $fileStructure.databases[$dbName].source.values) { + $null = $sourceFileStructure.add($file.physical) + } + + $detachresult = Dismount-SqlDatabase $sourceServer $dbName + + if ($detachresult) { + + $transfer = Start-SqlFileTransfer $fileStructure $dbName + if ($transfer -eq $false) { + Write-Message -Level Verbose -Message "Could not copy files." + return "Could not copy files." + } + $attachresult = Mount-SqlDatabase $destServer $destDbName $destfilestructure $dbOwner + + if ($attachresult -eq $true) { + # add to added dbs because ATTACH was successful + Write-Message -Level Verbose -Message "Successfully attached $dbName to $destinstance." + return $true + } else { + # add to failed because ATTACH was unsuccessful + Write-Message -Level Verbose -Message "Could not attach $dbName." + return "Could not attach database." + } + } else { + # add to failed because DETACH was unsuccessful + Write-Message -Level Verbose -Message "Could not detach $dbName." + return "Could not detach database." + } + } + } + $backupCollection = @() + } + process { + if (Test-FunctionInterrupt) { + return + } + + # testing twice for whatif reasons + if ($BackupRestore -and (-not $SharedPath -and -not $UseLastBackup)) { + Stop-Function -Message "When using -BackupRestore, you must specify -SharedPath or -UseLastBackup" + return + } + if ($SharedPath -and $UseLastBackup) { + Stop-Function -Message "-SharedPath cannot be used with -UseLastBackup because the backup path is determined by the paths in the last backups" + return + } + if ($DetachAttach -and -not $Reattach -and $Destination.Count -gt 1) { + Stop-Function -Message "When using -DetachAttach with multiple servers, you must specify -Reattach to reattach database at source" + return + } + if (($AllDatabases -or $IncludeSupportDbs -or $Database) -and !$DetachAttach -and !$BackupRestore) { + Stop-Function -Message "You must specify -DetachAttach or -BackupRestore when migrating databases." + return + } + + if (-not $AllDatabases -and -not $IncludeSupportDbs -and -not $Database -and -not $InputObject) { + Stop-Function -Message "You must specify a -AllDatabases or -Database to continue." + return + } + + if ((Test-Bound 'NewName') -and (Test-Bound 'Prefix')) { + Stop-Function -Message "NewName and Prefix are exclusive options, cannot specify both" + return + } + + if ($InputObject) { + $Source = $InputObject[0].Parent + $Database = $InputObject.Name + } + + + if ($Database -contains "master" -or $Database -contains "msdb" -or $Database -contains "tempdb") { + Stop-Function -Message "Migrating system databases is not currently supported." -Continue + } + + try { + $sourceServer = Connect-SqlInstance -SqlInstance $Source -SqlCredential $SourceSqlCredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $Source + return + } + + Invoke-SmoCheck -SqlInstance $sourceServer + $sourceNetBios = $sourceServer.ComputerName + + Write-Message -Level Verbose -Message "Ensuring user databases exist (counting databases)." + + if ($sourceserver.Databases.IsSystemObject -notcontains $false) { + Stop-Function -Message "No user databases to migrate" + return + } + + foreach ($destinstance in $Destination) { + try { + $destServer = Connect-SqlInstance -SqlInstance $destinstance -SqlCredential $DestinationSqlCredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $destinstance -Continue + } + + if ($sourceServer.ComputerName -eq $destServer.ComputerName) { + $script:sameserver = $true + } else { + $script:sameserver = $false + } + + if ($script:sameserver -and $DetachAttach) { + if (-not (Test-ElevationRequirement -ComputerName $sourceServer)) { + return + } + } + + $destVersionLower = $destServer.VersionMajor -lt $sourceServer.VersionMajor + $destVersionMinorLow = ($destServer.VersionMajor -eq 10 -and $sourceServer.VersionMajor -eq 10) -and ($destServer.VersionMinor -lt $sourceServer.VersionMinor) + + if ($destVersionLower -or $destVersionMinorLow) { + Stop-Function -Message "Error: copy database cannot be made from newer $($sourceServer.VersionString) to older $($destServer.VersionString) SQL Server version." + return + } + + if ($DetachAttach) { + if ($sourceServer.ComputerName -eq $env:COMPUTERNAME -or $destServer.ComputerName -eq $env:COMPUTERNAME) { + if (-not ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator")) { + Write-Message -Level Verbose -Message "When running DetachAttach locally on the console, it's possible you'll need to Run As Administrator. Trying anyway." + } + } + } + + if ($SharedPath) { + if ($(Test-DbaPath -SqlInstance $sourceServer -Path $SharedPath) -eq $false) { + Write-Message -Level Verbose -Message "$Source may not be able to access $SharedPath. Trying anyway." + } + + if ($(Test-DbaPath -SqlInstance $destServer -Path $SharedPath) -eq $false) { + Write-Message -Level Verbose -Message "$destinstance may not be able to access $SharedPath. Trying anyway." + } + + if ($SharedPath.StartsWith('\\')) { + try { + $shareServer = ($SharedPath -split "\\")[2] + $hostEntry = ([Net.Dns]::GetHostEntry($shareServer)).HostName -split "\." + + if ($shareServer -ne $hostEntry[0]) { + Write-Message -Level Verbose -Message "Using CNAME records for the network share may present an issue if an SPN has not been created. Trying anyway. If it doesn't work, use a different (A record) hostname." + } + } catch { + Stop-Function -Message "Error validating unc path: $_" + return + } + } + } + + $destNetBios = $destserver.ComputerName + + Write-Message -Level Verbose -Message "Performing SMO version check." + Invoke-SmoCheck -SqlInstance $destServer + + Write-Message -Level Verbose -Message "Checking to ensure the source isn't the same as the destination." + if ($source -eq $destinstance) { + Stop-Function -Message "Source and Destination SQL Servers instances are the same. Quitting." -Continue + } + + Write-Message -Level Verbose -Message "Checking to ensure server is not SQL Server 7 or below." + if ($sourceServer.VersionMajor -lt 8 -and $destServer.VersionMajor -lt 8) { + Stop-Function -Message "This script can only be run on SQL Server 2000 and above. Quitting." -Continue + } + + Write-Message -Level Verbose -Message "Checking to ensure detach/attach is not attempted on SQL Server 2000." + if ($destServer.VersionMajor -lt 9 -and $DetachAttach) { + Stop-Function -Message "Detach/Attach not supported when destination SQL Server is version 2000. Quitting." -Target $destServer -Continue + } + + Write-Message -Level Verbose -Message "Checking to ensure SQL Server 2000 migration isn't directly attempted to SQL Server 2012." + if ($sourceServer.VersionMajor -lt 9 -and $destServer.VersionMajor -gt 10) { + Stop-Function -Message "SQL Server 2000 databases cannot be migrated to SQL Server versions 2012 and above. Quitting." -Target $destServer -Continue + } + + Write-Message -Level Verbose -Message "Warning if migration from 2005 to 2012 and above and attach/detach is used." + if ($sourceServer.VersionMajor -eq 9 -and $destServer.VersionMajor -gt 9 -and !$BackupRestore -and !$Force -and $DetachAttach) { + Stop-Function -Message "Backup and restore is the safest method for migrating from SQL Server 2005 to other SQL Server versions. Please use the -BackupRestore switch or override this requirement by specifying -Force." -Continue + } + + if ($sourceServer.Collation -ne $destServer.Collation) { + Write-Message -Level Verbose -Message "Warning on different collation." + Write-Message -Level Verbose -Message "Collation on $Source, $($sourceServer.Collation) differs from the $destinstance, $($destServer.Collation)." + } + + Write-Message -Level Verbose -Message "Ensuring destination server version is equal to or greater than source." + if ($sourceServer.VersionMajor -ge $destServer.VersionMajor) { + if ($sourceServer.VersionMinor -gt $destServer.VersionMinor) { + Stop-Function -Message "Source SQL Server version build must be <= destination SQL Server for database migration." -Continue + } + } + + # SMO's filestreamlevel is sometimes null + $sql = "select coalesce(SERVERPROPERTY('FilestreamConfiguredLevel'),0) as fs" + $sourceFilestream = $sourceServer.ConnectionContext.ExecuteScalar($sql) + $destFilestream = $destServer.ConnectionContext.ExecuteScalar($sql) + if ($sourceFilestream -gt 0 -and $destFilestream -eq 0) { + $fsWarning = $true + } + + Write-Message -Level Verbose -Message "Writing warning about filestream being enabled." + if ($fsWarning) { + Write-Message -Level Verbose -Message "FILESTREAM enabled on $source but not $destinstance. Databases that use FILESTREAM will be skipped." + } + + if ($DetachAttach -eq $true) { + Write-Message -Level Verbose -Message "Checking access to remote directories." + $remoteSourcePath = Join-AdminUNC $sourceNetBios (Get-SqlDefaultPaths -SqlInstance $sourceServer -filetype data) + + if ((Test-Path $remoteSourcePath) -ne $true -and $DetachAttach) { + Write-Message -Level Warning -Message "Can't access remote Sql directories on $source which is required to perform detach/copy/attach." + Write-Message -Level Warning -Message "You can manually try accessing $remoteSourcePath to diagnose any issues." + Stop-Function -Message "Halting database migration" + return + } + + $remoteDestPath = Join-AdminUNC $destNetBios (Get-SqlDefaultPaths -SqlInstance $destServer -filetype data) + If ((Test-Path $remoteDestPath) -ne $true -and $DetachAttach) { + Write-Message -Level Warning -Message "Can't access remote Sql directories on $destinstance which is required to perform detach/copy/attach." + Write-Message -Level Warning -Message "You can manually try accessing $remoteDestPath to diagnose any issues." + Stop-Function -Message "Halting database migration" -Continue + } + } + + if (($Database -or $ExcludeDatabase -or $IncludeSupportDbs) -and (!$DetachAttach -and !$BackupRestore)) { + Stop-Function -Message "You did not select a migration method. Please use -BackupRestore or -DetachAttach." + return + } + + if ((!$Database -and !$AllDatabases -and !$IncludeSupportDbs) -and ($DetachAttach -or $BackupRestore)) { + Stop-Function -Message "You did not select any databases to migrate. Please use -AllDatabases or -Database or -IncludeSupportDbs." + return + } + + Write-Message -Level Verbose -Message "Building database list." + $databaseList = New-Object System.Collections.ArrayList + $SupportDBs = "ReportServer", "ReportServerTempDB", "distribution" + foreach ($currentdb in ($sourceServer.Databases | Where-Object IsAccessible)) { + $dbName = $currentdb.Name + $dbOwner = $currentdb.Owner + + if ($currentdb.Id -le 4) { + continue + } + if ($Database -and $Database -notcontains $dbName) { + continue + } + if ($IncludeSupportDBs -eq $false -and $SupportDBs -contains $dbName) { + continue + } + if ($IncludeSupportDBs -eq $true -and $SupportDBs -notcontains $dbName) { + if ($AllDatabases -eq $false -and $Database.length -eq 0) { + continue + } + } + $null = $databaseList.Add($currentdb) + } + + Write-Message -Level Verbose -Message "Performing count." + $dbCount = $databaseList.Count + + if ((Test-Bound 'NewName') -and $dbCount -gt 1) { + Stop-Function -Message "Cannot use NewName when copying multiple databases" + return + } + + + Write-Message -Level Verbose -Message "Building file structure inventory for $dbCount databases." + + if ($sourceServer.VersionMajor -eq 8) { + $sql = "select DB_NAME (dbid) as dbname, name, filename, CASE WHEN groupid = 0 THEN 'LOG' ELSE 'ROWS' END as filetype from sysaltfiles" + } else { + $sql = "SELECT db.Name AS dbname, type_desc AS FileType, mf.Name, Physical_Name AS filename FROM sys.master_files mf INNER JOIN sys.databases db ON db.database_id = mf.database_id" + } + + $dbFileTable = $sourceServer.Databases['master'].ExecuteWithResults($sql) + + if ($destServer.VersionMajor -eq 8) { + $sql = "select DB_NAME (dbid) as dbname, name, filename, CASE WHEN groupid = 0 THEN 'LOG' ELSE 'ROWS' END as filetype from sysaltfiles" + } else { + $sql = "SELECT db.Name AS dbname, type_desc AS FileType, mf.Name, Physical_Name AS filename FROM sys.master_files mf INNER JOIN sys.databases db ON db.database_id = mf.database_id" + } + + $remoteDbFileTable = $destServer.Databases['master'].ExecuteWithResults($sql) + + $fileStructure = Get-SqlFileStructure -sourceserver $sourceServer -destserver $destServer -databaselist $databaseList -ReuseSourceFolderStructure $ReuseSourceFolderStructure + + $elapsed = [System.Diagnostics.Stopwatch]::StartNew() + $started = Get-Date + $script:TimeNow = (Get-Date -UFormat "%m%d%Y%H%M%S") + + if ($AllDatabases -or $ExcludeDatabase -or $IncludeSupportDbs -or $Database) { + foreach ($currentdb in $databaseList) { + $dbName = $currentdb.Name + $dbOwner = $currentdb.Owner + $destinationDbName = $dbName + if ((Test-Bound "NewName")) { + Write-Message -Level Verbose -Message "NewName specified, copying $dbname as $NewName" + $destinationDbName = $NewName + $replaceInFile = $True + } + if ($(Test-Bound "Prefix")) { + $destinationDbName = $prefix + $destinationDbName + Write-Message -Level Verbose -Message "Prefix supplied, copying $dbname as $destinationDbName" + } + + $filestructure.databases[$dbname].Add('destinationDbName', $destinationDbName) + ForEach ($key in $filestructure.databases[$dbname].Destination.Keys) { + $splitFileName = Split-Path $fileStructure.databases[$dbname].Destination[$key].remotefilename -Leaf + $SplitPath = Split-Path $fileStructure.databases[$dbname].Destination[$key].remotefilename + if ($replaceInFile) { + $splitFileName = $splitFileName.replace($dbname, $destinationDbName) + } + $splitFileName = $prefix + $splitFileName + $filestructure.databases[$dbname].Destination.$key.remotefilename = Join-Path $SplitPath $splitFileName + $splitFileName = Split-Path $filestructure.databases[$dbname].Destination[$key].physical -Leaf + $SplitPath = Split-Path $fileStructure.databases[$dbname].Destination[$key].physical + if ($replaceInFile) { + $splitFileName = $splitFileName.replace($dbname, $destinationDbName) + } + $splitFileName = $prefix + $splitFileName + $filestructure.databases[$dbname].Destination.$key.physical = Join-Path $SplitPath $splitFileName + } + + $copyDatabaseStatus = [pscustomobject]@{ + SourceServer = $sourceServer.Name + DestinationServer = $destServer.Name + Name = $dbName + DestinationDatabase = $DestinationDbname + Type = "Database" + Status = $null + Notes = $null + DateTime = [DbaDateTime](Get-Date) + } + + Write-Message -Level Verbose -Message "`n######### Database: $dbName #########" + $dbStart = Get-Date + + if ($ExcludeDatabase -contains $dbName) { + Write-Message -Level Verbose -Message "$dbName excluded. Skipping." + continue + } + + Write-Message -Level Verbose -Message "Checking for accessibility." + if ($currentdb.IsAccessible -eq $false) { + if ($Pscmdlet.ShouldProcess($destinstance, "Skipping $dbName. Database is inaccessible.")) { + Write-Message -Level Verbose -Message "Skipping $dbName. Database is inaccessible." + + $copyDatabaseStatus.Status = "Skipped" + $copyDatabaseStatus.Notes = "Database is not accessible" + $copyDatabaseStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + } + continue + } + + if ($fsWarning) { + $fsRows = $dbFileTable.Tables[0].Select("dbname = '$dbName' and FileType = 'FileStream'") + + if ($fsRows.Count -gt 0) { + if ($Pscmdlet.ShouldProcess($destinstance, "Skipping $dbName (contains FILESTREAM).")) { + Write-Message -Level Verbose -Message "Skipping $dbName (contains FILESTREAM)." + $copyDatabaseStatus.Status = "Skipped" + $copyDatabaseStatus.Notes = "Contains FILESTREAM" + $copyDatabaseStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + } + continue + } + } + + if ($ReuseSourceFolderStructure) { + $fgRows = $dbFileTable.Tables[0].Select("dbname = '$dbName' and FileType = 'ROWS'")[0] + $remotePath = Split-Path $fgRows.Filename + + if (!(Test-DbaPath -SqlInstance $destServer -Path $remotePath)) { + if ($Pscmdlet.ShouldProcess($destinstance, "$remotePath does not exist on $destinstance and ReuseSourceFolderStructure was specified")) { + # Stop-Function -Message "Cannot resolve $remotePath on $source. `n`nYou have specified ReuseSourceFolderStructure and exact folder structure does not exist. Halting script." + $copyDatabaseStatus.Status = "Failed" + $copyDatabaseStatus.Notes = "$remotePath does not exist on $destinstance and ReuseSourceFolderStructure was specified" #"Can't resolve $remotePath" + $copyDatabaseStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + } + continue + } + } + + Write-Message -Level Verbose -Message "Checking Availability Group status." + if ($currentdb.AvailabilityGroupName -and !$force -and $DetachAttach) { + $agName = $currentdb.AvailabilityGroupName + Write-Message -Level Verbose -Message "Database is part of an Availability Group ($agName). Use -Force to drop from $agName and migrate. Alternatively, you can use the safer backup/restore method." + continue + } + + $dbStatus = $currentdb.Status.ToString() + + if ($dbStatus.StartsWith("Normal") -eq $false) { + if ($Pscmdlet.ShouldProcess($destinstance, "$dbName is not in a Normal state. Skipping.")) { + Write-Message -Level Verbose -Message "$dbName is not in a Normal state. Skipping." + + $copyDatabaseStatus.Status = "Skipped" + $copyDatabaseStatus.Notes = "Not in normal state" + $copyDatabaseStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + } + continue + } + + if ($currentdb.ReplicationOptions -ne "None" -and $DetachAttach -eq $true) { + if ($Pscmdlet.ShouldProcess($destinstance, "$dbName is part of replication. Skipping.")) { + Write-Message -Level Verbose -Message "$dbName is part of replication. Skipping." + + $copyDatabaseStatus.Status = "Skipped" + $copyDatabaseStatus.Notes = "Part of replication" + $copyDatabaseStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + } + continue + } + + if ($currentdb.IsMirroringEnabled -and !$force -and $DetachAttach) { + if ($Pscmdlet.ShouldProcess($destinstance, "Database is being mirrored. Use -Force to break mirror and migrate. Alternatively, you can use the safer backup/restore method.")) { + Write-Message -Level Verbose -Message "Database is being mirrored. Use -Force to break mirror and migrate. Alternatively, you can use the safer backup/restore method." + + $copyDatabaseStatus.Status = "Skipped" + $copyDatabaseStatus.Notes = "Database is mirrored" + $copyDatabaseStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + } + + continue + } + + if (($null -ne $destServer.Databases[$DestinationdbName]) -and !$force -and !$WithReplace) { + if ($Pscmdlet.ShouldProcess($destinstance, "$DestinationdbName exists at destination. Use -Force to drop and migrate. Aborting routine for this database.")) { + Write-Message -Level Verbose -Message "$DestinationdbName exists at destination. Use -Force to drop and migrate. Aborting routine for this database." + + $copyDatabaseStatus.Status = "Skipped" + $copyDatabaseStatus.Notes = "Already exists on destination" + $copyDatabaseStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + } + continue + } elseif ($null -ne $destServer.Databases[$DestinationdbName] -and $force) { + if ($Pscmdlet.ShouldProcess($destinstance, "DROP DATABASE $DestinationdbName")) { + Write-Message -Level Verbose -Message "$DestinationdbName already exists. -Force was specified. Dropping $DestinationdbName on $destinstance." + $removeresult = Remove-DbaDatabase -SqlInstance $destserver -Database $DestinationdbName -Confirm:$false + $dropResult = $removeresult.Status -eq 'Dropped' + + if ($dropResult -eq $false) { + Write-Message -Level Verbose -Message "Database could not be dropped. Aborting routine for this database." + + $copyDatabaseStatus.Status = "Failed" + $copyDatabaseStatus.Notes = "Could not drop database" + $copyDatabaseStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + continue + } + } + } + + if ($force) { + $WithReplace = $true + } + + Write-Message -Level Verbose -Message "Started: $dbStart." + + if ($sourceServer.VersionMajor -ge 9) { + $sourceDbOwnerChaining = $sourceServer.Databases[$dbName].DatabaseOwnershipChaining + $sourceDbTrustworthy = $sourceServer.Databases[$dbName].Trustworthy + $sourceDbBrokerEnabled = $sourceServer.Databases[$dbName].BrokerEnabled + } + + $sourceDbReadOnly = $sourceServer.Databases[$dbName].ReadOnly + + if ($SetSourceReadOnly) { + If ($Pscmdlet.ShouldProcess($source, "Set $dbName to read-only")) { + Write-Message -Level Verbose -Message "Setting database to read-only." + try { + $result = Set-DbaDbState -SqlInstance $sourceServer -Database $dbName -ReadOnly -EnableException -Force:$Force + } catch { + Stop-Function -Continue -Message "Couldn't set database to read-only. Aborting routine for this database" -ErrorRecord $_ + } + } + } + + if ($BackupRestore) { + if ($UseLastBackup) { + $whatifmsg = "Gathering last backup information for $dbName from $Source and restoring" + } else { + $whatifmsg = "Backup $dbName from $source and restoring" + } + If ($Pscmdlet.ShouldProcess($destinstance, $whatifmsg)) { + if ($UseLastBackup) { + $backupTmpResult = Get-DbaBackupHistory -SqlInstance $sourceServer -Database $dbName -IncludeCopyOnly -Last + if (-not $backupTmpResult) { + $copyDatabaseStatus.Type = "Database (BackupRestore)" + $copyDatabaseStatus.Status = "Failed" + $copyDatabaseStatus.Notes = "No backups for $dbName on $source" + $copyDatabaseStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + continue + } + } else { + $backupTmpResult = $backupCollection | Where-Object Database -eq $dbName + if (-not $backupTmpResult) { + $backupTmpResult = Backup-DbaDatabase -SqlInstance $sourceServer -Database $dbName -BackupDirectory $SharedPath -FileCount $numberfiles -CopyOnly:$CopyOnly + } + if ($backupTmpResult) { + $backupCollection += $backupTmpResult + } + $backupResult = $BackupTmpResult.BackupComplete + if (-not $backupResult) { + $serviceAccount = $sourceServer.ServiceAccount + Write-Message -Level Verbose -Message "Backup Failed. Does SQL Server account $serviceAccount have access to $($SharedPath)? Aborting routine for this database." + + $copyDatabaseStatus.Status = "Failed" + $copyDatabaseStatus.Notes = "Backup failed. Verify service account access to $SharedPath." + $copyDatabaseStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + continue + } + } + Write-Message -Level Verbose -Message "Reuse = $ReuseSourceFolderStructure." + try { + $msg = $null + $restoreResultTmp = $backupTmpResult | Restore-DbaDatabase -SqlInstance $destServer -DatabaseName $DestinationdbName -ReuseSourceFolderStructure:$ReuseSourceFolderStructure -NoRecovery:$NoRecovery -TrustDbBackupHistory -WithReplace:$WithReplace -Continue:$Continue -EnableException -ReplaceDbNameInFile + } catch { + $msg = $_.Exception.InnerException.InnerException.InnerException.InnerException.Message + Stop-Function -Message "Failure attempting to restore $dbName to $destinstance" -Exception $_.Exception.InnerException.InnerException.InnerException.InnerException + } + $restoreResult = $restoreResultTmp.RestoreComplete + + if ($restoreResult -eq $true) { + Write-Message -Level Verbose -Message "Successfully restored $dbName to $destinstance." + $copyDatabaseStatus.Status = "Successful" + $copyDatabaseStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + } else { + if ($ReuseSourceFolderStructure) { + Write-Message -Level Verbose -Message "Failed to restore $dbName to $destinstance. You specified -ReuseSourceFolderStructure. Does the exact same destination directory structure exist?" + Write-Message -Level Verbose -Message "Aborting routine for this database." + + $copyDatabaseStatus.Status = "Failed" + $copyDatabaseStatus.Notes = "Failed to restore. ReuseSourceFolderStructure was specified, verify same directory structure exist on destination." + $copyDatabaseStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + continue + } else { + Write-Message -Level Verbose -Message "Failed to restore $dbName to $destinstance. Aborting routine for this database." + + $copyDatabaseStatus.Status = "Failed" + if (-not $msg) { + $msg = "Failed to restore database" + } + $copyDatabaseStatus.Notes = $msg + $copyDatabaseStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + continue + } + } + if (-not $NoBackupCleanUp -and $Destination.Count -eq 1) { + foreach ($backupFile in ($backupTmpResult.BackupPath)) { + try { + if (Test-Path $backupFile -ErrorAction Stop) { + Write-Message -Level Verbose -Message "Deleting $backupFile." + Remove-Item $backupFile -ErrorAction Stop + } + } catch { + try { + Write-Message -Level Verbose -Message "Trying alternate SQL method to delete $backupFile." + $sql = "EXEC master.sys.xp_delete_file 0, '$backupFile'" + Write-Message -Level Debug -Message $sql + $null = $sourceServer.Query($sql) + } catch { + Write-Message -Level Verbose -Message "Cannot delete backup file $backupFile." + + # Set NoBackupCleanup so that there's a warning at the end + $NoBackupCleanup = $true + } + } + } + } + } + + $dbFinish = Get-Date + if ($NoRecovery -eq $false) { + # needed because the newly restored database doesn't show up + $destServer.Databases.Refresh() + $dbOwner = $sourceServer.Databases[$dbName].Owner + if ($null -eq $dbOwner -or $destServer.Logins.Name -notcontains $dbOwner) { + $dbOwner = Get-SaLoginName -SqlInstance $destServer + } + Write-Message -Level Verbose -Message "Updating database owner to $dbOwner." + $OwnerResult = Set-DbaDbOwner -SqlInstance $destServer -Database $dbName -TargetLogin $dbOwner -EnableException + if ($OwnerResult.Length -eq 0) { + Write-Message -Level Verbose -Message "Failed to update database owner." + } + } + } + + if ($DetachAttach) { + + $copyDatabaseStatus.Type = "Database (DetachAttach)" + + $sourceFileStructure = New-Object System.Collections.Specialized.StringCollection + foreach ($file in $fileStructure.Databases[$dbName].Source.Values) { + $null = $sourceFileStructure.Add($file.Physical) + } + + $dbOwner = $sourceServer.Databases[$dbName].Owner + + if ($null -eq $dbOwner -or $destServer.Logins.Name -notcontains $dbOwner) { + $dbOwner = Get-SaLoginName -SqlInstance $destServer + } + + if ($Pscmdlet.ShouldProcess($destinstance, "Detach $dbName from $source and attach, then update dbowner")) { + $migrationResult = Start-SqlDetachAttach $sourceServer $destServer $fileStructure $dbName + + $dbFinish = Get-Date + + if ($reattach -eq $true) { + $sourceServer.Databases.Refresh() + $destServer.Databases.Refresh() + $result = Mount-SqlDatabase $sourceServer $dbName $sourceFileStructure $dbOwner + + if ($result -eq $true) { + $sourceServer.Databases[$dbName].DatabaseOwnershipChaining = $sourceDbOwnerChaining + $sourceServer.Databases[$dbName].Trustworthy = $sourceDbTrustworthy + $sourceServer.Databases[$dbName].BrokerEnabled = $sourceDbBrokerEnabled + $sourceServer.Databases[$dbName].Alter() + + if ($SetSourceReadOnly -or $sourceDbReadOnly) { + try { + $result = Set-DbaDbState -SqlInstance $sourceServer -Database $dbName -ReadOnly -EnableException + } catch { + Stop-Function -Message "Couldn't set database to read-only" -ErrorRecord $_ + } + } + Write-Message -Level Verbose -Message "Successfully reattached $dbName to $source." + } else { + Write-Message -Level Verbose -Message "Could not reattach $dbName to $source." + $copyDatabaseStatus.Status = "Failed" + $copyDatabaseStatus.Notes = "Could not reattach database to $source" + $copyDatabaseStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + } + } + + if ($migrationResult -eq $true) { + Write-Message -Level Verbose -Message "Successfully attached $dbName to $destinstance." + $copyDatabaseStatus.Status = "Successful" + $copyDatabaseStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + } else { + Write-Message -Level Verbose -Message "Failed to attach $dbName to $destinstance. Aborting routine for this database." + + $copyDatabaseStatus.Status = "Failed" + $copyDatabaseStatus.Notes = "Failed to attach database to destination" + $copyDatabaseStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + + continue + } + } + } + $NewDatabase = Get-DbaDatabase -SqlInstance $destServer -database $DestinationdbName + + # restore potentially lost settings + if ($destServer.VersionMajor -ge 9 -and $NoRecovery -eq $false) { + if ($sourceDbOwnerChaining -ne $NewDatabase.DatabaseOwnershipChaining) { + if ($Pscmdlet.ShouldProcess($destinstance, "Updating DatabaseOwnershipChaining on $DestinationdbName")) { + try { + $NewDatabase.DatabaseOwnershipChaining = $sourceDbOwnerChaining + $NewDatabase.Alter() + Write-Message -Level Verbose -Message "Successfully updated DatabaseOwnershipChaining for $sourceDbOwnerChaining on $DestinationdbName on $destinstance." + } catch { + $copyDatabaseStatus.Status = "Successful - failed to apply DatabaseOwnershipChaining." + $copyDatabaseStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + Stop-Function -Message "Failed to update DatabaseOwnershipChaining for $sourceDbOwnerChaining on $DestinationdbName on $destinstance." -Target $destinstance -ErrorRecord $_ -Continue + } + } + } + + if ($sourceDbTrustworthy -ne $NewDatabase.Trustworthy) { + if ($Pscmdlet.ShouldProcess($destinstance, "Updating Trustworthy on $DestinationdbName")) { + try { + $NewDatabase.Trustworthy = $sourceDbTrustworthy + $NewDatabase.Alter() + Write-Message -Level Verbose -Message "Successfully updated Trustworthy to $sourceDbTrustworthy for $DestinationdbName on $destinstance" + } catch { + $copyDatabaseStatus.Status = "Successful - failed to apply Trustworthy" + $copyDatabaseStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + Stop-Function -Message "Failed to update Trustworthy to $sourceDbTrustworthy for $DestinationdbName on $destinstance." -Target $destinstance -ErrorRecord $_ -Continue + } + } + } + + if ($sourceDbBrokerEnabled -ne $NewDatabase.BrokerEnabled) { + if ($Pscmdlet.ShouldProcess($destinstance, "Updating BrokerEnabled on $dbName")) { + try { + $NewDatabase.BrokerEnabled = $sourceDbBrokerEnabled + $NewDatabase.Alter() + Write-Message -Level Verbose -Message "Successfully updated BrokerEnabled to $sourceDbBrokerEnabled for $DestinationdbName on $destinstance." + } catch { + $copyDatabaseStatus.Status = "Successful - failed to apply BrokerEnabled" + $copyDatabaseStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + Stop-Function -Message "Failed to update BrokerEnabled to $sourceDbBrokerEnabled for $DestinationdbName on $destinstance." -Target $destinstance -ErrorRecord $_ -Continue + } + } + } + } + + if ($sourceDbReadOnly -ne $NewDatabase.ReadOnly -and -not $NoRecovery) { + if ($Pscmdlet.ShouldProcess($destinstance, "Updating ReadOnly status on $DestinationdbName")) { + try { + if ($sourceDbReadOnly) { + $result = Set-DbaDbState -SqlInstance $destserver -Database $DestinationdbName -ReadOnly -EnableException + } else { + $result = Set-DbaDbState -SqlInstance $destserver -Database $DestinationdbName -ReadWrite -EnableException + } + } catch { + $copyDatabaseStatus.Status = "Successful - failed to apply ReadOnly." + $copyDatabaseStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + Stop-Function -Message "Failed to update ReadOnly status on $DestinationdbName." -Target $destinstance -ErrorRecord $_ -Continue + } + } + } + + if ($SetSourceOffline -and $sourceServer.databases[$DestinationdbName].status -notlike '*offline*') { + if ($Pscmdlet.ShouldProcess($destinstance, "Setting $DestinationdbName offline on $source")) { + Stop-DbaProcess -SqlInstance $sourceServer -Database $DestinationdbName + Set-DbaDbState -SqlInstance $sourceServer -SqlCredential $SourceSqlCredential -database $DestinationdbName -Offline + } + } + + $dbTotalTime = $dbFinish - $dbStart + $dbTotalTime = ($dbTotalTime.ToString().Split(".")[0]) + + Write-Message -Level Verbose -Message "Finished: $dbFinish." + Write-Message -Level Verbose -Message "Elapsed time: $dbTotalTime." + + } # end db by db processing + } + } + } + end { + if (Test-FunctionInterrupt) { + return + } + if (-not $NoBackupCleanUp -and $Destination.Count -gt 1) { + foreach ($backupFile in ($backupCollection.BackupPath)) { + try { + if (Test-Path $backupFile -ErrorAction Stop) { + Write-Message -Level Verbose -Message "Deleting $backupFile." + Remove-Item $backupFile -ErrorAction Stop + } + } catch { + try { + Write-Message -Level Verbose -Message "Trying alternate SQL method to delete $backupFile." + $sql = "EXEC master.sys.xp_delete_file 0, '$backupFile'" + Write-Message -Level Debug -Message $sql + $null = $sourceServer.Query($sql) + } catch { + Write-Message -Level Verbose -Message "Cannot delete backup file $backupFile." + } + } + } + } + if (Test-FunctionInterrupt) { + return + } + if ($null -ne $elapsed) { + $totalTime = ($elapsed.Elapsed.toString().Split(".")[0]) + + Write-Message -Level Verbose -Message "`nDatabase migration finished" + Write-Message -Level Verbose -Message "Migration started: $started" + Write-Message -Level Verbose -Message "Migration completed: $(Get-Date)" + Write-Message -Level Verbose -Message "Total Elapsed time: $totalTime" + + if ($SharedPath -and $NoBackupCleanup) { + Write-Message -Level Verbose -Message "Backups still exist at $SharedPath." + } + } else { + Write-Message -Level Verbose -Message "No work was done, as we stopped during setup phase" + } + Test-DbaDeprecation -DeprecatedOn "1.0.0" -EnableException:$false -Alias Copy-SqlDatabase + } +} +function Copy-DbaDataCollector { + <# + .SYNOPSIS + Migrates user SQL Data Collector collection sets. SQL Data Collector configuration is on the agenda, but it's hard. + + .DESCRIPTION + By default, all data collector objects are migrated. If the object already exists on the destination, it will be skipped unless -Force is used. + + The -CollectionSet parameter is auto-populated for command-line completion and can be used to copy only specific objects. + + .PARAMETER Source + Source SQL Server. You must have sysadmin access and server version must be SQL Server version 2008 or higher. + + .PARAMETER SourceSqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Destination + Destination Sql Server. You must have sysadmin access and server version must be SQL Server version 2008 or higher. + + .PARAMETER DestinationSqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER CollectionSet + The collection set(s) to process - this list is auto-populated from the server. If unspecified, all collection sets will be processed. + + .PARAMETER ExcludeCollectionSet + The collection set(s) to exclude - this list is auto-populated from the server + + .PARAMETER NoServerReconfig + Upcoming parameter to enable server reconfiguration + + .PARAMETER WhatIf + Shows what would happen if the command were to run. No actions are actually performed. + + .PARAMETER Confirm + Prompts you for confirmation before executing any changing operations within the command. + + .PARAMETER Force + If collection sets exists on destination server, it will be dropped and recreated. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Migration,DataCollection + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + Requires: sysadmin access on SQL Servers + + .LINK + https://dbatools.io/Copy-DbaDataCollector + + .EXAMPLE + PS C:\> Copy-DbaDataCollector -Source sqlserver2014a -Destination sqlcluster + + Copies all Data Collector Objects and Configurations from sqlserver2014a to sqlcluster, using Windows credentials. + + .EXAMPLE + PS C:\> Copy-DbaDataCollector -Source sqlserver2014a -Destination sqlcluster -SourceSqlCredential $cred + + Copies all Data Collector Objects and Configurations from sqlserver2014a to sqlcluster, using SQL credentials for sqlserver2014a and Windows credentials for sqlcluster. + + .EXAMPLE + PS C:\> Copy-DbaDataCollector -Source sqlserver2014a -Destination sqlcluster -WhatIf + + Shows what would happen if the command were executed. + + .EXAMPLE + PS C:\> Copy-DbaDataCollector -Source sqlserver2014a -Destination sqlcluster -CollectionSet 'Server Activity', 'Table Usage Analysis' + + Copies two Collection Sets, Server Activity and Table Usage Analysis, from sqlserver2014a to sqlcluster. + + #> + [CmdletBinding(DefaultParameterSetName = "Default", SupportsShouldProcess)] + param ( + [parameter(Mandatory)] + [DbaInstanceParameter]$Source, + [PSCredential] + $SourceSqlCredential, + [parameter(Mandatory)] + [DbaInstanceParameter[]]$Destination, + [PSCredential] + $DestinationSqlCredential, + [object[]]$CollectionSet, + [object[]]$ExcludeCollectionSet, + [switch]$NoServerReconfig, + [switch]$Force, + [Alias('Silent')] + [switch]$EnableException + ) + begin { + if (-not $script:isWindows) { + Stop-Function -Message "Copy-DbaDataCollector does not support Linux - we're still waiting for the Core SMOs from Microsoft" + return + } + try { + $sourceServer = Connect-SqlInstance -SqlInstance $Source -SqlCredential $SourceSqlCredential -MinimumVersion 10 + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $Source + return + } + $sourceSqlConn = $sourceServer.ConnectionContext.SqlConnectionObject + $sourceSqlStoreConnection = New-Object Microsoft.SqlServer.Management.Sdk.Sfc.SqlStoreConnection $sourceSqlConn + $sourceStore = New-Object Microsoft.SqlServer.Management.Collector.CollectorConfigStore $sourceSqlStoreConnection + $configDb = $sourceStore.ScriptAlter().GetScript() | Out-String + $configDb = $configDb -replace [Regex]::Escape("'$source'"), "'$destReplace'" + } + process { + if (Test-FunctionInterrupt) { return } + foreach ($destinstance in $Destination) { + + try { + $destServer = Connect-SqlInstance -SqlInstance $destinstance -SqlCredential $DestinationSqlCredential -MinimumVersion 10 + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $destinstance -Continue + } + if ($NoServerReconfig -eq $false) { + if ($Pscmdlet.ShouldProcess($destinstance, "Server reconfiguration not yet supported. Only Collection Set migration will be migrated at this time.")) { + Write-Message -Level Verbose -Message "Server reconfiguration not yet supported. Only Collection Set migration will be migrated at this time." + $NoServerReconfig = $true + + <# for future use when this support is added #> + $copyServerConfigStatus = [pscustomobject]@{ + SourceServer = $sourceServer.Name + DestinationServer = $destServer.Name + Name = $userName + Type = "Data Collection Server Config" + Status = "Skipped" + Notes = "Not supported at this time" + DateTime = [DbaDateTime](Get-Date) + } + $copyServerConfigStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + } + } + $destSqlConn = $destServer.ConnectionContext.SqlConnectionObject + $destSqlStoreConnection = New-Object Microsoft.SqlServer.Management.Sdk.Sfc.SqlStoreConnection $destSqlConn + $destStore = New-Object Microsoft.SqlServer.Management.Collector.CollectorConfigStore $destSqlStoreConnection + + if (!$NoServerReconfig) { + if ($Pscmdlet.ShouldProcess($destinstance, "Attempting to modify Data Collector configuration")) { + try { + $sql = "Unknown at this time" + $destServer.Query($sql) + $destStore.Alter() + } catch { + $copyServerConfigStatus.Status = "Failed" + $copyServerConfigStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + Stop-Function -Message "Issue modifying Data Collector configuration" -Target $destServer -ErrorRecord $_ + } + } + } + + if ($destStore.Enabled -eq $false) { + Write-Message -Level Verbose -Message "The Data Collector must be setup initially for Collection Sets to be migrated. Setup the Data Collector and try again." + continue + } + + $storeCollectionSets = $sourceStore.CollectionSets | Where-Object { $_.IsSystem -eq $false } + if ($CollectionSet) { + $storeCollectionSets = $storeCollectionSets | Where-Object Name -In $CollectionSet + } + if ($ExcludeCollectionSet) { + $storeCollectionSets = $storeCollectionSets | Where-Object Name -NotIn $ExcludeCollectionSet + } + + Write-Message -Level Verbose -Message "Migrating collection sets" + foreach ($set in $storeCollectionSets) { + $collectionName = $set.Name + + $copyCollectionSetStatus = [pscustomobject]@{ + SourceServer = $sourceServer.Name + DestinationServer = $destServer.Name + Name = $collectionName + Type = "Collection Set" + Status = $null + Notes = $null + DateTime = [DbaDateTime](Get-Date) + } + + if ($null -ne $destStore.CollectionSets[$collectionName]) { + if ($force -eq $false) { + if ($Pscmdlet.ShouldProcess($destinstance, "Collection Set '$collectionName' was skipped because it already exists on $destinstance. Use -Force to drop and recreate")) { + Write-Message -Level Verbose -Message "Collection Set '$collectionName' was skipped because it already exists on $destinstance. Use -Force to drop and recreate" + + $copyCollectionSetStatus.Status = "Skipped" + $copyCollectionSetStatus.Notes = "Already exists on destination" + $copyCollectionSetStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + } + continue + } else { + if ($Pscmdlet.ShouldProcess($destinstance, "Attempting to drop $collectionName")) { + Write-Message -Level Verbose -Message "Collection Set '$collectionName' exists on $destinstance" + Write-Message -Level Verbose -Message "Force specified. Dropping $collectionName." + + try { + $destStore.CollectionSets[$collectionName].Drop() + } catch { + $copyCollectionSetStatus.Status = "Failed to drop on destination" + $copyCollectionSetStatus.Notes = (Get-ErrorMessage -Record $_) + $copyCollectionSetStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + Stop-Function -Message "Issue dropping collection" -Target $collectionName -ErrorRecord $_ -Continue + } + } + } + } + + if ($Pscmdlet.ShouldProcess($destinstance, "Migrating collection set $collectionName")) { + try { + $sql = $set.ScriptCreate().GetScript() | Out-String + $sql = $sql -replace [Regex]::Escape("'$source'"), "'$destinstance'" + Write-Message -Level Debug -Message $sql + Write-Message -Level Verbose -Message "Migrating collection set $collectionName" + $destServer.Query($sql) + + $copyCollectionSetStatus.Status = "Successful" + $copyCollectionSetStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + } catch { + $copyCollectionSetStatus.Status = "Failed to create collection" + $copyCollectionSetStatus.Notes = (Get-ErrorMessage -Record $_) + + Stop-Function -Message "Issue creating collection set" -Target $collectionName -ErrorRecord $_ + } + + try { + if ($set.IsRunning) { + Write-Message -Level Verbose -Message "Starting collection set $collectionName" + $destStore.CollectionSets.Refresh() + $destStore.CollectionSets[$collectionName].Start() + } + + $copyCollectionSetStatus.Status = "Successful started Collection" + $copyCollectionSetStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + } catch { + $copyCollectionSetStatus.Status = "Failed to start collection" + $copyCollectionSetStatus.Notes = (Get-ErrorMessage -Record $_) + $copyCollectionSetStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + + Stop-Function -Message "Issue starting collection set" -Target $collectionName -ErrorRecord $_ + } + } + } + } + } + end { + Test-DbaDeprecation -DeprecatedOn "1.0.0" -EnableException:$false -Alias Copy-SqlDataCollector + Test-DbaDeprecation -DeprecatedOn "1.0.0" -EnableException:$false -Alias Copy-DbaSqlDataCollector + if (Test-FunctionInterrupt) { return } + } +} +function Copy-DbaDbAssembly { + <# + .SYNOPSIS + Copy-DbaDbAssembly migrates assemblies from one SQL Server to another. + + .DESCRIPTION + By default, all assemblies are copied. + + If the assembly already exists on the destination, it will be skipped unless -Force is used. + + This script does not yet copy dependencies or dependent objects. + + .PARAMETER Source + Source SQL Server. You must have sysadmin access and server version must be SQL Server version 2000 or higher. + + .PARAMETER SourceSqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Destination + Destination SQL Server. You must have sysadmin access and the server must be SQL Server 2000 or higher. + + .PARAMETER DestinationSqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Assembly + The assembly(ies) to process. This list is auto-populated from the server. If unspecified, all assemblies will be processed. + + .PARAMETER ExcludeAssembly + The assembly(ies) to exclude. This list is auto-populated from the server. + + .PARAMETER WhatIf + If this switch is enabled, no actions are performed but informational messages will be displayed that explain what would happen if the command were to run. + + .PARAMETER Confirm + If this switch is enabled, you will be prompted for confirmation before executing any operations that change state. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .PARAMETER Force + If this switch is enabled, existing assemblies on Destination with matching names from Source will be dropped. + + .NOTES + Tags: Migration, Assembly + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + Requires: sysadmin access on SQL Servers + + .LINK + http://dbatools.io/Get-SqlDatabaseAssembly + + .EXAMPLE + PS C:\> Copy-DbaDbAssembly -Source sqlserver2014a -Destination sqlcluster + + Copies all assemblies from sqlserver2014a to sqlcluster using Windows credentials. If assemblies with the same name exist on sqlcluster, they will be skipped. + + .EXAMPLE + PS C:\> Copy-DbaDbAssembly -Source sqlserver2014a -Destination sqlcluster -Assembly dbname.assemblyname, dbname3.anotherassembly -SourceSqlCredential $cred -Force + + Copies two assemblies, the dbname.assemblyname and dbname3.anotherassembly from sqlserver2014a to sqlcluster using SQL credentials for sqlserver2014a and Windows credentials for sqlcluster. If an assembly with the same name exists on sqlcluster, it will be dropped and recreated because -Force was used. + + In this example, anotherassembly will be copied to the dbname3 database on the server sqlcluster. + + .EXAMPLE + PS C:\> Copy-DbaDbAssembly -Source sqlserver2014a -Destination sqlcluster -WhatIf -Force + + Shows what would happen if the command were executed using force. + + #> + [CmdletBinding(DefaultParameterSetName = "Default", SupportsShouldProcess)] + param ( + [parameter(Mandatory)] + [DbaInstanceParameter]$Source, + [PSCredential]$SourceSqlCredential, + [parameter(Mandatory)] + [DbaInstanceParameter[]]$Destination, + [PSCredential]$DestinationSqlCredential, + [object[]]$Assembly, + [object[]]$ExcludeAssembly, + [switch]$Force, + [Alias('Silent')] + [switch]$EnableException + ) + begin { + try { + $sourceServer = Connect-SqlInstance -SqlInstance $Source -SqlCredential $SourceSqlCredential -MinimumVersion 9 + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $Source + return + } + $sourceAssemblies = @() + foreach ($database in ($sourceServer.Databases | Where-Object IsAccessible)) { + Write-Message -Level Verbose -Message "Processing $database on source" + + try { + # a bug here requires a try/catch + $userAssemblies = $database.Assemblies | Where-Object IsSystemObject -eq $false + foreach ($assembly in $userAssemblies) { + $sourceAssemblies += $assembly + } + } catch { + #here to avoid an empty catch + $null = 1 + } + } + } + process { + if (Test-FunctionInterrupt) { return } + foreach ($destinstance in $Destination) { + try { + $destServer = Connect-SqlInstance -SqlInstance $destinstance -SqlCredential $DestinationSqlCredential -MinimumVersion 9 + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $destinstance -Continue + } + + $destAssemblies = @() + foreach ($database in $destServer.Databases) { + Write-Message -Level VeryVerbose -Message "Processing $database on destination" + try { + # a bug here requires a try/catch + $userAssemblies = $database.Assemblies | Where-Object IsSystemObject -eq $false + foreach ($assembly in $userAssemblies) { + $destAssemblies += $assembly + } + } catch { + #here to avoid an empty catch + $null = 1 + } + } + foreach ($currentAssembly in $sourceAssemblies) { + $assemblyName = $currentAssembly.Name + $dbName = $currentAssembly.Parent.Name + $destDb = $destServer.Databases[$dbName] + Write-Message -Level VeryVerbose -Message "Processing $assemblyName on $dbname" + $copyDbAssemblyStatus = [pscustomobject]@{ + SourceServer = $sourceServer.Name + SourceDatabase = $dbName + DestinationServer = $destServer.Name + DestinationDatabase = $destDb + type = "Database Assembly" + Name = $assemblyName + Status = $null + Notes = $null + DateTime = [Sqlcollaborative.Dbatools.Utility.DbaDateTime](Get-Date) + } + + + if (!$destDb) { + $copyDbAssemblyStatus.Status = "Skipped" + $copyDbAssemblyStatus.Notes = "Destination database does not exist" + $copyDbAssemblyStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + + Write-Message -Level Verbose -Message "Destination database $dbName does not exist. Skipping $assemblyName."; + continue + } + + if ((Test-Bound -ParameterName Assembly) -and $Assembly -notcontains "$dbName.$assemblyName" -or $ExcludeAssembly -contains "$dbName.$assemblyName") { + continue + } + + if ($currentAssembly.AssemblySecurityLevel -eq "External" -and -not $destDb.Trustworthy) { + if ($Pscmdlet.ShouldProcess($destinstance, "Setting $dbName to External")) { + Write-Message -Level Verbose -Message "Setting $dbName Security Level to External on $destinstance." + $sql = "ALTER DATABASE $dbName SET TRUSTWORTHY ON" + try { + Write-Message -Level Debug -Message $sql + $destServer.Query($sql) + } catch { + $copyDbAssemblyStatus.Status = "Failed" + $copyDbAssemblyStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + + Stop-Function -Message "Issue setting security level." -Target $destDb -ErrorRecord $_ + } + } + } + + if ($destServer.Databases[$dbName].Assemblies.Name -contains $currentAssembly.name) { + if ($force -eq $false) { + $copyDbAssemblyStatus.Status = "Skipped" + $copyDbAssemblyStatus.Notes = "Already exists on destination" + $copyDbAssemblyStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + + Write-Message -Level Verbose -Message "Assembly $assemblyName exists at destination in the $dbName database. Use -Force to drop and migrate." + continue + } else { + if ($Pscmdlet.ShouldProcess($destinstance, "Dropping assembly $assemblyName and recreating")) { + try { + Write-Message -Level Verbose -Message "Dropping assembly $assemblyName." + Write-Message -Level Verbose -Message "This won't work if there are dependencies." + $destServer.Databases[$dbName].Assemblies[$assemblyName].Drop() + Write-Message -Level Verbose -Message "Copying assembly $assemblyName." + $sql = $currentAssembly.Script() + Write-Message -Level Debug -Message $sql + $destServer.Query($sql, $dbName) + } catch { + $copyDbAssemblyStatus.Status = "Failed" + $copyDbAssemblyStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + + Stop-Function -Message "Issue dropping assembly." -Target $assemblyName -ErrorRecord $_ -Continue + } + } + } + } + + if ($Pscmdlet.ShouldProcess($destinstance, "Creating assembly $assemblyName")) { + try { + Write-Message -Level Verbose -Message "Copying assembly $assemblyName from database." + $sql = $currentAssembly.Script() + Write-Message -Level Debug -Message $sql + $destServer.Query($sql, $dbName) + + $copyDbAssemblyStatus.Status = "Successful" + $copyDbAssemblyStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + + } catch { + $copyDbAssemblyStatus.Status = "Failed" + $copyDbAssemblyStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + + Stop-Function -Message "Issue creating assembly." -Target $assemblyName -ErrorRecord $_ + } + } + } + } + } + end { + Test-DbaDeprecation -DeprecatedOn "1.0.0" -EnableException:$false -Alias Copy-SqlDatabaseAssembly + Test-DbaDeprecation -DeprecatedOn "1.0.0" -EnableException:$false -Alias Copy-DbaDatabaseAssembly + } +} +function Copy-DbaDbMail { + <# + .SYNOPSIS + Migrates Mail Profiles, Accounts, Mail Servers and Mail Server Configs from one SQL Server to another. + + .DESCRIPTION + By default, all mail configurations for Profiles, Accounts, Mail Servers and Configs are copied. + + .PARAMETER Source + Source SQL Server. You must have sysadmin access and server version must be SQL Server version 2000 or higher. + + .PARAMETER SourceSqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Destination + Destination SQL Server. You must have sysadmin access and the server must be SQL Server 2000 or higher. + + .PARAMETER DestinationSqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Type + Specifies the object type to migrate. Valid options are "Job", "Alert" and "Operator". When Type is specified, all categories from the selected type will be migrated. + + .PARAMETER WhatIf + If this switch is enabled, no actions are performed but informational messages will be displayed that explain what would happen if the command were to run. + + .PARAMETER Confirm + If this switch is enabled, you will be prompted for confirmation before executing any operations that change state. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .PARAMETER Force + If this switch is enabled, existing objects on Destination with matching names from Source will be dropped. + + .NOTES + Tags: Migration, Mail + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + Requires: sysadmin access on SQL Servers + + .LINK + https://dbatools.io/Copy-DbaDbMail + + .EXAMPLE + PS C:\> Copy-DbaDbMail -Source sqlserver2014a -Destination sqlcluster + + Copies all database mail objects from sqlserver2014a to sqlcluster using Windows credentials. If database mail objects with the same name exist on sqlcluster, they will be skipped. + + .EXAMPLE + PS C:\> Copy-DbaDbMail -Source sqlserver2014a -Destination sqlcluster -SourceSqlCredential $cred + + Copies all database mail objects from sqlserver2014a to sqlcluster using SQL credentials for sqlserver2014a and Windows credentials for sqlcluster. + + .EXAMPLE + PS C:\> Copy-DbaDbMail -Source sqlserver2014a -Destination sqlcluster -WhatIf + + Shows what would happen if the command were executed. + + .EXAMPLE + PS C:\> Copy-DbaDbMail -Source sqlserver2014a -Destination sqlcluster -EnableException + + Performs execution of function, and will throw a terminating exception if something breaks + + #> + [cmdletbinding(DefaultParameterSetName = "Default", SupportsShouldProcess)] + param ( + [parameter(Mandatory)] + [DbaInstanceParameter]$Source, + [parameter(Mandatory)] + [DbaInstanceParameter[]]$Destination, + [Parameter(ParameterSetName = 'SpecificTypes')] + [ValidateSet('ConfigurationValues', 'Profiles', 'Accounts', 'mailServers')] + [string[]]$Type, + [PSCredential]$SourceSqlCredential, + [PSCredential]$DestinationSqlCredential, + [switch]$Force, + [Alias('Silent')] + [switch]$EnableException + ) + begin { + function Copy-DbaDbMailConfig { + [cmdletbinding(SupportsShouldProcess)] + param () + + Write-Message -Message "Migrating mail server configuration values." -Level Verbose + $copyMailConfigStatus = [pscustomobject]@{ + SourceServer = $sourceServer.Name + DestinationServer = $destServer.Name + Name = "Server Configuration" + Type = "Mail Configuration" + Status = $null + Notes = $null + DateTime = [Sqlcollaborative.Dbatools.Utility.DbaDateTime](Get-Date) + } + if ($pscmdlet.ShouldProcess($destinstance, "Migrating all mail server configuration values.")) { + try { + $sql = $mail.ConfigurationValues.Script() | Out-String + $sql = $sql -replace [Regex]::Escape("'$source'"), "'$destinstance'" + Write-Message -Message $sql -Level Debug + $destServer.Query($sql) | Out-Null + $mail.ConfigurationValues.Refresh() + $copyMailConfigStatus.Status = "Successful" + } catch { + $copyMailConfigStatus.Status = "Failed" + $copyMailConfigStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + Stop-Function -Message "Unable to migrate mail configuration." -Category InvalidOperation -InnerErrorRecord $_ -Target $destServer + } + $copyMailConfigStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + } + } + + function Copy-DbaDatabaseAccount { + [cmdletbinding(SupportsShouldProcess)] + $sourceAccounts = $sourceServer.Mail.Accounts + $destAccounts = $destServer.Mail.Accounts + + Write-Message -Message "Migrating accounts." -Level Verbose + foreach ($account in $sourceAccounts) { + $accountName = $account.name + $newAccountName = $accountName -replace [Regex]::Escape($source), $destinstance + Write-Message -Message "Updating account name from '$accountName' to '$newAccountName'." -Level Verbose + $copyMailAccountStatus = [pscustomobject]@{ + SourceServer = $sourceServer.Name + DestinationServer = $destServer.Name + Name = $accountName + Type = "Mail Account" + Status = $null + Notes = $null + DateTime = [Sqlcollaborative.Dbatools.Utility.DbaDateTime](Get-Date) + } + + if ($accounts.count -gt 0 -and $accounts -notcontains $newAccountName) { + continue + } + + if ($destAccounts.name -contains $newAccountName) { + if ($force -eq $false) { + If ($pscmdlet.ShouldProcess($destinstance, "Account '$newAccountName' exists at destination. Use -Force to drop and migrate.")) { + $copyMailAccountStatus.Status = "Skipped" + $copyMailAccountStatus.Notes = "Already exists on destination" + $copyMailAccountStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + Write-Message -Message "Account $newAccountName exists at destination. Use -Force to drop and migrate." -Level Verbose + } + continue + } + + If ($pscmdlet.ShouldProcess($destinstance, "Dropping account '$newAccountName' and recreating.")) { + try { + Write-Message -Message "Dropping account '$newAccountName'." -Level Verbose + $destServer.Mail.Accounts[$newAccountName].Drop() + $destServer.Mail.Accounts.Refresh() + } catch { + $copyMailAccountStatus.Status = "Failed" + $copyMailAccountStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + Stop-Function -Message "Issue dropping account." -Target $accountName -Category InvalidOperation -InnerErrorRecord $_ -Continue + } + } + } + + if ($pscmdlet.ShouldProcess($destinstance, "Migrating account '$accountName'.")) { + try { + Write-Message -Message "Copying mail account '$accountName'." -Level Verbose + $sql = $account.Script() | Out-String + $sql = $sql -replace "(?<=@account_name=N'[\d\w\s']*)$sourceRegEx(?=[\d\w\s']*',)", $destinstance + Write-Message -Message $sql -Level Debug + $destServer.Query($sql) | Out-Null + $copyMailAccountStatus.Status = "Successful" + } catch { + $copyMailAccountStatus.Status = "Failed" + $copyMailAccountStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + Stop-Function -Message "Issue copying mail account." -Target $newAccountName -Category InvalidOperation -InnerErrorRecord $_ + } + $copyMailAccountStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + } + } + } + + function Copy-DbaDbMailProfile { + + $sourceProfiles = $sourceServer.Mail.Profiles + $destProfiles = $destServer.Mail.Profiles + + Write-Message -Message "Migrating mail profiles." -Level Verbose + foreach ($profile in $sourceProfiles) { + + $profileName = $profile.name + $newProfileName = $profileName -replace [Regex]::Escape($source), $destinstance + Write-Message -Message "Updating profile name from '$profileName' to '$newProfileName'." -Level Verbose + $copyMailProfileStatus = [pscustomobject]@{ + SourceServer = $sourceServer.Name + DestinationServer = $destServer.Name + Name = $profileName + Type = "Mail Profile" + Status = $null + Notes = $null + DateTime = [Sqlcollaborative.Dbatools.Utility.DbaDateTime](Get-Date) + } + + if ($profiles.count -gt 0 -and $profiles -notcontains $newProfileName) { + continue + } + + if ($destProfiles.name -contains $newProfileName) { + if ($force -eq $false) { + If ($pscmdlet.ShouldProcess($destinstance, "Profile '$newProfileName' exists at destination. Use -Force to drop and migrate.")) { + $copyMailProfileStatus.Status = "Skipped" + $copyMailProfileStatus.Notes = "Already exists on destination" + $copyMailProfileStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + Write-Message -Message "Profile '$newProfileName' exists at destination. Use -Force to drop and migrate." -Level Verbose + } + continue + } + + If ($pscmdlet.ShouldProcess($destinstance, "Dropping profile '$newProfileName' and recreating.")) { + try { + Write-Message -Message "Dropping profile '$newProfileName'." -Level Verbose + $destServer.Mail.Profiles[$newProfileName].Drop() + $destServer.Mail.Profiles.Refresh() + } catch { + $copyMailProfileStatus.Status = "Failed" + $copyMailProfileStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + Stop-Function -Message "Issue dropping profile." -Target $newProfileName -Category InvalidOperation -InnerErrorRecord $_ -Continue + } + } + } + + if ($pscmdlet.ShouldProcess($destinstance, "Migrating mail profile '$profileName'.")) { + try { + Write-Message -Message "Copying mail profile '$profileName'." -Level Verbose + $sql = $profile.Script() | Out-String + $sql = $sql -replace "(?<=@account_name=N'[\d\w\s']*)$sourceRegEx(?=[\d\w\s']*',)", $destinstance + $sql = $sql -replace "(?<=@profile_name=N'[\d\w\s']*)$sourceRegEx(?=[\d\w\s']*',)", $destinstance + Write-Message -Message $sql -Level Debug + $destServer.Query($sql) | Out-Null + $destServer.Mail.Profiles.Refresh() + $copyMailProfileStatus.Status = "Successful" + } catch { + $copyMailProfileStatus.Status = "Failed" + $copyMailProfileStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + Stop-Function -Message "Issue copying mail profile." -Target $profileName -Category InvalidOperation -InnerErrorRecord $_ + } + $copyMailProfileStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + } + } + } + + function Copy-DbaDbMailServer { + [cmdletbinding(SupportsShouldProcess)] + $sourceMailServers = $sourceServer.Mail.Accounts.MailServers + $destMailServers = $destServer.Mail.Accounts.MailServers + + Write-Message -Message "Migrating mail servers." -Level Verbose + foreach ($mailServer in $sourceMailServers) { + $mailServerName = $mailServer.name + $copyMailServerStatus = [pscustomobject]@{ + SourceServer = $sourceServer.Name + DestinationServer = $destServer.Name + Name = $mailServerName + Type = "Mail Server" + Status = $null + Notes = $null + DateTime = [Sqlcollaborative.Dbatools.Utility.DbaDateTime](Get-Date) + } + if ($mailServers.count -gt 0 -and $mailServers -notcontains $mailServerName) { + continue + } + + if ($destMailServers.name -contains $mailServerName) { + if ($force -eq $false) { + if ($pscmdlet.ShouldProcess($destinstance, "Mail server $mailServerName exists at destination. Use -Force to drop and migrate.")) { + $copyMailServerStatus.Status = "Skipped" + $copyMailServerStatus.Notes = "Already exists on destination" + $copyMailServerStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + Write-Message -Message "Mail server $mailServerName exists at destination. Use -Force to drop and migrate." -Level Verbose + } + continue + } + + If ($pscmdlet.ShouldProcess($destinstance, "Dropping mail server $mailServerName and recreating.")) { + try { + Write-Message -Message "Dropping mail server $mailServerName." -Level Verbose + $destServer.Mail.Accounts.MailServers[$mailServerName].Drop() + } catch { + $copyMailServerStatus.Status = "Failed" + $copyMailServerStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + Stop-Function -Message "Issue dropping mail server." -Target $mailServerName -Category InvalidOperation -InnerErrorRecord $_ -Continue + } + } + } + + if ($pscmdlet.ShouldProcess($destinstance, "Migrating account mail server $mailServerName.")) { + try { + Write-Message -Message "Copying mail server $mailServerName." -Level Verbose + $sql = $mailServer.Script() | Out-String + $sql = $sql -replace "(?<=@account_name=N'[\d\w\s']*)$sourceRegEx(?=[\d\w\s']*',)", $destinstance + Write-Message -Message $sql -Level Debug + $destServer.Query($sql) | Out-Null + $copyMailServerStatus.Status = "Successful" + } catch { + $copyMailServerStatus.Status = "Failed" + $copyMailServerStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + Stop-Function -Message "Issue copying mail server" -Target $mailServerName -Category InvalidOperation -InnerErrorRecord $_ + } + $copyMailServerStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + } + } + } + + try { + $sourceServer = Connect-SqlInstance -SqlInstance $Source -SqlCredential $SourceSqlCredential -MinimumVersion 9 + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $Source + return + } + $mail = $sourceServer.mail + $sourceRegEx = [RegEx]::Escape($source) + } + process { + if (Test-FunctionInterrupt) { return } + foreach ($destinstance in $Destination) { + try { + $destServer = Connect-SqlInstance -SqlInstance $destinstance -SqlCredential $DestinationSqlCredential -MinimumVersion 9 + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $destinstance -Continue + } + + if ($type.Count -gt 0) { + + switch ($type) { + "ConfigurationValues" { + Copy-DbaDbMailConfig + $destServer.Mail.ConfigurationValues.Refresh() + } + + "Profiles" { + Copy-DbaDbMailProfile + $destServer.Mail.Profiles.Refresh() + } + + "Accounts" { + Copy-DbaDatabaseAccount + $destServer.Mail.Accounts.Refresh() + } + + "mailServers" { + Copy-DbaDbMailServer + } + } + + continue + } + + if (($profiles.count + $accounts.count + $mailServers.count) -gt 0) { + + if ($profiles.count -gt 0) { + Copy-DbaDbMailProfile -Profiles $profiles + $destServer.Mail.Profiles.Refresh() + } + + if ($accounts.count -gt 0) { + Copy-DbaDatabaseAccount -Accounts $accounts + $destServer.Mail.Accounts.Refresh() + } + + if ($mailServers.count -gt 0) { + Copy-DbaDbMailServer -mailServers $mailServers + } + + continue + } + + Copy-DbaDbMailConfig + $destServer.Mail.ConfigurationValues.Refresh() + Copy-DbaDatabaseAccount + $destServer.Mail.Accounts.Refresh() + Copy-DbaDbMailProfile + $destServer.Mail.Profiles.Refresh() + Copy-DbaDbMailServer + $copyMailConfigStatus + $copyMailAccountStatus + $copyMailProfileStatus + $copyMailServerStatus + $enableDBMailStatus + + <# ToDo: Use Get/Set-DbaSpConfigure once the dynamic parameters are replaced. #> + + if (($sourceDbMailEnabled -eq 1) -and ($destDbMailEnabled -eq 0)) { + if ($pscmdlet.ShouldProcess($destinstance, "Enabling Database Mail")) { + $sourceDbMailEnabled = ($sourceServer.Configuration.DatabaseMailEnabled).ConfigValue + Write-Message -Message "$sourceServer DBMail configuration value: $sourceDbMailEnabled." -Level Verbose + + $destDbMailEnabled = ($destServer.Configuration.DatabaseMailEnabled).ConfigValue + Write-Message -Message "$destServer DBMail configuration value: $destDbMailEnabled." -Level Verbose + $enableDBMailStatus = [pscustomobject]@{ + SourceServer = $sourceServer.name + DestinationServer = $destServer.name + Name = "Enabled on Destination" + Type = "Mail Configuration" + Status = if ($destDbMailEnabled -eq 1) { "Enabled" } else { $null } + DateTime = [Sqlcollaborative.Dbatools.Utility.DbaDateTime](Get-Date) + } + try { + Write-Message -Message "Enabling Database Mail on $destServer." -Level Verbose + $destServer.Configuration.DatabaseMailEnabled.ConfigValue = 1 + $destServer.Alter() + $enableDBMailStatus.Status = "Successful" + } catch { + $enableDBMailStatus.Status = "Failed" + $enableDBMailStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + Stop-Function -Message "Cannot enable Database Mail." -Category InvalidOperation -ErrorRecord $_ -Target $destServer + } + $enableDBMailStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + } + } + } + } + end { + Test-DbaDeprecation -DeprecatedOn "1.0.0" -EnableException:$false -Alias Copy-SqlDatabaseMail + Test-DbaDeprecation -DeprecatedOn "1.0.0" -EnableException:$false -Alias Copy-DbaDatabaseMail + } +} +function Copy-DbaDbQueryStoreOption { + <# + .SYNOPSIS + Copies the configuration of a Query Store enabled database and sets the copied configuration on other databases. + + .DESCRIPTION + Copies the configuration of a Query Store enabled database and sets the copied configuration on other databases. + + .PARAMETER Source + Source SQL Server. You must have sysadmin access and server version must be SQL Server version 2016 or higher. + + .PARAMETER SourceSqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER SourceDatabase + Specifies the database to copy the Query Store configuration from. + + .PARAMETER Destination + Destination SQL Server. You must have sysadmin access and the server must be SQL Server 2016 or higher. + + .PARAMETER DestinationSqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER DestinationDatabase + Specifies a list of databases that will receive a copy of the Query Store configuration of the SourceDatabase. + + .PARAMETER Exclude + Specifies a list of databases which will NOT receive a copy of the Query Store configuration. + + .PARAMETER AllDatabases + If this switch is enabled, the Query Store configuration will be copied to all databases on the destination instance. + + .PARAMETER WhatIf + If this switch is enabled, no actions are performed but informational messages will be displayed that explain what would happen if the command were to run. + + .PARAMETER Confirm + If this switch is enabled, you will be prompted for confirmation before executing any operations that change state. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: QueryStore + Author: Enrico van de Laar (@evdlaar) + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Copy-QueryStoreConfig + + .EXAMPLE + PS C:\> Copy-DbaDbQueryStoreOption -Source ServerA\SQL -SourceDatabase AdventureWorks -Destination ServerB\SQL -AllDatabases + + Copy the Query Store configuration of the AdventureWorks database in the ServerA\SQL instance and apply it on all user databases in the ServerB\SQL Instance. + + .EXAMPLE + PS C:\> Copy-DbaDbQueryStoreOption -Source ServerA\SQL -SourceDatabase AdventureWorks -Destination ServerB\SQL -DestinationDatabase WorldWideTraders + + Copy the Query Store configuration of the AdventureWorks database in the ServerA\SQL instance and apply it to the WorldWideTraders database in the ServerB\SQL Instance. + + #> + [CmdletBinding(SupportsShouldProcess)] + param ( + [parameter(Mandatory, ValueFromPipeline)] + [DbaInstanceParameter]$Source, + [PSCredential]$SourceSqlCredential, + [parameter(Mandatory, ValueFromPipeline)] + [object]$SourceDatabase, + [parameter(Mandatory, ValueFromPipeline)] + [DbaInstanceParameter[]]$Destination, + [PSCredential]$DestinationSqlCredential, + [object[]]$DestinationDatabase, + [object[]]$Exclude, + [switch]$AllDatabases, + [Alias('Silent')] + [switch]$EnableException + ) + + begin { + Test-DbaDeprecation -DeprecatedOn "1.0.0" -Alias Copy-DbaQueryStoreConfig + try { + $sourceServer = Connect-SqlInstance -SqlInstance $Source -SqlCredential $SourceSqlCredential + } catch { + Stop-Function -Message "Can't connect to $Source." -ErrorRecord $_ -Target $Source + return + } + } + + process { + if (Test-FunctionInterrupt) { return } + foreach ($destinstance in $Destination) { + # Grab the Query Store configuration from the SourceDatabase through the Get-DbaQueryStoreConfig function + $SourceQSConfig = Get-DbaDbQueryStoreOption -SqlInstance $sourceServer -Database $SourceDatabase + + if (!$DestinationDatabase -and !$Exclude -and !$AllDatabases) { + Stop-Function -Message "You must specify databases to execute against using either -DestinationDatabase, -Exclude or -AllDatabases." -Continue + } + + foreach ($destinationServer in $destinstance) { + + try { + $destServer = Connect-SqlInstance -SqlInstance $destinstance -SqlCredential $DestinationSqlCredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $destinstance -Continue + } + + # We have to exclude all the system databases since they cannot have the Query Store feature enabled + $dbs = Get-DbaDatabase -SqlInstance $destServer -ExcludeSystem + + if ($DestinationDatabase.count -gt 0) { + $dbs = $dbs | Where-Object { $DestinationDatabase -contains $_.Name } + } + + if ($Exclude.count -gt 0) { + $dbs = $dbs | Where-Object { $exclude -notcontains $_.Name } + } + + if ($dbs.count -eq 0) { + Stop-Function -Message "No matching databases found. Check the spelling and try again." -Continue + } + + foreach ($db in $dbs) { + # skipping the database if the source and destination are the same instance + if (($sourceServer.Name -eq $destinationServer) -and ($SourceDatabase -eq $db.Name)) { + continue + } + Write-Message -Message "Processing destination database: $db on $destinationServer." -Level Verbose + $copyQueryStoreStatus = [pscustomobject]@{ + SourceServer = $sourceServer.name + SourceDatabase = $SourceDatabase + DestinationServer = $destinationServer + Name = $db.name + Type = "QueryStore Configuration" + Status = $null + DateTime = [Sqlcollaborative.Dbatools.Utility.DbaDateTime](Get-Date) + } + + if ($db.IsAccessible -eq $false) { + $copyQueryStoreStatus.Status = "Skipped" + Stop-Function -Message "The database $db on server $destinationServer is not accessible. Skipping database." -Continue + } + + Write-Message -Message "Executing Set-DbaQueryStoreConfig." -Level Verbose + # Set the Query Store configuration through the Set-DbaQueryStoreConfig function + if ($PSCmdlet.ShouldProcess("$db", "Copying QueryStoreConfig")) { + try { + + $setDbaDbQueryStoreOptionParameters = @{ + + SqlInstance = $destinationServer; + SqlCredential = $DestinationSqlCredential; + Database = $db.name; + State = $SourceQSConfig.ActualState; + FlushInterval = $SourceQSConfig.DataFlushIntervalInSeconds; + CollectionInterval = $SourceQSConfig.StatisticsCollectionIntervalInMinutes; + MaxSize = $SourceQSConfig.MaxStorageSizeInMB; + CaptureMode = $SourceQSConfig.QueryCaptureMode; + CleanupMode = $SourceQSConfig.SizeBasedCleanupMode; + StaleQueryThreshold = $SourceQSConfig.StaleQueryThresholdInDays; + } + + $null = Set-DbaDbQueryStoreOption @setDbaDbQueryStoreOptionParameters; + $copyQueryStoreStatus.Status = "Successful" + } catch { + $copyQueryStoreStatus.Status = "Failed" + Stop-Function -Message "Issue setting Query Store on $db." -Target $db -ErrorRecord $_ -Continue + } + $copyQueryStoreStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + } + } + } + } + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function Copy-DbaDbTableData { + <# + .SYNOPSIS + Copies data between SQL Server tables. + + .DESCRIPTION + Copies data between SQL Server tables using SQL Bulk Copy. + The same can be achieved also doing + $sourcetable = Invoke-DbaQuery -SqlInstance instance1 ... -As DataTable + Write-DbaDataTable -SqlInstance ... -InputObject $sourcetable + but it will force buffering the contents on the table in memory (high RAM usage for large tables). + With this function, a streaming copy will be done in the most speedy and least resource-intensive way. + + .PARAMETER SqlInstance + Source SQL Server.You must have sysadmin access and server version must be SQL Server version 2000 or greater. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Destination + Destination Sql Server. You must have sysadmin access and server version must be SQL Server version 2000 or greater. + + .PARAMETER DestinationSqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Database + The database to copy the table from. + + .PARAMETER DestinationDatabase + The database to copy the table to. If not specified, it is assumed to be the same of Database + + .PARAMETER Table + Define a specific table you would like to use as source. You can specify a three-part name like db.sch.tbl. + If the object has special characters please wrap them in square brackets [ ]. + This dbo.First.Table will try to find table named 'Table' on schema 'First' and database 'dbo'. + The correct way to find table named 'First.Table' on schema 'dbo' is passing dbo.[First.Table] + + .PARAMETER DestinationTable + The table you want to use as destination. If not specified, it is assumed to be the same of Table + + .PARAMETER Query + If you want to copy only a portion of a table or selected tables, specify the query. + Ensure to select all required columns. Calculated Columns or columns with default values may be excluded. + The tablename should be a full three-part name in form [Database].[Schema].[Table] + + .PARAMETER AutoCreateTable + Creates the destination table if it does not already exist, based off of the "Export..." script of the source table. + + .PARAMETER BatchSize + The BatchSize for the import defaults to 5000. + + .PARAMETER NotifyAfter + Sets the option to show the notification after so many rows of import + + .PARAMETER NoTableLock + If this switch is enabled, a table lock (TABLOCK) will not be placed on the destination table. By default, this operation will lock the destination table while running. + + .PARAMETER CheckConstraints + If this switch is enabled, the SqlBulkCopy option to process check constraints will be enabled. + + Per Microsoft "Check constraints while data is being inserted. By default, constraints are not checked." + + .PARAMETER FireTriggers + If this switch is enabled, the SqlBulkCopy option to fire insert triggers will be enabled. + + Per Microsoft "When specified, cause the server to fire the insert triggers for the rows being inserted into the Database." + + .PARAMETER KeepIdentity + If this switch is enabled, the SqlBulkCopy option to preserve source identity values will be enabled. + + Per Microsoft "Preserve source identity values. When not specified, identity values are assigned by the destination." + + .PARAMETER KeepNulls + If this switch is enabled, the SqlBulkCopy option to preserve NULL values will be enabled. + + Per Microsoft "Preserve null values in the destination table regardless of the settings for default values. When not specified, null values are replaced by default values where applicable." + + .PARAMETER Truncate + If this switch is enabled, the destination table will be truncated after prompting for confirmation. + + .PARAMETER BulkCopyTimeOut + Value in seconds for the BulkCopy operations timeout. The default is 30 seconds. + + .PARAMETER InputObject + Enables piping of Table objects from Get-DbaDbTable + + .PARAMETER WhatIf + If this switch is enabled, no actions are performed but informational messages will be displayed that explain what would happen if the command were to run. + + .PARAMETER Confirm + If this switch is enabled, you will be prompted for confirmation before executing any operations that change state. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Migration + Author: Simone Bizzotto (@niphlod) + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Copy-DbaDbTableData + + .EXAMPLE + PS C:\> Copy-DbaDbTableData -SqlInstance sql1 -Destination sql2 -Database dbatools_from -Table dbo.test_table + + Copies all the data from table dbo.test_table in database dbatools_from on sql1 to table test_table in database dbatools_from on sql2. + + .EXAMPLE + PS C:\> Copy-DbaDbTableData -SqlInstance sql1 -Destination sql2 -Database dbatools_from -DestinationDatabase dbatools_dest -Table [Schema].[test table] + + Copies all the data from table [Schema].[test table] in database dbatools_from on sql1 to table [Schema].[test table] in database dbatools_dest on sql2 + + .EXAMPLE + PS C:\> Get-DbaDbTable -SqlInstance sql1 -Database tempdb -Table tb1, tb2 | Copy-DbaDbTableData -DestinationTable tb3 + + Copies all data from tables tb1 and tb2 in tempdb on sql1 to tb3 in tempdb on sql1 + + .EXAMPLE + PS C:\> Get-DbaDbTable -SqlInstance sql1 -Database tempdb -Table tb1, tb2 | Copy-DbaDbTableData -Destination sql2 + + Copies data from tbl1 in tempdb on sql1 to tbl1 in tempdb on sql2 + then + Copies data from tbl2 in tempdb on sql1 to tbl2 in tempdb on sql2 + + .EXAMPLE + PS C:\> Copy-DbaDbTableData -SqlInstance sql1 -Destination sql2 -Database dbatools_from -Table test_table -KeepIdentity -Truncate + + Copies all the data in table test_table from sql1 to sql2, using the database dbatools_from, keeping identity columns and truncating the destination + + .EXAMPLE + PS C:\> $params = @{ + >> SourceSqlInstance = 'sql1' + >> DestinationSqlInstance = 'sql2' + >> Database = 'dbatools_from' + >> DestinationDatabase = 'dbatools_dest' + >> Table = '[Schema].[Table]' + >> DestinationTable = '[dbo].[Table.Copy]' + >> KeepIdentity = $true + >> KeepNulls = $true + >> Truncate = $true + >> BatchSize = 10000 + >> } + >> + PS C:\> Copy-DbaDbTableData @params + + Copies all the data from table [Schema].[Table] in database dbatools_from on sql1 to table [dbo].[Table.Copy] in database dbatools_dest on sql2 + Keeps identity columns and Nulls, truncates the destination and processes in BatchSize of 10000. + + #> + [CmdletBinding(DefaultParameterSetName = "Default", SupportsShouldProcess)] + param ( + [Alias("ServerInstance", "SqlServer", "Source")] + [DbaInstanceParameter]$SqlInstance, + [PSCredential]$SqlCredential, + [DbaInstanceParameter[]]$Destination, + [PSCredential]$DestinationSqlCredential, + [string]$Database, + [string]$DestinationDatabase, + [string[]]$Table, + [string]$Query, + [switch]$AutoCreateTable, + [int]$BatchSize = 50000, + [int]$NotifyAfter = 5000, + [string]$DestinationTable, + [switch]$NoTableLock, + [switch]$CheckConstraints, + [switch]$FireTriggers, + [switch]$KeepIdentity, + [switch]$KeepNulls, + [switch]$Truncate, + [int]$bulkCopyTimeOut = 5000, + [Parameter(ValueFromPipeline)] + [Microsoft.SqlServer.Management.Smo.Table[]]$InputObject, + [switch]$EnableException + ) + + begin { + # Getting the total rows copied is a challenge. Use SqlBulkCopyExtension. + # http://stackoverflow.com/questions/1188384/sqlbulkcopy-row-count-when-complete + + $sourcecode = 'namespace System.Data.SqlClient { + using Reflection; + + public static class SqlBulkCopyExtension + { + const String _rowsCopiedFieldName = "_rowsCopied"; + static FieldInfo _rowsCopiedField = null; + + public static int RowsCopiedCount(this SqlBulkCopy bulkCopy) + { + if (_rowsCopiedField == null) _rowsCopiedField = typeof(SqlBulkCopy).GetField(_rowsCopiedFieldName, BindingFlags.NonPublic | BindingFlags.GetField | BindingFlags.Instance); + return (int)_rowsCopiedField.GetValue(bulkCopy); + } + } + }' + + Add-Type -ReferencedAssemblies System.Data.dll -TypeDefinition $sourcecode -ErrorAction Stop + if (-not $script:core) { + try { + Add-Type -ReferencedAssemblies System.Data.dll -TypeDefinition $sourcecode -ErrorAction Stop + } catch { + $null = 1 + } + } + + $bulkCopyOptions = 0 + $options = "TableLock", "CheckConstraints", "FireTriggers", "KeepIdentity", "KeepNulls", "Default" + + foreach ($option in $options) { + $optionValue = Get-Variable $option -ValueOnly -ErrorAction SilentlyContinue + if ($option -eq "TableLock" -and (!$NoTableLock)) { + $optionValue = $true + } + if ($optionValue -eq $true) { + $bulkCopyOptions += $([Data.SqlClient.SqlBulkCopyOptions]::$option).value__ + } + } + } + + process { + if ((Test-Bound -Not -ParameterName Table, SqlInstance) -and (Test-Bound -Not -ParameterName InputObject)) { + Stop-Function -Message "You must pipe in a table or specify SqlInstance, Database and Table." + return + } + + if ($SqlInstance) { + if ((Test-Bound -Not -ParameterName Database)) { + Stop-Function -Message "Database is required when passing a SqlInstance" -Target $Table + return + } + + if ((Test-Bound -Not -ParameterName Destination, DestinationDatabase, DestinationTable)) { + Stop-Function -Message "Cannot copy $Table into itself. One of destination Server, Database or Table must be specified " -Target $Table + return + } + + try { + $server = Connect-SqlInstance -SqlInstance $SqlInstance -SqlCredential $SqlCredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $SqlInstance + return + } + + if ($Database -notin $server.Databases.Name) { + Stop-Function -Message "Database $Database doesn't exist on $server" + return + } + + try { + foreach ($tbl in $Table) { + $dbTable = Get-DbaDbTable -SqlInstance $server -Table $tbl -Database $Database -EnableException -Verbose:$false + if ($dbTable.Count -eq 1) { + $InputObject += $dbTable + } else { + Stop-Function -Message "The table $tbl matches $($dbTable.Count) objects. Unable to determine which object to copy" -Continue + } + } + } catch { + Stop-Function -Message "Unable to determine source table : $Table" + return + } + } + + foreach ($sqltable in $InputObject) { + $Database = $sqltable.Parent.Name + $server = $sqltable.Parent.Parent + + if ((Test-Bound -Not -ParameterName DestinationTable)) { + $DestinationTable = '[' + $sqltable.Schema + '].[' + $sqltable.Name + ']' + } + + $newTableParts = Get-TableNameParts $DestinationTable + #using FQTN to determine database name + if ($newTableParts.Database) { + $DestinationDatabase = $newTableParts.Database + } elseif ((Test-Bound -Not -ParameterName DestinationDatabase)) { + $DestinationDatabase = $Database + } + + if (-not $Destination) { + $Destination = $server + } + + foreach ($destinationserver in $Destination) { + try { + $destServer = Connect-SqlInstance -SqlInstance $destinationserver -SqlCredential $DestinationSqlCredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $destinationserver + return + } + + if ($DestinationDatabase -notin $destServer.Databases.Name) { + Stop-Function -Message "Database $DestinationDatabase doesn't exist on $destServer" + return + } + + $desttable = Get-DbaDbTable -SqlInstance $destServer -Table $DestinationTable -Database $DestinationDatabase -Verbose:$false | Select-Object -First 1 + if (-not $desttable -and $AutoCreateTable) { + try { + $tablescript = $sqltable | Export-DbaScript -Passthru | Out-String + #replacing table name + if ($newTableParts.Table) { + $rX = "(CREATE TABLE \[$([regex]::Escape($sqltable.Schema))\]\.\[)$([regex]::Escape($sqltable.Name))(\]\()" + $tablescript = $tablescript -replace $rX, "`$1$($newTableParts.Table)`$2" + } + #replacing table schema + if ($newTableParts.Schema) { + $rX = "(CREATE TABLE \[)$([regex]::Escape($sqltable.Schema))(\]\.\[$([regex]::Escape($newTableParts.Table))\]\()" + $tablescript = $tablescript -replace $rX, "`$1$($newTableParts.Schema)`$2" + } + + if ($PSCmdlet.ShouldProcess($destServer, "Creating new table: $DestinationTable")) { + Write-Message -Message "New table script: $tablescript" -Level VeryVerbose + Invoke-DbaQuery -SqlInstance $destServer -Database $DestinationDatabase -Query "$tablescript" -EnableException # add some string assurance there + #table list was updated, let's grab a fresh one + $destServer.Databases[$DestinationDatabase].Tables.Refresh() + $desttable = Get-DbaDbTable -SqlInstance $destServer -Table $DestinationTable -Database $DestinationDatabase -Verbose:$false + Write-Message -Message "New table created: $desttable" -Level Verbose + } + } catch { + Stop-Function -Message "Unable to determine destination table: $DestinationTable" -ErrorRecord $_ + return + } + } + if (-not $desttable) { + Stop-Function -Message "Table $DestinationTable cannot be found in $DestinationDatabase. Use -AutoCreateTable to automatically create the table on the destination." -Continue + } + + $connstring = $destServer.ConnectionContext.ConnectionString + + if ($server.DatabaseEngineType -eq "SqlAzureDatabase") { + $fqtnfrom = "$sqltable" + } else { + $fqtnfrom = "$($server.Databases[$Database]).$sqltable" + } + + if ($destServer.DatabaseEngineType -eq "SqlAzureDatabase") { + $fqtndest = "$desttable" + } else { + $fqtndest = "$($destServer.Databases[$DestinationDatabase]).$desttable" + } + + if ($fqtndest -eq $fqtnfrom -and $server.Name -eq $destServer.Name) { + Stop-Function -Message "Cannot copy $fqtnfrom on $($server.Name) into $fqtndest on ($destServer.Name). Source and Destination must be different " -Target $Table + return + } + + + if (Test-Bound -ParameterName Query -Not) { + $Query = "SELECT * FROM $fqtnfrom" + } + try { + if ($Truncate -eq $true) { + if ($Pscmdlet.ShouldProcess($destServer, "Truncating table $fqtndest")) { + $null = $destServer.Databases[$DestinationDatabase].ExecuteNonQuery("TRUNCATE TABLE $fqtndest") + } + } + if ($Pscmdlet.ShouldProcess($server, "Copy data from $fqtnfrom")) { + $cmd = $server.ConnectionContext.SqlConnectionObject.CreateCommand() + $cmd.CommandText = $Query + if ($server.ConnectionContext.IsOpen -eq $false) { + $server.ConnectionContext.SqlConnectionObject.Open() + } + $bulkCopy = New-Object Data.SqlClient.SqlBulkCopy("$connstring;Database=$DestinationDatabase", $bulkCopyOptions) + $bulkCopy.DestinationTableName = $fqtndest + $bulkCopy.EnableStreaming = $true + $bulkCopy.BatchSize = $BatchSize + $bulkCopy.NotifyAfter = $NotifyAfter + $bulkCopy.BulkCopyTimeOut = $BulkCopyTimeOut + + $elapsed = [System.Diagnostics.Stopwatch]::StartNew() + # Add RowCount output + $bulkCopy.Add_SqlRowsCopied( { + $RowsPerSec = [math]::Round($args[1].RowsCopied / $elapsed.ElapsedMilliseconds * 1000.0, 1) + Write-Progress -id 1 -activity "Inserting rows" -Status ([System.String]::Format("{0} rows ({1} rows/sec)", $args[1].RowsCopied, $RowsPerSec)) + }) + } + + if ($Pscmdlet.ShouldProcess($destServer, "Writing rows to $fqtndest")) { + $reader = $cmd.ExecuteReader() + $bulkCopy.WriteToServer($reader) + if ($script:core) { + $RowsTotal = "Unsupported in Core" + } else { + $RowsTotal = [System.Data.SqlClient.SqlBulkCopyExtension]::RowsCopiedCount($bulkCopy) + } + $TotalTime = [math]::Round($elapsed.Elapsed.TotalSeconds, 1) + Write-Message -Level Verbose -Message "$RowsTotal rows inserted in $TotalTime sec" + if ($rowCount -is [int]) { + Write-Progress -id 1 -activity "Inserting rows" -status "Complete" -Completed + } + + $bulkCopy.Close() + $bulkCopy.Dispose() + $reader.Close() + + [pscustomobject]@{ + SourceInstance = $server.Name + SourceDatabase = $Database + SourceSchema = $sqltable.Schema + SourceTable = $sqltable.Name + DestinationInstance = $destServer.name + DestinationDatabase = $DestinationDatabase + DestinationSchema = $desttable.Schema + DestinationTable = $desttable.Name + RowsCopied = $rowstotal + Elapsed = [prettytimespan]$elapsed.Elapsed + } + } + } catch { + Stop-Function -Message "Something went wrong" -ErrorRecord $_ -Target $server -continue + } + } + } + } + end { + Test-DbaDeprecation -DeprecatedOn "1.0.0" -EnableException:$false -Alias Copy-DbaTableData + } +} +function Copy-DbaEndpoint { + <# + .SYNOPSIS + Copy-DbaEndpoint migrates server endpoints from one SQL Server to another. + + .DESCRIPTION + By default, all endpoints are copied. + + If the endpoint already exists on the destination, it will be skipped unless -Force is used. + + .PARAMETER Source + Source SQL Server. You must have sysadmin access and server version must be SQL Server version 2000 or higher. + + .PARAMETER SourceSqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Destination + Destination SQL Server. You must have sysadmin access and the server must be SQL Server 2000 or higher. + + .PARAMETER DestinationSqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Endpoint + The endpoint(s) to process. This list is auto-populated from the server. If unspecified, all endpoints will be processed. + + .PARAMETER ExcludeEndpoint + The endpoint(s) to exclude. This list is auto-populated from the server. + + .PARAMETER WhatIf + If this switch is enabled, no actions are performed but informational messages will be displayed that explain what would happen if the command were to run. + + .PARAMETER Confirm + If this switch is enabled, you will be prompted for confirmation before executing any operations that change state. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .PARAMETER Force + If this switch is enabled, existing endpoints on Destination with matching names from Source will be dropped. + + .NOTES + Tags: Migration, Endpoint + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + Requires: sysadmin access on SQL Servers + + .LINK + https://dbatools.io/Copy-DbaEndpoint + + .EXAMPLE + PS C:\> Copy-DbaEndpoint -Source sqlserver2014a -Destination sqlcluster + + Copies all server endpoints from sqlserver2014a to sqlcluster, using Windows credentials. If endpoints with the same name exist on sqlcluster, they will be skipped. + + .EXAMPLE + PS C:\> Copy-DbaEndpoint -Source sqlserver2014a -SourceSqlCredential $cred -Destination sqlcluster -Endpoint tg_noDbDrop -Force + + Copies only the tg_noDbDrop endpoint from sqlserver2014a to sqlcluster using SQL credentials for sqlserver2014a and Windows credentials for sqlcluster. If an endpoint with the same name exists on sqlcluster, it will be dropped and recreated because -Force was used. + + .EXAMPLE + PS C:\> Copy-DbaEndpoint -Source sqlserver2014a -Destination sqlcluster -WhatIf -Force + + Shows what would happen if the command were executed using force. + + #> + [CmdletBinding(DefaultParameterSetName = "Default", SupportsShouldProcess)] + param ( + [parameter(Mandatory)] + [DbaInstanceParameter]$Source, + [PSCredential] + $SourceSqlCredential, + [parameter(Mandatory)] + [DbaInstanceParameter[]]$Destination, + [PSCredential] + $DestinationSqlCredential, + [object[]]$Endpoint, + [object[]]$ExcludeEndpoint, + [switch]$Force, + [Alias('Silent')] + [switch]$EnableException + ) + + begin { + try { + $sourceServer = Connect-SqlInstance -SqlInstance $Source -SqlCredential $SourceSqlCredential -MinimumVersion 9 + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $Source + return + } + $serverEndpoints = $sourceServer.Endpoints | Where-Object IsSystemObject -eq $false + } + process { + if (Test-FunctionInterrupt) { return } + foreach ($destinstance in $Destination) { + try { + $destServer = Connect-SqlInstance -SqlInstance $destinstance -SqlCredential $DestinationSqlCredential -MinimumVersion 9 + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $destinstance -Continue + } + $destEndpoints = $destServer.Endpoints + + foreach ($currentEndpoint in $serverEndpoints) { + $endpointName = $currentEndpoint.Name + + $copyEndpointStatus = [pscustomobject]@{ + SourceServer = $sourceServer.Name + DestinationServer = $destServer.Name + Name = $endpointName + Type = "Endpoint" + Status = $null + Notes = $null + DateTime = [DbaDateTime](Get-Date) + } + + if ($Endpoint -and $Endpoint -notcontains $endpointName -or $ExcludeEndpoint -contains $endpointName) { + continue + } + + if ($destEndpoints.Name -contains $endpointName) { + if ($force -eq $false) { + $copyEndpointStatus.Status = "Skipped" + $copyEndpointStatus.Notes = "Already exists on destination" + $copyEndpointStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + + Write-Message -Level Verbose -Message "Server endpoint $endpointName exists at destination. Use -Force to drop and migrate." + continue + } else { + if ($Pscmdlet.ShouldProcess($destinstance, "Dropping server endpoint $endpointName and recreating.")) { + try { + Write-Message -Level Verbose -Message "Dropping server endpoint $endpointName." + $destServer.Endpoints[$endpointName].Drop() + } catch { + $copyEndpointStatus.Status = "Failed" + $copyEndpointStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + + Stop-Function -Message "Issue dropping server endpoint." -Target $endpointName -ErrorRecord $_ -Continue + } + } + } + } + + if ($Pscmdlet.ShouldProcess($destinstance, "Creating server endpoint $endpointName.")) { + try { + Write-Message -Level Verbose -Message "Copying server endpoint $endpointName." + $destServer.Query($currentEndpoint.Script()) | Out-Null + + $copyEndpointStatus.Status = "Successful" + $copyEndpointStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + } catch { + $copyEndpointStatus.Status = "Failed" + $copyEndpointStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + + Stop-Function -Message "Issue creating server endpoint." -Target $endpointName -ErrorRecord $_ + } + } + } + } + } + end { + Test-DbaDeprecation -DeprecatedOn "1.0.0" -EnableException:$false -Alias Copy-SqlEndpoint + } +} +function Copy-DbaLinkedServer { + <# + .SYNOPSIS + Copy-DbaLinkedServer migrates Linked Servers from one SQL Server to another. Linked Server logins and passwords are migrated as well. + + .DESCRIPTION + By using password decryption techniques provided by Antti Rantasaari (NetSPI, 2014), this script migrates SQL Server Linked Servers from one server to another, while maintaining username and password. + + Credit: https://blog.netspi.com/decrypting-mssql-database-link-server-passwords/ + + .PARAMETER Source + Source SQL Server (2005 and above). You must have sysadmin access to both SQL Server and Windows. + + .PARAMETER SourceSqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Destination + Destination SQL Server (2005 and above). You must have sysadmin access to both SQL Server and Windows. + + .PARAMETER DestinationSqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER LinkedServer + The linked server(s) to process - this list is auto-populated from the server. If unspecified, all linked servers will be processed. + + .PARAMETER ExcludeLinkedServer + The linked server(s) to exclude - this list is auto-populated from the server + + .PARAMETER UpgradeSqlClient + Upgrade any SqlClient Linked Server to the current Version + + .PARAMETER WhatIf + Shows what would happen if the command were to run. No actions are actually performed. + + .PARAMETER Confirm + Prompts you for confirmation before executing any changing operations within the command. + + .PARAMETER Force + By default, if a Linked Server exists on the source and destination, the Linked Server is not copied over. Specifying -force will drop and recreate the Linked Server on the Destination server. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: WSMan, Migration, LinkedServer + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + Requires: sysadmin access on SQL Servers + Limitations: This just copies the SQL portion. It does not copy files (i.e. a local SQLite database, or Microsoft Access DB), nor does it configure ODBC entries. + + .LINK + https://dbatools.io/Copy-DbaLinkedServer + + .EXAMPLE + PS C:\> Copy-DbaLinkedServer -Source sqlserver2014a -Destination sqlcluster + + Copies all SQL Server Linked Servers on sqlserver2014a to sqlcluster. If Linked Server exists on destination, it will be skipped. + + .EXAMPLE + PS C:\> Copy-DbaLinkedServer -Source sqlserver2014a -Destination sqlcluster -LinkedServer SQL2K5,SQL2k -Force + + Copies over two SQL Server Linked Servers (SQL2K and SQL2K2) from sqlserver to sqlcluster. If the credential already exists on the destination, it will be dropped. + + #> + [CmdletBinding(DefaultParameterSetName = "Default", SupportsShouldProcess)] + [Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSUseSingularNouns", "", Justification = "Internal functions are ignored")] + param ( + [parameter(Mandatory)] + [DbaInstanceParameter]$Source, + [PSCredential]$SourceSqlCredential, + [parameter(Mandatory)] + [DbaInstanceParameter[]]$Destination, + [PSCredential]$DestinationSqlCredential, + [object[]]$LinkedServer, + [object[]]$ExcludeLinkedServer, + [switch]$UpgradeSqlClient, + [switch]$Force, + [Alias('Silent')] + [switch]$EnableException + ) + begin { + if (-not $script:isWindows) { + Stop-Function -Message "Copy-DbaCredential is only supported on Windows" + return + } + $null = Test-ElevationRequirement -ComputerName $Source.ComputerName + function Copy-DbaLinkedServers { + param ( + [string[]]$LinkedServer, + [bool]$force + ) + + Write-Message -Level Verbose -Message "Collecting Linked Server logins and passwords on $($sourceServer.Name)." + $sourcelogins = Get-DecryptedObject -SqlInstance $sourceServer -Type LinkedServer + + $serverlist = $sourceServer.LinkedServers + + if ($LinkedServer) { + $serverlist = $serverlist | Where-Object Name -In $LinkedServer + } + if ($ExcludeLinkedServer) { + $serverList = $serverlist | Where-Object Name -NotIn $ExcludeLinkedServer + } + + foreach ($currentLinkedServer in $serverlist) { + $provider = $currentLinkedServer.ProviderName + try { + $destServer.LinkedServers.Refresh() + $destServer.LinkedServers.LinkedServerLogins.Refresh() + } catch { + #here to avoid an empty catch + $null = 1 + } + + $linkedServerName = $currentLinkedServer.Name + $linkedServerProductName = $currentLinkedServer.ProductName + $linkedServerDataSource = $currentLinkedServer.DataSource + + $copyLinkedServer = [pscustomobject]@{ + SourceServer = $sourceServer.Name + DestinationServer = $destServer.Name + Name = $linkedServerName + ProductName = $linkedServerProductName + DataSource = $linkedServerDataSource + Type = "Linked Server" + Status = $null + Notes = $provider + DateTime = [DbaDateTime](Get-Date) + } + + # This does a check to warn of missing OleDbProviderSettings but should only be checked on SQL on Windows + if ($destServer.Settings.OleDbProviderSettings.Name.Length -ne 0) { + if (!$destServer.Settings.OleDbProviderSettings.Name -contains $provider -and !$provider.StartsWith("SQLN")) { + $copyLinkedServer.Status = "Skipped" + $copyLinkedServer.Notes = "Missing provider" + $copyLinkedServer | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + + Write-Message -Level Verbose -Message "$($destServer.Name) does not support the $provider provider. Skipping $linkedServerName." + continue + } + } + + if ($null -ne $destServer.LinkedServers[$linkedServerName]) { + if (!$force) { + if ($Pscmdlet.ShouldProcess($destinstance, "$linkedServerName exists $($destServer.Name). Skipping.")) { + $copyLinkedServer.Status = "Skipped" + $copyLinkedServer.Notes = "Already exists on destination" + $copyLinkedServer | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + + Write-Message -Level Verbose -Message "$linkedServerName exists $($destServer.Name). Skipping." + } + continue + } else { + if ($Pscmdlet.ShouldProcess($destinstance, "Dropping $linkedServerName")) { + if ($currentLinkedServer.Name -eq 'repl_distributor') { + Write-Message -Level Verbose -Message "repl_distributor cannot be dropped. Not going to try." + continue + } + + $destServer.LinkedServers[$linkedServerName].Drop($true) + $destServer.LinkedServers.refresh() + } + } + } + + Write-Message -Level Verbose -Message "Attempting to migrate: $linkedServerName." + If ($Pscmdlet.ShouldProcess($destinstance, "Migrating $linkedServerName")) { + try { + $sql = $currentLinkedServer.Script() | Out-String + Write-Message -Level Debug -Message $sql + + if ($UpgradeSqlClient -and $sql -match "sqlncli") { + $destProviders = $destServer.Settings.OleDbProviderSettings | Where-Object { $_.Name -like 'SQLNCLI*' } + $newProvider = $destProviders | Sort-Object Name -Descending | Select-Object -First 1 -ExpandProperty Name + + Write-Message -Level Verbose -Message "Changing sqlncli to $newProvider" + $sql = $sql -replace ("sqlncli[0-9]+", $newProvider) + } + + $destServer.Query($sql) + + if ($copyLinkedServer.ProductName -eq 'SQL Server' -and $copyLinkedServer.Name -ne $copyLinkedServer.DataSource) { + $sql2 = "EXEC sp_setnetname '$($copyLinkedServer.Name)', '$($copyLinkedServer.DataSource)'; " + $destServer.Query($sql2) + } + + $destServer.LinkedServers.Refresh() + Write-Message -Level Verbose -Message "$linkedServerName successfully copied." + + $copyLinkedServer.Status = "Successful" + $copyLinkedServer | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + } catch { + $copyLinkedServer.Status = "Failed" + $copyLinkedServer | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + + Stop-Function -Message "Issue adding linked server $destServer." -Target $linkedServerName -InnerErrorRecord $_ + $skiplogins = $true + } + } + + if ($skiplogins -ne $true) { + $destlogins = $destServer.LinkedServers[$linkedServerName].LinkedServerLogins + $lslogins = $sourcelogins | Where-Object { $_.Name -eq $linkedServerName } + + foreach ($login in $lslogins) { + if ($Pscmdlet.ShouldProcess($destinstance, "Migrating $($login.Login)")) { + $currentlogin = $destlogins | Where-Object { $_.RemoteUser -eq $login.Identity } + + $copyLinkedServer.Type = $login.Identity + + if ($currentlogin.RemoteUser.length -ne 0) { + try { + $currentlogin.SetRemotePassword($login.Password) + $currentlogin.Alter() + + $copyLinkedServer.Status = "Successful" + $copyLinkedServer | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + } catch { + $copyLinkedServer.Status = "Failed" + $copyLinkedServer | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + + Stop-Function -Message "Failed to copy login." -Target $login -InnerErrorRecord $_ + } + } + } + } + } + } + } + + if ($null -ne $SourceSqlCredential.Username) { + Write-Message -Level Verbose -Message "You are using a SQL Credential. Note that this script requires Windows Administrator access on the source server. Attempting with $($SourceSqlCredential.Username)." + } + try { + $sourceServer = Connect-SqlInstance -SqlInstance $Source -SqlCredential $SourceSqlCredential + return + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $Source + return + } + if (!(Test-SqlSa -SqlInstance $sourceServer -SqlCredential $SourceSqlCredential)) { + Stop-Function -Message "Not a sysadmin on $source. Quitting." -Target $sourceServer + return + } + Write-Message -Level Verbose -Message "Getting NetBios name for $source." + $sourceNetBios = Resolve-NetBiosName $sourceserver + + Write-Message -Level Verbose -Message "Checking if Remote Registry is enabled on $source." + try { + Invoke-Command2 -Raw -Credential $Credential -ComputerName $sourceNetBios -ScriptBlock { Get-ItemProperty -Path "HKLM:\SOFTWARE\" } -ErrorAction Stop + } catch { + Stop-Function -Message "Can't connect to registry on $source." -Target $sourceNetBios -ErrorRecord $_ + return + } + } + process { + if (Test-FunctionInterrupt) { return } + + foreach ($destinstance in $Destination) { + try { + $destServer = Connect-SqlInstance -SqlInstance $destinstance -SqlCredential $DestinationSqlCredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $destinstance -Continue + } + if (!(Test-SqlSa -SqlInstance $destServer -SqlCredential $DestinationSqlCredential)) { + Stop-Function -Message "Not a sysadmin on $destinstance" -Target $destServer -Continue + } + + # Magic happens here + Copy-DbaLinkedServers $LinkedServer -Force:$force + } + } + end { + Test-DbaDeprecation -DeprecatedOn "1.0.0" -EnableException:$false -Alias Copy-SqlLinkedServer + } +} +function Copy-DbaLogin { + <# + .SYNOPSIS + Migrates logins from source to destination SQL Servers. Supports SQL Server versions 2000 and newer. + + .DESCRIPTION + SQL Server 2000: Migrates logins with SIDs, passwords, server roles and database roles. + + SQL Server 2005 & newer: Migrates logins with SIDs, passwords, defaultdb, server roles & securables, database permissions & securables, login attributes (enforce password policy, expiration, etc.) + + The login hash algorithm changed in SQL Server 2012, and is not backwards compatible with previous SQL Server versions. This means that while SQL Server 2000 logins can be migrated to SQL Server 2012, logins created in SQL Server 2012 can only be migrated to SQL Server 2012 and above. + + .PARAMETER Source + Source SQL Server. You must have sysadmin access and server version must be SQL Server version 2000 or higher. + + .PARAMETER SourceSqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Destination + Destination SQL Server. You must have sysadmin access and the server must be SQL Server 2000 or higher. + + .PARAMETER DestinationSqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Login + The login(s) to process. Options for this list are auto-populated from the server. If unspecified, all logins will be processed. + + .PARAMETER ExcludeLogin + The login(s) to exclude. Options for this list are auto-populated from the server. + + .PARAMETER ExcludeSystemLogins + If this switch is enabled, NT SERVICE accounts will be skipped. + + .PARAMETER ExcludePermissionSync + Skips permission syncs + + .PARAMETER SyncOnly + If this switch is enabled, only SQL Server login permissions, roles, etc. will be synced. Logins and users will not be added or dropped. If a matching Login does not exist on the destination, the Login will be skipped. + Credential removal is not currently supported for this parameter. + + .PARAMETER SyncSaName + If this switch is enabled, the name of the sa account will be synced between Source and Destination + + .PARAMETER OutFile + Calls Export-DbaLogin and exports all logins to a T-SQL formatted file. This does not perform a copy, so no destination is required. + + .PARAMETER InputObject + Takes the parameters required from a Login object that has been piped into the command + + .PARAMETER LoginRenameHashtable + Pass a hash table into this parameter to be passed into Rename-DbaLogin to update the Login and mappings after the Login is completed. + + .PARAMETER KillActiveConnection + If this switch and -Force are enabled, all active connections and sessions on Destination will be killed. + + A login cannot be dropped when it has active connections on the instance. + + .PARAMETER WhatIf + If this switch is enabled, no actions are performed but informational messages will be displayed that explain what would happen if the command were to run. + + .PARAMETER Confirm + If this switch is enabled, you will be prompted for confirmation before executing any operations that change state. + + .PARAMETER Force + If this switch is enabled, the Login(s) will be dropped and recreated on Destination. Logins that own Agent jobs cannot be dropped at this time. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Migration, Login + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + Requires: sysadmin access on SQL Servers + + .LINK + https://dbatools.io/Copy-DbaLogin + + .EXAMPLE + PS C:\> Copy-DbaLogin -Source sqlserver2014a -Destination sqlcluster -Force + + Copies all logins from Source Destination. If a SQL Login on Source exists on the Destination, the Login on Destination will be dropped and recreated. + + If active connections are found for a login, the copy of that Login will fail as it cannot be dropped. + + .EXAMPLE + PS C:\> Copy-DbaLogin -Source sqlserver2014a -Destination sqlcluster -Force -KillActiveConnection + + Copies all logins from Source Destination. If a SQL Login on Source exists on the Destination, the Login on Destination will be dropped and recreated. + + If any active connections are found they will be killed. + + .EXAMPLE + PS C:\> Copy-DbaLogin -Source sqlserver2014a -Destination sqlcluster -ExcludeLogin realcajun -SourceSqlCredential $scred -DestinationSqlCredential $dcred + + Copies all Logins from Source to Destination except for realcajun using SQL Authentication to connect to both instances. + + If a Login already exists on the destination, it will not be migrated. + + .EXAMPLE + PS C:\> Copy-DbaLogin -Source sqlserver2014a -Destination sqlcluster -Login realcajun, netnerds -force + + Copies ONLY Logins netnerds and realcajun. If Login realcajun or netnerds exists on Destination, the existing Login(s) will be dropped and recreated. + + .EXAMPLE + PS C:\> Copy-DbaLogin -Source sqlserver2014a -Destination sqlcluster -SyncOnly + + Syncs only SQL Server login permissions, roles, etc. Does not add or drop logins or users. + + If a matching Login does not exist on Destination, the Login will be skipped. + + .EXAMPLE + PS C:\> Copy-DbaLogin -LoginRenameHashtable @{ "PreviousUser" = "newlogin" } -Source $Sql01 -Destination Localhost -SourceSqlCredential $sqlcred + + Copies PreviousUser and then renames it to newlogin. + + .EXAMPLE + PS C:\> Get-DbaLogin -SqlInstance sql2016 | Out-GridView -Passthru | Copy-DbaLogin -Destination sql2017 + + Displays all available logins on sql2016 in a grid view, then copies all selected logins to sql2017. + + #> + [CmdletBinding(DefaultParameterSetName = "Default", SupportsShouldProcess)] + param ( + [parameter(ParameterSetName = "SqlInstance", Mandatory)] + [DbaInstanceParameter]$Source, + [PSCredential]$SourceSqlCredential, + [parameter(Mandatory)] + [DbaInstanceParameter[]]$Destination, + [PSCredential]$DestinationSqlCredential, + [object[]]$Login, + [object[]]$ExcludeLogin, + [switch]$ExcludeSystemLogins, + [switch]$SyncOnly, + [parameter(ParameterSetName = "Live")] + [parameter(ParameterSetName = "SqlInstance")] + [switch]$SyncSaName, + [parameter(ParameterSetName = "File", Mandatory)] + [string]$OutFile, + [parameter(ParameterSetName = "InputObject", ValueFromPipeline)] + [object]$InputObject, + [hashtable]$LoginRenameHashtable, + [switch]$KillActiveConnection, + [switch]$Force, + [switch]$ExcludePermissionSync, + [switch]$EnableException + ) + + begin { + function Copy-Login { + foreach ($sourceLogin in $sourceServer.Logins) { + $userName = $sourceLogin.name + + $copyLoginStatus = [pscustomobject]@{ + SourceServer = $sourceServer.Name + DestinationServer = $destServer.Name + Type = "Login - $($sourceLogin.LoginType)" + Name = $userName + DestinationLogin = $userName + SourceLogin = $userName + Status = $null + Notes = $null + DateTime = [DbaDateTime](Get-Date) + } + + if ($Login -and $Login -notcontains $userName -or $ExcludeLogin -contains $userName) { continue } + + if ($sourceLogin.id -eq 1) { continue } + + if ($userName.StartsWith("##") -or $userName -eq 'sa') { + Write-Message -Level Verbose -Message "Skipping $userName." + continue + } + + $serverName = Resolve-NetBiosName $sourceServer + + $currentLogin = $sourceServer.ConnectionContext.truelogin + + if ($currentLogin -eq $userName -and $force) { + if ($Pscmdlet.ShouldProcess("console", "Stating $userName is skipped because it is performing the migration.")) { + Write-Message -Level Verbose -Message "Cannot drop login performing the migration. Skipping." + $copyLoginStatus.Status = "Skipped" + $copyLoginStatus.Notes = "Current login" + $copyLoginStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + } + continue + } + + if (($destServer.LoginMode -ne [Microsoft.SqlServer.Management.Smo.ServerLoginMode]::Mixed) -and ($sourceLogin.LoginType -eq [Microsoft.SqlServer.Management.Smo.LoginType]::SqlLogin)) { + Write-Message -Level Verbose -Message "$Destination does not have Mixed Mode enabled. [$userName] is an SQL Login. Enable mixed mode authentication after the migration completes to use this type of login." + } + + $userBase = ($userName.Split("\")[0]).ToLower() + + if ($serverName -eq $userBase -or $userName.StartsWith("NT ")) { + if ($sourceServer.ComputerName -ne $destServer.ComputerName) { + if ($Pscmdlet.ShouldProcess("console", "Stating $userName was skipped because it is a local machine name.")) { + Write-Message -Level Verbose -Message "$userName was skipped because it is a local machine name." + $copyLoginStatus.Status = "Skipped" + $copyLoginStatus.Notes = "Local machine name" + $copyLoginStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + } + continue + } else { + if ($ExcludeSystemLogins) { + if ($Pscmdlet.ShouldProcess("console", "$userName was skipped because ExcludeSystemLogins was specified.")) { + Write-Message -Level Verbose -Message "$userName was skipped because ExcludeSystemLogins was specified." + + $copyLoginStatus.Status = "Skipped" + $copyLoginStatus.Notes = "System login" + $copyLoginStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + } + continue + } + + if ($Pscmdlet.ShouldProcess("console", "Stating local login $userName since the source and destination server reside on the same machine.")) { + Write-Message -Level Verbose -Message "Copying local login $userName since the source and destination server reside on the same machine." + } + } + } + + if ($null -ne $destServer.Logins.Item($userName) -and !$force) { + if ($Pscmdlet.ShouldProcess("console", "Stating $userName is skipped because it exists at destination.")) { + Write-Message -Level Verbose -Message "$userName already exists in destination. Use -Force to drop and recreate." + $copyLoginStatus.Status = "Skipped" + $copyLoginStatus.Notes = "Already exists on destination" + $copyLoginStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + } + continue + } + + if ($null -ne $destServer.Logins.Item($userName) -and $force) { + if ($userName -eq $destServer.ServiceAccount) { + if ($Pscmdlet.ShouldProcess("console", "$userName is the destination service account. Skipping drop.")) { + Write-Message -Level Verbose -Message "$userName is the destination service account. Skipping drop." + + $copyLoginStatus.Status = "Skipped" + $copyLoginStatus.Notes = "Destination service account" + $copyLoginStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + } + continue + } + + if ($Pscmdlet.ShouldProcess($destinstance, "Dropping $userName")) { + + # Kill connections, delete user + Write-Message -Level Verbose -Message "Attempting to migrate $userName" + Write-Message -Level Verbose -Message "Force was specified. Attempting to drop $userName on $destinstance." + + try { + $ownedDbs = $destServer.Databases | Where-Object Owner -eq $userName + + foreach ($ownedDb in $ownedDbs) { + Write-Message -Level Verbose -Message "Changing database owner for $($ownedDb.name) from $userName to sa." + $ownedDb.SetOwner('sa') + $ownedDb.Alter() + } + + $ownedJobs = $destServer.JobServer.Jobs | Where-Object OwnerLoginName -eq $userName + + foreach ($ownedJob in $ownedJobs) { + Write-Message -Level Verbose -Message "Changing job owner for $($ownedJob.name) from $userName to sa." + $ownedJob.Set_OwnerLoginName('sa') + $ownedJob.Alter() + } + + $activeConnections = $destServer.EnumProcesses() | Where-Object Login -eq $userName + + if ($activeConnections -and $KillActiveConnection) { + if (!$destServer.Logins.Item($userName).IsDisabled) { + $disabled = $true + $destServer.Logins.Item($userName).Disable() + } + + $activeConnections | ForEach-Object { $destServer.KillProcess($_.Spid) } + Write-Message -Level Verbose -Message "-KillActiveConnection was provided. There are $($activeConnections.Count) active connections killed." + # just in case the kill didn't work, it'll leave behind a disabled account + if ($disabled) { $destServer.Logins.Item($userName).Enable() } + } elseif ($activeConnections) { + Write-Message -Level Verbose -Message "There are $($activeConnections.Count) active connections found for the login $userName. Utilize -KillActiveConnection with -Force to kill the connections." + } + $destServer.Logins.Item($userName).Drop() + + Write-Message -Level Verbose -Message "Successfully dropped $userName on $destinstance." + } catch { + $copyLoginStatus.Status = "Failed" + $copyLoginStatus.Notes = (Get-ErrorMessage -Record $_).Message + $copyLoginStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + + Stop-Function -Message "Could not drop $userName." -Category InvalidOperation -ErrorRecord $_ -Target $destServer -Continue 3>$null + } + } + } + + if ($Pscmdlet.ShouldProcess($destinstance, "Adding SQL login $userName")) { + + Write-Message -Level Verbose -Message "Attempting to add $userName to $destinstance." + $destLogin = New-Object Microsoft.SqlServer.Management.Smo.Login($destServer, $userName) + + Write-Message -Level Verbose -Message "Setting $userName SID to source username SID." + $destLogin.Set_Sid($sourceLogin.Get_Sid()) + + $defaultDb = $sourceLogin.DefaultDatabase + + Write-Message -Level Verbose -Message "Setting login language to $($sourceLogin.Language)." + $destLogin.Language = $sourceLogin.Language + + if ($null -eq $destServer.databases[$defaultDb]) { + # we end up here when the default database on source doesn't exist on dest + # if source login is a sysadmin, then set the default database to master + # if not, set it to tempdb (see #303) + $OrigdefaultDb = $defaultDb + try { $sourcesysadmins = $sourceServer.roles['sysadmin'].EnumMemberNames() } + catch { $sourcesysadmins = $sourceServer.roles['sysadmin'].EnumServerRoleMembers() } + if ($sourcesysadmins -contains $userName) { + $defaultDb = "master" + } else { + $defaultDb = "tempdb" + } + Write-Message -Level Verbose -Message "$OrigdefaultDb does not exist on destination. Setting defaultdb to $defaultDb." + } + + Write-Message -Level Verbose -Message "Set $userName defaultdb to $defaultDb." + $destLogin.DefaultDatabase = $defaultDb + + $checkexpiration = "ON"; $checkpolicy = "ON" + + if ($sourceLogin.PasswordPolicyEnforced -eq $false) { $checkpolicy = "OFF" } + + if (!$sourceLogin.PasswordExpirationEnabled) { $checkexpiration = "OFF" } + + $destLogin.PasswordPolicyEnforced = $sourceLogin.PasswordPolicyEnforced + $destLogin.PasswordExpirationEnabled = $sourceLogin.PasswordExpirationEnabled + + # Attempt to add SQL Login User + if ($sourceLogin.LoginType -eq "SqlLogin") { + $destLogin.LoginType = "SqlLogin" + $sourceLoginname = $sourceLogin.name + + switch ($sourceServer.versionMajor) { + 0 { $sql = "SELECT CONVERT(VARBINARY(256),password) as hashedpass FROM master.dbo.syslogins WHERE loginname='$sourceLoginname'" } + 8 { $sql = "SELECT CONVERT(VARBINARY(256),password) as hashedpass FROM dbo.syslogins WHERE name='$sourceLoginname'" } + 9 { $sql = "SELECT CONVERT(VARBINARY(256),password_hash) as hashedpass FROM sys.sql_logins where name='$sourceLoginname'" } + default { + $sql = "SELECT CAST(CONVERT(VARCHAR(256), CAST(LOGINPROPERTY(name,'PasswordHash') + AS VARBINARY(256)), 1) AS NVARCHAR(max)) AS hashedpass FROM sys.server_principals + WHERE principal_id = $($sourceLogin.id)" + } + } + + try { + $hashedPass = $sourceServer.ConnectionContext.ExecuteScalar($sql) + } catch { + $hashedPassDt = $sourceServer.Databases['master'].ExecuteWithResults($sql) + $hashedPass = $hashedPassDt.Tables[0].Rows[0].Item(0) + } + + if ($hashedPass.GetType().Name -ne "String") { + $passString = "0x"; $hashedPass | ForEach-Object { $passString += ("{0:X}" -f $_).PadLeft(2, "0") } + $hashedPass = $passString + } + + try { + $destLogin.Create($hashedPass, [Microsoft.SqlServer.Management.Smo.LoginCreateOptions]::IsHashed) + $destLogin.Refresh() + Write-Message -Level Verbose -Message "Successfully added $userName to $destinstance." + + $copyLoginStatus.Status = "Successful" + $copyLoginStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + } catch { + try { + $sid = "0x"; $sourceLogin.sid | ForEach-Object { $sid += ("{0:X}" -f $_).PadLeft(2, "0") } + $sql = "CREATE LOGIN [$userName] WITH PASSWORD = $hashedPass HASHED, SID = $sid, + DEFAULT_DATABASE = [$defaultDb], CHECK_POLICY = $checkpolicy, + CHECK_EXPIRATION = $checkexpiration, DEFAULT_LANGUAGE = [$($sourceLogin.Language)]" + + $null = $destServer.Query($sql) + + $destLogin = $destServer.logins[$userName] + Write-Message -Level Verbose -Message "Successfully added $userName to $destinstance." + + $copyLoginStatus.Status = "Successful" + $copyLoginStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + + } catch { + $copyLoginStatus.Status = "Failed" + $copyLoginStatus.Notes = (Get-ErrorMessage -Record $_).Message + $copyLoginStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + + Stop-Function -Message "Failed to add $userName to $destinstance." -Category InvalidOperation -ErrorRecord $_ -Target $destServer -Continue 3>$null + } + } + } + # Attempt to add Windows User + elseif ($sourceLogin.LoginType -eq "WindowsUser" -or $sourceLogin.LoginType -eq "WindowsGroup") { + Write-Message -Level Verbose -Message "Adding as login type $($sourceLogin.LoginType)" + $destLogin.LoginType = $sourceLogin.LoginType + + Write-Message -Level Verbose -Message "Setting language as $($sourceLogin.Language)" + $destLogin.Language = $sourceLogin.Language + + try { + $destLogin.Create() + $destLogin.Refresh() + Write-Message -Level Verbose -Message "Successfully added $userName to $destinstance." + + $copyLoginStatus.Status = "Successful" + $copyLoginStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + + } catch { + $copyLoginStatus.Status = "Failed" + $copyLoginStatus.Notes = (Get-ErrorMessage -Record $_).Message + $copyLoginStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + + Stop-Function -Message "Failed to add $userName to $destinstance" -Category InvalidOperation -ErrorRecord $_ -Target $destServer -Continue 3>$null + } + } + # This script does not currently support certificate mapped or asymmetric key users. + else { + Write-Message -Level Verbose -Message "$($sourceLogin.LoginType) logins not supported. $($sourceLogin.name) skipped." + + $copyLoginStatus.Status = "Skipped" + $copyLoginStatus.Notes = "$($sourceLogin.LoginType) not supported" + $copyLoginStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + + continue + } + + if ($sourceLogin.IsDisabled) { + try { + $destLogin.Disable() + } catch { + $copyLoginStatus.Status = "Successful - but could not disable on destination" + $copyLoginStatus.Notes = (Get-ErrorMessage -Record $_).Message + $copyLoginStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + + Stop-Function -Message "$userName disabled on source, could not be disabled on $destinstance." -Category InvalidOperation -ErrorRecord $_ -Target $destServer 3>$null + } + } + if ($sourceLogin.DenyWindowsLogin) { + try { + $destLogin.DenyWindowsLogin = $true + } catch { + $copyLoginStatus.Status = "Successful - but could not deny login on destination" + $copyLoginStatus.Notes = (Get-ErrorMessage -Record $_).Message + $copyLoginStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + + Stop-Function -Message "$userName denied login on source, could not be denied login on $destinstance." -Category InvalidOperation -ErrorRecord $_ -Target $destServer 3>$null + } + } + } + + if (-not $ExcludePermissionSync) { + if ($Pscmdlet.ShouldProcess($destinstance, "Updating SQL login $userName permissions")) { + Update-SqlPermission -sourceserver $sourceServer -sourcelogin $sourceLogin -destserver $destServer -destlogin $destLogin + } + } + + if ($LoginRenameHashtable.Keys -contains $userName) { + $NewLogin = $LoginRenameHashtable[$userName] + + if ($Pscmdlet.ShouldProcess($destinstance, "Renaming SQL Login $userName to $NewLogin")) { + try { + Rename-DbaLogin -SqlInstance $destServer -Login $userName -NewLogin $NewLogin + + $copyLoginStatus.DestinationLogin = $NewLogin + $copyLoginStatus.Status = "Successful" + $copyLoginStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + + } catch { + $copyLoginStatus.DestinationLogin = $NewLogin + $copyLoginStatus.Status = "Failed to rename" + $copyLoginStatus.Notes = (Get-ErrorMessage -Record $_).Message + $copyLoginStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + + Stop-Function -Message "Issue renaming $userName to $NewLogin" -Category InvalidOperation -ErrorRecord $_ -Target $destServer 3>$null + } + } + } + } + } + } + process { + if (Test-FunctionInterrupt) { return } + if ($InputObject) { + $Source = $InputObject[0].Parent.Name + $Sourceserver = $InputObject[0].Parent + $Login = $InputObject.Name + } else { + try { + $sourceServer = Connect-SqlInstance -SqlInstance $Source -SqlCredential $SourceSqlCredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $Source + return + } + } + $sourceVersionMajor = $sourceServer.VersionMajor + + if ($OutFile) { + Export-DbaLogin -SqlInstance $sourceServer -FilePath $OutFile -Login $Login -ExcludeLogin $ExcludeLogin + continue + } + + foreach ($destinstance in $Destination) { + try { + $destServer = Connect-SqlInstance -SqlInstance $destinstance -SqlCredential $DestinationSqlCredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $destinstance -Continue + } + + $destVersionMajor = $destServer.VersionMajor + if ($sourceVersionMajor -gt 10 -and $destVersionMajor -lt 11) { + Stop-Function -Message "Login migration from version $sourceVersionMajor to $destVersionMajor is not supported." -Category InvalidOperation -ErrorRecord $_ -Target $sourceServer + } + + if ($sourceVersionMajor -lt 8 -or $destVersionMajor -lt 8) { + Stop-Function -Message "SQL Server 7 and below are not supported." -Category InvalidOperation -ErrorRecord $_ -Target $sourceServer + } + + if ($SyncOnly) { + if ($Pscmdlet.ShouldProcess($destinstance, "Syncing $Login permissions")) { + Sync-DbaLoginPermission -Source $sourceServer -Destination $destServer -Login $Login -ExcludeLogin $ExcludeLogin + continue + } + } + + Write-Message -Level Verbose -Message "Attempting Login Migration." + Copy-Login -sourceserver $sourceServer -destserver $destServer -Login $Login -Exclude $ExcludeLogin + + if ($SyncSaName) { + $sa = $sourceServer.Logins | Where-Object id -eq 1 + $destSa = $destServer.Logins | Where-Object id -eq 1 + $saName = $sa.Name + if ($saName -ne $destSa.name) { + Write-Message -Level Verbose -Message "Changing sa username to match source ($saName)." + if ($Pscmdlet.ShouldProcess($destinstance, "Changing sa username to match source ($saName)")) { + $destSa.Rename($saName) + $destSa.Alter() + } + } + } + } + } + end { + Test-DbaDeprecation -DeprecatedOn "1.0.0" -EnableException:$false -Alias Copy-SqlLogin + } +} +function Copy-DbaPolicyManagement { + <# + .SYNOPSIS + Migrates SQL Policy Based Management Objects, including both policies and conditions. + + .DESCRIPTION + By default, all policies and conditions are copied. If an object already exist on the destination, it will be skipped unless -Force is used. + + The -Policy and -Condition parameters are auto-populated for command-line completion and can be used to copy only specific objects. + + .PARAMETER Source + Source SQL Server.You must have sysadmin access and server version must be SQL Server version 2008 or higher. + + .PARAMETER SourceSqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Destination + Destination Sql Server. You must have sysadmin access and server version must be SQL Server version 2008 or higher. + + .PARAMETER DestinationSqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Policy + The policy(ies) to process - this list is auto-populated from the server. If unspecified, all policies will be processed. + + .PARAMETER ExcludePolicy + The policy(ies) to exclude - this list is auto-populated from the server + + .PARAMETER Condition + The condition(s) to process - this list is auto-populated from the server. If unspecified, all conditions will be processed. + + .PARAMETER ExcludeCondition + The condition(s) to exclude - this list is auto-populated from the server + + .PARAMETER Force + If policies exists on destination server, it will be dropped and recreated. + + .PARAMETER WhatIf + Shows what would happen if the command were to run. No actions are actually performed. + + .PARAMETER Confirm + Prompts you for confirmation before executing any changing operations within the command. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Migration + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + Requires: sysadmin access on SQL Servers + + .LINK + https://dbatools.io/Copy-DbaPolicyManagement + + .EXAMPLE + PS C:\> Copy-DbaPolicyManagement -Source sqlserver2014a -Destination sqlcluster + + Copies all policies and conditions from sqlserver2014a to sqlcluster, using Windows credentials. + + .EXAMPLE + PS C:\> Copy-DbaPolicyManagement -Source sqlserver2014a -Destination sqlcluster -SourceSqlCredential $cred + + Copies all policies and conditions from sqlserver2014a to sqlcluster, using SQL credentials for sqlserver2014a and Windows credentials for sqlcluster. + + .EXAMPLE + PS C:\> Copy-DbaPolicyManagement -Source sqlserver2014a -Destination sqlcluster -WhatIf + + Shows what would happen if the command were executed. + + .EXAMPLE + PS C:\> Copy-DbaPolicyManagement -Source sqlserver2014a -Destination sqlcluster -Policy 'xp_cmdshell must be disabled' + + Copies only one policy, 'xp_cmdshell must be disabled' from sqlserver2014a to sqlcluster. No conditions are migrated. + + #> + [CmdletBinding(DefaultParameterSetName = "Default", SupportsShouldProcess)] + param ( + [parameter(Mandatory)] + [DbaInstanceParameter]$Source, + [PSCredential] + $SourceSqlCredential, + [parameter(Mandatory)] + [DbaInstanceParameter[]]$Destination, + [PSCredential] + $DestinationSqlCredential, + [object[]]$Policy, + [object[]]$ExcludePolicy, + [object[]]$Condition, + [object[]]$ExcludeCondition, + [switch]$Force, + [Alias('Silent')] + [switch]$EnableException + ) + + begin { + if (-not $script:isWindows) { + Stop-Function -Message "Copy-DbaPolicyManagement does not support Linux - we're still waiting for the Core SMOs from Microsoft" + return + } + try { + $sourceServer = Connect-SqlInstance -SqlInstance $Source -SqlCredential $SourceSqlCredential -MinimumVersion 10 + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $Source + return + } + $sourceSqlConn = $sourceServer.ConnectionContext.SqlConnectionObject + $sourceSqlStoreConnection = New-Object Microsoft.SqlServer.Management.Sdk.Sfc.SqlStoreConnection $sourceSqlConn + $sourceStore = New-Object Microsoft.SqlServer.Management.DMF.PolicyStore $sourceSqlStoreConnection + $storePolicies = $sourceStore.Policies | Where-Object { $_.IsSystemObject -eq $false } + $storeConditions = $sourceStore.Conditions | Where-Object { $_.IsSystemObject -eq $false } + } + process { + if (Test-FunctionInterrupt) { return } + foreach ($destinstance in $Destination) { + try { + $destServer = Connect-SqlInstance -SqlInstance $destinstance -SqlCredential $DestinationSqlCredential -MinimumVersion 10 + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $destinstance -Continue + } + $destSqlConn = $destServer.ConnectionContext.SqlConnectionObject + $destSqlStoreConnection = New-Object Microsoft.SqlServer.Management.Sdk.Sfc.SqlStoreConnection $destSqlConn + $destStore = New-Object Microsoft.SqlServer.Management.DMF.PolicyStore $destSqlStoreConnection + + if ($Policy) { + $storePolicies = $storePolicies | Where-Object Name -In $Policy + } + if ($ExcludePolicy) { + $storePolicies = $storePolicies | Where-Object Name -NotIn $ExcludePolicy + } + if ($Condition) { + $storeConditions = $storeConditions | Where-Object Name -In $Condition + } + if ($ExcludeCondition) { + $storeConditions = $storeConditions | Where-Object Name -NotIn $ExcludeCondition + } + + if ($Policy -and $Condition) { + $storeConditions = $null + $storePolicies = $null + } + + <# + Conditions + #> + + Write-Message -Level Verbose -Message "Migrating conditions" + foreach ($condition in $storeConditions) { + $conditionName = $condition.Name + + $copyConditionStatus = [pscustomobject]@{ + SourceServer = $sourceServer.Name + DestinationServer = $destServer.Name + Name = $conditionName + Type = "Policy Condition" + Status = $null + Notes = $null + DateTime = [DbaDateTime](Get-Date) + } + + if ($null -ne $destStore.Conditions[$conditionName]) { + if ($force -eq $false) { + Write-Message -Level Verbose -Message "condition '$conditionName' was skipped because it already exists on $destinstance. Use -Force to drop and recreate" + + $copyConditionStatus.Status = "Skipped" + $copyConditionStatus.Notes = "Already exists on destination" + $copyConditionStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + continue + } else { + if ($Pscmdlet.ShouldProcess($destinstance, "Attempting to drop $conditionName")) { + Write-Message -Level Verbose -Message "Condition '$conditionName' exists on $destinstance. Force specified. Dropping $conditionName." + + try { + $dependentPolicies = $destStore.Conditions[$conditionName].EnumDependentPolicies() + foreach ($dependent in $dependentPolicies) { + $dependent.Drop() + $destStore.Conditions.Refresh() + } + $destStore.Conditions[$conditionName].Drop() + } catch { + $copyConditionStatus.Status = "Failed" + $copyConditionStatus.Notes = (Get-ErrorMessage -Record $_).Message + $copyConditionStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + Stop-Function -Message "Issue dropping condition on $destinstance" -Target $conditionName -ErrorRecord $_ -Continue + } + } + } + } + + if ($Pscmdlet.ShouldProcess($destinstance, "Migrating condition $conditionName")) { + try { + $sql = $condition.ScriptCreate().GetScript() | Out-String + Write-Message -Level Debug -Message $sql + Write-Message -Level Verbose -Message "Copying condition $conditionName" + $null = $destServer.Query($sql) + $destStore.Conditions.Refresh() + + $copyConditionStatus.Status = "Successful" + $copyConditionStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + } catch { + $copyConditionStatus.Status = "Failed" + $copyConditionStatus.Notes = (Get-ErrorMessage -Record $_).Message + $copyConditionStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + + Stop-Function -Message "Issue creating condition on $destinstance" -Target $conditionName -ErrorRecord $_ + } + } + } + + <# + Policies + #> + + Write-Message -Level Verbose -Message "Migrating policies" + foreach ($policy in $storePolicies) { + $policyName = $policy.Name + + $copyPolicyStatus = [pscustomobject]@{ + SourceServer = $sourceServer.Name + DestinationServer = $destServer.Name + Name = $policyName + Type = "Policy" + Status = $null + Notes = $null + DateTime = [DbaDateTime](Get-Date) + } + + if ($null -ne $destStore.Policies[$policyName]) { + if ($force -eq $false) { + Write-Message -Level Verbose -Message "Policy '$policyName' was skipped because it already exists on $destinstance. Use -Force to drop and recreate" + + $copyPolicyStatus.Status = "Skipped" + $copyPolicyStatus.Notes = "Already exists on destination" + $copyPolicyStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + continue + } else { + if ($Pscmdlet.ShouldProcess($destinstance, "Attempting to drop $policyName")) { + Write-Message -Level Verbose -Message "Policy '$policyName' exists on $destinstance. Force specified. Dropping $policyName." + + try { + $destStore.Policies[$policyName].Drop() + $destStore.Policies.refresh() + } catch { + $copyPolicyStatus.Status = "Failed" + $copyPolicyStatus.Notes = (Get-ErrorMessage -Record $_).Message + $copyPolicyStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + + Stop-Function -Message "Issue dropping policy on $destinstance" -Target $policyName -ErrorRecord $_ -Continue + } + } + } + } + + if ($Pscmdlet.ShouldProcess($destinstance, "Migrating policy $policyName")) { + try { + $destStore.Conditions.Refresh() + $destStore.Policies.Refresh() + $sql = $policy.ScriptCreateWithDependencies().GetScript() | Out-String + Write-Message -Level Debug -Message $sql + Write-Message -Level Verbose -Message "Copying policy $policyName" + $null = $destServer.Query($sql) + + $copyPolicyStatus.Status = "Successful" + $copyPolicyStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + } catch { + $copyPolicyStatus.Status = "Failed" + $copyPolicyStatus.Notes = (Get-ErrorMessage -Record $_).Message + $copyPolicyStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + + # This is usually because of a duplicate dependent from above. Just skip for now. + Stop-Function -Message "Issue creating policy on $destinstance" -Target $policyName -ErrorRecord $_ -Continue + } + } + } + } + } + end { + Test-DbaDeprecation -DeprecatedOn "1.0.0" -EnableException:$false -Alias Copy-SqlPolicyManagement + Test-DbaDeprecation -DeprecatedOn "1.0.0" -EnableException:$false -Alias Copy-DbaSqlPolicyManagement + } +} +function Copy-DbaResourceGovernor { + <# + .SYNOPSIS + Migrates Resource Pools + + .DESCRIPTION + By default, all non-system resource pools are migrated. If the pool already exists on the destination, it will be skipped unless -Force is used. + + The -ResourcePool parameter is auto-populated for command-line completion and can be used to copy only specific objects. + + .PARAMETER Source + Source SQL Server. You must have sysadmin access and server version must be SQL Server version 2008 or higher. + + .PARAMETER SourceSqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Destination + Destination SQL Server. You must have sysadmin access and the server must be SQL Server 2008 or higher. + + .PARAMETER DestinationSqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER ResourcePool + Specifies the resource pool(s) to process. Options for this list are auto-populated from the server. If unspecified, all resource pools will be processed. + + .PARAMETER ExcludeResourcePool + Specifies the resource pool(s) to exclude. Options for this list are auto-populated from the server + + .PARAMETER WhatIf + If this switch is enabled, no actions are performed but informational messages will be displayed that explain what would happen if the command were to run. + + .PARAMETER Confirm + If this switch is enabled, you will be prompted for confirmation before executing any operations that change state. + + .PARAMETER Force + If this switch is enabled, the policies will be dropped and recreated on Destination. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Migration, ResourceGovernor + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + Requires: sysadmin access on SQL Servers + + .LINK + https://dbatools.io/Copy-DbaResourceGovernor + + .EXAMPLE + PS C:\> Copy-DbaResourceGovernor -Source sqlserver2014a -Destination sqlcluster + + Copies all all non-system resource pools from sqlserver2014a to sqlcluster using Windows credentials to connect to the SQL Server instances.. + + .EXAMPLE + PS C:\> Copy-DbaResourceGovernor -Source sqlserver2014a -Destination sqlcluster -SourceSqlCredential $cred + + Copies all all non-system resource pools from sqlserver2014a to sqlcluster using SQL credentials to connect to sqlserver2014a and Windows credentials to connect to sqlcluster. + + .EXAMPLE + PS C:\> Copy-DbaResourceGovernor -Source sqlserver2014a -Destination sqlcluster -WhatIf + + Shows what would happen if the command were executed. + + #> + [CmdletBinding(DefaultParameterSetName = "Default", SupportsShouldProcess)] + param ( + [parameter(Mandatory)] + [DbaInstanceParameter]$Source, + [PSCredential]$SourceSqlCredential, + [parameter(Mandatory)] + [DbaInstanceParameter[]]$Destination, + [PSCredential]$DestinationSqlCredential, + [object[]]$ResourcePool, + [object[]]$ExcludeResourcePool, + [switch]$Force, + [Alias('Silent')] + [switch]$EnableException + ) + process { + try { + $sourceServer = Connect-SqlInstance -SqlInstance $Source -SqlCredential $SourceSqlCredential -MinimumVersion 10 + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $Source + return + } + $sourceClassifierFunction = Get-DbaRgClassifierFunction -SqlInstance $sourceServer + + foreach ($destinstance in $Destination) { + try { + $destServer = Connect-SqlInstance -SqlInstance $destinstance -SqlCredential $DestinationSqlCredential -MinimumVersion 10 + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $destinstance -Continue + } + $destClassifierFunction = Get-DbaRgClassifierFunction -SqlInstance $destServer + + $copyResourceGovSetting = [pscustomobject]@{ + SourceServer = $sourceServer.Name + DestinationServer = $destServer.Name + Type = "Resource Governor Settings" + Name = "All Settings" + Status = $null + Notes = $null + DateTime = [DbaDateTime](Get-Date) + } + + $copyResourceGovClassifierFunc = [pscustomobject]@{ + SourceServer = $sourceServer.Name + DestinationServer = $destServer.Name + Type = "Resource Governor Settings" + Name = "Classifier Function" + Status = $null + Notes = $null + DateTime = [DbaDateTime](Get-Date) + } + + if ($Pscmdlet.ShouldProcess($destinstance, "Updating Resource Governor settings")) { + if ($destServer.Edition -notmatch 'Enterprise' -and $destServer.Edition -notmatch 'Datacenter' -and $destServer.Edition -notmatch 'Developer') { + Write-Message -Level Verbose -Message "The resource governor is not available in this edition of SQL Server. You can manipulate resource governor metadata but you will not be able to apply resource governor configuration. Only Enterprise edition of SQL Server supports resource governor." + } else { + try { + Write-Message -Level Verbose -Message "Managing classifier function." + if (!$sourceClassifierFunction) { + $copyResourceGovClassifierFunc.Status = "Skipped" + $copyResourceGovClassifierFunc.Notes = $null + $copyResourceGovClassifierFunc | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + } else { + $fullyQualifiedFunctionName = $sourceClassifierFunction.Schema + "." + $sourceClassifierFunction.Name + + if (!$destClassifierFunction) { + $destServer = Connect-SqlInstance -SqlInstance $destinstance -SqlCredential $DestinationSqlCredential + $destFunction = $destServer.Databases["master"].UserDefinedFunctions[$sourceClassifierFunction.Name] + if ($destFunction) { + Write-Message -Level Verbose -Message "Dropping the function with the source classifier function name." + $destFunction.Drop() + } + + Write-Message -Level Verbose -Message "Creating function." + $destServer.Query($sourceClassifierFunction.Script()) + + $sql = "ALTER RESOURCE GOVERNOR WITH (CLASSIFIER_FUNCTION = $fullyQualifiedFunctionName);" + Write-Message -Level Debug -Message $sql + Write-Message -Level Verbose -Message "Mapping Resource Governor classifier function." + $destServer.Query($sql) + + $copyResourceGovClassifierFunc.Status = "Successful" + $copyResourceGovClassifierFunc.Notes = "The new classifier function has been created" + $copyResourceGovClassifierFunc | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + + $sql = "ALTER RESOURCE GOVERNOR RECONFIGURE;" + Write-Message -Level Debug -Message $sql + Write-Message -Level Verbose -Message "Reconfiguring Resource Governor." + $destServer.Query($sql) + } else { + if ($Force -eq $false) { + $copyResourceGovClassifierFunc.Status = "Skipped" + $copyResourceGovClassifierFunc.Notes = "Already exists on destination" + $copyResourceGovClassifierFunc | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + } else { + + $sql = "ALTER RESOURCE GOVERNOR WITH (CLASSIFIER_FUNCTION = NULL);" + Write-Message -Level Debug -Message $sql + Write-Message -Level Verbose -Message "Disabling the Resource Governor." + $destServer.Query($sql) + + $sql = "ALTER RESOURCE GOVERNOR RECONFIGURE;" + Write-Message -Level Debug -Message $sql + Write-Message -Level Verbose -Message "Reconfiguring Resource Governor." + $destServer.Query($sql) + + Write-Message -Level Verbose -Message "Dropping the destination classifier function." + $destServer = Connect-SqlInstance -SqlInstance $destinstance -SqlCredential $DestinationSqlCredential + $destFunction = $destServer.Databases["master"].UserDefinedFunctions[$sourceClassifierFunction.Name] + $destClassifierFunction.Drop() + + Write-Message -Level Verbose -Message "Re-creating the Resource Governor classifier function." + $destServer.Query($sourceClassifierFunction.Script()) + + $sql = "ALTER RESOURCE GOVERNOR WITH (CLASSIFIER_FUNCTION = $fullyQualifiedFunctionName);" + Write-Message -Level Debug -Message $sql + Write-Message -Level Verbose -Message "Mapping Resource Governor classifier function." + $destServer.Query($sql) + + $sql = "ALTER RESOURCE GOVERNOR RECONFIGURE;" + Write-Message -Level Debug -Message $sql + Write-Message -Level Verbose -Message "Reconfiguring Resource Governor." + $destServer.Query($sql) + + $copyResourceGovClassifierFunc.Status = "Successful" + $copyResourceGovClassifierFunc.Notes = "The old classifier function has been overwritten." + $copyResourceGovClassifierFunc | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + } + } + } + } catch { + $copyResourceGovSetting.Status = "Failed" + $copyResourceGovSetting.Notes = (Get-ErrorMessage -Record $_) + $copyResourceGovSetting | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + + $sql = "ALTER RESOURCE GOVERNOR RECONFIGURE;" + Write-Message -Level Debug -Message $sql + Write-Message -Level Verbose -Message "Reconfiguring Resource Governor." + $destServer.Query($sql) + + Stop-Function -Message "Not able to update settings." -Target $destServer -ErrorRecord $_ + } + } + } + + # Pools + if ($ResourcePool) { + $pools = $sourceServer.ResourceGovernor.ResourcePools | Where-Object Name -In $ResourcePool + } elseif ($ExcludeResourcePool) { + $pool = $sourceServer.ResourceGovernor.ResourcePools | Where-Object Name -NotIn $ExcludeResourcePool + } else { + $pools = $sourceServer.ResourceGovernor.ResourcePools | Where-Object { $_.Name -notin "internal", "default" } + } + + Write-Message -Level Verbose -Message "Migrating pools." + foreach ($pool in $pools) { + $poolName = $pool.Name + + $copyResourceGovPool = [pscustomobject]@{ + SourceServer = $sourceServer.Name + DestinationServer = $destServer.Name + Type = "Resource Governor Pool" + Name = $poolName + Status = $null + Notes = $null + DateTime = [DbaDateTime](Get-Date) + } + + if ($null -ne $destServer.ResourceGovernor.ResourcePools[$poolName]) { + if ($force -eq $false) { + Write-Message -Level Verbose -Message "Pool '$poolName' was skipped because it already exists on $destinstance. Use -Force to drop and recreate." + + $copyResourceGovPool.Status = "Skipped" + $copyResourceGovPool.Notes = "Already exists on destination" + $copyResourceGovPool | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + continue + } else { + if ($Pscmdlet.ShouldProcess($destinstance, "Attempting to drop $poolName")) { + Write-Message -Level Verbose -Message "Pool '$poolName' exists on $destinstance." + Write-Message -Level Verbose -Message "Force specified. Dropping $poolName." + + try { + $destServer = Connect-SqlInstance -SqlInstance $destinstance -SqlCredential $DestinationSqlCredential + $destPool = $destServer.ResourceGovernor.ResourcePools[$poolName] + $workloadGroups = $destPool.WorkloadGroups + foreach ($workloadGroup in $workloadGroups) { + $workloadGroup.Drop() + } + $destPool.Drop() + $destServer.ResourceGovernor.Alter() + } catch { + $copyResourceGovPool.Status = "Failed to drop from Destination" + $copyResourceGovPool.Notes = (Get-ErrorMessage -Record $_) + $copyResourceGovPool | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + + Stop-Function -Message "Unable to drop: $_ Moving on." -Target $destPool -ErrorRecord $_ -Continue + + $sql = "ALTER RESOURCE GOVERNOR RECONFIGURE;" + Write-Message -Level Debug -Message $sql + Write-Message -Level Verbose -Message "Reconfiguring Resource Governor." + $destServer.Query($sql) + } + } + } + } + + if ($Pscmdlet.ShouldProcess($destinstance, "Migrating pool $poolName")) { + try { + $sql = $pool.Script() | Out-String + Write-Message -Level Debug -Message $sql + Write-Message -Level Verbose -Message "Copying pool $poolName." + $destServer.Query($sql) + + $copyResourceGovPool.Status = "Successful" + $copyResourceGovPool | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + + $workloadGroups = $pool.WorkloadGroups + foreach ($workloadGroup in $workloadGroups) { + $workgroupName = $workloadGroup.Name + + $copyResourceGovWorkGroup = [pscustomobject]@{ + SourceServer = $sourceServer.Name + DestinationServer = $destServer.Name + Type = "Resource Governor Pool Workgroup" + Name = $workgroupName + Status = $null + Notes = $null + DateTime = [DbaDateTime](Get-Date) + } + + $sql = $workloadGroup.Script() | Out-String + Write-Message -Level Debug -Message $sql + Write-Message -Level Verbose -Message "Copying $workgroupName." + $destServer.Query($sql) + + $copyResourceGovWorkGroup.Status = "Successful" + $copyResourceGovWorkGroup | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + + $sql = "ALTER RESOURCE GOVERNOR RECONFIGURE;" + Write-Message -Level Debug -Message $sql + Write-Message -Level Verbose -Message "Reconfiguring Resource Governor." + $destServer.Query($sql) + } + } catch { + if ($copyResourceGovWorkGroup) { + $copyResourceGovWorkGroup.Status = "Failed" + $copyResourceGovWorkGroup.Notes = (Get-ErrorMessage -Record $_) + $copyResourceGovWorkGroup | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + } + Stop-Function -Message "Unable to migrate pool." -Target $pool -ErrorRecord $_ + } + } + } + + if ($Pscmdlet.ShouldProcess($destinstance, "Reconfiguring")) { + if ($destServer.Edition -notmatch 'Enterprise' -and $destServer.Edition -notmatch 'Datacenter' -and $destServer.Edition -notmatch 'Developer') { + Write-Message -Level Verbose -Message "The resource governor is not available in this edition of SQL Server. You can manipulate resource governor metadata but you will not be able to apply resource governor configuration. Only Enterprise edition of SQL Server supports resource governor." + } else { + + Write-Message -Level Verbose -Message "Reconfiguring Resource Governor." + try { + if (!$sourceServer.ResourceGovernor.Enabled) { + $sql = "ALTER RESOURCE GOVERNOR DISABLE" + $destServer.Query($sql) + + $sql = "ALTER RESOURCE GOVERNOR RECONFIGURE;" + Write-Message -Level Debug -Message $sql + Write-Message -Level Verbose -Message "Reconfiguring Resource Governor." + $destServer.Query($sql) + } else { + $sql = "ALTER RESOURCE GOVERNOR RECONFIGURE" + $destServer.Query($sql) + } + } catch { + $altermsg = $_.Exception + } + + + $copyResourceGovReconfig = [pscustomobject]@{ + SourceServer = $sourceServer.Name + DestinationServer = $destServer.Name + Type = "Reconfigure Resource Governor" + Name = "Reconfigure Resource Governor" + Status = "Successful" + Notes = $altermsg + DateTime = [DbaDateTime](Get-Date) + } + $copyResourceGovReconfig | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + } + } + } + } + end { + Test-DbaDeprecation -DeprecatedOn "1.0.0" -EnableException:$false -Alias Copy-SqlResourceGovernor + } +} +function Copy-DbaServerAudit { + <# + .SYNOPSIS + Copy-DbaServerAudit migrates server audits from one SQL Server to another. + + .DESCRIPTION + By default, all audits are copied. The -Audit parameter is auto-populated for command-line completion and can be used to copy only specific audits. + + If the audit already exists on the destination, it will be skipped unless -Force is used. + + .PARAMETER Source + Source SQL Server. You must have sysadmin access and server version must be SQL Server version 2000 or higher. + + .PARAMETER SourceSqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Destination + Destination SQL Server. You must have sysadmin access and the server must be SQL Server 2000 or higher. + + .PARAMETER DestinationSqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Audit + The audit(s) to process. Options for this list are auto-populated from the server. If unspecified, all audits will be processed. + + .PARAMETER ExcludeAudit + The audit(s) to exclude. Options for this list are auto-populated from the server. + + .PARAMETER Path + Destination file path. If not specified, the file path of the source will be used (or the default data directory). + + .PARAMETER WhatIf + If this switch is enabled, no actions are performed but informational messages will be displayed that explain what would happen if the command were to run. + + .PARAMETER Confirm + If this switch is enabled, you will be prompted for confirmation before executing any operations that change state. + + .PARAMETER Force + If this switch is enabled, the audits will be dropped and recreated on Destination. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Migration + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + Requires: sysadmin access on SQL Servers + + .LINK + https://dbatools.io/Copy-DbaServerAudit + + .EXAMPLE + PS C:\> Copy-DbaServerAudit -Source sqlserver2014a -Destination sqlcluster + + Copies all server audits from sqlserver2014a to sqlcluster, using Windows credentials. If audits with the same name exist on sqlcluster, they will be skipped. + + .EXAMPLE + PS C:\> Copy-DbaServerAudit -Source sqlserver2014a -Destination sqlcluster -Audit tg_noDbDrop -SourceSqlCredential $cred -Force + + Copies a single audit, the tg_noDbDrop audit from sqlserver2014a to sqlcluster, using SQL credentials for sqlserver2014a and Windows credentials for sqlcluster. If an audit with the same name exists on sqlcluster, it will be dropped and recreated because -Force was used. + + .EXAMPLE + PS C:\> Copy-DbaServerAudit -Source sqlserver2014a -Destination sqlcluster -WhatIf -Force + + Shows what would happen if the command were executed using force. + + .EXAMPLE + PS C:\> Copy-DbaServerAudit -Source sqlserver-0 -Destination sqlserver-1 -Audit audit1 -Path 'C:\audit1' + + Copies audit audit1 from sqlserver-0 to sqlserver-1. The file path on sqlserver-1 will be set to 'C:\audit1'. + #> + [CmdletBinding(DefaultParameterSetName = "Default", SupportsShouldProcess)] + param ( + [parameter(Mandatory)] + [DbaInstanceParameter]$Source, + [PSCredential] + $SourceSqlCredential, + [parameter(Mandatory)] + [DbaInstanceParameter[]]$Destination, + [PSCredential] + $DestinationSqlCredential, + [object[]]$Audit, + [object[]]$ExcludeAudit, + [string]$Path, + [switch]$Force, + [Alias('Silent')] + [switch]$EnableException + ) + + begin { + try { + $sourceServer = Connect-SqlInstance -SqlInstance $Source -SqlCredential $SourceSqlCredential -MinimumVersion 10 + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $Source + return + } + $serverAudits = $sourceServer.Audits + } + process { + if (Test-FunctionInterrupt) { return } + foreach ($destinstance in $Destination) { + + try { + $destServer = Connect-SqlInstance -SqlInstance $destinstance -SqlCredential $DestinationSqlCredential -MinimumVersion 10 + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $destinstance -Continue + } + $destAudits = $destServer.Audits + foreach ($currentAudit in $serverAudits) { + $auditName = $currentAudit.Name + + $copyAuditStatus = [pscustomobject]@{ + SourceServer = $sourceServer.Name + DestinationServer = $destServer.Name + Name = $auditName + Type = "Server Audit" + Status = $null + Notes = $null + DateTime = [DbaDateTime](Get-Date) + } + + if ($Audit -and $auditName -notin $Audit -or $auditName -in $ExcludeAudit) { + continue + } + + if ($Path) { + $currentAudit.FilePath = $Path + } + + if ($destAudits.Name -contains $auditName) { + if ($force -eq $false) { + if ($Pscmdlet.ShouldProcess($destinstance, "Server audit $auditName exists at destination. Use -Force to drop and migrate.")) { + $copyAuditStatus.Status = "Skipped" + $copyAuditStatus.Notes = "Already exists on destination" + Write-Message -Level Verbose -Message "Server audit $auditName exists at destination. Use -Force to drop and migrate." + } + continue + } else { + if ($Pscmdlet.ShouldProcess($destinstance, "Dropping server audit $auditName")) { + try { + Write-Message -Level Verbose -Message "Dropping server audit $auditName." + foreach ($spec in $destServer.ServerAuditSpecifications) { + if ($auditSpecification.Auditname -eq $auditName) { + $auditSpecification.Drop() + } + } + + $destServer.audits[$auditName].Disable() + $destServer.audits[$auditName].Alter() + $destServer.audits[$auditName].Drop() + } catch { + $copyAuditStatus.Status = "Failed" + $copyAuditStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + + Stop-Function -Message "Issue dropping audit from destination." -Target $auditName -ErrorRecord $_ + } + } + } + } + + if ($null -ne ($currentAudit.Filepath) -and -not (Test-DbaPath -SqlInstance $destServer -Path $currentAudit.Filepath)) { + if ($Force -eq $false) { + if ($Pscmdlet.ShouldProcess($destinstance, "$($currentAudit.Filepath) does not exist on $destinstance. Skipping $auditName. Specify -Force to create the directory.")) { + $copyAuditStatus.Status = "Skipped" + $copyAuditStatus.Notes = "$($currentAudit.Filepath) does not exist on $destinstance. Skipping $auditName. Specify -Force to create the directory." + $copyAuditStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + } + continue + } else { + Write-Message -Level Verbose -Message "Force specified. Creating directory." + + $destNetBios = Resolve-NetBiosName $destServer + $root = $currentAudit.Filepath.Substring(0, 3) + $rootUnc = Join-AdminUnc $destNetBios $root + + if ((Test-Path $rootUnc) -eq $true) { + if ($Pscmdlet.ShouldProcess($destinstance, "Creating directory $($currentAudit.Filepath)")) { + try { + $null = New-DbaDirectory -SqlInstance $destServer -Path $currentAudit.Filepath -EnableException + } catch { + Write-Message -Level Warning -Message "Couldn't create directory $($currentAudit.Filepath). Using default data directory." + $datadir = Get-SqlDefaultPaths $destServer data + $currentAudit.FilePath = $datadir + } + } + } else { + $datadir = Get-SqlDefaultPaths $destServer data + $currentAudit.FilePath = $datadir + } + } + } + if ($Pscmdlet.ShouldProcess($destinstance, "Creating server audit $auditName")) { + try { + Write-Message -Level Verbose -Message "File path $($currentAudit.Filepath) exists on $destinstance." + Write-Message -Level Verbose -Message "Copying server audit $auditName." + $sql = $currentAudit.Script() | Out-String + $destServer.Query($sql) + $copyAuditStatus.Status = "Successful" + $copyAuditStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + } catch { + $copyAuditStatus.Status = "Failed" + $copyAuditStatus.Notes = (Get-ErrorMessage -Record $_) + $copyAuditStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + + Stop-Function -Message "Issue creating audit." -Target $auditName -ErrorRecord $_ + } + } + } + } + } + end { + Test-DbaDeprecation -DeprecatedOn "1.0.0" -EnableException:$false -Alias Copy-SqlAudit + } +} +function Copy-DbaServerAuditSpecification { + <# + .SYNOPSIS + Copy-DbaServerAuditSpecification migrates server audit specifications from one SQL Server to another. + + .DESCRIPTION + By default, all audits are copied. The -AuditSpecification parameter is auto-populated for command-line completion and can be used to copy only specific audits. + + If the audit specification already exists on the destination, it will be skipped unless -Force is used. + + .PARAMETER Source + Source SQL Server. You must have sysadmin access and server version must be SQL Server version 2000 or higher. + + .PARAMETER SourceSqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Destination + Destination SQL Server. You must have sysadmin access and the server must be SQL Server 2000 or higher. + + .PARAMETER DestinationSqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER AuditSpecification + The Server Audit Specification(s) to process. Options for this list are auto-populated from the server. If unspecified, all Server Audit Specifications will be processed. + + .PARAMETER ExcludeAuditSpecification + The Server Audit Specification(s) to exclude. Options for this list are auto-populated from the server + + .PARAMETER WhatIf + If this switch is enabled, no actions are performed but informational messages will be displayed that explain what would happen if the command were to run. + + .PARAMETER Confirm + If this switch is enabled, you will be prompted for confirmation before executing any operations that change state. + + .PARAMETER Force + If this switch is enabled, the Audits Specifications will be dropped and recreated on Destination. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Migration,ServerAudit,AuditSpecification + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + Requires: sysadmin access on SQL Servers + + .LINK + https://dbatools.io/Copy-DbaServerAuditSpecification + + .EXAMPLE + PS C:\> Copy-DbaServerAuditSpecification -Source sqlserver2014a -Destination sqlcluster + + Copies all server audits from sqlserver2014a to sqlcluster using Windows credentials to connect. If audits with the same name exist on sqlcluster, they will be skipped. + + .EXAMPLE + PS C:\> Copy-DbaServerAuditSpecification -Source sqlserver2014a -Destination sqlcluster -AuditSpecification tg_noDbDrop -SourceSqlCredential $cred -Force + + Copies a single audit, the tg_noDbDrop audit from sqlserver2014a to sqlcluster using SQL credentials to connect to sqlserver2014a and Windows credentials to connect to sqlcluster. If an audit specification with the same name exists on sqlcluster, it will be dropped and recreated because -Force was used. + + .EXAMPLE + PS C:\> Copy-DbaServerAuditSpecification -Source sqlserver2014a -Destination sqlcluster -WhatIf -Force + + Shows what would happen if the command were executed using force. + + #> + [CmdletBinding(DefaultParameterSetName = "Default", SupportsShouldProcess)] + param ( + [parameter(Mandatory)] + [DbaInstanceParameter]$Source, + [PSCredential]$SourceSqlCredential, + [parameter(Mandatory)] + [DbaInstanceParameter[]]$Destination, + [PSCredential]$DestinationSqlCredential, + [object[]]$AuditSpecification, + [object[]]$ExcludeAuditSpecification, + [switch]$Force, + [Alias('Silent')] + [switch]$EnableException + ) + + begin { + try { + $sourceServer = Connect-SqlInstance -SqlInstance $Source -SqlCredential $SourceSqlCredential -MinimumVersion 10 + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $Source + return + } + + if (!(Test-SqlSa -SqlInstance $sourceServer -SqlCredential $SourceSqlCredential)) { + Stop-Function -Message "Not a sysadmin on $source. Quitting." + return + } + + $AuditSpecifications = $sourceServer.ServerAuditSpecifications + } + process { + if (Test-FunctionInterrupt) { return } + foreach ($destinstance in $Destination) { + try { + $destServer = Connect-SqlInstance -SqlInstance $destinstance -SqlCredential $DestinationSqlCredential -MinimumVersion 10 + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $destinstance -Continue + } + + if (!(Test-SqlSa -SqlInstance $destServer -SqlCredential $DestinationSqlCredential)) { + Stop-Function -Message "Not a sysadmin on $destinstance. Quitting." + return + } + + if ($destServer.VersionMajor -lt $sourceServer.VersionMajor) { + Stop-Function -Message "Migration from version $($destServer.VersionMajor) to version $($sourceServer.VersionMajor) is not supported." + return + } + $destAudits = $destServer.ServerAuditSpecifications + foreach ($auditSpec in $AuditSpecifications) { + $auditSpecName = $auditSpec.Name + + $copyAuditSpecStatus = [pscustomobject]@{ + SourceServer = $sourceServer.Name + DestinationServer = $destServer.Name + Type = "Server Audit Specification" + Name = $auditSpecName + Status = $null + Notes = $null + DateTime = [DbaDateTime](Get-Date) + } + + if ($AuditSpecification -and $auditSpecName -notin $AuditSpecification -or $auditSpecName -in $ExcludeAuditSpecification) { + continue + } + + $destServer.Audits.Refresh() + if ($destServer.Audits.Name -notcontains $auditSpec.AuditName) { + if ($Pscmdlet.ShouldProcess($destinstance, "Audit $($auditSpec.AuditName) does not exist on $destinstance. Skipping $auditSpecName.")) { + $copyAuditSpecStatus.Status = "Skipped" + $copyAuditSpecStatus.Notes = "Audit $($auditSpec.AuditName) does not exist on $destinstance. Skipping $auditSpecName." + Write-Message -Level Warning -Message "Audit $($auditSpec.AuditName) does not exist on $destinstance. Skipping $auditSpecName." + $copyAuditSpecStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + } + continue + } + + if ($destAudits.name -contains $auditSpecName) { + if ($force -eq $false) { + Write-Message -Level Verbose -Message "Server audit $auditSpecName exists at destination. Use -Force to drop and migrate." + + $copyAuditSpecStatus.Status = "Skipped" + $copyAuditSpecStatus.Notes = "Already exists on destination" + $copyAuditSpecStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + continue + } else { + if ($Pscmdlet.ShouldProcess($destinstance, "Dropping server audit $auditSpecName and recreating")) { + try { + Write-Message -Level Verbose -Message "Dropping server audit $auditSpecName" + $destServer.ServerAuditSpecifications[$auditSpecName].Drop() + } catch { + $copyAuditSpecStatus.Status = "Failed" + $copyAuditSpecStatus.Notes = (Get-ErrorMessage -Record $_) + $copyAuditSpecStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + + Stop-Function -Message "Issue dropping audit spec" -Target $auditSpecName -ErrorRecord $_ -Continue + } + } + } + } + if ($Pscmdlet.ShouldProcess($destinstance, "Creating server audit $auditSpecName")) { + try { + Write-Message -Level Verbose -Message "Copying server audit $auditSpecName" + $sql = $auditSpec.Script() | Out-String + Write-Message -Level Debug -Message $sql + $destServer.Query($sql) + + $copyAuditSpecStatus.Status = "Successful" + $copyAuditSpecStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + } catch { + $copyAuditSpecStatus.Status = "Failed" + $copyAuditSpecStatus.Notes = (Get-ErrorMessage -Record $_) + $copyAuditSpecStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + + Stop-Function -Message "Issue creating audit spec on destination" -Target $auditSpecName -ErrorRecord $_ + } + } + } + } + } + end { + Test-DbaDeprecation -DeprecatedOn "1.0.0" -EnableException:$false -Alias Copy-SqlAuditSpecification + } +} +function Copy-DbaServerTrigger { + <# + .SYNOPSIS + Copy-DbaServerTrigger migrates server triggers from one SQL Server to another. + + .DESCRIPTION + By default, all triggers are copied. The -ServerTrigger parameter is auto-populated for command-line completion and can be used to copy only specific triggers. + + If the trigger already exists on the destination, it will be skipped unless -Force is used. + + .PARAMETER Source + Source SQL Server.You must have sysadmin access and server version must be SQL Server version 2000 or greater. + + .PARAMETER SourceSqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Destination + Destination Sql Server. You must have sysadmin access and server version must be SQL Server version 2000 or greater. + + .PARAMETER DestinationSqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER ServerTrigger + The Server Trigger(s) to process - this list is auto-populated from the server. If unspecified, all Server Triggers will be processed. + + .PARAMETER ExcludeServerTrigger + The Server Trigger(s) to exclude - this list is auto-populated from the server + + .PARAMETER WhatIf + Shows what would happen if the command were to run. No actions are actually performed. + + .PARAMETER Confirm + Prompts you for confirmation before executing any changing operations within the command. + + .PARAMETER Force + Drops and recreates the Trigger if it exists + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Migration + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + Requires: sysadmin access on SQL Servers + + .LINK + https://dbatools.io/Copy-DbaServerTrigger + + .EXAMPLE + PS C:\> Copy-DbaServerTrigger -Source sqlserver2014a -Destination sqlcluster + + Copies all server triggers from sqlserver2014a to sqlcluster, using Windows credentials. If triggers with the same name exist on sqlcluster, they will be skipped. + + .EXAMPLE + PS C:\> Copy-DbaServerTrigger -Source sqlserver2014a -Destination sqlcluster -ServerTrigger tg_noDbDrop -SourceSqlCredential $cred -Force + + Copies a single trigger, the tg_noDbDrop trigger from sqlserver2014a to sqlcluster, using SQL credentials for sqlserver2014a and Windows credentials for sqlcluster. If a trigger with the same name exists on sqlcluster, it will be dropped and recreated because -Force was used. + + .EXAMPLE + PS C:\> Copy-DbaServerTrigger -Source sqlserver2014a -Destination sqlcluster -WhatIf -Force + + Shows what would happen if the command were executed using force. + + #> + [CmdletBinding(DefaultParameterSetName = "Default", SupportsShouldProcess)] + param ( + [parameter(Mandatory)] + [DbaInstanceParameter]$Source, + [PSCredential] + $SourceSqlCredential, + [parameter(Mandatory)] + [DbaInstanceParameter[]]$Destination, + [PSCredential] + $DestinationSqlCredential, + [object[]]$ServerTrigger, + [object[]]$ExcludeServerTrigger, + [switch]$Force, + [Alias('Silent')] + [switch]$EnableException + ) + + begin { + try { + $sourceServer = Connect-SqlInstance -SqlInstance $Source -SqlCredential $SourceSqlCredential -MinimumVersion 9 + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $Source + return + } + $serverTriggers = $sourceServer.Triggers + } + process { + if (Test-FunctionInterrupt) { return } + foreach ($destinstance in $Destination) { + try { + $destServer = Connect-SqlInstance -SqlInstance $destinstance -SqlCredential $DestinationSqlCredential -MinimumVersion 9 + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $destinstance -Continue + } + if ($destServer.VersionMajor -lt $sourceServer.VersionMajor) { + Stop-Function -Message "Migration from version $($destServer.VersionMajor) to version $($sourceServer.VersionMajor) is not supported." + return + } + $destTriggers = $destServer.Triggers + + foreach ($trigger in $serverTriggers) { + $triggerName = $trigger.Name + + $copyTriggerStatus = [pscustomobject]@{ + SourceServer = $sourceServer.Name + DestinationServer = $destServer.Name + Name = $triggerName + Type = "Server Trigger" + Status = $null + Notes = $null + DateTime = [DbaDateTime](Get-Date) + } + + if ($ServerTrigger -and $triggerName -notin $ServerTrigger -or $triggerName -in $ExcludeServerTrigger) { + continue + } + + if ($destTriggers.Name -contains $triggerName) { + if ($force -eq $false) { + Write-Message -Level Verbose -Message "Server trigger $triggerName exists at destination. Use -Force to drop and migrate." + + $copyTriggerStatus.Status = "Skipped" + $copyTriggerStatus.Notes = "Already exists on destination" + $copyTriggerStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + continue + } else { + if ($Pscmdlet.ShouldProcess($destinstance, "Dropping server trigger $triggerName and recreating")) { + try { + Write-Message -Level Verbose -Message "Dropping server trigger $triggerName" + $destServer.Triggers[$triggerName].Drop() + } catch { + $copyTriggerStatus.Status = "Failed" + $copyTriggerStatus.Notes = (Get-ErrorMessage -Record $_) + $copyTriggerStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + + Stop-Function -Message "Issue dropping trigger on destination" -Target $triggerName -ErrorRecord $_ -Continue + } + } + } + } + + if ($Pscmdlet.ShouldProcess($destinstance, "Creating server trigger $triggerName")) { + try { + Write-Message -Level Verbose -Message "Copying server trigger $triggerName" + $sql = $trigger.Script() | Out-String + $sql = $sql -replace "CREATE TRIGGER", "`nGO`nCREATE TRIGGER" + $sql = $sql -replace "ENABLE TRIGGER", "`nGO`nENABLE TRIGGER" + Write-Message -Level Debug -Message $sql + + foreach ($query in ($sql -split '\nGO\b')) { + $destServer.Query($query) | Out-Null + } + + $copyTriggerStatus.Status = "Successful" + $copyTriggerStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + } catch { + $copyTriggerStatus.Status = "Failed" + $copyTriggerStatus.Notes = (Get-ErrorMessage -Record $_) + $copyTriggerStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + + Stop-Function -Message "Issue creating trigger on destination" -Target $triggerName -ErrorRecord $_ + } + } + } + } + } + end { + Test-DbaDeprecation -DeprecatedOn "1.0.0" -EnableException:$false -Alias Copy-SqlServerTrigger + } +} +function Copy-DbaSpConfigure { + <# + .SYNOPSIS + Copy-DbaSpConfigure migrates configuration values from one SQL Server to another. + + .DESCRIPTION + By default, all configuration values are copied. The -ConfigName parameter is auto-populated for command-line completion and can be used to copy only specific configs. + + .PARAMETER Source + Source SQL Server. You must have sysadmin access and server version must be SQL Server version 2000 or higher. + + .PARAMETER SourceSqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Destination + Destination SQL Server. You must have sysadmin access and the server must be SQL Server 2000 or higher. + + .PARAMETER DestinationSqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER ConfigName + Specifies the configuration setting to process. Options for this list are auto-populated from the server. If unspecified, all ConfigNames will be processed. + + .PARAMETER ExcludeConfigName + Specifies the configuration settings to exclude. Options for this list are auto-populated from the server. + + .PARAMETER WhatIf + If this switch is enabled, no actions are performed but informational messages will be displayed that explain what would happen if the command were to run. + + .PARAMETER Confirm + If this switch is enabled, you will be prompted for confirmation before executing any operations that change state. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Migration, Configure, SpConfigure + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + Requires: sysadmin access on SQL Servers + + .LINK + https://dbatools.io/Copy-DbaSpConfigure + + .EXAMPLE + PS C:\> Copy-DbaSpConfigure -Source sqlserver2014a -Destination sqlcluster + + Copies all sp_configure settings from sqlserver2014a to sqlcluster + + .EXAMPLE + PS C:\> Copy-DbaSpConfigure -Source sqlserver2014a -Destination sqlcluster -ConfigName DefaultBackupCompression, IsSqlClrEnabled -SourceSqlCredential $cred + + Copies the values for IsSqlClrEnabled and DefaultBackupCompression from sqlserver2014a to sqlcluster using SQL credentials to authenticate to sqlserver2014a and Windows credentials to authenticate to sqlcluster. + + .EXAMPLE + PS C:\> Copy-DbaSpConfigure -Source sqlserver2014a -Destination sqlcluster -ExcludeConfigName DefaultBackupCompression, IsSqlClrEnabled + + Copies all configs except for IsSqlClrEnabled and DefaultBackupCompression, from sqlserver2014a to sqlcluster. + + .EXAMPLE + PS C:\> Copy-DbaSpConfigure -Source sqlserver2014a -Destination sqlcluster -WhatIf + + Shows what would happen if the command were executed. + + #> + [CmdletBinding(DefaultParameterSetName = "Default", SupportsShouldProcess)] + param ( + [parameter(Mandatory)] + [DbaInstanceParameter]$Source, + [PSCredential]$SourceSqlCredential, + [parameter(Mandatory)] + [DbaInstanceParameter[]]$Destination, + [PSCredential]$DestinationSqlCredential, + [object[]]$ConfigName, + [object[]]$ExcludeConfigName, + [Alias('Silent')] + [switch]$EnableException + ) + begin { + try { + $sourceServer = Connect-SqlInstance -SqlInstance $Source -SqlCredential $SourceSqlCredential + $sourceProps = Get-DbaSpConfigure -SqlInstance $sourceServer + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $Source + return + } + } + process { + if (Test-FunctionInterrupt) { return } + foreach ($destinstance in $Destination) { + try { + $destServer = Connect-SqlInstance -SqlInstance $destinstance -SqlCredential $DestinationSqlCredential + $destProps = Get-DbaSpConfigure -SqlInstance $destServer + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $destinstance -Continue + } + + foreach ($sourceProp in $sourceProps) { + $displayName = $sourceProp.DisplayName + $sConfigName = $sourceProp.ConfigName + $sConfiguredValue = $sourceProp.ConfiguredValue + $requiresRestart = $sourceProp.IsDynamic + + $copySpConfigStatus = [pscustomobject]@{ + SourceServer = $sourceServer.Name + DestinationServer = $destServer.Name + Name = $sConfigName + Type = "Configuration Value" + Status = $null + Notes = $null + DateTime = [DbaDateTime](Get-Date) + } + + if ($ConfigName -and $sConfigName -notin $ConfigName -or $sConfigName -in $ExcludeConfigName) { + continue + } + + $destProp = $destProps | Where-Object ConfigName -eq $sConfigName + if (!$destProp) { + Write-Message -Level Verbose -Message "Configuration $sConfigName ('$displayName') does not exist on the destination instance." + + $copySpConfigStatus.Status = "Skipped" + $copySpConfigStatus.Notes = "Configuration does not exist on destination" + $copySpConfigStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + + continue + } + + if ($Pscmdlet.ShouldProcess($destinstance, "Updating $sConfigName [$displayName]")) { + try { + $destOldConfigValue = $destProp.ConfiguredValue + + if ($sConfiguredValue -ne $destOldConfigValue) { + $result = Set-DbaSpConfigure -SqlInstance $destServer -Name $sConfigName -Value $sConfiguredValue -EnableException -WarningAction SilentlyContinue + if ($result) { + Write-Message -Level Verbose -Message "Updated $($destProp.ConfigName) ($($destProp.DisplayName)) from $destOldConfigValue to $sConfiguredValue." + } + } + if ($requiresRestart -eq $false) { + Write-Message -Level Verbose -Message "Configuration option $sConfigName ($displayName) requires restart." + $copySpConfigStatus.Notes = "Requires restart" + } + $copySpConfigStatus.Status = "Successful" + $copySpConfigStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + } catch { + if ($_.Exception -match 'the same as the') { + $copySpConfigStatus.Status = "Successful" + } else { + $copySpConfigStatus.Status = "Failed" + $copySpConfigStatus.Notes = (Get-ErrorMessage -Record $_) + } + $copySpConfigStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + + Stop-Function -Message "Could not set $($destProp.ConfigName) to $sConfiguredValue." -Target $sConfigName -ErrorRecord $_ + } + } + } + } + } + end { + Test-DbaDeprecation -DeprecatedOn "1.0.0" -EnableException:$false -Alias Copy-SqlSpConfigure + } +} +#ValidationTags#Messaging# +function Copy-DbaSsisCatalog { + <# + .SYNOPSIS + Copy-DbaSsisCatalog migrates Folders, SSIS projects, and environments from one SQL Server to another. + + .DESCRIPTION + By default, all folders, projects, and environments are copied. The -Project parameter can be specified to copy only one project, if desired. + + The parameters get more granular from the Folder level. For example, specifying -Folder will only deploy projects/environments from within that folder. + + .PARAMETER Source + Source SQL Server. You must have sysadmin access and server version must be SQL Server version 2012 or higher. + + .PARAMETER SourceSqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Destination + Destination SQL Server. You must have sysadmin access and the server must be SQL Server 2012 or higher. + + .PARAMETER DestinationSqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Force + If this switch is enabled, the SSIS Catalog will be dropped and recreated on Destination if it already exists. + + .PARAMETER Project + Specifies a source Project name. + + .PARAMETER Folder + Specifies a source folder name. + + .PARAMETER Environment + Specifies an environment to copy. + + .PARAMETER EnableSqlClr + If this switch is enabled and Destination does not have the SQL CLR configuration option enabled, user prompts for enabling it on Destination will be skipped. SQL CLR is required for SSISDB. + + .PARAMETER CreateCatalogPassword + Specifies a secure string to use in creating an SSISDB catalog on Destination. If this is specified, prompts for the password will be skipped. + + .PARAMETER WhatIf + If this switch is enabled, no actions are performed but informational messages will be displayed that explain what would happen if the command were to run. + + .PARAMETER Confirm + If this switch is enabled, you will be prompted for confirmation before executing any operations that change state. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Migration, SSIS + Author: Phil Schwartz (philschwartz.me, @pschwartzzz) + + dbatools PowerShell module (https://dbatools.io, clemaire@gmail.com) + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Copy-DbaSsisCatalog + + .EXAMPLE + PS C:\> Copy-DbaSsisCatalog -Source sqlserver2014a -Destination sqlcluster + + Copies all folders, environments and SSIS Projects from sqlserver2014a to sqlcluster, using Windows credentials to authenticate to both instances. If folders with the same name exist on the destination they will be skipped, but projects will be redeployed. + + .EXAMPLE + PS C:\> Copy-DbaSsisCatalog -Source sqlserver2014a -Destination sqlcluster -Project Archive_Tables -SourceSqlCredential $cred -Force + + Copies a single Project, the Archive_Tables Project, from sqlserver2014a to sqlcluster using SQL credentials to authenticate to sqlserver2014a and Windows credentials to authenticate to sqlcluster. If a Project with the same name exists on sqlcluster, it will be deleted and recreated because -Force was used. + + .EXAMPLE + PS C:\> Copy-DbaSsisCatalog -Source sqlserver2014a -Destination sqlcluster -WhatIf -Force + + Shows what would happen if the command were executed using force. + + .EXAMPLE + PS C:\> $SecurePW = Read-Host "Enter password" -AsSecureString + PS C:\> Copy-DbaSsisCatalog -Source sqlserver2014a -Destination sqlcluster -CreateCatalogPassword $SecurePW + + Deploy entire SSIS catalog to an instance without a destination catalog. User prompts for creating the catalog on Destination will be bypassed. + + #> + [CmdletBinding(DefaultParameterSetName = "Default", SupportsShouldProcess)] + param ( + [parameter(Mandatory)] + [DbaInstanceParameter]$Source, + [parameter(Mandatory)] + [DbaInstanceParameter[]]$Destination, + [PSCredential]$SourceSqlCredential, + [PSCredential]$DestinationSqlCredential, + [String]$Project, + [String]$Folder, + [String]$Environment, + [System.Security.SecureString]$CreateCatalogPassword, + [Switch]$EnableSqlClr, + [Switch]$Force, + [Alias('Silent')] + [switch]$EnableException + ) + <# Developer note: The throw calls must stay in this command #> + begin { + $ISNamespace = "Microsoft.SqlServer.Management.IntegrationServices" + function Get-RemoteIntegrationService { + param ( + [Object]$Computer + ) + $result = Get-DbaService -ComputerName $Computer -Type SSIS + if ($result) { + #Variable marked as unused by PSScriptAnalyzer + #$running = $false + foreach ($service in $result) { + if (!$service.State -eq "Running") { + Write-Message -Level Warning -Message "Service $($service.DisplayName) was found on the destination, but is currently not running." + } else { + Write-Message -Level Verbose -Message "Service $($service.DisplayName) was found running on the destination." + #$running = $true + } + } + } else { + throw "No Integration Services service was found on the destination, please ensure the feature is installed and running." + } + } + function Invoke-ProjectDeployment { + param ( + [String]$Project, + [String]$Folder + ) + $sqlConn = New-Object System.Data.SqlClient.SqlConnection + $sqlConn.ConnectionString = $sourceServer.ConnectionContext.ConnectionString + if ($sqlConn.State -eq "Closed") { + $sqlConn.Open() + } + try { + Write-Message -Level Verbose -Message "Deploying project $Project from folder $Folder." + $cmd = New-Object System.Data.SqlClient.SqlCommand + $cmd.CommandType = "StoredProcedure" + $cmd.connection = $sqlConn + $cmd.CommandText = "SSISDB.Catalog.get_project" + $cmd.Parameters.Add("@folder_name", $Folder) | out-null; + $cmd.Parameters.Add("@project_name", $Project) | out-null; + [byte[]]$results = $cmd.ExecuteScalar(); + if ($null -ne $results) { + $destFolder = $destinationFolders | Where-Object { + $_.Name -eq $Folder + } + $deployedProject = $destFolder.DeployProject($Project, $results) + if ($deployedProject.Status -ne "Success") { + Stop-Function -Message "An error occurred deploying project $Project." -Target $Project -Continue + } + } else { + Stop-Function -Message "Failed deploying $Project from folder $Folder." -Target $Project -Continue + } + } catch { + Stop-Function -Message "Failed to deploy project." -Target $Project -ErrorRecord $_ + } finally { + if ($sqlConn.State -eq "Open") { + $sqlConn.Close() + } + } + } + function New-CatalogFolder { + [CmdletBinding(SupportsShouldProcess)] + param ( + [String]$Folder, + [String]$Description, + [Switch]$Force + ) + if ($Pscmdlet.ShouldProcess($folder, "Creating new Catalog Folder")) { + if ($Force) { + $remove = $destinationFolders | Where-Object { + $_.Name -eq $Folder + } + $envs = $remove.Environments.Name + foreach ($e in $envs) { + $remove.Environments[$e].Drop() + } + $projs = $remove.Projects.Name + foreach ($p in $projs) { + $remove.Projects[$p].Drop() + } + $remove.Drop() + $destinationCatalog.Alter() + $destinationCatalog.Refresh() + } + Write-Message -Level Verbose -Message "Creating folder $Folder." + $destFolder = New-Object "$ISNamespace.CatalogFolder" ($destinationCatalog, $Folder, $Description) + $destFolder.Create() + $destFolder.Alter() + $destFolder.Refresh() + } + } + function New-FolderEnvironment { + [CmdletBinding(SupportsShouldProcess)] + param ( + [String]$Folder, + [String]$Environment, + [Switch]$Force + ) + if ($Pscmdlet.ShouldProcess($folder, "Creating new Environment Folder")) { + $envDestFolder = $destinationFolders | Where-Object { + $_.Name -eq $Folder + } + if ($force) { + $envDestFolder.Environments[$Environment].Drop() + $envDestFolder.Alter() + $envDestFolder.Refresh() + } + $srcEnv = ($sourceFolders | Where-Object { + $_.Name -eq $Folder + }).Environments[$Environment] + $targetEnv = New-Object "$ISNamespace.EnvironmentInfo" ($envDestFolder, $srcEnv.Name, $srcEnv.Description) + foreach ($var in $srcEnv.Variables) { + if ($var.Value.ToString() -eq "") { + $finalValue = "" + } else { + $finalValue = $var.Value + } + $targetEnv.Variables.Add($var.Name, $var.Type, $finalValue, $var.Sensitive, $var.Description) + } + Write-Message -Level Verbose -Message "Creating environment $Environment." + $targetEnv.Create() + $targetEnv.Alter() + $targetEnv.Refresh() + } + } + function New-SSISDBCatalog { + [CmdletBinding(SupportsShouldProcess)] + param ( + [System.Security.SecureString]$SecurePassword + ) + if ($Pscmdlet.ShouldProcess("Creating New SSISDB Catalog")) { + if (!$Password) { + Write-Message -Level Verbose -Message "SSISDB Catalog requires a password." + $pass1 = Read-Host "Enter a password" -AsSecureString + $plainTextPass1 = [Runtime.InteropServices.Marshal]::PtrToStringAuto([Runtime.InteropServices.Marshal]::SecureStringToBSTR($pass1)) + $pass2 = Read-Host "Re-enter password" -AsSecureString + $plainTextPass2 = [Runtime.InteropServices.Marshal]::PtrToStringAuto([Runtime.InteropServices.Marshal]::SecureStringToBSTR($pass2)) + if ($plainTextPass1 -ne $plainTextPass2) { + throw "Validation error, passwords entered do not match." + } + $plainTextPass = $plainTextPass1 + } else { + $plainTextPass = [Runtime.InteropServices.Marshal]::PtrToStringAuto([Runtime.InteropServices.Marshal]::SecureStringToBSTR($Password)) + } + + $catalog = New-Object "$ISNamespace.Catalog" ($destinationSSIS, "SSISDB", $plainTextPass) + $catalog.Create() + $catalog.Refresh() + } + } + + try { + $sourceServer = Connect-SqlInstance -SqlInstance $Source -SqlCredential $SourceSqlCredential -MinimumVersion 11 + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $Source + return + } + + try { + $sourceSSIS = New-Object Microsoft.SqlServer.Management.IntegrationServices.IntegrationServices $sourceServer + } catch { + Stop-Function -Message "There was an error connecting to the source integration services." -Target $sourceServer -ErrorRecord $_ + return + } + + $sourceCatalog = $sourceSSIS.Catalogs | Where-Object { + $_.Name -eq "SSISDB" + } + if (!$sourceCatalog) { + Stop-Function -Message "The source SSISDB catalog on $Source does not exist." + return + } + $sourceFolders = $sourceCatalog.Folders + } + process { + if (Test-FunctionInterrupt) { + return + } + foreach ($destinstance in $Destination) { + try { + $destinationConnection = Connect-SqlInstance -SqlInstance $destinstance -SqlCredential $DestinationSqlCredential -MinimumVersion 1 + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $destinstance -Continue + } + + try { + Get-RemoteIntegrationService -Computer $destinstance.ComputerName + } catch { + Stop-Function -Message "An error occurred when checking the destination for Integration Services. Is Integration Services installed?" -Target $destinstance -ErrorRecord $_ + } + + try { + $destinationSSIS = New-Object Microsoft.SqlServer.Management.IntegrationServices.IntegrationServices $destinationConnection + } catch { + Stop-Function -Message "There was an error connecting to the destination integration services." -Target $destinationCon -ErrorRecord $_ + } + + $destinationCatalog = $destinationSSIS.Catalogs | Where-Object { + $_.Name -eq "SSISDB" + } + $destinationFolders = $destinationCatalog.Folders + + if (!$destinationCatalog) { + if (!$destinationConnection.Configuration.IsSqlClrEnabled.ConfigValue) { + if ($Pscmdlet.ShouldProcess($destinstance, "Enabling SQL CLR configuration option.")) { + if (!$EnableSqlClr) { + $message = "The destination does not have SQL CLR configuration option enabled (required by SSISDB), would you like to enable it?" + $yes = New-Object System.Management.Automation.Host.ChoiceDescription "&Yes", "Enable SQL CLR on $destinstance." + $no = New-Object System.Management.Automation.Host.ChoiceDescription "&No", "Exit." + $options = [System.Management.Automation.Host.ChoiceDescription[]]($yes, $no) + $result = $host.ui.PromptForChoice($null, $message, $options, 0) + switch ($result) { + 0 { + continue + } + 1 { + return + } + } + } + Write-Message -Level Verbose -Message "Enabling SQL CLR configuration option at the destination." + if ($destinationConnection.Configuration.ShowAdvancedOptions.ConfigValue -eq $false) { + $destinationConnection.Configuration.ShowAdvancedOptions.ConfigValue = $true + $changeback = $true + } + + $destinationConnection.Configuration.IsSqlClrEnabled.ConfigValue = $true + + if ($changeback -eq $true) { + $destinationConnection.Configuration.ShowAdvancedOptions.ConfigValue = $false + } + $destinationConnection.Configuration.Alter() + } + } else { + Write-Message -Level Verbose -Message "SQL CLR configuration option is already enabled at the destination." + } + if ($Pscmdlet.ShouldProcess($destinstance, "Create destination SSISDB Catalog")) { + if (!$CreateCatalogPassword) { + $message = "The destination SSISDB catalog does not exist, would you like to create one?" + $yes = New-Object System.Management.Automation.Host.ChoiceDescription "&Yes", "Create an SSISDB catalog on $destinstance." + $no = New-Object System.Management.Automation.Host.ChoiceDescription "&No", "Exit." + $options = [System.Management.Automation.Host.ChoiceDescription[]]($yes, $no) + $result = $host.ui.PromptForChoice($null, $message, $options, 0) + switch ($result) { + 0 { + New-SSISDBCatalog + } + 1 { + return + } + } + } else { + New-SSISDBCatalog -SecurePassword $CreateCatalogPassword + } + + $destinationSSIS.Refresh() + $destinationCatalog = $destinationSSIS.Catalogs | Where-Object { + $_.Name -eq "SSISDB" + } + $destinationFolders = $destinationCatalog.Folders + } else { + throw "The destination SSISDB catalog does not exist." + } + } + if ($folder) { + if ($sourceFolders.Name -contains $folder) { + $srcFolder = $sourceFolders | Where-Object { + $_.Name -eq $folder + } + if ($destinationFolders.Name -contains $folder) { + if (!$force) { + Write-Message -Level Warning -Message "Integration services catalog folder $folder exists at destination. Use -Force to drop and recreate." + } else { + if ($Pscmdlet.ShouldProcess($destinstance, "Dropping folder $folder and recreating")) { + try { + New-CatalogFolder -Folder $srcFolder.Name -Description $srcFolder.Description -Force + } catch { + Stop-Function -Message "Issue dropping folder" -Target $folder -ErrorRecord $_ + } + + } + } + } else { + if ($Pscmdlet.ShouldProcess($destinstance, "Creating folder $folder")) { + try { + New-CatalogFolder -Folder $srcFolder.Name -Description $srcFolder.Description + } catch { + Stop-Function -Message "Issue creating folder" -Target $folder -ErrorRecord $_ + } + } + } + } else { + throw "The source folder provided does not exist in the source Integration Services catalog." + } + } else { + foreach ($srcFolder in $sourceFolders) { + if ($destinationFolders.Name -notcontains $srcFolder.Name) { + if ($Pscmdlet.ShouldProcess($destinstance, "Creating folder $($srcFolder.Name)")) { + try { + New-CatalogFolder -Folder $srcFolder.Name -Description $srcFolder.Description + } catch { + Stop-Function -Message "Issue creating folder" -Target $srcFolder -ErrorRecord $_ -Continue + } + } + } else { + if (!$force) { + Write-Message -Level Warning -Message "Integration services catalog folder $($srcFolder.Name) exists at destination. Use -Force to drop and recreate." + continue + } else { + if ($Pscmdlet.ShouldProcess($destinstance, "Dropping folder $($srcFolder.Name) and recreating")) { + try { + New-CatalogFolder -Folder $srcFolder.Name -Description $srcFolder.Description -Force + } catch { + Stop-Function -Message "Issue dropping folder" -Target $srcFolder -ErrorRecord $_ + } + } + } + } + } + } + + # Refresh folders for project and environment deployment + if ($Pscmdlet.ShouldProcess($destinstance, "Refresh folders for project deployment")) { + try { + $destinationFolders.Alter() + } catch { + # Sometimes it says Alter() doesn't exist + # here to avoid an empty catch + $null = 1 + } + $destinationFolders.Refresh() + } + + if ($folder) { + $sourceFolders = $sourceFolders | Where-Object { + $_.Name -eq $folder + } + if (!$sourceFolders) { + throw "The source folder $folder does not exist in the source Integration Services catalog." + } + } + if ($project) { + $folderDeploy = $sourceFolders | Where-Object { + $_.Projects.Name -eq $project + } + if (!$folderDeploy) { + throw "The project $project cannot be found in the source Integration Services catalog." + } else { + foreach ($f in $folderDeploy) { + if ($Pscmdlet.ShouldProcess($destinstance, "Deploying project $project from folder $($f.Name)")) { + try { + Invoke-ProjectDeployment -Folder $f.Name -Project $project + } catch { + Stop-Function -Message "Issue deploying project" -Target $project -ErrorRecord $_ + } + } + } + } + } else { + foreach ($curFolder in $sourceFolders) { + foreach ($proj in $curFolder.Projects) { + if ($Pscmdlet.ShouldProcess($destinstance, "Deploying project $($proj.Name) from folder $($curFolder.Name)")) { + try { + Invoke-ProjectDeployment -Project $proj.Name -Folder $curFolder.Name + } catch { + Stop-Function -Message "Issue deploying project" -Target $proj -ErrorRecord $_ + } + } + } + } + } + + if ($environment) { + $folderDeploy = $sourceFolders | Where-Object { + $_.Environments.Name -eq $environment + } + if (!$folderDeploy) { + throw "The environment $environment cannot be found in the source Integration Services catalog." + } else { + foreach ($f in $folderDeploy) { + if ($destinationFolders[$f.Name].Environments.Name -notcontains $environment) { + if ($Pscmdlet.ShouldProcess($destinstance, "Deploying environment $environment from folder $($f.Name)")) { + try { + New-FolderEnvironment -Folder $f.Name -Environment $environment + } catch { + Stop-Function -Message "Issue deploying environment" -Target $environment -ErrorRecord $_ + } + } + } else { + if (!$force) { + Write-Message -Level Warning -Message "Integration services catalog environment $environment exists in folder $($f.Name) at destination. Use -Force to drop and recreate." + } else { + If ($Pscmdlet.ShouldProcess($destinstance, "Dropping existing environment $environment and deploying environment $environment from folder $($f.Name)")) { + try { + New-FolderEnvironment -Folder $f.Name -Environment $environment -Force + } catch { + Stop-Function -Message "Issue dropping existing environment" -Target $environment -ErrorRecord $_ + } + } + } + } + } + } + } else { + foreach ($curFolder in $sourceFolders) { + foreach ($env in $curFolder.Environments) { + if ($destinationFolders[$curFolder.Name].Environments.Name -notcontains $env.Name) { + if ($Pscmdlet.ShouldProcess($destinstance, "Deploying environment $($env.Name) from folder $($curFolder.Name)")) { + try { + New-FolderEnvironment -Environment $env.Name -Folder $curFolder.Name + } catch { + Stop-Function -Message "Issue deploying environment" -Target $env -ErrorRecord $_ + } + } + } else { + if (!$force) { + Write-Message -Level Warning -Message "Integration services catalog environment $($env.Name) exists in folder $($curFolder.Name) at destination. Use -Force to drop and recreate." + continue + } else { + if ($Pscmdlet.ShouldProcess($destinstance, "Deploying environment $($env.Name) from folder $($curFolder.Name)")) { + try { + New-FolderEnvironment -Environment $env.Name -Folder $curFolder.Name -Force + } catch { + Stop-Function -Message "Issue deploying environment" -Target $env -ErrorRecord $_ + } + } + } + } + } + } + } + } + } + end { + Test-DbaDeprecation -DeprecatedOn "1.0.0" -EnableException:$false -Alias Copy-SqlSsisCatalog + } +} +function Copy-DbaSysDbUserObject { + <# + .SYNOPSIS + Imports all user objects found in source SQL Server's master, msdb and model databases to the destination. + + .DESCRIPTION + Imports all user objects found in source SQL Server's master, msdb and model databases to the destination. This is useful because many DBAs store backup/maintenance procs/tables/triggers/etc (among other things) in master or msdb. + + It is also useful for migrating objects within the model database. + + .PARAMETER Source + Source SQL Server. You must have sysadmin access and server version must be SQL Server version 2000 or higher. + + .PARAMETER SourceSqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Destination + Destination SQL Server. You must have sysadmin access and the server must be SQL Server 2000 or higher. + + .PARAMETER DestinationSqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Classic + Perform the migration the old way + + .PARAMETER Force + Drop destination objects first. Has no effect if you use Classic. This doesn't work really well, honestly. + + .PARAMETER WhatIf + If this switch is enabled, no actions are performed but informational messages will be displayed that explain what would happen if the command were to run. + + .PARAMETER Confirm + If this switch is enabled, you will be prompted for confirmation before executing any operations that change state. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Migration, SystemDatabase, UserObject + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Copy-DbaSysDbUserObject + + .EXAMPLE + PS C:\> Copy-DbaSysDbUserObject -Source $sourceServer -Destination $destserver + + Copies user objects from source to destination + + #> + [CmdletBinding(SupportsShouldProcess)] + param ( + [Parameter(Mandatory)] + [ValidateNotNullOrEmpty()] + [DbaInstanceParameter]$Source, + [PSCredential]$SourceSqlCredential, + [Parameter(Mandatory)] + [ValidateNotNullOrEmpty()] + [DbaInstanceParameter[]]$Destination, + [PSCredential]$DestinationSqlCredential, + [switch]$Force, + [switch]$Classic, + [Alias('Silent')] + [switch]$EnableException + ) + begin { + function get-sqltypename ($type) { + switch ($type) { + "VIEW" { "view" } + "SQL_TABLE_VALUED_FUNCTION" { "User table valued fsunction" } + "DEFAULT_CONSTRAINT" { "User default constraint" } + "SQL_STORED_PROCEDURE" { "User stored procedure" } + "RULE" { "User rule" } + "SQL_INLINE_TABLE_VALUED_FUNCTION" { "User inline table valued function" } + "SQL_TRIGGER" { "User server trigger" } + "SQL_SCALAR_FUNCTION" { "User scalar function" } + default { $type } + } + } + } + process { + try { + $sourceServer = Connect-SqlInstance -SqlInstance $Source -SqlCredential $SourceSqlCredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $Source + return + } + + if (!(Test-SqlSa -SqlInstance $sourceServer -SqlCredential $SourceSqlCredential)) { + Stop-Function -Message "Not a sysadmin on $source. Quitting." + return + } + + if (Test-FunctionInterrupt) { return } + foreach ($destinstance in $Destination) { + try { + $destServer = Connect-SqlInstance -SqlInstance $destinstance -SqlCredential $DestinationSqlCredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $destinstance -Continue + } + + if (!(Test-SqlSa -SqlInstance $destServer -SqlCredential $DestinationSqlCredential)) { + Stop-Function -Message "Not a sysadmin on $destinstance" -Continue + } + + $systemDbs = "master", "model", "msdb" + + if (-not $Classic) { + foreach ($systemDb in $systemDbs) { + $smodb = $sourceServer.databases[$systemDb] + $destdb = $destserver.databases[$systemDb] + + $tables = $smodb.Tables | Where-Object IsSystemObject -ne $true + $schemas = $smodb.Schemas | Where-Object IsSystemObject -ne $true + + foreach ($schema in $schemas) { + $copyobject = [pscustomobject]@{ + SourceServer = $sourceServer.Name + DestinationServer = $destServer.Name + Name = $schema + Type = "User schema in $systemDb" + Status = $null + Notes = $null + DateTime = [Sqlcollaborative.Dbatools.Utility.DbaDateTime](Get-Date) + } + + $destschema = $destdb.Schemas | Where-Object Name -eq $schema.Name + $schmadoit = $true + + if ($destschema) { + if (-not $force) { + $copyobject.Status = "Skipped" + $copyobject.Notes = "Already exists on destination" + $schmadoit = $false + } else { + if ($PSCmdlet.ShouldProcess($destServer, "Dropping schema $schema in $systemDb")) { + try { + Write-Message -Level Verbose -Message "Force specified. Dropping $schema in $destdb on $destinstance" + $destschema.Drop() + } catch { + $schmadoit = $false + $copyobject.Status = "Failed" + $copyobject.Notes = $_.Exception.InnerException.InnerException.InnerException.Message + } + } + } + } + + if ($schmadoit) { + $transfer = New-Object Microsoft.SqlServer.Management.Smo.Transfer $smodb + $null = $transfer.CopyAllObjects = $false + $null = $transfer.Options.WithDependencies = $true + $null = $transfer.ObjectList.Add($schema) + if ($PSCmdlet.ShouldProcess($destServer, "Attempting to add schema $($schema.Name) to $systemDb")) { + try { + $sql = $transfer.ScriptTransfer() + Write-Message -Level Debug -Message "$sql" + $null = $destServer.Query($sql, $systemDb) + $copyobject.Status = "Successful" + $copyobject.Notes = "May have also created dependencies" + } catch { + $copyobject.Status = "Failed" + $copyobject.Notes = (Get-ErrorMessage -Record $_) + } + } + } + + $copyobject | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + } + + foreach ($table in $tables) { + $copyobject = [pscustomobject]@{ + SourceServer = $sourceServer.Name + DestinationServer = $destServer.Name + Name = $table + Type = "User table in $systemDb" + Status = $null + Notes = $null + DateTime = [Sqlcollaborative.Dbatools.Utility.DbaDateTime](Get-Date) + } + + $desttable = $destdb.Tables.Item($table.Name, $table.Schema) + $doit = $true + + if ($desttable) { + if (-not $force) { + $copyobject.Status = "Skipped" + $copyobject.Notes = "Already exists on destination" + $doit = $false + } else { + if ($PSCmdlet.ShouldProcess($destServer, "Dropping table $table in $systemDb")) { + try { + Write-Message -Level Verbose -Message "Force specified. Dropping $table in $destdb on $destinstance" + $desttable.Drop() + } catch { + $doit = $false + $copyobject.Status = "Failed" + $copyobject.Notes = $_.Exception.InnerException.InnerException.InnerException.Message + } + } + } + } + + if ($doit) { + $transfer = New-Object Microsoft.SqlServer.Management.Smo.Transfer $smodb + $null = $transfer.CopyAllObjects = $false + $null = $transfer.Options.WithDependencies = $true + $null = $transfer.ObjectList.Add($table) + if ($PSCmdlet.ShouldProcess($destServer, "Attempting to add table $table to $systemDb")) { + try { + $sql = $transfer.ScriptTransfer() + Write-Message -Level Debug -Message "$sql" + $null = $destServer.Query($sql, $systemDb) + $copyobject.Status = "Successful" + $copyobject.Notes = "May have also created dependencies" + } catch { + $copyobject.Status = "Failed" + $copyobject.Notes = (Get-ErrorMessage -Record $_) + } + } + } + $copyobject | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + } + + $userobjects = Get-DbaModule -SqlInstance $sourceserver -Database $systemDb -ExcludeSystemObjects | Sort-Object Type + Write-Message -Level Verbose -Message "Copying from $systemDb" + foreach ($userobject in $userobjects) { + + $name = "[$($userobject.SchemaName)].[$($userobject.Name)]" + $db = $userobject.Database + $type = get-sqltypename $userobject.Type + $sql = $userobject.Definition + $schema = $userobject.SchemaName + + $copyobject = [pscustomobject]@{ + SourceServer = $sourceServer.Name + DestinationServer = $destServer.Name + Name = $name + Type = "$type in $systemDb" + Status = $null + Notes = $null + DateTime = [Sqlcollaborative.Dbatools.Utility.DbaDateTime](Get-Date) + } + Write-Message -Level Debug -Message $sql + try { + Write-Message -Level Verbose -Message "Searching for $name in $db on $destinstance" + $result = Get-DbaModule -SqlInstance $destServer -ExcludeSystemObjects -Database $db | + Where-Object { $psitem.Name -eq $userobject.Name -and $psitem.Type -eq $userobject.Type } + if ($result) { + Write-Message -Level Verbose -Message "Found $name in $db on $destinstance" + if (-not $Force) { + $copyobject.Status = "Skipped" + $copyobject.Notes = "Already exists on destination" + } else { + $smobject = switch ($userobject.Type) { + "VIEW" { $smodb.Views.Item($userobject.Name, $userobject.SchemaName) } + "SQL_STORED_PROCEDURE" { $smodb.StoredProcedures.Item($userobject.Name, $userobject.SchemaName) } + "RULE" { $smodb.Rules.Item($userobject.Name, $userobject.SchemaName) } + "SQL_TRIGGER" { $smodb.Triggers.Item($userobject.Name, $userobject.SchemaName) } + "SQL_TABLE_VALUED_FUNCTION" { $smodb.UserDefinedFunctions.Item($name) } + "SQL_INLINE_TABLE_VALUED_FUNCTION" { $smodb.UserDefinedFunctions.Item($name) } + "SQL_SCALAR_FUNCTION" { $smodb.UserDefinedFunctions.Item($name) } + } + + if ($smobject) { + Write-Message -Level Verbose -Message "Force specified. Dropping $smobject on $destdb on $destinstance using SMO" + $transfer = New-Object Microsoft.SqlServer.Management.Smo.Transfer $smodb + $null = $transfer.CopyAllObjects = $false + $null = $transfer.Options.WithDependencies = $true + $null = $transfer.ObjectList.Add($smobject) + $null = $transfer.Options.ScriptDrops = $true + $dropsql = $transfer.ScriptTransfer() + Write-Message -Level Debug -Message "$dropsql" + if ($PSCmdlet.ShouldProcess($destServer, "Attempting to drop $type $name from $systemDb")) { + $null = $destdb.Query("$dropsql") + } + } else { + if ($PSCmdlet.ShouldProcess($destServer, "Attempting to drop $type $name from $systemDb using T-SQL")) { + $null = $destdb.Query("DROP FUNCTION $($userobject.name)") + } + } + if ($PSCmdlet.ShouldProcess($destServer, "Attempting to add $type $name to $systemDb")) { + $null = $destdb.Query("$sql") + $copyobject.Status = "Successful" + } + } + } else { + if ($PSCmdlet.ShouldProcess($destServer, "Attempting to add $type $name to $systemDb")) { + $null = $destdb.Query("$sql") + $copyobject.Status = "Successful" + } + } + } catch { + try { + $smobject = switch ($userobject.Type) { + "VIEW" { $smodb.Views.Item($userobject.Name, $userobject.SchemaName) } + "SQL_STORED_PROCEDURE" { $smodb.StoredProcedures.Item($userobject.Name, $userobject.SchemaName) } + "RULE" { $smodb.Rules.Item($userobject.Name, $userobject.SchemaName) } + "SQL_TRIGGER" { $smodb.Triggers.Item($userobject.Name, $userobject.SchemaName) } + } + if ($smobject) { + $transfer = New-Object Microsoft.SqlServer.Management.Smo.Transfer $smodb + $null = $transfer.CopyAllObjects = $false + $null = $transfer.Options.WithDependencies = $true + $null = $transfer.ObjectList.Add($smobject) + $sql = $transfer.ScriptTransfer() + Write-Message -Level Debug -Message "$sql" + Write-Message -Level Verbose -Message "Adding $smoobject on $destdb on $destinstance" + if ($PSCmdlet.ShouldProcess($destServer, "Attempting to add $type $name to $systemDb")) { + $null = $destdb.Query("$sql") + } + $copyobject.Status = "Successful" + $copyobject.Notes = "May have also installed dependencies" + } else { + $copyobject.Status = "Failed" + $copyobject.Notes = (Get-ErrorMessage -Record $_) + } + } catch { + $copyobject.Status = "Failed" + $copyobject.Notes = (Get-ErrorMessage -Record $_) + } + } + $copyobject | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + } + } + } else { + foreach ($systemDb in $systemDbs) { + $sysdb = $sourceServer.databases[$systemDb] + $transfer = New-Object Microsoft.SqlServer.Management.Smo.Transfer $sysdb + $transfer.CopyAllObjects = $false + $transfer.CopyAllDatabaseTriggers = $true + $transfer.CopyAllDefaults = $true + $transfer.CopyAllRoles = $true + $transfer.CopyAllRules = $true + $transfer.CopyAllSchemas = $true + $transfer.CopyAllSequences = $true + $transfer.CopyAllSqlAssemblies = $true + $transfer.CopyAllSynonyms = $true + $transfer.CopyAllTables = $true + $transfer.CopyAllViews = $true + $transfer.CopyAllStoredProcedures = $true + $transfer.CopyAllUserDefinedAggregates = $true + $transfer.CopyAllUserDefinedDataTypes = $true + $transfer.CopyAllUserDefinedTableTypes = $true + $transfer.CopyAllUserDefinedTypes = $true + $transfer.CopyAllUserDefinedFunctions = $true + $transfer.CopyAllUsers = $true + $transfer.PreserveDbo = $true + $transfer.Options.AllowSystemObjects = $false + $transfer.Options.ContinueScriptingOnError = $true + $transfer.Options.IncludeDatabaseRoleMemberships = $true + $transfer.Options.Indexes = $true + $transfer.Options.Permissions = $true + $transfer.Options.WithDependencies = $false + + Write-Message -Level Output -Message "Copying from $systemDb." + try { + $sqlQueries = $transfer.ScriptTransfer() + + foreach ($sql in $sqlQueries) { + Write-Message -Level Debug -Message "$sql" + if ($PSCmdlet.ShouldProcess($destServer, $sql)) { + try { + $destServer.Query($sql, $systemDb) + } catch { + # Don't care - long story having to do with duplicate stuff + # here to avoid an empty catch + $null = 1 + } + } + } + } catch { + # Don't care - long story having to do with duplicate stuff + # here to avoid an empty catch + $null = 1 + } + } + } + } + } + end { + Test-DbaDeprecation -DeprecatedOn "1.0.0" -EnableException:$false -Alias Copy-SqlSysDbUserObjects + } +} +function Copy-DbaXESession { + <# + .SYNOPSIS + Migrates SQL Extended Event Sessions except the two default sessions, AlwaysOn_health and system_health. + + .DESCRIPTION + Migrates SQL Extended Event Sessions except the two default sessions, AlwaysOn_health and system_health. + + By default, all non-system Extended Events are migrated. + + .PARAMETER Source + Source SQL Server. You must have sysadmin access and server version must be SQL Server version 2000 or higher. + + .PARAMETER SourceSqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Destination + Destination SQL Server. You must have sysadmin access and the server must be SQL Server 2000 or higher. + + .PARAMETER DestinationSqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER XeSession + The Extended Event Session(s) to process. This list is auto-populated from the server. If unspecified, all Extended Event Sessions will be processed. + + .PARAMETER ExcludeXeSession + The Extended Event Session(s) to exclude. This list is auto-populated from the server. + + .PARAMETER WhatIf + If this switch is enabled, no actions are performed but informational messages will be displayed that explain what would happen if the command were to run. + + .PARAMETER Confirm + If this switch is enabled, you will be prompted for confirmation before executing any operations that change state. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .PARAMETER Force + If this switch is enabled, existing Extended Events sessions on Destination with matching names from Source will be dropped. + + .NOTES + Tags: Migration, ExtendedEvent, XEvent + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + Requires: sysadmin access on SQL Servers + + .LINK + https://dbatools.io/Copy-DbaXESession + + .EXAMPLE + PS C:\> Copy-DbaXESession -Source sqlserver2014a -Destination sqlcluster + + Copies all Extended Event sessions from sqlserver2014a to sqlcluster using Windows credentials. + + .EXAMPLE + PS C:\> Copy-DbaXESession -Source sqlserver2014a -Destination sqlcluster -SourceSqlCredential $cred + + Copies all Extended Event sessions from sqlserver2014a to sqlcluster using SQL credentials for sqlserver2014a and Windows credentials for sqlcluster. + + .EXAMPLE + PS C:\> Copy-DbaXESession -Source sqlserver2014a -Destination sqlcluster -WhatIf + + Shows what would happen if the command were executed. + + .EXAMPLE + PS C:\> Copy-DbaXESession -Source sqlserver2014a -Destination sqlcluster -XeSession CheckQueries, MonitorUserDefinedException + + Copies only the Extended Events named CheckQueries and MonitorUserDefinedException from sqlserver2014a to sqlcluster. + + #> + [CmdletBinding(DefaultParameterSetName = "Default", SupportsShouldProcess)] + param ( + [parameter(Mandatory)] + [DbaInstanceParameter]$Source, + [parameter(Mandatory)] + [DbaInstanceParameter[]]$Destination, + [PSCredential] + $SourceSqlCredential, + [PSCredential] + $DestinationSqlCredential, + [object[]]$XeSession, + [object[]]$ExcludeXeSession, + [switch]$Force, + [Alias('Silent')] + [switch]$EnableException + ) + begin { + Test-DbaDeprecation -DeprecatedOn "1.0.0" -Alias Copy-DbaExtendedEvent + try { + $sourceServer = Connect-SqlInstance -SqlInstance $Source -SqlCredential $SourceSqlCredential -MinimumVersion 11 + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $Source + return + } + $sourceSqlConn = $sourceServer.ConnectionContext.SqlConnectionObject + $sourceSqlStoreConnection = New-Object Microsoft.SqlServer.Management.Sdk.Sfc.SqlStoreConnection $sourceSqlConn + $sourceStore = New-Object Microsoft.SqlServer.Management.XEvent.XEStore $sourceSqlStoreConnection + $storeSessions = $sourceStore.Sessions | Where-Object { $_.Name -notin 'AlwaysOn_health', 'system_health' } + if ($XeSession) { + $storeSessions = $storeSessions | Where-Object Name -In $XeSession + } + if ($ExcludeXeSession) { + $storeSessions = $storeSessions | Where-Object Name -NotIn $ExcludeXeSession + } + } + process { + if (Test-FunctionInterrupt) { return } + foreach ($destinstance in $Destination) { + try { + $destServer = Connect-SqlInstance -SqlInstance $destinstance -SqlCredential $DestinationSqlCredential -MinimumVersion 11 + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $destinstance -Continue + } + + $destSqlConn = $destServer.ConnectionContext.SqlConnectionObject + $destSqlStoreConnection = New-Object Microsoft.SqlServer.Management.Sdk.Sfc.SqlStoreConnection $destSqlConn + $destStore = New-Object Microsoft.SqlServer.Management.XEvent.XEStore $destSqlStoreConnection + + Write-Message -Level Verbose -Message "Migrating sessions." + foreach ($session in $storeSessions) { + $sessionName = $session.Name + + $copyXeSessionStatus = [pscustomobject]@{ + SourceServer = $sourceServer.Name + DestinationServer = $destServer.Name + Name = $sessionName + Type = "Extended Event" + Status = $null + Notes = $null + DateTime = [DbaDateTime](Get-Date) + } + + if ($null -ne $destStore.Sessions[$sessionName]) { + if ($force -eq $false) { + if ($Pscmdlet.ShouldProcess($destinstance, "Extended Event Session '$sessionName' was skipped because it already exists on $destinstance.")) { + $copyXeSessionStatus.Status = "Skipped" + $copyXeSessionStatus.Notes = "Already exists on destination" + $copyXeSessionStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + + Write-Message -Level Verbose -Message "Extended Event Session '$sessionName' was skipped because it already exists on $destinstance." + Write-Message -Level Verbose -Message "Use -Force to drop and recreate." + } + continue + } else { + if ($Pscmdlet.ShouldProcess($destinstance, "Attempting to drop $sessionName")) { + Write-Message -Level Verbose -Message "Extended Event Session '$sessionName' exists on $destinstance." + Write-Message -Level Verbose -Message "Force specified. Dropping $sessionName." + + try { + $destStore.Sessions[$sessionName].Drop() + } catch { + $copyXeSessionStatus.Status = "Failed" + $copyXeSessionStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + + Stop-Function -Message "Unable to drop session. Moving on." -Target $sessionName -ErrorRecord $_ -Continue + } + } + } + } + + if ($Pscmdlet.ShouldProcess($destinstance, "Migrating session $sessionName")) { + try { + $sql = $session.ScriptCreate().GetScript() | Out-String + + Write-Message -Level Debug -Message $sql + Write-Message -Level Verbose -Message "Migrating session $sessionName." + $null = $destServer.Query($sql) + + if ($session.IsRunning -eq $true) { + $destStore.Sessions.Refresh() + $destStore.Sessions[$sessionName].Start() + } + + $copyXeSessionStatus.Status = "Successful" + $copyXeSessionStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + } catch { + $copyXeSessionStatus.Status = "Failed" + $copyXeSessionStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + + Stop-Function -Message "Unable to create session." -Target $sessionName -ErrorRecord $_ + } + } + } + } + } + end { + Test-DbaDeprecation -DeprecatedOn "1.0.0" -EnableException:$false -Alias Copy-SqlExtendedEvent + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function Copy-DbaXESessionTemplate { + <# + .SYNOPSIS + Copies non-Microsoft templates from the dbatools template repository (\bin\xetemplates\) to $home\Documents\SQL Server Management Studio\Templates\XEventTemplates. + + .DESCRIPTION + Copies non-Microsoft templates from the dbatools template repository (\bin\xetemplates\) to $home\Documents\SQL Server Management Studio\Templates\XEventTemplates. + + Useful for when you want to use the SSMS GUI. + + .PARAMETER Path + The path to the template directory. Defaults to the dbatools template repository (\bin\xetemplates\). + + .PARAMETER Destination + Path to the Destination directory, defaults to $home\Documents\SQL Server Management Studio\Templates\XEventTemplates. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: ExtendedEvent, XE, XEvent + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Copy-DbaXESessionTemplate + + .EXAMPLE + PS C:\> Copy-DbaXESessionTemplate + + Copies non-Microsoft templates from the dbatools template repository (\bin\xetemplates\) to $home\Documents\SQL Server Management Studio\Templates\XEventTemplates. + + .EXAMPLE + PS C:\> Copy-DbaXESessionTemplate -Path C:\temp\xetemplates + + Copies your templates from C:\temp\xetemplates to $home\Documents\SQL Server Management Studio\Templates\XEventTemplates. + + #> + [CmdletBinding()] + param ( + [string[]]$Path = "$script:PSModuleRoot\bin\xetemplates", + [string]$Destination = "$home\Documents\SQL Server Management Studio\Templates\XEventTemplates", + [switch]$EnableException + ) + process { + if (Test-FunctionInterrupt) { return } + foreach ($destinstance in $Destination) { + if (-not (Test-Path -Path $destinstance)) { + try { + $null = New-Item -ItemType Directory -Path $destinstance -ErrorAction Stop + } catch { + Stop-Function -Message "Failure" -ErrorRecord $_ -Target $destinstance + } + } + try { + $files = (Get-DbaXESessionTemplate -Path $Path | Where-Object Source -ne Microsoft).Path + foreach ($file in $files) { + Write-Message -Level Output -Message "Copying $($file.Name) to $destinstance." + Copy-Item -Path $file -Destination $destinstance -ErrorAction Stop + } + } catch { + Stop-Function -Message "Failure" -ErrorRecord $_ -Target $path + } + } + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function Disable-DbaAgHadr { + <# + .SYNOPSIS + Disables the Hadr service setting on the specified SQL Server. + + .DESCRIPTION + In order to build an AG a cluster has to be built and then the Hadr enabled for the SQL Server + service. This function disables that feature for the SQL Server service. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. + + .PARAMETER Credential + Credential object used to connect to the Windows server as a different user + + .PARAMETER WhatIf + Shows what would happen if the command were to run. No actions are actually performed. + + .PARAMETER Confirm + Prompts you for confirmation before executing any changing operations within the command. + + .PARAMETER Force + Will restart SQL Server and SQL Server Agent service to apply the change. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Hadr, AG, AvailabilityGroup + Author: Shawn Melton (@wsmelton), http://wsmelton.github.io + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Disable-DbaAgHadr + + .EXAMPLE + PS C:\> Disable-DbaAgHadr -SqlInstance sql2016 + + Sets Hadr service to disabled for the instance sql2016 but changes will not be applied until the next time the server restarts. + + .EXAMPLE + PS C:\> Disable-DbaAgHadr -SqlInstance sql2016 -Force + + Sets Hadr service to disabled for the instance sql2016, and restart the service to apply the change. + + .EXAMPLE + PS C:\> Disable-DbaAgHadr -SqlInstance sql2012\dev1 -Force + + Sets Hadr service to disabled for the instance dev1 on sq2012, and restart the service to apply the change. + + #> + [CmdletBinding(SupportsShouldProcess, ConfirmImpact = "High")] + param ( + [parameter(Mandatory, ValueFromPipeline)] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$Credential, + [switch]$Force, + [switch]$EnableException + ) + process { + foreach ($instance in $SqlInstance) { + $computer = $computerFullName = $instance.ComputerName + $instanceName = $instance.InstanceName + if (-not (Test-ElevationRequirement -ComputerName $instance)) { + return + } + $noChange = $false + + <# + #Variable marked as unused by PSScriptAnalyzer + switch ($instance.InstanceName) { + 'MSSQLSERVER' { $agentName = 'SQLSERVERAGENT' } + default { $agentName = "SQLAgent`$$instanceName" } + } + #> + + try { + Write-Message -Level Verbose -Message "Checking current Hadr setting for $computer" + $currentState = Get-WmiHadr -SqlInstance $instance -Credential $Credential + } catch { + Stop-Function -Message "Failure to pull current state of Hadr setting on $computer" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + $isHadrEnabled = $currentState.IsHadrEnabled + Write-Message -Level InternalComment -Message "$instance Hadr current value: $isHadrEnabled" + + # hadr results from sql wmi can be iffy, skip the check + <# + if (-not $isHadrEnabled) { + Write-Message -Level Warning -Message "Hadr is already disabled for instance: $($instance.FullName)" + $noChange = $true + continue + } + #> + + $scriptblock = { + $instance = $args[0] + $sqlService = $wmi.Services | Where-Object DisplayName -eq "SQL Server ($instance)" + $sqlService.ChangeHadrServiceSetting(0) + } + + if ($noChange -eq $false) { + if ($PSCmdlet.ShouldProcess($instance, "Changing Hadr from $isHadrEnabled to 0 for $instance")) { + try { + Invoke-ManagedComputerCommand -ComputerName $computerFullName -Credential $Credential -ScriptBlock $scriptblock -ArgumentList $instancename + } catch { + Stop-Function -Continue -Message "Failure on $($instance.FullName) | This may be because AlwaysOn Availability Groups feature requires the x86(non-WOW) or x64 Enterprise Edition of SQL Server 2012 (or later version) running on Windows Server 2008 (or later version) with WSFC hotfix KB 2494036 installed." + } + } + if (Test-Bound 'Force') { + if ($PSCmdlet.ShouldProcess($instance, "Force provided, restarting Engine and Agent service for $instance on $computerFullName")) { + try { + $null = Stop-DbaService -ComputerName $computerFullName -InstanceName $instanceName -Type Agent, Engine + $null = Start-DbaService -ComputerName $computerFullName -InstanceName $instanceName -Type Agent, Engine + } catch { + Stop-Function -Message "Issue restarting $instance" -Target $instance -Continue + } + } + } + $newState = Get-WmiHadr -SqlInstance $instance -Credential $Credential + + if (Test-Bound -Not -ParameterName Force) { + Write-Message -Level Warning -Message "You must restart the SQL Server for it to take effect." + } + + [PSCustomObject]@{ + ComputerName = $newState.ComputerName + InstanceName = $newState.InstanceName + SqlInstance = $newState.SqlInstance + IsHadrEnabled = $false + } + } + } + } +} +#ValidationTags#CodeStyle,Messaging,FlowControl,Pipeline# +function Disable-DbaFilestream { + <# + .SYNOPSIS + Sets the status of FileStream on specified SQL Server instances both at the server level and the instance level + + .DESCRIPTION + Connects to the specified SQL Server instances, and sets the status of the FileStream feature to the required value + + To perform the action, the SQL Server instance must be restarted. By default we will prompt for confirmation for this action, this can be overridden with the -Force switch + + .PARAMETER SqlInstance + The target SQL Server instance or instances. Defaults to localhost. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Credential + Login to the target server using alternative credentials. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .PARAMETER Force + Restart SQL Instance after changes. Use this parameter with care as it overrides whatif. + + .PARAMETER WhatIf + Shows what would happen if the command runs. The command is not run unless Force is specified. + + .PARAMETER Confirm + Prompts you for confirmation before running the command. + + .NOTES + Tags: Filestream + Author: Stuart Moore ( @napalmgram ) | Chrissy LeMaire ( @cl ) + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .EXAMPLE + PS C:\> Disable-DbaFilestream -SqlInstance server1\instance2 + + Prompts for confirmation. Disables filestream on the service and instance levels. + + .EXAMPLE + PS C:\> Disable-DbaFilestream -SqlInstance server1\instance2 -Confirm:$false + + Does not prompt for confirmation. Disables filestream on the service and instance levels. + + .EXAMPLE + PS C:\> Get-DbaFilestream -SqlInstance server1\instance2, server5\instance5, prod\hr | Where-Object InstanceAccessLevel -gt 0 | Disable-DbaFilestream -Force + + Using this pipeline you can scan a range of SQL instances and disable filestream on only those on which it's enabled. + + #> + [CmdletBinding(SupportsShouldProcess, ConfirmImpact = "High")] + param ( + [Parameter(Mandatory, ValueFromPipelineByPropertyName)] + [DbaInstance[]]$SqlInstance, + [Parameter(ValueFromPipelineByPropertyName)] + [PSCredential]$SqlCredential, + [Parameter(ValueFromPipelineByPropertyName)] + [PSCredential]$Credential, + [switch]$Force, + [switch]$EnableException + ) + begin { + $FileStreamLevel = $level = 0 + + $OutputLookup = @{ + 0 = 'Disabled' + 1 = 'FileStream enabled for T-Sql access' + 2 = 'FileStream enabled for T-Sql and IO streaming access' + 3 = 'FileStream enabled for T-Sql, IO streaming, and remote clients' + } + } + process { + foreach ($instance in $SqlInstance) { + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential + } catch { + Stop-Function -Message "Failure connecting to $computer" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + # Instance level + $filestreamstate = [int]$server.Configuration.FilestreamAccessLevel.RunningValue + + if ($Force -or $PSCmdlet.ShouldProcess($instance, "Changing from '$($OutputLookup[$filestreamstate])' to '$($OutputLookup[$level])' at the instance level")) { + try { + $null = Set-DbaSpConfigure -SqlInstance $server -Name FilestreamAccessLevel -Value $level -EnableException + } catch { + Stop-Function -Message "Failure" -ErrorRecord $_ -Continue + } + + + # Server level + if ($server.IsClustered) { + $nodes = Get-DbaWsfcNode -ComputerName $instance -Credential $Credential + foreach ($node in $nodes.Name) { + $result = Set-FileSystemSetting -Instance $node -Credential $Credential -FilestreamLevel $FileStreamLevel + } + } else { + $result = Set-FileSystemSetting -Instance $instance -Credential $Credential -FilestreamLevel $FileStreamLevel + } + + if ($Force) { + #$restart replaced with $null as it was identified as a unused variable + $null = Restart-DbaService -ComputerName $instance.ComputerName -InstanceName $server.ServiceName -Type Engine -Force + } + + Get-DbaFilestream -SqlInstance $instance -SqlCredential $SqlCredential -Credential $Credential + + if ($filestreamstate -ne $level -and -not $Force) { + Write-Message -Level Warning -Message "[$instance] $result" + } + } + } + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# + +function Disable-DbaForceNetworkEncryption { + <# + .SYNOPSIS + Disables Force Encryption for a SQL Server instance + + .DESCRIPTION + Disables Force Encryption for a SQL Server instance. Note that this requires access to the Windows Server, not the SQL instance itself. + + This setting is found in Configuration Manager. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. Defaults to localhost. + + .PARAMETER Credential + Allows you to login to the computer (not SQL Server instance) using alternative Windows credentials. + + .PARAMETER WhatIf + If this switch is enabled, no actions are performed but informational messages will be displayed that explain what would happen if the command were to run. + + .PARAMETER Confirm + If this switch is enabled, you will be prompted for confirmation before executing any operations that change state. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Certificate + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .EXAMPLE + PS C:\> Disable-DbaForceNetworkEncryption + + Disables Force Encryption on the default (MSSQLSERVER) instance on localhost - requires (and checks for) RunAs admin. + + .EXAMPLE + PS C:\> Disable-DbaForceNetworkEncryption -SqlInstance sql01\SQL2008R2SP2 + + Disables Force Network Encryption for the SQL2008R2SP2 on sql01. Uses Windows Credentials to both login and modify the registry. + + .EXAMPLE + PS C:\> Disable-DbaForceNetworkEncryption -SqlInstance sql01\SQL2008R2SP2 -WhatIf + + Shows what would happen if the command were executed. + + #> + [CmdletBinding(SupportsShouldProcess, ConfirmImpact = "Low")] + param ( + [Parameter(ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer", "ComputerName")] + [DbaInstanceParameter[]]$SqlInstance = $env:COMPUTERNAME, + [PSCredential]$Credential, + [Alias('Silent')] + [switch]$EnableException + ) + process { + + foreach ($instance in $sqlinstance) { + Write-Message -Level VeryVerbose -Message "Processing $instance." -Target $instance + $null = Test-ElevationRequirement -ComputerName $instance -Continue + + Write-Message -Level Verbose -Message "Resolving hostname." + $resolved = $null + $resolved = Resolve-DbaNetworkName -ComputerName $instance -Turbo + + if ($null -eq $resolved) { + Stop-Function -Message "Can't resolve $instance." -Target $instance -Continue -Category InvalidArgument + } + + try { + $sqlwmi = Invoke-ManagedComputerCommand -ComputerName $resolved.FullComputerName -ScriptBlock { $wmi.Services } -Credential $Credential -ErrorAction Stop | Where-Object DisplayName -eq "SQL Server ($($instance.InstanceName))" + } catch { + Stop-Function -Message "Failed to access $instance." -Target $instance -Continue -ErrorRecord $_ + } + + $regroot = ($sqlwmi.AdvancedProperties | Where-Object Name -eq REGROOT).Value + $vsname = ($sqlwmi.AdvancedProperties | Where-Object Name -eq VSNAME).Value + try { + $instancename = $sqlwmi.DisplayName.Replace('SQL Server (', '').Replace(')', '') # Don't clown, I don't know regex :( + } catch { + # Probably because the instance name has been aliased or does not exist or something + # here to avoid an empty catch + $null = 1 + } + $serviceaccount = $sqlwmi.ServiceAccount + + if ([System.String]::IsNullOrEmpty($regroot)) { + $regroot = $sqlwmi.AdvancedProperties | Where-Object { $_ -match 'REGROOT' } + $vsname = $sqlwmi.AdvancedProperties | Where-Object { $_ -match 'VSNAME' } + + if (![System.String]::IsNullOrEmpty($regroot)) { + $regroot = ($regroot -Split 'Value\=')[1] + $vsname = ($vsname -Split 'Value\=')[1] + } else { + Stop-Function -Message "Can't find instance $vsname on $instance." -Continue -Category ObjectNotFound -Target $instance + } + } + + if ([System.String]::IsNullOrEmpty($vsname)) { $vsname = $instance } + + Write-Message -Level Output -Message "Regroot: $regroot" -Target $instance + Write-Message -Level Output -Message "ServiceAcct: $serviceaccount" -Target $instance + Write-Message -Level Output -Message "InstanceName: $instancename" -Target $instance + Write-Message -Level Output -Message "VSNAME: $vsname" -Target $instance + + $scriptblock = { + $regpath = "Registry::HKEY_LOCAL_MACHINE\$($args[0])\MSSQLServer\SuperSocketNetLib" + $cert = (Get-ItemProperty -Path $regpath -Name Certificate).Certificate + #Variable marked as unused by PSScriptAnalyzer + #$oldvalue = (Get-ItemProperty -Path $regpath -Name ForceEncryption).ForceEncryption + Set-ItemProperty -Path $regpath -Name ForceEncryption -Value $false + $forceencryption = (Get-ItemProperty -Path $regpath -Name ForceEncryption).ForceEncryption + + [pscustomobject]@{ + ComputerName = $env:COMPUTERNAME + InstanceName = $args[2] + SqlInstance = $args[1] + ForceEncryption = ($forceencryption -eq $true) + CertificateThumbprint = $cert + } + } + + if ($PScmdlet.ShouldProcess("local", "Connecting to $instance to modify the ForceEncryption value in $regroot for $($instance.InstanceName)")) { + try { + Invoke-Command2 -ComputerName $resolved.FullComputerName -Credential $Credential -ArgumentList $regroot, $vsname, $instancename -ScriptBlock $scriptblock -ErrorAction Stop + Write-Message -Level Critical -Message "Force encryption was successfully set on $($resolved.FullComputerName) for the $instancename instance. You must now restart the SQL Server for changes to take effect." -Target $instance + } catch { + Stop-Function -Message "Failed to connect to $($resolved.FullComputerName) using PowerShell remoting!" -ErrorRecord $_ -Target $instance -Continue + } + } + } + } +} +function Disable-DbaTraceFlag { + <# + .SYNOPSIS + Disable a Global Trace Flag that is currently running + + .DESCRIPTION + The function will disable a Trace Flag that is currently running globally on the SQL Server instance(s) listed + + .PARAMETER SqlInstance + The target SQL Server instance or instances. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER TraceFlag + Trace flag number to enable globally + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: TraceFlag, DBCC + Author: Garry Bargsley (@gbargsley), http://blog.garrybargsley.com + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Disable-DbaTraceFlag + + .EXAMPLE + PS C:\> Disable-DbaTraceFlag -SqlInstance sql2016 -TraceFlag 3226 + + Disable the globally running trace flag 3226 on SQL Server instance sql2016 + + #> + [CmdletBinding()] + param ( + [parameter(Position = 0, Mandatory, ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer", "SqlServers")] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [parameter(Mandatory)] + [int[]]$TraceFlag, + [Alias('Silent')] + [switch]$EnableException + ) + + process { + foreach ($instance in $SqlInstance) { + + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + $current = Get-DbaTraceFlag -SqlInstance $server -EnableException + + foreach ($tf in $TraceFlag) { + $TraceFlagInfo = [pscustomobject]@{ + SourceServer = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + TraceFlag = $tf + Status = $null + Notes = $null + DateTime = [DbaDateTime](Get-Date) + } + if ($tf -notin $current.TraceFlag) { + $TraceFlagInfo.Status = 'Skipped' + $TraceFlagInfo.Notes = "Trace Flag is not running." + $TraceFlagInfo + Write-Message -Level Warning -Message "Trace Flag $tf is not currently running on $instance" + continue + } + + try { + $query = "DBCC TRACEOFF ($tf, -1)" + $server.Query($query) + } catch { + $TraceFlagInfo.Status = "Failed" + $TraceFlagInfo.Notes = $_.Exception.Message + $TraceFlagInfo + Stop-Function -Message "Failure" -ErrorRecord $_ -Target $server -Continue + } + $TraceFlagInfo.Status = "Successful" + $TraceFlagInfo + } + } + } +} +function Dismount-DbaDatabase { + <# + .SYNOPSIS + Detach a SQL Server Database. + + .DESCRIPTION + This command detaches one or more SQL Server databases. If necessary, -Force can be used to break mirrors and remove databases from availability groups prior to detaching. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Database + The database(s) to detach. + + .PARAMETER FileStructure + A StringCollection object value that contains a list database files. If FileStructure is not specified, BackupHistory will be used to guess the structure. + + .PARAMETER InputObject + A collection of databases (such as returned by Get-DbaDatabase), to be detached. + + .PARAMETER UpdateStatistics + If this switch is enabled, statistics for the database will be updated prior to detaching it. + + .PARAMETER Force + If this switch is enabled and the database is part of a mirror, the mirror will be broken. If the database is part of an Availability Group, it will be removed from the AG. + + .PARAMETER WhatIf + If this switch is enabled, no actions are performed but informational messages will be displayed that explain what would happen if the command were to run. + + .PARAMETER Confirm + If this switch is enabled, you will be prompted for confirmation before executing any operations that change state. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Database + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Dismount-DbaDatabase + + .EXAMPLE + PS C:\> Detach-DbaDatabase -SqlInstance sql2016b -Database SharePoint_Config, WSS_Logging + + Detaches SharePoint_Config and WSS_Logging from sql2016b + + .EXAMPLE + PS C:\> Get-DbaDatabase -SqlInstance sql2016b -Database 'PerformancePoint Service Application_10032db0fa0041df8f913f558a5dc0d4' | Detach-DbaDatabase -Force + + Detaches 'PerformancePoint Service Application_10032db0fa0041df8f913f558a5dc0d4' from sql2016b. Since Force was specified, if the database is part of mirror, the mirror will be broken prior to detaching. + + If the database is part of an Availability Group, it will first be dropped prior to detachment. + + .EXAMPLE + PS C:\> Get-DbaDatabase -SqlInstance sql2016b -Database WSS_Logging | Detach-DbaDatabase -Force -WhatIf + + Shows what would happen if the command were to execute (without actually executing the detach/break/remove commands). + + #> + [CmdletBinding(SupportsShouldProcess, DefaultParameterSetName = "Default")] + param ( + [parameter(Mandatory, ParameterSetName = 'SqlInstance')] + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [parameter(Mandatory, ParameterSetName = 'SqlInstance')] + [string[]]$Database, + [parameter(Mandatory, ParameterSetName = 'Pipeline', ValueFromPipeline)] + [Microsoft.SqlServer.Management.Smo.Database[]]$InputObject, + [Switch]$UpdateStatistics, + [switch]$Force, + [Alias('Silent')] + [switch]$EnableException + ) + process { + foreach ($instance in $SqlInstance) { + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $sqlcredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + if ($Database) { + $InputObject += $server.Databases | Where-Object Name -in $Database + } else { + $InputObject += $server.Databases + } + + if ($ExcludeDatabase) { + $InputObject = $InputObject | Where-Object Name -NotIn $ExcludeDatabase + } + } + + foreach ($db in $InputObject) { + $db.Refresh() + $server = $db.Parent + + if ($db.IsSystemObject) { + Stop-Function -Message "$db is a system database and cannot be detached using this method." -Target $db -Continue + } + + Write-Message -Level Verbose -Message "Checking replication status." + if ($db.ReplicationOptions -ne "None") { + Stop-Function -Message "Skipping $db on $server because it is replicated." -Target $db -Continue + } + + # repeat because different servers could be piped in + $snapshots = (Get-DbaDbSnapshot -SqlInstance $server).SnapshotOf + Write-Message -Level Verbose -Message "Checking for snaps" + if ($db.Name -in $snapshots) { + Write-Message -Level Warning -Message "Database $db has snapshots, you need to drop them before detaching. Skipping $db on $server." + Continue + } + + Write-Message -Level Verbose -Message "Checking mirror status" + if ($db.IsMirroringEnabled -and !$Force) { + Stop-Function -Message "$db on $server is being mirrored. Use -Force to break mirror or use the safer backup/restore method." -Target $db -Continue + } + + Write-Message -Level Verbose -Message "Checking Availability Group status" + + if ($db.AvailabilityGroupName -and !$Force) { + $ag = $db.AvailabilityGroupName + Stop-Function -Message "$db on $server is part of an Availability Group ($ag). Use -Force to drop from $ag availability group to detach. Alternatively, you can use the safer backup/restore method." -Target $db -Continue + } + + $sessions = Get-DbaProcess -SqlInstance $db.Parent -Database $db.Name + + if ($sessions -and !$Force) { + Stop-Function -Message "$db on $server currently has connected users and cannot be dropped. Use -Force to kill all connections and detach the database." -Target $db -Continue + } + + if ($force) { + + if ($sessions) { + If ($Pscmdlet.ShouldProcess($server, "Killing $($sessions.count) sessions which are connected to $db")) { + $null = $sessions | Stop-DbaProcess -ErrorAction SilentlyContinue -WarningAction SilentlyContinue + } + } + + if ($db.IsMirroringEnabled) { + If ($Pscmdlet.ShouldProcess($server, "Breaking mirror for $db on $server")) { + try { + Write-Message -Level Warning -Message "Breaking mirror for $db on $server." + $db.ChangeMirroringState([Microsoft.SqlServer.Management.Smo.MirroringOption]::Off) + $db.Alter() + $db.Refresh() + } catch { + Stop-Function -Message "Could not break mirror for $db on $server - not detaching." -Target $db -ErrorRecord $_ -Continue + } + } + } + + if ($db.AvailabilityGroupName) { + $ag = $db.AvailabilityGroupName + If ($Pscmdlet.ShouldProcess($server, "Attempting remove $db on $server from Availability Group $ag")) { + try { + $server.AvailabilityGroups[$ag].AvailabilityDatabases[$db.name].Drop() + Write-Message -Level Verbose -Message "Successfully removed $db from detach from $ag on $server." + } catch { + if ($_.Exception.InnerException) { + $exception = $_.Exception.InnerException.ToString() -Split "System.Data.SqlClient.SqlException: " + $exception = " | $(($exception[1] -Split "at Microsoft.SqlServer.Management.Common.ConnectionManager")[0])".TrimEnd() + } + + Stop-Function -Message "Could not remove $db from $ag on $server $exception." -Target $db -ErrorRecord $_ -Continue + } + } + } + + $sessions = Get-DbaProcess -SqlInstance $db.Parent -Database $db.Name + + if ($sessions) { + If ($Pscmdlet.ShouldProcess($server, "Killing $($sessions.count) sessions which are still connected to $db")) { + $null = $sessions | Stop-DbaProcess -ErrorAction SilentlyContinue -WarningAction SilentlyContinue + } + } + } + + If ($Pscmdlet.ShouldProcess($server, "Detaching $db on $server")) { + try { + $server.DetachDatabase($db.Name, $UpdateStatistics) + + [pscustomobject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + Database = $db.name + DetachResult = "Success" + } + } catch { + Stop-Function -Message "Failure" -Target $db -ErrorRecord $_ -Continue + } + } + } + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function Enable-DbaAgHadr { + <# + .SYNOPSIS + Enables the Hadr service setting on the specified SQL Server. + + .DESCRIPTION + In order to build an AG a cluster has to be built and then the Hadr enabled for the SQL Server + service. This function enables that feature for the SQL Server service. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. + + .PARAMETER Credential + Credential object used to connect to the Windows server as a different user + + .PARAMETER WhatIf + Shows what would happen if the command were to run. No actions are actually performed. + + .PARAMETER Confirm + Prompts you for confirmation before executing any changing operations within the command. + + .PARAMETER Force + Will restart SQL Server and SQL Server Agent service to apply the change. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Hadr, HA, AG, AvailabilityGroup + Author: Shawn Melton (@wsmelton), http://wsmelton.github.io + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Enable-DbaAgHadr + + .EXAMPLE + PS C:\> Enable-DbaAgHadr -SqlInstance sql2016 + + Sets Hadr service to enabled for the instance sql2016 but changes will not be applied until the next time the server restarts. + + .EXAMPLE + PS C:\> Enable-DbaAgHadr -SqlInstance sql2016 -Force + + Sets Hadr service to enabled for the instance sql2016, and restart the service to apply the change. + + .EXAMPLE + PS C:\> Enable-DbaAgHadr -SqlInstance sql2012\dev1 -Force + + Sets Hadr service to disabled for the instance dev1 on sq2012, and restart the service to apply the change. + + #> + [CmdletBinding(SupportsShouldProcess, ConfirmImpact = "High")] + param ( + [parameter(Mandatory, ValueFromPipeline)] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$Credential, + [switch]$Force, + [switch]$EnableException + ) + process { + foreach ($instance in $SqlInstance) { + $computer = $computerFullName = $instance.ComputerName + $instanceName = $instance.InstanceName + if (-not (Test-ElevationRequirement -ComputerName $instance)) { + return + } + $noChange = $false + + <# + #Variable marked as unused by PSScriptAnalyzer + switch ($instance.InstanceName) { + 'MSSQLSERVER' { $agentName = 'SQLSERVERAGENT' } + default { $agentName = "SQLAgent`$$instanceName" } + } + #> + + try { + Write-Message -Level Verbose -Message "Checking current Hadr setting for $computer" + $currentState = Get-WmiHadr -SqlInstance $instance -Credential $Credential + } catch { + Stop-Function -Message "Failure to pull current state of Hadr setting on $computer" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + $isHadrEnabled = $currentState.IsHadrEnabled + Write-Message -Level InternalComment -Message "$instance Hadr current value: $isHadrEnabled" + + # hadr results from sql wmi can be iffy, skip the check + <# + if ($isHadrEnabled) { + Write-Message -Level Warning -Message "Hadr is already enabled for instance: $($instance.FullName)" + $noChange = $true + continue + } + #> + + $scriptblock = { + $instance = $args[0] + $sqlService = $wmi.Services | Where-Object DisplayName -eq "SQL Server ($instance)" + $sqlService.ChangeHadrServiceSetting(1) + } + + if ($noChange -eq $false) { + if ($PSCmdlet.ShouldProcess($instance, "Changing Hadr from $isHadrEnabled to 1 for $instance")) { + try { + Invoke-ManagedComputerCommand -ComputerName $computerFullName -Credential $Credential -ScriptBlock $scriptblock -ArgumentList $instancename + } catch { + Stop-Function -Continue -Message "Failure on $($instance.FullName) | This may be because AlwaysOn Availability Groups feature requires the x86(non-WOW) or x64 Enterprise Edition of SQL Server 2012 (or later version) running on Windows Server 2008 (or later version) with WSFC hotfix KB 2494036 installed." + } + } + } + + if (Test-Bound -ParameterName Force) { + if ($PSCmdlet.ShouldProcess($instance, "Force provided, restarting Engine and Agent service for $instance on $computerFullName")) { + try { + $null = Stop-DbaService -ComputerName $computerFullName -InstanceName $instanceName -Type Agent, Engine + $null = Start-DbaService -ComputerName $computerFullName -InstanceName $instanceName -Type Agent, Engine + } catch { + Stop-Function -Message "Issue restarting $instance" -Target $instance -Continue + } + } + } + $newState = Get-WmiHadr -SqlInstance $instance -Credential $Credential + + if (Test-Bound -Not -ParameterName Force) { + Write-Message -Level Warning -Message "You must restart the SQL Server for it to take effect." + } + + [PSCustomObject]@{ + ComputerName = $newState.ComputerName + InstanceName = $newState.InstanceName + SqlInstance = $newState.SqlInstance + IsHadrEnabled = $true + } + } + } +} +#ValidationTags#CodeStyle,Messaging,FlowControl,Pipeline# +function Enable-DbaFilestream { + <# + .SYNOPSIS + Enables FileStream on specified SQL Server instances + + .DESCRIPTION + Connects to the specified SQL Server instances, and Enables the FileStream feature to the required value + + To perform the action, the SQL Server instance must be restarted. By default we will prompt for confirmation for this action, this can be overridden with the -Force switch + + .PARAMETER SqlInstance + The target SQL Server instance or instances. Defaults to localhost. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Credential + Login to the target server using alternative credentials. + + .PARAMETER FileStreamLevel + The level to of FileStream to be enabled: + 1 or TSql - T-Sql Access Only + 2 or TSqlIoStreaming - T-Sql and Win32 access enabled + 3 or TSqlIoStreamingRemoteClient T-Sql, Win32 and Remote access enabled + + .PARAMETER ShareName + Specifies the Windows file share name to be used for storing the FILESTREAM data. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .PARAMETER Force + Restart SQL Instance after changes. Use this parameter with care as it overrides whatif. + + .PARAMETER WhatIf + Shows what would happen if the command runs. The command is not run unless Force is specified. + + .PARAMETER Confirm + Prompts you for confirmation before running the command. + + .NOTES + Tags: Filestream + Author: Stuart Moore ( @napalmgram ) | Chrissy LeMaire ( @cl ) + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .EXAMPLE + PS C:\> Enable-DbaFilestream -SqlInstance server1\instance2 -FileStreamLevel TSql + PS C:\> Enable-DbaFilestream -SqlInstance server1\instance2 -FileStreamLevel 1 + + These commands are functionally equivalent, both will set Filestream level on server1\instance2 to T-Sql Only + + .EXAMPLE + PS C:\> Get-DbaFilestream -SqlInstance server1\instance2, server5\instance5, prod\hr | Where-Object InstanceAccessLevel -eq 0 | Enable-DbaFilestream -FileStreamLevel TSqlIoStreamingRemoteClient -Force + + Using this pipeline you can scan a range of SQL instances and enable filestream on only those on which it's disabled. + + #> + [CmdletBinding(SupportsShouldProcess, ConfirmImpact = "Medium")] + param ( + [Parameter(Mandatory, ValueFromPipelineByPropertyName)] + [DbaInstance[]]$SqlInstance, + [Parameter(ValueFromPipelineByPropertyName)] + [PSCredential]$SqlCredential, + [Parameter(ValueFromPipelineByPropertyName)] + [PSCredential]$Credential, + [ValidateSet("TSql", "TSqlIoStreaming", "TSqlIoStreamingRemoteClient", 1, 2, 3)] + [string]$FileStreamLevel = 1, + [string]$ShareName, + [switch]$Force, + [switch]$EnableException + ) + begin { + if ($FileStreamLevel -notin (1, 2, 3)) { + $FileStreamLevel = switch ($FileStreamLevel) { + "TSql" { + 1 + } + "TSqlIoStreaming" { + 2 + } + "TSqlIoStreamingRemoteClient" { + 3 + } + } + } + # = $finallevel removed as it was identified as a unused variable + $level = [int]$FileStreamLevel + $OutputLookup = @{ + 0 = 'Disabled' + 1 = 'FileStream enabled for T-Sql access' + 2 = 'FileStream enabled for T-Sql and IO streaming access' + 3 = 'FileStream enabled for T-Sql, IO streaming, and remote clients' + } + } + process { + if ($ShareName -and $level -lt 2) { + Stop-Function -Message "Filestream must be at least level 2 when using ShareName" + return + } + + foreach ($instance in $SqlInstance) { + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential + } catch { + Stop-Function -Message "Failure connecting to $computer" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + $filestreamstate = [int]$server.Configuration.FilestreamAccessLevel.ConfigValue + + if ($Force -or $PSCmdlet.ShouldProcess($instance, "Changing from '$($OutputLookup[$filestreamstate])' to '$($OutputLookup[$level])' at the instance level")) { + # Server level + if ($server.IsClustered) { + $nodes = Get-DbaWsfcNode -ComputerName $instance + foreach ($node in $nodes.Name) { + $result = Set-FileSystemSetting -Instance $node -Credential $Credential -ShareName $ShareName -FilestreamLevel $level + } + } else { + $result = Set-FileSystemSetting -Instance $instance -Credential $Credential -ShareName $ShareName -FilestreamLevel $level + } + + # Instance level + if ($level -eq 3) { + $level = 2 + } + + try { + $null = Set-DbaSpConfigure -SqlInstance $server -Name FilestreamAccessLevel -Value $level -EnableException + } catch { + Stop-Function -Message "Failure" -ErrorRecord $_ -Continue + } + + if ($Force) { + #$restart replaced with $null as it was identified as a unused variable + $null = Restart-DbaService -ComputerName $server.ComputerName -InstanceName $server.ServiceName -Type Engine -Force + } + + Get-DbaFilestream -SqlInstance $instance -SqlCredential $SqlCredential -Credential $Credential + if ($filestreamstate -ne $level -and -not $Force) { + Write-Message -Level Warning -Message "[$instance] $result" + } + } + } + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function Enable-DbaForceNetworkEncryption { + <# + .SYNOPSIS + Enables Force Encryption for a SQL Server instance. + + .DESCRIPTION + Enables Force Encryption for a SQL Server instance. Note that this requires access to the Windows Server, not the SQL instance itself. + + This setting is found in Configuration Manager. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. + + .PARAMETER Credential + Allows you to login to the computer (not SQL Server instance) using alternative Windows credentials + + .PARAMETER WhatIf + If this switch is enabled, no actions are performed but informational messages will be displayed that explain what would happen if the command were to run. + + .PARAMETER Confirm + If this switch is enabled, you will be prompted for confirmation before executing any operations that change state. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Certificate, Encryption + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .EXAMPLE + PS C:\> Enable-DbaForceNetworkEncryption + + Enables Force Encryption on the default (MSSQLSERVER) instance on localhost. Requires (and checks for) RunAs admin. + + .EXAMPLE + PS C:\> Enable-DbaForceNetworkEncryption -SqlInstance sql01\SQL2008R2SP2 + + Enables Force Network Encryption for the SQL2008R2SP2 on sql01. Uses Windows Credentials to both connect and modify the registry. + + .EXAMPLE + PS C:\> Enable-DbaForceNetworkEncryption -SqlInstance sql01\SQL2008R2SP2 -WhatIf + + Shows what would happen if the command were executed. + + #> + [CmdletBinding(SupportsShouldProcess, ConfirmImpact = "Low", DefaultParameterSetName = 'Default')] + param ( + [Parameter(ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer", "ComputerName")] + [DbaInstanceParameter[]] + $SqlInstance = $env:COMPUTERNAME, + [PSCredential]$Credential, + [Alias('Silent')] + [switch]$EnableException + ) + process { + + foreach ($instance in $sqlinstance) { + Write-Message -Level VeryVerbose -Message "Processing $instance." -Target $instance + $null = Test-ElevationRequirement -ComputerName $instance -Continue + + Write-Message -Level Verbose -Message "Resolving hostname." + $resolved = $null + $resolved = Resolve-DbaNetworkName -ComputerName $instance -Turbo + + if ($null -eq $resolved) { + Stop-Function -Message "Can't resolve $instance." -Target $instance -Continue -Category InvalidArgument + } + + try { + $sqlwmi = Invoke-ManagedComputerCommand -ComputerName $resolved.FullComputerName -ScriptBlock { $wmi.Services } -Credential $Credential -ErrorAction Stop | Where-Object DisplayName -eq "SQL Server ($($instance.InstanceName))" + } catch { + Stop-Function -Message "Failed to access $instance" -Target $instance -Continue -ErrorRecord $_ + } + + $regroot = ($sqlwmi.AdvancedProperties | Where-Object Name -eq REGROOT).Value + $vsname = ($sqlwmi.AdvancedProperties | Where-Object Name -eq VSNAME).Value + try { + $instancename = $sqlwmi.DisplayName.Replace('SQL Server (', '').Replace(')', '') # Don't clown, I don't know regex :( + } catch { + # Probably because the instance name has been aliased or does not exist or something + # here to avoid an empty catch + $null = 1 + } + $serviceaccount = $sqlwmi.ServiceAccount + + if ([System.String]::IsNullOrEmpty($regroot)) { + $regroot = $sqlwmi.AdvancedProperties | Where-Object { $_ -match 'REGROOT' } + $vsname = $sqlwmi.AdvancedProperties | Where-Object { $_ -match 'VSNAME' } + + if (![System.String]::IsNullOrEmpty($regroot)) { + $regroot = ($regroot -Split 'Value\=')[1] + $vsname = ($vsname -Split 'Value\=')[1] + } else { + Stop-Function -Message "Can't find instance $vsname on $instance." -Continue -Category ObjectNotFound -Target $instance + } + } + + if ([System.String]::IsNullOrEmpty($vsname)) { $vsname = $instance } + + Write-Message -Level Output -Message "Regroot: $regroot" -Target $instance + Write-Message -Level Output -Message "ServiceAcct: $serviceaccount" -Target $instance + Write-Message -Level Output -Message "InstanceName: $instancename" -Target $instance + Write-Message -Level Output -Message "VSNAME: $vsname" -Target $instance + + $scriptblock = { + $regpath = "Registry::HKEY_LOCAL_MACHINE\$($args[0])\MSSQLServer\SuperSocketNetLib" + $cert = (Get-ItemProperty -Path $regpath -Name Certificate).Certificate + #Variable marked as unused by PSScriptAnalyzer + #$oldvalue = (Get-ItemProperty -Path $regpath -Name ForceEncryption).ForceEncryption + Set-ItemProperty -Path $regpath -Name ForceEncryption -Value $true + $forceencryption = (Get-ItemProperty -Path $regpath -Name ForceEncryption).ForceEncryption + + [pscustomobject]@{ + ComputerName = $env:COMPUTERNAME + InstanceName = $args[2] + SqlInstance = $args[1] + ForceEncryption = ($forceencryption -eq $true) + CertificateThumbprint = $cert + } + } + + if ($PScmdlet.ShouldProcess("local", "Connecting to $instance to modify the ForceEncryption value in $regroot for $($instance.InstanceName)")) { + try { + Invoke-Command2 -ComputerName $resolved.FullComputerName -Credential $Credential -ArgumentList $regroot, $vsname, $instancename -ScriptBlock $scriptblock -ErrorAction Stop | Select-Object -Property * -ExcludeProperty PSComputerName, RunspaceId, PSShowComputerName + Write-Message -Level Critical -Message "Force encryption was successfully set on $($resolved.FullComputerName) for the $instancename instance. You must now restart the SQL Server for changes to take effect." -Target $instance + } catch { + Stop-Function -Message "Failed to connect to $($resolved.FullComputerName) using PowerShell remoting!" -ErrorRecord $_ -Target $instance -Continue + } + } + } + } +} +function Enable-DbaTraceFlag { + <# + .SYNOPSIS + Enable Global Trace Flag(s) + + .DESCRIPTION + The function will set one or multiple trace flags on the SQL Server instance(s) listed + + .PARAMETER SqlInstance + The target SQL Server instance or instances. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER TraceFlag + Trace flag number(s) to enable globally + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: TraceFlag, DBCC + Author: Garry Bargsley (@gbargsley), http://blog.garrybargsley.com + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Enable-DbaTraceFlag + + .EXAMPLE + PS C:\> Enable-DbaTraceFlag -SqlInstance sql2016 -TraceFlag 3226 + + Enable the trace flag 3226 on SQL Server instance sql2016 + + .EXAMPLE + PS C:\> Enable-DbaTraceFlag -SqlInstance sql2016 -TraceFlag 1117, 1118 + + Enable multiple trace flags on SQL Server instance sql2016 + + #> + [CmdletBinding()] + param ( + [parameter(Position = 0, Mandatory, ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer", "SqlServers")] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [parameter(Mandatory)] + [int[]]$TraceFlag, + [Alias('Silent')] + [switch]$EnableException + ) + + process { + foreach ($instance in $SqlInstance) { + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + $CurrentRunningTraceFlags = Get-DbaTraceFlag -SqlInstance $server -EnableException + + # We could combine all trace flags but the granularity is worth it + foreach ($tf in $TraceFlag) { + $TraceFlagInfo = [PSCustomObject]@{ + SourceServer = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + TraceFlag = $tf + Status = $null + Notes = $null + DateTime = [DbaDateTime](Get-Date) + } + if ($CurrentRunningTraceFlags.TraceFlag -contains $tf) { + $TraceFlagInfo.Status = 'Skipped' + $TraceFlagInfo.Notes = "The Trace flag is already running." + $TraceFlagInfo + Write-Message -Level Warning -Message "The Trace flag [$tf] is already running globally." + continue + } + + try { + $query = "DBCC TRACEON ($tf, -1)" + $server.Query($query) + $server.Refresh() + } catch { + $TraceFlagInfo.Status = "Failed" + $TraceFlagInfo.Notes = $_.Exception.Message + $TraceFlagInfo + Stop-Function -Message "Failure" -ErrorRecord $_ -Target $server -Continue + } + $TraceFlagInfo.Status = "Successful" + $TraceFlagInfo + } + } + } +} +function Expand-DbaDbLogFile { + <# + .SYNOPSIS + This command will help you to automatically grow your transaction log file in a responsible way (preventing the generation of too many VLFs). + + .DESCRIPTION + As you may already know, having a transaction log file with too many Virtual Log Files (VLFs) can hurt your database performance in many ways. + + Example: + Too many VLFs can cause transaction log backups to slow down and can also slow down database recovery and, in extreme cases, even impact insert/update/delete performance. + + References: + http://www.sqlskills.com/blogs/kimberly/transaction-log-vlfs-too-many-or-too-few/ + http://blogs.msdn.com/b/saponsqlserver/archive/2012/02/22/too-many-virtual-log-files-vlfs-can-cause-slow-database-recovery.aspx + http://www.brentozar.com/blitz/high-virtual-log-file-vlf-count/ + + In order to get rid of this fragmentation we need to grow the file taking the following into consideration: + - How many VLFs are created when we perform a grow operation or when an auto-grow is invoked? + + Note: In SQL Server 2014 this algorithm has changed (http://www.sqlskills.com/blogs/paul/important-change-vlf-creation-algorithm-sql-server-2014/) + + Attention: + We are growing in MB instead of GB because of known issue prior to SQL 2012: + More detail here: + http://www.sqlskills.com/BLOGS/PAUL/post/Bug-log-file-growth-broken-for-multiples-of-4GB.aspx + and + http://connect.microsoft.com/SqlInstance/feedback/details/481594/log-growth-not-working-properly-with-specific-growth-sizes-vlfs-also-not-created-appropriately + or + https://connect.microsoft.com/SqlInstance/feedback/details/357502/transaction-log-file-size-will-not-grow-exactly-4gb-when-filegrowth-4gb + + Understanding related problems: + http://www.sqlskills.com/blogs/kimberly/transaction-log-vlfs-too-many-or-too-few/ + http://blogs.msdn.com/b/saponsqlserver/archive/2012/02/22/too-many-virtual-log-files-vlfs-can-cause-slow-database-recovery.aspx + http://www.brentozar.com/blitz/high-virtual-log-file-vlf-count/ + + Known bug before SQL Server 2012 + http://www.sqlskills.com/BLOGS/PAUL/post/Bug-log-file-growth-broken-for-multiples-of-4GB.aspx + http://connect.microsoft.com/SqlInstance/feedback/details/481594/log-growth-not-working-properly-with-specific-growth-sizes-vlfs-also-not-created-appropriately + https://connect.microsoft.com/SqlInstance/feedback/details/357502/transaction-log-file-size-will-not-grow-exactly-4gb-when-filegrowth-4gb + + How it works? + The transaction log will grow in chunks until it reaches the desired size. + Example: If you have a log file with 8192MB and you say that the target size is 81920MB (80GB) it will grow in chunks of 8192MB until it reaches 81920MB. 8192 -> 16384 -> 24576 ... 73728 -> 81920 + + .PARAMETER SqlInstance + The target SQL Server instance or instances. + + .PARAMETER Database + The database(s) to process. Options for this list are auto-populated from the server. If unspecified, all databases will be processed. + + .PARAMETER TargetLogSize + Specifies the target size of the transaction log file in megabytes. + + .PARAMETER IncrementSize + Specifies the amount the transaction log should grow in megabytes. If this value differs from the suggested value based on your TargetLogSize, you will be prompted to confirm your choice. + + This value will be calculated if not specified. + + .PARAMETER LogFileId + Specifies the file number(s) of additional transaction log files to grow. + + If this value is not specified, only the first transaction log file will be processed. + + .PARAMETER ShrinkLogFile + If this switch is enabled, your transaction log files will be shrunk. + + .PARAMETER ShrinkSize + Specifies the target size of the transaction log file for the shrink operation in megabytes. + + .PARAMETER BackupDirectory + Specifies the location of your backups. Backups must be performed to shrink the transaction log. + + If this value is not specified, the SQL Server instance's default backup directory will be used. + + .PARAMETER ExcludeDiskSpaceValidation + If this switch is enabled, the validation for enough disk space using Get-DbaDiskSpace command will be skipped. + This can be useful when you know that you have enough space to grow your TLog but you don't have PowerShell Remoting enabled to validate it. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER ExcludeDatabase + The database(s) to exclude. Options for this list are auto-populated from the server. + + .PARAMETER WhatIf + If this switch is enabled, no actions are performed but informational messages will be displayed that explain what would happen if the command were to run. + + .PARAMETER Confirm + If this switch is enabled, you will be prompted for confirmation before executing any operations that change state. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Storage, Backup + Author: Claudio Silva (@ClaudioESSilva) + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + Requires: ALTER DATABASE permission + Limitations: Freespace cannot be validated on the directory where the log file resides in SQL Server 2005. + This script uses Get-DbaDiskSpace dbatools command to get the TLog's drive free space + + .LINK + https://dbatools.io/Expand-DbaDbLogFile + + .EXAMPLE + PS C:\> Expand-DbaDbLogFile -SqlInstance sqlcluster -Database db1 -TargetLogSize 50000 + + Grows the transaction log for database db1 on sqlcluster to 50000 MB and calculates the increment size. + + .EXAMPLE + PS C:\> Expand-DbaDbLogFile -SqlInstance sqlcluster -Database db1, db2 -TargetLogSize 10000 -IncrementSize 200 + + Grows the transaction logs for databases db1 and db2 on sqlcluster to 1000MB and sets the growth increment to 200MB. + + .EXAMPLE + PS C:\> Expand-DbaDbLogFile -SqlInstance sqlcluster -Database db1 -TargetLogSize 10000 -LogFileId 9 + + Grows the transaction log file with FileId 9 of the db1 database on sqlcluster instance to 10000MB. + + .EXAMPLE + PS C:\> Expand-DbaDbLogFile -SqlInstance sqlcluster -Database (Get-Content D:\DBs.txt) -TargetLogSize 50000 + + Grows the transaction log of the databases specified in the file 'D:\DBs.txt' on sqlcluster instance to 50000MB. + + .EXAMPLE + PS C:\> Expand-DbaDbLogFile -SqlInstance SqlInstance -Database db1,db2 -TargetLogSize 100 -IncrementSize 10 -ShrinkLogFile -ShrinkSize 10 -BackupDirectory R:\MSSQL\Backup + + Grows the transaction logs for databases db1 and db2 on SQL server SQLInstance to 100MB, sets the incremental growth to 10MB, shrinks the transaction log to 10MB and uses the directory R:\MSSQL\Backup for the required backups. + + #> + [CmdletBinding(SupportsShouldProcess, DefaultParameterSetName = 'Default')] + param ( + [parameter(Position = 1, Mandatory)] + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter]$SqlInstance, + [parameter(Position = 3)] + [PSCredential]$SqlCredential, + [Alias("Databases")] + [object[]]$Database, + [parameter(Position = 4)] + [object[]]$ExcludeDatabase, + [parameter(Position = 5, Mandatory)] + [Alias('TargetLogSizeMB')] + [int]$TargetLogSize, + [parameter(Position = 6)] + [Alias('IncrementSizeMB')] + [int]$IncrementSize = -1, + [parameter(Position = 7)] + [int]$LogFileId = -1, + [parameter(Position = 8, ParameterSetName = 'Shrink', Mandatory)] + [switch]$ShrinkLogFile, + [parameter(Position = 9, ParameterSetName = 'Shrink', Mandatory)] + [Alias('ShrinkSizeMB')] + [int]$ShrinkSize, + [parameter(Position = 10, ParameterSetName = 'Shrink')] + [AllowEmptyString()] + [string]$BackupDirectory, + [switch]$ExcludeDiskSpaceValidation, + [switch][Alias('Silent')] + $EnableException + ) + + begin { + Write-Message -Level Verbose -Message "Set ErrorActionPreference to Inquire." + $ErrorActionPreference = 'Inquire' + + #Convert MB to KB (SMO works in KB) + Write-Message -Level Verbose -Message "Convert variables MB to KB (SMO works in KB)." + [int]$TargetLogSizeKB = $TargetLogSize * 1024 + [int]$LogIncrementSize = $IncrementSize * 1024 + [int]$ShrinkSizeKB = $ShrinkSize * 1024 + [int]$SuggestLogIncrementSize = 0 + [bool]$LogByFileID = if ($LogFileId -eq -1) { + $false + } else { + $true + } + + #Set base information + Write-Message -Level Verbose -Message "Initialize the instance '$SqlInstance'." + + $server = Connect-SqlInstance -SqlInstance $SqlInstance -SqlCredential $SqlCredential + + if ($ShrinkLogFile -eq $true) { + if ($BackupDirectory.length -eq 0) { + $backupdirectory = $server.Settings.BackupDirectory + } + + $pathexists = Test-DbaPath -SqlInstance $server -Path $backupdirectory + + if ($pathexists -eq $false) { + Stop-Function -Message "Backup directory does not exist." + } + } + } + + process { + + try { + + [datetime]$initialTime = Get-Date + + #control the iteration number + $databaseProgressbar = 0; + + Write-Message -Level Verbose -Message "Resolving NetBIOS name." + $sourcenetbios = Resolve-NetBiosName $server + + $databases = $server.Databases | Where-Object IsAccessible + Write-Message -Level Verbose -Message "Number of databases found: $($databases.Count)." + if ($Database) { + $databases = $databases | Where-Object Name -In $Database + } + if ($ExcludeDatabase) { + $databases = $databases | Where-Object Name -NotIn $ExcludeDatabase + } + + #go through all databases + Write-Message -Level Verbose -Message "Processing...foreach database..." + foreach ($db in $databases.Name) { + Write-Message -Level Verbose -Message "Working on $db." + $databaseProgressbar += 1 + + #set step to reutilize on logging operations + [string]$step = "$databaseProgressbar/$($Databases.Count)" + + if ($server.Databases[$db]) { + Write-Progress ` + -Id 1 ` + -Activity "Using database: $db on Instance: '$SqlInstance'" ` + -PercentComplete ($databaseProgressbar / $Databases.Count * 100) ` + -Status "Processing - $databaseProgressbar of $($Databases.Count)" + + #Validate which file will grow + if ($LogByFileID) { + $logfile = $server.Databases[$db].LogFiles.ItemById($LogFileId) + } else { + $logfile = $server.Databases[$db].LogFiles[0] + } + + $numLogfiles = $server.Databases[$db].LogFiles.Count + + Write-Message -Level Verbose -Message "$step - Use log file: $logfile." + $currentSize = $logfile.Size + $currentSizeMB = $currentSize / 1024 + + #Get the number of VLFs + $initialVLFCount = Test-DbaDbVirtualLogFile -SqlInstance $server -Database $db + + Write-Message -Level Verbose -Message "$step - Log file current size: $([System.Math]::Round($($currentSize/1024.0), 2)) MB " + [long]$requiredSpace = ($TargetLogSizeKB - $currentSize) + + if ($ExcludeDiskSpaceValidation -eq $false) { + Write-Message -Level Verbose -Message "Verifying if sufficient space exists ($([System.Math]::Round($($requiredSpace / 1024.0), 2))MB) on the volume to perform this task." + + [long]$TotalTLogFreeDiskSpaceKB = 0 + Write-Message -Level Verbose -Message "Get TLog drive free space" + + try { + [object]$AllDrivesFreeDiskSpace = Get-DbaDiskSpace -ComputerName $sourcenetbios | Select-Object Name, SizeInKB + + #Verify path using Split-Path on $logfile.FileName in backwards. This way we will catch the LUNs. Example: "K:\Log01" as LUN name. Need to add final backslash if not there + $DrivePath = Split-Path $logfile.FileName -parent + $DrivePath = if (!($DrivePath.EndsWith("\"))) { "$DrivePath\" } + else { $DrivePath } + Do { + if ($AllDrivesFreeDiskSpace | Where-Object { $DrivePath -eq "$($_.Name)" }) { + $TotalTLogFreeDiskSpaceKB = ($AllDrivesFreeDiskSpace | Where-Object { $DrivePath -eq $_.Name }).SizeInKB + $match = $true + break + } else { + $match = $false + $DrivePath = Split-Path $DrivePath -parent + $DrivePath = if (!($DrivePath.EndsWith("\"))) { "$DrivePath\" } + else { $DrivePath } + } + + } + while (!$match -or ([string]::IsNullOrEmpty($DrivePath))) + + Write-Message -Level Verbose -Message "Total TLog Free Disk Space in MB: $([System.Math]::Round($($TotalTLogFreeDiskSpaceKB / 1024.0), 2))" + + } catch { + #Could not validate the disk space. Will ask if we want to continue. + $TotalTLogFreeDiskSpaceKB = 0 + } + + if (($TotalTLogFreeDiskSpaceKB -le 0) -or ([string]::IsNullOrEmpty($TotalTLogFreeDiskSpaceKB))) { + $title = "Choose increment value for database '$db':" + $message = "Cannot validate freespace on drive where the log file resides. Do you wish to continue? (Y/N)" + $yes = New-Object System.Management.Automation.Host.ChoiceDescription "&Yes", "Will continue" + $no = New-Object System.Management.Automation.Host.ChoiceDescription "&No", "Will exit" + $options = [System.Management.Automation.Host.ChoiceDescription[]]($yes, $no) + $result = $host.ui.PromptForChoice($title, $message, $options, 0) + #no + if ($result -eq 1) { + Write-Message -Level Warning -Message "You have cancelled the execution" + return + } + } elseif ($requiredSpace -gt $TotalTLogFreeDiskSpaceKB) { + Write-Message -Level Verbose -Message "There is not enough space on volume to perform this task. `r`n" ` + "Available space: $([System.Math]::Round($($TotalTLogFreeDiskSpaceKB / 1024.0), 2))MB;`r`n" ` + "Required space: $([System.Math]::Round($($requiredSpace / 1024.0), 2))MB;" + return + } + } + + if ($currentSize -ige $TargetLogSizeKB -and ($ShrinkLogFile -eq $false)) { + Write-Message -Level Verbose -Message "$step - [INFO] The T-Log file '$logfile' size is already equal or greater than target size - No action required." + } else { + Write-Message -Level Verbose -Message "$step - [OK] There is sufficient free space to perform this task." + + # If SQL Server version is greater or equal to 2012 + if ($server.Version.Major -ge "11") { + switch ($TargetLogSize) { + { $_ -le 64 } { $SuggestLogIncrementSize = 64 } + { $_ -ge 64 -and $_ -lt 256 } { $SuggestLogIncrementSize = 256 } + { $_ -ge 256 -and $_ -lt 1024 } { $SuggestLogIncrementSize = 512 } + { $_ -ge 1024 -and $_ -lt 4096 } { $SuggestLogIncrementSize = 1024 } + { $_ -ge 4096 -and $_ -lt 8192 } { $SuggestLogIncrementSize = 2048 } + { $_ -ge 8192 -and $_ -lt 16384 } { $SuggestLogIncrementSize = 4096 } + { $_ -ge 16384 } { $SuggestLogIncrementSize = 8192 } + } + } + # 2008 R2 or under + else { + switch ($TargetLogSize) { + { $_ -le 64 } { $SuggestLogIncrementSize = 64 } + { $_ -ge 64 -and $_ -lt 256 } { $SuggestLogIncrementSize = 256 } + { $_ -ge 256 -and $_ -lt 1024 } { $SuggestLogIncrementSize = 512 } + { $_ -ge 1024 -and $_ -lt 4096 } { $SuggestLogIncrementSize = 1024 } + { $_ -ge 4096 -and $_ -lt 8192 } { $SuggestLogIncrementSize = 2048 } + { $_ -ge 8192 -and $_ -lt 16384 } { $SuggestLogIncrementSize = 4000 } + { $_ -ge 16384 } { $SuggestLogIncrementSize = 8000 } + } + + if (($IncrementSize % 4096) -eq 0) { + Write-Message -Level Verbose -Message "Your instance version is below SQL 2012, remember the known BUG mentioned on HELP. `r`nUse Get-Help Expand-DbaTLogFileResponsibly to read help`r`nUse a different value for incremental size.`r`n" + return + } + } + Write-Message -Level Verbose -Message "Instance $server version: $($server.Version.Major) - Suggested TLog increment size: $($SuggestLogIncrementSize)MB" + + # Shrink Log File to desired size before re-growth to desired size (You need to remove as many VLF's as possible to ensure proper growth) + $ShrinkSize = $ShrinkSizeKB / 1024 + if ($ShrinkLogFile -eq $true) { + if ($server.Databases[$db].RecoveryModel -eq [Microsoft.SqlServer.Management.Smo.RecoveryModel]::Simple) { + Write-Message -Level Warning -Message "Database '$db' is in Simple RecoveryModel which does not allow log backups. Do not specify -ShrinkLogFile and -ShrinkSize parameters." + Continue + } + + try { + $sql = "SELECT last_log_backup_lsn FROM sys.database_recovery_status WHERE database_id = DB_ID('$db')" + $sqlResult = $server.ConnectionContext.ExecuteWithResults($sql); + + if ($sqlResult.Tables[0].Rows[0]["last_log_backup_lsn"] -is [System.DBNull]) { + Write-Message -Level Warning -Message "First, you need to make a full backup before you can do Tlog backup on database '$db' (last_log_backup_lsn is null)." + Continue + } + } catch { + Stop-Function -Message "Can't execute SQL on $server. `r`n $($_)" -Continue + } + + If ($Pscmdlet.ShouldProcess($($server.name), "Backing up TLog for $db")) { + Write-Message -Level Verbose -Message "We are about to backup the Tlog for database '$db' to '$backupdirectory' and shrink the log." + Write-Message -Level Verbose -Message "Starting Size = $currentSizeMB." + + $DefaultCompression = $server.Configuration.DefaultBackupCompression.ConfigValue + + if ($currentSizeMB -gt $ShrinkSize) { + $backupRetries = 1 + Do { + try { + $percent = $null + $backup = New-Object Microsoft.SqlServer.Management.Smo.Backup + $backup.Action = [Microsoft.SqlServer.Management.Smo.BackupActionType]::Log + $backup.BackupSetDescription = "Transaction Log backup of " + $db + $backup.BackupSetName = $db + " Backup" + $backup.Database = $db + $backup.MediaDescription = "Disk" + $dt = get-date -format yyyyMMddHHmmssms + $null = $backup.Devices.AddDevice($backupdirectory + "\" + $db + "_db_" + $dt + ".trn", 'File') + if ($DefaultCompression -eq $true) { + $backup.CompressionOption = 1 + } else { + $backup.CompressionOption = 0 + } + $null = [Microsoft.SqlServer.Management.Smo.PercentCompleteEventHandler] { + Write-Progress -id 2 -ParentId 1 -activity "Backing up $db to $server" -percentcomplete $_.Percent -status ([System.String]::Format("Progress: {0} %", $_.Percent)) + } + $backup.add_PercentComplete($percent) + $backup.PercentCompleteNotification = 10 + $backup.add_Complete($complete) + Write-Progress -id 2 -ParentId 1 -activity "Backing up $db to $server" -percentcomplete 0 -Status ([System.String]::Format("Progress: {0} %", 0)) + $backup.SqlBackup($server) + Write-Progress -id 2 -ParentId 1 -activity "Backing up $db to $server" -status "Complete" -Completed + $logfile.Shrink($ShrinkSize, [Microsoft.SqlServer.Management.SMO.ShrinkMethod]::TruncateOnly) + $logfile.Refresh() + } catch { + Write-Progress -id 1 -activity "Backup" -status "Failed" -completed + Stop-Function -Message "Backup failed for database" -ErrorRecord $_ -Target $db -Continue + Continue + } + + } + while (($logfile.Size / 1024) -gt $ShrinkSize -and ++$backupRetries -lt 6) + + $currentSize = $logfile.Size + Write-Message -Level Verbose -Message "TLog backup and truncate for database '$db' finished. Current TLog size after $backupRetries backups is $($currentSize/1024)MB" + } + } + } + + # SMO uses values in KB + $SuggestLogIncrementSize = $SuggestLogIncrementSize * 1024 + + # If default, use $SuggestedLogIncrementSize + if ($IncrementSize -eq -1) { + $LogIncrementSize = $SuggestLogIncrementSize + } else { + $title = "Choose increment value for database '$db':" + $message = "The input value for increment size was $([System.Math]::Round($LogIncrementSize/1024, 0))MB. However the suggested value for increment is $($SuggestLogIncrementSize/1024)MB.`r`nDo you want to use the suggested value of $([System.Math]::Round($SuggestLogIncrementSize/1024, 0))MB insted of $([System.Math]::Round($LogIncrementSize/1024, 0))MB" + $yes = New-Object System.Management.Automation.Host.ChoiceDescription "&Yes", "Uses recomended size." + $no = New-Object System.Management.Automation.Host.ChoiceDescription "&No", "Will use parameter value." + $options = [System.Management.Automation.Host.ChoiceDescription[]]($yes, $no) + $result = $host.ui.PromptForChoice($title, $message, $options, 0) + #yes + if ($result -eq 0) { + $LogIncrementSize = $SuggestLogIncrementSize + } + } + + #start growing file + If ($Pscmdlet.ShouldProcess($($server.name), "Starting log growth. Increment chunk size: $($LogIncrementSize/1024)MB for database '$db'")) { + Write-Message -Level Verbose -Message "Starting log growth. Increment chunk size: $($LogIncrementSize/1024)MB for database '$db'" + + Write-Message -Level Verbose -Message "$step - While current size less than target log size." + + while ($currentSize -lt $TargetLogSizeKB) { + + Write-Progress ` + -Id 2 ` + -ParentId 1 ` + -Activity "Growing file $logfile on '$db' database" ` + -PercentComplete ($currentSize / $TargetLogSizeKB * 100) ` + -Status "Remaining - $([System.Math]::Round($($($TargetLogSizeKB - $currentSize) / 1024.0), 2)) MB" + + Write-Message -Level Verbose -Message "$step - Verifying if the log can grow or if it's already at the desired size." + if (($TargetLogSizeKB - $currentSize) -lt $LogIncrementSize) { + Write-Message -Level Verbose -Message "$step - Log size is lower than the increment size. Setting current size equals $TargetLogSizeKB." + $currentSize = $TargetLogSizeKB + } else { + Write-Message -Level Verbose -Message "$step - Grow the $logfile file in $([System.Math]::Round($($LogIncrementSize / 1024.0), 2)) MB" + $currentSize += $LogIncrementSize + } + + #When -WhatIf Switch, do not run + if ($PSCmdlet.ShouldProcess("$step - File will grow to $([System.Math]::Round($($currentSize/1024.0), 2)) MB", "This action will grow the file $logfile on database $db to $([System.Math]::Round($($currentSize/1024.0), 2)) MB .`r`nDo you wish to continue?", "Perform grow")) { + Write-Message -Level Verbose -Message "$step - Set size $logfile to $([System.Math]::Round($($currentSize/1024.0), 2)) MB" + $logfile.size = $currentSize + + Write-Message -Level Verbose -Message "$step - Applying changes" + $logfile.Alter() + Write-Message -Level Verbose -Message "$step - Changes have been applied" + + #Will put the info like VolumeFreeSpace up to date + $logfile.Refresh() + } + } + + Write-Message -Level Verbose -Message "`r`n$step - [OK] Growth process for logfile '$logfile' on database '$db', has been finished." + + Write-Message -Level Verbose -Message "$step - Grow $logfile log file on $db database finished." + } + } + } + #else verifying existence + else { + Write-Message -Level Verbose -Message "Database '$db' does not exist on instance '$SqlInstance'." + } + + #Get the number of VLFs + $currentVLFCount = Test-DbaDbVirtualLogFile -SqlInstance $server -Database $db + + [pscustomobject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + Database = $db + ID = $logfile.ID + Name = $logfile.Name + LogFileCount = $numLogfiles + InitialSize = [dbasize]($currentSizeMB * 1024 * 1024) + CurrentSize = [dbasize]($TargetLogSize * 1024 * 1024) + InitialVLFCount = $initialVLFCount.Total + CurrentVLFCount = $currentVLFCount.Total + } | Select-DefaultView -ExcludeProperty LogFileCount + } #foreach database + } catch { + Stop-Function -Message "Logfile $logfile on database $db not processed. Error: $($_.Exception.Message). Line Number: $($_InvocationInfo.ScriptLineNumber)" -Continue + } + } + + end { + Write-Message -Level Verbose -Message "Process finished $((Get-Date) - ($initialTime))" + Test-DbaDeprecation -DeprecatedOn "1.0.0" -Alias Expand-SqlTLogResponsibly + Test-DbaDeprecation -DeprecatedOn "1.0.0" -Parameter TargetLogSizeMB + Test-DbaDeprecation -DeprecatedOn "1.0.0" -Parameter IncrementSizeMB + Test-DbaDeprecation -DeprecatedOn "1.0.0" -Parameter ShrinkSizeMB + Test-DbaDeprecation -DeprecatedOn "1.0.0" -Alias Expand-DbaTLogResponsibly + } +} +#ValidationTags#Messaging# +function Export-DbaAvailabilityGroup { + <# + .SYNOPSIS + Exports SQL Server Availability Groups to a T-SQL file. + + .DESCRIPTION + Exports SQL Server Availability Groups creation scripts to a T-SQL file. This is a function that is not available in SSMS. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. SQL Server 2012 and above supported. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Path + The directory name where the output files will be written. A sub directory with the format 'ServerName$InstanceName' will be created. A T-SQL scripts named 'AGName.sql' will be created under this subdirectory for each scripted Availability Group. + + .PARAMETER AvailabilityGroup + The Availability Group(s) to export - this list is auto-populated from the server. If unspecified, all logins will be processed. + + .PARAMETER ExcludeAvailabilityGroup + The Availability Group(s) to exclude - this list is auto-populated from the server. + + .PARAMETER NoClobber + Do not overwrite existing export files. + + .PARAMETER WhatIf + Shows you what it'd output if you were to run the command + + .PARAMETER Confirm + Confirms each step/line of output + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Hadr, HA, AG, AvailabilityGroup + Author: Chris Sommer (@cjsommer), cjsommer.com + + dbatools PowerShell module (https://dbatools.io) + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Export-DbaAvailabilityGroup + + .EXAMPLE + PS C:\> Export-DbaAvailabilityGroup -SqlInstance sql2012 + + Exports all Availability Groups from SQL server "sql2012". Output scripts are written to the Documents\SqlAgExports directory by default. + + .EXAMPLE + PS C:\> Export-DbaAvailabilityGroup -SqlInstance sql2012 -Path C:\temp\availability_group_exports + + Exports all Availability Groups from SQL server "sql2012". Output scripts are written to the C:\temp\availability_group_exports directory. + + .EXAMPLE + PS C:\> Export-DbaAvailabilityGroup -SqlInstance sql2012 -Path 'C:\dir with spaces\availability_group_exports' -AvailabilityGroup AG1,AG2 + + Exports Availability Groups AG1 and AG2 from SQL server "sql2012". Output scripts are written to the C:\dir with spaces\availability_group_exports directory. + + .EXAMPLE + PS C:\> Export-DbaAvailabilityGroup -SqlInstance sql2014 -Path C:\temp\availability_group_exports -NoClobber + + Exports all Availability Groups from SQL server "sql2014". Output scripts are written to the C:\temp\availability_group_exports directory. If the export file already exists it will not be overwritten. + + #> + [CmdletBinding(SupportsShouldProcess)] + param ( + [parameter(Mandatory, ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [object[]]$AvailabilityGroup, + [object[]]$ExcludeAvailabilityGroup, + [Alias("OutputLocation", "FilePath")] + [string]$Path = "$([Environment]::GetFolderPath("MyDocuments"))\SqlAgExport", + [switch]$NoClobber, + [Alias('Silent')] + [switch]$EnableException + ) + + process { + foreach ($instance in $SqlInstance) { + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + if ($server.IsHadrEnabled -eq $false) { + Stop-Function -Message "Hadr is not enabled on this instance" -Continue + } else { + # Get all of the Availability Groups and filter if required + $ags = $server.AvailabilityGroups + } + + if (Test-Bound 'AvailabilityGroup') { + $ags = $ags | Where-Object Name -In $AvailabilityGroup + } + if (Test-Bound 'ExcludeAvailabilityGroup') { + $ags = $ags | Where-Object Name -NotIn $ExcludeAvailabilityGroup + } + + if ($ags) { + + # Set and create the OutputLocation if it doesn't exist + $sqlinst = $instance.ToString().Replace('\', '$') + $outputLocation = "$Path\$sqlinst" + + if (!(Test-Path $outputLocation -PathType Container)) { + $null = New-Item -Path $outputLocation -ItemType Directory -Force + } + + # Script each Availability Group + foreach ($ag in $ags) { + $agName = $ag.Name + + # Set the outfile name + if ($AppendDateToOutputFilename.IsPresent) { + $formatteddate = (Get-Date -Format 'yyyyMMdd_hhmm') + $outFile = "$outputLocation\${AGname}_${formatteddate}.sql" + } else { + $outFile = "$outputLocation\$agName.sql" + } + + # Check NoClobber and script out the AG + if ($NoClobber.IsPresent -and (Test-Path -Path $outFile -PathType Leaf)) { + Write-Message -Level Warning -Message "OutputFile $outFile already exists. Skipping due to -NoClobber parameter" + } else { + Write-Message -Level Verbose -Message "Scripting Availability Group [$agName] on $instance to $outFile" + + # Create comment block header for AG script + "/*" | Out-File -FilePath $outFile -Encoding ASCII -Force + " * Created by dbatools 'Export-DbaAvailabilityGroup' cmdlet on '$(Get-Date)'" | Out-File -FilePath $outFile -Encoding ASCII -Append + " * See https://dbatools.io/Export-DbaAvailabilityGroup for more help" | Out-File -FilePath $outFile -Encoding ASCII -Append + + # Output AG and listener names + " *" | Out-File -FilePath $outFile -Encoding ASCII -Append + " * Availability Group Name: $($ag.name)" | Out-File -FilePath $outFile -Encoding ASCII -Append + $ag.AvailabilityGroupListeners | ForEach-Object { " * Listener Name: $($_.name)" } | Out-File -FilePath $outFile -Encoding ASCII -Append + + # Output all replicas + " *" | Out-File -FilePath $outFile -Encoding ASCII -Append + $ag.AvailabilityReplicas | ForEach-Object { " * Replica: $($_.name)" } | Out-File -FilePath $outFile -Encoding ASCII -Append + + # Output all databases + " *" | Out-File -FilePath $outFile -Encoding ASCII -Append + $ag.AvailabilityDatabases | ForEach-Object { " * Database: $($_.name)" } | Out-File -FilePath $outFile -Encoding ASCII -Append + + # $ag | Select-Object -Property * | Out-File -FilePath $outFile -Encoding ASCII -Append + + "*/" | Out-File -FilePath $outFile -Encoding ASCII -Append + + # Script the AG + try { + $ag.Script() | Out-File -FilePath $outFile -Encoding ASCII -Append + Get-ChildItem $outFile + } catch { + Stop-Function -ErrorRecord $_ -Message "Error scripting out the availability groups. This is likely due to a bug in SMO." -Continue + } + } + } + } else { + Write-Message -Level Output -Message "No Availability Groups detected on $instance" + } + } + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function Export-DbaCmsRegServer { + <# + .SYNOPSIS + Exports registered servers and registered server groups to file + + .DESCRIPTION + Exports registered servers and registered server groups to file + + .PARAMETER SqlInstance + The target SQL Server instance or instances. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER CredentialPersistenceType + Used to specify how the login and passwords are persisted. Valid values include None, PersistLoginName and PersistLoginNameAndPassword. + + .PARAMETER Path + The path to the exported file. If no path is specified, one will be created. + + .PARAMETER InputObject + Enables piping from Get-DbaCmsRegServer, Get-DbaCmsRegServerGroup, CSVs and other objects. + + If importing from CSV or other object, a column named ServerName is required. Optional columns include Name, Description and Group. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: RegisteredServer, CMS + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Export-DbaCmsRegServer + + .EXAMPLE + PS C:\> Export-DbaCmsRegServer -SqlInstance sql2008 + + Exports all Registered Server and Registered Server Groups on sql2008 to an automatically generated file name in the current directory + + .EXAMPLE + PS C:\> Get-DbaCmsRegServer -SqlInstance sql2008, sql2012 | Export-DbaCmsRegServer + + Exports all registered servers on sql2008 and sql2012. Warning - each one will have its own individual file. Consider piping groups. + + .EXAMPLE + PS C:\> Get-DbaCmsRegServerGroup -SqlInstance sql2008, sql2012 | Export-DbaCmsRegServer + + Exports all registered servers on sql2008 and sql2012, organized by group. + + #> + [CmdletBinding()] + [Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSAvoidUsingPlainTextForPassword", "", Justification = "For Parameter CredentialPersistenceType")] + param ( + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [parameter(ValueFromPipeline)] + [object[]]$InputObject, + [string]$Path, + [ValidateSet("None", "PersistLoginName", "PersistLoginNameAndPassword")] + [string]$CredentialPersistenceType = "None", + [switch]$EnableException + ) + begin { + if ((Test-Bound -ParameterName Path)) { + if ($Path -notmatch '\\') { + $Path = ".\$Path" + } + + $directory = Split-Path $Path + if (-not (Test-Path $directory)) { + New-Item -Path $directory -ItemType Directory + } + } else { + $timeNow = (Get-Date -uformat "%m%d%Y%H%M%S") + } + } + process { + foreach ($instance in $SqlInstance) { + $InputObject += Get-DbaCmsRegServerGroup -SqlInstance $instance -SqlCredential $SqlCredential -Id 1 + } + + foreach ($object in $InputObject) { + try { + if ($object -is [Microsoft.SqlServer.Management.RegisteredServers.RegisteredServersStore]) { + $object = Get-DbaCmsRegServerGroup -SqlInstance $object.ServerConnection.SqlConnectionObject -Id 1 + } + + if ($object -is [Microsoft.SqlServer.Management.RegisteredServers.RegisteredServer]) { + if ((Test-Bound -ParameterName Path -Not)) { + $servername = $object.SqlInstance.Replace('\', '$') + $regservername = $object.Name.Replace('\', '$') + $Path = "$serverName-regserver-$regservername-$timeNow.xml" + } + $object.Export($Path, $CredentialPersistenceType) + } elseif ($object -is [Microsoft.SqlServer.Management.RegisteredServers.ServerGroup]) { + if ((Test-Bound -ParameterName Path -Not)) { + $servername = $object.SqlInstance.Replace('\', '$') + $regservergroup = $object.Name.Replace('\', '$') + $Path = "$serverName-reggroup-$regservergroup-$timeNow.xml" + } + $object.Export($Path, $CredentialPersistenceType) + } else { + Stop-Function -Message "InputObject is not a registered server or server group" -Continue + } + Get-ChildItem $Path -ErrorAction Stop + } catch { + Stop-Function -Message "Failure" -ErrorRecord $_ + } + } + } + + end { + Test-DbaDeprecation -DeprecatedOn "1.0.0" -Alias Export-DbaRegisteredServer + } +} +function Export-DbaCredential { + <# + .SYNOPSIS + Exports credentials INCLUDING PASSWORDS, unless specified otherwise, to sql file. + + .DESCRIPTION + Exports credentials INCLUDING PASSWORDS, unless specified otherwise, to sql file. + + Requires remote Windows access if exporting the password. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Credential + Login to the target OS using alternative credentials. Accepts credential objects (Get-Credential) + + .PARAMETER Path + The path to the exported sql file. + + .PARAMETER Identity + The credentials to export. If unspecified, all credentials will be exported. + + .PARAMETER InputObject + Allow credentials to be piped in from Get-DbaCredential + + .PARAMETER ExcludePassword + Exports the SQL credential without any sensitive information. + + .PARAMETER InputObject + Allow credentials to be piped in from Get-DbaCredential + + .PARAMETER Append + Append to Path + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Credential + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .EXAMPLE + PS C:\> Export-DbaCredential -SqlInstance sql2017 -Path C:\temp\cred.sql + + Exports credentials, including passwords, from sql2017 to the file C:\temp\cred.sql + + #> + [CmdletBinding()] + param ( + [Parameter(Mandatory, ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [string[]]$Identity, + [PSCredential]$SqlCredential, + [PSCredential]$Credential, + [string]$Path, + [switch]$ExcludePassword, + [switch]$Append, + [Microsoft.SqlServer.Management.Smo.Credential[]]$InputObject, + [switch]$EnableException + ) + process { + foreach ($instance in $SqlInstance) { + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $sqlcredential -MinimumVersion 9 + $InputObject += $server.Credentials + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + if ($Identity) { + $InputObject = $InputObject | Where-Object Identity -in $Identity + } + + if (!(Test-SqlSa -SqlInstance $instance -SqlCredential $sqlcredential)) { + Stop-Function -Message "Not a sysadmin on $instance. Quitting." -Target $instance -Continue + } + + Write-Message -Level Verbose -Message "Getting NetBios name for $instance." + $sourceNetBios = Resolve-NetBiosName $server + + Write-Message -Level Verbose -Message "Checking if Remote Registry is enabled on $instance." + try { + Invoke-Command2 -Raw -Credential $Credential -ComputerName $sourceNetBios -ScriptBlock { Get-ItemProperty -Path "HKLM:\SOFTWARE\" } -ErrorAction Stop + } catch { + Stop-Function -Message "Can't connect to registry on $instance." -Target $sourceNetBios -ErrorRecord $_ + return + } + + if (-not (Test-Bound -ParameterName Path)) { + $timenow = (Get-Date -uformat "%m%d%Y%H%M%S") + $mydocs = [Environment]::GetFolderPath('MyDocuments') + $path = "$mydocs\$($server.name.replace('\', '$'))-$timenow-credential.sql" + } + + $sql = @() + + if ($ExcludePassword) { + Stop-Function -Message "So sorry, there's no other way around it for now. The password has to be exported in plain text." + return + } else { + try { + $creds = Get-DecryptedObject -SqlInstance $server -Type Credential + } catch { + Stop-Function -Continue -Message "Failure" -ErrorRecord $_ + } + foreach ($currentCred in $creds) { + $name = $currentCred.Name.Replace("'", "''") + $identity = $currentCred.Identity.Replace("'", "''") + $password = $currentCred.Password.Replace("'", "''") + $sql += "CREATE CREDENTIAL $name WITH IDENTITY = N'$identity', SECRET = N'$password'" + } + } + + try { + if ($Append) { + Add-Content -Path $path -Value $sql + } else { + Set-Content -Path $path -Value $sql + } + Get-ChildItem -Path $path + } catch { + Stop-Function -Message "Can't write to $path" -ErrorRecord $_ -Continue + } + + + Write-Message -Level Verbose -Message "Attempting to migrate $credentialName" + Get-ChildItem -Path $path + } + } +} +function Export-DbaDacPackage { + <# + .SYNOPSIS + Exports a dacpac from a server. + + .DESCRIPTION + Using SQLPackage, export a dacpac from an instance of SQL Server. + + Note - Extract from SQL Server is notoriously flaky - for example if you have three part references to external databases it will not work. + + For help with the extract action parameters and properties, refer to https://msdn.microsoft.com/en-us/library/hh550080(v=vs.103).aspx + + .PARAMETER SqlInstance + The target SQL Server instance or instances. + + .PARAMETER SqlCredential + Allows you to login to servers using alternative logins instead Integrated, accepts Credential object created by Get-Credential + + .PARAMETER Path + The directory where the .dacpac files will be exported to. Defaults to documents. + + .PARAMETER Database + The database(s) to process - this list is auto-populated from the server. If unspecified, all databases will be processed. + + .PARAMETER ExcludeDatabase + The database(s) to exclude - this list is auto-populated from the server + + .PARAMETER AllUserDatabases + Run command against all user databases + + .PARAMETER Type + Selecting the type of the export: Dacpac (default) or Bacpac. + + .PARAMETER Table + List of the tables to include into the export. Should be provided as an array of strings: dbo.Table1, Table2, Schema1.Table3. + + .PARAMETER DacOption + Export options for a corresponding export type. Can be created by New-DbaDacOption -Type Dacpac | Bacpac + + .PARAMETER ExtendedParameters + Optional parameters used to extract the DACPAC. More information can be found at + https://msdn.microsoft.com/en-us/library/hh550080.aspx + + .PARAMETER ExtendedProperties + Optional properties used to extract the DACPAC. More information can be found at + https://msdn.microsoft.com/en-us/library/hh550080.aspx + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Migration, Database, Dacpac + Author: Richie lee (@richiebzzzt) + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Export-DbaDacPackage + + .EXAMPLE + PS C:\> Export-DbaDacPackage -SqlInstance sql2016 -Database SharePoint_Config + + Exports the dacpac for SharePoint_Config on sql2016 to $home\Documents\SharePoint_Config.dacpac + + .EXAMPLE + PS C:\> $options = New-DbaDacOption -Type Dacpac -Action Export + PS C:\> $options.ExtractAllTableData = $true + PS C:\> $options.CommandTimeout = 0 + PS C:\> Export-DbaDacPackage -SqlInstance sql2016 -Database DB1 -Options $options + + Uses DacOption object to set the CommandTimeout to 0 then extracts the dacpac for DB1 on sql2016 to $home\Documents\DB1.dacpac including all table data. + + .EXAMPLE + PS C:\> Export-DbaDacPackage -SqlInstance sql2016 -AllUserDatabases -ExcludeDatabase "DBMaintenance","DBMonitoring" -Path "C:\temp" + Exports dacpac packages for all USER databases, excluding "DBMaintenance" & "DBMonitoring", on sql2016 and saves them to C:\temp + + .EXAMPLE + PS C:\> $moreparams = "/OverwriteFiles:$true /Quiet:$true" + PS C:\> Export-DbaDacPackage -SqlInstance sql2016 -Database SharePoint_Config -Path C:\temp -ExtendedParameters $moreparams + + Using extended parameters to over-write the files and performs the extraction in quiet mode. Uses command line instead of SMO behind the scenes. + #> + [CmdletBinding(DefaultParameterSetName = 'SMO')] + param + ( + [parameter(Mandatory, ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer")] + [DbaInstance[]]$SqlInstance, + [Alias("Credential")] + [PSCredential]$SqlCredential, + [object[]]$Database, + [object[]]$ExcludeDatabase, + [switch]$AllUserDatabases, + [string]$Path = "$home\Documents", + [parameter(ParameterSetName = 'SMO')] + [Alias('ExtractOptions', 'ExportOptions', 'DacExtractOptions', 'DacExportOptions', 'Options', 'Option')] + [object]$DacOption, + [parameter(ParameterSetName = 'CMD')] + [string]$ExtendedParameters, + [parameter(ParameterSetName = 'CMD')] + [string]$ExtendedProperties, + [ValidateSet('Dacpac', 'Bacpac')] + [string]$Type = 'Dacpac', + [parameter(ParameterSetName = 'SMO')] + [string[]]$Table, + [switch]$EnableException + ) + + process { + if ((Test-Bound -Not -ParameterName Database) -and (Test-Bound -Not -ParameterName ExcludeDatabase) -and (Test-Bound -Not -ParameterName AllUserDatabases)) { + Stop-Function -Message "You must specify databases to execute against using either -Database, -ExcludeDatabase or -AllUserDatabases" + return + } + + if (-not (Test-Path $Path)) { + Write-Message -Level Verbose "Assuming that $Path is a file path" + $parentFolder = Split-Path $path -Parent + if (-not (Test-Path $parentFolder)) { + Stop-Function -Message "$parentFolder doesn't exist or access denied" + return + } + $leaf = Split-Path $path -Leaf + $fileName = Join-Path (Get-Item $parentFolder) $leaf + } else { + $fileItem = Get-Item $Path + if ($fileItem -is [System.IO.DirectoryInfo]) { + $parentFolder = $fileItem.FullName + } elseif ($fileItem -is [System.IO.FileInfo]) { + $fileName = $fileItem.FullName + } + } + + if (-not $script:core) { + $dacfxPath = Resolve-Path -Path "$script:PSModuleRoot\bin\smo\Microsoft.SqlServer.Dac.dll" + + if ((Test-Path $dacfxPath) -eq $false) { + Stop-Function -Message 'Dac Fx library not found.' -EnableException $EnableException + return + } else { + try { + Add-Type -Path $dacfxPath + Write-Message -Level Verbose -Message "Dac Fx loaded." + } catch { + Stop-Function -Message 'No usable version of Dac Fx found.' -ErrorRecord $_ + return + } + } + } + + #check that at least one of the DB selection parameters was specified + if (!$AllUserDatabases -and !$Database) { + Stop-Function -Message "Either -Database or -AllUserDatabases should be specified" -Continue + } + #Check Option object types - should have a specific type + if ($Type -eq 'Dacpac') { + if ($DacOption -and $DacOption -isnot [Microsoft.SqlServer.Dac.DacExtractOptions]) { + Stop-Function -Message "Microsoft.SqlServer.Dac.DacExtractOptions object type is expected - got $($DacOption.GetType())." + return + } + } elseif ($Type -eq 'Bacpac') { + if ($DacOption -and $DacOption -isnot [Microsoft.SqlServer.Dac.DacExportOptions]) { + Stop-Function -Message "Microsoft.SqlServer.Dac.DacExportOptions object type is expected - got $($DacOption.GetType())." + return + } + } + + #Create a tuple to be used as a table filter + if ($Table) { + $tblList = New-Object 'System.Collections.Generic.List[Tuple[String, String]]' + foreach ($tableItem in $Table) { + $tableSplit = $tableItem.Split('.') + if ($tableSplit.Count -gt 1) { + $tblName = $tableSplit[-1] + $schemaName = $tableSplit[-2] + } else { + $tblName = [string]$tableSplit + $schemaName = 'dbo' + } + $tblList.Add((New-Object "tuple[String, String]" -ArgumentList $schemaName, $tblName)) + } + } else { + $tblList = $null + } + + foreach ($instance in $sqlinstance) { + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $sqlcredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + $cleaninstance = $instance.ToString().Replace('\', '-') + if ($Database) { + $dbs = Get-DbaDatabase -SqlInstance $server -OnlyAccessible -Database $Database -ExcludeDatabase $ExcludeDatabase + } else { + # all user databases by default + $dbs = Get-DbaDatabase -SqlInstance $server -OnlyAccessible -ExcludeSystem -ExcludeDatabase $ExcludeDatabase + } + if (-not $dbs) { + Stop-Function -Message "Databases not found on $instance" -Target $instance -Continue + } + + foreach ($db in $dbs) { + $resultstime = [diagnostics.stopwatch]::StartNew() + $dbname = $db.name + $connstring = $server.ConnectionContext.ConnectionString + if ($connstring -notmatch 'Database=') { + $connstring = "$connstring;Database=$dbname" + } + if ($fileName) { + $currentFileName = $fileName + } else { + if ($Type -eq 'Dacpac') { $ext = 'dacpac' } + elseif ($Type -eq 'Bacpac') { $ext = 'bacpac' } + $currentFileName = Join-Path $parentFolder "$cleaninstance-$dbname.$ext" + } + Write-Message -Level Verbose -Message "Using connection string $connstring" + + #using SMO by default + if ($PsCmdlet.ParameterSetName -eq 'SMO') { + try { + $dacSvc = New-Object -TypeName Microsoft.SqlServer.Dac.DacServices -ArgumentList $connstring -ErrorAction Stop + } catch { + Stop-Function -Message "Could not connect to the connection string $connstring" -Target $instance -Continue + } + if (!$DacOption) { + $opts = New-DbaDacOption -Type $Type -Action Export + } else { + $opts = $DacOption + } + + $null = $output = Register-ObjectEvent -InputObject $dacSvc -EventName "Message" -SourceIdentifier "msg" -Action { $EventArgs.Message.Message } + + if ($Type -eq 'Dacpac') { + Write-Message -Level Verbose -Message "Initiating Dacpac extract to $currentFileName" + #not sure how to extract that info from the existing DAC application, leaving 1.0.0.0 for now + $version = New-Object System.Version -ArgumentList '1.0.0.0' + try { + $dacSvc.Extract($currentFileName, $dbname, $dbname, $version, $null, $tblList, $opts, $null) + } catch { + Stop-Function -Message "DacServices extraction failure" -ErrorRecord $_ -Continue + } finally { + Unregister-Event -SourceIdentifier "msg" + } + } elseif ($Type -eq 'Bacpac') { + Write-Message -Level Verbose -Message "Initiating Bacpac export to $currentFileName" + try { + $dacSvc.ExportBacpac($currentFileName, $dbname, $opts, $tblList, $null) + } catch { + Stop-Function -Message "DacServices export failure" -ErrorRecord $_ -Continue + } finally { + Unregister-Event -SourceIdentifier "msg" + } + } + $finalResult = ($output.output -join "`r`n" | Out-String).Trim() + } elseif ($PsCmdlet.ParameterSetName -eq 'CMD') { + if ($Type -eq 'Dacpac') { $action = 'Extract' } + elseif ($Type -eq 'Bacpac') { $action = 'Export' } + $cmdConnString = $connstring.Replace('"', "'") + + $sqlPackageArgs = "/action:$action /tf:""$currentFileName"" /SourceConnectionString:""$cmdConnString"" $ExtendedParameters $ExtendedProperties" + + try { + $startprocess = New-Object System.Diagnostics.ProcessStartInfo + $startprocess.FileName = "$script:PSModuleRoot\bin\smo\sqlpackage.exe" + $startprocess.Arguments = $sqlPackageArgs + $startprocess.RedirectStandardError = $true + $startprocess.RedirectStandardOutput = $true + $startprocess.UseShellExecute = $false + $startprocess.CreateNoWindow = $true + $process = New-Object System.Diagnostics.Process + $process.StartInfo = $startprocess + $process.Start() | Out-Null + $stdout = $process.StandardOutput.ReadToEnd() + $stderr = $process.StandardError.ReadToEnd() + $process.WaitForExit() + Write-Message -level Verbose -Message "StandardOutput: $stdout" + $finalResult = $stdout + } catch { + Stop-Function -Message "SQLPackage Failure" -ErrorRecord $_ -Continue + } + + if ($process.ExitCode -ne 0) { + Stop-Function -Message "Standard output - $stderr" -Continue + } + } + [pscustomobject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + Database = $dbname + Path = $currentFileName + Elapsed = [prettytimespan]($resultstime.Elapsed) + Result = $finalResult + } | Select-DefaultView -ExcludeProperty ComputerName, InstanceName + } + } + } + end { + Test-DbaDeprecation -DeprecatedOn "1.0.0" -EnableException:$false -Alias Export-DbaDacpac + } +} +function Export-DbaDiagnosticQuery { + <# + .SYNOPSIS + Export-DbaDiagnosticQuery can convert output generated by Invoke-DbaDiagnosticQuery to CSV or Excel + + .DESCRIPTION + The default output format of Invoke-DbaDiagnosticQuery is a custom object. It can also output to CSV and Excel. + However, CSV output can generate a lot of files and Excel output depends on the ImportExcel module by Doug Finke (https://github.com/dfinke/ImportExcel) + Export-DbaDiagnosticQuery can be used to convert from the default export type to the other available export types. + + .PARAMETER InputObject + Specifies the objects to convert + + .PARAMETER ConvertTo + Specifies the output type. Valid choices are Excel and CSV. CSV is the default. + + .PARAMETER Path + Specifies the path to the output files. + + .PARAMETER Suffix + Suffix for the filename. It's datetime by default. + + .PARAMETER NoPlanExport + Use this switch to suppress exporting of .sqlplan files + + .PARAMETER NoQueryExport + Use this switch to suppress exporting of .sql files + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Query + Author: Andre Kamman (@AndreKamman), http://clouddba.io + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Export-DbaDiagnosticQuery + + .EXAMPLE + PS C:\> Invoke-DbaDiagnosticQuery -SqlInstance sql2016 | Export-DbaDiagnosticQuery -Path c:\temp + + Converts output from Invoke-DbaDiagnosticQuery to multiple CSV files + + .EXAMPLE + PS C:\> $output = Invoke-DbaDiagnosticQuery -SqlInstance sql2016 + PS C:\> Export-DbaDiagnosticQuery -InputObject $output -ConvertTo Excel + + Converts output from Invoke-DbaDiagnosticQuery to Excel worksheet(s) in the Documents folder + + #> + [CmdletBinding()] + param ( + [parameter(Mandatory, ValueFromPipeline)] + [object[]]$InputObject, + [ValidateSet("Excel", "Csv")] + [string]$ConvertTo = "Csv", + [System.IO.FileInfo]$Path = [Environment]::GetFolderPath("mydocuments"), + [string]$Suffix = "$(Get-Date -format 'yyyyMMddHHmmssms')", + [switch]$NoPlanExport, + [switch]$NoQueryExport, + [Alias('Silent')] + [switch]$EnableException + ) + + begin { + if ($ConvertTo -eq "Excel") { + try { + Import-Module ImportExcel -ErrorAction Stop + } catch { + $message = "Failed to load module, exporting to Excel feature is not available + Install the module from: https://github.com/dfinke/ImportExcel + Valid alternative conversion format is csv" + Stop-Function -Message $message + return + } + } + + if (!$(Test-Path $Path)) { + try { + New-Item $Path -ItemType Directory -ErrorAction Stop | Out-Null + Write-Message -Level Output -Message "Created directory $Path" + } catch { + Stop-Function -Message "Failed to create directory $Path" -Continue + } + } + } + + process { + if (Test-FunctionInterrupt) { return } + + foreach ($row in $InputObject) { + $result = $row.Result + $name = $row.Name + $SqlInstance = $row.SqlInstance.Replace("\", "$") + $dbname = $row.Database + $number = $row.Number + + if ($null -eq $result) { + Stop-Function -Message "Result was empty for $name" -Target $result -Continue + } + + $queryname = Remove-InvalidFileNameChars -Name $Name + $excelfilename = "$Path\$SqlInstance-DQ-$Suffix.xlsx" + $exceldbfilename = "$Path\$SqlInstance-DQ-$dbname-$Suffix.xlsx" + $csvdbfilename = "$Path\$SqlInstance-$dbname-DQ-$number-$queryname-$Suffix.csv" + $csvfilename = "$Path\$SqlInstance-DQ-$number-$queryname-$Suffix.csv" + + $columnnameoptions = "Query Plan", "QueryPlan", "Query_Plan", "query_plan_xml" + if (($result | Get-Member | Where-Object Name -in $columnnameoptions).Count -gt 0) { + $plannr = 0 + $columnname = ($result | Get-Member | Where-Object Name -In $columnnameoptions).Name + foreach ($plan in $result."$columnname") { + $plannr += 1 + if ($row.DatabaseSpecific) { + $planfilename = "$Path\$SqlInstance-$dbname-DQ-$number-$queryname-$plannr-$Suffix.sqlplan" + } else { + $planfilename = "$Path\$SqlInstance-DQ-$number-$queryname-$plannr-$Suffix.sqlplan" + } + + if (!$NoPlanExport) { + Write-Message -Level Output -Message "Exporting $planfilename" + if ($plan) {$plan | Out-File -FilePath $planfilename} + } + } + + $result = $result | Select-Object * -ExcludeProperty "$columnname" + } + + $columnnameoptions = "Complete Query Text", "QueryText", "Query Text", "Query_Text", "query_sql_text" + if (($result | Get-Member | Where-Object Name -In $columnnameoptions ).Count -gt 0) { + $sqlnr = 0 + $columnname = ($result | Get-Member | Where-Object Name -In $columnnameoptions).Name + foreach ($sql in $result."$columnname") { + $sqlnr += 1 + if ($row.DatabaseSpecific) { + $sqlfilename = "$Path\$SqlInstance-$dbname-DQ-$number-$queryname-$sqlnr-$Suffix.sql" + } else { + $sqlfilename = "$Path\$SqlInstance-DQ-$number-$queryname-$sqlnr-$Suffix.sql" + } + + if (!$NoQueryExport) { + Write-Message -Level Output -Message "Exporting $sqlfilename" + if ($sql) {$sql | Out-File -FilePath $sqlfilename} + } + } + + $result = $result | Select-Object * -ExcludeProperty "$columnname" + } + + switch ($ConvertTo) { + "Excel" { + if ($row.DatabaseSpecific) { + Write-Message -Level Output -Message "Exporting $exceldbfilename" + $result | Export-Excel -Path $exceldbfilename -WorkSheetname $Name -AutoSize -AutoFilter -BoldTopRow -FreezeTopRow + } else { + Write-Message -Level Output -Message "Exporting $excelfilename" + $result | Export-Excel -Path $excelfilename -WorkSheetname $Name -AutoSize -AutoFilter -BoldTopRow -FreezeTopRow + } + } + "csv" { + if ($row.DatabaseSpecific) { + Write-Message -Level Output -Message "Exporting $csvdbfilename" + $result | Export-Csv -Path $csvdbfilename -NoTypeInformation -Append + } else { + Write-Message -Level Output -Message "Exporting $csvfilename" + $result | Export-Csv -Path $csvfilename -NoTypeInformation -Append + } + } + } + } + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function Export-DbaExecutionPlan { + <# + .SYNOPSIS + Exports execution plans to disk. + + .DESCRIPTION + Exports execution plans to disk. Can pipe from Get-DbaExecutionPlan + + Thanks to + https://www.simple-talk.com/sql/t-sql-programming/dmvs-for-query-plan-metadata/ + and + http://www.scarydba.com/2017/02/13/export-plans-cache-sqlplan-file/ + for the idea and query. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. + + .PARAMETER SqlCredential + Credential object used to connect to the SQL Server as a different user + + .PARAMETER Database + The database(s) to process - this list is auto-populated from the server. If unspecified, all databases will be processed. + + .PARAMETER ExcludeDatabase + The database(s) to exclude - this list is auto-populated from the server + + .PARAMETER SinceCreation + Datetime object used to narrow the results to a date + + .PARAMETER SinceLastExecution + Datetime object used to narrow the results to a date + + .PARAMETER Path + The directory where all of the sqlxml files will be exported + + .PARAMETER WhatIf + Shows what would happen if the command were to run. No actions are actually performed. + + .PARAMETER Confirm + Prompts you for confirmation before executing any changing operations within the command. + + .PARAMETER PipedObject + Internal parameter + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Performance, ExecutionPlan + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Export-DbaExecutionPlan + + .EXAMPLE + PS C:\> Export-DbaExecutionPlan -SqlInstance sqlserver2014a -Path C:\Temp + + Exports all execution plans for sqlserver2014a. Files saved in to C:\Temp + + .EXAMPLE + PS C:\> Export-DbaExecutionPlan -SqlInstance sqlserver2014a -Database db1, db2 -SinceLastExecution '2016-07-01 10:47:00' -Path C:\Temp + + Exports all execution plans for databases db1 and db2 on sqlserver2014a since July 1, 2016 at 10:47 AM. Files saved in to C:\Temp + + .EXAMPLE + PS C:\> Get-DbaExecutionPlan -SqlInstance sqlserver2014a | Export-DbaExecutionPlan -Path C:\Temp + + Gets all execution plans for sqlserver2014a. Using Pipeline exports them all to C:\Temp + + .EXAMPLE + PS C:\> Get-DbaExecutionPlan -SqlInstance sqlserver2014a | Export-DbaExecutionPlan -Path C:\Temp -WhatIf + + Gets all execution plans for sqlserver2014a. Then shows what would happen if the results where piped to Export-DbaExecutionPlan + + #> + [cmdletbinding(SupportsShouldProcess, DefaultParameterSetName = "Default")] + param ( + [parameter(ParameterSetName = 'NotPiped', Mandatory)] + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [parameter(ParameterSetName = 'NotPiped')] + [PSCredential]$SqlCredential, + [Alias("Databases")] + [object[]]$Database, + [object[]]$ExcludeDatabase, + [parameter(ParameterSetName = 'Piped', Mandatory)] + [parameter(ParameterSetName = 'NotPiped', Mandatory)] + [string]$Path, + [parameter(ParameterSetName = 'NotPiped')] + [datetime]$SinceCreation, + [parameter(ParameterSetName = 'NotPiped')] + [datetime]$SinceLastExecution, + [Parameter(ParameterSetName = 'Piped', Mandatory, ValueFromPipeline)] + [object[]]$PipedObject, + [Alias('Silent')] + [switch]$EnableException + ) + + begin { + + function Export-Plan { + param( + [object]$object + ) + $instanceName = $object.SqlInstance + $dbName = $object.DatabaseName + $queryPosition = $object.QueryPosition + $sqlHandle = "0x"; $object.SqlHandle | ForEach-Object { $sqlHandle += ("{0:X}" -f $_).PadLeft(2, "0") } + $sqlHandle = $sqlHandle.TrimStart('0x02000000').TrimEnd('0000000000000000000000000000000000000000') + $shortName = "$instanceName-$dbName-$queryPosition-$sqlHandle" + + foreach ($queryPlan in $object.BatchQueryPlanRaw) { + $fileName = "$path\$shortName-batch.sqlplan" + + try { + if ($Pscmdlet.ShouldProcess("localhost", "Writing XML file to $fileName")) { + $queryPlan.Save($fileName) + } + } catch { + Stop-Function -Message "Skipped query plan for $fileName because it is null." -Target $fileName -ErrorRecord $_ -Continue + } + } + + foreach ($statementPlan in $object.SingleStatementPlanRaw) { + $fileName = "$path\$shortName.sqlplan" + + try { + if ($Pscmdlet.ShouldProcess("localhost", "Writing XML file to $fileName")) { + $statementPlan.Save($fileName) + } + } catch { + Stop-Function -Message "Skipped statement plan for $fileName because it is null." -Target $fileName -ErrorRecord $_ -Continue + } + } + + if ($Pscmdlet.ShouldProcess("console", "Showing output object")) { + Add-Member -Force -InputObject $object -MemberType NoteProperty -Name OutputFile -Value $fileName + Select-DefaultView -InputObject $object -Property ComputerName, InstanceName, SqlInstance, DatabaseName, SqlHandle, CreationTime, LastExecutionTime, OutputFile + } + } + } + + process { + if (!(Test-Path $Path)) { + $null = New-Item -ItemType Directory -Path $Path + } + + if ($PipedObject) { + foreach ($object in $pipedobject) { + Export-Plan $object + return + } + } + + foreach ($instance in $SqlInstance) { + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential -MinimumVersion 9 + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + $select = "SELECT DB_NAME(deqp.dbid) as DatabaseName, OBJECT_NAME(deqp.objectid) as ObjectName, + detqp.query_plan AS SingleStatementPlan, + deqp.query_plan AS BatchQueryPlan, + ROW_NUMBER() OVER ( ORDER BY Statement_Start_offset ) AS QueryPosition, + sql_handle as SqlHandle, + plan_handle as PlanHandle, + creation_time as CreationTime, + last_execution_time as LastExecutionTime" + + $from = " FROM sys.dm_exec_query_stats deqs + CROSS APPLY sys.dm_exec_text_query_plan(deqs.plan_handle, + deqs.statement_start_offset, + deqs.statement_end_offset) AS detqp + CROSS APPLY sys.dm_exec_query_plan(deqs.plan_handle) AS deqp + CROSS APPLY sys.dm_exec_sql_text(deqs.plan_handle) AS execText" + + if ($ExcludeDatabase -or $Database -or $SinceCreation -or $SinceLastExecution -or $ExcludeEmptyQueryPlan -eq $true) { + $where = " WHERE " + } + + $whereArray = @() + + if ($Database -gt 0) { + $dbList = $Database -join "','" + $whereArray += " DB_NAME(deqp.dbid) in ('$dbList') " + } + + if (Test-Bound 'SinceCreation') { + Write-Message -Level Verbose -Message "Adding creation time" + $whereArray += " creation_time >= '" + $SinceCreation.ToString("yyyy-MM-dd HH:mm:ss") + "' " + } + + if (Test-Bound 'SinceLastExecution') { + Write-Message -Level Verbose -Message "Adding last execution time" + $whereArray += " last_execution_time >= '" + $SinceLastExecution.ToString("yyyy-MM-dd HH:mm:ss") + "' " + } + + if (Test-Bound 'ExcludeDatabase') { + $dbList = $ExcludeDatabase -join "','" + $whereArray += " DB_NAME(deqp.dbid) not in ('$dbList') " + } + + if (Test-Bound 'ExcludeEmptyQueryPlan') { + $whereArray += " detqp.query_plan is not null" + } + + if ($where.Length -gt 0) { + $whereArray = $whereArray -join " and " + $where = "$where $whereArray" + } + + $sql = "$select $from $where" + Write-Message -Level Debug -Message "SQL Statement: $sql" + try { + $dataTable = $server.ConnectionContext.ExecuteWithResults($sql).Tables + } catch { + Stop-Function -Message "Issue collecting execution plans" -Target $instance -ErroRecord $_ -Continue + } + + foreach ($row in ($dataTable.Rows)) { + $sqlHandle = "0x"; $row.sqlhandle | ForEach-Object { $sqlHandle += ("{0:X}" -f $_).PadLeft(2, "0") } + $planhandle = "0x"; $row.planhandle | ForEach-Object { $planhandle += ("{0:X}" -f $_).PadLeft(2, "0") } + + $object = [pscustomobject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + DatabaseName = $row.DatabaseName + SqlHandle = $sqlHandle + PlanHandle = $planhandle + SingleStatementPlan = $row.SingleStatementPlan + BatchQueryPlan = $row.BatchQueryPlan + QueryPosition = $row.QueryPosition + CreationTime = $row.CreationTime + LastExecutionTime = $row.LastExecutionTime + BatchQueryPlanRaw = [xml]$row.BatchQueryPlan + SingleStatementPlanRaw = [xml]$row.SingleStatementPlan + } + Export-Plan $object + } + } + } +} +function Export-DbaInstance { + <# + .SYNOPSIS + Exports SQL Server *ALL* database restore scripts, logins, database mail profiles/accounts, credentials, SQL Agent objects, linked servers, + Central Management Server objects, server configuration settings (sp_configure), user objects in systems databases, + system triggers and backup devices from one SQL Server to another. + + For more granular control, please use one of the -Exclude parameters and use the other functions available within the dbatools module. + + .DESCRIPTION + Export-DbaInstance consolidates most of the export scripts in dbatools into one command. + + This is useful when you're looking to Export entire instances. It less flexible than using the underlying functions. + Think of it as an easy button. Unless an -Exclude is specified, it exports: + + All database restore scripts. + All logins. + All database mail objects. + All credentials. + All objects within the Job Server (SQL Agent). + All linked servers. + All groups and servers within Central Management Server. + All SQL Server configuration objects (everything in sp_configure). + All user objects in system databases. + All system triggers. + All system backup devices. + All Audits. + All Endpoints. + All Extended Events. + All Policy Management objects. + All Resource Governor objects. + All Server Audit Specifications. + All Custom Errors (User Defined Messages). + All Server Roles. + All Availability Groups. + + .PARAMETER SqlInstance + The target SQL Server instances + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Credential + Alternative Windows credentials for exporting Linked Servers and Credentials. Accepts credential objects (Get-Credential) + + .PARAMETER Path + The path to the export file + + .PARAMETER SharedPath + Specifies the network location for the backup files. The SQL Server service accounts on both Source and Destination must have read/write permission to access this location. + + .PARAMETER WithReplace + If this switch is used, databases are restored from backup using WITH REPLACE. This is useful if you want to stage some complex file paths. + + .PARAMETER NoRecovery + If this switch is used, databases will be left in the No Recovery state to enable further backups to be added. + + .PARAMETER IncludeDbMasterKey + Exports the db master key then logs into the server to copy it to the $Path + + .PARAMETER Exclude + Exclude one or more objects to export + + Databases + Logins + AgentServer + Credentials + LinkedServers + SpConfigure + CentralManagementServer + DatabaseMail + SysDbUserObjects + SystemTriggers + BackupDevices + Audits + Endpoints + ExtendedEvents + PolicyManagement + ResourceGovernor + ServerAuditSpecifications + CustomErrors + ServerRoles + AvailabilityGroups + ReplicationSettings + + .PARAMETER BatchSeparator + Batch separator for scripting output. "GO" by default. + + .PARAMETER ScriptingOption + Add scripting options to scripting output for all objects except Registered Servers and Extended Events. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Export + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Export-DbaInstance + + .EXAMPLE + PS C:\> Export-DbaInstance -SqlInstance sqlserver\instance + + All databases, logins, job objects and sp_configure options will be exported from + sqlserver\instance to an automatically generated folder name in Documents. + + .EXAMPLE + PS C:\> Export-DbaInstance -SqlInstance sqlcluster -Exclude Databases, Logins -Path C:\dr\sqlcluster + + Exports everything but logins and database restore scripts to C:\dr\sqlcluster + + #> + [CmdletBinding()] + param ( + [parameter(Mandatory, ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [PSCredential]$Credential, + [string]$Path, + [switch]$NoRecovery, + [switch]$IncludeDbMasterKey, + [ValidateSet('Databases', 'Logins', 'AgentServer', 'Credentials', 'LinkedServers', 'SpConfigure', 'CentralManagementServer', 'DatabaseMail', 'SysDbUserObjects', 'SystemTriggers', 'BackupDevices', 'Audits', 'Endpoints', 'ExtendedEvents', 'PolicyManagement', 'ResourceGovernor', 'ServerAuditSpecifications', 'CustomErrors', 'ServerRoles', 'AvailabilityGroups', 'ReplicationSettings')] + [string[]]$Exclude, + [string]$BatchSeparator = 'GO', + [Microsoft.SqlServer.Management.Smo.ScriptingOptions]$ScriptingOption, + [switch]$EnableException + ) + begin { + if ((Test-Bound -ParameterName Path)) { + if (-not ((Get-Item $Path -ErrorAction Ignore) -is [System.IO.DirectoryInfo])) { + Stop-Function -Message "Path must be a directory" + } + } + + if (-not $ScriptingOption) { + $ScriptingOption = New-DbaScriptingOption + } + + $elapsed = [System.Diagnostics.Stopwatch]::StartNew() + $started = Get-Date + + $ScriptingOptions = New-Object Microsoft.SqlServer.Management.Smo.ScriptingOptions + $ScriptingOptions.ScriptBatchTerminator = $true + + } + process { + if (Test-FunctionInterrupt) { return } + foreach ($instance in $SqlInstance) { + $stepCounter = $filecounter = 0 + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $sqlcredential -MinimumVersion 10 + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + if (-not (Test-Bound -ParameterName Path)) { + $timenow = (Get-Date -uformat "%m%d%Y%H%M%S") + $mydocs = [Environment]::GetFolderPath('MyDocuments') + $path = "$mydocs\$($server.name.replace('\', '$'))-$timenow" + } + + if (-not (Test-Path $Path)) { + try { + $null = New-Item -ItemType Directory -Path $Path -ErrorAction Stop + } catch { + Stop-Function -Message "Failure" -ErrorRecord $_ + return + } + } + + if ($Exclude -notcontains 'SpConfigure') { + $fileCounter++ + Write-Message -Level Verbose -Message "Exporting SQL Server Configuration" + Write-ProgressHelper -StepNumber ($stepCounter++) -Message "Exporting SQL Server Configuration" + Export-DbaSpConfigure -SqlInstance $server -Path "$Path\$fileCounter-sp_configure.sql" + if (-not (Test-Path "$Path\$fileCounter-sp_configure.sql")) { + $fileCounter-- + } + } + + if ($Exclude -notcontains 'CustomErrors') { + $fileCounter++ + Write-Message -Level Verbose -Message "Exporting custom errors (user defined messages)" + Write-ProgressHelper -StepNumber ($stepCounter++) -Message "Exporting custom errors (user defined messages)" + $null = Get-DbaCustomError -SqlInstance $server | Export-DbaScript -Path "$Path\$fileCounter-customererrors.sql" -Append -BatchSeparator $BatchSeparator -ScriptingOptionsObject $ScriptingOption + Get-ChildItem -ErrorAction Ignore -Path "$Path\$fileCounter-customererrors.sql" + if (-not (Test-Path "$Path\$fileCounter-customererrors.sql")) { + $fileCounter-- + } + } + + if ($Exclude -notcontains 'ServerRoles') { + $fileCounter++ + Write-Message -Level Verbose -Message "Exporting server roles" + Write-ProgressHelper -StepNumber ($stepCounter++) -Message "Exporting server roles" + $null = Get-DbaServerRole -SqlInstance $server | Export-DbaScript -Path "$Path\$fileCounter-serverroles.sql" -Append -BatchSeparator $BatchSeparator -ScriptingOptionsObject $ScriptingOption + Get-ChildItem -ErrorAction Ignore -Path "$Path\$fileCounter-serverroles.sql" + if (-not (Test-Path "$Path\$fileCounter-serverroles.sql")) { + $fileCounter-- + } + } + + if ($Exclude -notcontains 'Credentials') { + $fileCounter++ + Write-Message -Level Verbose -Message "Exporting SQL credentials" + Write-ProgressHelper -StepNumber ($stepCounter++) -Message "Exporting SQL credentials" + $null = Export-DbaCredential -SqlInstance $server -Credential $Credential -Path "$Path\$fileCounter-credentials.sql" -Append + Get-ChildItem -ErrorAction Ignore -Path "$Path\$fileCounter-credentials.sql" + if (-not (Test-Path "$Path\$fileCounter-credentials.sql")) { + $fileCounter-- + } + } + + if ($Exclude -notcontains 'DatabaseMail') { + $fileCounter++ + Write-Message -Level Verbose -Message "Exporting database mail" + Write-ProgressHelper -StepNumber ($stepCounter++) -Message "Exporting database mail" + $null = Get-DbaDbMailConfig -SqlInstance $server | Export-DbaScript -Path "$Path\$fileCounter-dbmail.sql" -Append -BatchSeparator $BatchSeparator -ScriptingOptionsObject $ScriptingOption + $null = Get-DbaDbMailAccount -SqlInstance $server | Export-DbaScript -Path "$Path\$fileCounter-dbmail.sql" -Append -BatchSeparator $BatchSeparator -ScriptingOptionsObject $ScriptingOption + $null = Get-DbaDbMailProfile -SqlInstance $server | Export-DbaScript -Path "$Path\$fileCounter-dbmail.sql" -Append -BatchSeparator $BatchSeparator -ScriptingOptionsObject $ScriptingOption + $null = Get-DbaDbMailServer -SqlInstance $server | Export-DbaScript -Path "$Path\$fileCounter-dbmail.sql" -Append -BatchSeparator $BatchSeparator -ScriptingOptionsObject $ScriptingOption + $null = Get-DbaDbMail -SqlInstance $server | Export-DbaScript -Path "$Path\$fileCounter-dbmail.sql" -Append -BatchSeparator $BatchSeparator -ScriptingOptionsObject $ScriptingOption + Get-ChildItem -ErrorAction Ignore -Path "$Path\$fileCounter-dbmail.sql" + if (-not (Test-Path "$Path\$fileCounter-dbmail.sql")) { + $fileCounter-- + } + } + + if ($Exclude -notcontains 'CentralManagementServer') { + $fileCounter++ + Write-Message -Level Verbose -Message "Exporting Central Management Server" + Write-ProgressHelper -StepNumber ($stepCounter++) -Message "Exporting Central Management Server" + $null = Get-DbaCmsRegServerGroup -SqlInstance $server | Export-DbaScript -Path "$Path\$fileCounter-regserver.sql" -Append -BatchSeparator 'GO' + $null = Get-DbaCmsRegServer -SqlInstance $server | Export-DbaScript -Path "$Path\$fileCounter-regserver.sql" -Append -BatchSeparator 'GO' + Get-ChildItem -ErrorAction Ignore -Path "$Path\$fileCounter-regserver.sql" + if (-not (Test-Path "$Path\$fileCounter-regserver.sql")) { + $fileCounter-- + } + } + + if ($Exclude -notcontains 'BackupDevices') { + $fileCounter++ + Write-Message -Level Verbose -Message "Exporting Backup Devices" + Write-ProgressHelper -StepNumber ($stepCounter++) -Message "Exporting Backup Devices" + $null = Get-DbaBackupDevice -SqlInstance $server | Export-DbaScript -Path "$Path\$fileCounter-backupdevices.sql" -Append -BatchSeparator $BatchSeparator -ScriptingOptionsObject $ScriptingOption + Get-ChildItem -ErrorAction Ignore -Path "$Path\$fileCounter-backupdevices.sql" + if (-not (Test-Path "$Path\$fileCounter-backupdevices.sql")) { + $fileCounter-- + } + } + + if ($Exclude -notcontains 'LinkedServers') { + $fileCounter++ + Write-Message -Level Verbose -Message "Exporting linked servers" + Write-ProgressHelper -StepNumber ($stepCounter++) -Message "Exporting linked servers" + Export-DbaLinkedServer -SqlInstance $server -Path "$Path\$fileCounter-linkedservers.sql" -Credential $Credential -Append + if (-not (Test-Path "$Path\$fileCounter-linkedservers.sql")) { + $fileCounter-- + } + } + + if ($Exclude -notcontains 'SystemTriggers') { + $fileCounter++ + Write-Message -Level Verbose -Message "Exporting System Triggers" + Write-ProgressHelper -StepNumber ($stepCounter++) -Message "Exporting System Triggers" + $null = Get-DbaServerTrigger -SqlInstance $server | Export-DbaScript -Path "$Path\$fileCounter-servertriggers.sql" -Append -BatchSeparator $BatchSeparator -ScriptingOptionsObject $ScriptingOption + $triggers = Get-Content -Path "$Path\$fileCounter-servertriggers.sql" -Raw -ErrorAction Ignore + if ($triggers) { + $triggers = $triggers.ToString() -replace 'CREATE TRIGGER', "GO`r`nCREATE TRIGGER" + $triggers = $triggers.ToString() -replace 'ENABLE TRIGGER', "GO`r`nENABLE TRIGGER" + $null = $triggers | Set-Content -Path "$Path\$fileCounter-servertriggers.sql" -Force + Get-ChildItem -ErrorAction Ignore -Path "$Path\$fileCounter-servertriggers.sql" + } + if (-not (Test-Path "$Path\$fileCounter-servertriggers.sql")) { + $fileCounter-- + } + } + + if ($Exclude -notcontains 'Databases') { + $fileCounter++ + Write-Message -Level Verbose -Message "Exporting database restores" + Write-ProgressHelper -StepNumber ($stepCounter++) -Message "Exporting database restores" + Get-DbaBackupHistory -SqlInstance $server -Last | Restore-DbaDatabase -SqlInstance $server -NoRecovery:$NoRecovery -WithReplace -OutputScriptOnly -WarningAction SilentlyContinue | Out-File -FilePath "$Path\$fileCounter-databases.sql" -Append + Get-ChildItem -ErrorAction Ignore -Path "$Path\$fileCounter-databases.sql" + if (-not (Test-Path "$Path\$fileCounter-databases.sql")) { + $fileCounter-- + } + } + + if ($Exclude -notcontains 'Logins') { + $fileCounter++ + Write-Message -Level Verbose -Message "Exporting logins" + Write-ProgressHelper -StepNumber ($stepCounter++) -Message "Exporting logins" + Export-DbaLogin -SqlInstance $server -Path "$Path\$fileCounter-logins.sql" -Append -WarningAction SilentlyContinue + if (-not (Test-Path "$Path\$fileCounter-logins.sql")) { + $fileCounter-- + } + } + + if ($Exclude -notcontains 'Audits') { + $fileCounter++ + Write-Message -Level Verbose -Message "Exporting Audits" + Write-ProgressHelper -StepNumber ($stepCounter++) -Message "Exporting Audits" + $null = Get-DbaServerAudit -SqlInstance $server | Export-DbaScript -Path "$Path\$fileCounter-audits.sql" -Append -BatchSeparator $BatchSeparator -ScriptingOptionsObject $ScriptingOption + Get-ChildItem -ErrorAction Ignore -Path "$Path\$fileCounter-audits.sql" + if (-not (Test-Path "$Path\$fileCounter-audits.sql")) { + $fileCounter-- + } + } + + if ($Exclude -notcontains 'ServerAuditSpecifications') { + $fileCounter++ + Write-Message -Level Verbose -Message "Exporting Server Audit Specifications" + Write-ProgressHelper -StepNumber ($stepCounter++) -Message "Exporting Server Audit Specifications" + $null = Get-DbaServerAuditSpecification -SqlInstance $server | Export-DbaScript -Path "$Path\$fileCounter-auditspecs.sql" -Append -BatchSeparator $BatchSeparator -ScriptingOptionsObject $ScriptingOption + Get-ChildItem -ErrorAction Ignore -Path "$Path\$fileCounter-auditspecs.sql" + if (-not (Test-Path "$Path\$fileCounter-auditspecs.sql")) { + $fileCounter-- + } + } + + if ($Exclude -notcontains 'Endpoints') { + $fileCounter++ + Write-Message -Level Verbose -Message "Exporting Endpoints" + Write-ProgressHelper -StepNumber ($stepCounter++) -Message "Exporting Endpoints" + $null = Get-DbaEndpoint -SqlInstance $server | Where-Object IsSystemObject -eq $false | Export-DbaScript -Path "$Path\$fileCounter-endpoints.sql" -Append -BatchSeparator $BatchSeparator -ScriptingOptionsObject $ScriptingOption + Get-ChildItem -ErrorAction Ignore -Path "$Path\$fileCounter-endpoints.sql" + if (-not (Test-Path "$Path\$fileCounter-endpoints.sql")) { + $fileCounter-- + } + } + + if ($Exclude -notcontains 'PolicyManagement') { + $fileCounter++ + Write-Message -Level Verbose -Message "Exporting Policy Management" + Write-ProgressHelper -StepNumber ($stepCounter++) -Message "Exporting Policy Management" + $null = Get-DbaPbmCondition -SqlInstance $server | Export-DbaScript -Path "$Path\$fileCounter-policymanagement.sql" -Append -BatchSeparator $BatchSeparator + $null = Get-DbaPbmObjectSet -SqlInstance $server | Export-DbaScript -Path "$Path\$fileCounter-policymanagement.sql" -Append -BatchSeparator $BatchSeparator + $null = Get-DbaPbmPolicy -SqlInstance $server | Export-DbaScript -Path "$Path\$fileCounter-policymanagement.sql" -Append -BatchSeparator $BatchSeparator + Get-ChildItem -ErrorAction Ignore -Path "$Path\$fileCounter-policymanagement.sql" + if (-not (Test-Path "$Path\$fileCounter-policymanagement.sql")) { + $fileCounter-- + } + } + + if ($Exclude -notcontains 'ResourceGovernor') { + $fileCounter++ + Write-Message -Level Verbose -Message "Exporting Resource Governor" + Write-ProgressHelper -StepNumber ($stepCounter++) -Message "Exporting Resource Governor" + $null = Get-DbaResourceGovernor -SqlInstance $server | Export-DbaScript -Path "$Path\$fileCounter-resourcegov.sql" -Append -BatchSeparator $BatchSeparator -ScriptingOptionsObject $ScriptingOption + $null = Get-DbaRgClassifierFunction -SqlInstance $server | Export-DbaScript -Path "$Path\$fileCounter-resourcegov.sql" -Append -BatchSeparator $BatchSeparator -ScriptingOptionsObject $ScriptingOption + $null = Get-DbaRgResourcePool -SqlInstance $server | Where-Object Name -notin 'default', 'internal' | Export-DbaScript -Path "$Path\$fileCounter-resourcegov.sql" -Append -BatchSeparator $BatchSeparator -ScriptingOptionsObject $ScriptingOption + $null = Get-DbaRgWorkloadGroup -SqlInstance $server | Where-Object Name -notin 'default', 'internal' | Export-DbaScript -Path "$Path\$fileCounter-resourcegov.sql" -Append -BatchSeparator $BatchSeparator -ScriptingOptionsObject $ScriptingOption + $null = Add-Content -Value "ALTER RESOURCE GOVERNOR RECONFIGURE" -Path "$Path\$stepCounter-resourcegov.sql" + Get-ChildItem -ErrorAction Ignore -Path "$Path\$fileCounter-resourcegov.sql" + if (-not (Test-Path "$Path\$fileCounter-resourcegov.sql")) { + $fileCounter-- + } + } + + if ($Exclude -notcontains 'ExtendedEvents') { + $fileCounter++ + Write-Message -Level Verbose -Message "Exporting Extended Events" + Write-ProgressHelper -StepNumber ($stepCounter++) -Message "Exporting Extended Events" + $null = Get-DbaXESession -SqlInstance $server | Export-DbaScript -Path "$Path\$fileCounter-extendedevents.sql" -Append -BatchSeparator 'GO' + Get-ChildItem -ErrorAction Ignore -Path "$Path\$fileCounter-extendedevents.sql" + if (-not (Test-Path "$Path\$fileCounter-extendedevents.sql")) { + $fileCounter-- + } + } + + if ($Exclude -notcontains 'AgentServer') { + $fileCounter++ + Write-Message -Level Verbose -Message "Exporting job server" + + Write-ProgressHelper -StepNumber ($stepCounter++) -Message "Exporting job server" + $null = Get-DbaAgentJobCategory -SqlInstance $server | Export-DbaScript -Path "$Path\$fileCounter-sqlagent.sql" -Append -BatchSeparator $BatchSeparator -ScriptingOptionsObject $ScriptingOption + $null = Get-DbaAgentOperator -SqlInstance $server | Export-DbaScript -Path "$Path\$fileCounter-sqlagent.sql" -Append -BatchSeparator $BatchSeparator -ScriptingOptionsObject $ScriptingOption + $null = Get-DbaAgentAlert -SqlInstance $server | Export-DbaScript -Path "$Path\$fileCounter-sqlagent.sql" -Append -BatchSeparator $BatchSeparator -ScriptingOptionsObject $ScriptingOption + $null = Get-DbaAgentProxy -SqlInstance $server | Export-DbaScript -Path "$Path\$fileCounter-sqlagent.sql" -Append -BatchSeparator $BatchSeparator -ScriptingOptionsObject $ScriptingOption + $null = Get-DbaAgentSchedule -SqlInstance $server | Export-DbaScript -Path "$Path\$fileCounter-sqlagent.sql" -Append -BatchSeparator $BatchSeparator -ScriptingOptionsObject $ScriptingOption + $null = Get-DbaAgentJob -SqlInstance $server | Export-DbaScript -Path "$Path\$fileCounter-sqlagent.sql" -Append -BatchSeparator $BatchSeparator -ScriptingOptionsObject $ScriptingOption + Get-ChildItem -ErrorAction Ignore -Path "$Path\$fileCounter-sqlagent.sql" + if (-not (Test-Path "$Path\$fileCounter-sqlagent.sql")) { + $fileCounter-- + } + } + + if ($Exclude -notcontains 'ReplicationSettings') { + $fileCounter++ + Write-Message -Level Verbose -Message "Exporting replication settings" + Write-ProgressHelper -StepNumber ($stepCounter++) -Message "Exporting replication settings" + $null = Export-DbaRepServerSetting -SqlInstance $instance -SqlCredential $SqlCredential -Path "$Path\$fileCounter-replication.sql" + Get-ChildItem -ErrorAction Ignore -Path "$Path\$fileCounter-replication.sql" + if (-not (Test-Path "$Path\$fileCounter-replication.sql")) { + $fileCounter-- + } + } + + if ($Exclude -notcontains 'SysDbUserObjects') { + $fileCounter++ + Write-Message -Level Verbose -Message "Exporting user objects in system databases (this can take a minute)." + Write-ProgressHelper -StepNumber ($stepCounter++) -Message "Exporting user objects in system databases (this can take a minute)." + $null = Get-DbaSysDbUserObjectScript -SqlInstance $server | Out-File -FilePath "$Path\$fileCounter-userobjectsinsysdbs.sql" -Append + Get-ChildItem -ErrorAction Ignore -Path "$Path\$fileCounter-userobjectsinsysdbs.sql" + if (-not (Test-Path "$Path\$fileCounter-userobjectsinsysdbs.sql")) { + $fileCounter-- + } + } + + if ($Exclude -notcontains 'AvailabilityGroups') { + $fileCounter++ + Write-Message -Level Verbose -Message "Exporting availability group" + Write-ProgressHelper -StepNumber ($stepCounter++) -Message "Exporting availability groups" + $null = Get-DbaAvailabilityGroup -SqlInstance $server -WarningAction SilentlyContinue | Export-DbaScript -Path "$Path\$fileCounter-DbaAvailabilityGroups.sql" -Append -BatchSeparator $BatchSeparator #-ScriptingOptionsObject $ScriptingOption + Get-ChildItem -ErrorAction Ignore -Path "$Path\$fileCounter-DbaAvailabilityGroups.sql" + if (-not (Test-Path "$Path\$fileCounter-DbaAvailabilityGroups.sql")) { + $fileCounter-- + } + } + + Write-Progress -Activity "Performing Instance Export for $instance" -Completed + } + } + end { + $totaltime = ($elapsed.Elapsed.toString().Split(".")[0]) + Write-Message -Level Verbose -Message "SQL Server export complete." + Write-Message -Level Verbose -Message "Export started: $started" + Write-Message -Level Verbose -Message "Export completed: $(Get-Date)" + Write-Message -Level Verbose -Message "Total Elapsed time: $totaltime" + } +} +function Export-DbaLinkedServer { + <# + .SYNOPSIS + Exports linked servers INCLUDING PASSWORDS, unless specified otherwise, to sql file. + + .DESCRIPTION + Exports linked servers INCLUDING PASSWORDS, unless specified otherwise, to sql file. + + Requires remote Windows access if exporting the password. + + .PARAMETER SqlInstance + Source SQL Server. You must have sysadmin access and server version must be SQL Server version 2005 or higher. + + .PARAMETER SqlCredential + Login to the target instance using alternative linked servers. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Credential + Login to the target OS using alternative linked servers. Accepts credential objects (Get-Credential) + + .PARAMETER Path + The path to the exported sql file. + + .PARAMETER LinkedServer + The linked server(s) to export. If unspecified, all linked servers will be processed. + + .PARAMETER InputObject + Allow credentials to be piped in from Get-DbaLinkedServer + + .PARAMETER ExcludePassword + Exports the linked server without any sensitive information. + + .PARAMETER Append + Append to Path + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: LinkedServer + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .EXAMPLE + PS C:\> Export-DbaLinkedServer -SqlInstance sql2017 -Path C:\temp\ls.sql + + Exports the linked servers, including passwords, from sql2017 to the file C:\temp\ls.sql + + .EXAMPLE + PS C:\> Export-DbaLinkedServer -SqlInstance sql2017 -Path C:\temp\ls.sql -ExcludePassword + + Exports the linked servers, without passwords, from sql2017 to the file C:\temp\ls.sql + + #> + [CmdletBinding()] + param ( + [Parameter(Mandatory, ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [string[]]$LinkedServer, + [PSCredential]$SqlCredential, + [PSCredential]$Credential, + [string]$Path, + [switch]$ExcludePassword, + [switch]$Append, + [Microsoft.SqlServer.Management.Smo.LinkedServer[]]$InputObject, + [switch]$EnableException + ) + process { + foreach ($instance in $SqlInstance) { + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $sqlcredential -MinimumVersion 9 + $InputObject += $server.LinkedServers + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + if ($LinkedServer) { + $InputObject = $InputObject | Where-Object Name -in $LinkedServer + } + + if (-not $InputObject) { + Write-Message -Level Verbose -Message "Nothing to export" + continue + } + + if (!(Test-SqlSa -SqlInstance $instance -SqlCredential $sqlcredential)) { + Stop-Function -Message "Not a sysadmin on $instance. Quitting." -Target $instance -Continue + } + + Write-Message -Level Verbose -Message "Getting NetBios name for $instance." + $sourceNetBios = Resolve-NetBiosName $server + + Write-Message -Level Verbose -Message "Checking if Remote Registry is enabled on $instance." + try { + Invoke-Command2 -Raw -Credential $Credential -ComputerName $sourceNetBios -ScriptBlock { Get-ItemProperty -Path "HKLM:\SOFTWARE\" } -ErrorAction Stop + } catch { + Stop-Function -Message "Can't connect to registry on $instance." -Target $sourceNetBios -ErrorRecord $_ + return + } + + if (-not (Test-Bound -ParameterName Path)) { + $timenow = (Get-Date -uformat "%m%d%Y%H%M%S") + $mydocs = [Environment]::GetFolderPath('MyDocuments') + $path = "$mydocs\$($server.name.replace('\', '$'))-$timenow-linkedserver.sql" + } + + $sql = @() + + if ($ExcludePassword) { + $sql += $InputObject.Script() + } else { + try { + $decrypted = Get-DecryptedObject -SqlInstance $server -Type LinkedServer + } catch { + Stop-Function -Continue -Message "Failure" -ErrorRecord $_ + } + + foreach ($ls in $InputObject) { + $currentls = $decrypted | Where-Object Name -eq $ls.Name + + if ($currentls.Password) { + $password = $currentls.Password.Replace("'", "''") + + $tempsql = $ls.Script() + $tempsql = $tempsql.Replace(' /* For security reasons the linked server remote logins password is changed with ######## */', '') + $tempsql = $tempsql.Replace("rmtpassword='########'", "rmtpassword='$password'") + $sql += $tempsql + } else { + $sql += $ls.Script() + } + } + } + + try { + if ($Append) { + Add-Content -Path $path -Value $sql + } else { + Set-Content -Path $path -Value $sql + } + Get-ChildItem -Path $path + } catch { + Stop-Function -Message "Can't write to $path" -ErrorRecord $_ -Continue + } + } + } +} +function Export-DbaLogin { + <# + .SYNOPSIS + Exports Windows and SQL Logins to a T-SQL file. Export includes login, SID, password, default database, default language, server permissions, server roles, db permissions, db roles. + + .DESCRIPTION + Exports Windows and SQL Logins to a T-SQL file. Export includes login, SID, password, default database, default language, server permissions, server roles, db permissions, db roles. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. SQL Server 2000 and above supported. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Login + The login(s) to process. Options for this list are auto-populated from the server. If unspecified, all logins will be processed. + + .PARAMETER ExcludeLogin + The login(s) to exclude. Options for this list are auto-populated from the server. + + .PARAMETER Database + The database(s) to process. Options for this list are auto-populated from the server. If unspecified, all databases will be processed. + + .PARAMETER Path + The file to write to. + + .PARAMETER NoClobber + If this switch is enabled, a file already existing at the path specified by Path will not be overwritten. + + .PARAMETER Append + If this switch is enabled, content will be appended to a file already existing at the path specified by Path. If the file does not exist, it will be created. + + .PARAMETER ExcludeJobs + If this switch is enabled, Agent job ownership will not be exported. + + .PARAMETER ExcludeDatabases + If this switch is enabled, mappings for databases will not be exported. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .PARAMETER ExcludeGoBatchSeparator + If specified, will NOT script the 'GO' batch separator. + + .PARAMETER DestinationVersion + To say to which version the script should be generated. If not specified will use instance major version. + + .PARAMETER WhatIf + If this switch is enabled, no actions are performed but informational messages will be displayed that explain what would happen if the command were to run. + + .PARAMETER Confirm + If this switch is enabled, you will be prompted for confirmation before executing any operations that change state. + + .NOTES + Tags: Export, Login + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Export-DbaLogin + + .EXAMPLE + PS C:\> Export-DbaLogin -SqlInstance sql2005 -Path C:\temp\sql2005-logins.sql + + Exports the logins for SQL Server "sql2005" and writes them to the file "C:\temp\sql2005-logins.sql" + + .EXAMPLE + PS C:\> Export-DbaLogin -SqlInstance sqlserver2014a -ExcludeLogin realcajun -SqlCredential $scred -Path C:\temp\logins.sql -Append + + Authenticates to sqlserver2014a using SQL Authentication. Exports all logins except for realcajun to C:\temp\logins.sql, and appends to the file if it exists. If not, the file will be created. + + .EXAMPLE + PS C:\> Export-DbaLogin -SqlInstance sqlserver2014a -Login realcajun, netnerds -Path C:\temp\logins.sql + + Exports ONLY logins netnerds and realcajun FROM sqlserver2014a to the file C:\temp\logins.sql + + .EXAMPLE + PS C:\> Export-DbaLogin -SqlInstance sqlserver2014a -Login realcajun, netnerds -Database HR, Accounting + + Exports ONLY logins netnerds and realcajun FROM sqlserver2014a with the permissions on databases HR and Accounting + + .EXAMPLE + PS C:\> Export-DbaLogin -SqlInstance sqlserver2008 -Login realcajun, netnerds -Path C:\temp\login.sql -ExcludeGoBatchSeparator + + Exports ONLY logins netnerds and realcajun FROM sqlserver2008 server, to the C:\temp\login.sql file without the 'GO' batch separator. + + .EXAMPLE + PS C:\> Export-DbaLogin -SqlInstance sqlserver2008 -Login realcajun -Path C:\temp\users.sql -DestinationVersion SQLServer2016 + + Exports login realcajun from sqlserver2008 to the file C:\temp\users.sql with syntax to run on SQL Server 2016 + + #> + [CmdletBinding(SupportsShouldProcess)] + param ( + [parameter(Mandatory, ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter]$SqlInstance, + [Alias("Credential")] + [PSCredential] + $SqlCredential, + [object[]]$Login, + [object[]]$ExcludeLogin, + [Alias("Databases")] + [object[]]$Database, + [Alias("OutFile", "FilePath", "FileName")] + [string]$Path, + [Alias("NoOverwrite")] + [switch]$NoClobber, + [switch]$Append, + [switch]$ExcludeDatabases, + [switch]$ExcludeJobs, + [Alias('Silent')] + [switch]$EnableException, + [switch]$ExcludeGoBatchSeparator, + [ValidateSet('SQLServer2000', 'SQLServer2005', 'SQLServer2008/2008R2', 'SQLServer2012', 'SQLServer2014', 'SQLServer2016', 'SQLServer2017')] + [string]$DestinationVersion + ) + + begin { + + if ($Path) { + if ($Path -notlike "*\*") { + $Path = ".\$Path" + } + $directory = Split-Path $Path + $exists = Test-Path $directory + + if ($exists -eq $false) { + Write-Message -Level Warning -Message "Parent directory $directory does not exist" + } + } + + $outsql = @() + + } + process { + if (Test-FunctionInterrupt) { + return + } + + $server = Connect-SqlInstance -SqlInstance $SqlInstance -SqlCredential $sqlcredential + + if ($ExcludeDatabases -eq $false -or $Database) { + # if we got a database or a list of databases passed + # and we need to enumerate mappings, login.enumdatabasemappings() takes forever + # the cool thing though is that database.enumloginmappings() is fast. A lot. + # if we get a list of databases passed (or even the default list of all the databases) + # we save outself a call to enumloginmappings if there is no map at all + $DbMapping = @() + $DbsToMap = $server.Databases + if ($Database) { + $DbsToMap = $DbsToMap | Where-Object Name -in $Database + } + foreach ($db in $DbsToMap) { + if ($db.IsAccessible -eq $false) { + continue + } + $dbmap = $db.EnumLoginMappings() + foreach ($el in $dbmap) { + $DbMapping += [pscustomobject]@{ + Database = $db.Name + UserName = $el.Username + LoginName = $el.LoginName + } + } + } + } + + foreach ($sourceLogin in $server.Logins) { + $userName = $sourceLogin.name + + if ($Login -and $Login -notcontains $userName -or $ExcludeLogin -contains $userName) { + continue + } + + if ($userName.StartsWith("##") -or $userName -eq 'sa') { + Write-Message -Level Warning -Message "Skipping $userName" + continue + } + + $serverName = $server + + $userBase = ($userName.Split("\")[0]).ToLower() + if ($serverName -eq $userBase -or $userName.StartsWith("NT ")) { + if ($Pscmdlet.ShouldProcess("console", "Stating $userName is skipped because it is a local machine name")) { + Write-Message -Level Warning -Message "$userName is skipped because it is a local machine name" + continue + } + } + + if ($Pscmdlet.ShouldProcess("Outfile", "Adding T-SQL for login $userName")) { + if ($Path) { + Write-Message -Level Verbose -Message "Exporting $userName" + } + + $outsql += "`r`nUSE master`n" + # Getting some attributes + $defaultDb = $sourceLogin.DefaultDatabase + $language = $sourceLogin.Language + + if ($sourceLogin.PasswordPolicyEnforced -eq $false) { + $checkPolicy = "OFF" + } else { + $checkPolicy = "ON" + } + + if (!$sourceLogin.PasswordExpirationEnabled) { + $checkExpiration = "OFF" + } else { + $checkExpiration = "ON" + } + + # Attempt to script out SQL Login + if ($sourceLogin.LoginType -eq "SqlLogin") { + $sourceLoginName = $sourceLogin.name + + switch ($server.versionMajor) { + 0 { + $sql = "SELECT CONVERT(VARBINARY(256),password) AS hashedpass FROM master.dbo.syslogins WHERE loginname='$sourceLoginName'" + } + 8 { + $sql = "SELECT CONVERT(VARBINARY(256),password) AS hashedpass FROM dbo.syslogins WHERE name='$sourceLoginName'" + } + 9 { + $sql = "SELECT CONVERT(VARBINARY(256),password_hash) as hashedpass FROM sys.sql_logins WHERE name='$sourceLoginName'" + } + default { + $sql = "SELECT CAST(CONVERT(varchar(256), CAST(LOGINPROPERTY(name,'PasswordHash') AS VARBINARY(256)), 1) AS NVARCHAR(max)) AS hashedpass FROM sys.server_principals WHERE principal_id = $($sourceLogin.id)" + } + } + + try { + $hashedPass = $server.ConnectionContext.ExecuteScalar($sql) + } catch { + $hashedPassDt = $server.Databases['master'].ExecuteWithResults($sql) + $hashedPass = $hashedPassDt.Tables[0].Rows[0].Item(0) + } + + if ($hashedPass.GetType().Name -ne "String") { + $passString = "0x"; $hashedPass | ForEach-Object { + $passString += ("{0:X}" -f $_).PadLeft(2, "0") + } + $hashedPass = $passString + } + + $sid = "0x"; $sourceLogin.sid | ForEach-Object { + $sid += ("{0:X}" -f $_).PadLeft(2, "0") + } + $outsql += "IF NOT EXISTS (SELECT loginname FROM master.dbo.syslogins WHERE name = '$userName') CREATE LOGIN [$userName] WITH PASSWORD = $hashedPass HASHED, SID = $sid, DEFAULT_DATABASE = [$defaultDb], CHECK_POLICY = $checkPolicy, CHECK_EXPIRATION = $checkExpiration, DEFAULT_LANGUAGE = [$language]" + } + # Attempt to script out Windows User + elseif ($sourceLogin.LoginType -eq "WindowsUser" -or $sourceLogin.LoginType -eq "WindowsGroup") { + $outsql += "IF NOT EXISTS (SELECT loginname FROM master.dbo.syslogins WHERE name = '$userName') CREATE LOGIN [$userName] FROM WINDOWS WITH DEFAULT_DATABASE = [$defaultDb], DEFAULT_LANGUAGE = [$language]" + } + # This script does not currently support certificate mapped or asymmetric key users. + else { + Write-Message -Level Warning -Message "$($sourceLogin.LoginType) logins not supported. $($sourceLogin.Name) skipped" + continue + } + + if ($sourceLogin.IsDisabled) { + $outsql += "ALTER LOGIN [$userName] DISABLE" + } + + if ($sourceLogin.DenyWindowsLogin) { + $outsql += "DENY CONNECT SQL TO [$userName]" + } + } + + # Server Roles: sysadmin, bulklogin, etc + foreach ($role in $server.Roles) { + $roleName = $role.Name + + # SMO changed over time + try { + $roleMembers = $role.EnumMemberNames() + } catch { + $roleMembers = $role.EnumServerRoleMembers() + } + + if ($roleMembers -contains $userName) { + if (($server.VersionMajor -lt 11 -and [string]::IsNullOrEmpty($destinationVersion)) -or ($DestinationVersion -in "SQLServer2000", "SQLServer2005", "SQLServer2008/2008R2")) { + $outsql += "EXEC sys.sp_addsrvrolemember @rolename=N'$roleName', @loginame=N'$userName'" + } else { + $outsql += "ALTER SERVER ROLE [$roleName] ADD MEMBER [$userName]" + } + } + } + + if ($ExcludeJobs -eq $false) { + $ownedJobs = $server.JobServer.Jobs | Where-Object { $_.OwnerLoginName -eq $userName } + + foreach ($ownedJob in $ownedJobs) { + $outsql += "`n`rUSE msdb`n" + $outsql += "EXEC msdb.dbo.sp_update_job @job_name=N'$ownedJob', @owner_login_name=N'$userName'" + } + } + + if ($server.VersionMajor -ge 9) { + # These operations are only supported by SQL Server 2005 and above. + # Securables: Connect SQL, View any database, Administer Bulk Operations, etc. + + $perms = $server.EnumServerPermissions($userName) + $outsql += "`n`rUSE master`n" + foreach ($perm in $perms) { + $permState = $perm.permissionstate + $permType = $perm.PermissionType + $grantor = $perm.grantor + + if ($permState -eq "GrantWithGrant") { + $grantWithGrant = "WITH GRANT OPTION" + $permState = "GRANT" + } else { + $grantWithGrant = $null + } + + $outsql += "$permState $permType TO [$userName] $grantWithGrant AS [$grantor]" + } + + # Credential mapping. Credential removal not currently supported for Syncs. + $loginCredentials = $server.Credentials | Where-Object { $_.Identity -eq $sourceLogin.Name } + foreach ($credential in $loginCredentials) { + $credentialName = $credential.Name + $outsql += "PRINT '$userName is associated with the $credentialName credential'" + } + } + + if ($ExcludeDatabases -eq $false) { + $dbs = $sourceLogin.EnumDatabaseMappings() + + if ($Database) { + $dbs = $dbs | Where-Object { $_.DBName -in $Database } + } + + # Adding database mappings and securables + foreach ($db in $dbs) { + $dbName = $db.dbname + $sourceDb = $server.Databases[$dbName] + $dbUserName = $db.username + + $outsql += "`r`nUSE [$dbName]`n" + try { + $sql = $server.Databases[$dbName].Users[$dbUserName].Script() + $outsql += $sql + } catch { + Write-Message -Level Warning -Message "User cannot be found in selected database" + } + + # Skipping updating dbowner + + # Database Roles: db_owner, db_datareader, etc + foreach ($role in $sourceDb.Roles) { + if ($role.EnumMembers() -contains $dbUserName) { + $roleName = $role.Name + if (($server.VersionMajor -lt 11 -and [string]::IsNullOrEmpty($destinationVersion)) -or ($DestinationVersion -in "SQLServer2000", "SQLServer2005", "SQLServer2008/2008R2")) { + $outsql += "EXEC sys.sp_addrolemember @rolename=N'$roleName', @membername=N'$dbUserName'" + } else { + $outsql += "ALTER ROLE [$roleName] ADD MEMBER [$dbUserName]" + } + } + } + + # Connect, Alter Any Assembly, etc + $perms = $sourceDb.EnumDatabasePermissions($dbUserName) + foreach ($perm in $perms) { + $permState = $perm.PermissionState + $permType = $perm.PermissionType + $grantor = $perm.Grantor + + if ($permState -eq "GrantWithGrant") { + $grantWithGrant = "WITH GRANT OPTION" + $permState = "GRANT" + } else { + $grantWithGrant = $null + } + + $outsql += "$permState $permType TO [$userName] $grantWithGrant AS [$grantor]" + } + } + } + } + } + end { + $sql = $sql | Where-Object { $_ -notlike "CREATE USER [dbo] FOR LOGIN * WITH DEFAULT_SCHEMA=[dbo]" } + + if ($ExcludeGoBatchSeparator) { + $sql = $outsql + } else { + $sql = $outsql -join "`r`nGO`r`n" + #add the final GO + $sql += "`r`nGO" + } + + if ($Path) { + $sql | Out-File -Encoding UTF8 -FilePath $Path -Append:$Append -NoClobber:$NoClobber + Get-ChildItem $Path + } else { + $sql + } + Test-DbaDeprecation -DeprecatedOn "1.0.0" -EnableException:$false -Alias Export-SqlLogin + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function Export-DbaPfDataCollectorSetTemplate { + <# + .SYNOPSIS + Exports a new Data Collector Set XML Template. + + .DESCRIPTION + Exports a Data Collector Set XML Template from Get-DbaPfDataCollectorSet. Exports to "$home\Documents\Performance Monitor Templates" by default. + + .PARAMETER ComputerName + The target computer. Defaults to localhost. + + .PARAMETER Credential + Allows you to login to $ComputerName using alternative credentials. To use: + + $cred = Get-Credential, then pass $cred object to the -Credential parameter. + + .PARAMETER CollectorSet + The name of the collector set(s) to export. + + .PARAMETER Path + The path to export the file. Can be .xml or directory. + + .PARAMETER InputObject + Accepts the object output by Get-DbaPfDataCollectorSetTemplate via the pipeline. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Performance, DataCollector + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Export-DbaPfDataCollectorSetTemplate + + .EXAMPLE + PS C:\> Export-DbaPfDataCollectorSetTemplate -ComputerName sql2017 -Path C:\temp\pf + + Exports all data collector sets from to the C:\temp\pf folder. + + .EXAMPLE + PS C:\> Get-DbaPfDataCollectorSet ComputerName sql2017 -CollectorSet 'System Correlation' | Export-DbaPfDataCollectorSetTemplate -Path C:\temp + + Exports the 'System Correlation' data collector set from sql2017 to C:\temp. + + #> + [CmdletBinding()] + param ( + [DbaInstance[]]$ComputerName = $env:COMPUTERNAME, + [PSCredential]$Credential, + [Alias("DataCollectorSet")] + [string[]]$CollectorSet, + [string]$Path = "$home\Documents\Performance Monitor Templates", + [Parameter(ValueFromPipeline)] + [object[]]$InputObject, + [switch]$EnableException + ) + process { + if ($InputObject.Credential -and (Test-Bound -ParameterName Credential -Not)) { + $Credential = $InputObject.Credential + } + + if (-not $InputObject -or ($InputObject -and (Test-Bound -ParameterName ComputerName))) { + foreach ($computer in $ComputerName) { + $InputObject += Get-DbaPfDataCollectorSet -ComputerName $computer -Credential $Credential -CollectorSet $CollectorSet + } + } + + foreach ($object in $InputObject) { + if (-not $object.DataCollectorSetObject) { + Stop-Function -Message "InputObject is not of the right type. Please use Get-DbaPfDataCollectorSet." + return + } + + $csname = Remove-InvalidFileNameChars -Name $object.Name + + if ($path.EndsWith(".xml")) { + $filename = $path + } else { + $filename = "$path\$csname.xml" + if (-not (Test-Path -Path $path)) { + $null = New-Item -Type Directory -Path $path + } + } + Write-Message -Level Verbose -Message "Wrote $csname to $filename." + Set-Content -Path $filename -Value $object.Xml -Encoding Unicode + Get-ChildItem -Path $filename + } + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function Export-DbaRepServerSetting { + <# + .SYNOPSIS + Exports replication server settings to file. + + .DESCRIPTION + Exports replication server settings to file. + + .PARAMETER SqlInstance + The target SQL Server instance or instances + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Path + Specifies the path to a file which will contain the output. + + .PARAMETER Passthru + Output script to console + + .PARAMETER NoClobber + Do not overwrite file + + .PARAMETER Encoding + Specifies the file encoding. The default is UTF8. + + Valid values are: + -- ASCII: Uses the encoding for the ASCII (7-bit) character set. + -- BigEndianUnicode: Encodes in UTF-16 format using the big-endian byte order. + -- Byte: Encodes a set of characters into a sequence of bytes. + -- String: Uses the encoding type for a string. + -- Unicode: Encodes in UTF-16 format using the little-endian byte order. + -- UTF7: Encodes in UTF-7 format. + -- UTF8: Encodes in UTF-8 format. + -- Unknown: The encoding type is unknown or invalid. The data can be treated as binary. + + .PARAMETER Append + Append to file + + .PARAMETER ScriptOption + Not real sure how to use this yet + + .PARAMETER InputObject + Allows piping from Get-DbaRepServer + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Replication + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .EXAMPLE + PS C:\> Export-DbaRepServerSetting -SqlInstance sql2017 -Path C:\temp\replication.sql + + Exports the replication settings on sql2017 to the file C:\temp\replication.sql + + .EXAMPLE + PS C:\> Get-DbaRepServer -SqlInstance sql2017 | Export-DbaRepServerSettings -Path C:\temp\replication.sql + + Exports the replication settings on sql2017 to the file C:\temp\replication.sql + + #> + [CmdletBinding()] + param ( + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [string]$Path, + [object[]]$ScriptOption, + [Parameter(ValueFromPipeline)] + [Microsoft.SqlServer.Replication.ReplicationServer[]]$InputObject, + [ValidateSet('ASCII', 'BigEndianUnicode', 'Byte', 'String', 'Unicode', 'UTF7', 'UTF8', 'Unknown')] + [string]$Encoding = 'UTF8', + [switch]$Passthru, + [switch]$NoClobber, + [switch]$Append, + [switch]$EnableException + ) + process { + foreach ($instance in $SqlInstance) { + $InputObject += Get-DbaRepServer -SqlInstance $instance -SqlCredential $sqlcredential + } + + foreach ($repserver in $InputObject) { + $server = $repserver.SqlServerName + if (-not (Test-Bound -ParameterName Path)) { + $timenow = (Get-Date -uformat "%m%d%Y%H%M%S") + $mydocs = [Environment]::GetFolderPath('MyDocuments') + $path = "$mydocs\$($server.replace('\', '$'))-$timenow-replication.sql" + } + try { + if (-not $ScriptOption) { + $out = $repserver.Script([Microsoft.SqlServer.Replication.ScriptOptions]::Creation ` + -bor [Microsoft.SqlServer.Replication.ScriptOptions]::IncludeAll ` + -bor [Microsoft.SqlServer.Replication.ScriptOptions]::EnableReplicationDB ` + -bor [Microsoft.SqlServer.Replication.ScriptOptions]::IncludeInstallDistributor + ) + } else { + $out = $repserver.Script($scriptOption) + } + } catch { + Stop-Function -ErrorRecord $_ -Message "Replication export failed. Is it setup?" -Continue + } + if ($Passthru) { + "exec sp_dropdistributor @no_checks = 1, @ignore_distributor = 1" | Out-String + $out | Out-String + } + + if ($Path) { + + "exec sp_dropdistributor @no_checks = 1, @ignore_distributor = 1" | Out-File -FilePath $path -Encoding $encoding -Append + $out | Out-File -FilePath $path -Encoding $encoding -Append + } + } + } +} +function Export-DbaScript { + <# + .SYNOPSIS + Exports scripts from SQL Management Objects (SMO) + + .DESCRIPTION + Exports scripts from SQL Management Objects + + .PARAMETER InputObject + A SQL Management Object such as the one returned from Get-DbaLogin + + .PARAMETER Path + The output filename and location. If no path is specified, one will be created. If the file already exists, the output will be appended. + + .PARAMETER Encoding + Specifies the file encoding. The default is UTF8. + + Valid values are: + -- ASCII: Uses the encoding for the ASCII (7-bit) character set. + -- BigEndianUnicode: Encodes in UTF-16 format using the big-endian byte order. + -- Byte: Encodes a set of characters into a sequence of bytes. + -- String: Uses the encoding type for a string. + -- Unicode: Encodes in UTF-16 format using the little-endian byte order. + -- UTF7: Encodes in UTF-7 format. + -- UTF8: Encodes in UTF-8 format. + -- Unknown: The encoding type is unknown or invalid. The data can be treated as binary. + + .PARAMETER Passthru + Output script to console + + .PARAMETER ScriptingOptionsObject + An SMO Scripting Object that can be used to customize the output - see New-DbaScriptingOption + + .PARAMETER BatchSeparator + Specifies the Batch Separator to use. Default is None + + .PARAMETER NoPrefix + Do not include a Prefix + + .PARAMETER WhatIf + Shows what would happen if the command were to run. No actions are actually performed + + .PARAMETER NoClobber + Do not overwrite file + + .PARAMETER Append + Append to file + + .PARAMETER Confirm + Prompts you for confirmation before executing any changing operations within the command + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Migration, Backup, Export + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Export-DbaScript + + .EXAMPLE + PS C:\> Get-DbaAgentJob -SqlInstance sql2016 | Export-DbaScript + + Exports all jobs on the SQL Server sql2016 instance using a trusted connection - automatically determines filename as .\sql2016-Job-Export-date.sql + + .EXAMPLE + PS C:\> Get-DbaAgentJob -SqlInstance sql2016 | Export-DbaScript -Path C:\temp\export.sql -Append + + Exports all jobs on the SQL Server sql2016 instance using a trusted connection - Will append the output to the file C:\temp\export.sql if it already exists + Script does not include Batch Separator and will not compile + + .EXAMPLE + PS C:\> Get-DbaDbTable -SqlInstance sql2016 -Database MyDatabase -Table 'dbo.Table1', 'dbo.Table2' -SqlCredential sqladmin | Export-DbaScript -Path C:\temp\export.sql + + Exports only script for 'dbo.Table1' and 'dbo.Table2' in MyDatabase to C:temp\export.sql and uses the SQL login "sqladmin" to login to sql2016 + + .EXAMPLE + PS C:\> Get-DbaAgentJob -SqlInstance sql2016 -Job syspolicy_purge_history, 'Hourly Log Backups' -SqlCredential sqladmin | Export-DbaScript -Path C:\temp\export.sql -NoPrefix + + Exports only syspolicy_purge_history and 'Hourly Log Backups' to C:temp\export.sql and uses the SQL login "sqladmin" to login to sql2016 + Suppress the output of a Prefix + + .EXAMPLE + PS C:\> $options = New-DbaScriptingOption + PS C:\> $options.ScriptSchema = $true + PS C:\> $options.IncludeDatabaseContext = $true + PS C:\> $options.IncludeHeaders = $false + PS C:\> $Options.NoCommandTerminator = $false + PS C:\> $Options.ScriptBatchTerminator = $true + PS C:\> $Options.AnsiFile = $true + PS C:\> Get-DbaAgentJob -SqlInstance sql2016 -Job syspolicy_purge_history, 'Hourly Log Backups' -SqlCredential sqladmin | Export-DbaScript -Path C:\temp\export.sql -ScriptingOptionsObject $options + + Exports only syspolicy_purge_history and 'Hourly Log Backups' to C:temp\export.sql and uses the SQL login "sqladmin" to login to sql2016 + Appends a batch separator at end of each script. + + .EXAMPLE + PS C:\> Get-DbaAgentJob -SqlInstance sql2014 | Export-DbaScript -Passthru | ForEach-Object { $_.Replace('sql2014','sql2016') } | Set-Content -Path C:\temp\export.sql + + Exports jobs and replaces all instances of the servername "sql2014" with "sql2016" then writes to C:\temp\export.sql + + .EXAMPLE + PS C:\> $options = New-DbaScriptingOption + PS C:\> $options.ScriptSchema = $true + PS C:\> $options.IncludeDatabaseContext = $true + PS C:\> $options.IncludeHeaders = $false + PS C:\> $Options.NoCommandTerminator = $false + PS C:\> $Options.ScriptBatchTerminator = $true + PS C:\> $Options.AnsiFile = $true + PS C:\> $Databases = Get-DbaDatabase -SqlInstance sql2016 -ExcludeDatabase master, model, msdb, tempdb + PS C:\> foreach ($db in $Databases) { + >> Export-DbaScript -InputObject $db -Path C:\temp\export.sql -Append -Encoding UTF8 -ScriptingOptionsObject $options -NoPrefix + >> } + + Exports Script for each database on sql2016 excluding system databases + Uses Scripting options to ensure Batch Terminator is set + Will append the output to the file C:\temp\export.sql if it already exists + + #> + [CmdletBinding(SupportsShouldProcess)] + param ( + [parameter(Mandatory, ValueFromPipeline)] + [object[]]$InputObject, + [Alias("ScriptingOptionObject")] + [Microsoft.SqlServer.Management.Smo.ScriptingOptions]$ScriptingOptionsObject, + [string]$Path, + [ValidateSet('ASCII', 'BigEndianUnicode', 'Byte', 'String', 'Unicode', 'UTF7', 'UTF8', 'Unknown')] + [string]$Encoding = 'UTF8', + [string]$BatchSeparator = '', + [switch]$NoPrefix, + [switch]$Passthru, + [switch]$NoClobber, + [switch]$Append, + [Alias('Silent')] + [switch]$EnableException + ) + + begin { + $executingUser = [Security.Principal.WindowsIdentity]::GetCurrent().Name + $commandName = $MyInvocation.MyCommand.Name + $timeNow = (Get-Date -uformat "%m%d%Y%H%M%S") + $prefixArray = @() + } + + process { + foreach ($object in $InputObject) { + + $typename = $object.GetType().ToString() + + if ($typename.StartsWith('Microsoft.SqlServer.')) { + $shortype = $typename.Split(".")[-1] + } else { + Stop-Function -Message "InputObject is of type $typename which is not a SQL Management Object. Only SMO objects are supported." -Category InvalidData -Target $object -Continue + } + + if ($shortype -in "LinkedServer", "Credential", "Login") { + Write-Message -Level Warning -Message "Support for $shortype is limited at this time. No passwords, hashed or otherwise, will be exported if they exist." + } + + # Just gotta add the stuff that Nic Cain added to his script + + if ($shortype -eq "Configuration") { + Write-Message -Level Warning -Message "Support for $shortype is limited at this time." + } + + # Find the server object to pass on to the function + $parent = $object.parent + + do { + if ($parent.Urn.Type -ne "Server") { + $parent = $parent.Parent + } + } + until (($parent.Urn.Type -eq "Server") -or (-not $parent)) + + if (-not $parent -and -not (Get-Member -InputObject $object -Name ScriptCreate) ) { + Stop-Function -Message "Failed to find valid SMO server object in input: $object." -Category InvalidData -Target $object -Continue + } + + try { + $server = $parent + if (-not $server) { + $server = $object.Parent + } + $serverName = $server.Name.Replace('\', '$') + + if ($ScriptingOptionsObject) { + $scripter = New-Object Microsoft.SqlServer.Management.Smo.Scripter $server + $scripter.Options = $ScriptingOptionsObject + } + + if (!$passthru) { + if ($path) { + $actualPath = $path + } else { + $actualPath = "$serverName-$shortype-Export-$timeNow.sql" + } + } + + if ($NoPrefix) { + $prefix = "" + } else { + $prefix = "/*`n`tCreated by $executingUser using dbatools $commandName for objects on $serverName at $(Get-Date)`n`tSee https://dbatools.io/$commandName for more information`n*/" + } + + if ($passthru) { + $prefix | Out-String + } else { + if ($prefixArray -notcontains $actualPath) { + + if ((Test-Path -Path $actualPath) -and $NoClobber) { + Stop-Function -Message "File already exists. If you want to overwrite it remove the -NoClobber parameter. If you want to append data, please Use -Append parameter." -Target $actualPath -Continue + } + #Only at the first output we use the passed variables Append & NoClobber. For this execution the next ones need to buse -Append + $prefix | Out-File -FilePath $actualPath -Encoding $encoding -Append:$Append -NoClobber:$NoClobber + $prefixArray += $actualPath + } + } + + if ($Pscmdlet.ShouldProcess($env:computername, "Exporting $object from $server to $actualPath")) { + Write-Message -Level Verbose -Message "Exporting $object" + + if ($passthru) { + if ($ScriptingOptionsObject) { + foreach ($script in $scripter.EnumScript($object)) { + if ($BatchSeparator -ne "") { + $script = "$script`r`n$BatchSeparator`r`n" + } + $script | Out-String + } + } else { + if (Get-Member -Name ScriptCreate -InputObject $object) { + $script = $object.ScriptCreate().GetScript() + } else { + $script = $object.Script() + } + + if ($BatchSeparator -ne "") { + $script = "$script`r`n$BatchSeparator`r`n" + } + $script | Out-String + } + } else { + if ($ScriptingOptionsObject) { + if ($ScriptingOptionsObject.ScriptBatchTerminator) { + $ScriptingOptionsObject.AppendToFile = $true + $ScriptingOptionsObject.ToFileOnly = $true + $ScriptingOptionsObject.FileName = $actualPath + $object.Script($ScriptingOptionsObject) + } else { + foreach ($script in $scripter.EnumScript($object)) { + if ($BatchSeparator -ne "") { + $script = "$script`r`n$BatchSeparator`r`n" + } + $script | Out-File -FilePath $actualPath -Encoding $encoding -Append + } + } + + } else { + if (Get-Member -Name ScriptCreate -InputObject $object) { + $script = $object.ScriptCreate().GetScript() + } else { + $script = $object.Script() + } + if ($BatchSeparator -ne "") { + $script = "$script`r`n$BatchSeparator`r`n" + } + $script | Out-File -FilePath $actualPath -Encoding $encoding -Append + } + } + + if (-not $passthru) { + Write-Message -Level Verbose -Message "Exported $object on $($server.Name) to $actualPath" + Get-ChildItem -Path $actualPath + } + } + } catch { + $message = $_.Exception.InnerException.InnerException.InnerException.Message + if (-not $message) { + $message = $_.Exception + } + Stop-Function -Message "Failure on $($server.Name) | $message" -Target $server + } + } + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function Export-DbaSpConfigure { + <# + .SYNOPSIS + Exports advanced sp_configure global configuration options to sql file. + + .DESCRIPTION + Exports advanced sp_configure global configuration options to sql file. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. This can be a collection and receive pipeline input. + You must have sysadmin access if needs to set 'show advanced options' to 1 and server version must be SQL Server version 2005 or higher. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Path + Specifies the path to a file which will contain the sp_configure queries necessary to replicate the configuration settings on another instance. This file is suitable for input into Import-DbaSPConfigure. + If not specified will output to My Documents folder with default name of ServerName-MMDDYYYYhhmmss-sp_configure.sql + If a directory is passed then uses default name of ServerName-MMDDYYYYhhmmss-sp_configure.sql + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: SpConfig, Configure, Configuration + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Export-DbaSpConfigure + + .INPUTS + A DbaInstanceParameter representing an array of SQL Server instances. + + .OUTPUTS + Creates a new file for each SQL Server Instance + + .EXAMPLE + PS C:\> Export-DbaSpConfigure -SqlInstance sourceserver + + Exports the SPConfigure settings on sourceserver. As no Path was defined outputs to My Documents folder with default name format of Servername-MMDDYYYYhhmmss-sp_configure.sql + + .EXAMPLE + PS C:\> Export-DbaSpConfigure -SqlInstance sourceserver -Path C:\temp + + Exports the SPConfigure settings on sourceserver to the directory C:\temp using the default name format + + .EXAMPLE + PS C:\> $cred = Get-Credential sqladmin + PS C:\> Export-DbaSpConfigure -SqlInstance sourceserver -SqlCredential $cred -Path C:\temp\sp_configure.sql + + Exports the SPConfigure settings on sourceserver to the file C:\temp\sp_configure.sql. Uses SQL Authentication to connect. Will require SysAdmin rights if needs to set 'show advanced options' + + .EXAMPLE + PS C:\> 'Server1', 'Server2' | Export-DbaSpConfigure -Path C:\temp\configure.sql + + Exports the SPConfigure settings for Server1 and Server2 using pipeline. As more than 1 Server adds prefix of Servername and date to the file name and saves to file like C:\temp\Servername-MMDDYYYYhhmmss-configure.sql + + #> + [CmdletBinding()] + param ( + [Parameter(Mandatory, ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [string]$Path, + [switch]$EnableException + ) + process { + foreach ($instance in $SqlInstance) { + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $sqlcredential -MinimumVersion 9 + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + if (-not (Test-Bound -ParameterName Path)) { + $timenow = (Get-Date -uformat "%m%d%Y%H%M%S") + $mydocs = [Environment]::GetFolderPath('MyDocuments') + $filepath = "$mydocs\$($server.name.replace('\', '$'))-$timenow-sp_configure.sql" + } + + if (Test-Path $Path -PathType Container) { + $timenow = (Get-Date -uformat "%m%d%Y%H%M%S") + $filepath = Join-Path -Path $Path -ChildPath "$($server.name.replace('\', '$'))-$timenow-sp_configure.sql" + } elseif (Test-Path $Path -PathType Leaf) { + if ($SqlInstance.Count -gt 1) { + $timenow = (Get-Date -uformat "%m%d%Y%H%M%S") + $PathData = Get-ChildItem $Path + $filepath = "$($PathData.DirectoryName)\$($server.name.replace('\', '$'))-$timenow-$($PathData.Name)" + } else { + $filepath = $Path + } + } + + If (-not $filepath) { + $filepath = $Path + } + + $topdir = Split-Path -Path $filepath + + if (-not (Test-Path -Path $topdir)) { + New-Item -Path $topdir -ItemType Directory + } + + $ShowAdvancedOptions = $server.Configuration.ShowAdvancedOptions.ConfigValue + + if ($ShowAdvancedOptions -eq 0) { + try { + $server.Configuration.ShowAdvancedOptions.ConfigValue = $true + $server.Configuration.Alter($true) + } catch { + Stop-Function -Message "Can't set 'show advanced options' to 1 on instance $instance" -ErrorRecord $_ -Continue + } + } + + try { + Set-Content -Path $filepath "EXEC sp_configure 'show advanced options' , 1; RECONFIGURE WITH OVERRIDE" + } catch { + Stop-Function -Message "Can't write to $filepath" -ErrorRecord $_ -Continue + } + + foreach ($sourceprop in $server.Configuration.Properties) { + $displayname = $sourceprop.DisplayName + $configvalue = $sourceprop.ConfigValue + Add-Content -Path $filepath "EXEC sp_configure '$displayname' , $configvalue;" + } + + if ($ShowAdvancedOptions -eq 0) { + Add-Content -Path $filepath "EXEC sp_configure 'show advanced options' , 0;" + Add-Content -Path $filepath "RECONFIGURE WITH OVERRIDE" + + $server.Configuration.ShowAdvancedOptions.ConfigValue = $false + $server.Configuration.Alter($true) + } + Get-ChildItem -Path $filepath + } + } + + end { + Write-Message -Level Verbose -Message "Server configuration export finished" + + Test-DbaDeprecation -DeprecatedOn "1.0.0" -EnableException:$false -Alias Export-SqlSpConfigure + } +} +function Export-DbaUser { + <# + .SYNOPSIS + Exports users creation and its permissions to a T-SQL file or host. + + .DESCRIPTION + Exports users creation and its permissions to a T-SQL file or host. Export includes user, create and add to role(s), database level permissions, object level permissions. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. SQL Server 2000 and above supported. + + .PARAMETER SqlCredential + Allows you to login to servers using alternative credentials + + $scred = Get-Credential, then pass $scred object to the -SqlCredential parameter + + Windows Authentication will be used if SqlCredential is not specified + + .PARAMETER Database + The database(s) to process - this list is auto-populated from the server. If unspecified, all databases will be processed. + + .PARAMETER ExcludeDatabase + The database(s) to exclude - this list is auto-populated from the server + + .PARAMETER User + Export only the specified database user(s). If not specified will export all users from the database(s) + + .PARAMETER DestinationVersion + To say to which version the script should be generated. If not specified will use database compatibility level + + .PARAMETER Path + Specifies the full path of a file to write the script to. + + .PARAMETER NoClobber + Do not overwrite file + + .PARAMETER Append + Append to file + + .PARAMETER WhatIf + Shows what would happen if the command were to run. No actions are actually performed. + + .PARAMETER Confirm + Prompts you for confirmation before executing any changing operations within the command. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .PARAMETER ScriptingOptionsObject + A Microsoft.SqlServer.Management.Smo.ScriptingOptions object with the options that you want to use to generate the t-sql script. + You can use the NEw-DbaScriptingOption to generate it. + + .PARAMETER ExcludeGoBatchSeparator + If specified, will NOT script the 'GO' batch separator. + + .NOTES + Tags: User, Export + Author: Claudio Silva (@ClaudioESSilva) + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Export-DbaUser + + .EXAMPLE + PS C:\> Export-DbaUser -SqlInstance sql2005 -Path C:\temp\sql2005-users.sql + + Exports SQL for the users in server "sql2005" and writes them to the file "C:\temp\sql2005-users.sql" + + .EXAMPLE + PS C:\> Export-DbaUser -SqlInstance sqlserver2014a $scred -Path C:\temp\users.sql -Append + + Authenticates to sqlserver2014a using SQL Authentication. Exports all users to C:\temp\users.sql, and appends to the file if it exists. If not, the file will be created. + + .EXAMPLE + PS C:\> Export-DbaUser -SqlInstance sqlserver2014a -User User1, User2 -Path C:\temp\users.sql + + Exports ONLY users User1 and User2 from sqlserver2014a to the file C:\temp\users.sql + + .EXAMPLE + PS C:\> Export-DbaUser -SqlInstance sqlserver2008 -User User1 -Path C:\temp\users.sql -DestinationVersion SQLServer2016 + + Exports user User1 from sqlserver2008 to the file C:\temp\users.sql with syntax to run on SQL Server 2016 + + .EXAMPLE + PS C:\> Export-DbaUser -SqlInstance sqlserver2008 -Database db1,db2 -Path C:\temp\users.sql + + Exports ONLY users from db1 and db2 database on sqlserver2008 server, to the C:\temp\users.sql file. + + .EXAMPLE + PS C:\> $options = New-DbaScriptingOption + PS C:\> $options.ScriptDrops = $false + PS C:\> $options.WithDependencies = $true + PS C:\> Export-DbaUser -SqlInstance sqlserver2008 -Database db1,db2 -Path C:\temp\users.sql -ScriptingOptionsObject $options + + Exports ONLY users from db1 and db2 database on sqlserver2008 server, to the C:\temp\users.sql file. + It will not script drops but will script dependencies. + + .EXAMPLE + PS C:\> Export-DbaUser -SqlInstance sqlserver2008 -Database db1,db2 -Path C:\temp\users.sql -ExcludeGoBatchSeparator + + Exports ONLY users from db1 and db2 database on sqlserver2008 server, to the C:\temp\users.sql file without the 'GO' batch separator. + + + #> + [CmdletBinding(DefaultParameterSetName = "Default")] + [OutputType([String])] + param ( + [parameter(Mandatory, ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter]$SqlInstance, + [Alias("Credential")] + [PSCredential] + $SqlCredential, + [Alias("Databases")] + [object[]]$Database, + [object[]]$ExcludeDatabase, + [object[]]$User, + [ValidateSet('SQLServer2000', 'SQLServer2005', 'SQLServer2008/2008R2', 'SQLServer2012', 'SQLServer2014', 'SQLServer2016', 'SQLServer2017')] + [string]$DestinationVersion, + [Alias("OutFile", "FilePath", "FileName")] + [string]$Path, + [Alias("NoOverwrite")] + [switch]$NoClobber, + [switch]$Append, + [Alias('Silent')] + [switch]$EnableException, + [Microsoft.SqlServer.Management.Smo.ScriptingOptions]$ScriptingOptionsObject = $null, + [switch]$ExcludeGoBatchSeparator + ) + + begin { + if ($Path) { + if ($Path -notlike "*\*") { $Path = ".\$Path" } + $directory = Split-Path $Path + $exists = Test-Path $directory + + if ($exists -eq $false) { + Stop-Function -Message "Parent directory $directory does not exist" + return + } + } + + $outsql = @() + + $versions = @{ + 'SQLServer2000' = 'Version80' + 'SQLServer2005' = 'Version90' + 'SQLServer2008/2008R2' = 'Version100' + 'SQLServer2012' = 'Version110' + 'SQLServer2014' = 'Version120' + 'SQLServer2016' = 'Version130' + 'SQLServer2017' = 'Version140' + } + + $versionName = @{ + 'Version80' = 'SQLServer2000' + 'Version90' = 'SQLServer2005' + 'Version100' = 'SQLServer2008/2008R2' + 'Version110' = 'SQLServer2012' + 'Version120' = 'SQLServer2014' + 'Version130' = 'SQLServer2016' + 'Version140' = 'SQLServer2017' + } + + } + process { + if (Test-FunctionInterrupt) { return } + + try { + $server = Connect-SqlInstance -SqlInstance $SqlInstance -SqlCredential $SqlCredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + if (!$database) { + $databases = $server.Databases | Where-Object { $ExcludeDatabase -notcontains $_.Name -and $_.IsAccessible -eq $true } + } else { + if ($pipedatabase) { + $databases = $pipedatabase.name + } else { + $databases = $server.Databases | Where-Object { $_.IsAccessible -eq $true -and ($database -contains $_.Name) } + } + } + + if ($exclude) { + $databases = $databases | Where-Object Name -notin $ExcludeDatabase + } + + if (@($databases).Count -gt 0) { + + #Database Permissions + foreach ($db in $databases) { + if ([string]::IsNullOrEmpty($destinationVersion)) { + #Get compatibility level for scripting the objects + $scriptVersion = $db.CompatibilityLevel + } else { + $scriptVersion = $versions[$destinationVersion] + } + $versionNameDesc = $versionName[$scriptVersion.ToString()] + + #If not passed create new ScriptingOption. Otherwise use the one that was passed + if ($null -eq $ScriptingOptionsObject) { + $ScriptingOptionsObject = New-DbaScriptingOption + $ScriptingOptionsObject.TargetServerVersion = [Microsoft.SqlServer.Management.Smo.SqlServerVersion]::$scriptVersion + $ScriptingOptionsObject.AllowSystemObjects = $false + $ScriptingOptionsObject.IncludeDatabaseRoleMemberships = $true + $ScriptingOptionsObject.ContinueScriptingOnError = $false + $ScriptingOptionsObject.IncludeDatabaseContext = $false + $ScriptingOptionsObject.IncludeIfNotExists = $true + } + + Write-Message -Level Output -Message "Validating users on database $db" + + if ($User.Count -eq 0) { + $users = $db.Users | Where-Object { $_.IsSystemObject -eq $false -and $_.Name -notlike "##*" } + } else { + if ($pipedatabase) { + $users = $pipedatabase.name + } else { + $users = $db.Users | Where-Object { $User -contains $_.Name -and $_.IsSystemObject -eq $false -and $_.Name -notlike "##*" } + } + } + # Store roles between users so if we hit the same one we don't create it again + $roles = @() + if ($users.Count -gt 0) { + foreach ($dbuser in $users) { + Write-Message -Level Output -Message "Generating script for user $dbuser" + + #setting database + $outsql += "USE [" + $db.Name + "]" + + try { + #Fixed Roles #Dependency Issue. Create Role, before add to role. + foreach ($rolePermission in ($db.Roles | Where-Object { $_.IsFixedRole -eq $false })) { + foreach ($rolePermissionScript in $rolePermission.Script($ScriptingOptionsObject)) { + if ($rolePermission.ToString() -notin $roles) { + $roles += , $rolePermission.ToString() + $outsql += "$($rolePermissionScript.ToString())" + } + + } + } + + #Database Create User(s) and add to Role(s) + foreach ($dbUserPermissionScript in $dbuser.Script($ScriptingOptionsObject)) { + if ($dbuserPermissionScript.Contains("sp_addrolemember")) { + $execute = "EXEC " + } else { + $execute = "" + } + $outsql += "$execute$($dbUserPermissionScript.ToString())" + } + + #Database Permissions + foreach ($databasePermission in $db.EnumDatabasePermissions() | Where-Object { @("sa", "dbo", "information_schema", "sys") -notcontains $_.Grantee -and $_.Grantee -notlike "##*" -and ($dbuser.Name -contains $_.Grantee) }) { + if ($databasePermission.PermissionState -eq "GrantWithGrant") { + $withGrant = " WITH GRANT OPTION" + $grantDatabasePermission = 'GRANT' + } else { + $withGrant = " " + $grantDatabasePermission = $databasePermission.PermissionState.ToString().ToUpper() + } + + $outsql += "$($grantDatabasePermission) $($databasePermission.PermissionType) TO [$($databasePermission.Grantee)]$withGrant AS [$($databasePermission.Grantor)];" + } + + #Database Object Permissions + # NB: This is a bit of a mess for a couple of reasons + # 1. $db.EnumObjectPermissions() doesn't enumerate all object types + # 2. Some (x)Collection types can have EnumObjectPermissions() called + # on them directly (e.g. AssemblyCollection); others can't (e.g. + # ApplicationRoleCollection). Those that can't we iterate the + # collection explicitly and add each object's permission. + + $perms = New-Object System.Collections.ArrayList + + $null = $perms.AddRange($db.EnumObjectPermissions($dbuser.Name)) + + foreach ($item in $db.ApplicationRoles) { + $null = $perms.AddRange($item.EnumObjectPermissions($dbuser.Name)) + } + + foreach ($item in $db.Assemblies) { + $null = $perms.AddRange($item.EnumObjectPermissions($dbuser.Name)) + } + + foreach ($item in $db.Certificates) { + $null = $perms.AddRange($item.EnumObjectPermissions($dbuser.Name)) + } + + foreach ($item in $db.DatabaseRoles) { + $null = $perms.AddRange($item.EnumObjectPermissions($dbuser.Name)) + } + + foreach ($item in $db.FullTextCatalogs) { + $null = $perms.AddRange($item.EnumObjectPermissions($dbuser.Name)) + } + + foreach ($item in $db.FullTextStopLists) { + $null = $perms.AddRange($item.EnumObjectPermissions($dbuser.Name)) + } + + foreach ($item in $db.SearchPropertyLists) { + $null = $perms.AddRange($item.EnumObjectPermissions($dbuser.Name)) + } + + foreach ($item in $db.ServiceBroker.MessageTypes) { + $null = $perms.AddRange($item.EnumObjectPermissions($dbuser.Name)) + } + + foreach ($item in $db.RemoteServiceBindings) { + $null = $perms.AddRange($item.EnumObjectPermissions($dbuser.Name)) + } + + foreach ($item in $db.ServiceBroker.Routes) { + $null = $perms.AddRange($item.EnumObjectPermissions($dbuser.Name)) + } + + foreach ($item in $db.ServiceBroker.ServiceContracts) { + $null = $perms.AddRange($item.EnumObjectPermissions($dbuser.Name)) + } + + foreach ($item in $db.ServiceBroker.Services) { + $null = $perms.AddRange($item.EnumObjectPermissions($dbuser.Name)) + } + + if ($scriptVersion -ne "Version80") { + foreach ($item in $db.AsymmetricKeys) { + $null = $perms.AddRange($item.EnumObjectPermissions($dbuser.Name)) + } + } + + foreach ($item in $db.SymmetricKeys) { + $null = $perms.AddRange($item.EnumObjectPermissions($dbuser.Name)) + } + + foreach ($item in $db.XmlSchemaCollections) { + $null = $perms.AddRange($item.EnumObjectPermissions($dbuser.Name)) + } + + foreach ($objectPermission in $perms | Where-Object { @("sa", "dbo", "information_schema", "sys") -notcontains $_.Grantee -and $_.Grantee -notlike "##*" -and $_.Grantee -eq $dbuser.Name }) { + switch ($objectPermission.ObjectClass) { + 'ApplicationRole' { + $object = 'APPLICATION ROLE::[{0}]' -f $objectPermission.ObjectName + } + 'AsymmetricKey' { + $object = 'ASYMMETRIC KEY::[{0}]' -f $objectPermission.ObjectName + } + 'Certificate' { + $object = 'CERTIFICATE::[{0}]' -f $objectPermission.ObjectName + } + 'DatabaseRole' { + $object = 'ROLE::[{0}]' -f $objectPermission.ObjectName + } + 'FullTextCatalog' { + $object = 'FULLTEXT CATALOG::[{0}]' -f $objectPermission.ObjectName + } + 'FullTextStopList' { + $object = 'FULLTEXT STOPLIST::[{0}]' -f $objectPermission.ObjectName + } + 'MessageType' { + $object = 'Message Type::[{0}]' -f $objectPermission.ObjectName + } + 'ObjectOrColumn' { + if ($scriptVersion -ne "Version80") { + $object = 'OBJECT::[{0}].[{1}]' -f $objectPermission.ObjectSchema, $objectPermission.ObjectName + if ($null -ne $objectPermission.ColumnName) { + $object += '([{0}])' -f $objectPermission.ColumnName + } + } + #At SQL Server 2000 OBJECT did not exists + else { + $object = '[{0}].[{1}]' -f $objectPermission.ObjectSchema, $objectPermission.ObjectName + } + } + 'RemoteServiceBinding' { + $object = 'REMOTE SERVICE BINDING::[{0}]' -f $objectPermission.ObjectName + } + 'Schema' { + $object = 'SCHEMA::[{0}]' -f $objectPermission.ObjectName + } + 'SearchPropertyList' { + $object = 'SEARCH PROPERTY LIST::[{0}]' -f $objectPermission.ObjectName + } + 'Service' { + $object = 'SERVICE::[{0}]' -f $objectPermission.ObjectName + } + 'ServiceContract' { + $object = 'CONTRACT::[{0}]' -f $objectPermission.ObjectName + } + 'ServiceRoute' { + $object = 'ROUTE::[{0}]' -f $objectPermission.ObjectName + } + 'SqlAssembly' { + $object = 'ASSEMBLY::[{0}]' -f $objectPermission.ObjectName + } + 'SymmetricKey' { + $object = 'SYMMETRIC KEY::[{0}]' -f $objectPermission.ObjectName + } + 'User' { + $object = 'USER::[{0}]' -f $objectPermission.ObjectName + } + 'UserDefinedType' { + $object = 'TYPE::[{0}].[{1}]' -f $objectPermission.ObjectSchema, $objectPermission.ObjectName + } + 'XmlNamespace' { + $object = 'XML SCHEMA COLLECTION::[{0}]' -f $objectPermission.ObjectName + } + } + + if ($objectPermission.PermissionState -eq "GrantWithGrant") { + $withGrant = " WITH GRANT OPTION" + $grantObjectPermission = 'GRANT' + } else { + $withGrant = " " + $grantObjectPermission = $objectPermission.PermissionState.ToString().ToUpper() + } + + $outsql += "$grantObjectPermission $($objectPermission.PermissionType) ON $object TO [$($objectPermission.Grantee)]$withGrant AS [$($objectPermission.Grantor)];" + } + + } catch { + Stop-Function -Message "This user may be using functionality from $($versionName[$db.CompatibilityLevel.ToString()]) that does not exist on the destination version ($versionNameDesc)." -Continue -InnerErrorRecord $_ -Target $db + } + } + } else { + Write-Message -Level Output -Message "No users found on database '$db'" + } + + #reset collection + $users = $null + } + } else { + Write-Message -Level Output -Message "No users found on instance '$server'" + } + } + + end { + if (Test-FunctionInterrupt) { return } + + if ($ExcludeGoBatchSeparator) { + $sql = $outsql + } else { + $sql = $outsql -join "`r`nGO`r`n" + #add the final GO + $sql += "`r`nGO" + } + + if ($Path) { + $sql | Out-File -Encoding UTF8 -FilePath $Path -Append:$Append -NoClobber:$NoClobber + } else { + $sql + } + Test-DbaDeprecation -DeprecatedOn "1.0.0" -EnableException:$false -Alias Export-SqlUser + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function Export-DbaXECsv { + <# + .SYNOPSIS + Exports Extended Events to a CSV file. + + .DESCRIPTION + Exports Extended Events to a CSV file. + + .PARAMETER Path + Specifies the InputObject to the output CSV file + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .PARAMETER InputObject + Allows Piping + + .NOTES + Tags: ExtendedEvent, XE, XEvent + Author: Gianluca Sartori (@spaghettidba) + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Export-DbaXECsv + + .EXAMPLE + PS C:\> Get-ChildItem -Path C:\temp\sample.xel | Export-DbaXECsv -Path c:\temp\sample.csv + + Writes Extended Events data to the file "C:\temp\events.csv". + + .EXAMPLE + PS C:\> Get-DbaXESession -SqlInstance sql2014 -Session deadlocks | Export-DbaXECsv -Path c:\temp\events.csv + + Writes Extended Events data to the file "C:\temp\events.csv". + + #> + [CmdletBinding()] + param ( + [parameter(Mandatory, ValueFromPipeline)] + [Alias('FullName')] + [object[]]$InputObject, + [parameter(Mandatory)] + [string]$Path, + [switch]$EnableException + ) + begin { + try { + Add-Type -Path "$script:PSModuleRoot\bin\XESmartTarget\XESmartTarget.Core.dll" -ErrorAction Stop + } catch { + Stop-Function -Message "Could not load XESmartTarget.Core.dll" -ErrorRecord $_ -Target "XESmartTarget" + return + } + + function Get-FileFromXE ($InputObject) { + if ($InputObject.TargetFile) { + if ($InputObject.TargetFile.Length -eq 0) { + Stop-Function -Message "This session does not have an associated Target File." + return + } + + $instance = [dbainstance]$InputObject.ComputerName + + if ($instance.IsLocalHost) { + $xelpath = $InputObject.TargetFile + } else { + $xelpath = $InputObject.RemoteTargetFile + } + + if ($xelpath -notmatch ".xel") { + $xelpath = "$xelpath*.xel" + } + + try { + Get-ChildItem -Path $xelpath -ErrorAction Stop + } catch { + Stop-Function -Message "Failure" -ErrorRecord $_ + } + } + } + } + process { + if (Test-FunctionInterrupt) { return } + + $getfiles = Get-FileFromXE $InputObject + + if ($getfiles) { + $InputObject += $getfiles + } + + foreach ($file in $InputObject) { + if ($file -is [System.String]) { + $currentfile = $file + } elseif ($file -is [System.IO.FileInfo]) { + $currentfile = $file.FullName + } elseif ($file -is [Microsoft.SqlServer.Management.XEvent.Session]) { + # it was taken care of above + continue + } else { + Stop-Function -Message "Unsupported file type." + return + } + + $accessible = Test-Path -Path $currentfile + $whoami = whoami + + if (-not $accessible) { + if ($file.Status -eq "Stopped") { continue } + Stop-Function -Continue -Message "$currentfile cannot be accessed from $($env:COMPUTERNAME). Does $whoami have access?" + } + + if (-not (Test-Path $Path)) { + if ([String]::IsNullOrEmpty([IO.Path]::GetExtension($Path))) { + New-Item $Path -ItemType directory | Out-Null + $outDir = $Path + $outFile = [IO.Path]::GetFileNameWithoutExtension($currentfile) + ".csv" + } else { + $outDir = [IO.Path]::GetDirectoryName($Path) + $outFile = [IO.Path]::GetFileName($Path) + } + } else { + if ((Get-Item $Path) -is [System.IO.DirectoryInfo]) { + $outDir = $Path + $outFile = [IO.Path]::GetFileNameWithoutExtension($currentfile) + ".csv" + } else { + $outDir = [IO.Path]::GetDirectoryName($Path) + $outFile = [IO.Path]::GetFileName($Path) + } + } + + $adapter = New-Object XESmartTarget.Core.Utils.XELFileCSVAdapter + $adapter.InputFile = $currentfile + $adapter.OutputFile = (Join-Path $outDir $outFile) + + try { + $adapter.Convert() + $file = Get-ChildItem -Path $adapter.OutputFile + + if ($file.Length -eq 0) { + Remove-Item -Path $adapter.OutputFile + } else { + $file + } + } catch { + Stop-Function -Message "Failure" -ErrorRecord $_ -Target "XESmartTarget" -Continue + } + } + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function Export-DbaXESessionTemplate { + <# + .SYNOPSIS + Exports an XESession XML Template using XE Session(s) output by Get-DbaXESession + + .DESCRIPTION + Exports an XESession XML Template either from the Target SQL Server or XE Session(s) output by Get-DbaXESession. Exports to "$home\Documents\SQL Server Management Studio\Templates\XEventTemplates" by default + + .PARAMETER SqlInstance + The target SQL Server instance or instances. You must have sysadmin access and server version must be SQL Server version 2008 or higher. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Session + The Name of the session(s) to export. + + .PARAMETER Path + The path to export the file into. Can be .xml or directory. + + .PARAMETER InputObject + Specifies an XE Session output by Get-DbaXESession. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: ExtendedEvent, XE, XEvent + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Export-DbaXESessionTemplate + + .EXAMPLE + PS C:\> Export-DbaXESessionTemplate -SqlInstance sql2017 -Path C:\temp\xe + + Exports an XESession XML Template for all Extended Event Sessions on sql2017 to the C:\temp\xe folder. + + .EXAMPLE + PS C:\> Get-DbaXESession -SqlInstance sql2017 -Session system_health | Export-DbaXESessionTemplate -Path C:\temp\xe + + Gets the system_health Extended Events Session from sql2017 and then exports as an XESession XML Template to C:\temp\xe + + #> + [CmdletBinding()] + param ( + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [object[]]$Session, + [string]$Path = "$home\Documents\SQL Server Management Studio\Templates\XEventTemplates", + [Parameter(ValueFromPipeline)] + [Microsoft.SqlServer.Management.XEvent.Session[]]$InputObject, + [switch]$EnableException + ) + process { + foreach ($instance in $SqlInstance) { + try { + $InputObject += Get-DbaXESession -SqlInstance $instance -SqlCredential $SqlCredential -Session $Session -EnableException + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + } + + foreach ($xes in $InputObject) { + $xesname = Remove-InvalidFileNameChars -Name $xes.Name + + if (-not (Test-Path -Path $Path)) { + Stop-Function -Message "$Path does not exist." -Target $Path + } + + if ($path.EndsWith(".xml")) { + $filename = $path + } else { + $filename = "$path\$xesname.xml" + } + Write-Message -Level Verbose -Message "Wrote $xesname to $filename" + [Microsoft.SqlServer.Management.XEvent.XEStore]::SaveSessionToTemplate($xes, $filename, $true) + Get-ChildItem -Path $filename + } + } +} +function Find-DbaAgentJob { + <# + .SYNOPSIS + Find-DbaAgentJob finds agent jobs that fit certain search filters. + + .DESCRIPTION + This command filters SQL Agent jobs giving the DBA a list of jobs that may need attention or could possibly be options for removal. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. You must have sysadmin access and server version must be SQL Server version 2000 or higher. + + .PARAMETER SqlCredential + Allows you to login to servers using SQL Logins as opposed to Windows Auth/Integrated/Trusted. + + .PARAMETER JobName + Filter agent jobs to only the name(s) you list. + Supports regular expression (e.g. MyJob*) being passed in. + + .PARAMETER ExcludeJobName + Allows you to enter an array of agent job names to ignore + + .PARAMETER StepName + Filter based on StepName. + Supports regular expression (e.g. MyJob*) being passed in. + + .PARAMETER LastUsed + Find all jobs that havent ran in the INT number of previous day(s) + + .PARAMETER IsDisabled + Find all jobs that are disabled + + .PARAMETER IsFailed + Find all jobs that have failed + + .PARAMETER IsNotScheduled + Find all jobs with no schedule assigned + + .PARAMETER IsNoEmailNotification + Find all jobs without email notification configured + + .PARAMETER Category + Filter based on agent job categories + + .PARAMETER Owner + Filter based on owner of the job/s + + .PARAMETER Since + Datetime object used to narrow the results to a date + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Agent, Job + Author: Stephen Bennett (https://sqlnotesfromtheunderground.wordpress.com/) + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Find-DbaAgentJob + + .EXAMPLE + PS C:\> Find-DbaAgentJob -SqlInstance Dev01 -JobName *backup* + + Returns all agent job(s) that have backup in the name + + .EXAMPLE + PS C:\> Find-DbaAgentJob -SqlInstance Dev01, Dev02 -JobName Mybackup + + Returns all agent job(s) that are named exactly Mybackup + + .EXAMPLE + PS C:\> Find-DbaAgentJob -SqlInstance Dev01 -LastUsed 10 + + Returns all agent job(s) that have not ran in 10 days + + .EXAMPLE + PS C:\> Find-DbaAgentJob -SqlInstance Dev01 -IsDisabled -IsNoEmailNotification -IsNotScheduled + + Returns all agent job(s) that are either disabled, have no email notification or don't have a schedule. returned with detail + + .EXAMPLE + PS C:\> $servers | Find-DbaAgentJob -IsFailed | Start-DbaAgentJob + + Finds all failed job then starts them. Consider using a -WhatIf at the end of Start-DbaAgentJob to see what it'll do first + + .EXAMPLE + PS C:\> Find-DbaAgentJob -SqlInstance Dev01 -LastUsed 10 -Exclude "Yearly - RollUp Workload", "SMS - Notification" + + Returns all agent jobs that have not ran in the last 10 days ignoring jobs "Yearly - RollUp Workload" and "SMS - Notification" + + .EXAMPLE + PS C:\> Find-DbaAgentJob -SqlInstance Dev01 -Category "REPL-Distribution", "REPL-Snapshot" | Format-Table -AutoSize -Wrap + + Returns all job/s on Dev01 that are in either category "REPL-Distribution" or "REPL-Snapshot" + + .EXAMPLE + PS C:\> Find-DbaAgentJob -SqlInstance Dev01, Dev02 -IsFailed -Since '2016-07-01 10:47:00' + + Returns all agent job(s) on Dev01 and Dev02 that have failed since July of 2016 (and still have history in msdb) + + .EXAMPLE + PS C:\> Get-DbaCmsRegServer -SqlInstance CMSServer -Group Production | Find-DbaAgentJob -Disabled -IsNotScheduled | Format-Table -AutoSize -Wrap + + Queries CMS server to return all SQL instances in the Production folder and then list out all agent jobs that have either been disabled or have no schedule. + + #> + [CmdletBinding()] + param ( + [parameter(Position = 0, Mandatory, ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer", "SqlServers")] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential] + $SqlCredential, + [Alias("Name")] + [string[]]$JobName, + [string[]]$ExcludeJobName, + [string[]]$StepName, + [int]$LastUsed, + [Alias("Disabled")] + [switch]$IsDisabled, + [Alias("Failed")] + [switch]$IsFailed, + [Alias("NoSchedule")] + [switch]$IsNotScheduled, + [Alias("NoEmailNotification")] + [switch]$IsNoEmailNotification, + [string[]]$Category, + [string]$Owner, + [datetime]$Since, + [Alias('Silent')] + [switch]$EnableException + ) + begin { + if ($IsFailed, [boolean]$JobName, [boolean]$StepName, [boolean]$LastUsed.ToString(), $IsDisabled, $IsNotScheduled, $IsNoEmailNotification, [boolean]$Category, [boolean]$Owner, [boolean]$ExcludeJobName -notcontains $true) { + Stop-Function -Message "At least one search term must be specified" + } + } + process { + if (Test-FunctionInterrupt) { return } + + foreach ($instance in $SqlInstance) { + Write-Message -Level Verbose -Message "Running Scan on: $instance" + + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $sqlcredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + $jobs = $server.JobServer.jobs + $output = @() + + if ($IsFailed) { + Write-Message -Level Verbose -Message "Checking for failed jobs." + $output += $jobs | Where-Object LastRunOutcome -eq "Failed" + } + + if ($JobName) { + Write-Message -Level Verbose -Message "Retrieving jobs by their name." + $output += Get-JobList -SqlInstance $server -JobFilter $JobName + } + + if ($StepName) { + Write-Message -Level Verbose -Message "Retrieving jobs by their step names." + $output += Get-JobList -SqlInstance $server -StepFilter $StepName + } + + if ($LastUsed) { + $DaysBack = $LastUsed * -1 + $SinceDate = (Get-date).AddDays($DaysBack) + Write-Message -Level Verbose -Message "Finding job/s not ran in last $LastUsed days" + $output += $jobs | Where-Object { $_.LastRunDate -le $SinceDate } + } + + if ($IsDisabled) { + Write-Message -Level Verbose -Message "Finding job/s that are disabled" + $output += $jobs | Where-Object IsEnabled -eq $false + } + + if ($IsNotScheduled) { + Write-Message -Level Verbose -Message "Finding job/s that have no schedule defined" + $output += $jobs | Where-Object HasSchedule -eq $false + } + if ($IsNoEmailNotification) { + Write-Message -Level Verbose -Message "Finding job/s that have no email operator defined" + $output += $jobs | Where-Object { [string]::IsNullOrEmpty($_.OperatorToEmail) -eq $true } + } + + if ($Category) { + Write-Message -Level Verbose -Message "Finding job/s that have the specified category defined" + $output += $jobs | Where-Object { $Category -contains $_.Category } + } + + if ($Owner) { + Write-Message -Level Verbose -Message "Finding job/s with owner critera" + if ($Owner -match "-") { + $OwnerMatch = $Owner -replace "-", "" + Write-Message -Level Verbose -Message "Checking for jobs that NOT owned by: $OwnerMatch" + $output += $server.JobServer.jobs | Where-Object { $OwnerMatch -notcontains $_.OwnerLoginName } + } else { + Write-Message -Level Verbose -Message "Checking for jobs that are owned by: $owner" + $output += $server.JobServer.jobs | Where-Object { $Owner -contains $_.OwnerLoginName } + } + } + + if ($Exclude) { + Write-Message -Level Verbose -Message "Excluding job/s based on Exclude" + $output = $output | Where-Object { $Exclude -notcontains $_.Name } + } + + if ($Since) { + #$Since = $Since.ToString("yyyy-MM-dd HH:mm:ss") + Write-Message -Level Verbose -Message "Getting only jobs whose LastRunDate is greater than or equal to $since" + $output = $output | Where-Object { $_.LastRunDate -ge $since } + } + + $jobs = $output | Select-Object -Unique + + foreach ($job in $jobs) { + Add-Member -Force -InputObject $job -MemberType NoteProperty -Name ComputerName -value $server.ComputerName + Add-Member -Force -InputObject $job -MemberType NoteProperty -Name InstanceName -value $server.ServiceName + Add-Member -Force -InputObject $job -MemberType NoteProperty -Name SqlInstance -value $server.DomainInstanceName + Add-Member -Force -InputObject $job -MemberType NoteProperty -Name JobName -value $job.Name + + + Select-DefaultView -InputObject $job -Property ComputerName, InstanceName, SqlInstance, Name, Category, OwnerLoginName, CurrentRunStatus, CurrentRunRetryAttempt, 'IsEnabled as Enabled', LastRunDate, LastRunOutcome, DateCreated, HasSchedule, OperatorToEmail, 'DateCreated as CreateDate' + } + } + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function Find-DbaBackup { + <# + .SYNOPSIS + Finds SQL Server backups on disk. + + .DESCRIPTION + Provides all of the same functionality for finding SQL backups to remove from disk as a standard maintenance plan would. + + As an addition you have the ability to check the Archive bit on files before deletion. This will allow you to ensure backups have been archived to your archive location before removal. + + .PARAMETER Path + Specifies the name of the base level folder to search for backup files. + + .PARAMETER BackupFileExtension + Specifies the filename extension of the backup files you wish to find (typically 'bak', 'trn' or 'log'). Do not include the period. + + .PARAMETER RetentionPeriod + Specifies the retention period for backup files. Correct format is ##U. + + ## is the retention value and must be an integer value + U signifies the units where the valid units are: + h = hours + d = days + w = weeks + m = months + + Formatting Examples: + '48h' = 48 hours + '7d' = 7 days + '4w' = 4 weeks + '1m' = 1 month + + .PARAMETER CheckArchiveBit + If this switch is enabled, the filesystem Archive bit is checked. + If this bit is set (which translates to "it has not been backed up to another location yet"), the file won't be included. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Backup + Author: Chris Sommer (@cjsommer), www.cjsommer.com + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Find-DbaBackup + + .EXAMPLE + PS C:\> Find-DbaBackup -Path 'C:\MSSQL\SQL Backup\' -BackupFileExtension trn -RetentionPeriod 48h + + Searches for all trn files in C:\MSSQL\SQL Backup\ and all subdirectories that are more than 48 hours old will be included. + + .EXAMPLE + PS C:\> Find-DbaBackup -Path 'C:\MSSQL\Backup\' -BackupFileExtension bak -RetentionPeriod 7d -CheckArchiveBit + + Searches for all bak files in C:\MSSQL\Backup\ and all subdirectories that are more than 7 days old will be included, but only if the files have been backed up to another location as verified by checking the Archive bit. + + .EXAMPLE + PS C:\> Find-DbaBackup -Path '\\SQL2014\Backup\' -BackupFileExtension bak -RetentionPeriod 24h | Remove-Item -Verbose + + Searches for all bak files in \\SQL2014\Backup\ and all subdirectories that are more than 24 hours old and deletes only those files with verbose message. +#> + [CmdletBinding()] + param ( + [parameter(Mandatory, HelpMessage = "Full path to the root level backup folder (ex. 'C:\SQL\Backups'")] + [Alias("BackupFolder")] + [string]$Path, + [parameter(Mandatory, HelpMessage = "Backup File extension to remove (ex. bak, trn, dif)")] + [string]$BackupFileExtension , + [parameter(Mandatory, HelpMessage = "Backup retention period. (ex. 24h, 7d, 4w, 6m)")] + [string]$RetentionPeriod , + [switch]$CheckArchiveBit = $false , + [Alias('Silent')] + [switch]$EnableException + ) + + begin { + ### Local Functions + function Convert-UserFriendlyRetentionToDatetime { + [cmdletbinding()] + param ( + [string]$UserFriendlyRetention + ) + + <# + Convert a user friendly retention value into a datetime. + The last character of the string will indicate units (validated) + Valid units are: (h = hours, d = days, w = weeks, m = months) + + The preceeding characters are the value and must be an integer (validated) + + Examples: + '48h' = 48 hours + '7d' = 7 days + '4w' = 4 weeks + '1m' = 1 month + #> + + [int]$Length = ($UserFriendlyRetention).Length + $Value = ($UserFriendlyRetention).Substring(0, $Length - 1) + $Units = ($UserFriendlyRetention).Substring($Length - 1, 1) + + # Validate that $Units is an accepted unit of measure + if ( $Units -notin @('h', 'd', 'w', 'm') ) { + throw "RetentionPeriod '$UserFriendlyRetention' units invalid! See Get-Help for correct formatting and examples." + } + + # Validate that $Value is an INT + if ( ![int]::TryParse($Value, [ref]"") ) { + throw "RetentionPeriod '$UserFriendlyRetention' format invalid! See Get-Help for correct formatting and examples." + } + + switch ($Units) { + #Variable marked as unused by PSScriptAnalyzer + 'h' {<# $UnitString = 'Hours';#> [datetime]$ReturnDatetime = (Get-Date).AddHours( - $Value) } + 'd' {<# $UnitString = 'Days';#> [datetime]$ReturnDatetime = (Get-Date).AddDays( - $Value) } + 'w' {<# $UnitString = 'Weeks';#> [datetime]$ReturnDatetime = (Get-Date).AddDays( - $Value * 7) } + 'm' {<# $UnitString = 'Months';#> [datetime]$ReturnDatetime = (Get-Date).AddMonths( - $Value) } + } + $ReturnDatetime + } + + # Validations + # Ensure BackupFileExtension does not begin with a . + if ($BackupFileExtension -match "^[.]") { + Write-Message -Level Warning -Message "Parameter -BackupFileExtension begins with a period '$BackupFileExtension'. A period is automatically prepended to -BackupFileExtension and need not be passed in." + } + # Ensure Path is a proper path + if (!(Test-Path $Path -PathType 'Container')) { + Stop-Function -Message "$Path not found" + } + + } + process { + if (Test-FunctionInterrupt) { return } + # Process stuff + Write-Message -Message "Finding backups on $Path" -Level Verbose + # Convert Retention Value to an actual DateTime + try { + $RetentionDate = Convert-UserFriendlyRetentionToDatetime -UserFriendlyRetention $RetentionPeriod + Write-Message -Message "Backup Retention Date set to $RetentionDate" -Level Verbose + } catch { + Stop-Function -Message "Failed to interpret retention time!" -ErrorRecord $_ + } + + # Filter out unarchived files if -CheckArchiveBit parameter is used + if ($CheckArchiveBit) { + Write-Message -Message "Removing only archived files." -Level Verbose + filter DbaArchiveBitFilter { + if ($_.Attributes -notmatch "Archive") { + $_ + } + } + } else { + filter DbaArchiveBitFilter { + $_ + } + } + # Enumeration may take a while. Without resorting to "esoteric" file listing facilities + # and given we need to fetch at least the LastWriteTime, let's just use "streaming" processing + # here to avoid issues like described in #970 + Get-ChildItem $Path -Filter "*.$BackupFileExtension" -File -Recurse -ErrorAction SilentlyContinue -ErrorVariable EnumErrors | + Where-Object LastWriteTime -lt $RetentionDate | DbaArchiveBitFilter + if ($EnumErrors) { + Write-Message "Errors encountered enumerating files." -Level Warning -ErrorRecord $EnumErrors + } + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function Find-DbaCommand { + <# + .SYNOPSIS + Finds dbatools commands searching through the inline help text + + .DESCRIPTION + Finds dbatools commands searching through the inline help text, building a consolidated json index and querying it because Get-Help is too slow + + .PARAMETER Tag + Finds all commands tagged with this auto-populated tag + + .PARAMETER Author + Finds all commands tagged with this author + + .PARAMETER MinimumVersion + Finds all commands tagged with this auto-populated minimum version + + .PARAMETER MaximumVersion + Finds all commands tagged with this auto-populated maximum version + + .PARAMETER Rebuild + Rebuilds the index + + .PARAMETER Pattern + Searches help for all commands in dbatools for the specified pattern and displays all results + + .PARAMETER Confirm + Confirms overwrite of index + + .PARAMETER WhatIf + Displays what would happen if the command is run + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Find, Help, Command + Author: Simone Bizzotto (@niphlod) + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Find-DbaCommand + + .EXAMPLE + PS C:\> Find-DbaCommand "snapshot" + + For lazy typers: finds all commands searching the entire help for "snapshot" + + .EXAMPLE + PS C:\> Find-DbaCommand -Pattern "snapshot" + + For rigorous typers: finds all commands searching the entire help for "snapshot" + + .EXAMPLE + PS C:\> Find-DbaCommand -Tag copy + + Finds all commands tagged with "copy" + + .EXAMPLE + PS C:\> Find-DbaCommand -Tag copy,user + + Finds all commands tagged with BOTH "copy" and "user" + + .EXAMPLE + PS C:\> Find-DbaCommand -Author chrissy + + Finds every command whose author contains our beloved "chrissy" + + .EXAMPLE + PS C:\> Find-DbaCommand -Author chrissy -Tag copy + + Finds every command whose author contains our beloved "chrissy" and it tagged as "copy" + + .EXAMPLE + PS C:\> Find-DbaCommand -Pattern snapshot -Rebuild + + Finds all commands searching the entire help for "snapshot", rebuilding the index (good for developers) + + #> + [CmdletBinding(SupportsShouldProcess)] + param ( + [String]$Pattern, + [String[]]$Tag, + [String]$Author, + [String]$MinimumVersion, + [String]$MaximumVersion, + [switch]$Rebuild, + [Alias('Silent')] + [switch]$EnableException + ) + begin { + function Get-DbaTrimmedString($Text) { + return $Text.Trim() -replace '(\r\n){2,}', "`n" + } + + $tagsRex = ([regex]'(?m)^[\s]{0,15}Tags:(.*)$') + $authorRex = ([regex]'(?m)^[\s]{0,15}Author:(.*)$') + $minverRex = ([regex]'(?m)^[\s]{0,15}MinimumVersion:(.*)$') + $maxverRex = ([regex]'(?m)^[\s]{0,15}MaximumVersion:(.*)$') + + function Get-DbaHelp([String]$commandName) { + $availability = 'Windows, Linux, macOS' + if ($commandName -in $script:noncoresmo -or $commandName -in $script:windowsonly) { + $availability = 'Windows only' + } + $thishelp = Get-Help $commandName -Full + $thebase = @{ } + $thebase.CommandName = $commandName + $thebase.Name = $thishelp.Name + + $thebase.Availability = $availability + + $alias = Get-Alias -Definition $commandName -ErrorAction SilentlyContinue + $thebase.Alias = $alias.Name -Join ',' + + ## fetch the description + $thebase.Description = $thishelp.Description.Text + + ## fetch examples + $thebase.Examples = Get-DbaTrimmedString -Text ($thishelp.Examples | Out-String -Width 200) + + ## fetch help link + $thebase.Links = ($thishelp.relatedLinks).NavigationLink.Uri + + ## fetch the synopsis + $thebase.Synopsis = $thishelp.Synopsis + + ## fetch the syntax + $thebase.Syntax = Get-DbaTrimmedString -Text ($thishelp.Syntax | Out-String -Width 600) + + ## store notes + $as = $thishelp.AlertSet | Out-String -Width 600 + + ## fetch the tags + $tags = $tagsrex.Match($as).Groups[1].Value + if ($tags) { + $thebase.Tags = $tags.Split(',').Trim() + } + ## fetch the author + $author = $authorRex.Match($as).Groups[1].Value + if ($author) { + $thebase.Author = $author.Trim() + } + + ## fetch MinimumVersion + $MinimumVersion = $minverRex.Match($as).Groups[1].Value + if ($MinimumVersion) { + $thebase.MinimumVersion = $MinimumVersion.Trim() + } + + ## fetch MaximumVersion + $MaximumVersion = $maxverRex.Match($as).Groups[1].Value + if ($MaximumVersion) { + $thebase.MaximumVersion = $MaximumVersion.Trim() + } + + ## fetch Parameters + $parameters = $thishelp.parameters.parameter + $command = Get-Command $commandName + $params = @() + foreach ($p in $parameters) { + $paramAlias = $command.parameters[$p.Name].Aliases + $paramDescr = Get-DbaTrimmedString -Text ($p.Description | Out-String -Width 200) + $params += , @($p.Name, $paramDescr, ($paramAlias -Join ','), ($p.Required -eq $true), $p.PipelineInput, $p.DefaultValue) + } + + $thebase.Params = $params + + [pscustomobject]$thebase + } + + function Get-DbaIndex() { + if ($Pscmdlet.ShouldProcess($dest, "Recreating index")) { + $dbamodule = Get-Module -Name dbatools + $allCommands = $dbamodule.ExportedCommands.Values | Where-Object CommandType -EQ 'Function' + + $helpcoll = New-Object System.Collections.Generic.List[System.Object] + foreach ($command in $allCommands) { + $x = Get-DbaHelp "$command" + $helpcoll.Add($x) + } + # $dest = Get-DbatoolsConfigValue -Name 'Path.TagCache' -Fallback "$(Resolve-Path $PSScriptRoot\..)\dbatools-index.json" + $dest = "$moduleDirectory\bin\dbatools-index.json" + $helpcoll | ConvertTo-Json -Depth 4 | Out-File $dest -Encoding UTF8 + } + } + + $moduleDirectory = (Get-Module -Name dbatools).ModuleBase + } + process { + $Pattern = $Pattern.TrimEnd("s") + $idxFile = "$moduleDirectory\bin\dbatools-index.json" + if (!(Test-Path $idxFile) -or $Rebuild) { + Write-Message -Level Verbose -Message "Rebuilding index into $idxFile" + $swRebuild = [system.diagnostics.stopwatch]::StartNew() + Get-DbaIndex + Write-Message -Level Verbose -Message "Rebuild done in $($swRebuild.ElapsedMilliseconds)ms" + } + $consolidated = Get-Content -Raw $idxFile | ConvertFrom-Json + $result = $consolidated + if ($Pattern.Length -gt 0) { + $result = $result | Where-Object { $_.PsObject.Properties.Value -like "*$Pattern*" } + } + + if ($Tag.Length -gt 0) { + foreach ($t in $Tag) { + $result = $result | Where-Object Tags -Contains $t + } + } + + if ($Author.Length -gt 0) { + $result = $result | Where-Object Author -Like "*$Author*" + } + + if ($MinimumVersion.Length -gt 0) { + $result = $result | Where-Object MinimumVersion -GE $MinimumVersion + } + + if ($MaximumVersion.Length -gt 0) { + $result = $result | Where-Object MaximumVersion -LE $MaximumVersion + } + + Select-DefaultView -InputObject $result -Property CommandName, Synopsis + } +} +#ValidationTags#Messaging# +function Find-DbaDatabase { + <# + .SYNOPSIS + Find database/s on multiple servers that match criteria you input + + .DESCRIPTION + Allows you to search SQL Server instances for database that have either the same name, owner or service broker guid. + + There a several reasons for the service broker guid not matching on a restored database primarily using alter database new broker. or turn off broker to return a guid of 0000-0000-0000-0000. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. + + .PARAMETER SqlCredential + Credential object used to connect to the SQL Server as a different user + + .PARAMETER Property + What you would like to search on. Either Database Name, Owner, or Service Broker GUID. Database name is the default. + + .PARAMETER Pattern + Value that is searched for. This is a regular expression match but you can just use a plain ol string like 'dbareports' + + .PARAMETER Exact + Search for an exact match instead of a pattern + + .PARAMETER Detailed + Output all properties, will be depreciated in 1.0.0 release. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Database + Author: Stephen Bennett, https://sqlnotesfromtheunderground.wordpress.com/ + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Find-DbaDatabase + + .EXAMPLE + PS C:\> Find-DbaDatabase -SqlInstance "DEV01", "DEV02", "UAT01", "UAT02", "PROD01", "PROD02" -Pattern Report + + Returns all database from the SqlInstances that have a database with Report in the name + + .EXAMPLE + PS C:\> Find-DbaDatabase -SqlInstance "DEV01", "DEV02", "UAT01", "UAT02", "PROD01", "PROD02" -Pattern TestDB -Exact | Select-Object * + + Returns all database from the SqlInstances that have a database named TestDB with a detailed output. + + .EXAMPLE + PS C:\> Find-DbaDatabase -SqlInstance "DEV01", "DEV02", "UAT01", "UAT02", "PROD01", "PROD02" -Property ServiceBrokerGuid -Pattern '-faeb-495a-9898-f25a782835f5' | Select-Object * + + Returns all database from the SqlInstances that have the same Service Broker GUID with a detailed output + + #> + [CmdletBinding()] + param ( + [Parameter(Mandatory, ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [Alias("Credential")] + [PSCredential]$SqlCredential, + [ValidateSet('Name', 'ServiceBrokerGuid', 'Owner')] + [string]$Property = 'Name', + [parameter(Mandatory)] + [string]$Pattern, + [switch]$Exact, + [switch]$Detailed, + [Alias('Silent')] + [switch]$EnableException + ) + begin { + Test-DbaDeprecation -DeprecatedOn 1.0.0 -Parameter Detailed + } + process { + foreach ($instance in $SqlInstance) { + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + if ($exact -eq $true) { + $dbs = $server.Databases | Where-Object IsAccessible | Where-Object { $_.$property -eq $pattern } + } else { + try { + $dbs = $server.Databases | Where-Object IsAccessible | Where-Object { $_.$property.ToString() -match $pattern } + } catch { + # they probably put asterisks thinking it's a like + $Pattern = $Pattern -replace '\*', '' + $Pattern = $Pattern -replace '\%', '' + $dbs = $server.Databases | Where-Object { $_.$property.ToString() -match $pattern } + } + } + + foreach ($db in $dbs) { + + $extendedproperties = @() + foreach ($xp in $db.ExtendedProperties) { + $extendedproperties += [PSCustomObject]@{ + Name = $db.ExtendedProperties[$xp.Name].Name + Value = $db.ExtendedProperties[$xp.Name].Value + } + } + + if ($extendedproperties.count -eq 0) { $extendedproperties = 0 } + + [PSCustomObject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.Name + Name = $db.Name + Size = [dbasize]($db.Size * 1024 * 1024) + Owner = $db.Owner + CreateDate = $db.CreateDate + ServiceBrokerGuid = $db.ServiceBrokerGuid + Tables = ($db.Tables | Where-Object { $_.IsSystemObject -eq $false }).Count + StoredProcedures = ($db.StoredProcedures | Where-Object { $_.IsSystemObject -eq $false }).Count + Views = ($db.Views | Where-Object { $_.IsSystemObject -eq $false }).Count + ExtendedProperties = $extendedproperties + } + } + } + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function Find-DbaDbGrowthEvent { + <# + .SYNOPSIS + Finds any database AutoGrow events in the Default Trace. + + .DESCRIPTION + Finds any database AutoGrow events in the Default Trace. + + The following events are included: + 92 - Data File Auto Grow + 93 - Log File Auto Grow + 94 - Data File Auto Shrink + 95 - Log File Auto Shrink + + .PARAMETER SqlInstance + The target SQL Server instance or instances. This can be a collection and receive pipeline input to allow the function to be executed against multiple SQL Server instances. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Database + The database(s) to process - this list is auto-populated from the server. If unspecified, all databases will be processed. + + .PARAMETER ExcludeDatabase + The database(s) to exclude - this list is auto-populated from the server + + .PARAMETER EventType + Provide a filter on growth event type to filter the results. + + Allowed values: Growth, Shrink + + .PARAMETER FileType + Provide a filter on file type to filter the results. + + Allowed values: Data, Log + + .PARAMETER UseLocalTime + Return the local time of the instance instead of converting to UTC. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: AutoGrow,Growth,Database + Author: Aaron Nelson + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + Query Extracted from SQL Server Management Studio (SSMS) 2016. + + .LINK + https://dbatools.io/Find-DbaDatabaseGrowthEvent + + .EXAMPLE + PS C:\> Find-DbaDatabaseGrowthEvent -SqlInstance localhost + + Returns any database AutoGrow events in the Default Trace with UTC time for the instance for every database on the localhost instance. + + .EXAMPLE + PS C:\> Find-DbaDatabaseGrowthEvent -SqlInstance localhost -UseLocalTime + + Returns any database AutoGrow events in the Default Trace with the local time of the instance for every database on the localhost instance. + + .EXAMPLE + PS C:\> Find-DbaDatabaseGrowthEvent -SqlInstance ServerA\SQL2016, ServerA\SQL2014 + + Returns any database AutoGrow events in the Default Traces for every database on ServerA\sql2016 & ServerA\SQL2014. + + .EXAMPLE + PS C:\> Find-DbaDatabaseGrowthEvent -SqlInstance ServerA\SQL2016 | Format-Table -AutoSize -Wrap + + Returns any database AutoGrow events in the Default Trace for every database on the ServerA\SQL2016 instance in a table format. + + .EXAMPLE + PS C:\> Find-DbaDatabaseGrowthEvent -SqlInstance ServerA\SQL2016 -EventType Shrink + + Returns any database Auto Shrink events in the Default Trace for every database on the ServerA\SQL2016 instance. + + .EXAMPLE + PS C:\> Find-DbaDatabaseGrowthEvent -SqlInstance ServerA\SQL2016 -EventType Growth -FileType Data + + Returns any database Auto Growth events on data files in the Default Trace for every database on the ServerA\SQL2016 instance. + + #> + [CmdletBinding()] + param ( + [parameter(Mandatory, ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer")] + [DbaInstance[]]$SqlInstance, + [PSCredential]$SqlCredential, + [Alias("Databases")] + [object[]]$Database, + [object[]]$ExcludeDatabase, + [ValidateSet('Growth', 'Shrink')] + [string]$EventType, + [ValidateSet('Data', 'Log')] + [string]$FileType, + [switch]$UseLocalTime, + [Alias('Silent')] + [switch]$EnableException + ) + + begin { + $eventClass = New-Object System.Collections.ArrayList + 92..95 | ForEach-Object { $null = $eventClass.Add($_) } + + if (Test-Bound 'EventType', 'FileType') { + switch ($FileType) { + 'Data' { + <# should only contain events for data: 92 (grow), 94 (shrink) #> + $eventClass.Remove(93) + $eventClass.Remove(95) + } + 'Log' { + <# should only contain events for log: 93 (grow), 95 (shrink) #> + $eventClass.Remove(92) + $eventClass.Remove(94) + } + } + switch ($EventType) { + 'Growth' { + <# should only contain events for growth: 92 (data), 93 (log) #> + $eventClass.Remove(94) + $eventClass.Remove(95) + } + 'Shrink' { + <# should only contain events for shrink: 94 (data), 95 (log) #> + $eventClass.Remove(92) + $eventClass.Remove(93) + } + } + } + + $eventClassFilter = $eventClass -join "," + + $sqlTemplate = " + BEGIN TRY + IF (SELECT CONVERT(INT,[value_in_use]) FROM sys.configurations WHERE [name] = 'default trace enabled' ) = 1 + BEGIN + DECLARE @curr_tracefilename VARCHAR(500); + DECLARE @base_tracefilename VARCHAR(500); + DECLARE @indx INT; + + SELECT @curr_tracefilename = [path] + FROM sys.traces + WHERE is_default = 1 ; + + SET @curr_tracefilename = REVERSE(@curr_tracefilename); + SELECT @indx = PATINDEX('%\%', @curr_tracefilename); + SET @curr_tracefilename = REVERSE(@curr_tracefilename); + SET @base_tracefilename = LEFT( @curr_tracefilename,LEN(@curr_tracefilename) - @indx) + '\log.trc'; + + SELECT + SERVERPROPERTY('MachineName') AS ComputerName, + ISNULL(SERVERPROPERTY('InstanceName'), 'MSSQLSERVER') AS InstanceName, + SERVERPROPERTY('ServerName') AS SqlInstance, + CONVERT(INT,(DENSE_RANK() OVER (ORDER BY [StartTime] DESC))%2) AS OrderRank, + CONVERT(INT, [EventClass]) AS EventClass, + [DatabaseName], + [Filename], + CONVERT(INT,(Duration/1000)) AS Duration, + $(if (-not $UseLocalTime) { " + DATEADD (MINUTE, DATEDIFF(MINUTE, GETDATE(), GETUTCDATE()), [StartTime]) AS StartTime, -- Convert to UTC time + DATEADD (MINUTE, DATEDIFF(MINUTE, GETDATE(), GETUTCDATE()), [EndTime]) AS EndTime, -- Convert to UTC time" + } + else { " + [StartTime] AS StartTime, + [EndTime] AS EndTime," + }) + ([IntegerData]*8.0/1024) AS ChangeInSize, + ApplicationName, + HostName, + SessionLoginName, + SPID + FROM::fn_trace_gettable( @base_tracefilename, DEFAULT ) + WHERE + [EventClass] IN ($eventClassFilter) + AND [ServerName] = @@SERVERNAME + AND [DatabaseName] IN (_DatabaseList_) + ORDER BY [StartTime] DESC; + END + ELSE + SELECT + SERVERPROPERTY('MachineName') AS ComputerName, + ISNULL(SERVERPROPERTY('InstanceName'), 'MSSQLSERVER') AS InstanceName, + SERVERPROPERTY('ServerName') AS SqlInstance, + -100 AS [OrderRank], + -1 AS [OrderRank], + 0 AS [EventClass], + 0 [DatabaseName], + 0 AS [Filename], + 0 AS [Duration], + 0 AS [StartTime], + 0 AS [EndTime], + 0 AS ChangeInSize, + 0 AS [ApplicationName], + 0 AS [HostName], + 0 AS [SessionLoginName], + 0 AS [SPID] + END TRY + BEGIN CATCH + SELECT + SERVERPROPERTY('MachineName') AS ComputerName, + ISNULL(SERVERPROPERTY('InstanceName'), 'MSSQLSERVER') AS InstanceName, + SERVERPROPERTY('ServerName') AS SqlInstance, + -100 AS [OrderRank], + -100 AS [OrderRank], + ERROR_NUMBER() AS [EventClass], + ERROR_SEVERITY() AS [DatabaseName], + ERROR_STATE() AS [Filename], + ERROR_MESSAGE() AS [Duration], + 1 AS [StartTime], + 1 AS [EndTime], + 1 AS [ChangeInSize], + 1 AS [ApplicationName], + 1 AS [HostName], + 1 AS [SessionLoginName], + 1 AS [SPID] + END CATCH" + + Test-DbaDeprecation -DeprecatedOn "1.0.0" -Alias Find-DbaDatabaseGrowthEvent + } + process { + foreach ($instance in $SqlInstance) { + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + $dbs = $server.Databases + + if ($Database) { + $dbs = $dbs | Where-Object Name -In $Database + } + + if ($ExcludeDatabase) { + $dbs = $dbs | Where-Object Name -NotIn $ExcludeDatabase + } + + #Create dblist name in 'db1', 'db2' format + $dbsList = "'$($($dbs | ForEach-Object {$_.Name}) -join "','")'" + Write-Message -Level Verbose -Message "Executing query against $dbsList on $instance" + + $sql = $sqlTemplate -replace '_DatabaseList_', $dbsList + Write-Message -Level Debug -Message "Executing SQL Statement:`n $sql" + + $defaults = 'ComputerName', 'InstanceName', 'SqlInstance', 'EventClass', 'DatabaseName', 'Filename', 'Duration', 'StartTime', 'EndTime', 'ChangeInSize', 'ApplicationName', 'HostName' + + try { + Select-DefaultView -InputObject $server.Query($sql) -Property $defaults + } catch { + Stop-Function -Message "Issue collecting data on $server" -Target $server -ErrorRecord $_ -Exception $_.Exception.InnerException.InnerException.InnerException -Continue + } + } + } +} +#ValidationTags#CodeStyle,Messaging,FlowControl,Pipeline# +function Find-DbaDbUnusedIndex { + <# + .SYNOPSIS + Find unused indexes + + .DESCRIPTION + This command will help you to find Unused indexes on a database or a list of databases + + For now only supported for CLUSTERED and NONCLUSTERED indexes + + .PARAMETER SqlInstance + The SQL Server you want to check for unused indexes. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Database + The database(s) to process. Options for this list are auto-populated from the server. If unspecified, all databases will be processed. + + .PARAMETER ExcludeDatabase + Specifies the database(s) to exclude from processing. Options for this list are auto-populated from the server. + + .PARAMETER IgnoreUptime + Less than 7 days uptime can mean that analysis of unused indexes is unreliable, and normally no results will be returned. By setting this option results will be returned even if the Instance has been running for less that 7 days. + + .PARAMETER InputObject + Enables piping from Get-DbaDatabase + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Index + Author: Aaron Nelson (@SQLvariant), SQLvariant.com + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Find-DbaDbUnusedIndex + + .EXAMPLE + PS C:\> Find-DbaDbUnusedIndex -SqlInstance sql2016 -Database db1, db2 + + Finds unused databases on db1 and db2 on sql2016 + + .EXAMPLE + PS C:\> Find-DbaDbUnusedIndex -SqlInstance sql2016 -SqlCredential $cred + + Finds unused databases on db1 and db2 on sql2016 using SQL Authentication to connect to the server + + .EXAMPLE + PS C:\> Get-DbaDatabase -SqlInstance sql2016 | Find-DbaDbUnusedIndex + + Finds unused databases on all databases on sql2016 + + #> + [CmdletBinding()] + param ( + [parameter(ValueFromPipeline)] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [object[]]$Database, + [object[]]$ExcludeDatabase, + [switch]$IgnoreUptime, + [Parameter(ValueFromPipeline)] + [Microsoft.SqlServer.Management.Smo.Database[]]$InputObject, + [switch]$EnableException + ) + begin { + # Support Compression 2008+ + $sql = "SELECT SERVERPROPERTY('MachineName') AS ComputerName, + ISNULL(SERVERPROPERTY('InstanceName'), 'MSSQLSERVER') AS InstanceName, + SERVERPROPERTY('ServerName') AS SqlInstance, DB_NAME(database_id) AS 'Database' + ,s.name AS 'Schema' + ,t.name AS 'Table' + ,i.object_id AS ObjectId + ,i.name AS 'IndexName' + ,i.index_id as 'IndexId' + ,i.type_desc as 'TypeDesc' + ,user_seeks as 'UserSeeks' + ,user_scans as 'UserScans' + ,user_lookups as 'UserLookups' + ,user_updates as 'UserUpdates' + ,last_user_seek as 'LastUserSeek' + ,last_user_scan as 'LastUserScan' + ,last_user_lookup as 'LastUserLookup' + ,last_user_update as 'LastUserUpdate' + ,system_seeks as 'SystemSeeks' + ,system_scans as 'SystemScans' + ,system_lookups as 'SystemLookup' + ,system_updates as 'SystemUpdates' + ,last_system_seek as 'LastSystemSeek' + ,last_system_scan as 'LastSystemScan' + ,last_system_lookup as 'LastSystemLookup' + ,last_system_update as 'LastSystemUpdate' + FROM sys.tables t + JOIN sys.schemas s + ON t.schema_id = s.schema_id + JOIN sys.indexes i + ON i.object_id = t.object_id LEFT OUTER + JOIN sys.dm_db_index_usage_stats iu + ON iu.object_id = i.object_id + AND iu.index_id = i.index_id + WHERE iu.database_id = DB_ID() + AND OBJECTPROPERTY(i.[object_id], 'IsMSShipped') = 0 + AND user_seeks = 0 + AND user_scans = 0 + AND user_lookups = 0 + AND i.type_desc NOT IN ('HEAP', 'CLUSTERED COLUMNSTORE')" + } + + process { + if ($SqlInstance) { + $InputObject += Get-DbaDatabase -SqlInstance $SqlInstance -SqlCredential $SqlCredential -Database $Database -ExcludeDatabase $ExcludeDatabase + } + + foreach ($db in $InputObject) { + if ($db.Parent.Databases[$db].IsAccessible -eq $false) { + Write-Message -Level Warning -Message "Database [$db] is not accessible." + continue + } + + $server = $db.Parent + $instance = $server.Name + + if ($server.VersionMajor -lt 9) { + Stop-Function -Message "This function does not support versions lower than SQL Server 2005 (v9)." -Continue + } + + $lastRestart = $server.Databases['tempdb'].CreateDate + $endDate = Get-Date -Date $lastRestart + $diffDays = (New-TimeSpan -Start $endDate -End (Get-Date)).Days + + if ($diffDays -le 6) { + if ($IgnoreUptime) { + Write-Message -Level Verbose -Message "The SQL Service was restarted on $lastRestart, which is not long enough for a solid evaluation." + } else { + Stop-Function -Message "The SQL Service on $instance was restarted on $lastRestart, which is not long enough for a solid evaluation." -Continue + } + } + + <# + Validate if server version is: + - sql 2012 and if have SP3 CU3 (Build 6537) or higher + - sql 2014 and if have SP2 (Build 5000) or higher + If the major version is the same but the build is lower, throws the message + #> + + if (($server.VersionMajor -eq 11 -and $server.BuildNumber -lt 6537) -or ($server.VersionMajor -eq 12 -and $server.BuildNumber -lt 5000)) { + Stop-Function -Message "This SQL version has a known issue. Rebuilding an index clears any existing row entry from sys.dm_db_index_usage_stats for that index.`r`nPlease refer to connect item: https://support.microsoft.com/en-us/help/3160407/fix-sys-dm-db-index-usage-stats-missing-information-after-index-rebuil" -Continue + } + + if ($diffDays -le 33) { + Write-Message -Level Verbose -Message "The SQL Service on $instance was restarted on $lastRestart, which may not be long enough for a solid evaluation." + } + + try { + $db.Query($sql) + } catch { + Stop-Function -Message "Issue gathering indexes" -Category InvalidOperation -ErrorRecord $_ -Target $db + } + } + } + end { + Test-DbaDeprecation -DeprecatedOn "1.0.0" -Alias Get-SqlUnusedIndex + } +} +function Find-DbaDisabledIndex { + <# + .SYNOPSIS + Find Disabled indexes + + .DESCRIPTION + This command will help you to find disabled indexes on a database or a list of databases. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Database + The database(s) to process. Options for this list are auto-populated from the server. If unspecified, all databases will be processed. + + .PARAMETER ExcludeDatabase + Specifies the database(s) to exclude from processing. Options for this list are auto-populated from the server. + + .PARAMETER NoClobber + If this switch is enabled, the output file will not be overwritten. + + .PARAMETER Append + If this switch is enabled, content will be appended to the output file. + + .PARAMETER WhatIf + If this switch is enabled, no actions are performed but informational messages will be displayed that explain what would happen if the command were to run. + + .PARAMETER Confirm + If this switch is enabled, you will be prompted for confirmation before executing any operations that change state. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Index + Author: Jason Squires, sqlnotnull.com + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Find-DbadisabledIndex + + .EXAMPLE + PS C:\> Find-DbaDisabledIndex -SqlInstance sql2005 + + Generates the SQL statements to drop the selected disabled indexes on server "sql2005". + + .EXAMPLE + PS C:\> Find-DbaDisabledIndex -SqlInstance sqlserver2016 -SqlCredential $cred + + Generates the SQL statements to drop the selected disabled indexes on server "sqlserver2016", using SQL Authentication to connect to the database. + + .EXAMPLE + PS C:\> Find-DbaDisabledIndex -SqlInstance sqlserver2016 -Database db1, db2 + + Generates the SQL Statement to drop selected indexes in databases db1 & db2 on server "sqlserver2016". + + .EXAMPLE + PS C:\> Find-DbaDisabledIndex -SqlInstance sqlserver2016 + + Generates the SQL statements to drop selected indexes on all user databases. + + #> + [CmdletBinding(SupportsShouldProcess)] + param ( + [parameter(Mandatory, ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential] + $SqlCredential, + [Alias("Databases")] + [object[]]$Database, + [object[]]$ExcludeDatabase, + [switch]$NoClobber, + [switch]$Append, + [Alias('Silent')] + [switch]$EnableException + ) + + begin { + $sql = " + SELECT DB_NAME() AS 'DatabaseName' + ,s.name AS 'SchemaName' + ,t.name AS 'TableName' + ,i.object_id AS ObjectId + ,i.name AS 'IndexName' + ,i.index_id as 'IndexId' + ,i.type_desc as 'TypeDesc' + FROM sys.tables t + JOIN sys.schemas s + ON t.schema_id = s.schema_id + JOIN sys.indexes i + ON i.object_id = t.object_id + WHERE i.is_disabled = 1" + } + process { + foreach ($instance in $SqlInstance) { + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential -MinimumVersion 9 + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + if ($Database) { + $databases = $server.Databases | Where-Object Name -in $database + } else { + $databases = $server.Databases | Where-Object IsAccessible -eq $true + } + + if ($databases.Count -gt 0) { + foreach ($db in $databases.name) { + + if ($ExcludeDatabase -contains $db -or $null -eq $server.Databases[$db]) { + continue + } + + try { + if ($PSCmdlet.ShouldProcess($db, "Getting disabled indexes")) { + Write-Message -Level Verbose -Message "Getting indexes from database '$db'." + Write-Message -Level Debug -Message "SQL Statement: $sql" + $disabledIndex = $server.Databases[$db].ExecuteWithResults($sql) + + if ($disabledIndex.Tables[0].Rows.Count -gt 0) { + $results = $disabledIndex.Tables[0]; + if ($results.Count -gt 0 -or !([string]::IsNullOrEmpty($results))) { + foreach ($index in $results) { + $index + } + } + } else { + Write-Message -Level Verbose -Message "No Disabled indexes found!" + } + } + } catch { + Stop-Function -Message "Issue gathering indexes" -Category InvalidOperation -InnerErrorRecord $_ -Target $db + } + } + } else { + Write-Message -Level Verbose -Message "There are no databases to analyse." + } + } + } + end { + Test-DbaDeprecation -DeprecatedOn "1.0.0" -EnableException:$false -Alias Get-SqlDisabledIndex + } +} +function Find-DbaDuplicateIndex { + <# + .SYNOPSIS + Find duplicate and overlapping indexes. + + .DESCRIPTION + This command will help you to find duplicate and overlapping indexes on a database or a list of databases. + + On SQL Server 2008 and higher, the IsFiltered property will also be checked + + Only supports CLUSTERED and NONCLUSTERED indexes. + + Output: + TableName + IndexName + KeyColumns + IncludedColumns + IndexSizeMB + IndexType + CompressionDescription (When 2008+) + [RowCount] + IsDisabled + IsFiltered (When 2008+) + + .PARAMETER SqlInstance + The target SQL Server instance or instances. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Database + The database(s) to process. Options for this list are auto-populated from the server. If unspecified, all databases will be processed. + + .PARAMETER IncludeOverlapping + If this switch is enabled, indexes which are partially duplicated will be returned. + + Example: If the first key column is the same between two indexes, but one has included columns and the other not, this will be shown. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Index + Author: Claudio Silva (@ClaudioESSilva) + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Find-DbaDuplicateIndex + + .EXAMPLE + PS C:\> Find-DbaDuplicateIndex -SqlInstance sql2005 + + Returns duplicate indexes found on sql2005 + + .EXAMPLE + PS C:\> Find-DbaDuplicateIndex -SqlInstance sql2017 -SqlCredential sqladmin + + Finds exact duplicate indexes on all user databases present on sql2017, using SQL authentication. + + .EXAMPLE + PS C:\> Find-DbaDuplicateIndex -SqlInstance sql2017 -Database db1, db2 + + Finds exact duplicate indexes on the db1 and db2 databases. + + .EXAMPLE + PS C:\> Find-DbaDuplicateIndex -SqlInstance sql2017 -IncludeOverlapping + + Finds both duplicate and overlapping indexes on all user databases. + + #> + [CmdletBinding()] + param ( + [parameter(Mandatory, ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [Alias("Databases")] + [object[]]$Database, + [switch]$IncludeOverlapping, + [switch]$EnableException + ) + + begin { + $exactDuplicateQuery2005 = " + WITH CTE_IndexCols + AS ( + SELECT i.[object_id] + ,i.index_id + ,OBJECT_SCHEMA_NAME(i.[object_id]) AS SchemaName + ,OBJECT_NAME(i.[object_id]) AS TableName + ,NAME AS IndexName + ,ISNULL(STUFF(( + SELECT ', ' + col.NAME + ' ' + CASE + WHEN idxCol.is_descending_key = 1 + THEN 'DESC' + ELSE 'ASC' + END -- Include column order (ASC / DESC) + FROM sys.index_columns idxCol + INNER JOIN sys.columns col ON idxCol.[object_id] = col.[object_id] + AND idxCol.column_id = col.column_id + WHERE i.[object_id] = idxCol.[object_id] + AND i.index_id = idxCol.index_id + AND idxCol.is_included_column = 0 + ORDER BY idxCol.key_ordinal + FOR XML PATH('') + ), 1, 2, ''), '') AS KeyColumns + ,ISNULL(STUFF(( + SELECT ', ' + col.NAME + ' ' + CASE + WHEN idxCol.is_descending_key = 1 + THEN 'DESC' + ELSE 'ASC' + END -- Include column order (ASC / DESC) + FROM sys.index_columns idxCol + INNER JOIN sys.columns col ON idxCol.[object_id] = col.[object_id] + AND idxCol.column_id = col.column_id + WHERE i.[object_id] = idxCol.[object_id] + AND i.index_id = idxCol.index_id + AND idxCol.is_included_column = 1 + ORDER BY idxCol.key_ordinal + FOR XML PATH('') + ), 1, 2, ''), '') AS IncludedColumns + ,i.[type_desc] AS IndexType + ,i.is_disabled AS IsDisabled + FROM sys.indexes AS i + WHERE i.index_id > 0 -- Exclude HEAPS + AND i.[type_desc] IN ( + 'CLUSTERED' + ,'NONCLUSTERED' + ) + AND OBJECT_SCHEMA_NAME(i.[object_id]) <> 'sys' + ) + ,CTE_IndexSpace + AS ( + SELECT s.[object_id] + ,s.index_id + ,SUM(s.[used_page_count]) * 8 / 1024.0 AS IndexSizeMB + ,SUM(p.[rows]) AS [RowCount] + FROM sys.dm_db_partition_stats AS s + INNER JOIN sys.partitions p WITH (NOLOCK) ON s.[partition_id] = p.[partition_id] + AND s.[object_id] = p.[object_id] + AND s.index_id = p.index_id + WHERE s.index_id > 0 -- Exclude HEAPS + AND OBJECT_SCHEMA_NAME(s.[object_id]) <> 'sys' + GROUP BY s.[object_id] + ,s.index_id + ) + SELECT DB_NAME() AS DatabaseName + ,CI1.SchemaName + '.' + CI1.TableName AS 'TableName' + ,CI1.IndexName + ,CI1.KeyColumns + ,CI1.IncludedColumns + ,CI1.IndexType + ,COALESCE(CSPC.IndexSizeMB,0) AS 'IndexSizeMB' + ,COALESCE(CSPC.[RowCount],0) AS 'RowCount' + ,CI1.IsDisabled + FROM CTE_IndexCols AS CI1 + LEFT JOIN CTE_IndexSpace AS CSPC ON CI1.[object_id] = CSPC.[object_id] + AND CI1.index_id = CSPC.index_id + WHERE EXISTS ( + SELECT 1 + FROM CTE_IndexCols CI2 + WHERE CI1.SchemaName = CI2.SchemaName + AND CI1.TableName = CI2.TableName + AND CI1.KeyColumns = CI2.KeyColumns + AND CI1.IncludedColumns = CI2.IncludedColumns + AND CI1.IndexName <> CI2.IndexName + )" + + $overlappingQuery2005 = " + WITH CTE_IndexCols + AS ( + SELECT i.[object_id] + ,i.index_id + ,OBJECT_SCHEMA_NAME(i.[object_id]) AS SchemaName + ,OBJECT_NAME(i.[object_id]) AS TableName + ,NAME AS IndexName + ,ISNULL(STUFF(( + SELECT ', ' + col.NAME + ' ' + CASE + WHEN idxCol.is_descending_key = 1 + THEN 'DESC' + ELSE 'ASC' + END -- Include column order (ASC / DESC) + FROM sys.index_columns idxCol + INNER JOIN sys.columns col ON idxCol.[object_id] = col.[object_id] + AND idxCol.column_id = col.column_id + WHERE i.[object_id] = idxCol.[object_id] + AND i.index_id = idxCol.index_id + AND idxCol.is_included_column = 0 + ORDER BY idxCol.key_ordinal + FOR XML PATH('') + ), 1, 2, ''), '') AS KeyColumns + ,ISNULL(STUFF(( + SELECT ', ' + col.NAME + ' ' + CASE + WHEN idxCol.is_descending_key = 1 + THEN 'DESC' + ELSE 'ASC' + END -- Include column order (ASC / DESC) + FROM sys.index_columns idxCol + INNER JOIN sys.columns col ON idxCol.[object_id] = col.[object_id] + AND idxCol.column_id = col.column_id + WHERE i.[object_id] = idxCol.[object_id] + AND i.index_id = idxCol.index_id + AND idxCol.is_included_column = 1 + ORDER BY idxCol.key_ordinal + FOR XML PATH('') + ), 1, 2, ''), '') AS IncludedColumns + ,i.[type_desc] AS IndexType + ,i.is_disabled AS IsDisabled + FROM sys.indexes AS i + WHERE i.index_id > 0 -- Exclude HEAPS + AND i.[type_desc] IN ( + 'CLUSTERED' + ,'NONCLUSTERED' + ) + AND OBJECT_SCHEMA_NAME(i.[object_id]) <> 'sys' + ) + ,CTE_IndexSpace + AS ( + SELECT s.[object_id] + ,s.index_id + ,SUM(s.[used_page_count]) * 8 / 1024.0 AS IndexSizeMB + ,SUM(p.[rows]) AS [RowCount] + FROM sys.dm_db_partition_stats AS s + INNER JOIN sys.partitions p WITH (NOLOCK) ON s.[partition_id] = p.[partition_id] + AND s.[object_id] = p.[object_id] + AND s.index_id = p.index_id + WHERE s.index_id > 0 -- Exclude HEAPS + AND OBJECT_SCHEMA_NAME(s.[object_id]) <> 'sys' + GROUP BY s.[object_id] + ,s.index_id + ) + SELECT DB_NAME() AS DatabaseName + ,CI1.SchemaName + '.' + CI1.TableName AS 'TableName' + ,CI1.IndexName + ,CI1.KeyColumns + ,CI1.IncludedColumns + ,CI1.IndexType + ,COALESCE(CSPC.IndexSizeMB,0) AS 'IndexSizeMB' + ,COALESCE(CSPC.[RowCount],0) AS 'RowCount' + ,CI1.IsDisabled + FROM CTE_IndexCols AS CI1 + LEFT JOIN CTE_IndexSpace AS CSPC ON CI1.[object_id] = CSPC.[object_id] + AND CI1.index_id = CSPC.index_id + WHERE EXISTS ( + SELECT 1 + FROM CTE_IndexCols CI2 + WHERE CI1.SchemaName = CI2.SchemaName + AND CI1.TableName = CI2.TableName + AND ( + ( + CI1.KeyColumns LIKE CI2.KeyColumns + '%' + AND SUBSTRING(CI1.KeyColumns, LEN(CI2.KeyColumns) + 1, 1) = ' ' + ) + OR ( + CI2.KeyColumns LIKE CI1.KeyColumns + '%' + AND SUBSTRING(CI2.KeyColumns, LEN(CI1.KeyColumns) + 1, 1) = ' ' + ) + ) + AND CI1.IndexName <> CI2.IndexName + )" + + # Support Compression 2008+ + $exactDuplicateQuery = " + WITH CTE_IndexCols + AS ( + SELECT i.[object_id] + ,i.index_id + ,OBJECT_SCHEMA_NAME(i.[object_id]) AS SchemaName + ,OBJECT_NAME(i.[object_id]) AS TableName + ,NAME AS IndexName + ,ISNULL(STUFF(( + SELECT ', ' + col.NAME + ' ' + CASE + WHEN idxCol.is_descending_key = 1 + THEN 'DESC' + ELSE 'ASC' + END -- Include column order (ASC / DESC) + FROM sys.index_columns idxCol + INNER JOIN sys.columns col ON idxCol.[object_id] = col.[object_id] + AND idxCol.column_id = col.column_id + WHERE i.[object_id] = idxCol.[object_id] + AND i.index_id = idxCol.index_id + AND idxCol.is_included_column = 0 + ORDER BY idxCol.key_ordinal + FOR XML PATH('') + ), 1, 2, ''), '') AS KeyColumns + ,ISNULL(STUFF(( + SELECT ', ' + col.NAME + ' ' + CASE + WHEN idxCol.is_descending_key = 1 + THEN 'DESC' + ELSE 'ASC' + END -- Include column order (ASC / DESC) + FROM sys.index_columns idxCol + INNER JOIN sys.columns col ON idxCol.[object_id] = col.[object_id] + AND idxCol.column_id = col.column_id + WHERE i.[object_id] = idxCol.[object_id] + AND i.index_id = idxCol.index_id + AND idxCol.is_included_column = 1 + ORDER BY idxCol.key_ordinal + FOR XML PATH('') + ), 1, 2, ''), '') AS IncludedColumns + ,i.[type_desc] AS IndexType + ,i.is_disabled AS IsDisabled + ,i.has_filter AS IsFiltered + FROM sys.indexes AS i + WHERE i.index_id > 0 -- Exclude HEAPS + AND i.[type_desc] IN ( + 'CLUSTERED' + ,'NONCLUSTERED' + ) + AND OBJECT_SCHEMA_NAME(i.[object_id]) <> 'sys' + ) + ,CTE_IndexSpace + AS ( + SELECT s.[object_id] + ,s.index_id + ,SUM(s.[used_page_count]) * 8 / 1024.0 AS IndexSizeMB + ,SUM(p.[rows]) AS [RowCount] + ,p.data_compression_desc AS CompressionDescription + FROM sys.dm_db_partition_stats AS s + INNER JOIN sys.partitions p WITH (NOLOCK) ON s.[partition_id] = p.[partition_id] + AND s.[object_id] = p.[object_id] + AND s.index_id = p.index_id + WHERE s.index_id > 0 -- Exclude HEAPS + AND OBJECT_SCHEMA_NAME(s.[object_id]) <> 'sys' + GROUP BY s.[object_id] + ,s.index_id + ,p.data_compression_desc + ) + SELECT DB_NAME() AS DatabaseName + ,CI1.SchemaName + '.' + CI1.TableName AS 'TableName' + ,CI1.IndexName + ,CI1.KeyColumns + ,CI1.IncludedColumns + ,CI1.IndexType + ,COALESCE(CSPC.IndexSizeMB,0) AS 'IndexSizeMB' + ,COALESCE(CSPC.CompressionDescription, 'NONE') AS 'CompressionDescription' + ,COALESCE(CSPC.[RowCount],0) AS 'RowCount' + ,CI1.IsDisabled + ,CI1.IsFiltered + FROM CTE_IndexCols AS CI1 + LEFT JOIN CTE_IndexSpace AS CSPC ON CI1.[object_id] = CSPC.[object_id] + AND CI1.index_id = CSPC.index_id + WHERE EXISTS ( + SELECT 1 + FROM CTE_IndexCols CI2 + WHERE CI1.SchemaName = CI2.SchemaName + AND CI1.TableName = CI2.TableName + AND CI1.KeyColumns = CI2.KeyColumns + AND CI1.IncludedColumns = CI2.IncludedColumns + AND CI1.IsFiltered = CI2.IsFiltered + AND CI1.IndexName <> CI2.IndexName + )" + + $overlappingQuery = " + WITH CTE_IndexCols AS + ( + SELECT + i.[object_id] + ,i.index_id + ,OBJECT_SCHEMA_NAME(i.[object_id]) AS SchemaName + ,OBJECT_NAME(i.[object_id]) AS TableName + ,Name AS IndexName + ,ISNULL(STUFF((SELECT ', ' + col.NAME + ' ' + CASE + WHEN idxCol.is_descending_key = 1 THEN 'DESC' + ELSE 'ASC' + END -- Include column order (ASC / DESC) + FROM sys.index_columns idxCol + INNER JOIN sys.columns col + ON idxCol.[object_id] = col.[object_id] + AND idxCol.column_id = col.column_id + WHERE i.[object_id] = idxCol.[object_id] + AND i.index_id = idxCol.index_id + AND idxCol.is_included_column = 0 + ORDER BY idxCol.key_ordinal + FOR XML PATH('')), 1, 2, ''), '') AS KeyColumns + ,ISNULL(STUFF((SELECT ', ' + col.NAME + ' ' + CASE + WHEN idxCol.is_descending_key = 1 THEN 'DESC' + ELSE 'ASC' + END -- Include column order (ASC / DESC) + FROM sys.index_columns idxCol + INNER JOIN sys.columns col + ON idxCol.[object_id] = col.[object_id] + AND idxCol.column_id = col.column_id + WHERE i.[object_id] = idxCol.[object_id] + AND i.index_id = idxCol.index_id + AND idxCol.is_included_column = 1 + ORDER BY idxCol.key_ordinal + FOR XML PATH('')), 1, 2, ''), '') AS IncludedColumns + ,i.[type_desc] AS IndexType + ,i.is_disabled AS IsDisabled + ,i.has_filter AS IsFiltered + FROM sys.indexes AS i + WHERE i.index_id > 0 -- Exclude HEAPS + AND i.[type_desc] IN ('CLUSTERED', 'NONCLUSTERED') + AND OBJECT_SCHEMA_NAME(i.[object_id]) <> 'sys' + ), + CTE_IndexSpace AS + ( + SELECT + s.[object_id] + ,s.index_id + ,SUM(s.[used_page_count]) * 8 / 1024.0 AS IndexSizeMB + ,SUM(p.[rows]) AS [RowCount] + ,p.data_compression_desc AS CompressionDescription + FROM sys.dm_db_partition_stats AS s + INNER JOIN sys.partitions p WITH (NOLOCK) + ON s.[partition_id] = p.[partition_id] + AND s.[object_id] = p.[object_id] + AND s.index_id = p.index_id + WHERE s.index_id > 0 -- Exclude HEAPS + AND OBJECT_SCHEMA_NAME(s.[object_id]) <> 'sys' + GROUP BY s.[object_id], s.index_id, p.data_compression_desc + ) + SELECT + DB_NAME() AS DatabaseName + ,CI1.SchemaName + '.' + CI1.TableName AS 'TableName' + ,CI1.IndexName + ,CI1.KeyColumns + ,CI1.IncludedColumns + ,CI1.IndexType + ,COALESCE(CSPC.IndexSizeMB,0) AS 'IndexSizeMB' + ,COALESCE(CSPC.CompressionDescription, 'NONE') AS 'CompressionDescription' + ,COALESCE(CSPC.[RowCount],0) AS 'RowCount' + ,CI1.IsDisabled + ,CI1.IsFiltered + FROM CTE_IndexCols AS CI1 + LEFT JOIN CTE_IndexSpace AS CSPC + ON CI1.[object_id] = CSPC.[object_id] + AND CI1.index_id = CSPC.index_id + WHERE EXISTS (SELECT 1 + FROM CTE_IndexCols CI2 + WHERE CI1.SchemaName = CI2.SchemaName + AND CI1.TableName = CI2.TableName + AND ( + (CI1.KeyColumns like CI2.KeyColumns + '%' and SUBSTRING(CI1.KeyColumns,LEN(CI2.KeyColumns)+1,1) = ' ') + OR (CI2.KeyColumns like CI1.KeyColumns + '%' and SUBSTRING(CI2.KeyColumns,LEN(CI1.KeyColumns)+1,1) = ' ') + ) + AND CI1.IsFiltered = CI2.IsFiltered + AND CI1.IndexName <> CI2.IndexName + )" + } + process { + if (Test-FunctionInterrupt) { return } + + foreach ($instance in $sqlinstance) { + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $sqlcredential -MinimumVersion 9 + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + if ($database) { + $databases = $server.Databases | Where-Object Name -in $database + } else { + $databases = $server.Databases | Where-Object IsAccessible -eq $true + } + + foreach ($db in $databases) { + try { + Write-Message -Level Verbose -Message "Getting indexes from database '$db'." + + $query = if ($server.versionMajor -eq 9) { + if ($IncludeOverlapping) { $overlappingQuery2005 } + else { $exactDuplicateQuery2005 } + } else { + if ($IncludeOverlapping) { $overlappingQuery } + else { $exactDuplicateQuery } + } + + $db.Query($query) + + } catch { + Stop-Function -Message "Query failure" -Target $db + } + } + } + } + end { + Test-DbaDeprecation -DeprecatedOn "1.0.0" -EnableException:$false -Alias Get-SqlDuplicateIndex + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function Find-DbaInstance { + <# + .SYNOPSIS + Search for SQL Server Instances. + + .DESCRIPTION + This function searches for SQL Server Instances. + + It supports a variety of scans for this purpose which can be separated in two categories: + - Discovery + - Scan + + Discovery: + This is where it compiles a list of computers / addresses to check. + It supports several methods of generating such lists (including Active Directory lookup or IP Ranges), but also supports specifying a list of computers to check. + - For details on discovery, see the documentation on the '-DiscoveryType' parameter + - For details on explicitly providing a list, see the documentation on the '-ComputerName' parameter + + Scan: + Once a list of computers has been provided, this command will execute a variety of actions to determine any instances present for each of them. + This is described in more detail in the documentation on the '-ScanType' parameter. + Additional parameters allow more granular control over individual scans (e.g. Credentials to use). + + Note on logging and auditing: + The Discovery phase is un-problematic since it is non-intrusive, however during the scan phase, all targeted computers may be accessed repeatedly. + This may cause issues with security teams, due to many logon events and possibly failed authentication. + This action constitutes a network scan, which may be illegal depending on the nation you are in and whether you own the network you scan. + If you are unsure whether you may use this command in your environment, check the detailed description on the '-ScanType' parameter and contact your IT security team for advice. + + .PARAMETER ComputerName + The computer to scan. Can be a variety of input types, including text or the output of Get-ADComputer. + Any extra instance information (such as connection strings or live sql server connections) beyond the computername will be discarded. + + .PARAMETER DiscoveryType + The mechanisms to be used to discover instances. + Supports any combination of: + - Service Principal Name lookup ('Domain'; from Active Directory) + - SQL Instance Enumeration ('DataSourceEnumeration'; same as SSMS uses) + - IP Address range ('IPRange'; all IP Addresses will be scanned) + + SPN Lookup: + The function tries to connect active directory to look up all computers with registered SQL Instances. + Not all instances need to be registered properly, making this not 100% reliable. + By default, your nearest Domain Controller is contacted for this scan. + However it is possible to explicitly state the DC to contact using its DistinguishedName and the '-DomainController' parameter. + If credentials were specified using the '-Credential' parameter, those same credentials are used to perform this lookup, allowing the scan of other domains. + + SQL Instance Enumeration: + This uses the default UDP Broadcast based instance enumeration used by SSMS to detect instances. + Note that the result from this is not used in the actual scan, but only to compile a list of computers to scan. + To enable the same results for the scan, ensure that the 'Browser' scan is enabled. + + IP Address range: + This 'Discovery' uses a range of IPAddresses and simply passes them on to be tested. + See the 'Description' part of help on security issues of network scanning. + By default, it will enumerate all ethernet network adapters on the local computer and scan the entire subnet they are on. + By using the '-IpAddress' parameter, custom network ranges can be specified. + + .PARAMETER Credential + The credentials to use on windows network connection. + These credentials are used for: + - Contact to domain controllers for SPN lookups (only if explicit Domain Controller is specified) + - CIM/WMI contact to the scanned computers during the scan phase (see the '-ScanType' parameter documentation on affected scans). + + .PARAMETER SqlCredential + The credentials used to connect to SqlInstances to during the scan phase. + See the '-ScanType' parameter documentation on affected scans. + + .PARAMETER ScanType + + The scans are the individual methods used to retrieve information about the scanned computer and any potentially installed instances. + This parameter is optional, by default all scans except for establishing an actual SQL connection are performed. + Scans can be specified in any arbitrary combination, however at least one instance detecting scan needs to be specified in order for data to be returned. + + Scans: + Browser + - Tries discovering all instances via the browser service + - This scan detects instances. + + SQLService + - Tries listing all SQL Services using CIM/WMI + - This scan uses credentials specified in the '-Credential' parameter if any. + - This scan detects instances. + - Success in this scan guarantees high confidence (See parameter '-MinimumConfidence' for details). + + SPN + - Tries looking up the Service Principal Names for each instance + - Will use the nearest Domain Controller by default + - Target a specific domain controller using the '-DomainController' parameter + - If using the '-DomainController' parameter, use the '-Credential' parameter to specify the credentials used to connect + + TCPPort + - Tries connecting to the TCP Ports. + - By default, port 1433 is connected to. + - The parameter '-TCPPort' can be used to provide a list of port numbers to scan. + - This scan detects possible instances. Since other services might bind to a given port, this is not the most reliable test. + - This scan is also used to validate found SPNs if both scans are used in combination + + DNSResolve + - Tries resolving the computername in DNS + + Ping + - Tries pinging the computer. Failure will NOT terminate scans. + + SqlConnect + - Tries to establish a SQL connection to the server + - Uses windows credentials by default + - Specify custom credentials using the '-SqlCredential' parameter + - This scan is not used by default + - Success in this scan guarantees high confidence (See parameter '-MinimumConfidence' for details). + + All + - All of the above + + .PARAMETER IpAddress + This parameter can be used to override the defaults for the IPRange discovery. + This parameter accepts a list of strings supporting any combination of: + - Plain IP Addresses (e.g.: "10.1.1.1") + - IP Address Ranges (e.g.: "10.1.1.1-10.1.1.5") + - IP Address & Subnet Mask (e.g.: "10.1.1.1/255.255.255.0") + - IP Address & Subnet Length: (e.g.: "10.1.1.1/24) + Overlapping addresses will not result in duplicate scans. + + .PARAMETER DomainController + The domain controller to contact for SPN lookups / searches. + Uses the credentials from the '-Credential' parameter if specified. + + .PARAMETER TCPPort + The ports to scan in the TCP Port Scan method. + Defaults to 1433. + + .PARAMETER MinimumConfidence + This command tries to discover instances, which isn't always a sure thing. + Depending on the number and type of scans completed, we have different levels of confidence in our results. + By default, we will return anything that we have at least a low confidence of being an instance. + These are the confidence levels we support and how they are determined: + - High: Established SQL Connection (including rejection for bad credentials) or service scan. + - Medium: Browser reply or a combination of TCPConnect _and_ SPN test. + - Low: Either TCPConnect _or_ SPN + - None: Computer existence could be verified, but no sign of an SQL Instance + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Instance, Connect, SqlServer + Author: Scott Sutherland, 2018 NetSPI | Friedrich Weinmann (@FredWeinmann) + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + Outside resources used and modified: + https://gallery.technet.microsoft.com/scriptcenter/List-the-IP-addresses-in-a-60c5bb6b + + .LINK + https://dbatools.io/Find-DbaInstance + + .EXAMPLE + PS C:\> Find-DbaInstance -DiscoveryType Domain, DataSourceEnumeration + + Performs a network search for SQL Instances by: + - Looking up the Service Principal Names of computers in active directory + - Using the UDP broadcast based auto-discovery of SSMS + After that it will extensively scan all hosts thus discovered for instances. + + .EXAMPLE + PS C:\> Find-DbaInstance -DiscoveryType All + + Performs a network search for SQL Instances, using all discovery protocols: + - Active directory search for Service Principal Names + - SQL Instance Enumeration (same as SSMS does) + - All IPAddresses in the current computer's subnets of all connected network interfaces + Note: This scan will take a long time, due to including the IP Scan + + .EXAMPLE + PS C:\> Get-ADComputer -Filter "*" | Find-DbaInstance + + Scans all computers in the domain for SQL Instances, using a deep probe: + - Tries resolving the name in DNS + - Tries pinging the computer + - Tries listing all SQL Services using CIM/WMI + - Tries discovering all instances via the browser service + - Tries connecting to the default TCP Port (1433) + - Tries connecting to the TCP port of each discovered instance + - Tries to establish a SQL connection to the server using default windows credentials + - Tries looking up the Service Principal Names for each instance + + .EXAMPLE + PS C:\> Get-Content .\servers.txt | Find-DbaInstance -SqlCredential $cred -ScanType Browser, SqlConnect + + Reads all servers from the servers.txt file (one server per line), + then scans each of them for instances using the browser service + and finally attempts to connect to each instance found using the specified credentials. + then scans each of them for instances using the browser service and SqlService + + .EXAMPLE + PS C:\> Find-DbaInstance -ComputerName localhost | Get-DbaDatabase | Format-Table -Wrap + + Scans localhost for instances using the browser service, traverses all instances for all databases and displays all information in a formatted table. + + .EXAMPLE + PS C:\> Find-DbaInstance -ComputerName localhost | Get-DbaDatabase | Select-Object SqlInstance, Name, Status, RecoveryModel, SizeMB, Compatibility, Owner, LastFullBackup, LastDiffBackup, LastLogBackup | Format-Table -Wrap + + Scans localhost for instances using the browser service, traverses all instances for all databases and displays a subset of the important information in a formatted table. + + Using this method reguarly is not recommended. Use Get-DbaService or Get-DbaCmsRegServer instead. + #> + [CmdletBinding()] + [Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSUseApprovedVerbs", "", Justification = "Internal functions are ignored")] + [Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSUseOutputTypeCorrectly", "", Justification = "PSSA Rule Ignored by BOH")] + param ( + [Parameter(Mandatory, ParameterSetName = 'Computer', ValueFromPipeline)] + [DbaInstance[]]$ComputerName, + [Parameter(Mandatory, ParameterSetName = 'Discover')] + [Sqlcollaborative.Dbatools.Discovery.DbaInstanceDiscoveryType]$DiscoveryType, + [System.Management.Automation.PSCredential]$Credential, + [System.Management.Automation.PSCredential]$SqlCredential, + [ValidateSet('Default', 'SQLService', 'Browser', 'TCPPort', 'All', 'SPN', 'Ping', 'SqlConnect', 'DNSResolve')] + [Sqlcollaborative.Dbatools.Discovery.DbaInstanceScanType[]]$ScanType = "Default", + [Parameter(ParameterSetName = 'Discover')] + [string[]]$IpAddress, + [string]$DomainController, + [int[]]$TCPPort = 1433, + [Sqlcollaborative.Dbatools.Discovery.DbaInstanceConfidenceLevel]$MinimumConfidence = 'Low', + [switch]$EnableException + ) + + begin { + + #region Utility Functions + function Test-SqlInstance { + <# + .SYNOPSIS + Performs the actual scanning logic + + .DESCRIPTION + Performs the actual scanning logic + Each potential target is accessed using the specified scan routines. + + .PARAMETER Target + The target to scan. + + .EXAMPLE + PS C:\> Test-SqlInstance + #> + [CmdletBinding()] + param ( + [Parameter(ValueFromPipeline)][DbaInstance[]]$Target, + [PSCredential]$Credential, + [PSCredential]$SqlCredential, + [Sqlcollaborative.Dbatools.Discovery.DbaInstanceScanType]$ScanType, + [string]$DomainController, + [int[]]$TCPPort = 1433, + [Sqlcollaborative.Dbatools.Discovery.DbaInstanceConfidenceLevel]$MinimumConfidence, + [switch]$EnableException + ) + + begin { + [System.Collections.ArrayList]$computersScanned = @() + } + + process { + foreach ($computer in $Target) { + if ($computersScanned.Contains($computer.ComputerName)) { + continue + } else { + $null = $computersScanned.Add($computer.ComputerName) + } + Write-Message -Level Verbose -Message "Processing: $($computer)" -Target $computer -FunctionName Find-DbaInstance + + #region Null variables to prevent scope lookup on conditional existence + $resolution = $null + $pingReply = $null + $sPNs = @() + $ports = @() + $browseResult = $null + $services = @() + #Variable marked as unused by PSScriptAnalyzer + #$serverObject = $null + #$browseFailed = $false + #endregion Null variables to prevent scope lookup on conditional existence + + #region Gather data + if ($ScanType -band [Sqlcollaborative.Dbatools.Discovery.DbaInstanceScanType]::DNSResolve) { + try { $resolution = [System.Net.Dns]::GetHostEntry($computer.ComputerName) } + catch { + # here to avoid an empty catch + $null = 1 + } + } + + if ($ScanType -band [Sqlcollaborative.Dbatools.Discovery.DbaInstanceScanType]::Ping) { + $ping = New-Object System.Net.NetworkInformation.Ping + try { $pingReply = $ping.Send($computer.ComputerName) } + catch { + # here to avoid an empty catch + $null = 1 + } + } + + if ($ScanType -band [Sqlcollaborative.Dbatools.Discovery.DbaInstanceScanType]::SPN) { + $computerByName = $computer.ComputerName + if ($resolution.HostName) { $computerByName = $resolution.HostName } + if ($computerByName -notmatch "$([dbargx]::IPv4)|$([dbargx]::IPv6)") { + try { $sPNs = Get-DomainSPN -DomainController $DomainController -Credential $Credential -ComputerName $computerByName -GetSPN } + catch { + # here to avoid an empty catch + $null = 1 + } + } + } + + # $ports required for all scans + $ports = $TCPPort | Test-TcpPort -ComputerName $computer + + if ($ScanType -band [Sqlcollaborative.Dbatools.Discovery.DbaInstanceScanType]::Browser) { + try { + $browseResult = Get-SQLInstanceBrowserUDP -ComputerName $computer -EnableException + } catch { + # here to avoid an empty catch + $null = 1 + } + } + + if ($ScanType -band [Sqlcollaborative.Dbatools.Discovery.DbaInstanceScanType]::SqlService) { + if ($Credential) { $services = Get-DbaService -ComputerName $computer -Credential $Credential -EnableException -ErrorAction Ignore -WarningAction SilentlyCOntinue } + else { $services = Get-DbaService -ComputerName $computer -ErrorAction Ignore -WarningAction SilentlyContinue } + } + #endregion Gather data + + #region Gather list of found instance indicators + $instanceNames = @() + if ($Services) { + $Services | Select-Object -ExpandProperty InstanceName -Unique | Where-Object { $_ -and ($instanceNames -notcontains $_) } | ForEach-Object { + $instanceNames += $_ + } + } + if ($browseResult) { + $browseResult | Select-Object -ExpandProperty InstanceName -Unique | Where-Object { $_ -and ($instanceNames -notcontains $_) } | ForEach-Object { + $instanceNames += $_ + } + } + + $portsDetected = @() + foreach ($portResult in $ports) { + if ($portResult.IsOpen) { $portsDetected += $portResult.Port } + } + foreach ($sPN in $sPNs) { + try { $inst = $sPN.Split(':')[1] } + catch { continue } + + try { + [int]$portNumber = $inst + if ($portNumber -and ($portsDetected -notcontains $portNumber)) { + $portsDetected += $portNumber + } + } catch { + if ($inst -and ($instanceNames -notcontains $inst)) { + $instanceNames += $inst + } + } + } + #endregion Gather list of found instance indicators + + #region Case: Nothing found + if ((-not $instanceNames) -and (-not $portsDetected)) { + if ($resolution -or ($pingReply.Status -like "Success")) { + if ($MinimumConfidence -eq [Sqlcollaborative.Dbatools.Discovery.DbaInstanceConfidenceLevel]::None) { + New-Object Sqlcollaborative.Dbatools.Discovery.DbaInstanceReport -Property @{ + MachineName = $computer.ComputerName + ComputerName = $computer.ComputerName + Ping = $pingReply.Status -like 'Success' + } + } else { + Write-Message -Level Verbose -Message "Computer $computer could be contacted, but no trace of an SQL Instance was found. Skipping..." -Target $computer -FunctionName Find-DbaInstance + } + } else { + Write-Message -Level Verbose -Message "Computer $computer could not be contacted, skipping." -Target $computer -FunctionName Find-DbaInstance + } + + continue + } + #endregion Case: Nothing found + + [System.Collections.ArrayList]$masterList = @() + + #region Case: Named instance found + foreach ($instance in $instanceNames) { + $object = New-Object Sqlcollaborative.Dbatools.Discovery.DbaInstanceReport + $object.MachineName = $computer.ComputerName + $object.ComputerName = $computer.ComputerName + $object.InstanceName = $instance + $object.DnsResolution = $resolution + $object.Ping = $pingReply.Status -like 'Success' + $object.ScanTypes = $ScanType + $object.Services = $services | Where-Object InstanceName -EQ $instance + $object.SystemServices = $services | Where-Object { -not $_.InstanceName } + $object.SPNs = $sPNs + + if ($result = $browseResult | Where-Object InstanceName -EQ $instance) { + $object.BrowseReply = $result + } + if ($ports) { + $object.PortsScanned = $ports + } + + if ($object.BrowseReply) { + $object.Confidence = 'Medium' + if ($object.BrowseReply.TCPPort) { + $object.Port = $object.BrowseReply.TCPPort + + $object.PortsScanned | Where-Object Port -EQ $object.Port | ForEach-Object { + $object.TcpConnected = $_.IsOpen + } + } + } + if ($object.Services) { + $object.Confidence = 'High' + + $engine = $object.Services | Where-Object ServiceType -EQ "Engine" + switch ($engine.State) { + "Running" { $object.Availability = 'Available' } + "Stopped" { $object.Availability = 'Unavailable' } + default { $object.Availability = 'Unknown' } + } + } + + $object.Timestamp = Get-Date + + $masterList += $object + } + #endregion Case: Named instance found + + #region Case: Port number found + foreach ($port in $portsDetected) { + if ($masterList.Port -contains $port) { continue } + + $object = New-Object Sqlcollaborative.Dbatools.Discovery.DbaInstanceReport + $object.MachineName = $computer.ComputerName + $object.ComputerName = $computer.ComputerName + $object.Port = $port + $object.DnsResolution = $resolution + $object.Ping = $pingReply.Status -like 'Success' + $object.ScanTypes = $ScanType + $object.SystemServices = $services | Where-Object { -not $_.InstanceName } + $object.SPNs = $sPNs + $object.Confidence = 'Low' + if ($ports) { + $object.PortsScanned = $ports + + if (($ports | Where-Object IsOpen).Port -eq 1433) { + $object.Confidence = 'Medium' + } + } + + if (($ports.Port -contains $port) -and ($sPNs | Where-Object { $_ -like "*:$port" })) { + $object.Confidence = 'Medium' + } + + $object.PortsScanned | Where-Object Port -EQ $object.Port | ForEach-Object { + $object.TcpConnected = $_.IsOpen + } + $object.Timestamp = Get-Date + + if ($masterList.SqlInstance -contains $object.SqlInstance) { + continue + } + + $masterList += $object + } + #endregion Case: Port number found + + if ($ScanType -band [Sqlcollaborative.Dbatools.Discovery.DbaInstanceScanType]::SqlConnect) { + $instanceHash = @{ } + $toDelete = @() + foreach ($dataSet in $masterList) { + try { + $server = Connect-SqlInstance -SqlInstance $dataSet.FullSmoName -SqlCredential $SqlCredential + $dataSet.SqlConnected = $true + $dataSet.Confidence = 'High' + + # Remove duplicates + if ($instanceHash.ContainsKey($server.DomainInstanceName)) { + $toDelete += $dataSet + } else { + $instanceHash[$server.DomainInstanceName] = $dataSet + + try { + $dataSet.MachineName = $server.ComputerNamePhysicalNetBIOS + } catch { + # here to avoid an empty catch + $null = 1 + } + } + } catch { + # Error class definitions + # https://docs.microsoft.com/en-us/sql/relational-databases/errors-events/database-engine-error-severities + # 24 or less means an instance was found, but had some issues + + #region Processing error (Access denied, server error, ...) + if ($_.Exception.InnerException.Errors.Class -lt 25) { + # There IS an SQL Instance and it listened to network traffic + $dataSet.SqlConnected = $true + $dataSet.Confidence = 'High' + } + #endregion Processing error (Access denied, server error, ...) + + #region Other connection errors + else { + $dataSet.SqlConnected = $false + } + #endregion Other connection errors + } + } + + foreach ($item in $toDelete) { + $masterList.Remove($item) + } + } + + $masterList + } + } + } + + function Get-DomainSPN { + <# + .SYNOPSIS + Returns all computernames with registered MSSQL SPNs. + + .DESCRIPTION + Returns all computernames with registered MSSQL SPNs. + + .PARAMETER DomainController + The domain controller to ask. + + .PARAMETER Credential + The credentials to use while asking. + + .PARAMETER ComputerName + Filter by computername + + .PARAMETER GetSPN + Returns the service SPNs instead of the hostname + + .EXAMPLE + PS C:\> Get-DomainSPN -DomainController $DomainController -Credential $Credential + + Returns all computernames with MSQL SPNs known to $DomainController, assuming credentials are valid. + #> + [CmdletBinding()] + param ( + [string]$DomainController, + [Pscredential]$Credential, + [string]$ComputerName = "*", + [switch]$GetSPN + ) + + try { + if ($DomainController) { + if ($Credential) { + $entry = New-Object -TypeName System.DirectoryServices.DirectoryEntry -ArgumentList "LDAP://$DomainController", $Credential.UserName, $Credential.GetNetworkCredential().Password + } else { + $entry = New-Object -TypeName System.DirectoryServices.DirectoryEntry -ArgumentList "LDAP://$DomainController" + } + } else { + $entry = [ADSI]'' + } + $objSearcher = New-Object -TypeName System.DirectoryServices.DirectorySearcher -ArgumentList $entry + + $objSearcher.PageSize = 200 + $objSearcher.Filter = "(&(objectcategory=computer)(servicePrincipalName=MSSQLsvc*)(|(name=$ComputerName)(dnshostname=$ComputerName)))" + $objSearcher.SearchScope = 'Subtree' + + $results = $objSearcher.FindAll() + foreach ($computer in $results) { + if ($GetSPN) { + $computer.Properties["serviceprincipalname"] | Where-Object { $_ -like "MSSQLsvc*:*" } + } else { + if ($computer.Properties["dnshostname"]) { + $computer.Properties["dnshostname"][0] + } else { + $computer.Properties["name"][0] + } + } + } + } catch { + throw + } + } + + function Get-SQLInstanceBrowserUDP { + <# + .SYNOPSIS + Requests a list of instances from the browser service. + + .DESCRIPTION + Requests a list of instances from the browser service. + + .PARAMETER ComputerName + Computer name or IP address to enumerate SQL Instance from. + + .PARAMETER UDPTimeOut + Timeout in seconds. Longer timeout = more accurate. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .EXAMPLE + PS C:\> Get-SQLInstanceBrowserUDP -ComputerName 'sql2017' + + Contacts the browsing service on sql2017 and requests its instance information. + + .NOTES + Original Author: Eric Gruber + Editors: + - Scott Sutherland (Pipeline and timeout mods) + - Friedrich Weinmann (Cleanup & dbatools Standardization) + + #> + [CmdletBinding()] + param ( + [Parameter(Mandatory, ValueFromPipeline)][DbaInstance[]]$ComputerName, + [int]$UDPTimeOut = 2, + [switch]$EnableException + ) + + process { + foreach ($computer in $ComputerName) { + try { + #region Connect to browser service and receive response + $UDPClient = New-Object -TypeName System.Net.Sockets.Udpclient + $UDPClient.Client.ReceiveTimeout = $UDPTimeOut * 1000 + $UDPClient.Connect($computer.ComputerName, 1434) + $UDPPacket = 0x03 + $UDPEndpoint = New-Object -TypeName System.Net.IpEndPoint -ArgumentList ([System.Net.Ipaddress]::Any, 0) + $UDPClient.Client.Blocking = $true + [void]$UDPClient.Send($UDPPacket, $UDPPacket.Length) + $BytesRecived = $UDPClient.Receive([ref]$UDPEndpoint) + # Skip first three characters, since those contain trash data (SSRP metadata) + #$Response = [System.Text.Encoding]::ASCII.GetString($BytesRecived[3..($BytesRecived.Length - 1)]) + $Response = [System.Text.Encoding]::ASCII.GetString($BytesRecived) + #endregion Connect to browser service and receive response + + #region Parse Output + $Response | Select-String "(ServerName;(\w+);InstanceName;(\w+);IsClustered;(\w+);Version;(\d+\.\d+\.\d+\.\d+);(tcp;(\d+)){0,1})" -AllMatches | Select-Object -ExpandProperty Matches | ForEach-Object { + $obj = New-Object Sqlcollaborative.Dbatools.Discovery.DbaBrowserReply -Property @{ + MachineName = $computer.ComputerName + ComputerName = $_.Groups[2].Value + SqlInstance = "$($_.Groups[2].Value)\$($_.Groups[3].Value)" + InstanceName = $_.Groups[3].Value + Version = $_.Groups[5].Value + IsClustered = "Yes" -eq $_.Groups[4].Value + } + if ($_.Groups[7].Success) { + $obj.TCPPort = $_.Groups[7].Value + } + $obj + } + #endregion Parse Output + + $UDPClient.Close() + } catch { + try { + $UDPClient.Close() + } catch { + # here to avoid an empty catch + $null = 1 + } + + if ($EnableException) { throw } + } + } + } + } + + function Test-TcpPort { + <# + .SYNOPSIS + Tests whether a TCP Port is open or not. + + .DESCRIPTION + Tests whether a TCP Port is open or not. + + .PARAMETER ComputerName + The name of the computer to scan. + + .PARAMETER Port + The port(s) to scan. + + .EXAMPLE + PS C:\> $ports | Test-TcpPort -ComputerName "foo" + + Tests for each port in $ports whether the TCP port is open on computer "foo" + #> + [CmdletBinding()] + param ( + [DbaInstance]$ComputerName, + [Parameter(ValueFromPipeline)][int[]]$Port + ) + + begin { + $client = New-Object Net.Sockets.TcpClient + } + process { + foreach ($item in $Port) { + try { + $client.Connect($ComputerName.ComputerName, $item) + if ($client.Connected) { + $client.Close() + New-Object -TypeName Sqlcollaborative.Dbatools.Discovery.DbaPortReport -ArgumentList $ComputerName.ComputerName, $item, $true + } else { + New-Object -TypeName Sqlcollaborative.Dbatools.Discovery.DbaPortReport -ArgumentList $ComputerName.ComputerName, $item, $false + } + } catch { + New-Object -TypeName Sqlcollaborative.Dbatools.Discovery.DbaPortReport -ArgumentList $ComputerName.ComputerName, $item, $false + } + } + } + } + + function Get-IPrange { + <# + .SYNOPSIS + Get the IP addresses in a range + + .DESCRIPTION + A detailed description of the Get-IPrange function. + + .PARAMETER Start + A description of the Start parameter. + + .PARAMETER End + A description of the End parameter. + + .PARAMETER IPAddress + A description of the IPAddress parameter. + + .PARAMETER Mask + A description of the Mask parameter. + + .PARAMETER Cidr + A description of the Cidr parameter. + + .EXAMPLE + Get-IPrange -Start 192.168.8.2 -End 192.168.8.20 + + .EXAMPLE + Get-IPrange -IPAddress 192.168.8.2 -Mask 255.255.255.0 + + .EXAMPLE + Get-IPrange -IPAddress 192.168.8.3 -Cidr 24 + + .NOTES + Author: BarryCWT + Reference: https://gallery.technet.microsoft.com/scriptcenter/List-the-IP-addresses-in-a-60c5bb6b + #> + + param + ( + [string]$Start, + [string]$End, + [string]$IPAddress, + [string]$Mask, + [int]$Cidr + ) + + function IP-toINT64 { + param ($ip) + + $octets = $ip.split(".") + return [int64]([int64]$octets[0] * 16777216 + [int64]$octets[1] * 65536 + [int64]$octets[2] * 256 + [int64]$octets[3]) + } + + function INT64-toIP { + param ([int64]$int) + + return ([System.Net.IPAddress](([math]::truncate($int / 16777216)).tostring() + "." + ([math]::truncate(($int % 16777216) / 65536)).tostring() + "." + ([math]::truncate(($int % 65536) / 256)).tostring() + "." + ([math]::truncate($int % 256)).tostring())) + } + + if ($Cidr) { + $maskaddr = [Net.IPAddress]::Parse((INT64-toIP -int ([convert]::ToInt64(("1" * $Cidr + "0" * (32 - $Cidr)), 2)))) + } + if ($Mask) { + $maskaddr = [Net.IPAddress]::Parse($Mask) + } + if ($IPAddress) { + $ipaddr = [Net.IPAddress]::Parse($IPAddress) + $networkaddr = new-object net.ipaddress ($maskaddr.address -band $ipaddr.address) + $broadcastaddr = new-object net.ipaddress (([system.net.ipaddress]::parse("255.255.255.255").address -bxor $maskaddr.address -bor $networkaddr.address)) + $startaddr = IP-toINT64 -ip $networkaddr.ipaddresstostring + $endaddr = IP-toINT64 -ip $broadcastaddr.ipaddresstostring + } else { + $startaddr = IP-toINT64 -ip $Start + $endaddr = IP-toINT64 -ip $End + } + + for ($i = $startaddr; $i -le $endaddr; $i++) { + INT64-toIP -int $i + } + } + + function Resolve-IPRange { + <# + .SYNOPSIS + Returns a number of IPAddresses based on range specified. + + .DESCRIPTION + Returns a number of IPAddresses based on range specified. + Warning: A too large range can lead to memory exceptions. + + Scans subnet of active computer if no address is specified. + + .PARAMETER IpAddress + The address / range / mask / cidr to scan. Example input: + - 10.1.1.1 + - 10.1.1.1/24 + - 10.1.1.1-10.1.1.254 + - 10.1.1.1/255.255.255.0 + #> + [CmdletBinding()] + param ( + [AllowEmptyString()][string]$IpAddress + ) + + #region Scan defined range + if ($IpAddress) { + #region Determine processing mode + $mode = 'Unknown' + if ($IpAddress -like "*/*") { + $parts = $IpAddress.Split("/") + + $address = $parts[0] + if ($parts[1] -match ([dbargx]::IPv4)) { + $mask = $parts[1] + $mode = 'Mask' + } elseif ($parts[1] -as [int]) { + $cidr = [int]$parts[1] + + if (($cidr -lt 8) -or ($cidr -gt 31)) { + throw "$IpAddress does not contain a valid cidr mask!" + } + + $mode = 'CIDR' + } else { + throw "$IpAddress is not a valid IP Range!" + } + } elseif ($IpAddress -like "*-*") { + $rangeStart = $IpAddress.Split("-")[0] + $rangeEnd = $IpAddress.Split("-")[1] + + if ($rangeStart -notmatch ([dbargx]::IPv4)) { + throw "$IpAddress is not a valid IP Range!" + } + if ($rangeEnd -notmatch ([dbargx]::IPv4)) { + throw "$IpAddress is not a valid IP Range!" + } + + $mode = 'Range' + } else { + if ($IpAddress -notmatch ([dbargx]::IPv4)) { + throw "$IpAddress is not a valid IP Address!" + } + return $IpAddress + } + #endregion Determine processing mode + + switch ($mode) { + 'CIDR' { + Get-IPrange -IPAddress $address -Cidr $cidr + } + 'Mask' { + Get-IPrange -IPAddress $address -Mask $mask + } + 'Range' { + Get-IPrange -Start $rangeStart -End $rangeEnd + } + } + } + #endregion Scan defined range + + #region Scan own computer range + else { + foreach ($interface in ([System.Net.NetworkInformation.NetworkInterface]::GetAllNetworkInterfaces() | Where-Object NetworkInterfaceType -Like '*Ethernet*')) { + foreach ($property in ($interface.GetIPProperties().UnicastAddresses | Where-Object { $_.Address.AddressFamily -like "InterNetwork" })) { + Get-IPrange -IPAddress $property.Address -Cidr $property.PrefixLength + } + } + } + #endregion Scan own computer range + } + #endregion Utility Functions + + #region Build parameter Splat for scan + $paramTestSqlInstance = @{ + ScanType = $ScanType + TCPPort = $TCPPort + EnableException = $EnableException + MinimumConfidence = $MinimumConfidence + } + + # Only specify when passed by user to avoid credential prompts on PS3/4 + if ($SqlCredential) { + $paramTestSqlInstance["SqlCredential"] = $SqlCredential + } + if ($Credential) { + $paramTestSqlInstance["Credential"] = $Credential + } + if ($DomainController) { + $paramTestSqlInstance["DomainController"] = $DomainController + } + #endregion Build parameter Splat for scan + + # Prepare item processing in a pipeline compliant way + $wrappedCmd = $ExecutionContext.InvokeCommand.GetCommand('Test-SqlInstance', [System.Management.Automation.CommandTypes]::Function) + $scriptCmd = { + & $wrappedCmd @paramTestSqlInstance + } + $steppablePipeline = $scriptCmd.GetSteppablePipeline() + $steppablePipeline.Begin($true) + } + + process { + if (Test-FunctionInterrupt) { return } + #region Process items or discover stuff + switch ($PSCmdlet.ParameterSetName) { + 'Computer' { + $ComputerName | Invoke-SteppablePipeline -Pipeline $steppablePipeline + } + 'Discover' { + #region Discovery: DataSource Enumeration + if ($DiscoveryType -band ([Sqlcollaborative.Dbatools.Discovery.DbaInstanceDiscoveryType]::DataSourceEnumeration)) { + try { + # Discover instances + foreach ($instance in ([System.Data.Sql.SqlDataSourceEnumerator]::Instance.GetDataSources())) { + if ($instance.InstanceName -ne [System.DBNull]::Value) { + $steppablePipeline.Process("$($instance.Servername)\$($instance.InstanceName)") + } else { + $steppablePipeline.Process($instance.Servername) + } + } + } catch { + Write-Message -Level Warning -Message "Datasource enumeration failed" -ErrorRecord $_ -EnableException $EnableException.ToBool() + } + } + #endregion Discovery: DataSource Enumeration + + #region Discovery: SPN Search + if ($DiscoveryType -band ([Sqlcollaborative.Dbatools.Discovery.DbaInstanceDiscoveryType]::Domain)) { + try { + Get-DomainSPN -DomainController $DomainController -Credential $Credential -ErrorAction Stop | Invoke-SteppablePipeline -Pipeline $steppablePipeline + } catch { + Write-Message -Level Warning -Message "Failed to execute Service Principal Name discovery" -ErrorRecord $_ -EnableException $EnableException.ToBool() + } + } + #endregion Discovery: SPN Search + + #region Discovery: IP Range + if ($DiscoveryType -band ([Sqlcollaborative.Dbatools.Discovery.DbaInstanceDiscoveryType]::IPRange)) { + if ($IpAddress) { + foreach ($address in $IpAddress) { + Resolve-IPRange -IpAddress $address | Invoke-SteppablePipeline -Pipeline $steppablePipeline + } + } else { + Resolve-IPRange | Invoke-SteppablePipeline -Pipeline $steppablePipeline + } + } + #endregion Discovery: IP Range + } + default { + Stop-Function -Message "Invalid parameterset, some developer probably had a beer too much. Please file an issue so we can fix this" -EnableException $EnableException + return + } + } + #endregion Process items or discover stuff + } + + end { + if (Test-FunctionInterrupt) { + return + } + $steppablePipeline.End() + } +} +#ValidationTags#Messaging# +function Find-DbaLoginInGroup { + <# + .SYNOPSIS + Finds Logins in Active Directory groups that have logins on the SQL Instance. + + .DESCRIPTION + Outputs all the active directory groups members for a server, or limits it to find a specific AD user in the groups + + .PARAMETER SqlInstance + The target SQL Server instance or instances. This can be a collection and receive pipeline input. + + .PARAMETER SqlCredential + PSCredential object to connect under. If not specified, current Windows login will be used. + + .PARAMETER Login + Find all AD Groups used on the instance that an individual login is a member of. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Login, Group, Security + Author: Stephen Bennett, https://sqlnotesfromtheunderground.wordpress.com/ | Simone Bizzotto (@niphlod) + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Find-DbaLoginInGroup + + .EXAMPLE + PS C:\> Find-DbaLoginInGroup -SqlInstance DEV01 -Login "MyDomain\Stephen.Bennett" + + Returns all active directory groups with logins on Sql Instance DEV01 that contain the AD user Stephen.Bennett. + + .EXAMPLE + PS C:\> Find-DbaLoginInGroup -SqlInstance DEV01 + + Returns all active directory users within all windows AD groups that have logins on the instance. + + .EXAMPLE + PS C:\> Find-DbaLoginInGroup -SqlInstance DEV01 | Where-Object Login -like '*stephen*' + + Returns all active directory users within all windows AD groups that have logins on the instance whose login contains "stephen" + + #> + [CmdletBinding()] + [Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSUseSingularNouns", "", Justification = "Internal functions are ignored")] + param ( + [parameter(Mandatory, ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [string[]]$Login, + [Alias('Silent')] + [switch]$EnableException + ) + begin { + try { + Add-Type -AssemblyName System.DirectoryServices.AccountManagement + } catch { + Stop-Function -Message "Failed to load Assembly needed" -ErrorRecord $_ + } + + function Get-AllLogins { + param + ( + [string]$ADGroup, + [string[]]$discard, + [string]$ParentADGroup + ) + begin { + $output = @() + } + process { + try { + $domain = $AdGroup.Split("\")[0] + $ads = New-Object System.DirectoryServices.AccountManagement.PrincipalContext('Domain', $domain) + [string]$groupName = $AdGroup + $group = [System.DirectoryServices.AccountManagement.GroupPrincipal]::FindByIdentity($ads, $groupName); + $subgroups = @() + foreach ($member in $group.Members) { + $memberDomain = $ads.Name + if ($member.StructuralObjectClass -eq 'group') { + $fullName = $memberDomain + "\" + $member.SamAccountName + if ($fullName -in $discard) { + Write-Message -Level Verbose -Message "skipping $fullName, already enumerated" + continue + } else { + $subgroups += $fullName + } + } else { + $output += [PSCustomObject]@{ + SqlInstance = $server.Name + InstanceName = $server.ServiceName + ComputerName = $server.ComputerName + Login = $memberDomain + "\" + $member.SamAccountName + DisplayName = $member.DisplayName + MemberOf = $AdGroup + ParentADGroupLogin = $ParentADGroup + } + } + } + } catch { + Stop-Function -Message "Failed to connect to Group: $member." -Target $member -ErrorRecord $_ + } + $discard += $ADGroup + foreach ($gr in $subgroups) { + if ($gr -notin $discard) { + $discard += $gr + Write-Message -Level Verbose -Message "Looking at $gr, recursively." + Get-AllLogins -ADGroup $gr -discard $discard -ParentADGroup $ParentADGroup + } + } + } + end { + $output + } + } + } + + process { + foreach ($instance in $SqlInstance) { + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + $AdGroups = $server.Logins | Where-Object { $_.LoginType -eq "WindowsGroup" -and $_.Name -ne "BUILTIN\Administrators" -and $_.Name -notlike "*NT SERVICE*" } + + foreach ($AdGroup in $AdGroups) { + Write-Message -Level Verbose -Message "Looking at Group: $AdGroup" + $ADGroupOut += Get-AllLogins $AdGroup.Name -ParentADGroup $AdGroup.Name + } + + if (-not $Login) { + $res = $ADGroupOut + } else { + $res = $ADGroupOut | Where-Object { $Login -contains $_.Login } + if ($res.Length -eq 0) { + continue + } + } + Select-DefaultView -InputObject $res -Property SqlInstance, Login, DisplayName, MemberOf, ParentADGroupLogin + } + } +} +#ValidationTags#FlowControl,Pipeline# +function Find-DbaOrphanedFile { + <# + .SYNOPSIS + Find-DbaOrphanedFile finds orphaned database files. Orphaned database files are files not associated with any attached database. + + .DESCRIPTION + This command searches all directories associated with SQL database files for database files that are not currently in use by the SQL Server instance. + + By default, it looks for orphaned .mdf, .ldf and .ndf files in the root\data directory, the default data path, the default log path, the system paths and any directory in use by any attached directory. + + You can specify additional filetypes using the -FileType parameter, and additional paths to search using the -Path parameter. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. You must have sysadmin access and server version must be SQL Server version 2000 or higher. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Path + Specifies one or more directories to search in addition to the default data and log directories. + + .PARAMETER FileType + Specifies file extensions other than mdf, ldf and ndf to search for. Do not include the dot (".") when specifying the extension. + + .PARAMETER LocalOnly + If this switch is enabled, only local filenames will be returned. Using this switch with multiple servers is not recommended since it does not return the associated server name. + + .PARAMETER RemoteOnly + If this switch is enabled, only remote filenames will be returned. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Orphan, Database, DatabaseFile + Author: Sander Stad (@sqlstad), sqlstad.nl + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + Requires: sysadmin access on SQL Servers + + Thanks to Paul Randal's notes on FILESTREAM which can be found at http://www.sqlskills.com/blogs/paul/filestream-directory-structure/ + + .LINK + https://dbatools.io/Find-DbaOrphanedFile + + .EXAMPLE + PS C:\> Find-DbaOrphanedFile -SqlInstance sqlserver2014a + + Connects to sqlserver2014a, authenticating with Windows credentials, and searches for orphaned files. Returns server name, local filename, and unc path to file. + + .EXAMPLE + PS C:\> Find-DbaOrphanedFile -SqlInstance sqlserver2014a -SqlCredential $cred + + Connects to sqlserver2014a, authenticating with SQL Server authentication, and searches for orphaned files. Returns server name, local filename, and unc path to file. + + .EXAMPLE + PS C:\> Find-DbaOrphanedFile -SqlInstance sql2014 -Path 'E:\Dir1', 'E:\Dir2' + + Finds the orphaned files in "E:\Dir1" and "E:Dir2" in addition to the default directories. + + .EXAMPLE + PS C:\> Find-DbaOrphanedFile -SqlInstance sql2014 -LocalOnly + + Returns only the local file paths for orphaned files. + + .EXAMPLE + PS C:\> Find-DbaOrphanedFile -SqlInstance sql2014 -RemoteOnly + + Returns only the remote file path for orphaned files. + + .EXAMPLE + PS C:\> Find-DbaOrphanedFile -SqlInstance sql2014, sql2016 -FileType fsf, mld + + Finds the orphaned ending with ".fsf" and ".mld" in addition to the default filetypes ".mdf", ".ldf", ".ndf" for both the servers sql2014 and sql2016. + + #> + [CmdletBinding()] + param ( + [parameter(Mandatory, ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [pscredential]$SqlCredential, + [string[]]$Path, + [string[]]$FileType, + [switch]$LocalOnly, + [switch]$RemoteOnly, + [Alias('Silent')] + [switch]$EnableException + ) + + begin { + function Get-SQLDirTreeQuery { + param($PathList) + # use sysaltfiles in lower versions + + $q1 = "CREATE TABLE #enum ( id int IDENTITY, fs_filename nvarchar(512), depth int, is_file int, parent nvarchar(512) ); DECLARE @dir nvarchar(512);" + $q2 = "SET @dir = 'dirname'; + + INSERT INTO #enum( fs_filename, depth, is_file ) + EXEC xp_dirtree @dir, 1, 1; + + UPDATE #enum + SET parent = @dir, + fs_filename = ltrim(rtrim(fs_filename)) + WHERE parent IS NULL;" + + $query_files_sql = "SELECT e.fs_filename AS filename, e.parent + FROM #enum AS e + WHERE e.fs_filename NOT IN( 'xtp', '5', '`$FSLOG', '`$HKv2', 'filestream.hdr' ) + AND is_file = 1;" + + # build the query string based on how many directories they want to enumerate + $sql = $q1 + $sql += $($PathList | Where-Object { $_ -ne '' } | ForEach-Object { "$([System.Environment]::Newline)$($q2 -Replace 'dirname', $_)" }) + $sql += $query_files_sql + Write-Message -Level Debug -Message $sql + return $sql + } + function Get-SqlFileStructure { + param + ( + [Parameter(Mandatory, Position = 1)] + [Microsoft.SqlServer.Management.Smo.SqlSmoObject]$smoserver + ) + if ($smoserver.versionMajor -eq 8) { + $sql = "select filename from sysaltfiles" + } else { + $sql = "select physical_name as filename from sys.master_files" + } + + $dbfiletable = $smoserver.ConnectionContext.ExecuteWithResults($sql) + $ftfiletable = $dbfiletable.Tables[0].Clone() + $dbfiletable.Tables[0].TableName = "data" + + # Add support for Full Text Catalogs in Sql Server 2005 and below + if ($server.VersionMajor -lt 10) { + $databaselist = $smoserver.Databases | Select-Object -property Name, IsFullTextEnabled + foreach ($db in $databaselist) { + if ($db.IsFullTextEnabled -eq $false) { + continue + } + $database = $db.name + $fttable = $null = $smoserver.Databases[$database].ExecuteWithResults('sp_help_fulltext_catalogs') + foreach ($ftc in $fttable.Tables[0].rows) { + $null = $ftfiletable.Rows.add($ftc.Path) + } + } + } + + $null = $dbfiletable.Tables.Add($ftfiletable) + return $dbfiletable.Tables.Filename + } + + function Format-Path { + param ($path) + + $path = $path.Trim() + #Thank you windows 2000 + $path = $path -replace '[^A-Za-z0-9 _\.\-\\:]', '__' + return $path + } + + $FileType += "mdf", "ldf", "ndf" + $systemfiles = "distmdl.ldf", "distmdl.mdf", "mssqlsystemresource.ldf", "mssqlsystemresource.mdf" + + $FileTypeComparison = $FileType | ForEach-Object {$_.ToLower()} | Where-Object { $_ } | Sort-Object | Get-Unique + } + + process { + foreach ($instance in $SqlInstance) { + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $sqlcredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + # Reset all the arrays + $dirtreefiles = $valid = $paths = $matching = @() + + $filestructure = Get-SqlFileStructure $server + + # Get any paths associated with current data and log files + foreach ($file in $filestructure) { + $paths += Split-Path -Path $file -Parent + } + + # Get the default data and log directories from the instance + Write-Message -Level Debug -Message "Adding paths" + $paths += $server.RootDirectory + "\DATA" + $paths += Get-SqlDefaultPaths $server data + $paths += Get-SqlDefaultPaths $server log + $paths += $server.MasterDBPath + $paths += $server.MasterDBLogPath + $paths += $Path + $paths = $paths | ForEach-Object { "$_".TrimEnd("\") } | Sort-Object | Get-Unique + $sql = Get-SQLDirTreeQuery $paths + $datatable = $server.Databases['master'].ExecuteWithResults($sql).Tables[0] + + foreach ($row in $datatable) { + $fullpath = [IO.Path]::combine($row.parent, $row.filename) + $dirtreefiles += [pscustomobject]@{ + FullPath = $fullpath + Comparison = [IO.Path]::GetFullPath($(Format-Path $fullpath)) + } + } + $dirtreefiles = $dirtreefiles | Where-Object { $_ } | Sort-Object Comparison -Unique + + foreach ($file in $filestructure) { + $valid += [IO.Path]::GetFullPath($(Format-Path $file)) + } + + $valid = $valid | Sort-Object | Get-Unique + + foreach ($file in $dirtreefiles.Comparison) { + foreach ($type in $FileTypeComparison) { + if ($file.ToLower().EndsWith($type)) { + $matching += $file + break + } + } + } + + $dirtreematcher = @{} + foreach ($el in $dirtreefiles) { + $dirtreematcher[$el.Comparison] = $el.Fullpath + } + + foreach ($file in $matching) { + if ($file -notin $valid) { + $fullpath = $dirtreematcher[$file] + + $filename = Split-Path $fullpath -Leaf + + if ($filename -in $systemfiles) { continue } + + $result = [pscustomobject]@{ + Server = $server.name + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + Filename = $fullpath + RemoteFilename = Join-AdminUnc -Servername $server.ComputerName -Filepath $fullpath + } + + if ($LocalOnly -eq $true) { + ($result | Select-Object filename).filename + continue + } + + if ($RemoteOnly -eq $true) { + ($result | Select-Object remotefilename).remotefilename + continue + } + + $result | Select-DefaultView -Property ComputerName, InstanceName, SqlInstance, Filename, RemoteFilename + + } + } + + } + } + end { + if ($result.count -eq 0) { + Write-Message -Level Verbose -Message "No orphaned files found" + } + } +} +function Find-DbaSimilarTable { + <# + .SYNOPSIS + Returns all tables/views that are similar in structure by comparing the column names of matching and matched tables/views + + .DESCRIPTION + This function can either run against specific databases or all databases searching all/specific tables and views including in system databases. + Typically one would use this to find for example archive version(s) of a table whose structures are similar. + This can also be used to find tables/views that are very similar to a given table/view structure to see where a table/view might be used. + + More information can be found here: https://sqljana.wordpress.com/2017/03/31/sql-server-find-tables-with-similar-table-structure/ + + .PARAMETER SqlInstance + The target SQL Server instance or instances. This can be a collection and receive pipeline input + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Database + The database(s) to process - this list is auto-populated from the server. If unspecified, all databases will be processed. + + .PARAMETER ExcludeDatabase + The database(s) to exclude - this list is auto-populated from the server + + .PARAMETER SchemaName + If you are looking in a specific schema whose table structures is to be used as reference structure, provide the name of the schema. + If no schema is provided, looks at all schemas + + .PARAMETER TableName + If you are looking in a specific table whose structure is to be used as reference structure, provide the name of the table. + If no table is provided, looks at all tables + If the table name exists in multiple schemas, all of them would qualify + + .PARAMETER ExcludeViews + By default, views are included. You can exclude them by setting this switch to $false + This excludes views in both matching and matched list + + .PARAMETER IncludeSystemDatabases + By default system databases are ignored but you can include them within the search using this parameter + + .PARAMETER MatchPercentThreshold + The minimum percentage of column names that should match between the matching and matched objects. + Entries with no matches are eliminated + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Table + Author: Jana Sattainathan (@SQLJana), http://sqljana.wordpress.com + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Find-DbaSimilarTable + + .EXAMPLE + PS C:\> Find-DbaSimilarTable -SqlInstance DEV01 + + Searches all user database tables and views for each, returns all tables or views with their matching tables/views and match percent + + .EXAMPLE + PS C:\> Find-DbaSimilarTable -SqlInstance DEV01 -Database AdventureWorks + + Searches AdventureWorks database and lists tables/views and their corresponding matching tables/views with match percent + + .EXAMPLE + PS C:\> Find-DbaSimilarTable -SqlInstance DEV01 -Database AdventureWorks -SchemaName HumanResource + + Searches AdventureWorks database and lists tables/views in the HumanResource schema with their corresponding matching tables/views with match percent + + .EXAMPLE + PS C:\> Find-DbaSimilarTable -SqlInstance DEV01 -Database AdventureWorks -SchemaName HumanResource -Table Employee + + Searches AdventureWorks database and lists tables/views in the HumanResource schema and table Employee with its corresponding matching tables/views with match percent + + .EXAMPLE + PS C:\> Find-DbaSimilarTable -SqlInstance DEV01 -Database AdventureWorks -MatchPercentThreshold 60 + + Searches AdventureWorks database and lists all tables/views with its corresponding matching tables/views with match percent greater than or equal to 60 + + #> + [CmdletBinding()] + param ( + [parameter(Position = 0, Mandatory, ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer", "SqlServers")] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [Alias("Databases")] + [object[]]$Database, + [object[]]$ExcludeDatabase, + [string]$SchemaName, + [string]$TableName, + [switch]$ExcludeViews, + [switch]$IncludeSystemDatabases, + [int]$MatchPercentThreshold, + [Alias('Silent')] + [switch]$EnableException + ) + + begin { + $everyServerVwCount = 0 + + $sqlSelect = "WITH ColCountsByTable + AS + ( + SELECT + c.TABLE_CATALOG, + c.TABLE_SCHEMA, + c.TABLE_NAME, + COUNT(1) AS Column_Count + FROM INFORMATION_SCHEMA.COLUMNS c + GROUP BY + c.TABLE_CATALOG, + c.TABLE_SCHEMA, + c.TABLE_NAME + ) + SELECT + 100 * COUNT(c2.COLUMN_NAME) /*Matching_Column_Count*/ / MIN(ColCountsByTable.Column_Count) /*Column_Count*/ AS MatchPercent, + DENSE_RANK() OVER(ORDER BY c.TABLE_CATALOG, c.TABLE_SCHEMA, c.TABLE_NAME) TableNameRankInDB, + c.TABLE_CATALOG AS DatabaseName, + c.TABLE_SCHEMA AS SchemaName, + c.TABLE_NAME AS TableName, + t.TABLE_TYPE AS TableType, + MIN(ColCountsByTable.Column_Count) AS ColumnCount, + c2.TABLE_CATALOG AS MatchingDatabaseName, + c2.TABLE_SCHEMA AS MatchingSchemaName, + c2.TABLE_NAME AS MatchingTableName, + t2.TABLE_TYPE AS MatchingTableType, + COUNT(c2.COLUMN_NAME) AS MatchingColumnCount + FROM INFORMATION_SCHEMA.TABLES t + INNER JOIN INFORMATION_SCHEMA.COLUMNS c + ON t.TABLE_CATALOG = c.TABLE_CATALOG + AND t.TABLE_SCHEMA = c.TABLE_SCHEMA + AND t.TABLE_NAME = c.TABLE_NAME + INNER JOIN ColCountsByTable + ON t.TABLE_CATALOG = ColCountsByTable.TABLE_CATALOG + AND t.TABLE_SCHEMA = ColCountsByTable.TABLE_SCHEMA + AND t.TABLE_NAME = ColCountsByTable.TABLE_NAME + LEFT OUTER JOIN INFORMATION_SCHEMA.COLUMNS c2 + ON t.TABLE_NAME != c2.TABLE_NAME + AND c.COLUMN_NAME = c2.COLUMN_NAME + LEFT JOIN INFORMATION_SCHEMA.TABLES t2 + ON c2.TABLE_NAME = t2.TABLE_NAME" + + $sqlWhere = " + WHERE " + + $sqlGroupBy = " + GROUP BY + c.TABLE_CATALOG, + c.TABLE_SCHEMA, + c.TABLE_NAME, + t.TABLE_TYPE, + c2.TABLE_CATALOG, + c2.TABLE_SCHEMA, + c2.TABLE_NAME, + t2.TABLE_TYPE " + + $sqlHaving = " + HAVING + /*Match_Percent should be greater than 0 at minimum!*/ + " + + $sqlOrderBy = " + ORDER BY + MatchPercent DESC" + + + $sql = '' + $wherearray = @() + + if ($ExcludeViews) { + $wherearray += " (t.TABLE_TYPE <> 'VIEW' AND t2.TABLE_TYPE <> 'VIEW') " + } + + if ($SchemaName) { + $wherearray += (" (c.TABLE_SCHEMA = '{0}') " -f $SchemaName.Replace("'", "''")) #Replace single quotes with two single quotes! + } + + if ($TableName) { + $wherearray += (" (c.TABLE_NAME = '{0}') " -f $TableName.Replace("'", "''")) #Replace single quotes with two single quotes! + + } + + if ($wherearray.length -gt 0) { + $sqlWhere = "$sqlWhere " + ($wherearray -join " AND ") + } else { + $sqlWhere = "" + } + + + $matchThreshold = 0 + if ($MatchPercentThreshold) { + $matchThreshold = $MatchPercentThreshold + } else { + $matchThreshold = 0 + } + + $sqlHaving += (" (100 * COUNT(c2.COLUMN_NAME) / MIN(ColCountsByTable.Column_Count) >= {0}) " -f $matchThreshold) + + + + $sql = "$sqlSelect $sqlWhere $sqlGroupBy $sqlHaving $sqlOrderBy" + + Write-Message -Level Debug -Message $sql + + } + + process { + foreach ($Instance in $SqlInstance) { + + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential -MinimumVersion 9 + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + + #Use IsAccessible instead of Status -eq 'normal' because databases that are on readable secondaries for AG or mirroring replicas will cause errors to be thrown + if ($IncludeSystemDatabases) { + $dbs = $server.Databases | Where-Object { $_.IsAccessible -eq $true } + } else { + $dbs = $server.Databases | Where-Object { $_.IsAccessible -eq $true -and $_.IsSystemObject -eq $false } + } + + if ($Database) { + $dbs = $server.Databases | Where-Object Name -In $Database + } + + if ($ExcludeDatabase) { + $dbs = $dbs | Where-Object Name -NotIn $ExcludeDatabase + } + + + $totalCount = 0 + $dbCount = $dbs.count + foreach ($db in $dbs) { + + Write-Message -Level Verbose -Message "Searching on database $db" + $rows = $db.Query($sql) + + foreach ($row in $rows) { + [PSCustomObject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + Table = "$($row.DatabaseName).$($row.SchemaName).$($row.TableName)" + MatchingTable = "$($row.MatchingDatabaseName).$($row.MatchingSchemaName).$($row.MatchingTableName)" + MatchPercent = $row.MatchPercent + OriginalDatabaseName = $row.DatabaseName + OriginalSchemaName = $row.SchemaName + OriginalTableName = $row.TableName + OriginalTableNameRankInDB = $row.TableNameRankInDB + OriginalTableType = $row.TableType + OriginalColumnCount = $row.ColumnCount + MatchingDatabaseName = $row.MatchingDatabaseName + MatchingSchemaName = $row.MatchingSchemaName + MatchingTableName = $row.MatchingTableName + MatchingTableType = $row.MatchingTableType + MatchingColumnCount = $row.MatchingColumnCount + } + } + + $vwCount = $vwCount + $rows.Count + $totalCount = $totalCount + $rows.Count + $everyServerVwCount = $everyServerVwCount + $rows.Count + + Write-Message -Level Verbose -Message "Found $vwCount tables/views in $db" + } + + Write-Message -Level Verbose -Message "Found $totalCount total tables/views in $dbCount databases" + } + } + end { + Write-Message -Level Verbose -Message "Found $everyServerVwCount total tables/views" + } +} +function Find-DbaStoredProcedure { + <# + .SYNOPSIS + Returns all stored procedures that contain a specific case-insensitive string or regex pattern. + + .DESCRIPTION + This function can either run against specific databases or all databases searching all user or user and system stored procedures. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. This can be a collection and receive pipeline input + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Database + The database(s) to process - this list is auto-populated from the server. If unspecified, all databases will be processed. + + .PARAMETER ExcludeDatabase + The database(s) to exclude - this list is auto-populated from the server + + .PARAMETER Pattern + String pattern that you want to search for in the stored procedure text body + + .PARAMETER IncludeSystemObjects + By default, system stored procedures are ignored but you can include them within the search using this parameter. + + Warning - this will likely make it super slow if you run it on all databases. + + .PARAMETER IncludeSystemDatabases + By default system databases are ignored but you can include them within the search using this parameter + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: StoredProcedure, Proc + Author: Stephen Bennett, https://sqlnotesfromtheunderground.wordpress.com/ + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Find-DbaStoredProcedure + + .EXAMPLE + PS C:\> Find-DbaStoredProcedure -SqlInstance DEV01 -Pattern whatever + + Searches all user databases stored procedures for "whatever" in the text body + + .EXAMPLE + PS C:\> Find-DbaStoredProcedure -SqlInstance sql2016 -Pattern '\w+@\w+\.\w+' + + Searches all databases for all stored procedures that contain a valid email pattern in the text body + + .EXAMPLE + PS C:\> Find-DbaStoredProcedure -SqlInstance DEV01 -Database MyDB -Pattern 'some string' -Verbose + + Searches in "mydb" database stored procedures for "some string" in the text body + + .EXAMPLE + PS C:\> Find-DbaStoredProcedure -SqlInstance sql2016 -Database MyDB -Pattern RUNTIME -IncludeSystemObjects + + Searches in "mydb" database stored procedures for "runtime" in the text body + + #> + [CmdletBinding()] + param ( + [parameter(Position = 0, Mandatory, ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer", "SqlServers")] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [Alias("Databases")] + [object[]]$Database, + [object[]]$ExcludeDatabase, + [parameter(Mandatory)] + [string]$Pattern, + [switch]$IncludeSystemObjects, + [switch]$IncludeSystemDatabases, + [Alias('Silent')] + [switch]$EnableException + ) + + begin { + $sql = "SELECT OBJECT_SCHEMA_NAME(p.object_id) as ProcSchema, p.name, m.definition as TextBody FROM sys.sql_modules m, sys.procedures p WHERE m.object_id = p.object_id" + if (!$IncludeSystemObjects) { $sql = "$sql AND p.is_ms_shipped = 0" } + $everyserverspcount = 0 + } + process { + foreach ($Instance in $SqlInstance) { + try { + $server = Connect-SqlInstance -SqlInstance $Instance -SqlCredential $SqlCredential + } catch { + Write-Message -Level Warning -Message "Failed to connect to: $Instance" + continue + } + + if ($server.versionMajor -lt 9) { + Write-Message -Level Warning -Message "This command only supports SQL Server 2005 and above." + Continue + } + + if ($IncludeSystemDatabases) { + $dbs = $server.Databases | Where-Object { $_.Status -eq "normal" } + } else { + $dbs = $server.Databases | Where-Object { $_.Status -eq "normal" -and $_.IsSystemObject -eq $false } + } + + if ($Database) { + $dbs = $dbs | Where-Object Name -In $Database + } + + if ($ExcludeDatabase) { + $dbs = $dbs | Where-Object Name -NotIn $ExcludeDatabase + } + + $totalcount = 0 + $dbcount = $dbs.count + foreach ($db in $dbs) { + Write-Message -Level Verbose -Message "Searching on database $db" + + # If system objects aren't needed, find stored procedure text using SQL + # This prevents SMO from having to enumerate + + if (!$IncludeSystemObjects) { + Write-Message -Level Debug -Message $sql + $rows = $db.ExecuteWithResults($sql).Tables.Rows + $sproccount = 0 + + foreach ($row in $rows) { + $totalcount++; $sproccount++; $everyserverspcount++ + + $procSchema = $row.ProcSchema + $proc = $row.Name + + Write-Message -Level Verbose -Message "Looking in stored procedure: $procSchema.$proc textBody for $pattern" + if ($row.TextBody -match $Pattern) { + $sp = $db.StoredProcedures | Where-Object {$_.Schema -eq $procSchema -and $_.Name -eq $proc} + + $StoredProcedureText = $sp.TextBody.split("`n") + $spTextFound = $StoredProcedureText | Select-String -Pattern $Pattern | ForEach-Object { "(LineNumber: $($_.LineNumber)) $($_.ToString().Trim())" } + + [PSCustomObject]@{ + ComputerName = $server.ComputerName + SqlInstance = $server.ServiceName + Database = $db.Name + Schema = $sp.Schema + Name = $sp.Name + Owner = $sp.Owner + IsSystemObject = $sp.IsSystemObject + CreateDate = $sp.CreateDate + LastModified = $sp.DateLastModified + StoredProcedureTextFound = $spTextFound -join "`n" + StoredProcedure = $sp + StoredProcedureFullText = $sp.TextBody + } | Select-DefaultView -ExcludeProperty StoredProcedure, StoredProcedureFullText + } + } + } else { + $storedprocedures = $db.StoredProcedures + + foreach ($sp in $storedprocedures) { + $totalcount++; $sproccount++; $everyserverspcount++ + + $procSchema = $sp.Schema + $proc = $sp.Name + + Write-Message -Level Verbose -Message "Looking in stored procedure $procSchema.$proc textBody for $pattern" + if ($sp.TextBody -match $Pattern) { + + $StoredProcedureText = $sp.TextBody.split("`n") + $spTextFound = $StoredProcedureText | Select-String -Pattern $Pattern | ForEach-Object { "(LineNumber: $($_.LineNumber)) $($_.ToString().Trim())" } + + [PSCustomObject]@{ + ComputerName = $server.ComputerName + SqlInstance = $server.ServiceName + Database = $db.Name + Schema = $sp.Schema + Name = $sp.Name + Owner = $sp.Owner + IsSystemObject = $sp.IsSystemObject + CreateDate = $sp.CreateDate + LastModified = $sp.DateLastModified + StoredProcedureTextFound = $spTextFound -join "`n" + StoredProcedure = $sp + StoredProcedureFullText = $sp.TextBody + } | Select-DefaultView -ExcludeProperty StoredProcedure, StoredProcedureFullText + } + } + } + Write-Message -Level Verbose -Message "Evaluated $sproccount stored procedures in $db" + } + Write-Message -Level Verbose -Message "Evaluated $totalcount total stored procedures in $dbcount databases" + } + } + end { + Write-Message -Level Verbose -Message "Evaluated $everyserverspcount total stored procedures" + } +} +function Find-DbaTrigger { + <# + .SYNOPSIS + Returns all triggers that contain a specific case-insensitive string or regex pattern. + + .DESCRIPTION + This function search on Instance, Database and Object level. + If you specify one or more databases, search on Server level will not be preformed. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. This can be a collection and receive pipeline input + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Database + The database(s) to process - this list is auto-populated from the server. If unspecified, all databases will be processed. + + .PARAMETER ExcludeDatabase + The database(s) to exclude - this list is auto-populated from the server + + .PARAMETER Pattern + String pattern that you want to search for in the trigger text body + + .PARAMETER TriggerLevel + Allows specify the trigger level that you want to search. By default is All (Server, Database, Object). + + .PARAMETER IncludeSystemObjects + By default, system triggers are ignored but you can include them within the search using this parameter. + + Warning - this will likely make it super slow if you run it on all databases. + + .PARAMETER IncludeSystemDatabases + By default system databases are ignored but you can include them within the search using this parameter + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Trigger + Author: Claudio Silva (@ClaudioESSilva) + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Find-DbaTrigger + + .EXAMPLE + PS C:\> Find-DbaTrigger -SqlInstance DEV01 -Pattern whatever + + Searches all user databases triggers for "whatever" in the text body + + .EXAMPLE + PS C:\> Find-DbaTrigger -SqlInstance sql2016 -Pattern '\w+@\w+\.\w+' + + Searches all databases for all triggers that contain a valid email pattern in the text body + + .EXAMPLE + PS C:\> Find-DbaTrigger -SqlInstance DEV01 -Database MyDB -Pattern 'some string' -Verbose + + Searches in "mydb" database triggers for "some string" in the text body + + .EXAMPLE + PS C:\> Find-DbaTrigger -SqlInstance sql2016 -Database MyDB -Pattern RUNTIME -IncludeSystemObjects + + Searches in "mydb" database triggers for "runtime" in the text body + + #> + [CmdletBinding()] + param ( + [parameter(Position = 0, Mandatory, ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer", "SqlServers")] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [Alias("Databases")] + [object[]]$Database, + [object[]]$ExcludeDatabase, + [parameter(Mandatory)] + [string]$Pattern, + [ValidateSet('All', 'Server', 'Database', 'Object')] + [string]$TriggerLevel = 'All', + [switch]$IncludeSystemObjects, + [switch]$IncludeSystemDatabases, + [Alias('Silent')] + [switch]$EnableException + ) + + begin { + $sqlDatabaseTriggers = "SELECT tr.name, m.definition as TextBody FROM sys.sql_modules m, sys.triggers tr WHERE m.object_id = tr.object_id AND tr.parent_class = 0" + + $sqlTableTriggers = "SELECT OBJECT_SCHEMA_NAME(tr.parent_id) TableSchema, OBJECT_NAME(tr.parent_id) AS TableName, tr.name, m.definition as TextBody FROM sys.sql_modules m, sys.triggers tr WHERE m.object_id = tr.object_id AND tr.parent_class = 1" + if (!$IncludeSystemObjects) { $sqlTableTriggers = "$sqlTableTriggers AND tr.is_ms_shipped = 0" } + + $everyserverstcount = 0 + } + process { + foreach ($Instance in $SqlInstance) { + try { + $server = Connect-SqlInstance -SqlInstance $Instance -SqlCredential $SqlCredential + } catch { + Write-Message -Level Warning -Message "Failed to connect to: $Instance" + continue + } + + if ($server.versionMajor -lt 9) { + Write-Message -Level Warning -Message "This command only supports SQL Server 2005 and above." + Continue + } + + #search at instance level. Only if no database was specified + if ((-Not $Database) -and ($TriggerLevel -in @('All', 'Server'))) { + foreach ($trigger in $server.Triggers) { + $everyserverstcount++; $triggercount++ + Write-Message -Level Debug -Message "Looking in Trigger: $trigger TextBody for $pattern" + if ($trigger.TextBody -match $Pattern) { + + $triggerText = $trigger.TextBody.split("`n`r") + $trTextFound = $triggerText | Select-String -Pattern $Pattern | ForEach-Object { "(LineNumber: $($_.LineNumber)) $($_.ToString().Trim())" } + + [PSCustomObject]@{ + ComputerName = $server.ComputerName + SqlInstance = $server.ServiceName + TriggerLevel = "Server" + Database = $null + Object = $null + Name = $trigger.Name + IsSystemObject = $trigger.IsSystemObject + CreateDate = $trigger.CreateDate + LastModified = $trigger.DateLastModified + TriggerTextFound = $trTextFound -join "`n" + Trigger = $trigger + TriggerFullText = $trigger.TextBody + } | Select-DefaultView -ExcludeProperty Trigger, TriggerFullText + } + } + Write-Message -Level Verbose -Message "Evaluated $triggercount triggers in $server" + } + + if ($IncludeSystemDatabases) { + $dbs = $server.Databases | Where-Object { $_.Status -eq "normal" } + } else { + $dbs = $server.Databases | Where-Object { $_.Status -eq "normal" -and $_.IsSystemObject -eq $false } + } + + if ($Database) { + $dbs = $dbs | Where-Object Name -In $Database + } + + if ($ExcludeDatabase) { + $dbs = $dbs | Where-Object Name -NotIn $ExcludeDatabase + } + + $totalcount = 0 + $dbcount = $dbs.count + + if ($TriggerLevel -in @('All', 'Database', 'Object')) { + foreach ($db in $dbs) { + + Write-Message -Level Verbose -Message "Searching on database $db" + + # If system objects aren't needed, find trigger text using SQL + # This prevents SMO from having to enumerate + + if (!$IncludeSystemObjects) { + if ($TriggerLevel -in @('All', 'Database')) { + #Get Database Level triggers (DDL) + Write-Message -Level Debug -Message $sqlDatabaseTriggers + $rows = $db.ExecuteWithResults($sqlDatabaseTriggers).Tables.Rows + $triggercount = 0 + + foreach ($row in $rows) { + $totalcount++; $triggercount++; $everyserverstcount++ + + $trigger = $row.name + + Write-Message -Level Verbose -Message "Looking in trigger $trigger for textBody with pattern $pattern on database $db" + if ($row.TextBody -match $Pattern) { + $tr = $db.Triggers | Where-Object name -eq $row.name + + $triggerText = $tr.TextBody.split("`n`r") + $trTextFound = $triggerText | Select-String -Pattern $Pattern | ForEach-Object { "(LineNumber: $($_.LineNumber)) $($_.ToString().Trim())" } + + [PSCustomObject]@{ + ComputerName = $server.ComputerName + SqlInstance = $server.ServiceName + TriggerLevel = "Database" + Database = $db.name + Object = $tr.Parent + Name = $tr.Name + IsSystemObject = $tr.IsSystemObject + CreateDate = $tr.CreateDate + LastModified = $tr.DateLastModified + TriggerTextFound = $trTextFound -join "`n" + Trigger = $tr + TriggerFullText = $tr.TextBody + } | Select-DefaultView -ExcludeProperty Trigger, TriggerFullText + } + } + } + + if ($TriggerLevel -in @('All', 'Object')) { + #Get Object Level triggers (DML) + Write-Message -Level Debug -Message $sqlTableTriggers + $rows = $db.ExecuteWithResults($sqlTableTriggers).Tables.Rows + $triggercount = 0 + + foreach ($row in $rows) { + $totalcount++; $triggercount++; $everyserverstcount++ + + $trigger = $row.name + $triggerParentSchema = $row.TableSchema + $triggerParent = $row.TableName + + Write-Message -Level Verbose -Message "Looking in trigger $trigger for textBody with pattern $pattern in object $triggerParentSchema.$triggerParent at database $db" + if ($row.TextBody -match $Pattern) { + + $tr = ($db.Tables | Where-Object {$_.Name -eq $triggerParent -and $_.Schema -eq $triggerParentSchema}).Triggers | Where-Object name -eq $row.name + + $triggerText = $tr.TextBody.split("`n`r") + $trTextFound = $triggerText | Select-String -Pattern $Pattern | ForEach-Object { "(LineNumber: $($_.LineNumber)) $($_.ToString().Trim())" } + + [PSCustomObject]@{ + ComputerName = $server.ComputerName + SqlInstance = $server.ServiceName + TriggerLevel = "Object" + Database = $db.name + Object = $tr.Parent + Name = $tr.Name + IsSystemObject = $tr.IsSystemObject + CreateDate = $tr.CreateDate + LastModified = $tr.DateLastModified + TriggerTextFound = $trTextFound -join "`n" + Trigger = $tr + TriggerFullText = $tr.TextBody + } | Select-DefaultView -ExcludeProperty Trigger, TriggerFullText + } + } + } + } else { + if ($TriggerLevel -in @('All', 'Database')) { + #Get Database Level triggers (DDL) + $triggers = $db.Triggers + + $triggercount = 0 + + foreach ($tr in $triggers) { + $totalcount++; $triggercount++; $everyserverstcount++ + $trigger = $tr.Name + + Write-Message -Level Verbose -Message "Looking in trigger $trigger for textBody with pattern $pattern on database $db" + if ($tr.TextBody -match $Pattern) { + + $triggerText = $tr.TextBody.split("`n`r") + $trTextFound = $triggerText | Select-String -Pattern $Pattern | ForEach-Object { "(LineNumber: $($_.LineNumber)) $($_.ToString().Trim())" } + + [PSCustomObject]@{ + ComputerName = $server.ComputerName + SqlInstance = $server.ServiceName + TriggerLevel = "Database" + Database = $db.name + Object = $tr.Parent + Name = $tr.Name + IsSystemObject = $tr.IsSystemObject + CreateDate = $tr.CreateDate + LastModified = $tr.DateLastModified + TriggerTextFound = $trTextFound -join "`n" + Trigger = $tr + TriggerFullText = $tr.TextBody + } | Select-DefaultView -ExcludeProperty Trigger, TriggerFullText + } + } + } + + if ($TriggerLevel -in @('All', 'Object')) { + #Get Object Level triggers (DML) + $triggers = $db.Tables | ForEach-Object {$_.Triggers} + + $triggercount = 0 + + foreach ($tr in $triggers) { + $totalcount++; $triggercount++; $everyserverstcount++ + $trigger = $tr.Name + + Write-Message -Level Verbose -Message "Looking in trigger $trigger for textBody with pattern $pattern in object $($tr.Parent) at database $db" + if ($tr.TextBody -match $Pattern) { + + $triggerText = $tr.TextBody.split("`n`r") + $trTextFound = $triggerText | Select-String -Pattern $Pattern | ForEach-Object { "(LineNumber: $($_.LineNumber)) $($_.ToString().Trim())" } + + [PSCustomObject]@{ + ComputerName = $server.ComputerName + SqlInstance = $server.ServiceName + TriggerLevel = "Object" + Database = $db.name + Object = $tr.Parent + Name = $tr.Name + IsSystemObject = $tr.IsSystemObject + CreateDate = $tr.CreateDate + LastModified = $tr.DateLastModified + TriggerTextFound = $trTextFound -join "`n" + Trigger = $tr + TriggerFullText = $tr.TextBody + } | Select-DefaultView -ExcludeProperty Trigger, TriggerFullText + } + } + } + } + Write-Message -Level Verbose -Message "Evaluated $triggercount triggers in $db" + } + } + Write-Message -Level Verbose -Message "Evaluated $totalcount total triggers in $dbcount databases" + } + } + end { + Write-Message -Level Verbose -Message "Evaluated $everyserverstcount total triggers" + } +} +#ValidationTags#Messaging# +function Find-DbaUserObject { + <# + .SYNOPSIS + Searches SQL Server to find user-owned objects (i.e. not dbo or sa) or for any object owned by a specific user specified by the Pattern parameter. + + .DESCRIPTION + Looks at the below list of objects to see if they are either owned by a user or a specific user (using the parameter -Pattern) + Database Owner + Agent Job Owner + Used in Credential + USed in Proxy + SQL Agent Steps using a Proxy + Endpoints + Server Roles + Database Schemas + Database Roles + Database Assembles + Database Synonyms + + .PARAMETER SqlInstance + The target SQL Server instance or instances. This can be a collection and receive pipeline input + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Pattern + The regex pattern that the command will search for + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Object + Author: Stephen Bennett, https://sqlnotesfromtheunderground.wordpress.com/ + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Find-DbaUserObject + + .EXAMPLE + PS C:\> Find-DbaUserObject -SqlInstance DEV01 -Pattern ad\stephen + + Searches user objects for owner ad\stephen + + .EXAMPLE + PS C:\> Find-DbaUserObject -SqlInstance DEV01 -Verbose + + Shows all user owned (non-sa, non-dbo) objects and verbose output + + #> + [CmdletBinding()] + param ( + [parameter(Position = 0, Mandatory, ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer", "SqlInstances")] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [string]$Pattern, + [Alias('Silent')] + [switch]$EnableException + ) + begin { + if ($Pattern -match '^[\w\d\.-]+\\[\w\d\.-]+$') { + Write-Message -Level Verbose -Message "Too few slashes, adding extra as required by regex" + $Pattern = $Pattern.Replace('\', '\\') + } + } + process { + foreach ($instance in $SqlInstance) { + + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + $saname = Get-SaLoginName $server + + ## Credentials + if (-not $pattern) { + Write-Message -Level Verbose -Message "Gathering data on instance objects" + $creds = $server.Credentials + $proxies = $server.JobServer.ProxyAccounts + $endPoints = $server.Endpoints | Where-Object { $_.Owner -ne $saname } + + Write-Message -Level Verbose -Message "Gather data on Agent Jobs ownership" + #Variable marked as unused by PSScriptAnalyzer + #$jobs = $server.JobServer.Jobs | Where-Object { $_.OwnerLoginName -ne $saname } + } else { + Write-Message -Level Verbose -Message "Gathering data on instance objects" + $creds = $server.Credentials | Where-Object { $_.Identity -match $pattern } + $proxies = $server.JobServer.ProxyAccounts | Where-Object { $_.CredentialIdentity -match $pattern } + $endPoints = $server.Endpoints | Where-Object { $_.Owner -match $pattern } + + Write-Message -Level Verbose -Message "Gather data on Agent Jobs ownership" + #Variable marked as unused by PSScriptAnalyzer + #$jobs = $server.JobServer.Jobs | Where-Object { $_.OwnerLoginName -match $pattern } + } + + ## dbs + if (-not $pattern) { + foreach ($db in $server.Databases | Where-Object { $_.Owner -ne $saname }) { + Write-Message -Level Verbose -Message "checking if $db is owned " + + [PSCustomObject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + Type = "Database" + Owner = $db.Owner + Name = $db.Name + Parent = $db.Parent.Name + } + } + } else { + foreach ($db in $server.Databases | Where-Object { $_.Owner -match $pattern }) { + [PSCustomObject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + Type = "Database" + Owner = $db.Owner + Name = $db.Name + Parent = $db.Parent.Name + } + } + } + + ## agent jobs + if (-not $pattern) { + foreach ($job in $server.JobServer.Jobs | Where-Object { $_.OwnerLoginName -ne $saname }) { + [PSCustomObject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + Type = "Agent Job" + Owner = $job.OwnerLoginName + Name = $job.Name + Parent = $job.Parent.Name + } + } + } else { + foreach ($job in $server.JobServer.Jobs | Where-Object { $_.OwnerLoginName -match $pattern }) { + [PSCustomObject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + Type = "Agent Job" + Owner = $job.OwnerLoginName + Name = $job.Name + Parent = $job.Parent.Name + } + } + } + + ## credentials + foreach ($cred in $creds) { + ## list credentials using the account + + [PSCustomObject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + Type = "Credential" + Owner = $cred.Identity + Name = $cred.Name + Parent = $cred.Parent.Name + } + } + + ## proxies + foreach ($proxy in $proxies) { + [PSCustomObject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + Type = "Proxy" + Owner = $proxy.CredentialIdentity + Name = $proxy.Name + Parent = $proxy.Parent.Name + } + + ## list agent jobs steps using proxy + foreach ($job in $server.JobServer.Jobs) { + foreach ($step in $job.JobSteps | Where-Object { $_.ProxyName -eq $proxy.Name }) { + [PSCustomObject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + Type = "Agent Step" + Owner = $step.ProxyName + Name = $step.Name + Parent = $step.Parent.Name #$step.Name + } + } + } + } + + + ## endpoints + foreach ($endPoint in $endPoints) { + [PSCustomObject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + Type = "Endpoint" + Owner = $endpoint.Owner + Name = $endPoint.Name + Parent = $endPoint.Parent.Name + } + } + + ## Server Roles + if (-not $pattern) { + foreach ($role in $server.Roles | Where-Object { $_.Owner -ne $saname }) { + Write-Message -Level Verbose -Message "checking if $db is owned " + [PSCustomObject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + Type = "Server Role" + Owner = $role.Owner + Name = $role.Name + Parent = $role.Parent.Name + } + } + } else { + foreach ($role in $server.Roles | Where-Object { $_.Owner -match $pattern }) { + [PSCustomObject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + Type = "Server Role" + Owner = $role.Owner + Name = $role.Name + Parent = $role.Parent.Name + } + } + } + + ## Loop internal database + foreach ($db in $server.Databases | Where-Object IsAccessible) { + Write-Message -Level Verbose -Message "Gather user owned object in database: $db" + ##schemas + $sysSchemas = "DatabaseMailUserRole", "db_ssisadmin", "db_ssisltduser", "db_ssisoperator", "SQLAgentOperatorRole", "SQLAgentReaderRole", "SQLAgentUserRole", "TargetServersRole", "RSExecRole" + + if (-not $pattern) { + $schemas = $db.Schemas | Where-Object { $_.IsSystemObject -eq 0 -and $_.Owner -ne "dbo" -and $sysSchemas -notcontains $_.Owner } + } else { + $schemas = $db.Schemas | Where-Object { $_.IsSystemObject -eq 0 -and $_.Owner -match $pattern -and $sysSchemas -notcontains $_.Owner } + } + foreach ($schema in $schemas) { + [PSCustomObject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + Type = "Schema" + Owner = $schema.Owner + Name = $schema.Name + Parent = $schema.Parent.Name + } + } + + ## database roles + if (-not $pattern) { + $roles = $db.Roles | Where-Object { $_.IsSystemObject -eq 0 -and $_.Owner -ne "dbo" } + } else { + $roles = $db.Roles | Where-Object { $_.IsSystemObject -eq 0 -and $_.Owner -match $pattern } + } + foreach ($role in $roles) { + [PSCustomObject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + Type = "Database Role" + Owner = $role.Owner + Name = $role.Name + Parent = $role.Parent.Name + } + } + + ## assembly + if (-not $pattern) { + $assemblies = $db.Assemblies | Where-Object { $_.IsSystemObject -eq 0 -and $_.Owner -ne "dbo" } + } else { + $assemblies = $db.Assemblies | Where-Object { $_.IsSystemObject -eq 0 -and $_.Owner -match $pattern } + } + + foreach ($assembly in $assemblies) { + [PSCustomObject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + Type = "Database Assembly" + Owner = $assembly.Owner + Name = $assembly.Name + Parent = $assembly.Parent.Name + } + } + + ## synonyms + if (-not $pattern) { + $synonyms = $db.Synonyms | Where-Object { $_.IsSystemObject -eq 0 -and $_.Owner -ne "dbo" } + } else { + $synonyms = $db.Synonyms | Where-Object { $_.IsSystemObject -eq 0 -and $_.Owner -match $pattern } + } + + foreach ($synonym in $synonyms) { + [PSCustomObject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + Type = "Database Synonyms" + Owner = $synonym.Owner + Name = $synonym.Name + Parent = $synonym.Parent.Name + } + } + } + } + } +} +function Find-DbaView { + <# + .SYNOPSIS + Returns all views that contain a specific case-insensitive string or regex pattern. + + .DESCRIPTION + This function can either run against specific databases or all databases searching all user or user and system views. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. This can be a collection and receive pipeline input + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Database + The database(s) to process - this list is auto-populated from the server. If unspecified, all databases will be processed. + + .PARAMETER ExcludeDatabase + The database(s) to exclude - this list is auto-populated from the server + + .PARAMETER Pattern + String pattern that you want to search for in the view text body + + .PARAMETER IncludeSystemObjects + By default, system views are ignored but you can include them within the search using this parameter. + + Warning - this will likely make it super slow if you run it on all databases. + + .PARAMETER IncludeSystemDatabases + By default system databases are ignored but you can include them within the search using this parameter + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: View + Author: Claudio Silva (@ClaudioESSilva) + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Find-DbaView + + .EXAMPLE + PS C:\> Find-DbaView -SqlInstance DEV01 -Pattern whatever + + Searches all user databases views for "whatever" in the text body + + .EXAMPLE + PS C:\> Find-DbaView -SqlInstance sql2016 -Pattern '\w+@\w+\.\w+' + + Searches all databases for all views that contain a valid email pattern in the text body + + .EXAMPLE + PS C:\> Find-DbaView -SqlInstance DEV01 -Database MyDB -Pattern 'some string' -Verbose + + Searches in "mydb" database views for "some string" in the text body + + .EXAMPLE + PS C:\> Find-DbaView -SqlInstance sql2016 -Database MyDB -Pattern RUNTIME -IncludeSystemObjects + + Searches in "mydb" database views for "runtime" in the text body + + #> + [CmdletBinding()] + param ( + [parameter(Position = 0, Mandatory, ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer", "SqlServers")] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [Alias("Databases")] + [object[]]$Database, + [object[]]$ExcludeDatabase, + [parameter(Mandatory)] + [string]$Pattern, + [switch]$IncludeSystemObjects, + [switch]$IncludeSystemDatabases, + [Alias('Silent')] + [switch]$EnableException + ) + + begin { + $sql = "SELECT OBJECT_SCHEMA_NAME(vw.object_id) as ViewSchema, vw.name, m.definition as TextBody FROM sys.sql_modules m, sys.views vw WHERE m.object_id = vw.object_id" + if (!$IncludeSystemObjects) { $sql = "$sql AND vw.is_ms_shipped = 0" } + $everyservervwcount = 0 + } + process { + foreach ($Instance in $SqlInstance) { + try { + $server = Connect-SqlInstance -SqlInstance $Instance -SqlCredential $SqlCredential + } catch { + Write-Message -Level Warning -Message "Failed to connect to: $Instance" + continue + } + + if ($server.versionMajor -lt 9) { + Write-Message -Level Warning -Message "This command only supports SQL Server 2005 and above." + Continue + } + + if ($IncludeSystemDatabases) { + $dbs = $server.Databases | Where-Object { $_.Status -eq "normal" } + } else { + $dbs = $server.Databases | Where-Object { $_.Status -eq "normal" -and $_.IsSystemObject -eq $false } + } + + if ($Database) { + $dbs = $dbs | Where-Object Name -In $Database + } + + if ($ExcludeDatabase) { + $dbs = $dbs | Where-Object Name -NotIn $ExcludeDatabase + } + + $totalcount = 0 + $dbcount = $dbs.count + foreach ($db in $dbs) { + Write-Message -Level Verbose -Message "Searching on database $db" + + # If system objects aren't needed, find view text using SQL + # This prevents SMO from having to enumerate + + if (!$IncludeSystemObjects) { + Write-Message -Level Debug -Message $sql + $rows = $db.ExecuteWithResults($sql).Tables.Rows + $vwcount = 0 + + foreach ($row in $rows) { + $totalcount++; $vwcount++; $everyservervwcount++ + + $viewSchema = $row.ViewSchema + $view = $row.name + + Write-Message -Level Verbose -Message "Looking in View: $viewSchema.$view TextBody for $pattern" + if ($row.TextBody -match $Pattern) { + $vw = $db.Views | Where-Object {$_.Schema -eq $viewSchema -and $_.Name -eq $view} + + $viewText = $vw.TextBody.split("`n`r") + $vwTextFound = $viewText | Select-String -Pattern $Pattern | ForEach-Object { "(LineNumber: $($_.LineNumber)) $($_.ToString().Trim())" } + + [PSCustomObject]@{ + ComputerName = $server.ComputerName + SqlInstance = $server.ServiceName + Database = $db.Name + Schema = $vw.Schema + Name = $vw.Name + Owner = $vw.Owner + IsSystemObject = $vw.IsSystemObject + CreateDate = $vw.CreateDate + LastModified = $vw.DateLastModified + ViewTextFound = $vwTextFound -join "`n" + View = $vw + ViewFullText = $vw.TextBody + } | Select-DefaultView -ExcludeProperty View, ViewFullText + } + } + } else { + $Views = $db.Views + + foreach ($vw in $Views) { + $totalcount++; $vwcount++; $everyservervwcount++ + + $viewSchema = $row.ViewSchema + $view = $vw.Name + + Write-Message -Level Verbose -Message "Looking in View: $viewSchema.$view TextBody for $pattern" + if ($vw.TextBody -match $Pattern) { + + $viewText = $vw.TextBody.split("`n`r") + $vwTextFound = $viewText | Select-String -Pattern $Pattern | ForEach-Object { "(LineNumber: $($_.LineNumber)) $($_.ToString().Trim())" } + + [PSCustomObject]@{ + ComputerName = $server.ComputerName + SqlInstance = $server.ServiceName + Database = $db.Name + Schema = $vw.Schema + Name = $vw.Name + Owner = $vw.Owner + IsSystemObject = $vw.IsSystemObject + CreateDate = $vw.CreateDate + LastModified = $vw.DateLastModified + ViewTextFound = $vwTextFound -join "`n" + View = $vw + ViewFullText = $vw.TextBody + } | Select-DefaultView -ExcludeProperty View, ViewFullText + } + } + } + Write-Message -Level Verbose -Message "Evaluated $vwcount views in $db" + } + Write-Message -Level Verbose -Message "Evaluated $totalcount total views in $dbcount databases" + } + } + end { + Write-Message -Level Verbose -Message "Evaluated $everyservervwcount total views" + } +} +function Format-DbaBackupInformation { + <# + .SYNOPSIS + Transforms the data in a dbatools BackupHistory object for a restore + + .DESCRIPTION + Performs various mapping on Backup History, ready restoring + Options include changing restore paths, backup paths, database name and many others + + .PARAMETER BackupHistory + A dbatools backupHistory object, normally this will have been created using Select-DbaBackupInformation + + .PARAMETER ReplaceDatabaseName + If a single value is provided, this will be replaced do all occurrences a database name + If a Hashtable is passed in, each database name mention will be replaced as specified. If a database's name does not appear it will not be replace + DatabaseName will also be replaced where it occurs in the file paths of data and log files. + Please note, that this won't change the Logical Names of data files, that has to be done with a separate Alter DB call + + .PARAMETER DatabaseNamePrefix + This string will be prefixed to all restored database's name + + .PARAMETER DataFileDirectory + This will move ALL restored files to this location during the restore + + .PARAMETER LogFileDirectory + This will move all log files to this location, overriding DataFileDirectory + + .PARAMETER DestinationFileStreamDirectory + This move the FileStream folder and contents to the new location, overriding DataFileDirectory + + .PARAMETER FileNamePrefix + This string will be prefixed to all restored files (Data and Log) + + .PARAMETER RebaseBackupFolder + Use this to rebase where your backups are stored. + + .PARAMETER Continue + Indicates that this is a continuing restore + + .PARAMETER DatabaseFilePrefix + A string that will be prefixed to every file restored + + .PARAMETER DatabaseFileSuffix + A string that will be suffixed to every file restored + + .PARAMETER ReplaceDbNameInFile + If set, will replace the old database name with the new name if it occurs in the file name + + .PARAMETER FileMapping + A hashtable that can be used to move specific files to a location. + `$FileMapping = @{'DataFile1'='c:\restoredfiles\Datafile1.mdf';'DataFile3'='d:\DataFile3.mdf'}` + And files not specified in the mapping will be restored to their original location + This Parameter is exclusive with DestinationDataDirectory + If specified, this will override any other file renaming/relocation options. + + .PARAMETER PathSep + By default is Windows's style (`\`) but you can pass also, e.g., `/` for Unix's style paths + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: DisasterRecovery, Backup, Restore + Author: Stuart Moore (@napalmgram), stuart-moore.com + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Format-DbaBackupInformation + + .EXAMPLE + PS C:\> $History | Format-DbaBackupInformation -ReplaceDatabaseName NewDb + + Changes as database name references to NewDb, both in the database name and any restore paths. Note, this will fail if the BackupHistory object contains backups for more than 1 database + + .EXAMPLE + PS C:\> $History | Format-DbaBackupInformation -ReplaceDatabaseName @{'OldB'='NewDb';'ProdHr'='DevHr'} + + Will change all occurrences of original database name in the backup history (names and restore paths) using the mapping in the hashtable. + In this example any occurrence of OldDb will be replaced with NewDb and ProdHr with DevPR + + .EXAMPLE + PS C:\> $History | Format-DbaBackupInformation -DataFileDirectory 'D:\DataFiles\' -LogFileDirectory 'E:\LogFiles\ + + This example with change the restore path for all data files (everything that is not a log file) to d:\datafiles + And all Transaction Log files will be restored to E:\Logfiles + + .EXAMPLE + PS C:\> $History | Format-DbaBackupInformation -RebaseBackupFolder f:\backups + + This example changes the location that SQL Server will look for the backups. This is useful if you've moved the backups to a different location + + #> + [CmdletBinding()] + param ( + [parameter(Mandatory, ValueFromPipeline)] + [object[]]$BackupHistory, + [object]$ReplaceDatabaseName, + [switch]$ReplaceDbNameInFile, + [string]$DataFileDirectory, + [string]$LogFileDirectory, + [string]$DestinationFileStreamDirectory, + [string]$DatabaseNamePrefix, + [string]$DatabaseFilePrefix, + [string]$DatabaseFileSuffix, + [string]$RebaseBackupFolder, + [switch]$Continue, + [hashtable]$FileMapping, + [string]$PathSep = '\', + [switch]$EnableException + ) + begin { + + Write-Message -Message "Starting" -Level Verbose + if ($null -ne $ReplaceDatabaseName) { + if ($ReplaceDatabaseName -is [string] -or $ReplaceDatabaseName.ToString() -ne 'System.Collections.Hashtable') { + Write-Message -Message "String passed in for DB rename" -Level Verbose + $ReplaceDatabaseNameType = 'single' + } elseif ($ReplaceDatabaseName -is [HashTable] -or $ReplaceDatabaseName.ToString() -eq 'System.Collections.Hashtable' ) { + Write-Message -Message "Hashtable passed in for DB rename" -Level Verbose + $ReplaceDatabaseNameType = 'multi' + } else { + Write-Message -Message "ReplacemenDatabaseName is $($ReplaceDatabaseName.Gettype().ToString()) - $ReplaceDatabaseName" -level Verbose + } + } + if ((Test-Bound -Parameter DataFileDirectory) -and $DataFileDirectory.EndsWith($PathSep)) { + $DataFileDirectory = $DataFileDirectory -Replace '.$' + } + if ((Test-Bound -Parameter DestinationFileStreamDirectory) -and $DestinationFileStreamDirectory.EndsWith($PathSep) ) { + $DestinationFileStreamDirectory = $DestinationFileStreamDirectory -Replace '.$' + } + if ((Test-Bound -Parameter LogFileDirectory) -and $LogFileDirectory.EndsWith($PathSep) ) { + $LogFileDirectory = $LogFileDirectory -Replace '.$' + } + if ((Test-Bound -Parameter RebaseBackupFolder) -and $RebaseBackupFolder.EndsWith($PathSep) ) { + $RebaseBackupFolder = $RebaseBackupFolder -Replace '.$' + } + } + + + process { + + foreach ($History in $BackupHistory) { + if ("OriginalDatabase" -notin $History.PSobject.Properties.name) { + $History | Add-Member -Name 'OriginalDatabase' -Type NoteProperty -Value $History.Database + } + if ("OriginalFileList" -notin $History.PSobject.Properties.name) { + $History | Add-Member -Name 'OriginalFileList' -Type NoteProperty -Value '' + $History | ForEach-Object {$_.OriginalFileList = $_.FileList} + } + if ("OriginalFullName" -notin $History.PSobject.Properties.name) { + $History | Add-Member -Name 'OriginalFullName' -Type NoteProperty -Value $History.FullName + } + if ("IsVerified" -notin $History.PSobject.Properties.name) { + $History | Add-Member -Name 'IsVerified' -Type NoteProperty -Value $False + } + switch ($History.Type) { + 'Full' {$History.Type = 'Database'} + 'Differential' {$History.Type = 'Database Differential'} + 'Log' {$History.Type = 'Transaction Log'} + } + + + if ($ReplaceDatabaseNameType -eq 'single' -and $ReplaceDatabaseName -ne '' ) { + $History.Database = $ReplaceDatabaseName + Write-Message -Message "New DbName (String) = $($History.Database)" -Level Verbose + } elseif ($ReplaceDatabaseNameType -eq 'multi') { + if ($null -ne $ReplaceDatabaseName[$History.Database]) { + $History.Database = $ReplaceDatabaseName[$History.Database] + Write-Message -Message "New DbName (Hash) = $($History.Database)" -Level Verbose + } + } + $History.Database = $DatabaseNamePrefix + $History.Database + + $History.FileList | ForEach-Object { + if ($null -ne $FileMapping ) { + if ($null -ne $FileMapping[$_.LogicalName]) { + $_.PhysicalName = $FileMapping[$_.LogicalName] + } + } else { + if ($ReplaceDbNameInFile -eq $true) { + $_.PhysicalName = $_.PhysicalName -Replace $History.OriginalDatabase, $History.Database + } + Write-Message -Message " 1 PhysicalName = $($_.PhysicalName) " -Level Verbose + $Pname = [System.Io.FileInfo]$_.PhysicalName + $RestoreDir = $Pname.DirectoryName + if ($_.Type -eq 'D' -or $_.FileType -eq 'D') { + if ('' -ne $DataFileDirectory) { + $RestoreDir = $DataFileDirectory + } + } elseif ($_.Type -eq 'L' -or $_.FileType -eq 'L') { + if ('' -ne $LogFileDirectory) { + $RestoreDir = $LogFileDirectory + } elseif ('' -ne $DataFileDirectory) { + $RestoreDir = $DataFileDirectory + } + } elseif ($_.Type -eq 'S' -or $_.FileType -eq 'S') { + if ('' -ne $DestinationFileStreamDirectory) { + $RestoreDir = $DestinationFileStreamDirectory + } elseif ('' -ne $DataFileDirectory) { + $RestoreDir = $DataFileDirectory + } + } + + $_.PhysicalName = $RestoreDir + $PathSep + $DatabaseFilePrefix + $Pname.BaseName + $DatabaseFileSuffix + $Pname.extension + Write-Message -Message "PhysicalName = $($_.PhysicalName) " -Level Verbose + } + } + if ('' -ne $RebaseBackupFolder -and $History.FullName[0] -notmatch 'http') { + Write-Message -Message 'Rebasing backup files' -Level Verbose + + for ($j = 0; $j -lt $History.fullname.count; $j++) { + $file = [System.IO.FileInfo]($History.fullname[$j]) + $History.fullname[$j] = $RebaseBackupFolder + $PathSep + $file.BaseName + $file.Extension + } + + } + + $History + } + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function Get-DbaAgDatabase { + <# + .SYNOPSIS + Gets availability group databases from a SQL Server instance. + + .DESCRIPTION + Gets availability group databases from a SQL Server instance. + + Default view provides most common set of properties for information on the database in an availability group. + + Information returned on the database will be specific to that replica, whether it is primary or a secondary. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. Server version must be SQL Server version 2012 or higher. + + .PARAMETER SqlCredential + Login to the SqlInstance instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER AvailabilityGroup + Specify the availability groups to query. + + .PARAMETER Database + Specify the database or databases to return. This list is auto-populated from the server for tab completion. Multiple databases can be specified. If none are specified all databases will be processed. + + .PARAMETER InputObject + Enables piped input from Get-DbaAvailabilityGroup. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Hadr, HA, AG, AvailabilityGroup, Replica + Author: Shawn Melton (@wsmelton), https://wsmelton.github.io + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaAgDatabase + + .EXAMPLE + PS C:\> Get-DbaAgDatabase -SqlInstance sql2017a + + Returns all the databases in each availability group found on sql2017a + + .EXAMPLE + PS C:\> Get-DbaAgDatabase -SqlInstance sql2017a -AvailabilityGroup AG101 + + Returns all the databases in the availability group AG101 on sql2017a + + .EXAMPLE + PS C:\> Get-DbaAvailabilityGroup -SqlInstance sqlcluster -AvailabilityGroup SharePoint -Database Sharepoint_Config | Get-DbaAgDatabase + + Returns the database Sharepoint_Config found in the availability group SharePoint on server sqlcluster + + #> + [CmdletBinding()] + param ( + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [string[]]$AvailabilityGroup, + [string[]]$Database, + [parameter(ValueFromPipeline)] + [Microsoft.SqlServer.Management.Smo.AvailabilityGroup[]]$InputObject, + [switch]$EnableException + ) + process { + if ($SqlInstance) { + $InputObject += Get-DbaAvailabilityGroup -SqlInstance $SqlInstance -SqlCredential $SqlCredential -AvailabilityGroup $AvailabilityGroup + } + + foreach ($db in $InputObject.AvailabilityDatabases) { + if ($Database) { + if ($db.Name -notin $Database) { continue } + } + $server = $db.Parent.Parent + Add-Member -Force -InputObject $db -MemberType NoteProperty -Name ComputerName -value $server.ComputerName + Add-Member -Force -InputObject $db -MemberType NoteProperty -Name InstanceName -value $server.ServiceName + Add-Member -Force -InputObject $db -MemberType NoteProperty -Name SqlInstance -value $server.DomainInstanceName + Add-Member -Force -InputObject $db -MemberType NoteProperty -Name Replica -value $server.ComputerName + Add-Member -Force -InputObject $db -MemberType NoteProperty -Name DatabaseName -value $db.Name # for backwards compat + Add-Member -Force -InputObject $db -MemberType NoteProperty -Name AvailabilityGroup -value $db.Parent.Name + + $defaults = 'ComputerName', 'InstanceName', 'SqlInstance', 'AvailabilityGroup', 'Replica', 'Name', 'SynchronizationState', 'IsFailoverReady', 'IsJoined', 'IsSuspended' + Select-DefaultView -InputObject $db -Property $defaults + } + } +} +function Get-DbaAgentAlert { + <# + .SYNOPSIS + Returns all SQL Agent alerts on a SQL Server Agent. + + .DESCRIPTION + This function returns SQL Agent alerts. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. This can be a collection and receive pipeline input to allow the function to be executed against multiple SQL Server instances. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Agent, SMO + Author: Klaas Vandenberghe (@PowerDBAKlaas) + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaAgentAlert + + .EXAMPLE + PS C:\> Get-DbaAgentAlert -SqlInstance ServerA,ServerB\instanceB + + Returns all SQL Agent alerts on serverA and serverB\instanceB + + .EXAMPLE + PS C:\> 'serverA','serverB\instanceB' | Get-DbaAgentAlert + + Returns all SQL Agent alerts on serverA and serverB\instanceB + + #> + [CmdletBinding()] + param ( + [parameter(Position = 0, Mandatory, ValueFromPipeline)] + [Alias("ServerInstance", "Instance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential] + $SqlCredential, + [Alias('Silent')] + [switch]$EnableException + ) + + process { + foreach ($instance in $SqlInstance) { + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + Write-Message -Level Verbose -Message "Getting Edition from $server" + Write-Message -Level Verbose -Message "$server is a $($server.Edition)" + + if ($server.Edition -like 'Express*') { + Stop-Function -Message "There is no SQL Agent on $server, it's a $($server.Edition)" -Continue + } + + $defaults = "ComputerName", "SqlInstance", "InstanceName", "Name", "ID", "JobName", "AlertType", "CategoryName", "Severity", "IsEnabled", "DelayBetweenResponses", "LastRaised", "OccurrenceCount" + + $alerts = $server.Jobserver.Alerts + + foreach ($alert in $alerts) { + $lastraised = [dbadatetime]$alert.LastOccurrenceDate + + Add-Member -Force -InputObject $alert -MemberType NoteProperty -Name ComputerName -value $server.ComputerName + Add-Member -Force -InputObject $alert -MemberType NoteProperty -Name InstanceName -value $server.ServiceName + Add-Member -Force -InputObject $alert -MemberType NoteProperty -Name SqlInstance -value $server.DomainInstanceName + Add-Member -Force -InputObject $alert -MemberType NoteProperty Notifications -value $alert.EnumNotifications() + Add-Member -Force -InputObject $alert -MemberType NoteProperty LastRaised -value $lastraised + + Select-DefaultView -InputObject $alert -Property $defaults + } + } + } +} +#ValidationTags#Messaging# +function Get-DbaAgentJob { + <# + .SYNOPSIS + Gets SQL Agent Job information for each instance(s) of SQL Server. + + .DESCRIPTION + The Get-DbaAgentJob returns connected SMO object for SQL Agent Job information for each instance(s) of SQL Server. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. This can be a collection and receive pipeline input to allow the function to be executed against multiple SQL Server instances. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Job + The job(s) to process - this list is auto-populated from the server. If unspecified, all jobs will be processed. + + .PARAMETER ExcludeJob + The job(s) to exclude - this list is auto-populated from the server. + + .PARAMETER ExcludeDisabledJobs + Switch will exclude disabled jobs from the output. + + .PARAMETER Database + Return jobs with T-SQL job steps associated with specific databases + + .PARAMETER Category + Return jobs associated with specific category + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Job, Agent + Author: Garry Bargsley (@gbargsley), http://blog.garrybargsley.com + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaAgentJob + + .EXAMPLE + PS C:\> Get-DbaAgentJob -SqlInstance localhost + + Returns all SQL Agent Jobs on the local default SQL Server instance + + .EXAMPLE + PS C:\> Get-DbaAgentJob -SqlInstance localhost, sql2016 + + Returns all SQl Agent Jobs for the local and sql2016 SQL Server instances + + .EXAMPLE + PS C:\> Get-DbaAgentJob -SqlInstance localhost -Job BackupData, BackupDiff + + Returns all SQL Agent Jobs named BackupData and BackupDiff from the local SQL Server instance. + + .EXAMPLE + PS C:\> Get-DbaAgentJob -SqlInstance localhost -ExcludeJob BackupDiff + + Returns all SQl Agent Jobs for the local SQL Server instances, except the BackupDiff Job. + + .EXAMPLE + PS C:\> Get-DbaAgentJob -SqlInstance localhost -ExcludeDisabledJobs + + Returns all SQl Agent Jobs for the local SQL Server instances, excluding the disabled jobs. + + .EXAMPLE + PS C:\> $servers | Get-DbaAgentJob | Out-GridView -PassThru | Start-DbaAgentJob -WhatIf + + Find all of your Jobs from SQL Server instances in the $servers collection, select the jobs you want to start then see jobs would start if you ran Start-DbaAgentJob + .EXAMPLE + PS C:\> Get-DbaAgentJob -SqlInstance sqlserver2014a | Where-Object Category -eq "Report Server" | Export-DbaScript -Path "C:\temp\sqlserver2014a_SSRSJobs.sql" + + Exports all SSRS jobs from SQL instance sqlserver2014a to a file. + #> + [CmdletBinding()] + param ( + [parameter(Position = 0, Mandatory, ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [string[]]$Job, + [string[]]$ExcludeJob, + [string[]]$Database, + [string[]]$Category, + [switch]$ExcludeDisabledJobs, + [switch]$EnableException + ) + + process { + foreach ($instance in $SqlInstance) { + + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + $jobs = $server.JobServer.Jobs + + if ($Job) { + $jobs = $jobs | Where-Object Name -In $Job + } + if ($ExcludeJob) { + $jobs = $jobs | Where-Object Name -NotIn $ExcludeJob + } + if ($ExcludeDisabledJobs) { + $jobs = $Jobs | Where-Object IsEnabled -eq $true + } + if ($Database) { + $jobs = $jobs | Where-Object { + $_.JobSteps.DatabaseName -in $Database + } + } + if ($Category) { + $jobs = $jobs | Where-Object Category -in $Category + } + + foreach ($agentJob in $jobs) { + Add-Member -Force -InputObject $agentJob -MemberType NoteProperty -Name ComputerName -value $agentJob.Parent.Parent.ComputerName + Add-Member -Force -InputObject $agentJob -MemberType NoteProperty -Name InstanceName -value $agentJob.Parent.Parent.ServiceName + Add-Member -Force -InputObject $agentJob -MemberType NoteProperty -Name SqlInstance -value $agentJob.Parent.Parent.DomainInstanceName + + Select-DefaultView -InputObject $agentJob -Property ComputerName, InstanceName, SqlInstance, Name, Category, OwnerLoginName, CurrentRunStatus, CurrentRunRetryAttempt, 'IsEnabled as Enabled', LastRunDate, LastRunOutcome, HasSchedule, OperatorToEmail, 'DateCreated as CreateDate' + } + } + } +} +function Get-DbaAgentJobCategory { + <# + .SYNOPSIS + Get-DbaAgentJobCategory retrieves the job categories. + + .DESCRIPTION + Get-DbaAgentJobCategory makes it possible to retrieve the job categories. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. This can be a collection and receive pipeline input to allow the function to be executed against multiple SQL Server instances. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Category + The name of the category to filter out. If no category is used all categories will be returned. + + .PARAMETER CategoryType + The type of category. This can be "LocalJob", "MultiServerJob" or "None". + If no category is used all categories types will be returned. + + .PARAMETER Force + The force parameter will ignore some errors in the parameters and assume defaults. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Agent, Job, JobCategory + Author: Sander Stad (@sqlstad), sqlstad.nl + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaAgentJobCategory + + .EXAMPLE + PS C:\> Get-DbaAgentJobCategory -SqlInstance sql1 + + Return all the job categories. + + .EXAMPLE + PS C:\> Get-DbaAgentJobCategory -SqlInstance sql1 -Category 'Log Shipping' + + Return all the job categories that have the name 'Log Shipping'. + + .EXAMPLE + PS C:\> Get-DbaAgentJobCategory -SqlInstance sstad-pc -CategoryType MultiServerJob + + Return all the job categories that have a type MultiServerJob. + + #> + [CmdletBinding(DefaultParameterSetName = "Default")] + param ( + [parameter(Mandatory, ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer")] + [DbaInstance[]]$SqlInstance, + [Alias("Credential")] + [PSCredential]$SqlCredential, + [ValidateNotNullOrEmpty()] + [string[]]$Category, + [ValidateSet("LocalJob", "MultiServerJob", "None")] + [string]$CategoryType, + [switch]$Force, + [Alias('Silent')] + [switch]$EnableException + ) + + process { + + foreach ($instance in $SqlInstance) { + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + # get all the job categories + $jobCategories = $server.JobServer.JobCategories | + Where-Object { + ($_.Name -in $Category -or !$Category) -and + ($_.CategoryType -in $CategoryType -or !$CategoryType) + } + + # Set the default output + $defaults = 'ComputerName', 'InstanceName', 'SqlInstance', 'Name', 'ID', 'CategoryType', 'JobCount' + + # Loop through each of the categories + try { + foreach ($cat in $jobCategories) { + + # Get the jobs associated with the category + $jobCount = ($server.JobServer.Jobs | Where-Object {$_.CategoryID -eq $cat.ID}).Count + + # Add new properties to the category object + Add-Member -Force -InputObject $cat -MemberType NoteProperty -Name ComputerName -value $server.ComputerName + Add-Member -Force -InputObject $cat -MemberType NoteProperty -Name InstanceName -value $server.ServiceName + Add-Member -Force -InputObject $cat -MemberType NoteProperty -Name SqlInstance -value $server.DomainInstanceName + Add-Member -Force -InputObject $cat -MemberType NoteProperty -Name JobCount -Value $jobCount + + # Show the result + Select-DefaultView -InputObject $cat -Property $defaults + } + } catch { + Stop-Function -ErrorRecord $_ -Target $instance -Message "Failure. Collection may have been modified" -Continue + } + + } # for each instance + + } # end process + + end { + if (Test-FunctionInterrupt) { return } + Write-Message -Message "Finished retrieving job category." -Level Verbose + } + +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function Get-DbaAgentJobHistory { + <# + .SYNOPSIS + Gets execution history of SQL Agent Job on instance(s) of SQL Server. + + .DESCRIPTION + Get-DbaAgentJobHistory returns all information on the executions still available on each instance(s) of SQL Server submitted. + The cleanup of SQL Agent history determines how many records are kept. + + https://msdn.microsoft.com/en-us/library/ms201680.aspx + https://msdn.microsoft.com/en-us/library/microsoft.sqlserver.management.smo.agent.jobhistoryfilter(v=sql.120).aspx + + .PARAMETER SqlInstance + The target SQL Server instance or instances. This can be a collection and receive pipeline input to allow the function to be executed against multiple SQL Server instances. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Job + The name of the job from which the history is wanted. If unspecified, all jobs will be processed. + + .PARAMETER ExcludeJob + The job(s) to exclude - this list is auto-populated from the server + + .PARAMETER StartDate + The DateTime starting from which the history is wanted. If unspecified, all available records will be processed. + + .PARAMETER EndDate + The DateTime before which the history is wanted. If unspecified, all available records will be processed. + + .PARAMETER ExcludeJobSteps + Use this switch to discard all job steps, and return only the job totals + + .PARAMETER WithOutputFile + Use this switch to retrieve the output file (only if you want step details). Bonus points, we handle the quirks + of SQL Agent tokens to the best of our knowledge (https://technet.microsoft.com/it-it/library/ms175575(v=sql.110).aspx) + + .PARAMETER JobCollection + An array of SMO jobs + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Job, Agent + Author: Klaas Vandenberghe (@PowerDbaKlaas) | Simone Bizzotto (@niphold) + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaAgentJobHistory + + .EXAMPLE + PS C:\> Get-DbaAgentJobHistory -SqlInstance localhost + + Returns all SQL Agent Job execution results on the local default SQL Server instance. + + .EXAMPLE + PS C:\> Get-DbaAgentJobHistory -SqlInstance localhost, sql2016 + + Returns all SQL Agent Job execution results for the local and sql2016 SQL Server instances. + + .EXAMPLE + PS C:\> 'sql1','sql2\Inst2K17' | Get-DbaAgentJobHistory + + Returns all SQL Agent Job execution results for sql1 and sql2\Inst2K17. + + .EXAMPLE + PS C:\> Get-DbaAgentJobHistory -SqlInstance sql2\Inst2K17 | Select-Object * + + Returns all properties for all SQl Agent Job execution results on sql2\Inst2K17. + + .EXAMPLE + PS C:\> Get-DbaAgentJobHistory -SqlInstance sql2\Inst2K17 -Job 'Output File Cleanup' + + Returns all properties for all SQl Agent Job execution results of the 'Output File Cleanup' job on sql2\Inst2K17. + + .EXAMPLE + PS C:\> Get-DbaAgentJobHistory -SqlInstance sql2\Inst2K17 -Job 'Output File Cleanup' -WithOutputFile + + Returns all properties for all SQl Agent Job execution results of the 'Output File Cleanup' job on sql2\Inst2K17, + with additional properties that show the output filename path + + .EXAMPLE + PS C:\> Get-DbaAgentJobHistory -SqlInstance sql2\Inst2K17 -ExcludeJobSteps + + Returns the SQL Agent Job execution results for the whole jobs on sql2\Inst2K17, leaving out job step execution results. + + .EXAMPLE + PS C:\> Get-DbaAgentJobHistory -SqlInstance sql2\Inst2K17 -StartDate '2017-05-22' -EndDate '2017-05-23 12:30:00' + + Returns the SQL Agent Job execution results between 2017/05/22 00:00:00 and 2017/05/23 12:30:00 on sql2\Inst2K17. + + .EXAMPLE + PS C:\> Get-DbaAgentJob -SqlInstance sql2016 | Where-Object Name -Match backup | Get-DbaAgentJobHistory + + Gets all jobs with the name that match the regex pattern "backup" and then gets the job history from those. You can also use -Like *backup* in this example. + + #> + [CmdletBinding(DefaultParameterSetName = "Default")] + param ( + [parameter(Mandatory, ValueFromPipeline, ParameterSetName = "Server")] + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential] + $SqlCredential, + [object[]]$Job, + [object[]]$ExcludeJob, + [DateTime]$StartDate = "1900-01-01", + [DateTime]$EndDate = $(Get-Date), + [switch]$ExcludeJobSteps, + [switch]$WithOutputFile, + [parameter(Mandatory, ValueFromPipeline, ParameterSetName = "Collection")] + [Microsoft.SqlServer.Management.Smo.Agent.Job]$JobCollection, + [Alias('Silent')] + [switch]$EnableException + ) + + begin { + $filter = New-Object Microsoft.SqlServer.Management.Smo.Agent.JobHistoryFilter + $filter.StartRunDate = $StartDate + $filter.EndRunDate = $EndDate + + + if ($ExcludeJobSteps -and $WithOutputFile) { + Stop-Function -Message "You can't use -ExcludeJobSteps and -WithOutputFile together" + } + + function Get-JobHistory { + [CmdletBinding()] + param ( + $Server, + $Job, + [switch]$WithOutputFile + ) + $tokenrex = [regex]'\$\((?[^()]+)\((?[^)]+)\)\)|\$\((?[^)]+)\)' + $propmap = @{ + 'INST' = $Server.ServiceName + 'MACH' = $Server.ComputerName + 'SQLDIR' = $Server.InstallDataDirectory + 'SQLLOGDIR' = $Server.ErrorLogPath + #'STEPCT' loop number ? + 'SRVR' = $Server.DomainInstanceName + # WMI( property ) impossible + } + + + $squote_rex = [regex]"(? Get-DbaAgentJobOutputFile -SqlInstance SERVERNAME -Job 'The Agent Job' + + This will return the configured paths to the output files for each of the job step of the The Agent Job Job + on the SERVERNAME instance + + .EXAMPLE + PS C:\> Get-DbaAgentJobOutputFile -SqlInstance SERVERNAME + + This will return the configured paths to the output files for each of the job step of all the Agent Jobs + on the SERVERNAME instance + + .EXAMPLE + PS C:\> Get-DbaAgentJobOutputFile -SqlInstance SERVERNAME,SERVERNAME2 -Job 'The Agent Job' + + This will return the configured paths to the output files for each of the job step of the The Agent Job Job + on the SERVERNAME instance and SERVERNAME2 + + .EXAMPLE + $Servers = 'SERVER','SERVER\INSTANCE1' + Get-DbaAgentJobOutputFile -SqlInstance $Servers -Job 'The Agent Job' -OpenFile + + This will return the configured paths to the output files for each of the job step of the The Agent Job Job + on the SERVER instance and the SERVER\INSTANCE1 and open the files if they are available + + .EXAMPLE + PS C:\> Get-DbaAgentJobOutputFile -SqlInstance SERVERNAME | Out-GridView + + This will return the configured paths to the output files for each of the job step of all the Agent Jobs + on the SERVERNAME instance and Pipe them to Out-GridView + + .EXAMPLE + PS C:\> (Get-DbaAgentJobOutputFile -SqlInstance SERVERNAME | Out-GridView -PassThru).FileName | Invoke-Item + + This will return the configured paths to the output files for each of the job step of all the Agent Jobs + on the SERVERNAME instance and Pipe them to Out-GridView and enable you to choose the output + file and open it + + .EXAMPLE + PS C:\> Get-DbaAgentJobOutputFile -SqlInstance SERVERNAME -Verbose + + This will return the configured paths to the output files for each of the job step of all the Agent Jobs + on the SERVERNAME instance and also show the job steps without an output file + + #> + [CmdletBinding()] + param + ( + [Parameter(Mandatory, HelpMessage = 'The SQL Server Instance', + ValueFromPipeline, + ValueFromPipelineByPropertyName = $true, + ValueFromRemainingArguments = $false, + Position = 0)] + [ValidateNotNull()] + [ValidateNotNullOrEmpty()] + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [Parameter(HelpMessage = 'SQL Credential', + ValueFromPipelineByPropertyName = $true, + ValueFromRemainingArguments = $false, + Position = 1)] + [PSCredential]$SqlCredential, + [object[]]$Job, + [object[]]$ExcludeJob, + [Alias('Silent')] + [switch]$EnableException + ) + + process { + foreach ($instance in $sqlinstance) { + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + $jobs = $Server.JobServer.Jobs + if ($Job) { + $jobs = $jobs | Where-Object Name -In $Job + } + if ($ExcludeJob) { + $jobs = $jobs | Where-Object Name -NotIn $ExcludeJob + } + foreach ($j in $Jobs) { + foreach ($Step in $j.JobSteps) { + if ($Step.OutputFileName) { + [pscustomobject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + Job = $j.Name + JobStep = $Step.Name + OutputFileName = $Step.OutputFileName + RemoteOutputFileName = Join-AdminUNC $Server.ComputerName $Step.OutputFileName + StepId = $Step.Id + } | Select-DefaultView -ExcludeProperty StepId + } else { + Write-Message -Level Verbose -Message "$step for $j has no output file" + } + } + } + } + } +} +function Get-DbaAgentJobStep { + <# + .SYNOPSIS + Gets SQL Agent Job Step information for each instance(s) of SQL Server. + + .DESCRIPTION + The Get-DbaAgentJobStep returns connected SMO object for SQL Agent Job Step for each instance(s) of SQL Server. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. This can be a collection and receive pipeline input to allow the function to be executed against multiple SQL Server instances. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Job + The job(s) to process - this list is auto-populated from the server. If unspecified, all jobs will be processed. + + .PARAMETER ExcludeJob + The job(s) to exclude - this list is auto-populated from the server. + + .PARAMETER ExcludeDisabledJobs + Switch will exclude disabled jobs from the output. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Job, Agent + Author: Klaas Vandenberghe (@PowerDbaKlaas), http://powerdba.eu + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaAgentJobStep + + .EXAMPLE + PS C:\> Get-DbaAgentJobStep -SqlInstance localhost + + Returns all SQL Agent Job Steps on the local default SQL Server instance + + .EXAMPLE + PS C:\> Get-DbaAgentJobStep -SqlInstance localhost, sql2016 + + Returns all SQL Agent Job Steps for the local and sql2016 SQL Server instances + + .EXAMPLE + PS C:\> Get-DbaAgentJobStep -SqlInstance localhost -Job BackupData, BackupDiff + + Returns all SQL Agent Job Steps for the jobs named BackupData and BackupDiff from the local SQL Server instance. + + .EXAMPLE + PS C:\> Get-DbaAgentJobStep -SqlInstance localhost -ExcludeJob BackupDiff + + Returns all SQL Agent Job Steps for the local SQL Server instances, except for the BackupDiff Job. + + .EXAMPLE + PS C:\> Get-DbaAgentJobStep -SqlInstance localhost -ExcludeDisabledJobs + + Returns all SQL Agent Job Steps for the local SQL Server instances, excluding the disabled jobs. + + .EXAMPLE + PS C:\> $servers | Get-DbaAgentJobStep + + Find all of your Job Steps from SQL Server instances in the $servers collection + + #> + [CmdletBinding()] + param ( + [parameter(Position = 0, Mandatory, ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential] + $SqlCredential, + [object[]]$Job, + [object[]]$ExcludeJob, + [switch]$ExcludeDisabledJobs, + [Alias('Silent')] + [switch]$EnableException + ) + + process { + foreach ($instance in $SqlInstance) { + + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + Write-Message -Level Verbose -Message "Collecting jobs on $instance" + $jobs = $server.JobServer.Jobs + + if ($Job) { + $jobs = $jobs | Where-Object Name -In $Job + } + if ($ExcludeJob) { + $jobs = $jobs | Where-Object Name -NotIn $ExcludeJob + } + if ($ExcludeDisabledJobs) { + $jobs = $Jobs | Where-Object IsEnabled -eq $true + } + Write-Message -Level Verbose -Message "Collecting job steps on $instance" + foreach ($agentJobStep in $jobs.jobsteps) { + Add-Member -Force -InputObject $agentJobStep -MemberType NoteProperty -Name ComputerName -value $agentJobStep.Parent.Parent.Parent.ComputerName + Add-Member -Force -InputObject $agentJobStep -MemberType NoteProperty -Name InstanceName -value $agentJobStep.Parent.Parent.Parent.ServiceName + Add-Member -Force -InputObject $agentJobStep -MemberType NoteProperty -Name SqlInstance -value $agentJobStep.Parent.Parent.Parent.DomainInstanceName + Add-Member -Force -InputObject $agentJobStep -MemberType NoteProperty -Name AgentJob -value $agentJobStep.Parent.Name + + Select-DefaultView -InputObject $agentJobStep -Property ComputerName, InstanceName, SqlInstance, AgentJob, Name, SubSystem, LastRunDate, LastRunOutcome, State + } + } + } +} +function Get-DbaAgentLog { + <# + .SYNOPSIS + Gets the "SQL Agent Error Log" of an instance + + .DESCRIPTION + Gets the "SQL Agent Error Log" of an instance. Returns all 10 error logs by default. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. This can be a collection and receive pipeline input to allow the function to be executed against multiple SQL Server instances. + + .PARAMETER SqlCredential + Allows you to login to servers using SQL Logins as opposed to Windows Auth/Integrated/Trusted. + + .PARAMETER LogNumber + An Int32 value that specifies the index number of the error log required. Error logs are listed 0 through 9 where 0 is the current error log and 9 is the oldest. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Logging + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaAgentLog + + .EXAMPLE + PS C:\> Get-DbaAgentLog -SqlInstance sql01\sharepoint + + Returns the entire error log for the SQL Agent on sql01\sharepoint + + .EXAMPLE + PS C:\> Get-DbaAgentLog -SqlInstance sql01\sharepoint -LogNumber 3, 6 + + Returns log numbers 3 and 6 for the SQL Agent on sql01\sharepoint + + .EXAMPLE + PS C:\> $servers = "sql2014","sql2016", "sqlcluster\sharepoint" + PS C:\> $servers | Get-DbaAgentLog -LogNumber 0 + + Returns the most recent SQL Agent error logs for "sql2014","sql2016" and "sqlcluster\sharepoint" + + #> + [CmdletBinding()] + param ( + [Parameter(ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [Alias("Credential")] + [PSCredential] + $SqlCredential, + [ValidateRange(0, 9)] + [int[]]$LogNumber, + [Alias('Silent')] + [switch]$EnableException + ) + process { + foreach ($instance in $SqlInstance) { + + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + if ($LogNumber) { + foreach ($number in $lognumber) { + try { + foreach ($object in $server.JobServer.ReadErrorLog($number)) { + Write-Message -Level Verbose -Message "Processing $object" + Add-Member -Force -InputObject $object -MemberType NoteProperty ComputerName -value $server.ComputerName + Add-Member -Force -InputObject $object -MemberType NoteProperty InstanceName -value $server.ServiceName + Add-Member -Force -InputObject $object -MemberType NoteProperty SqlInstance -value $server.DomainInstanceName + + # Select all of the columns you'd like to show + Select-DefaultView -InputObject $object -Property ComputerName, InstanceName, SqlInstance, LogDate, ProcessInfo, Text + } + } catch { + Stop-Function -Continue -Target $server -Message "Could not read from SQL Server Agent" + } + } + } else { + try { + foreach ($object in $server.JobServer.ReadErrorLog()) { + Write-Message -Level Verbose -Message "Processing $object" + Add-Member -Force -InputObject $object -MemberType NoteProperty ComputerName -value $server.ComputerName + Add-Member -Force -InputObject $object -MemberType NoteProperty InstanceName -value $server.ServiceName + Add-Member -Force -InputObject $object -MemberType NoteProperty SqlInstance -value $server.DomainInstanceName + + # Select all of the columns you'd like to show + Select-DefaultView -InputObject $object -Property ComputerName, InstanceName, SqlInstance, LogDate, ProcessInfo, Text + } + } catch { + Stop-Function -Continue -Target $server -Message "Could not read from SQL Server Agent" + } + } + } + } +} +function Get-DbaAgentOperator { + <# + .SYNOPSIS + Returns all SQL Agent operators on a SQL Server Agent. + + .DESCRIPTION + This function returns SQL Agent operators. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. This can be a collection and receive pipeline input to allow the function to be executed against multiple SQL Server instances. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Operator + The operator(s) to process - this list is auto-populated from the server. If unspecified, all operators will be processed. + + .PARAMETER ExcludeOperator + The operator(s) to exclude - this list is auto-populated from the server + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Agent, Operator + Author: Klaas Vandenberghe (@PowerDBAKlaas) + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaAgentOperator + + .EXAMPLE + PS C:\> Get-DbaAgentOperator -SqlInstance ServerA,ServerB\instanceB + + Returns any SQL Agent operators on serverA and serverB\instanceB + + .EXAMPLE + PS C:\> 'ServerA','ServerB\instanceB' | Get-DbaAgentOperator + + Returns all SQL Agent operators on serverA and serverB\instanceB + + .EXAMPLE + PS C:\> Get-DbaAgentOperator -SqlInstance ServerA -Operator Dba1,Dba2 + + Returns only the SQL Agent Operators Dba1 and Dba2 on ServerA. + + .EXAMPLE + PS C:\> Get-DbaAgentOperator -SqlInstance ServerA,ServerB -ExcludeOperator Dba3 + + Returns all the SQL Agent operators on ServerA and ServerB, except the Dba3 operator. + + #> + [CmdletBinding()] + param ( + [parameter(Position = 0, Mandatory, ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential] + $SqlCredential, + [object[]]$Operator, + [object[]]$ExcludeOperator, + [Alias('Silent')] + [switch]$EnableException + ) + process { + foreach ($instance in $SqlInstance) { + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + Write-Message -Level Verbose -Message "Getting Edition from $server" + Write-Message -Level Verbose -Message "$server is a $($server.Edition)" + + if ($server.Edition -like 'Express*') { + Stop-Function -Message "There is no SQL Agent on $server, it's a $($server.Edition)" -Continue -Target $server + } + + $defaults = "ComputerName", "SqlInstance", "InstanceName", "Name", "ID", "Enabled as IsEnabled", "EmailAddress", "LastEmail" + + if ($Operator) { + $operators = $server.JobServer.Operators | Where-Object Name -In $Operator + } elseif ($ExcludeOperator) { + $operators = $server.JobServer.Operators | Where-Object Name -NotIn $ExcludeOperator + } else { + $operators = $server.JobServer.Operators + } + + $alerts = $server.JobServer.alerts + + foreach ($operat in $operators) { + + $jobs = $server.JobServer.jobs | Where-Object { $_.OperatorToEmail, $_.OperatorToNetSend, $_.OperatorToPage -contains $operat.Name } + $lastemail = [dbadatetime]$operat.LastEmailDate + + $operatAlerts = @() + foreach ($alert in $alerts) { + $dtAlert = $alert.EnumNotifications($operat.Name) + if ($dtAlert.Rows.Count -gt 0) { + $operatAlerts += $alert.Name + $alertlastemail = [dbadatetime]$alert.LastOccurrenceDate + } + } + + Add-Member -Force -InputObject $operat -MemberType NoteProperty -Name ComputerName -Value $server.ComputerName + Add-Member -Force -InputObject $operat -MemberType NoteProperty -Name InstanceName -Value $server.ServiceName + Add-Member -Force -InputObject $operat -MemberType NoteProperty -Name SqlInstance -Value $server.DomainInstanceName + Add-Member -Force -InputObject $operat -MemberType NoteProperty -Name RelatedJobs -Value $jobs + Add-Member -Force -InputObject $operat -MemberType NoteProperty -Name LastEmail -Value $lastemail + Add-Member -Force -InputObject $operat -MemberType NoteProperty -Name RelatedAlerts -Value $operatAlerts + Add-Member -Force -InputObject $operat -MemberType NoteProperty -Name AlertLastEmail -Value $alertlastemail + Select-DefaultView -InputObject $operat -Property $defaults + } + } + } +} +function Get-DbaAgentProxy { + <# + .SYNOPSIS + Returns all SQL Agent proxies on a SQL Server Agent. + + .DESCRIPTION + This function returns SQL Agent proxies. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. This can be a collection and receive pipeline input to allow the function to be executed against multiple SQL Server instances. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Proxy + The proxy to process - this list is auto-populated from the server. If unspecified, all proxies will be processed. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Agent, SMO + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaAgentProxy + + .EXAMPLE + PS C:\> Get-DbaAgentProxy -SqlInstance ServerA,ServerB\instanceB + + Returns all SQL Agent proxies on serverA and serverB\instanceB + + .EXAMPLE + PS C:\> 'serverA','serverB\instanceB' | Get-DbaAgentProxy + + Returns all SQL Agent proxies on serverA and serverB\instanceB + + #> + [CmdletBinding()] + param ( + [parameter(Position = 0, Mandatory, ValueFromPipeline)] + [Alias("ServerInstance", "Instance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [string[]]$Proxy, + [switch]$EnableException + ) + process { + foreach ($instance in $SqlInstance) { + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + Write-Message -Level Verbose -Message "Getting Edition from $server" + Write-Message -Level Verbose -Message "$server is a $($server.Edition)" + + if ($server.Edition -like 'Express*') { + Stop-Function -Message "There is no SQL Agent on $server, it's a $($server.Edition)" -Continue + } + + $defaults = "ComputerName", "SqlInstance", "InstanceName", "Name", "ID", "CredentialID", "CredentialIdentity", "CredentialName", "Description", "IsEnabled" + + $proxies = $server.Jobserver.ProxyAccounts + + if ($proxy) { + $proxies = $proxies | Where-Object Name -In $proxy + } + + foreach ($px in $proxies) { + Add-Member -Force -InputObject $px -MemberType NoteProperty -Name ComputerName -value $server.ComputerName + Add-Member -Force -InputObject $px -MemberType NoteProperty -Name InstanceName -value $server.ServiceName + Add-Member -Force -InputObject $px -MemberType NoteProperty -Name SqlInstance -value $server.DomainInstanceName + Select-DefaultView -InputObject $px -Property $defaults + } + } + } +} +function Get-DbaAgentSchedule { + <# + .SYNOPSIS + Returns all SQL Agent Shared Schedules on a SQL Server Agent. + + .DESCRIPTION + This function returns SQL Agent Shared Schedules. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. This can be a collection and receive pipeline input to allow the function to be executed against multiple SQL Server instances. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Schedule + Parameter to filter the schedules returned + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Agent, Schedule + Author: Chris McKeown (@devopsfu), http://www.devopsfu.com + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaAgentSchedule + + .EXAMPLE + PS C:\> Get-DbaAgentSchedule -SqlInstance localhost + + Returns all SQL Agent Shared Schedules on the local default SQL Server instance + + .EXAMPLE + PS C:\> Get-DbaAgentSchedule -SqlInstance localhost, sql2016 + + Returns all SQL Agent Shared Schedules for the local and sql2016 SQL Server instances + + .EXAMPLE + PS C:\> Get-DbaAgentSchedule -SqlInstance sql2016 -Schedule "Maintenance10min","Maintenance60min" + + Returns the "Maintenance10min" & "Maintenance60min" schedules from the sql2016 SQL Server instance + #> + [CmdletBinding()] + param ( + [parameter(Position = 0, Mandatory, ValueFromPipeline)] + [Alias("ServerInstance", "Instance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [Alias("Schedules")] + [object[]]$Schedule, + [PSCredential]$SqlCredential, + [Alias('Silent')] + [switch]$EnableException + ) + + begin { + function Get-ScheduleDescription { + param ( + [Parameter(Mandatory)] + [ValidateNotNullOrEmpty()] + [object]$Schedule + + ) + + # Get the culture to make sure the right date and time format is displayed + $datetimeFormat = (Get-culture).DateTimeFormat + + # Set the intial description + $description = "" + + # Get the date and time values + $startDate = Get-Date $Schedule.ActiveStartDate -format $datetimeFormat.ShortDatePattern + $startTime = Get-Date ($Schedule.ActiveStartTimeOfDay.ToString()) -format $datetimeFormat.LongTimePattern + $endDate = Get-Date $Schedule.ActiveEndDate -format $datetimeFormat.ShortDatePattern + $endTime = Get-Date ($Schedule.ActiveEndTimeOfDay.ToString()) -format $datetimeFormat.LongTimePattern + + # Start setting the description based on the frequency type + switch ($schedule.FrequencyTypes) { + {($_ -eq 1) -or ($_ -eq "Once")} { $description += "Occurs on $startDate at $startTime" } + {($_ -in 4, 8, 16, 32) -or ($_ -in "Daily", "Weekly", "Monthly")} { $description += "Occurs every "} + {($_ -eq 64) -or ($_ -eq "AutoStart")} {$description += "Start automatically when SQL Server Agent starts "} + {($_ -eq 128) -or ($_ -eq "OnIdle")} {$description += "Start whenever the CPUs become idle"} + } + + # Check the frequency types for daily or weekly i.e. + switch ($schedule.FrequencyTypes) { + # Daily + {$_ -in 4, "Daily"} { + if ($Schedule.FrequencyInterval -eq 1) { + $description += "day " + } elseif ($Schedule.FrequencyInterval -gt 1) { + $description += "$($Schedule.FrequencyInterval) day(s) " + } + } + + # Weekly + {$_ -in 8, "Weekly"} { + # Check if it's for one or more weeks + if ($Schedule.FrequencyRecurrenceFactor -eq 1) { + $description += "week on " + } elseif ($Schedule.FrequencyRecurrenceFactor -gt 1) { + $description += "$($Schedule.FrequencyRecurrenceFactor) week(s) on " + } + + # Save the interval for the loop + $frequencyInterval = $Schedule.FrequencyInterval + + # Create the array to hold the days + $days = ($false, $false, $false, $false, $false, $false, $false) + + # Loop through the days + while ($frequencyInterval -gt 0) { + + switch ($FrequenctInterval) { + {($frequencyInterval - 64) -ge 0} { + $days[5] = "Saturday" + $frequencyInterval -= 64 + } + {($frequencyInterval - 32) -ge 0} { + $days[4] = "Friday" + $frequencyInterval -= 32 + } + {($frequencyInterval - 16) -ge 0} { + $days[3] = "Thursday" + $frequencyInterval -= 16 + } + {($frequencyInterval - 8) -ge 0} { + $days[2] = "Wednesday" + $frequencyInterval -= 8 + } + {($frequencyInterval - 4) -ge 0} { + $days[1] = "Tuesday" + $frequencyInterval -= 4 + } + {($frequencyInterval - 2) -ge 0} { + $days[0] = "Monday" + $frequencyInterval -= 2 + } + {($frequencyInterval - 1) -ge 0} { + $days[6] = "Sunday" + $frequencyInterval -= 1 + } + } + + } + + # Add the days to the description by selecting the days and exploding the array + $description += ($days | Where-Object {$_ -ne $false}) -join ", " + $description += " " + + } + + # Monthly + {$_ -in 16, "Monthly"} { + # Check if it's for one or more months + if ($Schedule.FrequencyRecurrenceFactor -eq 1) { + $description += "month " + } elseif ($Schedule.FrequencyRecurrenceFactor -gt 1) { + $description += "$($Schedule.FrequencyRecurrenceFactor) month(s) " + } + + # Add the interval + $description += "on day $($Schedule.FrequencyInterval) of that month " + } + + # Monthly relative + {$_ -in 32, "MonthlyRelative"} { + # Check for the relative day + switch ($Schedule.FrequencyRelativeIntervals) { + {$_ -in 1, "First"} {$description += "first "} + {$_ -in 2, "Second"} {$description += "second "} + {$_ -in 4, "Third"} {$description += "third "} + {$_ -in 8, "Fourth"} {$description += "fourth "} + {$_ -in 16, "Last"} {$description += "last "} + } + + # Get the relative day of the week + switch ($Schedule.FrequencyInterval) { + 1 { $description += "Sunday "} + 2 { $description += "Monday "} + 3 { $description += "Tuesday "} + 4 { $description += "Wednesday "} + 5 { $description += "Thursday "} + 6 { $description += "Friday "} + 7 { $description += "Saturday "} + 8 { $description += "Day "} + 9 { $description += "Weekday "} + 10 { $description += "Weekend day "} + } + + $description += "of every $($Schedule.FrequencyRecurrenceFactor) month(s) " + + } + } + + # Check the frequency type + if ($schedule.FrequencyTypes -notin 64, 128) { + + # Check the subday types for minutes or hours i.e. + if ($schedule.FrequencySubDayInterval -in 0, 1) { + $description += "at $startTime. " + } else { + + switch ($Schedule.FrequencySubDayTypes) { + {$_ -in 2, "Seconds"} { $description += "every $($schedule.FrequencySubDayInterval) second(s) "} + {$_ -in 4, "Minutes"} {$description += "every $($schedule.FrequencySubDayInterval) minute(s) " } + {$_ -in 8, "Hours"} { $description += "every $($schedule.FrequencySubDayInterval) hour(s) " } + } + + $description += "between $startTime and $endTime. " + } + + # Check if an end date has been given + if ($Schedule.ActiveEndDate.Year -eq 9999) { + $description += "Schedule will be used starting on $startDate." + } else { + $description += "Schedule will used between $startDate and $endDate." + } + } + + return $description + } + } + + process { + foreach ($instance in $SqlInstance) { + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + if ($server.Edition -like 'Express*') { + Stop-Function -Message "$($server.Edition) does not support SQL Server Agent. Skipping $server." -Continue + } + + if ($Schedule) { + $scheduleCollection = $server.JobServer.SharedSchedules | Where-Object { $_.Name -in $Schedule } + } else { + $scheduleCollection = $server.JobServer.SharedSchedules + } + + } + + $defaults = "ComputerName", "InstanceName", "SqlInstance", "Name as ScheduleName", "ActiveEndDate", "ActiveEndTimeOfDay", "ActiveStartDate", "ActiveStartTimeOfDay", "DateCreated", "FrequencyInterval", "FrequencyRecurrenceFactor", "FrequencyRelativeIntervals", "FrequencySubDayInterval", "FrequencySubDayTypes", "FrequencyTypes", "IsEnabled", "JobCount", "Description" + + foreach ($schedule in $scheduleCollection) { + $description = Get-ScheduleDescription -Schedule $schedule + + $schedule | Add-Member -Type NoteProperty -Name ComputerName -Value $server.ComputerName + $schedule | Add-Member -Type NoteProperty -Name InstanceName -Value $server.ServiceName + $schedule | Add-Member -Type NoteProperty -Name SqlInstance -Value $server.DomainInstanceName + $schedule | Add-Member -Type NoteProperty -Name Description -Value $description + + Select-DefaultView -InputObject $schedule -Property $defaults + } + + } +} +function Get-DbaAgentServer { + <# + .SYNOPSIS + Gets SQL Agent Server information for each instance(s) of SQL Server. + + .DESCRIPTION + The Get-DbaAgentServer returns connected SMO object for SQL Agent Server information for each instance(s) of SQL Server. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. This can be a collection and receive pipeline input to allow the function to be executed against multiple SQL Server instances. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Job, Agent + Author: Cláudio Silva (@claudioessilva), https://claudioessilva.eu + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaAgentServer + + .EXAMPLE + PS C:\> Get-DbaAgentServer -SqlInstance localhost + + Returns SQL Agent Server on the local default SQL Server instance + + .EXAMPLE + PS C:\> Get-DbaAgentServer -SqlInstance localhost, sql2016 + + Returns SQL Agent Servers for the localhost and sql2016 SQL Server instances + + #> + [CmdletBinding()] + param ( + [parameter(Position = 0, Mandatory, ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [switch]$EnableException + ) + + process { + foreach ($instance in $SqlInstance) { + + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + $jobServer = $server.JobServer + + $defaultView = 'ComputerName', 'InstanceName', 'SqlInstance', 'AgentDomainGroup', 'AgentLogLevel', 'AgentMailType', 'AgentShutdownWaitTime', 'ErrorLogFile', 'IdleCpuDuration', 'IdleCpuPercentage', 'IsCpuPollingEnabled', 'JobServerType', 'LoginTimeout', 'JobHistoryIsEnabled', 'MaximumHistoryRows', 'MaximumJobHistoryRows', 'MsxAccountCredentialName', 'MsxAccountName', 'MsxServerName', 'Name', 'NetSendRecipient', 'ServiceAccount', 'ServiceStartMode', 'SqlAgentAutoStart', 'SqlAgentMailProfile', 'SqlAgentRestart', 'SqlServerRestart', 'State', 'SysAdminOnly' + + Add-Member -Force -InputObject $jobServer -MemberType NoteProperty -Name ComputerName -Value $jobServer.Parent.ComputerName + Add-Member -Force -InputObject $jobServer -MemberType NoteProperty -Name InstanceName -value $jobServer.Parent.ServiceName + Add-Member -Force -InputObject $jobServer -MemberType NoteProperty -Name SqlInstance -Value $jobServer.Parent.DomainInstanceName + Add-Member -Force -InputObject $jobServer -MemberType ScriptProperty -Name JobHistoryIsEnabled -Value { switch ( $jobServer.MaximumHistoryRows ) { -1 { $false } default { $true } } } + + Select-DefaultView -InputObject $jobServer -Property $defaultView + } + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function Get-DbaAgHadr { + <# + .SYNOPSIS + Gets the Hadr service setting on the specified SQL Server instance. + + .DESCRIPTION + Gets the Hadr setting, from the service level, and returns true or false for the specified SQL Server instance. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Hadr, HA, AG, AvailabilityGroup + Author: Shawn Melton (@wsmelton), http://wsmelton.github.io + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaAgHadr + + .EXAMPLE + PS C:\> Get-DbaAgHadr -SqlInstance sql2016 + + Returns a status of the Hadr setting for sql2016 SQL Server instance. + + #> + [CmdletBinding()] + param ( + [parameter(Mandatory, ValueFromPipeline)] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [switch]$EnableException + ) + process { + foreach ($instance in $SqlInstance) { + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $sqlcredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + Add-Member -Force -InputObject $server -MemberType NoteProperty -Name ComputerName -value $server.ComputerName + Add-Member -Force -InputObject $server -MemberType NoteProperty -Name InstanceName -value $server.ServiceName + Add-Member -Force -InputObject $server -MemberType NoteProperty -Name SqlInstance -value $server.DomainInstanceName + + Select-DefaultView -InputObject $server -Property 'ComputerName', 'InstanceName', 'SqlInstance', 'IsHadrEnabled' + } + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function Get-DbaAgListener { + <# + .SYNOPSIS + Returns availability group listeners. + + .DESCRIPTION + Returns availability group listeners. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. Server version must be SQL Server version 2012 or higher. + + .PARAMETER SqlCredential + Login to the SqlInstance instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER AvailabilityGroup + Specify the availability groups to query. + + .PARAMETER Listener + Return only specific listeners. + + .PARAMETER InputObject + Enables piped input from Get-DbaAvailabilityGroup. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: AG, HA, AvailabilityGroup, Listener + Author: Viorel Ciucu (@viorelciucu) + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaAgListener + + .EXAMPLE + PS C:\> Get-DbaAgListener -SqlInstance sql2017a + + Returns all listeners found on sql2017a + + .EXAMPLE + PS C:\> Get-DbaAgListener -SqlInstance sql2017a -AvailabilityGroup AG-a + + Returns all listeners found on sql2017a on sql2017a for the availability group AG-a + + + .EXAMPLE + PS C:\> Get-DbaAvailabilityGroup -SqlInstance sql2017a -AvailabilityGroup OPP | Get-DbaAgListener + + Returns all listeners found on sql2017a on sql2017a for the availability group OPP + + #> + [CmdletBinding()] + param ( + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [string[]]$AvailabilityGroup, + [string[]]$Listener, + [parameter(ValueFromPipeline)] + [Microsoft.SqlServer.Management.Smo.AvailabilityGroup[]]$InputObject, + [switch]$EnableException + ) + process { + if ($SqlInstance) { + $InputObject += Get-DbaAvailabilityGroup -SqlInstance $SqlInstance -SqlCredential $SqlCredential -AvailabilityGroup $AvailabilityGroup + } + + if (Test-Bound -ParameterName Listener) { + $InputObject = $InputObject | Where-Object { $_.AvailabilityGroupListeners.Name -contains $Listener } + } + + $defaults = 'ComputerName', 'InstanceName', 'SqlInstance', 'AvailabilityGroup', 'Name', 'PortNumber', 'ClusterIPConfiguration' + + foreach ($aglistener in $InputObject.AvailabilityGroupListeners) { + $server = $aglistener.Parent.Parent + Add-Member -Force -InputObject $aglistener -MemberType NoteProperty -Name ComputerName -value $server.ComputerName + Add-Member -Force -InputObject $aglistener -MemberType NoteProperty -Name InstanceName -value $server.ServiceName + Add-Member -Force -InputObject $aglistener -MemberType NoteProperty -Name SqlInstance -value $server.DomainInstanceName + Add-Member -Force -InputObject $aglistener -MemberType NoteProperty -Name AvailabilityGroup -value $aglistener.Parent.Name + Select-DefaultView -InputObject $aglistener -Property $defaults + } + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function Get-DbaAgReplica { + <# + .SYNOPSIS + Returns the availability group replica object found on the server. + + .DESCRIPTION + Returns the availability group replica object found on the server. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. Server version must be SQL Server version 2012 or higher. + + .PARAMETER SqlCredential + Login to the SqlInstance instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER AvailabilityGroup + Specify the availability groups to query. + + .PARAMETER Replica + Return only specific replicas. + + .PARAMETER InputObject + Enables piped input from Get-DbaAvailabilityGroup. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: AG, HA, AvailabilityGroup, Replica + Author: Shawn Melton (@wsmelton) | Chrissy LeMaire (@cl) + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaAgReplica + + .EXAMPLE + PS C:\> Get-DbaAgReplica -SqlInstance sql2017a + + Returns basic information on all the availability group replicas found on sql2017a + + .EXAMPLE + PS C:\> Get-DbaAgReplica -SqlInstance sql2017a -AvailabilityGroup SharePoint + + Shows basic information on the replicas found on availability group SharePoint on sql2017a + + .EXAMPLE + PS C:\> Get-DbaAgReplica -SqlInstance sql2017a | Select-Object * + + Returns full object properties on all availability group replicas found on sql2017a + + #> + [CmdletBinding()] + param ( + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [string[]]$AvailabilityGroup, + [string[]]$Replica, + [parameter(ValueFromPipeline)] + [Microsoft.SqlServer.Management.Smo.AvailabilityGroup[]]$InputObject, + [switch]$EnableException + ) + process { + if ($SqlInstance) { + $InputObject += Get-DbaAvailabilityGroup -SqlInstance $SqlInstance -SqlCredential $SqlCredential -AvailabilityGroup $AvailabilityGroup + } + + $availabilityReplicas = $InputObject.AvailabilityReplicas + if ($Replica) { + $availabilityReplicas = $InputObject.AvailabilityReplicas | Where-Object { $_.Name -in $Replica } + } + + $defaults = 'ComputerName', 'InstanceName', 'SqlInstance', 'AvailabilityGroup', 'Name', 'Role', 'ConnectionState', 'RollupSynchronizationState', 'AvailabilityMode', 'BackupPriority', 'EndpointUrl', 'SessionTimeout', 'FailoverMode', 'ReadonlyRoutingList' + + foreach ($agreplica in $availabilityReplicas) { + Add-Member -Force -InputObject $agreplica -MemberType NoteProperty -Name ComputerName -value $agreplica.Parent.ComputerName + Add-Member -Force -InputObject $agreplica -MemberType NoteProperty -Name InstanceName -value $agreplica.Parent.InstanceName + Add-Member -Force -InputObject $agreplica -MemberType NoteProperty -Name SqlInstance -value $agreplica.Parent.SqlInstance + Add-Member -Force -InputObject $agreplica -MemberType NoteProperty -Name AvailabilityGroup -value $agreplica.Parent.Name + Add-Member -Force -InputObject $agreplica -MemberType NoteProperty -Name Replica -value $agreplica.Name # backwards compat + + Select-DefaultView -InputObject $agreplica -Property $defaults + } + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function Get-DbaAvailabilityGroup { + <# + .SYNOPSIS + Returns availability group objects from a SQL Server instance. + + .DESCRIPTION + Returns availability group objects from a SQL Server instance. + + Default view provides most common set of properties for information on the Availability Group(s). + + .PARAMETER SqlInstance + The target SQL Server instance or instances. You must have sysadmin access and server version must be SQL Server version 2012 or higher. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER AvailabilityGroup + Return only specific availability groups. + + .PARAMETER IsPrimary + If this switch is enabled, a boolean indicating whether SqlInstance is the Primary replica in the AG is returned. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Hadr, HA, AG, AvailabilityGroup + Author: Shawn Melton (@wsmelton) | Chrissy LeMaire (@cl) + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaAvailabilityGroup + + .EXAMPLE + PS C:\> Get-DbaAvailabilityGroup -SqlInstance sqlserver2014a + + Returns basic information on all the Availability Group(s) found on sqlserver2014a. + + .EXAMPLE + PS C:\> Get-DbaAvailabilityGroup -SqlInstance sqlserver2014a -AvailabilityGroup AG-a + + Shows basic information on the Availability Group AG-a on sqlserver2014a. + + .EXAMPLE + PS C:\> Get-DbaAvailabilityGroup -SqlInstance sqlserver2014a | Select * + + Returns full object properties on all Availability Group(s) on sqlserver2014a. + + .EXAMPLE + PS C:\> Get-DbaAvailabilityGroup -SqlInstance sqlserver2014a | Select-Object -ExpandProperty PrimaryReplicaServerName + + Returns the SQL Server instancename of the primary replica as a string + + .EXAMPLE + PS C:\> Get-DbaAvailabilityGroup -SqlInstance sqlserver2014a -AvailabilityGroup AG-a -IsPrimary + + Returns true/false if the server, sqlserver2014a, is the primary replica for AG-a Availability Group. + + #> + [CmdletBinding()] + param ( + [parameter(Mandatory, ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [string[]]$AvailabilityGroup, + [switch]$IsPrimary, + [switch]$EnableException + ) + process { + foreach ($instance in $SqlInstance) { + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential -MinimumVersion 11 + } catch { + Stop-Function -Message "Failure." -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + if (-not $server.IsHadrEnabled) { + Stop-Function -Message "Availability Group (HADR) is not configured for the instance: $instance." -Target $instance -Continue + } + + $ags = $server.AvailabilityGroups + + if ($AvailabilityGroup) { + $ags = $ags | Where-Object Name -in $AvailabilityGroup + } + + foreach ($ag in $ags) { + Add-Member -Force -InputObject $ag -MemberType NoteProperty -Name ComputerName -value $server.ComputerName + Add-Member -Force -InputObject $ag -MemberType NoteProperty -Name InstanceName -value $server.ServiceName + Add-Member -Force -InputObject $ag -MemberType NoteProperty -Name SqlInstance -value $server.DomainInstanceName + + if ($IsPrimary) { + $defaults = 'ComputerName', 'InstanceName', 'SqlInstance', 'Name as AvailabilityGroup', 'IsPrimary' + Add-Member -Force -InputObject $ag -MemberType NoteProperty -Name IsPrimary -Value ($ag.PrimaryReplicaServerName -eq $server.Name) + Select-DefaultView -InputObject $ag -Property $defaults + } else { + $defaults = 'ComputerName', 'InstanceName', 'SqlInstance', 'LocalReplicaRole', 'Name as AvailabilityGroup', 'PrimaryReplicaServerName as PrimaryReplica', 'ClusterType', 'DtcSupportEnabled', 'AutomatedBackupPreference', 'AvailabilityReplicas', 'AvailabilityDatabases', 'AvailabilityGroupListeners' + Select-DefaultView -InputObject $ag -Property $defaults + } + } + } + } +} +function Get-DbaAvailableCollation { + <# + .SYNOPSIS + Function to get available collations for a given SQL Server + + .DESCRIPTION + The Get-DbaAvailableCollation function returns the list of collations available on each SQL Server. + Only the connect permission is required to get this information. + + .PARAMETER SqlInstance + TThe target SQL Server instance or instances. Only connect permission is required. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Collation, Configuration + Author: Bryan Hamby (@galador) + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaAvailableCollation + + .EXAMPLE + PS C:\> Get-DbaAvailableCollation -SqlInstance sql2016 + + Gets all the collations from server sql2016 using NT authentication + + #> + [CmdletBinding()] + param ( + [parameter(Position = 0, Mandatory, ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [Alias('Silent')] + [switch]$EnableException + ) + + begin { + #Functions to get/cache the code page and language description. + #It runs about 9x faster caching these (2 vs 18 seconds) in my test, + #since there are so many duplicates + + #No longer supported by Windows, but still shows up in SQL Server + #http://www.databaseteam.org/1-ms-sql-server/982faddda7a789a1.htm + $locales = @{66577 = "Japanese_Unicode"} + $codePages = @{} + + function Get-LocaleDescription ($LocaleId) { + if ($locales.ContainsKey($LocaleId)) { + $localeName = $locales.Get_Item($LocaleId) + } else { + try { + $localeName = (Get-Language $LocaleId).DisplayName + } catch { + $localeName = $null + } + $locales.Set_Item($LocaleId, $localeName) + } + return $localeName + } + + function Get-CodePageDescription ($codePageId) { + if ($codePages.ContainsKey($codePageId)) { + $codePageName = $codePages.Get_Item($codePageId) + } else { + try { + $codePageName = (Get-CodePage $codePageId).EncodingName + } catch { + $codePageName = $null + } + $codePages.Set_Item($codePageId, $codePageName) + } + return $codePageName + } + } + + process { + foreach ($Instance in $sqlInstance) { + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + $availableCollations = $server.EnumCollations() + foreach ($collation in $availableCollations) { + Add-Member -Force -InputObject $collation -MemberType NoteProperty -Name ComputerName -value $server.ComputerName + Add-Member -Force -InputObject $collation -MemberType NoteProperty -Name InstanceName -value $server.ServiceName + Add-Member -Force -InputObject $collation -MemberType NoteProperty -Name SqlInstance -value $server.DomainInstanceName + Add-Member -Force -InputObject $collation -MemberType NoteProperty -Name CodePageName -Value (Get-CodePageDescription $collation.CodePage) + Add-Member -Force -InputObject $collation -MemberType NoteProperty -Name LocaleName -Value (Get-LocaleDescription $collation.LocaleID) + } + + Select-DefaultView -InputObject $availableCollations -Property ComputerName, InstanceName, SqlInstance, Name, CodePage, CodePageName, LocaleID, LocaleName, Description + } + } +} +#ValidationTags#Messaging# +function Get-DbaBackupDevice { + <# + .SYNOPSIS + Gets SQL Backup Device information for each instance(s) of SQL Server. + + .DESCRIPTION + The Get-DbaBackupDevice command gets SQL Backup Device information for each instance(s) of SQL Server. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. This can be a collection and receive pipeline input to allow the function + to be executed against multiple SQL Server instances. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Backup + Author: Garry Bargsley (@gbargsley), http://blog.garrybargsley.com + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaBackupDevice + + .EXAMPLE + PS C:\> Get-DbaBackupDevice -SqlInstance localhost + + Returns all Backup Devices on the local default SQL Server instance + + .EXAMPLE + PS C:\> Get-DbaBackupDevice -SqlInstance localhost, sql2016 + + Returns all Backup Devices for the local and sql2016 SQL Server instances + + #> + [CmdletBinding()] + param ( + [parameter(Position = 0, Mandatory, ValueFromPipeline)] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [Alias('Silent')] + [switch]$EnableException + ) + + process { + foreach ($instance in $SqlInstance) { + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + foreach ($backupDevice in $server.BackupDevices) { + Add-Member -Force -InputObject $backupDevice -MemberType NoteProperty -Name ComputerName -value $backupDevice.Parent.ComputerName + Add-Member -Force -InputObject $backupDevice -MemberType NoteProperty -Name InstanceName -value $backupDevice.Parent.ServiceName + Add-Member -Force -InputObject $backupDevice -MemberType NoteProperty -Name SqlInstance -value $backupDevice.Parent.DomainInstanceName + + Select-DefaultView -InputObject $backupDevice -Property ComputerName, InstanceName, SqlInstance, Name, BackupDeviceType, PhysicalLocation, SkipTapeLabel + } + } + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function Get-DbaBackupHistory { + <# + .SYNOPSIS + Returns backup history details for databases on a SQL Server. + + .DESCRIPTION + Returns backup history details for some or all databases on a SQL Server. + + You can even get detailed information (including file path) for latest full, differential and log files. + + Backups taken with the CopyOnly option will NOT be returned, unless the IncludeCopyOnly switch is present + + Reference: http://www.sqlhub.com/2011/07/find-your-backup-history-in-sql-server.html + + .PARAMETER SqlInstance + The target SQL Server instance or instances. This can be a collection and receive pipeline input to allow the function to be executed against multiple SQL Server instances. + + .PARAMETER SqlCredential + Credential object used to connect to the SQL Server Instance as a different user. This can be a Windows or SQL Server account. Windows users are determined by the existence of a backslash, so if you are intending to use an alternative Windows connection instead of a SQL login, ensure it contains a backslash. + + .PARAMETER Database + Specifies one or more database(s) to process. If unspecified, all databases will be processed. + + .PARAMETER ExcludeDatabase + Specifies one or more database(s) to exclude from processing. + + .PARAMETER IncludeCopyOnly + By default Get-DbaBackupHistory will ignore backups taken with the CopyOnly option. This switch will include them + + .PARAMETER Force + If this switch is enabled, a large amount of information is returned, similar to what SQL Server itself returns. + + .PARAMETER Since + Specifies a DateTime object to use as the starting point for the search for backups. + + .PARAMETER RecoveryFork + Specifies the Recovery Fork you want backup history for + + .PARAMETER Last + If this switch is enabled, the most recent full chain of full, diff and log backup sets is returned. + + .PARAMETER LastFull + If this switch is enabled, the most recent full backup set is returned. + + .PARAMETER LastDiff + If this switch is enabled, the most recent differential backup set is returned. + + .PARAMETER LastLog + If this switch is enabled, the most recent log backup is returned. + + .PARAMETER DeviceType + Specifies a filter for backup sets based on DeviceTypes. Valid options are 'Disk','Permanent Disk Device', 'Tape', 'Permanent Tape Device','Pipe','Permanent Pipe Device','Virtual Device', in addition to custom integers for your own DeviceTypes. + + .PARAMETER Raw + If this switch is enabled, one object per backup file is returned. Otherwise, media sets (striped backups across multiple files) will be grouped into a single return object. + + .PARAMETER Type + Specifies one or more types of backups to return. Valid options are 'Full', 'Log', 'Differential', 'File', 'Differential File', 'Partial Full', and 'Partial Differential'. Otherwise, all types of backups will be returned unless one of the -Last* switches is enabled. + + .PARAMETER LastLsn + Specifies a minimum LSN to use in filtering backup history. Only backups with an LSN greater than this value will be returned, which helps speed the retrieval process. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: DisasterRecovery, Backup + Author: Chrissy LeMaire (@cl) | Stuart Moore (@napalmgram) + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaBackupHistory + + .EXAMPLE + PS C:\> Get-DbaBackupHistory -SqlInstance SqlInstance2014a + + Returns server name, database, username, backup type, date for all database backups still in msdb history on SqlInstance2014a. This may return many rows; consider using filters that are included in other examples. + + .EXAMPLE + PS C:\> $cred = Get-Credential sqladmin + Get-DbaBackupHistory -SqlInstance SqlInstance2014a -SqlCredential $cred + + Does the same as above but connect to SqlInstance2014a as SQL user "sqladmin" + + .EXAMPLE + PS C:\> Get-DbaBackupHistory -SqlInstance SqlInstance2014a -Database db1, db2 -Since '2016-07-01 10:47:00' + + Returns backup information only for databases db1 and db2 on SqlInstance2014a since July 1, 2016 at 10:47 AM. + + .EXAMPLE + PS C:\> Get-DbaBackupHistory -SqlInstance sql2014 -Database AdventureWorks2014, pubs -Force | Format-Table + + Returns information only for AdventureWorks2014 and pubs and formats the results as a table. + + .EXAMPLE + PS C:\> Get-DbaBackupHistory -SqlInstance sql2014 -Database AdventureWorks2014 -Last + + Returns information about the most recent full, differential and log backups for AdventureWorks2014 on sql2014. + + .EXAMPLE + PS C:\> Get-DbaBackupHistory -SqlInstance sql2014 -Database AdventureWorks2014 -Last -DeviceType Disk + + Returns information about the most recent full, differential and log backups for AdventureWorks2014 on sql2014, but only for backups to disk. + + .EXAMPLE + PS C:\> Get-DbaBackupHistory -SqlInstance sql2014 -Database AdventureWorks2014 -Last -DeviceType 148,107 + + Returns information about the most recent full, differential and log backups for AdventureWorks2014 on sql2014, but only for backups with device_type 148 and 107. + + .EXAMPLE + PS C:\> Get-DbaBackupHistory -SqlInstance sql2014 -Database AdventureWorks2014 -LastFull + + Returns information about the most recent full backup for AdventureWorks2014 on sql2014. + + .EXAMPLE + PS C:\> Get-DbaBackupHistory -SqlInstance sql2014 -Database AdventureWorks2014 -Type Full + + Returns information about all Full backups for AdventureWorks2014 on sql2014. + + .EXAMPLE + PS C:\> Get-DbaCmsRegServer -SqlInstance sql2016 | Get-DbaBackupHistory + + Returns database backup information for every database on every server listed in the Central Management Server on sql2016. + + .EXAMPLE + PS C:\> Get-DbaBackupHistory -SqlInstance SqlInstance2014a, sql2016 -Force + + Returns detailed backup history for all databases on SqlInstance2014a and sql2016. + + .EXAMPLE + PS C:\> Get-DbaBackupHistory -SqlInstance sql2016 -Database db1 -RecoveryFork 38e5e84a-3557-4643-a5d5-eed607bef9c6 -Last + + If db1 has multiple recovery forks, specifying the RecoveryFork GUID will restrict the search to that fork. + + #> + [CmdletBinding(DefaultParameterSetName = "Default")] + param ( + [parameter(Mandatory, ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]] + $SqlInstance, + [Alias("Credential")] + [PsCredential]$SqlCredential, + [Alias("Databases")] + [object[]]$Database, + [object[]]$ExcludeDatabase, + [switch]$IncludeCopyOnly, + [Parameter(ParameterSetName = "NoLast")] + [switch]$Force, + [DateTime]$Since = (Get-Date '01/01/1970'), + [ValidateScript( {($_ -match '^(\{){0,1}[0-9a-fA-F]{8}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{12}(\}){0,1}$') -or ('' -eq $_)})] + [string]$RecoveryFork, + [Parameter(ParameterSetName = "Last")] + [switch]$Last, + [Parameter(ParameterSetName = "Last")] + [switch]$LastFull, + [Parameter(ParameterSetName = "Last")] + [switch]$LastDiff, + [Parameter(ParameterSetName = "Last")] + [switch]$LastLog, + [string[]]$DeviceType, + [switch]$Raw, + [bigint]$LastLsn, + [ValidateSet("Full", "Log", "Differential", "File", "Differential File", "Partial Full", "Partial Differential")] + [string[]]$Type, + [Alias('Silent')] + [switch]$EnableException + ) + + begin { + Write-Message -Level System -Message "Active Parameter set: $($PSCmdlet.ParameterSetName)." + Write-Message -Level System -Message "Bound parameters: $($PSBoundParameters.Keys -join ", ")" + + $deviceTypeMapping = @{ + 'Disk' = 2 + 'Permanent Disk Device' = 102 + 'Tape' = 5 + 'Permanent Tape Device' = 105 + 'Pipe' = 6 + 'Permanent Pipe Device' = 106 + 'Virtual Device' = 7 + 'URL' = 9 + } + $deviceTypeFilter = @() + foreach ($devType in $DeviceType) { + if ($devType -in $deviceTypeMapping.Keys) { + $deviceTypeFilter += $deviceTypeMapping[$devType] + } else { + $deviceTypeFilter += $devType + } + } + $backupTypeMapping = @{ + 'Log' = 'L' + 'Full' = 'D' + 'File' = 'F' + 'Differential' = 'I' + 'Differential File' = 'G' + 'Partial Full' = 'P' + 'Partial Differential' = 'Q' + } + $backupTypeFilter = @() + foreach ($typeFilter in $Type) { + $backupTypeFilter += $backupTypeMapping[$typeFilter] + } + + } + + process { + foreach ($instance in $SqlInstance) { + + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential -MinimumVersion 9 + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + if ($server.VersionMajor -ge 10) { + $compressedFlag = $true + # 2008 introduced compressed_backup_size + $backupCols = " + backupset.backup_size AS TotalSize, + backupset.compressed_backup_size as CompressedBackupSize" + } else { + $compressedFlag = $false + $backupCols = " + backupset.backup_size AS TotalSize, + NULL as CompressedBackupSize" + } + + $databases = @() + if ($null -ne $Database) { + foreach ($db in $Database) { + $databases += [PSCustomObject]@{name = $db} + } + } else { + $databases = $server.Databases + } + if ($ExcludeDatabase) { + $databases = $databases | Where-Object Name -NotIn $ExcludeDatabase + } + foreach ($d in $deviceTypeFilter) { + $deviceTypeFilterRight = "IN ('" + ($deviceTypeFilter -Join "','") + "')" + } + + foreach ($b in $backupTypeFilter) { + $backupTypeFilterRight = "IN ('" + ($backupTypeFilter -Join "','") + "')" + } + + if ($last) { + foreach ($db in $databases) { + if ($since) { + $sinceSqlFilter = "AND backupset.backup_finish_date >= '$($Since.ToString("yyyy-MM-ddTHH:mm:ss"))'" + } + if ($RecoveryFork) { + $recoveryForkSqlFilter = "AND backupset.last_recovery_fork_guid ='$RecoveryFork'" + } + if ($null -eq (Get-PsCallStack)[1].Command -or '{ScriptBlock}' -eq (Get-PsCallStack)[1].Command) { + $forkCheckSql = " + SELECT + database_name, + MIN(database_backup_lsn) as 'FirstLsn', + MAX(database_backup_lsn) as 'FinalLsn', + MIN(backup_start_date) as 'MinDate', + MAX(backup_finish_date) as 'MaxDate', + last_recovery_fork_guid 'RecFork', + count(1) as 'backupcount' + FROM msdb.dbo.backupset + WHERE database_name='$($db.name)' + $sinceSqlFilter + $recoveryForkSqlFilter + GROUP by database_name, last_recovery_fork_guid + ORDER by MaxDate Asc + " + + $results = $server.ConnectionContext.ExecuteWithResults($forkCheckSql).Tables.Rows + if ($results.count -gt 1) { + Write-Message -Message "Found backups from multiple recovery forks for $($db.name) on $($server.name), this may affect your results" -Level Warning + foreach ($result in $results) { + Write-Message -Message "Between $($result.MinDate)/$($result.FirstLsn) and $($result.MaxDate)/$($result.FinalLsn) $($result.name) was on Recovery Fork GUID $($result.RecFork) ($($result.backupcount) backups)" -Level Warning + } + if ($null -eq $RecoveryFork) { + $RecoveryFork = $results[-1].RecFork + Write-Message -Message "Defaulting to last Recovery Fork, ID - $RecoveryFork" + } + } + } + #Get the full and build upwards + $allBackups = @() + $allBackups += $fullDb = Get-DbaBackupHistory -SqlInstance $server -Database $db.Name -LastFull -raw:$Raw -DeviceType $DeviceType -IncludeCopyOnly:$IncludeCopyOnly -Since:$since -RecoveryFork $RecoveryFork + $diffDb = Get-DbaBackupHistory -SqlInstance $server -Database $db.Name -LastDiff -raw:$Raw -DeviceType $DeviceType -IncludeCopyOnly:$IncludeCopyOnly -Since:$since -RecoveryFork $RecoveryFork + if ($diffDb.LastLsn -gt $fullDb.LastLsn -and $diffDb.DatabaseBackupLSN -eq $fullDb.CheckPointLSN ) { + Write-Message -Level Verbose -Message "Valid Differential backup " + $allBackups += $diffDb + $tlogStartDsn = ($diffDb.FirstLsn -as [bigint]) + } else { + Write-Message -Level Verbose -Message "No Diff found" + try { + [bigint]$tlogStartDsn = $fullDb.FirstLsn.ToString() + } catch { + continue + } + } + $allBackups += Get-DbaBackupHistory -SqlInstance $server -Database $db.Name -raw:$raw -DeviceType $DeviceType -LastLsn $tlogStartDsn -IncludeCopyOnly:$IncludeCopyOnly -Since:$since -RecoveryFork $RecoveryFork | Where-Object { + $_.Type -eq 'Log' -and [bigint]$_.LastLsn -gt [bigint]$tlogStartDsn -and [bigint]$_.DatabaseBackupLSN -eq [bigint]$fullDb.CheckPointLSN -and $_.LastRecoveryForkGuid -eq $fullDb.LastRecoveryForkGuid + } + #This line does the output for -Last!!! + $allBackups | Sort-Object -Property LastLsn, Type + } + continue + } + + if ($LastFull -or $LastDiff -or $LastLog) { + if ($LastFull) { + $first = 'D'; $second = 'P' + } + if ($LastDiff) { + $first = 'I'; $second = 'Q' + } + if ($LastLog) { + $first = 'L'; $second = 'L' + } + $databases = $databases | Select-Object -Unique -Property Name + $sql = "" + foreach ($db in $databases) { + Write-Message -Level Verbose -Message "Processing $($db.name)" -Target $db + if ($since) { + $sinceSqlFilter = "AND backupset.backup_finish_date >= '$($Since.ToString("yyyy-MM-ddTHH:mm:ss"))'" + } + if ($RecoveryFork) { + $recoveryForkSqlFilter = "AND backupset.last_recovery_fork_guid ='$RecoveryFork'" + } + if ((Get-PsCallStack)[1].Command -notlike 'Get-DbaBackupHistory*') { + $forkCheckSql = " + SELECT + database_name, + MIN(database_backup_lsn) as 'FirstLsn', + MAX(database_backup_lsn) as 'FinalLsn', + MIN(backup_start_date) as 'MinDate', + MAX(backup_finish_date) as 'MaxDate', + last_recovery_fork_guid 'RecFork', + count(1) as 'backupcount' + FROM msdb.dbo.backupset + WHERE database_name='$($db.name)' + $sinceSqlFilter + $recoveryForkSqlFilter + GROUP by database_name, last_recovery_fork_guid + " + + $results = $server.ConnectionContext.ExecuteWithResults($forkCheckSql).Tables.Rows + if ($results.count -gt 1) { + Write-Message -Message "Found backups from multiple recovery forks for $($db.name) on $($server.name), this may affect your results" -Level Warning + foreach ($result in $results) { + Write-Message -Message "Between $($result.MinDate)/$($result.FirstLsn) and $($result.MaxDate)/$($result.FinalLsn) $($result.name) was on Recovery Fork GUID $($result.RecFork) ($($result.backupcount) backups)" -Level Warning + } + + } + } + $whereCopyOnly = $null + if ($true -ne $IncludeCopyOnly) { + $whereCopyOnly = " AND is_copy_only='0' " + } + if ($deviceTypeFilter) { + $devTypeFilterWhere = "AND mediafamily.device_type $deviceTypeFilterRight" + } + if ($since) { + $sinceSqlFilter = "AND backupset.backup_finish_date >= '$($Since.ToString("yyyy-MM-ddTHH:mm:ss"))'" + } + # recap for future editors (as this has been discussed over and over): + # - original editors (from hereon referred as "we") rank over backupset.last_lsn desc, backupset.backup_finish_date desc for a good reason: DST + # all times are recorded with the timezone of the server + # - we thought about ranking over backupset.backup_set_id desc, backupset.last_lsn desc, backupset.backup_finish_date desc + # but there is no explicit documentation about "when" a row gets inserted into backupset. Theoretically it _could_ + # happen that backup_set_id for the same database has not the same order of last_lsn. + # - given ultimately to restore something lsn IS the source of truth, we decided to trust that and only that + # - we know that sometimes it happens to drop a database without deleting the history. Assuming then to create a database with the same name, + # and given the lsn are composed in the first part by the VLF SeqID, it happens seldomly that for the same database_name backupset holds + # last_lsn out of order. To avoid this behaviour, we filter by database_guid choosing the guid that has MAX(backup_finish_date), as we know + # last_lsn cannot be out-of-order for the same database, and the same database cannot have different database_guid + $sql += " + SELECT + a.BackupSetRank, + a.Server, + a.[Database], + a.Username, + a.Start, + a.[End], + a.Duration, + a.[Path], + a.Type, + a.TotalSize, + a.CompressedBackupSize, + a.MediaSetId, + a.BackupSetID, + a.Software, + a.position, + a.first_lsn, + a.database_backup_lsn, + a.checkpoint_lsn, + a.last_lsn, + a.first_lsn as 'FirstLSN', + a.database_backup_lsn as 'DatabaseBackupLsn', + a.checkpoint_lsn as 'CheckpointLsn', + a.last_lsn as 'LastLsn', + a.software_major_version, + a.DeviceType, + a.is_copy_only, + a.last_recovery_fork_guid, + a.recovery_model + FROM (SELECT + RANK() OVER (ORDER BY backupset.last_lsn desc, backupset.backup_finish_date DESC) AS 'BackupSetRank', + backupset.database_name AS [Database], + backupset.user_name AS Username, + backupset.backup_start_date AS Start, + backupset.server_name as [Server], + backupset.backup_finish_date AS [End], + DATEDIFF(SECOND, backupset.backup_start_date, backupset.backup_finish_date) AS Duration, + mediafamily.physical_device_name AS Path, + $backupCols, + CASE backupset.type + WHEN 'L' THEN 'Log' + WHEN 'D' THEN 'Full' + WHEN 'F' THEN 'File' + WHEN 'I' THEN 'Differential' + WHEN 'G' THEN 'Differential File' + WHEN 'P' THEN 'Partial Full' + WHEN 'Q' THEN 'Partial Differential' + ELSE NULL + END AS Type, + backupset.media_set_id AS MediaSetId, + mediafamily.media_family_id as mediafamilyid, + backupset.backup_set_id as BackupSetID, + CASE mediafamily.device_type + WHEN 2 THEN 'Disk' + WHEN 102 THEN 'Permanent Disk Device' + WHEN 5 THEN 'Tape' + WHEN 105 THEN 'Permanent Tape Device' + WHEN 6 THEN 'Pipe' + WHEN 106 THEN 'Permanent Pipe Device' + WHEN 7 THEN 'Virtual Device' + WHEN 9 THEN 'URL' + ELSE 'Unknown' + END AS DeviceType, + backupset.position, + backupset.first_lsn, + backupset.database_backup_lsn, + backupset.checkpoint_lsn, + backupset.last_lsn, + backupset.software_major_version, + mediaset.software_name AS Software, + backupset.is_copy_only, + backupset.last_recovery_fork_guid, + backupset.recovery_model + FROM msdb..backupmediafamily AS mediafamily + JOIN msdb..backupmediaset AS mediaset + ON mediafamily.media_set_id = mediaset.media_set_id + JOIN msdb..backupset AS backupset + ON backupset.media_set_id = mediaset.media_set_id + JOIN ( + SELECT DISTINCT database_guid, database_name, backup_finish_date + FROM msdb..backupset + WHERE backupset.database_name = '$($db.Name)' + ) dbguid + ON dbguid.database_name = backupset.database_name + AND dbguid.database_guid = backupset.database_guid + JOIN ( + SELECT database_name, MAX(backup_finish_date) max_finish_date + FROM msdb..backupset + WHERE backupset.database_name = '$($db.Name)' + GROUP BY database_name + ) dbguid_support + ON dbguid_support.database_name = backupset.database_name + AND dbguid.backup_finish_date = dbguid_support.max_finish_date + WHERE backupset.database_name = '$($db.Name)' $whereCopyOnly + AND (type = '$first' OR type = '$second') + $devTypeFilterWhere + $sinceSqlFilter + $recoveryForkSqlFilter + ) AS a + WHERE a.BackupSetRank = 1 + ORDER BY a.Type; + " + } + $sql = $sql -join "; " + } else { + if ($Force -eq $true) { + $select = "SELECT * " + } else { + $select = " + SELECT + backupset.database_name AS [Database], + backupset.user_name AS Username, + backupset.server_name as [server], + backupset.backup_start_date AS [Start], + backupset.backup_finish_date AS [End], + DATEDIFF(SECOND, backupset.backup_start_date, backupset.backup_finish_date) AS Duration, + mediafamily.physical_device_name AS Path, + $backupCols, + CASE backupset.type + WHEN 'L' THEN 'Log' + WHEN 'D' THEN 'Full' + WHEN 'F' THEN 'File' + WHEN 'I' THEN 'Differential' + WHEN 'G' THEN 'Differential File' + WHEN 'P' THEN 'Partial Full' + WHEN 'Q' THEN 'Partial Differential' + ELSE NULL + END AS Type, + backupset.media_set_id AS MediaSetId, + mediafamily.media_family_id as MediaFamilyId, + backupset.backup_set_id as BackupSetId, + CASE mediafamily.device_type + WHEN 2 THEN 'Disk' + WHEN 102 THEN 'Permanent Disk Device' + WHEN 5 THEN 'Tape' + WHEN 105 THEN 'Permanent Tape Device' + WHEN 6 THEN 'Pipe' + WHEN 106 THEN 'Permanent Pipe Device' + WHEN 7 THEN 'Virtual Device' + WHEN 9 THEN 'URL' + ELSE 'Unknown' + END AS DeviceType, + backupset.position, + backupset.first_lsn, + backupset.database_backup_lsn, + backupset.checkpoint_lsn, + backupset.last_lsn, + backupset.first_lsn as 'FirstLSN', + backupset.database_backup_lsn as 'DatabaseBackupLsn', + backupset.checkpoint_lsn as 'CheckpointLsn', + backupset.last_lsn as 'LastLsn', + backupset.software_major_version, + mediaset.software_name AS Software, + backupset.is_copy_only, + backupset.last_recovery_fork_guid, + backupset.recovery_model" + } + + $from = " FROM msdb..backupmediafamily mediafamily + INNER JOIN msdb..backupmediaset mediaset ON mediafamily.media_set_id = mediaset.media_set_id + INNER JOIN msdb..backupset backupset ON backupset.media_set_id = mediaset.media_set_id" + if ($Database -or $ExcludeDatabase -or $Since -or $Last -or $LastFull -or $LastLog -or $LastDiff -or $deviceTypeFilter -or $LastLsn -or $backupTypeFilter) { + $where = " WHERE " + } + + $whereArray = @() + + if ($Database.length -gt 0 -or $ExcludeDatabase.length -gt 0) { + $dbList = $databases.Name -join "','" + $whereArray += "database_name IN ('$dbList')" + } + + if ($true -ne $IncludeCopyOnly) { + $whereArray += "is_copy_only='0'" + } + + if ($Last -or $LastFull -or $LastLog -or $LastDiff) { + $tempWhere = $whereArray -join " AND " + $whereArray += "type = 'Full' AND mediaset.media_set_id = (SELECT TOP 1 mediaset.media_set_id $from $tempWhere ORDER BY backupset.last_lsn DESC)" + } + + if ($null -ne $Since) { + $whereArray += "backupset.backup_finish_date >= '$($Since.ToString("yyyy-MM-ddTHH:mm:ss"))'" + } + + if ($deviceTypeFilter) { + $whereArray += "mediafamily.device_type $deviceTypeFilterRight" + } + if ($backupTypeFilter) { + $whereArray += "backupset.type $backupTypeFilterRight" + } + + if ($LastLsn) { + $whereArray += "backupset.last_lsn > $LastLsn" + } + if ($where.Length -gt 0) { + $whereArray = $whereArray -join " AND " + $where = "$where $whereArray" + } + + $sql = "$select $from $where ORDER BY backupset.last_lsn DESC" + } + + Write-Message -Level Debug -Message "SQL Statement: `n$sql" + Write-Message -Level SomewhatVerbose -Message "Executing sql query." + $results = $server.ConnectionContext.ExecuteWithResults($sql).Tables.Rows | Select-Object * -ExcludeProperty BackupSetRank, RowError, RowState, Table, ItemArray, HasErrors + + if ($raw) { + Write-Message -Level SomewhatVerbose -Message "Processing as Raw Output." + $results | Select-Object *, @{ Name = "FullName"; Expression = { $_.Path } } + Write-Message -Level SomewhatVerbose -Message "$($results.Count) result sets found." + } else { + Write-Message -Level SomewhatVerbose -Message "Processing as grouped output." + $groupedResults = $results | Group-Object -Property BackupsetId + Write-Message -Level SomewhatVerbose -Message "$($groupedResults.Count) result-groups found." + $groupResults = @() + $backupSetIds = $groupedResults.Name + $backupSetIdsList = $backupSetIds -Join "," + if ($groupedResults.Count -gt 0) { + $backupSetIdsWhere = "backup_set_id IN ($backupSetIdsList)" + $fileAllSql = "SELECT backup_set_id, file_type as FileType, logical_name as LogicalName, physical_name as PhysicalName + FROM msdb..backupfile WHERE $backupSetIdsWhere" + Write-Message -Level Debug -Message "FileSQL: $fileAllSql" + $fileListResults = $server.Query($fileAllSql) + } else { + $fileListResults = @() + } + $fileListHash = @{} + foreach ($fl in $fileListResults) { + if (-not($fileListHash.ContainsKey($fl.backup_set_id))) { + $fileListHash[$fl.backup_set_id] = @() + } + $fileListHash[$fl.backup_set_id] += $fl + } + foreach ($group in $groupedResults) { + $commonFields = $group.Group[0] + $groupLength = $group.Group.Count + if ($groupLength -eq 1) { + $start = $commonFields.Start + $end = $commonFields.End + $duration = New-TimeSpan -Seconds $commonFields.Duration + } else { + $start = ($group.Group.Start | Measure-Object -Minimum).Minimum + $end = ($group.Group.End | Measure-Object -Maximum).Maximum + $duration = New-TimeSpan -Seconds ($group.Group.Duration | Measure-Object -Maximum).Maximum + } + $compressedBackupSize = $commonFields.CompressedBackupSize + if ($compressedFlag -eq $true) { + $ratio = [Math]::Round(($commonFields.TotalSize) / ($compressedBackupSize), 2) + } else { + $compressedBackupSize = $null + $ratio = 1 + } + $historyObject = New-Object Sqlcollaborative.Dbatools.Database.BackupHistory + $historyObject.ComputerName = $server.ComputerName + $historyObject.InstanceName = $server.ServiceName + $historyObject.SqlInstance = $server.DomainInstanceName + $historyObject.Database = $commonFields.Database + $historyObject.UserName = $commonFields.UserName + $historyObject.Start = $start + $historyObject.End = $end + $historyObject.Duration = $duration + $historyObject.Path = $group.Group.Path + $historyObject.TotalSize = $commonFields.TotalSize + $historyObject.CompressedBackupSize = $compressedBackupSize + $historyObject.CompressionRatio = $ratio + $historyObject.Type = $commonFields.Type + $historyObject.BackupSetId = $commonFields.BackupSetId + $historyObject.DeviceType = $commonFields.DeviceType + $historyObject.Software = $commonFields.Software + $historyObject.FullName = $group.Group.Path + $historyObject.FileList = $fileListHash[$commonFields.BackupSetID] | Select-Object FileType, LogicalName, PhysicalName + $historyObject.Position = $commonFields.Position + $historyObject.FirstLsn = $commonFields.First_LSN + $historyObject.DatabaseBackupLsn = $commonFields.database_backup_lsn + $historyObject.CheckpointLsn = $commonFields.checkpoint_lsn + $historyObject.LastLsn = $commonFields.Last_Lsn + $historyObject.SoftwareVersionMajor = $commonFields.Software_Major_Version + $historyObject.IsCopyOnly = ($commonFields.is_copy_only -eq 1) + $historyObject.LastRecoveryForkGuid = $commonFields.last_recovery_fork_guid + $historyObject.RecoveryModel = $commonFields.recovery_model + $historyObject + } + $groupResults | Sort-Object -Property LastLsn, Type + } + } + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function Get-DbaBackupInformation { + <# + .SYNOPSIS + Scan backup files and creates a set, compatible with Restore-DbaDatabase + + .DESCRIPTION + Upon being passed a list of potential backups files this command will scan the files, select those that contain SQL Server + backup sets. It will then filter those files down to a set + + The function defaults to working on a remote instance. This means that all paths passed in must be relative to the remote instance. + XpDirTree will be used to perform the file scans + + Various means can be used to pass in a list of files to be considered. The default is to non recursively scan the folder + passed in. + + .PARAMETER Path + Path to SQL Server backup files. + + Paths passed in as strings will be scanned using the desired method, default is a non recursive folder scan + Accepts multiple paths separated by ',' + + Or it can consist of FileInfo objects, such as the output of Get-ChildItem or Get-Item. This allows you to work with + your own file structures as needed + + .PARAMETER SqlInstance + The SQL Server instance to be used to read the headers of the backup files + + .PARAMETER SqlCredential + Allows you to login to servers using SQL Logins as opposed to Windows Auth/Integrated/Trusted. + + .PARAMETER DatabaseName + An array of Database Names to filter by. If empty all databases are returned. + + .PARAMETER SourceInstance + If provided only backup originating from this destination will be returned. This SQL instance will not be connected to or involved in this work + + .PARAMETER NoXpDirTree + If this switch is set, then Files will be parsed as locally files. This can cause failures if the running user can see files that the parsing SQL Instance cannot + + .PARAMETER DirectoryRecurse + If specified the provided path/directory will be traversed (only applies if not using XpDirTree) + + .PARAMETER Anonymise + If specified we will output the results with ComputerName, InstanceName, Database, UserName, Paths, and Logical and Physical Names hashed out + This options is mainly for use if we need you to submit details for fault finding to the dbatools team + + .PARAMETER ExportPath + If specified the output will export via CliXml format to the specified file. This allows you to store the backup history object for later usage, or move it between computers + + .PARAMETER NoClobber + If specified will stop Export from overwriting an existing file, the default is to overwrite + + .PARAMETER PassThru + When data is exported the cmdlet will return no other output, this switch means it will also return the normal output which can be then piped into another command + + .PARAMETER MaintenanceSolution + This switch tells the function that the folder is the root of a Ola Hallengren backup folder + + .PARAMETER IgnoreLogBackup + This switch only works with the MaintenanceSolution switch. With an Ola Hallengren style backup we can be sure that the LOG folder contains only log backups and skip it. + For all other scenarios we need to read the file headers to be sure. + + .PARAMETER AzureCredential + The name of the SQL Server credential to be used if restoring from an Azure hosted backup + + .PARAMETER Import + When specified along with a path the command will import a previously exported BackupHistory object from an xml file. + + .PARAMETER EnableException + Replaces user friendly yellow warnings with bloody red exceptions of doom! + Use this if you want the function to throw terminating errors you want to catch. + + .NOTES + Tags: DisasterRecovery, Backup, Restore + Author: Chrissy LeMaire (@cl) | Stuart Moore (@napalmgram) + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaBackupInformation + + .EXAMPLE + PS C:\> Get-DbaBackupInformation -SqlInstance Server1 -Path c:\backups\ -DirectoryRecurse + + Will use the Server1 instance to recursively read all backup files under c:\backups, and return a dbatools BackupHistory object + + .EXAMPLE + PS C:\> Get-DbaBackupInformation -SqlInstance Server1 -Path c:\backups\ -DirectoryRecurse -ExportPath c:\store\BackupHistory.xml + PS C:\> robocopy c:\store\ \\remoteMachine\C$\store\ BackupHistory.xml + PS C:\> Get-DbaBackupInformation -Import -Path c:\store\BackupHistory.xml | Restore-DbaDatabase -SqlInstance Server2 -TrustDbBackupHistory + + This example creates backup history output from server1 and copies the file to the remote machine in order to preserve backup history. It is then used to restore the databases onto server2. + + .EXAMPLE + PS C:\> Get-DbaBackupInformation -SqlInstance Server1 -Path c:\backups\ -DirectoryRecurse -ExportPath C:\store\BackupHistory.xml -PassThru | Restore-DbaDatabase -SqlInstance Server2 -TrustDbBackupHistory + + In this example we gather backup information, export it to an xml file, and then pass it on through to Restore-DbaDatabase. + This allows us to repeat the restore without having to scan all the backup files again + + .EXAMPLE + PS C:\> Get-ChildItem c:\backups\ -recurse -files | Where-Object {$_.extension -in ('.bak','.trn') -and $_.LastWriteTime -gt (get-date).AddMonths(-1)} | Get-DbaBackupInformation -SqlInstance Server1 -ExportPath C:\backupHistory.xml + + This lets you keep a record of all backup history from the last month on hand to speed up refreshes + + .EXAMPLE + PS C:\> $Backups = Get-DbaBackupInformation -SqlInstance Server1 -Path \\network\backups + PS C:\> $Backups += Get-DbaBackupInformation -SqlInstance Server2 -NoXpDirTree -Path c:\backups + + Scan the unc folder \\network\backups with Server1, and then scan the C:\backups folder on + Server2 not using xp_dirtree, adding the results to the first set. + + .EXAMPLE + PS C:\> $Backups = Get-DbaBackupInformation -SqlInstance Server1 -Path \\network\backups -MaintenanceSolution + + When MaintenanceSolution is indicated we know we are dealing with the output from Ola Hallengren backup scripts. So we make sure that a FULL folder exists in the first level of Path, if not we shortcut scanning all the files as we have nothing to work with + + .EXAMPLE + PS C:\> $Backups = Get-DbaBackupInformation -SqlInstance Server1 -Path \\network\backups -MaintenanceSolution -IgnoreLogBackup + + As we know we are dealing with an Ola Hallengren style backup folder from the MaintenanceSolution switch, when IgnoreLogBackup is also included we can ignore the LOG folder to skip any scanning of log backups. Note this also means they WON'T be restored + + #> + [CmdletBinding( DefaultParameterSetName = "Create")] + [Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSAvoidUsingPlainTextForPassword", "", Justification = "For Parameter AzureCredential")] + param ( + [parameter(Mandatory, ValueFromPipeline)] + [object[]]$Path, + [parameter(Mandatory, ParameterSetName = "Create")] + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter]$SqlInstance, + [parameter(ParameterSetName = "Create")] + [PSCredential]$SqlCredential, + [string[]]$DatabaseName, + [string[]]$SourceInstance, + [parameter(ParameterSetName = "Create")] + [Switch]$NoXpDirTree, + [parameter(ParameterSetName = "Create")] + [switch]$DirectoryRecurse, + [switch]$EnableException, + [switch]$MaintenanceSolution, + [switch]$IgnoreLogBackup, + [string]$ExportPath, + [string]$AzureCredential, + [parameter(ParameterSetName = "Import")] + [switch]$Import, + [switch][Alias('Anonymize')]$Anonymise, + [Switch]$NoClobber, + [Switch]$PassThru + + ) + begin { + function Get-HashString { + param( + [String]$InString + ) + + $StringBuilder = New-Object System.Text.StringBuilder + [System.Security.Cryptography.HashAlgorithm]::Create("md5").ComputeHash([System.Text.Encoding]::UTF8.GetBytes($InString))| ForEach-Object { + [Void]$StringBuilder.Append($_.ToString("x2")) + } + return $StringBuilder.ToString() + } + Write-Message -Level InternalComment -Message "Starting" + Write-Message -Level Debug -Message "Parameters bound: $($PSBoundParameters.Keys -join ", ")" + + if (Test-Bound -ParameterName ExportPath) { + if ($true -eq $NoClobber) { + if (Test-Path $ExportPath) { + Stop-Function -Message "$ExportPath exists and NoClobber set" + return + } + } + } + if ($PSCmdlet.ParameterSetName -eq "Create") { + try { + $server = Connect-SqlInstance -SqlInstance $SqlInstance -SqlCredential $SqlCredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + return + } + } + + if ($true -eq $IgnoreLogBackup -and $true -ne $MaintenanceSolution) { + Write-Message -Message "IgnoreLogBackup can only by used with MaintenanceSolution. Will not be used" -Level Warning + } + } + process { + if (Test-FunctionInterrupt) { return } + if ((Test-Bound -Parameter Import) -and ($true -eq $Import)) { + foreach ($f in $Path) { + if (Test-Path -Path $f) { + $groupResults += Import-CliXml -Path $f + foreach ($group in $groupResults) { + $group.FirstLsn = [BigInt]$group.FirstLSN.ToString() + $group.CheckpointLSN = [BigInt]$group.CheckpointLSN.ToString() + $group.DatabaseBackupLsn = [BigInt]$group.DatabaseBackupLsn.ToString() + $group.LastLsn = [BigInt]$group.LastLsn.ToString() + } + } else { + Write-Message -Message "$f does not exist or is unreadable" -Level Warning + } + } + } else { + $Files = @() + $groupResults = @() + if ($Path[0] -match 'http') { $NoXpDirTree = $true } + if ($NoXpDirTree -ne $true) { + foreach ($f in $path) { + if ([System.IO.Path]::GetExtension($f).Length -gt 1) { + if ("FullName" -notin $f.PSObject.Properties.name) { + $f = $f | Select-Object *, @{ Name = "FullName"; Expression = { $f } } + } + Write-Message -Message "Testing a single file $f " -Level Verbose + if ((Test-DbaPath -Path $f.FullName -SqlInstance $server)) { + $files += $f + } else { + Write-Message -Level Verbose -Message "$server cannot 'see' file $($f.FullName)" + } + } elseif ($True -eq $MaintenanceSolution) { + if ($true -eq $IgnoreLogBackup -and [System.IO.Path]::GetDirectoryName($f) -like '*LOG') { + Write-Message -Level Verbose -Message "Skipping Log Backups as requested" + } else { + Write-Message -Level Verbose -Message "OLA - Getting folder contents" + $Files += Get-XpDirTreeRestoreFile -Path $f -SqlInstance $server + } + } else { + Write-Message -Message "Testing a folder $f" -Level Verbose + $Files += $Check = Get-XpDirTreeRestoreFile -Path $f -SqlInstance $server + if ($null -eq $check) { + Write-Message -Message "Nothing returned from $f" -Level Verbose + } + } + } + } else { + ForEach ($f in $path) { + Write-Message -Level VeryVerbose -Message "Not using sql for $f" + if ($f -is [System.IO.FileSystemInfo]) { + if ($f.PsIsContainer -eq $true -and $true -ne $MaintenanceSolution) { + Write-Message -Level VeryVerbose -Message "folder $($f.FullName)" + $Files += Get-ChildItem -Path $f.FullName -File -Recurse:$DirectoryRecurse + } elseif ($f.PsIsContainer -eq $true -and $true -eq $MaintenanceSolution) { + if ($IgnoreLogBackup -and $f -notlike '*LOG' ) { + Write-Message -Level Verbose -Message "Skipping Log backups for Maintenance backups" + } else { + $Files += Get-ChildItem -Path $f.FullName -File -Recurse:$DirectoryRecurse + } + } elseif ($true -eq $MaintenanceSolution) { + $Files += Get-ChildItem -Path $f.FullName -Recurse:$DirectoryRecurse + } else { + Write-Message -Level VeryVerbose -Message "File" + $Files += $f.FullName + } + } else { + if ($true -eq $MaintenanceSolution) { + $Files += Get-XpDirTreeRestoreFile -Path $f\FULL -SqlInstance $server -NoRecurse + $Files += Get-XpDirTreeRestoreFile -Path $f\DIFF -SqlInstance $server -NoRecurse + $Files += Get-XpDirTreeRestoreFile -Path $f\LOG -SqlInstance $server -NoRecurse + } else { + Write-Message -Level VeryVerbose -Message "File" + $Files += $f + } + } + } + } + + if ($True -eq $MaintenanceSolution -and $True -eq $IgnoreLogBackup) { + Write-Message -Level Verbose -Message "Skipping Log Backups as requested" + $Files = $Files | Where-Object {$_.FullName -notlike '*\LOG\*'} + } + + if ($Files.Count -gt 0) { + Write-Message -Level Verbose -Message "Reading backup headers of $($Files.Count) files" + $FileDetails = Read-DbaBackupHeader -SqlInstance $server -Path $Files -AzureCredential $AzureCredential + } + + $groupDetails = $FileDetails | Group-Object -Property BackupSetGUID + + foreach ($group in $groupDetails) { + $dbLsn = $group.Group[0].DatabaseBackupLSN + if (-not $dbLsn) { + $dbLsn = 0 + } + $description = $group.Group[0].BackupTypeDescription + if (-not $description) { + $header = Read-DbaBackupHeader -SqlInstance $server -Path $Path | Select-Object -First 1 + $description = switch ($header.BackupType) { + 1 { "Full" } + 2 { "Differential" } + 3 { "Log"} + } + } + $historyObject = New-Object Sqlcollaborative.Dbatools.Database.BackupHistory + $historyObject.ComputerName = $group.Group[0].MachineName + $historyObject.InstanceName = $group.Group[0].ServiceName + $historyObject.SqlInstance = $group.Group[0].ServerName + $historyObject.Database = $group.Group[0].DatabaseName + $historyObject.UserName = $group.Group[0].UserName + $historyObject.Start = [DateTime]$group.Group[0].BackupStartDate + $historyObject.End = [DateTime]$group.Group[0].BackupFinishDate + $historyObject.Duration = ([DateTime]$group.Group[0].BackupFinishDate - [DateTime]$group.Group[0].BackupStartDate) + $historyObject.Path = [string[]]$group.Group.BackupPath + $historyObject.FileList = ($group.Group.FileList | Select-Object Type, LogicalName, PhysicalName -Unique) + $historyObject.TotalSize = ($group.Group.BackupSize.Byte | Measure-Object -Sum).Sum + $HistoryObject.CompressedBackupSize = ($group.Group.CompressedBackupSize.Byte | Measure-Object -Sum).Sum + $historyObject.Type = $description + $historyObject.BackupSetId = $group.group[0].BackupSetGUID + $historyObject.DeviceType = 'Disk' + $historyObject.FullName = $group.Group.BackupPath + $historyObject.Position = $group.Group[0].Position + $historyObject.FirstLsn = $group.Group[0].FirstLSN + $historyObject.DatabaseBackupLsn = $dbLsn + $historyObject.CheckpointLSN = $group.Group[0].CheckpointLSN + $historyObject.LastLsn = $group.Group[0].LastLsn + $historyObject.SoftwareVersionMajor = $group.Group[0].SoftwareVersionMajor + $historyObject.RecoveryModel = $group.Group.RecoveryModel + $groupResults += $historyObject + } + } + if (Test-Bound 'SourceInstance') { + $groupResults = $groupResults | Where-Object {$_.InstanceName -in $SourceInstance} + } + + if (Test-Bound 'DatabaseName') { + $groupResults = $groupResults | Where-Object {$_.Database -in $DatabaseName} + } + if ($true -eq $Anonymise) { + foreach ($group in $groupResults) { + $group.ComputerName = Get-HashString -InString $group.ComputerName + $group.InstanceName = Get-HashString -InString $group.InstanceName + $group.SqlInstance = Get-HashString -InString $group.SqlInstance + $group.Database = Get-HashString -InString $group.Database + $group.UserName = Get-HashString -InString $group.UserName + $group.Path = Get-HashString -InString $group.Path + $group.FullName = Get-HashString -InString $group.FullName + $group.FileList = ($group.FileList | Select-Object Type, + @{Name = "LogicalName"; Expression = {Get-HashString -InString $_."LogicalName"}}, + @{Name = "PhysicalName"; Expression = {Get-HashString -InString $_."PhysicalName"}}) + } + } + if ((Test-Bound -parameterName ExportPath) -and $null -ne $ExportPath) { + $groupResults | Export-CliXml -Path $ExportPath -Depth 5 -NoClobber:$NoClobber + if ($true -ne $PassThru) { + return + } + } + $groupResults | Sort-Object -Property End -Descending + } +} +#ValidationTags#CodeStyle,Messaging,FlowControl,Pipeline# +function Get-DbaBuildReference { + <# + .SYNOPSIS + Returns SQL Server Build infos on a SQL instance + + .DESCRIPTION + Returns info about the specific build of a SQL instance, including the SP, the CU and the reference KB, wherever possible. + It also includes End Of Support dates as specified on Microsoft Life Cycle Policy + + .PARAMETER Build + Instead of connecting to a real instance, pass a string identifying the build to get the info back. + + .PARAMETER Kb + Get a KB information based on its number. Supported format: KBXXXXXX, or simply XXXXXX. + + .PARAMETER MajorVersion + Get a KB information based on SQL Server version. Can be refined further by -ServicePack and -CumulativeUpdate parameters. + Examples: SQL2008 | 2008R2 | 2016 + + .PARAMETER ServicePack + Get a KB information based on SQL Server Service Pack version. Can be refined further by -CumulativeUpdate parameter. + Examples: SP0 | 2 | RTM + + .PARAMETER CumulativeUpdate + Get a KB information based on SQL Server Cumulative Update version. + Examples: CU0 | CU13 | CU0 + + .PARAMETER SqlInstance + Target any number of instances, in order to return their build state. + + .PARAMETER SqlCredential + When connecting to an instance, use the credentials specified. + + .PARAMETER Update + Looks online for the most up to date reference, replacing the local one. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: SqlBuild + Author: Simone Bizzotto (@niphold) | Friedrich Weinmann (@FredWeinmann) + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaBuildReference + + .EXAMPLE + PS C:\> Get-DbaBuildReference -Build "12.00.4502" + + Returns information about a build identified by "12.00.4502" (which is SQL 2014 with SP1 and CU11) + + .EXAMPLE + PS C:\> Get-DbaBuildReference -Build "12.00.4502" -Update + + Returns information about a build trying to fetch the most up to date index online. When the online version is newer, the local one gets overwritten + + .EXAMPLE + PS C:\> Get-DbaBuildReference -Build "12.0.4502","10.50.4260" + + Returns information builds identified by these versions strings + + .EXAMPLE + PS C:\> Get-DbaCmsRegServer -SqlInstance sqlserver2014a | Get-DbaBuildReference + + Integrate with other cmdlets to have builds checked for all your registered servers on sqlserver2014a + + #> + [Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSUseShouldProcessForStateChangingFunctions", "")] + [CmdletBinding(DefaultParameterSetName = 'Build')] + param ( + [version[]] + $Build, + + [string[]] + $Kb, + + [ValidateNotNullOrEmpty()] + [string] + $MajorVersion, + + [ValidateNotNullOrEmpty()] + [string] + [Alias('SP')] + $ServicePack = 'RTM', + + [string] + [Alias('CU')] + $CumulativeUpdate, + + [Parameter(ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]] + $SqlInstance, + + [Alias("Credential")] + [PsCredential] + $SqlCredential, + + [switch] + $Update, + + [switch] + [Alias('Silent')] + $EnableException + ) + + begin { + + #region Helper functions + function Get-DbaBuildReferenceIndex { + [CmdletBinding()] + param ( + [string] + $Moduledirectory, + + [bool] + $Update, + + [bool] + $EnableException + ) + + $orig_idxfile = "$Moduledirectory\bin\dbatools-buildref-index.json" + $DbatoolsData = Get-DbatoolsConfigValue -Name 'Path.DbatoolsData' + $writable_idxfile = Join-Path $DbatoolsData "dbatools-buildref-index.json" + + if (-not (Test-Path $orig_idxfile)) { + Write-Message -Level Warning -Message "Unable to read local SQL build reference file. Check your module integrity!" + } + + if ((-not (Test-Path $orig_idxfile)) -and (-not (Test-Path $writable_idxfile))) { + throw "Build reference file not found, check module health!" + } + + # If no writable copy exists, create one and return the module original + if (-not (Test-Path $writable_idxfile)) { + Copy-Item -Path $orig_idxfile -Destination $writable_idxfile -Force -ErrorAction Stop + $result = Get-Content $orig_idxfile -Raw | ConvertFrom-Json + } + + # Else, if both exist, update the writeable if necessary and return the current version + elseif (Test-Path $orig_idxfile) { + $module_content = Get-Content $orig_idxfile -Raw | ConvertFrom-Json + $data_content = Get-Content $writable_idxfile -Raw | ConvertFrom-Json + + $module_time = Get-Date $module_content.LastUpdated + $data_time = Get-Date $data_content.LastUpdated + + $offline_time = $module_time + if ($module_time -gt $data_time) { + Copy-Item -Path $orig_idxfile -Destination $writable_idxfile -Force -ErrorAction Stop + $result = $module_content + } else { + $result = $data_content + $offline_time = $data_time + } + # If Update is passed, try to fetch from online resource and store into the writeable + if ($Update) { + $WebContent = Get-DbaBuildReferenceIndexOnline -EnableException $EnableException + if ($null -ne $WebContent) { + $webdata_content = $WebContent.Content | ConvertFrom-Json + $webdata_time = Get-Date $webdata_content.LastUpdated + if ($webdata_time -gt $offline_time) { + Write-Message -Level Output -Message "Index updated correctly, last update on: $(Get-Date -Date $webdata_time -Format s), was $(Get-Date -Date $offline_time -Format s)" + $WebContent.Content | Out-File $writable_idxfile -Encoding utf8 -ErrorAction Stop + $result = Get-Content $writable_idxfile -Raw | ConvertFrom-Json + } + } + } + } + + # Else if the module version of the file no longer exists, but the writable version exists, return the writable version + else { + $result = Get-Content $writable_idxfile -Raw | ConvertFrom-Json + } + + $LastUpdated = Get-Date -Date $result.LastUpdated + if ($LastUpdated -lt (Get-Date).AddDays(-45)) { + Write-Message -Level Warning -Message "Index is stale, last update on: $(Get-Date -Date $LastUpdated -Format s), try the -Update parameter to fetch the most up to date index" + } + + $result.Data | Select-Object @{ Name = "VersionObject"; Expression = { [version]$_.Version } }, * + } + + function Get-DbaBuildReferenceIndexOnline { + [CmdletBinding()] + param ( + [bool] + $EnableException + ) + $url = Get-DbatoolsConfigValue -Name 'assets.sqlbuildreference' + try { + $WebContent = Invoke-TlsWebRequest $url -ErrorAction Stop + } catch { + try { + Write-Message -Level Verbose -Message "Probably using a proxy for internet access, trying default proxy settings" + (New-Object System.Net.WebClient).Proxy.Credentials = [System.Net.CredentialCache]::DefaultNetworkCredentials + $WebContent = Invoke-TlsWebRequest $url -ErrorAction Stop + } catch { + Write-Message -Level Warning -Message "Couldn't download updated index from $url" + return + } + } + return $WebContent + } + + function Resolve-DbaBuild { + [Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSUseShouldProcessForStateChangingFunctions", "")] + [CmdletBinding()] + [OutputType([System.Collections.Hashtable])] + param ( + [Parameter(Mandatory, ParameterSetName = 'Build')] + [version] + $Build, + + [Parameter(Mandatory, ParameterSetName = 'KB')] + [string] + $Kb, + + [Parameter(Mandatory, ParameterSetName = 'HFLevel')] + [string] + $MajorVersion, + + [Parameter(ParameterSetName = 'HFLevel')] + [string] + [Alias('SP')] + $ServicePack = 'RTM', + + [Parameter(ParameterSetName = 'HFLevel')] + [string] + [Alias('CU')] + $CumulativeUpdate, + + $Data, + + [bool] + $EnableException + ) + + if ($Build) { + Write-Message -Level Verbose -Message "Looking for $Build" + + $IdxVersion = $Data | Where-Object Version -like "$($Build.Major).$($Build.Minor).*" + } elseif ($Kb) { + Write-Message -Level Verbose -Message "Looking for KB $Kb" + if ($Kb -match '^(KB)?(\d+)$') { + $currentKb = $Matches[2] + $kbVersion = $Data | Where-Object KBList -contains $currentKb + $IdxVersion = $Data | Where-Object Version -like "$($kbVersion.VersionObject.Major).$($kbVersion.VersionObject.Minor).*" + } else { + Stop-Function -Message "Wrong KB name $kb" + return + } + } elseif ($MajorVersion) { + Write-Message -Level Verbose -Message "Looking for SQL $MajorVersion SP $ServicePack CU $CumulativeUpdate" + $kbVersion = $Data | Where-Object Name -eq $MajorVersion + $IdxVersion = $Data | Where-Object Version -like "$($kbVersion.VersionObject.Major).$($kbVersion.VersionObject.Minor).*" + } + + $Detected = @{ } + $Detected.MatchType = 'Approximate' + $idxCount = $IdxVersion | Measure-Object | Select-Object -ExpandProperty Count + Write-Message -Level Verbose -Message "We have $idxCount builds in store for this Release" + If ($idxCount -eq 0) { + Write-Message -Level Warning -Message "No info in store for this Release" + $Detected.Warning = "No info in store for this Release" + } else { + $LastVer = $IdxVersion[0] + } + foreach ($el in $IdxVersion) { + if ($null -ne $el.Name) { + $Detected.Name = $el.Name + } + if ($Build -and $el.VersionObject -gt $Build) { + $Detected.MatchType = 'Approximate' + $Detected.Warning = "$Build not found, closest build we have is $($LastVer.Version)" + break + } + $LastVer = $el + $Detected.BuildLevel = $el.VersionObject + if ($null -ne $el.SP) { + $Detected.SP = $el.SP + $Detected.CU = $null + } + if ($null -ne $el.CU) { + $Detected.CU = $el.CU + } + if ($null -ne $el.SupportedUntil) { + $Detected.SupportedUntil = (Get-Date -date $el.SupportedUntil) + } + $Detected.Build = $el.Version + $Detected.KB = $el.KBList + if (($Build -and $el.Version -eq $Build) -or ($Kb -and $el.KBList -eq $currentKb)) { + $Detected.MatchType = 'Exact' + break + } elseif ($MajorVersion -and $Detected.SP -contains $ServicePack -and (!$CumulativeUpdate -or ($el.CU -and $el.CU -eq $CumulativeUpdate))) { + $Detected.MatchType = 'Exact' + break + } + } + return $Detected + } + #endregion Helper functions + + $moduledirectory = $MyInvocation.MyCommand.Module.ModuleBase + + try { + $IdxRef = Get-DbaBuildReferenceIndex -Moduledirectory $moduledirectory -Update $Update -EnableException $EnableException + } catch { + Stop-Function -Message "Error loading SQL build reference" -ErrorRecord $_ + return + } + } + process { + if (Test-FunctionInterrupt) { return } + + #region verifying parameters + $ComplianceSpec = @() + $ComplianceSpecExclusiveParams = @('Build', 'Kb', @( 'MajorVersion', 'ServicePack', 'CumulativeUpdate'), 'SqlInstance') + foreach ($exclParamGroup in $ComplianceSpecExclusiveParams) { + foreach ($exclParam in $exclParamGroup) { + if (Test-Bound -Parameter $exclParam) { + $ComplianceSpec += $exclParam + break + } + } + } + if ($ComplianceSpec.Length -gt 1) { + Stop-Function -Category InvalidArgument -Message "$($ComplianceSpec -join ', ') are mutually exclusive. Please choose one or the other. Quitting." + return + } + if ($ComplianceSpec.Length -eq 0) { + Stop-Function -Category InvalidArgument -Message "You need to choose at least one parameter." + return + } + if (((Test-Bound -Parameter ServicePack) -or (Test-Bound -Parameter CumulativeUpdate)) -and (Test-Bound -Not -Parameter MajorVersion)) { + Stop-Function -Category InvalidArgument -Message "-MajorVersion is required when specifying SP or CU." + return + } + if ($MajorVersion) { + if ($MajorVersion -match '^(SQL)?(\d{4}(R2)?)$') { + $MajorVersion = $Matches[2] + } else { + Stop-Function -Message "Incorrect SQL Server version format: use SQL2XXX or just 2XXXX - SQL2012, SQL2008R2" + return + } + if (!$ServicePack) { + $ServicePack = 'RTM' + } + if ($ServicePack -match '^(SP)?\s*(\d+)$') { + if ($Matches[2] -eq '0') { + $ServicePack = 'RTM' + } else { + $ServicePack = 'SP' + $Matches[2] + } + } elseif ($ServicePack -notmatch '^RTM$') { + Stop-Function -Message "Incorrect SQL Server service pack format: use SPX, X or RTM, where X is a service pack number" + return + } + if ($CumulativeUpdate) { + if ($CumulativeUpdate -match '^(CU)?\s*(\d+)$') { + if ($Matches[2] -eq '0') { + $CumulativeUpdate = '' + } else { + $CumulativeUpdate = 'CU' + $Matches[2] + } + } else { + Stop-Function -Message "Incorrect SQL Server cumulative update format: use CUX or X, where X is a cumulative update number" + return + } + } + } + #endregion verifying parameters + + + foreach ($instance in $SqlInstance) { + #region Ensure the connection is established + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential + } catch { + Stop-Function -Message "Failed to process Instance $Instance" -ErrorRecord $_ -Target $instance -Continue + } + + try { + $null = $server.Version.ToString() + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + #endregion Ensure the connection is established + + $Detected = Resolve-DbaBuild -Build $server.Version -Data $IdxRef -EnableException $EnableException + + [PSCustomObject]@{ + SqlInstance = $server.DomainInstanceName + Build = $server.Version + NameLevel = $Detected.Name + SPLevel = $Detected.SP + CULevel = $Detected.CU + KBLevel = $Detected.KB + BuildLevel = $Detected.BuildLevel + SupportedUntil = $Detected.SupportedUntil + MatchType = $Detected.MatchType + Warning = $Detected.Warning + } + } + + foreach ($buildstr in $Build) { + $Detected = Resolve-DbaBuild -Build $buildstr -Data $IdxRef -EnableException $EnableException + + [PSCustomObject]@{ + SqlInstance = $null + Build = $buildstr + NameLevel = $Detected.Name + SPLevel = $Detected.SP + CULevel = $Detected.CU + KBLevel = $Detected.KB + BuildLevel = $Detected.BuildLevel + SupportedUntil = $Detected.SupportedUntil + MatchType = $Detected.MatchType + Warning = $Detected.Warning + } | Select-DefaultView -ExcludeProperty SqlInstance + } + + foreach ($kbItem in $Kb) { + $Detected = Resolve-DbaBuild -Kb $kbItem -Data $IdxRef -EnableException $EnableException + + [PSCustomObject]@{ + SqlInstance = $null + Build = $Detected.Build + NameLevel = $Detected.Name + SPLevel = $Detected.SP + CULevel = $Detected.CU + KBLevel = $Detected.KB + BuildLevel = $Detected.BuildLevel + SupportedUntil = $Detected.SupportedUntil + MatchType = $Detected.MatchType + Warning = $Detected.Warning + } | Select-DefaultView -ExcludeProperty SqlInstance + } + + if ($MajorVersion) { + $Detected = Resolve-DbaBuild -MajorVersion $MajorVersion -ServicePack $ServicePack -CumulativeUpdate $CumulativeUpdate -Data $IdxRef -EnableException $EnableException + + [PSCustomObject]@{ + SqlInstance = $null + Build = $Detected.Build + NameLevel = $Detected.Name + SPLevel = $Detected.SP + CULevel = $Detected.CU + KBLevel = $Detected.KB + BuildLevel = $Detected.BuildLevel + SupportedUntil = $Detected.SupportedUntil + MatchType = $Detected.MatchType + Warning = $Detected.Warning + } | Select-DefaultView -ExcludeProperty SqlInstance + } + } + end { + Test-DbaDeprecation -DeprecatedOn "1.0.0" -EnableException:$false -Alias Get-DbaSqlBuildReference + } +} +function Get-DbaClientAlias { + <# + .SYNOPSIS + Gets any SQL Server alias for the specified server(s) + + .DESCRIPTION + Gets SQL Server alias by reading HKLM:\SOFTWARE\Microsoft\MSSQLServer\Client + + .PARAMETER ComputerName + The target computer where the alias has been created + + .PARAMETER Credential + Allows you to login to remote computers using alternative credentials + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Alias + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaClientAlias + + .EXAMPLE + PS C:\> Get-DbaClientAlias + + Gets all SQL Server client aliases on the local computer + + .EXAMPLE + PS C:\> Get-DbaClientAlias -ComputerName workstationx + + Gets all SQL Server client aliases on Workstationx + + .EXAMPLE + PS C:\> Get-DbaClientAlias -ComputerName workstationx -Credential ad\sqldba + + Logs into workstationx as ad\sqldba then retrieves all SQL Server client aliases on Workstationx + + .EXAMPLE + PS C:\> 'Server1', 'Server2' | Get-DbaClientAlias + + Gets all SQL Server client aliases on Server1 and Server2 + + #> + [CmdletBinding()] + param ( + [Parameter(ValueFromPipeline)] + [DbaInstanceParameter[]]$ComputerName = $env:COMPUTERNAME, + [PSCredential]$Credential, + [Alias('Silent')] + [switch]$EnableException + ) + + process { + foreach ($computer in $ComputerName) { + $scriptblock = { + + function Get-ItemPropertyValue { + param ( + [parameter()] + [String]$Path, + [parameter()] + [String]$Name + ) + (Get-ItemProperty -LiteralPath $Path -Name $Name).$Name + } + + $basekeys = "HKLM:\SOFTWARE\WOW6432Node\Microsoft\MSSQLServer", "HKLM:\SOFTWARE\Microsoft\MSSQLServer" + + foreach ($basekey in $basekeys) { + + if ((Test-Path $basekey) -eq $false) { + <# DO NOT use Write-Message as this is inside of a script block #> + Write-Warning "Base key ($basekey) does not exist. Quitting." + continue + } + + $client = "$basekey\Client" + + if ((Test-Path $client) -eq $false) { + continue + } + + $connect = "$client\ConnectTo" + + if ((Test-Path $connect) -eq $false) { + continue + } + + if ($basekey -like "*WOW64*") { + $architecture = "32-bit" + } else { + $architecture = "64-bit" + } + + # "Get SQL Server alias for $ComputerName for $architecture" + $all = Get-Item -Path $connect + foreach ($entry in $all.Property) { + $value = Get-ItemPropertyValue -Path $connect -Name $entry + $clean = $value.Replace('DBNMPNTW,', '').Replace('DBMSSOCN,', '') + if ($value.StartsWith('DBMSSOCN')) { $protocol = 'TCP/IP' } else { $protocol = 'Named Pipes' } + + [pscustomobject]@{ + ComputerName = $env:COMPUTERNAME + NetworkLibrary = $protocol + ServerName = $clean + AliasName = $entry + AliasString = $value + Architecture = $architecture + } + } + } + } + + try { + Invoke-Command2 -ComputerName $computer -Credential $Credential -ScriptBlock $scriptblock -ErrorAction Stop | + Select-DefaultView -Property ComputerName, Architecture, NetworkLibrary, ServerName, AliasName + } catch { + Stop-Function -Message "Failure" -ErrorRecord $_ -Target $computer -Continue + } + } + } +} +function Get-DbaClientProtocol { + <# + .SYNOPSIS + Gets the SQL Server related client protocols on a computer. + + .DESCRIPTION + Gets the SQL Server related client protocols on one or more computers. + + Requires Local Admin rights on destination computer(s). + The client protocols can be enabled and disabled when retrieved via WSMan. + + .PARAMETER ComputerName + The target SQL Server instance or instances. + + .PARAMETER Credential + Credential object used to connect to the computer as a different user. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Protocol + Author: Klaas Vandenberghe (@PowerDBAKlaas) + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaClientProtocol + + .EXAMPLE + PS C:\> Get-DbaClientProtocol -ComputerName sqlserver2014a + + Gets the SQL Server related client protocols on computer sqlserver2014a. + + .EXAMPLE + PS C:\> 'sql1','sql2','sql3' | Get-DbaClientProtocol + + Gets the SQL Server related client protocols on computers sql1, sql2 and sql3. + + .EXAMPLE + PS C:\> Get-DbaClientProtocol -ComputerName sql1,sql2 | Out-GridView + + Gets the SQL Server related client protocols on computers sql1 and sql2, and shows them in a grid view. + + .EXAMPLE + PS C:\> (Get-DbaClientProtocol -ComputerName sql2 | Where { $_.DisplayName = 'via' }).Disable() + + Disables the VIA ClientNetworkProtocol on computer sql2. + If successful, return code 0 is shown. + + #> + [CmdletBinding()] + param ( + [parameter(ValueFromPipeline)] + [Alias("cn", "host", "Server")] + [DbaInstanceParameter[]]$ComputerName = $env:COMPUTERNAME, + [PSCredential] $Credential, + [Alias('Silent')] + [switch]$EnableException + ) + + process { + foreach ( $computer in $ComputerName.ComputerName ) { + $server = Resolve-DbaNetworkName -ComputerName $computer -Credential $credential + if ( $server.FullComputerName ) { + $computer = $server.FullComputerName + Write-Message -Level Verbose -Message "Getting SQL Server namespace on $computer" + $namespace = Get-DbaCmObject -ComputerName $computer -Namespace root\Microsoft\SQLServer -Query "Select * FROM __NAMESPACE WHERE Name LIke 'ComputerManagement%'" -ErrorAction SilentlyContinue | + Where-Object {(Get-DbaCmObject -ComputerName $computer -Namespace $("root\Microsoft\SQLServer\" + $_.Name) -ClassName ClientNetworkProtocol -ErrorAction SilentlyContinue).count -gt 0} | + Sort-Object Name -Descending | Select-Object -First 1 + + if ( $namespace.Name ) { + Write-Message -Level Verbose -Message "Getting Cim class ClientNetworkProtocol in Namespace $($namespace.Name) on $computer" + try { + $prot = Get-DbaCmObject -ComputerName $computer -Namespace $("root\Microsoft\SQLServer\" + $namespace.Name) -ClassName ClientNetworkProtocol -ErrorAction SilentlyContinue + + $prot | Add-Member -Force -MemberType ScriptProperty -Name IsEnabled -Value { switch ( $this.ProtocolOrder ) { 0 { $false } default { $true } } } + $prot | Add-Member -Force -MemberType ScriptMethod -Name Enable -Value {Invoke-CimMethod -MethodName SetEnable -InputObject $this } + $prot | Add-Member -Force -MemberType ScriptMethod -Name Disable -Value {Invoke-CimMethod -MethodName SetDisable -InputObject $this } + + foreach ( $protocol in $prot ) { + Select-DefaultView -InputObject $protocol -Property 'PSComputerName as ComputerName', 'ProtocolDisplayName as DisplayName', 'ProtocolDll as DLL', 'ProtocolOrder as Order', 'IsEnabled' + } + } catch { + Write-Message -Level Warning -Message "No Sql ClientNetworkProtocol found on $computer" + } + } #if namespace + else { + Write-Message -Level Warning -Message "No ComputerManagement Namespace on $computer. Please note that this function is available from SQL 2005 up." + } #else no namespace + } #if computername + else { + Write-Message -Level Warning -Message "Failed to connect to $computer" + } + } #foreach computer + } +} +function Get-DbaCmConnection { + <# + .SYNOPSIS + Retrieves windows management connections from the cache + + .DESCRIPTION + Retrieves windows management connections from the cache + + .PARAMETER ComputerName + The computername to ComputerName for. + + .PARAMETER UserName + Username on credentials to look for. Will not find connections using the default windows credentials. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: ComputerManagement, CIM + Author: Friedrich Weinmann (@FredWeinmann) + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaCmConnection + + .EXAMPLE + PS C:\> Get-DbaCmConnection + + List all cached connections. + + .EXAMPLE + PS C:\> Get-DbaCmConnection sql2014 + + List the cached connection - if any - to the server sql2014. + + .EXAMPLE + PS C:\> Get-DbaCmConnection -UserName "*charles*" + + List all cached connection that use a username containing "charles" as default or override credentials. + + #> + [CmdletBinding()] + param + ( + [Parameter(Position = 0, ValueFromPipeline)] + [Alias('Filter')] + [String[]] + $ComputerName = "*", + + [String] + $UserName = "*", + + [switch] + [Alias('Silent')]$EnableException + ) + + begin { + Write-Message -Level InternalComment -Message "Starting" + Write-Message -Level Verbose -Message "Bound parameters: $($PSBoundParameters.Keys -join ", ")" + } + process { + foreach ($name in $ComputerName) { + Write-Message -Level VeryVerbose -Message "Processing search. ComputerName: '$name' | Username: '$UserName'" + ([Sqlcollaborative.Dbatools.Connection.ConnectionHost]::Connections.Values | Where-Object { ($_.ComputerName -like $name) -and ($_.Credentials.UserName -like $UserName) }) + } + } + end { + Write-Message -Level InternalComment -Message "Ending" + } +} +function Get-DbaCmObject { + <# + .SYNOPSIS + Retrieves Wmi/Cim-Style information from computers. + + .DESCRIPTION + This function centralizes all requests for information retrieved from Get-WmiObject or Get-CimInstance. + It uses different protocols as available in this order: + - Cim over WinRM + - Cim over DCOM + - Wmi + - Wmi over PowerShell Remoting + It remembers channels that didn't work and will henceforth avoid them. It remembers invalid credentials and will avoid reusing them. + Much of its behavior can be configured using Test-DbaCmConnection. + + .PARAMETER ClassName + The name of the class to retrieve. + + .PARAMETER Query + The Wmi/Cim query tu run against the server. + + .PARAMETER ComputerName + The computer(s) to connect to. Defaults to localhost. + + .PARAMETER Credential + Credentials to use. Invalid credentials will be stored in a credentials cache and not be reused. + + .PARAMETER Namespace + The namespace of the class to use. + + .PARAMETER DoNotUse + Connection Protocols that should not be used. + + .PARAMETER Force + Overrides some checks that might otherwise halt execution as a precaution + - Ignores timeout on bad connections + + .PARAMETER SilentlyContinue + Use in conjunction with the -EnableException switch. + By default, Get-DbaCmObject will throw a terminating exception when connecting to a target is impossible in exception enabled mode. + Setting this switch will cause it write a non-terminating exception and continue with the next computer. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: ComputerManagement, CIM + Author: Friedrich Weinmann (@FredWeinmann) + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaCmObject + + .EXAMPLE + PS C:\> Get-DbaCmObject win32_OperatingSystem + + Retrieves the common operating system information from the local computer. + + .EXAMPLE + PS C:\> Get-DbaCmObject -Computername "sql2014" -ClassName Win32_OperatingSystem -Credential $cred -DoNotUse CimRM + + Retrieves the common operating system information from the server sql2014. + It will use the Credentials stored in $cred to connect, unless they are known to not work, in which case they will default to windows credentials (unless another default has been set). + + #> + [CmdletBinding(DefaultParameterSetName = "Class")] + [Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSAvoidUsingWMICmdlet", "", Justification = "Using Get-WmiObject is used as a fallback for gathering information")] + param ( + [Parameter(Mandatory, Position = 0, ParameterSetName = "Class")] + [Alias('Class')] + [string] + $ClassName, + + [Parameter(Mandatory, Position = 0, ParameterSetName = "Query")] + [string] + $Query, + + [Parameter(ValueFromPipeline)] + [Sqlcollaborative.Dbatools.Parameter.DbaCmConnectionParameter[]] + $ComputerName = $env:COMPUTERNAME, + + [System.Management.Automation.PSCredential] + $Credential, + + [string] + $Namespace = "root\cimv2", + + [Sqlcollaborative.Dbatools.Connection.ManagementConnectionType[]] + $DoNotUse = "None", + + [switch] + $Force, + + [switch] + $SilentlyContinue, + + [switch] + [Alias('Silent')]$EnableException + ) + + begin { + #region Configuration Values + $disable_cache = [Sqlcollaborative.Dbatools.Connection.ConnectionHost]::DisableCache + + Write-Message -Level Verbose -Message "Configuration loaded | Cache disabled: $disable_cache" + #endregion Configuration Values + + $ParSet = $PSCmdlet.ParameterSetName + } + process { + # uses cim commands + :main foreach ($connectionObject in $ComputerName) { + if (-not $connectionObject.Success) { Stop-Function -Message "Failed to interpret input: $($connectionObject.Input)" -Category InvalidArgument -Target $connectionObject.Input -Continue -SilentlyContinue:$SilentlyContinue } + + # Since all connection caching runs using lower-case strings, making it lowercase here simplifies things. + $computer = $connectionObject.Connection.ComputerName.ToLower() + + Write-Message -Message "[$computer] Retrieving Management Information" -Level VeryVerbose -Target $computer + + $connection = $connectionObject.Connection + + # Ensure using the right credentials + try { $cred = $connection.GetCredential($Credential) } + catch { + $message = "Bad credentials! " + if ($Credential) { $message += "The credentials for $($Credential.UserName) are known to not work. " } + else { $message += "The windows credentials are known to not work. " } + if ($connection.EnableCredentialFailover -or $connection.OverrideExplicitCredential) { $message += "The connection is configured to use credentials that are known to be good, but none have been registered yet. " } + elseif ($connection.Credentials) { $message += "Working credentials are known for $($connection.Credentials.UserName), however the connection is not configured to automatically use them. This can be done using 'Set-DbaCmConnection -ComputerName $connection -OverrideExplicitCredential' " } + elseif ($connection.UseWindowsCredentials) { $message += "The windows credentials are known to work, however the connection is not configured to automatically use them. This can be done using 'Set-DbaCmConnection -ComputerName $connection -OverrideExplicitCredential' " } + $message += $_.Exception.Message + Stop-Function -Message $message -ErrorRecord $_ -Target $connection -Continue -OverrideExceptionMessage + } + + # Flags-Enumerations cannot be added in PowerShell 4 or older. + # Thus we create a string and convert it afterwards. + $enabledProtocols = "None" + if ($connection.CimRM -notlike "Disabled") { $enabledProtocols += ", CimRM" } + if ($connection.CimDCOM -notlike "Disabled") { $enabledProtocols += ", CimDCOM" } + if ($connection.Wmi -notlike "Disabled") { $enabledProtocols += ", Wmi" } + if ($connection.PowerShellRemoting -notlike "Disabled") { $enabledProtocols += ", PowerShellRemoting" } + [Sqlcollaborative.Dbatools.Connection.ManagementConnectionType]$enabledProtocols = $enabledProtocols + + # Create list of excluded connection types (Duplicates don't matter) + $excluded = @() + foreach ($item in $DoNotUse) { $excluded += $item } + + :sub while ($true) { + try { $conType = $connection.GetConnectionType(($excluded -join ","), $Force) } + catch { + if (-not $disable_cache) { [Sqlcollaborative.Dbatools.Connection.ConnectionHost]::Connections[$computer] = $connection } + Stop-Function -Message "[$computer] Unable to find a connection to the target system. Ensure the name is typed correctly, and the server allows any of the following protocols: $enabledProtocols" -Target $computer -Category OpenError -Continue -ContinueLabel "main" -SilentlyContinue:$SilentlyContinue -ErrorRecord $_ + } + + switch ($conType.ToString()) { + #region CimRM + "CimRM" { + Write-Message -Level Verbose -Message "[$computer] Accessing computer using Cim over WinRM" + try { + if ($ParSet -eq "Class") { $connection.GetCimRMInstance($cred, $ClassName, $Namespace) } + else { $connection.QueryCimRMInstance($cred, $Query, "WQL", $Namespace) } + + Write-Message -Level Verbose -Message "[$computer] Accessing computer using Cim over WinRM - Success" + $connection.ReportSuccess('CimRM') + $connection.AddGoodCredential($cred) + if (-not $disable_cache) { [Sqlcollaborative.Dbatools.Connection.ConnectionHost]::Connections[$computer] = $connection } + continue main + } catch { + Write-Message -Level Verbose -Message "[$computer] Accessing computer using Cim over WinRM - Failed" + + # 1 = Generic runtime error + if ($_.Exception.InnerException.StatusCode -eq 1) { + # 0x8007052e, 0x80070005 : Authentication error, bad credential + if (($_.Exception.InnerException -eq 0x8007052e) -or ($_.Exception.InnerException -eq 0x80070005)) { + # Ignore the global setting for bad credential cache disabling, since the connection object is aware of that state and will ignore input if it should. + # This is due to the ability to locally override the global setting, thus it must be done on the object and can then be done in code + $connection.AddBadCredential($cred) + if (-not $disable_cache) { [Sqlcollaborative.Dbatools.Connection.ConnectionHost]::Connections[$computer] = $connection } + Stop-Function -Message "[$computer] Invalid connection credentials" -Target $computer -Continue -ContinueLabel "main" -ErrorRecord $_ -SilentlyContinue:$SilentlyContinue -OverrideExceptionMessage + } elseif ($_.Exception.InnerException.MessageId -eq "HRESULT 0x80041013") { + if ($ParSet -eq "Class") { Stop-Function -Message "[$computer] Failed to access $class in namespace $Namespace" -Target $computer -Continue -ContinueLabel "main" -ErrorRecord $_ -SilentlyContinue:$SilentlyContinue -Exception $_.Exception.InnerException } + else { Stop-Function -Message "[$computer] Failed to execute $query in namespace $Namespace" -Target $computer -Continue -ContinueLabel "main" -ErrorRecord $_ -SilentlyContinue:$SilentlyContinue -Exception $_.Exception.InnerException } + } else { + $connection.ReportFailure('CimRM') + $excluded += "CimRM" + continue sub + } + } + + # 2 = Access to specific resource denied + elseif ($_.Exception.InnerException.StatusCode -eq 2) { + Stop-Function -Message "[$computer] Access to computer granted, but access to $Namespace\$ClassName denied" -Target $computer -Continue -ContinueLabel "main" -ErrorRecord $_ -SilentlyContinue:$SilentlyContinue -OverrideExceptionMessage + } + + # 3 = Invalid Namespace + elseif ($_.Exception.InnerException.StatusCode -eq 3) { + Stop-Function -Message "[$computer] Invalid namespace: $Namespace" -Target $computer -Continue -ContinueLabel "main" -ErrorRecord $_ -SilentlyContinue:$SilentlyContinue -OverrideExceptionMessage + } + # 5 = Invalid Class + # See here for code reference: https://msdn.microsoft.com/en-us/library/cc150671(v=vs.85).aspx + elseif ($_.Exception.InnerException.StatusCode -eq 5) { + Stop-Function -Message "[$computer] Invalid class name ($ClassName), not found in current namespace ($Namespace)" -Target $computer -Continue -ContinueLabel "main" -ErrorRecord $_ -SilentlyContinue:$SilentlyContinue -OverrideExceptionMessage + } + + # 0 & ExtendedStatus = Weird issue beyond the scope of the CIM standard. Often a server-side issue + elseif (($_.Exception.InnerException.StatusCode -eq 0) -and ($_.Exception.InnerException.ErrorData.original_error -like "__ExtendedStatus")) { + Stop-Function -Message "[$computer] Something went wrong when looking for $ClassName, in $Namespace. This often indicates issues with the target system." -Target $computer -Continue -ContinueLabel "main" -ErrorRecord $_ -SilentlyContinue:$SilentlyContinue + } else { + $connection.ReportFailure('CimRM') + $excluded += "CimRM" + continue sub + } + } + } + #endregion CimRM + + #region CimDCOM + "CimDCOM" { + Write-Message -Level Verbose -Message "[$computer] Accessing computer using Cim over DCOM" + try { + if ($ParSet -eq "Class") { $connection.GetCimDCOMInstance($cred, $ClassName, $Namespace) } + else { $connection.QueryCimDCOMInstance($cred, $Query, "WQL", $Namespace) } + + Write-Message -Level Verbose -Message "[$computer] Accessing computer using Cim over DCOM - Success" + $connection.ReportSuccess('CimDCOM') + $connection.AddGoodCredential($cred) + if (-not $disable_cache) { [Sqlcollaborative.Dbatools.Connection.ConnectionHost]::Connections[$computer] = $connection } + continue main + } catch { + Write-Message -Level Verbose -Message "[$computer] Accessing computer using Cim over DCOM - Failed" + + # 1 = Generic runtime error + if ($_.Exception.InnerException.StatusCode -eq 1) { + # 0x8007052e, 0x80070005 : Authentication error, bad credential + if (($_.Exception.InnerException -eq 0x8007052e) -or ($_.Exception.InnerException -eq 0x80070005)) { + # Ignore the global setting for bad credential cache disabling, since the connection object is aware of that state and will ignore input if it should. + # This is due to the ability to locally override the global setting, thus it must be done on the object and can then be done in code + $connection.AddBadCredential($cred) + if (-not $disable_cache) { [Sqlcollaborative.Dbatools.Connection.ConnectionHost]::Connections[$computer] = $connection } + Stop-Function -Message "[$computer] Invalid connection credentials" -Target $computer -Continue -ContinueLabel "main" -ErrorRecord $_ -SilentlyContinue:$SilentlyContinue -OverrideExceptionMessage + } elseif ($_.Exception.InnerException.MessageId -eq "HRESULT 0x80041013") { + if ($ParSet -eq "Class") { Stop-Function -Message "[$computer] Failed to access $class in namespace $Namespace" -Target $computer -Continue -ContinueLabel "main" -ErrorRecord $_ -SilentlyContinue:$SilentlyContinue -Exception $_.Exception.InnerException } + else { Stop-Function -Message "[$computer] Failed to execute $query in namespace $Namespace" -Target $computer -Continue -ContinueLabel "main" -ErrorRecord $_ -SilentlyContinue:$SilentlyContinue -Exception $_.Exception.InnerException } + } else { + $connection.ReportFailure('CimDCOM') + $excluded += "CimDCOM" + continue sub + } + } + + # 2 = Access to specific resource denied + elseif ($_.Exception.InnerException.StatusCode -eq 2) { + Stop-Function -Message "[$computer] Access to computer granted, but access to $Namespace\$ClassName denied" -Target $computer -Continue -ContinueLabel "main" -ErrorRecord $_ -SilentlyContinue:$SilentlyContinue -OverrideExceptionMessage + } + + # 3 = Invalid Namespace + elseif ($_.Exception.InnerException.StatusCode -eq 3) { + Stop-Function -Message "[$computer] Invalid namespace: $Namespace" -Target $computer -Continue -ContinueLabel "main" -ErrorRecord $_ -SilentlyContinue:$SilentlyContinue -OverrideExceptionMessage + } + + # 5 = Invalid Class + # See here for code reference: https://msdn.microsoft.com/en-us/library/cc150671(v=vs.85).aspx + elseif ($_.Exception.InnerException.StatusCode -eq 5) { + Stop-Function -Message "[$computer] Invalid class name ($ClassName), not found in current namespace ($Namespace)" -Target $computer -Continue -ContinueLabel "main" -ErrorRecord $_ -SilentlyContinue:$SilentlyContinue -OverrideExceptionMessage + } + + # 0 & ExtendedStatus = Weird issue beyond the scope of the CIM standard. Often a server-side issue + elseif (($_.Exception.InnerException.StatusCode -eq 0) -and ($_.Exception.InnerException.ErrorData.original_error -like "__ExtendedStatus")) { + Stop-Function -Message "[$computer] Something went wrong when looking for $ClassName, in $Namespace. This often indicates issues with the target system." -Target $computer -Continue -ContinueLabel "main" -ErrorRecord $_ -SilentlyContinue:$SilentlyContinue + } + + else { + $connection.ReportFailure('CimDCOM') + $excluded += "CimDCOM" + continue sub + } + } + } + #endregion CimDCOM + + #region Wmi + "Wmi" { + Write-Message -Level Verbose -Message "[$computer] Accessing computer using WMI" + try { + switch ($ParSet) { + "Class" { + $parameters = @{ + ComputerName = $computer + ClassName = $ClassName + ErrorAction = 'Stop' + } + if ($cred) { $parameters["Credential"] = $cred } + if (Test-Bound "Namespace") { $parameters["Namespace"] = $Namespace } + + } + "Query" { + $parameters = @{ + ComputerName = $computer + Query = $Query + ErrorAction = 'Stop' + } + if ($cred) { $parameters["Credential"] = $cred } + if (Test-Bound "Namespace") { $parameters["Namespace"] = $Namespace } + } + } + + Get-WmiObject @parameters + + Write-Message -Level Verbose -Message "[$computer] Accessing computer using WMI - Success" + $connection.ReportSuccess('Wmi') + $connection.AddGoodCredential($cred) + if (-not $disable_cache) { [Sqlcollaborative.Dbatools.Connection.ConnectionHost]::Connections[$computer] = $connection } + continue main + } catch { + Write-Message -Level Verbose -Message "[$computer] Accessing computer using WMI - Failed" -ErrorRecord $_ + + if ($_.CategoryInfo.Reason -eq "UnauthorizedAccessException") { + # Ignore the global setting for bad credential cache disabling, since the connection object is aware of that state and will ignore input if it should. + # This is due to the ability to locally override the global setting, thus it must be done on the object and can then be done in code + $connection.AddBadCredential($cred) + if (-not $disable_cache) { [Sqlcollaborative.Dbatools.Connection.ConnectionHost]::Connections[$computer] = $connection } + Stop-Function -Message "[$computer] Invalid connection credentials" -Target $computer -Continue -ContinueLabel "main" -ErrorRecord $_ -SilentlyContinue:$SilentlyContinue + } elseif ($_.CategoryInfo.Category -eq "InvalidType") { + Stop-Function -Message "[$computer] Invalid class name ($ClassName), not found in current namespace ($Namespace)" -Target $computer -Continue -ContinueLabel "main" -ErrorRecord $_ -SilentlyContinue:$SilentlyContinue + } elseif ($_.Exception.ErrorCode -eq "ProviderLoadFailure") { + Stop-Function -Message "[$computer] Failed to access: $ClassName, in namespace: $Namespace - There was a provider error. This indicates a potential issue with WMI on the server side." -Target $computer -Continue -ContinueLabel "main" -ErrorRecord $_ -SilentlyContinue:$SilentlyContinue + } else { + $connection.ReportFailure('Wmi') + $excluded += "Wmi" + continue sub + } + } + } + #endregion Wmi + + #region PowerShell Remoting + "PowerShellRemoting" { + try { + Write-Message -Level Verbose -Message "[$computer] Accessing computer using PowerShell Remoting" + $scp_string = "Get-WmiObject -Class $ClassName -ErrorAction Stop" + if ($PSBoundParameters.ContainsKey("Namespace")) { $scp_string += " -Namespace $Namespace" } + + $parameters = @{ + ScriptBlock = ([System.Management.Automation.ScriptBlock]::Create($scp_string)) + ComputerName = $ComputerName + ErrorAction = 'Stop' + } + if ($Credential) { $parameters["Credential"] = $Credential } + Invoke-Command @parameters + + Write-Message -Level Verbose -Message "[$computer] Accessing computer using PowerShell Remoting - Success" + $connection.ReportSuccess('PowerShellRemoting') + $connection.AddGoodCredential($cred) + if (-not $disable_cache) { [Sqlcollaborative.Dbatools.Connection.ConnectionHost]::Connections[$computer] = $connection } + continue main + } catch { + # Will always consider authenticated, since any call with credentials to a server that doesn't exist will also carry invalid credentials error. + # There simply is no way to differentiate between actual authentication errors and server not reached + $connection.ReportFailure('PowerShellRemoting') + $excluded += "PowerShellRemoting" + continue sub + } + } + #endregion PowerShell Remoting + } + } + } + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function Get-DbaCmsRegServer { + <# + .SYNOPSIS + Gets list of SQL Server objects stored in SQL Server Central Management Server (CMS). + + .DESCRIPTION + Returns an array of servers found in the CMS. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Name + Specifies one or more names to include. Name is the visible name in SSMS CMS interface (labeled Registered Server Name) + + .PARAMETER ServerName + Specifies one or more server names to include. Server Name is the actual instance name (labeled Server Name) + + .PARAMETER Group + Specifies one or more groups to include from SQL Server Central Management Server. + + .PARAMETER ExcludeGroup + Specifies one or more Central Management Server groups to exclude. + + .PARAMETER ExcludeCmsServer + Deprecated, now follows the Microsoft convention of not including it by default. If you'd like to include the CMS Server, use -IncludeSelf + + .PARAMETER Id + Get server by Id(s) + + .PARAMETER IncludeSelf + If this switch is enabled, the CMS server itself will be included in the results, along with all other Registered Servers. + + .PARAMETER ResolveNetworkName + If this switch is enabled, the NetBIOS name and IP address(es) of each server will be returned. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: RegisteredServer, CMS + Author: Bryan Hamby (@galador) + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaCmsRegServer + + .EXAMPLE + PS C:\> Get-DbaCmsRegServer -SqlInstance sqlserver2014a + + Gets a list of servers from the CMS on sqlserver2014a, using Windows Credentials. + + .EXAMPLE + PS C:\> Get-DbaCmsRegServer -SqlInstance sqlserver2014a -IncludeSelf + + Gets a list of servers from the CMS on sqlserver2014a and includes sqlserver2014a in the output results. + + .EXAMPLE + PS C:\> Get-DbaCmsRegServer -SqlInstance sqlserver2014a -SqlCredential $credential | Select-Object -Unique -ExpandProperty ServerName + + Returns only the server names from the CMS on sqlserver2014a, using SQL Authentication to authenticate to the server. + + .EXAMPLE + PS C:\> Get-DbaCmsRegServer -SqlInstance sqlserver2014a -Group HR, Accounting + + Gets a list of servers in the HR and Accounting groups from the CMS on sqlserver2014a. + + .EXAMPLE + PS C:\> Get-DbaCmsRegServer -SqlInstance sqlserver2014a -Group HR\Development + + Returns a list of servers in the HR and sub-group Development from the CMS on sqlserver2014a. + + #> + [CmdletBinding()] + param ( + [parameter(Mandatory, ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [string[]]$Name, + [string[]]$ServerName, + [Alias("Groups")] + [object[]]$Group, + [object[]]$ExcludeGroup, + [int[]]$Id, + [switch]$IncludeSelf, + [switch]$ExcludeCmsServer, + [switch]$ResolveNetworkName, + [Alias('Silent')] + [switch]$EnableException + ) + begin { + if ($ResolveNetworkName) { + $defaults = 'ComputerName', 'FQDN', 'IPAddress', 'Name', 'ServerName', 'Group', 'Description' + } + $defaults = 'Name', 'ServerName', 'Group', 'Description' + } + process { + $servers = @() + foreach ($instance in $SqlInstance) { + if ($Group) { + $groupservers = Get-DbaCmsRegServerGroup -SqlInstance $instance -SqlCredential $SqlCredential -Group $Group -ExcludeGroup $ExcludeGroup + if ($groupservers) { + $servers += $groupservers.GetDescendantRegisteredServers() + } + } else { + try { + $serverstore = Get-DbaCmsRegServerStore -SqlInstance $instance -SqlCredential $SqlCredential -EnableException + } catch { + Stop-Function -Message "Cannot access Central Management Server '$instance'." -ErrorRecord $_ -Continue + } + $servers += ($serverstore.DatabaseEngineServerGroup.GetDescendantRegisteredServers()) + $serverstore.ServerConnection.Disconnect() + } + } + + if ($Name) { + Write-Message -Level Verbose -Message "Filtering by name for $name" + $servers = $servers | Where-Object Name -in $Name + } + + if ($ServerName) { + Write-Message -Level Verbose -Message "Filtering by servername for $servername" + $servers = $servers | Where-Object ServerName -in $ServerName + } + + if ($Id) { + Write-Message -Level Verbose -Message "Filtering by id for $Id (1 = default/root)" + $servers = $servers | Where-Object Id -in $Id + } + + if ($ExcludeGroup) { + $excluded = Get-DbaCmsRegServer $serverstore.ServerConnection.SqlConnectionObject -Group $ExcludeGroup + Write-Message -Level Verbose -Message "Excluding $ExcludeGroup" + $servers = $servers | Where-Object { $_.Urn.Value -notin $excluded.Urn.Value } + } + + foreach ($server in $servers) { + $groupname = Get-RegServerGroupReverseParse $server + if ($groupname -eq $server.Name) { + $groupname = $null + } else { + $groupname = ($groupname).Split("\") + $groupname = $groupname[0 .. ($groupname.Count - 2)] + $groupname = ($groupname -join "\") + } + + + Add-Member -Force -InputObject $server -MemberType NoteProperty -Name ComputerName -value $serverstore.ComputerName + Add-Member -Force -InputObject $server -MemberType NoteProperty -Name InstanceName -value $serverstore.InstanceName + Add-Member -Force -InputObject $server -MemberType NoteProperty -Name SqlInstance -value $serverstore.SqlInstance + Add-Member -Force -InputObject $server -MemberType NoteProperty -Name Group -value $groupname + Add-Member -Force -InputObject $server -MemberType NoteProperty -Name FQDN -Value $null + Add-Member -Force -InputObject $server -MemberType NoteProperty -Name IPAddress -Value $null + + if ($ResolveNetworkName) { + try { + $lookup = Resolve-DbaNetworkName $server.ServerName -Turbo + $server.ComputerName = $lookup.ComputerName + $server.FQDN = $lookup.FQDN + $server.IPAddress = $lookup.IPAddress + } catch { + try { + $lookup = Resolve-DbaNetworkName $server.ServerName + $server.ComputerName = $lookup.ComputerName + $server.FQDN = $lookup.FQDN + $server.IPAddress = $lookup.IPAddress + } catch { + # here to avoid an empty catch + $null = 1 + } + } + } + Add-Member -Force -InputObject $server -MemberType ScriptMethod -Name ToString -Value { $this.ServerName } + Select-DefaultView -InputObject $server -Property $defaults + } + + if ($IncludeSelf -and $servers) { + Write-Message -Level Verbose -Message "Adding CMS instance" + $self = $servers[0].PsObject.Copy() + $self | Add-Member -MemberType NoteProperty -Name Name -Value "CMS Instance" -Force + $self.ServerName = $instance + $self.Description = $null + $self.SecureConnectionString = $null + Select-DefaultView -InputObject $self -Property $defaults + } + } + end { + Test-DbaDeprecation -DeprecatedOn "1.0.0" -Parameter ExcludeCmsServer + Test-DbaDeprecation -DeprecatedOn "1.0.0" -Alias Get-DbaRegisteredServerName + Test-DbaDeprecation -DeprecatedOn "1.0.0" -Alias Get-SqlRegisteredServerName + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function Get-DbaCmsRegServerGroup { + <# + .SYNOPSIS + Gets list of Server Groups objects stored in SQL Server Central Management Server (CMS). + + .DESCRIPTION + Returns an array of Server Groups found in the CMS. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Group + Specifies one or more groups to include from SQL Server Central Management Server. + + .PARAMETER ExcludeGroup + Specifies one or more Central Management Server groups to exclude. + + .PARAMETER Id + Get group by Id(s). This parameter only works if the group has a registered server in it. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: RegisteredServer, CMS + Author: Tony Wilhelm (@tonywsql) + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaCmsRegServerGroup + + .EXAMPLE + PS C:\> Get-DbaCmsRegServerGroup -SqlInstance sqlserver2014a + + Gets the top level groups from the CMS on sqlserver2014a, using Windows Credentials. + + .EXAMPLE + PS C:\> Get-DbaCmsRegServerGroup -SqlInstance sqlserver2014a -SqlCredential $credential + + Gets the top level groups from the CMS on sqlserver2014a, using alternative credentials to authenticate to the server. + + .EXAMPLE + PS C:\> Get-DbaCmsRegServerGroup -SqlInstance sqlserver2014a -Group HR, Accounting + + Gets the HR and Accounting groups from the CMS on sqlserver2014a. + + .EXAMPLE + PS C:\> Get-DbaCmsRegServerGroup -SqlInstance sqlserver2014a -Group HR\Development + + Returns the sub-group Development of the HR group from the CMS on sqlserver2014a. + + #> + [CmdletBinding()] + param ( + [parameter(Mandatory, ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [object[]]$Group, + [object[]]$ExcludeGroup, + [int[]]$Id, + [switch]$EnableException + ) + process { + foreach ($instance in $SqlInstance) { + try { + $server = Get-DbaCmsRegServerStore -SqlInstance $instance -SqlCredential $SqlCredential -EnableException + } catch { + Stop-Function -Message "Cannot access Central Management Server '$instance'" -ErrorRecord $_ -Continue + } + + $groups = @() + + if ($group) { + foreach ($currentgroup in $Group) { + Write-Message -Level Verbose -Message "Processing $currentgroup" + if ($currentgroup -is [Microsoft.SqlServer.Management.RegisteredServers.ServerGroup]) { + $currentgroup = Get-RegServerGroupReverseParse -object $currentgroup + } + + if ($currentgroup -match 'DatabaseEngineServerGroup\\') { + $currentgroup = $currentgroup.Replace('DatabaseEngineServerGroup\', '') + } + + if ($currentgroup -match '\\') { + $split = $currentgroup.Split('\\') + $i = 0 + $groupobject = $server.DatabaseEngineServerGroup + do { + if ($groupobject) { + $groupobject = $groupobject.ServerGroups[$split[$i]] + Write-Message -Level Verbose -Message "Parsed $($groupobject.Name)" + } + } + until ($i++ -eq $split.GetUpperBound(0)) + if ($groupobject) { + $groups += $groupobject + } + } else { + try { + $thisgroup = $server.DatabaseEngineServerGroup.ServerGroups[$currentgroup] + if ($thisgroup) { + Write-Message -Level Verbose -Message "Added $($thisgroup.Name)" + $groups += $thisgroup + } + } catch { + # here to avoid an empty catch + $null = 1 + } + } + } + } else { + Write-Message -Level Verbose -Message "Added all root server groups" + $groups = $server.DatabaseEngineServerGroup.ServerGroups + } + + if ($Group -eq 'DatabaseEngineServerGroup') { + Write-Message -Level Verbose -Message "Added root group" + $groups = $server.DatabaseEngineServerGroup + } + + if ($ExcludeGroup) { + $excluded = Get-DbaCmsRegServer $server -Group $ExcludeGroup + Write-Message -Level Verbose -Message "Excluding $ExcludeGroup" + $groups = $groups | Where-Object { $_.Urn.Value -notin $excluded.Urn.Value } + } + + if ($Id) { + Write-Message -Level Verbose -Message "Filtering for id $Id. Id 1 = default." + if ($Id -eq 1) { + $groups = $server.DatabaseEngineServerGroup | Where-Object Id -in $Id + } else { + $groups = $server.DatabaseEngineServerGroup.GetDescendantRegisteredServers().Parent | Where-Object Id -in $Id + } + } + $server.ServerConnection.Disconnect() + foreach ($groupobject in $groups) { + Add-Member -Force -InputObject $groupobject -MemberType NoteProperty -Name ComputerName -value $server.ComputerName + Add-Member -Force -InputObject $groupobject -MemberType NoteProperty -Name InstanceName -value $server.InstanceName + Add-Member -Force -InputObject $groupobject -MemberType NoteProperty -Name SqlInstance -value $server.SqlInstance + + Select-DefaultView -InputObject $groupobject -Property ComputerName, InstanceName, SqlInstance, Name, DisplayName, Description, ServerGroups, RegisteredServers + } + } + } + end { + Test-DbaDeprecation -DeprecatedOn "1.0.0" -Alias Get-DbaRegisteredServerGroup + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function Get-DbaCmsRegServerStore { + <# + .SYNOPSIS + Returns a SQL Server Registered Server Store Object + + .DESCRIPTION + Returns a SQL Server Registered Server Store object - useful for working with Central Management Store + + .PARAMETER SqlInstance + The target SQL Server instance or instances. This can be a collection and receive pipeline input to allow the function + to be executed against multiple SQL Server instances. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: RegisteredServer,CMS + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaCmsRegServerStore + + .EXAMPLE + PS C:\> Get-DbaCmsRegServerStore -SqlInstance sqlserver2014a + + Returns a SQL Server Registered Server Store Object from sqlserver2014a + + .EXAMPLE + PS C:\> Get-DbaCmsRegServerStore -SqlInstance sqlserver2014a -SqlCredential sqladmin + + Returns a SQL Server Registered Server Store Object from sqlserver2014a by logging in with the sqladmin login + + #> + [CmdletBinding()] + param ( + [parameter(Mandatory, ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [Alias('Silent')] + [switch]$EnableException + ) + process { + foreach ($instance in $SqlInstance) { + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $sqlcredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + try { + $store = New-Object Microsoft.SqlServer.Management.RegisteredServers.RegisteredServersStore($server.ConnectionContext.SqlConnectionObject) + } catch { + Stop-Function -Message "Cannot access Central Management Server on $instance" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + Add-Member -Force -InputObject $store -MemberType NoteProperty -Name ComputerName -value $server.ComputerName + Add-Member -Force -InputObject $store -MemberType NoteProperty -Name InstanceName -value $server.ServiceName + Add-Member -Force -InputObject $store -MemberType NoteProperty -Name SqlInstance -value $server.DomainInstanceName + + Select-DefaultView -InputObject $store -ExcludeProperty ServerConnection, DomainInstanceName, DomainName, Urn, Properties, Metadata, Parent, ConnectionContext, PropertyMetadataChanged, PropertyChanged + } + } + end { + Test-DbaDeprecation -DeprecatedOn "1.0.0" -Alias Get-DbaRegisteredServerStore + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function Get-DbaComputerCertificate { + <# + .SYNOPSIS + Simplifies finding computer certificates that are candidates for using with SQL Server's network encryption + + .DESCRIPTION + Gets computer certificates on localhost that are candidates for using with SQL Server's network encryption + + .PARAMETER ComputerName + The target SQL Server instance or instances. Defaults to localhost. If target is a cluster, you must specify the distinct nodes. + + .PARAMETER Credential + Allows you to login to $ComputerName using alternative credentials. + + .PARAMETER Store + Certificate store - defaults to LocalMachine + + .PARAMETER Folder + Certificate folder - defaults to My (Personal) + + .PARAMETER Path + The path to a certificate - basically changes the path into a certificate object + + .PARAMETER Thumbprint + Return certificate based on thumbprint + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Certificate + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .EXAMPLE + PS C:\> Get-DbaComputerCertificate + + Gets computer certificates on localhost that are candidates for using with SQL Server's network encryption + + .EXAMPLE + PS C:\> Get-DbaComputerCertificate -ComputerName sql2016 + + Gets computer certificates on sql2016 that are candidates for using with SQL Server's network encryption + + .EXAMPLE + PS C:\> Get-DbaComputerCertificate -ComputerName sql2016 -Thumbprint 8123472E32AB412ED4288888B83811DB8F504DED, 04BFF8B3679BB01A986E097868D8D494D70A46D6 + + Gets computer certificates on sql2016 that match thumbprints 8123472E32AB412ED4288888B83811DB8F504DED or 04BFF8B3679BB01A986E097868D8D494D70A46D6 + + #> + [CmdletBinding()] + param ( + [parameter(ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer", "SqlInstance")] + [DbaInstanceParameter[]]$ComputerName = $env:COMPUTERNAME, + [PSCredential]$Credential, + [string]$Store = "LocalMachine", + [string]$Folder = "My", + [string]$Path, + [string[]]$Thumbprint, + [switch]$EnableException + ) + + begin { + #region Scriptblock for remoting + $scriptblock = { + param ( + $Thumbprint, + $Store, + $Folder, + $Path + ) + + if ($Path) { + $bytes = [System.IO.File]::ReadAllBytes($path) + $Certificate = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2 + $Certificate.Import($bytes, $null, [System.Security.Cryptography.X509Certificates.X509KeyStorageFlags]::DefaultKeySet) + return $Certificate + } + + function Get-CoreCertStore { + [CmdletBinding()] + param ( + [ValidateSet("CurrentUser", "LocalMachine")] + [string]$Store, + [ValidateSet("AddressBook", "AuthRoot, CertificateAuthority", "Disallowed", "My", "Root", "TrustedPeople", "TrustedPublisher")] + [string]$Folder, + [ValidateSet("ReadOnly", "ReadWrite")] + [string]$Flag = "ReadOnly" + ) + + $storename = [System.Security.Cryptography.X509Certificates.StoreLocation]::$Store + $foldername = [System.Security.Cryptography.X509Certificates.StoreName]::$Folder + $flags = [System.Security.Cryptography.X509Certificates.OpenFlags]::$Flag + $certstore = [System.Security.Cryptography.X509Certificates.X509Store]::New($foldername, $storename) + $certstore.Open($flags) + + $certstore + } + + function Get-CoreCertificate { + [CmdletBinding()] + param ( + [ValidateSet("CurrentUser", "LocalMachine")] + [string]$Store, + [ValidateSet("AddressBook", "AuthRoot, CertificateAuthority", "Disallowed", "My", "Root", "TrustedPeople", "TrustedPublisher")] + [string]$Folder, + [ValidateSet("ReadOnly", "ReadWrite")] + [string]$Flag = "ReadOnly", + [string[]]$Thumbprint, + [System.Security.Cryptography.X509Certificates.X509Store[]]$InputObject + ) + + if (-not $InputObject) { + $InputObject += Get-CoreCertStore -Store $Store -Folder $Folder -Flag $Flag + } + + $certs = ($InputObject).Certificates + + if ($Thumbprint) { + $certs = $certs | Where-Object Thumbprint -in $Thumbprint + } + + $certs + } + + if ($Thumbprint) { + try { + <# DO NOT use Write-Message as this is inside of a script block #> + Write-Verbose "Searching Cert:\$Store\$Folder" + Get-CoreCertificate -Store $Store -Folder $Folder -Thumbprint $Thumbprint + } catch { + # don't care - there's a weird issue with remoting where an exception gets thrown for no apparent reason + # here to avoid an empty catch + $null = 1 + } + } else { + try { + <# DO NOT use Write-Message as this is inside of a script block #> + Write-Verbose "Searching Cert:\$Store\$Folder" + Get-CoreCertificate -Store $Store -Folder $Folder | Where-Object EnhancedKeyUsageList -match '1\.3\.6\.1\.5\.5\.7\.3\.1' + } catch { + # still don't care + # here to avoid an empty catch + $null = 1 + } + } + } + #endregion Scriptblock for remoting + } + + process { + foreach ($computer in $computername) { + try { + Invoke-Command2 -ComputerName $computer -Credential $Credential -ScriptBlock $scriptblock -ArgumentList $thumbprint, $Store, $Folder, $Path -ErrorAction Stop | Select-DefaultView -Property FriendlyName, DnsNameList, Thumbprint, NotBefore, NotAfter, Subject, Issuer + } catch { + Stop-Function -Message "Issue connecting to computer" -ErrorRecord $_ -Target $computer -Continue + } + } + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function Get-DbaComputerSystem { + <# + .SYNOPSIS + Gets computer system information from the server. + + .DESCRIPTION + Gets computer system information from the server and returns as an object. + + .PARAMETER ComputerName + Target computer(s). If no computer name is specified, the local computer is targeted + + .PARAMETER Credential + Alternate credential object to use for accessing the target computer(s). + + .PARAMETER IncludeAws + If computer is hosted in AWS Infrastructure as a Service (IaaS), additional information will be included. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: ServerInfo + Author: Shawn Melton (@wsmelton), https://wsmelton.github.io + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaComputerSystem + + .EXAMPLE + PS C:\> Get-DbaComputerSystem + + Returns information about the local computer's computer system + + .EXAMPLE + PS C:\> Get-DbaComputerSystem -ComputerName sql2016 + + Returns information about the sql2016's computer system + + .EXAMPLE + PS C:\> Get-DbaComputerSystem -ComputerName sql2016 -IncludeAws + + Returns information about the sql2016's computer system and includes additional properties around the EC2 instance. + + #> + [CmdletBinding()] + param ( + [Parameter(ValueFromPipeline)] + [Alias("cn", "host", "Server")] + [DbaInstanceParameter[]]$ComputerName = $env:COMPUTERNAME, + [PSCredential]$Credential, + [switch]$IncludeAws, + [switch][Alias('Silent')] + $EnableException + ) + process { + foreach ($computer in $ComputerName) { + try { + $server = Resolve-DbaNetworkName -ComputerName $computer.ComputerName -Credential $Credential + + $computerResolved = $server.FullComputerName + + if (!$computerResolved) { + Stop-Function -Message "Unable to resolve hostname of $computer. Skipping." -Continue + } + + if (Test-Bound "Credential") { + $computerSystem = Get-DbaCmObject -ClassName Win32_ComputerSystem -ComputerName $computerResolved -Credential $Credential + } else { + $computerSystem = Get-DbaCmObject -ClassName Win32_ComputerSystem -ComputerName $computerResolved + } + + $adminPasswordStatus = + switch ($computerSystem.AdminPasswordStatus) { + 0 { "Disabled" } + 1 { "Enabled" } + 2 { "Not Implemented" } + 3 { "Unknown" } + default { "Unknown" } + } + + $domainRole = + switch ($computerSystem.DomainRole) { + 0 { "Standalone Workstation" } + 1 { "Member Workstation" } + 2 { "Standalone Server" } + 3 { "Member Server" } + 4 { "Backup Domain Controller" } + 5 { "Primary Domain Controller" } + } + + $isHyperThreading = $false + if ($computerSystem.NumberOfLogicalProcessors -gt $computerSystem.NumberofProcessors) { + $isHyperThreading = $true + } + + if ($IncludeAws) { + $isAws = Invoke-Command2 -ComputerName $computerResolved -Credential $Credential -ScriptBlock { ((Invoke-TlsWebRequest -TimeoutSec 15 -Uri 'http://169.254.169.254').StatusCode) -eq 200 } -Raw + + if ($isAws) { + $scriptBlock = { + [PSCustomObject]@{ + AmiId = (Invoke-TlsWebRequest -Uri 'http://169.254.169.254/latest/meta-data/ami-id').Content + IamRoleArn = ((Invoke-TlsWebRequest -Uri 'http://169.254.169.254/latest/meta-data/iam/info').Content | ConvertFrom-Json).InstanceProfileArn + InstanceId = (Invoke-TlsWebRequest -Uri 'http://169.254.169.254/latest/meta-data/instance-id').Content + InstanceType = (Invoke-TlsWebRequest -Uri 'http://169.254.169.254/latest/meta-data/instance-type').Content + AvailabilityZone = (Invoke-TlsWebRequest -Uri 'http://169.254.169.254/latest/meta-data/placement/availability-zone').Content + PublicHostname = (Invoke-TlsWebRequest -Uri 'http://169.254.169.254/latest/meta-data/public-hostname').Content + } + } + $awsProps = Invoke-Command2 -ComputerName $computerResolved -Credential $Credential -ScriptBlock $scriptBlock + } else { + Write-Message -Level Warning -Message "$computerResolved was not found to be an EC2 instance. Verify http://169.254.169.254 is accessible on the computer." + } + } + $inputObject = [PSCustomObject]@{ + ComputerName = $computerResolved + Domain = $computerSystem.Domain + DomainRole = $domainRole + Manufacturer = $computerSystem.Manufacturer + Model = $computerSystem.Model + SystemFamily = $computerSystem.SystemFamily + SystemSkuNumber = $computerSystem.SystemSKUNumber + SystemType = $computerSystem.SystemType + NumberLogicalProcessors = $computerSystem.NumberOfLogicalProcessors + NumberProcessors = $computerSystem.NumberOfProcessors + IsHyperThreading = $isHyperThreading + TotalPhysicalMemory = [DbaSize]$computerSystem.TotalPhysicalMemory + IsDaylightSavingsTime = $computerSystem.EnableDaylightSavingsTime + DaylightInEffect = $computerSystem.DaylightInEffect + DnsHostName = $computerSystem.DNSHostName + IsSystemManagedPageFile = $computerSystem.AutomaticManagedPagefile + AdminPasswordStatus = $adminPasswordStatus + } + if ($IncludeAws -and $isAws) { + Add-Member -Force -InputObject $inputObject -MemberType NoteProperty -Name AwsAmiId -Value $awsProps.AmiId + Add-Member -Force -InputObject $inputObject -MemberType NoteProperty -Name AwsIamRoleArn -Value $awsProps.IamRoleArn + Add-Member -Force -InputObject $inputObject -MemberType NoteProperty -Name AwsEc2InstanceId -Value $awsProps.InstanceId + Add-Member -Force -InputObject $inputObject -MemberType NoteProperty -Name AwsEc2InstanceType -Value $awsProps.InstanceType + Add-Member -Force -InputObject $inputObject -MemberType NoteProperty -Name AwsAvailabilityZone -Value $awsProps.AvailabilityZone + Add-Member -Force -InputObject $inputObject -MemberType NoteProperty -Name AwsPublicHostName -Value $awsProps.PublicHostname + } + $excludes = 'SystemSkuNumber', 'IsDaylightSavingsTime', 'DaylightInEffect', 'DnsHostName', 'AdminPasswordStatus' + Select-DefaultView -InputObject $inputObject -ExcludeProperty $excludes + } catch { + Stop-Function -Message "Failure" -ErrorRecord $_ -Target $computer -Continue + } + } + } +} +#ValidationTags#CodeStyle,Messaging,FlowControl,Pipeline# +function Get-DbaConnection { + <# + .SYNOPSIS + Returns a bunch of information from dm_exec_connections. + + .DESCRIPTION + Returns a bunch of information from dm_exec_connections which, according to Microsoft: + "Returns information about the connections established to this instance of SQL Server and the details of each connection. Returns server wide connection information for SQL Server. Returns current database connection information for SQL Database." + + .PARAMETER SqlInstance + The target SQL Server instance or instances. Server(s) must be SQL Server 2005 or higher. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Connection + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaConnection + + .EXAMPLE + PS C:\> Get-DbaConnection -SqlInstance sql2016, sql2017 + + Returns client connection information from sql2016 and sql2017 + + #> + [CmdletBinding()] + param ( + [parameter(Mandatory, ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [Alias("Credential", "Cred")] + [PSCredential]$SqlCredential, + [switch]$EnableException + ) + + begin { + $sql = "SELECT SERVERPROPERTY('MachineName') AS ComputerName, + ISNULL(SERVERPROPERTY('InstanceName'), 'MSSQLSERVER') AS InstanceName, + SERVERPROPERTY('ServerName') AS SqlInstance, + session_id as SessionId, most_recent_session_id as MostRecentSessionId, connect_time as ConnectTime, + net_transport as Transport, protocol_type as ProtocolType, protocol_version as ProtocolVersion, + endpoint_id as EndpointId, encrypt_option as EncryptOption, auth_scheme as AuthScheme, node_affinity as NodeAffinity, + num_reads as Reads, num_writes as Writes, last_read as LastRead, last_write as LastWrite, + net_packet_size as PacketSize, client_net_address as ClientNetworkAddress, client_tcp_port as ClientTcpPort, + local_net_address as ServerNetworkAddress, local_tcp_port as ServerTcpPort, connection_id as ConnectionId, + parent_connection_id as ParentConnectionId, most_recent_sql_handle as MostRecentSqlHandle + FROM sys.dm_exec_connections" + } + + process { + foreach ($instance in $SqlInstance) { + + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential -MinimumVersion 9 + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + Write-Message -Level Debug -Message "Getting results for the following query: $sql." + try { + $server.Query($sql) + } catch { + Stop-Function -Message "Failure" -Target $server -Exception $_ -Continue + } + } + } +} +function Get-DbaCpuRingBuffer { + <# + .SYNOPSIS + Collects CPU data from sys.dm_os_ring_buffers. Works on SQL Server 2005 and above. + + .DESCRIPTION + This command is based off of Glen Berry's diagnostic query for average CPU + + The sys.dm_os_ring_buffers stores the average CPU utilization history + by the current instance of SQL Server, plus the summed average CPU utilization + by all other processes on your machine are captured in one minute increments + for the past 256 minutes. + + Reference: https://www.sqlskills.com/blogs/glenn/sql-server-diagnostic-information-queries-detailed-day-16// + + .PARAMETER SqlInstance + Allows you to specify a comma separated list of servers to query. + + .PARAMETER SqlCredential + Allows you to login to servers using SQL Logins as opposed to Windows Auth/Integrated/Trusted. To use: + $cred = Get-Credential, this pass this $cred to the param. + + Windows Authentication will be used if DestinationSqlCredential is not specified. To connect as a different Windows user, run PowerShell as that user. + + .PARAMETER CollectionMinutes + Allows you to specify a Collection Period in Minutes. Default is 60 minutes + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: CPU + Author: Patrick Flynn (@sqllensman) + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaCpuRingBuffer + + .EXAMPLE + PS C:\> Get-DbaCpuRingBuffer -SqlInstance sql2008, sqlserver2012 + + Gets CPU Statistics from sys.dm_os_ring_buffers for servers sql2008 and sqlserver2012 for last 60 minutes. + + .EXAMPLE + PS C:\> Get-DbaCpuRingBuffer -SqlInstance sql2008 -CollectionMinutes 240 + + Gets CPU Statistics from sys.dm_os_ring_buffers for server sql2008 for last 240 minutes + + .EXAMPLE + PS C:\> $output = Get-DbaCpuRingBuffer -SqlInstance sql2008 -CollectionMinutes 240 | Select * | ConvertTo-DbaDataTable + + Gets CPU Statistics from sys.dm_os_ring_buffers for server sql2008 for last 240 minutes into a Data Table. + + .EXAMPLE + PS C:\> 'sql2008','sql2012' | Get-DbaCpuRingBuffer + + Gets CPU Statistics from sys.dm_os_ring_buffers for servers sql2008 and sqlserver2012 + + .EXAMPLE + PS C:\> $cred = Get-Credential sqladmin + PS C:\> Get-DbaCpuRingBuffer -SqlInstance sql2008 -SqlCredential $cred + + Connects using sqladmin credential and returns CPU Statistics from sys.dm_os_ring_buffers from sql2008 + #> + [CmdletBinding()] + Param ( + [parameter(Mandatory, ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer", "SqlServers")] + [DbaInstance[]]$SqlInstance, + [PSCredential]$SqlCredential, + [int]$CollectionMinutes = 60, + [Alias('Silent')] + [switch]$EnableException + ) + + process { + if (Test-FunctionInterrupt) { return } + foreach ($instance in $SqlInstance) { + Write-Message -Level Verbose -Message "Attempting to connect to $instance" + + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential -MinimumVersion 9 + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + if ($server.VersionMajor -gt 9) { + $currentTimestamp = ($server.Query("SELECT cpu_ticks / CONVERT (float, ( cpu_ticks / ms_ticks )) as TimeStamp FROM sys.dm_os_sys_info"))[0] + } else { + $currentTimestamp = ($server.Query("SELECT cpu_ticks / CONVERT(FLOAT, cpu_ticks_in_ms) as TimeStamp FROM sys.dm_os_sys_info"))[0] + } + Write-Message -Level Verbose -Message "Using current timestampe of $currentTimestamp" + + $sql = "With RingBufferSchedulerMonitor as + ( + SELECT + timestamp, + CONVERT(xml, record) AS record + FROM sys.dm_os_ring_buffers + WHERE (ring_buffer_type = N'RING_BUFFER_SCHEDULER_MONITOR') + AND (record LIKE '%%') + ), RingBufferSchedulerMonitorValues as + ( + SELECT + record.value('(./Record/@id)[1]', 'int') AS record_id, + record.value('(./Record/SchedulerMonitorEvent/SystemHealth/SystemIdle)[1]', 'int') AS SystemIdle, + record.value('(./Record/SchedulerMonitorEvent/SystemHealth/ProcessUtilization)[1]', 'int') AS SQLProcessUtilization, + timestamp, + DATEADD(ss, (-1 * ($currentTimestamp - [timestamp]))/1000, GETDATE()) AS EventTime + FROM RingBufferSchedulerMonitor + ) + Select + SERVERPROPERTY('ServerName') as ServerName, + record_id, + EventTime, + SQLProcessUtilization, + SystemIdle, + 100 - SystemIdle - SQLProcessUtilization AS OtherProcessUtilization + From RingBufferSchedulerMonitorValues + WHERE EventTime> DATEADD(MINUTE, -$CollectionMinutes, GETDATE()) ;" + + Write-Message -Level Verbose -Message "Executing Sql Staement: $sql" + foreach ($row in $server.Query($sql)) { + [PSCustomObject]@{ + ComputerName = $server.NetName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + RecordId = $row.record_id + EventTime = $row.EventTime + SQLProcessUtilization = $row.SQLProcessUtilization + OtherProcessUtilization = $row.OtherProcessUtilization + SystemIdle = $row.SystemIdle + } + } + } + } +} +function Get-DbaCpuUsage { + <# + .SYNOPSIS + Provides detailed CPU usage information about a SQL Server's process + + .DESCRIPTION + "If there are a lot of processes running on your instance and the CPU is very high, + then it's hard to find the exact process eating up your CPU using just the SQL Server + tools. One way to correlate the data between what is running within SQL Server and at + the Windows level is to use SPID and KPID values to get the exact process." + + This command automates that process. + + References: https://www.mssqltips.com/sqlservertip/2454/how-to-find-out-how-much-cpu-a-sql-server-process-is-really-using/ + + Note: This command returns results from all SQL instances on the destination server but the process + column is specific to -SqlInstance passed. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. + + .PARAMETER SqlCredential + Allows you to login to the SQL instance using alternative credentials. + + .PARAMETER Credential + Allows you to login to the Windows Server using alternative credentials. + + .PARAMETER Threshold + CPU threshold. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: CPU + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaCpuUsage + + .EXAMPLE + PS C:\> Get-DbaCpuUsage -SqlInstance sql2017 + + Logs into the SQL Server instance "sql2017" and also the Computer itself (via WMI) to gather information + + .EXAMPLE + PS C:\> $usage = Get-DbaCpuUsage -SqlInstance sql2017 + PS C:\> $usage.Process + + Explores the processes (from Get-DbaProcess) associated with the usage results + + .EXAMPLE + PS C:\> Get-DbaCpuUsage -SqlInstance sql2017 -SqlCredential sqladmin -Credential ad\sqldba + + Logs into the SQL instance using the SQL Login 'sqladmin' and then Windows instance as 'ad\sqldba' + + #> + [CmdletBinding()] + param ( + [parameter(Mandatory, ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer", "SqlServers")] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [PSCredential]$Credential, + [int]$Threshold = 0, + [switch]$EnableException + ) + begin { + # This can likely be enumerated but I don't know hows + $threadstates = [pscustomobject]@{ + 0 = 'Initialized. It is recognized by the microkernel.' + 1 = 'Ready. It is prepared to run on the next available processor.' + 2 = 'Running. It is executing.' + 3 = 'Standby. It is about to run. Only one thread may be in this state at a time.' + 4 = 'Terminated. It is finished executing.' + 5 = 'Waiting. It is not ready for the processor. When ready, it will be rescheduled.' + 6 = 'Transition. The thread is waiting for resources other than the processor.' + 7 = 'Unknown. The thread state is unknown.' + } + + $threadwaitreasons = [pscustomobject]@{ + 0 = 'Executive' + 1 = 'FreePage' + 2 = 'PageIn' + 3 = 'PoolAllocation' + 4 = 'ExecutionDelay' + 5 = 'FreePage' + 6 = 'PageIn' + 7 = 'Executive' + 8 = 'FreePage' + 9 = 'PageIn' + 10 = 'PoolAllocation' + 11 = 'ExecutionDelay' + 12 = 'FreePage' + 13 = 'PageIn' + 14 = 'EventPairHigh' + 15 = 'EventPairLow' + 16 = 'LPCReceive' + 17 = 'LPCReply' + 18 = 'VirtualMemory' + 19 = 'PageOut' + 20 = 'Unknown' + } + } + process { + foreach ($instance in $SqlInstance) { + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $sqlcredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + $processes = Get-DbaProcess -SqlInstance $server + $threads = Get-DbaCmObject -ComputerName $instance.ComputerName -ClassName Win32_PerfFormattedData_PerfProc_Thread -Credential $Credential | Where-Object { $_.Name -like 'sql*' -and $_.PercentProcessorTime -ge $Threshold } + + if ($server.VersionMajor -eq 8) { + $spidcollection = $server.Query("select spid, kpid from sysprocesses") + } else { + $spidcollection = $server.Query("select t.os_thread_id as kpid, s.session_id as spid + from sys.dm_exec_sessions s + join sys.dm_exec_requests er on s.session_id = er.session_id + join sys.dm_os_workers w on er.task_address = w.task_address + join sys.dm_os_threads t on w.thread_address = t.thread_address") + } + + foreach ($thread in $threads) { + $spid = ($spidcollection | Where-Object kpid -eq $thread.IDThread).spid + $process = $processes | Where-Object spid -eq $spid + $threadwaitreason = $thread.ThreadWaitReason + $threadstate = $thread.ThreadState + $ThreadStateValue = $threadstates.$threadstate + $ThreadWaitReasonValue = $threadwaitreasons.$threadwaitreason + + Add-Member -Force -InputObject $thread -MemberType NoteProperty -Name ComputerName -value $server.ComputerName + Add-Member -Force -InputObject $thread -MemberType NoteProperty -Name InstanceName -value $server.ServiceName + Add-Member -Force -InputObject $thread -MemberType NoteProperty -Name SqlInstance -value $server.DomainInstanceName + Add-Member -Force -InputObject $thread -MemberType NoteProperty -Name Processes -Value ($processes | Where-Object HostProcessID -eq $thread.IDProcess) + Add-Member -Force -InputObject $thread -MemberType NoteProperty -Name ThreadStateValue -Value $ThreadStateValue + Add-Member -Force -InputObject $thread -MemberType NoteProperty -Name ThreadWaitReasonValue -Value $ThreadWaitReasonValue + Add-Member -Force -InputObject $thread -MemberType NoteProperty -Name Process -Value $process + Add-Member -Force -InputObject $thread -MemberType NoteProperty -Name Query -Value $process.LastQuery + Add-Member -Force -InputObject $thread -MemberType NoteProperty -Name Spid -Value $spid + + Select-DefaultView -InputObject $thread -Property ComputerName, InstanceName, SqlInstance, Name, ContextSwitchesPersec, ElapsedTime, IDProcess, Spid, PercentPrivilegedTime, PercentProcessorTime, PercentUserTime, PriorityBase, PriorityCurrent, StartAddress, ThreadStateValue, ThreadWaitReasonValue, Process, Query + } + } + } +} +#ValidationTags#Messaging,FlowControl,CodeStyle# +function Get-DbaCredential { + <# + .SYNOPSIS + Gets SQL Credential information for each instance(s) of SQL Server. + + .DESCRIPTION + The Get-DbaCredential command gets SQL Credential information for each instance(s) of SQL Server. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. This can be a collection and receive pipeline input to allow the function + to be executed against multiple SQL Server instances. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Name + Only include specific names + Note: if spaces exist in the credential name, you will have to type "" or '' around it. + + .PARAMETER ExcludeName + Excluded credential names + + .PARAMETER Identity + Only include specific identities + Note: if spaces exist in the credential identity, you will have to type "" or '' around it. + + .PARAMETER ExcludeIdentity + Excluded identities + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Credential + Author: Garry Bargsley (@gbargsley), http://blog.garrybargsley.com + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaCredential + + .EXAMPLE + PS C:\> Get-DbaCredential -SqlInstance localhost + + Returns all SQL Credentials on the local default SQL Server instance + + .EXAMPLE + PS C:\> Get-DbaCredential -SqlInstance localhost, sql2016 -Name 'PowerShell Proxy' + + Returns the SQL Credentials named 'PowerShell Proxy' for the local and sql2016 SQL Server instances + + .EXAMPLE + PS C:\> Get-DbaCredential -SqlInstance localhost, sql2016 -Identity ad\powershell + + Returns the SQL Credentials for the account 'ad\powershell' on the local and sql2016 SQL Server instances + + #> + [CmdletBinding()] + [Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSAvoidUsingPlainTextForPassword", "")] + param ( + [parameter(Position = 0, Mandatory, ValueFromPipeline)] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [string[]]$Name, + [string[]]$ExcludeName, + [Alias('CredentialIdentity')] + [string[]]$Identity, + [Alias('ExcludeCredentialIdentity')] + [string[]]$ExcludeIdentity, + [Alias('Silent')] + [switch]$EnableException + ) + + process { + foreach ($instance in $SqlInstance) { + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + $credential = $server.Credentials + + if ($Name) { + $credential = $credential | Where-Object { $Name -contains $_.Name } + } + + if ($ExcludeName) { + $credential = $credential | Where-Object { $ExcludeName -notcontains $_.Name } + } + + if ($Identity) { + $credential = $credential | Where-Object { $Identity -contains $_.Identity } + } + + if ($ExcludeIdentity) { + $credential = $credential | Where-Object { $ExcludeIdentity -notcontains $_.Identity } + } + + foreach ($currentcredential in $credential) { + Add-Member -Force -InputObject $currentcredential -MemberType NoteProperty -Name ComputerName -value $currentcredential.Parent.ComputerName + Add-Member -Force -InputObject $currentcredential -MemberType NoteProperty -Name InstanceName -value $currentcredential.Parent.ServiceName + Add-Member -Force -InputObject $currentcredential -MemberType NoteProperty -Name SqlInstance -value $currentcredential.Parent.DomainInstanceName + + Select-DefaultView -InputObject $currentcredential -Property ComputerName, InstanceName, SqlInstance, ID, Name, Identity, MappedClassType, ProviderName + } + } + } +} +#ValidationTags#Messaging,FlowControl,CodeStyle# +function Get-DbaCustomError { + <# + .SYNOPSIS + Gets SQL Custom Error Message information for each instance(s) of SQL Server. + + .DESCRIPTION + The Get-DbaCustomError command gets SQL Custom Error Message information for each instance(s) of SQL Server. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. This can be a collection and receive pipeline input to allow the function + to be executed against multiple SQL Server instances. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Error, CustomError + Author: Garry Bargsley (@gbargsley), http://blog.garrybargsley.com + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaCustomError + + .EXAMPLE + PS C:\> Get-DbaCustomError -SqlInstance localhost + + Returns all Custom Error Message(s) on the local default SQL Server instance + + .EXAMPLE + PS C:\> Get-DbaCustomError -SqlInstance localhost, sql2016 + + Returns all Custom Error Message(s) for the local and sql2016 SQL Server instances + + #> + [CmdletBinding()] + param ( + [parameter(Position = 0, Mandatory, ValueFromPipeline)] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [Alias('Silent')] + [switch]$EnableException + ) + + process { + foreach ($instance in $SqlInstance) { + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + foreach ($customError in $server.UserDefinedMessages) { + Add-Member -Force -InputObject $customError -MemberType NoteProperty -Name ComputerName -value $customError.Parent.ComputerName + Add-Member -Force -InputObject $customError -MemberType NoteProperty -Name InstanceName -value $customError.Parent.ServiceName + Add-Member -Force -InputObject $customError -MemberType NoteProperty -Name SqlInstance -value $customError.Parent.DomainInstanceName + + Select-DefaultView -InputObject $customError -Property ComputerName, InstanceName, SqlInstance, ID, Text, LanguageID, Language + } + } + } +} +#ValidationTags#CodeStyle,Messaging,FlowControl,Pipeline# +function Get-DbaDatabase { + <# + .SYNOPSIS + Gets SQL Database information for each database that is present on the target instance(s) of SQL Server. + + .DESCRIPTION + The Get-DbaDatabase command gets SQL database information for each database that is present on the target instance(s) of + SQL Server. If the name of the database is provided, the command will return only the specific database information. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. Defaults to localhost. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Database + Specifies one or more database(s) to process. If unspecified, all databases will be processed. + + .PARAMETER ExcludeDatabase + Specifies one or more database(s) to exclude from processing. + + .PARAMETER ExcludeUser + If this switch is enabled, only databases which are not User databases will be processed. + + This parameter cannot be used with -ExcludeSystem. + + .PARAMETER ExcludeSystem + If this switch is enabled, only databases which are not System databases will be processed. + + This parameter cannot be used with -ExcludeUser. + + .PARAMETER Status + Specifies one or more database statuses to filter on. Only databases in the status(es) listed will be returned. Valid options for this parameter are 'Emergency', 'Normal', 'Offline', 'Recovering', 'Restoring', 'Standby', and 'Suspect'. + + .PARAMETER Access + Filters databases returned by their access type. Valid options for this parameter are 'ReadOnly' and 'ReadWrite'. If omitted, no filtering is performed. + + .PARAMETER Owner + Specifies one or more database owners. Only databases owned by the listed owner(s) will be returned. + + .PARAMETER Encrypted + If this switch is enabled, only databases which have Transparent Data Encryption (TDE) enabled will be returned. + + .PARAMETER RecoveryModel + Filters databases returned by their recovery model. Valid options for this parameter are 'Full', 'Simple', and 'BulkLogged'. + + .PARAMETER NoFullBackup + If this switch is enabled, only databases without a full backup recorded by SQL Server will be returned. This will also indicate which of these databases only have CopyOnly full backups. + + .PARAMETER NoFullBackupSince + Only databases which haven't had a full backup since the specified DateTime will be returned. + + .PARAMETER NoLogBackup + If this switch is enabled, only databases without a log backup recorded by SQL Server will be returned. This will also indicate which of these databases only have CopyOnly log backups. + + .PARAMETER NoLogBackupSince + Only databases which haven't had a log backup since the specified DateTime will be returned. + + .PARAMETER IncludeLastUsed + If this switch is enabled, the last used read & write times for each database will be returned. This data is retrieved from sys.dm_db_index_usage_stats which is reset when SQL Server is restarted. + + .PARAMETER OnlyAccessible + If this switch is enabled, only accessible databases are returned (huge speedup in SMO enumeration) + + .PARAMETER WhatIf + If this switch is enabled, no actions are performed but informational messages will be displayed that explain what would happen if the command were to run. + + .PARAMETER Confirm + If this switch is enabled, you will be prompted for confirmation before executing any operations that change state. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Database + Author: Garry Bargsley (@gbargsley), http://blog.garrybargsley.com | Klaas Vandenberghe (@PowerDbaKlaas) | Simone Bizzotto ( @niphlod ) + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaDatabase + + .EXAMPLE + PS C:\> Get-DbaDatabase -SqlInstance localhost + + Returns all databases on the local default SQL Server instance. + + .EXAMPLE + PS C:\> Get-DbaDatabase -SqlInstance localhost -ExcludeUser + + Returns only the system databases on the local default SQL Server instance. + + .EXAMPLE + PS C:\> Get-DbaDatabase -SqlInstance localhost -ExcludeSystem + + Returns only the user databases on the local default SQL Server instance. + + .EXAMPLE + PS C:\> 'localhost','sql2016' | Get-DbaDatabase + + Returns databases on multiple instances piped into the function. + + .EXAMPLE + PS C:\> Get-DbaDatabase -SqlInstance SQL1\SQLExpress -RecoveryModel full,Simple + + Returns only the user databases in Full or Simple recovery model from SQL Server instance SQL1\SQLExpress. + + .EXAMPLE + PS C:\> Get-DbaDatabase -SqlInstance SQL1\SQLExpress -Status Normal + + Returns only the user databases with status 'normal' from SQL Server instance SQL1\SQLExpress. + + .EXAMPLE + PS C:\> Get-DbaDatabase -SqlInstance SQL1\SQLExpress -IncludeLastUsed + + Returns the databases from SQL Server instance SQL1\SQLExpress and includes the last used information + from the sys.dm_db_index_usage_stats DMV. + + .EXAMPLE + PS C:\> Get-DbaDatabase -SqlInstance SQL1\SQLExpress,SQL2 -ExcludeDatabase model,master + + Returns all databases except master and model from SQL Server instances SQL1\SQLExpress and SQL2. + + .EXAMPLE + PS C:\> Get-DbaDatabase -SqlInstance SQL1\SQLExpress,SQL2 -Encrypted + + Returns only databases using TDE from SQL Server instances SQL1\SQLExpress and SQL2. + + .EXAMPLE + PS C:\> Get-DbaDatabase -SqlInstance SQL1\SQLExpress,SQL2 -Access ReadOnly + + Returns only read only databases from SQL Server instances SQL1\SQLExpress and SQL2. + + .EXAMPLE + PS C:\> Get-DbaDatabase -SqlInstance SQL2,SQL3 -Database OneDB,OtherDB + + Returns databases 'OneDb' and 'OtherDB' from SQL Server instances SQL2 and SQL3 if databases by those names exist on those instances. + + #> + [CmdletBinding(DefaultParameterSetName = "Default")] + [Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSUseSingularNouns", "", Justification = "Internal functions are ignored")] + param ( + [parameter(Position = 0, Mandatory, ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [Alias("Databases")] + [string[]]$Database, + [string[]]$ExcludeDatabase, + [Alias("SystemDbOnly", "NoUserDb", "ExcludeAllUserDb")] + [switch]$ExcludeUser, + [Alias("UserDbOnly", "NoSystemDb", "ExcludeAllSystemDb")] + [switch]$ExcludeSystem, + [string[]]$Owner, + [switch]$Encrypted, + [ValidateSet('EmergencyMode', 'Normal', 'Offline', 'Recovering', 'Restoring', 'Standby', 'Suspect')] + [string[]]$Status = @('EmergencyMode', 'Normal', 'Offline', 'Recovering', 'Restoring', 'Standby', 'Suspect'), + [ValidateSet('ReadOnly', 'ReadWrite')] + [string]$Access, + [ValidateSet('Full', 'Simple', 'BulkLogged')] + [string[]]$RecoveryModel = @('Full', 'Simple', 'BulkLogged'), + [switch]$NoFullBackup, + [datetime]$NoFullBackupSince, + [switch]$NoLogBackup, + [datetime]$NoLogBackupSince, + [Alias('Silent')] + [switch]$EnableException, + [switch]$IncludeLastUsed, + [switch]$OnlyAccessible + ) + + begin { + + if ($ExcludeUser -and $ExcludeSystem) { + Stop-Function -Message "You cannot specify both ExcludeUser and ExcludeSystem." -Continue -EnableException $EnableException + } + + } + process { + if (Test-FunctionInterrupt) { return } + + foreach ($instance in $SqlInstance) { + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $sqlcredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + if (!$IncludeLastUsed) { + $dblastused = $null + } else { + ## Get last used information from the DMV + $querylastused = "WITH agg AS + ( + SELECT + max(last_user_seek) last_user_seek, + max(last_user_scan) last_user_scan, + max(last_user_lookup) last_user_lookup, + max(last_user_update) last_user_update, + sd.name dbname + FROM + sys.dm_db_index_usage_stats, master..sysdatabases sd + WHERE + database_id = sd.dbid AND database_id > 4 + group by sd.name + ) + SELECT + dbname, + last_read = MAX(last_read), + last_write = MAX(last_write) + FROM + ( + SELECT dbname, last_user_seek, NULL FROM agg + UNION ALL + SELECT dbname, last_user_scan, NULL FROM agg + UNION ALL + SELECT dbname, last_user_lookup, NULL FROM agg + UNION ALL + SELECT dbname, NULL, last_user_update FROM agg + ) AS x (dbname, last_read, last_write) + GROUP BY + dbname + ORDER BY 1;" + # put a function around this to enable Pester Testing and also to ease any future changes + function Invoke-QueryDBlastUsed { + $server.Query($querylastused) + } + $dblastused = Invoke-QueryDBlastUsed + } + + if ($ExcludeUser) { + $DBType = @($true) + } elseif ($ExcludeSystem) { + $DBType = @($false) + } else { + $DBType = @($false, $true) + } + + $AccessibleFilter = switch ($OnlyAccessible) { + $true { @($true) } + default { @($true, $false) } + } + + $Readonly = switch ($Access) { + 'Readonly' { @($true) } + 'ReadWrite' { @($false) } + default { @($true, $false) } + } + $Encrypt = switch (Test-Bound $Encrypted) { + $true { @($true) } + default { @($true, $false, $null) } + } + function Invoke-QueryRawDatabases { + try { + if ($server.VersionMajor -eq 8) { + $server.Query("SELECT *, SUSER_NAME(sid) AS [Owner] FROM master.dbo.sysdatabases") + } else { + $server.Query("SELECT *, SUSER_NAME(owner_sid) AS [Owner] FROM sys.databases") + } + } catch { + Stop-Function -Message "Failure" -ErrorRecord $_ + } + } + $backed_info = Invoke-QueryRawDatabases + $backed_info = $backed_info | Where-Object { + ($_.name -in $Database -or !$Database) -and + ($_.name -notin $ExcludeDatabase -or !$ExcludeDatabase) -and + ($_.Owner -in $Owner -or !$Owner) -and + ($_.state -ne 6 -or !$OnlyAccessible) + } + + $inputObject = @() + foreach ($dt in $backed_info) { + if ($server.DatabaseEngineType -eq "SqlAzureDatabase") { + $inputObject += $server.Databases[$dt.name] + } else { + $inputObject += $server.Databases | Where-Object Name -ceq $dt.name + } + } + $inputobject = $inputObject | + Where-Object { + ($_.Name -in $Database -or !$Database) -and + ($_.Name -notin $ExcludeDatabase -or !$ExcludeDatabase) -and + ($_.Owner -in $Owner -or !$Owner) -and + $_.ReadOnly -in $Readonly -and + $_.IsAccessible -in $AccessibleFilter -and + $_.IsSystemObject -in $DBType -and + ((Compare-Object @($_.Status.tostring().split(',').trim()) $Status -ExcludeDifferent -IncludeEqual).inputobject.count -ge 1 -or !$status) -and + ($_.RecoveryModel -in $RecoveryModel -or !$_.RecoveryModel) -and + $_.EncryptionEnabled -in $Encrypt + } + if ($NoFullBackup -or $NoFullBackupSince) { + $dabs = (Get-DbaBackupHistory -SqlInstance $server -LastFull ) + if ($null -ne $NoFullBackupSince) { + $dabsWithinScope = ($dabs | Where-Object End -lt $NoFullBackupSince) + + $inputobject = $inputobject | Where-Object { $_.Name -in $dabsWithinScope.Database -and $_.Name -ne 'tempdb' } + } else { + $inputObject = $inputObject | Where-Object { $_.Name -notin $dabs.Database -and $_.Name -ne 'tempdb' } + } + + } + if ($NoLogBackup -or $NoLogBackupSince) { + $dabs = (Get-DbaBackupHistory -SqlInstance $server -LastLog ) + if ($null -ne $NoLogBackupSince) { + $dabsWithinScope = ($dabs | Where-Object End -lt $NoLogBackupSince) + $inputobject = $inputobject | + Where-Object { $_.Name -in $dabsWithinScope.Database -and $_.Name -ne 'tempdb' -and $_.RecoveryModel -ne 'Simple' } + } else { + $inputobject = $inputObject | + Where-Object { $_.Name -notin $dabs.Database -and $_.Name -ne 'tempdb' -and $_.RecoveryModel -ne 'Simple' } + } + } + + $defaults = 'ComputerName', 'InstanceName', 'SqlInstance', 'Name', 'Status', 'IsAccessible', 'RecoveryModel', + 'LogReuseWaitStatus', 'Size as SizeMB', 'CompatibilityLevel as Compatibility', 'Collation', 'Owner', + 'LastBackupDate as LastFullBackup', 'LastDifferentialBackupDate as LastDiffBackup', + 'LastLogBackupDate as LastLogBackup' + + if ($NoFullBackup -or $NoFullBackupSince -or $NoLogBackup -or $NoLogBackupSince) { + $defaults += ('Notes') + } + if ($IncludeLastUsed) { + # Add Last Used to the default view + $defaults += ('LastRead as LastIndexRead', 'LastWrite as LastIndexWrite') + } + + try { + foreach ($db in $inputobject) { + + $Notes = $null + if ($NoFullBackup -or $NoFullBackupSince) { + if (@($db.EnumBackupSets()).count -eq @($db.EnumBackupSets() | Where-Object { $_.IsCopyOnly }).count -and (@($db.EnumBackupSets()).count -gt 0)) { + $Notes = "Only CopyOnly backups" + } + } + + $lastusedinfo = $dblastused | Where-Object { $_.dbname -eq $db.name } + Add-Member -Force -InputObject $db -MemberType NoteProperty BackupStatus -value $Notes + Add-Member -Force -InputObject $db -MemberType NoteProperty -Name ComputerName -value $server.ComputerName + Add-Member -Force -InputObject $db -MemberType NoteProperty -Name InstanceName -value $server.ServiceName + Add-Member -Force -InputObject $db -MemberType NoteProperty -Name SqlInstance -value $server.DomainInstanceName + Add-Member -Force -InputObject $db -MemberType NoteProperty -Name LastRead -value $lastusedinfo.last_read + Add-Member -Force -InputObject $db -MemberType NoteProperty -Name LastWrite -value $lastusedinfo.last_write + Select-DefaultView -InputObject $db -Property $defaults + #try { $server.Databases.Refresh() } catch {} + } + } catch { + Stop-Function -ErrorRecord $_ -Target $instance -Message "Failure. Collection may have been modified. If so, please use parens (Get-DbaDatabase ....) | when working with commands that modify the collection such as Remove-DbaDatabase." -Continue + } + } + } +} +#ValidationTags#Messaging,FlowControl,CodeStyle# +function Get-DbaDbAssembly { + <# + .SYNOPSIS + Gets SQL Database Assembly information for each instance(s) of SQL Server. + + .DESCRIPTION + The Get-DbaDbAssembly command gets SQL Database Assembly information for each instance(s) of SQL Server. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. This can be a collection and receive pipeline input to allow the function + to be executed against multiple SQL Server instances. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Assembly, Database + Author: Garry Bargsley (@gbargsley), http://blog.garrybargsley.com + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaDbAssembly + + .EXAMPLE + PS C:\> Get-DbaDbAssembly -SqlInstance localhost + + Returns all Database Assembly on the local default SQL Server instance + + .EXAMPLE + PS C:\> Get-DbaDbAssembly -SqlInstance localhost, sql2016 + + Returns all Database Assembly for the local and sql2016 SQL Server instances + + #> + [CmdletBinding()] + param ( + [parameter(Position = 0, Mandatory, ValueFromPipeline)] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [Alias('Silent')] + [switch]$EnableException + ) + + process { + foreach ($instance in $SqlInstance) { + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + foreach ($database in ($server.Databases | Where-Object IsAccessible)) { + try { + foreach ($assembly in $database.assemblies) { + + Add-Member -Force -InputObject $assembly -MemberType NoteProperty -Name ComputerName -value $assembly.Parent.Parent.ComputerName + Add-Member -Force -InputObject $assembly -MemberType NoteProperty -Name InstanceName -value $assembly.Parent.Parent.ServiceName + Add-Member -Force -InputObject $assembly -MemberType NoteProperty -Name SqlInstance -value $assembly.Parent.Parent.DomainInstanceName + + Select-DefaultView -InputObject $assembly -Property ComputerName, InstanceName, SqlInstance, ID, Name, Owner, 'AssemblySecurityLevel as SecurityLevel', CreateDate, IsSystemObject, Version + } + } catch { + Stop-Function -Message "Issue pulling assembly information" -Target $assembly -ErrorRecord $_ -Continue + } + } + } + } + end { + Test-DbaDeprecation -DeprecatedOn "1.0.0" -EnableException:$false -Alias Get-DbaDatabaseAssembly + } +} +function Get-DbaDbccHelp { + <# + .SYNOPSIS + Execution of Database Console Command DBCC HELP + + .DESCRIPTION + Returns the results of DBCC HELP + + Read more: + - https://docs.microsoft.com/en-us/sql/t-sql/database-console-commands/dbcc-help-transact-sql + + .PARAMETER SqlInstance + The target SQL Server instance or instances. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Statement + Is the name of the DBCC command for which to receive syntax information. + Provide only the part of the DBCC command that follows DBCC, + for example, CHECKDB instead of DBCC CHECKDB. + + .PARAMETER IncludeUndocumented + Allows getting help for undocumented DBCC commands. Requires Traceflag 2588 + This only works for SQL Server 2005 or Higher + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: DBCC + Author: Patrick Flynn (@sqllensman) + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaDbccUserOptions + + .EXAMPLE + PS C:\> Get-DbaDbccHelp -SqlInstance SQLInstance -Statement FREESYSTEMCACHE -Verbose | Format-List + + Runs the command DBCC HELP(FREESYSTEMCACHE) WITH NO_INFOMSGS against the SQL Server instance SQLInstance + + .EXAMPLE + PS C:\> Get-DbaDbccHelp -SqlInstance LensmanSB -Statement WritePage -IncludeUndocumented | Format-List + + Sets TraeFlag 2588 on for session and then runs the command DBCC HELP(WritePage) WITH NO_INFOMSGS against the SQL Server instance SQLInstance + + #> + [CmdletBinding()] + param ( + [parameter(Mandatory, ValueFromPipeline)] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [string]$Statement, + [switch]$IncludeUndocumented, + [switch]$EnableException + ) + begin { + if (Test-Bound -Not -ParameterName Statement) { + Stop-Function -Message "You must specify a value for Statement" + return + } + $stringBuilder = New-Object System.Text.StringBuilder + + if (Test-Bound -ParameterName IncludeUndocumented) { + $null = $stringBuilder.Append("DBCC TRACEON (2588) WITH NO_INFOMSGS;") + } + + Write-Message -Message "Get Help Information for $Statement" -Level Verbose + $null = $stringBuilder.Append("DBCC HELP($Statement) WITH NO_INFOMSGS;") + } + process { + + foreach ($instance in $SqlInstance) { + Write-Message -Message "Attempting Connection to $instance" -Level Verbose + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential -MinimumVersion 9 + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + try { + $query = $StringBuilder.ToString() + Write-Message -Message "Query to run: $query" -Level Verbose + $results = $server | Invoke-DbaQuery -Query $query -MessagesToOutput + + } catch { + Stop-Function -Message "Failure" -ErrorRecord $_ -Target $server -Continue + } + + [PSCustomObject]@{ + Operation = $Statement + Cmd = "DBCC HELP($Statement)" + Output = $results + } + + } + } +} +function Get-DbaDbccMemoryStatus { + <# + .SYNOPSIS + Gets the results of DBCC MEMORYSTATUS. Works on SQL Server 2000-2019. + + .DESCRIPTION + This command is used to run the DBCC MEMORYSTATUS comand and collect results in a single usable recordset + + Reference: + - https://blogs.msdn.microsoft.com/timchapman/2012/08/16/how-to-parse-dbcc-memorystatus-via-powershell/ + - https://support.microsoft.com/en-us/help/907877/how-to-use-the-dbcc-memorystatus-command-to-monitor-memory-usage-on-sq + + .PARAMETER SqlInstance + The target SQL Server instance or instances. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: DBCC, Memory + Author: Patrick Flynn (@sqllensman) + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaMemoryStatus + + .EXAMPLE + PS C:\> Get-DbaDbccMemoryStatus -SqlInstance sqlcluster, sqlserver2012 + + Get output of DBCC MEMORYSTATUS for instances "sqlcluster" and "sqlserver2012". Returns results in a single recordset. + + .EXAMPLE + PS C:\> Get-DbaCmsRegServer -SqlInstance sqlcluster | Get-DbaDbccMemoryStatus + + Get output of DBCC MEMORYSTATUS for all servers in Server Central Management Server + + #> + [CmdletBinding()] + param ( + [parameter(Mandatory, ValueFromPipeline)] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [switch]$EnableException + ) + begin { + $query = 'DBCC MEMORYSTATUS' + } + process { + foreach ($instance in $SqlInstance) { + Write-Message -Message "Attempting Connection to $instance" -Level Verbose + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + Write-Message -Level Verbose -Message "Collecting $query data from server: $instance" + try { + $datatable = $server.query($query, 'master', $true) + + $recordset = 0 + $rowId = 0 + $recordsetId = 0 + + foreach ($dataset in $datatable) { + $dataSection = $dataset.Columns[0].ColumnName + $dataType = $dataset.Columns[1].ColumnName + $recordset = $recordset + 1 + foreach ($row in $dataset.Rows) { + $rowId = $rowId + 1 + $recordsetId = $recordsetId + 1 + [PSCustomObject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + RecordSet = $RecordSet + RowId = $RowId + RecordSetId = $RecordSetId + Type = $dataSection + Name = $Row[0] + Value = $Row[1] + ValueType = $dataType + } + } + $recordsetId = 0 + } + } catch { + Stop-Function -Message "Failure Executing $query" -ErrorRecord $_ -Target $instance -Continue + } + } + } +} +function Get-DbaDbccProcCache { + <# + .SYNOPSIS + Execution of Database Console Command DBCC PROCCACHE + + .DESCRIPTION + Returns the results of DBCC PROCCACHE + + Read more: + - https://docs.microsoft.com/en-us/sql/t-sql/database-console-commands/dbcc-proccache-transact-sql + + .PARAMETER SqlInstance + The target SQL Server instance or instances. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: DBCC + Author: Patrick Flynn (@sqllensman) + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaDbccProcCache + + .EXAMPLE + PS C:\> Get-DbaDbccProcCache -SqlInstance Server1 + + Get results of DBCC PROCCACHE for Instance Server1 + + .EXAMPLE + PS C:\> 'Sql1','Sql2/sqlexpress' | Get-DbaDbccProcCache + + Get results of DBCC PROCCACHE for Instances Sql1 and Sql2/sqlexpress + + .EXAMPLE + PS C:\> $cred = Get-Credential sqladmin + PS C:\> Get-DbaDbccProcCache -SqlInstance Server1 -SqlCredential $cred + + Connects using sqladmin credential and gets results of DBCC PROCCACHE for Instance Server1 + + #> + [CmdletBinding()] + param ( + [parameter(Mandatory, ValueFromPipeline)] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [switch]$EnableException + ) + begin { + + $stringBuilder = New-Object System.Text.StringBuilder + $null = $stringBuilder.Append("DBCC PROCCACHE WITH NO_INFOMSGS") + } + process { + $query = $StringBuilder.ToString() + foreach ($instance in $SqlInstance) { + Write-Message -Message "Attempting Connection to $instance" -Level Verbose + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + try { + Write-Message -Message "Query to run: $query" -Level Verbose + $results = $server.Query($query) + } catch { + Stop-Function -Message "Failure" -ErrorRecord $_ -Target $server -Continue + } + foreach ($row in $results) { + [PSCustomObject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + Count = $row[0] + Used = $row[1] + Active = $row[2] + CacheSize = $row[3] + CacheUsed = $row[4] + CacheActive = $row[5] + } + } + } + } +} +function Get-DbaDbccSessionBuffer { + <# + .SYNOPSIS + Gets result of Database Console Command DBCC INPUTBUFFER or DBCC OUTPUTBUFFER + + .DESCRIPTION + Returns the results of DBCC INPUTBUFFER or DBCC OUTPUTBUFFER for input sessions + + Read more: + - https://docs.microsoft.com/en-us/sql/t-sql/database-console-commands/dbcc-inputbuffer-transact-sql + - https://docs.microsoft.com/en-us/sql/t-sql/database-console-commands/dbcc-outputbuffer-transact-sql + + .PARAMETER SqlInstance + The target SQL Server instance or instances. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Operation + DBCC Operation to execute - either InputBuffer or OutputBuffer + + .PARAMETER SessionId + The Session ID(s) to use to get current input or output buffer. + + .PARAMETER RequestId + Is the exact request (batch) to search for within the current session + The following query returns request_id: + + SELECT request_id + FROM sys.dm_exec_requests + WHERE session_id = @@spid; + + .PARAMETER All + If this switch is enabled, results for all User Sessions will be retreived + This overides any values for SessionId or RequestId + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: DBCC + Author: Patrick Flynn (@sqllensman) + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaDbccSessionBuffer + + .EXAMPLE + PS C:\> Get-DbaDbccSessionBuffer -SqlInstance Server1 -Operation InputBuffer -SessionId 51 + + Get results of DBCC INPUTBUFFER(51) for Instance Server1 + + .EXAMPLE + PS C:\> Get-DbaDbccSessionBuffer -SqlInstance Server1 -Operation OutputBuffer -SessionId 51, 52 + + Get results of DBCC OUTPUTBUFFER for SessionId's 51 and 52 for Instance Server1 + + .EXAMPLE + PS C:\> Get-DbaDbccSessionBuffer -SqlInstance Server1 -Operation InputBuffer -SessionId 51 -RequestId 0 + + Get results of DBCC INPUTBUFFER(51,0) for Instance Server1 + + .EXAMPLE + PS C:\> Get-DbaDbccSessionBuffer -SqlInstance Server1 -Operation OutputBuffer -SessionId 51 -RequestId 0 + + Get results of DBCC OUTPUTBUFFER(51,0) for Instance Server1 + + .EXAMPLE + PS C:\> 'Sql1','Sql2/sqlexpress' | Get-DbaDbccSessionBuffer -Operation InputBuffer -All + + Get results of DBCC INPUTBUFFER for all user sessions for the instances Sql1 and Sql2/sqlexpress + + .EXAMPLE + PS C:\> 'Sql1','Sql2/sqlexpress' | Get-DbaDbccSessionBuffer -Operation OutputBuffer -All + + Get results of DBCC OUTPUTBUFFER for all user sessions for the instances Sql1 and Sql2/sqlexpress + + .EXAMPLE + PS C:\> $cred = Get-Credential sqladmin + PS C:\> Get-DbaDbccSessionBuffer -SqlInstance Server1 -SqlCredential $cred -Operation InputBuffer -SessionId 51 -RequestId 0 + + Connects using sqladmin credential and gets results of DBCC INPUTBUFFER(51,0) for Instance Server1 + + .EXAMPLE + PS C:\> $cred = Get-Credential sqladmin + PS C:\> Get-DbaDbccSessionBuffer -SqlInstance Server1 -SqlCredential $cred -Operation OutputBuffer -SessionId 51 -RequestId 0 + + Connects using sqladmin credential and gets results of DBCC OUTPUTBUFFER(51,0) for Instance Server1 + + #> + [CmdletBinding()] + param ( + [parameter(Mandatory, ValueFromPipeline)] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [ValidateSet('InputBuffer', 'OutputBuffer')] + [string]$Operation = "InputBuffer", + [int[]]$SessionId, + [int]$RequestId, + [switch]$All, + [switch]$EnableException + ) + begin { + if (Test-Bound -Not -ParameterName All) { + if (Test-Bound -Not -ParameterName SessionId) { + Stop-Function -Message "You must specify either a SessionId or use the -All switch." + return + } + } + + if (Test-Bound -ParameterName Operation) { + $Operation = $Operation.ToUpper() + } + $stringBuilder = New-Object System.Text.StringBuilder + $null = $stringBuilder.Append("DBCC $Operation(#Operation#) WITH NO_INFOMSGS") + + } + process { + + foreach ($instance in $SqlInstance) { + Write-Message -Message "Attempting Connection to $instance" -Level Verbose + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + if (Test-Bound -Not -ParameterName All) { + foreach ($session_id in $SessionId) { + $query = $StringBuilder.ToString() + + if (Test-Bound -Not -ParameterName RequestId) { + Write-Message -Message "Query to run: $query" -Level Verbose + $query = $query.Replace('#Operation#', $session_id) + } else { + Write-Message -Message "Query to run: $query" -Level Verbose + $query = $query.Replace('#Operation#', "$($session_id), $($RequestId)") + } + + try { + Write-Message -Message "Query to run: $query" -Level Verbose + $results = $server.Query($query) + } catch { + Stop-Function -Message "Failure" -ErrorRecord $_ -Target $server -Continue + } + if ($Operation -eq 'INPUTBUFFER') { + foreach ($row in $results) { + [PSCustomObject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + SessionId = $session_id + EventType = $row[0] + Parameters = $row[1] + EventInfo = $row[2] + } + } + } else { + Write-Message -Message "Output Buffer" -Level Verbose + $hexStringBuilder = New-Object System.Text.StringBuilder + $asciiStringBuilder = New-Object System.Text.StringBuilder + + foreach ($row in $results) { + $str = $row[0].ToString() + $null = $hexStringBuilder.Append($str.Substring(11, 48)) + $null = $asciiStringBuilder.Append($str.Substring(61, 16)) + } + [PSCustomObject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + SessionId = $session_id + Buffer = $asciiStringBuilder.ToString().Replace('.', '').TrimEnd() + HexBuffer = $hexStringBuilder.ToString().Replace(' ', '') + } | Select-DefaultView -Property ComputerName, InstanceName, SqlInstance, SessionId, Buffer + } + } + } else { + $sessionQuery = 'Select session_id FROM sys.dm_exec_connections' + $sessionList = $server.Query($sessionQuery ) + foreach ($session in $sessionList) { + $query = $StringBuilder.ToString() + $query = $query.Replace('#Operation#', $session.session_id) + try { + Write-Message -Message "Query to run: $query" -Level Verbose + $results = $server.Query($query) + } catch { + Stop-Function -Message "Failure" -ErrorRecord $_ -Target $server -Continue + } + if ($Operation -eq 'INPUTBUFFER') { + foreach ($row in $results) { + [PSCustomObject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + SessionId = $session.session_id + EventType = $row[0] + Parameters = $row[1] + EventInfo = $row[2] + } + } + } else { + $hexStringBuilder = New-Object System.Text.StringBuilder + $asciiStringBuilder = New-Object System.Text.StringBuilder + + foreach ($row in $results) { + $str = $row[0].ToString() + $null = $hexStringBuilder.Append($str.Substring(11, 48)) + $null = $asciiStringBuilder.Append($str.Substring(61, 16)) + } + [PSCustomObject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + SessionId = $session.session_id + Buffer = $asciiStringBuilder.ToString().Replace('.', '').TrimEnd() + HexBuffer = $hexStringBuilder.ToString().Replace(' ', '') + } | Select-DefaultView -Property ComputerName, InstanceName, SqlInstance, SessionId, Buffer + } + } + } + } + } +} +function Get-DbaDbccStatistic { + <# + .SYNOPSIS + Execution of Database Console Command DBCC SHOW_STATISTICS + + .DESCRIPTION + Executes the command DBCC SHOW_STATISTICS against defined objects and returns results + + Reclaims space from dropped variable-length columns in tables or indexed views + + Read more: + - https://docs.microsoft.com/en-us/sql/t-sql/database-console-commands/dbcc-cleantable-transact-sql + + .PARAMETER SqlInstance + The target SQL Server instance or instances. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Database + The database(s) to process - this list is auto-populated from the server. If unspecified, all databases will be processed. + + .PARAMETER Object + The table or indexed view for which to display statistics information. + Any two part object name should be formatted as 'Schema.ObjectName' + + .PARAMETER Target + Name of the index, statistics, or column for which to display statistics information. + Target can be enclosed in brackets, single quotes, double quotes, or no quotes + + .PARAMETER Option + Used to limit the result sets returned by the statement to the specified option. + Options are 'StatHeader', 'DensityVector', 'Histogram', 'StatsStream' + Default of StatHeader + + .PARAMETER NoInformationalMessages + Suppresses all informational messages. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: DBCC, Statistics + Author: Patrick Flynn (@sqllensman) + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaDbccStatistic + + .EXAMPLE + PS C:\> Get-DbaDbccStatistic -SqlInstance SQLServer2017 + + Will run the statement SHOW_STATISTICS WITH STAT_HEADER against all Statistics on all User Tables or views for every accessible database on instance SQLServer2017. Connects using Windows Authentication. + + .EXAMPLE + PS C:\> Get-DbaDbccStatistic -SqlInstance SQLServer2017 -Database MyDb -Option DensityVector + + Will run the statement SHOW_STATISTICS WITH DENSITY_VECTOR against all Statistics on all User Tables or views for database MyDb on instance SQLServer2017. Connects using Windows Authentication. + + .EXAMPLE + PS C:\> $cred = Get-Credential sqladmin + PS C:\> Get-DbaDbccStatistic -SqlInstance SQLServer2017 -SqlCredential $cred -Database MyDb -Object UserTable -Option Histogram + + Will run the statement SHOW_STATISTICS WITH HISTOGRAM against all Statistics on table UserTable for database MyDb on instance SQLServer2017. Connects using sqladmin credential. + + .EXAMPLE + PS C:\> 'Sql1','Sql2/sqlexpress' | Get-DbaDbccStatistic -SqlInstance SQLServer2017 -Database MyDb -Object 'dbo.UserTable' -Target MyStatistic -Option StatsStream + + Runs the statement SHOW_STATISTICS('dbo.UserTable', 'MyStatistic') WITH STATS_STREAM against database MyDb on instances Sql1 and Sql2/sqlexpress. Connects using Windows Authentication. + + #> + [CmdletBinding()] + param ( + [parameter(Mandatory, ValueFromPipeline)] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [string[]]$Database, + [string]$Object, + [string]$Target, + [ValidateSet('StatHeader', 'DensityVector', 'Histogram', 'StatsStream')] + [string]$Option = "StatHeader", + [switch]$NoInformationalMessages, + [switch]$EnableException + ) + begin { + $stringBuilder = New-Object System.Text.StringBuilder + $null = $stringBuilder.Append("DBCC SHOW_STATISTICS(#options#) WITH NO_INFOMSGS" ) + if ($Option -eq 'StatHeader') { + $null = $stringBuilder.Append(", STAT_HEADER") + } elseif ($Option -eq 'DensityVector') { + $null = $stringBuilder.Append(", DENSITY_VECTOR") + } elseif ($Option -eq 'Histogram') { + $null = $stringBuilder.Append(", HISTOGRAM") + } elseif ($Option -eq 'StatsStream') { + $null = $stringBuilder.Append(", STATS_STREAM") + } + + $statList = + "Select Object, Target, name FROM + ( + Select Schema_Name(o.SCHEMA_ID) + '.' + o.name as Object, st.name as Target, o.name + FROM sys.stats st + INNER JOIN sys.objects o + on o.object_id = st.object_id + WHERE o.type in ('U', 'V') + ) a + " + } + process { + foreach ($instance in $SqlInstance) { + Write-Message -Message "Attempting Connection to $instance" -Level Verbose + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + if ($server.VersionMajor -eq 8) { + if ((Test-Bound -Not -ParameterName Object) -or (Test-Bound -Not -ParameterName Target)) { + Write-Message -Level Warning -Message "You must specify an Object and a Target for SQL Server 2000" + continue + } + } + + $dbs = $server.Databases + + if ($Database) { + $dbs = $dbs | Where-Object Name -In $Database + } + + foreach ($db in $dbs) { + Write-Message -Level Verbose -Message "Processing $db on $instance" + $queryList = @() + if ($db.IsAccessible -eq $false) { + Stop-Function -Message "The database $db is not accessible. Skipping." -Continue + } + + if ((Test-Bound -ParameterName Object) -and (Test-Bound -ParameterName Target)) { + $query = $StringBuilder.ToString() + $query = $query.Replace('#options#', "'$Object', '$Target'") + + $queryList += New-Object -TypeName PSObject -Property @{Object = $Object; + Target = $Target; + Query = $query + } + } elseif (Test-Bound -ParameterName Object) { + $whereFilter = " WHERE (Object = '$object' or name = '$object')" + $statListFiltered = $statList + $whereFilter + Write-Message -Level Verbose -Message "Query to execute: $statListFiltered" + $statListData = $db.Query($statListFiltered) + foreach ($statisticObj in $statListData) { + $query = $StringBuilder.ToString() + $query = $query.Replace('#options#', "'$($statisticObj.Object)', '$($statisticObj.Target)'") + $queryList += New-Object -TypeName PSObject -Property @{Object = $statisticObj.Object; + Target = $statisticObj.Target; + Query = $query + } + } + } else { + $statListData = $db.Query($statList) + foreach ($statisticObj in $statListData) { + $query = $StringBuilder.ToString() + $query = $query.Replace('#options#', "'$($statisticObj.Object)', '$($statisticObj.Target)'") + $queryList += New-Object -TypeName PSObject -Property @{Object = $statisticObj.Object; + Target = $statisticObj.Target; + Query = $query + } + } + } + + try { + foreach ($queryObj in $queryList ) { + Write-Message -Message "Running statement $($queryObj.Query)" -Level Verbose + $results = $server | Invoke-DbaQuery -Query $queryObj.Query -Database $db.Name -MessagesToOutput + + if ($Option -eq 'StatHeader') { + foreach ($row in $results) { + [PSCustomObject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + Database = $db.Name + Object = $queryObj.Object + Target = $queryObj.Target + Cmd = $queryObj.Query + Name = $row[0] + Updated = $row[1] + Rows = $row[2] + RowsSampled = $row[3] + Steps = $row[4] + Density = $row[5] + AverageKeyLength = $row[6] + StringIndex = $row[7] + FilterExpression = $row[8] + UnfilteredRows = $row[9] + PersistedSamplePercent = $row[10] + } + } + } + if ($Option -eq 'DensityVector') { + foreach ($row in $results) { + [PSCustomObject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + Database = $db.Name + Object = $queryObj.Object + Target = $queryObj.Target + Cmd = $queryObj.Query + AllDensity = $row[0].ToString() + AverageLength = $row[1] + Columns = $row[2] + } + } + } + if ($Option -eq 'Histogram') { + foreach ($row in $results) { + [PSCustomObject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + Database = $db.Name + Object = $queryObj.Object + Target = $queryObj.Target + Cmd = $queryObj.Query + RangeHiKey = $row[0] + RangeRows = $row[1] + EqualRows = $row[2] + DistinctRangeRows = $row[3] + AverageRangeRows = $row[4] + } + } + } + if ($Option -eq 'StatsStream') { + foreach ($row in $results) { + [PSCustomObject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + Database = $db.Name + Object = $queryObj.Object + Target = $queryObj.Target + Cmd = $queryObj.Query + StatsStream = $row[0] + Rows = $row[1] + DataPages = $row[2] + } + } + } + } + } catch { + Stop-Function -Message "Error capturing data on $db" -Target $instance -ErrorRecord $_ -Exception $_.Exception -Continue + } + } + } + } +} +function Get-DbaDbccUserOption { + <# + .SYNOPSIS + Execution of Database Console Command DBCC USEROPTIONS + + .DESCRIPTION + Returns the results of DBCC USEROPTIONS + + Read more: + - https://docs.microsoft.com/en-us/sql/t-sql/database-console-commands/dbcc-useroptions-transact-sql + + .PARAMETER SqlInstance + The target SQL Server instance or instances. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Option + Return only specific options. Returns all results if not specified. + Accepts any values in set 'ansi_null_dflt_on', 'ansi_nulls', 'ansi_padding', 'ansi_warnings', 'arithabort', 'concat_null_yields_null', 'datefirst', 'dateformat', 'isolation level', 'language', 'lock_timeout', 'quoted_identifier', 'textsize' + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: DBCC + Author: Patrick Flynn (@sqllensman) + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaDbccUserOption + + .EXAMPLE + PS C:\> Get-DbaDbccUserOption -SqlInstance Server1 + + Get results of DBCC USEROPTIONS for Instance Server1 + + .EXAMPLE + PS C:\> 'Sql1','Sql2/sqlexpress' | Get-DbaDbccUserOption + + Get results of DBCC USEROPTIONS for Instances Sql1 and Sql2/sqlexpress + + .EXAMPLE + PS C:\> $cred = Get-Credential sqladmin + PS C:\> Get-DbaDbccUserOption -SqlInstance Server1 -SqlCredential $cred + + Connects using sqladmin credential and gets results of DBCC USEROPTIONS for Instance Server1 + + .EXAMPLE + PS C:\> Get-DbaDbccUserOption -SqlInstance Server1 -Option ansi_nulls, ansi_warnings, datefirst + + Gets results of DBCC USEROPTIONS for Instance Server1. Only display results for the options ansi_nulls, ansi_warnings, datefirst + + #> + [CmdletBinding()] + param ( + [parameter(Mandatory, ValueFromPipeline)] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [ValidateSet('ansi_null_dflt_on', 'ansi_nulls', 'ansi_padding', 'ansi_warnings', 'arithabort', 'concat_null_yields_null', 'datefirst', 'dateformat', 'isolation level', 'language', 'lock_timeout', 'quoted_identifier', 'textsize')] + [string[]]$Option, + [switch]$EnableException + ) + begin { + $stringBuilder = New-Object System.Text.StringBuilder + $null = $stringBuilder.Append("DBCC USEROPTIONS WITH NO_INFOMSGS") + } + process { + $query = $StringBuilder.ToString() + + foreach ($instance in $SqlInstance) { + Write-Message -Message "Attempting Connection to $instance" -Level Verbose + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential + } catch { + Stop-Function -Message "Error connecting to $instance" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + try { + Write-Message -Message "Query to run: $query" -Level Verbose + $results = $server.Query($query) + } catch { + Stop-Function -Message "Failure running $query against $instance" -ErrorRecord $_ -Target $server -Continue + } + foreach ($row in $results) { + if ((Test-Bound -Not -ParameterName Option) -or ($row[0] -in $Option)) { + [PSCustomObject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + Option = $row[0] + Value = $row[1] + } + } + } + } + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function Get-DbaDbCertificate { + <# + .SYNOPSIS + Gets database certificates + + .DESCRIPTION + Gets database certificates + + .PARAMETER SqlInstance + The target SQL Server instance + + .PARAMETER SqlCredential + Allows you to login to SQL Server using alternative credentials + + .PARAMETER Database + Get certificate from specific database + + .PARAMETER ExcludeDatabase + Database(s) to ignore when retrieving certificates + + .PARAMETER InputObject + Enables piping from Get-DbaDatabase + + .PARAMETER Certificate + Get specific certificate by name + + .PARAMETER Certificate + Get specific certificate by subject + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Certificate + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .EXAMPLE + PS C:\> Get-DbaDbCertificate -SqlInstance sql2016 + + Gets all certificates + + .EXAMPLE + PS C:\> Get-DbaDbCertificate -SqlInstance Server1 -Database db1 + + Gets the certificate for the db1 database + + .EXAMPLE + PS C:\> Get-DbaDbCertificate -SqlInstance Server1 -Database db1 -Certificate cert1 + + Gets the cert1 certificate within the db1 database + + .EXAMPLE + PS C:\> Get-DbaDbCertificate -SqlInstance Server1 -Database db1 -Subject 'Availability Group Cert' + + Gets the cert1 certificate within the db1 database + + #> + [CmdletBinding()] + param ( + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [string[]]$Database, + [string[]]$ExcludeDatabase, + [object[]]$Certificate, # sometimes it's text, other times cert + [string[]]$Subject, + [parameter(ValueFromPipeline)] + [Microsoft.SqlServer.Management.Smo.Database[]]$InputObject, + [switch]$EnableException + ) + begin { + Test-DbaDeprecation -DeprecatedOn "1.0.0" -Alias Get-DbaDatabaseCertificate + } + process { + if ($SqlInstance) { + $InputObject += Get-DbaDatabase -SqlInstance $SqlInstance -SqlCredential $SqlCredential -Database $Database -ExcludeDatabase $ExcludeDatabase + } + + foreach ($db in $InputObject) { + if (!$db.IsAccessible) { + Write-Message -Level Warning -Message "$db is not accessible, skipping" + continue + } + + #Variable marked as unused by PSScriptAnalyzer + #$dbName = $db.Name + $certs = $db.Certificates + + if ($null -eq $certs) { + Write-Message -Message "No certificate exists in the $db database on $instance" -Target $db -Level Verbose + continue + } + + if ($Certificate) { + $certs = $certs | Where-Object Name -in $Certificate + } + + if ($Subject) { + $certs = $certs | Where-Object Subject -in $Subject + } + + foreach ($cert in $certs) { + Add-Member -Force -InputObject $cert -MemberType NoteProperty -Name ComputerName -value $db.ComputerName + Add-Member -Force -InputObject $cert -MemberType NoteProperty -Name InstanceName -value $db.InstanceName + Add-Member -Force -InputObject $cert -MemberType NoteProperty -Name SqlInstance -value $db.SqlInstance + Add-Member -Force -InputObject $cert -MemberType NoteProperty -Name Database -value $db.Name + + Select-DefaultView -InputObject $cert -Property ComputerName, InstanceName, SqlInstance, Database, Name, Subject, StartDate, ActiveForServiceBrokerDialog, ExpirationDate, Issuer, LastBackupDate, Owner, PrivateKeyEncryptionType, Serial + } + } + } +} +function Get-DbaDbCheckConstraint { + <# + .SYNOPSIS + Gets database Check constraints. + + .DESCRIPTION + Gets database Checks constraints. + + .PARAMETER SqlInstance + The target SQL Server instance or instances + + .PARAMETER SqlCredential + Allows you to login to SQL Server using alternative credentials + + .PARAMETER Database + To get Checks from specific database(s) + + .PARAMETER ExcludeDatabase + The database(s) to exclude - this list is auto populated from the server + + .PARAMETER ExcludeSystemTable + This switch removes all system objects from the table collection + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Database + Author: Claudio Silva (@ClaudioESSilva), https://claudioessilva.eu + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .EXAMPLE + PS C:\> Get-DbaDbCheckConstraint -SqlInstance sql2016 + + Gets all database check constraints. + + .EXAMPLE + PS C:\> Get-DbaDbCheckConstraint -SqlInstance Server1 -Database db1 + + Gets the check constraints for the db1 database. + + .EXAMPLE + PS C:\> Get-DbaDbCheckConstraint -SqlInstance Server1 -ExcludeDatabase db1 + + Gets the check constraints for all databases except db1. + + .EXAMPLE + PS C:\> Get-DbaDbCheckConstraint -SqlInstance Server1 -ExcludeSystemTable + + Gets the check constraints for all databases that are not system objects. + + .EXAMPLE + PS C:\> 'Sql1','Sql2/sqlexpress' | Get-DbaDbCheckConstraint + + Gets the check constraints for the databases on Sql1 and Sql2/sqlexpress. + + #> + [CmdletBinding()] + param ( + [parameter(Mandatory, ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [object[]]$Database, + [object[]]$ExcludeDatabase, + [switch]$ExcludeSystemTable, + [Alias('Silent')] + [switch]$EnableException + ) + + process { + foreach ($instance in $SqlInstance) { + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $sqlcredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + $databases = $server.Databases | Where-Object IsAccessible + + if ($Database) { + $databases = $databases | Where-Object Name -In $Database + } + if ($ExcludeDatabase) { + $databases = $databases | Where-Object Name -NotIn $ExcludeDatabase + } + + foreach ($db in $databases) { + if (!$db.IsAccessible) { + Write-Message -Level Warning -Message "Database $db is not accessible. Skipping." + continue + } + + foreach ($tbl in $db.Tables) { + if ( (Test-Bound -ParameterName ExcludeSystemTable) -and $tbl.IsSystemObject ) { + continue + } + + if ($tbl.Checks.Count -eq 0) { + Write-Message -Message "No Checks exist in $tbl table on the $db database on $instance" -Target $tbl -Level Verbose + continue + } + + foreach ($ck in $tbl.Checks) { + Add-Member -Force -InputObject $ck -MemberType NoteProperty -Name ComputerName -value $server.ComputerName + Add-Member -Force -InputObject $ck -MemberType NoteProperty -Name InstanceName -value $server.ServiceName + Add-Member -Force -InputObject $ck -MemberType NoteProperty -Name SqlInstance -value $server.DomainInstanceName + Add-Member -Force -InputObject $ck -MemberType NoteProperty -Name Database -value $db.Name + + $defaults = 'ComputerName', 'InstanceName', 'SqlInstance', 'Database', 'Parent', 'ID', 'CreateDate', + 'DateLastModified', 'Name', 'IsEnabled', 'IsChecked', 'NotForReplication', 'Text', 'State' + Select-DefaultView -InputObject $ck -Property $defaults + } + } + } + } + } +} +function Get-DbaDbCompatibility { + <# + .SYNOPSIS + Displays the compatibility level for SQL Server databases. + + .DESCRIPTION + Get the current database compatibility level for all databases on a server or list of databases passed in to the function. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. + + .PARAMETER SqlCredential + SqlCredential object used to connect to the SQL Server as a different user. + + .PARAMETER Database + The database or databases to process. If unspecified, all databases will be processed. + + .PARAMETER InputObject + A collection of databases (such as returned by Get-DbaDatabase) + + .PARAMETER WhatIf + Shows what would happen if the command were to run + + .PARAMETER Confirm + Prompts for confirmation of every step. For example: + + Are you sure you want to perform this action? + Performing the operation "Update database" on target "pubs on SQL2016\VNEXT". + [Y] Yes [A] Yes to All [N] No [L] No to All [S] Suspend [?] Help (default is "Y"): + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Compatibility, Database + Author: Garry Bargsley, http://blog.garrybargsley.com/ + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaDbCompatibility + + .EXAMPLE + PS C:\> Get-DbaDbCompatibility -SqlInstance localhost\sql2017 + + Displays database compatibility level for all user databases on server localhost\sql2017 + + .EXAMPLE + PS C:\> Get-DbaDbCompatibility -SqlInstance localhost\sql2017 -Database Test + + Displays database compatibility level for database Test on server localhost\sql2017 + + #> + [CmdletBinding()] + param ( + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [string[]]$Database, + [parameter(ValueFromPipeline)] + [Microsoft.SqlServer.Management.Smo.Database[]]$InputObject, + [switch]$EnableException + ) + process { + if (Test-Bound -not 'SqlInstance', 'InputObject') { + Write-Message -Level Warning -Message "You must specify either a SQL instance or pipe a database collection" + continue + } + + if ($SqlInstance) { + $InputObject += Get-DbaDatabase -SqlInstance $SqlInstance -SqlCredential $SqlCredential -Database $Database + } + + foreach ($db in $InputObject) { + $server = $db.Parent + $ServerVersion = $server.VersionMajor + Write-Message -Level Verbose -Message "SQL Server is using Version: $ServerVersion" + + [PSCustomObject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + Database = $db.Name + Compatibility = $db.CompatibilityLevel + } + } + } +} +function Get-DbaDbCompression { + <# + .SYNOPSIS + Gets tables and indexes size and current compression settings. + + .DESCRIPTION + This function gets the current size and compression for all objects in the specified database(s), if no database is specified it will return all objects in all user databases. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. This can be a collection and receive pipeline input to allow the function to be executed against multiple SQL Server instances. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Database + The database(s) to process - this list is auto populated from the server. If unspecified, all databases will be processed. + + .PARAMETER ExcludeDatabase + The database(s) to exclude - this list is auto populated from the server. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Compression, Table, Database + Author: Jess Pomfret (@jpomfret), jesspomfret.com + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .EXAMPLE + PS C:\> Get-DbaDbCompression -SqlInstance localhost + + Returns objects size and current compression level for all user databases. + + .EXAMPLE + PS C:\> Get-DbaDbCompression -SqlInstance localhost -Database TestDatabase + + Returns objects size and current compression level for objects within the TestDatabase database. + + .EXAMPLE + PS C:\> Get-DbaDbCompression -SqlInstance localhost -ExcludeDatabase TestDatabases + + Returns objects size and current compression level for objects in all databases except the TestDatabase database. + + #> + [CmdletBinding(DefaultParameterSetName = "Default")] + param ( + [parameter(Mandatory, ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [object[]]$Database, + [object[]]$ExcludeDatabase, + [switch]$EnableException + ) + + process { + foreach ($instance in $SqlInstance) { + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential -MinimumVersion 10 + } catch { + Stop-Function -Message "Failed to process Instance $Instance" -ErrorRecord $_ -Target $instance -Continue + } + + try { + $dbs = $server.Databases | Where-Object { $_.IsAccessible -and $_.IsSystemObject -eq 0 } + + if ($Database) { + $dbs = $dbs | Where-Object { $_.Name -In $Database } + } + + if ($ExcludeDatabase) { + $dbs = $dbs | Where-Object { $_.Name -NotIn $ExcludeDatabase } + } + } catch { + Stop-Function -Message "Unable to gather list of databases for $instance" -Target $instance -ErrorRecord $_ -Continue + } + + foreach ($db in $dbs) { + try { + foreach ($obj in $server.Databases[$($db.name)].Tables) { + if ($obj.HasHeapIndex) { + foreach ($p in $obj.PhysicalPartitions) { + [pscustomobject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + Database = $db.Name + Schema = $obj.Schema + TableName = $obj.Name + IndexName = $null + Partition = $p.PartitionNumber + IndexID = 0 + IndexType = "Heap" + DataCompression = $p.DataCompression + SizeCurrent = [dbasize]($obj.DataSpaceUsed * 1024) + RowCount = $obj.RowCount + } + } + } + + foreach ($index in $obj.Indexes) { + foreach ($p in $index.PhysicalPartitions) { + [pscustomobject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + Database = $db.Name + Schema = $obj.Schema + TableName = $obj.Name + IndexName = $index.Name + Partition = $p.PartitionNumber + IndexID = $index.ID + IndexType = $index.IndexType + DataCompression = $p.DataCompression + SizeCurrent = if ($index.IndexType -eq "ClusteredIndex") { [dbasize]($obj.DataSpaceUsed * 1024) } else { [dbasize]($index.SpaceUsed * 1024) } + RowCount = $p.RowCount + } + } + } + + } + } catch { + Stop-Function -Message "Unable to query $instance - $db" -Target $db -ErrorRecord $_ -Continue + } + + } + } + } +} +function Get-DbaDbDbccOpenTran { + <# + .SYNOPSIS + Execution of Database Console Command DBCC OPENTRAN + + .DESCRIPTION + Executes the command DBCC OPENTRAN against the requested databases + + Displays information about the oldest active transaction and + the oldest distributed and nondistributed replicated transactions, if any, + within the transaction log of the specified database + + Read more: + - https://docs.microsoft.com/en-us/sql/t-sql/database-console-commands/dbcc-opentran-transact-sql + + .PARAMETER SqlInstance + The target SQL Server instance or instances. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Database + The database(s) to process. If unspecified, all databases will be processed. + The Name or Id of a database can be specified + Database names must comply with the rules for identifiers. + + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: DBCC + Author: Patrick Flynn (@sqllensman) + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaDbDbccOpenTran + + .EXAMPLE + PS C:\> Get-DbaDbDbccOpenTran -SqlInstance SQLServer2017 + + Connects to instance SqlServer2017 using Windows Authentication and runs the command DBCC OPENTRAN WITH TABLERESULTS, NO_INFOMSGS against each database. + + .EXAMPLE + PS C:\> Get-DbaDbDbccOpenTran -SqlInstance SQLServer2017 -Database CurrentDB + + Connects to instance SqlServer2017 using Windows Authentication and runs the command DBCC OPENTRAN(CurrentDB) WITH TABLERESULTS, NO_INFOMSGS against the CurrentDB database. + + .EXAMPLE + PS C:\> $cred = Get-Credential sqladmin + PS C:\> 'Sql1','Sql2/sqlexpress' | Get-DbaDbDbccOpenTran -SqlCredential $cred + + Connects to instances Sql1 and Sql2/sqlexpress using sqladmin credential and runs the command DBCC OPENTRAN WITH TABLERESULTS, NO_INFOMSGS against each database. + #> + [CmdletBinding()] + param ( + [parameter(Mandatory, ValueFromPipeline)] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [string[]]$Database, + [switch]$EnableException + ) + begin { + $stringBuilder = New-Object System.Text.StringBuilder + $null = $stringBuilder.Append("DBCC OPENTRAN(#options#) WITH TABLERESULTS, NO_INFOMSGS") + } + process { + foreach ($instance in $SqlInstance) { + Write-Message -Message "Attempting Connection to $instance" -Level Verbose + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + $dbs = $server.Databases + + if (Test-Bound -ParameterName Database) { + $dbs = $dbs | Where-Object {($_.Name -In $Database) -or ($_.ID -In $Database) } + } + + foreach ($db in $dbs) { + Write-Message -Level Verbose -Message "Processing $db on $instance" + + if ($db.IsAccessible -eq $false) { + Stop-Function -Message "The database $db is not accessible. Skipping." -Continue + } + + try { + $query = $StringBuilder.ToString() + $query = $query.Replace('#options#', "'$($db.Name)'") + + Write-Message -Message "Query to run: $query" -Level Verbose + $results = $server.Query($query) + Write-Message -Message "Finshed" -Level Verbose + } catch { + Stop-Function -Message "Error capturing data on $db" -Target $instance -ErrorRecord $_ -Exception $_.Exception -Continue + } + + if ($null -eq $results) { + [PSCustomObject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + Database = $db.Name + Cmd = $query.ToString() + Output = 'No active open transactions.' + Field = $null + Data = $null + } + } else { + foreach ($row in $results) { + [PSCustomObject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + Database = $db.Name + Cmd = $query.ToString() + Output = 'Oldest active transaction' + Field = $row[0] + Data = $row[1] + } + } + } + } + } + } +} +function Get-DbaDbEncryption { + <# + .SYNOPSIS + Returns a summary of encryption used on databases passed to it. + + .DESCRIPTION + Shows if a database has Transparent Data Encryption (TDE), any certificates, asymmetric keys or symmetric keys with details for each. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. This can be a collection and receive pipeline input. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Database + The database(s) to process - this list is auto-populated from the server. If unspecified, all databases will be processed. + + .PARAMETER ExcludeDatabase + The database(s) to exclude - this list is auto-populated from the server. + + .PARAMETER IncludeSystemDBs + Switch parameter that when used will display system database information. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Encryption, Database + Author: Stephen Bennett, https://sqlnotesfromtheunderground.wordpress.com/ + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaDbEncryption + + .EXAMPLE + PS C:\> Get-DbaDbEncryption -SqlInstance DEV01 + + List all encryption found on the instance by database + + .EXAMPLE + PS C:\> Get-DbaDbEncryption -SqlInstance DEV01 -Database MyDB + + List all encryption found for the MyDB database. + + .EXAMPLE + PS C:\> Get-DbaDbEncryption -SqlInstance DEV01 -ExcludeDatabase MyDB + + List all encryption found for all databases except MyDB. + + .EXAMPLE + PS C:\> Get-DbaDbEncryption -SqlInstance DEV01 -IncludeSystemDBs + + List all encryption found for all databases including the system databases. + + #> + [CmdletBinding()] + param ( + [parameter(ValueFromPipeline, Mandatory)] + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [Alias("Databases")] + [object[]]$Database, + [object[]]$ExcludeDatabase, + [switch]$IncludeSystemDBs, + [Alias('Silent')] + [switch]$EnableException + ) + + process { + foreach ($instance in $SqlInstance) { + #For each SQL Server in collection, connect and get SMO object + + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + #If IncludeSystemDBs is true, include systemdbs + #only look at online databases (Status equal normal) + try { + if ($Database) { + $dbs = $server.Databases | Where-Object Name -In $Database + } elseif ($IncludeSystemDBs) { + $dbs = $server.Databases | Where-Object IsAccessible + } else { + $dbs = $server.Databases | Where-Object { $_.IsAccessible -and $_.IsSystemObject -eq 0 } + } + + if ($ExcludeDatabase) { + $dbs = $dbs | Where-Object Name -NotIn $ExcludeDatabase + } + } catch { + Stop-Function -Message "Unable to gather dbs for $instance" -Target $instance -Continue + } + + foreach ($db in $dbs) { + Write-Message -Level Verbose -Message "Processing $db" + + if ($db.EncryptionEnabled -eq $true) { + [PSCustomObject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + Database = $db.Name + Encryption = "EncryptionEnabled (TDE)" + Name = $null + LastBackup = $null + PrivateKeyEncryptionType = $null + EncryptionAlgorithm = $null + KeyLength = $null + Owner = $null + Object = $null + ExpirationDate = $null + } + + } + + foreach ($cert in $db.Certificates) { + [PSCustomObject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + Database = $db.Name + Encryption = "Certificate" + Name = $cert.Name + LastBackup = $cert.LastBackupDate + PrivateKeyEncryptionType = $cert.PrivateKeyEncryptionType + EncryptionAlgorithm = $null + KeyLength = $null + Owner = $cert.Owner + Object = $cert + ExpirationDate = $cert.ExpirationDate + } + + } + + foreach ($ak in $db.AsymmetricKeys) { + [PSCustomObject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + Database = $db.Name + Encryption = "Asymmetric key" + Name = $ak.Name + LastBackup = $null + PrivateKeyEncryptionType = $ak.PrivateKeyEncryptionType + EncryptionAlgorithm = $ak.KeyEncryptionAlgorithm + KeyLength = $ak.KeyLength + Owner = $ak.Owner + Object = $ak + ExpirationDate = $null + } + + } + foreach ($sk in $db.SymmetricKeys) { + [PSCustomObject]@{ + Server = $server.name + Instance = $server.InstanceName + Database = $db.Name + Encryption = "Symmetric key" + Name = $sk.Name + LastBackup = $null + PrivateKeyEncryptionType = $sk.PrivateKeyEncryptionType + EncryptionAlgorithm = $ak.EncryptionAlgorithm + KeyLength = $sk.KeyLength + Owner = $sk.Owner + Object = $sk + ExpirationDate = $null + } + } + } + } + } + end { + Test-DbaDeprecation -DeprecatedOn "1.0.0" -EnableException:$false -Alias Get-DbaDatabaseEncryption + } +} +function Get-DbaDbExtentDiff { + <# + .SYNOPSIS + What percentage of a database has changed since the last full backup + + .DESCRIPTION + This is only an implementation of the script created by Paul S. Randal to find what percentage of a database has changed since the last full backup. + https://www.sqlskills.com/blogs/paul/new-script-how-much-of-the-database-has-changed-since-the-last-full-backup/ + + .PARAMETER SqlInstance + The target SQL Server instance + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Database + The database(s) to process - this list is auto-populated from the server. If unspecified, all databases will be processed. + + .PARAMETER ExcludeDatabase + The database(s) to exclude - this list is auto-populated from the server + + .PARAMETER WhatIf + Shows what would happen if the command were to run. No actions are actually performed. + + .PARAMETER Confirm + Prompts you for confirmation before executing any changing operations within the command. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Backup, Database + Author: Viorel Ciucu, cviorel.com + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: GNU GPL v3 https://opensource.org/licenses/GPL-3.0 + + .LINK + http://dbatools.io/Get-DbaDbExtentDiff + + .EXAMPLE + PS C:\> Get-DbaDbExtentDiff -SqlInstance SQL2016 -Database DBA + + Get the changes for the DBA database. + + .EXAMPLE + PS C:\> $Cred = Get-Credential sqladmin + PS C:\> Get-DbaDbExtentDiff -SqlInstance SQL2017N1, SQL2017N2, SQL2016 -Database DB01 -SqlCredential $Cred + + Get the changes for the DB01 database on multiple servers. + + #> + [CmdletBinding()] + param ( + [parameter(Mandatory, ValueFromPipeline)] + [Alias('ServerInstance', 'SqlServer')] + [DbaInstance[]]$SqlInstance, + [PSCredential]$SqlCredential, + [object[]]$Database, + [object[]]$ExcludeDatabase, + [switch]$EnableException + ) + + begin { + $rex = [regex]':(?[\d]+)\)' + function Get-DbaExtent ([string[]]$field) { + $res = 0 + foreach ($f in $field) { + $extents = $rex.Matches($f) + if ($extents.Count -eq 1) { + $res += 1 + } else { + $pages = [int]$extents[1].Groups['extent'].Value - [int]$extents[0].Groups['extent'].Value + $res += $pages / 8 + 1 + } + } + return $res + } + } + + process { + + foreach ($instance in $SqlInstance) { + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential -NonPooled + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + $dbs = $server.Databases + + if ($Database) { + $dbs = $dbs | Where-Object Name -In $Database + } + + if ($ExcludeDatabase) { + $dbs = $dbs | Where-Object Name -NotIn $ExcludeDatabase + } + + $sourcedbs = @() + foreach ($db in $dbs) { + if ($db.IsAccessible -ne $true) { + Write-Message -Level Verbose -Message "$db is not accessible on $instance, skipping" + } else { + $sourcedbs += $db + } + } + + #Available from 2016 SP2 + if ($server.Version -ge [version]'13.0.5026') { + foreach ($db in $sourcedbs) { + $DBCCPageQueryDMV = " + SELECT + SUM(total_page_count) / 8 as [ExtentsTotal], + SUM(modified_extent_page_count) / 8 as [ExtentsChanged], + 100.0 * SUM(modified_extent_page_count)/SUM(total_page_count) as [ChangedPerc] + FROM sys.dm_db_file_space_usage + " + $DBCCPageResults = $server.Query($DBCCPageQueryDMV, $db.Name) + [pscustomobject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + DatabaseName = $db.Name + ExtentsTotal = $DBCCPageResults.ExtentsTotal + ExtentsChanged = $DBCCPageResults.ExtentsChanged + ChangedPerc = [math]::Round($DBCCPageResults.ChangedPerc, 2) + } + } + } else { + $MasterFilesQuery = " + SELECT [file_id], [size], database_id, db_name(database_id) as dbname FROM master.sys.master_files + WHERE [type_desc] = N'ROWS' + " + $MasterFiles = $server.Query($MasterFilesQuery) + $MasterFiles = $MasterFiles | Where-Object dbname -In $sourcedbs.Name + $MasterFilesGrouped = $MasterFiles | Group-Object -Property dbname + + foreach ($db in $MasterFilesGrouped) { + $sizeTotal = 0 + $dbExtents = @() + foreach ($results in $db.Group) { + $extentID = 0 + $sizeTotal = $sizeTotal + $results.size / 8 + while ($extentID -lt $results.size) { + $pageID = $extentID + 6 + $DBCCPageQuery = "DBCC PAGE ('$($results.dbname)', $($results.file_id), $pageID, 3) WITH TABLERESULTS, NO_INFOMSGS" + $DBCCPageResults = $server.Query($DBCCPageQuery) + $dbExtents += $DBCCPageResults | Where-Object { $_.VALUE -eq ' CHANGED' -And $_.ParentObject -like 'DIFF_MAP*'} + $extentID = $extentID + 511232 + } + } + $extents = Get-DbaExtent $dbExtents.Field + [pscustomobject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + DatabaseName = $db.Name + ExtentsTotal = $sizeTotal + ExtentsChanged = $extents + ChangedPerc = [math]::Round(($extents / $sizeTotal * 100), 2) + } + } + } + } + } +} +function Get-DbaDbFeatureUsage { + <# + .SYNOPSIS + Shows features that are enabled in the database but not supported on all editions of SQL Server. Basically checks for Enterprise feature usage. + + .DESCRIPTION + Shows features that are enabled in the database but not supported on all editions of SQL Server. + + Basically checks for Enterprise feature usage. + + This feature must be removed before the database can be migrated to all available editions of SQL Server. + + .PARAMETER SqlInstance + The target SQL Server instance + + .PARAMETER SqlCredential + Login to the target instance using alternate Windows or SQL Login Authentication. Accepts credential objects (Get-Credential). + + .PARAMETER Database + The database(s) to process - this list is auto-populated from the server. If unspecified, all databases will be processed. + + .PARAMETER ExcludeDatabase + The database(s) to exclude - this list is auto-populated from the server + + .PARAMETER InputObject + A collection of databases (such as returned by Get-DbaDatabase), to be tested. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Deprecated + Author: Brandon Abshire, netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaDbFeatureUsage + + .EXAMPLE + PS C:\> Get-DbaDatabase -SqlInstance sql2008 -Database testdb, db2 | Get-DbaDbFeatureUsage + + Shows features that are enabled in the testdb and db2 databases but + not supported on the all the editions of SQL Server. + + #> + [CmdletBinding()] + param ( + [Alias("ServerInstance", "SqlServer", "SqlServers")] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [string[]]$Database, + [string[]]$ExcludeDatabase, + [parameter(ValueFromPipeline)] + [Microsoft.SqlServer.Management.Smo.Database[]]$InputObject, + [switch]$EnableException + ) + + begin { + $sql = "SELECT SERVERPROPERTY('MachineName') AS ComputerName, + ISNULL(SERVERPROPERTY('InstanceName'), 'MSSQLSERVER') AS InstanceName, + SERVERPROPERTY('ServerName') AS SqlInstance, feature_id as Id, + feature_name as Feature, DB_NAME() as [Database] FROM sys.dm_db_persisted_sku_features" + } + + process { + foreach ($instance in $SqlInstance) { + $InputObject += Get-DbaDatabase -SqlInstance $instance -SqlCredential $SqlCredential -Database $Database -ExcludeDatabase $ExcludeDatabase + } + foreach ($db in $InputObject) { + Write-Message -Level Verbose -Message "Processing $db on $($db.Parent.Name)" + + if ($db.IsAccessible -eq $false) { + Stop-Function -Message "The database $db is not accessible. Skipping database." -Continue + } + + try { + $db.Query($sql) + } catch { + Stop-Function -Message "Failure" -ErrorRecord $_ -Continue + } + } + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function Get-DbaDbFile { + <# + .SYNOPSIS + Returns detailed information about database files. + + .DESCRIPTION + Returns detailed information about database files. Does not use SMO - SMO causes enumeration and this command avoids that. + + .PARAMETER SqlInstance + The target SQL Server instance or instances + + .PARAMETER SqlCredential + Credentials to connect to the SQL Server instance if the calling user doesn't have permission + + .PARAMETER Database + The database(s) to process - this list is auto-populated from the server. If unspecified, all databases will be processed. + + .PARAMETER ExcludeDatabase + The database(s) to exclude - this list is auto-populated from the server + + .PARAMETER InputObject + A piped collection of database objects + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Database + Author: Stuart Moore (@napalmgram), stuart-moore.com + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .EXAMPLE + PS C:\> Get-DbaDbFile -SqlInstance sql2016 + + Will return an object containing all file groups and their contained files for every database on the sql2016 SQL Server instance + + .EXAMPLE + PS C:\> Get-DbaDbFile -SqlInstance sql2016 -Database Impromptu + + Will return an object containing all file groups and their contained files for the Impromptu Database on the sql2016 SQL Server instance + + .EXAMPLE + PS C:\> Get-DbaDbFile -SqlInstance sql2016 -Database Impromptu, Trading + + Will return an object containing all file groups and their contained files for the Impromptu and Trading databases on the sql2016 SQL Server instance + + .EXAMPLE + PS C:\> Get-DbaDatabase -SqlInstance sql2016 -Database Impromptu, Trading | Get-DbaDbFile + + Will accept piped input from Get-DbaDatabase and return an object containing all file groups and their contained files for the Impromptu and Trading databases on the sql2016 SQL Server instance + #> + [CmdletBinding()] + param ( + [parameter(ValueFromPipeline)] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [Alias("Databases")] + [object[]]$Database, + [object[]]$ExcludeDatabase, + [parameter(ValueFromPipeline)] + [Microsoft.SqlServer.Management.Smo.Database[]]$InputObject, + [switch]$EnableException + ) + begin { + #region Sql Query Generation + $sql = "select + fg.name as FileGroupName, + df.file_id as 'ID', + df.Type, + df.type_desc as TypeDescription, + df.name as LogicalName, + mf.physical_name as PhysicalName, + df.state_desc as State, + df.max_size as MaxSize, + case mf.is_percent_growth when 1 then df.growth else df.Growth*8 end as Growth, + fileproperty(df.name, 'spaceused') as UsedSpace, + df.size as Size, + vfs.size_on_disk_bytes as size_on_disk_bytes, + case df.state_desc when 'OFFLINE' then 'True' else 'False' End as IsOffline, + case mf.is_read_only when 1 then 'True' when 0 then 'False' End as IsReadOnly, + case mf.is_media_read_only when 1 then 'True' when 0 then 'False' End as IsReadOnlyMedia, + case mf.is_sparse when 1 then 'True' when 0 then 'False' End as IsSparse, + case mf.is_percent_growth when 1 then 'Percent' when 0 then 'kb' End as GrowthType, + case mf.is_read_only when 1 then 'True' when 0 then 'False' End as IsReadOnly, + vfs.num_of_writes as NumberOfDiskWrites, + vfs.num_of_reads as NumberOfDiskReads, + vfs.num_of_bytes_read as BytesReadFromDisk, + vfs.num_of_bytes_written as BytesWrittenToDisk, + fg.data_space_id as FileGroupDataSpaceId, + fg.Type as FileGroupType, + fg.type_desc as FileGroupTypeDescription, + case fg.is_default When 1 then 'True' when 0 then 'False' end as FileGroupDefault, + fg.is_read_only as FileGroupReadOnly" + + $sqlfrom = "from sys.database_files df + left outer join sys.filegroups fg on df.data_space_id=fg.data_space_id + inner join sys.dm_io_virtual_file_stats(db_id(),NULL) vfs on df.file_id=vfs.file_id + inner join sys.master_files mf on df.file_id = mf.file_id + and mf.database_id = db_id()" + + $sql2008 = ",vs.available_bytes as 'VolumeFreeSpace'" + $sql2008from = "cross apply sys.dm_os_volume_stats(db_id(),df.file_id) vs" + + $sql2000 = "select + fg.groupname as FileGroupName, + df.fileid as ID, + CONVERT(INT,df.status & 0x40) / 64 as Type, + case CONVERT(INT,df.status & 0x40) / 64 when 1 then 'LOG' else 'ROWS' end as TypeDescription, + df.name as LogicalName, + df.filename as PhysicalName, + 'Existing' as State, + df.maxsize as MaxSize, + case CONVERT(INT,df.status & 0x100000) / 1048576 when 1 then df.growth when 0 then df.growth*8 End as Growth, + fileproperty(df.name, 'spaceused') as UsedSpace, + df.size as Size, + case CONVERT(INT,df.status & 0x20000000) / 536870912 when 1 then 'True' else 'False' End as IsOffline, + case CONVERT(INT,df.status & 0x10) / 16 when 1 then 'True' when 0 then 'False' End as IsReadOnly, + case CONVERT(INT,df.status & 0x1000) / 4096 when 1 then 'True' when 0 then 'False' End as IsReadOnlyMedia, + case CONVERT(INT,df.status & 0x10000000) / 268435456 when 1 then 'True' when 0 then 'False' End as IsSparse, + case CONVERT(INT,df.status & 0x100000) / 1048576 when 1 then 'Percent' when 0 then 'kb' End as GrowthType, + case CONVERT(INT,df.status & 0x1000) / 4096 when 1 then 'True' when 0 then 'False' End as IsReadOnly, + fg.groupid as FileGroupDataSpaceId, + NULL as FileGroupType, + NULL AS FileGroupTypeDescription, + CAST(fg.status & 0x10 as BIT) as FileGroupDefault, + CAST(fg.status & 0x8 as BIT) as FileGroupReadOnly + from sysfiles df + left outer join sysfilegroups fg on df.groupid=fg.groupid" + #endregion Sql Query Generation + } + + process { + if ($SqlInstance) { + $InputObject += Get-DbaDatabase -SqlInstance $SqlInstance -SqlCredential $SqlCredential -Database $Database -ExcludeDatabase $ExcludeDatabase + } + + foreach ($db in $InputObject) { + $server = $db.Parent + + Write-Message -Level Verbose -Message "Querying database $db" + + try { + $version = $server.Query("SELECT compatibility_level FROM sys.databases WHERE name = '$($db.Name)'") + $version = [int]($version.compatibility_level / 10) + } catch { + $version = 8 + } + + if ($version -ge 11) { + $query = ($sql, $sql2008, $sqlfrom, $sql2008from) -Join "`n" + } elseif ($version -ge 9) { + $query = ($sql, $sqlfrom) -Join "`n" + } else { + $query = $sql2000 + } + + Write-Message -Level Debug -Message "SQL Statement: $query" + + try { + $results = $server.Query($query, $db.Name) + } catch { + Stop-Function -Message "Failure" -ErrorRecord $_ -Continue + } + + foreach ($result in $results) { + $size = [dbasize]($result.Size * 8192) + $usedspace = [dbasize]($result.UsedSpace * 8192) + $maxsize = $result.MaxSize + # calculation is done here because for snapshots or sparse files size is not the "virtual" size + # (master_files.Size) but the currently allocated one (dm_io_virtual_file_stats.size_on_disk_bytes) + $AvailableSpace = $size - $usedspace + if ($result.size_on_disk_bytes) { + $size = [dbasize]($result.size_on_disk_bytes) + } + if ($maxsize -gt -1) { + $maxsize = [dbasize]($result.MaxSize * 8192) + } else { + $maxsize = [dbasize]($result.MaxSize) + } + + if ($result.VolumeFreeSpace) { + $VolumeFreeSpace = [dbasize]$result.VolumeFreeSpace + } else { + # to get drive free space for each drive that a database has files on + # when database compatibility lower than 110. Lets do this with query2 + $query2 = @' +-- to get drive free space for each drive that a database has files on +DECLARE @FixedDrives TABLE(Drive CHAR(1), MB_Free BIGINT); +INSERT @FixedDrives EXEC sys.xp_fixeddrives; + +SELECT DISTINCT fd.MB_Free, LEFT(df.physical_name, 1) AS [Drive] +FROM @FixedDrives AS fd +INNER JOIN sys.database_files AS df +ON fd.Drive = LEFT(df.physical_name, 1); +'@ + # if the server has one drive xp_fixeddrives returns one row, but we still need $disks to be an array. + if ($server.VersionMajor -gt 8) { + $disks = @($server.Query($query2, $db.Name)) + $MbFreeColName = $disks[0].psobject.Properties.Name + # get the free MB value for the drive in question + $free = $disks | Where-Object { + $_.drive -eq $result.PhysicalName.Substring(0, 1) + } | Select-Object $MbFreeColName + + $VolumeFreeSpace = [dbasize](($free.MB_Free) * 1024 * 1024) + } + } + if ($result.GrowthType -eq "Percent") { + $nextgrowtheventadd = [dbasize]($result.size * 8 * ($result.Growth * 0.01) * 1024) + } else { + $nextgrowtheventadd = [dbasize]($result.Growth * 1024) + } + if (($nextgrowtheventadd.Byte -gt ($MaxSize.Byte - $size.Byte)) -and $maxsize -gt 0) { + [dbasize]$nextgrowtheventadd = 0 + } + + [PSCustomObject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + Database = $db.name + FileGroupName = $result.FileGroupName + ID = $result.ID + Type = $result.Type + TypeDescription = $result.TypeDescription + LogicalName = $result.LogicalName.Trim() + PhysicalName = $result.PhysicalName.Trim() + State = $result.State + MaxSize = $maxsize + Growth = $result.Growth + GrowthType = $result.GrowthType + NextGrowthEventSize = $nextgrowtheventadd + Size = $size + UsedSpace = $usedspace + AvailableSpace = $AvailableSpace + IsOffline = $result.IsOffline + IsReadOnly = $result.IsReadOnly + IsReadOnlyMedia = $result.IsReadOnlyMedia + IsSparse = $result.IsSparse + NumberOfDiskWrites = $result.NumberOfDiskWrites + NumberOfDiskReads = $result.NumberOfDiskReads + ReadFromDisk = [dbasize]$result.BytesReadFromDisk + WrittenToDisk = [dbasize]$result.BytesWrittenToDisk + VolumeFreeSpace = $VolumeFreeSpace + FileGroupDataSpaceId = $result.FileGroupDataSpaceId + FileGroupType = $result.FileGroupType + FileGroupTypeDescription = $result.FileGroupTypeDescription + FileGroupDefault = $result.FileGroupDefault + FileGroupReadOnly = $result.FileGroupReadOnly + } + } + } + } + end { + Test-DbaDeprecation -DeprecatedOn "1.0.0" -EnableException:$false -Alias Get-DbaDatabaseFIle + } +} +function Get-DbaDbForeignKey { + <# + .SYNOPSIS + Gets database Foreign Keys. + + .DESCRIPTION + Gets database Foreign Keys. + + .PARAMETER SqlInstance + The target SQL Server instance or instances + + .PARAMETER SqlCredential + Allows you to login to SQL Server using alternative credentials + + .PARAMETER Database + To get Foreign Keys from specific database(s) + + .PARAMETER ExcludeDatabase + The database(s) to exclude - this list is auto populated from the server + + .PARAMETER ExcludeSystemTable + This switch removes all system objects from the tables collection + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Database,ForeignKey, Table + Author: Claudio Silva (@ClaudioESSilva), https://claudioessilva.eu + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .EXAMPLE + PS C:\> Get-DbaDbForeignKey -SqlInstance sql2016 + + Gets all database Foreign Keys. + + .EXAMPLE + PS C:\> Get-DbaDbForeignKey -SqlInstance Server1 -Database db1 + + Gets the Foreign Keys for the db1 database. + + .EXAMPLE + PS C:\> Get-DbaDbForeignKey -SqlInstance Server1 -ExcludeDatabase db1 + + Gets the Foreign Keys for all databases except db1. + + .EXAMPLE + PS C:\> Get-DbaDbForeignKey -SqlInstance Server1 -ExcludeSystemTable + + Gets the Foreign Keys from all tables that are not system objects from all databases. + + .EXAMPLE + PS C:\> 'Sql1','Sql2/sqlexpress' | Get-DbaDbForeignKey + + Gets the Foreign Keys for the databases on Sql1 and Sql2/sqlexpress. + + #> + [CmdletBinding()] + param ( + [parameter(Mandatory, ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [object[]]$Database, + [object[]]$ExcludeDatabase, + [switch]$ExcludeSystemTable, + [Alias('Silent')] + [switch]$EnableException + ) + + process { + foreach ($instance in $SqlInstance) { + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $sqlcredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + $databases = $server.Databases | Where-Object IsAccessible + + if ($Database) { + $databases = $databases | Where-Object Name -In $Database + } + if ($ExcludeDatabase) { + $databases = $databases | Where-Object Name -NotIn $ExcludeDatabase + } + + foreach ($db in $databases) { + if (!$db.IsAccessible) { + Write-Message -Level Warning -Message "Database $db is not accessible. Skipping." + continue + } + + foreach ($tbl in $db.Tables) { + if ( (Test-Bound -ParameterName ExcludeSystemTable) -and $tbl.IsSystemObject ) { + continue + } + + if ($tbl.ForeignKeys.Count -eq 0) { + Write-Message -Message "No Foreign Keys exist in $tbl table on the $db database on $instance" -Target $tbl -Level Verbose + continue + } + + foreach ($fk in $tbl.ForeignKeys) { + Add-Member -Force -InputObject $fk -MemberType NoteProperty -Name ComputerName -value $server.ComputerName + Add-Member -Force -InputObject $fk -MemberType NoteProperty -Name InstanceName -value $server.ServiceName + Add-Member -Force -InputObject $fk -MemberType NoteProperty -Name SqlInstance -value $server.DomainInstanceName + Add-Member -Force -InputObject $fk -MemberType NoteProperty -Name Database -value $db.Name + + $defaults = 'ComputerName', 'InstanceName', 'SqlInstance', 'Database', 'Table', 'ID', 'CreateDate', + 'DateLastModified', 'Name', 'IsEnabled', 'IsChecked', 'NotForReplication', 'ReferencedKey', 'ReferencedTable', 'ReferencedTableSchema' + Select-DefaultView -InputObject $fk -Property $defaults + } + } + } + } + } +} +function Get-DbaDbIdentity { + <# + .SYNOPSIS + Checks the current identity value via DBCC CHECKIDENT with NORESEED optuin + + .DESCRIPTION + Use the command DBCC CHECKIDENT with NORESEED option to checks the current identity value of a table and return results + + Read more: + - https://docs.microsoft.com/en-us/sql/t-sql/database-console-commands/dbcc-checkident-transact-sql + + .PARAMETER SqlInstance + The target SQL Server instance or instances. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Database + The database(s) to process - this list is auto-populated from the server. If unspecified, all databases will be processed. + + .PARAMETER Table + The table(s) for which to check the current identity value. + + .PARAMETER WhatIf + Shows what would happen if the cmdlet runs. The cmdlet is not run. + + .PARAMETER Confirm + Prompts you for confirmation before running the cmdlet. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: DBCC + Author: Patrick Flynn (@sqllensman) + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaDbIdentity + + .EXAMPLE + PS C:\> Get-DbaDbIdentity -SqlInstance SQLServer2017 -Database AdventureWorks2014 -Table 'Production.ScrapReason' + + Connects to AdventureWorks2014 on instance SqlServer2017 using Windows Authentication and runs the command DBCC CHECKIDENT('Production.ScrapReason', NORESEED) to return the current identity value. + + .EXAMPLE + PS C:\> $cred = Get-Credential sqladmin + PS C:\> 'Sql1','Sql2/sqlexpress' | Get-DbaDbIdentity -SqlCredential $cred -Database AdventureWorks2014 -Table 'Production.ScrapReason' + + Connects to AdventureWorks2014 on instances Sql1 and Sql2/sqlexpress using sqladmin credential and runs the command DBCC CHECKIDENT('Production.ScrapReason', NORESEED) to return the current identity value. + + .EXAMPLE + PS C:\> $query = "Select Quotename(Schema_Name(t.schema_id)) +'.' + QuoteName(t.name) as TableName from sys.columns c INNER JOIN sys.tables t on t.object_id = c.object_id WHERE is_identity = 1 and is_memory_optimized = 0" + PS C:\> $IdentityTables = Invoke-DbaQuery -SqlInstance SQLServer2017 -Database AdventureWorks2014 -Query $query -As SingleValue + PS C:\> Get-DbaDbIdentity -SqlInstance SQLServer2017 -Database AdventureWorks2014 -Table $IdentityTables + + Checks the current identity value for all non memory optimized tables with an Identity in the AdventureWorks2014 database on the SQLServer2017 instance. + #> + [CmdletBinding(SupportsShouldProcess, ConfirmImpact = 'Low')] + param ( + [parameter(Mandatory, ValueFromPipeline)] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [string[]]$Database, + [string[]]$Table, + [switch]$EnableException + ) + begin { + $stringBuilder = New-Object System.Text.StringBuilder + $null = $stringBuilder.Append("DBCC CHECKIDENT(#options#, NORESEED)") + } + process { + if (Test-Bound -Not -ParameterName Table) { + Stop-Function -Message "You must specify a table to execute against using -Table" + return + } + foreach ($instance in $SqlInstance) { + Write-Message -Message "Attempting Connection to $instance" -Level Verbose + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + $dbs = $server.Databases + + if ($Database) { + $dbs = $dbs | Where-Object Name -In $Database + } + + foreach ($db in $dbs) { + Write-Message -Level Verbose -Message "Processing $db on $instance" + + if ($db.IsAccessible -eq $false) { + Stop-Function -Message "The database $db is not accessible. Skipping." -Continue + } + + foreach ($tbl in $Table) { + try { + $query = $StringBuilder.ToString() + $query = $query.Replace('#options#', "'$($tbl)'") + + if ($Pscmdlet.ShouldProcess($server.Name, "Execute the command $query against $instance")) { + Write-Message -Message "Query to run: $query" -Level Verbose + $results = $server | Invoke-DbaQuery -Query $query -Database $db.Name -MessagesToOutput + if ($null -ne $results) { + $words = $results.Split(" ") + $identityValue = $words[6].Replace("'", "").Replace(",", "") + $columnValue = $words[10].Replace("'", "").Replace(".", "") + } else { + $identityValue = $null + $columnValue = $null + } + } + } catch { + Stop-Function -Message "Error running $query against $db" -Target $instance -ErrorRecord $_ -Exception $_.Exception -Continue + } + if ($Pscmdlet.ShouldProcess("console", "Outputting object")) { + [PSCustomObject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + Database = $db.Name + Table = $tbl + Cmd = $query.ToString() + IdentityValue = $identityValue + ColumnValue = $columnValue + Output = $results + } + } + } + } + } + } +} +function Get-DbaDbLogShipError { + <# + .SYNOPSIS + Get-DbaDbLogShipError returns all the log shipping errors that occurred + + .DESCRIPTION + When your log shipping fails it's sometimes hard to see why is fails. + Using this function you'll be able to find out what went wrong in a short amount of time. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. You must have sysadmin access and server version must be SQL Server version 2000 or greater. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Database + Allows you to filter the results to only return the databases you're interested in. This can be one or more values separated by commas. + This is not a wildcard and should be the exact database name. See examples for more info. + + .PARAMETER ExcludeDatabase + Allows you to filter the results to only return the databases you're not interested in. This can be one or more values separated by commas. + This is not a wildcard and should be the exact database name. + + .PARAMETER Action + Filter to get the log shipping action that has occurred like Backup, Copy, Restore. + By default all the actions are returned. + + .PARAMETER DateTimeFrom + Filter the results based on the date starting from datetime X + + .PARAMETER DateTimeTo + Filter the results based on the date ending with datetime X + + .PARAMETER Primary + Allows to filter the results to only return values that apply to the primary instance. + + .PARAMETER Secondary + Allows to filter the results to only return values that apply to the secondary instance. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: LogShipping + Author: Sander Stad (@sqlstad), sqlstad.nl + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaDbLogShipError + + .EXAMPLE + PS C:\> Get-DbaDbLogShipError -SqlInstance sql1 + + Get all the log shipping errors that occurred + + .EXAMPLE + PS C:\> Get-DbaDbLogShipError -SqlInstance sql1 -Action Backup + + Get the errors that have something to do with the backup of the databases + + .EXAMPLE + PS C:\> Get-DbaDbLogShipError -SqlInstance sql1 -Secondary + + Get the errors that occurred on the secondary instance. + This will return the copy of the restore actions because those only occur on the secondary instance + + .EXAMPLE + PS C:\> Get-DbaDbLogShipError -SqlInstance sql1 -DateTimeFrom "01/05/2018" + + Get the errors that have occurred from "01/05/2018". This can also be of format "yyyy-MM-dd" + + .EXAMPLE + PS C:\> Get-DbaDbLogShipError -SqlInstance sql1 -Secondary -DateTimeFrom "01/05/2018" -DateTimeTo "2018-01-07" + + Get the errors that have occurred between "01/05/2018" and "01/07/2018". + See that is doesn't matter how the date is represented. + + #> + [CmdletBinding()] + param ( + [parameter(Mandatory, ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [string[]]$Database, + [string[]]$ExcludeDatabase, + [ValidateSet("Backup", "Copy", "Restore")] + [string[]]$Action, + [datetime]$DateTimeFrom, + [datetime]$DateTimeTo, + [switch]$Primary, + [switch]$Secondary, + [Alias('Silent')] + [switch]$EnableException + ) + process { + foreach ($instance in $sqlinstance) { + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential -MinimumVersion 9 + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + if ($server.EngineEdition -match "Express") { + Write-Message -Level Warning -Message "$instance is Express Edition which does not support Log Shipping" + continue + } + + $query = " +CREATE TABLE #DatabaseID +( + DatabaseName VARCHAR(128), + DatabaseID UNIQUEIDENTIFIER, + Instance VARCHAR(20) +); + +INSERT INTO #DatabaseID +( + DatabaseName, + DatabaseID, + Instance +) +SELECT secondary_database, + secondary_id, + 'Secondary' +FROM msdb.dbo.log_shipping_secondary_databases; + + +INSERT INTO #DatabaseID +( + DatabaseName, + DatabaseID, + Instance +) +SELECT primary_database, + primary_id, + 'Primary' +FROM msdb.dbo.log_shipping_primary_databases; + + +SELECT di.DatabaseName, + di.Instance, + CASE lsmed.[agent_type] + WHEN 0 THEN + 'Backup' + WHEN 1 THEN + 'Copy' + WHEN 2 THEN + 'Restore' + ELSE + '' + END AS [Action], + lsmed.[session_id] AS SessionID, + lsmed.[sequence_number] AS SequenceNumber, + lsmed.[log_time] AS LogTime, + lsmed.[message] AS [Message] +FROM msdb.dbo.log_shipping_monitor_error_detail AS lsmed + INNER JOIN #DatabaseID AS di + ON di.DatabaseID = lsmed.agent_id +ORDER BY lsmed.[log_time], + lsmed.[database_name], + lsmed.[agent_type], + lsmed.[session_id], + lsmed.[sequence_number]; + +DROP TABLE #DatabaseID;" + + # Get the log shipping errors + $results = $server.Query($query) + + if ($results.Count -ge 1) { + + # Filter the results + if ($Database) { + $results = $results | Where-Object { $_.DatabaseName -in $Database } + } + + if ($Action) { + $results = $results | Where-Object { $_.Action -in $Action } + } + + if ($DateTimeFrom) { + $results = $results | Where-Object { $_.Logtime -ge $DateTimeFrom } + } + + if ($DateTimeTo) { + $results = $results | Where-Object { $_.Logtime -le $DateTimeTo } + } + + if ($Primary) { + $results = $results | Where-Object { $_.Instance -eq 'Primary' } + } + + if ($Secondary) { + $results = $results | Where-Object { $_.Instance -eq 'Secondary' } + } + + foreach ($result in $results) { + [PSCustomObject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + Database = $result.DatabaseName + Instance = $result.Instance + Action = $result.Action + SessionID = $result.SessionID + SequenceNumber = $result.SequenceNumber + LogTime = $result.LogTime + Message = $result.Message + } + + } + } else { + Write-Message -Message "No log shipping errors found" -Level Verbose + } + } + } + end { + Test-DbaDeprecation -DeprecatedOn "1.0.0" -Alias Get-DbaLogShippingError + } +} +function Get-DbaDbMail { + <# + .SYNOPSIS + Gets the database mail from SQL Server + + .DESCRIPTION + Gets the database mail from SQL Server + + .PARAMETER SqlInstance + TThe target SQL Server instance or instances. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: DatabaseMail, DBMail, Mail + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaDbMail + + .EXAMPLE + PS C:\> Get-DbaDbMail -SqlInstance sql01\sharepoint + + Returns the db mail server object on sql01\sharepoint + + .EXAMPLE + PS C:\> Get-DbaDbMail -SqlInstance sql01\sharepoint | Select * + + Returns the db mail server object on sql01\sharepoint then return a bunch more columns + + .EXAMPLE + PS C:\> $servers = "sql2014","sql2016", "sqlcluster\sharepoint" + PS C:\> $servers | Get-DbaDbMail + + Returns the db mail server object for "sql2014","sql2016" and "sqlcluster\sharepoint" + + #> + [CmdletBinding()] + param ( + [Parameter(ValueFromPipeline, Mandatory)] + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [Alias("Credential")] + [PSCredential]$SqlCredential, + [switch]$EnableException + ) + process { + foreach ($instance in $SqlInstance) { + + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential + } catch { + Stop-Function -Message "Failure" -Category Connectiondbmail -dbmailRecord $_ -Target $instance -Continue + } + + try { + $mailserver = $server.Mail + Add-Member -Force -InputObject $mailserver -MemberType NoteProperty -Name ComputerName -value $server.ComputerName + Add-Member -Force -InputObject $mailserver -MemberType NoteProperty -Name InstanceName -value $server.ServiceName + Add-Member -Force -InputObject $mailserver -MemberType NoteProperty -Name SqlInstance -value $server.DomainInstanceName + $mailserver | Select-DefaultView -Property ComputerName, InstanceName, SqlInstance, Profiles, Accounts, ConfigurationValues, Properties + } catch { + Stop-Function -Message "Failure" -ErrorRecord $_ -Continue + } + } + } +} +function Get-DbaDbMailAccount { + <# + .SYNOPSIS + Gets database mail accounts from SQL Server + + .DESCRIPTION + Gets database mail accounts from SQL Server + + .PARAMETER SqlInstance + The target SQL Server instance or instances. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Account + Specifies one or more account(s) to get. If unspecified, all accounts will be returned. + + .PARAMETER ExcludeAccount + Specifies one or more account(s) to exclude. + + .PARAMETER InputObject + Accepts pipeline input from Get-DbaDbMail + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: DatabaseMail, DbMail, Mail + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MITIT + + .LINK + https://dbatools.io/Get-DbaDbMailAccount + + .EXAMPLE + PS C:\> Get-DbaDbMailAccount -SqlInstance sql01\sharepoint + + Returns Database Mail accounts on sql01\sharepoint + + .EXAMPLE + PS C:\> Get-DbaDbMailAccount -SqlInstance sql01\sharepoint -Account 'The DBA Team' + + Returns The DBA Team Database Mail account from sql01\sharepoint + + .EXAMPLE + PS C:\> Get-DbaDbMailAccount -SqlInstance sql01\sharepoint | Select * + + Returns the Database Mail accounts on sql01\sharepoint then return a bunch more columns + + .EXAMPLE + PS C:\> $servers = "sql2014","sql2016", "sqlcluster\sharepoint" + PS C:\> $servers | Get-DbaDbMail | Get-DbaDbMailAccount + + Returns the Database Mail accounts for "sql2014","sql2016" and "sqlcluster\sharepoint" + + #> + [CmdletBinding()] + param ( + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [Alias("Credential")] + [PSCredential]$SqlCredential, + [string[]]$Account, + [string[]]$ExcludeAccount, + [Parameter(ValueFromPipeline)] + [Microsoft.SqlServer.Management.Smo.Mail.SqlMail[]]$InputObject, + [switch]$EnableException + ) + process { + foreach ($instance in $SqlInstance) { + $InputObject += Get-DbaDbMail -SqlInstance $SqlInstance -SqlCredential $SqlCredential + } + + if (-not $InputObject) { + Stop-Function -Message "No servers to process" + return + } + + foreach ($mailserver in $InputObject) { + try { + $accounts = $mailserver.Accounts + + if ($Account) { + $accounts = $accounts | Where-Object Name -in $Account + } + + If ($ExcludeAccount) { + $accounts = $accounts | Where-Object Name -notin $ExcludeAccount + } + + $accounts | Add-Member -Force -MemberType NoteProperty -Name ComputerName -value $mailserver.ComputerName + $accounts | Add-Member -Force -MemberType NoteProperty -Name InstanceName -value $mailserver.InstanceName + $accounts | Add-Member -Force -MemberType NoteProperty -Name SqlInstance -value $mailserver.SqlInstance + $accounts | Select-DefaultView -Property ComputerName, InstanceName, SqlInstance, ID, Name, DisplayName, Description, EmailAddress, ReplyToAddress, IsBusyAccount, MailServers + } catch { + Stop-Function -Message "Failure" -ErrorRecord $_ -Continue + } + } + } +} +function Get-DbaDbMailConfig { + <# + .SYNOPSIS + Gets database mail configs from SQL Server + + .DESCRIPTION + Gets database mail configs from SQL Server + + .PARAMETER SqlInstance + TThe target SQL Server instance or instances. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Name + Specifies one or more config(s) to get. If unspecified, all configs will be returned. + + .PARAMETER InputObject + Accepts pipeline input from Get-DbaDbMail + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: DatabaseMail, DBMail, Mail + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaDbMailConfig + + .EXAMPLE + PS C:\> Get-DbaDbMailConfig -SqlInstance sql01\sharepoint + + Returns DBMail configs on sql01\sharepoint + + .EXAMPLE + PS C:\> Get-DbaDbMailConfig -SqlInstance sql01\sharepoint -Name ProhibitedExtensions + + Returns the ProhibitedExtensions configuration on sql01\sharepoint + + .EXAMPLE + PS C:\> Get-DbaDbMailConfig -SqlInstance sql01\sharepoint | Select * + + Returns the DBMail configs on sql01\sharepoint then return a bunch more columns + + .EXAMPLE + PS C:\> $servers = "sql2014","sql2016", "sqlcluster\sharepoint" + PS C:\> $servers | Get-DbaDbMail | Get-DbaDbMailConfig + + Returns the DBMail configs for "sql2014","sql2016" and "sqlcluster\sharepoint" + + #> + [CmdletBinding()] + param ( + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [Alias("Credential")] + [PSCredential]$SqlCredential, + [Alias("Config", "ConfigName")] + [string[]]$Name, + [Parameter(ValueFromPipeline)] + [Microsoft.SqlServer.Management.Smo.Mail.SqlMail[]]$InputObject, + [switch]$EnableException + ) + process { + foreach ($instance in $SqlInstance) { + $InputObject += Get-DbaDbMail -SqlInstance $SqlInstance -SqlCredential $SqlCredential + } + + if (-not $InputObject) { + Stop-Function -Message "No servers to process" + return + } + + foreach ($mailserver in $InputObject) { + try { + $configs = $mailserver.ConfigurationValues + + if ($Name) { + $configs = $configs | Where-Object Name -in $Name + } + + $configs | Add-Member -Force -MemberType NoteProperty -Name ComputerName -value $mailserver.ComputerName + $configs | Add-Member -Force -MemberType NoteProperty -Name InstanceName -value $mailserver.InstanceName + $configs | Add-Member -Force -MemberType NoteProperty -Name SqlInstance -value $mailserver.SqlInstance + $configs | Select-DefaultView -Property ComputerName, InstanceName, SqlInstance, Name, Value, Description + } catch { + Stop-Function -Message "Failure" -ErrorRecord $_ -Continue + } + } + } +} +function Get-DbaDbMailHistory { + <# + .SYNOPSIS + Gets the history of mail sent from a SQL instance + + .DESCRIPTION + Gets the history of mail sent from a SQL instance + + .PARAMETER SqlInstance + TThe target SQL Server instance or instances. + + .PARAMETER SqlCredential + Allows you to login to servers using SQL Logins as opposed to Windows Auth/Integrated/Trusted. + + .PARAMETER Since + Datetime object used to narrow the results to the send request date + + .PARAMETER Status + Narrow the results by status. Valid values include Unsent, Sent, Failed and Retrying + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: DatabaseMail, DBMail, Mail + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaDbMailHistory + + .EXAMPLE + PS C:\> Get-DbaDbMailHistory -SqlInstance sql01\sharepoint + + Returns the entire DBMail history on sql01\sharepoint + + .EXAMPLE + PS C:\> Get-DbaDbMailHistory -SqlInstance sql01\sharepoint | Select * + + Returns the entire DBMail history on sql01\sharepoint then return a bunch more columns + + .EXAMPLE + PS C:\> $servers = "sql2014","sql2016", "sqlcluster\sharepoint" + PS C:\> $servers | Get-DbaDbMailHistory + + Returns the all DBMail history for "sql2014","sql2016" and "sqlcluster\sharepoint" + + #> + [CmdletBinding()] + param ( + [Parameter(ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [Alias("Credential")] + [PSCredential] + $SqlCredential, + [DateTime]$Since, + [ValidateSet('Unsent', 'Sent', 'Failed', 'Retrying')] + [string]$Status, + [Alias('Silent')] + [switch]$EnableException + ) + process { + foreach ($instance in $SqlInstance) { + + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential + } catch { + Stop-Function -Message "Failure" -Category Connectiondbmail -dbmailRecord $_ -Target $instance -Continue + } + + $sql = "SELECT SERVERPROPERTY('MachineName') AS ComputerName, + ISNULL(SERVERPROPERTY('InstanceName'), 'MSSQLSERVER') AS InstanceName, + SERVERPROPERTY('ServerName') AS SqlInstance, + mailitem_id as MailItemId, + a.profile_id as ProfileId, + p.name as Profile, + recipients as Recipients, + copy_recipients as CopyRecipients, + blind_copy_recipients as BlindCopyRecipients, + subject as Subject, + body as Body, + body_format as BodyFormat, + importance as Importance, + sensitivity as Sensitivity, + file_attachments as FileAttachments, + attachment_encoding as AttachmentEncoding, + query as Query, + execute_query_database as ExecuteQueryDatabase, + attach_query_result_as_file as AttachQueryResultAsFile, + query_result_header as QueryResultHeader, + query_result_width as QueryResultWidth, + query_result_separator as QueryResultSeparator, + exclude_query_output as ExcludeQueryOutput, + append_query_error as AppendQueryError, + send_request_date as SendRequestDate, + send_request_user as SendRequestUser, + sent_account_id as SentAccountId, + CASE sent_status + WHEN 'unsent' THEN 'Unsent' + WHEN 'sent' THEN 'Sent' + WHEN 'failed' THEN 'Failed' + WHEN 'retrying' THEN 'Retrying' + END AS SentStatus, + sent_date as SentDate, + last_mod_date as LastModDate, + a.last_mod_user as LastModUser + from msdb.dbo.sysmail_allitems a + join msdb.dbo.sysmail_profile p + on a.profile_id = p.profile_id" + + if ($Since -or $Status) { + $wherearray = @() + + if ($Since) { + $wherearray += "send_request_date >= '$($Since.ToString("yyyy-MM-ddTHH:mm:ss"))'" + } + + if ($Status) { + $Status = $Status -join "', '" + $wherearray += "sent_status in ('$Status')" + } + + $wherearray = $wherearray -join ' and ' + $where = "where $wherearray" + $sql = "$sql $where" + } + + Write-Message -Level Debug -Message $sql + + try { + $server.Query($sql) | Select-DefaultView -Property ComputerName, InstanceName, SqlInstance, Profile, Recipients, CopyRecipients, BlindCopyRecipients, Subject, Importance, Sensitivity, FileAttachments, AttachmentEncoding, SendRequestDate, SendRequestUser, SentStatus, SentDate + } catch { + Stop-Function -Message "Query failure" -ErrorRecord $_ -Continue + } + } + } +} +function Get-DbaDbMailLog { + <# + .SYNOPSIS + Gets the DBMail log from a SQL instance + + .DESCRIPTION + Gets the DBMail log from a SQL instance + + .PARAMETER SqlInstance + TThe target SQL Server instance or instances. + + .PARAMETER SqlCredential + Allows you to login to servers using SQL Logins as opposed to Windows Auth/Integrated/Trusted. + + .PARAMETER Since + Datetime object used to narrow the results to the send request date + + .PARAMETER Type + Narrow the results by type. Valid values include Error, Warning, Success, Information, Internal + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: DatabaseMail, DBMail, Mail + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaDbMailLog + + .EXAMPLE + PS C:\> Get-DbaDbMailLog -SqlInstance sql01\sharepoint + + Returns the entire DBMail log on sql01\sharepoint + + .EXAMPLE + PS C:\> Get-DbaDbMailLog -SqlInstance sql01\sharepoint | Select * + + Returns the entire DBMail log on sql01\sharepoint, includes all returned information. + + .EXAMPLE + PS C:\> $servers = "sql2014","sql2016", "sqlcluster\sharepoint" + PS C:\> $servers | Get-DbaDbMailLog -Type Error, Information + + Returns only the Error and Information DBMail log for "sql2014","sql2016" and "sqlcluster\sharepoint" + + #> + [CmdletBinding()] + param ( + [Parameter(ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [Alias("Credential")] + [PSCredential] + $SqlCredential, + [DateTime]$Since, + [ValidateSet('Error', 'Warning', 'Success', 'Information', 'Internal')] + [string[]]$Type, + [Alias('Silent')] + [switch]$EnableException + ) + process { + foreach ($instance in $SqlInstance) { + + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential + } catch { + Stop-Function -Message "Failure" -Category Connectiondbmail -dbmailRecord $_ -Target $instance -Continue + } + + $sql = "SELECT SERVERPROPERTY('MachineName') AS ComputerName, + ISNULL(SERVERPROPERTY('InstanceName'), 'MSSQLSERVER') AS InstanceName, + SERVERPROPERTY('ServerName') AS SqlInstance, + log_id as LogId, + CASE event_type + WHEN 'error' THEN 'Error' + WHEN 'warning' THEN 'Warning' + WHEN 'information' THEN 'Information' + WHEN 'success' THEN 'Success' + WHEN 'internal' THEN 'Internal' + ELSE event_type + END as EventType, + log_date as LogDate, + REPLACE(description, CHAR(10)+')', '') as Description, + process_id as ProcessId, + mailitem_id as MailItemId, + account_id as AccountId, + last_mod_date as LastModDate, + last_mod_user as LastModUser, + last_mod_user as [Login] + FROM msdb.dbo.sysmail_event_log" + + if ($Since -or $Type) { + $wherearray = @() + + if ($Since) { + $wherearray += "log_date >= '$($Since.ToString("yyyy-MM-ddTHH:mm:ss"))'" + } + + if ($Type) { + $combinedtype = $Type -join "', '" + $wherearray += "event_type in ('$combinedtype')" + } + + $wherearray = $wherearray -join ' and ' + $where = "where $wherearray" + $sql = "$sql $where" + } + + Write-Message -Level Debug -Message $sql + + try { + $server.Query($sql) | Select-DefaultView -Property ComputerName, InstanceName, SqlInstance, LogDate, EventType, Description, Login + } catch { + Stop-Function -Message "Failure" -InnerErrorRecord $_ -Continue + } + } + } +} +function Get-DbaDbMailProfile { + <# + .SYNOPSIS + Gets database mail profiles from SQL Server + + .DESCRIPTION + Gets database mail profiles from SQL Server + + .PARAMETER SqlInstance + TThe target SQL Server instance or instances. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Profile + Specifies one or more profile(s) to get. If unspecified, all profiles will be returned. + + .PARAMETER ExcludeProfile + Specifies one or more profile(s) to exclude. + + .PARAMETER InputObject + Accepts pipeline input from Get-DbaDbMail + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: DatabaseMail, DBMail, Mail + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaDbMailProfile + + .EXAMPLE + PS C:\> Get-DbaDbMailProfile -SqlInstance sql01\sharepoint + + Returns DBMail profiles on sql01\sharepoint + + .EXAMPLE + PS C:\> Get-DbaDbMailProfile -SqlInstance sql01\sharepoint -Profile 'The DBA Team' + + Returns The DBA Team DBMail profile from sql01\sharepoint + + .EXAMPLE + PS C:\> Get-DbaDbMailProfile -SqlInstance sql01\sharepoint | Select * + + Returns the DBMail profiles on sql01\sharepoint then return a bunch more columns + + .EXAMPLE + PS C:\> $servers = "sql2014","sql2016", "sqlcluster\sharepoint" + PS C:\> $servers | Get-DbaDbMail | Get-DbaDbMailProfile + + Returns the DBMail profiles for "sql2014","sql2016" and "sqlcluster\sharepoint" + + #> + [CmdletBinding()] + param ( + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [Alias("Credential")] + [PSCredential]$SqlCredential, + [string[]]$Profile, + [string[]]$ExcludeProfile, + [Parameter(ValueFromPipeline)] + [Microsoft.SqlServer.Management.Smo.Mail.SqlMail[]]$InputObject, + [switch]$EnableException + ) + process { + foreach ($instance in $SqlInstance) { + $InputObject += Get-DbaDbMail -SqlInstance $SqlInstance -SqlCredential $SqlCredential + } + + if (-not $InputObject) { + Stop-Function -Message "No servers to process" + return + } + + foreach ($mailserver in $InputObject) { + try { + $profiles = $mailserver.Profiles + + if ($Profile) { + $profiles = $profiles | Where-Object Name -in $Profile + } + + If ($ExcludeProfile) { + $profiles = $profiles | Where-Object Name -notin $ExcludeProfile + + } + + $profiles | Add-Member -Force -MemberType NoteProperty -Name ComputerName -value $mailserver.ComputerName + $profiles | Add-Member -Force -MemberType NoteProperty -Name InstanceName -value $mailserver.InstanceName + $profiles | Add-Member -Force -MemberType NoteProperty -Name SqlInstance -value $mailserver.SqlInstance + + $profiles | Select-DefaultView -Property ComputerName, InstanceName, SqlInstance, ID, Name, Description, ForceDeleteForActiveProfiles, IsBusyProfile + } catch { + Stop-Function -Message "Failure" -ErrorRecord $_ -Continue + } + } + } +} +function Get-DbaDbMailServer { + <# + .SYNOPSIS + Gets database mail servers from SQL Server + + .DESCRIPTION + Gets database mail servers from SQL Server + + .PARAMETER SqlInstance + TThe target SQL Server instance or instances. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Server + Specifies one or more server(s) to get. If unspecified, all servers will be returned. + + .PARAMETER Account + Get only the mail server associated with specific accounts + + .PARAMETER InputObject + Accepts pipeline input from Get-DbaDbMail + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: DatabaseMail, DBMail, Mail + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaDbMailServer + + .EXAMPLE + PS C:\> Get-DbaDbMailServer -SqlInstance sql01\sharepoint + + Returns all DBMail servers on sql01\sharepoint + + .EXAMPLE + PS C:\> Get-DbaDbMailServer -SqlInstance sql01\sharepoint -Server DbaTeam + + Returns The DBA Team DBMail server from sql01\sharepoint + + .EXAMPLE + PS C:\> Get-DbaDbMailServer -SqlInstance sql01\sharepoint | Select * + + Returns the DBMail servers on sql01\sharepoint then return a bunch more columns + + .EXAMPLE + PS C:\> $servers = "sql2014","sql2016", "sqlcluster\sharepoint" + PS C:\> $servers | Get-DbaDbMail | Get-DbaDbMailServer + + Returns the DBMail servers for "sql2014","sql2016" and "sqlcluster\sharepoint" + + #> + [CmdletBinding()] + param ( + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [Alias("Credential")] + [PSCredential]$SqlCredential, + [Alias("Name")] + [string[]]$Server, + [string[]]$Account, + [Parameter(ValueFromPipeline)] + [Microsoft.SqlServer.Management.Smo.Mail.SqlMail[]]$InputObject, + [switch]$EnableException + ) + process { + foreach ($instance in $SqlInstance) { + $InputObject += Get-DbaDbMail -SqlInstance $SqlInstance -SqlCredential $SqlCredential + } + + if (-not $InputObject) { + Stop-Function -Message "No servers to process" + return + } + + foreach ($mailserver in $InputObject) { + try { + $accounts = $mailserver | Get-DbaDbMailAccount -Account $Account + $servers = $accounts.MailServers + + if ($Server) { + $servers = $servers | Where-Object Name -in $Server + } + + if ($servers) { + $servers | Add-Member -Force -MemberType NoteProperty -Name ComputerName -value $mailserver.ComputerName + $servers | Add-Member -Force -MemberType NoteProperty -Name InstanceName -value $mailserver.InstanceName + $servers | Add-Member -Force -MemberType NoteProperty -Name SqlInstance -value $mailserver.SqlInstance + $servers | Add-Member -Force -MemberType NoteProperty -Name Account -value $servers[0].Parent.Name + $servers | Select-DefaultView -Property ComputerName, InstanceName, SqlInstance, Account, Name, Port, EnableSsl, ServerType, UserName, UseDefaultCredentials, NoCredentialChange + } + } catch { + Stop-Function -Message "Failure" -ErrorRecord $_ -Continue + } + } + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function Get-DbaDbMasterKey { + <# + .SYNOPSIS + Gets specified database master key + + .DESCRIPTION + Gets specified database master key + + .PARAMETER SqlInstance + The target SQL Server instance + + .PARAMETER SqlCredential + Allows you to login to SQL Server using alternative credentials + + .PARAMETER Database + Get master key from specific database + + .PARAMETER ExcludeDatabase + The database(s) to exclude - this list is auto-populated from the server + + .PARAMETER InputObject + Database object piped in from Get-DbaDatabase + + .PARAMETER WhatIf + Shows what would happen if the command were to run. No actions are actually performed + + .PARAMETER Confirm + Prompts you for confirmation before executing any changing operations within the command + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Certificate, Database + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .EXAMPLE + PS C:\> Get-DbaDbMasterKey -SqlInstance sql2016 + + Gets all master database keys + + .EXAMPLE + PS C:\> Get-DbaDbMasterKey -SqlInstance Server1 -Database db1 + + Gets the master key for the db1 database + + #> + [CmdletBinding()] + param ( + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [string[]]$Database, + [string[]]$ExcludeDatabase, + [parameter(ValueFromPipeline)] + [Microsoft.SqlServer.Management.Smo.Database[]]$InputObject, + [switch]$EnableException + ) + + process { + if ($SqlInstance) { + $InputObject += Get-DbaDatabase -SqlInstance $SqlInstance -Database $Database -ExcludeDatabase $ExcludeDatabase + } + + foreach ($db in $InputObject) { + if (!$db.IsAccessible) { + Write-Message -Level Warning -Message "Database $db on $($db.Parent) is not accessible. Skipping." + continue + } + + $masterkey = $db.MasterKey + + if (!$masterkey) { + Write-Message -Message "No master key exists in the $db database on $instance" -Target $db -Level Verbose + continue + } + + Add-Member -Force -InputObject $masterkey -MemberType NoteProperty -Name ComputerName -value $db.Parent.ComputerName + Add-Member -Force -InputObject $masterkey -MemberType NoteProperty -Name InstanceName -value $db.Parent.ServiceName + Add-Member -Force -InputObject $masterkey -MemberType NoteProperty -Name SqlInstance -value $db.Parent.DomainInstanceName + Add-Member -Force -InputObject $masterkey -MemberType NoteProperty -Name Database -value $db.Name + + Select-DefaultView -InputObject $masterkey -Property ComputerName, InstanceName, SqlInstance, Database, CreateDate, DateLastModified, IsEncryptedByServer + } + } + end { + Test-DbaDeprecation -DeprecatedOn "1.0.0" -EnableException:$false -Alias Get-DbaDatabaseMasterKey + } +} +function Get-DbaDbMemoryUsage { + <# + .SYNOPSIS + Determine buffer pool usage by database. + + .DESCRIPTION + This command can be utilized to determine which databases on a given instance are consuming buffer pool memory. + + This command is based on query provided by Aaron Bertrand. + Reference: https://www.mssqltips.com/sqlservertip/2393/determine-sql-server-memory-use-by-database-and-object/ + + .PARAMETER SqlInstance + The target SQL Server instance or instances. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential). + + .PARAMETER Database + The database(s) to process - this list is auto-populated from the server. If unspecified, all databases will be processed. + + .PARAMETER ExcludeDatabase + The database(s) to exclude. + + .PARAMETER IncludeSystemDb + Switch to have the output include system database memory consumption. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Memory, Database + Author: Shawn Melton (@wsmelton), https://wsmelton.github.io + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaDbMemoryUsage + + .EXAMPLE + PS C:\> Get-DbaDbMemoryUsage -SqlInstance sqlserver2014a + + Returns the buffer pool consumption for all user databases + + .EXAMPLE + PS C:\> Get-DbaDbMemoryUsage -SqlInstance sqlserver2014a -IncludeSystemDb + + Returns the buffer pool consumption for all user databases and system databases + + .EXAMPLE + PS C:\> Get-DbaDbMemoryUsage -SqlInstance sql1 -IncludeSystemDb -Database tempdb + + Returns the buffer pool consumption for tempdb database only + + .EXAMPLE + PS C:\> Get-DbaDbMemoryUsage -SqlInstance sql2 -IncludeSystemDb -Exclude 'master','model','msdb','ResourceDb' + + Returns the buffer pool consumption for all user databases and tempdb database + #> + [CmdletBinding()] + param ( + [parameter(Position = 0, Mandatory, ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer", "SqlServers")] + [DbaInstance[]]$SqlInstance, + [PSCredential]$SqlCredential, + [parameter(ValueFromPipelineByPropertyName = $true)] + [object[]]$Database, + [object[]]$ExcludeDatabase, + [switch]$IncludeSystemDb, + [switch]$EnableException + ) + + begin { + $sql = "DECLARE @total_buffer INT; + SELECT @total_buffer = cntr_value + FROM sys.dm_os_performance_counters + WHERE RTRIM([object_name]) LIKE '%Buffer Manager' + AND counter_name = 'Database Pages'; + + ;WITH src AS ( + SELECT database_id, page_type, db_buffer_pages = COUNT_BIG(*) + FROM sys.dm_os_buffer_descriptors + GROUP BY database_id, page_type + ) + SELECT [DatabaseName] = CASE [database_id] WHEN 32767 THEN 'ResourceDb' ELSE DB_NAME([database_id]) END, + page_type AS 'PageType', + db_buffer_pages AS 'PageCount', + (db_buffer_pages * 8)/1024 AS 'SizeMb', + CAST(db_buffer_pages * 100.0 / @total_buffer AS FLOAT) AS 'PercentUsed' + FROM src + ORDER BY [DatabaseName];" + } + process { + foreach ($instance in $SqlInstance) { + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential -MinimumVersion 9 + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + try { + $results = $server.Query($sql) + } catch { + Stop-Function -Message "Issue collecting data" -Target $instance -ErrorRecord $_ + } + foreach ($row in $results) { + if (Test-Bound 'Database') { + if ($row.DatabaseName -notin $Database) { continue } + } + if (Test-Bound 'ExcludeDatabase') { + if ($row.DatabaseName -in $ExcludeDatabase) { continue } + } + if (Test-Bound -Not 'IncludeSystemDb') { + if ($row.DatabaseName -in 'master', 'model', 'msdb', 'tempdb', 'ResourceDb') { continue } + } + + if ($row.PercentUsed -is [System.DBNull]) { + $percentUsed = 0 + } else { + $percentUsed = [Math]::Round($row.PercentUsed) + } + + [PSCustomObject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + Database = $row.DatabaseName + PageType = $row.PageType + PageCount = [int]$row.PageCount + Size = [DbaSize]$row.SizeMb * 1024 + PercentUsed = $percentUsed + } | Select-DefaultView -ExcludeProperty 'PageCount' + } + } + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function Get-DbaDbMirror { + <# + .SYNOPSIS + Gets properties of database mirrors and mirror witnesses. + + .DESCRIPTION + Gets properties of database mirrors and mirror witnesses. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. This can be a collection and receive pipeline input to allow the function + to be executed against multiple SQL Server instances. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Mirror, HA + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaDbMirror + + .EXAMPLE + PS C:\> Get-DbaDbMirror -SqlInstance localhost + + Gets properties of database mirrors and mirror witnesses on localhost + + .EXAMPLE + PS C:\> Get-DbaDbMirror -SqlInstance localhost, sql2016 + + Gets properties of database mirrors and mirror witnesses on localhost and sql2016 SQL Server instances + + #> + [CmdletBinding()] + param ( + [parameter(Mandatory, ValueFromPipeline)] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [switch]$EnableException + ) + process { + foreach ($instance in $SqlInstance) { + $dbs = Get-DbaDatabase -SqlInstance $instance -SqlCredential $SqlCredential + $partners = $dbs | Where-Object MirroringPartner + $partners | Select-DefaultView -Property ComputerName, InstanceName, SqlInstance, Name, MirroringSafetyLevel, MirroringStatus, MirroringPartner, MirroringPartnerInstance, MirroringFailoverLogSequenceNumber, MirroringID, MirroringRedoQueueMaxSize, MirroringRoleSequence, MirroringSafetySequence, MirroringTimeout, MirroringWitness, MirroringWitnessStatus + + # The witness is kinda hidden. Go get it manually. + try { + $witnesses = $dbs[0].Parent.Query("select distinct database_name, principal_server_name, safety_level, safety_level_desc, partner_sync_state from master.sys.database_mirroring_witnesses") + } catch { continue } + + foreach ($witness in $witnesses) { + $witnessdb = $dbs | Where-Object Name -eq $witness.database_name + $status = switch ($witness.partner_sync_state) { + 0 { "None" } + 1 { "Suspended" } + 2 { "Disconnected" } + 3 { "Synchronizing" } + 4 { "PendingFailover" } + 5 { "Synchronized" } + } + + foreach ($db in $witnessdb) { + Add-Member -InputObject $db -Force -MemberType NoteProperty -Name MirroringPartner -Value $witness.principal_server_name + Add-Member -InputObject $db -Force -MemberType NoteProperty -Name MirroringSafetyLevel -Value $witness.safety_level_desc + Add-Member -InputObject $db -Force -MemberType NoteProperty -Name MirroringWitnessStatus -Value $status + Select-DefaultView -InputObject $db -Property ComputerName, InstanceName, SqlInstance, Name, MirroringSafetyLevel, MirroringStatus, MirroringPartner, MirroringPartnerInstance, MirroringFailoverLogSequenceNumber, MirroringID, MirroringRedoQueueMaxSize, MirroringRoleSequence, MirroringSafetySequence, MirroringTimeout, MirroringWitness, MirroringWitnessStatus + } + } + } + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function Get-DbaDbMirrorMonitor { + <# + .SYNOPSIS + Returns status rows for a monitored database from the status table in which database mirroring monitoring history is stored and allows you to choose whether the procedure obtains the latest status beforehand. + + .DESCRIPTION + Returns status rows for a monitored database from the status table in which database mirroring monitoring history is stored and allows you to choose whether the procedure obtains the latest status beforehand. + + Basically executes sp_dbmmonitorresults. + + .PARAMETER SqlInstance + The target SQL Server instance + + .PARAMETER SqlCredential + Login to the target instance using alternate Windows or SQL Login Authentication. Accepts credential objects (Get-Credential). + + .PARAMETER Database + The target database. + + .PARAMETER Database + The target database. + + .PARAMETER Update + Updates the status for the database by calling sp_dbmmonitorupdate before computing the results. + However, if the status table has been updated within the previous 15 seconds, or the user is not a member of the sysadmin fixed server role, the command runs without updating the status. + + .PARAMETER LimitResults + Limit results. Defaults to last two hours. + + Options include: + LastRow + LastTwoHours + LastFourHours + LastEightHours + LastDay + LastTwoDays + Last100Rows + Last500Rows + Last1000Rows + Last1000000Rows + + .PARAMETER InputObject + Allows piping from Get-DbaDatabase. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Mirror, HA + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaDbMirrorMonitor + + .EXAMPLE + PS C:\> Get-DbaDbMirrorMonitor -SqlInstance sql2008, sql2012 + + Returns last two hours' worth of status rows for a monitored database from the status table on sql2008 and sql2012. + + .EXAMPLE + PS C:\> Get-DbaDbMirrorMonitor -SqlInstance sql2005 -LimitResults LastDay -Update + + Updates monitor stats then returns the last 24 hours worth of status rows for a monitored database from the status table on sql2008 and sql2012. + + #> + [CmdletBinding()] + param ( + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [string[]]$Database, + [parameter(ValueFromPipeline)] + [Microsoft.SqlServer.Management.Smo.Database[]]$InputObject, + [switch]$Update, + [ValidateSet('LastRow', 'LastTwoHours', 'LastFourHours', 'LastEightHours', 'LastDay', 'LastTwoDays', 'Last100Rows', 'Last500Rows', 'Last1000Rows', 'Last1000000Rows')] + [string]$LimitResults = 'LastTwoHours', + [switch]$EnableException + ) + begin { + $rows = switch ($LimitResults) { + 'LastRow' { 0 } + 'LastTwoHours' { 1 } + 'LastFourHours' { 2 } + 'LastEightHours' { 3 } + 'LastDay' { 4 } + 'LastTwoDays' { 5 } + 'Last100Rows' { 6 } + 'Last500Rows' { 7 } + 'Last1000000Rows' { 8 } + } + $updatebool = switch ($Update) { + $false { 0 } + $true { 1 } + } + } + process { + foreach ($instance in $SqlInstance) { + $InputObject += Get-DbaDatabase -SqlInstance $instance -SqlCredential $SqlCredential -Database $Database + } + + foreach ($db in $InputObject) { + if (-not ($db.Parent.Databases['msdb'].Tables['dbm_monitor_data'].Name)) { + Stop-Function -Continue -Message "msdb.dbo.dbm_monitor_data not found. Please run Add-DbaDbMirrorMonitor then you can get monitor stats." + } + try { + $sql = "msdb.dbo.sp_dbmmonitorresults $db, $rows, $updatebool" + $results = $db.Parent.Query($sql) + + foreach ($result in $results) { + [pscustomobject]@{ + ComputerName = $db.Parent.ComputerName + InstanceName = $db.Parent.ServiceName + SqlInstance = $db.Parent.DomainInstanceName + DatabaseName = $result.database_name + Role = $result.role + MirroringState = $result.mirroring_state + WitnessStatus = $result.witness_status + LogGenerationRate = $result.log_generation_rate + UnsentLog = $result.unsent_log + SendRate = $result.send_rate + UnrestoredLog = $result.unrestored_log + RecoveryRate = $result.recovery_rate + TransactionDelay = $result.transaction_delay + TransactionsPerSecond = $result.transactions_per_sec + AverageDelay = $result.average_delay + TimeRecorded = $result.time_recorded + TimeBehind = $result.time_behind + LocalTime = $result.local_time + } + } + } catch { + Stop-Function -Message "Failure" -ErrorRecord $_ + } + } + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function Get-DbaDbOrphanUser { + <# + .SYNOPSIS + Get orphaned users. + + .DESCRIPTION + An orphan user is defined by a user that does not have their matching login. (Login property = ""). + + .PARAMETER SqlInstance + The target SQL Server instance or instances. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Database + Specifies the database(s) to process. Options for this list are auto-populated from the server. If unspecified, all databases will be processed. + + .PARAMETER ExcludeDatabase + Specifies the database(s) to exclude from processing. Options for this list are auto-populated from the server + + .PARAMETER WhatIf + If this switch is enabled, no actions are performed but informational messages will be displayed that explain what would happen if the command were to run. + + .PARAMETER Confirm + If this switch is enabled, you will be prompted for confirmation before executing any operations that change state. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Orphan, Database, User, Security, Login + Author: Claudio Silva (@ClaudioESSilva) | Garry Bargsley (@gbargsley) | Simone Bizzotto (@niphlod) + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaDbOrphanUser + + .EXAMPLE + PS C:\> Get-DbaDbOrphanUser -SqlInstance localhost\sql2016 + + Finds all orphan users without matching Logins in all databases present on server 'localhost\sql2016'. + + .EXAMPLE + PS C:\> Get-DbaDbOrphanUser -SqlInstance localhost\sql2016 -SqlCredential $cred + + Finds all orphan users without matching Logins in all databases present on server 'localhost\sql2016'. SQL Server authentication will be used in connecting to the server. + + .EXAMPLE + PS C:\> Get-DbaDbOrphanUser -SqlInstance localhost\sql2016 -Database db1 + + Finds orphan users without matching Logins in the db1 database present on server 'localhost\sql2016'. + + #> + [CmdletBinding()] + param ( + [parameter(Mandatory, ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [Alias("Databases")] + [object[]]$Database, + [object[]]$ExcludeDatabase, + [Alias('Silent')] + [switch]$EnableException + ) + process { + foreach ($instance in $SqlInstance) { + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential + } catch { + Write-Message -Level Warning -Message "Failed to connect to: $instance." + continue + } + $DatabaseCollection = $server.Databases | Where-Object IsAccessible + + if ($Database) { + $DatabaseCollection = $DatabaseCollection | Where-Object Name -In $Database + } + if ($ExcludeDatabase) { + $DatabaseCollection = $DatabaseCollection | Where-Object Name -NotIn $ExcludeDatabase + } + + if ($DatabaseCollection.Count -gt 0) { + foreach ($db in $DatabaseCollection) { + try { + #if SQL 2012 or higher only validate databases with ContainmentType = NONE + if ($server.versionMajor -gt 10) { + if ($db.ContainmentType -ne [Microsoft.SqlServer.Management.Smo.ContainmentType]::None) { + Write-Message -Level Warning -Message "Database '$db' is a contained database. Contained databases can't have orphaned users. Skipping validation." + Continue + } + } + Write-Message -Level Verbose -Message "Validating users on database '$db'." + $UsersToWork = $db.Users | Where-Object { $_.Login -eq "" -and ($_.ID -gt 4) -and (($_.Sid.Length -gt 16 -and $_.LoginType -in @([Microsoft.SqlServer.Management.Smo.LoginType]::SqlLogin, [Microsoft.SqlServer.Management.Smo.LoginType]::Certificate)) -eq $false) } + + if ($UsersToWork.Count -gt 0) { + Write-Message -Level Verbose -Message "Orphan users found" + foreach ($user in $UsersToWork) { + [PSCustomObject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + DatabaseName = $db.Name + User = $user.Name + } + } + } else { + Write-Message -Level Verbose -Message "No orphan users found on database '$db'." + } + #reset collection + $UsersToWork = $null + } catch { + Stop-Function -Message $_ -Continue + } + } + } else { + Write-Message -Level VeryVerbose -Message "There are no databases to analyse." + } + } + } + end { + Test-DbaDeprecation -DeprecatedOn 1.0.0 -Alias Get-DbaOrphanUser + } +} +#ValidationTags#CodeStyle,Messaging,FlowControl,Pipeline# +function Get-DbaDbPageInfo { + <# + .SYNOPSIS + Get-DbaDbPageInfo will return page information for a database + + .DESCRIPTION + Get-DbaDbPageInfo is able to return information about the pages in a database. + It's possible to return the information for multiple databases and filter on specific databases, schemas and tables. + + .PARAMETER SqlInstance + The target SQL Server instance or instances + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Database + Filter to only get specific databases + + .PARAMETER Schema + Filter to only get specific schemas + + .PARAMETER Table + Filter to only get specific tables + + .PARAMETER InputObject + Enables piping from Get-DbaDatabase + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Database, Page + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaDbPageInfo + + .EXAMPLE + PS C:\> et-DbaDbPageInfo -SqlInstance sql2017 + + Returns page information for all databases on sql2017 + + .EXAMPLE + PS C:\> Get-DbaDbPageInfo -SqlInstance sql2017, sql2016 -Database testdb + + Returns page information for the testdb on sql2017 and sql2016 + + .EXAMPLE + PS C:\> $servers | Get-DbaDatabase -Database testdb | Get-DbaDbPageInfo + + Returns page information for the testdb on all $servers + + #> + [CmdLetBinding()] + param ( + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [string[]]$Database, + [string[]]$Schema, + [string[]]$Table, + [parameter(ValueFromPipeline)] + [Microsoft.SqlServer.Management.Smo.Database[]]$InputObject, + [switch]$EnableException + ) + begin { + $sql = "SELECT SERVERPROPERTY('MachineName') AS ComputerName, + ISNULL(SERVERPROPERTY('InstanceName'), 'MSSQLSERVER') AS InstanceName, + SERVERPROPERTY('ServerName') AS SqlInstance, [Database] = DB_NAME(DB_ID()), + ss.name AS [Schema], st.name AS [Table], dbpa.page_type_desc AS PageType, + dbpa.page_free_space_percent AS PageFreePercent, + IsAllocated = + CASE dbpa.is_allocated + WHEN 0 THEN 'False' + WHEN 1 THEN 'True' + END, + IsMixedPage = + CASE dbpa.is_mixed_page_allocation + WHEN 0 THEN 'False' + WHEN 1 THEN 'True' + END + FROM sys.dm_db_database_page_allocations(DB_ID(), NULL, NULL, NULL, 'DETAILED') AS dbpa + INNER JOIN sys.tables AS st ON st.object_id = dbpa.object_id + INNER JOIN sys.schemas AS ss ON ss.schema_id = st.schema_id" + + if ($Schema) { + $sql = "$sql WHERE ss.name IN ('$($Schema -join "','")')" + } + + if ($Table) { + if ($schema) { + $sql = "$sql AND st.name IN ('$($Table -join "','")')" + } else { + $sql = "$sql WHERE st.name IN ('$($Table -join "','")')" + } + } + } + process { + # Loop through all the instances + foreach ($instance in $SqlInstance) { + + # Try connecting to the instance + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential -MinimumVersion 11 + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + if ($Database) { + $InputObject += $server.Databases | Where-Object { $_.Name -in $Database } + } else { + $InputObject += $server.Databases + } + } + + # Loop through each of databases + foreach ($db in $InputObject) { + # Revalidate the version of the server in case db is piped in + try { + if ($db.Parent.VersionMajor -ge 11) { + $db.Query($sql) + } else { + Stop-Function -Message "Unsupported SQL Server version" -Target $db -Continue + } + } catch { + Stop-Function -Message "Something went wrong executing the query" -ErrorRecord $_ -Target $instance -Continue + } + } + } +} +function Get-DbaDbPartitionFunction { + <# + .SYNOPSIS + Gets database Partition Functions + + .DESCRIPTION + Gets database Partition Functions + + .PARAMETER SqlInstance + The target SQL Server instance or instances + + .PARAMETER SqlCredential + Allows you to login to SQL Server using alternative credentials + + .PARAMETER Database + To get users from specific database(s) + + .PARAMETER ExcludeDatabase + The database(s) to exclude - this list is auto populated from the server + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Database + Author: Klaas Vandenberghe ( @PowerDbaKlaas ) + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .EXAMPLE + PS C:\> Get-DbaDbPartitionFunction -SqlInstance sql2016 + + Gets all database Partition Functions + + .EXAMPLE + PS C:\> Get-DbaDbPartitionFunction -SqlInstance Server1 -Database db1 + + Gets the Partition Functions for the db1 database + + .EXAMPLE + PS C:\> Get-DbaDbPartitionFunction -SqlInstance Server1 -ExcludeDatabase db1 + + Gets the Partition Functions for all databases except db1 + + .EXAMPLE + PS C:\> 'Sql1','Sql2/sqlexpress' | Get-DbaDbPartitionFunction + + Gets the Partition Functions for the databases on Sql1 and Sql2/sqlexpress + + #> + [CmdletBinding()] + param ( + [parameter(Mandatory, ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [object[]]$Database, + [object[]]$ExcludeDatabase, + [Alias('Silent')] + [switch]$EnableException + ) + + process { + foreach ($instance in $SqlInstance) { + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $sqlcredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + $databases = $server.Databases | Where-Object IsAccessible + + if ($Database) { + $databases = $databases | Where-Object Name -In $Database + } + if ($ExcludeDatabase) { + $databases = $databases | Where-Object Name -NotIn $ExcludeDatabase + } + + foreach ($db in $databases) { + if (!$db.IsAccessible) { + Write-Message -Level Warning -Message "Database $db is not accessible. Skipping." + continue + } + + $partitionfunctions = $db.partitionfunctions + + if (!$partitionfunctions) { + Write-Message -Message "No Partition Functions exist in the $db database on $instance" -Target $db -Level Verbose + continue + } + + $partitionfunctions | ForEach-Object { + + Add-Member -Force -InputObject $_ -MemberType NoteProperty -Name ComputerName -value $server.ComputerName + Add-Member -Force -InputObject $_ -MemberType NoteProperty -Name InstanceName -value $server.ServiceName + Add-Member -Force -InputObject $_ -MemberType NoteProperty -Name SqlInstance -value $server.DomainInstanceName + Add-Member -Force -InputObject $_ -MemberType NoteProperty -Name Database -value $db.Name + + Select-DefaultView -InputObject $_ -Property ComputerName, InstanceName, SqlInstance, Database, CreateDate, Name, NumberOfPartitions + } + } + } + } + end { + Test-DbaDeprecation -DeprecatedOn "1.0.0" -EnableException:$false -Alias Get-DbaDatabasePartitionFunction + } +} +function Get-DbaDbPartitionScheme { + <# + .SYNOPSIS + Gets database Partition Schemes + + .DESCRIPTION + Gets database Partition Schemes + + .PARAMETER SqlInstance + The target SQL Server instance or instances + + .PARAMETER SqlCredential + Allows you to login to SQL Server using alternative credentials + + .PARAMETER Database + To get users from specific database(s) + + .PARAMETER ExcludeDatabase + The database(s) to exclude - this list is auto populated from the server + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Database + Author: Klaas Vandenberghe (@PowerDbaKlaas) + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .EXAMPLE + PS C:\> Get-DbaDbPartitionScheme -SqlInstance sql2016 + + Gets all database Partition Schemes + + .EXAMPLE + PS C:\> Get-DbaDbPartitionScheme -SqlInstance Server1 -Database db1 + + Gets the Partition Schemes for the db1 database + + .EXAMPLE + PS C:\> Get-DbaDbPartitionScheme -SqlInstance Server1 -ExcludeDatabase db1 + + Gets the Partition Schemes for all databases except db1 + + .EXAMPLE + PS C:\> 'Sql1','Sql2/sqlexpress' | Get-DbaDbPartitionScheme + + Gets the Partition Schemes for the databases on Sql1 and Sql2/sqlexpress + + #> + [CmdletBinding()] + param ( + [parameter(Mandatory, ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [object[]]$Database, + [object[]]$ExcludeDatabase, + [Alias('Silent')] + [switch]$EnableException + ) + + process { + foreach ($instance in $SqlInstance) { + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $sqlcredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + $databases = $server.Databases | Where-Object IsAccessible + + if ($Database) { + $databases = $databases | Where-Object Name -In $Database + } + if ($ExcludeDatabase) { + $databases = $databases | Where-Object Name -NotIn $ExcludeDatabase + } + + foreach ($db in $databases) { + if (!$db.IsAccessible) { + Write-Message -Level Warning -Message "Database $db is not accessible. Skipping." + continue + } + + $PartitionSchemes = $db.PartitionSchemes + + if (!$PartitionSchemes) { + Write-Message -Message "No Partition Schemes exist in the $db database on $instance" -Target $db -Level Verbose + continue + } + + $PartitionSchemes | ForEach-Object { + + Add-Member -Force -InputObject $_ -MemberType NoteProperty -Name ComputerName -value $server.ComputerName + Add-Member -Force -InputObject $_ -MemberType NoteProperty -Name InstanceName -value $server.ServiceName + Add-Member -Force -InputObject $_ -MemberType NoteProperty -Name SqlInstance -value $server.DomainInstanceName + Add-Member -Force -InputObject $_ -MemberType NoteProperty -Name Database -value $db.Name + + Select-DefaultView -InputObject $_ -Property ComputerName, InstanceName, SqlInstance, Database, Name, PartitionFunction + } + } + } + } + end { + Test-DbaDeprecation -DeprecatedOn "1.0.0" -EnableException:$false -Alias Get-DbaDatabasePartitionScheme + } +} +#ValidationTags#CodeStyle,Messaging,FlowControl,Pipeline# +function Get-DbaDbQueryStoreOption { + <# + .SYNOPSIS + Get the Query Store configuration for Query Store enabled databases. + + .DESCRIPTION + Retrieves and returns the Query Store configuration for every database that has the Query Store feature enabled. + + .OUTPUTS + Microsoft.SqlServer.Management.Smo.QueryStoreOptions + + .PARAMETER SqlInstance + The target SQL Server instance or instances. + + .PARAMETER SqlCredential + SqlCredential object used to connect to the SQL Server as a different user. + + .PARAMETER Database + The database(s) to process - this list is auto-populated from the server. If unspecified, all databases will be processed. + + .PARAMETER ExcludeDatabase + The database(s) to exclude - this list is auto-populated from the server + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: QueryStore + Author: Enrico van de Laar (@evdlaar) | Klaas Vandenberghe (@PowerDBAKlaas) + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaQueryStoreOptions + + .EXAMPLE + PS C:\> Get-DbaDbQueryStoreOption -SqlInstance ServerA\sql + + Returns Query Store configuration settings for every database on the ServerA\sql instance. + + .EXAMPLE + PS C:\> Get-DbaDbQueryStoreOption -SqlInstance ServerA\sql | Where-Object {$_.ActualState -eq "ReadWrite"} + + Returns the Query Store configuration for all databases on ServerA\sql where the Query Store feature is in Read/Write mode. + + .EXAMPLE + PS C:\> Get-DbaDbQueryStoreOption -SqlInstance localhost | format-table -AutoSize -Wrap + + Returns Query Store configuration settings for every database on the ServerA\sql instance inside a table format. + + #> + [CmdletBinding()] + param ( + [parameter(Mandatory, ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [Alias("Credential")] + [PSCredential] + $SqlCredential, + [Alias("Databases")] + [object[]]$Database, + [object[]]$ExcludeDatabase, + [Alias('Silent')] + [switch]$EnableException + ) + begin { + $ExcludeDatabase += 'master', 'tempdb' + } + process { + foreach ($instance in $SqlInstance) { + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential -MinimumVersion 13 + } catch { + Write-Message -Level Warning -Message "Can't connect to $instance. Moving on." + continue + } + + # We have to exclude all the system databases since they cannot have the Query Store feature enabled + $dbs = Get-DbaDatabase -SqlInstance $server -ExcludeDatabase $ExcludeDatabase -Database $Database | Where-Object IsAccessible + + foreach ($db in $dbs) { + Write-Message -Level Verbose -Message "Processing $($db.Name) on $instance" + $QSO = $db.QueryStoreOptions + + Add-Member -Force -InputObject $QSO -MemberType NoteProperty -Name ComputerName -value $server.ComputerName + Add-Member -Force -InputObject $QSO -MemberType NoteProperty -Name InstanceName -value $server.ServiceName + Add-Member -Force -InputObject $QSO -MemberType NoteProperty -Name SqlInstance -value $server.DomainInstanceName + Add-Member -Force -InputObject $QSO -MemberType NoteProperty Database -value $db.Name + Select-DefaultView -InputObject $QSO -Property ComputerName, InstanceName, SqlInstance, Database, ActualState, DataFlushIntervalInSeconds, StatisticsCollectionIntervalInMinutes, MaxStorageSizeInMB, CurrentStorageSizeInMB, QueryCaptureMode, SizeBasedCleanupMode, StaleQueryThresholdInDays + } + } + } + end { + Test-DbaDeprecation -DeprecatedOn "1.0.0" -EnableException:$false -Alias Get-DbaDbQueryStoreOptions + } +} +function Get-DbaDbRecoveryModel { + <# + .SYNOPSIS + Get-DbaDbRecoveryModel displays the Recovery Model. + + .DESCRIPTION + Get-DbaDbRecoveryModel displays the Recovery Model for all databases. This is the default, you can filter using -Database, -ExcludeDatabase, -RecoveryModel + + .PARAMETER SqlInstance + The target SQL Server instance or instances. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Database + The database(s) to process - this list is auto-populated from the server. if unspecified, all databases will be processed. + + .PARAMETER ExcludeDatabase + The database(s) to exclude - this list is auto-populated from the server + + .PARAMETER RecoveryModel + Filters the output based on Recovery Model. Valid options are Simple, Full and BulkLogged + + Details about the recovery models can be found here: + https://docs.microsoft.com/en-us/sql/relational-databases/backup-restore/recovery-models-sql-server + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Recovery, RecoveryModel, Simple, Full, Bulk, BulkLogged + Author: Viorel Ciucu (@viorelciucu), https://www.cviorel.com + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaDbRecoveryModel + + .EXAMPLE + PS C:\> Get-DbaDbRecoveryModel -SqlInstance sql2014 -RecoveryModel BulkLogged -Verbose + + Gets all databases on SQL Server instance sql2014 having RecoveryModel set to BulkLogged. + + .EXAMPLE + PS C:\> Get-DbaDbRecoveryModel -SqlInstance sql2014 -Database TestDB + + Gets recovery model information for TestDB. If TestDB does not exist on the instance nothing is returned. + + #> + [CmdletBinding()] + param ( + [parameter(Mandatory, ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer")] + [DbaInstance[]]$SqlInstance, + [PSCredential]$SqlCredential, + [ValidateSet('Simple', 'Full', 'BulkLogged')] + [string[]]$RecoveryModel, + [object[]]$Database, + [object[]]$ExcludeDatabase, + [switch]$EnableException + ) + begin { + $defaults = 'ComputerName', 'InstanceName', 'SqlInstance', 'Name', 'Status', 'IsAccessible', 'RecoveryModel', + 'LastBackupDate as LastFullBackup', 'LastDifferentialBackupDate as LastDiffBackup', + 'LastLogBackupDate as LastLogBackup' + } + process { + $params = @{ + SqlInstance = $SqlInstance + SqlCredential = $SqlCredential + Database = $Database + ExcludeDatabase = $ExcludeDatabase + EnableException = $EnableException + } + + if ($RecoveryModel) { + Get-DbaDatabase @params | Where-Object RecoveryModel -in $RecoveryModel | Where-Object IsAccessible | Select-DefaultView -Property $defaults + } else { + Get-DbaDatabase @params | Select-DefaultView -Property $defaults + } + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function Get-DbaDbRestoreHistory { + <# + .SYNOPSIS + Returns restore history details for databases on a SQL Server. + + .DESCRIPTION + By default, this command will return the server name, database, username, restore type, date, from file and to files. + + Thanks to https://www.mssqltips.com/SqlInstancetip/1724/when-was-the-last-time-your-sql-server-database-was-restored/ for the query and https://sqlstudies.com/2016/07/27/when-was-this-database-restored/ for the idea. + + .PARAMETER SqlInstance + Specifies the SQL Server instance(s) to operate on. Requires SQL Server 2005 or higher. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Database + Specifies the database(s) to process. Options for this list are auto-populated from the server. If unspecified, all databases will be processed. + + .PARAMETER ExcludeDatabase + Specifies the database(s) to exclude from processing. Options for this list are auto-populated from the server. + + .PARAMETER Since + Specifies a datetime to use as the starting point for searching backup history. + + .PARAMETER Force + Deprecated. + + .PARAMETER Last + If this switch is enabled, the last restore action performed on each database is returned. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: DisasterRecovery, Backup, Restore + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaDbRestoreHistory + + .EXAMPLE + PS C:\> Get-DbaDbRestoreHistory -SqlInstance sql2016 + + Returns server name, database, username, restore type, date for all restored databases on sql2016. + + .EXAMPLE + PS C:\> Get-DbaDbRestoreHistory -SqlInstance sql2016 -Database db1, db2 -Since '2016-07-01 10:47:00' + + Returns restore information only for databases db1 and db2 on sql2016 since July 1, 2016 at 10:47 AM. + + .EXAMPLE + PS C:\> Get-DbaDbRestoreHistory -SqlInstance sql2014, sql2016 -Exclude db1 + + Returns restore information for all databases except db1 on sql2014 and sql2016. + + .EXAMPLE + PS C:\> $cred = Get-Credential sqladmin + PS C:\> Get-DbaDbRestoreHistory -SqlInstance sql2014 -Database AdventureWorks2014, pubs -SqlCredential $cred | Format-Table + + Returns database restore information for AdventureWorks2014 and pubs database on sql2014, connects using SQL Authentication via sqladmin account. Formats the data as a table. + + .EXAMPLE + PS C:\> Get-DbaCmsRegServer -SqlInstance sql2016 | Get-DbaDbRestoreHistory + + Returns database restore information for every database on every server listed in the Central Management Server on sql2016. + + #> + [CmdletBinding()] + param ( + [parameter(Mandatory, ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [Alias("Credential")] + [PSCredential]$SqlCredential, + [Alias("Databases")] + [object[]]$Database, + [object[]]$ExcludeDatabase, + [datetime]$Since, + [switch]$Force, + [switch]$Last, + [Alias('Silent')] + [switch]$EnableException + ) + + begin { + Test-DbaDeprecation -DeprecatedOn "1.0.0.0" -EnableException:$false -Parameter 'Force' + + if ($Since -ne $null) { + $Since = $Since.ToString("yyyy-MM-ddTHH:mm:ss") + } + } + + process { + foreach ($instance in $SqlInstance) { + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential -MinimumVersion 9 + $computername = $server.ComputerName + $instancename = $server.ServiceName + $servername = $server.DomainInstanceName + + if ($force -eq $true) { + $select = "SELECT '$computername' AS [ComputerName], + '$instancename' AS [InstanceName], + '$servername' AS [SqlInstance], * " + } else { + $select = "SELECT + '$computername' AS [ComputerName], + '$instancename' AS [InstanceName], + '$servername' AS [SqlInstance], + rsh.destination_database_name AS [Database], + --rsh.restore_history_id as RestoreHistoryID, + rsh.user_name AS [Username], + CASE + WHEN rsh.restore_type = 'D' THEN 'Database' + WHEN rsh.restore_type = 'F' THEN 'File' + WHEN rsh.restore_type = 'G' THEN 'Filegroup' + WHEN rsh.restore_type = 'I' THEN 'Differential' + WHEN rsh.restore_type = 'L' THEN 'Log' + WHEN rsh.restore_type = 'V' THEN 'Verifyonly' + WHEN rsh.restore_type = 'R' THEN 'Revert' + ELSE rsh.restore_type + END AS [RestoreType], + rsh.restore_date AS [Date], + ISNULL(STUFF((SELECT ', ' + bmf.physical_device_name + FROM msdb.dbo.backupmediafamily bmf + WHERE bmf.media_set_id = bs.media_set_id + FOR XML PATH('')), 1, 2, ''), '') AS [From], + ISNULL(STUFF((SELECT ', ' + rf.destination_phys_name + FROM msdb.dbo.restorefile rf + WHERE rsh.restore_history_id = rf.restore_history_id + FOR XML PATH('')), 1, 2, ''), '') AS [To], + bs.first_lsn, + bs.last_lsn, + bs.checkpoint_lsn, + bs.database_backup_lsn, + bs.backup_finish_date, + bs.backup_finish_date AS BackupFinishDate + " + } + + $from = " FROM msdb.dbo.restorehistory rsh + INNER JOIN msdb.dbo.backupset bs ON rsh.backup_set_id = bs.backup_set_id" + + if ($ExcludeDatabase -or $Database -or $Since -or $last) { + $where = " WHERE " + } + + $wherearray = @() + + if ($ExcludeDatabase) { + $dblist = $ExcludeDatabase -join "','" + $wherearray += " destination_database_name not in ('$dblist')" + } + + if ($Database) { + $dblist = $Database -join "','" + $wherearray += "destination_database_name in ('$dblist')" + } + + if ($null -ne $Since) { + $wherearray += "rsh.restore_date >= '$since'" + } + + + if ($last) { + $wherearray += "rsh.backup_set_id in + (select max(backup_set_id) from msdb.dbo.restorehistory + group by destination_database_name + )" + } + + if ($where.length -gt 0) { + $wherearray = $wherearray -join " and " + $where = "$where $wherearray" + } + + $sql = "$select $from $where" + + Write-Message -Level Debug -Message $sql + + $results = $server.ConnectionContext.ExecuteWithResults($sql).Tables.Rows + if ($last) { + $ga = $results | Group-Object Database + $tmpres = @() + foreach ($g in $ga) { + $tmpres += $g.Group | Sort-Object -Property Date -Descending | Select-Object -First 1 + } + $results = $tmpres + } + $results | Select-DefaultView -ExcludeProperty first_lsn, last_lsn, checkpoint_lsn, database_backup_lsn, backup_finish_date + } catch { + Stop-Function -Message "Failure" -Target $SqlInstance -Error $_ -Exception $_.Exception.InnerException -Continue + } + } + } +} +#ValidationTags#CodeStyle, Messaging, FlowControl, Pipeline# +function Get-DbaDbRoleMember { + <# + .SYNOPSIS + Get members of database roles for each instance(s) of SQL Server. + + .DESCRIPTION + The Get-DbaDbRoleMember returns connected SMO object for database roles for each instance(s) of SQL Server. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. This can be a collection and receive pipeline input to allow the function to be executed against multiple SQL Server instances. + + .PARAMETER SqlCredential + Login to the target instance using alternate Windows or SQL Login Authentication. Accepts credential objects (Get-Credential). + + .PARAMETER Database + The database(s) to process. This list is auto-populated from the server. If unspecified, all databases will be processed. + + .PARAMETER ExcludeDatabase + The database(s) to exclude. This list is auto-populated from the server. + + .PARAMETER Role + The role(s) to process. If unspecified, all roles will be processed. + + .PARAMETER ExcludeRole + The role(s) to exclude. + + .PARAMETER ExcludeFixedRole + Excludes all members of fixed roles. + + .PARAMETER IncludeSystemUser + Includes system users. By default system users are not included. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Role, Database, Security, Login + Author: Klaas Vandenberghe (@PowerDBAKlaas) + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaDbRoleMember + + .EXAMPLE + PS C:\> Get-DbaDbRoleMember -SqlInstance localhost + + Returns all members of all database roles on the local default SQL Server instance + + .EXAMPLE + PS C:\> Get-DbaDbRoleMember -SqlInstance localhost, sql2016 + + Returns all members of all database roles on the local and sql2016 SQL Server instances + + .EXAMPLE + PS C:\> $servers = Get-Content C:\servers.txt + PS C:\> $servers | Get-DbaDbRoleMember + + Returns all members of all database roles for every server in C:\servers.txt + + .EXAMPLE + PS C:\> Get-DbaDbRoleMember -SqlInstance localhost -Database msdb + + Returns non-system members of all roles in the msdb database on localhost. + + .EXAMPLE + PS C:\> Get-DbaDbRoleMember -SqlInstance localhost -Database msdb -IncludeSystemUser -ExcludeFixedRole + + Returns all members of non-fixed roles in the msdb database on localhost. + + .EXAMPLE + PS C:\> Get-DbaDbRoleMember -SqlInstance localhost -Database msdb -Role 'db_owner' + + Returns all members of the db_owner role in the msdb database on localhost. + + #> + [CmdletBinding()] + param ( + [parameter(Position = 0, Mandatory, ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer")] + [DbaInstance[]]$SqlInstance, + [Alias("Credential")] + [PSCredential]$SqlCredential, + [string[]]$Database, + [string[]]$ExcludeDatabase, + [string[]]$Role, + [string[]]$ExcludeRole, + [switch]$ExcludeFixedRole, + [switch]$IncludeSystemUser, + [Alias('Silent')] + [switch]$EnableException + ) + + process { + foreach ($instance in $SqlInstance) { + Write-Message -Level Verbose -Message "Attempting to connect to $instance" + + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential + } catch { + Stop-Function -Message 'Failure' -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + foreach ($item in $Database) { + Write-Message -Level Verbose -Message "Check if database: $item on $instance is accessible or not" + if ($server.Databases[$item].IsAccessible -eq $false) { + Stop-Function -Message "Database: $item is not accessible. Check your permissions or database state." -Category ResourceUnavailable -ErrorRecord $_ -Target $instance -Continue + } + } + + $databases = $server.Databases | Where-Object { $_.IsAccessible -eq $true } + + if (Test-Bound -Parameter 'Database') { + $databases = $databases | Where-Object { $_.Name -in $Database } + } + + if (Test-Bound -Parameter 'ExcludeDatabase') { + $databases = $databases | Where-Object { $_.Name -notin $ExcludeDatabase} + } + + foreach ($db in $databases) { + Write-Message -Level 'Verbose' -Message "Getting Database Roles for $db on $instance" + + $dbRoles = $db.roles + + if (Test-Bound -Parameter 'Role') { + $dbRoles = $dbRoles | Where-Object { $_.Name -in $Role } + } + + if (Test-Bound -Parameter 'ExcludeRole') { + $dbRoles = $dbRoles | Where-Object { $_.Name -notin $ExcludeRole } + } + + if (Test-Bound -Parameter 'ExcludeFixedRole') { + $dbRoles = $dbRoles | Where-Object { $_.IsFixedRole -eq $false } + } + + foreach ($dbRole in $dbRoles) { + Write-Message -Level 'Verbose' -Message "Getting Database Role Members for $dbRole in $db on $instance" + + $members = $dbRole.EnumMembers() + foreach ($member in $members) { + $user = $db.Users | Where-Object { $_.Name -eq $member } + + if (Test-Bound -Not -ParameterName 'IncludeSystemUser') { + $user = $user | Where-Object { $_.IsSystemObject -eq $false } + } + + if ($user) { + Add-Member -Force -InputObject $user -MemberType NoteProperty -Name ComputerName -Value $server.ComputerName + Add-Member -Force -InputObject $user -MemberType NoteProperty -Name InstanceName -Value $server.ServiceName + Add-Member -Force -InputObject $user -MemberType NoteProperty -Name SqlInstance -Value $server.DomainInstanceName + Add-Member -Force -InputObject $user -MemberType NoteProperty -Name Database -Value $db.Name + Add-Member -Force -InputObject $user -MemberType NoteProperty -Name Role -Value $dbRole.Name + Add-Member -Force -InputObject $user -MemberType NoteProperty -Name UserName -Value $user.Name + + # Select object because Select-DefaultView causes strange behaviors when assigned to a variable (??) + Select-Object -InputObject $user -Property 'ComputerName', 'InstanceName', 'SqlInstance', 'Database', 'Role', 'UserName', 'Login', 'IsSystemObject', 'LoginType' + } + } + } + } + } + } + end { + Test-DbaDeprecation -DeprecatedOn "1.0.0" -Alias Get-DbaRoleMember + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function Get-DbaDbSharePoint { + <# + .SYNOPSIS + Returns databases that are part of a SharePoint Farm. + + .DESCRIPTION + Returns databases that are part of a SharePoint Farm, as found in the SharePoint Configuration database. + + By default, this command checks SharePoint_Config. To use an alternate database, use the ConfigDatabase parameter. + + .PARAMETER SqlInstance + The target SQL Server instance + + .PARAMETER SqlCredential + Login to the target instance using alternate Windows or SQL Login Authentication. Accepts credential objects (Get-Credential). + + .PARAMETER ConfigDatabase + The name of the SharePoint Configuration database. Defaults to SharePoint_Config. + + .PARAMETER InputObject + Allows piping from Get-DbaDatabase. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: SharePoint + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaDbSharePoint + + .EXAMPLE + PS C:\> Get-DbaDbSharePoint -SqlInstance sqlcluster + + Returns databases that are part of a SharePoint Farm, as found in SharePoint_Config on sqlcluster + + .EXAMPLE + PS C:\> Get-DbaDatabase -SqlInstance sqlcluster -Database SharePoint_Config_2016 | Get-DbaDbSharePoint + + Returns databases that are part of a SharePoint Farm, as found in SharePoint_Config_2016 on sqlcluster + + #> + [CmdletBinding()] + param ( + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [string[]]$ConfigDatabase = "SharePoint_Config", + [parameter(ValueFromPipeline)] + [Microsoft.SqlServer.Management.Smo.Database[]]$InputObject, + [switch]$EnableException + ) + process { + foreach ($instance in $SqlInstance) { + $InputObject += Get-DbaDatabase -SqlInstance $instance -SqlCredential $SqlCredential -Database $ConfigDatabase + } + + foreach ($db in $InputObject) { + try { + $guid = $db.Query("SELECT Id FROM Classes WHERE FullName LIKE 'Microsoft.SharePoint.Administration.SPDatabase,%'").Id.Guid + $dbid = $db.Query("[dbo].[proc_getObjectsByBaseClass] @BaseClassId = '$guid', @ParentId = NULL").Id.Guid -join "', '" + $dbname = $db.Query("SELECT [Name] FROM [SharePoint_Config].[dbo].[Objects] WHERE id in ('$dbid')").Name + Get-DbaDatabase -SqlInstance $db.Parent -Database $dbname + } catch { + Stop-Function -Message "Failure" -ErrorRecord $_ + } + } + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function Get-DbaDbSnapshot { + <# + .SYNOPSIS + Get database snapshots with details + + .DESCRIPTION + Retrieves the list of database snapshot available, along with their base (the db they are the snapshot of) and creation time + + .PARAMETER SqlInstance + The target SQL Server instance or instances. + + .PARAMETER SqlCredential + Credential object used to connect to the SQL Server as a different user + + .PARAMETER Database + Return information for only specific databases + + .PARAMETER ExcludeDatabase + The database(s) to exclude - this list is auto-populated from the server + + .PARAMETER Snapshot + Return information for only specific snapshots + + .PARAMETER ExcludeSnapshot + The snapshot(s) to exclude - this list is auto-populated from the server + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Snapshot + Author: Simone Bizzotto (@niphlod) + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaDbSnapshot + + .EXAMPLE + PS C:\> Get-DbaDbSnapshot -SqlInstance sqlserver2014a + + Returns a custom object displaying Server, Database, DatabaseCreated, SnapshotOf, SizeMB, DatabaseCreated + + .EXAMPLE + PS C:\> Get-DbaDbSnapshot -SqlInstance sqlserver2014a -Database HR, Accounting + + Returns information for database snapshots having HR and Accounting as base dbs + + .EXAMPLE + PS C:\> Get-DbaDbSnapshot -SqlInstance sqlserver2014a -Snapshot HR_snapshot, Accounting_snapshot + + Returns information for database snapshots HR_snapshot and Accounting_snapshot + + #> + [CmdletBinding()] + param ( + [parameter(Mandatory, ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [Alias("Credential")] + [PSCredential]$SqlCredential, + [Alias("Databases")] + [object[]]$Database, + [object[]]$ExcludeDatabase, + [object[]]$Snapshot, + [object[]]$ExcludeSnapshot, + [Alias('Silent')] + [switch]$EnableException + ) + process { + foreach ($instance in $SqlInstance) { + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential -MinimumVersion 9 + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + $dbs = $server.Databases | Where-Object DatabaseSnapshotBaseName + if ($Database) { + $dbs = $dbs | Where-Object { $Database -contains $_.DatabaseSnapshotBaseName } + } + if ($ExcludeDatabase) { + $dbs = $dbs | Where-Object { $ExcludeDatabase -notcontains $_.DatabaseSnapshotBaseName } + } + if ($Snapshot) { + $dbs = $dbs | Where-Object { $Snapshot -contains $_.Name } + } + if (!$Snapshot -and !$Database) { + $dbs = $dbs | Where-Object IsDatabaseSnapshot -eq $true | Sort-Object DatabaseSnapshotBaseName, Name + } + if ($ExcludeSnapshot) { + $dbs = $dbs | Where-Object { $ExcludeSnapshot -notcontains $_.Name } + } + foreach ($db in $dbs) { + try { + $BytesOnDisk = $db.Query("SELECT SUM(BytesOnDisk) AS BytesOnDisk FROM fn_virtualfilestats(DB_ID(),NULL) S JOIN sys.databases D on D.database_id = S.dbid", $db.Name) + Add-Member -Force -InputObject $db -MemberType NoteProperty -Name ComputerName -value $server.ComputerName + Add-Member -Force -InputObject $db -MemberType NoteProperty -Name InstanceName -value $server.ServiceName + Add-Member -Force -InputObject $db -MemberType NoteProperty -Name SqlInstance -value $server.DomainInstanceName + Add-Member -Force -InputObject $db -MemberType NoteProperty -Name DiskUsage -value ([dbasize]($BytesOnDisk.BytesOnDisk)) + Select-DefaultView -InputObject $db -Property ComputerName, InstanceName, SqlInstance, Name, 'DatabaseSnapshotBaseName as SnapshotOf', CreateDate, DiskUsage + } catch { + Stop-Function -Message "Failure" -ErrorRecord $_ -Target $db -Continue + } + } + } + } + end { + Test-DbaDeprecation -DeprecatedOn "1.0.0" -Alias Get-DbaDatabaseSnapshot + } +} +#ValidationTags#CodeStyle,Messaging,FlowControl,Pipeline# +function Get-DbaDbSpace { + <# + .SYNOPSIS + Returns database file space information for database files on a SQL instance. + + .DESCRIPTION + This function returns database file space information for a SQL Instance or group of SQL Instances. Information is based on a query against sys.database_files and the FILEPROPERTY function to query and return information. + + File free space script borrowed and modified from Glenn Berry's DMV scripts (http://www.sqlskills.com/blogs/glenn/category/dmv-queries/) + + .PARAMETER SqlInstance + The target SQL Server instance or instances. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Database + Specifies the database(s) to process. Options for this list are auto-populated from the server. If unspecified, all databases will be processed. + + .PARAMETER ExcludeDatabase + Specifies the database(s) to exclude from processing. Options for this list are auto-populated from the server. + + .PARAMETER InputObject + A piped collection of database objects from Get-DbaDatabase + + .PARAMETER IncludeSystemDBs + If this switch is enabled, system databases will be processed. By default, only user databases are processed. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Database, Space, Storage + Author: Michael Fal (@Mike_Fal), http://mikefal.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaDbSpace + + .EXAMPLE + PS C:\> Get-DbaDbSpace -SqlInstance localhost + + Returns all user database files and free space information for the localhost. + + .EXAMPLE + PS C:\> Get-DbaDbSpace -SqlInstance localhost | Where-Object {$_.PercentUsed -gt 80} + + Returns all user database files and free space information for the local host. Filters the output object by any files that have a percent used of greater than 80%. + + .EXAMPLE + PS C:\> 'localhost','localhost\namedinstance' | Get-DbaDbSpace + + Returns all user database files and free space information for the localhost and localhost\namedinstance SQL Server instances. Processes data via the pipeline. + + .EXAMPLE + PS C:\> Get-DbaDbSpace -SqlInstance localhost -Database db1, db2 | Where-Object { $_.SpaceUntilMaxSize.Megabyte -lt 1 } + + Returns database files and free space information for the db1 and db2 on localhost where there is only 1MB left until the space is maxed out + + .EXAMPLE + PS C:\> Get-DbaDbSpace -SqlInstance localhost -Database db1, db2 | Where-Object { $_.SpaceUntilMaxSize.Gigabyte -lt 1 } + + Returns database files and free space information for the db1 and db2 on localhost where there is only 1GB left until the space is maxed out + + #> + [CmdletBinding()] + param ([parameter(ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [Alias("Databases")] + [string[]]$Database, + [string[]]$ExcludeDatabase, + [switch]$IncludeSystemDBs, + [parameter(ValueFromPipeline)] + [Microsoft.SqlServer.Management.Smo.Database[]]$InputObject, + [switch]$EnableException + ) + begin { + $sql = "SELECT SERVERPROPERTY('MachineName') AS ComputerName, + ISNULL(SERVERPROPERTY('InstanceName'), 'MSSQLSERVER') AS InstanceName, + SERVERPROPERTY('ServerName') AS SqlInstance, + DB_NAME() as DBName + ,f.name AS [FileName] + ,fg.name AS [Filegroup] + ,f.physical_name AS [PhysicalName] + ,f.type_desc AS [FileType] + ,CAST(CAST(FILEPROPERTY(f.name, 'SpaceUsed') AS int)/128.0 AS FLOAT) as [UsedSpaceMB] + ,CAST(f.size/128.0 - CAST(FILEPROPERTY(f.name, 'SpaceUsed') AS int)/128.0 AS FLOAT) AS [FreeSpaceMB] + ,CAST((f.size/128.0) AS FLOAT) AS [FileSizeMB] + ,CAST((FILEPROPERTY(f.name, 'SpaceUsed')/(f.size/1.0)) * 100 as FLOAT) as [PercentUsed] + ,CAST((f.growth/128.0) AS FLOAT) AS [GrowthMB] + ,CASE is_percent_growth WHEN 1 THEN 'pct' WHEN 0 THEN 'MB' ELSE 'Unknown' END AS [GrowthType] + ,CASE f.max_size WHEN -1 THEN 2147483648. ELSE CAST((f.max_size/128.0) AS FLOAT) END AS [MaxSizeMB] + ,CAST((f.size/128.0) AS FLOAT) - CAST(CAST(FILEPROPERTY(f.name, 'SpaceUsed') AS int)/128.0 AS FLOAT) AS [SpaceBeforeAutoGrow] + ,CASE f.max_size WHEN (-1) + THEN CAST(((2147483648.) - CAST(FILEPROPERTY(f.name, 'SpaceUsed') AS int))/128.0 AS FLOAT) + ELSE CAST((f.max_size - CAST(FILEPROPERTY(f.name, 'SpaceUsed') AS int))/128.0 AS FLOAT) + END AS [SpaceBeforeMax] + ,CASE f.growth WHEN 0 THEN 0.00 + ELSE CASE f.is_percent_growth WHEN 0 + THEN CASE f.max_size + WHEN (-1) + THEN CAST(((((2147483648.)-f.Size)/f.Growth)*f.Growth)/128.0 AS FLOAT) + ELSE CAST((((f.max_size-f.Size)/f.Growth)*f.Growth)/128.0 AS FLOAT) + END + WHEN 1 + THEN CASE f.max_size + WHEN (-1) + THEN CAST(CONVERT([int],f.Size*power((1)+CONVERT([float],f.Growth)/(100),CONVERT([int],log10(CONVERT([float],(2147483648.))/CONVERT([float],f.Size))/log10((1)+CONVERT([float],f.Growth)/(100)))))/128.0 AS FLOAT) + ELSE CAST(CONVERT([int],f.Size*power((1)+CONVERT([float],f.Growth)/(100),CONVERT([int],log10(CONVERT([float],f.Max_Size)/CONVERT([float],f.Size))/log10((1)+CONVERT([float],f.Growth)/(100)))))/128.0 AS FLOAT) + END + ELSE (0) + END + END AS [PossibleAutoGrowthMB] + , CASE f.max_size WHEN -1 THEN 0 + ELSE CASE f.growth + WHEN 0 THEN (f.max_size - f.size)/128 + ELSE CASE f.is_percent_growth + WHEN 0 + THEN CAST((f.max_size - f.size - ( CONVERT(FLOAT,FLOOR((f.max_size-f.Size)/f.Growth)*f.Growth)))/128.0 AS FLOAT) + ELSE CAST((f.max_size - f.size - ( CONVERT([int],f.Size*power((1)+CONVERT([float],f.Growth)/(100),CONVERT([int],log10(CONVERT([float],f.Max_Size)/CONVERT([float],f.Size))/log10((1)+CONVERT([float],f.Growth)/(100)))))))/128.0 AS FLOAT) + END + END + END AS [UnusableSpaceMB] + + FROM sys.database_files AS f WITH (NOLOCK) + LEFT OUTER JOIN sys.filegroups AS fg WITH (NOLOCK) + ON f.data_space_id = fg.data_space_id" + } + + process { + if ($IncludeSystemDBs) { + Stop-Function -Message "IncludeSystemDBs will be removed. Please pipe in filtered results from Get-DbaDatabase instead." + return + } + if ($SqlInstance) { + $InputObject += Get-DbaDatabase -SqlInstance $SqlInstance -SqlCredential $SqlCredential -Database $Database -ExcludeDatabase $ExcludeDatabase + } + + foreach ($db in $InputObject) { + $server = $db.Parent + if ($server.VersionMajor -lt 9) { + Stop-Function -Message "SQL Server 2000 not supported. $server skipped." -Continue + } + + try { + Write-Message -Level Verbose -Message "Querying $instance - $db." + If ($db.status -ne 'Normal' -or $db.IsAccessible -eq $false) { + Write-Message -Level Warning -Message "$db is not accessible." -Target $db + continue + } + #Execute query against individual database and add to output + foreach ($row in ($db.ExecuteWithResults($sql)).Tables.Rows) { + if ($row.UsedSpaceMB -is [System.DBNull]) { + $UsedMB = 0 + } else { + $UsedMB = [Math]::Round($row.UsedSpaceMB) + } + if ($row.FreeSpaceMB -is [System.DBNull]) { + $FreeMB = 0 + } else { + $FreeMB = [Math]::Round($row.FreeSpaceMB) + } + if ($row.PercentUsed -is [System.DBNull]) { + $PercentUsed = 0 + } else { + $PercentUsed = [Math]::Round($row.PercentUsed) + } + if ($row.SpaceBeforeMax -is [System.DBNull]) { + $SpaceUntilMax = 0 + } else { + $SpaceUntilMax = [Math]::Round($row.SpaceBeforeMax) + } + if ($row.UnusableSpaceMB -is [System.DBNull]) { + $UnusableSpace = 0 + } else { + $UnusableSpace = [Math]::Round($row.UnusableSpaceMB) + } + + [pscustomobject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + Database = $row.DBName + FileName = $row.FileName + FileGroup = $row.FileGroup + PhysicalName = $row.PhysicalName + FileType = $row.FileType + UsedSpace = [dbasize]($UsedMB * 1024 * 1024) + FreeSpace = [dbasize]($FreeMB * 1024 * 1024) + FileSize = [dbasize]($row.FileSizeMB * 1024 * 1024) + PercentUsed = $PercentUsed + AutoGrowth = [dbasize]($row.GrowthMB * 1024 * 1024) + AutoGrowType = $row.GrowthType + SpaceUntilMaxSize = [dbasize]($SpaceUntilMax * 1024 * 1024) + AutoGrowthPossible = [dbasize]($row.PossibleAutoGrowthMB * 1024 * 1024) + UnusableSpace = [dbasize]($UnusableSpace * 1024 * 1024) + } + } + } catch { + Stop-Function -Message "Unable to query $instance - $db." -Target $db -ErrorRecord $_ -Continue + } + } + } + end { + Test-DbaDeprecation -DeprecatedOn "1.0.0" -Alias Get-DbaDatabaseFreeSpace + Test-DbaDeprecation -DeprecatedOn "1.0.0" -Alias Get-DbaDatabaseSpace + } +} +#ValidationTags#Messaging,FlowControl,Pipeline# +function Get-DbaDbState { + <# + .SYNOPSIS + Gets various options for databases, hereby called "states" + + .DESCRIPTION + Gets some common "states" on databases: + - "RW" options : READ_ONLY or READ_WRITE + - "Status" options : ONLINE, OFFLINE, EMERGENCY, RESTORING + - "Access" options : SINGLE_USER, RESTRICTED_USER, MULTI_USER + + Returns an object with SqlInstance, Database, RW, Status, Access + + .PARAMETER SqlInstance + The target SQL Server instance or instances + + .PARAMETER SqlCredential + Credential object used to connect to the SQL Server as a different user + + .PARAMETER Database + The database(s) to process - this list is auto-populated from the server. If unspecified, all databases will be processed. + + .PARAMETER ExcludeDatabase + The database(s) to exclude - this list is auto-populated from the server + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Database + Author: Simone Bizzotto (@niphold) + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaDbState + + .EXAMPLE + PS C:\> Get-DbaDbState -SqlInstance sqlserver2014a + + Gets options for all databases of the sqlserver2014a instance + + .EXAMPLE + PS C:\> Get-DbaDbState -SqlInstance sqlserver2014a -Database HR, Accounting + + Gets options for both HR and Accounting database of the sqlserver2014a instance + + .EXAMPLE + PS C:\> Get-DbaDbState -SqlInstance sqlserver2014a -Exclude HR + + Gets options for all databases of the sqlserver2014a instance except HR + + .EXAMPLE + PS C:\> 'sqlserver2014a', 'sqlserver2014b' | Get-DbaDbState + + Gets options for all databases of sqlserver2014a and sqlserver2014b instances + + #> + [Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSUseLiteralInitializerForHashtable", "")] + [CmdletBinding()] + param ( + [parameter(Mandatory, ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [Alias("Credential")] + [PSCredential] + $SqlCredential, + [Alias("Databases")] + [object[]]$Database, + [object[]]$ExcludeDatabase, + [Alias('Silent')] + [switch]$EnableException + ) + + begin { + + $DbStatesQuery = @' +SELECT +Name = name, +Access = user_access_desc, +Status = state_desc, +RW = CASE WHEN is_read_only = 0 THEN 'READ_WRITE' ELSE 'READ_ONLY' END +FROM sys.databases +'@ + + } + process { + foreach ($instance in $SqlInstance) { + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + $dbStates = $server.Query($DbStatesQuery) + $dbs = $dbStates | Where-Object { @('master', 'model', 'msdb', 'tempdb', 'distribution') -notcontains $_.Name } + if ($Database) { + $dbs = $dbs | Where-Object Name -In $Database + } + if ($ExcludeDatabase) { + $dbs = $dbs | Where-Object Name -NotIn $ExcludeDatabase + } + # "normal" hashtable doesn't account for case sensitivity + $dbStatesHash = New-Object -TypeName System.Collections.Hashtable + foreach ($db in $dbStates) { + $dbStatesHash.Add($db.Name, [pscustomobject]@{ + Access = $db.Access + Status = $db.Status + RW = $db.RW + }) + } + foreach ($db in $dbs) { + $db_status = $dbStatesHash[$db.Name] + [PSCustomObject]@{ + SqlInstance = $server.Name + InstanceName = $server.ServiceName + ComputerName = $server.ComputerName + DatabaseName = $db.Name + RW = $db_status.RW + Status = $db_status.Status + Access = $db_status.Access + Database = $server.Databases[$db.Name] + } | Select-DefaultView -ExcludeProperty Database + } + } + } + end { + Test-DbaDeprecation -DeprecatedOn "1.0.0" -EnableException:$false -Alias Get-DbaDatabaseState + } +} +function Get-DbaDbStoredProcedure { + <# + .SYNOPSIS + Gets database Stored Procedures + + .DESCRIPTION + Gets database Stored Procedures + + .PARAMETER SqlInstance + The target SQL Server instance or instances + + .PARAMETER SqlCredential + Allows you to login to SQL Server using alternative credentials + + .PARAMETER Database + To get Stored Procedures from specific database(s) + + .PARAMETER ExcludeDatabase + The database(s) to exclude - this list is auto populated from the server + + .PARAMETER ExcludeSystemSp + This switch removes all system objects from the Stored Procedure collection + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Database, StoredProcedure, Proc + Author: Klaas Vandenberghe (@PowerDbaKlaas) + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .EXAMPLE + PS C:\> Get-DbaDbStoredProcedure -SqlInstance sql2016 + + Gets all database Stored Procedures + + .EXAMPLE + PS C:\> Get-DbaDbStoredProcedure -SqlInstance Server1 -Database db1 + + Gets the Stored Procedures for the db1 database + + .EXAMPLE + PS C:\> Get-DbaDbStoredProcedure -SqlInstance Server1 -ExcludeDatabase db1 + + Gets the Stored Procedures for all databases except db1 + + .EXAMPLE + PS C:\> Get-DbaDbStoredProcedure -SqlInstance Server1 -ExcludeSystemSp + + Gets the Stored Procedures for all databases that are not system objects + + .EXAMPLE + PS C:\> 'Sql1','Sql2/sqlexpress' | Get-DbaDbStoredProcedure + + Gets the Stored Procedures for the databases on Sql1 and Sql2/sqlexpress + + #> + [CmdletBinding()] + param ( + [parameter(Mandatory, ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [object[]]$Database, + [object[]]$ExcludeDatabase, + [switch]$ExcludeSystemSp, + [Alias('Silent')] + [switch]$EnableException + ) + + process { + foreach ($instance in $SqlInstance) { + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $sqlcredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + $databases = $server.Databases | Where-Object IsAccessible + + if ($Database) { + $databases = $databases | Where-Object Name -In $Database + } + if ($ExcludeDatabase) { + $databases = $databases | Where-Object Name -NotIn $ExcludeDatabase + } + + foreach ($db in $databases) { + if (!$db.IsAccessible) { + Write-Message -Level Warning -Message "Database $db is not accessible. Skipping." + continue + } + if ($db.StoredProcedures.Count -eq 0) { + Write-Message -Message "No Stored Procedures exist in the $db database on $instance" -Target $db -Level Output + continue + } + + foreach ($proc in $db.StoredProcedures) { + if ( (Test-Bound -ParameterName ExcludeSystemSp) -and $proc.IsSystemObject ) { + continue + } + + Add-Member -Force -InputObject $proc -MemberType NoteProperty -Name ComputerName -value $server.ComputerName + Add-Member -Force -InputObject $proc -MemberType NoteProperty -Name InstanceName -value $server.ServiceName + Add-Member -Force -InputObject $proc -MemberType NoteProperty -Name SqlInstance -value $server.DomainInstanceName + Add-Member -Force -InputObject $proc -MemberType NoteProperty -Name Database -value $db.Name + + $defaults = 'ComputerName', 'InstanceName', 'SqlInstance', 'Database', 'Schema', 'ID as ObjectId', 'CreateDate', + 'DateLastModified', 'Name', 'ImplementationType', 'Startup' + Select-DefaultView -InputObject $proc -Property $defaults + } + } + } + } +} +function Get-DbaDbTable { + <# + .SYNOPSIS + Returns a summary of information on the tables + + .DESCRIPTION + Shows table information around table row and data sizes and if it has any table type information. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. This can be a collection and receive pipeline input. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Database + The database(s) to process - this list is auto-populated from the server. If unspecified, all databases will be processed. + + .PARAMETER ExcludeDatabase + The database(s) to exclude - this list is auto-populated from the server + + .PARAMETER IncludeSystemDBs + Switch parameter that when used will display system database information + + .PARAMETER Table + Define a specific table you would like to query. You can specify up to three-part name like db.sch.tbl. + + If the object has special characters please wrap them in square brackets [ ]. + Using dbo.First.Table will try to find table named 'Table' on schema 'First' and database 'dbo'. + The correct way to find table named 'First.Table' on schema 'dbo' is by passing dbo.[First.Table] + Any actual usage of the ] must be escaped by duplicating the ] character. + The correct way to find a table Name] in schema Schema.Name is by passing [Schema.Name].[Name]]] + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Database, Tables + Author: Stephen Bennett, https://sqlnotesfromtheunderground.wordpress.com/ + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaDbTable + + .EXAMPLE + PS C:\> Get-DbaDbTable -SqlInstance DEV01 -Database Test1 + + Return all tables in the Test1 database + + .EXAMPLE + PS C:\> Get-DbaDbTable -SqlInstance DEV01 -Database MyDB -Table MyTable + + Return only information on the table MyTable from the database MyDB + + .EXAMPLE + PS C:\> Get-DbaDbTable -SqlInstance DEV01 -Table MyTable + + Returns information on table called MyTable if it exists in any database on the server, under any schema + + .EXAMPLE + PS C:\> Get-DbaDbTable -SqlInstance DEV01 -Table dbo.[First.Table] + + Returns information on table called First.Table on schema dbo if it exists in any database on the server + + .EXAMPLE + PS C:\> 'localhost','localhost\namedinstance' | Get-DbaDbTable -Database DBA -Table Commandlog + + Returns information on the CommandLog table in the DBA database on both instances localhost and the named instance localhost\namedinstance + + .EXAMPLE + PS C:\> Get-DbaDbTable -SqlInstance DEV01 -Table "[[DbName]]].[Schema.With.Dots].[`"[Process]]`"]" -Verbose + + For the instance Dev01 Returns information for a table named: "[Process]" in schema named: Schema.With.Dots in database named: [DbName] + The Table name, Schema name and Database name must be wrapped in square brackets [ ] + Special charcters like " must be escaped by a ` charcter. + In addition any actual instance of the ] character must be escaped by being duplicated. + #> + [CmdletBinding()] + param ([parameter(ValueFromPipeline, Mandatory)] + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [Alias("Credential")] + [PSCredential]$SqlCredential, + [Alias("Databases")] + [object[]]$Database, + [object[]]$ExcludeDatabase, + [switch]$IncludeSystemDBs, + [string[]]$Table, + [switch][Alias('Silent')] + $EnableException + ) + + begin { + if ($Table) { + $fqtns = @() + foreach ($t in $Table) { + $fqtn = Get-TableNameParts -Table $t + + if (!$fqtn.Parsed) { + Write-Message -Level Warning -Message "Please check you are using proper three-part names. If your search value contains special characters you must use [ ] to wrap the name. The value $t could not be parsed as a valid name." + Continue + } + + $fqtns += [PSCustomObject] @{ + Database = $fqtn.Database + Schema = $fqtn.Schema + Table = $fqtn.Table + InputValue = $fqtn.InputValue + } + } + if (!$fqtns) { + Stop-Function -Message "No Valid Table specified" -ErrorRecord $_ -Target $instance -Continue + } + } + } + + process { + foreach ($instance in $sqlinstance) { + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $sqlcredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + try { + #only look at online databases (Status equal normal) + $dbs = $server.Databases | Where-Object IsAccessible + + #If IncludeSystemDBs is false, exclude systemdbs + if (!$IncludeSystemDBs -and !$Database) { + $dbs = $dbs | Where-Object { !$_.IsSystemObject } + } + + if ($Database) { + $dbs = $dbs | Where-Object { $Database -contains $_.Name } + } + + if ($ExcludeDatabase) { + $dbs = $dbs | Where-Object { $ExcludeDatabase -notcontains $_.Name } + } + } catch { + Stop-Function -Message "Unable to gather dbs for $instance" -Target $instance -Continue -ErrorRecord $_ + } + + foreach ($db in $dbs) { + Write-Message -Level Verbose -Message "Processing $db" + + if ($fqtns) { + $tables = @() + foreach ($fqtn in $fqtns) { + # If the user specified a database in a three-part name, and it's not the + # database currently being processed, skip this table. + if ($fqtn.Database) { + if ($fqtn.Database -ne $db.Name) { + continue + } + } + + $tbl = $db.tables | Where-Object { $_.Name -in $fqtn.Table -and $fqtn.Schema -in ($_.Schema, $null) -and $fqtn.Database -in ($_.Parent.Name, $null) } + + if (-not $tbl) { + Write-Message -Level Verbose -Message "Could not find table $($fqtn.Table) in $db on $server" + } + $tables += $tbl + } + } else { + $tables = $db.Tables + } + + foreach ($sqltable in $tables) { + $sqltable | Add-Member -Force -MemberType NoteProperty -Name ComputerName -Value $server.ComputerName + $sqltable | Add-Member -Force -MemberType NoteProperty -Name InstanceName -Value $server.ServiceName + $sqltable | Add-Member -Force -MemberType NoteProperty -Name SqlInstance -Value $server.DomainInstanceName + $sqltable | Add-Member -Force -MemberType NoteProperty -Name Database -Value $db.Name + + $defaultprops = "ComputerName", "InstanceName", "SqlInstance", "Database", "Schema", "Name", "IndexSpaceUsed", "DataSpaceUsed", "RowCount", "HasClusteredIndex", "IsFileTable", "IsMemoryOptimized", "IsPartitioned", "FullTextIndex", "ChangeTrackingEnabled" + + Select-DefaultView -InputObject $sqltable -Property $defaultprops + } + } + } + } + end { + Test-DbaDeprecation -DeprecatedOn "1.0.0" -EnableException:$false -Alias Get-DbaTable + } +} +function Get-DbaDbTrigger { + <# + .SYNOPSIS + Get all existing database triggers on one or more SQL instances. + + .DESCRIPTION + Get all existing database triggers on one or more SQL instances. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. + + .PARAMETER SqlCredential + SqlCredential object used to connect to the SQL Server as a different user. + + .PARAMETER Database + The database(s) to process - this list is auto-populated from the server. If unspecified, all databases will be processed. + + .PARAMETER ExcludeDatabase + The database(s) to exclude - this list is auto-populated from the server + + .PARAMETER InputObject + Allow pipedline input from Get-DbaDatabase + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/ca + + .NOTES + Tags: Database, Trigger + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaDbTrigger + + .EXAMPLE + PS C:\> Get-DbaDbTrigger -SqlInstance sql2017 + + Returns all database triggers + + .EXAMPLE + PS C:\> Get-DbaDatabase -SqlInstance sql2017 -Database supa | Get-DbaDbTrigger + + Returns all triggers for database supa on sql2017 + + .EXAMPLE + PS C:\> Get-DbaDbTrigger -SqlInstance sql2017 -Database supa + + Returns all triggers for database supa on sql2017 + + #> + [CmdletBinding()] + param ( + [DbaInstanceParameter[]]$SqlInstance, + [Alias("Credential")] + [PSCredential]$SqlCredential, + [object[]]$Database, + [object[]]$ExcludeDatabase, + [parameter(ValueFromPipeline)] + [Microsoft.SqlServer.Management.Smo.Database[]]$InputObject, + [switch]$EnableException + ) + + process { + foreach ($Instance in $SqlInstance) { + $InputObject += Get-DbaDatabase -SqlInstance $SqlInstance -SqlCredential $SqlCredential -Database $Database -ExcludeDatabase $ExcludeDatabase + } + + foreach ($db in $InputObject) { + try { + foreach ($trigger in ($db.Triggers)) { + Add-Member -Force -InputObject $trigger -MemberType NoteProperty -Name ComputerName -value $db.Parent.ComputerName + Add-Member -Force -InputObject $trigger -MemberType NoteProperty -Name InstanceName -value $db.Parent.ServiceName + Add-Member -Force -InputObject $trigger -MemberType NoteProperty -Name SqlInstance -value $db.Parent.DomainInstanceName + Select-DefaultView -InputObject $trigger -Property ComputerName, InstanceName, SqlInstance, Name, IsEnabled, DateLastModified + } + } catch { + Stop-Function -Message "Failure" -ErrorRecord $_ -Continue + } + } + } +} +function Get-DbaDbUdf { + <# + .SYNOPSIS + Gets database User Defined Functions + + .DESCRIPTION + Gets database User Defined Functions + + .PARAMETER SqlInstance + The target SQL Server instance or instances + + .PARAMETER SqlCredential + Allows you to login to SQL Server using alternative credentials + + .PARAMETER Database + To get User Defined Functions from specific database(s) + + .PARAMETER ExcludeDatabase + The database(s) to exclude - this list is auto populated from the server + + .PARAMETER ExcludeSystemUdf + This switch removes all system objects from the UDF collection + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Security, Database + Author: Klaas Vandenberghe (@PowerDbaKlaas) + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .EXAMPLE + PS C:\> Get-DbaDbUdf -SqlInstance sql2016 + + Gets all database User Defined Functions + + .EXAMPLE + PS C:\> Get-DbaDbUdf -SqlInstance Server1 -Database db1 + + Gets the User Defined Functions for the db1 database + + .EXAMPLE + PS C:\> Get-DbaDbUdf -SqlInstance Server1 -ExcludeDatabase db1 + + Gets the User Defined Functions for all databases except db1 + + .EXAMPLE + PS C:\> Get-DbaDbUdf -SqlInstance Server1 -ExcludeSystemUdf + + Gets the User Defined Functions for all databases that are not system objects (there can be 100+ system User Defined Functions in each DB) + + .EXAMPLE + PS C:\> 'Sql1','Sql2/sqlexpress' | Get-DbaDbUdf + + Gets the User Defined Functions for the databases on Sql1 and Sql2/sqlexpress + + #> + [CmdletBinding()] + param ( + [parameter(Mandatory, ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [object[]]$Database, + [object[]]$ExcludeDatabase, + [switch]$ExcludeSystemUdf, + [Alias('Silent')] + [switch]$EnableException + ) + + process { + foreach ($instance in $SqlInstance) { + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $sqlcredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + $databases = $server.Databases | Where-Object IsAccessible + + if ($Database) { + $databases = $databases | Where-Object Name -In $Database + } + if ($ExcludeDatabase) { + $databases = $databases | Where-Object Name -NotIn $ExcludeDatabase + } + + foreach ($db in $databases) { + + $UserDefinedFunctions = $db.UserDefinedFunctions + + if (!$UserDefinedFunctions) { + Write-Message -Message "No User Defined Functions exist in the $db database on $instance" -Target $db -Level Verbose + continue + } + if (Test-Bound -ParameterName ExcludeSystemUdf) { + $UserDefinedFunctions = $UserDefinedFunctions | Where-Object { $_.IsSystemObject -eq $false } + } + + $UserDefinedFunctions | ForEach-Object { + + Add-Member -Force -InputObject $_ -MemberType NoteProperty -Name ComputerName -value $server.ComputerName + Add-Member -Force -InputObject $_ -MemberType NoteProperty -Name InstanceName -value $server.ServiceName + Add-Member -Force -InputObject $_ -MemberType NoteProperty -Name SqlInstance -value $server.DomainInstanceName + Add-Member -Force -InputObject $_ -MemberType NoteProperty -Name Database -value $db.Name + + Select-DefaultView -InputObject $_ -Property ComputerName, InstanceName, SqlInstance, Database, Schema, CreateDate, DateLastModified, Name, DataType + } + } + } + } + + end { + Test-DbaDeprecation -DeprecatedOn "1.0.0" -EnableException:$false -Alias Get-DbaDatabaseUdf + } +} +function Get-DbaDbUser { + <# + .SYNOPSIS + Gets database users + + .DESCRIPTION + Gets database users + + .PARAMETER SqlInstance + The target SQL Server instance or instances + + .PARAMETER SqlCredential + Allows you to login to SQL Server using alternative credentials + + .PARAMETER Database + To get users from specific database(s) + + .PARAMETER ExcludeDatabase + The database(s) to exclude - this list is auto populated from the server + + .PARAMETER ExcludeSystemUser + This switch removes all system objects from the user collection + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Security, Database + Author: Klaas Vandenberghe (@PowerDbaKlaas) + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .EXAMPLE + PS C:\> Get-DbaDbUser -SqlInstance sql2016 + + Gets all database users + + .EXAMPLE + PS C:\> Get-DbaDbUser -SqlInstance Server1 -Database db1 + + Gets the users for the db1 database + + .EXAMPLE + PS C:\> Get-DbaDbUser -SqlInstance Server1 -ExcludeDatabase db1 + + Gets the users for all databases except db1 + + .EXAMPLE + PS C:\> Get-DbaDbUser -SqlInstance Server1 -ExcludeSystemUser + + Gets the users for all databases that are not system objects, like 'dbo', 'guest' or 'INFORMATION_SCHEMA' + + .EXAMPLE + PS C:\> 'Sql1','Sql2/sqlexpress' | Get-DbaDbUser + + Gets the users for the databases on Sql1 and Sql2/sqlexpress + + #> + [CmdletBinding()] + param ( + [parameter(Mandatory, ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [object[]]$Database, + [object[]]$ExcludeDatabase, + [switch]$ExcludeSystemUser, + [Alias('Silent')] + [switch]$EnableException + ) + + process { + foreach ($instance in $SqlInstance) { + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $sqlcredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + $databases = $server.Databases | Where-Object IsAccessible + + if ($Database) { + $databases = $databases | Where-Object Name -In $Database + } + if ($ExcludeDatabase) { + $databases = $databases | Where-Object Name -NotIn $ExcludeDatabase + } + + foreach ($db in $databases) { + + $users = $db.users + + if (!$users) { + Write-Message -Message "No users exist in the $db database on $instance" -Target $db -Level Verbose + continue + } + if (Test-Bound -ParameterName ExcludeSystemUser) { + $users = $users | Where-Object { $_.IsSystemObject -eq $false } + } + + $users | ForEach-Object { + + Add-Member -Force -InputObject $_ -MemberType NoteProperty -Name ComputerName -value $server.ComputerName + Add-Member -Force -InputObject $_ -MemberType NoteProperty -Name InstanceName -value $server.ServiceName + Add-Member -Force -InputObject $_ -MemberType NoteProperty -Name SqlInstance -value $server.DomainInstanceName + Add-Member -Force -InputObject $_ -MemberType NoteProperty -Name Database -value $db.Name + + Select-DefaultView -InputObject $_ -Property ComputerName, InstanceName, SqlInstance, Database, CreateDate, DateLastModified, Name, Login, LoginType, AuthenticationType, State, HasDbAccess, DefaultSchema + } + } + } + } + + end { + Test-DbaDeprecation -DeprecatedOn "1.0.0" -EnableException:$false -Alias Get-DbaDatabaseUser + } +} +function Get-DbaDbView { + <# + .SYNOPSIS + Gets database views for each SqlInstance. + + .DESCRIPTION + Gets database views for each SqlInstance. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. This can be a collection and receive pipeline input to allow the function to be executed against multiple SQL Server instances. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Database + To get views from specific database(s) - this list is auto populated from the server. + + .PARAMETER ExcludeDatabase + The database(s) to exclude - this list is auto populated from the server. + + .PARAMETER ExcludeSystemView + This switch removes all system objects from the view collection. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Security, Database + Author: Klaas Vandenberghe (@PowerDbaKlaas) + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .EXAMPLE + PS C:\> Get-DbaDbView -SqlInstance sql2016 + + Gets all database views + + .EXAMPLE + PS C:\> Get-DbaDbView -SqlInstance Server1 -Database db1 + + Gets the views for the db1 database + + .EXAMPLE + PS C:\> Get-DbaDbView -SqlInstance Server1 -ExcludeDatabase db1 + + Gets the views for all databases except db1 + + .EXAMPLE + PS C:\> Get-DbaDbView -SqlInstance Server1 -ExcludeSystemView + + Gets the views for all databases that are not system objects (there can be 400+ system views in each DB) + + .EXAMPLE + PS C:\> 'Sql1','Sql2/sqlexpress' | Get-DbaDbView + + Gets the views for the databases on Sql1 and Sql2/sqlexpress + + #> + [CmdletBinding()] + param ( + [parameter(Mandatory, ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [object[]]$Database, + [object[]]$ExcludeDatabase, + [switch]$ExcludeSystemView, + [Alias('Silent')] + [switch]$EnableException + ) + + process { + foreach ($instance in $SqlInstance) { + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + $databases = $server.Databases | Where-Object IsAccessible + + if ($Database) { + $databases = $databases | Where-Object Name -In $Database + } + if ($ExcludeDatabase) { + $databases = $databases | Where-Object Name -NotIn $ExcludeDatabase + } + + foreach ($db in $databases) { + $views = $db.views + + if (!$views) { + Write-Message -Message "No views exist in the $db database on $instance" -Target $db -Level Verbose + continue + } + if (Test-Bound -ParameterName ExcludeSystemView) { + $views = $views | Where-Object { $_.IsSystemObject -eq $false } + } + + $views | Foreach-Object { + + Add-Member -Force -InputObject $_ -MemberType NoteProperty -Name ComputerName -value $server.ComputerName + Add-Member -Force -InputObject $_ -MemberType NoteProperty -Name InstanceName -value $server.ServiceName + Add-Member -Force -InputObject $_ -MemberType NoteProperty -Name SqlInstance -value $server.DomainInstanceName + Add-Member -Force -InputObject $_ -MemberType NoteProperty -Name Database -value $db.Name + + Select-DefaultView -InputObject $_ -Property ComputerName, InstanceName, SqlInstance, Database, Schema, CreateDate, DateLastModified, Name + } + } + } + } + end { + Test-DbaDeprecation -DeprecatedOn "1.0.0" -EnableException:$false -Alias Get-DbaDatabaseView + } +} +#ValidationTags#CodeStyle,Messaging,FlowControl,Pipeline# +function Get-DbaDbVirtualLogFile { + <# + .SYNOPSIS + Returns database virtual log file information for database files on a SQL instance. + + .DESCRIPTION + Having a transaction log file with too many virtual log files (VLFs) can hurt database performance. + + Too many VLFs can cause transaction log backups to slow down and can also slow down database recovery and, in extreme cases, even affect insert/update/delete performance. + + References: + http://www.sqlskills.com/blogs/kimberly/transaction-log-vlfs-too-many-or-too-few/ + http://blogs.msdn.com/b/saponsqlserver/archive/2012/02/22/too-many-virtual-log-files-vlfs-can-cause-slow-database-recovery.aspx + + If you've got a high number of VLFs, you can use Expand-SqlTLogResponsibly to reduce the number. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Database + Specifies the database(s) to process. Options for this list are auto-populated from the server. If unspecified, all databases will be processed. + + .PARAMETER ExcludeDatabase + Specifies the database(s) to exclude from processing. Options for this list are auto-populated from the server. + + .PARAMETER IncludeSystemDBs + If this switch is enabled, system database information will be displayed. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: VLF, Database, LogFile + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaDbVirtualLogFile + + .EXAMPLE + PS C:\> Get-DbaDbVirtualLogFile -SqlInstance sqlcluster + + Returns all user database virtual log file details for the sqlcluster instance. + + .EXAMPLE + PS C:\> Get-DbaDbVirtualLogFile -SqlInstance sqlserver | Group-Object -Property Database | Where-Object Count -gt 50 + + Returns user databases that have 50 or more VLFs. + + .EXAMPLE + PS C:\> 'sqlserver','sqlcluster' | Get-DbaDbVirtualLogFile + + Returns all VLF information for the sqlserver and sqlcluster SQL Server instances. Processes data via the pipeline. + + .EXAMPLE + PS C:\> Get-DbaDbVirtualLogFile -SqlInstance sqlcluster -Database db1, db2 + + Returns the VLF counts for the db1 and db2 databases on sqlcluster. + + #> + [CmdletBinding()] + [OutputType([System.Collections.ArrayList])] + param ([parameter(ValueFromPipeline, Mandatory)] + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [Alias("Databases")] + [object[]]$Database, + [object[]]$ExcludeDatabase, + [switch]$IncludeSystemDBs, + [Alias('Silent')] + [switch]$EnableException + ) + + process { + foreach ($instance in $SqlInstance) { + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $sqlcredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + $dbs = $server.Databases | Where-Object IsAccessible + + if ($Database) { + $dbs = $dbs | Where-Object Name -in $Database + } + if ($ExcludeDatabase) { + $dbs = $dbs | Where-Object Name -NotIn $ExcludeDatabase + } + + if (!$IncludeSystemDBs) { + $dbs = $dbs | Where-Object IsSystemObject -eq $false + } + + foreach ($db in $dbs) { + try { + $data = $db.Query("DBCC LOGINFO") + + foreach ($d in $data) { + [pscustomobject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + Database = $db.Name + RecoveryUnitId = $d.RecoveryUnitId + FileId = $d.FileId + FileSize = $d.FileSize + StartOffset = $d.StartOffset + FSeqNo = $d.FSeqNo + Status = $d.Status + Parity = $d.Parity + CreateLsn = $d.CreateLSN + } + } + } catch { + Stop-Function -Message "Unable to query $($db.name) on $instance." -ErrorRecord $_ -Target $db -Continue + } + } + } + } +} +function Get-DbaDefaultPath { + <# + .SYNOPSIS + Gets the default SQL Server paths for data, logs and backups + + .DESCRIPTION + Gets the default SQL Server paths for data, logs and backups + + .PARAMETER SqlInstance + TThe target SQL Server instance or instances. + + .PARAMETER SqlCredential + Allows you to login to servers using SQL Logins as opposed to Windows Auth/Integrated/Trusted. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Config + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaDefaultPath + + .EXAMPLE + PS C:\> Get-DbaDefaultPath -SqlInstance sql01\sharepoint + + Returns the default file paths for sql01\sharepoint + + .EXAMPLE + PS C:\> $servers = "sql2014","sql2016", "sqlcluster\sharepoint" + PS C:\> $servers | Get-DbaDefaultPath + + Returns the default file paths for "sql2014","sql2016" and "sqlcluster\sharepoint" + + #> + [CmdletBinding()] + param ( + [parameter(Position = 0, Mandatory, ValueFromPipeline)] + [Alias("ServerInstance", "Instance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [Alias("Credential")] + [PSCredential] + $SqlCredential, + [Alias('Silent')] + [switch]$EnableException + ) + process { + foreach ($instance in $SqlInstance) { + + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential -AzureUnsupported + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + $dataPath = $server.DefaultFile + if ($dataPath.Length -eq 0) { + $dataPath = $server.Query("SELECT SERVERPROPERTY('InstanceDefaultdataPath') as Data").Data + } + + if ($dataPath -eq [System.DBNull]::Value -or $dataPath.Length -eq 0) { + $dataPath = Split-Path (Get-DbaDatabase -SqlInstance $server -Database model).FileGroups[0].Files[0].FileName + } + + if ($dataPath.Length -eq 0) { + $dataPath = $server.Information.MasterDbPath + } + + $logPath = $server.DefaultLog + + if ($logPath.Length -eq 0) { + $logPath = $server.Query("SELECT SERVERPROPERTY('InstanceDefaultLogPath') as Log").Log + } + + if ($logPath -eq [System.DBNull]::Value -or $logPath.Length -eq 0) { + $logPath = Split-Path (Get-DbaDatabase -SqlInstance $server -Database model).LogFiles.FileName + } + + if ($logPath.Length -eq 0) { + $logPath = $server.Information.MasterDbLogPath + } + + $dataPath = $dataPath.Trim().TrimEnd("\") + $logPath = $logPath.Trim().TrimEnd("\") + + [PSCustomObject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + Data = $dataPath + Log = $logPath + Backup = $server.BackupDirectory + ErrorLog = $server.ErrorlogPath + } + } + } +} +function Get-DbaDependency { + <# + .SYNOPSIS + Finds object dependencies and their relevant creation scripts. + + .DESCRIPTION + This function recursively finds all objects that depends on the input. + It will then retrieve rich information from them, including their creation scripts and the order in which it should be applied. + + By using the 'Parents' switch, the function will instead retrieve all items that the input depends on (including their creation scripts). + + For more details on dependency, see: + https://technet.microsoft.com/en-us/library/ms345449(v=sql.105).aspx + + .PARAMETER InputObject + The SMO object to parse + + .PARAMETER AllowSystemObjects + Normally, system objects are ignored by this function as dependencies. + This switch overrides that behavior. + + .PARAMETER Parents + Causes the function to retrieve all objects that the input depends on, rather than retrieving everything that depends on the input. + + .PARAMETER IncludeSelf + Includes the object whose dependencies are retrieves itself. + Useful when exporting an entire logic structure in order to recreate it in another database. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .PARAMETER IncludeScript + Setting this switch will cause the function to also retrieve the creation script of the dependency. + + .NOTES + Tags: Database, Dependent, Dependency, Object + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaDependency + + .EXAMPLE + PS C:\> $table = (Get-DbaDatabase -SqlInstance sql2012 -Database Northwind).tables | Where Name -eq Customers + PS C:\> $table | Get-DbaDependency + + Returns everything that depends on the "Customers" table + + #> + [CmdletBinding()] + param ( + [Parameter(ValueFromPipeline)]$InputObject, + [switch]$AllowSystemObjects, + [switch]$Parents, + [switch]$IncludeSelf, + [switch]$EnableException + ) + + begin { + #region Utility functions + function Get-DependencyTree { + [CmdletBinding()] + param ( + $Object, + + $Server, + + [bool] + $AllowSystemObjects, + + [bool] + $EnumParents, + + [string] + $FunctionName + ) + + $scripter = New-Object Microsoft.SqlServer.Management.Smo.Scripter + $options = New-Object Microsoft.SqlServer.Management.Smo.ScriptingOptions + $options.DriAll = $true + $options.AllowSystemObjects = $AllowSystemObjects + $options.WithDependencies = $true + $scripter.Options = $options + $scripter.Server = $Server + + $urnCollection = New-Object Microsoft.SqlServer.Management.Smo.UrnCollection + + Write-Message -Level 5 -Message "Adding $Object which is a $($Object.urn.Type)" -FunctionName $FunctionName + $urnCollection.Add([Microsoft.SqlServer.Management.Sdk.Sfc.Urn]$Object.urn) + + #now we set up an event listener go get progress reports + $progressReportEventHandler = [Microsoft.SqlServer.Management.Smo.ProgressReportEventHandler] { + $name = $_.Current.GetAttribute('Name'); + Write-Message -Level 5 -Message "Analysed $name" -FunctionName $FunctionName + } + $scripter.add_DiscoveryProgress($progressReportEventHandler) + + return $scripter.DiscoverDependencies($urnCollection, $EnumParents) + } + + function Read-DependencyTree { + [CmdletBinding()] + param ( + [System.Object] + $InputObject, + + [int] + $Tier, + + [System.Object] + $Parent, + + [bool] + $EnumParents + ) + + Add-Member -Force -InputObject $InputObject -Name Parent -Value $Parent -MemberType NoteProperty + if ($EnumParents) { Add-Member -Force -InputObject $InputObject -Name Tier -Value ($Tier * -1) -MemberType NoteProperty -PassThru } + else { Add-Member -Force -InputObject $InputObject -Name Tier -Value $Tier -MemberType NoteProperty -PassThru } + + if ($InputObject.HasChildNodes) { Read-DependencyTree -InputObject $InputObject.FirstChild -Tier ($Tier + 1) -Parent $InputObject -EnumParents $EnumParents } + if ($InputObject.NextSibling) { Read-DependencyTree -InputObject $InputObject.NextSibling -Tier $Tier -Parent $Parent -EnumParents $EnumParents } + } + + function Get-DependencyTreeNodeDetail { + [CmdletBinding()] + param ( + [Parameter(ValueFromPipeline)] + $SmoObject, + + $Server, + + $OriginalResource, + + [bool] + $AllowSystemObjects + ) + + begin { + $scripter = New-Object Microsoft.SqlServer.Management.Smo.Scripter + $options = New-Object Microsoft.SqlServer.Management.Smo.ScriptingOptions + $options.DriAll = $true + $options.AllowSystemObjects = $AllowSystemObjects + $options.WithDependencies = $true + $scripter.Options = $options + $scripter.Server = $Server + } + + process { + foreach ($Item in $SmoObject) { + $richobject = $Server.GetSmoObject($Item.urn) + $parent = $Server.GetSmoObject($Item.Parent.Urn) + + $NewObject = New-Object Sqlcollaborative.Dbatools.Database.Dependency + $NewObject.ComputerName = $server.ComputerName + $NewObject.ServiceName = $server.ServiceName + $NewObject.SqlInstance = $server.DomainInstanceName + $NewObject.Dependent = $richobject.Name + $NewObject.Type = $Item.Urn.Type + $NewObject.Owner = $richobject.Owner + $NewObject.IsSchemaBound = $Item.IsSchemaBound + $NewObject.Parent = $parent.Name + $NewObject.ParentType = $parent.Urn.Type + $NewObject.Tier = $Item.Tier + $NewObject.Object = $richobject + $NewObject.Urn = $richobject.Urn + $NewObject.OriginalResource = $OriginalResource + + $SQLscript = $scripter.EnumScriptWithList($richobject) + + # I can't remember how to remove these options and their syntax is breaking stuff + $SQLscript = $SQLscript -replace "SET ANSI_NULLS ON", "" + $SQLscript = $SQLscript -replace "SET QUOTED_IDENTIFIER ON", "" + $NewObject.Script = "$SQLscript `r`ngo" + + $NewObject + } + } + } + + function Select-DependencyPrecedence { + [CmdletBinding()] + param ( + [Parameter(ValueFromPipeline)] + $Dependency + ) + + begin { + $list = @() + } + process { + foreach ($dep in $Dependency) { + # Killing the pipeline is generally a bad idea, but since we have to group and sort things, we have not really a choice + $list += $dep + } + } + end { + $list | Group-Object -Property Object | ForEach-Object { $_.Group | Sort-Object -Property Tier -Descending | Select-Object -First 1 } | Sort-Object Tier + } + } + #endregion Utility functions + } + process { + foreach ($Item in $InputObject) { + Write-Message -Level Verbose -Message "Processing: $Item" + if ($null -eq $Item.urn) { + Stop-Function -Message "$Item is not a valid SMO object" -Category InvalidData -Continue -Target $Item + } + + # Find the server object to pass on to the function + $parent = $Item.parent + + do { $parent = $parent.parent } + until (($parent.urn.type -eq "Server") -or (-not $parent)) + + if (-not $parent) { + Stop-Function -Message "Failed to find valid server object in input: $Item" -Category InvalidData -Continue -Target $Item + } + + $server = $parent + + $tree = Get-DependencyTree -Object $Item -AllowSystemObjects $false -Server $server -FunctionName (Get-PSCallStack)[0].COmmand -EnumParents $Parents + $limitCount = 2 + if ($IncludeSelf) { $limitCount = 1 } + if ($tree.Count -lt $limitCount) { + Write-Message -Message "No dependencies detected for $($Item)" -Level Host + continue + } + + if ($IncludeSelf) { $resolved = Read-DependencyTree -InputObject $tree.FirstChild -Tier 0 -Parent $tree.FirstChild -EnumParents $Parents } + else { $resolved = Read-DependencyTree -InputObject $tree.FirstChild.FirstChild -Tier 1 -Parent $tree.FirstChild -EnumParents $Parents } + $resolved | Get-DependencyTreeNodeDetail -Server $server -OriginalResource $Item -AllowSystemObjects $AllowSystemObjects | Select-DependencyPrecedence + } + } +} +function Get-DbaDeprecatedFeature { + <# + .SYNOPSIS + Displays information relating to deprecated features for SQL Server 2005 and above. + + .DESCRIPTION + Displays information relating to deprecated features for SQL Server 2005 and above. + + .PARAMETER SqlInstance + The target SQL Server instance + + .PARAMETER SqlCredential + Login to the target instance using alternate Windows or SQL Login Authentication. Accepts credential objects (Get-Credential). + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Deprecated + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaDeprecatedFeature + + .EXAMPLE + PS C:\> Get-DbaDeprecatedFeature -SqlInstance sql2008, sqlserver2012 + + Check deprecated features for all databases on the servers sql2008 and sqlserver2012. + + .EXAMPLE + PS C:\> Get-DbaDeprecatedFeature -SqlInstance sql2008 + + Check deprecated features on server sql2008. + + #> + [CmdletBinding()] + param ( + [parameter(Position = 0, Mandatory, ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer", "SqlServers")] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [switch]$EnableException + ) + + begin { + $sql = "SELECT SERVERPROPERTY('MachineName') AS ComputerName, + ISNULL(SERVERPROPERTY('InstanceName'), 'MSSQLSERVER') AS InstanceName, + SERVERPROPERTY('ServerName') AS SqlInstance, object_name, instance_name as DeprecatedFeature, object_name as ObjectName, instance_name as deprecated_feature, cntr_value as UsageCount + FROM sys.dm_os_performance_counters WHERE object_name like '%Deprecated%' + and cntr_value > 0 ORDER BY deprecated_feature" + } + + process { + foreach ($instance in $SqlInstance) { + Write-Message -Level Verbose -Message "Attempting to connect to $instance" + + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential -MinimumVersion 9 + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + try { + $server.Query($sql) | Select-DefaultView -Property ComputerName, InstanceName, SqlInstance, ObjectName, DeprecatedFeature, UsageCount + } catch { + Stop-Function -Message "Failure" -ErrorRecord $_ -Target $instance -Continue + } + + } + } +} +function Get-DbaDetachedDatabaseInfo { + <# + .SYNOPSIS + Get detailed information about detached SQL Server database files. + + .DESCRIPTION + Gathers the following information from detached database files: database name, SQL Server version (compatibility level), collation, and file structure. + + "Data files" and "Log file" report the structure of the data and log files as they were when the database was detached. "Database version" is the compatibility level. + + MDF files are most easily read by using a SQL Server to interpret them. Because of this, you must specify a SQL Server and the path must be relative to the SQL Server. + + .PARAMETER SqlInstance + Source SQL Server. This instance must be online and is required to parse the information contained with in the detached database file. + + This function will not attach the database file, it will only use SQL Server to read its contents. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Path + Specifies the path to the MDF file to be read. This path must be readable by the SQL Server service account. Ideally, the MDF will be located on the SQL Server itself, or on a network share to which the SQL Server service account has access. + + .NOTES + Tags: Database, Detach + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaDetachedDatabaseInfo + + .EXAMPLE + PS C:\> Get-DbaDetachedDatabaseInfo -SqlInstance sql2016 -Path M:\Archive\mydb.mdf + + Returns information about the detached database file M:\Archive\mydb.mdf using the SQL Server instance sql2016. The M drive is relative to the SQL Server instance. + + #> + + [CmdletBinding(DefaultParameterSetName = "Default")] + param ( + [parameter(Mandatory)] + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter]$SqlInstance, + [parameter(Mandatory)] + [Alias("Mdf")] + [string]$Path, + [PSCredential]$SqlCredential + ) + + begin { + function Get-MdfFileInfo { + $datafiles = New-Object System.Collections.Specialized.StringCollection + $logfiles = New-Object System.Collections.Specialized.StringCollection + + $servername = $server.name + $serviceaccount = $server.ServiceAccount + + $exists = Test-DbaPath -SqlInstance $server -Path $Path + + if ($exists -eq $false) { + throw "$servername cannot access the file $path. Does the file exist and does the service account ($serviceaccount) have access to the path?" + } + + try { + $detachedDatabaseInfo = $server.DetachedDatabaseInfo($path) + $dbname = ($detachedDatabaseInfo | Where-Object { $_.Property -eq "Database name" }).Value + $exactdbversion = ($detachedDatabaseInfo | Where-Object { $_.Property -eq "Database version" }).Value + $collationid = ($detachedDatabaseInfo | Where-Object { $_.Property -eq "Collation" }).Value + } catch { + throw "$servername cannot read the file $path. Is the database detached?" + } + + switch ($exactdbversion) { + 852 { $dbversion = "SQL Server 2016" } + 829 { $dbversion = "SQL Server 2016 Prerelease" } + 782 { $dbversion = "SQL Server 2014" } + 706 { $dbversion = "SQL Server 2012" } + 684 { $dbversion = "SQL Server 2012 CTP1" } + 661 { $dbversion = "SQL Server 2008 R2" } + 660 { $dbversion = "SQL Server 2008 R2" } + 655 { $dbversion = "SQL Server 2008 SP2+" } + 612 { $dbversion = "SQL Server 2005" } + 611 { $dbversion = "SQL Server 2005" } + 539 { $dbversion = "SQL Server 2000" } + 515 { $dbversion = "SQL Server 7.0" } + 408 { $dbversion = "SQL Server 6.5" } + default { $dbversion = "Unknown" } + } + + $collationsql = "SELECT name FROM fn_helpcollations() where collationproperty(name, N'COLLATIONID') = $collationid" + + try { + $dataset = $server.databases['master'].ExecuteWithResults($collationsql) + $collation = "$($dataset.Tables[0].Rows[0].Item(0))" + } catch { + $collation = $collationid + } + + if ($collation.length -eq 0) { $collation = $collationid } + + try { + foreach ($file in $server.EnumDetachedDatabaseFiles($path)) { + $datafiles += $file + } + + foreach ($file in $server.EnumDetachedLogFiles($path)) { + $logfiles += $file + } + } catch { + throw "$servername unable to enumerate database or log structure information for $path" + } + + $mdfinfo = [pscustomobject]@{ + Name = $dbname + Version = $dbversion + ExactVersion = $exactdbversion + Collation = $collation + DataFiles = $datafiles + LogFiles = $logfiles + } + + return $mdfinfo + } + } + + process { + + $server = Connect-SqlInstance -SqlInstance $SqlInstance -SqlCredential $SqlCredential + $mdfinfo = Get-MdfFileInfo $server $path + + } + + end { + $server.ConnectionContext.Disconnect() + return $mdfinfo + } +} +#ValidationTags#CodeStyle,Messaging,FlowControl,Pipeline# +function Get-DbaDiskSpace { + <# + .SYNOPSIS + Displays disk information for all local disk on a server. + + .DESCRIPTION + Returns a custom object with server name, name of disk, label of disk, total size, free size, percent free, block size and filesystem. + + By default, this function only shows drives of types 2 and 3 (removable disk and local disk). + + Requires Windows administrator access on SQL Servers + + .PARAMETER ComputerName + The target computer. Defaults to localhost. + + .PARAMETER Credential + Credential object used to connect to the computer as a different user. + + .PARAMETER Unit + This parameter has been deprecated and will be removed in 1.0.0 + All properties previously generated through this command are present at the same time, but hidden by default. + + .PARAMETER CheckForSql + If this switch is enabled, disks will be checked for SQL Server data and log files. Windows Authentication is always used for this. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER ExcludeDrive + Filter out drives - format is C:\ + + .PARAMETER Detailed + Output all properties, will be deprecated in 1.0.0 release. Use Force Instead + + .PARAMETER CheckFragmentation + If this switch is enabled, fragmentation of all filesystems will be checked. + + This will increase the runtime of the function by seconds or even minutes per volume. + + .PARAMETER Force + Enabling this switch will cause the command to include ALL drives. + By default, only local disks and removable disks are shown, and hidden volumes are excluded. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .PARAMETER WhatIf + If this switch is enabled, no actions are performed but informational messages will be displayed that explain what would happen if the command were to run. + + .PARAMETER Confirm + If this switch is enabled, you will be prompted for confirmation before executing any operations that change state. + + .NOTES + Tags: Storage, Disk + Author: Chrissy LeMaire (@cl), netnerds.net | Jakob Bindslet + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaDiskSpace + + .EXAMPLE + PS C:\> Get-DbaDiskSpace -ComputerName srv0042 + + Get disk space for the server srv0042. + + .EXAMPLE + PS C:\> Get-DbaDiskSpace -ComputerName srv0042 -Unit MB + + Get disk space for the server srv0042 and displays in megabytes (MB). + + .EXAMPLE + PS C:\> Get-DbaDiskSpace -ComputerName srv0042, srv0007 -Unit TB + + Get disk space from two servers and displays in terabytes (TB). + + .EXAMPLE + PS C:\> Get-DbaDiskSpace -ComputerName srv0042 -Force + + Get all disk and volume space information. + + .EXAMPLE + PS C:\> Get-DbaDiskSpace -ComputerName srv0042 -ExcludeDrive 'C:\' + + Get all disk and volume space information. + + #> + [CmdletBinding()] + param ( + [Parameter(ValueFromPipeline)] + [Alias('ServerInstance', 'SqlInstance', 'SqlServer')] + [DbaInstanceParameter[]]$ComputerName = $env:COMPUTERNAME, + [PSCredential]$Credential, + [ValidateSet('Bytes', 'KB', 'MB', 'GB', 'TB', 'PB')] + [string]$Unit = 'GB', + [switch]$CheckForSql, + [PSCredential]$SqlCredential, + [string[]]$ExcludeDrive, + [Alias('Detailed', 'AllDrives')] + [switch]$CheckFragmentation, + [switch]$Force, + [switch][Alias('Silent')] + $EnableException + ) + + begin { + Test-DbaDeprecation -DeprecatedOn 1.0.0 -Parameter Detailed + Test-DbaDeprecation -DeprecatedOn 1.0.0 -Parameter AllDrives + Test-DbaDeprecation -DeprecatedOn 1.0.0 -Parameter Unit + + $condition = " WHERE DriveType = 2 OR DriveType = 3" + if (Test-Bound 'Force') { + $condition = "" + } + + # Keep track of what computer was already processed to avoid duplicates + $processed = New-Object System.Collections.ArrayList + + <# In order to support properly identifying if a disk/volume is involved with ANY instance on a given computer #> + $sqlDisks = New-Object System.Collections.ArrayList + } + + process { + foreach ($computer in $ComputerName) { + if ($computer.ComputerName -notin $processed) { + $null = $processed.Add($computer.ComputerName) + } else { + continue + } + + try { + $disks = Get-DbaCmObject -ComputerName $computer.ComputerName -Query "SELECT * FROM Win32_Volume$condition" -Credential $Credential -Namespace root\CIMv2 -ErrorAction Stop -WarningAction SilentlyContinue -EnableException + } catch { + Stop-Function -Message "Failed to connect to $computer." -EnableException $EnableException -ErrorRecord $_ -Target $computer.ComputerName -Continue + } + + if ($CheckForSql) { + try { + $sqlServices = Get-DbaService -ComputerName $computer -Type Engine + } catch { + Write-Message -Level Warning -Message "Failed to connect to $computer to gather SQL Server instances, will not be reporting SQL Information." -ErrorRecord $_ -OverrideExceptionMessage -Target $computer.ComputerName + } + + Write-Message -Level Verbose -Message "Instances found on $($computer): $($sqlServices.InstanceName.Count)" + if ($sqlServices.InstanceName.Count -gt 0) { + foreach ($sqlService in $sqlServices) { + if ($sqlService.InstanceName -eq "MSSQLSERVER") { + $instanceName = $sqlService.ComputerName + } else { + $instanceName = "$($sqlService.ComputerName)\$($sqlService.InstanceName)" + } + Write-Message -Level VeryVerbose -Message "Processing instance $($instanceName)" + try { + $server = Connect-SqlInstance -SqlInstance $instanceName -SqlCredential $SqlCredential + if ($server.Version.Major -lt 9) { + $sql = "SELECT DISTINCT SUBSTRING(physical_name, 1, LEN(physical_name) - CHARINDEX('\', REVERSE(physical_name)) + 1) AS SqlDisk FROM sysaltfiles" + } else { + $sql = "SELECT DISTINCT SUBSTRING(physical_name, 1, LEN(physical_name) - CHARINDEX('\', REVERSE(physical_name)) + 1) AS SqlDisk FROM sys.master_files" + } + $results = $server.Query($sql) + if ($results.SqlDisk.Count -gt 0) { + foreach ($sqlDisk in $results.SqlDisk) { + if (-not $sqlDisks.Contains($sqlDisk)) { + $null = $sqlDisks.Add($sqlDisk) + } + } + } + } catch { + Write-Message -Level Warning -Message "Failed to connect to $instanceName on $computer. SQL information may not be accurate or services have been stopped." -ErrorRecord $_ -OverrideExceptionMessage -Target $computer.ComputerName + } + } + } + } + + foreach ($disk in $disks) { + if ($disk.Name -in $ExcludeDrive) { + continue + } + if ($disk.Name.StartsWith('\\') -and (-not $Force)) { + Write-Message -Level Verbose -Message "Skipping disk: $($disk.Name)" -Target $computer.ComputerName + continue + } + + Write-Message -Level Verbose -Message "Processing disk: $($disk.Name)" -Target $computer.ComputerName + + $info = New-Object Sqlcollaborative.Dbatools.Computer.DiskSpace + $info.ComputerName = $computer.ComputerName + $info.Name = $disk.Name + $info.Label = $disk.Label + $info.Capacity = $disk.Capacity + $info.Free = $disk.Freespace + $info.BlockSize = $disk.BlockSize + $info.FileSystem = $disk.FileSystem + $info.Type = $disk.DriveType + + if ($CheckForSql) { + $drivePath = $disk.Name + $info.IsSqlDisk = $false + foreach ($sqlDisk in $sqlDisks) { + if ($sqlDisk -like ($drivePath + '*')) { + $info.IsSqlDisk = $true + break + } + } + } + $info + } + } + } +} +function Get-DbaDump { + <# + .SYNOPSIS + Locate a SQL Server that has generated any memory dump files. + + .DESCRIPTION + The type of dump included in the search include minidump, all-thread dump, or a full dump. The files have an extendion of .mdmp. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. This can be a collection and receive pipeline input to allow the function to be executed against multiple SQL Server instances. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Engine, Corruption + Author: Garry Bargsley (@gbargsley), http://blog.garrybargsley.com + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaDump + + .EXAMPLE + PS C:\> Get-DbaDump -SqlInstance sql2016 + + Shows the detailed information for memory dump(s) located on sql2016 instance + + .EXAMPLE + PS C:\> Get-DbaDump -SqlInstance sql2016 -SqlCredential sqladmin + + Shows the detailed information for memory dump(s) located on sql2016 instance. Logs into the SQL Server using the SQL login 'sqladmin' + + #> + [CmdletBinding()] + param ( + [parameter(Mandatory, ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [switch]$EnableException + ) + begin { + $sql = "SELECT filename, creation_time, size_in_bytes FROM sys.dm_server_memory_dumps" + } + + process { + foreach ($instance in $SqlInstance) { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential + + if ($server.versionMajor -lt 11 -and (-not ($server.versionMajor -eq 10 -and $server.versionMinor -eq 50))) { + Stop-Function -Message "This function does not support versions lower than SQL Server 2008 R2 (v10.50). Skipping server '$instance'" -Continue + } + + try { + foreach ($result in $server.Query($sql)) { + [PSCustomObject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + FileName = $result.filename + CreationTime = $result.creation_time + Size = [dbasize]$result.size_in_bytes + } + } + } catch { + Stop-Function -Message "Issue collecting data on $server" -Target $server -ErrorRecord $_ -Continue + } + } + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function Get-DbaEndpoint { + <# + .SYNOPSIS + Returns endpoint objects from a SQL Server instance. + + .DESCRIPTION + Returns endpoint objects from a SQL Server instance. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Endpoint + Return only specific endpoints. + + .PARAMETER Type + Return only specific types of endpoints. Options include: DatabaseMirroring, ServiceBroker, Soap, and TSql. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Endpoint + Author: Garry Bargsley (@gbargsley), http://blog.garrybargsley.com + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaEndpoint + + .EXAMPLE + PS C:\> Get-DbaEndpoint -SqlInstance localhost + + Returns all endpoints on the local default SQL Server instance + + .EXAMPLE + PS C:\> Get-DbaEndpoint -SqlInstance localhost, sql2016 + + Returns all endpoints for the local and sql2016 SQL Server instances + + #> + [CmdletBinding()] + param ( + [parameter(Position = 0, Mandatory, ValueFromPipeline)] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [string[]]$Endpoint, + [ValidateSet('DatabaseMirroring', 'ServiceBroker', 'Soap', 'TSql')] + [string[]]$Type, + [switch]$EnableException + ) + process { + foreach ($instance in $SqlInstance) { + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential -MinimumVersion 9 + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + # Not sure why minimumversion isnt working + if ($server.VersionMajor -lt 9) { + Stop-Function -Message "SQL Server version 9 required - $instance not supported." -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + $endpoints = $server.Endpoints + + if ($endpoint) { + $endpoints = $endpoints | Where-Object Name -in $endpoint + } + if ($Type) { + $endpoints = $endpoints | Where-Object EndpointType -in $Type + } + + foreach ($end in $endpoints) { + Write-Message -Level Verbose -Message "Getting endpoint $($end.Name) on $($server.Name)" + if ($end.Protocol.Tcp.ListenerPort) { + if ($instance.ComputerName -match '\.') { + $dns = $instance.ComputerName + } else { + try { + $dns = [System.Net.Dns]::GetHostEntry($instance.ComputerName).HostName + } catch { + try { + $dns = [System.Net.Dns]::GetHostAddresses($instance.ComputerName) + } catch { + $dns = $instance.ComputerName + } + } + } + + $fqdn = "TCP://" + $dns + ":" + $end.Protocol.Tcp.ListenerPort + } else { + $fqdn = $null + } + + Add-Member -Force -InputObject $end -MemberType NoteProperty -Name ComputerName -Value $server.ComputerName + Add-Member -Force -InputObject $end -MemberType NoteProperty -Name InstanceName -Value $server.ServiceName + Add-Member -Force -InputObject $end -MemberType NoteProperty -Name SqlInstance -Value $server.DomainInstanceName + Add-Member -Force -InputObject $end -MemberType NoteProperty -Name Fqdn -Value $fqdn + Add-Member -Force -InputObject $end -MemberType NoteProperty -Name Port -Value $end.Protocol.Tcp.ListenerPort + if ($end.Protocol.Tcp.ListenerPort) { + Select-DefaultView -InputObject $end -Property ComputerName, InstanceName, SqlInstance, ID, Name, Port, EndpointState, EndpointType, Owner, IsAdminEndpoint, Fqdn, IsSystemObject + } else { + Select-DefaultView -InputObject $end -Property ComputerName, InstanceName, SqlInstance, ID, Name, EndpointState, EndpointType, Owner, IsAdminEndpoint, Fqdn, IsSystemObject + } + } + } + } +} +function Get-DbaErrorLog { + <# + .SYNOPSIS + Gets the "SQL Error Log" of an instance + + .DESCRIPTION + Gets the "SQL Error Log" of an instance. Returns all 10 error logs by default. + + .PARAMETER SqlInstance + TThe target SQL Server instance or instances. + + .PARAMETER SqlCredential + Allows you to login to servers using SQL Logins as opposed to Windows Auth/Integrated/Trusted. + + .PARAMETER LogNumber + An Int32 value that specifies the index number of the error log required. + Error logs are listed 0 through 99, where 0 is the current error log and 99 is potential oldest log file. + + SQL Server errorlog rollover defaults to 6, but can be increased to 99. https://docs.microsoft.com/en-us/sql/database-engine/configure-windows/scm-services-configure-sql-server-error-logs + + .PARAMETER Source + Filter results based on the Source of the error (e.g. Logon, Server, etc.) + + .PARAMETER Text + Filter results based on a pattern of text (e.g. "login failed", "error: 12345"). + + .PARAMETER After + Filter the results based on datetime value. + + .PARAMETER Before + Filter the results based on datetime value. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Instance, ErrorLog + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaErrorLog + + .EXAMPLE + PS C:\> Get-DbaErrorLog -SqlInstance sql01\sharepoint + + Returns every log entry from sql01\sharepoint SQL Server instance. + + .EXAMPLE + PS C:\> Get-DbaErrorLog -SqlInstance sql01\sharepoint -LogNumber 3, 6 + + Returns all log entries for log number 3 and 6 on sql01\sharepoint SQL Server instance. + + .EXAMPLE + PS C:\> Get-DbaErrorLog -SqlInstance sql01\sharepoint -Source Logon + + Returns every log entry, with a source of Logon, from sql01\sharepoint SQL Server instance. + + .EXAMPLE + PS C:\> Get-DbaErrorLog -SqlInstance sql01\sharepoint -LogNumber 3 -Text "login failed" + + Returns every log entry for log number 3, with "login failed" in the text, from sql01\sharepoint SQL Server instance. + + .EXAMPLE + PS C:\> $servers = "sql2014","sql2016", "sqlcluster\sharepoint" + PS C:\> $servers | Get-DbaErrorLog -LogNumber 0 + + Returns the most recent SQL Server error logs for "sql2014","sql2016" and "sqlcluster\sharepoint" + + .EXAMPLE + PS C:\> Get-DbaErrorLog -SqlInstance sql01\sharepoint -After '2016-11-14 00:00:00' + + Returns every log entry found after the date 14 November 2016 from sql101\sharepoint SQL Server instance. + + .EXAMPLE + PS C:\> Get-DbaErrorLog -SqlInstance sql01\sharepoint -Before '2016-08-16 00:00:00' + + Returns every log entry found before the date 16 August 2016 from sql101\sharepoint SQL Server instance. + + #> + [CmdletBinding()] + param ( + [Parameter(ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [Alias("Credential")] + [PSCredential]$SqlCredential, + [ValidateRange(0, 99)] + [int[]]$LogNumber, + [object[]]$Source, + [string]$Text, + [datetime]$After, + [datetime]$Before, + [Alias('Silent')] + [switch]$EnableException + ) + begin { + Test-DbaDeprecation -DeprecatedOn "1.0.0" -Alias Get-DbaLog + } + process { + foreach ($instance in $SqlInstance) { + + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + if ($LogNumber) { + foreach ($number in $lognumber) { + foreach ($object in $server.ReadErrorLog($number)) { + if ( ($Source -and $object.ProcessInfo -ne $Source) -or ($Text -and $object.Text -notlike "*$Text*") -or ($After -and $object.LogDate -lt $After) -or ($Before -and $object.LogDate -gt $Before) ) { + continue + } + Write-Message -Level Verbose -Message "Processing $object" + Add-Member -Force -InputObject $object -MemberType NoteProperty ComputerName -value $server.ComputerName + Add-Member -Force -InputObject $object -MemberType NoteProperty InstanceName -value $server.ServiceName + Add-Member -Force -InputObject $object -MemberType NoteProperty SqlInstance -value $server.DomainInstanceName + + # Select all of the columns you'd like to show + Select-DefaultView -InputObject $object -Property ComputerName, InstanceName, SqlInstance, LogDate, 'ProcessInfo as Source', Text + } + } + } else { + foreach ($object in $server.ReadErrorLog()) { + if ( ($Source -and $object.ProcessInfo -ne $Source) -or ($Text -and $object.Text -notlike "*$Text*") -or ($After -and $object.LogDate -lt $After) -or ($Before -and $object.LogDate -gt $Before) ) { + continue + } + Write-Message -Level Verbose -Message "Processing $object" + Add-Member -Force -InputObject $object -MemberType NoteProperty ComputerName -value $server.ComputerName + Add-Member -Force -InputObject $object -MemberType NoteProperty InstanceName -value $server.ServiceName + Add-Member -Force -InputObject $object -MemberType NoteProperty SqlInstance -value $server.DomainInstanceName + + # Select all of the columns you'd like to show + Select-DefaultView -InputObject $object -Property ComputerName, InstanceName, SqlInstance, LogDate, 'ProcessInfo as Source', Text + } + } + } + } +} +function Get-DbaErrorLogConfig { + <# + .SYNOPSIS + Pulls the configuration for the ErrorLog on a given SQL Server instance + + .DESCRIPTION + Pulls the configuration for the ErrorLog on a given SQL Server instance. + + Includes error log path, number of log files configured and size (SQL Server 2012+ only) + + .PARAMETER SqlInstance + The target SQL Server instance or instances + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Instance, ErrorLog + Author: Shawn Melton (@wsmelton), https://wsmelton.github.io + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaErrorLogConfig + + .EXAMPLE + PS C:\> Get-DbaErrorLogConfig -SqlInstance server2017,server2014 + + Returns error log configuration for server2017 and server2014 + + #> + [cmdletbinding()] + param ( + [Parameter(ValueFromPipeline, Mandatory)] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [switch]$EnableException + ) + process { + foreach ($instance in $SqlInstance) { + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + $numLogs = $server.NumberOfLogFiles + $logSize = + if ($server.VersionMajor -ge 11) { + [dbasize]($server.ErrorLogSizeKb * 1024) + } else { + $null + } + + [PSCustomObject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + LogCount = $numLogs + LogSize = $logSize + LogPath = $server.ErrorLogPath + } + } + } +} +function Get-DbaEstimatedCompletionTime { + <# + .SYNOPSIS + Gets execution and estimated completion time information for queries + + .DESCRIPTION + Gets execution and estimated completion time information for queries + + Percent complete will show for the following commands + + ALTER INDEX REORGANIZE + AUTO_SHRINK option with ALTER DATABASE + BACKUP DATABASE + DBCC CHECKDB + DBCC CHECKFILEGROUP + DBCC CHECKTABLE + DBCC INDEXDEFRAG + DBCC SHRINKDATABASE + DBCC SHRINKFILE + RECOVERY + RESTORE DATABASE + ROLLBACK + TDE ENCRYPTION + + For additional information, check out https://blogs.sentryone.com/loriedwards/patience-dm-exec-requests/ and https://docs.microsoft.com/en-us/sql/relational-databases/system-dynamic-management-views/sys-dm-exec-requests-transact-sql + + .PARAMETER SqlInstance + The target SQL Server instance or instances. + + .PARAMETER SqlCredential + SqlCredential object used to connect to the SQL Server as a different user. + + .PARAMETER Database + The database(s) to process - this list is auto-populated from the server. If unspecified, all databases will be processed. + + .PARAMETER ExcludeDatabase + The database(s) to exclude - this list is auto-populated from the server + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Database + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaEstimatedCompletionTime + + .EXAMPLE + PS C:\> Get-DbaEstimatedCompletionTime -SqlInstance sql2016 + + Gets estimated completion times for queries performed against the entire server + + .EXAMPLE + PS C:\> Get-DbaEstimatedCompletionTime -SqlInstance sql2016 | Select * + + Gets estimated completion times for queries performed against the entire server PLUS the SQL query text of each command + + .EXAMPLE + PS C:\> Get-DbaEstimatedCompletionTime -SqlInstance sql2016 | Where-Object { $_.Text -match 'somequerytext' } + + Gets results for commands whose queries only match specific text (match is like LIKE but way more powerful) + + .EXAMPLE + PS C:\> Get-DbaEstimatedCompletionTime -SqlInstance sql2016 -Database Northwind,pubs,Adventureworks2014 + + Gets estimated completion times for queries performed against the Northwind, pubs, and Adventureworks2014 databases + + #> + [CmdletBinding()] + param ( + [parameter(Mandatory, ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [Alias("Databases")] + [object[]]$Database, + [object[]]$ExcludeDatabase, + [Alias('Silent')] + [switch]$EnableException + ) + + begin { + $sql = "SELECT + DB_NAME(r.database_id) as [Database], + USER_NAME(r.user_id) as [Login], + Command, + start_time as StartTime, + percent_complete as PercentComplete, + + RIGHT('00000' + CAST(((DATEDIFF(s,start_time,GetDate()))/3600) as varchar), + CASE + WHEN LEN(((DATEDIFF(s,start_time,GetDate()))/3600)) < 2 THEN 2 + ELSE LEN(((DATEDIFF(s,start_time,GetDate()))/3600)) + END) + ':' + + RIGHT('00' + CAST((DATEDIFF(s,start_time,GetDate())%3600)/60 as varchar), 2) + ':' + + RIGHT('00' + CAST((DATEDIFF(s,start_time,GetDate())%60) as varchar), 2) as RunningTime, + + RIGHT('00000' + CAST((estimated_completion_time/3600000) as varchar), + CASE + WHEN LEN((estimated_completion_time/3600000)) < 2 THEN 2 + ELSE LEN((estimated_completion_time/3600000)) + END) + ':' + + RIGHT('00' + CAST((estimated_completion_time %3600000)/60000 as varchar), 2) + ':' + + RIGHT('00' + CAST((estimated_completion_time %60000)/1000 as varchar), 2) as EstimatedTimeToGo, + dateadd(second,estimated_completion_time/1000, getdate()) as EstimatedCompletionTime, + s.Text + FROM sys.dm_exec_requests r + CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) s" + } + + process { + foreach ($instance in $SqlInstance) { + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential + + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + if ($Database) { + $includedatabases = $Database -join "','" + $sql = "$sql WHERE DB_NAME(r.database_id) in ('$includedatabases')" + } + + if ($ExcludeDatabase) { + $excludedatabases = $ExcludeDatabase -join "','" + $sql = "$sql WHERE DB_NAME(r.database_id) not in ('$excludedatabases')" + } + + Write-Message -Level Debug -Message $sql + foreach ($row in ($server.Query($sql))) { + [pscustomobject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + Database = $row.Database + Login = $row.Login + Command = $row.Command + PercentComplete = $row.PercentComplete + StartTime = $row.StartTime + RunningTime = $row.RunningTime + EstimatedTimeToGo = $row.EstimatedTimeToGo + EstimatedCompletionTime = $row.EstimatedCompletionTime + Text = $row.Text + } | Select-DefaultView -ExcludeProperty Text + } + } + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function Get-DbaExecutionPlan { + <# + .SYNOPSIS + Gets execution plans and metadata + + .DESCRIPTION + Gets execution plans and metadata. Can pipe to Export-DbaExecutionPlan + + Thanks to following for the queries: + https://www.simple-talk.com/sql/t-sql-programming/dmvs-for-query-plan-metadata/ + http://www.scarydba.com/2017/02/13/export-plans-cache-sqlplan-file/ + + .PARAMETER SqlInstance + The target SQL Server instance or instances. + + .PARAMETER SqlCredential + Credential object used to connect to the SQL Server as a different user + + .PARAMETER Database + Return execution plans and metadata for only specific databases. + + .PARAMETER ExcludeDatabase + Return execution plans and metadata for all but these specific databases + + .PARAMETER SinceCreation + Datetime object used to narrow the results to a date + + .PARAMETER SinceLastExecution + Datetime object used to narrow the results to a date + + .PARAMETER ExcludeEmptyQueryPlan + Exclude results with empty query plan + + .PARAMETER Force + Returns a ton of raw information about the execution plans + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Performance + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaExecutionPlan + + .EXAMPLE + PS C:\> Get-DbaExecutionPlan -SqlInstance sqlserver2014a + + Gets all execution plans on sqlserver2014a + + .EXAMPLE + PS C:\> Get-DbaExecutionPlan -SqlInstance sqlserver2014a -Database db1, db2 -SinceLastExecution '2016-07-01 10:47:00' + + Gets all execution plans for databases db1 and db2 on sqlserver2014a since July 1, 2016 at 10:47 AM. + + .EXAMPLE + PS C:\> Get-DbaExecutionPlan -SqlInstance sqlserver2014a, sql2016 -Exclude db1 | Format-Table + + Gets execution plan info for all databases except db1 on sqlserver2014a and sql2016 and makes the output pretty + + .EXAMPLE + PS C:\> Get-DbaExecutionPlan -SqlInstance sql2014 -Database AdventureWorks2014, pubs -Force + + Gets super detailed information for execution plans on only for AdventureWorks2014 and pubs + + .EXAMPLE + PS C:\> $servers = "sqlserver2014a","sql2016t" + PS C:\> $servers | Get-DbaExecutionPlan -Force + + Gets super detailed information for execution plans on sqlserver2014a and sql2016 + + #> + [CmdletBinding()] + param ( + [parameter(Mandatory, ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [Alias("Credential")] + [PSCredential]$SqlCredential, + [object[]]$Database, + [object[]]$ExcludeDatabase, + [datetime]$SinceCreation, + [datetime]$SinceLastExecution, + [switch]$ExcludeEmptyQueryPlan, + [switch]$Force, + [switch]$EnableException + ) + + process { + + foreach ($instance in $sqlinstance) { + try { + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $sqlcredential -MinimumVersion 9 + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + if ($force -eq $true) { + $select = "SELECT * " + } else { + $select = "SELECT DB_NAME(deqp.dbid) as DatabaseName, OBJECT_NAME(deqp.objectid) as ObjectName, + detqp.query_plan AS SingleStatementPlan, + deqp.query_plan AS BatchQueryPlan, + ROW_NUMBER() OVER ( ORDER BY Statement_Start_offset ) AS QueryPosition, + sql_handle as SqlHandle, + plan_handle as PlanHandle, + creation_time as CreationTime, + last_execution_time as LastExecutionTime" + } + + $from = " FROM sys.dm_exec_query_stats deqs + CROSS APPLY sys.dm_exec_text_query_plan(deqs.plan_handle, + deqs.statement_start_offset, + deqs.statement_end_offset) AS detqp + CROSS APPLY sys.dm_exec_query_plan(deqs.plan_handle) AS deqp + CROSS APPLY sys.dm_exec_sql_text(deqs.plan_handle) AS execText" + + if ($ExcludeDatabase -or $Database -or $SinceCreation -or $SinceLastExecution -or $ExcludeEmptyQueryPlan -eq $true) { + $where = " WHERE " + } + + $wherearray = @() + + if ($Database) { + $dblist = $Database -join "','" + $wherearray += " DB_NAME(deqp.dbid) in ('$dblist') " + } + + if ($null -ne $SinceCreation) { + Write-Message -Level Verbose -Message "Adding creation time" + $wherearray += " creation_time >= '" + $SinceCreation.ToString("yyyy-MM-dd HH:mm:ss") + "' " + } + + if ($null -ne $SinceLastExecution) { + Write-Message -Level Verbose -Message "Adding last exectuion time" + $wherearray += " last_execution_time >= '" + $SinceLastExecution.ToString("yyyy-MM-dd HH:mm:ss") + "' " + } + + if ($ExcludeDatabase) { + $dblist = $ExcludeDatabase -join "','" + $wherearray += " DB_NAME(deqp.dbid) not in ('$dblist') " + } + + if ($ExcludeEmptyQueryPlan) { + $wherearray += " detqp.query_plan is not null" + } + + if ($where.length -gt 0) { + $wherearray = $wherearray -join " and " + $where = "$where $wherearray" + } + + $sql = "$select $from $where" + Write-Message -Level Debug -Message $sql + + if ($Force -eq $true) { + $server.Query($sql) + } else { + foreach ($row in $server.Query($sql)) { + $simple = ([xml]$row.SingleStatementPlan).ShowPlanXML.BatchSequence.Batch.Statements.StmtSimple + $sqlhandle = "0x"; $row.sqlhandle | ForEach-Object { $sqlhandle += ("{0:X}" -f $_).PadLeft(2, "0") } + $planhandle = "0x"; $row.planhandle | ForEach-Object { $planhandle += ("{0:X}" -f $_).PadLeft(2, "0") } + $planWarnings = $simple.QueryPlan.Warnings.PlanAffectingConvert; + + [pscustomobject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + DatabaseName = $row.DatabaseName + ObjectName = $row.ObjectName + QueryPosition = $row.QueryPosition + SqlHandle = $SqlHandle + PlanHandle = $PlanHandle + CreationTime = $row.CreationTime + LastExecutionTime = $row.LastExecutionTime + StatementCondition = ([xml]$row.SingleStatementPlan).ShowPlanXML.BatchSequence.Batch.Statements.StmtCond + StatementSimple = $simple + StatementId = $simple.StatementId + StatementCompId = $simple.StatementCompId + StatementType = $simple.StatementType + RetrievedFromCache = $simple.RetrievedFromCache + StatementSubTreeCost = $simple.StatementSubTreeCost + StatementEstRows = $simple.StatementEstRows + SecurityPolicyApplied = $simple.SecurityPolicyApplied + StatementOptmLevel = $simple.StatementOptmLevel + QueryHash = $simple.QueryHash + QueryPlanHash = $simple.QueryPlanHash + StatementOptmEarlyAbortReason = $simple.StatementOptmEarlyAbortReason + CardinalityEstimationModelVersion = $simple.CardinalityEstimationModelVersion + + ParameterizedText = $simple.ParameterizedText + StatementSetOptions = $simple.StatementSetOptions + QueryPlan = $simple.QueryPlan + BatchConditionXml = ([xml]$row.BatchQueryPlan).ShowPlanXML.BatchSequence.Batch.Statements.StmtCond + BatchSimpleXml = ([xml]$row.BatchQueryPlan).ShowPlanXML.BatchSequence.Batch.Statements.StmtSimple + BatchQueryPlanRaw = [xml]$row.BatchQueryPlan + SingleStatementPlanRaw = [xml]$row.SingleStatementPlan + PlanWarnings = $planWarnings + } | Select-DefaultView -ExcludeProperty BatchQueryPlan, SingleStatementPlan, BatchConditionXmlRaw, BatchQueryPlanRaw, SingleStatementPlanRaw, PlanWarnings + } + } + } catch { + Stop-Function -Message "Query Failure Failure" -ErrorRecord $_ -Target $instance -Continue + } + } + } +} +#ValidationTags#CodeStyle,Messaging,FlowControl,Pipeline# +function Get-DbaFeature { + <# + .SYNOPSIS + Runs the SQL Server feature discovery report (setup.exe /Action=RunDiscovery) + + .DESCRIPTION + Runs the SQL Server feature discovery report (setup.exe /Action=RunDiscovery) + + Inspired by Dave Mason's (@BeginTry) post at + https://itsalljustelectrons.blogspot.be/2018/04/SQL-Server-Discovery-Report.html + + Assumptions: + 1. The sub-folder "Microsoft SQL Server" exists in $env:ProgramFiles, + even if SQL was installed to a non-default path. This has been + verified on SQL 2008R2 and SQL 2012. Further verification may be needed. + 2. The discovery report displays installed components for the version of SQL + Server associated with setup.exe, along with installed components of all + lesser versions of SQL Server that are installed. + + .PARAMETER ComputerName + The target computer. If the target is not localhost, it must have PowerShell remoting enabled. + + Note that this is not the SqlInstance, but rather the ComputerName + + .PARAMETER Credential + Allows you to login to servers using alternative credentials. To use: + + $cred = Get-Credential, then pass $cred object to the -Credential parameter. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Feature, Component + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaFeature + + .EXAMPLE + PS C:\> Get-DbaFeature -ComputerName sql2017, sql2016, sql2005 + + Gets all SQL Server features for all instances on sql2017, sql2016 and sql2005. + + .EXAMPLE + PS C:\> Get-DbaFeature -Verbose + + Gets all SQL Server features for all instances on localhost. Outputs to screen if no instances are found. + + .EXAMPLE + PS C:\> Get-DbaFeature -ComputerName sql2017 -Credential ad\sqldba + + Gets all SQL Server features for all instances on sql2017 using the ad\sqladmin credential (which has access to the Windows Server). + + #> + [CmdletBinding()] + param ( + [parameter(ValueFromPipeline)] + [DbaInstanceParameter[]]$ComputerName = $env:COMPUTERNAME, + [PSCredential]$Credential, + [switch]$EnableException + ) + + begin { + $scriptblock = { + $setup = Get-ChildItem -Recurse -Include setup.exe -Path "$env:ProgramFiles\Microsoft SQL Server" -ErrorAction SilentlyContinue | + Where-Object { $_.FullName -match 'Setup Bootstrap\\SQL' -or $_.FullName -match 'Bootstrap\\Release\\Setup.exe' -or $_.FullName -match 'Bootstrap\\Setup.exe' } | + Sort-Object FullName -Descending | Select-Object -First 1 + if ($setup) { + $null = Start-Process -FilePath $setup.FullName -ArgumentList "/Action=RunDiscovery /q" -Wait + $parent = Split-Path (Split-Path $setup.Fullname) + $xmlfile = Get-ChildItem -Recurse -Include SqlDiscoveryReport.xml -Path $parent | Sort-Object LastWriteTime -Descending | Select-Object -First 1 + + if ($xmlfile) { + $xml = [xml](Get-Content -Path $xmlfile) + $xml.ArrayOfDiscoveryInformation.DiscoveryInformation + } + } + } + } + + process { + foreach ($computer in $ComputerName) { + try { + $results = Invoke-Command2 -ComputerName $Computer -ScriptBlock $scriptblock -Credential $Credential -Raw + + if (-not $results) { + Write-Message -Level Verbose -Message "No features found on $computer" + } + + foreach ($result in $results) { + [pscustomobject]@{ + ComputerName = $computer + Product = $result.Product + Instance = $result.Instance + InstanceID = $result.InstanceID + Feature = $result.Feature + Language = $result.Language + Edition = $result.Edition + Version = $result.Version + Clustered = $result.Clustered + Configured = $result.Configured + } + } + } catch { + Stop-Function -Continue -ErrorRecord $_ -Message "Failure" + } + } + } + end { + Test-DbaDeprecation -DeprecatedOn "1.0.0" -EnableException:$false -Alias Get-DbaSqlFeature + } +} +function Get-DbaFile { + <# + .SYNOPSIS + Get-DbaFile finds files in any directory specified on a remote SQL Server + + .DESCRIPTION + This command searches all specified directories, allowing a DBA to see file information on a server without direct access + + You can filter by extension using the -FileType parameter. By default, the default data directory will be returned. You can provide and additional paths to search using the -Path parameter. + + Thanks to serg-52 for the query: https://www.sqlservercentral.com/Forums/Topic1642213-391-1.aspx + + .PARAMETER SqlInstance + The target SQL Server instance or instances. + + .PARAMETER SqlCredential + Allows you to login to servers using alternative credentials + + .PARAMETER Path + Used to specify extra directories to search in addition to the default data directory. + + .PARAMETER FileType + Used to specify filter by filetype. No dot required, just pass the extension. + + .PARAMETER Depth + Used to specify recursive folder depth. Default is 1, non-recursive. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Discovery + Author: Brandon Abshire, netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaFile + + .EXAMPLE + PS C:\> Get-DbaFile -SqlInstance sqlserver2014a -Path E:\Dir1 + + Logs into the SQL Server "sqlserver2014a" using Windows credentials and searches E:\Dir for all files + + .EXAMPLE + PS C:\> Get-DbaFile -SqlInstance sqlserver2014a -SqlCredential $cred -Path 'E:\sql files' + + Logs into the SQL Server "sqlserver2014a" using alternative credentials and returns all files in 'E:\sql files' + + .EXAMPLE + PS C:\> $all = Get-DbaDefaultPath -SqlInstance sql2014 + PS C:\> Get-DbaFile -SqlInstance sql2014 -Path $all.Data, $all.Log, $all.Backup -Depth 3 + + Returns the files in the default data, log and backup directories on sql2014, 3 directories deep (recursively). + + .EXAMPLE + PS C:\> Get-DbaFile -SqlInstance sql2014 -Path 'E:\Dir1', 'E:\Dir2' + + Returns the files in "E:\Dir1" and "E:Dir2" on sql2014 + + .EXAMPLE + PS C:\> Get-DbaFile -SqlInstance sql2014, sql2016 -Path 'E:\Dir1' -FileType fsf, mld + + Finds files in E:\Dir1 ending with ".fsf" and ".mld" for both the servers sql2014 and sql2016. + + #> + [CmdletBinding()] + param ( + [parameter(Mandatory, ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [string[]]$Path, + [string[]]$FileType, + [int]$Depth = 1, + [Alias('Silent')] + [switch]$EnableException + ) + begin { + $sql = "" + + function Get-SQLDirTreeQuery { + param + ( + $PathList + ) + + $q1 += "DECLARE @myPath nvarchar(4000); + DECLARE @depth SMALLINT = $Depth; + + IF OBJECT_ID('tempdb..#DirectoryTree') IS NOT NULL + DROP TABLE #DirectoryTree; + + CREATE TABLE #DirectoryTree ( + id int IDENTITY(1,1) + ,subdirectory nvarchar(512) + ,depth int + ,isfile bit + , ParentDirectory int + ,flag tinyint default(0));" + + $q2 = "SET @myPath = 'dirname' + -- top level directory + INSERT #DirectoryTree (subdirectory,depth,isfile) + VALUES (@myPath,0,0); + -- all the rest under top level + INSERT #DirectoryTree (subdirectory,depth,isfile) + EXEC master.sys.xp_dirtree @myPath,@depth,1; + + + UPDATE #DirectoryTree + SET ParentDirectory = ( + SELECT MAX(Id) FROM #DirectoryTree + WHERE Depth = d.Depth - 1 AND Id < d.Id ) + FROM #DirectoryTree d + WHERE ParentDirectory is NULL;" + + $query_files_sql = "-- SEE all with full paths + WITH dirs AS ( + SELECT + Id,subdirectory,depth,isfile,ParentDirectory,flag + , CAST (null AS NVARCHAR(MAX)) AS container + , CAST([subdirectory] AS NVARCHAR(MAX)) AS dpath + FROM #DirectoryTree + WHERE ParentDirectory IS NULL + UNION ALL + SELECT + d.Id,d.subdirectory,d.depth,d.isfile,d.ParentDirectory,d.flag + , dpath as container + , dpath +'\'+d.[subdirectory] + FROM #DirectoryTree AS d + INNER JOIN dirs ON d.ParentDirectory = dirs.id + WHERE dpath NOT LIKE '%RECYCLE.BIN%' + ) + SELECT subdirectory as filename, container as filepath, isfile, dpath as fullpath FROM dirs + WHERE container IS NOT NULL + -- Dir style ordering + ORDER BY container, isfile, subdirectory" + + # build the query string based on how many directories they want to enumerate + $sql = $q1 + $sql += $($PathList | Where-Object { $_ -ne '' } | ForEach-Object { "$([System.Environment]::Newline)$($q2 -Replace 'dirname', $_)" }) + $sql += $query_files_sql + #Write-Message -Level Debug -Message $sql + return $sql + } + + function Format-Path { + param ($path) + $path = $path.Trim() + #Thank you windows 2000 + $path = $path -replace '[^A-Za-z0-9 _\.\-\\:]', '__' + return $path + } + + if ($FileType) { + $FileTypeComparison = $FileType | ForEach-Object { $_.ToLower() } | Where-Object { $_ } | Sort-Object | Get-Unique + } + } + + process { + foreach ($instance in $SqlInstance) { + + #Variable marked as unused by PSScriptAnalyzer + #$paths = @() + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $sqlcredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + # Get the default data and log directories from the instance + if (-not (Test-Bound -ParameterName Path)) { $Path = (Get-DbaDefaultPath -SqlInstance $server).Data } + + Write-Message -Level Verbose -Message "Adding paths" + $sql = Get-SQLDirTreeQuery $Path + Write-Message -Level Debug -Message $sql + + # This should remain as not .Query() to be compat with a PSProvider Chrissy is working on + $datatable = $server.ConnectionContext.ExecuteWithResults($sql).Tables.Rows + + Write-Message -Level Verbose -Message "$($datatable.Rows.Count) files found." + if ($FileTypeComparison) { + foreach ($row in $datatable) { + foreach ($type in $FileTypeComparison) { + if ($row.filename.ToLower().EndsWith(".$type")) { + [pscustomobject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + Filename = $row.fullpath + RemoteFilename = Join-AdminUnc -Servername $server.ComputerName -Filepath $row.fullpath + } | Select-DefaultView -ExcludeProperty ComputerName, InstanceName, RemoteFilename + } + } + } + } else { + foreach ($row in $datatable) { + [pscustomobject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + Filename = $row.fullpath + RemoteFilename = Join-AdminUnc -Servername $server.ComputerName -Filepath $row.fullpath + } | Select-DefaultView -ExcludeProperty ComputerName, InstanceName, RemoteFilename + } + } + } + } +} +#ValidationTags#CodeStyle,Messaging,FlowControl,Pipeline# +function Get-DbaFilestream { + <# + .SYNOPSIS + Returns the status of Filestream on specified SQL Server for both the Service and Instance levels. + + .DESCRIPTION + Returns the status of Filestream on specified SQL Server for both the Service and Instance levels. + + .PARAMETER SqlInstance + SQL Server name or SMO object representing the SQL Server to connect to. This can be a collection and receive pipeline input to allow the function to be executed against multiple SQL Server instances. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. Defaults to localhost. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Credential + Login to the target Windows server using alternative credentials. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Filestream + Author: Stuart Moore ( @napalmgram ) | Chrissy LeMaire ( @cl ) + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaFilestream + + .EXAMPLE + PS C:\> Get-DbaFilestream -SqlInstance server1\instance2 + + Will return the status of Filestream configuration for the service and instance server1\instance2 + + .EXAMPLE + PS C:\> Get-DbaFilestream -SqlInstance server1\instance2 -SqlCredential sqladmin + + Prompts for the password to the SQL Login "sqladmin" then returns the status of Filestream configuration for the service and instance server1\instance2 + #> + [CmdletBinding()] + param ( + [parameter(ValueFromPipeline)] + [DbaInstance[]]$SqlInstance, + [PSCredential]$SqlCredential, + [PSCredential]$Credential, + [switch]$EnableException + ) + begin { + $idServiceFS = [ordered]@{ + 0 = 'Disabled' + 1 = 'FileStream enabled for T-Sql access' + 2 = 'FileStream enabled for T-Sql and IO streaming access' + 3 = 'FileStream enabled for T-Sql, IO streaming, and remote clients' + } + + $idInstanceFS = [ordered]@{ + 0 = 'Disabled' + 1 = 'T-SQL access enabled' + 2 = 'Full access enabled' + } + } + process { + foreach ($instance in $SqlInstance) { + $computer = $instance.ComputerName + $instanceName = $instance.InstanceName + + <# Get Service-Level information #> + if ($instance.IsLocalHost) { + $computerName = $computer + } else { + $computerName = (Resolve-DbaNetworkName -ComputerName $computer -Credential $Credential).FullComputerName + } + + Write-Message -Level Verbose -Message "Attempting to connect to $computer" + try { + $ognamespace = Get-DbaCmObject -EnableException -ComputerName $computerName -Namespace root\Microsoft\SQLServer -Query "SELECT NAME FROM __NAMESPACE WHERE NAME LIKE 'ComputerManagement%'" + $namespace = $ognamespace | Where-Object { + (Get-DbaCmObject -EnableException -ComputerName $computerName -Namespace $("root\Microsoft\SQLServer\" + $_.Name) -ClassName FilestreamSettings).Count -gt 0 + } | + Sort-Object Name -Descending | Select-Object -First 1 + + if (-not $namespace) { + $namespace = $ognamespace + } + + if ($namespace.Name) { + $serviceFS = Get-DbaCmObject -EnableException -ComputerName $computerName -Namespace $("root\Microsoft\SQLServer\" + $namespace.Name) -ClassName FilestreamSettings | Where-Object InstanceName -eq $instanceName | Select-Object -First 1 + } else { + Write-Message -Level Warning -Message "No ComputerManagement was found on $computer. Service level information may not be collected." -Target $computer + } + } catch { + Stop-Function -Message "Issue collecting service-level information on $computer for $instanceName" -Target $computer -ErrorRecord $_ -Continue + } + + <# Get Instance-Level information #> + try { + Write-Message -Level Verbose -Message "Connecting to $instance." + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $sqlcredential -MinimumVersion 10 + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + try { + $instanceFS = Get-DbaSpConfigure -SqlInstance $server -Name FilestreamAccessLevel | Select-Object ConfiguredValue, RunningValue + } catch { + Stop-Function -Message "Issue collection instance-level configuration on $instanceName" -Target $server -ErrorRecord $_ -Exception $_.Exception -Continue + } + + $pendingRestart = $instanceFS.ConfiguredValue -ne $instanceFS.RunningValue + + if (($serviceFS.AccessLevel -ne 0) -and ($instanceFS.RunningValue -ne 0)) { + if (($serviceFS.AccessLevel -eq $instanceFS.RunningValue) -and $pendingRestart) { + Write-Message -Level Verbose -Message "A restart of the instance is pending before Filestream is configured." + } + } + + $runvalue = (Get-DbaSpConfigure -SqlInstance $server -Name FilestreamAccessLevel | Select-Object RunningValue).RunningValue + $servicelevel = [int]$serviceFS.AccessLevel + + [PsCustomObject]@{ + ComputerName = $server.NetName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + InstanceAccess = $idInstanceFS[$runvalue] + ServiceAccess = $idServiceFS[$servicelevel] + ServiceShareName = $serviceFS.ShareName + InstanceAccessLevel = $instanceFS.RunningValue + ServiceAccessLevel = $serviceFS.AccessLevel + Credential = $Credential + SqlCredential = $SqlCredential + } | Select-DefaultView -Property ComputerName, InstanceName, SqlInstance, InstanceAccess, ServiceAccess, ServiceShareName + } + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function Get-DbaForceNetworkEncryption { + <# + .SYNOPSIS + Gets Force Encryption settings for a SQL Server instance + + .DESCRIPTION + Gets Force Encryption settings for a SQL Server instance. Note that this requires access to the Windows Server - not the SQL instance itself. + + This setting is found in Configuration Manager. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. Defaults to localhost. + + .PARAMETER Credential + Allows you to login to the computer (not sql instance) using alternative Windows credentials + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Certificate + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaForceNetworkEncryption + + .EXAMPLE + PS C:\> Get-DbaForceNetworkEncryption + + Gets Force Encryption properties on the default (MSSQLSERVER) instance on localhost - requires (and checks for) RunAs admin. + + .EXAMPLE + PS C:\> Get-DbaForceNetworkEncryption -SqlInstance sql01\SQL2008R2SP2 + + Gets Force Network Encryption for the SQL2008R2SP2 on sql01. Uses Windows Credentials to both login and view the registry. + + #> + [CmdletBinding()] + param ( + [Parameter(ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer", "ComputerName")] + [DbaInstanceParameter[]]$SqlInstance = $env:COMPUTERNAME, + [PSCredential]$Credential, + [switch]$EnableException + ) + process { + foreach ($instance in $SqlInstance) { + Write-Message -Level VeryVerbose -Message "Processing $instance" -Target $instance + $null = Test-ElevationRequirement -ComputerName $instance -Continue + + Write-Message -Level Verbose -Message "Resolving hostname" + $resolved = $null + $resolved = Resolve-DbaNetworkName -ComputerName $instance + + if ($null -eq $resolved) { + Stop-Function -Message "Can't resolve $instance" -Target $instance -Continue -Category InvalidArgument + } + + try { + $sqlwmi = Invoke-ManagedComputerCommand -ComputerName $resolved.FullComputerName -ScriptBlock { + $wmi.Services + } -Credential $Credential -ErrorAction Stop | Where-Object DisplayName -eq "SQL Server ($($instance.InstanceName))" + } catch { + Stop-Function -Message "Failed to access $instance" -Target $instance -Continue -ErrorRecord $_ + } + + $regroot = ($sqlwmi.AdvancedProperties | Where-Object Name -eq REGROOT).Value + $vsname = ($sqlwmi.AdvancedProperties | Where-Object Name -eq VSNAME).Value + try { + $instancename = $sqlwmi.DisplayName.Replace('SQL Server (', '').Replace(')', '') # Don't clown, I don't know regex :( + } catch { + # Probably because the instance name has been aliased or does not exist or something + # here to avoid an empty catch + $null = 1 + } + $serviceaccount = $sqlwmi.ServiceAccount + + if ([System.String]::IsNullOrEmpty($regroot)) { + $regroot = $sqlwmi.AdvancedProperties | Where-Object { + $_ -match 'REGROOT' + } + $vsname = $sqlwmi.AdvancedProperties | Where-Object { + $_ -match 'VSNAME' + } + + if (![System.String]::IsNullOrEmpty($regroot)) { + $regroot = ($regroot -Split 'Value\=')[1] + $vsname = ($vsname -Split 'Value\=')[1] + } else { + Stop-Function -Message "Can't find instance $vsname on $instance" -Continue -Category ObjectNotFound -Target $instance + } + } + + if ([System.String]::IsNullOrEmpty($vsname)) { + $vsname = $instance + } + + Write-Message -Level Verbose -Message "Regroot: $regroot" -Target $instance + Write-Message -Level Verbose -Message "ServiceAcct: $serviceaccount" -Target $instance + Write-Message -Level Verbose -Message "InstanceName: $instancename" -Target $instance + Write-Message -Level Verbose -Message "VSNAME: $vsname" -Target $instance + + $scriptblock = { + $regpath = "Registry::HKEY_LOCAL_MACHINE\$($args[0])\MSSQLServer\SuperSocketNetLib" + $cert = (Get-ItemProperty -Path $regpath -Name Certificate).Certificate + $forceencryption = (Get-ItemProperty -Path $regpath -Name ForceEncryption).ForceEncryption + + # [pscustomobject] doesn't always work, unsure why. so return hashtable then turn it into pscustomobject on client + @{ + ComputerName = $env:COMPUTERNAME + InstanceName = $args[2] + SqlInstance = $args[1] + ForceEncryption = ($forceencryption -eq $true) + CertificateThumbprint = $cert + } + } + + try { + $results = Invoke-Command2 -ComputerName $resolved.FullComputerName -Credential $Credential -ArgumentList $regroot, $vsname, $instancename -ScriptBlock $scriptblock -ErrorAction Stop -Raw + foreach ($result in $results) { + [pscustomobject]$result + } + } catch { + Stop-Function -Message "Failed to connect to $($resolved.FullComputerName) using PowerShell remoting!" -ErrorRecord $_ -Target $instance -Continue + } + } + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function Get-DbaHelpIndex { + <# + .SYNOPSIS + Returns size, row and configuration information for indexes in databases. + + .DESCRIPTION + This function will return detailed information on indexes (and optionally statistics) for all indexes in a database, or a given index should one be passed along. + As this uses SQL Server DMVs to access the data it will only work in 2005 and up (sorry folks still running SQL Server 2000). + For performance reasons certain statistics information will not be returned from SQL Server 2005 if an ObjectName is not provided. + + The data includes: + - ObjectName: the table containing the index + - IndexType: clustered/non-clustered/columnstore and whether the index is unique/primary key + - KeyColumns: the key columns of the index + - IncludeColumns: any include columns in the index + - FilterDefinition: any filter that may have been used in the index + - DataCompression: row/page/none depending upon whether or not compression has been used + - IndexReads: the number of reads of the index since last restart or index rebuild + - IndexUpdates: the number of writes to the index since last restart or index rebuild + - SizeKB: the size the index in KB + - IndexRows: the number of the rows in the index (note filtered indexes will have fewer rows than exist in the table) + - IndexLookups: the number of lookups that have been performed (only applicable for the heap or clustered index) + - MostRecentlyUsed: when the index was most recently queried (default to 1900 for when never read) + - StatsSampleRows: the number of rows queried when the statistics were built/rebuilt (not included in SQL Server 2005 unless ObjectName is specified) + - StatsRowMods: the number of changes to the statistics since the last rebuild + - HistogramSteps: the number of steps in the statistics histogram (not included in SQL Server 2005 unless ObjectName is specified) + - StatsLastUpdated: when the statistics were last rebuilt (not included in SQL Server 2005 unless ObjectName is specified) + + .PARAMETER SqlInstance + The target SQL Server instance or instances. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Database + The database(s) to process. This list is auto-populated from the server. If unspecified, all databases will be processed. + + .PARAMETER ExcludeDatabase + The database(s) to exclude. This list is auto-populated from the server. + + .PARAMETER ObjectName + The name of a table for which you want to obtain the index information. If the two part naming convention for an object is not used it will use the default schema for the executing user. If not passed it will return data on all indexes in a given database. + + .PARAMETER IncludeStats + If this switch is enabled, statistics as well as indexes will be returned in the output (statistics information such as the StatsRowMods will always be returned for indexes). + + .PARAMETER IncludeDataTypes + If this switch is enabled, the output will include the data type of each column that makes up a part of the index definition (key and include columns). + + .PARAMETER IncludeFragmentation + If this switch is enabled, the output will include fragmentation information. + + .PARAMETER InputObject + Allows piping from Get-DbaDatabase + + .PARAMETER Raw + If this switch is enabled, results may be less user-readable but more suitable for processing by other code. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Index + Author: Nic Cain, https://sirsql.net/ + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaHelpIndex + + .EXAMPLE + PS C:\> Get-DbaHelpIndex -SqlInstance localhost -Database MyDB + + Returns information on all indexes on the MyDB database on the localhost. + + .EXAMPLE + PS C:\> Get-DbaHelpIndex -SqlInstance localhost -Database MyDB,MyDB2 + + Returns information on all indexes on the MyDB & MyDB2 databases. + + .EXAMPLE + PS C:\> Get-DbaHelpIndex -SqlInstance localhost -Database MyDB -ObjectName dbo.Table1 + + Returns index information on the object dbo.Table1 in the database MyDB. + + .EXAMPLE + PS C:\> Get-DbaHelpIndex -SqlInstance localhost -Database MyDB -ObjectName dbo.Table1 -IncludeStats + + Returns information on the indexes and statistics for the table dbo.Table1 in the MyDB database. + + .EXAMPLE + PS C:\> Get-DbaHelpIndex -SqlInstance localhost -Database MyDB -ObjectName dbo.Table1 -IncludeDataTypes + + Returns the index information for the table dbo.Table1 in the MyDB database, and includes the data types for the key and include columns. + + .EXAMPLE + PS C:\> Get-DbaHelpIndex -SqlInstance localhost -Database MyDB -ObjectName dbo.Table1 -Raw + + Returns the index information for the table dbo.Table1 in the MyDB database, and returns the numerical data without localized separators. + + .EXAMPLE + PS C:\> Get-DbaHelpIndex -SqlInstance localhost -Database MyDB -IncludeStats -Raw + + Returns the index information for all indexes in the MyDB database as well as their statistics, and formats the numerical data without localized separators. + + .EXAMPLE + PS C:\> Get-DbaHelpIndex -SqlInstance localhost -Database MyDB -IncludeFragmentation + + Returns the index information for all indexes in the MyDB database as well as their fragmentation + + .EXAMPLE + PS C:\> Get-DbaDatabase -SqlInstance sql2017 -Database MyDB | Get-DbaHelpIndex + + Returns the index information for all indexes in the MyDB database + + #> + [CmdletBinding()] + param ( + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [Alias("Credential")] + [PSCredential]$SqlCredential, + [Alias("Databases")] + [object[]]$Database, + [object[]]$ExcludeDatabase, + [Parameter(ValueFromPipeline)] + [Microsoft.SqlServer.Management.Smo.Database[]]$InputObject, + [string]$ObjectName, + [switch]$IncludeStats, + [switch]$IncludeDataTypes, + [switch]$Raw, + [switch]$IncludeFragmentation, + [Alias('Silent')] + [switch]$EnableException + ) + + begin { + + #Add the table predicate to the query + if (!$ObjectName) { + $TablePredicate = "DECLARE @TableName NVARCHAR(256);"; + } else { + $TablePredicate = "DECLARE @TableName NVARCHAR(256); SET @TableName = '$ObjectName';"; + } + + #Add Fragmentation info if requested + $FragSelectColumn = ", NULL as avg_fragmentation_in_percent" + $FragJoin = '' + $OutputProperties = 'Database,Object,Index,IndexType,KeyColumns,IncludeColumns,FilterDefinition,DataCompression,IndexReads,IndexUpdates,SizeKB,IndexRows,IndexLookups,MostRecentlyUsed,StatsSampleRows,StatsRowMods,HistogramSteps,StatsLastUpdated' + if ($IncludeFragmentation) { + $FragSelectColumn = ', pstat.avg_fragmentation_in_percent' + $FragJoin = "LEFT JOIN sys.dm_db_index_physical_stats(DB_ID(), NULL, NULL, NULL , 'DETAILED') pstat + ON pstat.database_id = ustat.database_id + AND pstat.object_id = ustat.object_id + AND pstat.index_id = ustat.index_id" + $OutputProperties = 'Database,Object,Index,IndexType,KeyColumns,IncludeColumns,FilterDefinition,DataCompression,IndexReads,IndexUpdates,SizeKB,IndexRows,IndexLookups,MostRecentlyUsed,StatsSampleRows,StatsRowMods,HistogramSteps,StatsLastUpdated,IndexFragInPercent' + } + $OutputProperties = $OutputProperties.Split(',') + #Figure out if we are including stats in the results + if ($IncludeStats) { + $IncludeStatsPredicate = ""; + } else { + $IncludeStatsPredicate = "WHERE StatisticsName IS NULL"; + } + + #Data types being returns with the results? + if ($IncludeDataTypes) { + $IncludeDataTypesPredicate = 'DECLARE @IncludeDataTypes BIT; SET @IncludeDataTypes = 1'; + } else { + $IncludeDataTypesPredicate = 'DECLARE @IncludeDataTypes BIT; SET @IncludeDataTypes = 0'; + } + + #region SizesQuery + $SizesQuery = " + SET NOCOUNT ON; + SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; + + $TablePredicate + $IncludeDataTypesPredicate + ; + + DECLARE @IndexUsageStats TABLE + ( + object_id INT , + index_id INT , + user_scans BIGINT , + user_seeks BIGINT , + user_updates BIGINT , + user_lookups BIGINT , + last_user_lookup DATETIME2(0) , + last_user_scan DATETIME2(0) , + last_user_seek DATETIME2(0) , + avg_fragmentation_in_percent FLOAT + ); + + DECLARE @StatsInfo TABLE + ( + object_id INT , + stats_id INT , + stats_column_name NVARCHAR(128) , + stats_column_id INT , + stats_name NVARCHAR(128) , + stats_last_updated DATETIME2(0) , + stats_sampled_rows BIGINT , + rowmods BIGINT , + histogramsteps INT , + StatsRows BIGINT , + FullObjectName NVARCHAR(256) + ); + + INSERT INTO @IndexUsageStats + ( object_id , + index_id , + user_scans , + user_seeks , + user_updates , + user_lookups , + last_user_lookup , + last_user_scan , + last_user_seek , + avg_fragmentation_in_percent + ) + SELECT ustat.object_id , + ustat.index_id , + ustat.user_scans , + ustat.user_seeks , + ustat.user_updates , + ustat.user_lookups , + ustat.last_user_lookup , + ustat.last_user_scan , + ustat.last_user_seek + $FragSelectColumn + FROM sys.dm_db_index_usage_stats ustat + $FragJoin + WHERE ustat.database_id = DB_ID(); + + INSERT INTO @StatsInfo + ( object_id , + stats_id , + stats_column_name , + stats_column_id , + stats_name , + stats_last_updated , + stats_sampled_rows , + rowmods , + histogramsteps , + StatsRows , + FullObjectName + ) + SELECT s.object_id , + s.stats_id , + c.name , + sc.stats_column_id , + s.name , + sp.last_updated , + sp.rows_sampled , + sp.modification_counter , + sp.steps , + sp.rows , + QUOTENAME(sch.name) + '.' + QUOTENAME(t.name) AS FullObjectName + FROM [sys].[stats] AS [s] + INNER JOIN sys.stats_columns sc ON s.stats_id = sc.stats_id + AND s.object_id = sc.object_id + INNER JOIN sys.columns c ON c.object_id = sc.object_id + AND c.column_id = sc.column_id + INNER JOIN sys.tables t ON c.object_id = t.object_id + INNER JOIN sys.schemas sch ON sch.schema_id = t.schema_id + OUTER APPLY sys.dm_db_stats_properties([s].[object_id], + [s].[stats_id]) AS [sp] + WHERE s.object_id = CASE WHEN @TableName IS NULL THEN s.object_id + else OBJECT_ID(@TableName) + END; + + + ; + WITH cteStatsInfo + AS ( SELECT object_id , + si.stats_id , + si.stats_name , + STUFF((SELECT N', ' + stats_column_name + FROM @StatsInfo si2 + WHERE si2.object_id = si.object_id + AND si2.stats_id = si.stats_id + ORDER BY si2.stats_column_id + FOR XML PATH(N'') , + TYPE).value(N'.[1]', N'nvarchar(1000)'), 1, + 2, N'') AS StatsColumns , + MAX(si.stats_sampled_rows) AS SampleRows , + MAX(si.rowmods) AS RowMods , + MAX(si.histogramsteps) AS HistogramSteps , + MAX(si.stats_last_updated) AS StatsLastUpdated , + MAX(si.StatsRows) AS StatsRows, + FullObjectName + FROM @StatsInfo si + GROUP BY si.object_id , + si.stats_id , + si.stats_name , + si.FullObjectName + ), + cteIndexSizes + AS ( SELECT object_id , + index_id , + CASE WHEN index_id < 2 + THEN ( ( SUM(in_row_data_page_count + + lob_used_page_count + + row_overflow_used_page_count) + * 8192 ) / 1024 ) + else ( ( SUM(used_page_count) * 8192 ) / 1024 ) + END AS SizeKB + FROM sys.dm_db_partition_stats + GROUP BY object_id , + index_id + ), + cteRows + AS ( SELECT object_id , + index_id , + SUM(rows) AS IndexRows + FROM sys.partitions + GROUP BY object_id , + index_id + ), + cteIndex + AS ( SELECT OBJECT_NAME(c.object_id) AS ObjectName , + c.object_id , + c.index_id , + i.name COLLATE SQL_Latin1_General_CP1_CI_AS AS name , + c.index_column_id , + c.column_id , + c.is_included_column , + CASE WHEN @IncludeDataTypes = 0 + AND c.is_descending_key = 1 + THEN sc.name + ' DESC' + WHEN @IncludeDataTypes = 0 + AND c.is_descending_key = 0 THEN sc.name + WHEN @IncludeDataTypes = 1 + AND c.is_descending_key = 1 + AND c.is_included_column = 0 + THEN sc.name + ' DESC (' + t.name + ') ' + WHEN @IncludeDataTypes = 1 + AND c.is_descending_key = 0 + AND c.is_included_column = 0 + THEN sc.name + ' (' + t.name + ')' + else sc.name + END AS ColumnName , + i.filter_definition , + ISNULL(dd.user_scans, 0) AS user_scans , + ISNULL(dd.user_seeks, 0) AS user_seeks , + ISNULL(dd.user_updates, 0) AS user_updates , + ISNULL(dd.user_lookups, 0) AS user_lookups , + CONVERT(DATETIME2(0), ISNULL(dd.last_user_lookup, + '1901-01-01')) AS LastLookup , + CONVERT(DATETIME2(0), ISNULL(dd.last_user_scan, + '1901-01-01')) AS LastScan , + CONVERT(DATETIME2(0), ISNULL(dd.last_user_seek, + '1901-01-01')) AS LastSeek , + i.fill_factor , + c.is_descending_key , + p.data_compression_desc , + i.type_desc , + i.is_unique , + i.is_unique_constraint , + i.is_primary_key , + ci.SizeKB , + cr.IndexRows , + QUOTENAME(sch.name) + '.' + QUOTENAME(tbl.name) AS FullObjectName , + ISNULL(dd.avg_fragmentation_in_percent, 0) as avg_fragmentation_in_percent + FROM sys.indexes i + JOIN sys.index_columns c ON i.object_id = c.object_id + AND i.index_id = c.index_id + JOIN sys.columns sc ON c.object_id = sc.object_id + AND c.column_id = sc.column_id + INNER JOIN sys.tables tbl ON c.object_id = tbl.object_id + INNER JOIN sys.schemas sch ON sch.schema_id = tbl.schema_id + LEFT JOIN sys.types t ON sc.user_type_id = t.user_type_id + LEFT JOIN @IndexUsageStats dd ON i.object_id = dd.object_id + AND i.index_id = dd.index_id --and dd.database_id = db_id() + JOIN sys.partitions p ON i.object_id = p.object_id + AND i.index_id = p.index_id + JOIN cteIndexSizes ci ON i.object_id = ci.object_id + AND i.index_id = ci.index_id + JOIN cteRows cr ON i.object_id = cr.object_id + AND i.index_id = cr.index_id + WHERE i.object_id = CASE WHEN @TableName IS NULL + THEN i.object_id + else OBJECT_ID(@TableName) + END + ), + cteResults + AS ( SELECT ci.FullObjectName , + ci.object_id , + MAX(index_id) AS Index_Id , + ci.type_desc + + CASE WHEN ci.is_primary_key = 1 + THEN ' (PRIMARY KEY)' + WHEN ci.is_unique_constraint = 1 + THEN ' (UNIQUE CONSTRAINT)' + WHEN ci.is_unique = 1 THEN ' (UNIQUE)' + else '' + END AS IndexType , + name AS IndexName , + STUFF((SELECT N', ' + ColumnName + FROM cteIndex ci2 + WHERE ci2.name = ci.name + AND ci2.is_included_column = 0 + GROUP BY ci2.index_column_id , + ci2.ColumnName + ORDER BY ci2.index_column_id + FOR XML PATH(N'') , + TYPE).value(N'.[1]', N'nvarchar(1000)'), 1, + 2, N'') AS KeyColumns , + ISNULL(STUFF((SELECT N', ' + ColumnName + FROM cteIndex ci3 + WHERE ci3.name = ci.name + AND ci3.is_included_column = 1 + GROUP BY ci3.index_column_id , + ci3.ColumnName + ORDER BY ci3.index_column_id + FOR XML PATH(N'') , + TYPE).value(N'.[1]', + N'nvarchar(1000)'), 1, 2, + N''), '') AS IncludeColumns , + ISNULL(filter_definition, '') AS FilterDefinition , + ci.fill_factor , + CASE WHEN ci.data_compression_desc = 'NONE' THEN '' + else ci.data_compression_desc + END AS DataCompression , + MAX(ci.user_seeks) + MAX(ci.user_scans) + + MAX(ci.user_lookups) AS IndexReads , + MAX(ci.user_lookups) AS IndexLookups , + ci.user_updates AS IndexUpdates , + ci.SizeKB AS SizeKB , + ci.IndexRows AS IndexRows , + CASE WHEN LastScan > LastSeek + AND LastScan > LastLookup THEN LastScan + WHEN LastSeek > LastScan + AND LastSeek > LastLookup THEN LastSeek + WHEN LastLookup > LastScan + AND LastLookup > LastSeek THEN LastLookup + else '' + END AS MostRecentlyUsed , + AVG(ci.avg_fragmentation_in_percent) as avg_fragmentation_in_percent + FROM cteIndex ci + GROUP BY ci.ObjectName , + ci.name , + ci.filter_definition , + ci.object_id , + ci.LastLookup , + ci.LastSeek , + ci.LastScan , + ci.user_updates , + ci.fill_factor , + ci.data_compression_desc , + ci.type_desc , + ci.is_primary_key , + ci.is_unique , + ci.is_unique_constraint , + ci.SizeKB , + ci.IndexRows , + ci.FullObjectName + ), + AllResults + AS ( SELECT c.FullObjectName , + IndexType , + ISNULL(IndexName, si.stats_name) AS IndexName , + NULL as StatisticsName , + ISNULL(KeyColumns, si.StatsColumns) AS KeyColumns , + ISNULL(IncludeColumns, '') AS IncludeColumns , + FilterDefinition , + fill_factor AS [FillFactor] , + DataCompression , + IndexReads , + IndexUpdates , + SizeKB , + IndexRows , + IndexLookups , + MostRecentlyUsed , + SampleRows AS StatsSampleRows , + RowMods AS StatsRowMods , + si.HistogramSteps , + si.StatsLastUpdated , + avg_fragmentation_in_percent AS IndexFragInPercent, + 1 AS Ordering + FROM cteResults c + INNER JOIN cteStatsInfo si ON si.object_id = c.object_id + AND si.stats_id = c.Index_Id + UNION + SELECT QUOTENAME(sch.name) + '.' + QUOTENAME(tbl.name) AS FullObjectName , + '' , + '' , + stats_name , + StatsColumns , + '' , + '' AS FilterDefinition , + '' AS Fill_Factor , + '' AS DataCompression , + '' AS IndexReads , + '' AS IndexUpdates , + '' AS SizeKB , + StatsRows AS IndexRows , + '' AS IndexLookups , + '' AS MostRecentlyUsed , + SampleRows AS StatsSampleRows , + RowMods AS StatsRowMods , + csi.HistogramSteps , + csi.StatsLastUpdated , + '' AS IndexFragInPercent , + 2 + FROM cteStatsInfo csi + INNER JOIN sys.tables tbl ON csi.object_id = tbl.object_id + INNER JOIN sys.schemas sch ON sch.schema_id = tbl.schema_id + WHERE stats_id NOT IN ( + SELECT stats_id + FROM cteResults c + INNER JOIN cteStatsInfo si ON si.object_id = c.object_id + AND si.stats_id = c.Index_Id ) + ) + SELECT FullObjectName , + IndexType , + IndexName , + StatisticsName , + KeyColumns , + ISNULL(IncludeColumns, '') AS IncludeColumns , + FilterDefinition , + [FillFactor] AS [FillFactor] , + DataCompression , + IndexReads , + IndexUpdates , + SizeKB , + IndexRows , + IndexLookups , + MostRecentlyUsed , + StatsSampleRows , + StatsRowMods , + HistogramSteps , + StatsLastUpdated , + IndexFragInPercent + FROM AllResults + $IncludeStatsPredicate + OPTION ( RECOMPILE ); + " + #endRegion SizesQuery + + + #region sizesQuery2005 + $SizesQuery2005 = " + SET NOCOUNT ON; + SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; + + $TablePredicate + $IncludeDataTypesPredicate + ; + + DECLARE @AllResults TABLE + ( + RowNum INT , + FullObjectName NVARCHAR(300) , + IndexType NVARCHAR(256) , + IndexName NVARCHAR(256) , + KeyColumns NVARCHAR(2000) , + IncludeColumns NVARCHAR(2000) , + FilterDefinition NVARCHAR(100) , + [FillFactor] TINYINT , + DataCompression CHAR(4) , + IndexReads BIGINT , + IndexUpdates BIGINT , + SizeKB BIGINT , + IndexRows BIGINT , + IndexLookups BIGINT , + MostRecentlyUsed DATETIME , + StatsSampleRows BIGINT , + StatsRowMods BIGINT , + HistogramSteps INT , + StatsLastUpdated DATETIME , + object_id BIGINT , + index_id BIGINT + ); + + DECLARE @IndexUsageStats TABLE + ( + object_id INT , + index_id INT , + user_scans BIGINT , + user_seeks BIGINT , + user_updates BIGINT , + user_lookups BIGINT , + last_user_lookup DATETIME , + last_user_scan DATETIME , + last_user_seek DATETIME , + avg_fragmentation_in_percent FLOAT + ); + + DECLARE @StatsInfo TABLE + ( + object_id INT , + stats_id INT , + stats_column_name NVARCHAR(128) , + stats_column_id INT , + stats_name NVARCHAR(128) , + stats_last_updated DATETIME , + stats_sampled_rows BIGINT , + rowmods BIGINT , + histogramsteps INT , + StatsRows BIGINT , + FullObjectName NVARCHAR(256) + ); + + INSERT INTO @IndexUsageStats + ( object_id , + index_id , + user_scans , + user_seeks , + user_updates , + user_lookups , + last_user_lookup , + last_user_scan , + last_user_seek , + avg_fragmentation_in_percent + ) + SELECT ustat.object_id , + ustat.index_id , + ustat.user_scans , + ustat.user_seeks , + ustat.user_updates , + ustat.user_lookups , + ustat.last_user_lookup , + ustat.last_user_scan , + ustat.last_user_seek + $FragSelectColumn + FROM sys.dm_db_index_usage_stats ustat + $FragJoin + WHERE database_id = DB_ID(); + + + INSERT INTO @StatsInfo + ( object_id , + stats_id , + stats_column_name , + stats_column_id , + stats_name , + stats_last_updated , + stats_sampled_rows , + rowmods , + histogramsteps , + StatsRows , + FullObjectName + ) + SELECT s.object_id , + s.stats_id , + c.name , + sc.stats_column_id , + s.name , + NULL AS last_updated , + NULL AS rows_sampled , + NULL AS modification_counter , + NULL AS steps , + NULL AS rows , + QUOTENAME(sch.name) + '.' + QUOTENAME(t.name) AS FullObjectName + FROM [sys].[stats] AS [s] + INNER JOIN sys.stats_columns sc ON s.stats_id = sc.stats_id + AND s.object_id = sc.object_id + INNER JOIN sys.columns c ON c.object_id = sc.object_id + AND c.column_id = sc.column_id + INNER JOIN sys.tables t ON c.object_id = t.object_id + INNER JOIN sys.schemas sch ON sch.schema_id = t.schema_id + -- OUTER APPLY sys.dm_db_stats_properties([s].[object_id], + -- [s].[stats_id]) AS [sp] + WHERE s.object_id = CASE WHEN @TableName IS NULL THEN s.object_id + else OBJECT_ID(@TableName) + END; + + + ; + WITH cteStatsInfo + AS ( SELECT object_id , + si.stats_id , + si.stats_name , + STUFF((SELECT N', ' + stats_column_name + FROM @StatsInfo si2 + WHERE si2.object_id = si.object_id + AND si2.stats_id = si.stats_id + ORDER BY si2.stats_column_id + FOR XML PATH(N'') , + TYPE).value(N'.[1]', N'nvarchar(1000)'), 1, + 2, N'') AS StatsColumns , + MAX(si.stats_sampled_rows) AS SampleRows , + MAX(si.rowmods) AS RowMods , + MAX(si.histogramsteps) AS HistogramSteps , + MAX(si.stats_last_updated) AS StatsLastUpdated , + MAX(si.StatsRows) AS StatsRows, + FullObjectName + FROM @StatsInfo si + GROUP BY si.object_id , + si.stats_id , + si.stats_name , + si.FullObjectName + ), + cteIndexSizes + AS ( SELECT object_id , + index_id , + CASE WHEN index_id < 2 + THEN ( ( SUM(in_row_data_page_count + + lob_used_page_count + + row_overflow_used_page_count) + * 8192 ) / 1024 ) + else ( ( SUM(used_page_count) * 8192 ) / 1024 ) + END AS SizeKB + FROM sys.dm_db_partition_stats + GROUP BY object_id , + index_id + ), + cteRows + AS ( SELECT object_id , + index_id , + SUM(rows) AS IndexRows + FROM sys.partitions + GROUP BY object_id , + index_id + ), + cteIndex + AS ( SELECT OBJECT_NAME(c.object_id) AS ObjectName , + c.object_id , + c.index_id , + i.name COLLATE SQL_Latin1_General_CP1_CI_AS AS name , + c.index_column_id , + c.column_id , + c.is_included_column , + CASE WHEN @IncludeDataTypes = 0 + AND c.is_descending_key = 1 + THEN sc.name + ' DESC' + WHEN @IncludeDataTypes = 0 + AND c.is_descending_key = 0 THEN sc.name + WHEN @IncludeDataTypes = 1 + AND c.is_descending_key = 1 + AND c.is_included_column = 0 + THEN sc.name + ' DESC (' + t.name + ') ' + WHEN @IncludeDataTypes = 1 + AND c.is_descending_key = 0 + AND c.is_included_column = 0 + THEN sc.name + ' (' + t.name + ')' + else sc.name + END AS ColumnName , + '' AS filter_definition , + ISNULL(dd.user_scans, 0) AS user_scans , + ISNULL(dd.user_seeks, 0) AS user_seeks , + ISNULL(dd.user_updates, 0) AS user_updates , + ISNULL(dd.user_lookups, 0) AS user_lookups , + CONVERT(DATETIME, ISNULL(dd.last_user_lookup, + '1901-01-01')) AS LastLookup , + CONVERT(DATETIME, ISNULL(dd.last_user_scan, + '1901-01-01')) AS LastScan , + CONVERT(DATETIME, ISNULL(dd.last_user_seek, + '1901-01-01')) AS LastSeek , + i.fill_factor , + c.is_descending_key , + 'NONE' as data_compression_desc , + i.type_desc , + i.is_unique , + i.is_unique_constraint , + i.is_primary_key , + ci.SizeKB , + cr.IndexRows , + QUOTENAME(sch.name) + '.' + QUOTENAME(tbl.name) AS FullObjectName , + ISNULL(dd.avg_fragmentation_in_percent, 0) as avg_fragmentation_in_percent + FROM sys.indexes i + JOIN sys.index_columns c ON i.object_id = c.object_id + AND i.index_id = c.index_id + JOIN sys.columns sc ON c.object_id = sc.object_id + AND c.column_id = sc.column_id + INNER JOIN sys.tables tbl ON c.object_id = tbl.object_id + INNER JOIN sys.schemas sch ON sch.schema_id = tbl.schema_id + LEFT JOIN sys.types t ON sc.user_type_id = t.user_type_id + LEFT JOIN @IndexUsageStats dd ON i.object_id = dd.object_id + AND i.index_id = dd.index_id --and dd.database_id = db_id() + JOIN sys.partitions p ON i.object_id = p.object_id + AND i.index_id = p.index_id + JOIN cteIndexSizes ci ON i.object_id = ci.object_id + AND i.index_id = ci.index_id + JOIN cteRows cr ON i.object_id = cr.object_id + AND i.index_id = cr.index_id + WHERE i.object_id = CASE WHEN @TableName IS NULL + THEN i.object_id + else OBJECT_ID(@TableName) + END + ), + cteResults + AS ( SELECT ci.FullObjectName , + ci.object_id , + MAX(index_id) AS Index_Id , + ci.type_desc + + CASE WHEN ci.is_primary_key = 1 + THEN ' (PRIMARY KEY)' + WHEN ci.is_unique_constraint = 1 + THEN ' (UNIQUE CONSTRAINT)' + WHEN ci.is_unique = 1 THEN ' (UNIQUE)' + else '' + END AS IndexType , + name AS IndexName , + STUFF((SELECT N', ' + ColumnName + FROM cteIndex ci2 + WHERE ci2.name = ci.name + AND ci2.is_included_column = 0 + GROUP BY ci2.index_column_id , + ci2.ColumnName + ORDER BY ci2.index_column_id + FOR XML PATH(N'') , + TYPE).value(N'.[1]', N'nvarchar(1000)'), 1, + 2, N'') AS KeyColumns , + ISNULL(STUFF((SELECT N', ' + ColumnName + FROM cteIndex ci3 + WHERE ci3.name = ci.name + AND ci3.is_included_column = 1 + GROUP BY ci3.index_column_id , + ci3.ColumnName + ORDER BY ci3.index_column_id + FOR XML PATH(N'') , + TYPE).value(N'.[1]', + N'nvarchar(1000)'), 1, 2, + N''), '') AS IncludeColumns , + ISNULL(filter_definition, '') AS FilterDefinition , + ci.fill_factor , + CASE WHEN ci.data_compression_desc = 'NONE' THEN '' + else ci.data_compression_desc + END AS DataCompression , + MAX(ci.user_seeks) + MAX(ci.user_scans) + + MAX(ci.user_lookups) AS IndexReads , + MAX(ci.user_lookups) AS IndexLookups , + ci.user_updates AS IndexUpdates , + ci.SizeKB AS SizeKB , + ci.IndexRows AS IndexRows , + CASE WHEN LastScan > LastSeek + AND LastScan > LastLookup THEN LastScan + WHEN LastSeek > LastScan + AND LastSeek > LastLookup THEN LastSeek + WHEN LastLookup > LastScan + AND LastLookup > LastSeek THEN LastLookup + else '' + END AS MostRecentlyUsed , + AVG(ci.avg_fragmentation_in_percent) as avg_fragmentation_in_percent + FROM cteIndex ci + GROUP BY ci.ObjectName , + ci.name , + ci.filter_definition , + ci.object_id , + ci.LastLookup , + ci.LastSeek , + ci.LastScan , + ci.user_updates , + ci.fill_factor , + ci.data_compression_desc , + ci.type_desc , + ci.is_primary_key , + ci.is_unique , + ci.is_unique_constraint , + ci.SizeKB , + ci.IndexRows , + ci.FullObjectName + ), AllResults AS + ( SELECT c.FullObjectName , + ISNULL(IndexType, 'STATISTICS') AS IndexType , + ISNULL(IndexName, '') AS IndexName , + ISNULL(KeyColumns, '') AS KeyColumns , + ISNULL(IncludeColumns, '') AS IncludeColumns , + FilterDefinition , + fill_factor AS [FillFactor] , + DataCompression , + IndexReads , + IndexUpdates , + SizeKB , + IndexRows , + IndexLookups , + MostRecentlyUsed , + NULL AS StatsSampleRows , + NULL AS StatsRowMods , + NULL AS HistogramSteps , + NULL AS StatsLastUpdated , + avg_fragmentation_in_percent as IndexFragInPercent, + 1 AS Ordering , + c.object_id , + c.Index_Id + FROM cteResults c + INNER JOIN cteStatsInfo si ON si.object_id = c.object_id + AND si.stats_id = c.Index_Id + UNION + SELECT QUOTENAME(sch.name) + '.' + QUOTENAME(tbl.name) AS FullObjectName , + 'STATISTICS' , + stats_name , + StatsColumns , + '' , + '' AS FilterDefinition , + '' AS Fill_Factor , + '' AS DataCompression , + '' AS IndexReads , + '' AS IndexUpdates , + '' AS SizeKB , + StatsRows AS IndexRows , + '' AS IndexLookups , + '' AS MostRecentlyUsed , + SampleRows AS StatsSampleRows , + RowMods AS StatsRowMods , + csi.HistogramSteps , + csi.StatsLastUpdated , + '' as IndexFragInPercent, + 2 , + csi.object_id , + csi.stats_id + FROM cteStatsInfo csi + INNER JOIN sys.tables tbl ON csi.object_id = tbl.object_id + INNER JOIN sys.schemas sch ON sch.schema_id = tbl.schema_id + LEFT JOIN (SELECT si.object_id, si.stats_id + FROM cteResults c + INNER JOIN cteStatsInfo si ON si.object_id = c.object_id + AND si.stats_id = c.Index_Id ) AS x on csi.object_id = x.object_id and csi.stats_id = x.stats_id + WHERE x.object_id is null + ) + INSERT INTO @AllResults + SELECT row_number() OVER (ORDER BY FullObjectName) AS RowNum , + FullObjectName , + ISNULL(IndexType, 'STATISTICS') AS IndexType , + IndexName , + KeyColumns , + ISNULL(IncludeColumns, '') AS IncludeColumns , + FilterDefinition , + [FillFactor] AS [FillFactor] , + DataCompression , + IndexReads , + IndexUpdates , + SizeKB , + IndexRows , + IndexLookups , + MostRecentlyUsed , + StatsSampleRows , + StatsRowMods , + HistogramSteps , + StatsLastUpdated , + IndexFragInPercent , + object_id , + index_id + FROM AllResults + $IncludeStatsPredicate + OPTION ( RECOMPILE ); + + /* Only update the stats data on 2005 for a single table, otherwise the run time for this is a potential problem for large table/index volumes */ + if @TableName IS NOT NULL + BEGIN + + DECLARE @StatsInfo2005 TABLE (Name nvarchar(128), Updated DATETIME, Rows BIGINT, RowsSampled BIGINT, Steps INT, Density INT, AverageKeyLength INT, StringIndex NVARCHAR(20)) + + DECLARE @SqlCall NVARCHAR(2000), @RowNum INT; + SELECT @RowNum = min(RowNum) FROM @AllResults; + WHILE @RowNum IS NOT NULL + BEGIN + SELECT @SqlCall = 'dbcc show_statistics('+FullObjectName+', '+IndexName+') with stat_header' FROM @AllResults WHERE RowNum = @RowNum; + INSERT INTO @StatsInfo2005 exec (@SqlCall); + UPDATE @AllResults + SET StatsSampleRows = RowsSampled, + HistogramSteps = Steps, + StatsLastUpdated = Updated + FROM @StatsInfo2005 + WHERE RowNum = @RowNum; + DELETE FROM @StatsInfo2005 + SELECT @RowNum = min(RowNum) FROM @AllResults WHERE RowNum > @RowNum; + END; + + END; + + UPDATE a + SET a.StatsRowMods = i.rowmodctr + FROM @AllResults a + JOIN sys.sysindexes i ON a.object_id = i.id AND a.index_id = i.indid; + + SELECT FullObjectName , + IndexType , + IndexName , + KeyColumns , + IncludeColumns , + FilterDefinition , + [FillFactor] , + DataCompression , + IndexReads , + IndexUpdates , + SizeKB , + IndexRows , + IndexLookups , + MostRecentlyUsed , + StatsSampleRows , + StatsRowMods , + HistogramSteps , + StatsLastUpdated , + IndexFragInPercent + FROM @AllResults;" + + #endregion sizesQuery2005 + } + process { + Write-Message -Level Debug -Message $SizesQuery + Write-Message -Level Debug -Message $SizesQuery2005 + + foreach ($instance in $SqlInstance) { + + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential -MinimumVersion 10 + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + $InputObject += Get-DbaDatabase -SqlInstance $server -Database $Database -ExcludeDatabase $ExcludeDatabase + } + + foreach ($db in $InputObject) { + $server = $db.Parent + + #Need to check the version of SQL + if ($server.versionMajor -ge 10) { + $indexesQuery = $SizesQuery + } else { + $indexesQuery = $SizesQuery2005 + } + + if (!$db.IsAccessible) { + Stop-Function -Message "$db is not accessible. Skipping." -Continue + } + + Write-Message -Level Debug -Message "$indexesQuery" + try { + $IndexDetails = $db.Query($indexesQuery) + + if (!$Raw) { + foreach ($detail in $IndexDetails) { + $recentlyused = [datetime]$detail.MostRecentlyUsed + + if ($recentlyused.year -eq 1900) { + $recentlyused = $null + } + + [pscustomobject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + Database = $db.Name + Object = $detail.FullObjectName + Index = $detail.IndexName + IndexType = $detail.IndexType + Statistics = $detail.StatisticsName + KeyColumns = $detail.KeyColumns + IncludeColumns = $detail.IncludeColumns + FilterDefinition = $detail.FilterDefinition + DataCompression = $detail.DataCompression + IndexReads = "{0:N0}" -f $detail.IndexReads + IndexUpdates = "{0:N0}" -f $detail.IndexUpdates + Size = "{0:N0}" -f $detail.SizeKB + IndexRows = "{0:N0}" -f $detail.IndexRows + IndexLookups = "{0:N0}" -f $detail.IndexLookups + MostRecentlyUsed = $recentlyused + StatsSampleRows = "{0:N0}" -f $detail.StatsSampleRows + StatsRowMods = "{0:N0}" -f $detail.StatsRowMods + HistogramSteps = $detail.HistogramSteps + StatsLastUpdated = $detail.StatsLastUpdated + IndexFragInPercent = "{0:F2}" -f $detail.IndexFragInPercent + } + } + } + + else { + foreach ($detail in $IndexDetails) { + $recentlyused = [datetime]$detail.MostRecentlyUsed + + if ($recentlyused.year -eq 1900) { + $recentlyused = $null + } + + [pscustomobject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + Database = $db.Name + Object = $detail.FullObjectName + Index = $detail.IndexName + IndexType = $detail.IndexType + Statistics = $detail.StatisticsName + KeyColumns = $detail.KeyColumns + IncludeColumns = $detail.IncludeColumns + FilterDefinition = $detail.FilterDefinition + DataCompression = $detail.DataCompression + IndexReads = $detail.IndexReads + IndexUpdates = $detail.IndexUpdates + Size = [dbasize]($detail.SizeKB * 1024) + IndexRows = $detail.IndexRows + IndexLookups = $detail.IndexLookups + MostRecentlyUsed = $recentlyused + StatsSampleRows = $detail.StatsSampleRows + StatsRowMods = $detail.StatsRowMods + HistogramSteps = $detail.HistogramSteps + StatsLastUpdated = $detail.StatsLastUpdated + IndexFragInPercent = $detail.IndexFragInPercent + } + } + } + } catch { + Stop-Function -Continue -ErrorRecord $_ -Message "Cannot process $db on $server" + } + } + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function Get-DbaInstanceProperty { + <# + .SYNOPSIS + Gets SQL Server instance properties of one or more instance(s) of SQL Server. + + .DESCRIPTION + The Get-DbaInstanceProperty command gets SQL Server instance properties from the SMO object sqlserver. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. This can be a collection and receive pipeline input to allow the function to be executed against multiple SQL Server instances. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER InstanceProperty + SQL Server instance property(ies) to include. + + .PARAMETER ExcludeInstanceProperty + SQL Server instance property(ies) to exclude. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Instance, Configure, Configuration + Author: Klaas Vandenberghe (@powerdbaklaas) + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaInstanceProperty + + .EXAMPLE + PS C:\> Get-DbaInstanceProperty -SqlInstance localhost + + Returns SQL Server instance properties on the local default SQL Server instance + + .EXAMPLE + PS C:\> Get-DbaInstanceProperty -SqlInstance sql2, sql4\sqlexpress + + Returns SQL Server instance properties on default instance on sql2 and sqlexpress instance on sql4 + + .EXAMPLE + PS C:\> 'sql2','sql4' | Get-DbaInstanceProperty + + Returns SQL Server instance properties on sql2 and sql4 + + .EXAMPLE + PS C:\> Get-DbaInstanceProperty -SqlInstance sql2,sql4 -InstanceProperty DefaultFile + + Returns SQL Server instance property DefaultFile on instance sql2 and sql4 + + .EXAMPLE + PS C:\> Get-DbaInstanceProperty -SqlInstance sql2,sql4 -ExcludeInstanceProperty DefaultFile + + Returns all SQL Server instance properties except DefaultFile on instance sql2 and sql4 + + .EXAMPLE + PS C:\> $cred = Get-Credential sqladmin + PS C:\> Get-DbaInstanceProperty -SqlInstance sql2 -SqlCredential $cred + + Connects using sqladmin credential and returns SQL Server instance properties from sql2 + + #> + [CmdletBinding(DefaultParameterSetName = "Default")] + param ( + [parameter(Position = 0, Mandatory, ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [object[]]$InstanceProperty, + [object[]]$ExcludeInstanceProperty, + [Alias('Silent')] + [switch]$EnableException + ) + process { + foreach ($instance in $SqlInstance) { + + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + try { + $infoProperties = $server.Information.Properties + + if ($InstanceProperty) { + $infoProperties = $infoProperties | Where-Object Name -In $InstanceProperty + } + if ($ExcludeInstanceProperty) { + $infoProperties = $infoProperties | Where-Object Name -NotIn $ExcludeInstanceProperty + } + foreach ($prop in $infoProperties) { + Add-Member -Force -InputObject $prop -MemberType NoteProperty -Name ComputerName -Value $server.ComputerName + Add-Member -Force -InputObject $prop -MemberType NoteProperty -Name InstanceName -Value $server.ServiceName + Add-Member -Force -InputObject $prop -MemberType NoteProperty -Name SqlInstance -Value $server.DomainInstanceName + Add-Member -Force -InputObject $prop -MemberType NoteProperty -Name PropertyType -Value 'Information' + Select-DefaultView -InputObject $prop -Property ComputerName, InstanceName, SqlInstance, Name, Value, PropertyType + } + } catch { + Stop-Function -Message "Issue gathering information properties for $instance." -Target $instance -ErrorRecord $_ -Continue + } + + try { + $userProperties = $server.UserOptions.Properties + + if ($InstanceProperty) { + $userProperties = $userProperties | Where-Object Name -In $InstanceProperty + } + if ($ExcludeInstanceProperty) { + $userProperties = $userProperties | Where-Object Name -NotIn $ExcludeInstanceProperty + } + foreach ($prop in $userProperties) { + Add-Member -Force -InputObject $prop -MemberType NoteProperty -Name ComputerName -Value $server.ComputerName + Add-Member -Force -InputObject $prop -MemberType NoteProperty -Name InstanceName -Value $server.ServiceName + Add-Member -Force -InputObject $prop -MemberType NoteProperty -Name SqlInstance -Value $server.DomainInstanceName + Add-Member -Force -InputObject $prop -MemberType NoteProperty -Name PropertyType -Value 'UserOption' + Select-DefaultView -InputObject $prop -Property ComputerName, InstanceName, SqlInstance, Name, Value, PropertyType + } + } catch { + Stop-Function -Message "Issue gathering user options for $instance." -Target $instance -ErrorRecord $_ -Continue + } + + try { + $settingProperties = $server.Settings.Properties + + if ($InstanceProperty) { + $settingProperties = $settingProperties | Where-Object Name -In $InstanceProperty + } + if ($ExcludeInstanceProperty) { + $settingProperties = $settingProperties | Where-Object Name -NotIn $ExcludeInstanceProperty + } + foreach ($prop in $settingProperties) { + Add-Member -Force -InputObject $prop -MemberType NoteProperty -Name ComputerName -Value $server.ComputerName + Add-Member -Force -InputObject $prop -MemberType NoteProperty -Name InstanceName -Value $server.ServiceName + Add-Member -Force -InputObject $prop -MemberType NoteProperty -Name SqlInstance -Value $server.DomainInstanceName + Add-Member -Force -InputObject $prop -MemberType NoteProperty -Name PropertyType -Value 'Setting' + Select-DefaultView -InputObject $prop -Property ComputerName, InstanceName, SqlInstance, Name, Value, PropertyType + } + } catch { + Stop-Function -Message "Issue gathering settings for $instance." -Target $instance -ErrorRecord $_ -Continue + } + } + } + end { + Test-DbaDeprecation -DeprecatedOn "1.0.0" -EnableException:$false -Alias Get-DbaSqlInstanceProperty + } +} +function Get-DbaInstanceUserOption { + <# + .SYNOPSIS + Gets SQL Instance user options of one or more instance(s) of SQL Server. + + .DESCRIPTION + The Get-DbaInstanceUserOption command gets SQL Instance user options from the SMO object sqlserver. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. + This can be a collection and receive pipeline input to allow the function to be executed against multiple SQL Server instances. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Instance, Configure, UserOption + Author: Klaas Vandenberghe (@powerdbaklaas) + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaInstanceUserOption + + .EXAMPLE + PS C:\> Get-DbaInstanceUserOption -SqlInstance localhost + + Returns SQL Instance user options on the local default SQL Server instance + + .EXAMPLE + PS C:\> Get-DbaInstanceUserOption -SqlInstance sql2, sql4\sqlexpress + + Returns SQL Instance user options on default instance on sql2 and sqlexpress instance on sql4 + + .EXAMPLE + PS C:\> 'sql2','sql4' | Get-DbaInstanceUserOption + + Returns SQL Instance user options on sql2 and sql4 + + #> + [CmdletBinding(DefaultParameterSetName = "Default")] + param ( + [parameter(Position = 0, Mandatory, ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [Alias('Silent')] + [switch]$EnableException + ) + + process { + foreach ($instance in $SqlInstance) { + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $sqlcredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + $props = $server.useroptions.properties + foreach ($prop in $props) { + Add-Member -Force -InputObject $prop -MemberType NoteProperty -Name ComputerName -Value $server.ComputerName + Add-Member -Force -InputObject $prop -MemberType NoteProperty -Name InstanceName -Value $server.ServiceName + Add-Member -Force -InputObject $prop -MemberType NoteProperty -Name SqlInstance -Value $server.DomainInstanceName + Select-DefaultView -InputObject $prop -Property ComputerName, InstanceName, SqlInstance, Name, Value + } + } + } + end { + Test-DbaDeprecation -DeprecatedOn "1.0.0" -EnableException:$false -Alias Get-DbaSqlInstanceUserOption + } +} +function Get-DbaIoLatency { + <# + .SYNOPSIS + Displays IO subsystem latency statistics from sys.dm_io_virtual_file_stats. Works on SQL Server 2005 and above. + + .DESCRIPTION + This command is based off of Paul Randal's post "Advanced SQL Server performance tuning" + + Returns both raw and aggregate information + + Reference: https://www.sqlskills.com/blogs/paul/how-to-examine-io-subsystem-latencies-from-within-sql-server/ + https://www.sqlskills.com/blogs/paul/capturing-io-latencies-period-time/ + + .PARAMETER SqlInstance + The SQL Server instance. Server version must be SQL Server version 2008 or higher. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: IOLatency + Author: Patrick Flynn (@sqllensman) + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaIoLatency + + .EXAMPLE + PS C:\> Get-DbaIoLatency -SqlInstance sql2008, sqlserver2012 + + Get IO subsystem latency statistics for servers sql2008 and sqlserver2012. + + .EXAMPLE + PS C:\> $output = Get-DbaIoLatency -SqlInstance sql2008 | Select * | ConvertTo-DbaDataTable + + Collects all IO subsystem latency statistics on server sql2008 into a Data Table. + + .EXAMPLE + PS C:\> 'sql2008','sqlserver2012' | Get-DbaIoLatency + + Get IO subsystem latency statistics for servers sql2008 and sqlserver2012 via pipline + + .EXAMPLE + PS C:\> $cred = Get-Credential sqladmin + PS C:\> Get-DbaIoLatency -SqlInstance sql2008 -SqlCredential $cred + + Connects using sqladmin credential and returns IO subsystem latency statistics from sql2008 + #> + [CmdletBinding()] + Param ( + [parameter(Mandatory, ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer", "SqlServers")] + [DbaInstance[]]$SqlInstance, + [PSCredential]$SqlCredential, + [Alias('Silent')] + [switch]$EnableException + ) + + BEGIN { + $sql = "SELECT + [vfs].[database_id], + DB_NAME ([vfs].[database_id]) AS [DatabaseName], + [vfs].[file_id], + [mf].[physical_name], + [num_of_reads], + [io_stall_read_ms], + [num_of_writes], + [io_stall_write_ms], + [io_stall], + [num_of_bytes_read], + [num_of_bytes_written], + [sample_ms], + [size_on_disk_bytes], + [file_handle], + [ReadLatency] = + CASE WHEN [num_of_reads] = 0 + THEN 0 + ELSE ([io_stall_read_ms] / [num_of_reads]) + END, + [WriteLatency] = + CASE WHEN [num_of_writes] = 0 + THEN 0 + ELSE ([io_stall_write_ms] / [num_of_writes]) + END, + [Latency] = + CASE WHEN ([num_of_reads] = 0 AND [num_of_writes] = 0) + THEN 0 + ELSE ([io_stall] / ([num_of_reads] + [num_of_writes])) + END, + [AvgBPerRead] = + CASE WHEN [num_of_reads] = 0 + THEN 0 + ELSE ([num_of_bytes_read] / [num_of_reads]) + END, + [AvgBPerWrite] = + CASE WHEN [num_of_writes] = 0 + THEN 0 + ELSE ([num_of_bytes_written] / [num_of_writes]) + END, + [AvgBPerTransfer] = + CASE WHEN ([num_of_reads] = 0 AND [num_of_writes] = 0) + THEN 0 + ELSE + (([num_of_bytes_read] + [num_of_bytes_written]) / + ([num_of_reads] + [num_of_writes])) + END + FROM sys.dm_io_virtual_file_stats (NULL,NULL) AS [vfs] + INNER JOIN sys.master_files AS [mf] + ON [vfs].[database_id] = [mf].[database_id] + AND [vfs].[file_id] = [mf].[file_id];" + + Write-Message -Level Debug -Message $sql + + $excludeColumns = 'FileHandle', 'ReadLatency', 'WriteLatency', 'Latency', 'AvgBPerRead', 'AvgBPerWrite', 'AvgBPerTransfer' + } + process { + if (Test-FunctionInterrupt) { return } + foreach ($instance in $SqlInstance) { + if (Test-FunctionInterrupt) { return } + + Write-Message -Level Verbose -Message "Connecting to $instance" + + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential -MinimumVersion 9 + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + Write-Message -Level Verbose -Message "Connected to $instance" + + foreach ($row in $server.Query($sql)) { + [PSCustomObject]@{ + ComputerName = $server.NetName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + DatabaseId = $row.database_id + DatabaseName = $row.DatabaseName + FileId = $row.file_id + PhysicalName = $row.physical_name + NumberOfReads = $row.num_of_reads + IoStallRead = $row.io_stall_read_ms + NumberOfwrites = $row.num_of_writes + IoStallWrite = $row.io_stall_write_ms + IoStall = $row.io_stall + NumberOfBytesRead = $row.num_of_bytes_read + NumberOfBytesWritten = $row.num_of_bytes_written + SampleMilliseconds = $row.sample_ms + SizeOnDiskBytes = $row.num_of_bytes_written + FileHandle = $row.file_handle + ReadLatency = $row.ReadLatency + WriteLatency = $row.WriteLatency + Latency = $row.Latency + AvgBPerRead = $row.AvgBPerRead + AvgBPerWrite = $row.AvgBPerWrite + AvgBPerTransfer = $row.AvgBPerTransfer + } | Select-DefaultView -ExcludeProperty $excludeColumns + } + } + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function Get-DbaLastBackup { + <# + .SYNOPSIS + Get date/time for last known backups of databases. + + .DESCRIPTION + Retrieves and compares the date/time for the last known backups, as well as the creation date/time for the database. + + Default output includes columns Server, Database, RecoveryModel, LastFullBackup, LastDiffBackup, LastLogBackup, SinceFull, SinceDiff, SinceLog, Status, DatabaseCreated, DaysSinceDbCreated. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Database + Specifies one or more database(s) to process. If unspecified, all databases will be processed. + + .PARAMETER ExcludeDatabase + Specifies one or more database(s) to exclude from processing. + + .PARAMETER EnableException + If this switch is enabled exceptions will be thrown to the caller, which will need to perform its own exception processing. Otherwise, the function will try to catch the exception, interpret it and provide a friendly error message. + + .NOTES + Tags: DisasterRecovery, Backup + Author: Klaas Vandenberghe (@PowerDBAKlaas) + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaLastBackup + + .EXAMPLE + PS C:\> Get-DbaLastBackup -SqlInstance ServerA\sql987 + + Returns a custom object displaying Server, Database, RecoveryModel, LastFullBackup, LastDiffBackup, LastLogBackup, SinceFull, SinceDiff, SinceLog, Status, DatabaseCreated, DaysSinceDbCreated + + .EXAMPLE + PS C:\> Get-DbaLastBackup -SqlInstance ServerA\sql987 + + Returns a custom object with Server name, Database name, and the date the last time backups were performed. + + .EXAMPLE + PS C:\> Get-DbaLastBackup -SqlInstance ServerA\sql987 | Select * + + Returns a custom object with Server name, Database name, and the date the last time backups were performed, and also recoverymodel and calculations on how long ago backups were taken and what the status is. + + .EXAMPLE + PS C:\> Get-DbaLastBackup -SqlInstance ServerA\sql987 | Select * | Out-Gridview + + Returns a gridview displaying Server, Database, RecoveryModel, LastFullBackup, LastDiffBackup, LastLogBackup, SinceFull, SinceDiff, SinceLog, Status, DatabaseCreated, DaysSinceDbCreated. + + #> + [CmdletBinding()] + param ( + [parameter(Mandatory, ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [Alias("Credential")] + [PSCredential] + $SqlCredential, + [Alias("Databases")] + [object[]]$Database, + [object[]]$ExcludeDatabase, + [Alias('Silent')] + [switch]$EnableException + ) + begin { + function Get-DbaDateOrNull ($TimeSpan) { + if ($TimeSpan -eq 0) { + return $null + } + return $TimeSpan + } + $StartOfTime = [DbaTimeSpan](New-TimeSpan -Start ([datetime]0)) + } + process { + foreach ($instance in $SqlInstance) { + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $sqlcredential -MinimumVersion 9 + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + $dbs = $server.Databases | Where-Object { $_.name -ne 'tempdb' } + + if ($Database) { + $dbs = $dbs | Where-Object Name -In $Database + } + + if ($ExcludeDatabase) { + $dbs = $dbs | Where-Object Name -NotIn $ExcludeDatabase + } + # Get-DbaBackupHistory -Last would make the job in one query but SMO's (and this) report the last backup of this type irregardless of the chain + $FullHistory = Get-DbaBackupHistory -SqlInstance $server -Database $dbs.Name -LastFull -IncludeCopyOnly -Raw + $DiffHistory = Get-DbaBackupHistory -SqlInstance $server -Database $dbs.Name -LastDiff -IncludeCopyOnly -Raw + $IncrHistory = Get-DbaBackupHistory -SqlInstance $server -Database $dbs.Name -LastLog -IncludeCopyOnly -Raw + foreach ($db in $dbs) { + Write-Message -Level Verbose -Message "Processing $db on $instance" + + if ($db.IsAccessible -eq $false) { + Write-Message -Level Warning -Message "The database $db on server $instance is not accessible. Skipping database." + Continue + } + $LastFullBackup = ($FullHistory | Where-Object Database -eq $db.Name | Sort-Object -Property End -Descending | Select-Object -First 1).End + if ($null -ne $LastFullBackup) { + $SinceFull_ = [DbaTimeSpan](New-TimeSpan -Start $LastFullBackup) + } else { + $SinceFull_ = $StartOfTime + } + + $LastDiffBackup = ($DiffHistory | Where-Object Database -eq $db.Name | Sort-Object -Property End -Descending | Select-Object -First 1).End + if ($null -ne $LastDiffBackup) { + $SinceDiff_ = [DbaTimeSpan](New-TimeSpan -Start $LastDiffBackup) + } else { + $SinceDiff_ = $StartOfTime + } + + $LastIncrBackup = ($IncrHistory | Where-Object Database -eq $db.Name | Sort-Object -Property End -Descending | Select-Object -First 1).End + if ($null -ne $LastIncrBackup) { + $SinceLog_ = [DbaTimeSpan](New-TimeSpan -Start $LastIncrBackup) + } else { + $SinceLog_ = $StartOfTime + } + + $daysSinceDbCreated = (New-TimeSpan -Start $db.createDate).Days + + if ($daysSinceDbCreated -lt 1 -and $SinceFull_ -eq 0) { + $Status = 'New database, not backed up yet' + } elseif ($SinceFull_.Days -gt 0 -and $SinceDiff_.Days -gt 0) { + $Status = 'No Full or Diff Back Up in the last day' + } elseif ($db.RecoveryModel -eq "Full" -and $SinceLog_.Hours -gt 0) { + $Status = 'No Log Back Up in the last hour' + } else { + $Status = 'OK' + } + + $result = [PSCustomObject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + Database = $db.Name + RecoveryModel = $db.RecoveryModel + LastFullBackup = [DbaDateTime]$LastFullBackup + LastDiffBackup = [DbaDateTime]$LastDiffBackup + LastLogBackup = [DbaDateTime]$LastIncrBackup + SinceFull = Get-DbaDateOrNull -TimeSpan $SinceFull_ + SinceDiff = Get-DbaDateOrNull -TimeSpan $SinceDiff_ + SinceLog = Get-DbaDateOrNull -TimeSpan $SinceLog_ + DatabaseCreated = $db.createDate + DaysSinceDbCreated = $daysSinceDbCreated + Status = $status + } + Select-DefaultView -InputObject $result -Property ComputerName, InstanceName, SqlInstance, Database, LastFullBackup, LastDiffBackup, LastLogBackup + } + } + } +} +function Get-DbaLastGoodCheckDb { + <# + .SYNOPSIS + Get date/time for last known good DBCC CHECKDB + + .DESCRIPTION + Retrieves and compares the date/time for the last known good DBCC CHECKDB, as well as the creation date/time for the database. + + This function supports SQL Server 2005 and higher. + + Please note that this script uses the DBCC DBINFO() WITH TABLERESULTS. DBCC DBINFO has several known weak points, such as: + - DBCC DBINFO is an undocumented feature/command. + - The LastKnowGood timestamp is updated when a DBCC CHECKFILEGROUP is performed. + - The LastKnowGood timestamp is updated when a DBCC CHECKDB WITH PHYSICAL_ONLY is performed. + - The LastKnowGood timestamp does not get updated when a database in READ_ONLY. + + An empty ($null) LastGoodCheckDb result indicates that a good DBCC CHECKDB has never been performed. + + SQL Server 2008R2 has a "bug" that causes each databases to possess two dbi_dbccLastKnownGood fields, instead of the normal one. + + This script will only display this function to only display the newest timestamp. If -Verbose is specified, the function will announce every time more than one dbi_dbccLastKnownGood fields is encountered. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. Defaults to localhost. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Database + Specifies one or more database(s) to process. If unspecified, all databases will be processed. + + .PARAMETER ExcludeDatabase + Specifies one or more database(s) to exclude from processing. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: CHECKDB, Database + Author: Jakob Bindslet (jakob@bindslet.dk) + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + Ref: + DBCC CHECKDB: + https://msdn.microsoft.com/en-us/library/ms176064.aspx + http://www.sqlcopilot.com/dbcc-checkdb.html + Data Purity: + http://www.sqlskills.com/blogs/paul/checkdb-from-every-angle-how-to-tell-if-data-purity-checks-will-be-run/ + https://www.mssqltips.com/sqlservertip/1988/ensure-sql-server-data-purity-checks-are-performed/ + + .LINK + https://dbatools.io/Get-DbaLastGoodCheckDb + + .EXAMPLE + PS C:\> Get-DbaLastGoodCheckDb -SqlInstance ServerA\sql987 + + Returns a custom object displaying Server, Database, DatabaseCreated, LastGoodCheckDb, DaysSinceDbCreated, DaysSinceLastGoodCheckDb, Status and DataPurityEnabled + + .EXAMPLE + PS C:\> Get-DbaLastGoodCheckDb -SqlInstance ServerA\sql987 -SqlCredential sqladmin | Format-Table -AutoSize + + Returns a formatted table displaying Server, Database, DatabaseCreated, LastGoodCheckDb, DaysSinceDbCreated, DaysSinceLastGoodCheckDb, Status and DataPurityEnabled. Authenticates using SQL Server authentication. + + .EXAMPLE + PS C:\> Get-DbaLastGoodCheckDb -SqlInstance sql2016 -ExcludeDatabase "TempDB" | Format-Table -AutoSize + + Returns a formatted table displaying Server, Database, DatabaseCreated, LastGoodCheckDb, DaysSinceDbCreated, DaysSinceLastGoodCheckDb, Status and DataPurityEnabled. All databases except for "TempDB" will be displayed in the output. + + #> + [CmdletBinding()] + param ( + [parameter(Mandatory, ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [Alias("Credential")] + [PSCredential]$SqlCredential, + [Alias("Databases")] + [object[]]$Database, + [object[]]$ExcludeDatabase, + [Alias('Silent')] + [switch]$EnableException + ) + process { + foreach ($instance in $SqlInstance) { + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $sqlcredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + if ($server.versionMajor -lt 9) { + Stop-Function -Message "Get-DbaLastGoodCheckDb is only supported on SQL Server 2005 and above. Skipping Instance." -Continue -Target $instance + } + + $dbs = $server.Databases + + if ($Database) { + $dbs = $dbs | Where-Object Name -In $Database + } + + if ($ExcludeDatabase) { + $dbs = $dbs | Where-Object Name -NotIn $ExcludeDatabase + } + + foreach ($db in $dbs) { + Write-Message -Level Verbose -Message "Processing $db on $instances." + + if ($db.IsAccessible -eq $false) { + Stop-Function -Message "The database $db is not accessible. Skipping database." -Continue -Target $db + } + + $sql = "DBCC DBINFO ([$($db.name)]) WITH TABLERESULTS" + Write-Message -Level Debug -Message "T-SQL: $sql" + + $resultTable = $db.ExecuteWithResults($sql).Tables[0] + [datetime[]]$lastKnownGoodArray = $resultTable | Where-Object Field -eq 'dbi_dbccLastKnownGood' | Select-Object -ExpandProperty Value + + ## look for databases with two or more occurrences of the field dbi_dbccLastKnownGood + if ($lastKnownGoodArray.count -ge 2) { + Write-Message -Level Verbose -Message "The database $db has $($lastKnownGoodArray.count) dbi_dbccLastKnownGood fields. This script will only use the newest!" + } + [datetime]$lastKnownGood = $lastKnownGoodArray | Sort-Object -Descending | Select-Object -First 1 + + [int]$createVersion = ($resultTable | Where-Object Field -eq 'dbi_createVersion').Value + [int]$dbccFlags = ($resultTable | Where-Object Field -eq 'dbi_dbccFlags').Value + + if (($createVersion -lt 611) -and ($dbccFlags -eq 0)) { + $dataPurityEnabled = $false + } else { + $dataPurityEnabled = $true + } + + $daysSinceCheckDb = (New-TimeSpan -Start $lastKnownGood -End (Get-Date)).Days + $daysSinceDbCreated = (New-TimeSpan -Start $db.createDate -End (Get-Date)).TotalDays + + if ($daysSinceCheckDb -lt 7) { + $Status = 'Ok' + } elseif ($daysSinceDbCreated -lt 7) { + $Status = 'New database, not checked yet' + } else { + $Status = 'CheckDB should be performed' + } + + if ($lastKnownGood -eq '1/1/1900 12:00:00 AM') { + Remove-Variable -Name lastKnownGood, daysSinceCheckDb + } + + [PSCustomObject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + Database = $db.name + DatabaseCreated = $db.createDate + LastGoodCheckDb = $lastKnownGood + DaysSinceDbCreated = $daysSinceDbCreated + DaysSinceLastGoodCheckDb = $daysSinceCheckDb + Status = $status + DataPurityEnabled = $dataPurityEnabled + CreateVersion = $createVersion + DbccFlags = $dbccFlags + } + } + } + } +} +function Get-DbaLatchStatistic { + <# + .SYNOPSIS + Displays latch statistics from sys.dm_os_latch_stats + + .DESCRIPTION + This command is based off of Paul Randal's post "Advanced SQL Server performance tuning" + + Returns: + LatchClass + WaitSeconds + WaitCount + Percentage + AverageWaitSeconds + URL + + Reference: https://www.sqlskills.com/blogs/paul/advanced-performance-troubleshooting-waits-latches-spinlocks/ + https://www.sqlskills.com/blogs/paul/most-common-latch-classes-and-what-they-mean/ + + .PARAMETER SqlInstance + The SQL Server instance. Server version must be SQL Server version 2005 or higher. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Threshold + Threshold, in percentage of all latch stats on the system. Default per Paul's post is 95%. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: LatchStatistics, Waits + Author: Patrick Flynn (@sqllensman) + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaLatchStatistic + + .EXAMPLE + PS C:\> Get-DbaLatchStatistic -SqlInstance sql2008, sqlserver2012 + + Check latch statistics for servers sql2008 and sqlserver2012 + + .EXAMPLE + PS C:\> Get-DbaLatchStatistic -SqlInstance sql2008 -Threshold 98 + + Check latch statistics on server sql2008 for thresholds above 98% + + .EXAMPLE + PS C:\> $output = Get-DbaLatchStatistic -SqlInstance sql2008 -Threshold 100 | Select * | ConvertTo-DbaDataTable + + Collects all latch statistics on server sql2008 into a Data Table. + + .EXAMPLE + PS C:\> 'sql2008','sqlserver2012' | Get-DbaLatchStatistic + + Get latch statistics for servers sql2008 and sqlserver2012 via pipline + + .EXAMPLE + PS C:\> $cred = Get-Credential sqladmin + PS C:\> Get-DbaLatchStatistic -SqlInstance sql2008 -SqlCredential $cred + + Connects using sqladmin credential and returns latch statistics from sql2008 + + .EXAMPLE + PS C:\> $output = Get-DbaLatchStatistic -SqlInstance sql2008 + PS C:\> $output + PS C:\> foreach ($row in ($output | Sort-Object -Unique Url)) { Start-Process ($row).Url } + + Displays the output then loads the associated sqlskills website for each result. Opens one tab per unique URL. + #> + [CmdletBinding()] + param ( + [parameter(Mandatory, ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer", "SqlServers")] + [DbaInstance[]]$SqlInstance, + [PSCredential]$SqlCredential, + [int]$Threshold = 95, + [Alias('Silent')] + [switch]$EnableException + ) + + BEGIN { + $sql = "WITH [Latches] AS + ( + SELECT + [latch_class], + [wait_time_ms] / 1000.0 AS [WaitS], + [waiting_requests_count] AS [WaitCount], + Case WHEN SUM ([wait_time_ms]) OVER() = 0 THEN NULL ELSE 100.0 * [wait_time_ms] / SUM ([wait_time_ms]) OVER() END AS [Percentage], + ROW_NUMBER() OVER(ORDER BY [wait_time_ms] DESC) AS [RowNum] + FROM sys.dm_os_latch_stats + WHERE [latch_class] NOT IN (N'BUFFER') + ) + SELECT + MAX ([W1].[latch_class]) AS [LatchClass], + CAST (MAX ([W1].[WaitS]) AS DECIMAL(14, 2)) AS [WaitSeconds], + MAX ([W1].[WaitCount]) AS [WaitCount], + CAST (MAX ([W1].[Percentage]) AS DECIMAL(14, 2)) AS [Percentage], + CAST ((MAX ([W1].[WaitS]) / MAX ([W1].[WaitCount])) AS DECIMAL (14, 4)) AS [AvgWaitSeconds], + CAST ('https://www.sqlskills.com/help/latches/' + MAX ([W1].[latch_class]) as XML) AS [URL] + FROM [Latches] AS [W1] + INNER JOIN [Latches] AS [W2] + ON [W2].[RowNum] <= [W1].[RowNum] + GROUP BY [W1].[RowNum] + HAVING SUM ([W2].[Percentage]) - MAX ([W1].[Percentage]) < $Threshold;" + + Write-Message -Level Debug -Message $sql + } + process { + if (Test-FunctionInterrupt) { return } + foreach ($instance in $SqlInstance) { + Write-Message -Level Verbose -Message "Connecting to $instance" + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential -MinimumVersion 9 + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + Return + } + Write-Message -Level Verbose -Message "Connected to $instance" + + foreach ($row in $server.Query($sql)) { + [PSCustomObject]@{ + ComputerName = $server.NetName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + WaitType = $row.LatchClass + WaitSeconds = $row.WaitSeconds + WaitCount = $row.WaitCount + Percentage = $row.Percentage + AverageWaitSeconds = $row.AvgWaitSeconds + URL = $row.URL + } + } + } + } +} +function Get-DbaLinkedServer { + <# + .SYNOPSIS + Gets all linked servers and a summary of information from the linked servers listed. + + .DESCRIPTION + Retrieves information about each linked server on the instance(s). + + .PARAMETER SqlInstance + The target SQL Server instance or instances. This can be a collection and receive pipeline input to allow the function + to be executed against multiple SQL Server instances. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER LinkedServer + The linked server(s) to process - this list is auto-populated from the server. If unspecified, all linked servers will be processed. + + .PARAMETER ExcludeLinkedServer + The linked server(s) to exclude - this list is auto-populated from the server + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: LinkedServer, Linked + Author: Stephen Bennett, https://sqlnotesfromtheunderground.wordpress.com/ + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaLinkedServer + + .EXAMPLE + PS C:\> Get-DbaLinkedServer -SqlInstance DEV01 + + Returns all linked servers for the SQL Server instance DEV01 + + .EXAMPLE + PS C:\> Get-DbaCmsRegServer -SqlInstance DEV01 -Group SQLDEV | Get-DbaLinkedServer | Out-GridView + + Returns all linked servers for a group of servers from SQL Server Central Management Server (CMS). Send output to GridView. + #> + [CmdletBinding(DefaultParameterSetName = 'Default')] + param ( + [Parameter(Mandatory, ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer")] + [DbaInstance[]]$SqlInstance, + [PSCredential]$SqlCredential, + [object[]]$LinkedServer, + [object[]]$ExcludeLinkedServer, + [Alias('Silent')] + [switch]$EnableException + ) + process { + foreach ($Instance in $SqlInstance) { + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $sqlcredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + $lservers = $server.LinkedServers + + if ($LinkedServer) { + $lservers = $lservers | Where-Object { $_.Name -in $LinkedServer } + } + if ($ExcludeLinkedServer) { + $lservers = $lservers | Where-Object { $_.Name -notin $ExcludeLinkedServer } + } + + foreach ($ls in $lservers) { + Add-Member -Force -InputObject $ls -MemberType NoteProperty -Name ComputerName -value $server.ComputerName + Add-Member -Force -InputObject $ls -MemberType NoteProperty -Name InstanceName -value $server.ServiceName + Add-Member -Force -InputObject $ls -MemberType NoteProperty -Name SqlInstance -value $server.DomainInstanceName + Add-Member -Force -InputObject $ls -MemberType NoteProperty -Name Impersonate -value $ls.LinkedServerLogins.Impersonate + Add-Member -Force -InputObject $ls -MemberType NoteProperty -Name RemoteUser -value $ls.LinkedServerLogins.RemoteUser + + Select-DefaultView -InputObject $ls -Property ComputerName, InstanceName, SqlInstance, Name, 'DataSource as RemoteServer', ProductName, Impersonate, RemoteUser, 'DistPublisher as Publisher', Distributor, DateLastModified + } + } + } +} +function Get-DbaLocaleSetting { + <# + .SYNOPSIS + Gets the Locale settings on a computer. + + .DESCRIPTION + Gets the Locale settings on one or more computers. + + Requires Local Admin rights on destination computer(s). + + .PARAMETER ComputerName + The target SQL Server instance or instances. + + .PARAMETER Credential + Credential object used to connect to the computer as a different user. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: OS + Author: Klaas Vandenberghe (@PowerDBAKlaas) + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaLocaleSetting + + .EXAMPLE + PS C:\> Get-DbaLocaleSetting -ComputerName sqlserver2014a + + Gets the Locale settings on computer sqlserver2014a. + + .EXAMPLE + PS C:\> 'sql1','sql2','sql3' | Get-DbaLocaleSetting + + Gets the Locale settings on computers sql1, sql2 and sql3. + + .EXAMPLE + PS C:\> Get-DbaLocaleSetting -ComputerName sql1,sql2 -SqlCredential $credential | Out-Gridview + + Gets the Locale settings on computers sql1 and sql2 using SQL Authentication to authenticate to the servers, and shows them in a grid view. + + #> + [CmdletBinding()] + param ( + [parameter(ValueFromPipeline)] + [Alias("cn", "host", "Server")] + [string[]]$ComputerName = $env:COMPUTERNAME, + [PSCredential] $Credential, + [Alias('Silent')] + [switch]$EnableException + ) + + begin { + $ComputerName = $ComputerName | ForEach-Object {$_.split("\")[0]} | Select-Object -Unique + $sessionoption = New-CimSessionOption -Protocol DCom + $keyname = "Control Panel\International" + $NS = 'root\cimv2' + $Reg = 'StdRegProv' + [UInt32]$CIMHiveCU = 2147483649 + } + process { + # uses cim commands + + + foreach ($computer in $ComputerName) { + $props = @{ "ComputerName" = $computer } + $Server = Resolve-DbaNetworkName -ComputerName $Computer -Credential $credential + if ( $Server.FullComputerName ) { + $Computer = $server.FullComputerName + Write-Message -Level Verbose -Message "Creating CIMSession on $computer over WSMan" + $CIMsession = New-CimSession -ComputerName $Computer -ErrorAction SilentlyContinue -Credential $Credential + if ( -not $CIMSession ) { + Write-Message -Level Verbose -Message "Creating CIMSession on $computer over WSMan failed. Creating CIMSession on $computer over DCom" + $CIMsession = New-CimSession -ComputerName $Computer -SessionOption $sessionoption -ErrorAction SilentlyContinue -Credential $Credential + } + if ( $CIMSession ) { + Write-Message -Level Verbose -Message "Getting properties from Registry Key" + $PropNames = Invoke-CimMethod -CimSession $CIMsession -Namespace $NS -ClassName $Reg -MethodName enumvalues -Arguments @{hDefKey = $CIMHiveCU; sSubKeyName = $keyname} | + Select-Object -ExpandProperty snames + + foreach ($Name in $PropNames) { + $sValue = Invoke-CimMethod -CimSession $CIMsession -Namespace $NS -ClassName $Reg -MethodName GetSTRINGvalue -Arguments @{hDefKey = $CIMHiveCU; sSubKeyName = $keyname; sValueName = $Name} | + Select-Object -ExpandProperty svalue + $props.add($Name, $sValue) + } + [PSCustomObject]$props + } #if CIMSession + else { + Write-Message -Level Warning -Message "Can't create CIMSession on $computer" + } + } #if computername + else { + Write-Message -Level Warning -Message "Can't connect to $computer" + } + } #foreach computer + } #PROCESS +} #function +function Get-DbaLogin { + <# + .SYNOPSIS + Function to get an SMO login object of the logins for a given SQL Server instance. Takes a server object from the pipeline. + + .DESCRIPTION + The Get-DbaLogin function returns an SMO Login object for the logins passed, if there are no users passed it will return all logins. + + .PARAMETER SqlInstance + The target SQL Server instance or instances.You must have sysadmin access and server version must be SQL Server version 2000 or higher. + + .PARAMETER SqlCredential + Allows you to login to servers using SQL Logins as opposed to Windows Auth/Integrated/Trusted. + + .PARAMETER Login + The login(s) to process - this list is auto-populated from the server. If unspecified, all logins will be processed. + + .PARAMETER ExcludeLogin + The login(s) to exclude - this list is auto-populated from the server + + .PARAMETER IncludeFilter + A list of logins to include - accepts wildcard patterns + + .PARAMETER ExcludeFilter + A list of logins to exclude - accepts wildcard patterns + + .PARAMETER ExcludeSystemLogin + A Switch to remove System Logins from the output. + + .PARAMETER Type + Filters logins by their type. Valid options are Windows and SQL. + + .PARAMETER Locked + A Switch to return locked Logins. + + .PARAMETER Disabled + A Switch to return disabled Logins. + + .PARAMETER SqlLogins + Deprecated. Please use -Type SQL + + .PARAMETER WindowsLogins + Deprecated. Please use -Type Windows. + + .PARAMETER HasAccess + A Switch to return Logins that have access to the instance of SQL Server. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Login, Security + Author: Mitchell Hamann (@SirCaptainMitch) | Rob Sewell (@SQLDBaWithBeard) + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaLogin + + .EXAMPLE + PS C:\> Get-DbaLogin -SqlInstance sql2016 + + Gets all the logins from server sql2016 using NT authentication and returns the SMO login objects + + .EXAMPLE + PS C:\> Get-DbaLogin -SqlInstance sql2016 -SqlCredential $sqlcred + + Gets all the logins for a given SQL Server using a passed credential object and returns the SMO login objects + + .EXAMPLE + PS C:\> Get-DbaLogin -SqlInstance sql2016 -SqlCredential $sqlcred -Login dbatoolsuser,TheCaptain + + Get specific logins from server sql2016 returned as SMO login objects. + + .EXAMPLE + PS C:\> Get-DbaLogin -SqlInstance sql2016 -IncludeFilter '##*','NT *' + + Get all user objects from server sql2016 beginning with '##' or 'NT ', returned as SMO login objects. + + .EXAMPLE + PS C:\> Get-DbaLogin -SqlInstance sql2016 -ExcludeLogin dbatoolsuser + + Get all user objects from server sql2016 except the login dbatoolsuser, returned as SMO login objects. + + .EXAMPLE + PS C:\> Get-DbaLogin -SqlInstance sql2016 -Type Windows + + Get all user objects from server sql2016 that are Windows Logins + + .EXAMPLE + PS C:\> Get-DbaLogin -SqlInstance sql2016 -Type Windows -IncludeFilter *Rob* + + Get all user objects from server sql2016 that are Windows Logins and have Rob in the name + + .EXAMPLE + PS C:\> Get-DbaLogin -SqlInstance sql2016 -Type SQL + + Get all user objects from server sql2016 that are SQL Logins + + .EXAMPLE + PS C:\> Get-DbaLogin -SqlInstance sql2016 -Type SQL -IncludeFilter *Rob* + + Get all user objects from server sql2016 that are SQL Logins and have Rob in the name + + .EXAMPLE + PS C:\> Get-DbaLogin -SqlInstance sql2016 -ExcludeSystemLogin + + Get all user objects from server sql2016 that are not system objects + + .EXAMPLE + PS C:\> Get-DbaLogin -SqlInstance sql2016 -ExcludeFilter '##*','NT *' + + Get all user objects from server sql2016 except any beginning with '##' or 'NT ', returned as SMO login objects. + + .EXAMPLE + PS C:\> 'sql2016', 'sql2014' | Get-DbaLogin -SqlCredential $sqlcred + + Using Get-DbaLogin on the pipeline, you can also specify which names you would like with -Login. + + .EXAMPLE + PS C:\> 'sql2016', 'sql2014' | Get-DbaLogin -SqlCredential $sqlcred -Locked + + Using Get-DbaLogin on the pipeline to get all locked logins on servers sql2016 and sql2014. + + .EXAMPLE + PS C:\> 'sql2016', 'sql2014' | Get-DbaLogin -SqlCredential $sqlcred -HasAccess -Disabled + + Using Get-DbaLogin on the pipeline to get all Disabled logins that have access on servers sql2016 or sql2014. + +#> + [CmdletBinding()] + param ( + [parameter(Position = 0, Mandatory, ValueFromPipeline)] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [object[]]$Login, + [object[]]$IncludeFilter, + [object[]]$ExcludeLogin, + [object[]]$ExcludeFilter, + [Alias('ExcludeSystemLogins')] + [switch]$ExcludeSystemLogin, + [ValidateSet('Windows', 'SQL')] + [string]$Type, + [switch]$HasAccess, + [switch]$SqlLogins, + [switch]$WindowsLogins, + [switch]$Locked, + [switch]$Disabled, + [switch]$EnableException + ) + begin { + Test-DbaDeprecation -DeprecatedOn 1.0.0 -Parameter SQLLogins + Test-DbaDeprecation -DeprecatedOn 1.0.0 -Parameter WindowsLogins + + if ($SQLLogins) { + $Type = "SQL" + } + if ($WindowsLogins) { + $Type = "Windows" + } + } + process { + foreach ($instance in $SqlInstance) { + + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + $serverLogins = $server.Logins + + if ($Login) { + $serverLogins = $serverLogins | Where-Object Name -in $Login + } + + if ($ExcludeSystemLogin) { + $serverLogins = $serverLogins | Where-Object IsSystemObject -eq $false + } + + if ($Type -eq 'Windows') { + $serverLogins = $serverLogins | Where-Object LoginType -in @('WindowsUser', 'WindowsGroup') + } + + if ($Type -eq 'SQL') { + $serverLogins = $serverLogins | Where-Object LoginType -eq 'SqlLogin' + } + + if ($IncludeFilter) { + $serverLogins = $serverLogins | Where-Object { + foreach ($filter in $IncludeFilter) { + if ($_.Name -like $filter) { + return $true; + } + } + } + } + + if ($ExcludeLogin) { + $serverLogins = $serverLogins | Where-Object Name -NotIn $ExcludeLogin + } + + if ($ExcludeFilter) { + foreach ($filter in $ExcludeFilter) { + $serverLogins = $serverLogins | Where-Object Name -NotLike $filter + } + } + + if ($HasAccess) { + $serverLogins = $serverLogins | Where-Object HasAccess + } + + if ($Locked) { + $serverLogins = $serverLogins | Where-Object IsLocked + } + + if ($Disabled) { + $serverLogins = $serverLogins | Where-Object IsDisabled + } + + foreach ($serverLogin in $serverlogins) { + Write-Message -Level Verbose -Message "Processing $serverLogin on $instance" + + if ($server.VersionMajor -gt 9) { + # There's no reliable method to get last login time with SQL Server 2000, so only show on 2005+ + Write-Message -Level Verbose -Message "Getting last login time" + $sql = "SELECT MAX(login_time) AS [login_time] FROM sys.dm_exec_sessions WHERE login_name = '$($serverLogin.name)'" + Add-Member -Force -InputObject $serverLogin -MemberType NoteProperty -Name LastLogin -Value $server.ConnectionContext.ExecuteScalar($sql) + } else { + Add-Member -Force -InputObject $serverLogin -MemberType NoteProperty -Name LastLogin -Value $null + } + + Add-Member -Force -InputObject $serverLogin -MemberType NoteProperty -Name ComputerName -Value $server.ComputerName + Add-Member -Force -InputObject $serverLogin -MemberType NoteProperty -Name InstanceName -Value $server.ServiceName + Add-Member -Force -InputObject $serverLogin -MemberType NoteProperty -Name SqlInstance -Value $server.DomainInstanceName + + Select-DefaultView -InputObject $serverLogin -Property ComputerName, InstanceName, SqlInstance, Name, LoginType, CreateDate, LastLogin, HasAccess, IsLocked, IsDisabled + } + } + } +} +function Get-DbaMaintenanceSolutionLog { + <# + .SYNOPSIS + Reads the log files generated by the IndexOptimize Agent Job from Ola Hallengren's MaintenanceSolution. + + .DESCRIPTION + Ola wrote a .sql script to get the content from the commandLog table. However, if LogToTable='N', there will be no logging in that table. This function reads the text files that are written in the SQL Instance's Log directory. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER LogType + Accepts 'IndexOptimize', 'DatabaseBackup', 'DatabaseIntegrityCheck'. ATM only IndexOptimize parsing is available + + .PARAMETER Since + Consider only files generated since this date + + .PARAMETER Path + Where to search for log files. By default it's the SQL instance errorlogpath path + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Ola, Maintenance + Author: Klaas Vandenberghe (@powerdbaklaas) | Simone Bizzotto ( @niphlod ) + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaMaintenanceSolutionLog + + .EXAMPLE + PS C:\> Get-DbaMaintenanceSolutionLog -SqlInstance sqlserver2014a + + Gets the outcome of the IndexOptimize job on sql instance sqlserver2014a. + + .EXAMPLE + PS C:\> Get-DbaMaintenanceSolutionLog -SqlInstance sqlserver2014a -SqlCredential $credential + + Gets the outcome of the IndexOptimize job on sqlserver2014a, using SQL Authentication. + + .EXAMPLE + PS C:\> 'sqlserver2014a', 'sqlserver2020test' | Get-DbaMaintenanceSolutionLog + + Gets the outcome of the IndexOptimize job on sqlserver2014a and sqlserver2020test. + + .EXAMPLE + PS C:\> Get-DbaMaintenanceSolutionLog -SqlInstance sqlserver2014a -Path 'D:\logs\maintenancesolution\' + + Gets the outcome of the IndexOptimize job on sqlserver2014a, reading the log files in their custom location. + + .EXAMPLE + PS C:\> Get-DbaMaintenanceSolutionLog -SqlInstance sqlserver2014a -Since '2017-07-18' + + Gets the outcome of the IndexOptimize job on sqlserver2014a, starting from july 18, 2017. + + .EXAMPLE + PS C:\> Get-DbaMaintenanceSolutionLog -SqlInstance sqlserver2014a -LogType IndexOptimize + + Gets the outcome of the IndexOptimize job on sqlserver2014a, the other options are not yet available! sorry + + #> + [CmdletBinding(DefaultParameterSetName = "Default")] + [Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSUseApprovedVerbs", "", Justification = "Internal functions are ignored")] + param ( + [parameter(Mandatory, ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [Alias("Credential")] + [PSCredential]$SqlCredential, + [ValidateSet('IndexOptimize', 'DatabaseBackup', 'DatabaseIntegrityCheck')] + [string[]]$LogType = 'IndexOptimize', + [datetime]$Since, + [string]$Path, + [Alias('Silent')] + [switch]$EnableException + ) + begin { + function process-block ($block) { + $fresh = @{ + 'ObjectType' = $null + 'IndexType' = $null + 'ImageText' = $null + 'NewLOB' = $null + 'FileStream' = $null + 'ColumnStore' = $null + 'AllowPageLocks' = $null + 'PageCount' = $null + 'Fragmentation' = $null + 'Error' = $null + } + foreach ($l in $block) { + $splitted = $l -split ': ', 2 + if (($splitted.Length -ne 2) -or ($splitted[0].length -gt 20)) { + if ($null -eq $fresh['Error']) { + $fresh['Error'] = New-Object System.Collections.ArrayList + } + $null = $fresh['Error'].Add($l) + continue + } + $k = $splitted[0] + $v = $splitted[1] + if ($k -eq 'Date and Time') { + # this is the end date, we already parsed the start date of the block + if ($fresh.ContainsKey($k)) { + continue + } + } + $fresh[$k] = $v + } + if ($fresh.ContainsKey('Command')) { + if ($fresh['Command'] -match '(SET LOCK_TIMEOUT (?\d+); )?ALTER INDEX \[(?[^\]]+)\] ON \[(?[^\]]+)\]\.\[(?[^]]+)\]\.\[(?[^\]]+)\] (?[^\ ]+)( PARTITION = (?\d+))? WITH \((?[^\)]+)') { + $fresh['Index'] = $Matches.index + $fresh['Statistics'] = $null + $fresh['Schema'] = $Matches.Schema + $fresh['Table'] = $Matches.Table + $fresh['Action'] = $Matches.action + $fresh['Options'] = $Matches.options + $fresh['Timeout'] = $Matches.timeout + $fresh['Partition'] = $Matches.partition + } elseif ($fresh['Command'] -match '(SET LOCK_TIMEOUT (?\d+); )?UPDATE STATISTICS \[(?[^\]]+)\]\.\[(?[^]]+)\]\.\[(?
[^\]]+)\] \[(?[^\]]+)\]') { + $fresh['Index'] = $null + $fresh['Statistics'] = $Matches.stat + $fresh['Schema'] = $Matches.Schema + $fresh['Table'] = $Matches.Table + $fresh['Action'] = $null + $fresh['Options'] = $null + $fresh['Timeout'] = $Matches.timeout + $fresh['Partition'] = $null + } + } + if ($fresh.ContainsKey('Comment')) { + $commentparts = $fresh['Comment'] -split ', ' + foreach ($part in $commentparts) { + $indkey, $indvalue = $part -split ': ', 2 + if ($fresh.ContainsKey($indkey)) { + $fresh[$indkey] = $indvalue + } + } + } + if ($null -ne $fresh['Error']) { + $fresh['Error'] = $fresh['Error'] -join "`n" + } + + return $fresh + } + } + process { + foreach ($instance in $sqlinstance) { + $logdir = $logfiles = $null + $computername = $instance.ComputerName + + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $sqlcredential + } catch { + Stop-Function -Message "Can't connect to $instance" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + if ($logtype -ne 'IndexOptimize') { + Write-Message -Level Warning -Message "Parsing $logtype is not supported at the moment" + Continue + } + if ($Path) { + $logdir = Join-AdminUnc -Servername $server.ComputerName -Filepath $Path + } else { + $logdir = Join-AdminUnc -Servername $server.ComputerName -Filepath $server.errorlogpath # -replace '^(.):', "\\$computername\`$1$" + } + if (!$logdir) { + Write-Message -Level Warning -Message "No log directory returned from $instance" + Continue + } + + Write-Message -Level Verbose -Message "Log directory on $computername is $logdir" + if (! (Test-Path $logdir)) { + Write-Message -Level Warning -Message "Directory $logdir is not accessible" + continue + } + $logfiles = [System.IO.Directory]::EnumerateFiles("$logdir", "IndexOptimize_*.txt") + if ($Since) { + $filteredlogs = @() + foreach ($l in $logfiles) { + $base = $($l.Substring($l.Length - 15, 15)) + try { + $datefile = [DateTime]::ParseExact($base, 'yyyyMMdd_HHmmss', $null) + } catch { + $datefile = Get-ItemProperty -Path $l | Select-Object -ExpandProperty CreationTime + } + if ($datefile -gt $since) { + $filteredlogs += $l + } + } + $logfiles = $filteredlogs + } + if (! $logfiles.count -ge 1) { + Write-Message -Level Warning -Message "No log files returned from $computername" + Continue + } + $instanceinfo = @{ } + $instanceinfo['ComputerName'] = $server.ComputerName + $instanceinfo['InstanceName'] = $server.ServiceName + $instanceinfo['SqlInstance'] = $server.Name + + foreach ($File in $logfiles) { + Write-Message -Level Verbose -Message "Reading $file" + $text = New-Object System.IO.StreamReader -ArgumentList "$File" + $block = New-Object System.Collections.ArrayList + $remember = @{} + while ($line = $text.ReadLine()) { + + $real = $line.Trim() + if ($real.Length -eq 0) { + $processed = process-block $block + if ('Procedure' -in $processed.Keys) { + $block = New-Object System.Collections.ArrayList + continue + } + if ('Database' -in $processed.Keys) { + Write-Message -Level Verbose -Message "Index and Stats Optimizations on Database $($processed.Database) on $computername" + $processed.Remove('Is accessible') + $processed.Remove('User access') + $processed.Remove('Date and time') + $processed.Remove('Standby') + $processed.Remove('Recovery Model') + $processed.Remove('Updateability') + $processed['Database'] = $processed['Database'].Trim('[]') + $remember = $processed.Clone() + } else { + foreach ($k in $processed.Keys) { + $remember[$k] = $processed[$k] + } + $remember.Remove('Command') + $remember['StartTime'] = [dbadatetime]([DateTime]::ParseExact($remember['Date and time'] , "yyyy-MM-dd HH:mm:ss", $null)) + $remember.Remove('Date and time') + $remember['Duration'] = ($remember['Duration'] -as [timespan]) + [pscustomobject]$remember + } + $block = New-Object System.Collections.ArrayList + } else { + $null = $block.Add($real) + } + } + $text.close() + } + } + } +} +function Get-DbaManagementObject { + <# + .SYNOPSIS + Gets SQL Mangaement Object versions installed on the machine. + + .DESCRIPTION + The Get-DbaManagementObject returns an object with the Version and the + Add-Type Load Template for each version on the server. + + .PARAMETER ComputerName + The name of the Windows Server(s) you would like to check. + + .PARAMETER Credential + This command uses Windows credentials. This parameter allows you to connect remotely as a different user. + + .PARAMETER VersionNumber + This is the specific version number you are looking for. The function will look + for that version only. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: SMO + Author: Ben Miller (@DBAduck), http://dbaduck.com + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaManagementObject + + .EXAMPLE + PS C:\> Get-DbaManagementObject + + Returns all versions of SMO on the computer + + .EXAMPLE + PS C:\> Get-DbaManagementObject -VersionNumber 13 + + Returns just the version specified. If the version does not exist then it will return nothing. + + #> + [CmdletBinding()] + param ( + [parameter(ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer", "SqlInstance")] + [DbaInstanceParameter[]]$ComputerName = $env:COMPUTERNAME, + [PSCredential] + $Credential, + [int]$VersionNumber, + [Alias('Silent')] + [switch]$EnableException + ) + + begin { + if (!$VersionNumber) { + $VersionNumber = 0 + } + $scriptblock = { + $VersionNumber = [int]$args[0] + <# DO NOT use Write-Message as this is inside of a script block #> + Write-Verbose -Message "Checking currently loaded SMO version" + $loadedversion = [AppDomain]::CurrentDomain.GetAssemblies() | Where-Object { $_.Fullname -like "Microsoft.SqlServer.SMO,*" } + if ($loadedversion) { + $loadedversion = $loadedversion | ForEach-Object { + if ($_.Location -match "__") { + ((Split-Path (Split-Path $_.Location) -Leaf) -split "__")[0] + } else { + ((Get-ChildItem -Path $_.Location).VersionInfo.ProductVersion) + } + } + } + <# DO NOT use Write-Message as this is inside of a script block #> + Write-Verbose -Message "Looking for included smo library" + $localversion = [version](Get-ChildItem -Path "$script:PSModuleRoot\bin\smo\Microsoft.SqlServer.Smo.dll").VersionInfo.ProductVersion + + foreach ($version in $localversion) { + if ($VersionNumber -eq 0) { + <# DO NOT use Write-Message as this is inside of a script block #> + Write-Verbose -Message "Did not pass a version" + [PSCustomObject]@{ + ComputerName = $env:COMPUTERNAME + Version = $localversion + Loaded = $loadedversion -contains $localversion + LoadTemplate = "Add-Type -Path $("$script:PSModuleRoot\bin\smo\Microsoft.SqlServer.Smo.dll")" + } + } else { + <# DO NOT use Write-Message as this is inside of a script block #> + Write-Verbose -Message "Passed version $VersionNumber, looking for that specific version" + if ($localversion.ToString().StartsWith("$VersionNumber.")) { + <# DO NOT use Write-Message as this is inside of a script block #> + Write-Verbose -Message "Found the Version $VersionNumber" + [PSCustomObject]@{ + ComputerName = $env:COMPUTERNAME + Version = $localversion + Loaded = $loadedversion -contains $localversion + LoadTemplate = "Add-Type -Path $("$script:PSModuleRoot\bin\smo\Microsoft.SqlServer.Smo.dll")" + } + } + } + } + <# DO NOT use Write-Message as this is inside of a script block #> + Write-Verbose -Message "Looking for SMO in the Global Assembly Cache" + $smolist = (Get-ChildItem -Path "$env:SystemRoot\assembly\GAC_MSIL\Microsoft.SqlServer.Smo" | Sort-Object Name -Descending).Name + + foreach ($version in $smolist) { + $array = $version.Split("__") + if ($VersionNumber -eq 0) { + <# DO NOT use Write-Message as this is inside of a script block #> + Write-Verbose -Message "Did not pass a version, looking for all versions" + $currentversion = $array[0] + [PSCustomObject]@{ + ComputerName = $env:COMPUTERNAME + Version = $currentversion + Loaded = $loadedversion -contains $currentversion + LoadTemplate = "Add-Type -AssemblyName `"Microsoft.SqlServer.Smo, Version=$($array[0]), Culture=neutral, PublicKeyToken=89845dcd8080cc91`"" + } + } else { + <# DO NOT use Write-Message as this is inside of a script block #> + Write-Verbose -Message "Passed version $VersionNumber, looking for that specific version" + if ($array[0].StartsWith("$VersionNumber.")) { + <# DO NOT use Write-Message as this is inside of a script block #> + Write-Verbose -Message "Found the Version $VersionNumber" + $currentversion = $array[0] + [PSCustomObject]@{ + ComputerName = $env:COMPUTERNAME + Version = $currentversion + Loaded = $loadedversion -contains $currentversion + LoadTemplate = "Add-Type -AssemblyName `"Microsoft.SqlServer.Smo, Version=$($array[0]), Culture=neutral, PublicKeyToken=89845dcd8080cc91`"" + } + } + } + } + } + } + + process { + foreach ($computer in $ComputerName.ComputerName) { + try { + Write-Message -Level Verbose -Message "Executing scriptblock against $computer" + Invoke-Command2 -ComputerName $computer -ScriptBlock $scriptblock -Credential $Credential -ArgumentList $VersionNumber -ErrorAction Stop + } catch { + Stop-Function -Continue -Message "Failure" -ErrorRecord $_ -Target $ComputerName + } + } + } + end { + Test-DbaDeprecation -DeprecatedOn "1.0.0" -EnableException:$false -Alias Get-DbaSqlManagementObject + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function Get-DbaMaxMemory { + <# + .SYNOPSIS + Gets the 'Max Server Memory' configuration setting and the memory of the server. Works on SQL Server 2000-2014. + + .DESCRIPTION + This command retrieves the SQL Server 'Max Server Memory' configuration setting as well as the total physical installed on the server. + + Results are turned in megabytes (MB). + + .PARAMETER SqlInstance + The target SQL Server instance or instances. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: MaxMemory, Memory + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaMaxMemory + + .EXAMPLE + PS C:\> Get-DbaMaxMemory -SqlInstance sqlcluster, sqlserver2012 + + Get memory settings for instances "sqlcluster" and "sqlserver2012". Returns results in megabytes (MB). + + .EXAMPLE + PS C:\> Get-DbaCmsRegServer -SqlInstance sqlcluster | Get-DbaMaxMemory | Where-Object { $_.MaxValue -gt $_.Total } + + Find all servers in Server Central Management Server that have 'Max Server Memory' set to higher than the total memory of the server (think 2147483647) + + .EXAMPLE + PS C:\> Find-DbaInstance -ComputerName localhost | Get-DbaMaxMemory | Format-Table -AutoSize + + Scans localhost for instances using the browser service, traverses all instances and displays memory settings in a formatted table. + #> + [CmdletBinding()] + param ( + [parameter(Position = 0, Mandatory, ValueFromPipeline)] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [switch]$EnableException + ) + + process { + foreach ($instance in $SqlInstance) { + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $sqlcredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + $totalMemory = $server.PhysicalMemory + + # Some servers under-report by 1. + if (($totalMemory % 1024) -ne 0) { + $totalMemory = $totalMemory + 1 + } + + [pscustomobject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + Total = [int]$totalMemory + MaxValue = [int]$server.Configuration.MaxServerMemory.ConfigValue + Server = $server # This will allowing piping a non-connected object + } | Select-DefaultView -Property ComputerName, InstanceName, SqlInstance, Total, MaxValue + } + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function Get-DbaMemoryCondition { + <# + .SYNOPSIS + Determine the memory conditions from SQL Server ring buffers. + + .DESCRIPTION + The information from SQL Server ring buffers can be used to determine the memory conditions on the server when paging occurs. + + This command is based on a query provided by Microsoft support. + Reference KB article: https://support.microsoft.com/en-us/help/918483/how-to-reduce-paging-of-buffer-pool-memory-in-the-64-bit-version-of-sq + + .PARAMETER SqlInstance + The target SQL Server instance or instances. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential). + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Memory + Author: IJeb Reitsma + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaMemoryCondition + + .EXAMPLE + PS C:\> Get-DbaMemoryCondition -SqlInstance sqlserver2014a + + Returns the memory conditions for the selected instance + + .EXAMPLE + PS C:\> Get-DbaCmsRegServer -SqlInstance sqlserver2014a -Group GroupName | Get-DbaMemoryCondition | Out-GridView + + Returns the memory conditions for a group of servers from SQL Server Central Management Server (CMS). Send output to GridView. + #> + [CmdletBinding()] + param ( + [parameter(Position = 0, Mandatory, ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer", "SqlServers")] + [DbaInstance[]]$SqlInstance, + [PSCredential]$SqlCredential, + [switch]$EnableException + ) + + begin { + $sql = "SELECT CONVERT (varchar(30), GETDATE(), 121) as Runtime, + DATEADD (ms, -1 * (sys.ms_ticks - a.[RecordTime]), GETDATE()) AS NotificationTime, + [NotificationType], + [MemoryUtilizationPercent], + [TotalPhysicalMemoryKB], + [AvailablePhysicalMemoryKB], + [TotalPageFileKB], + [AvailablePageFileKB], + [TotalVirtualAddressSpaceKB], + [AvailableVirtualAddressSpaceKB], + [NodeId], + [SQLReservedMemoryKB], + [SQLCommittedMemoryKB], + [RecordId], + [Type], + [Indicators], + [RecordTime], + sys.ms_ticks AS [CurrentTime] + FROM + (SELECT x.value('(//Record/ResourceMonitor/Notification)[1]', 'varchar(30)') AS [NotificationType], + x.value('(//Record/MemoryRecord/MemoryUtilization)[1]', 'bigint') AS [MemoryUtilizationPercent], + x.value('(//Record/MemoryRecord/TotalPhysicalMemory)[1]', 'bigint') AS [TotalPhysicalMemoryKB], + x.value('(//Record/MemoryRecord/AvailablePhysicalMemory)[1]', 'bigint') AS [AvailablePhysicalMemoryKB], + x.value('(//Record/MemoryRecord/TotalPageFile)[1]', 'bigint') AS [TotalPageFileKB], + x.value('(//Record/MemoryRecord/AvailablePageFile)[1]', 'bigint') AS [AvailablePageFileKB], + x.value('(//Record/MemoryRecord/TotalVirtualAddressSpace)[1]', 'bigint') AS [TotalVirtualAddressSpaceKB], + x.value('(//Record/MemoryRecord/AvailableVirtualAddressSpace)[1]', 'bigint') AS [AvailableVirtualAddressSpaceKB], + x.value('(//Record/MemoryNode/@id)[1]', 'bigint') AS [NodeId], + x.value('(//Record/MemoryNode/ReservedMemory)[1]', 'bigint') AS [SQLReservedMemoryKB], + x.value('(//Record/MemoryNode/CommittedMemory)[1]', 'bigint') AS [SQLCommittedMemoryKB], + x.value('(//Record/@id)[1]', 'bigint') AS [RecordId], + x.value('(//Record/@type)[1]', 'varchar(30)') AS [Type], + x.value('(//Record/ResourceMonitor/Indicators)[1]', 'bigint') AS [Indicators], + x.value('(//Record/@time)[1]', 'bigint') AS [RecordTime] + FROM (SELECT CAST (record as xml) FROM sys.dm_os_ring_buffers + WHERE ring_buffer_type = 'RING_BUFFER_RESOURCE_MONITOR') AS R(x)) a +CROSS JOIN sys.dm_os_sys_info sys +ORDER BY a.[RecordTime] ASC" + } + process { + foreach ($instance in $SqlInstance) { + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential -MinimumVersion 9 + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + try { + $results = $server.Query($sql) + } catch { + Stop-Function -Message "Issue collecting data" -Target $instance -ErrorRecord $_ + } + foreach ($row in $results) { + [PSCustomObject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + Runtime = $row.runtime + NotificationTime = $row.NotificationTime + NotificationType = $row.NotificationType + MemoryUtilizationPercent = $row.MemoryUtilizationPercent + TotalPhysicalMemory = [dbasize]$row.TotalPhysicalMemoryKB * 1024 + AvailablePhysicalMemory = [dbasize]$row.AvailablePhysicalMemoryKB * 1024 + TotalPageFile = [dbasize]$row.TotalPageFileKB * 1024 + AvailablePageFile = [dbasize]$row.AvailablePageFileKB * 1024 + TotalVirtualAddressSpace = [dbasize]$row.TotalVirtualAddressSpaceKB * 1024 + AvailableVirtualAddressSpace = [dbasize]$row.AvailableVirtualAddressSpaceKB * 1024 + NodeId = $row.NodeId + SQLReservedMemory = [dbasize]$row.SQLReservedMemoryKB * 1024 + SQLCommittedMemory = [dbasize]$row.SQLCommittedMemoryKB * 1024 + RecordId = $row.RecordId + Type = $row.Type + Indicators = $row.Indicators + RecordTime = $row.RecordTime + CurrentTime = $row.CurrentTime + } + } + } + } +} +#ValidationTags#Messaging,CodeStyle# +function Get-DbaMemoryUsage { + <# + .SYNOPSIS + Get amount of memory in use by *all* SQL Server components and instances + + .DESCRIPTION + Retrieves the amount of memory per performance counter. Default output includes columns Server, counter instance, counter, number of pages, memory in KB, memory in MB + SSAS and SSIS are included. + + SSRS does not have memory counters, only memory shrinks and memory pressure state. + + This function requires local admin role on the targeted computers. + + .PARAMETER ComputerName + The Windows Server that you are connecting to. Note that this will return all instances, but Out-GridView makes it easy to filter to specific instances. + + .PARAMETER Credential + Credential object used to connect to the SQL Server as a different user + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Memory + Author: Klaas Vandenberghe (@PowerDBAKlaas) + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + SSIS Counters: https://msdn.microsoft.com/en-us/library/ms137622.aspx + + .LINK + https://dbatools.io/Get-DbaMemoryUsage + + .EXAMPLE + PS C:\> Get-DbaMemoryUsage -ComputerName sql2017 + + Returns a custom object displaying Server, counter instance, counter, number of pages, memory + + .EXAMPLE + PS C:\> Get-DbaMemoryUsage -ComputerName sql2017\sqlexpress -SqlCredential sqladmin | Where-Object { $_.Memory.Megabyte -gt 100 } + + Logs into the sql2017\sqlexpress as sqladmin using SQL Authentication then returns results only where memory exceeds 100 MB + + .EXAMPLE + PS C:\> $servers | Get-DbaMemoryUsage | Out-Gridview + + Gets results from an array of $servers then diplays them in a gridview. + #> + [CmdletBinding()] + param ( + [parameter(ValueFromPipeline)] + [Alias("Host", "cn", "Server")] + [DbaInstanceParameter[]]$ComputerName = $env:COMPUTERNAME, + [PSCredential]$Credential, + [switch]$EnableException + ) + + begin { + if ($Simple) { + $Memcounters = '(Total Server Memory |Target Server Memory |Connection Memory |Lock Memory |SQL Cache Memory |Optimizer Memory |Granted Workspace Memory |Cursor memory usage|Maximum Workspace)' + $Plancounters = 'total\)\\cache pages' + $BufManpagecounters = 'Total pages' + $SSAScounters = '(\\memory usage)' + $SSIScounters = '(memory)' + } else { + $Memcounters = '(Total Server Memory |Target Server Memory |Connection Memory |Lock Memory |SQL Cache Memory |Optimizer Memory |Granted Workspace Memory |Cursor memory usage|Maximum Workspace)' + $Plancounters = '(cache pages|procedure plan|ad hoc sql plan|prepared SQL Plan)' + $BufManpagecounters = '(Free pages|Reserved pages|Stolen pages|Total pages|Database pages|target pages|extension .* pages)' + $SSAScounters = '(\\memory )' + $SSIScounters = '(memory)' + } + + $scriptblock = { + param ($Memcounters, + $Plancounters, + $BufManpagecounters, + $SSAScounters, + $SSIScounters) + <# DO NOT use Write-Message as this is inside of a script block #> + Write-Verbose -Message "Searching for Memory Manager Counters on $Computer" + try { + $availablecounters = (Get-Counter -ListSet '*sql*:Memory Manager*' -ErrorAction SilentlyContinue).paths + (Get-Counter -Counter $availablecounters -ErrorAction SilentlyContinue).countersamples | + Where-Object { $_.Path -match $Memcounters } | + ForEach-Object { + $instance = (($_.Path.split("\")[-2]).replace("mssql`$", "")).split(':')[0] + if ($instance -eq 'sqlserver') { $instance = 'mssqlserver' } + [PSCustomObject]@{ + ComputerName = $env:computername + SqlInstance = $instance + CounterInstance = (($_.Path.split("\")[-2]).replace("mssql`$", "")).split(':')[1] + Counter = $_.Path.split("\")[-1] + Pages = $null + Memory = $_.cookedvalue / 1024 + } + } + } catch { + <# DO NOT use Write-Message as this is inside of a script block #> + Write-Verbose -Message "No Memory Manager Counters on $Computer" + } + <# DO NOT use Write-Message as this is inside of a script block #> + Write-Verbose -Message "Searching for Plan Cache Counters on $Computer" + try { + $availablecounters = (Get-Counter -ListSet '*sql*:Plan Cache*' -ErrorAction SilentlyContinue).paths + (Get-Counter -Counter $availablecounters -ErrorAction SilentlyContinue).countersamples | + Where-Object { $_.Path -match $Plancounters } | + ForEach-Object { + $instance = (($_.Path.split("\")[-2]).replace("mssql`$", "")).split(':')[0] + if ($instance -eq 'sqlserver') { $instance = 'mssqlserver' } + [PSCustomObject]@{ + ComputerName = $env:computername + SqlInstance = $instance + CounterInstance = (($_.Path.split("\")[-2]).replace("mssql`$", "")).split(':')[1] + Counter = $_.Path.split("\")[-1] + Pages = $_.cookedvalue + Memory = $_.cookedvalue * 8192 / 1048576 + } + } + } catch { + <# DO NOT use Write-Message as this is inside of a script block #> + Write-Verbose -Message "No Plan Cache Counters on $Computer" + } + <# DO NOT use Write-Message as this is inside of a script block #> + Write-Verbose -Message "Searching for Buffer Manager Counters on $Computer" + try { + $availablecounters = (Get-Counter -ListSet "*Buffer Manager*" -ErrorAction SilentlyContinue).paths + (Get-Counter -Counter $availablecounters -ErrorAction SilentlyContinue).countersamples | + Where-Object { $_.Path -match $BufManpagecounters } | + ForEach-Object { + $instance = (($_.Path.split("\")[-2]).replace("mssql`$", "")).split(':')[0] + if ($instance -eq 'sqlserver') { $instance = 'mssqlserver' } + [PSCustomObject]@{ + ComputerName = $env:computername + SqlInstance = $instance + CounterInstance = (($_.Path.split("\")[-2]).replace("mssql`$", "")).split(':')[1] + Counter = $_.Path.split("\")[-1] + Pages = $_.cookedvalue + Memory = $_.cookedvalue * 8192 / 1048576.0 + } + } + } catch { + <# DO NOT use Write-Message as this is inside of a script block #> + Write-Verbose -Message "No Buffer Manager Counters on $Computer" + } + <# DO NOT use Write-Message as this is inside of a script block #> + Write-Verbose -Message "Searching for SSAS Counters on $Computer" + try { + $availablecounters = (Get-Counter -ListSet "MSAS*:Memory" -ErrorAction SilentlyContinue).paths + (Get-Counter -Counter $availablecounters -ErrorAction SilentlyContinue).countersamples | + Where-Object { $_.Path -match $SSAScounters } | + ForEach-Object { + $instance = (($_.Path.split("\")[-2]).replace("mssql`$", "")).split(':')[0] + if ($instance -eq 'sqlserver') { $instance = 'mssqlserver' } + [PSCustomObject]@{ + ComputerName = $env:COMPUTERNAME + SqlInstance = $instance + CounterInstance = (($_.Path.split("\")[-2]).replace("mssql`$", "")).split(':')[1] + Counter = $_.Path.split("\")[-1] + Pages = $null + Memory = $_.cookedvalue / 1024 + } + } + } catch { + <# DO NOT use Write-Message as this is inside of a script block #> + Write-Verbose -Message "No SSAS Counters on $Computer" + } + <# DO NOT use Write-Message as this is inside of a script block #> + Write-Verbose -Message "Searching for SSIS Counters on $Computer" + try { + $availablecounters = (Get-Counter -ListSet "*SSIS*" -ErrorAction SilentlyContinue).paths + (Get-Counter -Counter $availablecounters -ErrorAction SilentlyContinue).countersamples | + Where-Object { $_.Path -match $SSIScounters } | + ForEach-Object { + $instance = (($_.Path.split("\")[-2]).replace("mssql`$", "")).split(':')[0] + if ($instance -eq 'sqlserver') { $instance = 'mssqlserver' } + [PSCustomObject]@{ + ComputerName = $env:computername + SqlInstance = $instance + CounterInstance = (($_.Path.split("\")[-2]).replace("mssql`$", "")).split(':')[1] + Counter = $_.Path.split("\")[-1] + Pages = $null + Memory = $_.cookedvalue / 1024 / 1024 + } + } + } catch { + <# DO NOT use Write-Message as this is inside of a script block #> + Write-Verbose -Message "No SSIS Counters on $Computer" + } + } + } + + process { + foreach ($Computer in $ComputerName.ComputerName) { + $reply = Resolve-DbaNetworkName -ComputerName $computer -Credential $Credential -ErrorAction SilentlyContinue + if ($reply.FullComputerName) { + $Computer = $reply.FullComputerName + try { + foreach ($result in (Invoke-Command2 -ComputerName $Computer -Credential $Credential -ScriptBlock $scriptblock -argumentlist $Memcounters, $Plancounters, $BufManpagecounters, $SSAScounters, $SSIScounters)) { + [PSCustomObject]@{ + ComputerName = $result.ComputerName + SqlInstance = $result.SqlInstance + CounterInstance = $result.CounterInstance + Counter = $result.Counter + Pages = $result.Pages + Memory = [dbasize]($result.Memory * 1024 * 1024) + } + } + } catch { + Stop-Function -Message "Failure" -ErrorRecord $_ -Target $computer -Continue + } + } else { + Write-Message -Level Warning -Message "Can't resolve $Computer." + Continue + } + } + } +} +function Get-DbaModule { + <# + .SYNOPSIS + Displays all objects in sys.sys_modules after specified modification date. Works on SQL Server 2008 and above. + + .DESCRIPTION + Quickly find modules (Stored Procs, Functions, Views, Constraints, Rules, Triggers, etc) that have been modified in a database, or across all databases. + Results will exclude the module definition, but can be queried explicitly. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Database + The database(s) to process. If unspecified, all databases will be processed. + + .PARAMETER ExcludeDatabase + The database(s) to exclude. + + .PARAMETER ModifiedSince + DateTime value to use as minimum modified date of module. + + .PARAMETER Type + Limit by specific type of module. Valid choices include: View, TableValuedFunction, DefaultConstraint, StoredProcedure, Rule, InlineTableValuedFunction, Trigger, ScalarFunction + + .PARAMETER ExcludeSystemDatabases + Allows you to suppress output on system databases + + .PARAMETER ExcludeSystemObjects + Allows you to suppress output on system objects + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: StoredProcedure, Trigger + Author: Brandon Abshire, netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaModule + + .EXAMPLE + PS C:\> Get-DbaModule -SqlInstance sql2008, sqlserver2012 + + Return all modules for servers sql2008 and sqlserver2012 sorted by Database, Modify_Date ASC. + + .EXAMPLE + PS C:\> Get-DbaModule -SqlInstance sql2008, sqlserver2012 | Select * + + Shows hidden definition column (informative wall of text). + + .EXAMPLE + PS C:\> Get-DbaModule -SqlInstance sql2008 -Database TestDB -ModifiedSince "2017-01-01 10:00:00" + + Return all modules on server sql2008 for only the TestDB database with a modified date after 1 January 2017 10:00:00 AM. + + .EXAMPLE + PS C:\> Get-DbaModule -SqlInstance sql2008 -Type View, Trigger, ScalarFunction + + Return all modules on server sql2008 for all databases that are triggers, views or scalar functions. + + #> + [CmdletBinding()] + param ( + [Parameter(Mandatory, ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [Alias("Credential")] + [PSCredential]$SqlCredential, + [Alias("Databases")] + [object[]]$Database, + [object[]]$ExcludeDatabase, + [datetime]$ModifiedSince = "1900-01-01", + [ValidateSet("View", "TableValuedFunction", "DefaultConstraint", "StoredProcedure", "Rule", "InlineTableValuedFunction", "Trigger", "ScalarFunction")] + [string[]]$Type, + [switch]$ExcludeSystemDatabases, + [switch]$ExcludeSystemObjects, + [Alias('Silent')] + [switch]$EnableException + ) + + begin { + + $types = @() + + foreach ($t in $type) { + if ($t -eq "View") { $types += "VIEW" } + if ($t -eq "TableValuedFunction") { $types += "SQL_TABLE_VALUED_FUNCTION" } + if ($t -eq "DefaultConstraint") { $types += "DEFAULT_CONSTRAINT" } + if ($t -eq "StoredProcedure") { $types += "SQL_STORED_PROCEDURE" } + if ($t -eq "Rule") { $types += "RULE" } + if ($t -eq "InlineTableValuedFunction") { $types += "SQL_INLINE_TABLE_VALUED_FUNCTION" } + if ($t -eq "Trigger") { $types += "SQL_TRIGGER" } + if ($t -eq "ScalarFunction") { $types += "SQL_SCALAR_FUNCTION" } + } + + + $sql = "SELECT DB_NAME() AS DatabaseName, + so.name AS ModuleName, + so.object_id , + SCHEMA_NAME(so.schema_id) AS SchemaName , + so.parent_object_id , + so.type , + so.type_desc , + so.create_date , + so.modify_date , + so.is_ms_shipped , + sm.definition, + OBJECTPROPERTY(so.object_id, 'ExecIsStartUp') as startup + FROM sys.sql_modules sm + LEFT JOIN sys.objects so ON sm.object_id = so.object_id + WHERE so.modify_date >= '$($ModifiedSince)'" + if ($ExcludeSystemObjects) { + $sql += "`n AND so.is_ms_shipped = 0" + } + if ($Type) { + $sqltypes = $types -join "','" + $sql += " AND type_desc in ('$sqltypes')" + } + $sql += "`n ORDER BY so.modify_date" + } + + process { + foreach ($instance in $SqlInstance) { + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $sqlcredential -MinimumVersion 10 + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + $databases = Get-DbaDatabase -SqlInstance $server + + if ($Database) { + $databases = $databases | Where-Object Name -In $Database + } + if ($ExcludeDatabase) { + $databases = $databases | Where-Object Name -NotIn $ExcludeDatabase + } + + + foreach ($db in $databases) { + + Write-Message -Level Verbose -Message "Processing $db on $instance" + + if ($db.IsAccessible -eq $false) { + Stop-Function -Message "The database $db is not accessible. Skipping database." -Target $db -Continue + } + + foreach ($row in $server.Query($sql, $db.name)) { + [PSCustomObject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + Database = $row.DatabaseName + Name = $row.ModuleName + ObjectID = $row.object_id + SchemaName = $row.SchemaName + Type = $row.type_desc + CreateDate = $row.create_date + ModifyDate = $row.modify_date + IsMsShipped = $row.is_ms_shipped + ExecIsStartUp = $row.startup + Definition = $row.definition + } | Select-DefaultView -ExcludeProperty Definition + } + } + } + } + end { + Test-DbaDeprecation -DeprecatedOn "1.0.0" -EnableException:$false -Alias Get-DbaSqlModule + } +} +#ValidationTags#Messaging# +function Get-DbaMsdtc { + <# + .SYNOPSIS + Displays information about the Distributed Transaction Coordinator (MSDTC) on a server + + .DESCRIPTION + Returns a custom object with Computer name, state of the MSDTC Service, security settings of MSDTC and CID's + + Requires: Windows administrator access on Servers + + .PARAMETER ComputerName + The target computer. + + .NOTES + Tags: Msdtc, dtc + Author: Klaas Vandenberghe (@powerdbaklaas) + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaMsdtc + + .EXAMPLE + PS C:\> Get-DbaMsdtc -ComputerName srv0042 + + Get DTC status for the server srv0042 + + .EXAMPLE + PS C:\> $Computers = (Get-Content D:\configfiles\SQL\MySQLInstances.txt | % {$_.split('\')[0]}) + PS C:\> $Computers | Get-DbaMsdtc + + Get DTC status for all the computers in a .txt file + + .EXAMPLE + PS C:\> Get-DbaMsdtc -Computername $Computers | where { $_.dtcservicestate -ne 'running' } + + Get DTC status for all the computers where the MSDTC Service is not running + + .EXAMPLE + PS C:\> Get-DbaMsdtc -ComputerName srv0042 | Out-Gridview + + Get DTC status for the computer srv0042 and show in a grid view + + #> + [CmdletBinding()] + param ( + [Parameter(ValueFromPipeline)] + [Alias('cn', 'host', 'Server')] + [string[]]$ComputerName = $env:COMPUTERNAME + ) + + begin { + $ComputerName = $ComputerName | ForEach-Object {$_.split("\")[0]} | Select-Object -Unique + $query = "Select * FROM Win32_Service WHERE Name = 'MSDTC'" + $dtcSecurity = { + Get-ItemProperty -Path HKLM:\Software\Microsoft\MSDTC\Security | + Select-Object PSPath, PSComputerName, AccountName, networkDTCAccess, + networkDTCAccessAdmin, networkDTCAccessClients, networkDTCAccessInbound, + networkDTCAccessOutBound, networkDTCAccessTip, networkDTCAccessTransactions, XATransactions + } + $dtcCids = { + New-PSDrive -Name HKCR -PSProvider Registry -Root HKEY_CLASSES_ROOT | Out-Null + Get-ItemProperty -Path HKCR:\CID\*\Description | + Select-Object @{ l = 'Data'; e = { $_.'(default)' } }, @{ l = 'CID'; e = { $_.PSParentPath.split('\')[-1] } } + Remove-PSDrive -Name HKCR | Out-Null + } + } + process { + foreach ($computer in $ComputerName) { + $reg = $cids = $null + $cidHash = @{} + if ( Test-PSRemoting -ComputerName $computer ) { + $dtcservice = $null + Write-Message -Level Verbose -Message "Getting DTC on $computer via WSMan" + $dtcservice = Get-Ciminstance -ComputerName $computer -Query $query + if ( $null -eq $dtcservice ) { + Write-Message -Level Warning -Message "Can't connect to CIM on $computer via WSMan" + } + + Write-Message -Level Verbose -Message "Getting MSDTC Security Registry Values on $computer" + $reg = Invoke-Command -ComputerName $computer -ScriptBlock $dtcSecurity + if ( $null -eq $reg ) { + Write-Message -Level Warning -Message "Can't connect to MSDTC Security registry on $computer" + } + Write-Message -Level Verbose -Message "Getting MSDTC CID Registry Values on $computer" + $cids = Invoke-Command -ComputerName $computer -ScriptBlock $dtcCids + if ( $null -ne $cids ) { + foreach ($key in $cids) { + $cidHash.Add($key.Data, $key.CID) + } + } else { + Write-Message -Level Warning -Message "Can't connect to MSDTC CID registry on $computer" + } + } else { + Write-Message -Level Verbose -Message "PSRemoting is not enabled on $computer" + try { + Write-Message -Level Verbose -Message "Failed To get DTC via WinRM. Getting DTC on $computer via DCom" + $SessionParams = @{ } + $SessionParams.ComputerName = $Computer + $SessionParams.SessionOption = (New-CimSessionOption -Protocol Dcom) + $Session = New-CimSession @SessionParams + $dtcservice = Get-Ciminstance -CimSession $Session -Query $query + } catch { + Stop-Function -Message "Can't connect to CIM on $computer via DCom" -Target $computer -ErrorRecord $_ -Continue + } + } + if ( $dtcservice ) { + [PSCustomObject]@{ + ComputerName = $dtcservice.PSComputerName + DTCServiceName = $dtcservice.DisplayName + DTCServiceState = $dtcservice.State + DTCServiceStatus = $dtcservice.Status + DTCServiceStartMode = $dtcservice.StartMode + DTCServiceAccount = $dtcservice.StartName + DTCCID_MSDTC = $cidHash['MSDTC'] + DTCCID_MSDTCUIS = $cidHash['MSDTCUIS'] + DTCCID_MSDTCTIPGW = $cidHash['MSDTCTIPGW'] + DTCCID_MSDTCXATM = $cidHash['MSDTCXATM'] + networkDTCAccess = $reg.networkDTCAccess + networkDTCAccessAdmin = $reg.networkDTCAccessAdmin + networkDTCAccessClients = $reg.networkDTCAccessClients + networkDTCAccessInbound = $reg.networkDTCAccessInbound + networkDTCAccessOutBound = $reg.networkDTCAccessOutBound + networkDTCAccessTip = $reg.networkDTCAccessTip + networkDTCAccessTransactions = $reg.networkDTCAccessTransactions + XATransactions = $reg.XATransactions + } + } + } + } +} +function Get-DbaNetworkActivity { + <# + .SYNOPSIS + Gets the Current traffic on every Network Interface on a computer. + + .DESCRIPTION + Gets the Current traffic on every Network Interface on a computer. + See https://msdn.microsoft.com/en-us/library/aa394293(v=vs.85).aspx + + Requires Local Admin rights on destination computer(s). + + .PARAMETER ComputerName + The target SQL Server instance or instances. + + .PARAMETER Credential + Credential object used to connect to the computer as a different user. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Network + Author: Klaas Vandenberghe (@PowerDBAKlaas) + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaNetworkActivity + + .EXAMPLE + PS C:\> Get-DbaNetworkActivity -ComputerName sqlserver2014a + + Gets the Current traffic on every Network Interface on computer sqlserver2014a. + + .EXAMPLE + PS C:\> 'sql1','sql2','sql3' | Get-DbaNetworkActivity + + Gets the Current traffic on every Network Interface on computers sql1, sql2 and sql3. + + .EXAMPLE + PS C:\> Get-DbaNetworkActivity -ComputerName sql1,sql2 | Out-Gridview + + Gets the Current traffic on every Network Interface on computers sql1 and sql2, and shows them in a grid view. + + #> + [CmdletBinding()] + param ( + [parameter(ValueFromPipeline)] + [Alias("cn", "host", "Server")] + [string[]]$ComputerName = $env:COMPUTERNAME, + [PSCredential] $Credential, + [Alias('Silent')] + [switch]$EnableException + ) + + begin { + $ComputerName = $ComputerName | ForEach-Object {$_.split("\")[0]} | Select-Object -Unique + $sessionoption = New-CimSessionOption -Protocol DCom + } + process { + foreach ($computer in $ComputerName) { + $Server = Resolve-DbaNetworkName -ComputerName $Computer -Credential $credential + if ( $Server.FullComputerName ) { + $Computer = $server.FullComputerName + Write-Message -Level Verbose -Message "Creating CIMSession on $computer over WSMan" + $CIMsession = New-CimSession -ComputerName $Computer -ErrorAction SilentlyContinue -Credential $Credential + if ( -not $CIMSession ) { + Write-Message -Level Verbose -Message "Creating CIMSession on $computer over WSMan failed. Creating CIMSession on $computer over DCom" + $CIMsession = New-CimSession -ComputerName $Computer -SessionOption $sessionoption -ErrorAction SilentlyContinue -Credential $Credential + } + if ( $CIMSession ) { + Write-Message -Level Verbose -Message "Getting properties for Network Interfaces on $computer" + $NICs = Get-CimInstance -CimSession $CIMSession -ClassName Win32_PerfFormattedData_Tcpip_NetworkInterface + $NICs | Add-Member -Force -MemberType ScriptProperty -Name ComputerName -Value { $computer } + $NICs | Add-Member -Force -MemberType ScriptProperty -Name Bandwith -Value { switch ( $this.CurrentBandWidth ) { 10000000000 { '10Gb' } 1000000000 { '1Gb' } 100000000 { '100Mb' } 10000000 { '10Mb' } 1000000 { '1Mb' } 100000 { '100Kb' } default { 'Low' } } } + foreach ( $NIC in $NICs ) { Select-DefaultView -InputObject $NIC -Property 'ComputerName', 'Name as NIC', 'BytesReceivedPersec', 'BytesSentPersec', 'BytesTotalPersec', 'Bandwidth'} + } #if CIMSession + else { + Write-Message -Level Warning -Message "Can't create CIMSession on $computer" + } + } #if computername + else { + Write-Message -Level Warning -Message "can't connect to $computer" + } + } #foreach computer + } #PROCESS +} #function +function Get-DbaNetworkCertificate { + <# + .SYNOPSIS + Simplifies finding computer certificates that are candidates for using with SQL Server's network encryption + + .DESCRIPTION + Gets computer certificates on localhost that are candidates for using with SQL Server's network encryption + + .PARAMETER ComputerName + The target SQL Server instance or instances. Defaults to localhost. If target is a cluster, you must specify the distinct nodes. + + .PARAMETER Credential + Allows you to login to $ComputerName using alternative credentials. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Certificate + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .EXAMPLE + PS C:\> Get-DbaNetworkCertificate + + Gets computer certificates on localhost that are candidates for using with SQL Server's network encryption + + .EXAMPLE + PS C:\> Get-DbaNetworkCertificate -ComputerName sql2016 + + Gets computer certificates on sql2016 that are being used for SQL Server network encryption + + #> + [CmdletBinding()] + param ( + [parameter(ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer", "SqlInstance")] + [DbaInstanceParameter[]]$ComputerName = $env:COMPUTERNAME, + [PSCredential]$Credential, + [switch]$EnableException + ) + + process { + # Registry access + + + foreach ($computer in $computername) { + + try { + $sqlwmis = Invoke-ManagedComputerCommand -ComputerName $computer.ComputerName -ScriptBlock { $wmi.Services } -Credential $Credential -ErrorAction Stop | Where-Object DisplayName -match "SQL Server \(" + } catch { + Stop-Function -Message $_ -Target $sqlwmi -Continue + } + + foreach ($sqlwmi in $sqlwmis) { + + $regroot = ($sqlwmi.AdvancedProperties | Where-Object Name -eq REGROOT).Value + $vsname = ($sqlwmi.AdvancedProperties | Where-Object Name -eq VSNAME).Value + $instancename = $sqlwmi.DisplayName.Replace('SQL Server (', '').Replace(')', '') # Don't clown, I don't know regex :( + $serviceaccount = $sqlwmi.ServiceAccount + + if ([System.String]::IsNullOrEmpty($regroot)) { + $regroot = $sqlwmi.AdvancedProperties | Where-Object { $_ -match 'REGROOT' } + $vsname = $sqlwmi.AdvancedProperties | Where-Object { $_ -match 'VSNAME' } + + if (![System.String]::IsNullOrEmpty($regroot)) { + $regroot = ($regroot -Split 'Value\=')[1] + $vsname = ($vsname -Split 'Value\=')[1] + } else { + Write-Message -Level Warning -Message "Can't find instance $vsname on $env:COMPUTERNAME" + return + } + } + + if ([System.String]::IsNullOrEmpty($vsname)) { $vsname = $computer } + + Write-Message -Level Verbose -Message "Regroot: $regroot" + Write-Message -Level Verbose -Message "ServiceAcct: $serviceaccount" + Write-Message -Level Verbose -Message "InstanceName: $instancename" + Write-Message -Level Verbose -Message "VSNAME: $vsname" + + $scriptblock = { + $regroot = $args[0] + $serviceaccount = $args[1] + $instancename = $args[2] + $vsname = $args[3] + + $regpath = "Registry::HKEY_LOCAL_MACHINE\$regroot\MSSQLServer\SuperSocketNetLib" + + $thumbprint = (Get-ItemProperty -Path $regpath -Name Certificate -ErrorAction SilentlyContinue).Certificate + + try { + $cert = Get-ChildItem Cert:\LocalMachine -Recurse -ErrorAction Stop | Where-Object Thumbprint -eq $Thumbprint + } catch { + # Don't care - sometimes there's errors that are thrown for apparent good reason + # here to avoid an empty catch + $null = 1 + } + + if (!$cert) { continue } + + [pscustomobject]@{ + ComputerName = $env:COMPUTERNAME + InstanceName = $instancename + SqlInstance = $vsname + ServiceAccount = $serviceaccount + FriendlyName = $cert.FriendlyName + DnsNameList = $cert.DnsNameList + Thumbprint = $cert.Thumbprint + Generated = $cert.NotBefore + Expires = $cert.NotAfter + IssuedTo = $cert.Subject + IssuedBy = $cert.Issuer + Certificate = $cert + } + } + + try { + Invoke-Command2 -ComputerName $computer.ComputerName -Credential $Credential -ArgumentList $regroot, $serviceaccount, $instancename, $vsname -ScriptBlock $scriptblock -ErrorAction Stop | + Select-DefaultView -ExcludeProperty Certificate + } catch { + Stop-Function -Message $_ -ErrorRecord $_ -Target $ComputerName -Continue + } + } + } + } +} +function Get-DbaOpenTransaction { + <# + .SYNOPSIS + Displays all open transactions. + + .DESCRIPTION + This command is based on open transaction script published by Paul Randal. + Reference: https://www.sqlskills.com/blogs/paul/script-open-transactions-with-text-and-plans/ + + .PARAMETER SqlInstance + The SQL Server instance + + .PARAMETER SqlCredential + Connect using alternative credentials + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Database, Process, Session, ActivityMonitor + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaOpenTransaction + + .EXAMPLE + PS C:\> Get-DbaOpenTransaction -SqlInstance sqlserver2014a + + Returns open transactions for sqlserver2014a + + .EXAMPLE + PS C:\> Get-DbaOpenTransaction -SqlInstance sqlserver2014a -SqlCredential sqladmin + + Logs into sqlserver2014a using the login "sqladmin" + + #> + [CmdletBinding()] + param ( + [parameter(Position = 0, Mandatory, ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer", "SqlServers")] + [DbaInstance[]]$SqlInstance, + [PSCredential]$SqlCredential, + [switch]$EnableException + ) + + begin { + $sql = " + SELECT SERVERPROPERTY('MachineName') AS ComputerName, + ISNULL(SERVERPROPERTY('InstanceName'), 'MSSQLSERVER') AS InstanceName, + SERVERPROPERTY('ServerName') AS SqlInstance, + [s_tst].[session_id] as Spid, + [s_es].[login_name] as Login, + DB_NAME (s_tdt.database_id) AS [Database], + [s_tdt].[database_transaction_begin_time] AS [BeginTime], + [s_tdt].[database_transaction_log_bytes_used] AS [LogBytesUsed], + [s_tdt].[database_transaction_log_bytes_reserved] AS [LogBytesReserved], + [s_est].text AS [LastQuery], + [s_eqp].[query_plan] AS [LastPlan] + FROM + sys.dm_tran_database_transactions [s_tdt] + JOIN + sys.dm_tran_session_transactions [s_tst] + ON + [s_tst].[transaction_id] = [s_tdt].[transaction_id] + JOIN + sys.[dm_exec_sessions] [s_es] + ON + [s_es].[session_id] = [s_tst].[session_id] + JOIN + sys.dm_exec_connections [s_ec] + ON + [s_ec].[session_id] = [s_tst].[session_id] + LEFT OUTER JOIN + sys.dm_exec_requests [s_er] + ON + [s_er].[session_id] = [s_tst].[session_id] + CROSS APPLY + sys.dm_exec_sql_text ([s_ec].[most_recent_sql_handle]) AS [s_est] + OUTER APPLY + sys.dm_exec_query_plan ([s_er].[plan_handle]) AS [s_eqp] + ORDER BY + [BeginTime] ASC" + } + process { + foreach ($instance in $SqlInstance) { + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential -MinimumVersion 9 + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + $server.Query($sql) + } + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function Get-DbaOperatingSystem { + <# + .SYNOPSIS + Gets operating system information from the server. + + .DESCRIPTION + Gets operating system information from the server and returns as an object. + + .PARAMETER ComputerName + Target computer(s). If no computer name is specified, the local computer is targeted + + .PARAMETER Credential + Alternate credential object to use for accessing the target computer(s). + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: ServerInfo, OperatingSystem + Author: Shawn Melton (@wsmelton), https://wsmelton.github.io + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaOperatingSystem + + .EXAMPLE + PS C:\> Get-DbaOperatingSystem + + Returns information about the local computer's operating system + + .EXAMPLE + PS C:\> Get-DbaOperatingSystem -ComputerName sql2016 + + Returns information about the sql2016's operating system + + .EXAMPLE + PS C:\> $wincred = Get-Credential ad\sqladmin + PS C:\> 'sql2016', 'sql2017' | Get-DbaOperatingSystem -Credential $wincred + + Returns information about the sql2016 and sql2017 operating systems using alternative Windows credentials + + .EXAMPLE + PS C:\> Get-Content .\servers.txt | Get-DbaOperatingSystem + + Returns information about all the servers operating system that are stored in the file. Every line in the file can only contain one hostname for a server. + #> + [CmdletBinding()] + param ( + [Parameter(ValueFromPipeline)] + [Alias("cn", "host", "Server")] + [DbaInstanceParameter[]]$ComputerName = $env:COMPUTERNAME, + [PSCredential]$Credential, + [Alias('Silent')] + [switch]$EnableException + ) + process { + foreach ($computer in $ComputerName) { + Write-Message -Level Verbose -Message "Connecting to $computer" + + $server = Resolve-DbaNetworkName -ComputerName $computer.ComputerName -Credential $Credential + + $computerResolved = $server.FullComputerName + Write-Message -Level Verbose -Message "Resolved $computerResolved" + + if (!$computerResolved) { + Write-Message -Level Warning -Message "Unable to resolve hostname of $computer. Skipping." + continue + } + + try { + $TestWS = Test-WSMan -ComputerName $computerResolved -ErrorAction SilentlyContinue + } catch { + Write-Message -Level Warning -Message "Remoting not availablle on $computer. Skipping checks" + $TestWS = $null + } + + $splatDbaCmObject = @{ + ComputerName = $computerResolved + EnableException = $true + } + if (Test-Bound "Credential") { + $splatDbaCmObject["Credential"] = $Credential + } + if ($TestWS) { + try { + $psVersion = Invoke-Command2 -ComputerName $computerResolved -Credential $Credential -ScriptBlock { $PSVersionTable.PSVersion } + $PowerShellVersion = "$($psVersion.Major).$($psVersion.Minor)" + } catch { + Write-Message -Level Warning -Message "PowerShell Version information not available on $computer." + $PowerShellVersion = 'Unavailable' + } + } else { + $PowerShellVersion = 'Unknown' + } + + try { + $os = Get-DbaCmObject @splatDbaCmObject -ClassName Win32_OperatingSystem + } catch { + Stop-Function -Message "Failure collecting OS information on $computer" -Target $computer -ErrorRecord $_ + return + } + + try { + $tz = Get-DbaCmObject @splatDbaCmObject -ClassName Win32_TimeZone + } catch { + Stop-Function -Message "Failure collecting TimeZone information on $computer" -Target $computer -ErrorRecord $_ + return + } + + try { + $powerPlan = Get-DbaCmObject @splatDbaCmObject -ClassName Win32_PowerPlan -Namespace "root\cimv2\power" | Select-Object ElementName, InstanceId, IsActive + } catch { + Write-Message -Level Warning -Message "Power plan information not available on $computer." + $powerPlan = $null + } + + if ($powerPlan) { + $activePowerPlan = ($powerPlan | Where-Object IsActive).ElementName -join ',' + } else { + $activePowerPlan = 'Not Avaliable' + } + + $language = Get-Language $os.OSLanguage + + try { + $ss = Get-DbaCmObject @splatDbaCmObject -Class Win32_SystemServices + if ($ss | Select-Object PartComponent | Where-Object {$_ -like "*ClusSvc*"}) { + $IsWsfc = $true + } else { + $IsWsfc = $false + } + } catch { + Write-Message -Level Warning -Message "Unable to determine Cluster State of $computer." + $IsWsfc = $null + } + + [PSCustomObject]@{ + ComputerName = $computerResolved + Manufacturer = $os.Manufacturer + Organization = $os.Organization + Architecture = $os.OSArchitecture + Version = $os.Version + Build = $os.BuildNumber + OSVersion = $os.caption; + SPVersion = $os.servicepackmajorversion; + InstallDate = [DbaDateTime]$os.InstallDate + LastBootTime = [DbaDateTime]$os.LastBootUpTime + LocalDateTime = [DbaDateTime]$os.LocalDateTime + PowerShellVersion = $PowerShellVersion + TimeZone = $tz.Caption + TimeZoneStandard = $tz.StandardName + TimeZoneDaylight = $tz.DaylightName + BootDevice = $os.BootDevice + SystemDevice = $os.SystemDevice + SystemDrive = $os.SystemDrive + WindowsDirectory = $os.WindowsDirectory + PagingFileSize = $os.SizeStoredInPagingFiles + TotalVisibleMemory = [DbaSize]($os.TotalVisibleMemorySize * 1024) + FreePhysicalMemory = [DbaSize]($os.FreePhysicalMemory * 1024) + TotalVirtualMemory = [DbaSize]($os.TotalVirtualMemorySize * 1024) + FreeVirtualMemory = [DbaSize]($os.FreeVirtualMemory * 1024) + ActivePowerPlan = $activePowerPlan + Status = $os.Status + Language = $language.Name + LanguageId = $language.LCID + LanguageKeyboardLayoutId = $language.KeyboardLayoutId + LanguageTwoLetter = $language.TwoLetterISOLanguageName + LanguageThreeLetter = $language.ThreeLetterISOLanguageName + LanguageAlias = $language.DisplayName + LanguageNative = $language.NativeName + CodeSet = $os.CodeSet + CountryCode = $os.CountryCode + Locale = $os.Locale + IsWsfc = $IsWsfc + } | Select-DefaultView -Property ComputerName, Manufacturer, Organization, Architecture, Version, Caption, LastBootTime, LocalDateTime, PowerShellVersion, TimeZone, TotalVisibleMemory, ActivePowerPlan, LanguageNative + } + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# + +function Get-DbaPageFileSetting { + <# + .SYNOPSIS + Returns information on the page file configuration of the target computer. + + .DESCRIPTION + This command uses CIM (or other, related computer management tools) to detect the page file configuration of the target computer(s). + + Note that this may require local administrator privileges for the relevant computers. + + .PARAMETER ComputerName + The target SQL Server instance or instances. + This can be the name of a computer, a SMO object, an IP address, an AD Computer object, a connection string or a SQL Instance. + + .PARAMETER Credential + Credential object used to connect to the Computer as a different user + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: CIM + Author: Klaas Vandenberghe (@PowerDBAKlaas) + + dbatools PowerShell module (https://dbatools.io) + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaPageFileSetting + + .EXAMPLE + PS C:\> Get-DbaPageFileSetting -ComputerName ServerA,ServerB + + Returns a custom object displaying ComputerName, AutoPageFile, FileName, Status, LastModified, LastAccessed, AllocatedBaseSize, InitialSize, MaximumSize, PeakUsage, CurrentUsage for ServerA and ServerB + + .EXAMPLE + PS C:\> 'ServerA' | Get-DbaPageFileSetting + + Returns a custom object displaying ComputerName, AutoPageFile, FileName, Status, LastModified, LastAccessed, AllocatedBaseSize, InitialSize, MaximumSize, PeakUsage, CurrentUsage for ServerA + + #> + [CmdletBinding()] + param ( + [Parameter(Position = 0, ValueFromPipeline, ValueFromPipelineByPropertyName = $true)] + [Alias("cn", "host", "ServerInstance", "Server", "SqlServer")] + [DbaInstance[]]$ComputerName = $env:COMPUTERNAME, + [PSCredential]$Credential, + [Alias('Silent')] + [switch]$EnableException + ) + process { + foreach ($computer in $ComputerName) { + $splatDbaCmObject = @{ + ComputerName = $computer + EnableException = $true + } + if ($Credential) { $splatDbaCmObject["Credential"] = $Credential } + + try { + $compSys = Get-DbaCmObject @splatDbaCmObject -Query "SELECT * FROM win32_computersystem" + if (-not $CompSys.automaticmanagedpagefile) { + $pagefiles = Get-DbaCmObject @splatDbaCmObject -Query "SELECT * FROM win32_pagefile" + $pagefileUsages = Get-DbaCmObject @splatDbaCmObject -Query "SELECT * FROM win32_pagefileUsage" + $pagefileSettings = Get-DbaCmObject @splatDbaCmObject -Query "SELECT * FROM win32_pagefileSetting" + } + } catch { + Stop-Function -Message "Failed to retrieve information from $($computer.ComputerName)" -ErrorRecord $_ -Target $computer -Continue + } + + if (-not $CompSys.automaticmanagedpagefile) { + foreach ($file in $pagefiles) { + $settings = $pagefileSettings | Where-Object Name -EQ $file.Name + $usage = $pagefileUsages | Where-Object Name -EQ $file.Name + + # pagefile is not automatic managed, so return settings + New-Object Sqlcollaborative.Dbatools.Computer.PageFileSetting -Property @{ + ComputerName = $computer.ComputerName + AutoPageFile = $CompSys.automaticmanagedpagefile + FileName = $file.name + Status = $file.status + SystemManaged = ($settings.InitialSize -eq 0) -and ($settings.MaximumSize -eq 0) + LastModified = $file.LastModified + LastAccessed = $file.LastAccessed + AllocatedBaseSize = $usage.AllocatedBaseSize # in MB, between Initial and Maximum Size + InitialSize = $settings.InitialSize # in MB + MaximumSize = $settings.MaximumSize # in MB + PeakUsage = $usage.peakusage # in MB + CurrentUsage = $usage.currentusage # in MB + } + } + } else { + # pagefile is automatic managed, so there are no settings + New-Object Sqlcollaborative.Dbatools.Computer.PageFileSetting -Property @{ + ComputerName = $computer + AutoPageFile = $CompSys.automaticmanagedpagefile + FileName = $null + Status = $null + SystemManaged = $null + LastModified = $null + LastAccessed = $null + AllocatedBaseSize = $null + InitialSize = $null + MaximumSize = $null + PeakUsage = $null + CurrentUsage = $null + } + } + } + } +} +function Get-DbaPbmCategory { + <# + .SYNOPSIS + Returns policy categories from policy based management from an instance. + + .DESCRIPTION + Returns policy categories from policy based management from an instance. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. This can be a collection and receive pipeline input to allow the function to be executed against multiple SQL Server instances. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Category + Filters results to only show specific condition + + .PARAMETER ExcludeSystemObject + By default system objects are include. Use this parameter to exclude them. + + .PARAMETER InputObject + Allows piping from Get-DbaPbmStore + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Policy, PolicyBasedManagement, PBM + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaPbmCategory + + .EXAMPLE + PS C:\> Get-DbaPbmCategory -SqlInstance sql2016 + + Returns all policy categories from the sql2016 PBM server + + .EXAMPLE + PS C:\> Get-DbaPbmCategory -SqlInstance sql2016 -SqlCredential $cred + + Uses a credential $cred to connect and return all policy categories from the sql2016 PBM server + + #> + [CmdletBinding()] + param ( + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [Alias("Credential")] + [PSCredential]$SqlCredential, + [string[]]$Category, + [Parameter(ValueFromPipeline)] + [Microsoft.SqlServer.Management.Dmf.PolicyStore[]]$InputObject, + [switch]$ExcludeSystemObject, + [switch]$EnableException + ) + process { + foreach ($instance in $SqlInstance) { + $InputObject += Get-DbaPbmStore -SqlInstance $instance -SqlCredential $SqlCredential + } + foreach ($store in $InputObject) { + $all = $store.PolicyCategories + + if (-not $ExcludeSystemObject) { + $all = $all | Where-Object IsSystemObject -ne $true + } + + if ($Category) { + $all = $all | Where-Object Name -in $Category + } + + foreach ($current in $all) { + Write-Message -Level Verbose -Message "Processing $current" + Add-Member -Force -InputObject $current -MemberType NoteProperty ComputerName -value $store.ComputerName + Add-Member -Force -InputObject $current -MemberType NoteProperty InstanceName -value $store.InstanceName + Add-Member -Force -InputObject $current -MemberType NoteProperty SqlInstance -value $store.SqlInstance + Select-DefaultView -InputObject $current -Property ComputerName, InstanceName, SqlInstance, Id, Name, MandateDatabaseSubscriptions + } + } + } +} +function Get-DbaPbmCategorySubscription { + <# + .SYNOPSIS + Returns policy category subscriptions from policy based management from an instance. + + .DESCRIPTION + Returns policy category subscriptions from policy based management from an instance. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. This can be a collection and receive pipeline input to allow the function to be executed against multiple SQL Server instances. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER InputObject + Allows piping from Get-DbaPbmStore + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Policy, PolicyBasedManagement, PBM + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaPbmCategorySubscription + + .EXAMPLE + PS C:\> Get-DbaPbmCategorySubscription -SqlInstance sql2016 + + Returns all policy category subscriptions from the sql2016 PBM server + + .EXAMPLE + PS C:\> Get-DbaPbmCategorySubscription -SqlInstance sql2016 -SqlCredential $cred + + Uses a credential $cred to connect and return all policy category subscriptions from the sql2016 PBM server + + #> + [CmdletBinding()] + param ( + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [Alias("Credential")] + [PSCredential]$SqlCredential, + [Parameter(ValueFromPipeline)] + [Microsoft.SqlServer.Management.Dmf.PolicyStore[]]$InputObject, + [switch]$EnableException + ) + process { + foreach ($instance in $SqlInstance) { + $InputObject += Get-DbaPbmStore -SqlInstance $instance -SqlCredential $SqlCredential + } + foreach ($store in $InputObject) { + $all = $store.PolicycategorySubscriptions + + foreach ($current in $all) { + Write-Message -Level Verbose -Message "Processing $current" + Add-Member -Force -InputObject $current -MemberType NoteProperty ComputerName -value $store.ComputerName + Add-Member -Force -InputObject $current -MemberType NoteProperty InstanceName -value $store.InstanceName + Add-Member -Force -InputObject $current -MemberType NoteProperty SqlInstance -value $store.SqlInstance + Select-DefaultView -InputObject $current -ExcludeProperty Properties, Urn, Parent + } + } + } +} +function Get-DbaPbmCondition { + <# + .SYNOPSIS + Returns conditions from policy based management from an instance. + + .DESCRIPTION + Returns conditions from policy based management from an instance. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. This can be a collection and receive pipeline input to allow the function to be executed against multiple SQL Server instances. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Condition + Filters results to only show specific condition + + .PARAMETER IncludeSystemObject + By default system objects are filtered out. Use this parameter to include them. + + .PARAMETER InputObject + Allows piping from Get-DbaPbmStore + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Policy, PolicyBasedManagement, PBM + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaPbmCondition + + .EXAMPLE + PS C:\> Get-DbaPbmCondition -SqlInstance sql2016 + + Returns all conditions from the sql2016 PBM server + + .EXAMPLE + PS C:\> Get-DbaPbmCondition -SqlInstance sql2016 -SqlCredential $cred + + Uses a credential $cred to connect and return all conditions from the sql2016 PBM server + + #> + [CmdletBinding()] + param ( + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [Alias("Credential")] + [PSCredential]$SqlCredential, + [string[]]$Condition, + [Parameter(ValueFromPipeline)] + [Microsoft.SqlServer.Management.Dmf.PolicyStore[]]$InputObject, + [switch]$IncludeSystemObject, + [switch]$EnableException + ) + process { + foreach ($instance in $SqlInstance) { + $InputObject += Get-DbaPbmStore -SqlInstance $instance -SqlCredential $SqlCredential + } + foreach ($store in $InputObject) { + $allconditions = $store.Conditions + + if (-not $IncludeSystemObject) { + $allconditions = $allconditions | Where-Object IsSystemObject -eq $false + } + + if ($Condition) { + $allconditions = $allconditions | Where-Object Name -in $Condition + } + + foreach ($currentcondition in $allconditions) { + Write-Message -Level Verbose -Message "Processing $currentcondition" + Add-Member -Force -InputObject $currentcondition -MemberType NoteProperty ComputerName -value $store.ComputerName + Add-Member -Force -InputObject $currentcondition -MemberType NoteProperty InstanceName -value $store.InstanceName + Add-Member -Force -InputObject $currentcondition -MemberType NoteProperty SqlInstance -value $store.SqlInstance + Select-DefaultView -InputObject $currentcondition -Property ComputerName, InstanceName, SqlInstance, Id, Name, CreateDate, CreatedBy, DateModified, Description, ExpressionNode, Facet, HasScript, IsSystemObject, ModifiedBy + } + } + } +} +function Get-DbaPbmObjectSet { + <# + .SYNOPSIS + Returns object sets from policy based management. + + .DESCRIPTION + Returns object sets from policy based management. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. This can be a collection and receive pipeline input to allow the function to be executed against multiple SQL Server instances. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER ObjectSet + Filters results to only show specific object set + + .PARAMETER IncludeSystemObject + By default system objects are filtered out. Use this parameter to include them. + + .PARAMETER InputObject + Allows piping from Get-DbaPbmStore + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Policy, PolicyBasedManagement, PBM + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaPbmObjectSet + + .EXAMPLE + PS C:\> Get-DbaPbmObjectSet -SqlInstance sql2016 + + Returns all object sets from the sql2016 PBM instance + + .EXAMPLE + PS C:\> Get-DbaPbmObjectSet -SqlInstance sql2016 -SqlCredential $cred + + Uses a credential $cred to connect and return all object sets from the sql2016 PBM instance + + #> + [CmdletBinding()] + param ( + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [Alias("Credential")] + [PSCredential]$SqlCredential, + [string[]]$ObjectSet, + [Parameter(ValueFromPipeline)] + [Microsoft.SqlServer.Management.Dmf.PolicyStore[]]$InputObject, + [switch]$IncludeSystemObject, + [switch]$EnableException + ) + process { + foreach ($instance in $SqlInstance) { + $InputObject += Get-DbaPbmStore -SqlInstance $instance -SqlCredential $SqlCredential + } + foreach ($store in $InputObject) { + $all = $store.ObjectSets + + if (-not $IncludeSystemObject) { + $all = $all | Where-Object IsSystemObject -eq $false + } + + if ($ObjectSet) { + $all = $all | Where-Object Name -in $ObjectSet + } + + foreach ($currentset in $all) { + Write-Message -Level Verbose -Message "Processing $currentset" + Add-Member -Force -InputObject $currentset -MemberType NoteProperty ComputerName -value $store.ComputerName + Add-Member -Force -InputObject $currentset -MemberType NoteProperty InstanceName -value $store.InstanceName + Add-Member -Force -InputObject $currentset -MemberType NoteProperty SqlInstance -value $store.SqlInstance + Select-DefaultView -InputObject $currentset -Property ComputerName, InstanceName, SqlInstance, Id, Name, Facet, TargetSets, IsSystemObject + } + } + } +} +function Get-DbaPbmPolicy { + <# + .SYNOPSIS + Returns policies from Policy-Based Management from an instance. + + .DESCRIPTION + Returns details of policies with the option to filter on Category and SystemObjects. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. This can be a collection and receive pipeline input to allow the function to be executed against multiple SQL Server instances. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Policy + Filters results to only show specific policy + + .PARAMETER Category + Filters results to only show policies in the category selected + + .PARAMETER IncludeSystemObject + By default system objects are filtered out. Use this parameter to INCLUDE them . + + .PARAMETER InputObject + Allows piping from Get-DbaPbmStore + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Policy, PolicyBasedManagement, PBM + Author: Stephen Bennett, https://sqlnotesfromtheunderground.wordpress.com/ + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaPbmPolicy + + .EXAMPLE + PS C:\> Get-DbaPbmPolicy -SqlInstance sql2016 + + Returns all policies from sql2016 server + + .EXAMPLE + PS C:\> Get-DbaPbmPolicy -SqlInstance sql2016 -SqlCredential $cred + + Uses a credential $cred to connect and return all policies from sql2016 instance + + .EXAMPLE + PS C:\> Get-DbaPbmPolicy -SqlInstance sql2016 -Category MorningCheck + + Returns all policies from sql2016 server that part of the PolicyCategory MorningCheck + + #> + [CmdletBinding()] + param ( + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [Alias("Credential")] + [PSCredential]$SqlCredential, + [string[]]$Policy, + [string[]]$Category, + [parameter(ValueFromPipeline)] + [Microsoft.SqlServer.Management.Dmf.PolicyStore[]]$InputObject, + [switch]$IncludeSystemObject, + [switch]$EnableException + ) + process { + foreach ($instance in $SqlInstance) { + $InputObject += Get-DbaPbmStore -SqlInstance $instance -SqlCredential $SqlCredential + } + foreach ($store in $InputObject) { + $allpolicies = $store.Policies + + if (-not $IncludeSystemObject) { + $allpolicies = $allpolicies | Where-Object IsSystemObject -eq $false + } + + if ($Category) { + $allpolicies = $allpolicies | Where-Object PolicyCategory -in $Category + } + + if ($Policy) { + $allpolicies = $allpolicies | Where-Object Name -in $Policy + } + + foreach ($currentpolicy in $allpolicies) { + Write-Message -Level Verbose -Message "Processing $currentpolicy" + Add-Member -Force -InputObject $currentpolicy -MemberType NoteProperty ComputerName -value $store.ComputerName + Add-Member -Force -InputObject $currentpolicy -MemberType NoteProperty InstanceName -value $store.InstanceName + Add-Member -Force -InputObject $currentpolicy -MemberType NoteProperty SqlInstance -value $store.SqlInstance + + Select-DefaultView -InputObject $currentpolicy -ExcludeProperty HelpText, HelpLink, Urn, Properties, Metadata, Parent, IdentityKey, HasScript, PolicyEvaluationStarted, ConnectionProcessingStarted, TargetProcessed, ConnectionProcessingFinished, PolicyEvaluationFinished, PropertyMetadataChanged, PropertyChanged + } + } + } + end { + Test-DbaDeprecation -DeprecatedOn "1.0.0" -EnableException:$false -Alias Get-DbaPolicy + } +} +function Get-DbaPbmStore { + <# + .SYNOPSIS + Returns the policy based management store. + + .DESCRIPTION + Returns the policy based management store. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. This can be a collection and receive pipeline input to allow the function to be executed against multiple SQL Server instances. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Policy + Filters results to only show specific policy + + .PARAMETER Category + Filters results to only show policies in the category selected + + .PARAMETER IncludeSystemObject + By default system objects are filtered out. Use this parameter to include them. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Policy, PolicyBasedManagement, PBM + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaPbmStore + + .EXAMPLE + PS C:\> Get-DbaPbmStore -SqlInstance sql2016 + + Return the policy store from the sql2016 instance + + .EXAMPLE + PS C:\> Get-DbaPbmStore -SqlInstance sql2016 -SqlCredential $cred + + Uses a credential $cred to connect and return the policy store from the sql2016 instance + + #> + [CmdletBinding()] + param ( + [parameter(Mandatory, ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [Alias("Credential")] + [PSCredential]$SqlCredential, + [switch]$EnableException + ) + + process { + foreach ($instance in $SqlInstance) { + + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential -MinimumVersion 10 + $sqlStoreConnection = New-Object Microsoft.SqlServer.Management.Sdk.Sfc.SqlStoreConnection $server.ConnectionContext.SqlConnectionObject + # DMF is the Declarative Management Framework, Policy Based Management's old name + $store = New-Object Microsoft.SqlServer.Management.DMF.PolicyStore $sqlStoreConnection + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + Add-Member -Force -InputObject $store -MemberType NoteProperty ComputerName -value $server.ComputerName + Add-Member -Force -InputObject $store -MemberType NoteProperty InstanceName -value $server.ServiceName + Add-Member -Force -InputObject $store -MemberType NoteProperty SqlInstance -value $server.DomainInstanceName + + Select-DefaultView -InputObject $store -ExcludeProperty SqlStoreConnection, ConnectionContext, Properties, Urn, Parent, DomainInstanceName, Metadata, IdentityKey, Name + } + } +} +function Get-DbaPermission { + <# + .SYNOPSIS + Get a list of Server and Database level permissions + + .DESCRIPTION + Retrieves a list of permissions + + Permissions link principals to securables. + Principals exist on Windows, Instance and Database level. + Securables exist on Instance and Database level. + A permission state can be GRANT, DENY or REVOKE. + The permission type can be SELECT, CONNECT, EXECUTE and more. + + See https://msdn.microsoft.com/en-us/library/ms191291.aspx for more information + + .PARAMETER SqlInstance + The target SQL Server instance or instances. Defaults to localhost. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Database + Specifies one or more database(s) to process. If unspecified, all databases will be processed. + + .PARAMETER ExcludeDatabase + Specifies one or more database(s) to exclude from processing. + + .PARAMETER IncludeServerLevel + If this switch is enabled, information about Server Level Permissions will be output. + + .PARAMETER ExcludeSystemObjects + If this switch is enabled, permissions on system securables will be excluded. + + .PARAMETER EnableException + If this switch is enabled exceptions will be thrown to the caller, which will need to perform its own exception processing. Otherwise, the function will try to catch the exception, interpret it and provide a friendly error message. + + .NOTES + Tags: Permissions, Databases + Author: Klaas Vandenberghe (@PowerDBAKlaas) + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaPermission + + .EXAMPLE + PS C:\> Get-DbaPermission -SqlInstance ServerA\sql987 + + Returns a custom object with Server name, Database name, permission state, permission type, grantee and securable. + + .EXAMPLE + PS C:\> Get-DbaPermission -SqlInstance ServerA\sql987 | Format-Table -AutoSize + + Returns a formatted table displaying Server, Database, permission state, permission type, grantee, granteetype, securable and securabletype. + + .EXAMPLE + PS C:\> Get-DbaPermission -SqlInstance ServerA\sql987 -ExcludeSystemObjects -IncludeServerLevel + + Returns a custom object with Server name, Database name, permission state, permission type, grantee and securable + in all databases and on the server level, but not on system securables. + + .EXAMPLE + PS C:\> Get-DbaPermission -SqlInstance sql2016 -Database master + + Returns a custom object with permissions for the master database. + + #> + [CmdletBinding()] + param ( + [parameter(Mandatory, ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer")] + [DbaInstance[]]$SqlInstance, + [Alias("Credential")] + [PSCredential]$SqlCredential, + [Alias("Databases")] + [object[]]$Database, + [object[]]$ExcludeDatabase, + [switch]$IncludeServerLevel, + [switch]$ExcludeSystemObjects, + [Alias('Silent')] + [switch]$EnableException + ) + begin { + if ($ExcludeSystemObjects) { + $ExcludeSystemObjectssql = "WHERE major_id > 0 " + } + + $ServPermsql = "SELECT SERVERPROPERTY('MachineName') AS ComputerName, + ISNULL(SERVERPROPERTY('InstanceName'), 'MSSQLSERVER') AS InstanceName, + SERVERPROPERTY('ServerName') AS SqlInstance + , [Database] = '' + , [PermState] = state_desc + , [PermissionName] = permission_name + , [SecurableType] = COALESCE(o.type_desc,sp.class_desc) + , [Securable] = CASE WHEN class = 100 THEN @@SERVERNAME + WHEN class = 105 THEN OBJECT_NAME(major_id) + ELSE OBJECT_NAME(major_id) + END + , [Grantee] = SUSER_NAME(grantee_principal_id) + , [GranteeType] = pr.type_desc + , [revokeStatement] = 'REVOKE ' + permission_name + ' ' + COALESCE(OBJECT_NAME(major_id),'') + ' FROM [' + SUSER_NAME(grantee_principal_id) + ']' + , [grantStatement] = 'GRANT ' + permission_name + ' ' + COALESCE(OBJECT_NAME(major_id),'') + ' TO [' + SUSER_NAME(grantee_principal_id) + ']' + FROM sys.server_permissions sp + JOIN sys.server_principals pr ON pr.principal_id = sp.grantee_principal_id + LEFT OUTER JOIN sys.all_objects o ON o.object_id = sp.major_id + + $ExcludeSystemObjectssql + + UNION ALL + SELECT SERVERPROPERTY('MachineName') AS ComputerName + , ISNULL(SERVERPROPERTY('InstanceName'), 'MSSQLSERVER') AS InstanceName + , SERVERPROPERTY('ServerName') AS SqlInstance + , [database] = '' + , [PermState] = 'GRANT' + , [PermissionName] = pb.[permission_name] + , [SecurableType] = pb.class_desc + , [Securable] = @@SERVERNAME + , [Grantee] = spr.name + , [GranteeType] = spr.type_desc + , [revokestatement] = '' + , [grantstatement] = '' + FROM sys.server_principals AS spr + INNER JOIN sys.fn_builtin_permissions('SERVER') AS pb ON + spr.[name]='bulkadmin' AND pb.[permission_name]='ADMINISTER BULK OPERATIONS' + OR + spr.[name]='dbcreator' AND pb.[permission_name]='CREATE ANY DATABASE' + OR + spr.[name]='diskadmin' AND pb.[permission_name]='ALTER RESOURCES' + OR + spr.[name]='processadmin' AND pb.[permission_name] IN ('ALTER ANY CONNECTION', 'ALTER SERVER STATE') + OR + spr.[name]='sysadmin' AND pb.[permission_name]='CONTROL SERVER' + OR + spr.[name]='securityadmin' AND pb.[permission_name]='ALTER ANY LOGIN' + OR + spr.[name]='serveradmin' AND pb.[permission_name] IN ('ALTER ANY ENDPOINT', 'ALTER RESOURCES','ALTER SERVER STATE', 'ALTER SETTINGS','SHUTDOWN', 'VIEW SERVER STATE') + OR + spr.[name]='setupadmin' AND pb.[permission_name]='ALTER ANY LINKED SERVER' + WHERE spr.[type]='R' + ;" + + $DBPermsql = "SELECT SERVERPROPERTY('MachineName') AS ComputerName, + ISNULL(SERVERPROPERTY('InstanceName'), 'MSSQLSERVER') AS InstanceName, + SERVERPROPERTY('ServerName') AS SqlInstance + , [Database] = DB_NAME() + , [PermState] = state_desc + , [PermissionName] = permission_name + , [SecurableType] = COALESCE(o.type_desc,dp.class_desc) + , [Securable] = CASE WHEN class = 0 THEN DB_NAME() + WHEN class = 1 THEN ISNULL(s.name + '.','')+OBJECT_NAME(major_id) + WHEN class = 3 THEN SCHEMA_NAME(major_id) + WHEN class = 6 THEN SCHEMA_NAME(t.schema_id)+'.' + t.name + END + , [Grantee] = USER_NAME(grantee_principal_id) + , [GranteeType] = pr.type_desc + , [revokeStatement] = 'REVOKE ' + permission_name + ' ON ' + isnull(schema_name(o.object_id)+'.','')+OBJECT_NAME(major_id)+ ' FROM [' + USER_NAME(grantee_principal_id) + ']' + , [grantStatement] = 'GRANT ' + permission_name + ' ON ' + isnull(schema_name(o.object_id)+'.','')+OBJECT_NAME(major_id)+ ' TO [' + USER_NAME(grantee_principal_id) + ']' + FROM sys.database_permissions dp + JOIN sys.database_principals pr ON pr.principal_id = dp.grantee_principal_id + LEFT OUTER JOIN sys.all_objects o ON o.object_id = dp.major_id + LEFT OUTER JOIN sys.schemas s ON s.schema_id = o.schema_id + LEFT OUTER JOIN sys.types t on t.user_type_id = dp.major_id + + $ExcludeSystemObjectssql + + UNION ALL + SELECT SERVERPROPERTY('MachineName') AS ComputerName + , ISNULL(SERVERPROPERTY('InstanceName'), 'MSSQLSERVER') AS InstanceName + , SERVERPROPERTY('ServerName') AS SqlInstance + , [database] = DB_NAME() + , [PermState] = '' + , [PermissionName] = p.[permission_name] + , [SecurableType] = p.class_desc + , [Securable] = DB_NAME() + , [Grantee] = dp.name + , [GranteeType] = dp.type_desc + , [revokestatement] = '' + , [grantstatement] = '' + FROM sys.database_principals AS dp + INNER JOIN sys.fn_builtin_permissions('DATABASE') AS p ON + dp.[name]='db_accessadmin' AND p.[permission_name] IN ('ALTER ANY USER', 'CREATE SCHEMA') + OR + dp.[name]='db_backupoperator' AND p.[permission_name] IN ('BACKUP DATABASE', 'BACKUP LOG', 'CHECKPOINT') + OR + dp.[name] IN ('db_datareader', 'db_denydatareader') AND p.[permission_name]='SELECT' + OR + dp.[name] IN ('db_datawriter', 'db_denydatawriter') AND p.[permission_name] IN ('INSERT', 'DELETE', 'UPDATE') + OR + dp.[name]='db_ddladmin' AND + p.[permission_name] IN ('ALTER ANY ASSEMBLY', 'ALTER ANY ASYMMETRIC KEY', + 'ALTER ANY CERTIFICATE', 'ALTER ANY CONTRACT', + 'ALTER ANY DATABASE DDL TRIGGER', 'ALTER ANY DATABASE EVENT', + 'NOTIFICATION', 'ALTER ANY DATASPACE', 'ALTER ANY FULLTEXT CATALOG', + 'ALTER ANY MESSAGE TYPE', 'ALTER ANY REMOTE SERVICE BINDING', + 'ALTER ANY ROUTE', 'ALTER ANY SCHEMA', 'ALTER ANY SERVICE', + 'ALTER ANY SYMMETRIC KEY', 'CHECKPOINT', 'CREATE AGGREGATE', + 'CREATE DEFAULT', 'CREATE FUNCTION', 'CREATE PROCEDURE', + 'CREATE QUEUE', 'CREATE RULE', 'CREATE SYNONYM', 'CREATE TABLE', + 'CREATE TYPE', 'CREATE VIEW', 'CREATE XML SCHEMA COLLECTION', + 'REFERENCES') + OR + dp.[name]='db_owner' AND p.[permission_name]='CONTROL' + OR + dp.[name]='db_securityadmin' AND p.[permission_name] IN ('ALTER ANY APPLICATION ROLE', 'ALTER ANY ROLE', 'CREATE SCHEMA', 'VIEW DEFINITION') + + WHERE dp.[type]='R' + AND dp.is_fixed_role=1 + ;" + } + + process { + foreach ($instance in $SqlInstance) { + + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $sqlcredential -MinimumVersion 9 + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + if ($IncludeServerLevel) { + Write-Message -Level Debug -Message "T-SQL: $ServPermsql" + $server.Query($ServPermsql) + } + + $dbs = $server.Databases + + if ($Database) { + $dbs = $dbs | Where-Object Name -In $Database + } + + if ($ExcludeDatabase) { + $dbs = $dbs | Where-Object Name -NotIn $ExcludeDatabase + } + + foreach ($db in $dbs) { + Write-Message -Level Verbose -Message "Processing $db on $instance." + + if ($db.IsAccessible -eq $false) { + Write-Message -Level Warning -Message "The database $db is not accessible. Skipping database." + Continue + } + + Write-Message -Level Debug -Message "T-SQL: $DBPermsql" + $db.ExecuteWithResults($DBPermsql).Tables.Rows + } + } + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function Get-DbaPfAvailableCounter { + <# + .SYNOPSIS + Gathers list of all available counters on local or remote machines. + + .DESCRIPTION + Gathers list of all available counters on local or remote machines. Note, if you pass a credential object, it will be included in the output for easy reuse in your next piped command. + + Thanks to Daniel Streefkerk for this super fast way of counters + https://daniel.streefkerkonline.com/2016/02/18/use-powershell-to-list-all-windows-performance-counters-and-their-numeric-ids + + .PARAMETER ComputerName + The target computer. Defaults to localhost. + + .PARAMETER Credential + Allows you to login to servers using alternative credentials. To use: + + $scred = Get-Credential, then pass $scred object to the -Credential parameter. + + .PARAMETER Pattern + Specify a pattern for filtering. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Performance, DataCollector, PerfCounter + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaPfAvailableCounter + + .EXAMPLE + PS C:\> Get-DbaPfAvailableCounter + + Gets all available counters on the local machine. + + .EXAMPLE + PS C:\> Get-DbaPfAvailableCounter -Pattern *sql* + + Gets all counters matching sql on the local machine. + + .EXAMPLE + PS C:\> Get-DbaPfAvailableCounter -ComputerName sql2017 -Pattern *sql* + + Gets all counters matching sql on the remote server sql2017. + + .EXAMPLE + PS C:\> Get-DbaPfAvailableCounter -Pattern *sql* + + Gets all counters matching sql on the local machine. + + .EXAMPLE + PS C:\> Get-DbaPfAvailableCounter -Pattern *sql* | Add-DbaPfDataCollectorCounter -CollectorSet 'Test Collector Set' -Collector DataCollector01 + + Adds all counters matching "sql" to the DataCollector01 within the 'Test Collector Set' CollectorSet. + + #> + [CmdletBinding()] + param ( + [DbaInstance[]]$ComputerName = $env:ComputerName, + [PSCredential]$Credential, + [string]$Pattern, + [switch]$EnableException + ) + begin { + $scriptblock = { + $counters = Get-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Perflib\009' -Name 'counter' | Select-Object -ExpandProperty Counter | + Where-Object { $_ -notmatch '[0-90000]' } | Sort-Object | Get-Unique + + foreach ($counter in $counters) { + [pscustomobject]@{ + ComputerName = $env:COMPUTERNAME + Name = $counter + Credential = $args + } + } + } + + # In case people really want a "like" search, which is slower + $Pattern = $Pattern.Replace("*", ".*").Replace("..*", ".*") + } + process { + + + foreach ($computer in $ComputerName) { + + try { + if ($pattern) { + Invoke-Command2 -ComputerName $computer -Credential $Credential -ScriptBlock $scriptblock -ArgumentList $credential -ErrorAction Stop | + Where-Object Name -match $pattern | Select-DefaultView -ExcludeProperty Credential + } else { + Invoke-Command2 -ComputerName $computer -Credential $Credential -ScriptBlock $scriptblock -ArgumentList $credential -ErrorAction Stop | + Select-DefaultView -ExcludeProperty Credential + } + } catch { + Stop-Function -Message "Failure" -ErrorRecord $_ -Target $computer -Continue + } + } + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function Get-DbaPfDataCollector { + <# + .SYNOPSIS + Gets Performance Monitor Data Collectors. + + .DESCRIPTION + Gets Performance Monitor Data Collectors. + + .PARAMETER ComputerName + The target computer. Defaults to localhost. + + .PARAMETER Credential + Allows you to login to servers using alternative credentials. To use: + + $scred = Get-Credential, then pass $scred object to the -Credential parameter. + + .PARAMETER CollectorSet + The Collector Set name. + + .PARAMETER Collector + The Collector name. + + .PARAMETER InputObject + Accepts the object output by Get-DbaPfDataCollectorSet via the pipeline. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Performance, DataCollector, PerfCounter + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaPfDataCollector + + .EXAMPLE + PS C:\> Get-DbaPfDataCollector + + Gets all Collectors on localhost. + + .EXAMPLE + PS C:\> Get-DbaPfDataCollector -ComputerName sql2017 + + Gets all Collectors on sql2017. + + .EXAMPLE + PS C:\> Get-DbaPfDataCollector -ComputerName sql2017, sql2016 -Credential ad\sqldba -CollectorSet 'System Correlation' + + Gets all Collectors for the 'System Correlation' CollectorSet on sql2017 and sql2016 using alternative credentials. + + .EXAMPLE + PS C:\> Get-DbaPfDataCollectorSet -CollectorSet 'System Correlation' | Get-DbaPfDataCollector + + Gets all Collectors for the 'System Correlation' CollectorSet. + + #> + [CmdletBinding()] + param ( + [DbaInstance[]]$ComputerName = $env:COMPUTERNAME, + [PSCredential]$Credential, + [Alias("DataCollectorSet")] + [string[]]$CollectorSet, + [Alias("DataCollector")] + [string[]]$Collector, + [parameter(ValueFromPipeline)] + [object[]]$InputObject, + [switch]$EnableException + ) + begin { + $columns = 'ComputerName', 'DataCollectorSet', 'Name', 'DataCollectorType', 'DataSourceName', 'FileName', 'FileNameFormat', 'FileNameFormatPattern', 'LatestOutputLocation', 'LogAppend', 'LogCircular', 'LogFileFormat', 'LogOverwrite', 'SampleInterval', 'SegmentMaxRecords', 'Counters' + } + process { + + + if ($InputObject.Credential -and (Test-Bound -ParameterName Credential -Not)) { + $Credential = $InputObject.Credential + } + + if (-not $InputObject -or ($InputObject -and (Test-Bound -ParameterName ComputerName))) { + foreach ($computer in $ComputerName) { + $InputObject += Get-DbaPfDataCollectorSet -ComputerName $computer -Credential $Credential -CollectorSet $CollectorSet + } + } + + if ($InputObject) { + if (-not $InputObject.DataCollectorSetObject) { + Stop-Function -Message "InputObject is not of the right type. Please use Get-DbaPfDataCollectorSet." + return + } + } + + foreach ($set in $InputObject) { + $collectorxml = ([xml]$set.Xml).DataCollectorSet.PerformanceCounterDataCollector + foreach ($col in $collectorxml) { + if ($Collector -and $Collector -notcontains $col.Name) { + continue + } + + $outputlocation = $col.LatestOutputLocation + if ($outputlocation) { + $dir = ($outputlocation).Replace(':', '$') + $remote = "\\$($set.ComputerName)\$dir" + } else { + $remote = $null + } + + [pscustomobject]@{ + ComputerName = $set.ComputerName + DataCollectorSet = $set.Name + Name = $col.Name + FileName = $col.FileName + DataCollectorType = $col.DataCollectorType + FileNameFormat = $col.FileNameFormat + FileNameFormatPattern = $col.FileNameFormatPattern + LogAppend = $col.LogAppend + LogCircular = $col.LogCircular + LogOverwrite = $col.LogOverwrite + LatestOutputLocation = $col.LatestOutputLocation + DataCollectorSetXml = $set.Xml + RemoteLatestOutputLocation = $remote + DataSourceName = $col.DataSourceName + SampleInterval = $col.SampleInterval + SegmentMaxRecords = $col.SegmentMaxRecords + LogFileFormat = $col.LogFileFormat + Counters = $col.Counter + CounterDisplayNames = $col.CounterDisplayName + CollectorXml = $col + DataCollectorObject = $true + Credential = $Credential + } | Select-DefaultView -Property $columns + } + } + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function Get-DbaPfDataCollectorCounter { + <# + .SYNOPSIS + Gets Performance Counters. + + .DESCRIPTION + Gets Performance Counters. + + .PARAMETER ComputerName + The target computer. Defaults to localhost. + + .PARAMETER Credential + Allows you to login to servers using alternative credentials. To use: + + $scred = Get-Credential, then pass $scred object to the -Credential parameter. + + .PARAMETER CollectorSet + The Collector Set name. + + .PARAMETER Collector + The Collector name. + + .PARAMETER Counter + The Counter name to capture. This must be in the form of '\Processor(_Total)\% Processor Time'. + + .PARAMETER InputObject + Accepts the object output by Get-DbaPfDataCollectorSet via the pipeline. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Performance, DataCollector, PerfCounter + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaPfDataCollectorCounter + + .EXAMPLE + PS C:\> Get-DbaPfDataCollectorCounter + + Gets all counters for all Collector Sets on localhost. + + .EXAMPLE + PS C:\> Get-DbaPfDataCollectorCounter -ComputerName sql2017 + + Gets all counters for all Collector Sets on on sql2017. + + .EXAMPLE + PS C:\> Get-DbaPfDataCollectorCounter -ComputerName sql2017 -Counter '\Processor(_Total)\% Processor Time' + + Gets the '\Processor(_Total)\% Processor Time' counter on sql2017. + + .EXAMPLE + PS C:\> Get-DbaPfDataCollectorCounter -ComputerName sql2017, sql2016 -Credential ad\sqldba -CollectorSet 'System Correlation' + + Gets all counters for the 'System Correlation' CollectorSet on sql2017 and sql2016 using alternative credentials. + + .EXAMPLE + PS C:\> Get-DbaPfDataCollectorSet -CollectorSet 'System Correlation' | Get-DbaPfDataCollector | Get-DbaPfDataCollectorCounter + + Gets all counters for the 'System Correlation' CollectorSet. + + #> + [CmdletBinding()] + param ( + [DbaInstance[]]$ComputerName = $env:COMPUTERNAME, + [PSCredential]$Credential, + [Alias("DataCollectorSet")] + [string[]]$CollectorSet, + [Alias("DataCollector")] + [string[]]$Collector, + [string[]]$Counter, + [parameter(ValueFromPipeline)] + [object[]]$InputObject, + [switch]$EnableException + ) + begin { + #Variable marked as unused by PSScriptAnalyzer + #$columns = 'ComputerName', 'Name', 'DataCollectorSet', 'Counters', 'DataCollectorType', 'DataSourceName', 'FileName', 'FileNameFormat', 'FileNameFormatPattern', 'LatestOutputLocation', 'LogAppend', 'LogCircular', 'LogFileFormat', 'LogOverwrite', 'SampleInterval', 'SegmentMaxRecords' + } + process { + + + if ($InputObject.Credential -and (Test-Bound -ParameterName Credential -Not)) { + $Credential = $InputObject.Credential + } + + if (-not $InputObject -or ($InputObject -and (Test-Bound -ParameterName ComputerName))) { + foreach ($computer in $ComputerName) { + $InputObject += Get-DbaPfDataCollector -ComputerName $computer -Credential $Credential -CollectorSet $CollectorSet -Collector $Collector + } + } + + if ($InputObject) { + if (-not $InputObject.DataCollectorObject) { + Stop-Function -Message "InputObject is not of the right type. Please use Get-DbaPfDataCollector." + return + } + } + + foreach ($counterobject in $InputObject) { + foreach ($countername in $counterobject.Counters) { + if ($Counter -and $Counter -notcontains $countername) { continue } + [pscustomobject]@{ + ComputerName = $counterobject.ComputerName + DataCollectorSet = $counterobject.DataCollectorSet + DataCollector = $counterobject.Name + DataCollectorSetXml = $counterobject.DataCollectorSetXml + Name = $countername + FileName = $counterobject.FileName + CounterObject = $true + Credential = $Credential + } | Select-DefaultView -ExcludeProperty DataCollectorObject, Credential, CounterObject, DataCollectorSetXml + } + } + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function Get-DbaPfDataCollectorCounterSample { + <# + .SYNOPSIS + Gets Performance Counter Samples. + + .DESCRIPTION + Gets Performance Counter Samples. + + .PARAMETER ComputerName + The target computer. Defaults to localhost. + + .PARAMETER Credential + Allows you to login to servers using alternative credentials. To use: + + $scred = Get-Credential, then pass $scred object to the -Credential parameter. + + .PARAMETER CollectorSet + The Collector Set name. + + .PARAMETER Collector + The Collector name. + + .PARAMETER Counter + The Counter name. This must be in the form of '\Processor(_Total)\% Processor Time'. + + .PARAMETER Continuous + If this switch is enabled, samples will be retrieved continuously until you press CTRL+C. By default, this command gets only one counter sample. You can use the SampleInterval parameter to set the interval for continuous sampling. + + .PARAMETER ListSet + Gets the specified performance counter sets on the computers. Enter the names of the counter sets. Wildcards are permitted. + + .PARAMETER MaxSamples + Specifies the number of samples to get from each counter. The default is 1 sample. To get samples continuously (no maximum sample size), use the Continuous parameter. + + To collect a very large data set, consider running a Get-DbaPfDataCollectorCounterSample command as a Windows PowerShell background job. + + .PARAMETER SampleInterval + Specifies the time between samples in seconds. The minimum value and the default value are 1 second. + + .PARAMETER InputObject + Accepts the object output by Get-DbaPfDataCollectorCounter via the pipeline. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Performance, DataCollector, PerfCounter + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaPfDataCollectorCounterSample + + .EXAMPLE + PS C:\> Get-DbaPfDataCollectorCounterSample + + Gets a single sample for all counters for all Collector Sets on localhost. + + .EXAMPLE + PS C:\> Get-DbaPfDataCollectorCounterSample -Counter '\Processor(_Total)\% Processor Time' + + Gets a single sample for all counters for all Collector Sets on localhost. + + .EXAMPLE + PS C:\> Get-DbaPfDataCollectorCounter -ComputerName sql2017, sql2016 | Out-GridView -PassThru | Get-DbaPfDataCollectorCounterSample -MaxSamples 10 + + Gets 10 samples for all counters for all Collector Sets for servers sql2016 and sql2017. + + .EXAMPLE + PS C:\> Get-DbaPfDataCollectorCounterSample -ComputerName sql2017 + + Gets a single sample for all counters for all Collector Sets on sql2017. + + .EXAMPLE + PS C:\> Get-DbaPfDataCollectorCounterSample -ComputerName sql2017, sql2016 -Credential ad\sqldba -CollectorSet 'System Correlation' + + Gets a single sample for all counters for the 'System Correlation' CollectorSet on sql2017 and sql2016 using alternative credentials. + + .EXAMPLE + PS C:\> Get-DbaPfDataCollectorCounterSample -CollectorSet 'System Correlation' + + Gets a single sample for all counters for the 'System Correlation' CollectorSet. + + #> + [CmdletBinding()] + param ( + [DbaInstance[]]$ComputerName = $env:COMPUTERNAME, + [PSCredential]$Credential, + [Alias("DataCollectorSet")] + [string[]]$CollectorSet, + [Alias("DataCollector")] + [string[]]$Collector, + [string[]]$Counter, + [switch]$Continuous, + [switch[]]$ListSet, + [int]$MaxSamples, + [int]$SampleInterval, + [parameter(ValueFromPipeline)] + [object[]]$InputObject, + [switch]$EnableException + ) + process { + + + if ($InputObject.Credential -and (Test-Bound -ParameterName Credential -Not)) { + $Credential = $InputObject.Credential + } + + if ($InputObject.Counter -and (Test-Bound -ParameterName Counter -Not)) { + $Counter = $InputObject.Counter + } + + if (-not $InputObject -or ($InputObject -and (Test-Bound -ParameterName ComputerName))) { + foreach ($computer in $ComputerName) { + $InputObject += Get-DbaPfDataCollectorCounter -ComputerName $computer -Credential $Credential -CollectorSet $CollectorSet -Collector $Collector + } + } + + if ($InputObject) { + if (-not $InputObject.CounterObject) { + Stop-Function -Message "InputObject is not of the right type. Please use Get-DbaPfDataCollectorCounter." + return + } + } + + foreach ($counterobject in $InputObject) { + if ((Test-Bound -ParameterName Counter) -and ($Counter -notcontains $counterobject.Name)) { continue } + $params = @{ + Counter = $counterobject.Name + } + + if (-not ([dbainstance]$counterobject.ComputerName).IsLocalHost) { + $params.Add("ComputerName", $counterobject.ComputerName) + } + + if ($Credential) { + $params.Add("Credential", $Credential) + } + + if ($Continuous) { + $params.Add("Continuous", $Continuous) + } + + if ($ListSet) { + $params.Add("ListSet", $ListSet) + } + + if ($MaxSamples) { + $params.Add("MaxSamples", $MaxSamples) + } + + if ($SampleInterval) { + $params.Add("SampleInterval", $SampleInterval) + } + + if ($Continuous) { + Get-Counter @params + } else { + try { + $pscounters = Get-Counter @params -ErrorAction Stop + } catch { + Stop-Function -Message "Failure for $($counterobject.Name) on $($counterobject.ComputerName)." -ErrorRecord $_ -Continue + } + + foreach ($pscounter in $pscounters) { + foreach ($sample in $pscounter.CounterSamples) { + [pscustomobject]@{ + ComputerName = $counterobject.ComputerName + DataCollectorSet = $counterobject.DataCollectorSet + DataCollector = $counterobject.DataCollector + Name = $counterobject.Name + Timestamp = $pscounter.Timestamp + Path = $sample.Path + InstanceName = $sample.InstanceName + CookedValue = $sample.CookedValue + RawValue = $sample.RawValue + SecondValue = $sample.SecondValue + MultipleCount = $sample.MultipleCount + CounterType = $sample.CounterType + SampleTimestamp = $sample.Timestamp + SampleTimestamp100NSec = $sample.Timestamp100NSec + Status = $sample.Status + DefaultScale = $sample.DefaultScale + TimeBase = $sample.TimeBase + Sample = $pscounter.CounterSamples + CounterSampleObject = $true + } | Select-DefaultView -ExcludeProperty Sample, CounterSampleObject + } + } + } + } + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function Get-DbaPfDataCollectorSet { + <# + .SYNOPSIS + Gets Performance Monitor Data Collector Set. + + .DESCRIPTION + Gets Performance Monitor Data Collector Set. + + .PARAMETER ComputerName + The target computer. Defaults to localhost. + + .PARAMETER Credential + Allows you to login to servers using alternative credentials. To use: + + $scred = Get-Credential, then pass $scred object to the -Credential parameter. + + .PARAMETER CollectorSet + The Collector set name. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Performance, DataCollector, PerfCounter + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaPfDataCollectorSet + + .EXAMPLE + PS C:\> Get-DbaPfDataCollectorSet + + Gets all Collector Sets on localhost. + + .EXAMPLE + PS C:\> Get-DbaPfDataCollectorSet -ComputerName sql2017 + + Gets all Collector Sets on sql2017. + + .EXAMPLE + PS C:\> Get-DbaPfDataCollectorSet -ComputerName sql2017 -Credential ad\sqldba -CollectorSet 'System Correlation' + + Gets the 'System Correlation' CollectorSet on sql2017 using alternative credentials. + + .EXAMPLE + PS C:\> Get-DbaPfDataCollectorSet | Select-Object * + + Displays extra columns and also exposes the original COM object in DataCollectorSetObject. + + #> + [CmdletBinding()] + param ( + [parameter(ValueFromPipeline)] + [DbaInstance[]]$ComputerName = $env:COMPUTERNAME, + [PSCredential]$Credential, + [Alias("DataCollectorSet")] + [string[]]$CollectorSet, + [switch]$EnableException + ) + + begin { + $setscript = { + # Get names / status info + $schedule = New-Object -ComObject "Schedule.Service" + $schedule.Connect() + $folder = $schedule.GetFolder("Microsoft\Windows\PLA") + $tasks = @() + $tasknumber = 0 + $done = $false + do { + try { + $task = $folder.GetTasks($tasknumber) + $tasknumber++ + if ($task) { + $tasks += $task + } + } catch { + $done = $true + } + } + while ($done -eq $false) + $null = [System.Runtime.Interopservices.Marshal]::ReleaseComObject($schedule) + + if ($args[0]) { + $tasks = $tasks | Where-Object Name -in $args[0] + } + + $sets = New-Object -ComObject Pla.DataCollectorSet + foreach ($task in $tasks) { + $setname = $task.Name + switch ($task.State) { + 0 { $state = "Unknown" } + 1 { $state = "Disabled" } + 2 { $state = "Queued" } + 3 { $state = "Ready" } + 4 { $state = "Running" } + } + + try { + # Query changes $sets so work from there + $sets.Query($setname, $null) + $set = $sets.PSObject.Copy() + + $outputlocation = $set.OutputLocation + $latestoutputlocation = $set.LatestOutputLocation + + if ($outputlocation) { + $dir = (Split-Path $outputlocation).Replace(':', '$') + $remote = "\\$env:COMPUTERNAME\$dir" + } else { + $remote = $null + } + + if ($latestoutputlocation) { + $dir = ($latestoutputlocation).Replace(':', '$') + $remotelatest = "\\$env:COMPUTERNAME\$dir" + } else { + $remote = $null + } + + [pscustomobject]@{ + ComputerName = $env:COMPUTERNAME + Name = $setname + LatestOutputLocation = $set.LatestOutputLocation + OutputLocation = $set.OutputLocation + RemoteOutputLocation = $remote + RemoteLatestOutputLocation = $remotelatest + RootPath = $set.RootPath + Duration = $set.Duration + Description = $set.Description + DescriptionUnresolved = $set.DescriptionUnresolved + DisplayName = $set.DisplayName + DisplayNameUnresolved = $set.DisplayNameUnresolved + Keywords = $set.Keywords + Segment = $set.Segment + SegmentMaxDuration = $set.SegmentMaxDuration + SegmentMaxSize = $set.SegmentMaxSize + SerialNumber = $set.SerialNumber + Server = $set.Server + Status = $set.Status + Subdirectory = $set.Subdirectory + SubdirectoryFormat = $set.SubdirectoryFormat + SubdirectoryFormatPattern = $set.SubdirectoryFormatPattern + Task = $set.Task + TaskRunAsSelf = $set.TaskRunAsSelf + TaskArguments = $set.TaskArguments + TaskUserTextArguments = $set.TaskUserTextArguments + Schedules = $set.Schedules + SchedulesEnabled = $set.SchedulesEnabled + UserAccount = $set.UserAccount + Xml = $set.Xml + Security = $set.Security + StopOnCompletion = $set.StopOnCompletion + State = $state.Trim() + DataCollectorSetObject = $true + TaskObject = $task + Credential = $args[1] + } + } catch { + <# DO NOT use Write-Message as this is inside of a script block #> + Write-Warning -Message "Issue with getting Collector Set $setname on $env:Computername : $_." + continue + } + } + } + + $columns = 'ComputerName', 'Name', 'DisplayName', 'Description', 'State', 'Duration', 'OutputLocation', 'LatestOutputLocation', + 'RootPath', 'SchedulesEnabled', 'Segment', 'SegmentMaxDuration', 'SegmentMaxSize', + 'SerialNumber', 'Server', 'StopOnCompletion', 'Subdirectory', 'SubdirectoryFormat', + 'SubdirectoryFormatPattern', 'Task', 'TaskArguments', 'TaskRunAsSelf', 'TaskUserTextArguments', 'UserAccount' + } + process { + + + foreach ($computer in $ComputerName.ComputerName) { + try { + Invoke-Command2 -ComputerName $computer -Credential $Credential -ScriptBlock $setscript -ArgumentList $CollectorSet, $Credential -ErrorAction Stop | Select-DefaultView -Property $columns + } catch { + Stop-Function -Message "Failure" -ErrorRecord $_ -Target $computer -Continue + } + } + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function Get-DbaPfDataCollectorSetTemplate { + <# + .SYNOPSIS + Parses Perf Monitor templates. Defaults to parsing templates in the dbatools template repository (\bin\perfmontemplates\). + + .DESCRIPTION + Parses Perf Monitor XML templates. Defaults to parsing templates in the dbatools template repository (\bin\perfmontemplates\). + + .PARAMETER Path + The path to the template directory. Defaults to the dbatools template repository (\bin\perfmontemplates\). + + .PARAMETER Pattern + Specify a pattern for filtering. Alternatively, you can use Out-GridView -Passthru to select objects and pipe them to Import-DbaPfDataCollectorSetTemplate. + + .PARAMETER Template + Specifies one or more of the templates provided by dbatools. Press tab to cycle through the list to the options. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Performance, DataCollector, PerfCounter + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaPfDataCollectorSetTemplate + + .EXAMPLE + PS C:\> Get-DbaPfDataCollectorSetTemplate + + Returns information about all the templates in the local dbatools repository. + + .EXAMPLE + PS C:\> Get-DbaPfDataCollectorSetTemplate | Out-GridView -PassThru | Import-DbaPfDataCollectorSetTemplate -ComputerName sql2017 | Start-DbaPfDataCollectorSet + + Allows you to select a template, then deploys it to sql2017 and immediately starts the DataCollectorSet. + + .EXAMPLE + PS C:\> Get-DbaPfDataCollectorSetTemplate | Select-Object * + + Returns more information about the template, including the full path/filename. + + #> + [CmdletBinding()] + param ( + [string[]]$Path = "$script:PSModuleRoot\bin\perfmontemplates\collectorsets", + [string]$Pattern, + [string[]]$Template, + [switch]$EnableException + ) + begin { + $metadata = Import-Clixml "$script:PSModuleRoot\bin\perfmontemplates\collectorsets.xml" + # In case people really want a "like" search, which is slower + $Pattern = $Pattern.Replace("*", ".*").Replace("..*", ".*") + } + process { + + + foreach ($directory in $Path) { + $files = Get-ChildItem "$directory\*.xml" + + if ($Template) { + $files = $files | Where-Object BaseName -in $Template + } + + foreach ($file in $files) { + try { + $xml = [xml](Get-Content $file) + } catch { + Stop-Function -Message "Failure" -ErrorRecord $_ -Target $file -Continue + } + + foreach ($dataset in $xml.DataCollectorSet) { + $meta = $metadata | Where-Object Name -eq $dataset.name + if ($Pattern) { + if ( + ($dataset.Name -match $Pattern) -or + ($dataset.Description -match $Pattern) + ) { + [pscustomobject]@{ + Name = $dataset.name + Source = $meta.Source + UserAccount = $dataset.useraccount + Description = $dataset.Description + Path = $file + File = $file.Name + } | Select-DefaultView -ExcludeProperty File, Path + } + } else { + [pscustomobject]@{ + Name = $dataset.name + Source = $meta.Source + UserAccount = $dataset.useraccount + Description = $dataset.Description + Path = $file + File = $file.Name + } | Select-DefaultView -ExcludeProperty File, Path + } + } + } + } + } +} +function Get-DbaPlanCache { + <# + .SYNOPSIS + Provides information about adhoc and prepared plan cache usage + + .DESCRIPTION + Checks adhoc and prepared plan cache for each database, if over 100 MB you should consider using Remove-DbaQueryPlan to clear the plan caches or turning on "optimize for adhoc workloads" configuration if running 2008 or later. + + References: https://www.sqlskills.com/blogs/kimberly/plan-cache-adhoc-workloads-and-clearing-the-single-use-plan-cache-bloat/ + + Note: This command returns results from all SQL server instances on the destination server but the process column is specific to -SqlInstance passed. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Memory + Author: Tracy Boggiano, databasesuperhero.com + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaPlanCache + + .EXAMPLE + PS C:\> Get-DbaPlanCache -SqlInstance sql2017 + + Returns the single use plan cache usage information for SQL Server instance 2017 + + .EXAMPLE + PS C:\> Get-DbaPlanCache -SqlInstance sql2017 -SqlCredential sqladmin + + Returns the single use plan cache usage information for SQL Server instance 2017 using login 'sqladmin' + + #> + [CmdletBinding()] + param ( + [parameter(Mandatory, ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer", "SqlServers")] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [switch]$EnableException + ) + begin { + $Sql = "SELECT SERVERPROPERTY('MachineName') AS ComputerName, + ISNULL(SERVERPROPERTY('InstanceName'), 'MSSQLSERVER') AS InstanceName, + SERVERPROPERTY('ServerName') AS SqlInstance, MB = SUM(CAST((CASE WHEN usecounts = 1 AND objtype IN ('Adhoc', 'Prepared') THEN size_in_bytes ELSE 0 END) AS DECIMAL(12, 2))) / 1024 / 1024, + UseCount = SUM(CASE WHEN usecounts = 1 AND objtype IN ('Adhoc', 'Prepared') THEN 1 ELSE 0 END) + FROM sys.dm_exec_cached_plans;" + } + + process { + foreach ($instance in $SqlInstance) { + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $sqlcredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + $results = $server.Query($sql) + $size = [dbasize]($results.MB * 1024 * 1024) + Add-Member -Force -InputObject $results -MemberType NoteProperty -Name Size -Value $size + + Select-DefaultView -InputObject $results -Property ComputerName, InstanceName, SqlInstance, Size, UseCount + } + } +} +function Get-DbaPowerPlan { + <# + .SYNOPSIS + Gets the Power Plan settings for compliance with best practices, which recommend High Performance for SQL Server. + + .DESCRIPTION + Gets the Power Plan settings on a computer against best practices recommendations. + + .PARAMETER ComputerName + The server(s) to check Power Plan settings on. + + .PARAMETER Credential + Specifies a PSCredential object to use in authenticating to the server(s), instead of the current user account. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: PowerPlan + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaPowerPlan + + .EXAMPLE + PS C:\> Get-DbaPowerPlan -ComputerName sql2017 + + Gets the Power Plan settings for sql2017 + + .EXAMPLE + PS C:\> Get-DbaPowerPlan -ComputerName sql2017 -Credential ad\admin + + Gets the Power Plan settings for sql2017 using an alternative credential + + #> + param ( + [parameter(Mandatory, ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer", "SqlInstance")] + [DbaInstance[]]$ComputerName, + [PSCredential]$Credential, + [switch]$EnableException + ) + + process { + foreach ($computer in $ComputerName) { + $null = Test-ElevationRequirement -ComputerName $computer -Continue + + $server = Resolve-DbaNetworkName -ComputerName $computer -Credential $Credential + + $computerResolved = $server.FullComputerName + + if (-not $computerResolved) { + Stop-Function -Message "Couldn't resolve hostname. Skipping." -Continue + } + + $splatDbaCmObject = @{ + ComputerName = $computerResolved + EnableException = $true + } + + if (Test-Bound "Credential") { + $splatDbaCmObject["Credential"] = $Credential + } + + Write-Message -Level Verbose -Message "Getting Power Plan information from $computer." + + try { + $powerPlans = Get-DbaCmObject @splatDbaCmObject -ClassName Win32_PowerPlan -Namespace "root\cimv2\power" | Select-Object ElementName, InstanceId, IsActive + } catch { + if ($_.Exception -match "namespace") { + Stop-Function -Message "Can't get Power Plan Info for $computer. Unsupported operating system." -Continue -ErrorRecord $_ -Target $computer + } else { + Stop-Function -Message "Can't get Power Plan Info for $computer. Check logs for more details." -Continue -ErrorRecord $_ -Target $computer + } + } + + $powerPlan = $powerPlans | Where-Object IsActive -eq 'True' | Select-Object ElementName, InstanceID + $powerPlan.InstanceID = $powerPlan.InstanceID.Split('{')[1].Split('}')[0] + + if ($null -eq $powerPlan.InstanceID) { + $powerPlan.ElementName = "Unknown" + } + + [PSCustomObject]@{ + ComputerName = $computer + InstanceId = $powerPlan.InstanceID + PowerPlan = $powerPlan.ElementName + Credential = $Credential + } | Select-DefaultView -ExcludeProperty Credential, InstanceId + } + } +} +function Get-DbaPrivilege { + <# + .SYNOPSIS + Gets the users with local privileges on one or more computers. + + .DESCRIPTION + Gets the users with local privileges 'Lock Pages in Memory', 'Instant File Initialization', 'Logon as Batch' on one or more computers. + + Requires Local Admin rights on destination computer(s). + + .PARAMETER ComputerName + The target SQL Server instance or instances. + + .PARAMETER Credential + Credential object used to connect to the computer as a different user. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Privilege + Author: Klaas Vandenberghe (@PowerDBAKlaas) + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaPrivilege + + .EXAMPLE + PS C:\> Get-DbaPrivilege -ComputerName sqlserver2014a + + Gets the local privileges on computer sqlserver2014a. + + .EXAMPLE + PS C:\> 'sql1','sql2','sql3' | Get-DbaPrivilege + + Gets the local privileges on computers sql1, sql2 and sql3. + + .EXAMPLE + PS C:\> Get-DbaPrivilege -ComputerName sql1,sql2 | Out-GridView + + Gets the local privileges on computers sql1 and sql2, and shows them in a grid view. + + #> + [CmdletBinding()] + param ( + [parameter(ValueFromPipeline)] + [Alias("cn", "host", "Server")] + [DbaInstanceParameter[]]$ComputerName = $env:COMPUTERNAME, + [PSCredential]$Credential, + [switch][Alias('Silent')] + $EnableException + ) + + begin { + $ResolveSID = @" + function Convert-SIDToUserName ([string] `$SID ) { + `$objSID = New-Object System.Security.Principal.SecurityIdentifier (`"`$SID`") + `$objUser = `$objSID.Translate( [System.Security.Principal.NTAccount]) + `$objUser.Value + } +"@ + $ComputerName = $ComputerName.ComputerName | Select-Object -Unique + } + process { + foreach ($computer in $ComputerName) { + try { + $null = Test-PSRemoting -ComputerName $Computer -EnableException + } catch { + Stop-Function -Message "Failure on $computer" -ErrorRecord $_ -Continue + } + + try { + Write-Message -Level Verbose -Message "Getting Privileges on $Computer" + $Priv = $null + $Priv = Invoke-Command2 -Raw -ComputerName $computer -Credential $Credential -ScriptBlock { + $temp = ([System.IO.Path]::GetTempPath()).TrimEnd(""); secedit /export /cfg $temp\secpolByDbatools.cfg > $NULL; + Get-Content $temp\secpolByDbatools.cfg | Where-Object { + $_ -match "SeBatchLogonRight" -or $_ -match 'SeManageVolumePrivilege' -or $_ -match 'SeLockMemoryPrivilege' + } + } + if ($Priv.count -eq 0) { + Write-Message -Level Verbose -Message "No users with Batch Logon, Instant File Initialization, or Lock Pages in Memory Rights on $computer" + } + + Write-Message -Level Verbose -Message "Getting Batch Logon Privileges on $Computer" + $BL = Invoke-Command2 -Raw -ComputerName $computer -Credential $Credential -ArgumentList $ResolveSID -ScriptBlock { + param ($ResolveSID) + . ([ScriptBlock]::Create($ResolveSID)) + $temp = ([System.IO.Path]::GetTempPath()).TrimEnd(""); + $blEntries = (Get-Content $temp\secpolByDbatools.cfg | Where-Object { + $_ -like "SeBatchLogonRight*" + }) + + if ($null -ne $blEntries) { + $blEntries.substring(20).split(",").replace("`*", "") | ForEach-Object { + Convert-SIDToUserName -SID $_ + } + } + + } -ErrorAction SilentlyContinue + if ($BL.count -eq 0) { + Write-Message -Level Verbose -Message "No users with Batch Logon Rights on $computer" + } + + Write-Message -Level Verbose -Message "Getting Instant File Initialization Privileges on $Computer" + $ifi = Invoke-Command2 -Raw -ComputerName $computer -Credential $Credential -ArgumentList $ResolveSID -ScriptBlock { + param ($ResolveSID) + . ([ScriptBlock]::Create($ResolveSID)) + $temp = ([System.IO.Path]::GetTempPath()).TrimEnd(""); + $ifiEntries = (Get-Content $temp\secpolByDbatools.cfg | Where-Object { + $_ -like 'SeManageVolumePrivilege*' + }) + + if ($null -ne $ifiEntries) { + $ifiEntries.substring(26).split(",").replace("`*", "") | ForEach-Object { + Convert-SIDToUserName -SID $_ + } + } + + } -ErrorAction SilentlyContinue + if ($ifi.count -eq 0) { + Write-Message -Level Verbose -Message "No users with Instant File Initialization Rights on $computer" + } + + Write-Message -Level Verbose -Message "Getting Lock Pages in Memory Privileges on $Computer" + $lpim = Invoke-Command2 -Raw -ComputerName $computer -Credential $Credential -ArgumentList $ResolveSID -ScriptBlock { + param ($ResolveSID) + . ([ScriptBlock]::Create($ResolveSID)) + $temp = ([System.IO.Path]::GetTempPath()).TrimEnd(""); + $lpimEntries = (Get-Content $temp\secpolByDbatools.cfg | Where-Object { + $_ -like 'SeLockMemoryPrivilege*' + }) + + if ($null -ne $lpimEntries) { + $lpimEntries.substring(24).split(",").replace("`*", "") | ForEach-Object { + Convert-SIDToUserName -SID $_ + } + } + } -ErrorAction SilentlyContinue + + if ($lpim.count -eq 0) { + Write-Message -Level Verbose -Message "No users with Lock Pages in Memory Rights on $computer" + } + $users = @() + $BL + $ifi + $lpim | Select-Object -Unique + $users | ForEach-Object { + [PSCustomObject]@{ + ComputerName = $computer + User = $_ + LogonAsBatch = $BL -contains $_ + InstantFileInitialization = $ifi -contains $_ + LockPagesInMemory = $lpim -contains $_ + } + } + Write-Message -Level Verbose -Message "Removing secpol file on $computer" + Invoke-Command2 -Raw -ComputerName $computer -Credential $Credential -ScriptBlock { + $temp = ([System.IO.Path]::GetTempPath()).TrimEnd(""); Remove-Item $temp\secpolByDbatools.cfg -Force > $NULL + } + } catch { + Stop-Function -Continue -Message "Failure" -ErrorRecord $_ -Target $computer + } + } + } +} +function Get-DbaProcess { + <# + .SYNOPSIS + This command displays SQL Server processes. + + .DESCRIPTION + This command displays processes associated with a spid, login, host, program or database. + + Thanks to Michael J Swart at https://sqlperformance.com/2017/07/sql-performance/find-database-connection-leaks for the query to get the last executed SQL statement, minutesasleep and host process ID. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Spid + Specifies one or more process IDs (Spid) to be displayed. Options for this parameter are auto-populated from the server. + + .PARAMETER Login + Specifies one or more Login names with active processes to look for. Options for this parameter are auto-populated from the server. + + .PARAMETER Hostname + Specifies one or more hostnames with active processes to look for. Options for this parameter are auto-populated from the server. + + .PARAMETER Program + Specifies one or more program names with active processes to look for. Options for this parameter are auto-populated from the server. + + .PARAMETER Database + Specifies one or more databases with active processes to look for. Options for this parameter are auto-populated from the server. + + .PARAMETER ExcludeSpid + Specifies one ore more process IDs to exclude from display. Options for this parameter are auto-populated from the server. + + This is the last filter to run, so even if a Spid matches another filter, it will be excluded by this filter. + + .PARAMETER ExcludeSystemSpids + If this switch is enabled, system Spids will be ignored. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Process, Session, ActivityMonitor + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaProcess + + .EXAMPLE + PS C:\> Get-DbaProcess -SqlInstance sqlserver2014a -Login base\ctrlb, sa + + Shows information about the processes for base\ctrlb and sa on sqlserver2014a. Windows Authentication is used in connecting to sqlserver2014a. + + .EXAMPLE + PS C:\> Get-DbaProcess -SqlInstance sqlserver2014a -SqlCredential $credential -Spid 56, 77 + + Shows information about the processes for spid 56 and 57. Uses alternative (SQL or Windows) credentials to authenticate to sqlserver2014a. + + .EXAMPLE + PS C:\> Get-DbaProcess -SqlInstance sqlserver2014a -Program 'Microsoft SQL Server Management Studio' + + Shows information about the processes that were created in Microsoft SQL Server Management Studio. + + .EXAMPLE + PS C:\> Get-DbaProcess -SqlInstance sqlserver2014a -Host workstationx, server100 + + Shows information about the processes that were initiated by hosts (computers/clients) workstationx and server 1000. + + #> + [CmdletBinding()] + param ( + [parameter(Mandatory, ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [Alias("Credential")] + [PSCredential]$SqlCredential, + [int[]]$Spid, + [int[]]$ExcludeSpid, + [string[]]$Database, + [string[]]$Login, + [string[]]$Hostname, + [string[]]$Program, + [switch]$ExcludeSystemSpids, + [Alias('Silent')] + [switch]$EnableException + ) + + process { + foreach ($instance in $sqlinstance) { + + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential + } catch { + Stop-Function -Message "Could not connect to Sql Server instance $instance : $_" -Target $instance -ErrorRecord $_ -Continue + } + + $sql = "SELECT DATEDIFF(MINUTE, s.last_request_end_time, GETDATE()) AS MinutesAsleep, + s.session_id AS spid, + s.host_process_id AS HostProcessId, + t.text AS Query, + s.login_time AS LoginTime, + s.client_version AS ClientVersion, + s.last_request_start_time AS LastRequestStartTime, + s.last_request_end_time AS LastRequestEndTime, + c.net_transport AS NetTransport, + c.encrypt_option AS EncryptOption, + c.auth_scheme AS AuthScheme, + c.net_packet_size AS NetPacketSize, + c.client_net_address AS ClientNetAddress + FROM sys.dm_exec_connections c + JOIN sys.dm_exec_sessions s + on c.session_id = s.session_id + CROSS APPLY sys.dm_exec_sql_text(c.most_recent_sql_handle) t" + + if ($server.VersionMajor -gt 8) { + $results = $server.Query($sql) + } else { + $results = $null + } + + $allsessions = @() + + $processes = $server.EnumProcesses() + + if ($Login) { + $allsessions += $processes | Where-Object { $_.Login -in $Login -and $_.Spid -notin $allsessions.Spid } + } + + if ($Spid) { + $allsessions += $processes | Where-Object { ($_.Spid -in $Spid -or $_.BlockingSpid -in $Spid) -and $_.Spid -notin $allsessions.Spid } + } + + if ($Hostname) { + $allsessions += $processes | Where-Object { $_.Host -in $Hostname -and $_.Spid -notin $allsessions.Spid } + } + + if ($Program) { + $allsessions += $processes | Where-Object { $_.Program -in $Program -and $_.Spid -notin $allsessions.Spid } + } + + if ($Database) { + $allsessions += $processes | Where-Object { $Database -contains $_.Database -and $_.Spid -notin $allsessions.Spid } + } + + if (Test-Bound -not 'Login', 'Spid', 'ExcludeSpid', 'Hostname', 'Program', 'Database') { + $allsessions = $processes + } + + if ($ExcludeSystemSpids -eq $true) { + $allsessions = $allsessions | Where-Object { $_.Spid -gt 50 } + } + + if ($Exclude) { + $allsessions = $allsessions | Where-Object { $Exclude -notcontains $_.SPID -and $_.Spid -notin $allsessions.Spid } + } + + foreach ($session in $allsessions) { + + if ($session.Status -eq "") { + $status = "sleeping" + } else { + $status = $session.Status + } + + if ($session.Command -eq "") { + $command = "AWAITING COMMAND" + } else { + $command = $session.Command + } + + $row = $results | Where-Object { $_.Spid -eq $session.Spid } + + Add-Member -Force -InputObject $session -MemberType NoteProperty -Name Parent -value $server + Add-Member -Force -InputObject $session -MemberType NoteProperty -Name ComputerName -value $server.ComputerName + Add-Member -Force -InputObject $session -MemberType NoteProperty -Name InstanceName -value $server.ServiceName + Add-Member -Force -InputObject $session -MemberType NoteProperty -Name SqlInstance -value $server.DomainInstanceName + Add-Member -Force -InputObject $session -MemberType NoteProperty -Name Status -value $status + Add-Member -Force -InputObject $session -MemberType NoteProperty -Name Command -value $command + Add-Member -Force -InputObject $session -MemberType NoteProperty -Name HostProcessId -value $row.HostProcessId + Add-Member -Force -InputObject $session -MemberType NoteProperty -Name MinutesAsleep -value $row.MinutesAsleep + Add-Member -Force -InputObject $session -MemberType NoteProperty -Name LoginTime -value $row.LoginTime + Add-Member -Force -InputObject $session -MemberType NoteProperty -Name ClientVersion -value $row.ClientVersion + Add-Member -Force -InputObject $session -MemberType NoteProperty -Name LastRequestStartTime -value $row.LastRequestStartTime + Add-Member -Force -InputObject $session -MemberType NoteProperty -Name LastRequestEndTime -value $row.LastRequestEndTime + Add-Member -Force -InputObject $session -MemberType NoteProperty -Name NetTransport -value $row.NetTransport + Add-Member -Force -InputObject $session -MemberType NoteProperty -Name EncryptOption -value $row.EncryptOption + Add-Member -Force -InputObject $session -MemberType NoteProperty -Name AuthScheme -value $row.AuthScheme + Add-Member -Force -InputObject $session -MemberType NoteProperty -Name NetPacketSize -value $row.NetPacketSize + Add-Member -Force -InputObject $session -MemberType NoteProperty -Name ClientNetAddress -value $row.ClientNetAddress + Add-Member -Force -InputObject $session -MemberType NoteProperty -Name LastQuery -value $row.Query + + Select-DefaultView -InputObject $session -Property ComputerName, InstanceName, SqlInstance, Spid, Login, LoginTime, Host, Database, BlockingSpid, Program, Status, Command, Cpu, MemUsage, LastRequestStartTime, LastRequestEndTime, MinutesAsleep, ClientNetAddress, NetTransport, EncryptOption, AuthScheme, NetPacketSize, ClientVersion, HostProcessId, IsSystem, LastQuery + } + } + } +} +#ValidationTags#CodeStyle,Messaging,FlowControl,Pipeline# +function Get-DbaProductKey { + <# + .SYNOPSIS + Gets SQL Server Product Keys from local or destination SQL Servers. Works with SQL Server 2005-2017 + + .DESCRIPTION + This command find the product key for all installed instances. Clustered instances are supported as well. + + Uses key decoder by Jakob Bindslet (http://goo.gl/1jiwcB) + + .PARAMETER ComputerName + The target SQL Server instance or instances. + + .PARAMETER Credential + Login to the target Windows instance using alternative credentials. Windows Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER SqlCredential + This command logs into the SQL instance to gather additional information. + + Use this parameter to connect to the discovered SQL instances using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: ProductKey + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaProductKey + + .EXAMPLE + PS C:\> Get-DbaProductKey -ComputerName winxp, sqlservera, sqlserver2014a, win2k8 + + Gets SQL Server versions, editions and product keys for all instances within each server or workstation. + + #> + [CmdletBinding()] + param ( + [parameter(ValueFromPipeline, Mandatory)] + [Alias("SqlInstance")] + [DbaInstanceParameter[]]$ComputerName, + [PSCredential]$SqlCredential, + [PSCredential]$Credential, + [switch]$EnableException + ) + + begin { + $scriptblock = { + $versionMajor = $args[0] + $instanceReg = $args[1] + $edition = $args[2] + + Function Unlock-SqlInstanceKey { + [CmdletBinding()] + param ( + [Parameter(Mandatory)] + [byte[]]$data, + [int]$version + ) + try { + if ($version -ge 11) { + $binArray = ($data)[0 .. 66] + } else { + $binArray = ($data)[52 .. 66] + } + $charsArray = "B", "C", "D", "F", "G", "H", "J", "K", "M", "P", "Q", "R", "T", "V", "W", "X", "Y", "2", "3", "4", "6", "7", "8", "9" + for ($i = 24; $i -ge 0; $i--) { + $k = 0 + for ($j = 14; $j -ge 0; $j--) { + $k = $k * 256 -bxor $binArray[$j] + $binArray[$j] = [math]::truncate($k / 24) + $k = $k % 24 + } + $productKey = $charsArray[$k] + $productKey + if (($i % 5 -eq 0) -and ($i -ne 0)) { + $productKey = "-" + $productKey + } + } + } catch { + $productkey = "Cannot decode product key." + } + return $productKey + } + $localmachine = [Microsoft.Win32.RegistryHive]::LocalMachine + $defaultview = [Microsoft.Win32.RegistryView]::Default + $reg = [Microsoft.Win32.RegistryKey]::OpenBaseKey($localmachine, $defaultview) + + switch ($versionMajor) { + 9 { + $sqlversion = "SQL Server 2005 $servicePack" + $findkeys = $reg.OpenSubKey("$($instanceReg.Path)\ProductID", $false) + foreach ($findkey in $findkeys.GetValueNames()) { + if ($findkey -like "DigitalProductID*") { + $key = @("$($instanceReg.Path)\ProductID\$findkey") + } + } + } + 10 { + $sqlversion = "SQL Server 2008 $servicePack" + if ($server.VersionMinor -eq 50) { + $sqlversion = "SQL Server 2008 R2 $servicePack" + } + $key = @("$($instanceReg.Path)\Setup\DigitalProductID") + } + 11 { + $key = @("$($instanceReg.Path)\Setup\DigitalProductID", "$($instanceReg.Path)\ClientSetup\DigitalProductID") + $sqlversion = "SQL Server 2012 $servicePack" + } + 12 { + $key = @("$($instanceReg.Path)\Setup\DigitalProductID", "$($instanceReg.Path)\ClientSetup\DigitalProductID") + $sqlversion = "SQL Server 2014 $servicePack" + } + 13 { + $key = @("$($instanceReg.Path)\Setup\DigitalProductID", "$($instanceReg.Path)\ClientSetup\DigitalProductID") + $sqlversion = "SQL Server 2016 $servicePack" + } + 14 { + $key = @("$($instanceReg.Path)\Setup\DigitalProductID", "$($instanceReg.Path)\ClientSetup\DigitalProductID") + $sqlversion = "SQL Server 2017 $servicePack" + } + default { + Stop-Function -Message "SQL version not currently supported." -Continue + } + } + if ($edition -notlike "*Express*") { + $sqlkey = '' + foreach ($k in $key) { + $subkey = Split-Path $k + $binaryvalue = Split-Path $k -Leaf + try { + $binarykey = $($reg.OpenSubKey($subkey)).GetValue($binaryvalue) + break + } catch { + $binarykey = $null + } + } + + if ($null -eq $binarykey) { + $sqlkey = "Could not read Product Key from registry on $env:COMPUTERNAME" + } else { + try { + $sqlkey = Unlock-SqlInstanceKey $binarykey $versionMajor + } catch { + $sqlkey = "Unable to unlock key" + } + } + } else { + $sqlkey = "SQL Server Express Edition" + } + + [pscustomobject]@{ + Version = $sqlversion + Key = $sqlkey + } + $reg.Close() + } + } + + process { + foreach ($computer in $ComputerName) { + try { + $registryroot = Get-DbaRegistryRoot -ComputerName $computer.ComputerName -Credential $Credential -EnableException + } catch { + Stop-Function -Message "Can't access registry for $($computer.ComputerName). Is the Remote Registry service started?" -Continue + } + + if (-not $registryroot) { + Stop-Function -Message "No instances found on $($computer.ComputerName)" -Continue + } + + # Get Product Keys for all instances on the server. + foreach ($instanceReg in $registryroot) { + try { + $server = Connect-SqlInstance -SqlInstance $instanceReg.SqlInstance -SqlCredential $SqlCredential -MinimumVersion 10 + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instanceReg.SqlInstance -Continue + } + + $servicePack = $server.ProductLevel + $versionMajor = $server.VersionMajor + Write-Message -Level Debug -Message "$instance $instanceName version is $($server.VersionMajor)" + + try { + $results = Invoke-Command2 -ComputerName $computer.ComputerName -Credential $Credential -ScriptBlock $scriptblock -ArgumentList $server.VersionMajor, $instanceReg, $server.Edition + } catch { + Stop-Function -Message "Failure" -ErrorRecord $_ + } + + [pscustomobject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + Version = $results.Version + Edition = $server.Edition + Key = $results.Key + } + } + } + } + end { + Test-DbaDeprecation -DeprecatedOn "1.0.0" -EnableException:$false -Alias Get-SqlServerKey + Test-DbaDeprecation -DeprecatedOn "1.0.0" -EnableException:$false -Alias Get-DbaSqlProductKey + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function Get-DbaQueryExecutionTime { + <# + .SYNOPSIS + Displays Stored Procedures and Ad hoc queries with the highest execution times. Works on SQL Server 2008 and above. + + .DESCRIPTION + Quickly find slow query executions within a database. Results will include stored procedures and individual SQL statements. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Database + The database(s) to process - this list is auto-populated from the server. If unspecified, all databases will be processed. + + .PARAMETER ExcludeDatabase + The database(s) to exclude - this list is auto-populated from the server + + .PARAMETER MaxResultsPerDb + Allows you to limit the number of results returned, as many systems can have very large amounts of query plans. Default value is 100 results. + + .PARAMETER MinExecs + Allows you to limit the scope to queries that have been executed a minimum number of time. Default value is 100 executions. + + .PARAMETER MinExecMs + Allows you to limit the scope to queries with a specified average execution time. Default value is 500 (ms). + + .PARAMETER ExcludeSystem + Allows you to suppress output on system databases + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Query, Performance + Author: Brandon Abshire, netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaQueryExecutionTime + + .EXAMPLE + PS C:\> Get-DbaQueryExecutionTime -SqlInstance sql2008, sqlserver2012 + + Return the top 100 slowest stored procedures or statements for servers sql2008 and sqlserver2012. + + .EXAMPLE + PS C:\> Get-DbaQueryExecutionTime -SqlInstance sql2008 -Database TestDB + + Return the top 100 slowest stored procedures or statements on server sql2008 for only the TestDB database. + + .EXAMPLE + PS C:\> Get-DbaQueryExecutionTime -SqlInstance sql2008 -Database TestDB -MaxResultsPerDb 100 -MinExecs 200 -MinExecMs 1000 + + Return the top 100 slowest stored procedures or statements on server sql2008 for only the TestDB database, limiting results to queries with more than 200 total executions and an execution time over 1000ms or higher. + + #> + [CmdletBinding()] + param ( + [parameter(Position = 0, Mandatory, ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer", "SqlServers")] + [DbaInstanceParameter[]]$SqlInstance, + [Alias("Credential")] + [PSCredential] + $SqlCredential, + [Alias("Databases")] + [object[]]$Database, + [object[]]$ExcludeDatabase, + [parameter(Position = 1)] + [int]$MaxResultsPerDb = 100, + [parameter(Position = 2)] + [int]$MinExecs = 100, + [parameter(Position = 3)] + [int]$MinExecMs = 500, + [parameter(Position = 4)] + [Alias("ExcludeSystemDatabases")] + [switch]$ExcludeSystem, + [Alias('Silent')] + [switch]$EnableException + ) + + begin { + $sql = ";With StatsCTE AS + ( + SELECT + DB_NAME() as DatabaseName, + (total_worker_time / execution_count) / 1000 AS AvgExec_ms , + execution_count , + max_worker_time / 1000 AS MaxExec_ms , + OBJECT_NAME(object_id) as ProcName, + object_id, + type_desc, + cached_time, + last_execution_time, + total_worker_time / 1000 as total_worker_time_ms, + total_elapsed_time / 1000 as total_elapsed_time_ms, + OBJECT_NAME(object_id) as SQLText, + OBJECT_NAME(object_id) as full_statement_text + FROM sys.dm_exec_procedure_stats + WHERE database_id = DB_ID()" + + if ($MinExecs) { $sql += "`n AND execution_count >= " + $MinExecs } + if ($MinExecMs) { $sql += "`n AND (total_worker_time / execution_count) / 1000 >= " + $MinExecMs } + + $sql += "`n UNION + SELECT + DB_NAME() as DatabaseName, + ( qs.total_worker_time / qs.execution_count ) / 1000 AS AvgExec_ms , + qs.execution_count , + qs.max_worker_time / 1000 AS MaxExec_ms , + OBJECT_NAME(st.objectid) as ProcName, + st.objectid as [object_id], + 'STATEMENT' as type_desc, + '1901-01-01 00:00:00' as cached_time, + qs.last_execution_time, + qs.total_worker_time / 1000 as total_worker_time_ms, + qs.total_elapsed_time / 1000 as total_elapsed_time_ms, + SUBSTRING(st.text, (qs.statement_start_offset/2)+1, 50) + '...' AS SQLText, + SUBSTRING(st.text, (qs.statement_start_offset/2)+1, + ((CASE qs.statement_end_offset + WHEN -1 THEN DATALENGTH(st.text) + ELSE qs.statement_end_offset + END - qs.statement_start_offset)/2) + 1) AS full_statement_text + FROM sys.dm_exec_query_stats qs + CROSS APPLY sys.dm_exec_plan_attributes(qs.plan_handle) as pa + CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) as st + WHERE st.dbid = DB_ID() OR (pa.attribute = 'dbid' and pa.value = DB_ID())" + + if ($MinExecs) { $sql += "`n AND execution_count >= " + $MinExecs } + if ($MinExecMs) { $sql += "`n AND (total_worker_time / execution_count) / 1000 >= " + $MinExecMs } + + if ($MaxResultsPerDb) { $sql += ")`n SELECT TOP " + $MaxResultsPerDb } + else { + $sql += ") + SELECT " + } + + $sql += "`n DatabaseName, + AvgExec_ms, + execution_count, + MaxExec_ms, + ProcName, + object_id, + type_desc, + cached_time, + last_execution_time, + total_worker_time_ms, + total_elapsed_time_ms, + SQLText, + full_statement_text + FROM StatsCTE " + + if ($MinExecs -or $MinExecMs) { + $sql += "`n WHERE `n" + + if ($MinExecs) { + $sql += " execution_count >= " + $MinExecs + } + + if ($MinExecMs -gt 0 -and $MinExecs) { + $sql += "`n AND AvgExec_ms >= " + $MinExecMs + } elseif ($MinExecMs) { + $sql += "`n AvgExecs_ms >= " + $MinExecMs + } + } + + $sql += "`n ORDER BY AvgExec_ms DESC" + } + process { + if (!$MaxResultsPerDb -and !$MinExecs -and !$MinExecMs) { + Write-Message -Level Warning -Message "Results may take time, depending on system resources and size of buffer cache." + Write-Message -Level Warning -Message "Consider limiting results using -MaxResultsPerDb, -MinExecs and -MinExecMs parameters." + } + + foreach ($instance in $SqlInstance) { + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential -MinimumVersion 10 + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + $dbs = $server.Databases + if ($Database) { + $dbs = $dbs | Where-Object Name -In $Database + } + + if ($ExcludeSystem) { + $dbs = $dbs | Where-Object { $_.IsSystemObject -eq $false } + } + + if ($ExcludeDatabase) { + $dbs = $dbs | Where-Object Name -NotIn $ExcludeDatabase + } + + foreach ($db in $dbs) { + Write-Message -Level Verbose -Message "Processing $db on $instance" + + if ($db.IsAccessible -eq $false) { + Write-Message -Level Warning -Message "The database $db is not accessible. Skipping database." + continue + } + + try { + foreach ($row in $db.ExecuteWithResults($sql).Tables.Rows) { + [PSCustomObject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + Database = $row.DatabaseName + ProcName = $row.ProcName + ObjectID = $row.object_id + TypeDesc = $row.type_desc + Executions = $row.Execution_Count + AvgExecMs = $row.AvgExec_ms + MaxExecMs = $row.MaxExec_ms + CachedTime = $row.cached_time + LastExecTime = $row.last_execution_time + TotalWorkerTimeMs = $row.total_worker_time_ms + TotalElapsedTimeMs = $row.total_elapsed_time_ms + SQLText = $row.SQLText + FullStatementText = $row.full_statement_text + } | Select-DefaultView -ExcludeProperty FullStatementText + } + } catch { + Stop-Function -Message "Could not process $db on $instance" -Target $db -ErrorRecord $_ -Continue + } + } + } + } +} +function Get-DbaRegistryRoot { + <# + .SYNOPSIS + Uses SQL WMI to find the Registry Root of each SQL Server instance on a computer + + .DESCRIPTION + Uses SQL WMI to find the Registry Root of each SQL Server instance on a computer + + .PARAMETER ComputerName + The target computer. This is not a SQL Server service, though if you pass a named SQL instance, it'll parse properly down to the computer name + + .PARAMETER Credential + Allows you to login to $ComputerName using alternative Windows credentials + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Configuration, Registry + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .EXAMPLE + PS C:\> Get-DbaRegistryRoot + + Gets the registry root for all instances on localhost + + .EXAMPLE + PS C:\> Get-DbaRegistryRoot -ComputerName server1 + + Gets the registry root for all instances on server1 + + #> + [CmdletBinding()] + param ( + [parameter(ValueFromPipeline)] + [DbaInstanceParameter[]]$ComputerName = $env:COMPUTERNAME, + [PSCredential]$Credential, + [Alias('Silent')] + [switch]$EnableException + ) + + process { + foreach ($computer in $computername) { + try { + $sqlwmis = Invoke-ManagedComputerCommand -ComputerName $computer.ComputerName -ScriptBlock { $wmi.Services } -Credential $Credential -ErrorAction Stop | Where-Object DisplayName -match "SQL Server \(" + } catch { + Stop-Function -Message $_ -Target $sqlwmi -Continue + } + + foreach ($sqlwmi in $sqlwmis) { + + $regroot = ($sqlwmi.AdvancedProperties | Where-Object Name -eq REGROOT).Value + $vsname = ($sqlwmi.AdvancedProperties | Where-Object Name -eq VSNAME).Value + $instancename = $sqlwmi.DisplayName.Replace('SQL Server (', '').Replace(')', '') # Don't clown, I don't know regex :( + + if ([System.String]::IsNullOrEmpty($regroot)) { + $regroot = $sqlwmi.AdvancedProperties | Where-Object { $_ -match 'REGROOT' } + $vsname = $sqlwmi.AdvancedProperties | Where-Object { $_ -match 'VSNAME' } + + if (![System.String]::IsNullOrEmpty($regroot)) { + $regroot = ($regroot -Split 'Value\=')[1] + $vsname = ($vsname -Split 'Value\=')[1] + } else { + Write-Message -Level Warning -Message "Can't find instance $vsname on $env:COMPUTERNAME" + return + } + } + + # vsname takes care of clusters + if ([System.String]::IsNullOrEmpty($vsname)) { + $vsname = $computer + if ($instancename -ne "MSSQLSERVER") { + $vsname = "$($computer.ComputerName)\$instancename" + } + } + + Write-Message -Level Verbose -Message "Regroot: $regroot" + Write-Message -Level Verbose -Message "InstanceName: $instancename" + Write-Message -Level Verbose -Message "VSNAME: $vsname" + + [PSCustomObject]@{ + ComputerName = $computer.ComputerName + InstanceName = $instancename + SqlInstance = $vsname + Hive = "HKLM" + Path = $regroot + RegistryRoot = "HKLM:\$regroot" + } + } + } + } + end { + Test-DbaDeprecation -DeprecatedOn "1.0.0" -EnableException:$false -Alias Get-DbaSqlRegistryRoot + } +} +function Get-DbaRepDistributor { + <# + .SYNOPSIS + Gets the information about a replication distributor for a given SQL Server instance. + + .DESCRIPTION + This function locates and enumerates distributor information for a given SQL Server instance. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Replication + Author: William Durkin (@sql_williamd) + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaRepDistributor + + .EXAMPLE + PS C:\> Get-DbaRepDistributor -SqlInstance sql2008, sqlserver2012 + + Retrieve distributor information for servers sql2008 and sqlserver2012. + + #> + [CmdletBinding()] + param ( + [parameter(Position = 0, Mandatory, ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer", "SqlServers")] + [DbaInstanceParameter[]]$SqlInstance, + [parameter(Position = 1)] + [PSCredential]$SqlCredential, + [Alias('Silent')] + [switch]$EnableException + ) + begin { + if ($null -eq [System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.RMO")) { + Stop-Function -Message "Replication management objects not available. Please install SQL Server Management Studio." + } + } + + process { + if (Test-FunctionInterrupt) { return } + + foreach ($instance in $SqlInstance) { + + # connect to the instance + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential -MinimumVersion 9 + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + Write-Message -Level Verbose -Message "Attempting to retrieve distributor information from $instance" + + # Connect to the distributor of the instance + try { + $sourceSqlConn = $server.ConnectionContext.SqlConnectionObject + $distributor = New-Object Microsoft.SqlServer.Replication.ReplicationServer $sourceSqlConn + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + Add-Member -Force -InputObject $distributor -MemberType NoteProperty -Name ComputerName -Value $server.ComputerName + Add-Member -Force -InputObject $distributor -MemberType NoteProperty -Name InstanceName -Value $server.ServiceName + Add-Member -Force -InputObject $distributor -MemberType NoteProperty -Name SqlInstance -Value $server.DomainInstanceName + + Select-DefaultView -InputObject $distributor -Property ComputerName, InstanceName, SqlInstance, IsPublisher, IsDistributor, DistributionServer, DistributionDatabase, DistributorInstalled, DistributorAvailable, HasRemotePublisher + } + } + end { + Test-DbaDeprecation -DeprecatedOn "1.0.0" -EnableException:$false -Alias Get-DbaDistributor + } +} +function Get-DbaRepPublication { + <# + .SYNOPSIS + Displays all publications for a server or database. + + .DESCRIPTION + Quickly find all transactional, merge, and snapshot publications on a specific server or database. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. + + .PARAMETER Database + The database(s) to process. If unspecified, all databases will be processed. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER PublicationType + Limit by specific type of publication. Valid choices include: Transactional, Merge, Snapshot + + .PARAMETER EnableException + byng this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Replication + Author: Colin Douglas + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaRepPublication + + .EXAMPLE + PS C:\> Get-DbaRepPublication -SqlInstance sql2008, sqlserver2012 + + Return all publications for servers sql2008 and sqlserver2012. + + .EXAMPLE + PS C:\> Get-DbaRepPublication -SqlInstance sql2008 -Database TestDB + + Return all publications on server sql2008 for only the TestDB database + + .EXAMPLE + PS C:\> Get-DbaRepPublication -SqlInstance sql2008 -PublicationType Transactional + + Return all publications on server sql2008 for all databases that have Transactional publications + + #> + [CmdletBinding()] + param ( + [parameter(Mandatory, ValueFromPipeline)] + [DbaInstanceParameter[]]$SqlInstance, + [object[]]$Database, + [PSCredential]$SqlCredential, + [ValidateSet("Transactional", "Merge", "Snapshot")] + [object[]]$PublicationType, + [switch]$EnableException + ) + + process { + + foreach ($instance in $SqlInstance) { + + # Connect to Publisher + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential -MinimumVersion 9 + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + $dbList = $server.Databases + + if ($Database) { + $dbList = $dbList | Where-Object name -in $Database + } + + $dbList = $dbList | Where-Object { ($_.ID -gt 4) -and ($_.status -ne "Offline") } + + + foreach ($db in $dbList) { + + if (($db.ReplicationOptions -ne "Published") -and ($db.ReplicationOptions -ne "MergePublished")) { + Write-Message -Level Verbose -Message "Skipping $($db.name). Database is not published." + } + + $repDB = Connect-ReplicationDB -Server $server -Database $db + + $pubTypes = $repDB.TransPublications + $repDB.MergePublications + + if ($PublicationType) { + $pubTypes = $pubTypes | Where-Object Type -in $PublicationType + } + + foreach ($pub in $pubTypes) { + + [PSCustomObject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.InstanceName + SqlInstance = $server.SqlInstance + Server = $server.name + Database = $db.name + PublicationName = $pub.Name + PublicationType = $pub.Type + } + } + } + } + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function Get-DbaRepServer { + <# + .SYNOPSIS + Gets a replication server object + + .DESCRIPTION + Gets a replication server object + + .PARAMETER SqlInstance + The target SQL Server instance or instances + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Replication + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .EXAMPLE + PS C:\> Get-DbaRepServer -SqlInstance sql2016 + + Gets the replication server object for sql2016 using Windows authentication + + .EXAMPLE + PS C:\> Get-DbaRepServer -SqlInstance sql2016 -SqlCredential repadmin + + Gets the replication server object for sql2016 using SQL authentication + + #> + [CmdletBinding()] + param ( + [Parameter(Mandatory, ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [switch]$EnableException + ) + process { + foreach ($instance in $SqlInstance) { + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $sqlcredential + New-Object Microsoft.SqlServer.Replication.ReplicationServer $server.ConnectionContext.SqlConnectionObject + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + } + } +} +function Get-DbaResourceGovernor { + <# + .SYNOPSIS + Gets the Resource Governor object + + .DESCRIPTION + Gets the Resource Governor object + + .PARAMETER SqlInstance + The target SQL Server instance or instances + + .PARAMETER SqlCredential + Allows you to login to SQL Server using alternative credentials + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: ResourceGovernor + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaResourceGovernor + + .EXAMPLE + PS C:\> Get-DbaResourceGovernor -SqlInstance sql2016 + + Gets the resource governor object of the SqlInstance sql2016 + + .EXAMPLE + PS C:\> 'Sql1','Sql2/sqlexpress' | Get-DbaResourceGovernor + + Gets the resource governor object on Sql1 and Sql2/sqlexpress instances + + #> + [CmdletBinding()] + param ( + [parameter(Mandatory, ValueFromPipeline)] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [switch]$EnableException + ) + + process { + foreach ($instance in $SqlInstance) { + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $sqlcredential -MinimumVersion 10 + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + $resourcegov = $server.ResourceGovernor + + if ($resourcegov) { + Add-Member -Force -InputObject $resourcegov -MemberType NoteProperty -Name ComputerName -value $server.ComputerName + Add-Member -Force -InputObject $resourcegov -MemberType NoteProperty -Name InstanceName -value $server.ServiceName + Add-Member -Force -InputObject $resourcegov -MemberType NoteProperty -Name SqlInstance -value $server.DomainInstanceName + } + + Select-DefaultView -InputObject $resourcegov -Property ComputerName, InstanceName, SqlInstance, ClassifierFunction, Enabled, MaxOutstandingIOPerVolume, ReconfigurePending, ResourcePools, ExternalResourcePools + } + } +} +function Get-DbaRgClassifierFunction { + <# + .SYNOPSIS + Gets the Resource Governor custom classifier Function + + .DESCRIPTION + Gets the Resource Governor custom classifier Function which is used for customize the workload groups usage + + .PARAMETER SqlInstance + The target SQL Server instance or instances + + .PARAMETER SqlCredential + Allows you to login to SQL Server using alternative credentials + + .PARAMETER InputObject + Allows input to be piped from Get-DbaResourceGovernor + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Migration, ResourceGovernor + Author: Alessandro Alpi (@suxstellino), alessandroalpi.blog + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaRgClassifierFunction + + .EXAMPLE + PS C:\> Get-DbaRgClassifierFunction -SqlInstance sql2016 + + Gets the classifier function from sql2016 + + .EXAMPLE + PS C:\> 'Sql1','Sql2/sqlexpress' | Get-DbaResourceGovernor | Get-DbaRgClassifierFunction + + Gets the classifier function object on Sql1 and Sql2/sqlexpress instances + + #> + [CmdletBinding()] + param ( + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [parameter(ValueFromPipeline)] + [Microsoft.SqlServer.Management.Smo.ResourceGovernor[]]$InputObject, + [switch]$EnableException + ) + + process { + foreach ($instance in $SqlInstance) { + $InputObject += Get-DbaResourceGovernor -SqlInstance $SqlInstance -SqlCredential $SqlCredential + } + + foreach ($resourcegov in $InputObject) { + $server = $resourcegov.Parent + $classifierFunction = $null + + foreach ($currentFunction in $server.Databases["master"].UserDefinedFunctions) { + $fullyQualifiedFunctionName = [string]::Format("[{0}].[{1}]", $currentFunction.Schema, $currentFunction.Name) + if ($fullyQualifiedFunctionName -eq $InputObject.ClassifierFunction) { + $classifierFunction = $currentFunction + } + } + + if ($classifierFunction) { + Add-Member -Force -InputObject $classifierFunction -MemberType NoteProperty -Name ComputerName -value $resourcegov.ComputerName + Add-Member -Force -InputObject $classifierFunction -MemberType NoteProperty -Name InstanceName -value $resourcegov.InstanceName + Add-Member -Force -InputObject $classifierFunction -MemberType NoteProperty -Name SqlInstance -value $resourcegov.SqlInstance + Add-Member -Force -InputObject $classifierFunction -MemberType NoteProperty -Name Database -value 'master' + } + + Select-DefaultView -InputObject $classifierFunction -Property ComputerName, InstanceName, SqlInstance, Database, Schema, CreateDate, DateLastModified, Name, DataType + } + } +} +function Get-DbaRgResourcePool { + <# + .SYNOPSIS + Gets Resource Governor Pool objects, including internal or external + + .DESCRIPTION + Gets Resource Governor Pool objects, including internal or external + + .PARAMETER SqlInstance + The target SQL Server instance or instances + + .PARAMETER SqlCredential + Allows you to login to SQL Server using alternative credentials + + .PARAMETER InputObject + Allows input to be piped from Get-DbaResourceGovernor + + .PARAMETER Type + Internal or External + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: ResourceGovernor + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaRgResourcePool + + .EXAMPLE + PS C:\> Get-DbaRgResourcePool -SqlInstance sql2016 + + Gets the internal resource pools on sql2016 + + .EXAMPLE + PS C:\> 'Sql1','Sql2/sqlexpress' | Get-DbaResourceGovernor | Get-DbaRgResourcePool + + Gets the internal resource pools on Sql1 and Sql2/sqlexpress instances + + .EXAMPLE + PS C:\> 'Sql1','Sql2/sqlexpress' | Get-DbaResourceGovernor | Get-DbaRgResourcePool -Type External + + Gets the external resource pools on Sql1 and Sql2/sqlexpress instances + + + #> + [CmdletBinding()] + param ( + [Parameter(ValueFromPipeline)] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [ValidateSet("Internal", "External")] + [string]$Type = "Internal", + [parameter(ValueFromPipeline)] + [Microsoft.SqlServer.Management.Smo.ResourceGovernor[]]$InputObject, + [switch]$EnableException + ) + + process { + foreach ($instance in $SqlInstance) { + $InputObject += Get-DbaResourceGovernor -SqlInstance $SqlInstance -SqlCredential $SqlCredential + } + + foreach ($resourcegov in $InputObject) { + if ($Type -eq "External") { + $respool = $resourcegov.ExternalResourcePools + if ($respool) { + $respool | Add-Member -Force -MemberType NoteProperty -Name ComputerName -value $resourcegov.ComputerName + $respool | Add-Member -Force -MemberType NoteProperty -Name InstanceName -value $resourcegov.InstanceName + $respool | Add-Member -Force -MemberType NoteProperty -Name SqlInstance -value $resourcegov.SqlInstance + $respool | Select-DefaultView -Property ComputerName, InstanceName, SqlInstance, Id, Name, CapCpuPercentage, IsSystemObject, MaximumCpuPercentage, MaximumIopsPerVolume, MaximumMemoryPercentage, MinimumCpuPercentage, MinimumIopsPerVolume, MinimumMemoryPercentage, WorkloadGroups + } + } else { + $respool = $resourcegov.ResourcePools + if ($respool) { + $respool | Add-Member -Force -MemberType NoteProperty -Name ComputerName -value $resourcegov.ComputerName + $respool | Add-Member -Force -MemberType NoteProperty -Name InstanceName -value $resourcegov.InstanceName + $respool | Add-Member -Force -MemberType NoteProperty -Name SqlInstance -value $resourcegov.SqlInstance + $respool | Select-DefaultView -Property ComputerName, InstanceName, SqlInstance, Id, Name, CapCpuPercentage, IsSystemObject, MaximumCpuPercentage, MaximumIopsPerVolume, MaximumMemoryPercentage, MinimumCpuPercentage, MinimumIopsPerVolume, MinimumMemoryPercentage, WorkloadGroups + } + } + } + } +} +function Get-DbaRgWorkloadGroup { + <# + .SYNOPSIS + Gets all Resource Governor Pool objects, including both internal and external + + .DESCRIPTION + Gets all Resource Governor Pool objects, including both internal and external + + .PARAMETER SqlInstance + The target SQL Server instance or instances + + .PARAMETER SqlCredential + Allows you to login to SQL Server using alternative credentials + + .PARAMETER InputObject + Allows input to be piped from Get-DbaRgResourcePool + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: ResourceGovernor + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaRgWorkloadGroup + + .EXAMPLE + PS C:\> Get-DbaRgWorkloadGroup -SqlInstance sql2017 + + Gets the workload groups on sql2017 + + .EXAMPLE + PS C:\> Get-DbaResourceGovernor -SqlInstance sql2017 | Get-DbaRgResourcePool | Get-DbaRgWorkloadGroup + + Gets the workload groups on sql2017 + + #> + [CmdletBinding()] + param ( + [parameter(ValueFromPipeline)] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [parameter(ValueFromPipeline)] + [Microsoft.SqlServer.Management.Smo.ResourcePool[]]$InputObject, + [switch]$EnableException + ) + + process { + foreach ($instance in $SqlInstance) { + $InputObject += Get-DbaRgResourcePool -SqlInstance $SqlInstance -SqlCredential $SqlCredential + } + + foreach ($pool in $InputObject) { + $group = $pool.WorkloadGroups + if ($group) { + $group | Add-Member -Force -MemberType NoteProperty -Name ComputerName -value $pool.ComputerName + $group | Add-Member -Force -MemberType NoteProperty -Name InstanceName -value $pool.InstanceName + $group | Add-Member -Force -MemberType NoteProperty -Name SqlInstance -value $pool.SqlInstance + $group | Select-DefaultView -Property ComputerName, InstanceName, SqlInstance, Id, Name, ExternalResourcePoolName, GroupMaximumRequests, Importance, IsSystemObject, MaximumDegreeOfParallelism, RequestMaximumCpuTimeInSeconds, RequestMaximumMemoryGrantPercentage, RequestMemoryGrantTimeoutInSeconds + } + } + } +} +#ValidationTags#CodeStyle,Messaging,FlowControl,Pipeline# +function Get-DbaRunningJob { + <# + .SYNOPSIS + Returns all non-idle Agent jobs running on the server + + .DESCRIPTION + This function returns agent jobs that active on the SQL Server instance when calling the command + + .PARAMETER SqlInstance + The target SQL Server instance or instances + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER InputObject + Enables piped input from Get-DbaAgentJob + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Agent, Job + Author: Stephen Bennett, https://sqlnotesfromtheunderground.wordpress.com/ + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaRunningJob + + .EXAMPLE + PS C:\> Get-DbaRunningJob -SqlInstance sql2017 + + Returns any active jobs on sql2017 + + .EXAMPLE + PS C:\> Get-DbaAgentJob -SqlInstance sql2017, sql2019 | Get-DbaRunningJob + + Returns all active jobs on multiple instances piped into the function. + + .EXAMPLE + PS C:\> $servers | Get-DbaRunningJob + + Returns all active jobs on multiple instances piped into the function. + + #> + [CmdletBinding()] + param ( + [parameter(ValueFromPipeline)] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [parameter(ValueFromPipeline)] + [Microsoft.SqlServer.Management.Smo.Agent.Job[]]$InputObject, + [switch]$EnableException + ) + process { + if ($SqlInstance) { + Get-DbaAgentJob -SqlInstance $SqlInstance -SqlCredential $SqlCredential | Where-Object CurrentRunStatus -ne 'Idle' + } + + $InputObject | Where-Object CurrentRunStatus -ne 'Idle' + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function Get-DbaSchemaChangeHistory { + <# + .SYNOPSIS + Gets DDL changes logged in the system trace. + + .DESCRIPTION + Queries the default system trace for any DDL changes in the specified time frame + Only works with SQL 2005 and later, as the system trace didn't exist before then + + .PARAMETER SqlInstance + The target SQL Server instance or instances. This can be a collection and receive pipeline input to allow the function to be executed against multiple SQL Server instances. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Database + The database(s) to process - this list is auto-populated from the server. If unspecified, all databases will be processed. + + .PARAMETER ExcludeDatabase + The database(s) to exclude - this list is auto-populated from the server + + .PARAMETER Since + A date from which DDL changes should be returned. Default is to start at the beginning of the current trace file + + .PARAMETER Object + The name of a SQL Server object you want to look for changes on + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Migration, Backup, Database + Author: Stuart Moore (@napalmgram - http://stuart-moore.com) + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaSchemaChangeHistory + + .EXAMPLE + PS C:\> Get-DbaSchemaChangeHistory -SqlInstance localhost + + Returns all DDL changes made in all databases on the SQL Server instance localhost since the system trace began + + .EXAMPLE + PS C:\> Get-DbaSchemaChangeHistory -SqlInstance localhost -Since (Get-Date).AddDays(-7) + + Returns all DDL changes made in all databases on the SQL Server instance localhost in the last 7 days + + .EXAMPLE + PS C:\> Get-DbaSchemaChangeHistory -SqlInstance localhost -Database Finance, Prod -Since (Get-Date).AddDays(-7) + + Returns all DDL changes made in the Prod and Finance databases on the SQL Server instance localhost in the last 7 days + + .EXAMPLE + PS C:\> Get-DbaSchemaChangeHistory -SqlInstance localhost -Database Finance -Object AccountsTable -Since (Get-Date).AddDays(-7) + + Returns all DDL changes made to the AccountsTable object in the Finance database on the SQL Server instance localhost in the last 7 days + + #> + [CmdletBinding()] + param ( + [parameter(Position = 0, Mandatory, ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [Alias("Credential")] + [PSCredential] + $SqlCredential, + [Alias("Databases")] + [object[]]$Database, + [object[]]$ExcludeDatabase, + [DbaDateTime]$Since, + [string[]]$Object, + [Alias('Silent')] + [switch]$EnableException + ) + + process { + foreach ($instance in $SqlInstance) { + + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + if ($Server.Version.Major -le 8) { + Stop-Function -Message "This command doesn't support SQL Server 2000, sorry about that" + return + } + $TraceFileQuery = "select path from sys.traces where is_default = 1" + + $TraceFile = $server.Query($TraceFileQuery) | Select-Object Path + + $Databases = $server.Databases + + if ($Database) { $Databases = $Databases | Where-Object Name -in $database } + + if ($ExcludeDatabase) { $Databases = $Databases | Where-Object Name -notin $ExcludeDatabase } + + foreach ($db in $Databases) { + if ($db.IsAccessible -eq $false) { + Write-Message -Level Verbose -Message "$($db.name) is not accessible, skipping" + } + + $sql = "select SERVERPROPERTY('MachineName') AS ComputerName, + ISNULL(SERVERPROPERTY('InstanceName'), 'MSSQLSERVER') AS InstanceName, + SERVERPROPERTY('ServerName') AS SqlInstance, + tt.databasename as 'DatabaseName', + starttime as 'DateModified', + Sessionloginname as 'LoginName', + NTusername as 'UserName', + applicationname as 'ApplicationName', + case eventclass + When '46' Then 'Create' + when '47' Then 'Drop' + when '164' then 'Alter' + end as 'DDLOperation', + s.name+'.'+o.name as 'Object', + o.type_desc as 'ObjectType' + from + sys.objects o inner join + sys.schemas s on s.schema_id=o.schema_id + cross apply (select * from ::fn_trace_gettable('$($TraceFile.path)',default) where ObjectID=o.object_id ) tt + where tt.objecttype not in (21587) + and tt.DatabaseID=db_id() + and tt.EventSubClass=0" + + if ($null -ne $since) { + $sql = $sql + " and tt.StartTime>'$Since' " + } + if ($null -ne $object) { + $sql = $sql + " and o.name in ('$($object -join ''',''')') " + } + + $sql = $sql + " order by tt.StartTime asc" + Write-Message -Level Verbose -Message "Querying Database $db on $instance" + Write-Message -Level Debug -Message "SQL: $sql" + + $db.Query($sql) | Select-DefaultView -Property ComputerName, InstanceName, SqlInstance, DatabaseName, DateModified, LoginName, UserName, ApplicationName, DDLOperation, Object, ObjectType + } + } + } +} +function Get-DbaServerAudit { + <# + .SYNOPSIS + Gets SQL Security Audit information for each instance(s) of SQL Server. + + .DESCRIPTION + The Get-DbaServerAudit command gets SQL Security Audit information for each instance(s) of SQL Server. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. This can be a collection and receive pipeline input to allow the function + to be executed against multiple SQL Server instances. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Audit + Return only specific audits + + .PARAMETER ExcludeAudit + Exclude specific audits + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Audit, Security, SqlAudit + Author: Garry Bargsley (@gbargsley), http://blog.garrybargsley.com + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaServerAudit + + .EXAMPLE + PS C:\> Get-DbaServerAudit -SqlInstance localhost + + Returns all Security Audits on the local default SQL Server instance + + .EXAMPLE + PS C:\> Get-DbaServerAudit -SqlInstance localhost, sql2016 + + Returns all Security Audits for the local and sql2016 SQL Server instances + + #> + [CmdletBinding()] + param ( + [parameter(Position = 0, Mandatory, ValueFromPipeline)] + [DbaInstanceParameter[]]$SqlInstance, + [Alias("Credential")] + [PSCredential]$SqlCredential, + [string[]]$Audit, + [string[]]$ExcludeAudit, + [Alias('Silent')] + [switch]$EnableException + ) + + process { + foreach ($instance in $SqlInstance) { + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential -MinimumVersion 10 + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + $audits = $server.Audits + + if (Test-Bound -ParameterName Audit) { + $audits = $audits | Where-Object Name -in $Audit + } + if (Test-Bound -ParameterName ExcludeAudit) { + $audits = $audits | Where-Object Name -notin $ExcludeAudit + } + + foreach ($currentaudit in $audits) { + $directory = $currentaudit.FilePath.TrimEnd("\") + $filename = $currentaudit.FileName + $fullname = "$directory\$filename" + $remote = $fullname.Replace(":", "$") + $remote = "\\$($currentaudit.Parent.ComputerName)\$remote" + + Add-Member -Force -InputObject $currentaudit -MemberType NoteProperty -Name ComputerName -value $currentaudit.Parent.ComputerName + Add-Member -Force -InputObject $currentaudit -MemberType NoteProperty -Name InstanceName -value $currentaudit.Parent.ServiceName + Add-Member -Force -InputObject $currentaudit -MemberType NoteProperty -Name SqlInstance -value $currentaudit.Parent.DomainInstanceName + Add-Member -Force -InputObject $currentaudit -MemberType NoteProperty -Name FullName -value $fullname + Add-Member -Force -InputObject $currentaudit -MemberType NoteProperty -Name RemoteFullName -value $remote + + Select-DefaultView -InputObject $currentaudit -Property ComputerName, InstanceName, SqlInstance, Name, 'Enabled as IsEnabled', FullName + } + } + } +} +function Get-DbaServerAuditSpecification { + <# + .SYNOPSIS + Gets SQL Security Audit Specification information for each instance(s) of SQL Server. + + .DESCRIPTION + The Get-DbaServerAuditSpecification command gets SQL Security Audit Specification information for each instance(s) of SQL Server. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. This can be a collection and receive pipeline input to allow the function + to be executed against multiple SQL Server instances. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Audit, Security, SqlAudit + Author: Garry Bargsley (@gbargsley), http://blog.garrybargsley.com + + dbatools PowerShell module (https://dbatools.io, clemaire@gmail.com) + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaServerAuditSpecification + + .EXAMPLE + PS C:\> Get-DbaServerAuditSpecification -SqlInstance localhost + + Returns all Security Audit Specifications on the local default SQL Server instance + + .EXAMPLE + PS C:\> Get-DbaServerAuditSpecification -SqlInstance localhost, sql2016 + + Returns all Security Audit Specifications for the local and sql2016 SQL Server instances + + #> + [CmdletBinding()] + param ( + [parameter(Position = 0, Mandatory, ValueFromPipeline)] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [Alias('Silent')] + [switch]$EnableException + ) + + process { + foreach ($instance in $SqlInstance) { + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential -MinimumVersion 10 + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + foreach ($auditSpecification in $server.ServerAuditSpecifications) { + Add-Member -Force -InputObject $auditSpecification -MemberType NoteProperty -Name ComputerName -value $server.ComputerName + Add-Member -Force -InputObject $auditSpecification -MemberType NoteProperty -Name InstanceName -value $server.ServiceName + Add-Member -Force -InputObject $auditSpecification -MemberType NoteProperty -Name SqlInstance -value $server.DomainInstanceName + + Select-DefaultView -InputObject $auditSpecification -Property ComputerName, InstanceName, SqlInstance, ID, Name, AuditName, Enabled, CreateDate, DateLastModified, Guid + } + } + } + end { + Test-DbaDeprecation -DeprecatedOn "1.0.0" -EnableException:$false -Alias Get-SqlServerAuditSpecification + } +} +function Get-DbaServerInstallDate { + <# + .SYNOPSIS + Returns the install date of a SQL Instance and Windows Server. + + .DESCRIPTION + This command returns: + SqlInstallDate + WindowsInstallDate (use -IncludeWindows) + + .PARAMETER SqlInstance + The target SQL Server instance or instances. + + .PARAMETER SqlCredential + Credential object used to connect to the SQL Server using SQL Authentication as a different user + + .PARAMETER Credential + Credential object used to connect to the SQL Server as a different Windows user + + .PARAMETER IncludeWindows + Includes the Windows Server Install date information + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Install + Author: Mitchell Hamann (@SirCaptainMitch), mitchellhamann.com + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaServerInstallDate + + .EXAMPLE + PS C:\> Get-DbaServerInstallDate -SqlInstance SqlBox1\Instance2 + + Returns an object with SQL Instance Install date as a string. + + .EXAMPLE + PS C:\> Get-DbaServerInstallDate -SqlInstance winserver\sqlexpress, sql2016 + + Returns an object with SQL Instance Install date as a string for both SQLInstances that are passed to the cmdlet. + + .EXAMPLE + PS C:\> 'sqlserver2014a', 'sql2016' | Get-DbaServerInstallDate + + Returns an object with SQL Instance Install date as a string for both SQLInstances that are passed to the cmdlet via the pipeline. + + .EXAMPLE + PS C:\> Get-DbaServerInstallDate -SqlInstance sqlserver2014a, sql2016 -IncludeWindows + + Returns an object with the Windows Install date and the SQL install date as a string. + + .EXAMPLE + PS C:\> Get-DbaCmsRegServer -SqlInstance sql2014 | Get-DbaServerInstallDate + + Returns an object with SQL Instance install date as a string for every server listed in the Central Management Server on sql2014 + + #> + [CmdletBinding()] + param ( + [parameter(Mandatory, ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer", "ComputerName")] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential] + $SqlCredential, + [PSCredential] + $Credential, + [Switch]$IncludeWindows, + [Alias('Silent')] + [switch]$EnableException + ) + + process { + foreach ($instance in $SqlInstance) { + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential + } catch { + Stop-Function -Message "Failed to process Instance $Instance" -ErrorRecord $_ -Target $instance -Continue + } + + if ($server.VersionMajor -ge 9) { + Write-Message -Level Verbose -Message "Getting Install Date for: $instance" + $sql = "SELECT create_date FROM sys.server_principals WHERE sid = 0x010100000000000512000000" + [DbaDateTime]$sqlInstallDate = $server.Query($sql, 'master', $true).create_date + + } else { + Write-Message -Level Verbose -Message "Getting Install Date for: $instance" + $sql = "SELECT schemadate FROM sysservers" + [DbaDateTime]$sqlInstallDate = $server.Query($sql, 'master', $true).create_date + } + + $WindowsServerName = $server.ComputerNamePhysicalNetBIOS + + if ($IncludeWindows) { + try { + [DbaDateTime]$windowsInstallDate = (Get-DbaCmObject -ClassName win32_OperatingSystem -ComputerName $WindowsServerName -Credential $Credential -EnableException).InstallDate + } catch { + Stop-Function -Message "Failed to connect to: $WindowsServerName" -Continue -Target $instance -ErrorRecord $_ + } + } + + $object = [PSCustomObject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + SqlInstallDate = $sqlInstallDate + WindowsInstallDate = $windowsInstallDate + } + + if ($IncludeWindows) { + Select-DefaultView -InputObject $object -Property ComputerName, InstanceName, SqlInstance, SqlInstallDate, WindowsInstallDate + } else { + Select-DefaultView -InputObject $object -Property ComputerName, InstanceName, SqlInstance, SqlInstallDate + } + + } + } +} +function Get-DbaServerProtocol { + <# + .SYNOPSIS + Gets the SQL Server related server protocols on a computer. + + .DESCRIPTION + Gets the SQL Server related server protocols on one or more computers. + + Requires Local Admin rights on destination computer(s). + The server protocols can be enabled and disabled when retrieved via WSMan. + + .PARAMETER ComputerName + The target SQL Server instance or instances. + + .PARAMETER Credential + Credential object used to connect to the computer as a different user. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Protocol + Author: Klaas Vandenberghe ( @PowerDBAKlaas ) + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaServerProtocol + + .EXAMPLE + PS C:\> Get-DbaServerProtocol -ComputerName sqlserver2014a + + Gets the SQL Server related server protocols on computer sqlserver2014a. + + .EXAMPLE + PS C:\> 'sql1','sql2','sql3' | Get-DbaServerProtocol + + Gets the SQL Server related server protocols on computers sql1, sql2 and sql3. + + .EXAMPLE + PS C:\> Get-DbaServerProtocol -ComputerName sql1,sql2 | Out-GridView + + Gets the SQL Server related server protocols on computers sql1 and sql2, and shows them in a grid view. + + .EXAMPLE + PS C:\> (Get-DbaServerProtocol -ComputerName sql1 | Where { $_.DisplayName = 'via' }).Disable() + + Disables the VIA ServerNetworkProtocol on computer sql1. + If successful, return code 0 is shown. + + #> + [CmdletBinding()] + param ( + [parameter(ValueFromPipeline)] + [Alias("cn", "host", "Server")] + [DbaInstanceParameter[]]$ComputerName = $env:COMPUTERNAME, + [PSCredential]$Credential, + [Alias('Silent')] + [switch]$EnableException + ) + + process { + foreach ($Computer in $ComputerName.ComputerName) { + $Server = Resolve-DbaNetworkName -ComputerName $Computer -Credential $credential + if ($Server.FullComputerName) { + $Computer = $server.FullComputerName + Write-Message -Level Verbose -Message "Getting SQL Server namespace on $computer" + $namespace = Get-DbaCmObject -ComputerName $Computer -NameSpace root\Microsoft\SQLServer -Query "Select * FROM __NAMESPACE WHERE Name Like 'ComputerManagement%'" -ErrorAction SilentlyContinue | + Where-Object { (Get-DbaCmObject -ComputerName $Computer -Namespace $("root\Microsoft\SQLServer\" + $_.Name) -ClassName ServerNetworkProtocol -ErrorAction SilentlyContinue).count -gt 0 } | + Sort-Object Name -Descending | Select-Object -First 1 + if ($namespace.Name) { + Write-Message -Level Verbose -Message "Getting Cim class ServerNetworkProtocol in Namespace $($namespace.Name) on $Computer" + try { + $prot = Get-DbaCmObject -ComputerName $Computer -Namespace $("root\Microsoft\SQLServer\" + $namespace.Name) -ClassName ServerNetworkProtocol -ErrorAction SilentlyContinue + $prot | Add-Member -Force -MemberType ScriptMethod -Name Enable -Value { Invoke-CimMethod -MethodName SetEnable -InputObject $this } + $prot | Add-Member -Force -MemberType ScriptMethod -Name Disable -Value { Invoke-CimMethod -MethodName SetDisable -InputObject $this } + foreach ($protocol in $prot) { Select-DefaultView -InputObject $protocol -Property 'PSComputerName as ComputerName', 'InstanceName', 'ProtocolDisplayName as DisplayName', 'ProtocolName as Name', 'MultiIpconfigurationSupport as MultiIP', 'Enabled as IsEnabled' } + } catch { + Write-Message -Level Warning -Message "No Sql ServerNetworkProtocol found on $Computer" + } + } else { + Write-Message -Level Warning -Message "No ComputerManagement Namespace on $Computer. Please note that this function is available from SQL 2005 up." + } + } else { + Write-Message -Level Warning -Message "Failed to connect to $Computer" + } + } + } +} +function Get-DbaServerRole { + <# + .SYNOPSIS + Gets the list of server-level roles. + + .DESCRIPTION + Gets the list of server-level roles for SQL Server instance. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. Server version must be SQL Server version 2005 or higher. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER ServerRole + Server-Level role to filter results to that role only. + + .PARAMETER ExcludeServerRole + Server-Level role to exclude from results. + + .PARAMETER ExcludeFixedRole + Filter the fixed server-level roles. Only applies to SQL Server 2017 that supports creation of server-level roles. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: ServerRole, Security + Author: Shawn Melton (@wsmelton) + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaServerRole + + .EXAMPLE + PS C:\> Get-DbaServerRole -SqlInstance sql2016a + + Outputs list of server-level roles for sql2016a instance. + + .EXAMPLE + PS C:\> Get-DbaServerRole -SqlInstance sql2017a -ExcludeFixedRole + + Outputs the server-level role(s) that are not fixed roles on sql2017a instance. + + #> + [CmdletBinding()] + param ( + [Parameter(Position = 0, Mandatory, ValueFromPipeline)] + [DbaInstance[]]$SqlInstance, + [PSCredential]$SqlCredential, + [string[]]$ServerRole, + [string[]]$ExcludeServerRole, + [switch]$ExcludeFixedRole, + [switch]$EnableException + ) + + process { + foreach ($instance in $SqlInstance) { + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + $serverroles = $server.Roles + + if ($ServerRole) { + $serverroles = $serverroles | Where-Object Name -In $ServerRole + } + if ($ExcludeServerRole) { + $serverroles = $serverroles | Where-Object Name -NotIn $ExcludeServerRole + } + if ($ExcludeFixedRole) { + $serverroles = $serverroles | Where-Object IsFixedRole -eq $false + } + + foreach ($role in $serverroles) { + $members = $role.EnumMemberNames() + + Add-Member -Force -InputObject $role -MemberType NoteProperty -Name Login -Value $members + Add-Member -Force -InputObject $role -MemberType NoteProperty -Name ComputerName -value $server.ComputerName + Add-Member -Force -InputObject $role -MemberType NoteProperty -Name InstanceName -value $server.ServiceName + Add-Member -Force -InputObject $role -MemberType NoteProperty -Name SqlInstance -value $server.DomainInstanceName + + $default = 'ComputerName', 'InstanceName', 'SqlInstance', 'Name as Role', 'IsFixedRole', 'DateCreated', 'DateModified' + Select-DefaultView -InputObject $role -Property $default + } + } + } +} +function Get-DbaServerRoleMember { + <# + .SYNOPSIS + Get members of server roles for each instance(s) of SQL Server. + + .DESCRIPTION + The Get-DbaServerRoleMember returns connected SMO object for server roles for each instance(s) of SQL Server. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. This can be a collection and receive pipeline input to allow the function to be executed against multiple SQL Server instances. + + .PARAMETER SqlCredential + Login to the target instance using alternate Windows or SQL Login Authentication. Accepts credential objects (Get-Credential). + + .PARAMETER ServerRole + The role(s) to process. If unspecified, all roles will be processed. + + .PARAMETER ExcludeServerRole + The role(s) to exclude. + + .PARAMETER Login + The login(s) to process. If unspecified, all logins will be processed. + + .PARAMETER ExcludeFixedRole + Filter the fixed server-level roles. Only applies to SQL Server 2017 that supports creation of server-level roles. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: ServerRole, Security, Login + Author: Klaas Vandenberghe (@PowerDBAKlaas) + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaServerRoleMember + + .EXAMPLE + PS C:\> Get-DbaServerRoleMember -SqlInstance localhost + + Returns all members of all server roles on the local default SQL Server instance + + .EXAMPLE + PS C:\> Get-DbaServerRoleMember -SqlInstance localhost, sql2016 + + Returns all members of all server roles on the local and sql2016 SQL Server instances + + .EXAMPLE + PS C:\> $servers = Get-Content C:\servers.txt + PS C:\> $servers | Get-DbaServerRoleMember + + Returns all members of all server roles for every server in C:\servers.txt + + .EXAMPLE + PS C:\> Get-DbaServerRoleMember -SqlInstance localhost -ServerRole 'sysadmin', 'dbcreator' + + Returns all members of the sysadmin or dbcreator roles on localhost. + + .EXAMPLE + PS C:\> Get-DbaServerRoleMember -SqlInstance localhost -ExcludeServerRole 'sysadmin' + + Returns all members of server-level roles other than sysadmin. + + .EXAMPLE + PS C:\> Get-DbaServerRoleMember -SqlInstance sql2017a -ExcludeFixedRole + + Returns all members of server-level role(s) that are not fixed roles on sql2017a instance. + + .EXAMPLE + PS C:\> Get-DbaServerRoleMember -SqlInstance localhost -Login 'MyFriendlyDeveloper' + + Returns all server-level role(s) for the MyFriendlyDeveloper login on localhost. + + #> + [CmdletBinding()] + param ( + [parameter(Position = 0, Mandatory, ValueFromPipeline)] + [Alias('ServerInstance', 'SqlServer')] + [DbaInstanceParameter[]]$SqlInstance, + [Alias('Credential')] + [PSCredential]$SqlCredential, + [string[]]$ServerRole, + [string[]]$ExcludeServerRole, + [object[]]$Login, + [switch]$ExcludeFixedRole, + [Alias('Silent')] + [switch]$EnableException + ) + + process { + foreach ($instance in $SqlInstance) { + Write-Message -Level Verbose -Message "Attempting to connect to $instance" + + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential + } catch { + Stop-Function -Message 'Failure' -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + $roles = $server.Roles + + if (Test-Bound -ParameterName 'Login') { + try { + $logins = Get-DbaLogin -SqlInstance $server -Login $Login -EnableException + } catch { + Stop-Function -Message "Issue gathering login details" -ErrorRecord $_ -Target $instance + } + Write-Message -Level 'Verbose' -Message "Filtering by logins: $($logins -join ', ')" + foreach ($l in $logins) { + $loginRoles += $l.ListMembers() + } + + $loginRoles = $loginRoles | Select-Object -Unique + Write-Message -Level 'Verbose' -Message "Filtering by roles: $($loginRoles -join ', ')" + + $roles = $roles | Where-Object { $_.Name -in $loginRoles } + } + + if (Test-Bound -ParameterName 'ServerRole') { + $roles = $roles | Where-Object { $_.Name -in $ServerRole } + } + + if (Test-Bound -ParameterName 'ExcludeServerRole') { + $roles = $roles | Where-Object { $_.Name -notin $ExcludeServerRole } + } + + if (Test-Bound -ParameterName 'ExcludeFixedRole') { + $roles = $roles | Where-Object { $_.IsFixedRole -eq $false } + } + + foreach ($role in $roles) { + Write-Message -Level 'Verbose' -Message "Getting Server Role Members for $role on $instance" + + $members = $role.EnumMemberNames() + Write-Message -Level 'Verbose' -Message "$role members: $($members -join ', ')" + + if (Test-Bound -ParameterName 'Login') { + Write-Message -Level 'Verbose' -Message "Only returning results for $($logins.Name -join ', ')" + $members = $members | Where-Object { $_ -in $logins.Name } + } + + foreach ($member in $members) { + $l = $server.Logins | Where-Object { $_.Name -eq $member } + + if ($l) { + Add-Member -Force -InputObject $l -MemberType NoteProperty -Name ComputerName -Value $server.ComputerName + Add-Member -Force -InputObject $l -MemberType NoteProperty -Name InstanceName -Value $server.ServiceName + Add-Member -Force -InputObject $l -MemberType NoteProperty -Name SqlInstance -Value $server.DomainInstanceName + Add-Member -Force -InputObject $l -MemberType NoteProperty -Name Role -Value $role.Name + + # Select object because Select-DefaultView causes strange behaviors when assigned to a variable (??) + Select-Object -InputObject $l -Property 'ComputerName', 'InstanceName', 'SqlInstance', 'Role', 'Name' + } + } + } + } + } +} +function Get-DbaServerTrigger { + <# + .SYNOPSIS + Get all existing server triggers on one or more SQL instances. + + .DESCRIPTION + Get all existing server triggers on one or more SQL instances. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. + + .PARAMETER SqlCredential + SqlCredential object used to connect to the SQL Server as a different user. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Database, Trigger + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaServerTrigger + + .EXAMPLE + PS C:\> Get-DbaServerTrigger -SqlInstance sql2017 + + Returns all server triggers on sql2017 + + #> + [CmdletBinding()] + param ( + [Parameter(Mandatory, ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [switch]$EnableException + ) + + process { + foreach ($Instance in $SqlInstance) { + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $sqlcredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + foreach ($trigger in $server.Triggers) { + try { + Add-Member -Force -InputObject $trigger -MemberType NoteProperty -Name ComputerName -value $server.ComputerName + Add-Member -Force -InputObject $trigger -MemberType NoteProperty -Name InstanceName -value $server.ServiceName + Add-Member -Force -InputObject $trigger -MemberType NoteProperty -Name SqlInstance -value $server.DomainInstanceName + Select-DefaultView -InputObject $trigger -Property ComputerName, InstanceName, SqlInstance, ID, Name, AnsiNullsStatus, AssemblyName, BodyStartIndex, ClassName, CreateDate, DateLastModified, DdlTriggerEvents, ExecutionContext, ExecutionContextLogin, ImplementationType, IsDesignMode, IsEnabled, IsEncrypted, IsSystemObject, MethodName, QuotedIdentifierStatus, State, TextHeader, TextMode + } catch { + Stop-Function -Message "Failure" -ErrorRecord $_ -Continue + } + } + } + } +} +function Get-DbaService { + <# + .SYNOPSIS + Gets the SQL Server related services on a computer. + + .DESCRIPTION + Gets the SQL Server related services on one or more computers. + + Requires Local Admin rights on destination computer(s). + + .PARAMETER ComputerName + The target SQL Server instance or instances. + + .PARAMETER InstanceName + Only returns services that belong to the specific instances. + + .PARAMETER Credential + Credential object used to connect to the computer as a different user. + + .PARAMETER Type + Use -Type to collect only services of the desired SqlServiceType. + Can be one of the following: "Agent","Browser","Engine","FullText","SSAS","SSIS","SSRS", "PolyBase" + + .PARAMETER ServiceName + Can be used to specify service names explicitly, without looking for service types/instances. + + .PARAMETER AdvancedProperties + Collect additional properties from the SqlServiceAdvancedProperty Namespace + This collects information about Version, Service Pack Level", SkuName, Clustered status and the Cluster Service Name + This adds additional overhead to the command. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Service, SqlServer, Instance, Connect + Author: Klaas Vandenberghe ( @PowerDBAKlaas ) + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaService + + .EXAMPLE + PS C:\> Get-DbaService -ComputerName sqlserver2014a + + Gets the SQL Server related services on computer sqlserver2014a. + + .EXAMPLE + PS C:\> 'sql1','sql2','sql3' | Get-DbaService -AdvancedProperties + + Gets the SQL Server related services on computers sql1, sql2 and sql3. Includes Advanced Properties from the SqlServiceAdvancedProperty Namespace + + .EXAMPLE + PS C:\> $cred = Get-Credential WindowsUser + PS C:\> Get-DbaService -ComputerName sql1,sql2 -Credential $cred | Out-GridView + + Gets the SQL Server related services on computers sql1 and sql2 via the user WindowsUser, and shows them in a grid view. + + .EXAMPLE + PS C:\> Get-DbaService -ComputerName sql1,sql2 -InstanceName MSSQLSERVER + + Gets the SQL Server related services related to the default instance MSSQLSERVER on computers sql1 and sql2. + + .EXAMPLE + PS C:\> Get-DbaService -ComputerName $MyServers -Type SSRS + + Gets the SQL Server related services of type "SSRS" (Reporting Services) on computers in the variable MyServers. + + .EXAMPLE + PS C:\> $MyServers = Get-Content .\servers.txt + PS C:\> Get-DbaService -ComputerName $MyServers -ServiceName MSSQLSERVER,SQLSERVERAGENT + + Gets the SQL Server related services with ServiceName MSSQLSERVER or SQLSERVERAGENT for all the servers that are stored in the file. Every line in the file can only contain one hostname for a server. + + .EXAMPLE + PS C:\> $services = Get-DbaService -ComputerName sql1 -Type Agent,Engine + PS C:\> $services.ChangeStartMode('Manual') + + Gets the SQL Server related services of types Sql Agent and DB Engine on computer sql1 and changes their startup mode to 'Manual'. + + .EXAMPLE + PS C:\> (Get-DbaService -ComputerName sql1 -Type Engine).Restart($true) + + Calls a Restart method for each Engine service on computer sql1. + + #> + [CmdletBinding(DefaultParameterSetName = "Search")] + param ( + [parameter(ValueFromPipeline, Position = 1)] + [Alias("cn", "host", "Server")] + [DbaInstanceParameter[]]$ComputerName = $env:COMPUTERNAME, + [Parameter(ParameterSetName = "Search")] + [Alias("Instance")] + [string[]]$InstanceName, + [PSCredential]$Credential, + [Parameter(ParameterSetName = "Search")] + [ValidateSet("Agent", "Browser", "Engine", "FullText", "SSAS", "SSIS", "SSRS", "PolyBase")] + [string[]]$Type, + [Parameter(ParameterSetName = "ServiceName")] + [string[]]$ServiceName, + [switch]$AdvancedProperties, + [Alias('Silent')] + [switch]$EnableException + ) + + begin { + #Dictionary to transform service type IDs into the names from Microsoft.SqlServer.Management.Smo.Wmi.ManagedComputer.Services.Type + $ServiceIdMap = @( + @{ Name = "Engine"; Id = 1 }, + @{ Name = "Agent"; Id = 2 }, + @{ Name = "FullText"; Id = 3, 9 }, + @{ Name = "SSIS"; Id = 4 }, + @{ Name = "SSAS"; Id = 5 }, + @{ Name = "SSRS"; Id = 6 }, + @{ Name = "Browser"; Id = 7 }, + @{ Name = "PolyBase"; Id = 10, 11 }, + @{ Name = "Unknown"; Id = 8 } + ) + if ($PsCmdlet.ParameterSetName -match 'Search') { + if ($Type) { + $searchClause = "" + foreach ($itemType in $Type) { + foreach ($id in ($ServiceIdMap | Where-Object { $_.Name -eq $itemType }).Id) { + if ($searchClause) { $searchClause += ' OR ' } + $searchClause += "SQLServiceType = $id" + } + } + } else { + $searchClause = "SQLServiceType > 0" + } + } elseif ($PsCmdlet.ParameterSetName -match 'ServiceName') { + if ($ServiceName) { + $searchClause = "" + foreach ($sn in $ServiceName) { + if ($searchClause) { $searchClause += ' OR ' } + $searchClause += "ServiceName = '$sn'" + } + } else { + $searchClause = "SQLServiceType > 0" + } + } + } + process { + foreach ($Computer in $ComputerName.ComputerName) { + $Server = Resolve-DbaNetworkName -ComputerName $Computer -Credential $credential + if ($Server.FullComputerName) { + $Computer = $server.FullComputerName + $outputServices = @() + if (!$Type -or 'SSRS' -in $Type) { + Write-Message -Level Verbose -Message "Getting SQL Reporting Server services on $Computer" -Target $Computer + $reportingServices = Get-DbaReportingService -ComputerName $Computer -InstanceName $InstanceName -Credential $Credential -ServiceName $ServiceName + $outputServices += $reportingServices + } + Write-Message -Level Verbose -Message "Getting SQL Server namespace on $Computer" -Target $Computer + try { $namespaces = Get-DbaCmObject -ComputerName $Computer -NameSpace root\Microsoft\SQLServer -Query "Select Name FROM __NAMESPACE WHERE Name Like 'ComputerManagement%'" -EnableException -Credential $credential | Sort-Object Name -Descending } + catch { + # here to avoid an empty catch + $null = 1 + } + if ($namespaces) { + $servicesTemp = @() + + ForEach ($namespace in $namespaces) { + try { + Write-Message -Level Verbose -Message "Getting Cim class SqlService in Namespace $($namespace.Name) on $Computer." -Target $Computer + foreach ($service in (Get-DbaCmObject -ComputerName $Computer -Namespace "root\Microsoft\SQLServer\$($namespace.Name)" -Query "SELECT * FROM SqlService WHERE $searchClause" -EnableException -Credential $credential)) { + $servicesTemp += New-Object PSObject -Property @{ + Name = $service.ServiceName + Namespace = $namespace.Name + Service = $service + } + } + } catch { + Write-Message -Level Verbose -Message "Failed to acquire services from namespace $($namespace.Name)." -Target $Computer -ErrorRecord $_ + } + } + } + #use highest namespace available + $services = ($servicesTemp | Group-Object Name | ForEach-Object { $_.Group | Sort-Object Namespace -Descending | Select-Object -First 1 }).Service + #remove services returned by the SSRS namespace + $services = $services | Where-Object ServiceName -notin $reportingServices.ServiceName + #Add custom properties and methods to the service objects + ForEach ($service in $services) { + Add-Member -Force -InputObject $service -MemberType NoteProperty -Name ComputerName -Value $service.HostName + Add-Member -Force -InputObject $service -MemberType NoteProperty -Name ServiceType -Value ($ServiceIdMap | Where-Object { $_.Id -contains $service.SQLServiceType }).Name + Add-Member -Force -InputObject $service -MemberType NoteProperty -Name State -Value $(switch ($service.State) { 1 { 'Stopped' } 2 { 'Start Pending' } 3 { 'Stop Pending' } 4 { 'Running' } }) + Add-Member -Force -InputObject $service -MemberType NoteProperty -Name StartMode -Value $(switch ($service.StartMode) { 1 { 'Unknown' } 2 { 'Automatic' } 3 { 'Manual' } 4 { 'Disabled' } }) + + if ($service.ServiceName -in ("MSSQLSERVER", "SQLSERVERAGENT", "ReportServer", "MSSQLServerOLAPService")) { + $instance = "MSSQLSERVER" + } else { + if ($service.ServiceType -in @("Agent", "Engine", "SSRS", "SSAS")) { + if ($service.ServiceName.indexof('$') -ge 0) { + $instance = $service.ServiceName.split('$')[1] + } else { + $instance = "Unknown" + } + } else { + $instance = "" + } + } + $priority = switch ($service.ServiceType) { + "Engine" { 200 } + default { 100 } + } + #If only specific instances are selected + if (!$InstanceName -or $instance -in $InstanceName) { + #Add other properties and methods + Add-Member -Force -InputObject $service -NotePropertyName InstanceName -NotePropertyValue $instance + Add-Member -Force -InputObject $service -NotePropertyName ServicePriority -NotePropertyValue $priority + Add-Member -Force -InputObject $service -MemberType ScriptMethod -Name "Stop" -Value { + param ([bool]$Force = $false) + Stop-DbaService -InputObject $this -Force:$Force + } + Add-Member -Force -InputObject $service -MemberType ScriptMethod -Name "Start" -Value { Start-DbaService -InputObject $this } + Add-Member -Force -InputObject $service -MemberType ScriptMethod -Name "Restart" -Value { + param ([bool]$Force = $false) + Restart-DbaService -InputObject $this -Force:$Force + } + Add-Member -Force -InputObject $service -MemberType ScriptMethod -Name "ChangeStartMode" -Value { + param ( + [parameter(Mandatory)] + [string]$Mode + ) + $supportedModes = @("Automatic", "Manual", "Disabled") + if ($Mode -notin $supportedModes) { + Stop-Function -Message ("Incorrect mode '$Mode'. Use one of the following values: {0}" -f ($supportedModes -join ' | ')) -EnableException $false -FunctionName 'Get-DbaService' + Return + } + Set-ServiceStartMode -InputObject $this -Mode $Mode -ErrorAction Stop + $this.StartMode = $Mode + } + + if ($AdvancedProperties) { + $namespaceValue = $service.CimClass.ToString().ToUpper().Replace(":SQLSERVICE", "").Replace("ROOT/MICROSOFT/SQLSERVER/", "") + $serviceAdvancedProperties = Get-DbaCmObject -ComputerName $Computer -Namespace "root\Microsoft\SQLServer\$($namespaceValue)" -Query "SELECT * FROM SqlServiceAdvancedProperty WHERE ServiceName = '$($service.ServiceName)'" + + Add-Member -Force -InputObject $service -MemberType NoteProperty -Name Version -Value ($serviceAdvancedProperties | Where-Object PropertyName -eq 'VERSION' ).PropertyStrValue + Add-Member -Force -InputObject $service -MemberType NoteProperty -Name SPLevel -Value ($serviceAdvancedProperties | Where-Object PropertyName -eq 'SPLEVEL' ).PropertyNumValue + Add-Member -Force -InputObject $service -MemberType NoteProperty -Name SkuName -Value ($serviceAdvancedProperties | Where-Object PropertyName -eq 'SKUNAME' ).PropertyStrValue + + $ClusterServiceTypeList = @(1, 2, 5, 7) + if ($ClusterServiceTypeList -contains $service.SQLServiceType) { + Add-Member -Force -InputObject $service -MemberType NoteProperty -Name Clustered -Value ($serviceAdvancedProperties | Where-Object PropertyName -eq 'CLUSTERED' ).PropertyNumValue + Add-Member -Force -InputObject $service -MemberType NoteProperty -Name VSName -Value ($serviceAdvancedProperties | Where-Object PropertyName -eq 'VSNAME' ).PropertyStrValue + } else { + Add-Member -Force -InputObject $service -MemberType NoteProperty -Name Clustered -Value '' + Add-Member -Force -InputObject $service -MemberType NoteProperty -Name VSName -Value '' + } + } + $outputServices += $service + } + } + if ($AdvancedProperties) { + $defaults = "ComputerName", "ServiceName", "ServiceType", "InstanceName", "DisplayName", "StartName", "State", "StartMode", "Version", "SPLevel", "SkuName", "Clustered", "VSName" + } else { + $defaults = "ComputerName", "ServiceName", "ServiceType", "InstanceName", "DisplayName", "StartName", "State", "StartMode" + } + if ($outputServices) { + $outputServices | Select-DefaultView -Property $defaults -TypeName DbaSqlService + } else { + Stop-Function -Message "No services found in relevant namespaces on $Computer. Please note that this function is available from SQL 2005 up." + } + } else { + Stop-Function -EnableException $EnableException -Message "Failed to connect to $Computer" -Continue + } + } + } + end { + Test-DbaDeprecation -DeprecatedOn "1.0.0" -EnableException:$false -Alias Get-DbaSqlService + } +} +function Get-DbaSpConfigure { + <# + .SYNOPSIS + Returns all server level system configuration (sys.configuration/sp_configure) information + + .DESCRIPTION + This function returns server level system configuration (sys.configuration/sp_configure) information. The information is gathered through SMO Configuration.Properties. + The data includes the default value for each configuration, for quick identification of values that may have been changed. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. This can be a collection and receive pipeline input + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Name + Return only specific configurations. Name can be either values from (sys.configuration/sp_configure) or from SMO object + + .PARAMETER ExcludeName + Exclude specific configurations. Name can be either values from (sys.configuration/sp_configure) or from SMO object + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: SpConfig, Configure, Configuration + Author: Nic Cain, https://sirsql.net/ + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaSpConfigure + + .INPUTS + A DbaInstanceParameter representing an array of SQL Server instances. + + .OUTPUTS + Returns PSCustomObject with properties ServerName, ComputerName, InstanceName, SqlInstance, Name, DisplayName, Description, IsAdvanced, IsDynamic, MinValue, MaxValue, ConfiguredValue, RunningValue, DefaultValue, IsRunningDefaultValue + + .EXAMPLE + PS C:\> Get-DbaSpConfigure -SqlInstance localhost + + Returns all system configuration information on the localhost. + + .EXAMPLE + PS C:\> 'localhost','localhost\namedinstance' | Get-DbaSpConfigure + + Returns system configuration information on multiple instances piped into the function + + .EXAMPLE + PS C:\> Get-DbaSpConfigure -SqlInstance sql2012 -Name 'max server memory (MB)' + + Returns only the system configuration for MaxServerMemory on sql2012. + + .EXAMPLE + PS C:\> Get-DbaSpConfigure -SqlInstance sql2012 -ExcludeName 'max server memory (MB)', RemoteAccess | Out-GridView + + Returns system configuration information on sql2012 but excludes for max server memory (MB) and remote access. Values returned in grid view + + .EXAMPLE + PS C:\> $cred = Get-Credential SqlCredential + PS C:\> 'sql2012' | Get-DbaSpConfigure -SqlCredential $cred -Name RemoteAccess, 'max server memory (MB)' -ExcludeName 'remote access' | Out-GridView + + Returns system configuration information on sql2012 using SQL Server Authentication. Only MaxServerMemory is returned as RemoteAccess was also excluded. + + #> + [CmdletBinding()] + param ( + [parameter(Position = 0, Mandatory, ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer", "SqlServers")] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [Alias("Config", "ConfigName")] + [string[]]$Name, + [string[]]$ExcludeName, + [switch]$EnableException + ) + begin { + $smoName = [pscustomobject]@{ + "Ad Hoc Distributed Queries" = "AdHocDistributedQueriesEnabled" + "affinity I/O mask" = "AffinityIOMask" + "affinity mask" = "AffinityMask" + "affinity64 I/O mask" = "Affinity64IOMask" + "affinity64 mask" = "Affinity64Mask" + "Agent XPs" = "AgentXPsEnabled" + "allow updates" = "AllowUpdates" + "awe enabled" = "AweEnabled" + "backup compression default" = "DefaultBackupCompression" + "blocked process threshold" = "BlockedProcessThreshold" + "blocked process threshold (s)" = "BlockedProcessThreshold" + "c2 audit mode" = "C2AuditMode" + "clr enabled" = "IsSqlClrEnabled" + "common criteria compliance enabled" = "CommonCriteriaComplianceEnabled" + "contained database authentication" = "ContainmentEnabled" + "cost threshold for parallelism" = "CostThresholdForParallelism" + "cross db ownership chaining" = "CrossDBOwnershipChaining" + "cursor threshold" = "CursorThreshold" + "Database Mail XPs" = "DatabaseMailEnabled" + "default full-text language" = "DefaultFullTextLanguage" + "default language" = "DefaultLanguage" + "default trace enabled" = "DefaultTraceEnabled" + "disallow results from triggers" = "DisallowResultsFromTriggers" + "EKM provider enabled" = "ExtensibleKeyManagementEnabled" + "filestream access level" = "FilestreamAccessLevel" + "fill factor (%)" = "FillFactor" + "ft crawl bandwidth (max)" = "FullTextCrawlBandwidthMax" + "ft crawl bandwidth (min)" = "FullTextCrawlBandwidthMin" + "ft notify bandwidth (max)" = "FullTextNotifyBandwidthMax" + "ft notify bandwidth (min)" = "FullTextNotifyBandwidthMin" + "index create memory (KB)" = "IndexCreateMemory" + "in-doubt xact resolution" = "InDoubtTransactionResolution" + "lightweight pooling" = "LightweightPooling" + "locks" = "Locks" + "max degree of parallelism" = "MaxDegreeOfParallelism" + "max full-text crawl range" = "FullTextCrawlRangeMax" + "max server memory (MB)" = "MaxServerMemory" + "max text repl size (B)" = "ReplicationMaxTextSize" + "max worker threads" = "MaxWorkerThreads" + "media retention" = "MediaRetention" + "min memory per query (KB)" = "MinMemoryPerQuery" + "min server memory (MB)" = "MinServerMemory" + "nested triggers" = "NestedTriggers" + "network packet size (B)" = "NetworkPacketSize" + "Ole Automation Procedures" = "OleAutomationProceduresEnabled" + "open objects" = "OpenObjects" + "optimize for ad hoc workloads" = "OptimizeAdhocWorkloads" + "PH timeout (s)" = "ProtocolHandlerTimeout" + "precompute rank" = "PrecomputeRank" + "priority boost" = "PriorityBoost" + "query governor cost limit" = "QueryGovernorCostLimit" + "query wait (s)" = "QueryWait" + "recovery interval (min)" = "RecoveryInterval" + "remote access" = "RemoteAccess" + "remote admin connections" = "RemoteDacConnectionsEnabled" + "remote data archive" = "RemoteDataArchiveEnabled" + "remote login timeout (s)" = "RemoteLoginTimeout" + "remote proc trans" = "RemoteProcTrans" + "remote query timeout (s)" = "RemoteQueryTimeout" + "Replication XPs" = "ReplicationXPsEnabled" + "scan for startup procs" = "ScanForStartupProcedures" + "server trigger recursion" = "ServerTriggerRecursionEnabled" + "set working set size" = "SetWorkingSetSize" + "show advanced options" = "ShowAdvancedOptions" + "SMO and DMO XPs" = "SmoAndDmoXPsEnabled" + "SQL Mail XPs" = "SqlMailXPsEnabled" + "transform noise words" = "TransformNoiseWords" + "two digit year cutoff" = "TwoDigitYearCutoff" + "user connections" = "UserConnections" + "user options" = "UserOptions" + "Web Assistant Procedures" = "WebXPsEnabled" + "xp_cmdshell" = "XPCmdShellEnabled" + # Configurations without defined names - Created dummy entries + "access check cache bucket count" = "AccessCheckCacheBucketCount" + "access check cache quota" = "AccessCheckCacheQuota" + "allow polybase export" = "AllowPolybaseExport" + "automatic soft-NUMA disabled" = "AutomaticSoftnumaDisabled" + "backup checksum default" = "BackupChecksumDefault" + "clr strict security" = "ClrStrictSecurity" + "external scripts enabled" = "ExternalScriptsEnabled" + "hadoop connectivity" = "HadoopConnectivity" + "polybase network encryption" = "PolybaseNetworkEncryption" + "User Instance Timeout" = "UserInstanceTimeout" + "user instances enabled" = "UserInstancesEnabled" + } + } + process { + foreach ($instance in $SqlInstance) { + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $sqlcredential + } catch { + Stop-Function -Message "Failed to process Instance $Instance" -ErrorRecord $_ -Target $instance -Continue + } + + #Get a list of the configuration Properties. This collection matches entries in sys.configurations + try { + $proplist = $server.Configuration.Properties + } catch { + Stop-Function -Message "Unable to gather configuration properties $instance" -Target $instance -ErrorRecord $_ -Continue + } + + if ($Name) { + $proplist = $proplist | Where-Object { ($_.DisplayName -in $Name -or ($smoName).$($_.DisplayName) -in $Name) } + } + + if (Test-Bound "ExcludeName") { + $proplist = $proplist | Where-Object { ($_.DisplayName -NotIn $ExcludeName -and ($smoName).$($_.DisplayName) -NotIn $ExcludeName) } + } + + #Grab the default sp_configure property values from the external function + $defaultConfigs = (Get-SqlDefaultSpConfigure -SqlVersion $server.VersionMajor).psobject.properties; + + #Iterate through the properties to get the configuration settings + foreach ($prop in $proplist) { + $defaultConfig = $defaultConfigs | Where-Object { $_.Name -eq $prop.DisplayName }; + + if ($defaultConfig.Value -eq $prop.RunValue) { $isDefault = $true } + else { $isDefault = $false } + + #Ignores properties that are not valid on this version of SQL + if (!([string]::IsNullOrEmpty($prop.RunValue))) { + + $DisplayName = $prop.DisplayName + [pscustomobject]@{ + ServerName = $server.Name + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + Name = ($smoName).$DisplayName + DisplayName = $DisplayName + Description = $prop.Description + IsAdvanced = $prop.IsAdvanced + IsDynamic = $prop.IsDynamic + MinValue = $prop.Minimum + MaxValue = $prop.Maximum + ConfiguredValue = $prop.ConfigValue + RunningValue = $prop.RunValue + DefaultValue = $defaultConfig.Value + IsRunningDefaultValue = $isDefault + Parent = $server + ConfigName = ($smoName).$DisplayName + } | Select-DefaultView -ExcludeProperty ServerName, Parent, ConfigName + } + } + } + } +} +function Get-DbaSpinLockStatistic { + <# + .SYNOPSIS + Displays information from sys.dm_os_spinlock_stats. Works on SQL Server 2008 and above. + + .DESCRIPTION + This command is based off of Paul Randal's post "Advanced SQL Server performance tuning" + + Returns: + SpinLockName + Collisions + Spins + SpinsPerCollision + SleepTime + Backoffs + + Reference: https://www.sqlskills.com/blogs/paul/advanced-performance-troubleshooting-waits-latches-spinlocks/ + + .PARAMETER SqlInstance + The SQL Server instance. Server version must be SQL Server version 2008 or higher. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: SpinLockStatistics, Waits + Author: Patrick Flynn (@sqllensman) + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaSpinLockStatistic + + .EXAMPLE + PS C:\> Get-DbaSpinLockStatistic -SqlInstance sql2008, sqlserver2012 + + Get SpinLock Statistics for servers sql2008 and sqlserver2012. + + .EXAMPLE + PS C:\> $output = Get-DbaSpinLockStatistic -SqlInstance sql2008 | Select * | ConvertTo-DbaDataTable + + Collects all SpinLock Statistics on server sql2008 into a Data Table. + + .EXAMPLE + PS C:\> 'sql2008','sqlserver2012' | Get-DbaSpinLockStatistic + + Get SpinLock Statistics for servers sql2008 and sqlserver2012 via pipline + + .EXAMPLE + PS C:\> $cred = Get-Credential sqladmin + PS C:\> Get-DbaSpinLockStatistic -SqlInstance sql2008 -SqlCredential $cred + + Connects using sqladmin credential and returns SpinLock Statistics from sql2008 + #> + [CmdletBinding()] + Param ( + [parameter(Mandatory, ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer", "SqlServers")] + [DbaInstance[]]$SqlInstance, + [PSCredential]$SqlCredential, + [Alias('Silent')] + [switch]$EnableException + ) + + BEGIN { + + $sql = "SELECT + name, + collisions, + spins, + spins_per_collision, + sleep_time, + backoffs + FROM sys.dm_os_spinlock_stats;" + + Write-Message -Level Debug -Message $sql + } + + process { + if (Test-FunctionInterrupt) { return } + foreach ($instance in $SqlInstance) { + Write-Message -Level Verbose -Message "Connecting to $instance" + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential -MinimumVersion 10 + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + Write-Message -Level Verbose -Message "Connected to $instance" + + foreach ($row in $server.Query($sql)) { + [PSCustomObject]@{ + ComputerName = $server.NetName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + SpinLockName = $row.name + Collisions = $row.collisions + Spins = $row.spins + SpinsPerCollision = $row.spins_per_collision + SleepTime = $row.sleep_time + Backoffs = $row.backoffs + } + } + } + } +} +#ValidationTags#FlowControl,Pipeline# +function Get-DbaSpn { + <# + .SYNOPSIS + Returns a list of set service principal names for a given computer/AD account + + .DESCRIPTION + Get a list of set SPNs. SPNs are set at the AD account level. You can either retrieve set SPNs for a computer, or any SPNs set for + a given active directory account. You can query one, or both. You'll get a list of every SPN found for either search term. + + .PARAMETER ComputerName + The servers you want to return set SPNs for. This is defaulted automatically to localhost. + + .PARAMETER AccountName + The accounts you want to retrieve set SPNs for. + + .PARAMETER Credential + User credential to connect to the remote servers or active directory. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: SPN + Author: Drew Furgiuele (@pittfurg), http://www.port1433.com + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaSpn + + .EXAMPLE + PS C:\> Get-DbaSpn -ComputerName SQLSERVERA -Credential ad\sqldba + + Returns a custom object with SearchTerm (ServerName) and the SPNs that were found + + .EXAMPLE + PS C:\> Get-DbaSpn -AccountName domain\account -Credential ad\sqldba + + Returns a custom object with SearchTerm (domain account) and the SPNs that were found + + .EXAMPLE + PS C:\> Get-DbaSpn -ComputerName SQLSERVERA,SQLSERVERB -Credential ad\sqldba + + Returns a custom object with SearchTerm (ServerName) and the SPNs that were found for multiple computers + + #> + [cmdletbinding()] + [Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSUseApprovedVerbs", "", Justification = "Internal functions are ignored")] + param ( + [Parameter(ValueFromPipeline)] + [string[]]$ComputerName, + [string[]]$AccountName, + [PSCredential]$Credential, + [Alias('Silent')] + [switch]$EnableException + ) + begin { + Function Process-Account ($AccountName) { + + ForEach ($account in $AccountName) { + Write-Message -Message "Looking for account $account..." -Level Verbose + $searchfor = 'User' + if ($account.EndsWith('$')) { + $searchfor = 'Computer' + } + try { + $Result = Get-DbaADObject -ADObject $account -Type $searchfor -Credential $Credential -EnableException + } catch { + Write-Message -Message "AD lookup failure. This may be because the domain cannot be resolved for the SQL Server service account ($Account)." -Level Warning + continue + } + if ($Result.Count -gt 0) { + try { + $results = $Result.GetUnderlyingObject() + $spns = $results.Properties.servicePrincipalName + } catch { + Write-Message -Message "The SQL Service account ($Account) has been found, but you don't have enough permission to inspect its SPNs" -Level Warning + continue + } + } else { + Write-Message -Message "The SQL Service account ($Account) has not been found" -Level Warning + continue + } + + foreach ($spn in $spns) { + if ($spn -match "\:") { + try { + $port = [int]($spn -Split "\:")[1] + } catch { + $port = $null + } + #Variable marked as unused by PSScriptAnalyzer + # if ($spn -match "\/") { + # $serviceclass = ($spn -Split "\/")[0] + # } + } + [pscustomobject] @{ + Input = $Account + AccountName = $Account + ServiceClass = "MSSQLSvc" # $serviceclass + Port = $port + SPN = $spn + } + } + } + } + if ($ComputerName.Count -eq 0 -and $AccountName.Count -eq 0) { + $ComputerName = @($env:COMPUTERNAME) + } + } + + process { + + foreach ($computer in $ComputerName) { + if ($computer) { + if ($computer.EndsWith('$')) { + Write-Message -Message "$computer is an account name. Processing as account." -Level Verbose + Process-Account -AccountName $computer + continue + } + } + + Write-Message -Message "Getting SQL Server SPN for $computer" -Level Verbose + $spns = Test-DbaSpn -ComputerName $computer -Credential $Credential + + $sqlspns = 0 + $spncount = $spns.count + Write-Message -Message "Calculated $spncount SQL SPN entries that should exist for $computer" -Level Verbose + foreach ($spn in $spns | Where-Object { $_.IsSet -eq $true }) { + $sqlspns++ + + if ($accountName) { + if ($accountName -eq $spn.InstanceServiceAccount) { + [pscustomobject] @{ + Input = $computer + AccountName = $spn.InstanceServiceAccount + ServiceClass = "MSSQLSvc" + Port = $spn.Port + SPN = $spn.RequiredSPN + } + } + } else { + [pscustomobject] @{ + Input = $computer + AccountName = $spn.InstanceServiceAccount + ServiceClass = "MSSQLSvc" + Port = $spn.Port + SPN = $spn.RequiredSPN + } + } + } + Write-Message -Message "Found $sqlspns set SQL SPN entries for $computer" -Level Verbose + } + + if ($AccountName) { + foreach ($account in $AccountName) { + Process-Account -AccountName $account + } + } + } +} +function Get-DbaSsisEnvironmentVariable { + <# + .SYNOPSIS + This command gets specified SSIS Environment and all its variables + + .DESCRIPTION + This command gets all variables from specified environment from SSIS Catalog. All sensitive values are decrypted. + The function communicates directly with SSISDB database, "SQL Server Integration Services" service isn't queried there. + Each parameter (besides SqlInstance and SqlCredential) acts as the filter to only include or exclude particular element + + .PARAMETER SqlInstance + The target SQL Server instance or instances. + This can be a collection and receive pipeline input to allow the function + to be executed against multiple SQL Server instances. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Environment + The SSIS Environments names that we want to get variables from + + .PARAMETER EnvironmentExclude + The SSIS Environments to exclude. Acts as a filter for environments, best used without 'Environment' parameter + to get variables for all environments but excluded ones + + .PARAMETER Folder + The Folders names that contain the environments + + .PARAMETER FolderExclude + The Folders names to exclude. Acts as a filter for folders containing environments, best user without 'Folder' parameter + to get variables for all folders but excluded ones + + .PARAMETER WhatIf + If this switch is enabled, no actions are performed but informational messages will be displayed that explain what would happen if the command were to run. + + .PARAMETER Confirm + If this switch is enabled, you will be prompted for confirmation before executing any operations that change state. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: SSIS, SSISDB, Variable + Author: Bartosz Ratajczyk (@b_ratajczyk) + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaSsisEnvironmentVariable + + .EXAMPLE + PS C:\> Get-DbaSsisEnvironmentVariable -SqlInstance localhost -Environment DEV -Folder DWH_ETL + + Gets variables of 'DEV' environment located in 'DWH_ETL' folder on 'localhost' Server + + .EXAMPLE + PS C:\> Get-DbaSsisEnvironmentVariable -SqlInstance localhost -Environment DEV -Folder DWH_ETL, DEV2, QA + + Gets variables of 'DEV' environment(s) located in folders 'DWH_ETL', 'DEV2' and 'QA' on 'localhost' server + + .EXAMPLE + PS C:\> Get-DbaSsisEnvironmentVariable -SqlInstance localhost -Environment DEV -FolderExclude DWH_ETL, DEV2, QA + + Gets variables of 'DEV' environments located in folders other than 'DWH_ETL', 'DEV2' and 'QA' on 'localhost' server + + .EXAMPLE + PS C:\> Get-DbaSsisEnvironmentVariable -SqlInstance localhost -Environment DEV, PROD -Folder DWH_ETL, DEV2, QA + + Gets variables of 'DEV' and 'PROD' environment(s) located in folders 'DWH_ETL', 'DEV2' and 'QA' on 'localhost' server + + .EXAMPLE + PS C:\> Get-DbaSsisEnvironmentVariable -SqlInstance localhost -EnvironmentExclude DEV, PROD -Folder DWH_ETL, DEV2, QA + + Gets variables of environments other than 'DEV' and 'PROD' located in folders 'DWH_ETL', 'DEV2' and 'QA' on 'localhost' server + + .EXAMPLE + PS C:\> Get-DbaSsisEnvironmentVariable -SqlInstance localhost -EnvironmentExclude DEV, PROD -FolderExclude DWH_ETL, DEV2, QA + + Gets variables of environments other than 'DEV' and 'PROD' located in folders other than 'DWH_ETL', 'DEV2' and 'QA' on 'localhost' server + + .EXAMPLE + PS C:\> 'localhost' | Get-DbaSsisEnvironmentVariable -EnvironmentExclude DEV, PROD + + Gets all SSIS environments except 'DEV' and 'PROD' from 'localhost' server. The server name comes from pipeline + + .EXAMPLE + PS C:\> 'SRV1', 'SRV3' | Get-DbaSsisEnvironmentVariable + + Gets all SSIS environments from 'SRV1' and 'SRV3' servers. The server's names come from pipeline + + .EXAMPLE + PS C:\> 'SRV1', 'SRV2' | Get-DbaSsisEnvironmentVariable DEV | Out-GridView + + Gets all variables from 'DEV' Environment(s) on servers 'SRV1' and 'SRV2' and outputs it as the GridView. + The server names come from the pipeline. + + .EXAMPLE + PS C:\> 'localhost' | Get-DbaSsisEnvironmentVariable -EnvironmentExclude DEV, PROD | Select-Object -Property Name, Value | Where-Object {$_.Name -match '^a'} | Out-GridView + + Gets all variables from Environments other than 'DEV' and 'PROD' on 'localhost' server, + selects Name and Value properties for variables that names start with letter 'a' and outputs it as the GridView + + #> + [CmdletBinding()] + param ( + [parameter(Mandatory, ValueFromPipeline)] + [Alias('SqlServer', 'ServerInstance')] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [object[]]$Environment, + [object[]]$EnvironmentExclude, + [object[]]$Folder, + [object[]]$FolderExclude, + [Alias('Silent')] + [switch]$EnableException + ) + + process { + foreach ($instance in $SqlInstance) { + try { + $server = Connect-SqlInstance -SqlInstance $instance -MinimumVersion 11 + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + try { + $ISNamespace = "Microsoft.SqlServer.Management.IntegrationServices" + + $SSIS = New-Object "$ISNamespace.IntegrationServices" $server + } catch { + Stop-Function -Message "Could not connect to SSIS Catalog on $instance or current SMO library does not support SSIS catalog" + return + } + + Write-Message -Message "Fetching SSIS Catalog and its folders" -Level Verbose + $catalog = $SSIS.Catalogs | Where-Object { $_.Name -eq "SSISDB" } + + # get all folders names if none provided + if ($null -eq $Folder) { + $searchFolders = $catalog.Folders.Name + } else { + $searchFolders = $Folder + } + + # filter unwanted folders + if ($FolderExclude) { + $searchFolders = $searchFolders | Where-Object { $_ -notin $FolderExclude } + } + + if ($null -eq $searchFolders) { + Write-Message -Message "Instance: $instance > -Folder and -FolderExclude filters return an empty collection. Skipping" -Level Warning + } else { + foreach ($f in $searchFolders) { + # get all environments names if none provided + if ($null -eq $Environment) { + $searchEnvironments = $catalog.Folders.Environments.Name + } else { + $searchEnvironments = $Environment + } + + #filter unwanted environments + if ($EnvironmentExclude) { + $searchEnvironments = $searchEnvironments | Where-Object { $_ -notin $EnvironmentExclude } + } + + if ($null -eq $searchEnvironments) { + Write-Message -Message "Instance: $instance / Folder: $f > -Environment and -EnvironmentExclude filters return an empty collection. Skipping." -Level Warning + } else { + $Environments = $catalog.Folders[$f].Environments | Where-Object { $_.Name -in $searchEnvironments } + + foreach ($e in $Environments) { + #encryption handling + $encKey = 'MS_Enckey_Env_' + $e.EnvironmentId + $encCert = 'MS_Cert_Env_' + $e.EnvironmentId + + <# + SMO does not return sensitive values (gets data from catalog.environment_variables) + We have to manually query internal.environment_variables instead and use symmetric keys + within T-SQL code + #> + + $sql = @" + OPEN SYMMETRIC KEY $encKey DECRYPTION BY CERTIFICATE $encCert; + + SELECT + ev.variable_id, + ev.name, + ev.description, + ev.type, + ev.sensitive, + value = ev.value, + ev.sensitive_value, + ev.base_data_type, + decrypted = decrypted.value + FROM internal.environment_variables ev + + CROSS APPLY ( + SELECT + value = CASE base_data_type + WHEN 'nvarchar' THEN CONVERT(NVARCHAR(MAX), DECRYPTBYKEY(sensitive_value)) + WHEN 'bit' THEN CONVERT(NVARCHAR(MAX), CONVERT(bit, DECRYPTBYKEY(sensitive_value))) + WHEN 'datetime' THEN CONVERT(NVARCHAR(MAX), CONVERT(datetime2(0), DECRYPTBYKEY(sensitive_value))) + WHEN 'single' THEN CONVERT(NVARCHAR(MAX), CONVERT(DECIMAL(38, 18), DECRYPTBYKEY(sensitive_value))) + WHEN 'float' THEN CONVERT(NVARCHAR(MAX), CONVERT(DECIMAL(38, 18), DECRYPTBYKEY(sensitive_value))) + WHEN 'decimal' THEN CONVERT(NVARCHAR(MAX), CONVERT(DECIMAL(38, 18), DECRYPTBYKEY(sensitive_value))) + WHEN 'tinyint' THEN CONVERT(NVARCHAR(MAX), CONVERT(tinyint, DECRYPTBYKEY(sensitive_value))) + WHEN 'smallint' THEN CONVERT(NVARCHAR(MAX), CONVERT(smallint, DECRYPTBYKEY(sensitive_value))) + WHEN 'int' THEN CONVERT(NVARCHAR(MAX), CONVERT(INT, DECRYPTBYKEY(sensitive_value))) + WHEN 'bigint' THEN CONVERT(NVARCHAR(MAX), CONVERT(bigint, DECRYPTBYKEY(sensitive_value))) + END + ) decrypted + WHERE environment_id = $($e.EnvironmentId); + CLOSE SYMMETRIC KEY $encKey; +"@ + + $ssisVariables = $server.Query($sql, "SSISDB") + + foreach ($variable in $ssisVariables) { + if ($variable.sensitive -eq $true) { + $value = $variable.decrypted + } else { + $value = $variable.value + } + + [PSCustomObject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + Folder = $f + Environment = $e.Name + Id = $variable.variable_id + Name = $variable.Name + Description = $variable.description + Type = $variable.type + IsSensitive = $variable.sensitive + BaseDataType = $variable.base_data_type + Value = $value + } + } + } + } + } + } + } + } +} +#ValidationTags#Messaging# +function Get-DbaSsisExecutionHistory { + <# + .SYNOPSIS + Get-DbaSsisHistory Retreives SSIS project and package execution History, and environments from one SQL Server to another. + + .DESCRIPTION + This command gets execution history for SSIS executison given one or more instances and can be filtered by Project, Environment,Folder or Status. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. + This can be a collection and receive pipeline input to allow the function + to be executed against multiple SQL Server instances. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Project + Specifies a filter by project + + .PARAMETER Folder + Specifies a filter by folder + + .PARAMETER Environment + Specifies a filter by environment + + .PARAMETER Status + Specifies a filter by status (created,running,cancelled,failed,pending,halted,succeeded,stopping,completed) + + .PARAMETER Since + Datetime object used to narrow the results to a date + + .PARAMETER WhatIf + If this switch is enabled, no actions are performed but informational messages will be displayed that explain what would happen if the command were to run. + + .PARAMETER Confirm + If this switch is enabled, you will be prompted for confirmation before executing any operations that change state. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Migration, SSIS + Author: Chris Tucker (@ChrisTuc47368095) + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaSsisExecutionHistory + + .EXAMPLE + PS C:\> Get-DbaSsisExecutionHistory -SqlInstance SMTQ01 -Folder SMTQ_PRC + + Get all history items for SMTQ01 in folder SMTQ_PRC. + + .EXAMPLE + PS C:\> Get-DbaSsisExecutionHistory -SqlInstance SMTQ01 -Status Failed,Cancelled + + Gets all failed or canceled executions for SMTQ01. + + .EXAMPLE + PS C:\> Get-DbaSsisExecutionHistory -SqlInstance SMTQ01,SMTQ02 -Status Failed,Cancelled + + Shows what would happen if the command were executed and would return the SQL statement that would be executed per instance. + + #> + [CmdletBinding()] + param ( + [parameter(Mandatory)] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [datetime]$Since, + [ValidateSet("Created", "Running", "Cancelled", "Failed", "Pending", "Halted", "Succeeded", "Stopping", "Completed")] + [String[]]$Status, + [String[]]$Project, + [String[]]$Folder, + [String[]]$Environment, + [switch]$EnableException + ) + begin { + $params = @{} + + #build status parameter + $statuses = @{ + 'Created' = 1 + 'Running' = 2 + 'Cancelled' = 3 + 'Failed' = 4 + 'Pending' = 5 + 'Halted' = 6 + 'Succeeded' = 7 + 'Stopping' = 8 + 'Completed' = 9 + } + if ($Status) { + $csv = ($statuses[$Status] -join ',') + $statusq = "`n`t`tAND e.[Status] in ($csv)" + } else { + $statusq = '' + } + + #construct parameterized collection predicate for project array + if ($Project) { + $projectq = "`n`t`tAND ( 1=0 " + $i = 0 + foreach ($p in $Project) { + $i ++ + $projectq += "`n`t`t`tOR e.[project_name] = @project$i" + $params.Add("project$i", $p) + } + $projectq += "`n`t`t)" + } else { + $projectq = '' + } + + #construct parameterized collection predicate for folder array + if ($Folder) { + $folderq = "`n`t`tAND ( 1=0 " + $i = 0 + foreach ($f in $Folder) { + $i ++ + $folderq += "`n`t`t`tOR e.[folder_name] = @folder$i" + $params.Add("folder$i" , $f) + } + $folderq += "`n`t`t)" + } else { + $folderq = '' + } + + #construct parameterized collection predicate for environment array + if ($Environment) { + $environmentq = "`n`t`tAND ( 1=0 " + $i = 0 + foreach ($e in $Environment) { + $i ++ + $environmentq += "`n`t`t`tOR e.[environment_name] = @environment$i" + $params.Add("environment$i" , $e) + } + $environmentq += "`n`t`t)" + } else { + $environmentq = '' + } + + #construct date filter for since + if ($Since) { + $sinceq = "`n`t`tAND e.[start_time] >= @since" + $params.Add('since', $Since ) + } + + $sql = " + WITH + cteLoglevel as ( + SELECT + execution_id as ExecutionID, + cast(parameter_value AS INT) AS LoggingLevel + FROM + [catalog].[execution_parameter_values] + WHERE + parameter_name = 'LOGGING_LEVEL' + ) + , cteStatus AS ( + SELECT + [key] + ,[code] + FROM ( + VALUES + ( 1,'Created' ) + , ( 2,'Running' ) + , ( 3,'Cancelled') + , ( 4,'Failed' ) + , ( 5,'Pending' ) + , ( 6,'Halted' ) + , ( 7,'Succeeded') + , ( 8,'Stopping' ) + , ( 9,'Completed') + ) codes([key],[code]) + ) + SELECT + e.execution_id as ExecutionID + , e.folder_name as FolderName + , e.project_name as ProjectName + , e.package_name as PackageName + , e.project_lsn as ProjectLsn + , Environment = isnull(e.environment_folder_name, '') + isnull('\' + e.environment_name, '') + , s.code AS StatusCode + , start_time as StartTime + , end_time as EndTime + , ElapsedMinutes = DATEDIFF(ss, e.start_time, e.end_time) + , l.LoggingLevel + FROM + [catalog].executions e + LEFT OUTER JOIN cteLoglevel l + ON e.execution_id = l.ExecutionID + LEFT OUTER JOIN cteStatus s + ON s.[key] = e.status + WHERE 1=1$statusq$projectq$folderq$environmentq$sinceq + OPTION ( RECOMPILE ); + " + + #debug verbose output + Write-Message -Level Debug -Message "`nSQL statement: $sql" + $paramout = ($params | Out-String) + Write-Message -Level Debug -Message "`nParameters:$paramout" + } + + + process { + foreach ($instance in $SqlInstance) { + $results = Invoke-DbaQuery -SqlInstance $instance -Database SSISDB -Query $sql -as PSObject -SqlParameters $params -SqlCredential $SqlCredential + foreach ($row in $results) { + $row.StartTime = [dbadatetime]$row.StartTime.DateTime + $row.EndTime = [dbadatetime]$row.EndTime.DateTime + $row + } + } + } +} +function Get-DbaStartupParameter { + <# + .SYNOPSIS + Displays values for a detailed list of SQL Server Startup Parameters. + + .DESCRIPTION + Displays values for a detailed list of SQL Server Startup Parameters including Master Data Path, Master Log path, Error Log, Trace Flags, Parameter String and much more. + + This command relies on remote Windows Server (SQL WMI/WinRm) access. You can pass alternative Windows credentials by using the -Credential parameter. + + See https://msdn.microsoft.com/en-us/library/ms190737.aspx for more information. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. + + .PARAMETER Credential + Allows you to login to servers using alternate Windows credentials. + + $scred = Get-Credential, then pass $scred object to the -Credential parameter. + + .PARAMETER Simple + If this switch is enabled, simplified output will be produced including only Server, Master Data Path, Master Log path, ErrorLog, TraceFlags and ParameterString. + + .PARAMETER EnableException + If this switch is enabled, exceptions will be thrown to the caller, which will need to perform its own exception processing. Otherwise, the function will try to catch the exception, interpret it and provide a friendly error message. + + .NOTES + Tags: WSMan, SQLWMI, Memory + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaStartupParameter + + .EXAMPLE + PS C:\> Get-DbaStartupParameter -SqlInstance sql2014 + + Logs into SQL WMI as the current user then displays the values for numerous startup parameters. + + .EXAMPLE + PS C:\> $wincred = Get-Credential ad\sqladmin + PS C:\> Get-DbaStartupParameter -SqlInstance sql2014 -Credential $wincred -Simple + + Logs in to WMI using the ad\sqladmin credential and gathers simplified information about the SQL Server Startup Parameters. + + #> + [CmdletBinding()] + param ( + [parameter(ValueFromPipeline, Mandatory)] + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [Alias("SqlCredential")] + [PSCredential]$Credential, + [switch]$Simple, + [switch]$EnableException + ) + + process { + foreach ($instance in $SqlInstance) { + try { + $computerName = $instance.ComputerName + $instanceName = $instance.InstanceName + $ogInstance = $instance.FullSmoName + + $computerName = (Resolve-DbaNetworkName -ComputerName $computerName).FullComputerName + + + if ($instanceName.Length -eq 0) { $instanceName = "MSSQLSERVER" } + + $displayname = "SQL Server ($instanceName)" + + $Scriptblock = { + $computerName = $args[0] + $displayname = $args[1] + + $wmisvc = $wmi.Services | Where-Object DisplayName -eq $displayname + + $params = $wmisvc.StartupParameters -split ';' + + $masterdata = $params | Where-Object { $_.StartsWith('-d') } + $masterlog = $params | Where-Object { $_.StartsWith('-l') } + $errorlog = $params | Where-Object { $_.StartsWith('-e') } + $traceflags = $params | Where-Object { $_.StartsWith('-T') } + + $debugflag = $params | Where-Object { $_.StartsWith('-t') } + + if ($debugflag.length -ne 0) { + Write-Message -Level Warning "$instance is using the lowercase -t trace flag. This is for internal debugging only. Please ensure this was intentional." + } + #> + + if ($traceflags.length -eq 0) { + $traceflags = "None" + } else { + $traceflags = $traceflags.substring(2) + } + + if ($Simple -eq $true) { + [PSCustomObject]@{ + ComputerName = $computerName + InstanceName = $instanceName + SqlInstance = $ogInstance + MasterData = $masterdata.TrimStart('-d') + MasterLog = $masterlog.TrimStart('-l') + ErrorLog = $errorlog.TrimStart('-e') + TraceFlags = $traceflags -join ',' + ParameterString = $wmisvc.StartupParameters + } + } else { + # From https://msdn.microsoft.com/en-us/library/ms190737.aspx + + $commandpromptparm = $params | Where-Object { $_ -eq '-c' } + $minimalstartparm = $params | Where-Object { $_ -eq '-f' } + $memorytoreserve = $params | Where-Object { $_.StartsWith('-g') } + $noeventlogsparm = $params | Where-Object { $_ -eq '-n' } + $instancestartparm = $params | Where-Object { $_ -eq '-s' } + $disablemonitoringparm = $params | Where-Object { $_ -eq '-x' } + $increasedextentsparm = $params | Where-Object { $_ -ceq '-E' } + + $minimalstart = $noeventlogs = $instancestart = $disablemonitoring = $false + $increasedextents = $commandprompt = $singleuser = $false + + if ($null -ne $commandpromptparm) { + $commandprompt = $true + } + if ($null -ne $minimalstartparm) { + $minimalstart = $true + } + if ($null -eq $memorytoreserve) { + $memorytoreserve = 0 + } + if ($null -ne $noeventlogsparm) { + $noeventlogs = $true + } + if ($null -ne $instancestartparm) { + $instancestart = $true + } + if ($null -ne $disablemonitoringparm) { + $disablemonitoring = $true + } + if ($null -ne $increasedextentsparm) { + $increasedextents = $true + } + + $singleuserparm = $params | Where-Object { $_.StartsWith('-m') } + + if ($singleuserparm.length -ne 0) { + $singleuser = $true + $singleuserdetails = $singleuserparm.TrimStart('-m') + } + + [PSCustomObject]@{ + ComputerName = $computerName + InstanceName = $instanceName + SqlInstance = $ogInstance + MasterData = $masterdata -replace '^-[dD]', '' + MasterLog = $masterlog -replace '^-[lL]', '' + ErrorLog = $errorlog -replace '^-[eE]', '' + TraceFlags = $traceflags -join ',' + CommandPromptStart = $commandprompt + MinimalStart = $minimalstart + MemoryToReserve = $memorytoreserve + SingleUser = $singleuser + SingleUserName = $singleuserdetails + NoLoggingToWinEvents = $noeventlogs + StartAsNamedInstance = $instancestart + DisableMonitoring = $disablemonitoring + IncreasedExtents = $increasedextents + ParameterString = $wmisvc.StartupParameters + } + } + } + + # This command is in the internal function + # It's sorta like Invoke-Command. + if ($credential) { + Invoke-ManagedComputerCommand -Server $computerName -Credential $credential -ScriptBlock $Scriptblock -ArgumentList $computerName, $displayname + } else { + Invoke-ManagedComputerCommand -Server $computerName -ScriptBlock $Scriptblock -ArgumentList $computerName, $displayname + } + } catch { + Stop-Function -Message "$instance failed." -ErrorRecord $_ -Continue -Target $instance + } + } + } +} +function Get-DbaSuspectPage { + <# + .SYNOPSIS + Returns data that is stored in SQL for Suspect Pages on the specified SQL Server Instance + + .DESCRIPTION + This function returns any records that were stored due to suspect pages in databases on a SQL Server Instance. + + .PARAMETER SqlInstance + The target SQL Server instance or instances + + .PARAMETER SqlCredential + A credential to use to connect to the SQL Instance rather than using Windows Authentication + + .PARAMETER Database + The database to return. If unspecified, all records will be returned. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Pages, DBCC + Author: Garry Bargsley (@gbargsley), http://blog.garrybargsley.com + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .EXAMPLE + PS C:\> Get-DbaSuspectPage -SqlInstance sql2016 + + Retrieve any records stored for Suspect Pages on the sql2016 SQL Server. + + .EXAMPLE + PS C:\> Get-DbaSuspectPage -SqlInstance sql2016 -Database Test + + Retrieve any records stored for Suspect Pages on the sql2016 SQL Server and the Test database only. + + #> + [CmdletBinding()] + param ( + [parameter(Position = 0, Mandatory, ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [object]$Database, + [PSCredential]$SqlCredential, + [Alias('Silent')] + [switch]$EnableException + ) + + process { + foreach ($instance in $sqlinstance) { + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential -MinimumVersion 9 + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + return + } + + $sql = "Select + DB_NAME(database_id) as DBName, + file_id, + page_id, + CASE event_type + WHEN 1 THEN '823 or 824 or Torn Page' + WHEN 2 THEN 'Bad Checksum' + WHEN 3 THEN 'Torn Page' + WHEN 4 THEN 'Restored' + WHEN 5 THEN 'Repaired (DBCC)' + WHEN 7 THEN 'Deallocated (DBCC)' + END as EventType, + error_count, + last_update_date + from msdb.dbo.suspect_pages" + + try { + $results = $server.Query($sql) + } catch { + Stop-Function -Message "Issue collecting data on $server" -Target $server -ErrorRecord $_ -Continue + } + + if ($Database) { + $results = $results | Where-Object DBName -EQ $Database + } + + } + foreach ($row in $results) { + [PSCustomObject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + Database = $row.DBName + FileId = $row.file_id + PageId = $row.page_id + EventType = $row.EventType + ErrorCount = $row.error_count + LastUpdateDate = $row.last_update_date + } + } + } +} +function Get-DbaTcpPort { + <# + .SYNOPSIS + Returns the TCP port used by the specified SQL Server. + + .DESCRIPTION + By default, this function returns just the TCP port used by the specified SQL Server. + + If -All is specified, the server name, IPAddress (ipv4 and ipv6), port number and an indicator of whether or not the port assignment is static are returned. + + Remote sqlwmi is used by default. If this doesn't work, then remoting is used. If neither work, it defaults to T-SQL which can provide only the port. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. + + .PARAMETER SqlCredential + Allows you to connect to servers using alternate Windows credentials + + $scred = Get-Credential, then pass $scred object to the -SqlCredential parameter. + + .PARAMETER All + If this switch is enabled, an object with server name, IPAddress (ipv4 and ipv6), port and static ($true/$false) for one or more SQL Servers is returned. + + .PARAMETER Detailed + Output all properties, will be deprecated in 1.0.0 release. Use All instead. + + .PARAMETER ExcludeIpv6 + If this switch is enabled, IPv6 information is excluded from All output. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: SQLWMI, tcp + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaTcpPort + + .EXAMPLE + PS C:\> Get-DbaTcpPort -SqlInstance sqlserver2014a + + Returns just the port number for the default instance on sqlserver2014a. + + .EXAMPLE + PS C:\> Get-DbaTcpPort -SqlInstance winserver\sqlexpress, sql2016 + + Returns an object with server name and port number for the sqlexpress on winserver and the default instance on sql2016. + + .EXAMPLE + PS C:\> Get-DbaTcpPort -SqlInstance sqlserver2014a, sql2016 -All + + Returns an object with server name, IPAddress (ipv4 and ipv6), port and static ($true/$false) for sqlserver2014a and sql2016. + + Remote sqlwmi is used by default. If this doesn't work, then remoting is used. If neither work, it defaults to T-SQL which can provide only the port. + + .EXAMPLE + PS C:\> Get-DbaCmsRegServer -SqlInstance sql2014 | Get-DbaTcpPort -ExcludeIpv6 -All + + Returns an object with server name, IPAddress (just ipv4), port and static ($true/$false) for every server listed in the Central Management Server on sql2014. + + #> + [CmdletBinding()] + param ( + [parameter(Mandatory, ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [Alias("Credential")] + [PSCredential]$SqlCredential, + [switch]$Detailed, + [switch]$All, + [Alias("Ipv4")] + [switch]$ExcludeIpv6, + [Alias('Silent')] + [switch]$EnableException + ) + begin { + Test-DbaDeprecation -DeprecatedOn 1.0.0 -Parameter Detailed + } + process { + foreach ($instance in $SqlInstance) { + if ($All) { + try { + $scriptblock = { + $instance = $args[0] + + Add-Type -AssemblyName Microsoft.VisualBasic + + foreach ($servername in $wmi.ServerInstances) { + $instanceName = $servername.Name + $wmiinstance = $wmi.Services | Where-Object { $_.DisplayName -eq "SQL Server ($instanceName)" } + $vsname = ($wmiinstance.AdvancedProperties | Where-Object { $_ -match 'VSNAME' }).Value + + if ($vsname.length -eq 0) { + $vsname = "$instance\$instanceName" + } + + $vsname = $vsname.Replace("\MSSQLSERVER", "") + + try { + $regroot = ($wmiinstance.AdvancedProperties | Where-Object { $_ -match 'REGROOT' }).Value + $dacport = (Get-ItemProperty "HKLM:\$regroot\MSSQLServer\SuperSocketNetLib\AdminConnection\Tcp").TcpDynamicPorts + + [PsCustomObject]@{ + ComputerName = $instance + InstanceName = $instanceName + SqlInstance = $vsname + IPAddress = "0.0.0.0" + Port = $dacport + Static = $false + Type = "DAC" + } + } catch { + # Shouldn't have an empty catch block + # Use write-verbose becaues it's remote and write-message may note exist + Write-Verbose -Message "it's just not our day" + } + + $tcp = $servername.ServerProtocols | Where-Object Name -eq Tcp + $ips = $tcp.IPAddresses + + # This is a remote command so do not use Write-message + Write-Verbose "Parsing information for $($ips.count) IP addresses." + foreach ($ip in $ips) { + $props = $ip.IPAddressProperties | Where-Object { $_.Name -eq "TcpPort" -or $_.Name -eq "TcpDynamicPorts" } + + foreach ($prop in $props) { + if ([Microsoft.VisualBasic.Information]::IsNumeric($prop.value)) { + $port = $prop.value + if ($prop.name -eq 'TcpPort') { + $static = $true + } else { + $static = $false + } + } + } + [PsCustomObject]@{ + ComputerName = $instance + InstanceName = $instanceName + SqlInstance = $vsname + IPAddress = $ip.IPAddress.IPAddressToString + Port = $port + Static = $static + Type = "Normal" + } + } + } + } + + $computer = $instance.ComputerName + $resolved = Resolve-DbaNetworkName -ComputerName $instance + $computername = $resolved.FullComputerName + $fqdn = $resolved.Fqdn + + try { + Write-Message -Level Verbose -Message "Trying with ComputerName ($computer)." + $someIps = Invoke-ManagedComputerCommand -ComputerName $computer -Credential $Credential -ArgumentList $computer -ScriptBlock $scriptblock + } catch { + Write-Message -Level Verbose -Message "Trying with FullComputerName because ComputerName failed." + $someIps = Invoke-ManagedComputerCommand -ComputerName $computername -Credential $Credential -ArgumentList $fqdn -ScriptBlock $scriptblock + } + } catch { + Stop-Function -Message "Could not get all information." -Target $instance -ErrorRecord $_ + } + + $results = $someIps | Sort-Object IPAddress + + if ($ExcludeIpv6) { + $octet = '(?:0?0?[0-9]|0?[1-9][0-9]|1[0-9]{2}|2[0-5][0-5]|2[0-4][0-9])' + [regex]$ipv4 = "^(?:$octet\.){3}$octet$" + $results = $results | Where-Object { $_.IPAddress -match $ipv4 } + } + + $results + } + #Default Execution of Get-DbaTcpPort + if (-not $All -or ($All -and ($null -eq $someIps))) { + try { + $server = Connect-SqlInstance -SqlInstance "TCP:$instance" -SqlCredential $SqlCredential -MinimumVersion 9 + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target "TCP:$instance" -Continue + } + + # WmiComputer can be unreliable :( Use T-SQL + $sql = "SELECT local_net_address,local_tcp_port FROM sys.dm_exec_connections WHERE session_id = @@SPID" + $port = $server.Query($sql) + + [PsCustomObject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + IPAddress = $port.local_net_address + Port = $port.local_tcp_port + Static = $true + Type = "Normal" + } | Select-DefaultView -Property ComputerName, InstanceName, SqlInstance, IPAddress, Port + } + } + } +} +function Get-DbaTempdbUsage { + <# + .SYNOPSIS + Gets Tempdb usage for running queries. + + .DESCRIPTION + This function queries DMVs for running sessions using tempdb and returns results if those sessions have user or internal space allocated or deallocated against them. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. + + .PARAMETER SqlCredential + If you want to use alternative credentials to connect to the server. + + .PARAMETER WhatIf + Shows what would happen if the command were to run. No actions are actually performed. + + .PARAMETER Confirm + Prompts you for confirmation before executing any changing operations within the command. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Tempdb, Space + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaTempdbUsage + + .EXAMPLE + PS C:\> Get-DbaTempdbUsage -SqlInstance localhost\SQLDEV2K14 + + Gets tempdb usage for localhost\SQLDEV2K14 + + #> + [CmdletBinding()] + param ( + [parameter(Mandatory, ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [Alias('Silent')] + [switch]$EnableException + ) + + process { + foreach ($instance in $SqlInstance) { + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $sqlcredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + if ($server.VersionMajor -le 9) { + Stop-Function -Message "This function is only supported in SQL Server 2008 or higher." -Continue + } + + $sql = "SELECT SERVERPROPERTY('MachineName') AS ComputerName, + ISNULL(SERVERPROPERTY('InstanceName'), 'MSSQLSERVER') AS InstanceName, + SERVERPROPERTY('ServerName') AS SqlInstance, + t.session_id AS Spid, + r.command AS StatementCommand, + SUBSTRING( est.[text], + (r.statement_start_offset / 2) + 1, + ((CASE r.statement_end_offset + WHEN-1 + THEN DATALENGTH(est.[text]) + ELSE + r.statement_end_offset + END - r.statement_start_offset + ) / 2 + ) + 1 + ) AS QueryText, + QUOTENAME(DB_NAME(r.database_id)) + N'.' + QUOTENAME(OBJECT_SCHEMA_NAME(est.objectid, est.dbid)) + N'.' + + QUOTENAME(OBJECT_NAME(est.objectid, est.dbid)) AS ProcedureName, + r.start_time AS StartTime, + tdb.UserObjectAllocated * 8 AS CurrentUserAllocatedKB, + (t.user_objects_alloc_page_count + tdb.UserObjectAllocated) * 8 AS TotalUserAllocatedKB, + tdb.UserObjectDeallocated * 8 AS UserDeallocatedKB, + (t.user_objects_dealloc_page_count + tdb.UserObjectDeallocated) * 8 AS TotalUserDeallocatedKB, + tdb.InternalObjectAllocated * 8 AS InternalAllocatedKB, + (t.internal_objects_alloc_page_count + tdb.InternalObjectAllocated) * 8 AS TotalInternalAllocatedKB, + tdb.InternalObjectDeallocated * 8 AS InternalDeallocatedKB, + (t.internal_objects_dealloc_page_count + tdb.InternalObjectDeallocated) * 8 AS TotalInternalDeallocatedKB, + r.reads AS RequestedReads, + r.writes AS RequestedWrites, + r.logical_reads AS RequestedLogicalReads, + r.cpu_time AS RequestedCPUTime, + s.is_user_process AS IsUserProcess, + s.[status] AS [Status], + DB_NAME(r.database_id) AS [Database], + s.login_name AS LoginName, + s.original_login_name AS OriginalLoginName, + s.nt_domain AS NTDomain, + s.nt_user_name AS NTUserName, + s.[host_name] AS HostName, + s.[program_name] AS ProgramName, + s.login_time AS LoginTime, + s.last_request_start_time AS LastRequestedStartTime, + s.last_request_end_time AS LastRequestedEndTime +FROM sys.dm_db_session_space_usage AS t +INNER JOIN sys.dm_exec_sessions AS s + ON s.session_id = t.session_id +LEFT JOIN sys.dm_exec_requests AS r + ON r.session_id = s.session_id +LEFT JOIN + ( SELECT _tsu.session_id, + _tsu.request_id, + SUM(_tsu.user_objects_alloc_page_count) AS UserObjectAllocated, + SUM(_tsu.user_objects_dealloc_page_count) AS UserObjectDeallocated, + SUM(_tsu.internal_objects_alloc_page_count) AS InternalObjectAllocated, + SUM(_tsu.internal_objects_dealloc_page_count) AS InternalObjectDeallocated + FROM tempdb.sys.dm_db_task_space_usage AS _tsu + GROUP BY _tsu.session_id, + _tsu.request_id + ) AS tdb + ON tdb.session_id = r.session_id + AND tdb.request_id = r.request_id +OUTER APPLY sys.dm_exec_sql_text(r.[sql_handle]) AS est +WHERE t.session_id != @@SPID + AND (tdb.UserObjectAllocated - tdb.UserObjectDeallocated + tdb.InternalObjectAllocated - tdb.InternalObjectDeallocated) != 0 +OPTION (RECOMPILE);" + + $server.Query($sql) + } + } +} +function Get-DbatoolsLog { + <# + .SYNOPSIS + Returns log entries for dbatools + + .DESCRIPTION + Returns log entries for dbatools. Handy when debugging or developing a script using it. + + .PARAMETER FunctionName + Default: "*" + Only messages written by similar functions will be returned. + + .PARAMETER ModuleName + Default: "*" + Only messages written by commands from similar modules will be returned. + + .PARAMETER Target + Only messags handling the specified target will be returned. + + .PARAMETER Tag + Only messages containing one of these tags will be returned. + + .PARAMETER Last + Only messages written by the last X executions will be returned. + Uses Get-History to determine execution. Ignores Get-message commands. + By default, this will also include messages from other runspaces. If your command executes in parallel, that's useful. + If it doesn't and you were offloading executions to other runspaces, consider also filtering by runspace using '-Runspace' + + .PARAMETER Skip + How many executions to skip when specifying '-Last'. + Has no effect without the '-Last' parameter. + + .PARAMETER Raw + By default, messages such as SQL statements are flattened. Use raw to see the output without flattened formatting. + + .PARAMETER Runspace + The guid of the runspace to return messages from. + By default, messages from all runspaces are returned. + Run the following line to see the list of guids: + + Get-Runspace | ft Id, Name, InstanceId -Autosize + + .PARAMETER Level + Limit the message selection by level. + Message levels have a numeric value, making it easier to select a range: + + -Level (1..6) + + Will select the first 6 levels (Critical - SomewhatVerbose). + + .PARAMETER Errors + Instead of log entries, the error entries will be retrieved + + .NOTES + Tags: Debug + Author: Friedrich Weinmann (@FredWeinmann) + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbatoolsLog + + .EXAMPLE + PS C:\> Get-DbatoolsLog + + Returns all log entries currently in memory. + + .EXAMPLE + PS C:\> Get-DbatoolsLog -Target "a" -Last 1 -Skip 1 + + Returns all log entries that targeted the object "a" in the second last execution sent. + + .EXAMPLE + PS C:\> Get-DbatoolsLog -Tag "fail" -Last 5 + + Returns all log entries within the last 5 executions that contained the tag "fail" + + #> + [CmdletBinding()] + param ( + [string]$FunctionName = "*", + [string]$ModuleName = "*", + [AllowNull()] + [object]$Target, + [string[]]$Tag, + [int]$Last, + [int]$Skip = 0, + [guid]$Runspace, + [Sqlcollaborative.Dbatools.Message.MessageLevel[]]$Level, + [switch]$Raw, + [switch]$Errors + ) + process { + if ($Errors) { + $messages = [Sqlcollaborative.Dbatools.Message.LogHost]::GetErrors() | Where-Object { + ($_.FunctionName -like $FunctionName) -and ($_.ModuleName -like $ModuleName) + } + } else { + $messages = [Sqlcollaborative.Dbatools.Message.LogHost]::GetLog() | Where-Object { + ($_.FunctionName -like $FunctionName) -and ($_.ModuleName -like $ModuleName) + } + } + + if (Test-Bound -ParameterName Target) { + $messages = $messages | Where-Object TargetObject -eq $Target + } + + if (Test-Bound -ParameterName Tag) { + $messages = $messages | Where-Object { + $_.Tags | Where-Object { + $_ -in $Tag + } + } + } + + if (Test-Bound -ParameterName Runspace) { + $messages = $messages | Where-Object Runspace -eq $Runspace + } + + if (Test-Bound -ParameterName Last) { + $history = Get-History | Where-Object CommandLine -NotLike "Get-DbatoolsLog*" | Select-Object -Last $Last -Skip $Skip + $start = $history[0].StartExecutionTime + $end = $history[-1].EndExecutionTime + + $messages = $messages | Where-Object { + ($_.Timestamp -gt $start) -and ($_.Timestamp -lt $end) -and ($_.Runspace -eq ([System.Management.Automation.Runspaces.Runspace]::DefaultRunspace.InstanceId)) + } + } + + if (Test-Bound -ParameterName Level) { + $messages = $messages | Where-Object Level -In $Level + } + + if ($Raw) { + return $messages + } else { + $messages | Select-Object -Property CallStack, ComputerName, File, FunctionName, Level, Line, @{ + Name = "Message" + Expression = { + $msg = ($_.Message.Split("`n") -join " ") + do { + $msg = $msg.Replace(' ', ' ') + } until ($msg -notmatch ' ') + $msg + } + }, ModuleName, Runspace, Tags, TargetObject, Timestamp, Type, Username + } + } +} +function Get-DbaTopResourceUsage { + <# + .SYNOPSIS + Returns the top 20 resource consumers for cached queries based on four different metrics: duration, frequency, IO, and CPU. + + .DESCRIPTION + Returns the top 20 resource consumers for cached queries based on four different metrics: duration, frequency, IO, and CPU. + + This command is based off of queries provided by Michael J. Swart at http://michaeljswart.com/go/Top20 + + Per Michael: "I've posted queries like this before, and others have written many other versions of this query. All these queries are based on sys.dm_exec_query_stats." + + .PARAMETER SqlInstance + The target SQL Server instance or instances. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Database + The database(s) to process - this list is auto-populated from the server. If unspecified, all databases will be processed. + + .PARAMETER ExcludeDatabase + The database(s) to exclude - this list is auto-populated from the server + + .PARAMETER ExcludeSystem + This will exclude system objects like replication procedures from being returned. + + .PARAMETER Type + By default, all Types run but you can specify one or more of the following: Duration, Frequency, IO, or CPU + + .PARAMETER Limit + By default, these query the Top 20 worst offenders (though more than 20 results can be returned if each of the top 20 have more than 1 subsequent result) + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Query, Performance + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaTopResourceUsage + + .EXAMPLE + PS C:\> Get-DbaTopResourceUsage -SqlInstance sql2008, sql2012 + + Return the 80 (20 x 4 types) top usage results by duration, frequency, IO, and CPU servers for servers sql2008 and sql2012 + + .EXAMPLE + PS C:\> Get-DbaTopResourceUsage -SqlInstance sql2008 -Type Duration, Frequency -Database TestDB + + Return the highest usage by duration (top 20) and frequency (top 20) for the TestDB on sql2008 + + .EXAMPLE + PS C:\> Get-DbaTopResourceUsage -SqlInstance sql2016 -Limit 30 + + Return the highest usage by duration (top 30) and frequency (top 30) for the TestDB on sql2016 + + .EXAMPLE + PS C:\> Get-DbaTopResourceUsage -SqlInstance sql2008, sql2012 -ExcludeSystem + + Return the 80 (20 x 4 types) top usage results by duration, frequency, IO, and CPU servers for servers sql2008 and sql2012 without any System Objects + + .EXAMPLE + PS C:\> Get-DbaTopResourceUsage -SqlInstance sql2016| Select-Object * + + Return all the columns plus the QueryPlan column + + #> + [CmdletBinding()] + param ( + [parameter(Position = 0, Mandatory, ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer", "SqlServers")] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [Alias("Databases")] + [object[]]$Database, + [object[]]$ExcludeDatabase, + [ValidateSet("All", "Duration", "Frequency", "IO", "CPU")] + [string[]]$Type = "All", + [int]$Limit = 20, + [Alias('Silent')] + [switch]$EnableException, + [switch]$ExcludeSystem + ) + + begin { + + $instancecolumns = " SERVERPROPERTY('MachineName') AS ComputerName, + ISNULL(SERVERPROPERTY('InstanceName'), 'MSSQLSERVER') AS InstanceName, + SERVERPROPERTY('ServerName') AS SqlInstance, " + + if ($database) { + $wheredb = " and coalesce(db_name(st.dbid), db_name(cast(pa.value AS INT)), 'Resource') in ('$($database -join '', '')')" + } + + if ($ExcludeDatabase) { + $wherenotdb = " and coalesce(db_name(st.dbid), db_name(cast(pa.value AS INT)), 'Resource') notin '$($excludedatabase -join '', '')'" + } + + if ($ExcludeSystem) { + $whereexcludesystem = " AND coalesce(object_name(st.objectid, st.dbid), '') NOT LIKE 'sp_MS%' " + } + $duration = ";with long_queries as + ( + select top $Limit + query_hash, + sum(total_elapsed_time) elapsed_time + from sys.dm_exec_query_stats + where query_hash <> 0x0 + group by query_hash + order by sum(total_elapsed_time) desc + ) + select $instancecolumns + coalesce(db_name(st.dbid), db_name(cast(pa.value AS INT)), 'Resource') AS [Database], + coalesce(object_name(st.objectid, st.dbid), '') as ObjectName, + qs.query_hash as QueryHash, + qs.total_elapsed_time / 1000 as TotalElapsedTimeMs, + qs.execution_count as ExecutionCount, + cast((total_elapsed_time / 1000) / (execution_count + 0.0) as money) as AverageDurationMs, + lq.elapsed_time / 1000 as QueryTotalElapsedTimeMs, + SUBSTRING(st.TEXT,(qs.statement_start_offset + 2) / 2, + (CASE + WHEN qs.statement_end_offset = -1 THEN LEN(CONVERT(NVARCHAR(MAX),st.text)) * 2 + ELSE qs.statement_end_offset + END - qs.statement_start_offset) / 2) as QueryText, + qp.query_plan as QueryPlan + from sys.dm_exec_query_stats qs + join long_queries lq + on lq.query_hash = qs.query_hash + cross apply sys.dm_exec_sql_text(qs.sql_handle) st + cross apply sys.dm_exec_query_plan (qs.plan_handle) qp + outer apply sys.dm_exec_plan_attributes(qs.plan_handle) pa + where pa.attribute = 'dbid' $wheredb $wherenotdb $whereexcludesystem + order by lq.elapsed_time desc, + lq.query_hash, + qs.total_elapsed_time desc + option (recompile)" + + $frequency = ";with frequent_queries as + ( + select top $Limit + query_hash, + sum(execution_count) executions + from sys.dm_exec_query_stats + where query_hash <> 0x0 + group by query_hash + order by sum(execution_count) desc + ) + select $instancecolumns + coalesce(db_name(st.dbid), db_name(cast(pa.value AS INT)), 'Resource') AS [Database], + coalesce(object_name(st.objectid, st.dbid), '') as ObjectName, + qs.query_hash as QueryHash, + qs.execution_count as ExecutionCount, + executions as QueryTotalExecutions, + SUBSTRING(st.TEXT,(qs.statement_start_offset + 2) / 2, + (CASE + WHEN qs.statement_end_offset = -1 THEN LEN(CONVERT(NVARCHAR(MAX),st.text)) * 2 + ELSE qs.statement_end_offset + END - qs.statement_start_offset) / 2) as QueryText, + qp.query_plan as QueryPlan + from sys.dm_exec_query_stats qs + join frequent_queries fq + on fq.query_hash = qs.query_hash + cross apply sys.dm_exec_sql_text(qs.sql_handle) st + cross apply sys.dm_exec_query_plan (qs.plan_handle) qp + outer apply sys.dm_exec_plan_attributes(qs.plan_handle) pa + where pa.attribute = 'dbid' $wheredb $wherenotdb $whereexcludesystem + order by fq.executions desc, + fq.query_hash, + qs.execution_count desc + option (recompile)" + + $io = ";with high_io_queries as + ( + select top $Limit + query_hash, + sum(total_logical_reads + total_logical_writes) io + from sys.dm_exec_query_stats + where query_hash <> 0x0 + group by query_hash + order by sum(total_logical_reads + total_logical_writes) desc + ) + select $instancecolumns + coalesce(db_name(st.dbid), db_name(cast(pa.value AS INT)), 'Resource') AS [Database], + coalesce(object_name(st.objectid, st.dbid), '') as ObjectName, + qs.query_hash as QueryHash, + qs.total_logical_reads + total_logical_writes as TotalIO, + qs.execution_count as ExecutionCount, + cast((total_logical_reads + total_logical_writes) / (execution_count + 0.0) as money) as AverageIO, + io as QueryTotalIO, + SUBSTRING(st.TEXT,(qs.statement_start_offset + 2) / 2, + (CASE + WHEN qs.statement_end_offset = -1 THEN LEN(CONVERT(NVARCHAR(MAX),st.text)) * 2 + ELSE qs.statement_end_offset + END - qs.statement_start_offset) / 2) as QueryText, + qp.query_plan as QueryPlan + from sys.dm_exec_query_stats qs + join high_io_queries fq + on fq.query_hash = qs.query_hash + cross apply sys.dm_exec_sql_text(qs.sql_handle) st + cross apply sys.dm_exec_query_plan (qs.plan_handle) qp + outer apply sys.dm_exec_plan_attributes(qs.plan_handle) pa + where pa.attribute = 'dbid' $wheredb $wherenotdb $whereexcludesystem + order by fq.io desc, + fq.query_hash, + qs.total_logical_reads + total_logical_writes desc + option (recompile)" + + $cpu = ";with high_cpu_queries as + ( + select top $Limit + query_hash, + sum(total_worker_time) cpuTime + from sys.dm_exec_query_stats + where query_hash <> 0x0 + group by query_hash + order by sum(total_worker_time) desc + ) + select $instancecolumns + coalesce(db_name(st.dbid), db_name(cast(pa.value AS INT)), 'Resource') AS [Database], + coalesce(object_name(st.objectid, st.dbid), '') as ObjectName, + qs.query_hash as QueryHash, + qs.total_worker_time as CpuTime, + qs.execution_count as ExecutionCount, + cast(total_worker_time / (execution_count + 0.0) as money) as AverageCpuMs, + cpuTime as QueryTotalCpu, + SUBSTRING(st.TEXT,(qs.statement_start_offset + 2) / 2, + (CASE + WHEN qs.statement_end_offset = -1 THEN LEN(CONVERT(NVARCHAR(MAX),st.text)) * 2 + ELSE qs.statement_end_offset + END - qs.statement_start_offset) / 2) as QueryText, + qp.query_plan as QueryPlan + from sys.dm_exec_query_stats qs + join high_cpu_queries hcq + on hcq.query_hash = qs.query_hash + cross apply sys.dm_exec_sql_text(qs.sql_handle) st + cross apply sys.dm_exec_query_plan (qs.plan_handle) qp + outer apply sys.dm_exec_plan_attributes(qs.plan_handle) pa + where pa.attribute = 'dbid' $wheredb $wherenotdb $whereexcludesystem + order by hcq.cpuTime desc, + hcq.query_hash, + qs.total_worker_time desc + option (recompile)" + } + + process { + foreach ($instance in $SqlInstance) { + + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential -MinimumVersion 10 + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + if ($server.ConnectionContext.StatementTimeout -ne 0) { + $server.ConnectionContext.StatementTimeout = 0 + } + + if ($Type -in "All", "Duration") { + try { + Write-Message -Level Debug -Message "Executing SQL: $duration" + $server.Query($duration) | Select-DefaultView -ExcludeProperty QueryPlan + } catch { + Stop-Function -Message "Failure executing query for duration." -ErrorRecord $_ -Target $server -Continue + } + } + + if ($Type -in "All", "Frequency") { + try { + Write-Message -Level Debug -Message "Executing SQL: $frequency" + $server.Query($frequency) | Select-DefaultView -ExcludeProperty QueryPlan + } catch { + Stop-Function -Message "Failure executing query for frequency." -ErrorRecord $_ -Target $server -Continue + } + } + + if ($Type -in "All", "IO") { + try { + Write-Message -Level Debug -Message "Executing SQL: $io" + $server.Query($io) | Select-DefaultView -ExcludeProperty QueryPlan + } catch { + Stop-Function -Message "Failure executing query for IO." -ErrorRecord $_ -Target $server -Continue + } + } + + if ($Type -in "All", "CPU") { + try { + Write-Message -Level Debug -Message "Executing SQL: $cpu" + $server.Query($cpu) | Select-DefaultView -ExcludeProperty QueryPlan + } catch { + Stop-Function -Message "Failure executing query for CPU." -ErrorRecord $_ -Target $server -Continue + } + } + } + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function Get-DbaTrace { + <# + .SYNOPSIS + Gets a list of trace(s) from specified SQL Server Instance + + .DESCRIPTION + This function returns a list of traces on a SQL Server instance and identifies the default trace file + + .PARAMETER SqlInstance + The target SQL Server instance or instances + + .PARAMETER SqlCredential + A credential to use to connect to the SQL Instance rather than using Windows Authentication + + .PARAMETER Id + The id(s) of the Trace + + .PARAMETER Default + Switch that will only return the information for the default system trace + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Security, Trace + Author: Garry Bargsley (@gbargsley), http://blog.garrybargsley.com + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .EXAMPLE + PS C:\> Get-DbaTrace -SqlInstance sql2016 + + Lists all the trace files on the sql2016 SQL Server. + + .EXAMPLE + PS C:\> Get-DbaTrace -SqlInstance sql2016 -Default + + Lists the default trace information on the sql2016 SQL Server. + + #> + [CmdletBinding()] + param ( + [parameter(Position = 0, Mandatory, ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [int[]]$Id, + [switch]$Default, + [switch][Alias('Silent')] + $EnableException + ) + begin { + Test-DbaDeprecation -DeprecatedOn "1.0.0" -Alias Get-DbaTraceFile + + # A Microsoft.SqlServer.Management.Trace.TraceServer class exists but is buggy + # and requires x86 PowerShell. So we'll go with T-SQL. + $sql = "SELECT id, status, path, max_size, stop_time, max_files, is_rowset, is_rollover, is_shutdown, is_default, buffer_count, buffer_size, file_position, reader_spid, start_time, last_event_time, event_count, dropped_event_count FROM sys.traces" + + if ($Id) { + $idstring = $Id -join "," + $sql = "$sql WHERE id in ($idstring)" + } + } + process { + foreach ($instance in $SqlInstance) { + + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential -MinimumVersion 9 + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + return + } + + try { + $results = $server.Query($sql) + } catch { + Stop-Function -Message "Issue collecting trace data on $server" -Target $server -ErrorRecord $_ + } + + if ($Default) { + $results = $results | Where-Object { $_.is_default } + } + + foreach ($row in $results) { + if ($row.Path.ToString().Length -gt 0) { + $remotefile = Join-AdminUnc -servername $server.ComputerName -filepath $row.path + } else { + $remotefile = $null + } + + [PSCustomObject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + Id = $row.id + Status = $row.status + IsRunning = ($row.status -eq 1) + Path = $row.path + RemotePath = $remotefile + MaxSize = $row.max_size + StopTime = $row.stop_time + MaxFiles = $row.max_files + IsRowset = $row.is_rowset + IsRollover = $row.is_rollover + IsShutdown = $row.is_shutdown + IsDefault = $row.is_default + BufferCount = $row.buffer_count + BufferSize = $row.buffer_size + FilePosition = $row.file_position + ReaderSpid = $row.reader_spid + StartTime = $row.start_time + LastEventTime = $row.last_event_time + EventCount = $row.event_count + DroppedEventCount = $row.dropped_event_count + Parent = $server + SqlCredential = $SqlCredential + } | Select-DefaultView -ExcludeProperty Parent, RemotePath, RemoStatus, SqlCredential + } + } + } +} +function Get-DbaTraceFlag { + <# + .SYNOPSIS + Get global Trace Flag(s) information for each instance(s) of SQL Server. + + .DESCRIPTION + Returns Trace Flags that are enabled globally on each instance(s) of SQL Server as an object. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. This can be a collection and receive pipeline input to allow the function to be executed against multiple SQL Server instances. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER TraceFlag + Use this switch to filter to a specific Trace Flag. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: TraceFlag, DBCC + Author: Kevin Bullen (@sqlpadawan) + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + References: https://docs.microsoft.com/en-us/sql/t-sql/database-console-commands/dbcc-traceon-trace-flags-transact-sql + + .LINK + https://dbatools.io/Get-DbaTraceFlag + + .EXAMPLE + PS C:\> Get-DbaTraceFlag -SqlInstance localhost + + Returns all Trace Flag information on the local default SQL Server instance + + .EXAMPLE + PS C:\> Get-DbaTraceFlag -SqlInstance localhost, sql2016 + + Returns all Trace Flag(s) for the local and sql2016 SQL Server instances + + .EXAMPLE + PS C:\> Get-DbaTraceFlag -SqlInstance localhost -TraceFlag 4199,3205 + + Returns Trace Flag status for TF 4199 and 3205 for the local SQL Server instance if they are enabled. + + #> + [CmdletBinding()] + param ( + [parameter(Position = 0, Mandatory, ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential] + $SqlCredential, + [int[]]$TraceFlag, + [Alias('Silent')] + [switch]$EnableException + ) + + process { + foreach ($instance in $SqlInstance) { + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + $tflags = $server.EnumActiveGlobalTraceFlags() + + if ($tFlags.Rows.Count -eq 0) { + Write-Message -Level Output -Message "No global trace flags enabled" + return + } + + if ($TraceFlag) { + $tflags = $tflags | Where-Object TraceFlag -In $TraceFlag + } + + foreach ($tflag in $tflags) { + [pscustomobject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + TraceFlag = $tflag.TraceFlag + Global = $tflag.Global + Session = $tflag.Session + Status = $tflag.Status + } | Select-DefaultView -ExcludeProperty 'Session' + } + } + } +} +function Get-DbaUptime { + <# + .SYNOPSIS + Returns the uptime of the SQL Server instance, and if required the hosting windows server + + .DESCRIPTION + By default, this command returns for each SQL Server instance passed in: + SQL Instance last startup time, Uptime as a PS TimeSpan, Uptime as a formatted string + Hosting Windows server last startup time, Uptime as a PS TimeSpan, Uptime as a formatted string + + .PARAMETER SqlInstance + The target SQL Server instance or instances. + + .PARAMETER SqlCredential + Allows you to login to servers using SQL Logins instead of Windows Authentication (AKA Integrated or Trusted). To use: + + $scred = Get-Credential, then pass $scred object to the -SqlCredential parameter. + + Windows Authentication will be used if SqlCredential is not specified. SQL Server does not accept Windows credentials being passed as credentials. + + To connect to SQL Server as a different Windows user, run PowerShell as that user. + + .PARAMETER Credential + Allows you to login to the computer (not SQL Server instance) using alternative Windows credentials. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: CIM + Author: Stuart Moore (@napalmgram), stuart-moore.com + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaUptime + + .EXAMPLE + PS C:\> Get-DbaUptime -SqlInstance SqlBox1\Instance2 + + Returns an object with SQL Server start time, uptime as TimeSpan object, uptime as a string, and Windows host boot time, host uptime as TimeSpan objects and host uptime as a string for the sqlexpress instance on winserver + + .EXAMPLE + PS C:\> Get-DbaUptime -SqlInstance winserver\sqlexpress, sql2016 + + Returns an object with SQL Server start time, uptime as TimeSpan object, uptime as a string, and Windows host boot time, host uptime as TimeSpan objects and host uptime as a string for the sqlexpress instance on host winserver and the default instance on host sql2016 + + .EXAMPLE + PS C:\> Get-DbaCmsRegServer -SqlInstance sql2014 | Get-DbaUptime + + Returns an object with SQL Server start time, uptime as TimeSpan object, uptime as a string, and Windows host boot time, host uptime as TimeSpan objects and host uptime as a string for every server listed in the Central Management Server on sql2014 + + #> + [CmdletBinding(DefaultParameterSetName = "Default")] + param ( + [parameter(Mandatory, ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer", "ComputerName")] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [PSCredential]$Credential, + [Alias('Silent')] + [switch]$EnableException + ) + + begin { + $nowutc = (Get-Date).ToUniversalTime() + } + process { + # uses cim commands + + + foreach ($instance in $SqlInstance) { + if ($instance.Gettype().FullName -eq [System.Management.Automation.PSCustomObject] ) { + $servername = $instance.SqlInstance + } elseif ($instance.Gettype().FullName -eq [Microsoft.SqlServer.Management.Smo.Server]) { + $servername = $instance.ComputerName + } else { + $servername = $instance.ComputerName; + } + + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $sqlcredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + Write-Message -Level Verbose -Message "Getting start times for $servername" + #Get tempdb creation date + [dbadatetime]$SQLStartTime = $server.Databases["tempdb"].CreateDate + $SQLUptime = New-TimeSpan -Start $SQLStartTime.ToUniversalTime() -End $nowutc + $SQLUptimeString = "{0} days {1} hours {2} minutes {3} seconds" -f $($SQLUptime.Days), $($SQLUptime.Hours), $($SQLUptime.Minutes), $($SQLUptime.Seconds) + + $WindowsServerName = (Resolve-DbaNetworkName $servername -Credential $Credential).FullComputerName + + try { + Write-Message -Level Verbose -Message "Getting WinBootTime via CimInstance for $servername" + $WinBootTime = (Get-DbaOperatingSystem -ComputerName $windowsServerName -Credential $Credential -ErrorAction SilentlyContinue).LastBootTime + $WindowsUptime = New-TimeSpan -start $WinBootTime.ToUniversalTime() -end $nowutc + $WindowsUptimeString = "{0} days {1} hours {2} minutes {3} seconds" -f $($WindowsUptime.Days), $($WindowsUptime.Hours), $($WindowsUptime.Minutes), $($WindowsUptime.Seconds) + } catch { + try { + Write-Message -Level Verbose -Message "Getting WinBootTime via CimInstance DCOM" + $CimOption = New-CimSessionOption -Protocol DCOM + $CimSession = New-CimSession -Credential:$Credential -ComputerName $WindowsServerName -SessionOption $CimOption + [dbadatetime]$WinBootTime = ($CimSession | Get-CimInstance -ClassName Win32_OperatingSystem).LastBootUpTime + $WindowsUptime = New-TimeSpan -start $WinBootTime.ToUniversalTime() -end $nowutc + $WindowsUptimeString = "{0} days {1} hours {2} minutes {3} seconds" -f $($WindowsUptime.Days), $($WindowsUptime.Hours), $($WindowsUptime.Minutes), $($WindowsUptime.Seconds) + } catch { + Stop-Function -Message "Failure getting WinBootTime" -ErrorRecord $_ -Target $instance -Continue + } + } + + [PSCustomObject]@{ + ComputerName = $WindowsServerName + InstanceName = $server.ServiceName + SqlServer = $server.Name + SqlUptime = $SQLUptime + WindowsUptime = $WindowsUptime + SqlStartTime = $SQLStartTime + WindowsBootTime = $WinBootTime + SinceSqlStart = $SQLUptimeString + SinceWindowsBoot = $WindowsUptimeString + } + } + } +} +function Get-DbaUserPermission { + <# + .SYNOPSIS + Displays detailed permissions information for the server and database roles and securables. + + .DESCRIPTION + This command will display all server logins, server level securables, database logins and database securables. + + DISA STIG implementators will find this command useful as it uses Permissions.sql provided by DISA. + + Note that if you Ctrl-C out of this command and end it prematurely, it will leave behind a STIG schema in tempdb. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Database + The database(s) to process - this list is auto-populated from the server. If unspecified, all databases will be processed. + + .PARAMETER ExcludeDatabase + The database(s) to exclude - this list is auto-populated from the server + + .PARAMETER ExcludeSystemDatabase + Allows you to suppress output on system databases + + .PARAMETER IncludePublicGuest + Allows you to include output for public and guest grants. + + .PARAMETER IncludeSystemObjects + Allows you to include output on sys schema objects. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Discovery, Permissions, Security + Author: Brandon Abshire, netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaUserPermission + + .EXAMPLE + PS C:\> Get-DbaUserPermission -SqlInstance sql2008, sqlserver2012 + + Check server and database permissions for servers sql2008 and sqlserver2012. + + .EXAMPLE + PS C:\> Get-DbaUserPermission -SqlInstance sql2008 -Database TestDB + + Check server and database permissions on server sql2008 for only the TestDB database + + .EXAMPLE + PS C:\> Get-DbaUserPermission -SqlInstance sql2008 -Database TestDB -IncludePublicGuest -IncludeSystemObjects + + Check server and database permissions on server sql2008 for only the TestDB database, + including public and guest grants, and sys schema objects. + + #> + [CmdletBinding()] + param ( + [parameter(Position = 0, Mandatory, ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer", "SqlServers")] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [Alias("Databases")] + [object[]]$Database, + [object[]]$ExcludeDatabase, + [parameter(Position = 1)] + [switch]$ExcludeSystemDatabase, + [switch]$IncludePublicGuest, + [switch]$IncludeSystemObjects, + [Alias('Silent')] + [switch]$EnableException + ) + + begin { + $endSQL = " BEGIN TRY DROP FUNCTION STIG.server_effective_permissions END TRY BEGIN CATCH END CATCH; + GO + BEGIN TRY DROP VIEW STIG.server_permissions END TRY BEGIN CATCH END CATCH; + GO + BEGIN TRY DROP FUNCTION STIG.members_of_server_role END TRY BEGIN CATCH END CATCH; + GO + BEGIN TRY DROP FUNCTION STIG.server_roles_of END TRY BEGIN CATCH END CATCH; + GO + BEGIN TRY DROP VIEW STIG.server_role_members END TRY BEGIN CATCH END CATCH; + GO + BEGIN TRY DROP FUNCTION STIG.database_effective_permissions END TRY BEGIN CATCH END CATCH; + GO + BEGIN TRY DROP VIEW STIG.database_permissions END TRY BEGIN CATCH END CATCH; + GO + BEGIN TRY DROP FUNCTION STIG.members_of_db_role END TRY BEGIN CATCH END CATCH; + GO + BEGIN TRY DROP FUNCTION STIG.database_roles_of END TRY BEGIN CATCH END CATCH; + GO + BEGIN TRY DROP VIEW STIG.database_role_members END TRY BEGIN CATCH END CATCH; + GO + BEGIN TRY DROP SCHEMA STIG END TRY BEGIN CATCH END CATCH; + GO" + + + $serverSQL = "SELECT 'SERVER LOGINS' AS Type , + sl.name AS Member , + ISNULL(srm.Role, 'None') AS [Role/Securable/Class] , + ' ' AS [Schema/Owner] , + ' ' AS [Securable] , + ' ' AS [Grantee Type] , + ' ' AS [Grantee] , + ' ' AS [Permission] , + ' ' AS [State] , + ' ' AS [Grantor] , + ' ' AS [Grantor Type] , + ' ' AS [Source View] + FROM master.sys.syslogins sl + LEFT JOIN tempdb.[STIG].[server_role_members] srm ON sl.name = srm.Member + WHERE sl.name NOT LIKE 'NT %' + AND sl.name NOT LIKE '##%' + UNION + SELECT 'SERVER SECURABLES' AS Type , + sl.name , + sp.[Securable Class] COLLATE SQL_Latin1_General_CP1_CI_AS , + ' ' , + sp.[Securable] , + sp.[Grantee Type] COLLATE SQL_Latin1_General_CP1_CI_AS , + sp.Grantee , + sp.Permission COLLATE SQL_Latin1_General_CP1_CI_AS , + sp.State COLLATE SQL_Latin1_General_CP1_CI_AS , + sp.Grantor , + sp.[Grantor Type] COLLATE SQL_Latin1_General_CP1_CI_AS , + sp.[Source View] + FROM master.sys.syslogins sl + LEFT JOIN tempdb.[STIG].[server_permissions] sp ON sl.name = sp.Grantee + WHERE sl.name NOT LIKE 'NT %' + AND sl.name NOT LIKE '##%';" + + $dbSQL = "SELECT 'DB ROLE MEMBERS' AS type , + Member , + Role , + ' ' AS [Schema/Owner] , + ' ' AS [Securable] , + ' ' AS [Grantee Type] , + ' ' AS [Grantee] , + ' ' AS [Permission] , + ' ' AS [State] , + ' ' AS [Grantor] , + ' ' AS [Grantor Type] , + ' ' AS [Source View] + FROM tempdb.[STIG].[database_role_members] + UNION + SELECT DISTINCT + 'DB SECURABLES' AS Type , + drm.Member , + dp.[Securable Type or Class] COLLATE SQL_Latin1_General_CP1_CI_AS , + dp.[Schema/Owner] , + dp.Securable , + dp.[Grantee Type] COLLATE SQL_Latin1_General_CP1_CI_AS , + dp.Grantee , + dp.Permission COLLATE SQL_Latin1_General_CP1_CI_AS , + dp.State COLLATE SQL_Latin1_General_CP1_CI_AS , + dp.Grantor , + dp.[Grantor Type] COLLATE SQL_Latin1_General_CP1_CI_AS , + dp.[Source View] + FROM tempdb.[STIG].[database_role_members] drm + LEFT JOIN tempdb.[STIG].[database_permissions] dp ON ( drm.Member = dp.Grantee + OR drm.Role = dp.Grantee + ) + WHERE dp.Grantor IS NOT NULL + AND [Schema/Owner] <> 'sys'" + + if ($IncludePublicGuest) { $dbSQL = $dbSQL.Replace("LEFT JOIN", "FULL JOIN") } + if ($IncludeSystemObjects) { $dbSQL = $dbSQL.Replace("AND [Schema/Owner] <> 'sys'", "") } + + } + + process { + foreach ($instance in $SqlInstance) { + + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential -MinimumVersion 10 + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + $dbs = $server.Databases + $tempdb = $server.Databases['tempdb'] + + if ($Database) { + $dbs = $dbs | Where-Object { $Database -contains $_.Name } + } + + if ($ExcludeDatabase) { + $dbs = $dbs | Where-Object Name -NotIn $ExcludeDatabase + } + + if ($ExcludeSystemDatabase) { + $dbs = $dbs | Where-Object IsSystemObject -eq $false + } + + #reset $serverDT + $serverDT = $null + + foreach ($db in $dbs) { + Write-Message -Level Verbose -Message "Processing $db on $instance" + + $db.ExecuteNonQuery($endSQL) + + if ($db.IsAccessible -eq $false) { + Stop-Function -Message "The database $db is not accessible" -Continue + } + + $sql = [System.IO.File]::ReadAllText("$script:PSModuleRoot\bin\stig.sql") + $sql = $sql.Replace("", $db.Name) + + #Create objects in active database + Write-Message -Level Verbose -Message "Creating objects" + try { + $db.ExecuteNonQuery($sql) + } catch { + # here to avoid an empty catch + $null = 1 + } # sometimes it complains about not being able to drop the stig schema if the person Ctrl-C'd before. + + #Grab permissions data + if (-not $serverDT) { + Write-Message -Level Verbose -Message "Building data table for server objects" + + try { + $serverDT = $db.Query($serverSQL) + } catch { + # here to avoid an empty catch + $null = 1 + } + + foreach ($row in $serverDT) { + [PSCustomObject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + Object = 'SERVER' + Type = $row.Type + Member = $row.Member + RoleSecurableClass = $row.'Role/Securable/Class' + SchemaOwner = $row.'Schema/Owner' + Securable = $row.Securable + GranteeType = $row.'Grantee Type' + Grantee = $row.Grantee + Permission = $row.Permission + State = $row.State + Grantor = $row.Grantor + GrantorType = $row.'Grantor Type' + SourceView = $row.'Source View' + } + } + } + + Write-Message -Level Verbose -Message "Building data table for $db objects" + try { + $dbDT = $db.Query($dbSQL) + } catch { + # here to avoid an empty catch + $null = 1 + } + + foreach ($row in $dbDT) { + [PSCustomObject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + Object = $db.Name + Type = $row.Type + Member = $row.Member + RoleSecurableClass = $row.'Role/Securable/Class' + SchemaOwner = $row.'Schema/Owner' + Securable = $row.Securable + GranteeType = $row.'Grantee Type' + Grantee = $row.Grantee + Permission = $row.Permission + State = $row.State + Grantor = $row.Grantor + GrantorType = $row.'Grantor Type' + SourceView = $row.'Source View' + } + } + + #Delete objects + Write-Message -Level Verbose -Message "Deleting objects" + try { + $tempdb.ExecuteNonQuery($endSQL) + } catch { + # here to avoid an empty catch + $null = 1 + } + #Sashay Away + } + } + } + end { + Test-DbaDeprecation -DeprecatedOn "1.0.0" -EnableException:$false -Alias Get-DbaUserLevelPermission + } +} +function Get-DbaWaitingTask { + <# + .SYNOPSIS + Displays waiting task. + + .DESCRIPTION + This command is based on waiting task T-SQL script published by Paul Randal. + Reference: https://www.sqlskills.com/blogs/paul/updated-sys-dm_os_waiting_tasks-script-2/ + + .PARAMETER SqlInstance + The target SQL Server instance or instances. Server version must be SQL Server version XXXX or higher. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Spid + Find the waiting task of one or more specific process ids + + .PARAMETER IncludeSystemSpid + If this switch is enabled, the output will include the system sessions. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Waits,Task,WaitTask + Author: Shawn Melton (@wsmelton), https://wsmelton.github.io + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaWaitingTask + + .EXAMPLE + PS C:\> Get-DbaWaitingTask -SqlInstance sqlserver2014a + + Returns the waiting task for all sessions on sqlserver2014a + + .EXAMPLE + PS C:\> Get-DbaWaitingTask -SqlInstance sqlserver2014a -IncludeSystemSpid + + Returns the waiting task for all sessions (user and system) on sqlserver2014a + + #> + [CmdletBinding()] + param ( + [parameter(Position = 0, Mandatory, ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer", "SqlServers")] + [DbaInstance[]]$SqlInstance, + [PSCredential]$SqlCredential, + [parameter(ValueFromPipelineByPropertyName = $true)] + [object[]]$Spid, + [switch]$IncludeSystemSpid, + [Alias('Silent')] + [switch]$EnableException + ) + + begin { + $sql = " + SELECT + [owt].[session_id] AS [Spid], + [owt].[exec_context_id] AS [Thread], + [ot].[scheduler_id] AS [Scheduler], + [owt].[wait_duration_ms] AS [WaitMs], + [owt].[wait_type] AS [WaitType], + [owt].[blocking_session_id] AS [BlockingSpid], + [owt].[resource_description] AS [ResourceDesc], + CASE [owt].[wait_type] + WHEN N'CXPACKET' THEN + RIGHT ([owt].[resource_description], + CHARINDEX (N'=', REVERSE ([owt].[resource_description])) - 1) + ELSE NULL + END AS [NodeId], + [eqmg].[dop] AS [Dop], + [er].[database_id] AS [DbId], + [est].text AS [SqlText], + [eqp].[query_plan] AS [QueryPlan], + CAST ('https://www.sqlskills.com/help/waits/' + [owt].[wait_type] as XML) AS [URL] + FROM sys.dm_os_waiting_tasks [owt] + INNER JOIN sys.dm_os_tasks [ot] ON + [owt].[waiting_task_address] = [ot].[task_address] + INNER JOIN sys.dm_exec_sessions [es] ON + [owt].[session_id] = [es].[session_id] + INNER JOIN sys.dm_exec_requests [er] ON + [es].[session_id] = [er].[session_id] + FULL JOIN sys.dm_exec_query_memory_grants [eqmg] ON + [owt].[session_id] = [eqmg].[session_id] + OUTER APPLY sys.dm_exec_sql_text ([er].[sql_handle]) [est] + OUTER APPLY sys.dm_exec_query_plan ([er].[plan_handle]) [eqp] + WHERE + [es].[is_user_process] = $(if (Test-Bound 'IncludeSystemSpid') {0} else {1}) + ORDER BY + [owt].[session_id], + [owt].[exec_context_id] + OPTION(RECOMPILE);" + } + process { + foreach ($instance in $SqlInstance) { + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential -MinimumVersion 9 + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + $results = $server.Query($sql) + foreach ($row in $results) { + if (Test-Bound 'Spid') { + if ($row.Spid -notin $Spid) { continue } + } + + [PSCustomObject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + Spid = $row.Spid + Thread = $row.Thread + Scheduler = $row.Scheduler + WaitMs = $row.WaitMs + WaitType = $row.WaitType + BlockingSpid = $row.BlockingSpid + ResourceDesc = $row.ResourceDesc + NodeId = $row.NodeId + Dop = $row.Dop + DbId = $row.DbId + SqlText = $row.SqlText + QueryPlan = $row.QueryPlan + InfoUrl = $row.InfoUrl + } | Select-DefaultView -ExcludeProperty 'SqlText', 'QueryPlan', 'InfoUrl' + } + } + } +} +function Get-DbaWaitResource { + <# + .SYNOPSIS + Returns the resource being waited upon + + .DESCRIPTION + Given a wait resource in the form of 'PAGE: 10:1:9180084' returns the database, data file and the system object which is being waited up. + + Given a wait resource in the form of 'KEY: 7:35457594073541168 (de21f92a1572)', returns the database, object and index that is being waited on, With the -row switch the row data will also be returned. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. + + .PARAMETER SqlCredential + Allows you to login to servers using SQL Logins as opposed to Windows Auth/Integrated/Trusted. + + .PARAMETER WaitResource + The wait resource value as supplied in sys.dm_exec_requests + + .PARAMETER Row + If this switch provided also returns the value of the row being waited on with KEY wait resources + + .PARAMETER EnableException + Replaces user friendly yellow warnings with bloody red exceptions of doom! + Use this if you want the function to throw terminating errors you want to catch. + + .NOTES + Tags: Pages, DBCC + Author: Stuart Moore (@napalmgram), stuart-moore.com + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaWaitResource + + .EXAMPLE + PS C:\> Get-DbaWaitResource -SqlInstance server1 -WaitResource 'PAGE: 10:1:9180084' + + Will return an object containing; database name, data file name, schema name and the object which owns the resource + + .EXAMPLE + PS C:\> Get-DbaWaitResource -SqlInstance server2 -WaitResource 'KEY: 7:35457594073541168 (de21f92a1572)' + + Will return an object containing; database name, schema name and index name which is being waited on. + + .EXAMPLE + PS C:\> Get-DbaWaitResource -SqlInstance server2 -WaitResource 'KEY: 7:35457594073541168 (de21f92a1572)' -row + + Will return an object containing; database name, schema name and index name which is being waited on, and in addition the contents of the locked row at the time the command is run. + + #> + [CmdletBinding()] + param ( + [parameter(Mandatory)] + [Alias("ServerInstance", "SqlServer")] + [DbaInstance]$SqlInstance, + [PsCredential]$SqlCredential, + [parameter(Mandatory, ValueFromPipeline)] + [string]$WaitResource, + [switch]$Row, + [switch]$EnableException + ) + + process { + if ($WaitResource -notmatch '^PAGE: [0-9]*:[0-9]*:[0-9]*$' -and $WaitResource -notmatch '^KEY: [0-9]*:[0-9]* \([a-f0-9]*\)$') { + Stop-Function -Message "Row input - $WaitResource - Improperly formatted" + return + } + + try { + $server = Connect-SqlInstance -SqlInstance $sqlinstance -SqlCredential $SqlCredential + } catch { + Write-Message -Level Warning -Message "Cannot connect to $SqlInstance" + } + + $null = $WaitResource -match '^(?[A-Z]*): (?[0-9]*):*' + $ResourceType = $matches.Type + $DbId = $matches.DbId + $DbName = ($server.Databases | Where-Object ID -eq $dbid).Name + if ($null -eq $DbName) { + stop-function -Message "Database with id $dbid does not exist on $server" + return + } + if ($ResourceType -eq 'PAGE') { + $null = $WaitResource -match '^(?[A-Z]*): (?[0-9]*):(?[0-9]*):(?[0-9]*)$' + $DataFileSql = "select name, physical_name from sys.master_files where database_id=$DbID and file_ID=$($matches.FileID);" + $DataFile = $server.query($DataFileSql) + if ($null -eq $DataFile) { + Write-Message -Level Warning -Message "Datafile with id $($matches.FileID) for $dbname not found" + return + } + $ObjectIdSQL = "dbcc traceon (3604); dbcc page ($dbid,$($matches.fileID),$($matches.PageID),2) with tableresults;" + try { + $ObjectID = ($server.databases[$dbname].Query($ObjectIdSQL) | Where-Object Field -eq 'Metadata: ObjectId').Value + } catch { + Stop-Function -Message "You've requested a page beyond the end of the database, exiting" + return + } + if ($null -eq $ObjectID) { + Write-Message -Level Warning -Message "Object not found, could have been delete, or a transcription error when copying the Wait_resource to PowerShell" + return + } + $ObjectSql = "select SCHEMA_NAME(schema_id) as SchemaName, name, type_desc from sys.all_objects where object_id=$objectID;" + $Object = $server.databases[$dbname].query($ObjectSql) + if ($null -eq $Object) { + Write-Message -Warning "Object could not be found. Could have been removed, or could be a transcription error copying the Wait_resource to sowerShell" + } + [PsCustomObject]@{ + DatabaseID = $DbId + DatabaseName = $DbName + DataFileName = $Datafile.name + DataFilePath = $DataFile.physical_name + ObjectID = $ObjectID + ObjectName = $Object.Name + ObjectSchema = $Object.SchemaName + ObjectType = $Object.type_desc + } + } + if ($ResourceType -eq 'KEY') { + $null = $WaitResource -match '^(?[A-Z]*): (?[0-9]*):(?[0-9]*) (?\(.*\))$' + $IndexSql = "select + sp.object_id as ObjectID, + OBJECT_SCHEMA_NAME(sp.object_id) as SchemaName, + sao.name as ObjectName, + si.name as IndexName + from + sys.partitions sp inner join sys.indexes si on sp.index_id=si.index_id and sp.object_id=si.object_id + inner join sys.all_objects sao on sp.object_id=sao.object_id + where + hobt_id = $($matches.frodo); + " + $Index = $server.databases[$dbname].Query($IndexSql) + if ($null -eq $Index) { + Write-Message -Level Warning -Message "Heap or B-Tree with ID $($matches.frodo) can not be found in $dbname on $server" + return + } + $output = [PsCustomObject]@{ + DatabaseID = $DbId + DatabaseName = $DbName + SchemaName = $Index.SchemaName + IndexName = $Index.IndexName + ObjectID = $index.ObjectID + Objectname = $index.ObjectName + HobtID = $matches.frodo + } + if ($row -eq $True) { + $DataSql = "select * from $($Index.SchemaName).$($Index.ObjectName) with (NOLOCK) where %%lockres%% ='$($matches.physloc)'" + $Data = $server.databases[$dbname].query($DataSql) + if ($null -eq $data) { + Write-Message -Level warning -Message "Could not retrieve the data. It may have been deleted or moved since the wait resource value was generated" + } else { + $output | Add-Member -Type NoteProperty -Name ObjectData -Value $Data + $output | Select-Object * -ExpandProperty ObjectData + } + } else { + $output + } + } + } +} +function Get-DbaWaitStatistic { + <# + .SYNOPSIS + Displays wait statistics + + .DESCRIPTION + This command is based off of Paul Randal's post "Wait statistics, or please tell me where it hurts" + + Returns: + WaitType + Category + WaitSeconds + ResourceSeconds + SignalSeconds + WaitCount + Percentage + AverageWaitSeconds + AverageResourceSeconds + AverageSignalSeconds + URL + + Reference: https://www.sqlskills.com/blogs/paul/wait-statistics-or-please-tell-me-where-it-hurts/ + + .PARAMETER SqlInstance + The target SQL Server instance or instances. Server version must be SQL Server version 2005 or higher. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Threshold + Threshold, in percentage of all waits on the system. Default per Paul's post is 95%. + + .PARAMETER IncludeIgnorable + Some waits are no big deal and can be safely ignored in most circumstances. If you've got weird issues with mirroring or AGs. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: WaitStatistic + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaWaitStatistic + + .EXAMPLE + PS C:\> Get-DbaWaitStatistic -SqlInstance sql2008, sqlserver2012 + + Check wait statistics for servers sql2008 and sqlserver2012 + + .EXAMPLE + PS C:\> Get-DbaWaitStatistic -SqlInstance sql2008 -Threshold 98 -IncludeIgnorable + + Check wait statistics on server sql2008 for thresholds above 98% and include wait stats that are most often, but not always, ignorable + + .EXAMPLE + PS C:\> Get-DbaWaitStatistic -SqlInstance sql2008 | Select * + + Shows detailed notes, if available, from Paul's post + + .EXAMPLE + PS C:\> $output = Get-DbaWaitStatistic -SqlInstance sql2008 -Threshold 100 -IncludeIgnorable | Select-Object * | ConvertTo-DbaDataTable + + Collects all Wait Statistics (including ignorable waits) on server sql2008 into a Data Table. + + .EXAMPLE + PS C:\> $output = Get-DbaWaitStatistic -SqlInstance sql2008 + PS C:\> foreach ($row in ($output | Sort-Object -Unique Url)) { Start-Process ($row).Url } + + Displays the output then loads the associated sqlskills website for each result. Opens one tab per unique URL. + + #> + [CmdletBinding()] + param ( + [parameter(Mandatory, ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer", "SqlServers")] + [DbaInstance[]]$SqlInstance, + [PSCredential]$SqlCredential, + [int]$Threshold = 95, + [switch]$IncludeIgnorable, + [Alias('Silent')] + [switch]$EnableException + ) + + begin { + + $details = [pscustomobject]@{ + CXPACKET = "This indicates parallelism, not necessarily that there's a problem. The coordinator thread in a parallel query always accumulates these waits. If the parallel threads are not given equal amounts of work to do, or one thread blocks, the waiting threads will also accumulate CXPACKET waits, which will make them aggregate a lot faster - this is a problem. One thread may have a lot more to do than the others, and so the whole query is blocked while the long-running thread completes. If this is combined with a high number of PAGEIOLATCH_XX waits, it could be large parallel table scans going on because of incorrect non-clustered indexes, or a bad query plan. If neither of these are the issue, you might want to try setting MAXDOP to 4, 2, or 1 for the offending queries (or possibly the whole instance). Make sure that if you have a NUMA system that you try setting MAXDOP to the number of cores in a single NUMA node first to see if that helps the problem. You also need to consider the MAXDOP effect on a mixed-load system. Play with the cost threshold for parallelism setting (bump it up to, say, 25) before reducing the MAXDOP of the whole instance. And don't forget Resource Governor in Enterprise Edition of SQL Server 2008 onward that allows DOP governing for a particular group of connections to the server." + PAGEIOLATCH_XX = "This is where SQL Server is waiting for a data page to be read from disk into memory. It may indicate a bottleneck at the IO subsystem level (which is a common knee-jerk response to seeing these), but why is the I/O subsystem having to service so many reads? It could be buffer pool/memory pressure (i.e. not enough memory for the workload), a sudden change in query plans causing a large parallel scan instead of a seek, plan cache bloat, or a number of other things. Don't assume the root cause is the I/O subsystem." + ASYNC_NETWORK_IO = "This is usually where SQL Server is waiting for a client to finish consuming data. It could be that the client has asked for a very large amount of data or just that it's consuming it reeeeeally slowly because of poor programming - I rarely see this being a network issue. Clients often process one row at a time - called RBAR or Row-By-Agonizing-Row - instead of caching the data on the client and acknowledging to SQL Server immediately." + WRITELOG = "This is the log management system waiting for a log flush to disk. It commonly indicates that the I/O subsystem can't keep up with the log flush volume, but on very high-volume systems it could also be caused by internal log flush limits, that may mean you have to split your workload over multiple databases or even make your transactions a little longer to reduce log flushes. To be sure it is the I/O subsystem, use the DMV sys.dm_io_virtual_file_stats to examine the I/O latency for the log file and see if it correlates to the average WRITELOG time. If WRITELOG is longer, you've got internal contention and need to shard. If not, investigate why you're creating so much transaction log." + BROKER_RECEIVE_WAITFOR = "This is just Service Broker waiting around for new messages to receive. I would add this to the list of waits to filter out and re-run the wait stats query." + MSQL_XP = "This is SQL Server waiting for an extended stored-proc to finish. This could indicate a problem in your XP code." + OLEDB = "As its name suggests, this is a wait for something communicating using OLEDB - e.g. a linked server. However, OLEDB is also used by all DMVs and by DBCC CHECKDB, so don't assume linked servers are the problem - it could be a third-party monitoring tool making excessive DMV calls. If it *is* a linked server (wait times in the 10s or 100s of milliseconds), go to the linked server and do wait stats analysis there to figure out what the performance issue is there." + BACKUPIO = "This can show up when you're backing up to a slow I/O subsystem, like directly to tape, which is slooooow, or over a network." + LCK_M_XX = "This is simply the thread waiting for a lock to be granted and indicates blocking problems. These could be caused by unwanted lock escalation or bad programming, but could also be from I/Os taking a long time causing locks to be held for longer than usual. Look at the resource associated with the lock using the DMV sys.dm_os_waiting_tasks. Don't assume that locking is the root cause." + ONDEMAND_TASK_QUEUE = "This is normal and is part of the background task system (e.g. deferred drop, ghost cleanup). I would add this to the list of waits to filter out and re-run the wait stats query." + BACKUPBUFFER = "This commonly show up with BACKUPIO and is a backup thread waiting for a buffer to write backup data into." + IO_COMPLETION = "This is SQL Server waiting for non-data page I/Os to complete and could be an indication that the I/O subsystem is overloaded if the latencies look high (see Are I/O latencies killing your performance?)" + SOS_SCHEDULER_YIELD = "This is code running that doesn't hit any resource waits." + DBMIRROR_EVENTS_QUEUE = "These two are database mirroring just sitting around waiting for something to do. I would add these to the list of waits to filter out and re-run the wait stats query." + DBMIRRORING_CMD = "These two are database mirroring just sitting around waiting for something to do. I would add these to the list of waits to filter out and re-run the wait stats query." + PAGELATCH_XX = "This is contention for access to in-memory copies of pages. The most well-known cases of these are the PFS and SGAM contention that can occur in tempdb under certain workloads. To find out what page the contention is on, you'll need to use the DMV sys.dm_os_waiting_tasks to figure out what page the latch is for. For tempdb issues, Robert Davis (blog | twitter) has a good post showing how to do this. Another common cause I've seen is an index hot-spot with concurrent inserts into an index with an identity value key." + LATCH_XX = "This is contention for some non-page structure inside SQL Server - so not related to I/O or data at all. These can be hard to figure out and you're going to be using the DMV sys.dm_os_latch_stats. More on this in my Latches category." + PREEMPTIVE_OS_PIPEOPS = "This is SQL Server switching to preemptive scheduling mode to call out to Windows for something, and this particular wait is usually from using xp_cmdshell. These were added for 2008 and aren't documented anywhere except through the links to my waits library." + THREADPOOL = "This says that there aren't enough worker threads on the system to satisfy demand. Commonly this is large numbers of high-DOP queries trying to execute and taking all the threads from the thread pool." + BROKER_TRANSMITTER = "This is just Service Broker waiting around for new messages to send. I would add this to the list of waits to filter out and re-run the wait stats query." + SQLTRACE_WAIT_ENTRIES = "Part of SQL Trace. I would add this to the list of waits to filter out and re-run the wait stats query." + DBMIRROR_DBM_MUTEX = "This one is undocumented and is contention for the send buffer that database mirroring shares between all the mirroring sessions on a server. It could indicate that you've got too many mirroring sessions." + RESOURCE_SEMAPHORE = "This is queries waiting for execution memory (the memory used to process the query operators - like a sort). This could be memory pressure or a very high concurrent workload." + PREEMPTIVE_OS_AUTHENTICATIONOPS = "These are SQL Server switching to preemptive scheduling mode to call out to Windows for something. These were added for 2008 and aren't documented anywhere except through the links to my waits library." + PREEMPTIVE_OS_GENERICOPS = "These are SQL Server switching to preemptive scheduling mode to call out to Windows for something. These were added for 2008 and aren't documented anywhere except through the links to my waits library." + SLEEP_BPOOL_FLUSH = "This is normal to see and indicates that checkpoint is throttling itself to avoid overloading the IO subsystem. I would add this to the list of waits to filter out and re-run the wait stats query." + MSQL_DQ = "This is SQL Server waiting for a distributed query to finish. This could indicate a problem with the distributed query, or it could just be normal." + RESOURCE_SEMAPHORE_QUERY_COMPILE = "When there are too many concurrent query compilations going on, SQL Server will throttle them. I don't remember the threshold, but this can indicate excessive recompilation, or maybe single-use plans." + DAC_INIT = "This is the Dedicated Admin Connection initializing." + MSSEARCH = "This is normal to see for full-text operations. If this is the highest wait, it could mean your system is spending most of its time doing full-text queries. You might want to consider adding this to the filter list." + PREEMPTIVE_OS_FILEOPS = "These are SQL Server switching to preemptive scheduling mode to call out to Windows for something. These were added for 2008 and aren't documented anywhere except through the links to my waits library." + PREEMPTIVE_OS_LIBRARYOPS = "These are SQL Server switching to preemptive scheduling mode to call out to Windows for something. These were added for 2008 and aren't documented anywhere except through the links to my waits library." + PREEMPTIVE_OS_LOOKUPACCOUNTSID = "These are SQL Server switching to preemptive scheduling mode to call out to Windows for something. These were added for 2008 and aren't documented anywhere except through the links to my waits library." + PREEMPTIVE_OS_QUERYREGISTRY = "These are SQL Server switching to preemptive scheduling mode to call out to Windows for something. These were added for 2008 and aren't documented anywhere except through the links to my waits library." + SQLTRACE_LOCK = "Part of SQL Trace. I would add this to the list of waits to filter out and re-run the wait stats query." + } + + # Thanks Brent Ozar via https://gist.github.com/BrentOzar/42e82ee0603a1917c17d74c3fca26d34 + # Thanks Marcin Gminski via https://www.dropbox.com/s/x3zr7u18tc1ojey/WaitStats.sql?dl=0 + + $category = [pscustomobject]@{ + ASYNC_IO_COMPLETION = 'Other Disk IO' + ASYNC_NETWORK_IO = 'Network IO' + BACKUPIO = 'Other Disk IO' + BROKER_CONNECTION_RECEIVE_TASK = 'Service Broker' + BROKER_DISPATCHER = 'Service Broker' + BROKER_ENDPOINT_STATE_MUTEX = 'Service Broker' + BROKER_EVENTHANDLER = 'Service Broker' + BROKER_FORWARDER = 'Service Broker' + BROKER_INIT = 'Service Broker' + BROKER_MASTERSTART = 'Service Broker' + BROKER_RECEIVE_WAITFOR = 'User Wait' + BROKER_REGISTERALLENDPOINTS = 'Service Broker' + BROKER_SERVICE = 'Service Broker' + BROKER_SHUTDOWN = 'Service Broker' + BROKER_START = 'Service Broker' + BROKER_TASK_SHUTDOWN = 'Service Broker' + BROKER_TASK_STOP = 'Service Broker' + BROKER_TASK_SUBMIT = 'Service Broker' + BROKER_TO_FLUSH = 'Service Broker' + BROKER_TRANSMISSION_OBJECT = 'Service Broker' + BROKER_TRANSMISSION_TABLE = 'Service Broker' + BROKER_TRANSMISSION_WORK = 'Service Broker' + BROKER_TRANSMITTER = 'Service Broker' + CHECKPOINT_QUEUE = 'Idle' + CHKPT = 'Tran Log IO' + CLR_AUTO_EVENT = 'SQL CLR' + CLR_CRST = 'SQL CLR' + CLR_JOIN = 'SQL CLR' + CLR_MANUAL_EVENT = 'SQL CLR' + CLR_MEMORY_SPY = 'SQL CLR' + CLR_MONITOR = 'SQL CLR' + CLR_RWLOCK_READER = 'SQL CLR' + CLR_RWLOCK_WRITER = 'SQL CLR' + CLR_SEMAPHORE = 'SQL CLR' + CLR_TASK_START = 'SQL CLR' + CLRHOST_STATE_ACCESS = 'SQL CLR' + CMEMPARTITIONED = 'Memory' + CMEMTHREAD = 'Memory' + CXPACKET = 'Parallelism' + DBMIRROR_DBM_EVENT = 'Mirroring' + DBMIRROR_DBM_MUTEX = 'Mirroring' + DBMIRROR_EVENTS_QUEUE = 'Mirroring' + DBMIRROR_SEND = 'Mirroring' + DBMIRROR_WORKER_QUEUE = 'Mirroring' + DBMIRRORING_CMD = 'Mirroring' + DTC = 'Transaction' + DTC_ABORT_REQUEST = 'Transaction' + DTC_RESOLVE = 'Transaction' + DTC_STATE = 'Transaction' + DTC_TMDOWN_REQUEST = 'Transaction' + DTC_WAITFOR_OUTCOME = 'Transaction' + DTCNEW_ENLIST = 'Transaction' + DTCNEW_PREPARE = 'Transaction' + DTCNEW_RECOVERY = 'Transaction' + DTCNEW_TM = 'Transaction' + DTCNEW_TRANSACTION_ENLISTMENT = 'Transaction' + DTCPNTSYNC = 'Transaction' + EE_PMOLOCK = 'Memory' + EXCHANGE = 'Parallelism' + EXTERNAL_SCRIPT_NETWORK_IOF = 'Network IO' + FCB_REPLICA_READ = 'Replication' + FCB_REPLICA_WRITE = 'Replication' + FT_COMPROWSET_RWLOCK = 'Full Text Search' + FT_IFTS_RWLOCK = 'Full Text Search' + FT_IFTS_SCHEDULER_IDLE_WAIT = 'Idle' + FT_IFTSHC_MUTEX = 'Full Text Search' + FT_IFTSISM_MUTEX = 'Full Text Search' + FT_MASTER_MERGE = 'Full Text Search' + FT_MASTER_MERGE_COORDINATOR = 'Full Text Search' + FT_METADATA_MUTEX = 'Full Text Search' + FT_PROPERTYLIST_CACHE = 'Full Text Search' + FT_RESTART_CRAWL = 'Full Text Search' + 'FULLTEXT GATHERER' = 'Full Text Search' + HADR_AG_MUTEX = 'Replication' + HADR_AR_CRITICAL_SECTION_ENTRY = 'Replication' + HADR_AR_MANAGER_MUTEX = 'Replication' + HADR_AR_UNLOAD_COMPLETED = 'Replication' + HADR_ARCONTROLLER_NOTIFICATIONS_SUBSCRIBER_LIST = 'Replication' + HADR_BACKUP_BULK_LOCK = 'Replication' + HADR_BACKUP_QUEUE = 'Replication' + HADR_CLUSAPI_CALL = 'Replication' + HADR_COMPRESSED_CACHE_SYNC = 'Replication' + HADR_CONNECTIVITY_INFO = 'Replication' + HADR_DATABASE_FLOW_CONTROL = 'Replication' + HADR_DATABASE_VERSIONING_STATE = 'Replication' + HADR_DATABASE_WAIT_FOR_RECOVERY = 'Replication' + HADR_DATABASE_WAIT_FOR_RESTART = 'Replication' + HADR_DATABASE_WAIT_FOR_TRANSITION_TO_VERSIONING = 'Replication' + HADR_DB_COMMAND = 'Replication' + HADR_DB_OP_COMPLETION_SYNC = 'Replication' + HADR_DB_OP_START_SYNC = 'Replication' + HADR_DBR_SUBSCRIBER = 'Replication' + HADR_DBR_SUBSCRIBER_FILTER_LIST = 'Replication' + HADR_DBSEEDING = 'Replication' + HADR_DBSEEDING_LIST = 'Replication' + HADR_DBSTATECHANGE_SYNC = 'Replication' + HADR_FABRIC_CALLBACK = 'Replication' + HADR_FILESTREAM_BLOCK_FLUSH = 'Replication' + HADR_FILESTREAM_FILE_CLOSE = 'Replication' + HADR_FILESTREAM_FILE_REQUEST = 'Replication' + HADR_FILESTREAM_IOMGR = 'Replication' + HADR_FILESTREAM_IOMGR_IOCOMPLETION = 'Replication' + HADR_FILESTREAM_MANAGER = 'Replication' + HADR_FILESTREAM_PREPROC = 'Replication' + HADR_GROUP_COMMIT = 'Replication' + HADR_LOGCAPTURE_SYNC = 'Replication' + HADR_LOGCAPTURE_WAIT = 'Replication' + HADR_LOGPROGRESS_SYNC = 'Replication' + HADR_NOTIFICATION_DEQUEUE = 'Replication' + HADR_NOTIFICATION_WORKER_EXCLUSIVE_ACCESS = 'Replication' + HADR_NOTIFICATION_WORKER_STARTUP_SYNC = 'Replication' + HADR_NOTIFICATION_WORKER_TERMINATION_SYNC = 'Replication' + HADR_PARTNER_SYNC = 'Replication' + HADR_READ_ALL_NETWORKS = 'Replication' + HADR_RECOVERY_WAIT_FOR_CONNECTION = 'Replication' + HADR_RECOVERY_WAIT_FOR_UNDO = 'Replication' + HADR_REPLICAINFO_SYNC = 'Replication' + HADR_SEEDING_CANCELLATION = 'Replication' + HADR_SEEDING_FILE_LIST = 'Replication' + HADR_SEEDING_LIMIT_BACKUPS = 'Replication' + HADR_SEEDING_SYNC_COMPLETION = 'Replication' + HADR_SEEDING_TIMEOUT_TASK = 'Replication' + HADR_SEEDING_WAIT_FOR_COMPLETION = 'Replication' + HADR_SYNC_COMMIT = 'Replication' + HADR_SYNCHRONIZING_THROTTLE = 'Replication' + HADR_TDS_LISTENER_SYNC = 'Replication' + HADR_TDS_LISTENER_SYNC_PROCESSING = 'Replication' + HADR_THROTTLE_LOG_RATE_GOVERNOR = 'Log Rate Governor' + HADR_TIMER_TASK = 'Replication' + HADR_TRANSPORT_DBRLIST = 'Replication' + HADR_TRANSPORT_FLOW_CONTROL = 'Replication' + HADR_TRANSPORT_SESSION = 'Replication' + HADR_WORK_POOL = 'Replication' + HADR_WORK_QUEUE = 'Replication' + HADR_XRF_STACK_ACCESS = 'Replication' + INSTANCE_LOG_RATE_GOVERNOR = 'Log Rate Governor' + IO_COMPLETION = 'Other Disk IO' + IO_QUEUE_LIMIT = 'Other Disk IO' + IO_RETRY = 'Other Disk IO' + LATCH_DT = 'Latch' + LATCH_EX = 'Latch' + LATCH_KP = 'Latch' + LATCH_NL = 'Latch' + LATCH_SH = 'Latch' + LATCH_UP = 'Latch' + LAZYWRITER_SLEEP = 'Idle' + LCK_M_BU = 'Lock' + LCK_M_BU_ABORT_BLOCKERS = 'Lock' + LCK_M_BU_LOW_PRIORITY = 'Lock' + LCK_M_IS = 'Lock' + LCK_M_IS_ABORT_BLOCKERS = 'Lock' + LCK_M_IS_LOW_PRIORITY = 'Lock' + LCK_M_IU = 'Lock' + LCK_M_IU_ABORT_BLOCKERS = 'Lock' + LCK_M_IU_LOW_PRIORITY = 'Lock' + LCK_M_IX = 'Lock' + LCK_M_IX_ABORT_BLOCKERS = 'Lock' + LCK_M_IX_LOW_PRIORITY = 'Lock' + LCK_M_RIn_NL = 'Lock' + LCK_M_RIn_NL_ABORT_BLOCKERS = 'Lock' + LCK_M_RIn_NL_LOW_PRIORITY = 'Lock' + LCK_M_RIn_S = 'Lock' + LCK_M_RIn_S_ABORT_BLOCKERS = 'Lock' + LCK_M_RIn_S_LOW_PRIORITY = 'Lock' + LCK_M_RIn_U = 'Lock' + LCK_M_RIn_U_ABORT_BLOCKERS = 'Lock' + LCK_M_RIn_U_LOW_PRIORITY = 'Lock' + LCK_M_RIn_X = 'Lock' + LCK_M_RIn_X_ABORT_BLOCKERS = 'Lock' + LCK_M_RIn_X_LOW_PRIORITY = 'Lock' + LCK_M_RS_S = 'Lock' + LCK_M_RS_S_ABORT_BLOCKERS = 'Lock' + LCK_M_RS_S_LOW_PRIORITY = 'Lock' + LCK_M_RS_U = 'Lock' + LCK_M_RS_U_ABORT_BLOCKERS = 'Lock' + LCK_M_RS_U_LOW_PRIORITY = 'Lock' + LCK_M_RX_S = 'Lock' + LCK_M_RX_S_ABORT_BLOCKERS = 'Lock' + LCK_M_RX_S_LOW_PRIORITY = 'Lock' + LCK_M_RX_U = 'Lock' + LCK_M_RX_U_ABORT_BLOCKERS = 'Lock' + LCK_M_RX_U_LOW_PRIORITY = 'Lock' + LCK_M_RX_X = 'Lock' + LCK_M_RX_X_ABORT_BLOCKERS = 'Lock' + LCK_M_RX_X_LOW_PRIORITY = 'Lock' + LCK_M_S = 'Lock' + LCK_M_S_ABORT_BLOCKERS = 'Lock' + LCK_M_S_LOW_PRIORITY = 'Lock' + LCK_M_SCH_M = 'Lock' + LCK_M_SCH_M_ABORT_BLOCKERS = 'Lock' + LCK_M_SCH_M_LOW_PRIORITY = 'Lock' + LCK_M_SCH_S = 'Lock' + LCK_M_SCH_S_ABORT_BLOCKERS = 'Lock' + LCK_M_SCH_S_LOW_PRIORITY = 'Lock' + LCK_M_SIU = 'Lock' + LCK_M_SIU_ABORT_BLOCKERS = 'Lock' + LCK_M_SIU_LOW_PRIORITY = 'Lock' + LCK_M_SIX = 'Lock' + LCK_M_SIX_ABORT_BLOCKERS = 'Lock' + LCK_M_SIX_LOW_PRIORITY = 'Lock' + LCK_M_U = 'Lock' + LCK_M_U_ABORT_BLOCKERS = 'Lock' + LCK_M_U_LOW_PRIORITY = 'Lock' + LCK_M_UIX = 'Lock' + LCK_M_UIX_ABORT_BLOCKERS = 'Lock' + LCK_M_UIX_LOW_PRIORITY = 'Lock' + LCK_M_X = 'Lock' + LCK_M_X_ABORT_BLOCKERS = 'Lock' + LCK_M_X_LOW_PRIORITY = 'Lock' + LOGBUFFER = 'Tran Log IO' + LOGMGR = 'Tran Log IO' + LOGMGR_FLUSH = 'Tran Log IO' + LOGMGR_PMM_LOG = 'Tran Log IO' + LOGMGR_QUEUE = 'Idle' + LOGMGR_RESERVE_APPEND = 'Tran Log IO' + MEMORY_ALLOCATION_EXT = 'Memory' + MEMORY_GRANT_UPDATE = 'Memory' + MSQL_XACT_MGR_MUTEX = 'Transaction' + MSQL_XACT_MUTEX = 'Transaction' + MSSEARCH = 'Full Text Search' + NET_WAITFOR_PACKET = 'Network IO' + ONDEMAND_TASK_QUEUE = 'Idle' + PAGEIOLATCH_DT = 'Buffer IO' + PAGEIOLATCH_EX = 'Buffer IO' + PAGEIOLATCH_KP = 'Buffer IO' + PAGEIOLATCH_NL = 'Buffer IO' + PAGEIOLATCH_SH = 'Buffer IO' + PAGEIOLATCH_UP = 'Buffer IO' + PAGELATCH_DT = 'Buffer Latch' + PAGELATCH_EX = 'Buffer Latch' + PAGELATCH_KP = 'Buffer Latch' + PAGELATCH_NL = 'Buffer Latch' + PAGELATCH_SH = 'Buffer Latch' + PAGELATCH_UP = 'Buffer Latch' + POOL_LOG_RATE_GOVERNOR = 'Log Rate Governor' + PREEMPTIVE_ABR = 'Preemptive' + PREEMPTIVE_CLOSEBACKUPMEDIA = 'Preemptive' + PREEMPTIVE_CLOSEBACKUPTAPE = 'Preemptive' + PREEMPTIVE_CLOSEBACKUPVDIDEVICE = 'Preemptive' + PREEMPTIVE_CLUSAPI_CLUSTERRESOURCECONTROL = 'Preemptive' + PREEMPTIVE_COM_COCREATEINSTANCE = 'Preemptive' + PREEMPTIVE_COM_COGETCLASSOBJECT = 'Preemptive' + PREEMPTIVE_COM_CREATEACCESSOR = 'Preemptive' + PREEMPTIVE_COM_DELETEROWS = 'Preemptive' + PREEMPTIVE_COM_GETCOMMANDTEXT = 'Preemptive' + PREEMPTIVE_COM_GETDATA = 'Preemptive' + PREEMPTIVE_COM_GETNEXTROWS = 'Preemptive' + PREEMPTIVE_COM_GETRESULT = 'Preemptive' + PREEMPTIVE_COM_GETROWSBYBOOKMARK = 'Preemptive' + PREEMPTIVE_COM_LBFLUSH = 'Preemptive' + PREEMPTIVE_COM_LBLOCKREGION = 'Preemptive' + PREEMPTIVE_COM_LBREADAT = 'Preemptive' + PREEMPTIVE_COM_LBSETSIZE = 'Preemptive' + PREEMPTIVE_COM_LBSTAT = 'Preemptive' + PREEMPTIVE_COM_LBUNLOCKREGION = 'Preemptive' + PREEMPTIVE_COM_LBWRITEAT = 'Preemptive' + PREEMPTIVE_COM_QUERYINTERFACE = 'Preemptive' + PREEMPTIVE_COM_RELEASE = 'Preemptive' + PREEMPTIVE_COM_RELEASEACCESSOR = 'Preemptive' + PREEMPTIVE_COM_RELEASEROWS = 'Preemptive' + PREEMPTIVE_COM_RELEASESESSION = 'Preemptive' + PREEMPTIVE_COM_RESTARTPOSITION = 'Preemptive' + PREEMPTIVE_COM_SEQSTRMREAD = 'Preemptive' + PREEMPTIVE_COM_SEQSTRMREADANDWRITE = 'Preemptive' + PREEMPTIVE_COM_SETDATAFAILURE = 'Preemptive' + PREEMPTIVE_COM_SETPARAMETERINFO = 'Preemptive' + PREEMPTIVE_COM_SETPARAMETERPROPERTIES = 'Preemptive' + PREEMPTIVE_COM_STRMLOCKREGION = 'Preemptive' + PREEMPTIVE_COM_STRMSEEKANDREAD = 'Preemptive' + PREEMPTIVE_COM_STRMSEEKANDWRITE = 'Preemptive' + PREEMPTIVE_COM_STRMSETSIZE = 'Preemptive' + PREEMPTIVE_COM_STRMSTAT = 'Preemptive' + PREEMPTIVE_COM_STRMUNLOCKREGION = 'Preemptive' + PREEMPTIVE_CONSOLEWRITE = 'Preemptive' + PREEMPTIVE_CREATEPARAM = 'Preemptive' + PREEMPTIVE_DEBUG = 'Preemptive' + PREEMPTIVE_DFSADDLINK = 'Preemptive' + PREEMPTIVE_DFSLINKEXISTCHECK = 'Preemptive' + PREEMPTIVE_DFSLINKHEALTHCHECK = 'Preemptive' + PREEMPTIVE_DFSREMOVELINK = 'Preemptive' + PREEMPTIVE_DFSREMOVEROOT = 'Preemptive' + PREEMPTIVE_DFSROOTFOLDERCHECK = 'Preemptive' + PREEMPTIVE_DFSROOTINIT = 'Preemptive' + PREEMPTIVE_DFSROOTSHARECHECK = 'Preemptive' + PREEMPTIVE_DTC_ABORT = 'Preemptive' + PREEMPTIVE_DTC_ABORTREQUESTDONE = 'Preemptive' + PREEMPTIVE_DTC_BEGINTRANSACTION = 'Preemptive' + PREEMPTIVE_DTC_COMMITREQUESTDONE = 'Preemptive' + PREEMPTIVE_DTC_ENLIST = 'Preemptive' + PREEMPTIVE_DTC_PREPAREREQUESTDONE = 'Preemptive' + PREEMPTIVE_FILESIZEGET = 'Preemptive' + PREEMPTIVE_FSAOLEDB_ABORTTRANSACTION = 'Preemptive' + PREEMPTIVE_FSAOLEDB_COMMITTRANSACTION = 'Preemptive' + PREEMPTIVE_FSAOLEDB_STARTTRANSACTION = 'Preemptive' + PREEMPTIVE_FSRECOVER_UNCONDITIONALUNDO = 'Preemptive' + PREEMPTIVE_GETRMINFO = 'Preemptive' + PREEMPTIVE_HADR_LEASE_MECHANISM = 'Preemptive' + PREEMPTIVE_HTTP_EVENT_WAIT = 'Preemptive' + PREEMPTIVE_HTTP_REQUEST = 'Preemptive' + PREEMPTIVE_LOCKMONITOR = 'Preemptive' + PREEMPTIVE_MSS_RELEASE = 'Preemptive' + PREEMPTIVE_ODBCOPS = 'Preemptive' + PREEMPTIVE_OLE_UNINIT = 'Preemptive' + PREEMPTIVE_OLEDB_ABORTORCOMMITTRAN = 'Preemptive' + PREEMPTIVE_OLEDB_ABORTTRAN = 'Preemptive' + PREEMPTIVE_OLEDB_GETDATASOURCE = 'Preemptive' + PREEMPTIVE_OLEDB_GETLITERALINFO = 'Preemptive' + PREEMPTIVE_OLEDB_GETPROPERTIES = 'Preemptive' + PREEMPTIVE_OLEDB_GETPROPERTYINFO = 'Preemptive' + PREEMPTIVE_OLEDB_GETSCHEMALOCK = 'Preemptive' + PREEMPTIVE_OLEDB_JOINTRANSACTION = 'Preemptive' + PREEMPTIVE_OLEDB_RELEASE = 'Preemptive' + PREEMPTIVE_OLEDB_SETPROPERTIES = 'Preemptive' + PREEMPTIVE_OLEDBOPS = 'Preemptive' + PREEMPTIVE_OS_ACCEPTSECURITYCONTEXT = 'Preemptive' + PREEMPTIVE_OS_ACQUIRECREDENTIALSHANDLE = 'Preemptive' + PREEMPTIVE_OS_AUTHENTICATIONOPS = 'Preemptive' + PREEMPTIVE_OS_AUTHORIZATIONOPS = 'Preemptive' + PREEMPTIVE_OS_AUTHZGETINFORMATIONFROMCONTEXT = 'Preemptive' + PREEMPTIVE_OS_AUTHZINITIALIZECONTEXTFROMSID = 'Preemptive' + PREEMPTIVE_OS_AUTHZINITIALIZERESOURCEMANAGER = 'Preemptive' + PREEMPTIVE_OS_BACKUPREAD = 'Preemptive' + PREEMPTIVE_OS_CLOSEHANDLE = 'Preemptive' + PREEMPTIVE_OS_CLUSTEROPS = 'Preemptive' + PREEMPTIVE_OS_COMOPS = 'Preemptive' + PREEMPTIVE_OS_COMPLETEAUTHTOKEN = 'Preemptive' + PREEMPTIVE_OS_COPYFILE = 'Preemptive' + PREEMPTIVE_OS_CREATEDIRECTORY = 'Preemptive' + PREEMPTIVE_OS_CREATEFILE = 'Preemptive' + PREEMPTIVE_OS_CRYPTACQUIRECONTEXT = 'Preemptive' + PREEMPTIVE_OS_CRYPTIMPORTKEY = 'Preemptive' + PREEMPTIVE_OS_CRYPTOPS = 'Preemptive' + PREEMPTIVE_OS_DECRYPTMESSAGE = 'Preemptive' + PREEMPTIVE_OS_DELETEFILE = 'Preemptive' + PREEMPTIVE_OS_DELETESECURITYCONTEXT = 'Preemptive' + PREEMPTIVE_OS_DEVICEIOCONTROL = 'Preemptive' + PREEMPTIVE_OS_DEVICEOPS = 'Preemptive' + PREEMPTIVE_OS_DIRSVC_NETWORKOPS = 'Preemptive' + PREEMPTIVE_OS_DISCONNECTNAMEDPIPE = 'Preemptive' + PREEMPTIVE_OS_DOMAINSERVICESOPS = 'Preemptive' + PREEMPTIVE_OS_DSGETDCNAME = 'Preemptive' + PREEMPTIVE_OS_DTCOPS = 'Preemptive' + PREEMPTIVE_OS_ENCRYPTMESSAGE = 'Preemptive' + PREEMPTIVE_OS_FILEOPS = 'Preemptive' + PREEMPTIVE_OS_FINDFILE = 'Preemptive' + PREEMPTIVE_OS_FLUSHFILEBUFFERS = 'Preemptive' + PREEMPTIVE_OS_FORMATMESSAGE = 'Preemptive' + PREEMPTIVE_OS_FREECREDENTIALSHANDLE = 'Preemptive' + PREEMPTIVE_OS_FREELIBRARY = 'Preemptive' + PREEMPTIVE_OS_GENERICOPS = 'Preemptive' + PREEMPTIVE_OS_GETADDRINFO = 'Preemptive' + PREEMPTIVE_OS_GETCOMPRESSEDFILESIZE = 'Preemptive' + PREEMPTIVE_OS_GETDISKFREESPACE = 'Preemptive' + PREEMPTIVE_OS_GETFILEATTRIBUTES = 'Preemptive' + PREEMPTIVE_OS_GETFILESIZE = 'Preemptive' + PREEMPTIVE_OS_GETFINALFILEPATHBYHANDLE = 'Preemptive' + PREEMPTIVE_OS_GETLONGPATHNAME = 'Preemptive' + PREEMPTIVE_OS_GETPROCADDRESS = 'Preemptive' + PREEMPTIVE_OS_GETVOLUMENAMEFORVOLUMEMOUNTPOINT = 'Preemptive' + PREEMPTIVE_OS_GETVOLUMEPATHNAME = 'Preemptive' + PREEMPTIVE_OS_INITIALIZESECURITYCONTEXT = 'Preemptive' + PREEMPTIVE_OS_LIBRARYOPS = 'Preemptive' + PREEMPTIVE_OS_LOADLIBRARY = 'Preemptive' + PREEMPTIVE_OS_LOGONUSER = 'Preemptive' + PREEMPTIVE_OS_LOOKUPACCOUNTSID = 'Preemptive' + PREEMPTIVE_OS_MESSAGEQUEUEOPS = 'Preemptive' + PREEMPTIVE_OS_MOVEFILE = 'Preemptive' + PREEMPTIVE_OS_NETGROUPGETUSERS = 'Preemptive' + PREEMPTIVE_OS_NETLOCALGROUPGETMEMBERS = 'Preemptive' + PREEMPTIVE_OS_NETUSERGETGROUPS = 'Preemptive' + PREEMPTIVE_OS_NETUSERGETLOCALGROUPS = 'Preemptive' + PREEMPTIVE_OS_NETUSERMODALSGET = 'Preemptive' + PREEMPTIVE_OS_NETVALIDATEPASSWORDPOLICY = 'Preemptive' + PREEMPTIVE_OS_NETVALIDATEPASSWORDPOLICYFREE = 'Preemptive' + PREEMPTIVE_OS_OPENDIRECTORY = 'Preemptive' + PREEMPTIVE_OS_PDH_WMI_INIT = 'Preemptive' + PREEMPTIVE_OS_PIPEOPS = 'Preemptive' + PREEMPTIVE_OS_PROCESSOPS = 'Preemptive' + PREEMPTIVE_OS_QUERYCONTEXTATTRIBUTES = 'Preemptive' + PREEMPTIVE_OS_QUERYREGISTRY = 'Preemptive' + PREEMPTIVE_OS_QUERYSECURITYCONTEXTTOKEN = 'Preemptive' + PREEMPTIVE_OS_REMOVEDIRECTORY = 'Preemptive' + PREEMPTIVE_OS_REPORTEVENT = 'Preemptive' + PREEMPTIVE_OS_REVERTTOSELF = 'Preemptive' + PREEMPTIVE_OS_RSFXDEVICEOPS = 'Preemptive' + PREEMPTIVE_OS_SECURITYOPS = 'Preemptive' + PREEMPTIVE_OS_SERVICEOPS = 'Preemptive' + PREEMPTIVE_OS_SETENDOFFILE = 'Preemptive' + PREEMPTIVE_OS_SETFILEPOINTER = 'Preemptive' + PREEMPTIVE_OS_SETFILEVALIDDATA = 'Preemptive' + PREEMPTIVE_OS_SETNAMEDSECURITYINFO = 'Preemptive' + PREEMPTIVE_OS_SQLCLROPS = 'Preemptive' + PREEMPTIVE_OS_SQMLAUNCH = 'Preemptive' + PREEMPTIVE_OS_VERIFYSIGNATURE = 'Preemptive' + PREEMPTIVE_OS_VERIFYTRUST = 'Preemptive' + PREEMPTIVE_OS_VSSOPS = 'Preemptive' + PREEMPTIVE_OS_WAITFORSINGLEOBJECT = 'Preemptive' + PREEMPTIVE_OS_WINSOCKOPS = 'Preemptive' + PREEMPTIVE_OS_WRITEFILE = 'Preemptive' + PREEMPTIVE_OS_WRITEFILEGATHER = 'Preemptive' + PREEMPTIVE_OS_WSASETLASTERROR = 'Preemptive' + PREEMPTIVE_REENLIST = 'Preemptive' + PREEMPTIVE_RESIZELOG = 'Preemptive' + PREEMPTIVE_ROLLFORWARDREDO = 'Preemptive' + PREEMPTIVE_ROLLFORWARDUNDO = 'Preemptive' + PREEMPTIVE_SB_STOPENDPOINT = 'Preemptive' + PREEMPTIVE_SERVER_STARTUP = 'Preemptive' + PREEMPTIVE_SETRMINFO = 'Preemptive' + PREEMPTIVE_SHAREDMEM_GETDATA = 'Preemptive' + PREEMPTIVE_SNIOPEN = 'Preemptive' + PREEMPTIVE_SOSHOST = 'Preemptive' + PREEMPTIVE_SOSTESTING = 'Preemptive' + PREEMPTIVE_SP_SERVER_DIAGNOSTICS = 'Preemptive' + PREEMPTIVE_STARTRM = 'Preemptive' + PREEMPTIVE_STREAMFCB_CHECKPOINT = 'Preemptive' + PREEMPTIVE_STREAMFCB_RECOVER = 'Preemptive' + PREEMPTIVE_STRESSDRIVER = 'Preemptive' + PREEMPTIVE_TESTING = 'Preemptive' + PREEMPTIVE_TRANSIMPORT = 'Preemptive' + PREEMPTIVE_UNMARSHALPROPAGATIONTOKEN = 'Preemptive' + PREEMPTIVE_VSS_CREATESNAPSHOT = 'Preemptive' + PREEMPTIVE_VSS_CREATEVOLUMESNAPSHOT = 'Preemptive' + PREEMPTIVE_XE_CALLBACKEXECUTE = 'Preemptive' + PREEMPTIVE_XE_CX_FILE_OPEN = 'Preemptive' + PREEMPTIVE_XE_CX_HTTP_CALL = 'Preemptive' + PREEMPTIVE_XE_DISPATCHER = 'Preemptive' + PREEMPTIVE_XE_ENGINEINIT = 'Preemptive' + PREEMPTIVE_XE_GETTARGETSTATE = 'Preemptive' + PREEMPTIVE_XE_SESSIONCOMMIT = 'Preemptive' + PREEMPTIVE_XE_TARGETFINALIZE = 'Preemptive' + PREEMPTIVE_XE_TARGETINIT = 'Preemptive' + PREEMPTIVE_XE_TIMERRUN = 'Preemptive' + PREEMPTIVE_XETESTING = 'Preemptive' + PWAIT_HADR_ACTION_COMPLETED = 'Replication' + PWAIT_HADR_CHANGE_NOTIFIER_TERMINATION_SYNC = 'Replication' + PWAIT_HADR_CLUSTER_INTEGRATION = 'Replication' + PWAIT_HADR_FAILOVER_COMPLETED = 'Replication' + PWAIT_HADR_JOIN = 'Replication' + PWAIT_HADR_OFFLINE_COMPLETED = 'Replication' + PWAIT_HADR_ONLINE_COMPLETED = 'Replication' + PWAIT_HADR_POST_ONLINE_COMPLETED = 'Replication' + PWAIT_HADR_SERVER_READY_CONNECTIONS = 'Replication' + PWAIT_HADR_WORKITEM_COMPLETED = 'Replication' + PWAIT_HADRSIM = 'Replication' + PWAIT_RESOURCE_SEMAPHORE_FT_PARALLEL_QUERY_SYNC = 'Full Text Search' + QUERY_TRACEOUT = 'Tracing' + REPL_CACHE_ACCESS = 'Replication' + REPL_HISTORYCACHE_ACCESS = 'Replication' + REPL_SCHEMA_ACCESS = 'Replication' + REPL_TRANFSINFO_ACCESS = 'Replication' + REPL_TRANHASHTABLE_ACCESS = 'Replication' + REPL_TRANTEXTINFO_ACCESS = 'Replication' + REPLICA_WRITES = 'Replication' + REQUEST_FOR_DEADLOCK_SEARCH = 'Idle' + RESERVED_MEMORY_ALLOCATION_EXT = 'Memory' + RESOURCE_SEMAPHORE = 'Memory' + RESOURCE_SEMAPHORE_QUERY_COMPILE = 'Compilation' + SLEEP_BPOOL_FLUSH = 'Idle' + SLEEP_BUFFERPOOL_HELPLW = 'Idle' + SLEEP_DBSTARTUP = 'Idle' + SLEEP_DCOMSTARTUP = 'Idle' + SLEEP_MASTERDBREADY = 'Idle' + SLEEP_MASTERMDREADY = 'Idle' + SLEEP_MASTERUPGRADED = 'Idle' + SLEEP_MEMORYPOOL_ALLOCATEPAGES = 'Idle' + SLEEP_MSDBSTARTUP = 'Idle' + SLEEP_RETRY_VIRTUALALLOC = 'Idle' + SLEEP_SYSTEMTASK = 'Idle' + SLEEP_TASK = 'Idle' + SLEEP_TEMPDBSTARTUP = 'Idle' + SLEEP_WORKSPACE_ALLOCATEPAGE = 'Idle' + SOS_SCHEDULER_YIELD = 'CPU' + SQLCLR_APPDOMAIN = 'SQL CLR' + SQLCLR_ASSEMBLY = 'SQL CLR' + SQLCLR_DEADLOCK_DETECTION = 'SQL CLR' + SQLCLR_QUANTUM_PUNISHMENT = 'SQL CLR' + SQLTRACE_BUFFER_FLUSH = 'Idle' + SQLTRACE_FILE_BUFFER = 'Tracing' + SQLTRACE_FILE_READ_IO_COMPLETION = 'Tracing' + SQLTRACE_FILE_WRITE_IO_COMPLETION = 'Tracing' + SQLTRACE_INCREMENTAL_FLUSH_SLEEP = 'Idle' + SQLTRACE_PENDING_BUFFER_WRITERS = 'Tracing' + SQLTRACE_SHUTDOWN = 'Tracing' + SQLTRACE_WAIT_ENTRIES = 'Idle' + THREADPOOL = 'Worker Thread' + TRACE_EVTNOTIF = 'Tracing' + TRACEWRITE = 'Tracing' + TRAN_MARKLATCH_DT = 'Transaction' + TRAN_MARKLATCH_EX = 'Transaction' + TRAN_MARKLATCH_KP = 'Transaction' + TRAN_MARKLATCH_NL = 'Transaction' + TRAN_MARKLATCH_SH = 'Transaction' + TRAN_MARKLATCH_UP = 'Transaction' + TRANSACTION_MUTEX = 'Transaction' + WAIT_FOR_RESULTS = 'User Wait' + WAITFOR = 'User Wait' + WRITE_COMPLETION = 'Other Disk IO' + WRITELOG = 'Tran Log IO' + XACT_OWN_TRANSACTION = 'Transaction' + XACT_RECLAIM_SESSION = 'Transaction' + XACTLOCKINFO = 'Transaction' + XACTWORKSPACE_MUTEX = 'Transaction' + XE_DISPATCHER_WAIT = 'Idle' + XE_TIMER_EVENT = 'Idle' + ABR = 'Other' + ASSEMBLY_LOAD = 'SQLCLR' + ASYNC_DISKPOOL_LOCK = 'Buffer I/O' + BACKUP = 'Backup' + BACKUP_CLIENTLOCK = 'Backup' + BACKUP_OPERATOR = 'Backup' + BACKUPBUFFER = 'Backup' + BACKUPTHREAD = 'Backup' + BAD_PAGE_PROCESS = 'Other' + BUILTIN_HASHKEY_MUTEX = 'Other' + CHECK_PRINT_RECORD = 'Other' + CPU = 'CPU' + CURSOR = 'Other' + CURSOR_ASYNC = 'Other' + DAC_INIT = 'Other' + DBCC_COLUMN_TRANSLATION_CACHE = 'Other' + DBTABLE = 'Other' + DEADLOCK_ENUM_MUTEX = 'Latch' + DEADLOCK_TASK_SEARCH = 'Other' + DEBUG = 'Other' + DISABLE_VERSIONING = 'Other' + DISKIO_SUSPEND = 'Backup' + DLL_LOADING_MUTEX = 'Other' + DROPTEMP = 'Other' + DUMP_LOG_COORDINATOR = 'Other' + DUMP_LOG_COORDINATOR_QUEUE = 'Other' + DUMPTRIGGER = 'Other' + EC = 'Other' + EE_SPECPROC_MAP_INIT = 'Other' + ENABLE_VERSIONING = 'Other' + ERROR_REPORTING_MANAGER = 'Other' + EXECSYNC = 'Parallelism' + EXECUTION_PIPE_EVENT_INTERNAL = 'Other' + FAILPOINT = 'Other' + FS_GARBAGE_COLLECTOR_SHUTDOWN = 'SQLCLR' + FSAGENT = 'Idle' + FT_RESUME_CRAWL = 'Other' + GUARDIAN = 'Other' + HTTP_ENDPOINT_COLLCREATE = 'Other' + HTTP_ENUMERATION = 'Other' + HTTP_START = 'Other' + IMP_IMPORT_MUTEX = 'Other' + IMPPROV_IOWAIT = 'Other' + INDEX_USAGE_STATS_MUTEX = 'Latch' + INTERNAL_TESTING = 'Other' + IO_AUDIT_MUTEX = 'Other' + KSOURCE_WAKEUP = 'Idle' + KTM_ENLISTMENT = 'Other' + KTM_RECOVERY_MANAGER = 'Other' + KTM_RECOVERY_RESOLUTION = 'Other' + LOWFAIL_MEMMGR_QUEUE = 'Memory' + MIRROR_SEND_MESSAGE = 'Other' + MISCELLANEOUS = 'Other' + MSQL_DQ = 'Network I/O' + MSQL_SYNC_PIPE = 'Other' + MSQL_XP = 'Other' + OLEDB = 'Network I/O' + PARALLEL_BACKUP_QUEUE = 'Other' + PRINT_ROLLBACK_PROGRESS = 'Other' + QNMANAGER_ACQUIRE = 'Other' + QPJOB_KILL = 'Other' + QPJOB_WAITFOR_ABORT = 'Other' + QRY_MEM_GRANT_INFO_MUTEX = 'Other' + QUERY_ERRHDL_SERVICE_DONE = 'Other' + QUERY_EXECUTION_INDEX_SORT_EVENT_OPEN = 'Other' + QUERY_NOTIFICATION_MGR_MUTEX = 'Other' + QUERY_NOTIFICATION_SUBSCRIPTION_MUTEX = 'Other' + QUERY_NOTIFICATION_TABLE_MGR_MUTEX = 'Other' + QUERY_NOTIFICATION_UNITTEST_MUTEX = 'Other' + QUERY_OPTIMIZER_PRINT_MUTEX = 'Other' + QUERY_REMOTE_BRICKS_DONE = 'Other' + RECOVER_CHANGEDB = 'Other' + REQUEST_DISPENSER_PAUSE = 'Other' + RESOURCE_QUEUE = 'Idle' + RESOURCE_SEMAPHORE_MUTEX = 'Compilation' + RESOURCE_SEMAPHORE_SMALL_QUERY = 'Compilation' + SEC_DROP_TEMP_KEY = 'Other' + SEQUENTIAL_GUID = 'Other' + SERVER_IDLE_CHECK = 'Idle' + SHUTDOWN = 'Other' + SNI_CRITICAL_SECTION = 'Other' + SNI_HTTP_ACCEPT = 'Idle' + SNI_HTTP_WAITFOR_0_DISCON = 'Other' + SNI_LISTENER_ACCESS = 'Other' + SNI_TASK_COMPLETION = 'Other' + SOAP_READ = 'Full Text Search' + SOAP_WRITE = 'Full Text Search' + SOS_CALLBACK_REMOVAL = 'Other' + SOS_DISPATCHER_MUTEX = 'Other' + SOS_LOCALALLOCATORLIST = 'Other' + SOS_OBJECT_STORE_DESTROY_MUTEX = 'Other' + SOS_PROCESS_AFFINITY_MUTEX = 'Other' + SOS_RESERVEDMEMBLOCKLIST = 'Memory' + SOS_STACKSTORE_INIT_MUTEX = 'Other' + SOS_SYNC_TASK_ENQUEUE_EVENT = 'Other' + SOS_VIRTUALMEMORY_LOW = 'Memory' + SOSHOST_EVENT = 'Other' + SOSHOST_INTERNAL = 'Other' + SOSHOST_MUTEX = 'Other' + SOSHOST_RWLOCK = 'Other' + SOSHOST_SEMAPHORE = 'Other' + SOSHOST_SLEEP = 'Other' + SOSHOST_TRACELOCK = 'Other' + SOSHOST_WAITFORDONE = 'Other' + SQLSORT_NORMMUTEX = 'Other' + SQLSORT_SORTMUTEX = 'Other' + SQLTRACE_LOCK = 'Other' + SRVPROC_SHUTDOWN = 'Other' + TEMPOBJ = 'Other' + TIMEPRIV_TIMEPERIOD = 'Other' + UTIL_PAGE_ALLOC = 'Memory' + VIA_ACCEPT = 'Other' + VIEW_DEFINITION_MUTEX = 'Latch' + WAITFOR_TASKSHUTDOWN = 'Idle' + WAITSTAT_MUTEX = 'Other' + WCC = 'Other' + WORKTBL_DROP = 'Other' + XE_BUFFERMGR_ALLPROCECESSED_EVENT = 'Other' + XE_BUFFERMGR_FREEBUF_EVENT = 'Other' + XE_DISPATCHER_JOIN = 'Other' + XE_MODULEMGR_SYNC = 'Other' + XE_OLS_LOCK = 'Other' + XE_SERVICES_MUTEX = 'Other' + XE_SESSION_CREATE_SYNC = 'Other' + XE_SESSION_SYNC = 'Other' + XE_STM_CREATE = 'Other' + XE_TIMER_MUTEX = 'Other' + XE_TIMER_TASK_DONE = 'Other' + } + + $ignorable = 'BROKER_EVENTHANDLER', 'BROKER_RECEIVE_WAITFOR', 'BROKER_TASK_STOP', + 'BROKER_TO_FLUSH', 'BROKER_TRANSMITTER', 'CHECKPOINT_QUEUE', + 'CHKPT', 'CLR_AUTO_EVENT', 'CLR_MANUAL_EVENT', 'CLR_SEMAPHORE', 'CXCONSUMER', + 'DBMIRROR_DBM_EVENT', 'DBMIRROR_EVENTS_QUEUE', 'DBMIRROR_WORKER_QUEUE', + 'DBMIRRORING_CMD', 'DIRTY_PAGE_POLL', 'DISPATCHER_QUEUE_SEMAPHORE', + 'EXECSYNC', 'FSAGENT', 'FT_IFTS_SCHEDULER_IDLE_WAIT', 'FT_IFTSHC_MUTEX', + 'HADR_CLUSAPI_CALL', 'HADR_FILESTREAM_IOMGR_IOCOMPLETION', 'HADR_LOGCAPTURE_WAIT', + 'HADR_NOTIFICATION_DEQUEUE', 'HADR_TIMER_TASK', 'HADR_WORK_QUEUE', + 'KSOURCE_WAKEUP', 'LAZYWRITER_SLEEP', 'LOGMGR_QUEUE', + 'MEMORY_ALLOCATION_EXT', 'ONDEMAND_TASK_QUEUE', + 'PARALLEL_REDO_DRAIN_WORKER', 'PARALLEL_REDO_LOG_CACHE', 'PARALLEL_REDO_TRAN_LIST', 'PARALLEL_REDO_WORKER_SYNC', + 'PREEMPTIVE_SP_SERVER_DIAGNOSTICS', + 'PARALLEL_REDO_WORKER_WAIT_WORK', 'PREEMPTIVE_HADR_LEASE_MECHANISM', + 'PREEMPTIVE_OS_LIBRARYOPS', 'PREEMPTIVE_OS_COMOPS', 'PREEMPTIVE_OS_CRYPTOPS', + 'PREEMPTIVE_OS_PIPEOPS', 'PREEMPTIVE_OS_AUTHENTICATIONOPS', + 'PREEMPTIVE_OS_GENERICOPS', 'PREEMPTIVE_OS_VERIFYTRUST', + 'PREEMPTIVE_OS_FILEOPS', 'PREEMPTIVE_OS_DEVICEOPS', 'PREEMPTIVE_OS_QUERYREGISTRY', + 'PREEMPTIVE_OS_WRITEFILE', 'PREEMPTIVE_XE_CALLBACKEXECUTE', 'PREEMPTIVE_XE_DISPATCHER', + 'PREEMPTIVE_XE_GETTARGETSTATE', 'PREEMPTIVE_XE_SESSIONCOMMIT', + 'PREEMPTIVE_XE_TARGETINIT', 'PREEMPTIVE_XE_TARGETFINALIZE', + 'PWAIT_ALL_COMPONENTS_INITIALIZED', 'PWAIT_DIRECTLOGCONSUMER_GETNEXT', + 'QDS_PERSIST_TASK_MAIN_LOOP_SLEEP', 'QDS_ASYNC_QUEUE', + 'QDS_CLEANUP_STALE_QUERIES_TASK_MAIN_LOOP_SLEEP', 'REDO_THREAD_PENDING_WORK', + 'QDS_SHUTDOWN_QUEUE', 'REQUEST_FOR_DEADLOCK_SEARCH', + 'RESOURCE_QUEUE', 'SERVER_IDLE_CHECK', 'SLEEP_BPOOL_FLUSH', 'SLEEP_DBSTARTUP', + 'SLEEP_DCOMSTARTUP', 'SLEEP_MASTERDBREADY', 'SLEEP_MASTERMDREADY', + 'SLEEP_MASTERUPGRADED', 'SLEEP_MSDBSTARTUP', 'SLEEP_SYSTEMTASK', 'SLEEP_TASK', + 'SLEEP_TEMPDBSTARTUP', 'SNI_HTTP_ACCEPT', 'SP_SERVER_DIAGNOSTICS_SLEEP', + 'SQLTRACE_BUFFER_FLUSH', 'SQLTRACE_INCREMENTAL_FLUSH_SLEEP', 'SQLTRACE_WAIT_ENTRIES', + 'WAIT_FOR_RESULTS', 'WAITFOR', 'WAITFOR_TASKSHUTDOWN', 'WAIT_XTP_HOST_WAIT', + 'WAIT_XTP_OFFLINE_CKPT_NEW_LOG', 'WAIT_XTP_CKPT_CLOSE', 'WAIT_XTP_RECOVERY', + 'XE_BUFFERMGR_ALLPROCESSED_EVENT', 'XE_DISPATCHER_JOIN', + 'XE_DISPATCHER_WAIT', 'XE_LIVE_TARGET_TVF', 'XE_TIMER_EVENT' + + if ($IncludeIgnorable) { + $sql = "WITH [Waits] AS + (SELECT + [wait_type], + [wait_time_ms] / 1000.0 AS [WaitS], + ([wait_time_ms] - [signal_wait_time_ms]) / 1000.0 AS [ResourceS], + [signal_wait_time_ms] / 1000.0 AS [SignalS], + [waiting_tasks_count] AS [WaitCount], + Case WHEN SUM ([wait_time_ms]) OVER() = 0 THEN NULL ELSE 100.0 * [wait_time_ms] / SUM ([wait_time_ms]) OVER() END AS [Percentage], + ROW_NUMBER() OVER(ORDER BY [wait_time_ms] DESC) AS [RowNum] + FROM sys.dm_os_wait_stats + WHERE [waiting_tasks_count] > 0 + ) + SELECT + MAX ([W1].[wait_type]) AS [WaitType], + CAST (MAX ([W1].[WaitS]) AS DECIMAL (16,2)) AS [WaitSeconds], + CAST (MAX ([W1].[ResourceS]) AS DECIMAL (16,2)) AS [ResourceSeconds], + CAST (MAX ([W1].[SignalS]) AS DECIMAL (16,2)) AS [SignalSeconds], + MAX ([W1].[WaitCount]) AS [WaitCount], + CAST (MAX ([W1].[Percentage]) AS DECIMAL (5,2)) AS [Percentage], + CAST ((MAX ([W1].[WaitS]) / MAX ([W1].[WaitCount])) AS DECIMAL (16,4)) AS [AvgWaitSeconds], + CAST ((MAX ([W1].[ResourceS]) / MAX ([W1].[WaitCount])) AS DECIMAL (16,4)) AS [AvgResSeconds], + CAST ((MAX ([W1].[SignalS]) / MAX ([W1].[WaitCount])) AS DECIMAL (16,4)) AS [AvgSigSeconds], + CAST ('https://www.sqlskills.com/help/waits/' + MAX ([W1].[wait_type]) as XML) AS [URL] + FROM [Waits] AS [W1] + INNER JOIN [Waits] AS [W2] + ON [W2].[RowNum] <= [W1].[RowNum] + GROUP BY [W1].[RowNum] HAVING SUM ([W2].[Percentage]) - MAX([W1].[Percentage]) < $Threshold" + } else { + $IgnorableList = "'$($ignorable -join "','")'" + $sql = "WITH [Waits] AS + (SELECT + [wait_type], + [wait_time_ms] / 1000.0 AS [WaitS], + ([wait_time_ms] - [signal_wait_time_ms]) / 1000.0 AS [ResourceS], + [signal_wait_time_ms] / 1000.0 AS [SignalS], + [waiting_tasks_count] AS [WaitCount], + Case WHEN SUM ([wait_time_ms]) OVER() = 0 THEN NULL ELSE 100.0 * [wait_time_ms] / SUM ([wait_time_ms]) OVER() END AS [Percentage], + ROW_NUMBER() OVER(ORDER BY [wait_time_ms] DESC) AS [RowNum] + FROM sys.dm_os_wait_stats + WHERE [waiting_tasks_count] > 0 + AND Cast([wait_type] as VARCHAR(60)) NOT IN ($IgnorableList) + ) + SELECT + MAX ([W1].[wait_type]) AS [WaitType], + CAST (MAX ([W1].[WaitS]) AS DECIMAL (16,2)) AS [WaitSeconds], + CAST (MAX ([W1].[ResourceS]) AS DECIMAL (16,2)) AS [ResourceSeconds], + CAST (MAX ([W1].[SignalS]) AS DECIMAL (16,2)) AS [SignalSeconds], + MAX ([W1].[WaitCount]) AS [WaitCount], + CAST (MAX ([W1].[Percentage]) AS DECIMAL (5,2)) AS [Percentage], + CAST ((MAX ([W1].[WaitS]) / MAX ([W1].[WaitCount])) AS DECIMAL (16,4)) AS [AvgWaitSeconds], + CAST ((MAX ([W1].[ResourceS]) / MAX ([W1].[WaitCount])) AS DECIMAL (16,4)) AS [AvgResSeconds], + CAST ((MAX ([W1].[SignalS]) / MAX ([W1].[WaitCount])) AS DECIMAL (16,4)) AS [AvgSigSeconds], + CAST ('https://www.sqlskills.com/help/waits/' + MAX ([W1].[wait_type]) as XML) AS [URL] + FROM [Waits] AS [W1] + INNER JOIN [Waits] AS [W2] + ON [W2].[RowNum] <= [W1].[RowNum] + GROUP BY [W1].[RowNum] HAVING SUM ([W2].[Percentage]) - MAX([W1].[Percentage]) < $Threshold" + + } + Write-Message -Level Debug -Message $sql + } + process { + foreach ($instance in $SqlInstance) { + + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential -MinimumVersion 9 + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + Write-Message -Level Verbose -Message "Connected to $instance" + if ($IncludeIgnorable) { + $excludeColumns = 'Notes' + } else { + $excludeColumns = 'Notes', 'Ignorable' + } + + foreach ($row in $server.Query($sql)) { + $waitType = $row.WaitType + if (-not $IncludeIgnorable) { + if ($ignorable -contains $waitType) { continue } + } + + [PSCustomObject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + WaitType = $waitType + Category = ($category).$waitType + WaitSeconds = $row.WaitSeconds + ResourceSeconds = $row.ResourceSeconds + SignalSeconds = $row.SignalSeconds + WaitCount = $row.WaitCount + Percentage = $row.Percentage + AverageWaitSeconds = $row.AvgWaitSeconds + AverageResourceSeconds = $row.AvgResSeconds + AverageSignalSeconds = $row.AvgSigSeconds + Ignorable = ($ignorable -contains $waitType) + URL = $row.URL + Notes = ($details).$waitType + } | Select-DefaultView -ExcludeProperty $excludeColumns + } + } + } +} +function Get-DbaWindowsLog { + <# + .SYNOPSIS + Gets Windows Application events associated with an instance + + .DESCRIPTION + Gets Windows Application events associated with an instance + + .PARAMETER SqlInstance + The instance(s) to retrieve the event logs from + + .PARAMETER Start + Default: 1970 + Retrieve all events starting from this timestamp. + + .PARAMETER End + Default: Now + Retrieve all events that happened before this timestamp + + .PARAMETER Credential + Credential to be used to connect to the Server. Note this is a Windows credential, as this command requires we communicate with the computer and not with the SQL instance. + + .PARAMETER MaxThreads + Default: Unlimited + The maximum number of parallel threads used on the local computer. + Given that those will mostly be waiting for the remote system, there is usually no need to limit this. + + .PARAMETER MaxRemoteThreads + Default: 2 + The maximum number of parallel threads that are executed on the target sql server. + These processes will cause considerable CPU load, so a low limit is advisable in most scenarios. + Any value lower than 1 disables the limit + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Logging + Author: Drew Furgiuele | Friedrich Weinmann (@FredWeinmann) + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaWindowsLog + + .EXAMPLE + PS C:\> $ErrorLogs = Get-DbaWindowsLog -SqlInstance sql01\sharepoint + PS C:\> $ErrorLogs | Where-Object ErrorNumber -eq 18456 + + Returns all lines in the errorlogs that have event number 18456 in them + + #> + #This exists to ignore the Script Analyzer rule for Start-Runspace + [Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSUseShouldProcessForStateChangingFunctions", "")] + [CmdletBinding()] + param ( + [Parameter(ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]] + $SqlInstance = $env:COMPUTERNAME, + + [DateTime] + $Start = "1/1/1970 00:00:00", + + [DateTime] + $End = (Get-Date), + + + [System.Management.Automation.PSCredential] + $Credential, + + [int] + $MaxThreads = 0, + + [int] + $MaxRemoteThreads = 2, + + [switch] + [Alias('Silent')]$EnableException + ) + + begin { + Write-Message -Level Debug -Message "Bound parameters: $($PSBoundParameters.Keys -join ", ")" + + #region Helper Functions + function Start-Runspace { + $Powershell = [PowerShell]::Create().AddScript($scriptBlock_ParallelRemoting).AddParameter("SqlInstance", $instance).AddParameter("Start", $Start).AddParameter("End", $End).AddParameter("Credential", $Credential).AddParameter("MaxRemoteThreads", $MaxRemoteThreads).AddParameter("ScriptBlock", $scriptBlock_RemoteExecution) + $Powershell.RunspacePool = $RunspacePool + Write-Message -Level Verbose -Message "Launching remote runspace against $instance" -Target $instance + $null = $RunspaceCollection.Add((New-Object -TypeName PSObject -Property @{ Runspace = $PowerShell.BeginInvoke(); PowerShell = $PowerShell; Instance = $instance.FullSmoName })) + } + + function Receive-Runspace { + [Parameter()] + param ( + [switch] + $Wait + ) + + do { + foreach ($Run in $RunspaceCollection.ToArray()) { + if ($Run.Runspace.IsCompleted) { + Write-Message -Level Verbose -Message "Receiving results from $($Run.Instance)" -Target $Run.Instance + $Run.PowerShell.EndInvoke($Run.Runspace) + $Run.PowerShell.Dispose() + $RunspaceCollection.Remove($Run) + } + } + + if ($Wait -and ($RunspaceCollection.Count -gt 0)) { Start-Sleep -Milliseconds 250 } + } + while ($Wait -and ($RunspaceCollection.Count -gt 0)) + } + #endregion Helper Functions + + #region Scriptblocks + $scriptBlock_RemoteExecution = { + param ( + [System.DateTime] + $Start, + + [System.DateTime] + $End, + + [string] + $InstanceName, + + [int] + $Throttle + ) + + #region Helper function + function Convert-ErrorRecord { + param ( + $Line + ) + + if (Get-Variable -Name codesAndStuff -Scope 1) { + $line2 = (Get-Variable -Name codesAndStuff -Scope 1).Value + Remove-Variable -Name codesAndStuff -Scope 1 + + $groups = [regex]::Matches($line2, '^([\d- :]+.\d\d) (\w+)[ ]+Error: (\d+), Severity: (\d+), State: (\d+)').Groups + $groups2 = [regex]::Matches($line, '^[\d- :]+.\d\d \w+[ ]+(.*)$').Groups + + New-Object PSObject -Property @{ + Timestamp = [DateTime]::ParseExact($groups[1].Value, "yyyy-MM-dd HH:mm:ss.ff", $null) + Spid = $groups[2].Value + Message = $groups2[1].Value + ErrorNumber = [int]($groups[3].Value) + Severity = [int]($groups[4].Value) + State = [int]($groups[5].Value) + } + } + + if ($Line -match '^\d{4}-\d\d-\d\d \d\d:\d\d:\d\d\.\d\d[\w ]+((\w+): (\d+)[,\.]\s?){3}') { + Set-Variable -Name codesAndStuff -Value $Line -Scope 1 + } + } + #endregion Helper function + + #region Script that processes an individual file + $scriptBlock = { + param ( + [System.IO.FileInfo] + $File + ) + + try { + $stream = New-Object System.IO.FileStream($File.FullName, "Open", "Read", "ReadWrite, Delete") + $reader = New-Object System.IO.StreamReader($stream) + + while (-not $reader.EndOfStream) { + Convert-ErrorRecord -Line $reader.ReadLine() + } + } catch { + # here to avoid an empty catch + $null = 1 + } + } + #endregion Script that processes an individual file + + #region Gather list of files to process + $eventSource = "MSSQLSERVER" + if ($InstanceName -notmatch "^DEFAULT$|^MSSQLSERVER$") { + $eventSource = 'MSSQL$' + $InstanceName + } + + $event = Get-WinEvent -FilterHashtable @{ + LogName = "Application" + ID = 17111 + ProviderName = $eventSource + } -MaxEvents 1 -ErrorAction SilentlyContinue + + if (-not $event) { return } + + $path = $event.Properties[0].Value + $errorLogPath = Split-Path -Path $path + $errorLogFileName = Split-Path -Path $path -Leaf + $errorLogFiles = Get-ChildItem -Path $errorLogPath | Where-Object { ($_.Name -like "$errorLogFileName*") -and ($_.LastWriteTime -gt $Start) -and ($_.CreationTime -lt $End) } + #endregion Gather list of files to process + + #region Prepare Runspaces + [Collections.Arraylist]$RunspaceCollection = @() + + $InitialSessionState = [System.Management.Automation.Runspaces.InitialSessionState]::CreateDefault() + $Command = Get-Item function:Convert-ErrorRecord + $InitialSessionState.Commands.Add((New-Object System.Management.Automation.Runspaces.SessionStateFunctionEntry($command.Name, $command.Definition))) + + $RunspacePool = [RunspaceFactory]::CreateRunspacePool($InitialSessionState) + $null = $RunspacePool.SetMinRunspaces(1) + if ($Throttle -gt 0) { $null = $RunspacePool.SetMaxRunspaces($Throttle) } + $RunspacePool.Open() + #endregion Prepare Runspaces + + #region Process Error files + $countDone = 0 + $countStarted = 0 + $countTotal = ($errorLogFiles | Measure-Object).Count + + while ($countDone -lt $countTotal) { + while (($RunspacePool.GetAvailableRunspaces() -gt 0) -and ($countStarted -lt $countTotal)) { + $Powershell = [PowerShell]::Create().AddScript($scriptBlock).AddParameter("File", $errorLogFiles[$countStarted]) + $Powershell.RunspacePool = $RunspacePool + $null = $RunspaceCollection.Add((New-Object -TypeName PSObject -Property @{ Runspace = $PowerShell.BeginInvoke(); PowerShell = $PowerShell })) + $countStarted++ + } + + foreach ($Run in $RunspaceCollection.ToArray()) { + if ($Run.Runspace.IsCompleted) { + $Run.PowerShell.EndInvoke($Run.Runspace) | Where-Object { ($_.Timestamp -gt $Start) -and ($_.Timestamp -lt $End) } + $Run.PowerShell.Dispose() + $RunspaceCollection.Remove($Run) + $countDone++ + } + } + + Start-Sleep -Milliseconds 250 + } + $RunspacePool.Close() + $RunspacePool.Dispose() + #endregion Process Error files + } + + $scriptBlock_ParallelRemoting = { + param ( + [DbaInstanceParameter] + $SqlInstance, + + [DateTime] + $Start, + + [DateTime] + $End, + + [PSCredential] + $Credential, + + [int] + $MaxRemoteThreads, + + [System.Management.Automation.ScriptBlock] + $ScriptBlock + ) + + $params = @{ + ArgumentList = $Start, $End, $SqlInstance.InstanceName, $MaxRemoteThreads + ScriptBlock = $ScriptBlock + } + if (-not $SqlInstance.IsLocalhost) { $params["ComputerName"] = $SqlInstance.ComputerName } + if ($Credential) { $params["Credential"] = $Credential } + + Invoke-Command @params | Select-Object @{ n = "InstanceName"; e = { $SqlInstance.FullSmoName } }, Timestamp, Spid, Severity, ErrorNumber, State, Message + } + #endregion Scriptblocks + + #region Setup Runspace + [Collections.Arraylist]$RunspaceCollection = @() + $InitialSessionState = [System.Management.Automation.Runspaces.InitialSessionState]::CreateDefault() + $defaultrunspace = [System.Management.Automation.Runspaces.Runspace]::DefaultRunspace + $RunspacePool = [RunspaceFactory]::CreateRunspacePool($InitialSessionState) + $RunspacePool.SetMinRunspaces(1) | Out-Null + if ($MaxThreads -gt 0) { $null = $RunspacePool.SetMaxRunspaces($MaxThreads) } + $RunspacePool.Open() + + $countStarted = 0 + #Variable marked as unused by PSScriptAnalyzer + #$countReceived = 0 + #endregion Setup Runspace + } + + process { + foreach ($instance in $SqlInstance) { + Write-Message -Level VeryVerbose -Message "Processing $instance" -Target $instance + Start-Runspace + Receive-Runspace + } + } + + end { + Receive-Runspace -Wait + $RunspacePool.Close() + $RunspacePool.Dispose() + [System.Management.Automation.Runspaces.Runspace]::DefaultRunspace = $defaultrunspace + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function Get-DbaWsfcAvailableDisk { + <# + .SYNOPSIS + Gets information about the disks that can support Failover Clustering and are visible to all nodes, but are not yet part of the set of clustered disks. + + .DESCRIPTION + Gets information about the disks that can support Failover Clustering and are visible to all nodes, but are not yet part of the set of clustered disks. + + All Windows Server Failover Clustering (Wsfc) commands require local admin on each member node. + + .PARAMETER ComputerName + The target cluster name. Can be a node or the cluster name itself. + + .PARAMETER Credential + Allows you to login to the cluster using alternative credentials. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Cluster, WSFC, FCI, HA + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaWsfcAvailableDisk + + .EXAMPLE + PS C:\> Get-DbaWsfcAvailableDisk -ComputerName cluster01 + + Gets available disks from the failover cluster cluster01 + + #> + [CmdletBinding()] + param ( + [parameter(ValueFromPipeline)] + [DbaInstanceParameter[]]$ComputerName = $env:COMPUTERNAME, + [PSCredential]$Credential, + [switch]$EnableException + ) + process { + foreach ($computer in $computername) { + $cluster = Get-DbaWsfcCluster -ComputerName $computer -Credential $Credential + $disk = Get-DbaCmObject -Computername $computer -Credential $Credential -Namespace root\MSCluster -ClassName MSCluster_AvailableDisk + + # I don't have an available disk, so I can't see how to clean this up: Passthru + $disk | Add-Member -Force -NotePropertyName State -NotePropertyValue (Get-ResourceState $resource.State) + $disk | Add-Member -Force -NotePropertyName ClusterName -NotePropertyValue $cluster.Name + $disk | Add-Member -Force -NotePropertyName ClusterFqdn -NotePropertyValue $cluster.Fqdn -PassThru + } + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function Get-DbaWsfcCluster { + <# + .SYNOPSIS + Gets information about one or more failover clusters in a given domain. + + .DESCRIPTION + Gets information about one or more failover clusters in a given domain. + + All Windows Server Failover Clustering (Wsfc) commands require local admin on each member node. + + .PARAMETER ComputerName + The target cluster name. Can be a node or the cluster name itself. + + .PARAMETER Credential + Allows you to login to the cluster using alternative credentials. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Cluster, WSFC, FCI, HA + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaWsfcCluster + + .EXAMPLE + PS C:\> Get-DbaWsfcCluster -ComputerName cluster01 + + Gets failover cluster information about cluster01 + + .EXAMPLE + PS C:\> Get-DbaWsfcCluster -ComputerName cluster01 | Select * + + Shows all cluster values, including the ones not shown in the default view + + #> + [CmdletBinding()] + param ( + [parameter(ValueFromPipeline)] + [DbaInstanceParameter[]]$ComputerName = $env:COMPUTERNAME, + [PSCredential]$Credential, + [switch]$EnableException + ) + process { + foreach ($computer in $computername) { + $cluster = Get-DbaCmObject -Computername $computer -Credential $Credential -Namespace root\MSCluster -ClassName MSCluster_Cluster + $cluster | Add-Member -Force -NotePropertyName State -NotePropertyValue (Get-ResourceState $resource.State) + $cluster | Select-DefaultView -Property Name, Fqdn, State, DrainOnShutdown, DynamicQuorumEnabled, EnableSharedVolumes, SharedVolumesRoot, QuorumPath, QuorumType, QuorumTypeValue, RequestReplyTimeout + } + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function Get-DbaWsfcDisk { + <# + .SYNOPSIS + Gets information about the clustered disks on one or more failover clusters in a given domain. + + .DESCRIPTION + Gets information about the clustered disks on one or more failover clusters in a given domain. + + All Windows Server Failover Clustering (Wsfc) commands require local admin on each member node. + + .PARAMETER ComputerName + The target cluster name. Can be a node or the cluster name itself. + + .PARAMETER Credential + Allows you to login to the cluster using alternative credentials. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Cluster, WSFC, FCI, HA + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaWsfcDisk + + .EXAMPLE + PS C:\> Get-DbaWsfcDisk -ComputerName cluster01 + + Gets disk information from the failover cluster cluster01 + + #> + [CmdletBinding()] + param ( + [parameter(ValueFromPipeline)] + [DbaInstanceParameter[]]$ComputerName = $env:COMPUTERNAME, + [PSCredential]$Credential, + [switch]$EnableException + ) + process { + foreach ($computer in $computername) { + $resources = Get-DbaWsfcResource -ComputerName $computer -Credential $Credential | Where-Object Type -eq 'Physical Disk' + foreach ($resource in $resources) { + $disks = $resource | Get-CimAssociatedInstance -ResultClassName MSCluster_Disk + foreach ($disk in $disks) { + $diskpart = $disk | Get-CimAssociatedInstance -ResultClassName MSCluster_DiskPartition + [pscustomobject]@{ + ClusterName = $resource.ClusterName + ClusterFqdn = $resource.ClusterFqdn + ResourceGroup = $resource.OwnerGroup + Disk = $resource.Name + State = $resource.State + FileSystem = $diskpart.FileSystem + Path = $diskpart.Path + Label = $diskpart.VolumeLabel + Size = [dbasize]($diskpart.TotalSize * 1MB) + Free = [dbasize]($diskpart.FreeSpace * 1MB) + MountPoints = $diskpart.MountPoints + SerialNumber = $diskpart.SerialNumber + ClusterDisk = $disk + ClusterDiskPart = $diskpart + ClusterResource = $resource + } | Select-DefaultView -ExcludeProperty ClusterDisk, ClusterDiskPart, ClusterResource + } + } + } + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function Get-DbaWsfcNetwork { + <# + .SYNOPSIS + Gets information about one or more networks in a failover cluster. + + .DESCRIPTION + Gets information about one or more networks in a failover cluster. + + All Windows Server Failover Clustering (Wsfc) commands require local admin on each member node. + + .PARAMETER ComputerName + The target cluster name. Can be a Network or the cluster name itself. + + .PARAMETER Credential + Allows you to login to the cluster using alternative credentials. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Cluster, WSFC, FCI, HA + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaWsfcNetwork + + .EXAMPLE + PS C:\> Get-DbaWsfcNetwork -ComputerName cluster01 + + Gets network information from the failover cluster cluster01 + + #> + [CmdletBinding()] + param ( + [parameter(ValueFromPipeline)] + [DbaInstanceParameter[]]$ComputerName = $env:COMPUTERNAME, + [PSCredential]$Credential, + [switch]$EnableException + ) + process { + foreach ($computer in $computername) { + $cluster = Get-DbaWsfcCluster -ComputerName $computer -Credential $Credential + + $network = Get-DbaCmObject -Computername $computer -Credential $Credential -Namespace root\MSCluster -ClassName MSCluster_Network + $network | Add-Member -Force -NotePropertyName ClusterName -NotePropertyValue $cluster.Name + $network | Add-Member -Force -NotePropertyName ClusterFqdn -NotePropertyValue $cluster.Fqdn + + $network | Select-DefaultView -Property ClusterName, ClusterFqdn, Name, Address, AddressMask, IPv4Addresses, IPv4PrefixLengths, IPv6Addresses, IPv6PrefixLengths, QuorumType, QuorumTypeValue, RequestReplyTimeout, Role + } + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function Get-DbaWsfcNetworkInterface { + <# + .SYNOPSIS + Gets information about one or more network adapters in a failover cluster. + + .DESCRIPTION + Gets information about one or more network adapters in a failover cluster. + + All Windows Server Failover Clustering (Wsfc) commands require local admin on each member node. + + .PARAMETER ComputerName + The target cluster name. Can be a Network or the cluster name itself. + + .PARAMETER Credential + Allows you to login to the cluster using alternative credentials. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Cluster, WSFC, FCI, HA + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaWsfcNetworkInterface + + .EXAMPLE + PS C:\> Get-DbaWsfcNetworkInterface -ComputerName cluster01 + + Gets network interface information from the failover cluster cluster01 + + .EXAMPLE + PS C:\> Get-DbaWsfcNetworkInterface -ComputerName cluster01 | Select * + + Shows all network interface values, including the ones not shown in the default view + + #> + [CmdletBinding()] + param ( + [parameter(ValueFromPipeline)] + [DbaInstanceParameter[]]$ComputerName = $env:COMPUTERNAME, + [PSCredential]$Credential, + [switch]$EnableException + ) + process { + foreach ($computer in $computername) { + $cluster = Get-DbaWsfcCluster -ComputerName $computer -Credential $Credential + $network = Get-DbaCmObject -Computername $computer -Credential $Credential -Namespace root\MSCluster -ClassName MSCluster_NetworkInterface + $network | Add-Member -Force -NotePropertyName ClusterName -NotePropertyValue $cluster.Name + $network | Add-Member -Force -NotePropertyName ClusterFqdn -NotePropertyValue $cluster.Fqdn + $network | Select-DefaultView -Property ClusterName, ClusterFqdn, Name, Network, Node, Adapter, Address, DhcpEnabled, IPv4Addresses, IPv6Addresses, IPv6Addresses + } + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function Get-DbaWsfcNode { + <# + .SYNOPSIS + Gets information about one or more nodes, or servers, in a failover cluster. + + .DESCRIPTION + Gets information about one or more nodes, or servers, in a failover cluster. + + All Windows Server Failover Clustering (Wsfc) commands require local admin on each member node. + + .PARAMETER ComputerName + The target cluster name. Can be a node or the cluster name itself. + + .PARAMETER Credential + Allows you to login to the cluster using alternative credentials. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Cluster, WSFC, FCI, HA + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaWsfcNode + + .EXAMPLE + PS C:\> Get-DbaWsfcNode -ComputerName cluster01 + + Gets node information from the failover cluster cluster01 + + .EXAMPLE + PS C:\> Get-DbaWsfcNode -ComputerName cluster01 | Select-Object * + + Shows all node values, including the ones not shown in the default view + + #> + [CmdletBinding()] + param ( + [parameter(ValueFromPipeline)] + [DbaInstanceParameter[]]$ComputerName = $env:COMPUTERNAME, + [PSCredential]$Credential, + [switch]$EnableException + ) + process { + foreach ($computer in $computername) { + $cluster = Get-DbaWsfcCluster -ComputerName $computer -Credential $Credential + $node = Get-DbaCmObject -Computername $computer -Credential $Credential -Namespace root\MSCluster -ClassName MSCluster_Node + $node | Add-Member -Force -NotePropertyName ClusterName -NotePropertyValue $cluster.Name + $node | Add-Member -Force -NotePropertyName ClusterFqdn -NotePropertyValue $cluster.Fqdn + $node | Select-DefaultView -Property ClusterName, ClusterFqdn, Name, PrimaryOwnerName, PrimaryOwnerContact, Dedicated, NodeHighestVersion, NodeLowestVersion + } + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function Get-DbaWsfcResource { + <# + .SYNOPSIS + Gets information about one or more resources in a failover cluster. + + .DESCRIPTION + Gets information about one or more resources in a failover cluster. + + All Windows Server Failover Clustering (Wsfc) commands require local admin on each member node. + + .PARAMETER ComputerName + The target cluster name. Can be a node or the cluster name itself. + + .PARAMETER Credential + Allows you to login to the cluster using alternative credentials. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Cluster, WSFC, FCI, HA + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaWsfcResource + + .EXAMPLE + PS C:\> Get-DbaWsfcResource -ComputerName cluster01 + + Gets resource information from the failover cluster cluster01 + + .EXAMPLE + PS C:\> Get-DbaWsfcResource -ComputerName cluster01 | Select * + + Shows all resource values, including the ones not shown in the default view + + #> + [CmdletBinding()] + param ( + [parameter(ValueFromPipeline)] + [DbaInstanceParameter[]]$ComputerName = $env:COMPUTERNAME, + [PSCredential]$Credential, + [switch]$EnableException + ) + process { + foreach ($computer in $computername) { + $cluster = Get-DbaWsfcCluster -ComputerName $computer -Credential $Credential + $resources = Get-DbaCmObject -Computername $computer -Credential $Credential -Namespace root\MSCluster -ClassName MSCluster_Resource + foreach ($resource in $resources) { + $resource | Add-Member -Force -NotePropertyName State -NotePropertyValue (Get-ResourceState $resource.State) + $resource | Add-Member -Force -NotePropertyName ClusterName -NotePropertyValue $cluster.Name + $resource | Add-Member -Force -NotePropertyName ClusterFqdn -NotePropertyValue $cluster.Fqdn + $resource | Select-DefaultView -Property ClusterName, ClusterFqdn, Name, State, Type, OwnerGroup, OwnerNode, PendingTimeout, PersistentState, QuorumCapable, RequiredDependencyClasses, RequiredDependencyTypes, RestartAction, RestartDelay, RestartPeriod, RestartThreshold, RetryPeriodOnFailure, SeparateMonitor + } + } + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function Get-DbaWsfcResourceType { + <# + .SYNOPSIS + Gets information about one or more resource types in a failover cluster. + + .DESCRIPTION + Gets information about one or more resource types in a failover cluster. + + All Windows Server Failover Clustering (Wsfc) commands require local admin on each member node. + + .PARAMETER ComputerName + The target cluster name. Can be a node or the cluster name itself. + + .PARAMETER Credential + Allows you to login to the cluster using alternative credentials. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Cluster, WSFC, FCI, HA + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaWsfcResourceType + + .EXAMPLE + PS C:\> Get-DbaWsfcResourceType -ComputerName cluster01 + + Gets resource type information from the failover cluster cluster01 + + #> + [CmdletBinding()] + param ( + [parameter(ValueFromPipeline)] + [DbaInstanceParameter[]]$ComputerName = $env:COMPUTERNAME, + [PSCredential]$Credential, + [switch]$EnableException + ) + process { + foreach ($computer in $computername) { + $cluster = Get-DbaWsfcCluster -ComputerName $computer -Credential $Credential + $resource = Get-DbaCmObject -Computername $computer -Credential $Credential -Namespace root\MSCluster -ClassName MSCluster_ResourceType + $resource | Add-Member -Force -NotePropertyName ClusterName -NotePropertyValue $cluster.Name + $resource | Add-Member -Force -NotePropertyName ClusterFqdn -NotePropertyValue $cluster.Fqdn + $resource | Select-DefaultView -Property ClusterName, ClusterFqdn, Name, DisplayName, DllName, RequiredDependencyTypes + } + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function Get-DbaWsfcRole { + <# + .SYNOPSIS + Gets information about one or more clustered roles (resource groups) in a failover cluster. + + .DESCRIPTION + Gets information about one or more clustered roles (resource groups) in a failover cluster. + + All Windows Server Failover Clustering (Wsfc) commands require local admin on each member node. + + .PARAMETER ComputerName + The target cluster name. Can be a Role or the cluster name itself. + + .PARAMETER Credential + Allows you to login to the cluster using alternative credentials. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Cluster, WSFC, FCI, HA + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaWsfcRole + + .EXAMPLE + PS C:\> Get-DbaWsfcRole -ComputerName cluster01 + + Gets role information from the failover cluster cluster01 + + .EXAMPLE + PS C:\> Get-DbaWsfcRole -ComputerName cluster01 | Select * + + Shows all role values, including the ones not shown in the default view + + #> + [CmdletBinding()] + param ( + [parameter(ValueFromPipeline)] + [DbaInstanceParameter[]]$ComputerName = $env:COMPUTERNAME, + [PSCredential]$Credential, + [switch]$EnableException + ) + process { + foreach ($computer in $computername) { + $cluster = Get-DbaWsfcCluster -ComputerName $computer -Credential $Credential + $role = Get-DbaCmObject -Computername $computer -Credential $Credential -Namespace root\MSCluster -ClassName MSCluster_ResourceGroup + $role | Add-Member -Force -NotePropertyName State -NotePropertyValue (Get-ResourceState $resource.State) + $role | Add-Member -Force -NotePropertyName ClusterName -NotePropertyValue $cluster.Name + $role | Add-Member -Force -NotePropertyName ClusterFqdn -NotePropertyValue $cluster.Fqdn + $role | Select-DefaultView -Property ClusterName, ClusterFqdn, Name, OwnerNode, State + } + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function Get-DbaWsfcSharedVolume { + <# + .SYNOPSIS + Gets information about Cluster Shared Volumes in a failover cluster. + + .DESCRIPTION + Gets information about Cluster Shared Volumes in a failover cluster. + + All Windows Server Failover Clustering (Wsfc) commands require local admin on each member node. + + .PARAMETER ComputerName + The target cluster name. Can be a node or the cluster name itself. + + .PARAMETER Credential + Allows you to login to the cluster using alternative credentials. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Cluster, WSFC, FCI, HA + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaWsfcSharedVolume + + .EXAMPLE + PS C:\> Get-DbaWsfcSharedVolume -ComputerName cluster01 + + Gets shared volume (CSV) information from the failover cluster cluster01 + + #> + [CmdletBinding()] + param ( + [parameter(ValueFromPipeline)] + [DbaInstanceParameter[]]$ComputerName = $env:COMPUTERNAME, + [PSCredential]$Credential, + [switch]$EnableException + ) + process { + foreach ($computer in $computername) { + $cluster = Get-DbaWsfcCluster -ComputerName $computer -Credential $Credential + $volume = Get-DbaCmObject -Computername $computer -Credential $Credential -Namespace root\MSCluster -ClassName ClusterSharedVolume + # I don't have a shared volume, so I can't see how to clean this up: Passthru + $volume | Add-Member -Force -NotePropertyName ClusterName -NotePropertyValue $cluster.Name + $volume | Add-Member -Force -NotePropertyName ClusterFqdn -NotePropertyValue $cluster.Fqdn + $volume | Add-Member -Force -NotePropertyName State -NotePropertyValue (Get-ResourceState $resource.State) -PassThru + } + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function Get-DbaXEObject { + <# + .SYNOPSIS + Gets a list of extended events objects exposed by event packages from specified SQL Server instance(s). + + .DESCRIPTION + This function returns a list of extended events objects exposed by event packages from specified SQL Server instance(s). + + .PARAMETER SqlInstance + The target SQL Server instance or instances. You must have sysadmin access and server version must be SQL Server version 2008 or higher. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Type + Used to specify the type. Valid types include: + + Action + Event + Map + Message + PredicateComparator + PredicateSource + Target + Type + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: ExtendedEvent, XE, XEvent + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .EXAMPLE + PS C:\> Get-DbaXEObject -SqlInstance sql2016 + + Lists all the XE Objects on the sql2016 SQL Server. + + .EXAMPLE + PS C:\> Get-DbaXEObject -SqlInstance sql2017 -Type Action, Event + + Lists all the XE Objects of type Action and Event on the sql2017 SQL Server. + + #> + [CmdletBinding()] + param ( + [parameter(Position = 0, Mandatory, ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [ValidateSet("Type", "Event", "Target", "Action", "Map", "Message", "PredicateComparator", "PredicateSource")] + [string[]]$Type, + [switch]$EnableException + ) + begin { + if ($Type) { + $join = $Type -join "','" + $where = "AND o.object_type in ('$join')" + $where.Replace("PredicateComparator", "pred_compare") + $where.Replace("PredicateSource", "pred_source") + } + $sql = "SELECT SERVERPROPERTY('MachineName') AS ComputerName, + ISNULL(SERVERPROPERTY('InstanceName'), 'MSSQLSERVER') AS InstanceName, + SERVERPROPERTY('ServerName') AS SqlInstance, + p.name AS PackageName, + ObjectType = + CASE o.object_type + WHEN 'type' THEN 'Type' + WHEN 'event' THEN 'Event' + WHEN 'target' THEN 'Target' + WHEN 'pred_compare' THEN 'PredicateComparator' + WHEN 'pred_source' THEN 'PredicateSource' + WHEN 'action' THEN 'Action' + WHEN 'map' THEN 'Map' + WHEN 'message' THEN 'Message' + ELSE o.object_type + END, + o.object_type as ObjectTypeRaw, + o.name AS TargetName, + o.description as Description + FROM sys.dm_xe_packages AS p + JOIN sys.dm_xe_objects AS o ON p.guid = o.package_guid + WHERE (p.capabilities IS NULL OR p.capabilities & 1 = 0) + $where + AND (o.capabilities IS NULL OR o.capabilities & 1 = 0) + ORDER BY o.object_type + " + } + process { + foreach ($instance in $SqlInstance) { + + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential -MinimumVersion 9 + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + return + } + + try { + $server.Query($sql) | Select-DefaultView -ExcludeProperty ComputerName, InstanceName, ObjectTypeRaw + } catch { + Stop-Function -Message "Issue collecting trace data on $server." -Target $server -ErrorRecord $_ + } + } + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function Get-DbaXESession { + <# + .SYNOPSIS + Gets a list of Extended Events Sessions from the specified SQL Server instance(s). + + .DESCRIPTION + Retrieves a list of Extended Events Sessions present on the specified SQL Server instance(s). + + .PARAMETER SqlInstance + The target SQL Server instance or instances. You must have sysadmin access and server version must be SQL Server version 2008 or higher. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Session + Only return specific sessions. Options for this parameter are auto-populated from the server. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: ExtendedEvent, XE, XEvent + Author: Klaas Vandenberghe (@PowerDBAKlaas) + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaXESession + + .EXAMPLE + PS C:\> Get-DbaXESession -SqlInstance ServerA\sql987 + + Returns a custom object with ComputerName, SQLInstance, Session, StartTime, Status and other properties. + + .EXAMPLE + PS C:\> Get-DbaXESession -SqlInstance ServerA\sql987 | Format-Table ComputerName, SqlInstance, Session, Status -AutoSize + + Returns a formatted table displaying ComputerName, SqlInstance, Session, and Status. + + .EXAMPLE + PS C:\> 'ServerA\sql987','ServerB' | Get-DbaXESession + + Returns a custom object with ComputerName, SqlInstance, Session, StartTime, Status and other properties, from multiple SQL instances. + + #> + [CmdletBinding()] + param ( + [parameter(Mandatory, ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [Alias("Sessions")] + [object[]]$Session, + [Alias('Silent')] + [switch]$EnableException + ) + + begin { + Test-DbaDeprecation -DeprecatedOn "1.0.0" -EnableException:$false -Alias Get-DbaXEsSession + } + + process { + + foreach ($instance in $SqlInstance) { + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential -MinimumVersion 11 -AzureUnsupported + $SqlConn = $server.ConnectionContext.SqlConnectionObject + $SqlStoreConnection = New-Object Microsoft.SqlServer.Management.Sdk.Sfc.SqlStoreConnection $SqlConn + $XEStore = New-Object Microsoft.SqlServer.Management.XEvent.XEStore $SqlStoreConnection + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + Write-Message -Level Verbose -Message "Getting XEvents Sessions on $instance." + $xesessions = $XEStore.sessions + + if ($Session) { + $xesessions = $xesessions | Where-Object { $_.Name -in $Session } + } + + foreach ($x in $xesessions) { + $status = switch ($x.IsRunning) { $true { "Running" } $false { "Stopped" } } + $files = $x.Targets.TargetFields | Where-Object Name -eq Filename | Select-Object -ExpandProperty Value + + $filecollection = $remotefile = @() + + if ($files) { + foreach ($file in $files) { + if ($file -notmatch ':\\' -and $file -notmatch '\\\\') { + $directory = $server.ErrorLogPath.TrimEnd("\") + $file = "$directory\$file" + } + $filecollection += $file + $remotefile += Join-AdminUnc -servername $server.ComputerName -filepath $file + } + } + + Add-Member -Force -InputObject $x -MemberType NoteProperty -Name ComputerName -Value $server.ComputerName + Add-Member -Force -InputObject $x -MemberType NoteProperty -Name InstanceName -Value $server.ServiceName + Add-Member -Force -InputObject $x -MemberType NoteProperty -Name SqlInstance -Value $server.DomainInstanceName + Add-Member -Force -InputObject $x -MemberType NoteProperty -Name Status -Value $status + Add-Member -Force -InputObject $x -MemberType NoteProperty -Name Session -Value $x.Name + Add-Member -Force -InputObject $x -MemberType NoteProperty -Name TargetFile -Value $filecollection + Add-Member -Force -InputObject $x -MemberType NoteProperty -Name RemoteTargetFile -Value $remotefile + Add-Member -Force -InputObject $x -MemberType NoteProperty -Name Parent -Value $server + Add-Member -Force -InputObject $x -MemberType NoteProperty -Name Store -Value $XEStore + Select-DefaultView -InputObject $x -Property ComputerName, InstanceName, SqlInstance, Name, Status, StartTime, AutoStart, State, Targets, TargetFile, Events, MaxMemory, MaxEventSize + } + } + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function Get-DbaXESessionTarget { + <# + .SYNOPSIS + Get a list of Extended Events Session Targets from the specified SQL Server instance(s). + + .DESCRIPTION + Retrieves a list of Extended Events Session Targets from the specified SQL Server instance(s). + + .PARAMETER SqlInstance + The target SQL Server instance or instances. You must have sysadmin access and server version must be SQL Server version 2008 or higher. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Session + Only return a specific session. Options for this parameter are auto-populated from the server. + + .PARAMETER Target + Only return a specific target. + + .PARAMETER InputObject + Specifies an XE session returned by Get-DbaXESession to search. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: ExtendedEvent, XE, XEvent + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaXESessionTarget + + .EXAMPLE + PS C:\> Get-DbaXESessionTarget -SqlInstance ServerA\sql987 -Session system_health + + Shows targets for the system_health session on ServerA\sql987. + + .EXAMPLE + PS C:\> Get-DbaXESession -SqlInstance sql2016 -Session system_health | Get-DbaXESessionTarget + + Returns the targets for the system_health session on sql2016. + + .EXAMPLE + PS C:\> Get-DbaXESession -SqlInstance sql2016 -Session system_health | Get-DbaXESessionTarget -Target package0.event_file + + Return only the package0.event_file target for the system_health session on sql2016. + + #> + [CmdletBinding(DefaultParameterSetName = "Default")] + param ( + [parameter(ValueFromPipeline, ParameterSetName = "instance", Mandatory)] + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [string[]]$Session, + [string[]]$Target, + [parameter(ValueFromPipeline, ParameterSetName = "piped", Mandatory)] + [Microsoft.SqlServer.Management.XEvent.Session[]]$InputObject, + [switch][Alias('Silent')] + $EnableException + ) + + begin { + function Get-Target { + [CmdletBinding()] + param ( + $Sessions, + $Session, + $Server, + $Target + ) + + foreach ($xsession in $Sessions) { + + if ($null -eq $server) { + $server = $xsession.Parent + } + + if ($Session -and $xsession.Name -notin $Session) { continue } + $status = switch ($xsession.IsRunning) { $true { "Running" } $false { "Stopped" } } + $sessionname = $xsession.Name + + foreach ($xtarget in $xsession.Targets) { + if ($Target -and $xtarget.Name -notin $Target) { continue } + + $files = $xtarget.TargetFields | Where-Object Name -eq Filename | Select-Object -ExpandProperty Value + + $filecollection = $remotefile = @() + + if ($files) { + foreach ($file in $files) { + if ($file -notmatch ':\\' -and $file -notmatch '\\\\') { + $directory = $server.ErrorLogPath.TrimEnd("\") + $file = "$directory\$file" + } + $filecollection += $file + $remotefile += Join-AdminUnc -servername $server.ComputerName -filepath $file + } + } + + Add-Member -Force -InputObject $xtarget -MemberType NoteProperty -Name ComputerName -Value $server.ComputerName + Add-Member -Force -InputObject $xtarget -MemberType NoteProperty -Name InstanceName -Value $server.ServiceName + Add-Member -Force -InputObject $xtarget -MemberType NoteProperty -Name SqlInstance -Value $server.DomainInstanceName + Add-Member -Force -InputObject $xtarget -MemberType NoteProperty -Name Session -Value $sessionname + Add-Member -Force -InputObject $xtarget -MemberType NoteProperty -Name SessionStatus -Value $status + Add-Member -Force -InputObject $xtarget -MemberType NoteProperty -Name TargetFile -Value $filecollection + Add-Member -Force -InputObject $xtarget -MemberType NoteProperty -Name RemoteTargetFile -Value $remotefile + + Select-DefaultView -InputObject $xtarget -Property ComputerName, InstanceName, SqlInstance, Session, SessionStatus, Name, ID, 'TargetFields as Field', PackageName, 'TargetFile as File', Description, ScriptName + } + } + } + } + + process { + if (Test-FunctionInterrupt) { return } + + foreach ($instance in $SqlInstance) { + $InputObject += Get-DbaXESession -SqlInstance $instance -SqlCredential $SqlCredential -Session $Session + } + Get-Target -Sessions $InputObject -Session $Session -Target $Target + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function Get-DbaXESessionTargetFile { + <# + .SYNOPSIS + Get a file system object from the Extended Events Session Target Files. + + .DESCRIPTION + Get a file system object from the Extended Events Session Target Files. + + Note: this performs a Get-ChildItem on remote servers if the specified target SQL Server is remote. + + .PARAMETER SqlInstance + The target SQL Server + + .PARAMETER SqlCredential + Login to SQL instnace with alternative credentials + + .PARAMETER Session + Only return files from a specific session. Options for this parameter are auto-populated from the server. + + .PARAMETER Target + Only return files from a specific target. + + .PARAMETER InputObject + Allows results from piping in Get-DbaXESessionTarget. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: ExtendedEvent, XE, XEvent + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaXESessionTargetFile + + .EXAMPLE + PS C:\> Get-DbaXESessionTargetFile -SqlInstance sql2017 -Session 'Long Running Queries' + + Shows Target Files for the 'Long Running Queries' session on sql2017. + + .EXAMPLE + PS C:\> Get-DbaXESession -SqlInstance sql2016 -Session 'Long Running Queries' | Get-DbaXESessionTarget | Get-DbaXESessionTargetFile + + Returns the Target Files for the system_health session on sql2016. + + #> + [CmdletBinding(DefaultParameterSetName = "Default")] + param ( + [parameter(ValueFromPipeline, ParameterSetName = "instance", Mandatory)] + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [string[]]$Session, + [string[]]$Target, + [parameter(ValueFromPipeline, ParameterSetName = "piped", Mandatory)] + [Microsoft.SqlServer.Management.XEvent.Target[]]$InputObject, + [switch]$EnableException + ) + + process { + if (Test-FunctionInterrupt) { return } + + foreach ($instance in $SqlInstance) { + $InputObject += Get-DbaXESessionTarget -SqlInstance $instance -SqlCredential $SqlCredential -Session $Session -Target $Target | Where-Object File -ne $null + } + + foreach ($object in $InputObject) { + $computer = [dbainstance]$object.ComputerName + try { + if ($computer.IsLocal) { + $file = $object.TargetFile + Write-Message -Level Verbose -Message "Getting $file" + Get-ChildItem "$file*" -ErrorAction Stop + } else { + $file = $object.RemoteTargetFile + Write-Message -Level Verbose -Message "Getting $file" + Get-ChildItem -Recurse "$file*" -ErrorAction Stop + } + } catch { + Stop-Function -Message "Failure" -ErrorRecord $_ + } + } + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function Get-DbaXESessionTemplate { + <# + .SYNOPSIS + Parses Extended Event XML templates. Defaults to parsing templates in the dbatools template repository (\bin\xetemplates\). + + .DESCRIPTION + Parses Extended Event XML templates. Defaults to parsing templates in the dbatools template repository (\bin\xetemplates\). + + The default repository contains templates from: + Microsoft's Templates that come with SSMS + Jes Borland's "Everyday Extended Events" presentation and GitHub repository (https://github.com/grrlgeek/extended-events) + Christian Grafe (@ChrGraefe) XE Repo: https://github.com/chrgraefe/sqlscripts/blob/master/XE-Events/ + Erin Stellato's Blog: https://www.sqlskills.com/blogs/erin/ + + Some profile templates converted using: + sp_SQLskills_ConvertTraceToExtendedEvents.sql + Jonathan M. Kehayias, SQLskills.com + http://sqlskills.com/blogs/jonathan + + .PARAMETER Path + The path to the template directory. Defaults to the dbatools template repository (\bin\xetemplates\). + + .PARAMETER Pattern + Specify a pattern for filtering. Alternatively, you can use Out-GridView -Passthru to select objects and pipe them to Import-DbaXESessionTemplate + + .PARAMETER Template + Specifies one or more of the templates provided by dbatools. Press tab to cycle through the list of options. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: ExtendedEvent, XE, XEvent + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaXESessionTemplate + + .EXAMPLE + PS C:\> Get-DbaXESessionTemplate + + Returns information about all the templates in the local dbatools repository. + + .EXAMPLE + PS C:\> Get-DbaXESessionTemplate | Out-GridView -PassThru | Import-DbaXESessionTemplate -SqlInstance sql2017 | Start-DbaXESession + + Allows you to select a Session template, then import it to the specified instance and start the session. + + .EXAMPLE + PS C:\> Get-DbaXESessionTemplate -Path "$home\Documents\SQL Server Management Studio\Templates\XEventTemplates" + + Returns information about all the templates in your local XEventTemplates repository. + + .EXAMPLE + PS C:\> Get-DbaXESessionTemplate -Pattern duration + + Returns information about all the templates that match the word "duration" in the title, category or body. + + .EXAMPLE + PS C:\> Get-DbaXESessionTemplate | Select-Object * + + Returns more information about the template, including the full path/filename. + + #> + + [CmdletBinding()] + param ( + [string[]]$Path = "$script:PSModuleRoot\bin\xetemplates", + [string]$Pattern, + [string[]]$Template, + [switch]$EnableException + ) + begin { + $metadata = Import-Clixml "$script:PSModuleRoot\bin\xetemplates-metadata.xml" + # In case people really want a "like" search, which is slower + $Pattern = $Pattern.Replace("*", ".*").Replace("..*", ".*") + } + process { + foreach ($directory in $Path) { + $files = Get-ChildItem "$directory\*.xml" + + if ($Template) { + $files = $files | Where-Object BaseName -in $Template + } + + foreach ($file in $files) { + try { + $xml = [xml](Get-Content $file) + } catch { + Stop-Function -Message "Failure" -ErrorRecord $_ -Target $file -Continue + } + + foreach ($session in $xml.event_sessions) { + $meta = $metadata | Where-Object Name -eq $session.event_session.name + if ($Pattern) { + if ( + # There's probably a better way to do this + ($session.event_session.name -match $Pattern) -or + ($session.event_session.TemplateCategory.'#text' -match $Pattern) -or + ($session.event_session.TemplateSource -match $Pattern) -or + ($session.event_session.TemplateDescription.'#text' -match $Pattern) -or + ($session.event_session.TemplateName.'#text' -match $Pattern) -or + ($meta.Source -match $Pattern) + ) { + [pscustomobject]@{ + Name = $session.event_session.name + Category = $session.event_session.TemplateCategory.'#text' + Source = $meta.Source + Compatibility = ("$($meta.Compatibility)").ToString().Replace(",", "") + Description = $session.event_session.TemplateDescription.'#text' + TemplateName = $session.event_session.TemplateName.'#text' + Path = $file + File = $file.Name + } | Select-DefaultView -ExcludeProperty File, TemplateName, Path + } + } else { + [pscustomobject]@{ + Name = $session.event_session.name + Category = $session.event_session.TemplateCategory.'#text' + Source = $meta.Source + Compatibility = $meta.Compatibility.ToString().Replace(",", "") + Description = $session.event_session.TemplateDescription.'#text' + TemplateName = $session.event_session.TemplateName.'#text' + Path = $file + File = $file.Name + } | Select-DefaultView -ExcludeProperty File, TemplateName, Path + } + } + } + } + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function Get-DbaXESmartTarget { + <# + .SYNOPSIS + Gets an XESmartTarget PowerShell job created by Start-DbaXESmartTarget. + + .DESCRIPTION + Gets an XESmartTarget PowerShell job created by Start-DbaXESmartTarget. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: ExtendedEvent, XE, XEvent + Author: Chrissy LeMaire (@cl) | SmartTarget by Gianluca Sartori (@spaghettidba) + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaXESmartTarget + + .EXAMPLE + PS C:\> Get-DbaXESmartTarget + + Gets an XESmartTarget PowerShell Job created by Start-DbaXESmartTarget. + + #> + [CmdletBinding()] + param ( + [switch]$EnableException + ) + process { + try { + Get-Job | Where-Object Name -Match SmartTarget | Select-Object -Property ID, Name, State + } catch { + Stop-Function -Message "Failure" -ErrorRecord $_ + } + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function Get-DbaXEStore { + <# + .SYNOPSIS + Get a Extended Events store + + .DESCRIPTION + Get a Extended Events store + + .PARAMETER SqlInstance + The target SQL Server instance or instances. You must have sysadmin access and server version must be SQL Server version 2008 or higher. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: ExtendedEvent, XE, XEvent + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaXEStore + + .EXAMPLE + PS C:\> Get-DbaXEStore -SqlInstance ServerA\sql987 + + Returns an XEvent Store. + + #> + [CmdletBinding()] + param ( + [parameter(Mandatory, ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [switch]$EnableException + ) + + process { + foreach ($instance in $SqlInstance) { + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential -MinimumVersion 11 + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + $SqlConn = $server.ConnectionContext.SqlConnectionObject + $SqlStoreConnection = New-Object Microsoft.SqlServer.Management.Sdk.Sfc.SqlStoreConnection $SqlConn + $store = New-Object Microsoft.SqlServer.Management.XEvent.XEStore $SqlStoreConnection + + Add-Member -Force -InputObject $store -MemberType NoteProperty -Name ComputerName -Value $server.ComputerName + Add-Member -Force -InputObject $store -MemberType NoteProperty -Name InstanceName -Value $server.ServiceName + Add-Member -Force -InputObject $store -MemberType NoteProperty -Name SqlInstance -Value $server.DomainInstanceName + Select-DefaultView -InputObject $store -Property ComputerName, InstanceName, SqlInstance, ServerName, Sessions, Packages, RunningSessionCount + } + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function Grant-DbaAgPermission { + <# + .SYNOPSIS + Grants endpoint and availability group permissions to a login. + + .DESCRIPTION + Grants endpoint and availability group permissions to a login. If the account is a Windows login and does not exist, it will be automatically added. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Login + The login or logins to modify. + + .PARAMETER AvailabilityGroup + Only modify specific availability groups. + + .PARAMETER Type + Specify type: Endpoint or AvailabilityGroup. Endpoint will modify the DatabaseMirror endpoint type. + + .PARAMETER Permission + Grants one or more permissions: + Alter + Connect + Control + CreateSequence + CreateAnyDatabase + Delete + Execute + Impersonate + Insert + Receive + References + Select + Send + TakeOwnership + Update + ViewChangeTracking + ViewDefinition + + CreateAnyDatabase + + Connect is default. + + .PARAMETER InputObject + Enables piping from Get-DbaLogin. + + .PARAMETER WhatIf + Shows what would happen if the command were to run. No actions are actually performed. + + .PARAMETER Confirm + Prompts you for confirmation before executing any changing operations within the command. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: AvailabilityGroup, HA, AG + Author: Chrissy LeMaire (@cl), netnerds.net + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Grant-DbaAgPermission + + .EXAMPLE + PS C:\> Grant-DbaAgPermission -SqlInstance sql2017a -Type AvailabilityGroup -AvailabilityGroup SharePoint -Login ad\spservice -Permission CreateAnyDatabase + + Adds CreateAnyDatabase permissions to ad\spservice on the SharePoint availability group on sql2017a. Does not prompt for confirmation. + + .EXAMPLE + PS C:\> Grant-DbaAgPermission -SqlInstance sql2017a -Type AvailabilityGroup -AvailabilityGroup ag1, ag2 -Login ad\spservice -Permission CreateAnyDatabase -Confirm + + Adds CreateAnyDatabase permissions to ad\spservice on the ag1 and ag2 availability groups on sql2017a. Prompts for confirmation. + + .EXAMPLE + PS C:\> Get-DbaLogin -SqlInstance sql2017a | Out-GridView -Passthru | Grant-DbaAgPermission -Type EndPoint + + Grants the selected logins Connect permissions on the DatabaseMirroring endpoint for sql2017a + #> + [CmdletBinding(SupportsShouldProcess, ConfirmImpact = 'Low')] + param ( + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [string[]]$Login, + [string[]]$AvailabilityGroup, + [parameter(Mandatory)] + [ValidateSet('Endpoint', 'AvailabilityGroup')] + [string[]]$Type, + [ValidateSet('Alter', 'Connect', 'Control', 'CreateAnyDatabase', 'CreateSequence', 'Delete', 'Execute', 'Impersonate', 'Insert', 'Receive', 'References', 'Select', 'Send', 'TakeOwnership', 'Update', 'ViewChangeTracking', 'ViewDefinition')] + [string[]]$Permission = "Connect", + [parameter(ValueFromPipeline)] + [Microsoft.SqlServer.Management.Smo.Login[]]$InputObject, + [switch]$EnableException + ) + process { + if ($SqlInstance -and -not $Login -and -not $AvailabilityGroup) { + Stop-Function -Message "You must specify one or more logins when using the SqlInstance parameter." + return + } + + if ($Type -contains "AvailabilityGroup" -and -not $AvailabilityGroup) { + Stop-Function -Message "You must specify at least one availability group when using the AvailabilityGroup type." + return + } + + foreach ($instance in $SqlInstance) { + if ($perm -contains "CreateAnyDatabase") { + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $sqlcredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + foreach ($ag in $AvailabilityGroup) { + try { + $server.Query("ALTER AVAILABILITY GROUP $ag GRANT CREATE ANY DATABASE") + } catch { + Stop-Function -Message "Failure" -ErrorRecord $_ -Target $instance + return + } + } + } elseif ($Login) { + $InputObject += Get-DbaLogin -SqlInstance $instance -SqlCredential $SqlCredential -Login $Login + foreach ($account in $Login) { + if ($account -notin $InputObject.Name) { + try { + $InputObject += New-DbaLogin -SqlInstance $server -Login $account -EnableException + } catch { + Stop-Function -Message "Failure" -ErrorRecord $_ -Target $instance + return + } + } + } + } + } + + foreach ($account in $InputObject) { + $server = $account.Parent + if ($Type -contains "Endpoint") { + $server.Endpoints.Refresh() + $endpoint = $server.Endpoints | Where-Object EndpointType -eq DatabaseMirroring + + if (-not $endpoint) { + Stop-Function -Message "DatabaseMirroring endpoint does not exist on $server" -Target $server -Continue + } + + foreach ($perm in $Permission) { + if ($Pscmdlet.ShouldProcess($server.Name, "Granting $perm on $endpoint")) { + if ($perm -in 'CreateAnyDatabase') { + Stop-Function -Message "$perm not supported by endpoints" -Continue + } + try { + $bigperms = New-Object Microsoft.SqlServer.Management.Smo.ObjectPermissionSet([Microsoft.SqlServer.Management.Smo.ObjectPermission]::$perm) + $endpoint.Grant($bigperms, $account.Name) + [pscustomobject]@{ + ComputerName = $account.ComputerName + InstanceName = $account.InstanceName + SqlInstance = $account.SqlInstance + Name = $account.Name + Permission = $perm + Type = "Grant" + Status = "Success" + } + } catch { + Stop-Function -Message "Failure" -ErrorRecord $_ -Target $ag -Continue + } + } + } + } + + if ($Type -contains "AvailabilityGroup") { + $ags = Get-DbaAvailabilityGroup -SqlInstance $account.Parent -AvailabilityGroup $AvailabilityGroup + foreach ($ag in $ags) { + foreach ($perm in $Permission) { + if ($perm -notin 'Alter', 'Control', 'TakeOwnership', 'ViewDefinition') { + Stop-Function -Message "$perm not supported by availability groups" -Continue + } + if ($Pscmdlet.ShouldProcess($server.Name, "Granting $perm on $ags")) { + try { + $bigperms = New-Object Microsoft.SqlServer.Management.Smo.ObjectPermissionSet([Microsoft.SqlServer.Management.Smo.ObjectPermission]::$perm) + $ag.Grant($bigperms, $account.Name) + [pscustomobject]@{ + ComputerName = $account.ComputerName + InstanceName = $account.InstanceName + SqlInstance = $account.SqlInstance + Name = $account.Name + Permission = $perm + Type = "Grant" + Status = "Success" + } + } catch { + Stop-Function -Message "Failure" -ErrorRecord $_ -Target $ag -Continue + } + } + } + } + } + } + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function Import-DbaCmsRegServer { + <# + .SYNOPSIS + Imports registered servers and registered server groups to SQL Server Central Management Server (CMS) + + .DESCRIPTION + Imports registered servers and registered server groups to SQL Server Central Management Server (CMS) + + .PARAMETER SqlInstance + The target SQL Server instance or instances. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Group + Imports to specific group + + .PARAMETER Path + Optional path to exported reg server XML + + .PARAMETER InputObject + Enables piping from Get-DbaCmsRegServer, Get-DbaCmsRegServerGroup, CSVs and other objects. + + If importing from CSV or other object, a column named ServerName is required. Optional columns include Name, Description and Group. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: RegisteredServer, CMS + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Import-DbaCmsRegServer + + .EXAMPLE + PS C:\> Import-DbaCmsRegServer -SqlInstance sql2012 -Path C:\temp\corp-regservers.xml + + Imports C:\temp\corp-regservers.xml to the CMS on sql2012 + + .EXAMPLE + PS C:\> Import-DbaCmsRegServer -SqlInstance sql2008 -Group hr\Seattle -Path C:\temp\Seattle.xml + + Imports C:\temp\Seattle.xml to Seattle subgroup within the hr group on sql2008 + + .EXAMPLE + PS C:\> Get-DbaCmsRegServer -SqlInstance sql2008, sql2012 | Import-DbaCmsRegServer -SqlInstance sql2017 + + Imports all registered servers from sql2008 and sql2012 to sql2017 + + .EXAMPLE + PS C:\> Get-DbaCmsRegServerGroup -SqlInstance sql2008 -Group hr\Seattle | Import-DbaCmsRegServer -SqlInstance sql2017 -Group Seattle + + Imports all registered servers from the hr\Seattle group on sql2008 to the Seattle group on sql2017 + + #> + [CmdletBinding()] + param ( + [parameter(Mandatory)] + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [Alias("FullName")] + [string[]]$Path, + [parameter(ValueFromPipeline)] + [object[]]$InputObject, + [object]$Group, + [switch]$EnableException + ) + process { + foreach ($instance in $SqlInstance) { + # Prep to import from file + if ((Test-Bound -ParameterName Path)) { + $InputObject += Get-ChildItem -Path $Path + } + if ((Test-Bound -ParameterName Group) -and (Test-Bound -Not -ParameterName Path)) { + if ($Group -is [Microsoft.SqlServer.Management.RegisteredServers.ServerGroup]) { + $groupobject = $Group + } else { + $groupobject = Get-DbaCmsRegServerGroup -SqlInstance $instance -SqlCredential $SqlCredential -Group $Group + } + if (-not $groupobject) { + Stop-Function -Message "Group $Group cannot be found on $instance" -Target $instance -Continue + } + } + + foreach ($object in $InputObject) { + if ($object -is [Microsoft.SqlServer.Management.RegisteredServers.RegisteredServer]) { + + $groupexists = Get-DbaCmsRegServerGroup -SqlInstance $instance -SqlCredential $SqlCredential -Group $object.Parent.Name + if (-not $groupexists) { + $groupexists = Add-DbaCmsRegServerGroup -SqlInstance $instance -SqlCredential $SqlCredential -Name $object.Parent.Name + } + Add-DbaCmsRegServer -SqlInstance $instance -SqlCredential $SqlCredential -Name $object.Name -ServerName $object.ServerName -Description $object.Description -Group $groupexists + } elseif ($object -is [Microsoft.SqlServer.Management.RegisteredServers.ServerGroup]) { + foreach ($regserver in $object.RegisteredServers) { + $groupexists = Get-DbaCmsRegServerGroup -SqlInstance $instance -SqlCredential $SqlCredential -Group $regserver.Parent.Name + if (-not $groupexists) { + $groupexists = Add-DbaCmsRegServerGroup -SqlInstance $instance -SqlCredential $SqlCredential -Name $regserver.Parent.Name + } + Add-DbaCmsRegServer -SqlInstance $instance -SqlCredential $SqlCredential -Name $regserver.Name -ServerName $regserver.ServerName -Description $regserver.Description -Group $groupexists + } + } elseif ($object -is [System.IO.FileInfo]) { + if ((Test-Bound -ParameterName Group)) { + if ($Group -is [Microsoft.SqlServer.Management.RegisteredServers.ServerGroup]) { + $reggroups = $Group + } else { + $reggroups = Get-DbaCmsRegServerGroup -SqlInstance $instance -SqlCredential $SqlCredential -Group $Group + } + } else { + $reggroups = Get-DbaCmsRegServerGroup -SqlInstance $instance -SqlCredential $SqlCredential -Id 1 + } + + foreach ($file in $object) { + if (-not (Test-Path -Path $file)) { + Stop-Function -Message "$file cannot be found" -Target $file -Continue + } + + foreach ($reggroup in $reggroups) { + try { + Write-Message -Level Verbose -Message "Importing $file to $($reggroup.Name) on $instance" + $urnlist = $reggroup.RegisteredServers.Urn.Value + $reggroup.Import($file.FullName) + Get-DbaCmsRegServer -SqlInstance $instance -SqlCredential $SqlCredential | Where-Object { $_.Urn.Value -notin $urnlist } + } catch { + Stop-Function -Message "Failure attempting to import $file to $instance" -ErrorRecord $_ -Continue + } + } + } + } else { + if (-not $object.ServerName) { + Stop-Function -Message "Property 'ServerName' not found in InputObject. No servers added." -Continue + } + Add-DbaCmsRegServer -SqlInstance $instance -SqlCredential $SqlCredential -Name $object.Name -ServerName $object.ServerName -Description $object.Description -Group $groupobject + } + } + } + } + end { + Test-DbaDeprecation -DeprecatedOn "1.0.0" -Alias Import-DbaRegisteredServer + } +} +function Import-DbaCsv { + <# + .SYNOPSIS + Efficiently imports very large (and small) CSV files into SQL Server. + + .DESCRIPTION + Import-DbaCsv takes advantage of .NET's super fast SqlBulkCopy class to import CSV files into SQL Server. + + The entire import is performed within a transaction, so if a failure occurs or the script is aborted, no changes will persist. + + If the table or view specified does not exist and -AutoCreateTable, it will be automatically created using slow and inefficient but accommodating data types. + + This importer supports fields spanning multiple lines. The only restriction is that they must be quoted, otherwise it would not be possible to distinguish between malformed data and multi-line values. + + .PARAMETER Path + Specifies path to the CSV file(s) to be imported. Multiple files may be imported at once. + + .PARAMETER NoHeaderRow + By default, the first row is used to determine column names for the data being imported. + + Use this switch if the first row contains data and not column names. + + .PARAMETER Delimiter + Specifies the delimiter used in the imported file(s). If no delimiter is specified, comma is assumed. + + Valid delimiters are '`t`, '|', ';',' ' and ',' (tab, pipe, semicolon, space, and comma). + + .PARAMETER SingleColumn + Specifies that the file contains a single column of data. Otherwise, the delimiter check bombs. + + .PARAMETER SqlInstance + The SQL Server Instance to import data into. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Database + Specifies the name of the database the CSV will be imported into. Options for this this parameter are auto-populated from the server. + + .PARAMETER Schema + Specifies the schema in which the SQL table or view where CSV will be imported into resides. Default is dbo + + If a schema name is not specified, and a CSV name with multiple dots is specified (ie; something.data.csv) then this will be interpreted as a request to import into a table [data] in the schema [something]. + + If a schema does not currently exist, it will be created, after a prompt to confirm this. Authorization will be set to dbo by default + + .PARAMETER Table + Specifies the SQL table or view where CSV will be imported into. + + If a table name is not specified, the table name will be automatically determined from the filename. + + If the table specified does not exist and -AutoCreateTable, it will be automatically created using slow and inefficient but accommodating data types. + + If the automatically generated table datatypes do not work for you, please create the table prior to import. + + If you want to import specific columns from a CSV, create a view with corresponding columns. + + .PARAMETER Column + Import only specific columns. To remap column names, use the ColumnMap. + + .PARAMETER ColumnMap + By default, the bulk copy tries to automap columns. When it doesn't work as desired, this parameter will help. Check out the examples for more information. + + .PARAMETER AutoCreateTable + Creates a table if it does not already exist. The table will be created with sub-optimal data types such as nvarchar(max) + + .PARAMETER Truncate + If this switch is enabled, the destination table will be truncated prior to import. + + .PARAMETER NotifyAfter + Specifies the import row count interval for reporting progress. A notification will be shown after each group of this many rows has been imported. + + .PARAMETER BatchSize + Specifies the batch size for the import. Defaults to 50000. + + .PARAMETER TableLock + If this switch is enabled, the SqlBulkCopy option to acquire a table lock will be used. This is automatically used if -Turbo is enabled. + + Per Microsoft "Obtain a bulk update lock for the duration of the bulk copy operation. When not + specified, row locks are used." + + .PARAMETER CheckConstraints + If this switch is enabled, the SqlBulkCopy option to check constraints will be used. + + Per Microsoft "Check constraints while data is being inserted. By default, constraints are not checked." + + .PARAMETER FireTriggers + If this switch is enabled, the SqlBulkCopy option to allow insert triggers to be executed will be used. + + Per Microsoft "When specified, cause the server to fire the insert triggers for the rows being inserted into the database." + + .PARAMETER KeepIdentity + If this switch is enabled, the SqlBulkCopy option to keep identity values from the source will be used. + + Per Microsoft "Preserve source identity values. When not specified, identity values are assigned by the destination." + + .PARAMETER KeepNulls + If this switch is enabled, the SqlBulkCopy option to keep NULL values in the table will be used. + + Per Microsoft "Preserve null values in the destination table regardless of the settings for default values. When not specified, null values are replaced by default values where applicable." + + .PARAMETER NoProgress + The progress bar is pretty but can slow down imports. Use this parameter to quietly import. + + .PARAMETER Quote + Defines the default quote character wrapping every field. + + .PARAMETER Escape + Defines the default escape character letting insert quotation characters inside a quoted field. + + The escape character can be the same as the quote character. + + .PARAMETER Comment + Defines the default comment character indicating that a line is commented out. Default is #. + + .PARAMETER TrimmingOption + Determines which values should be trimmed. Default is "None". Options are All, None, UnquotedOnly and QuotedOnly. + + .PARAMETER BufferSize + Defines the default buffer size. The default BufferSize is 4096. + + .PARAMETER ParseErrorAction + By default, the parse error action throws an exception and ends the import. + + You can also choose AdvanceToNextLine which basically ignores parse errors. + + .PARAMETER Encoding + The encoding of the file. + + .PARAMETER NullValue + The value which denotes a DbNull-value. + + .PARAMETER Threshold + Defines the default value for Threshold indicating when the CsvReader should replace/remove consecutive null bytes. + + .PARAMETER MaxQuotedFieldLength + The axmimum length (in bytes) for any quoted field. + + .PARAMETER SkipEmptyLine + Skip empty lines. + + .PARAMETER SupportsMultiline + Indicates if the importer should support multiline fields. + + .PARAMETER UseColumnDefault + Use the column default values if the field is not in the record. + + .PARAMETER NoTransaction + Do not use a transaction when performing the import. + + .PARAMETER WhatIf + Shows what would happen if the command were to run. No actions are actually performed. + + .PARAMETER Confirm + Prompts you for confirmation before executing any changing operations within the command. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Migration, Import + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Import-DbaCsv + + .EXAMPLE + PS C:\> Import-DbaCsv -Path C:\temp\housing.csv -SqlInstance sql001 -Database markets + + Imports the entire comma-delimited housing.csv to the SQL "markets" database on a SQL Server named sql001, using the first row as column names. + + Since a table name was not specified, the table name is automatically determined from filename as "housing". + + .EXAMPLE + PS C:\> Import-DbaCsv -Path .\housing.csv -SqlInstance sql001 -Database markets -Table housing -Delimiter "`t" -NoHeaderRow + + Imports the entire comma-delimited housing.csv, including the first row which is not used for colum names, to the SQL markets database, into the housing table, on a SQL Server named sql001. + + .EXAMPLE + PS C:\> Import-DbaCsv -Path C:\temp\huge.txt -SqlInstance sqlcluster -Database locations -Table latitudes -Delimiter "|" + + Imports the entire pipe-delimited huge.txt to the locations database, into the latitudes table on a SQL Server named sqlcluster. + + .EXAMPLE + PS C:\> Import-DbaCsv -Path c:\temp\SingleColumn.csv -SqlInstance sql001 -Database markets -Table TempTable -SingleColumn + + Imports the single column CSV into TempTable + + .EXAMPLE + PS C:\> Get-ChildItem -Path \\FileServer\csvs | Import-DbaCsv -SqlInstance sql001, sql002 -Database tempdb -AutoCreateTable + + Imports every CSV in the \\FileServer\csvs path into both sql001 and sql002's tempdb database. Each CSV will be imported into an automatically determined table name. + + .EXAMPLE + PS C:\> Get-ChildItem -Path \\FileServer\csvs | Import-DbaCsv -SqlInstance sql001, sql002 -Database tempdb -AutoCreateTable -WhatIf + + Shows what would happen if the command were to be executed + + .EXAMPLE + PS C:\> Import-DbaCsv -Path c:\temp\dataset.csv -SqlInstance sql2016 -Database tempdb -Column Name, Address, Mobile + + Import only Name, Address and Mobile even if other columns exist. All other columns are ignored and therefore null or default values. + + .EXAMPLE + PS C:\> $columns = @{ + >> Text = 'FirstName' + >> Number = 'PhoneNumber' + >> } + PS C:\> Import-DbaCsv -Path c:\temp\supersmall.csv -SqlInstance sql2016 -Database tempdb -ColumnMap $columns + + The CSV column 'Text' is inserted into SQL column 'FirstName' and CSV column Number is inserted into the SQL Column 'PhoneNumber'. All other columns are ignored and therefore null or default values. + #> + [CmdletBinding(SupportsShouldProcess, ConfirmImpact = 'Low')] + [Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSUseDeclaredVarsMoreThanAssignments", "line", Justification = "Variable line is used, False Positive on line 330")] + param ( + [parameter(ValueFromPipeline)] + [ValidateNotNullOrEmpty()] + [Alias("Csv", "FullPath")] + [object[]]$Path, + [Parameter(Mandatory)] + [DbaInstanceParameter[]]$SqlInstance, + [pscredential]$SqlCredential, + [Parameter(Mandatory)] + [string]$Database, + [string]$Table, + [string]$Schema = "dbo", + [switch]$Truncate, + [char]$Delimiter = ",", + [switch]$SingleColumn, + [int]$BatchSize = 50000, + [int]$NotifyAfter = 50000, + [switch]$TableLock, + [switch]$CheckConstraints, + [switch]$FireTriggers, + [switch]$KeepIdentity, + [switch]$KeepNulls, + [string[]]$Column, + [hashtable[]]$ColumnMap, + [switch]$AutoCreateTable, + [switch]$NoProgress, + [switch]$NoHeaderRow, + [char]$Quote = '"', + [char]$Escape = '"', + [char]$Comment = '#', + [ValidateSet('All', 'None', 'UnquotedOnly', 'QuotedOnly')] + [string]$TrimmingOption = "None", + [int]$BufferSize = 4096, + [ValidateSet('AdvanceToNextLine', 'ThrowException')] + [string]$ParseErrorAction = 'ThrowException', + [System.Text.Encoding]$Encoding, + [string]$NullValue, + [int]$Threshold = 60, + [int]$MaxQuotedFieldLength, + [switch]$SkipEmptyLine, + [switch]$SupportsMultiline, + [switch]$UseColumnDefault, + [switch]$NoTransaction, + [switch]$EnableException + ) + begin { + $FirstRowHeader = $NoHeaderRow -eq $false + $scriptelapsed = [System.Diagnostics.Stopwatch]::StartNew() + + try { + # SilentContinue isn't enough + Add-Type -Path "$script:PSModuleRoot\bin\csv\LumenWorks.Framework.IO.dll" -ErrorAction Stop + } catch { + $null = 1 + } + + function New-SqlTable { + <# + .SYNOPSIS + Creates new Table using existing SqlCommand. + + SQL datatypes based on best guess of column data within the -ColumnText parameter. + Columns parameter determine column names. + + .EXAMPLE + New-SqlTable -Path $Path -Delimiter $Delimiter -Columns $columns -ColumnText $columntext -SqlConn $sqlconn -Transaction $transaction + + .OUTPUTS + Creates new table + #> + [Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSUseShouldProcessForStateChangingFunctions", "")] + param ( + [Parameter(Mandatory)] + [string]$Path, + [Parameter(Mandatory)] + [string]$Delimiter, + [Parameter(Mandatory)] + [bool]$FirstRowHeader, + [System.Data.SqlClient.SqlConnection]$sqlconn, + [System.Data.SqlClient.SqlTransaction]$transaction + ) + $reader = New-Object LumenWorks.Framework.IO.Csv.CsvReader( + (New-Object System.IO.StreamReader($Path)), + $FirstRowHeader, + $Delimiter, + $Quote, + $Escape, + $Comment, + [LumenWorks.Framework.IO.Csv.ValueTrimmingOptions]::$TrimmingOption, + $BufferSize, + $NullValue + ) + $columns = $reader.GetFieldHeaders() + $reader.Close() + $reader.Dispose() + + # Get SQL datatypes by best guess on first data row + $sqldatatypes = @(); $index = 0 + + foreach ($column in $Columns) { + $sqldatatypes += "[$column] varchar(MAX)" + } + + $sql = "BEGIN CREATE TABLE [$schema].[$table] ($($sqldatatypes -join ' NULL,')) END" + $sqlcmd = New-Object System.Data.SqlClient.SqlCommand($sql, $sqlconn, $transaction) + + try { + $null = $sqlcmd.ExecuteNonQuery() + } catch { + $errormessage = $_.Exception.Message.ToString() + Stop-Function -Continue -Message "Failed to execute $sql. `nDid you specify the proper delimiter? `n$errormessage" + } + + Write-Message -Level Verbose -Message "Successfully created table $schema.$table with the following column definitions:`n $($sqldatatypes -join "`n ")" + # Write-Message -Level Warning -Message "All columns are created using a best guess, and use their maximum datatype." + Write-Message -Level Verbose -Message "This is inefficient but allows the script to import without issues." + Write-Message -Level Verbose -Message "Consider creating the table first using best practices if the data will be used in production." + } + + Write-Message -Level Verbose -Message "Started at $(Get-Date)" + + # Getting the total rows copied is a challenge. Use SqlBulkCopyExtension. + # http://stackoverflow.com/questions/1188384/sqlbulkcopy-row-count-when-complete + + $sourcecode = 'namespace System.Data.SqlClient + { + using Reflection; + + public static class SqlBulkCopyExtension + { + const String _rowsCopiedFieldName = "_rowsCopied"; + static FieldInfo _rowsCopiedField = null; + + public static int RowsCopiedCount(this SqlBulkCopy bulkCopy) + { + if (_rowsCopiedField == null) _rowsCopiedField = typeof(SqlBulkCopy).GetField(_rowsCopiedFieldName, BindingFlags.NonPublic | BindingFlags.GetField | BindingFlags.Instance); + return (int)_rowsCopiedField.GetValue(bulkCopy); + } + } + } + ' + if (-not $script:core) { + try { + Add-Type -ReferencedAssemblies System.Data.dll -TypeDefinition $sourcecode -ErrorAction Stop + } catch { + $null = 1 + } + } + } + process { + foreach ($filename in $Path) { + + if ($filename.FullName) { + $filename = $filename.FullName + } + + if (-not (Test-Path -Path $filename)) { + Stop-Function -Continue -Message "$filename cannot be found" + } + + $file = (Resolve-Path -Path $filename).ProviderPath + + # Does the second line contain the specified delimiter? + try { + $firstline = Get-Content -Path $file -TotalCount 2 -ErrorAction Stop + } catch { + Stop-Function -Continue -Message "Failure reading $file" -ErrorRecord $_ + } + if (-not $SingleColumn) { + if ($firstline -notmatch $Delimiter) { + Stop-Function -Message "Delimiter ($Delimiter) not found in first few rows of $file. If this is a single column import, please specify -SingleColumn" + return + } + } + + # Automatically generate Table name if not specified, then prompt user to confirm + if (-not (Test-Bound -ParameterName Table)) { + $table = [IO.Path]::GetFileNameWithoutExtension($file) + Write-Message -Level Verbose -Message "Table name not specified, using $table" + } + + foreach ($instance in $SqlInstance) { + $elapsed = [System.Diagnostics.Stopwatch]::StartNew() + # Open Connection to SQL Server + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $sqlcredential -StatementTimeout 0 -MinimumVersion 9 + $sqlconn = $server.ConnectionContext.SqlConnectionObject + $sqlconn.Open() + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + if (-not $NoTransaction) { + if ($PSCmdlet.ShouldProcess($instance, "Starting transaction in $Database")) { + # Everything will be contained within 1 transaction, even creating a new table if required + # and truncating the table, if specified. + $transaction = $sqlconn.BeginTransaction() + } + } + + # Ensure database exists + $sql = "select count(*) from master.dbo.sysdatabases where name = '$Database'" + $sqlcmd = New-Object System.Data.SqlClient.SqlCommand($sql, $sqlconn, $transaction) + if (($sqlcmd.ExecuteScalar()) -eq 0) { + Stop-Function -Continue -Message "Database does not exist on $instance" + } + Write-Message -Level Verbose -Message "Database exists" + $sqlconn.ChangeDatabase($Database) + + # Ensure Schema exists + $sql = "select count(*) from $Database.sys.schemas where name='$schema'" + $sqlcmd = New-Object System.Data.SqlClient.SqlCommand($sql, $sqlconn, $transaction) + + # If Schema doesn't exist create it + # Defaulting to dbo. + if (($sqlcmd.ExecuteScalar()) -eq 0) { + if (-not $AutoCreateTable) { + Stop-Function -Continue -Message "Schema $Schema does not exist and AutoCreateTable was not specified" + } + $sql = "CREATE SCHEMA [$schema] AUTHORIZATION dbo" + if ($PSCmdlet.ShouldProcess($instance, "Creating schema $schema")) { + $sqlcmd = New-Object System.Data.SqlClient.SqlCommand($sql, $sqlconn, $transaction) + try { + $null = $sqlcmd.ExecuteNonQuery() + } catch { + Stop-Function -Continue -Message "Could not create $schema" -ErrorRecord $_ + } + } + } + + # Ensure table or view exists + $sql = "select count(*) from $Database.sys.tables where name = '$table' and schema_id=schema_id('$schema')" + $sqlcmd = New-Object System.Data.SqlClient.SqlCommand($sql, $sqlconn, $transaction) + + $sql2 = "select count(*) from $Database.sys.views where name = '$table' and schema_id=schema_id('$schema')" + $sqlcmd2 = New-Object System.Data.SqlClient.SqlCommand($sql2, $sqlconn, $transaction) + + # Create the table if required. Remember, this will occur within a transaction, so if the script fails, the + # new table will no longer exist. + if (($sqlcmd.ExecuteScalar()) -eq 0 -and ($sqlcmd2.ExecuteScalar()) -eq 0) { + if (-not $AutoCreateTable) { + Stop-Function -Continue -Message "Table or view $table does not exist and AutoCreateTable was not specified" + } + Write-Message -Level Verbose -Message "Table does not exist" + if ($PSCmdlet.ShouldProcess($instance, "Creating table $table")) { + try { + New-SqlTable -Path $file -Delimiter $Delimiter -FirstRowHeader $FirstRowHeader -SqlConn $sqlconn -Transaction $transaction + } catch { + Stop-Function -Continue -Message "Failure" -ErrorRecord $_ + } + } + } else { + Write-Message -Level Verbose -Message "Table exists" + } + + # Truncate if specified. Remember, this will occur within a transaction, so if the script fails, the + # truncate will not be committed. + if ($Truncate) { + $sql = "TRUNCATE TABLE [$schema].[$table]" + if ($PSCmdlet.ShouldProcess($instance, "Performing TRUNCATE TABLE [$schema].[$table] on $Database")) { + $sqlcmd = New-Object System.Data.SqlClient.SqlCommand($sql, $sqlconn, $transaction) + try { + $null = $sqlcmd.ExecuteNonQuery() + } catch { + Stop-Function -Continue -Message "Could not truncate $schema.$table" -ErrorRecord $_ + } + } + } + + # Setup bulk copy + Write-Message -Level Verbose -Message "Starting bulk copy for $(Split-Path $file -Leaf)" + + # Setup bulk copy options + [int]$bulkCopyOptions = ([System.Data.SqlClient.SqlBulkCopyOptions]::Default) + $options = "TableLock", "CheckConstraints", "FireTriggers", "KeepIdentity", "KeepNulls" + foreach ($option in $options) { + $optionValue = Get-Variable $option -ValueOnly -ErrorAction SilentlyContinue + if ($optionValue -eq $true) { + $bulkCopyOptions = $bulkCopyOptions -bor (Invoke-Expression "[System.Data.SqlClient.SqlBulkCopyOptions]::$option") + } + } + + if ($PSCmdlet.ShouldProcess($instance, "Performing import from $file")) { + try { + # Create SqlBulkCopy using default options, or options specified in command line. + if ($bulkCopyOptions) { + $bulkcopy = New-Object Data.SqlClient.SqlBulkCopy($sqlconn, $bulkCopyOptions, $transaction) + } else { + $bulkcopy = New-Object Data.SqlClient.SqlBulkCopy($sqlconn, ([System.Data.SqlClient.SqlBulkCopyOptions]::Default), $transaction) + } + + $bulkcopy.DestinationTableName = "[$schema].[$table]" + $bulkcopy.BulkCopyTimeout = 0 + $bulkCopy.BatchSize = $BatchSize + $bulkCopy.NotifyAfter = $NotifyAfter + $bulkCopy.EnableStreaming = $true + + if ($ColumnMap) { + foreach ($columnname in $ColumnMap) { + foreach ($key in $columnname.Keys) { + $null = $bulkcopy.ColumnMappings.Add($key, $columnname[$key]) + } + } + } + + if ($Column) { + foreach ($columnname in $Column) { + $null = $bulkcopy.ColumnMappings.Add($columnname, $columnname) + } + } + } catch { + Stop-Function -Continue -Message "Failure" -ErrorRecord $_ + } + + # Write to server :D + try { + $reader = New-Object LumenWorks.Framework.IO.Csv.CsvReader( + (New-Object System.IO.StreamReader($file)), + $FirstRowHeader, + $Delimiter, + $Quote, + $Escape, + $Comment, + [LumenWorks.Framework.IO.Csv.ValueTrimmingOptions]::$TrimmingOption, + $BufferSize, + $NullValue + ) + + if (Test-Bound -ParameterName Encoding) { + $reader.Encoding = $Encoding + } + if (Test-Bound -ParameterName Threshold) { + $reader.Threshold = $Threshold + } + if (Test-Bound -ParameterName MaxQuotedFieldLength) { + $reader.MaxQuotedFieldLength = $MaxQuotedFieldLength + } + if (Test-Bound -ParameterName SkipEmptyLine) { + $reader.SkipEmptyLines = $SkipEmptyLine + } + if (Test-Bound -ParameterName SupportsMultiline) { + $reader.SupportsMultiline = $SupportsMultiline + } + if (Test-Bound -ParameterName UseColumnDefault) { + $reader.UseColumnDefaults = $UseColumnDefault + } + if (Test-Bound -ParameterName ParseErrorAction) { + $reader.DefaultParseErrorAction = $ParseErrorAction + } + + # Add rowcount output + $bulkCopy.Add_SqlRowsCopied( { + $script:totalrows = $args[1].RowsCopied + if (-not $NoProgress) { + $timetaken = [math]::Round($elapsed.Elapsed.TotalSeconds, 2) + Write-ProgressHelper -StepNumber 1 -TotalSteps 2 -Activity "Importing from $file" -Message ([System.String]::Format("Progress: {0} rows in {2} seconds", $script:totalrows, $percent, $timetaken)) -ExcludePercent + } + }) + + $bulkCopy.WriteToServer($reader) + + if ($resultcount -is [int]) { + Write-Progress -id 1 -activity "Inserting $resultcount rows" -status "Complete" -Completed + } + + $reader.Close() + $reader.Dispose() + $completed = $true + } catch { + $completed = $false + + if ($resultcount -is [int]) { + Write-Progress -id 1 -activity "Inserting $resultcount rows" -status "Failed" -Completed + } + Stop-Function -Continue -Message "Failure" -ErrorRecord $_ + } + } + if ($PSCmdlet.ShouldProcess($instance, "Finalizing import")) { + if ($completed) { + # "Note: This count does not take into consideration the number of rows actually inserted when Ignore Duplicates is set to ON." + if (-not $NoTransaction) { + $null = $transaction.Commit() + } + if ($script:core) { + $rowscopied = "Unsupported in Core" + $rps = $null + } else { + $rowscopied = [System.Data.SqlClient.SqlBulkCopyExtension]::RowsCopiedCount($bulkcopy) + $rps = [int]($rowscopied / $elapsed.Elapsed.TotalSeconds) + } + + Write-Message -Level Verbose -Message "$rowscopied total rows copied" + + [pscustomobject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + Database = $Database + Table = $table + Schema = $schema + RowsCopied = $rowscopied + Elapsed = [prettytimespan]$elapsed.Elapsed + RowsPerSecond = $rps + Path = $file + } + } else { + Stop-Function -Message "Transaction rolled back. Was the proper delimiter specified? Is the first row the column name?" -ErrorRecord $_ + return + } + } + + # Close everything just in case & ignore errors + try { + $null = $sqlconn.close(); $null = $sqlconn.Dispose(); + $null = $bulkCopy.close(); $bulkcopy.dispose(); + $null = $reader.close(); $null = $reader.dispose() + } catch { + #here to avoid an empty catch + $null = 1 + } + } + } + } + end { + # Close everything just in case & ignore errors + try { + $null = $sqlconn.close(); $null = $sqlconn.Dispose(); + $null = $bulkCopy.close(); $bulkcopy.dispose(); + $null = $reader.close(); $null = $reader.dispose() + } catch { + #here to avoid an empty catch + $null = 1 + } + + # Script is finished. Show elapsed time. + $totaltime = [math]::Round($scriptelapsed.Elapsed.TotalSeconds, 2) + Write-Message -Level Verbose -Message "Total Elapsed Time for everything: $totaltime seconds" + + Test-DbaDeprecation -DeprecatedOn "1.0.0" -Alias Import-DbaCsvtoSql + Test-DbaDeprecation -DeprecatedOn "1.0.0" -EnableException:$false -Alias Import-CsvToSql + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function Import-DbaPfDataCollectorSetTemplate { + <# + .SYNOPSIS + Imports a new Performance Monitor Data Collector Set Template either from the dbatools repository or a file you specify. + + .DESCRIPTION + Imports a new Performance Monitor Data Collector Set Template either from the dbatools repository or a file you specify. + When importing data collector sets from the local instance, Run As Admin is required. + + Note: The included counters will be added for all SQL instances on the machine by default. + For specific instances in addition to the default, use -Instance. + + See https://msdn.microsoft.com/en-us/library/windows/desktop/aa371952 for more information + + .PARAMETER ComputerName + The target computer. Defaults to localhost. + + .PARAMETER Credential + Allows you to login to servers using alternative credentials. To use: + + $scred = Get-Credential, then pass $scred object to the -Credential parameter. + + .PARAMETER Path + The path to the xml file or files. + + .PARAMETER Template + From one or more of the templates from the dbatools repository. Press Tab to cycle through the available options. + + .PARAMETER RootPath + Sets the base path where the subdirectories are created. + + .PARAMETER DisplayName + Sets the display name of the data collector set. + + .PARAMETER SchedulesEnabled + If this switch is enabled, sets a value that indicates whether the schedules are enabled. + + .PARAMETER Segment + Sets a value that indicates whether PLA creates new logs if the maximum size or segment duration is reached before the data collector set is stopped. + + .PARAMETER SegmentMaxDuration + Sets the duration that the data collector set can run before it begins writing to new log files. + + .PARAMETER SegmentMaxSize + Sets the maximum size of any log file in the data collector set. + + .PARAMETER Subdirectory + Sets a base subdirectory of the root path where the next instance of the data collector set will write its logs. + + .PARAMETER SubdirectoryFormat + Sets flags that describe how to decorate the subdirectory name. PLA appends the decoration to the folder name. For example, if you specify plaMonthDayHour, PLA appends the current month, day, and hour values to the folder name. If the folder name is MyFile, the result could be MyFile110816. + + .PARAMETER SubdirectoryFormatPattern + Sets a format pattern to use when decorating the folder name. Default is 'yyyyMMdd\-NNNNNN'. + + .PARAMETER Task + Sets the name of a Task Scheduler job to start each time the data collector set stops, including between segments. + + .PARAMETER TaskRunAsSelf + If this switch is enabled, sets a value that determines whether the task runs as the data collector set user or as the user specified in the task. + + .PARAMETER TaskArguments + Sets the command-line arguments to pass to the Task Scheduler job specified in the IDataCollectorSet::Task property. + See https://msdn.microsoft.com/en-us/library/windows/desktop/aa371992 for more information. + + .PARAMETER TaskUserTextArguments + Sets the command-line arguments that are substituted for the {usertext} substitution variable in the IDataCollectorSet::TaskArguments property. + See https://msdn.microsoft.com/en-us/library/windows/desktop/aa371993 for more information. + + .PARAMETER StopOnCompletion + If this switch is enabled, sets a value that determines whether the data collector set stops when all the data collectors in the set are in a completed state. + + .PARAMETER Instance + By default, the template will be applied to all instances. If you want to set specific ones in addition to the default, supply just the instance name. + + .PARAMETER WhatIf + If this switch is enabled, no actions are performed but informational messages will be displayed that explain what would happen if the command were to run. + + .PARAMETER Confirm + If this switch is enabled, you will be prompted for confirmation before executing any operations that change state. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Performance, DataCollector, PerfCounter + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Import-DbaPfDataCollectorSetTemplate + + .EXAMPLE + PS C:\> Import-DbaPfDataCollectorSetTemplate -ComputerName sql2017 -Template 'Long Running Query' + + Creates a new data collector set named 'Long Running Query' from the dbatools repository on the SQL Server sql2017. + + .EXAMPLE + PS C:\> Import-DbaPfDataCollectorSetTemplate -ComputerName sql2017 -Template 'Long Running Query' -DisplayName 'New Long running query' -Confirm + + Creates a new data collector set named "New Long Running Query" using the 'Long Running Query' template. Forces a confirmation if the template exists. + + .EXAMPLE + PS C:\> Get-DbaPfDataCollectorSet -ComputerName sql2017 -Session db_ola_health | Remove-DbaPfDataCollectorSet + Import-DbaPfDataCollectorSetTemplate -ComputerName sql2017 -Template db_ola_health | Start-DbaPfDataCollectorSet + + Imports a session if it exists, then recreates it using a template. + + .EXAMPLE + PS C:\> Get-DbaPfDataCollectorSetTemplate | Out-GridView -PassThru | Import-DbaPfDataCollectorSetTemplate -ComputerName sql2017 + + Allows you to select a Session template then import to an instance named sql2017. + + .EXAMPLE + PS C:\> Import-DbaPfDataCollectorSetTemplate -ComputerName sql2017 -Template 'Long Running Query' -Instance SHAREPOINT + + Creates a new data collector set named 'Long Running Query' from the dbatools repository on the SQL Server sql2017 for both the default and the SHAREPOINT instance. + + If you'd like to remove counters for the default instance, use Remove-DbaPfDataCollectorCounter. + + #> + [CmdletBinding(SupportsShouldProcess, ConfirmImpact = "Low")] + param ( + [parameter(ValueFromPipeline)] + [DbaInstanceParameter[]]$ComputerName = $env:COMPUTERNAME, + [PSCredential]$Credential, + [string]$DisplayName, + [switch]$SchedulesEnabled, + [string]$RootPath, + [switch]$Segment, + [int]$SegmentMaxDuration, + [int]$SegmentMaxSize, + [string]$Subdirectory, + [int]$SubdirectoryFormat = 3, + [string]$SubdirectoryFormatPattern = 'yyyyMMdd\-NNNNNN', + [string]$Task, + [switch]$TaskRunAsSelf, + [string]$TaskArguments, + [string]$TaskUserTextArguments, + [switch]$StopOnCompletion, + [parameter(ValueFromPipelineByPropertyName)] + [Alias("FullName")] + [string[]]$Path, + [string[]]$Template, + [string[]]$Instance, + [switch]$EnableException + ) + begin { + #Variable marked as unused by PSScriptAnalyzer + #$metadata = Import-Clixml "$script:PSModuleRoot\bin\perfmontemplates\collectorsets.xml" + + $setscript = { + $setname = $args[0]; $templatexml = $args[1] + $collectorset = New-Object -ComObject Pla.DataCollectorSet + $collectorset.SetXml($templatexml) + $null = $collectorset.Commit($setname, $null, 0x0003) #add or modify. + $null = $collectorset.Query($setname, $Null) + } + + $instancescript = { + $services = Get-Service -DisplayName *sql* | Select-Object -ExpandProperty DisplayName + [regex]::matches($services, '(?<=\().+?(?=\))').Value | Where-Object { $PSItem -ne 'MSSQLSERVER' } | Select-Object -Unique + } + } + process { + + + if ((Test-Bound -ParameterName Path -Not) -and (Test-Bound -ParameterName Template -Not)) { + Stop-Function -Message "You must specify Path or Template" + } + + if (($Path.Count -gt 1 -or $Template.Count -gt 1) -and (Test-Bound -ParameterName Template)) { + Stop-Function -Message "Name cannot be specified with multiple files or templates because the Session will already exist" + } + + foreach ($computer in $ComputerName) { + $null = Test-ElevationRequirement -ComputerName $computer -Continue + + foreach ($file in $template) { + $templatepath = "$script:PSModuleRoot\bin\perfmontemplates\collectorsets\$file.xml" + if ((Test-Path $templatepath)) { + $Path += $templatepath + } else { + Stop-Function -Message "Invalid template ($templatepath does not exist)" -Continue + } + } + + foreach ($file in $Path) { + + if ((Test-Bound -ParameterName DisplayName -Not)) { + Set-Variable -Name DisplayName -Value (Get-ChildItem -Path $file).BaseName + } + + $Name = $DisplayName + + Write-Message -Level Verbose -Message "Processing $file for $computer" + + if ((Test-Bound -ParameterName RootPath -Not)) { + Set-Variable -Name RootName -Value "%systemdrive%\PerfLogs\Admin\$Name" + } + + # Perform replace + $temp = ([System.IO.Path]::GetTempPath()).TrimEnd("").TrimEnd("\") + $tempfile = "$temp\import-dbatools-perftemplate.xml" + + try { + # Get content + $contents = Get-Content $file -ErrorAction Stop + + # Replace content + $replacements = 'RootPath', 'DisplayName', 'SchedulesEnabled', 'Segment', 'SegmentMaxDuration', 'SegmentMaxSize', 'SubdirectoryFormat', 'SubdirectoryFormatPattern', 'Task', 'TaskRunAsSelf', 'TaskArguments', 'TaskUserTextArguments', 'StopOnCompletion', 'DisplayNameUnresolved' + + foreach ($replacement in $replacements) { + $phrase = "<$replacement>" + $value = (Get-Variable -Name $replacement -ErrorAction SilentlyContinue).Value + if ($value -eq $false) { + $value = "0" + } + if ($value -eq $true) { + $value = "1" + } + $replacephrase = "<$replacement>$value" + $contents = $contents.Replace($phrase, $replacephrase) + } + + # Set content + $null = Set-Content -Path $tempfile -Value $contents -Encoding Unicode + $xml = [xml](Get-Content $tempfile -ErrorAction Stop) + $plainxml = Get-Content $tempfile -ErrorAction Stop -Raw + $file = $tempfile + } catch { + Stop-Function -Message "Failure" -ErrorRecord $_ -Target $file -Continue + } + if (-not $xml.DataCollectorSet) { + Stop-Function -Message "$file is not a valid Performance Monitor template document" -Continue + } + + try { + Write-Message -Level Verbose -Message "Importing $file as $name " + + if ($instance) { + $instances = $instance + } else { + $instances = Invoke-Command2 -ComputerName $computer -Credential $Credential -ScriptBlock $instancescript -ErrorAction Stop -Raw + } + + $scriptblock = { + try { + $results = Invoke-Command2 -ComputerName $computer -Credential $Credential -ScriptBlock $setscript -ArgumentList $Name, $plainxml -ErrorAction Stop + Write-Message -Level Verbose -Message " $results" + } catch { + Stop-Function -Message "Failure starting $setname on $computer" -ErrorRecord $_ -Target $computer -Continue + } + } + + if ((Get-DbaPfDataCollectorSet -ComputerName $computer -CollectorSet $Name)) { + if ($Pscmdlet.ShouldProcess($computer, "CollectorSet $Name already exists. Modify?")) { + Invoke-Command -Scriptblock $scriptblock + $output = Get-DbaPfDataCollectorSet -ComputerName $computer -CollectorSet $Name + } + } else { + if ($Pscmdlet.ShouldProcess($computer, "Importing collector set $Name")) { + Invoke-Command -Scriptblock $scriptblock + $output = Get-DbaPfDataCollectorSet -ComputerName $computer -CollectorSet $Name + } + } + + $newcollection = @() + foreach ($instance in $instances) { + $datacollector = Get-DbaPfDataCollectorSet -ComputerName $computer -CollectorSet $Name | Get-DbaPfDataCollector + $sqlcounters = $datacollector | Get-DbaPfDataCollectorCounter | Where-Object { $_.Name -match 'sql.*\:' -and $_.Name -notmatch 'sqlclient' } | Select-Object -ExpandProperty Name + + foreach ($counter in $sqlcounters) { + $split = $counter.Split(":") + $firstpart = switch ($split[0]) { + 'SQLServer' { 'MSSQL' } + '\SQLServer' { '\MSSQL' } + default { $split[0] } + } + $secondpart = $split[-1] + $finalcounter = "$firstpart`$$instance`:$secondpart" + $newcollection += $finalcounter + } + } + + if ($newcollection.Count) { + if ($Pscmdlet.ShouldProcess($computer, "Adding $($newcollection.Count) additional counters")) { + $null = Add-DbaPfDataCollectorCounter -InputObject $datacollector -Counter $newcollection + } + } + + Remove-Item $tempfile -ErrorAction SilentlyContinue + $output + } catch { + Stop-Function -Message "Failure" -ErrorRecord $_ -Target $store -Continue + } + } + } + } +} +function Import-DbaSpConfigure { + <# + .SYNOPSIS + Updates sp_configure settings on destination server. + + .DESCRIPTION + Updates sp_configure settings on destination server. + + .PARAMETER Source + Source SQL Server. You must have sysadmin access and server version must be SQL Server version 2000 or higher. + + .PARAMETER Destination + Destination SQL Server. You must have sysadmin access and the server must be SQL Server 2000 or higher. + + .PARAMETER SourceSqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER DestinationSqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER SqlInstance + Specifies a SQL Server instance to set up sp_configure values on using a SQL file. + + .PARAMETER SqlCredential + Use this SQL credential if you are setting up sp_configure values from a SQL file. + + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Path + Specifies the path to a SQL script file holding sp_configure queries for each of the settings to be changed. Export-DbaSPConfigure creates a suitable file as its output. + + .PARAMETER Force + If this switch is enabled, no version check between Source and Destination is performed. By default, the major and minor versions of Source and Destination must match when copying sp_configure settings. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .PARAMETER WhatIf + If this switch is enabled, no actions are performed but informational messages will be displayed that explain what would happen if the command were to run. + + .PARAMETER Confirm + If this switch is enabled, you will be prompted for confirmation before executing any operations that change state. + + .NOTES + Tags: SpConfig, Configure, Configuration + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Import-DbaSpConfigure + + .INPUTS + None You cannot pipe objects to Import-DbaSpConfigure + + .OUTPUTS + $true if success + $false if failure + + .EXAMPLE + PS C:\> Import-DbaSpConfigure -Source sqlserver -Destination sqlcluster + + Imports the sp_configure settings from the source server sqlserver and sets them on the sqlcluster server using Windows Authentication + + .EXAMPLE + PS C:\> Import-DbaSpConfigure -Source sqlserver -Destination sqlcluster -Force + + Imports the sp_configure settings from the source server sqlserver and sets them on the sqlcluster server using Windows Authentication. Will not do a version check between Source and Destination + + .EXAMPLE + PS C:\> Import-DbaSpConfigure -Source sqlserver -Destination sqlcluster -SourceSqlCredential $SourceSqlCredential -DestinationSqlCredential $DestinationSqlCredential + + Imports the sp_configure settings from the source server sqlserver and sets them on the sqlcluster server using the SQL credentials stored in the variables $SourceSqlCredential and $DestinationSqlCredential + + .EXAMPLE + PS C:\> Import-DbaSpConfigure -SqlInstance sqlserver -Path .\spconfig.sql -SqlCredential $SqlCredential + + Imports the sp_configure settings from the file .\spconfig.sql and sets them on the sqlserver server using the SQL credential stored in the variable $SqlCredential + + #> + [CmdletBinding(DefaultParameterSetName = "Default", SupportsShouldProcess)] + param ( + [Parameter(ParameterSetName = "ServerCopy")] + [DbaInstanceParameter]$Source, + [Parameter(ParameterSetName = "ServerCopy")] + [DbaInstanceParameter]$Destination, + [Parameter(ParameterSetName = "ServerCopy")] + [PSCredential]$SourceSqlCredential, + [Parameter(ParameterSetName = "ServerCopy")] + [PSCredential]$DestinationSqlCredential, + [Parameter(ParameterSetName = "FromFile")] + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter]$SqlInstance, + [Parameter(ParameterSetName = "FromFile")] + [string]$Path, + [Parameter(ParameterSetName = "FromFile")] + [PSCredential]$SqlCredential, + [switch]$Force, + [Alias('Silent')] + [switch]$EnableException + ) + begin { + + if ($Path.length -eq 0) { + try { + $sourceserver = Connect-SqlInstance -SqlInstance $Source -SqlCredential $SourceSqlCredential + } catch { + Stop-Function -Message "Failed to process Instance $Source" -ErrorRecord $_ -Target $Source + return + } + + if (!(Test-SqlSa -SqlInstance $sourceserver -SqlCredential $SourceSqlCredential)) { + Stop-Function -Message "Not a sysadmin on $sourceserver. Quitting." -Category PermissionDenied -ErrorRecord $_ -Target $server -Continue + } + + try { + $destserver = Connect-SqlInstance -SqlInstance $Destination -SqlCredential $DestinationSqlCredential + } catch { + Stop-Function -Message "Failed to process Instance $Destination" -ErrorRecord $_ -Target $Destination + return + } + + if (!(Test-SqlSa -SqlInstance $destserver -SqlCredential $DestinationSqlCredential)) { + Stop-Function -Message "Not a sysadmin on $destserver. Quitting." -Category PermissionDenied -ErrorRecord $_ -Target $server -Continue + } + + $source = $sourceserver.DomainInstanceName + $destination = $destserver.DomainInstanceName + } else { + try { + $server = Connect-SqlInstance -SqlInstance $SqlInstance -SqlCredential $SqlCredential + } catch { + Stop-Function -Message "Failed to process Instance $SqlInstance" -ErrorRecord $_ -Target $SqlInstance -Continue + } + + if (!(Test-SqlSa -SqlInstance $server -SqlCredential $SqlCredential)) { + Stop-Function -Message "Not a sysadmin on $server. Quitting." -Category PermissionDenied -ErrorRecord $_ -Target $server -Continue + } + + if ((Test-Path $Path) -eq $false) { + Stop-Function -Message "File $Path Not Found" -Category InvalidArgument -Target $Path -Continue + } + } + + } + process { + if ($Path.length -eq 0) { + if ($Pscmdlet.ShouldProcess($destination, "Export sp_configure")) { + $sqlfilename = Export-DbaSpConfigure $sourceserver + } + + if ($sourceserver.versionMajor -ne $destserver.versionMajor -and $force -eq $false) { + Write-Message -Level Warning -Message "Source SQL Server major version and Destination SQL Server major version must match for sp_configure migration. Use -Force to override this precaution or check the exported sql file, $sqlfilename, and run manually." + return + } + + If ($Pscmdlet.ShouldProcess($destination, "Execute sp_configure")) { + $sourceserver.Configuration.ShowAdvancedOptions.ConfigValue = $true + $sourceserver.Configuration.Alter($true) + $destserver.Configuration.ShowAdvancedOptions.ConfigValue = $true + $sourceserver.Configuration.Alter($true) + + $destprops = $destserver.Configuration.Properties + + foreach ($sourceprop in $sourceserver.Configuration.Properties) { + $displayname = $sourceprop.DisplayName + + $destprop = $destprops | where-object { $_.Displayname -eq $displayname } + if ($null -ne $destprop) { + try { + $destprop.configvalue = $sourceprop.configvalue + $null = $destserver.Query("RECONFIGURE WITH OVERRIDE") + Write-Message -Level Output -Message "updated $($destprop.displayname) to $($sourceprop.configvalue)." + } catch { + Stop-Function -Message "Could not set $($destprop.displayname) to $($sourceprop.configvalue). Feature may not be supported." -ErrorRecord $_ -Continue + } + } + } + try { + $destserver.Configuration.Alter() + } catch { + $needsrestart = $true + } + + $sourceserver.Configuration.ShowAdvancedOptions.ConfigValue = $false + $sourceserver.Configuration.Alter($true) + $destserver.Configuration.ShowAdvancedOptions.ConfigValue = $false + $destserver.Configuration.Alter($true) + + if ($needsrestart -eq $true) { + Write-Message -Level Warning -Message "Some configuration options will be updated once SQL Server is restarted." + } else { + Write-Message -Level Output -Message "Configuration option has been updated." + } + } + + if ($Pscmdlet.ShouldProcess($destination, "Removing temp file")) { + Remove-Item $sqlfilename -ErrorAction SilentlyContinue + } + + } else { + if ($Pscmdlet.ShouldProcess($destination, "Importing sp_configure from $Path")) { + $server.Configuration.ShowAdvancedOptions.ConfigValue = $true + $sql = Get-Content $Path + foreach ($line in $sql) { + try { + $null = $server.Query($line) + Write-Message -Level Output -Message "Successfully executed $line." + } catch { + Stop-Function -Message "$line failed. Feature may not be supported." -ErrorRecord $_ -Continue + } + } + $server.Configuration.ShowAdvancedOptions.ConfigValue = $false + Write-Message -Level Warning -Message "Some configuration options will be updated once SQL Server is restarted." + } + } + } + end { + if ($Path.length -gt 0) { + $server.ConnectionContext.Disconnect() + } else { + $sourceserver.ConnectionContext.Disconnect() + $destserver.ConnectionContext.Disconnect() + } + + If ($Pscmdlet.ShouldProcess("console", "Showing finished message")) { + Write-Message -Level Output -Message "SQL Server configuration options migration finished." + } + + Test-DbaDeprecation -DeprecatedOn "1.0.0" -EnableException:$false -Alias Import-SqlSpConfigure + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function Import-DbaXESessionTemplate { + <# + .SYNOPSIS + Imports a new XESession XML Template + + .DESCRIPTION + Imports a new XESession XML Template either from the dbatools repository or a file you specify. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. You must have sysadmin access and server version must be SQL Server version 2008 or higher. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Name + The Name of the session to create. + + .PARAMETER Path + The path to the xml file or files for the session(s). + + .PARAMETER Template + Specifies the name of one of the templates from the dbatools repository. Press tab to cycle through the provided templates. + + .PARAMETER TargetFilePath + By default, files will be created in the default xel directory. Use TargetFilePath to change all instances of + filename = "file.xel" to filename = "$TargetFilePath\file.xel". Only specify the directory, not the file itself. + + This path is relative to the destination directory + + .PARAMETER TargetFileMetadataPath + By default, files will be created in the default xem directory. Use TargetFileMetadataPath to change all instances of + filename = "file.xem" to filename = "$TargetFilePath\file.xem". Only specify the directory, not the file itself. + + This path is relative to the destination directory + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: ExtendedEvent, XE, XEvent + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Import-DbaXESessionTemplate + + .EXAMPLE + PS C:\> Import-DbaXESessionTemplate -SqlInstance sql2017 -Template db_query_wait_stats + + Creates a new XESession named db_query_wait_stats from the dbatools repository to the SQL Server sql2017. + + .EXAMPLE + PS C:\> Import-DbaXESessionTemplate -SqlInstance sql2017 -Template db_query_wait_stats -Name "Query Wait Stats" + + Creates a new XESession named "Query Wait Stats" using the db_query_wait_stats template. + + .EXAMPLE + PS C:\> Get-DbaXESession -SqlInstance sql2017 -Session 'Database Health 2014' | Remove-DbaXESession + PS C:\> Import-DbaXESessionTemplate -SqlInstance sql2017 -Template 'Database Health 2014' | Start-DbaXESession + + Removes a session if it exists, then recreates it using a template. + + .EXAMPLE + PS C:\> Get-DbaXESessionTemplate | Out-GridView -PassThru | Import-DbaXESessionTemplate -SqlInstance sql2017 + + Allows you to select a Session template then import to an instance named sql2017. + + #> + [CmdletBinding()] + param ( + [parameter(Mandatory, ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [string]$Name, + [parameter(ValueFromPipelineByPropertyName)] + [Alias("FullName")] + [string[]]$Path, + [string[]]$Template, + [string]$TargetFilePath, + [string]$TargetFileMetadataPath, + [switch]$EnableException + ) + begin { + $metadata = Import-Clixml "$script:PSModuleRoot\bin\xetemplates-metadata.xml" + } + process { + if ((Test-Bound -ParameterName Path -Not) -and (Test-Bound -ParameterName Template -Not)) { + Stop-Function -Message "You must specify Path or Template." + } + + if (($Path.Count -gt 1 -or $Template.Count -gt 1) -and (Test-Bound -ParameterName Name)) { + Stop-Function -Message "Name cannot be specified with multiple files or templates because the Session will already exist." + return + } + + foreach ($instance in $SqlInstance) { + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential -MinimumVersion 11 + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + $SqlConn = $server.ConnectionContext.SqlConnectionObject + $SqlStoreConnection = New-Object Microsoft.SqlServer.Management.Sdk.Sfc.SqlStoreConnection $SqlConn + $store = New-Object Microsoft.SqlServer.Management.XEvent.XEStore $SqlStoreConnection + + foreach ($file in $template) { + $templatepath = "$script:PSModuleRoot\bin\xetemplates\$file.xml" + if ((Test-Path $templatepath)) { + $Path += $templatepath + } else { + Stop-Function -Message "Invalid template ($templatepath does not exist)." -Continue + } + } + + foreach ($file in $Path) { + + if ((Test-Bound -Not -ParameterName TargetFilePath)) { + Write-Message -Level Verbose -Message "Importing $file to $instance" + try { + $xml = [xml](Get-Content $file -ErrorAction Stop) + } catch { + Stop-Function -Message "Failure" -ErrorRecord $_ -Target $file -Continue + } + } else { + Write-Message -Level Verbose -Message "TargetFilePath specified, changing all file locations in $file for $instance." + Write-Message -Level Verbose -Message "TargetFileMetadataPath specified, changing all metadata file locations in $file for $instance." + + # Handle whatever people specify + $TargetFilePath = $TargetFilePath.TrimEnd("\") + $TargetFileMetadataPath = $TargetFileMetadataPath.TrimEnd("\") + $TargetFilePath = "$TargetFilePath\" + $TargetFileMetadataPath = "$TargetFileMetadataPath\" + + # Perform replace + $xelphrase = 'name="filename" value="' + $xemphrase = 'name="metadatafile" value="' + + try { + $basename = (Get-ChildItem $file).Basename + $contents = Get-Content $file -ErrorAction Stop + $contents = $contents.Replace($xelphrase, "$xelphrase$TargetFilePath") + $contents = $contents.Replace($xemphrase, "$xemphrase$TargetFileMetadataPath") + $temp = ([System.IO.Path]::GetTempPath()).TrimEnd("").TrimEnd("\") + $tempfile = "$temp\$basename" + $null = Set-Content -Path $tempfile -Value $contents -Encoding UTF8 + $xml = [xml](Get-Content $tempfile -ErrorAction Stop) + $file = $tempfile + } catch { + Stop-Function -Message "Failure" -ErrorRecord $_ -Target $file -Continue + } + + Write-Message -Level Verbose -Message "$TargetFilePath does not exist on $server, creating now." + try { + if (-not (Test-DbaPath -SqlInstance $server -Path $TargetFilePath)) { + $null = New-DbaDirectory -SqlInstance $server -Path $TargetFilePath + } + } catch { + Stop-Function -Message "Failure" -ErrorRecord $_ -Target $file -Continue + } + } + + if (-not $xml.event_sessions) { + Stop-Function -Message "$file is not a valid XESession template document." -Continue + } + + if ((Test-Bound -ParameterName Name -not)) { + $Name = (Get-ChildItem $file).BaseName + } + + # This could be done better but not today + $no2012 = ($metadata | Where-Object Compatibility -gt 2012).Name + $no2014 = ($metadata | Where-Object Compatibility -gt 2014).Name + + if ($Name -in $no2012 -and $server.VersionMajor -eq 11) { + Stop-Function -Message "$Name is not supported in SQL Server 2012 ($server)" -Continue + } + + if ($Name -in $no2014 -and $server.VersionMajor -eq 12) { + Stop-Function -Message "$Name is not supported in SQL Server 2014 ($server)" -Continue + } + + if ((Get-DbaXESession -SqlInstance $server -Session $Name)) { + Stop-Function -Message "$Name already exists on $instance" -Continue + } + + try { + Write-Message -Level Verbose -Message "Importing $file as $Name " + $session = $store.CreateSessionFromTemplate($Name, $file) + $session.Create() + if ($file -eq $tempfile) { + Remove-Item $tempfile -ErrorAction SilentlyContinue + } + Get-DbaXESession -SqlInstance $server -Session $session.Name + } catch { + Stop-Function -Message "Failure" -ErrorRecord $_ -Target $store -Continue + } + } + } + } +} +#ValidationTags#CodeStyle,Messaging,FlowControl,Pipeline# +function Install-DbaFirstResponderKit { + <# + .SYNOPSIS + Installs or updates the First Responder Kit stored procedures. + + .DESCRIPTION + Downloads, extracts and installs the First Responder Kit stored procedures: + sp_Blitz, sp_BlitzWho, sp_BlitzFirst, sp_BlitzIndex, sp_BlitzCache and sp_BlitzTrace, etc. + + First Responder Kit links: + http://FirstResponderKit.org + https://github.com/BrentOzarULTD/SQL-Server-First-Responder-Kit + + .PARAMETER SqlInstance + The target SQL Server instance or instances. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Database + Specifies the database to instal the First Responder Kit stored procedures into + + .PARAMETER Branch + Specifies an alternate branch of the First Responder Kit to install. (master or dev) + + .PARAMETER LocalFile + Specifies the path to a local file to install FRK from. This *should* be the zipfile as distributed by the maintainers. + If this parameter is not specified, the latest version will be downloaded and installed from https://github.com/BrentOzarULTD/SQL-Server-First-Responder-Kit + + .PARAMETER Force + If this switch is enabled, the FRK will be downloaded from the internet even if previously cached. + + .PARAMETER Confirm + Prompts to confirm actions + + .PARAMETER WhatIf + Shows what would happen if the command were to run. No actions are actually performed. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: BrentOzar, FRK, FirstResponderKit + Author: Tara Kizer, Brent Ozar Unlimited (https://www.brentozar.com/) + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Install-DbaFirstResponderKit + + .EXAMPLE + PS C:\> Install-DbaFirstResponderKit -SqlInstance server1 -Database master + + Logs into server1 with Windows authentication and then installs the FRK in the master database. + + .EXAMPLE + PS C:\> Install-DbaFirstResponderKit -SqlInstance server1\instance1 -Database DBA + + Logs into server1\instance1 with Windows authentication and then installs the FRK in the DBA database. + + .EXAMPLE + PS C:\> Install-DbaFirstResponderKit -SqlInstance server1\instance1 -Database master -SqlCredential $cred + + Logs into server1\instance1 with SQL authentication and then installs the FRK in the master database. + + .EXAMPLE + PS C:\> Install-DbaFirstResponderKit -SqlInstance sql2016\standardrtm, sql2016\sqlexpress, sql2014 + + Logs into sql2016\standardrtm, sql2016\sqlexpress and sql2014 with Windows authentication and then installs the FRK in the master database. + + .EXAMPLE + PS C:\> $servers = "sql2016\standardrtm", "sql2016\sqlexpress", "sql2014" + PS C:\> $servers | Install-DbaFirstResponderKit + + Logs into sql2016\standardrtm, sql2016\sqlexpress and sql2014 with Windows authentication and then installs the FRK in the master database. + + .EXAMPLE + PS C:\> Install-DbaFirstResponderKit -SqlInstance sql2016 -Branch dev + + Installs the dev branch version of the FRK in the master database on sql2016 instance. + + #> + [CmdletBinding(SupportsShouldProcess)] + param ( + [Parameter(Mandatory, ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [ValidateSet('master', 'dev')] + [string]$Branch = "master", + [object]$Database = "master", + [string]$LocalFile, + [switch]$Force, + [Alias('Silent')] + [switch]$EnableException + ) + + begin { + $DbatoolsData = Get-DbatoolsConfigValue -FullName "Path.DbatoolsData" + + if (-not $DbatoolsData) { + $DbatoolsData = ([System.IO.Path]::GetTempPath()).TrimEnd("\") + } + + $url = "https://github.com/BrentOzarULTD/SQL-Server-First-Responder-Kit/archive/$Branch.zip" + + $temp = ([System.IO.Path]::GetTempPath()).TrimEnd("\") + $zipfile = "$temp\SQL-Server-First-Responder-Kit-$Branch.zip" + $zipfolder = "$temp\SQL-Server-First-Responder-Kit-$Branch\" + $FRKLocation = "FRK_$Branch" + $LocalCachedCopy = Join-Path -Path $DbatoolsData -ChildPath $FRKLocation + if ($LocalFile) { + if (-not(Test-Path $LocalFile)) { + Stop-Function -Message "$LocalFile doesn't exist" + return + } + if (-not($LocalFile.EndsWith('.zip'))) { + Stop-Function -Message "$LocalFile should be a zip file" + return + } + } + + if ($Force -or -not(Test-Path -Path $LocalCachedCopy -PathType Container) -or $LocalFile) { + # Force was passed, or we don't have a local copy, or $LocalFile was passed + if ($zipfile | Test-Path) { + Remove-Item -Path $zipfile -ErrorAction SilentlyContinue + } + if ($zipfolder | Test-Path) { + Remove-Item -Path $zipfolder -Recurse -ErrorAction SilentlyContinue + } + + $null = New-Item -ItemType Directory -Path $zipfolder -ErrorAction SilentlyContinue + if ($LocalFile) { + Unblock-File $LocalFile -ErrorAction SilentlyContinue + Expand-Archive -Path $LocalFile -DestinationPath $zipfolder -Force + } else { + Write-Message -Level Verbose -Message "Downloading and unzipping the First Responder Kit zip file." + + try { + + try { + Invoke-TlsWebRequest $url -OutFile $zipfile -ErrorAction Stop -UseBasicParsing + } catch { + # Try with default proxy and usersettings + (New-Object System.Net.WebClient).Proxy.Credentials = [System.Net.CredentialCache]::DefaultNetworkCredentials + Invoke-TlsWebRequest $url -OutFile $zipfile -ErrorAction Stop -UseBasicParsing + } + + + # Unblock if there's a block + Unblock-File $zipfile -ErrorAction SilentlyContinue + + Expand-Archive -Path $zipfile -DestinationPath $zipfolder -Force + + Remove-Item -Path $zipfile + } catch { + Stop-Function -Message "Couldn't download the First Responder Kit. Download and install manually from https://github.com/BrentOzarULTD/SQL-Server-First-Responder-Kit/archive/$Branch.zip." -ErrorRecord $_ + return + } + } + + ## Copy it into local area + if (Test-Path -Path $LocalCachedCopy -PathType Container) { + Remove-Item -Path (Join-Path $LocalCachedCopy '*') -Recurse -ErrorAction SilentlyContinue + } else { + $null = New-Item -Path $LocalCachedCopy -ItemType Container + } + Copy-Item -Path $zipfolder -Destination $LocalCachedCopy -Recurse + } + } + + + process { + if (Test-FunctionInterrupt) { + return + } + + foreach ($instance in $SqlInstance) { + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $sqlcredential + } catch { + Stop-Function -Message "Failure." -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + Write-Message -Level Verbose -Message "Starting installing/updating the First Responder Kit stored procedures in $database on $instance." + $allprocedures_query = "select name from sys.procedures where is_ms_shipped = 0" + $allprocedures = ($server.Query($allprocedures_query, $Database)).Name + # Install/Update each FRK stored procedure + foreach ($script in (Get-ChildItem $LocalCachedCopy -Recurse -Filter "sp_*.sql")) { + $scriptname = $script.Name + $scriptError = $false + if ($scriptname -ne "sp_BlitzRS.sql") { + + if ($scriptname -eq "sp_BlitzQueryStore.sql") { + if ($server.VersionMajor -lt 13) { continue } + } + if ($Pscmdlet.ShouldProcess($instance, "installing/updating $scriptname in $database.")) { + try { + Invoke-DbaQuery -SqlInstance $server -Database $Database -File $script.FullName -EnableException -Verbose:$false + } catch { + Write-Message -Level Warning -Message "Could not execute at least one portion of $scriptname in $Database on $instance." -ErrorRecord $_ + $scriptError = $true + } + $baseres = @{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + Database = $Database + Name = $script.BaseName + } + if ($scriptError) { + $baseres['Status'] = 'Error' + } elseif ($script.BaseName -in $allprocedures) { + $baseres['Status'] = 'Updated' + } else { + $baseres['Status'] = 'Installed' + } + [PSCustomObject]$baseres + } + } + } + Write-Message -Level Verbose -Message "Finished installing/updating the First Responder Kit stored procedures in $database on $instance." + } + } +} +#ValidationTags#CodeStyle,Messaging,FlowControl,Pipeline# +function Install-DbaMaintenanceSolution { + <# + .SYNOPSIS + Download and Install SQL Server Maintenance Solution created by Ola Hallengren (https://ola.hallengren.com) + + .DESCRIPTION + This script will download and install the latest version of SQL Server Maintenance Solution created by Ola Hallengren + + .PARAMETER SqlInstance + The target SQL Server instance onto which the Maintenance Solution will be installed. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Database + The database where Ola Hallengren's solution will be installed. Defaults to master. + + .PARAMETER BackupLocation + Location of the backup root directory. If this is not supplied, the default backup directory will be used. + + .PARAMETER CleanupTime + Time in hours, after which backup files are deleted. + + .PARAMETER OutputFileDirectory + Specify the output file directory where the Maintenance Solution will write to. + + .PARAMETER ReplaceExisting + If this switch is enabled, objects already present in the target database will be dropped and recreated. + + .PARAMETER LogToTable + If this switch is enabled, the Maintenance Solution will be configured to log commands to a table. + + .PARAMETER Solution + Specifies which portion of the Maintenance solution to install. Valid values are All (full solution), Backup, IntegrityCheck and IndexOptimize. + + .PARAMETER InstallJobs + If this switch is enabled, the corresponding SQL Agent Jobs will be created. + + .PARAMETER LocalFile + Specifies the path to a local file to install Ola's solution from. This *should* be the zipfile as distributed by the maintainers. + If this parameter is not specified, the latest version will be downloaded and installed from https://github.com/olahallengren/sql-server-maintenance-solution + + .PARAMETER Force + If this switch is enabled, the Ola's solution will be downloaded from the internet even if previously cached. + + .PARAMETER WhatIf + If this switch is enabled, no actions are performed but informational messages will be displayed that explain what would happen if the command were to run. + + .PARAMETER Confirm + If this switch is enabled, you will be prompted for confirmation before executing any operations that change state. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Ola, Maintenance + Author: Viorel Ciucu, cviorel.com + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + http://dbatools.io/Install-DbaMaintenanceSolution + + .EXAMPLE + PS C:\> Install-DbaMaintenanceSolution -SqlInstance RES14224 -Database DBA -CleanupTime 72 + + Installs Ola Hallengren's Solution objects on RES14224 in the DBA database. + Backups will default to the default Backup Directory. + If the Maintenance Solution already exists, the script will be halted. + + .EXAMPLE + PS C:\> Install-DbaMaintenanceSolution -SqlInstance RES14224 -Database DBA -BackupLocation "Z:\SQLBackup" -CleanupTime 72 + + This will create the Ola Hallengren's Solution objects. Existing objects are not affected in any way. + + + .EXAMPLE + PS C:\> $params = @{ + >> SqlInstance = 'MyServer' + >> Database = 'maintenance' + >> ReplaceExisting = $true + >> InstallJobs = $true + >> LogToTable = $true + >> BackupLocation = 'C:\Data\Backup' + >> CleanupTime = 65 + >> Verbose = $true + >> } + >> Install-DbaMaintenanceSolution @params + + Installs Maintenance Solution to myserver in database. Adds Agent Jobs, and if any currently exist, they'll be replaced. + + .EXAMPLE + PS C:\> Install-DbaMaintenanceSolution -SqlInstance RES14224 -Database DBA -BackupLocation "Z:\SQLBackup" -CleanupTime 72 -ReplaceExisting + + This will drop and then recreate the Ola Hallengren's Solution objects + The cleanup script will drop and recreate: + - TABLE [dbo].[CommandLog] + - STORED PROCEDURE [dbo].[CommandExecute] + - STORED PROCEDURE [dbo].[DatabaseBackup] + - STORED PROCEDURE [dbo].[DatabaseIntegrityCheck] + - STORED PROCEDURE [dbo].[IndexOptimize] + + The following SQL Agent jobs will be deleted: + - 'Output File Cleanup' + - 'IndexOptimize - USER_DATABASES' + - 'sp_delete_backuphistory' + - 'DatabaseBackup - USER_DATABASES - LOG' + - 'DatabaseBackup - SYSTEM_DATABASES - FULL' + - 'DatabaseBackup - USER_DATABASES - FULL' + - 'sp_purge_jobhistory' + - 'DatabaseIntegrityCheck - SYSTEM_DATABASES' + - 'CommandLog Cleanup' + - 'DatabaseIntegrityCheck - USER_DATABASES' + - 'DatabaseBackup - USER_DATABASES - DIFF' + + #> + [CmdletBinding(SupportsShouldProcess, ConfirmImpact = "Medium")] + [Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSUseSingularNouns", "", Justification = "Internal functions are ignored")] + param ( + [parameter(Mandatory, ValueFromPipeline)] + [DbaInstance[]]$SqlInstance, + [PSCredential]$SqlCredential, + [object]$Database = "master", + [string]$BackupLocation, + [int]$CleanupTime, + [string]$OutputFileDirectory, + [switch]$ReplaceExisting, + [switch]$LogToTable, + [ValidateSet('All', 'Backup', 'IntegrityCheck', 'IndexOptimize')] + [string]$Solution = 'All', + [switch]$InstallJobs, + [string]$LocalFile, + [switch]$Force, + [switch]$EnableException + ) + + begin { + if ($InstallJobs -and $Solution -ne 'All') { + Stop-Function -Message "Jobs can only be created for all solutions. To create SQL Agent jobs you need to use '-Solution All' (or not specify the Solution and let it default to All) and '-InstallJobs'." + return + } + + if ((Test-Bound -ParameterName CleanupTime) -and -not $InstallJobs) { + Stop-Function -Message "CleanupTime is only useful when installing jobs. To install jobs, please use '-InstallJobs' in addition to CleanupTime." + return + } + + if ($ReplaceExisting -eq $true) { + Write-Message -Level Verbose -Message "If Ola Hallengren's scripts are found, we will drop and recreate them!" + } + + $DbatoolsData = Get-DbatoolsConfigValue -FullName "Path.DbatoolsData" + + $url = "https://github.com/olahallengren/sql-server-maintenance-solution/archive/master.zip" + + $temp = ([System.IO.Path]::GetTempPath()).TrimEnd("\") + $zipfile = "$temp\ola-sql-server-maintenance-solution.zip" + $zipfolder = "$temp\ola-sql-server-maintenance-solution\" + $OLALocation = "OLA_SQL_MAINT_master" + $LocalCachedCopy = Join-Path -Path $DbatoolsData -ChildPath $OLALocation + if ($LocalFile) { + if (-not (Test-Path $LocalFile)) { + Stop-Function -Message "$LocalFile doesn't exist" + return + } + if (-not ($LocalFile.EndsWith('.zip'))) { + Stop-Function -Message "$LocalFile should be a zip file" + return + } + } + + if ($Force -or -not (Test-Path -Path $LocalCachedCopy -PathType Container) -or $LocalFile) { + # Force was passed, or we don't have a local copy, or $LocalFile was passed + if ($zipfile | Test-Path) { + Remove-Item -Path $zipfile -ErrorAction SilentlyContinue + } + if ($zipfolder | Test-Path) { + Remove-Item -Path $zipfolder -Recurse -ErrorAction SilentlyContinue + } + + $null = New-Item -ItemType Directory -Path $zipfolder -ErrorAction SilentlyContinue + if ($LocalFile) { + Unblock-File $LocalFile -ErrorAction SilentlyContinue + Expand-Archive -Path $LocalFile -DestinationPath $zipfolder -Force + } else { + Write-Message -Level Verbose -Message "Downloading and unzipping Ola's maintenance solution zip file." + + try { + try { + Invoke-TlsWebRequest $url -OutFile $zipfile -ErrorAction Stop -UseBasicParsing + } catch { + # Try with default proxy and usersettings + (New-Object System.Net.WebClient).Proxy.Credentials = [System.Net.CredentialCache]::DefaultNetworkCredentials + Invoke-TlsWebRequest $url -OutFile $zipfile -ErrorAction Stop -UseBasicParsing + } + + # Unblock if there's a block + Unblock-File $zipfile -ErrorAction SilentlyContinue + + Expand-Archive -Path $zipfile -DestinationPath $zipfolder -Force + + Remove-Item -Path $zipfile + } catch { + Stop-Function -Message "Couldn't download Ola's maintenance solution. Download and install manually from https://github.com/olahallengren/sql-server-maintenance-solution/archive/master.zip." -ErrorRecord $_ + return + } + } + + ## Copy it into local area + if (Test-Path -Path $LocalCachedCopy -PathType Container) { + Remove-Item -Path (Join-Path $LocalCachedCopy '*') -Recurse -ErrorAction SilentlyContinue + } else { + $null = New-Item -Path $LocalCachedCopy -ItemType Container + } + Copy-Item -Path $zipfolder -Destination $LocalCachedCopy -Recurse + } + + function Get-DbaOlaWithParameters($listOfFiles) { + + $fileContents = @{ } + foreach ($file in $listOfFiles) { + $fileContents[$file] = Get-Content -Path $file -Raw + } + + foreach ($file in $($fileContents.Keys)) { + # In which database we install + if ($Database -ne 'master') { + $findDB = 'USE [master]' + $replaceDB = 'USE [' + $Database + ']' + $fileContents[$file] = $fileContents[$file].Replace($findDB, $replaceDB) + } + + # Backup location + if ($BackupLocation) { + $findBKP = 'SET @BackupDirectory = NULL' + $replaceBKP = 'SET @BackupDirectory = N''' + $BackupLocation + '''' + $fileContents[$file] = $fileContents[$file].Replace($findBKP, $replaceBKP) + } + + # CleanupTime + if ($CleanupTime -ne 0) { + $findCleanupTime = 'SET @CleanupTime = NULL' + $replaceCleanupTime = 'SET @CleanupTime = ' + $CleanupTime + $fileContents[$file] = $fileContents[$file].Replace($findCleanupTime, $replaceCleanupTime) + } + + # OutputFileDirectory + if ($OutputFileDirectory) { + $findOutputFileDirectory = 'SET @OutputFileDirectory = NULL' + $replaceOutputFileDirectory = 'SET @OutputFileDirectory = N''' + $OutputFileDirectory + '''' + $fileContents[$file] = $fileContents[$file].Replace($findOutputFileDirectory, $replaceOutputFileDirectory) + } + + # LogToTable + if (!$LogToTable) { + $findLogToTable = "SET @LogToTable = 'Y'" + $replaceLogToTable = "SET @LogToTable = 'N'" + $fileContents[$file] = $fileContents[$file].Replace($findLogToTable, $replaceLogToTable) + } + + # Create Jobs + if (-not $InstallJobs) { + $findCreateJobs = "SET @CreateJobs = 'Y'" + $replaceCreateJobs = "SET @CreateJobs = 'N'" + $fileContents[$file] = $fileContents[$file].Replace($findCreateJobs, $replaceCreateJobs) + } + } + return $fileContents + } + } + + process { + if (Test-FunctionInterrupt) { + return + } + + foreach ($instance in $SqlInstance) { + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential -NonPooled + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + if ((Test-Bound -ParameterName ReplaceExisting -Not)) { + $procs = Get-DbaModule -SqlInstance $server -Database $Database | Where-Object Name -in 'CommandExecute', 'DatabaseBackup', 'DatabaseIntegrityCheck', 'IndexOptimize' + $table = Get-DbaDbTable -SqlInstance $server -Database $Database -Table CommandLog -IncludeSystemDBs | Where-Object Database -eq $Database + + if ($null -ne $procs -or $null -ne $table) { + Stop-Function -Message "The Maintenance Solution already exists in $Database on $instance. Use -ReplaceExisting to automatically drop and recreate." + return + } + } + + if ((Test-Bound -ParameterName BackupLocation -Not)) { + $BackupLocation = (Get-DbaDefaultPath -SqlInstance $server).Backup + } + + Write-Message -Level Output -Message "Ola Hallengren's solution will be installed on database $Database." + + $db = $server.Databases[$Database] + + if (-not ($Solution -match 'All')) { + $required = @('CommandExecute.sql') + } + + if ($LogToTable) { + $required += 'CommandLog.sql' + } + + if ($Solution -match 'Backup') { + $required += 'DatabaseBackup.sql' + } + + if ($Solution -match 'IntegrityCheck') { + $required += 'DatabaseIntegrityCheck.sql' + } + + if ($Solution -match 'IndexOptimize') { + $required += 'IndexOptimize.sql' + } + + if ($Solution -match 'All') { + $required += 'MaintenanceSolution.sql' + } + + $temp = ([System.IO.Path]::GetTempPath()).TrimEnd("\") + $zipfile = "$temp\ola.zip" + + $listOfFiles = Get-ChildItem -Filter "*.sql" -Path $LocalCachedCopy -Recurse | Select-Object -ExpandProperty FullName + + $fileContents = Get-DbaOlaWithParameters -listOfFiles $listOfFiles + + $CleanupQuery = $null + if ($ReplaceExisting) { + [string]$CleanupQuery = $(" + IF OBJECT_ID('[dbo].[CommandLog]', 'U') IS NOT NULL + DROP TABLE [dbo].[CommandLog]; + IF OBJECT_ID('[dbo].[CommandExecute]', 'P') IS NOT NULL + DROP PROCEDURE [dbo].[CommandExecute]; + IF OBJECT_ID('[dbo].[DatabaseBackup]', 'P') IS NOT NULL + DROP PROCEDURE [dbo].[DatabaseBackup]; + IF OBJECT_ID('[dbo].[DatabaseIntegrityCheck]', 'P') IS NOT NULL + DROP PROCEDURE [dbo].[DatabaseIntegrityCheck]; + IF OBJECT_ID('[dbo].[IndexOptimize]', 'P') IS NOT NULL + DROP PROCEDURE [dbo].[IndexOptimize]; + ") + + if ($Pscmdlet.ShouldProcess($instance, "Dropping all objects created by Ola's Maintenance Solution")) { + Write-Message -Level Output -Message "Dropping objects created by Ola's Maintenance Solution" + $null = $db.Query($CleanupQuery) + } + + # Remove Ola's Jobs + if ($InstallJobs -and $ReplaceExisting) { + Write-Message -Level Output -Message "Removing existing SQL Agent Jobs created by Ola's Maintenance Solution." + $jobs = Get-DbaAgentJob -SqlInstance $server | Where-Object Description -match "hallengren" + if ($jobs) { + $jobs | ForEach-Object { + if ($Pscmdlet.ShouldProcess($instance, "Dropping job $_.name")) { + Remove-DbaAgentJob -SqlInstance $server -Job $_.name + } + } + } + } + } + + try { + Write-Message -Level Output -Message "Installing on server $instance, database $Database." + + foreach ($file in $fileContents.Keys) { + $shortFileName = Split-Path $file -Leaf + if ($required.Contains($shortFileName)) { + if ($Pscmdlet.ShouldProcess($instance, "Installing $shortFileName")) { + Write-Message -Level Output -Message "Installing $shortFileName." + $sql = $fileContents[$file] + try { + foreach ($query in ($sql -Split "\nGO\b")) { + $null = $db.Query($query) + } + } catch { + Stop-Function -Message "Could not execute $shortFileName in $Database on $instance." -ErrorRecord $_ -Target $db -Continue + } + } + } + } + } catch { + Stop-Function -Message "Could not execute $shortFileName in $Database on $instance." -ErrorRecord $_ -Target $db -Continue + } + } + # Only here due to need for non-pooled connection in this command + try { + $server.ConnectionContext.Disconnect() + } catch { + # here to avoid an empty catch + $null = 1 + } + + Write-Message -Level Output -Message "Installation complete." + } +} +#ValidationTags#CodeStyle,Messaging,FlowControl,Pipeline# +function Install-DbaSqlWatch { + <# + .SYNOPSIS + Installs or updates SqlWatch. + + .DESCRIPTION + Downloads, extracts and installs or updates SqlWatch. + https://sqlwatch.io/ + + .PARAMETER SqlInstance + SQL Server name or SMO object representing the SQL Server to connect to. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Database + Specifies the database to install SqlWatch into. Defaults to SQLWATCH. + + .PARAMETER LocalFile + Specifies the path to a local file to install SqlWatch from. This *should* be the zipfile as distributed by the maintainers. + If this parameter is not specified, the latest version will be downloaded and installed from https://github.com/marcingminski/sqlwatch + + .PARAMETER Force + If this switch is enabled, SqlWatch will be downloaded from the internet even if previously cached. + + .PARAMETER Confirm + Prompts to confirm actions + + .PARAMETER WhatIf + Shows what would happen if the command were to run. No actions are actually performed. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: SqlWatch + Author: Ken K (github.com/koglerk) + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Install-DbaSqlWatch + + .EXAMPLE + Install-DbaSqlWatch -SqlInstance server1 + + Logs into server1 with Windows authentication and then installs SqlWatch in the SQLWATCH database. + + .EXAMPLE + Install-DbaSqlWatch -SqlInstance server1\instance1 -Database DBA + + Logs into server1\instance1 with Windows authentication and then installs SqlWatch in the DBA database. + + .EXAMPLE + Install-DbaSqlWatch -SqlInstance server1\instance1 -Database DBA -SqlCredential $cred + + Logs into server1\instance1 with SQL authentication and then installs SqlWatch in the DBA database. + + .EXAMPLE + Install-DbaSqlWatch -SqlInstance sql2016\standardrtm, sql2016\sqlexpress, sql2014 + + Logs into sql2016\standardrtm, sql2016\sqlexpress and sql2014 with Windows authentication and then installs SqlWatch in the SQLWATCH database. + + .EXAMPLE + $servers = "sql2016\standardrtm", "sql2016\sqlexpress", "sql2014" + $servers | Install-DbaSqlWatch + + Logs into sql2016\standardrtm, sql2016\sqlexpress and sql2014 with Windows authentication and then installs SqlWatch in the SQLWATCH database. + #> + [CmdletBinding(SupportsShouldProcess, ConfirmImpact = "Low")] + param ( + [Parameter(Mandatory, ValueFromPipeline)] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [string]$Database = "SQLWATCH", + [string]$LocalFile, + [switch]$Force, + [switch]$EnableException + ) + begin { + $stepCounter = 0 + + $DbatoolsData = Get-DbatoolsConfigValue -FullName "Path.DbatoolsData" + $tempFolder = ([System.IO.Path]::GetTempPath()).TrimEnd("\") + $zipfile = "$tempFolder\SqlWatch.zip" + + if (-not $LocalFile) { + if ($PSCmdlet.ShouldProcess($env:computername, "Downloading latest release from GitHub")) { + Write-ProgressHelper -StepNumber ($stepCounter++) -Message "Downloading latest release from GitHub" + # query the releases to find the latest, check and see if its cached + $ReleasesUrl = "https://api.github.com/repos/marcingminski/sqlwatch/releases" + $DownloadBase = "https://github.com/marcingminski/sqlwatch/releases/download/" + + Write-Message -Level Verbose -Message "Checking GitHub for the latest release." + $LatestReleaseUrl = (Invoke-TlsWebRequest -UseBasicParsing -Uri $ReleasesUrl | ConvertFrom-Json)[0].assets[0].browser_download_url + + Write-Message -Level VeryVerbose -Message "Latest release is available at $LatestReleaseUrl" + $LocallyCachedZip = Join-Path -Path $DbatoolsData -ChildPath $($LatestReleaseUrl -replace $DownloadBase, ''); + + # if local cached copy exists, use it, otherwise download a new one + if (-not $Force) { + + # download from github + Write-Message -Level Verbose "Downloading $LatestReleaseUrl" + try { + Invoke-TlsWebRequest $LatestReleaseUrl -OutFile $zipfile -ErrorAction Stop -UseBasicParsing + } catch { + #try with default proxy and usersettings + (New-Object System.Net.WebClient).Proxy.Credentials = [System.Net.CredentialCache]::DefaultNetworkCredentials + Invoke-TlsWebRequest $LatestReleaseUrl -OutFile $zipfile -ErrorAction Stop -UseBasicParsing + } + + # copy the file from temp to local cache + Write-Message -Level Verbose "Copying $zipfile to $LocallyCachedZip" + try { + New-Item -Path $LocallyCachedZip -ItemType File -Force | Out-Null + Copy-Item -Path $zipfile -Destination $LocallyCachedZip -Force + } catch { + # should we stop the function if the file copy fails? + # here to avoid an empty catch + $null = 1 + } + } + } + } else { + + # $LocalFile was passed, so use it + if ($PSCmdlet.ShouldProcess($env:computername, "Copying local file to temp directory")) { + + if ($LocalFile.EndsWith("zip")) { + $LocallyCachedZip = $zipfile + Copy-Item -Path $LocalFile -Destination $LocallyCachedZip -Force + } else { + $LocallyCachedZip = (Join-Path -path $tempFolder -childpath "SqlWatch.zip") + Copy-Item -Path $LocalFile -Destination $LocallyCachedZip -Force + } + } + } + + # expand the zip file + if ($PSCmdlet.ShouldProcess($env:computername, "Unpacking zipfile")) { + Write-Message -Level VeryVerbose "Unblocking $LocallyCachedZip" + Unblock-File $LocallyCachedZip -ErrorAction SilentlyContinue + $LocalCacheFolder = Split-Path $LocallyCachedZip -Parent + + Write-Message -Level Verbose "Extracting $LocallyCachedZip to $LocalCacheFolder" + if (Get-Command -ErrorAction SilentlyContinue -Name "Expand-Archive") { + try { + Expand-Archive -Path $LocallyCachedZip -DestinationPath $LocalCacheFolder -Force + } catch { + Stop-Function -Message "Unable to extract $LocallyCachedZip. Archive may not be valid." -ErrorRecord $_ + return + } + } else { + # Keep it backwards compatible + $shell = New-Object -ComObject Shell.Application + $zipPackage = $shell.NameSpace($LocallyCachedZip) + $destinationFolder = $shell.NameSpace($LocalCacheFolder) + Get-ChildItem "$LocalCacheFolder\SqlWatch.zip" | Remove-Item + $destinationFolder.CopyHere($zipPackage.Items()) + } + + Write-Message -Level VeryVerbose "Deleting $LocallyCachedZip" + Remove-Item -Path $LocallyCachedZip + } + } + process { + if (Test-FunctionInterrupt) { + return + } + + foreach ($instance in $SqlInstance) { + if ($PSCmdlet.ShouldProcess($instance, "Installing SqlWatch on $Database")) { + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $sqlcredential + } catch { + Stop-Function -Message "Failure." -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + Write-ProgressHelper -StepNumber ($stepCounter++) -Message "Starting installing/updating SqlWatch in $database on $instance" + + + try { + # create a publish profile and publish DACPAC + $DacPacPath = Get-ChildItem -Filter "SqlWatch.dacpac" -Path $LocalCacheFolder -Recurse | Select-Object -ExpandProperty FullName + $PublishOptions = @{ + RegisterDataTierApplication = $true + } + + Write-ProgressHelper -StepNumber ($stepCounter++) -Message "Publishing SqlWatch dacpac to $database on $instance" + $DacProfile = New-DbaDacProfile -SqlInstance $server -Database $Database -Path $LocalCacheFolder -PublishOptions $PublishOptions | Select-Object -ExpandProperty FileName + $PublishResults = Publish-DbaDacPackage -SqlInstance $server -Database $Database -Path $DacPacPath -PublishXml $DacProfile + + # parse results + $parens = Select-String -InputObject $PublishResults.Result -Pattern "\(([^\)]+)\)" -AllMatches + if ($parens.matches) { + $ExtractedResult = $parens.matches | Select-Object -Last 1 + } + + [PSCustomObject]@{ + ComputerName = $PublishResults.ComputerName + InstanceName = $PublishResults.InstanceName + SqlInstance = $PublishResults.SqlInstance + Database = $PublishResults.Database + Status = $ExtractedResult + } + } catch { + Stop-Function -Message "DACPAC failed to publish to $database on $instance." -ErrorRecord $_ -Target $instance -Continue + } + + Write-Message -Level Verbose -Message "Finished installing/updating SqlWatch in $database on $instance." + } + } + } +} +function Install-DbaWatchUpdate { + <# + .SYNOPSIS + Adds the scheduled task to support Watch-DbaUpdate. + + .DESCRIPTION + Adds the scheduled task to support Watch-DbaUpdate. + + .PARAMETER TaskName + Provide custom name for the Scheduled Task + + .PARAMETER WhatIf + If this switch is enabled, no actions are performed but informational messages will be displayed that explain what would happen if the command were to run. + + .PARAMETER Confirm + If this switch is enabled, you will be prompted for confirmation before executing any operations that change state. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Module + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Install-DbaWatchUpdate + + .EXAMPLE + PS C:\> Install-DbaWatchUpdate + + Adds the scheduled task needed by Watch-DbaUpdate + + .EXAMPLE + PS C:\> Install-DbaWatchUpdate -TaskName MyScheduledTask + + Will create the scheduled task as the name MyScheduledTask + + #> + [cmdletbinding(SupportsShouldProcess)] + param( + [string]$TaskName = 'dbatools version check', + [switch]$EnableException + ) + process { + if ($PSCmdlet.ShouldProcess($env:COMPUTERNAME, "Validate Version of OS") ) { + if (([Environment]::OSVersion).Version.Major -lt 10) { + Stop-Function -Message "This command only supports Windows 10 and above" + } + } + $script = { + try { + # create a task, check every 3 hours + $action = New-ScheduledTaskAction -Execute 'powershell.exe' -Argument '-NoProfile -NoLogo -NonInteractive -WindowStyle Hidden Watch-DbaUpdate' + $trigger = New-ScheduledTaskTrigger -Once -At (Get-Date).Date -RepetitionInterval (New-TimeSpan -Hours 1) + $principal = New-ScheduledTaskPrincipal -LogonType S4U -UserId (whoami) + $settings = New-ScheduledTaskSettingsSet -ExecutionTimeLimit ([timespan]::Zero) -AllowStartIfOnBatteries -DontStopIfGoingOnBatteries -StartWhenAvailable -RunOnlyIfNetworkAvailable -DontStopOnIdleEnd + #Variable $Task marked as unused by PSScriptAnalyzer replaced with $null for catching output + $null = Register-ScheduledTask -Principal $principal -TaskName 'dbatools version check' -Action $action -Trigger $trigger -Settings $settings -ErrorAction Stop + } catch { + # keep moving + # here to avoid an empty catch + $null = 1 + } + } + + if ($null -eq (Get-ScheduledTask -TaskName $TaskName -ErrorAction SilentlyContinue)) { + # Needs admin creds to setup the kind of PowerShell window that doesn't appear for a millisecond + # which is a millisecond too long + if ($PSCmdlet.ShouldProcess($env:COMPUTERNAME, "Validate running in RunAs mode")) { + if (-not ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator")) { + Write-Message -Level Warning -Message "This command has to run using RunAs mode (privileged) to create the Scheduled Task. This will only happen once." + if ($PSCmdlet.ShouldProcess($env:COMPUTERNAME, "Starting process in RunAs mode") ) { + Start-Process powershell -Verb runAs -ArgumentList Install-DbaWatchUpdate -Wait + } + } + + } + if ($PSCmdlet.ShouldProcess($env:COMPUTERNAME, "Creating scheduled task $TaskName")) { + try { + Invoke-Command -ScriptBlock $script -ErrorAction Stop + + if ((Get-Location).Path -ne "$env:WINDIR\system32") { + Write-Message -Level Output -Message "Scheduled Task [$TaskName] created! A notification should appear momentarily. Here's something cute to look at in the interim." + Show-Notification -Title "dbatools wants you" -Text "come hang out at dbatools.io/slack" + } + } catch { + Stop-Function -Message "Could not create scheduled task $TaskName" -Target $env:COMPUTERNAME -ErrorRecord $_ + } + } + if ($PSCmdlet.ShouldProcess($env:COMPUTERNAME, "Checking scheduled task was created")) { + # double check + if ($null -eq (Get-ScheduledTask -TaskName "dbatools version check" -ErrorAction SilentlyContinue)) { + Write-Message -Level Warning -Message "Scheduled Task was not created." + } + } + } else { + Write-Message -Level Output -Message "Scheduled Task $TaskName is already installed on this machine." + } + } +} +function Install-DbaWhoIsActive { + <# + .SYNOPSIS + Automatically installs or updates sp_WhoisActive by Adam Machanic. + + .DESCRIPTION + This command downloads, extracts and installs sp_WhoisActive with Adam's permission. To read more about sp_WhoisActive, please visit http://whoisactive.com and http://sqlblog.com/blogs/adam_machanic/archive/tags/who+is+active/default.aspx + + Please consider donating to Adam if you find this stored procedure helpful: http://tinyurl.com/WhoIsActiveDonate + + Note that you will be prompted a bunch of times to confirm an action. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. Server version must be SQL Server version 2005 or higher. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Database + The database to install sp_WhoisActive into. This parameter is mandatory when executing this command unattended. + + .PARAMETER LocalFile + Specifies the path to a local file to install sp_WhoisActive from. This can be either the zipfile as distributed by the website or the expanded SQL script. If this parameter is not specified, the latest version will be downloaded and installed from https://whoisactive.com/ + + .PARAMETER WhatIf + If this switch is enabled, no actions are performed but informational messages will be displayed that explain what would happen if the command were to run. + + .PARAMETER Confirm + If this switch is enabled, you will be prompted for confirmation before executing any operations that change state. + + .PARAMETER Force + If this switch is enabled, the sp_WhoisActive will be downloaded from the internet even if previously cached. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: AdamMechanic, WhoIsActive, SpWhoIsActive + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Install-DbaWhoIsActive + + .EXAMPLE + PS C:\> Install-DbaWhoIsActive -SqlInstance sqlserver2014a -Database master + + Downloads sp_WhoisActive from the internet and installs to sqlserver2014a's master database. Connects to SQL Server using Windows Authentication. + + .EXAMPLE + PS C:\> Install-DbaWhoIsActive -SqlInstance sqlserver2014a -SqlCredential $cred + + Pops up a dialog box asking which database on sqlserver2014a you want to install the procedure into. Connects to SQL Server using SQL Authentication. + + .EXAMPLE + PS C:\> Install-DbaWhoIsActive -SqlInstance sqlserver2014a -Database master -LocalFile c:\SQLAdmin\whoisactive_install.sql + + Installs sp_WhoisActive to sqlserver2014a's master database from the local file whoisactive_install.sql + + .EXAMPLE + PS C:\> $instances = Get-DbaCmsRegServer sqlserver + PS C:\> Install-DbaWhoIsActive -SqlInstance $instances -Database master + + Installs sp_WhoisActive to all servers within CMS + #> + + [CmdletBinding(SupportsShouldProcess, ConfirmImpact = "Low")] + param ( + [parameter(Mandatory, ValueFromPipeline, Position = 0)] + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [PsCredential]$SqlCredential, + [ValidateScript( { Test-Path -Path $_ -PathType Leaf })] + [string]$LocalFile, + [object]$Database, + [switch][Alias('Silent')] + $EnableException, + [switch]$Force + ) + + begin { + $DbatoolsData = Get-DbatoolsConfigValue -FullName "Path.DbatoolsData" + $temp = ([System.IO.Path]::GetTempPath()).TrimEnd("\") + $zipfile = "$temp\spwhoisactive.zip" + + if ($LocalFile -eq $null -or $LocalFile.Length -eq 0) { + $baseUrl = "http://whoisactive.com/downloads" + $latest = ((Invoke-TlsWebRequest -UseBasicParsing -uri http://whoisactive.com/downloads).Links | where-object { $PSItem.href -match "who_is_active" } | Select-Object href -First 1).href + $LocalCachedCopy = Join-Path -Path $DbatoolsData -ChildPath $latest; + + if ((Test-Path -Path $LocalCachedCopy -PathType Leaf) -and (-not $Force)) { + Write-Message -Level Verbose -Message "Locally-cached copy exists, skipping download." + if ($PSCmdlet.ShouldProcess($env:computername, "Copying sp_WhoisActive from local cache for installation")) { + Copy-Item -Path $LocalCachedCopy -Destination $zipfile; + } + } else { + if ($PSCmdlet.ShouldProcess($env:computername, "Downloading sp_WhoisActive")) { + try { + Write-Message -Level Verbose -Message "Downloading sp_WhoisActive zip file, unzipping and installing." + $url = $baseUrl + "/" + $latest + try { + Invoke-TlsWebRequest $url -OutFile $zipfile -ErrorAction Stop -UseBasicParsing + Copy-Item -Path $zipfile -Destination $LocalCachedCopy + } catch { + #try with default proxy and usersettings + (New-Object System.Net.WebClient).Proxy.Credentials = [System.Net.CredentialCache]::DefaultNetworkCredentials + Invoke-TlsWebRequest $url -OutFile $zipfile -ErrorAction Stop -UseBasicParsing + } + } catch { + Stop-Function -Message "Couldn't download sp_WhoisActive. Please download and install manually from $url." -ErrorRecord $_ + return + } + } + } + } else { + # Look local + if ($PSCmdlet.ShouldProcess($env:computername, "Copying local file to temp directory")) { + + if ($LocalFile.EndsWith("zip")) { + Copy-Item -Path $LocalFile -Destination $zipfile -Force + } else { + Copy-Item -Path $LocalFile -Destination (Join-Path -path $temp -childpath "whoisactivelocal.sql") + } + } + } + if ($LocalFile -eq $null -or $LocalFile.Length -eq 0 -or $LocalFile.EndsWith("zip")) { + # Unpack + # Unblock if there's a block + if ($PSCmdlet.ShouldProcess($env:computername, "Unpacking zipfile")) { + + Unblock-File $zipfile -ErrorAction SilentlyContinue + + if (Get-Command -ErrorAction SilentlyContinue -Name "Expand-Archive") { + try { + Expand-Archive -Path $zipfile -DestinationPath $temp -Force + } catch { + Stop-Function -Message "Unable to extract $zipfile. Archive may not be valid." -ErrorRecord $_ + return + } + } else { + # Keep it backwards compatible + $shell = New-Object -ComObject Shell.Application + $zipPackage = $shell.NameSpace($zipfile) + $destinationFolder = $shell.NameSpace($temp) + Get-ChildItem "$temp\who*active*.sql" | Remove-Item + $destinationFolder.CopyHere($zipPackage.Items()) + } + Remove-Item -Path $zipfile + } + $sqlfile = (Get-ChildItem "$temp\who*active*.sql" -ErrorAction SilentlyContinue | Select-Object -First 1).FullName + } else { + $sqlfile = $LocalFile + } + + if ($PSCmdlet.ShouldProcess($env:computername, "Reading SQL file into memory")) { + Write-Message -Level Verbose -Message "Using $sqlfile." + + $sql = [IO.File]::ReadAllText($sqlfile) + $sql = $sql -replace 'USE master', '' + $batches = $sql -split "GO\r\n" + + $matchString = 'Who Is Active? v' + + If ($sql -like "*$matchString*") { + $posStart = $sql.IndexOf("$matchString") + $PosEnd = $sql.IndexOf(")", $PosStart) + $versionWhoIsActive = $sql.Substring($posStart + $matchString.Length, $posEnd - ($posStart + $matchString.Length) + 1).TrimEnd() + } Else { + $versionWhoIsActive = '' + } + } + } + + process { + if (Test-FunctionInterrupt) { return } + + foreach ($instance in $SqlInstance) { + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $sqlcredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + if (-not $Database) { + if ($PSCmdlet.ShouldProcess($instance, "Prompting with GUI list of databases")) { + $Database = Show-DbaDbList -SqlInstance $server -Title "Install sp_WhoisActive" -Header "To deploy sp_WhoisActive, select a database or hit cancel to quit." -DefaultDb "master" + + if (-not $Database) { + Stop-Function -Message "You must select a database to install the procedure." -Target $Database + return + } + + if ($Database -ne 'master') { + Write-Message -Level Warning -Message "You have selected a database other than master. When you run Invoke-DbaWhoIsActive in the future, you must specify -Database $Database." + } + } + } + if ($PSCmdlet.ShouldProcess($instance, "Installing sp_WhoisActive")) { + try { + $ProcedureExists_Query = "select COUNT(*) [proc_count] from sys.procedures where is_ms_shipped = 0 and name like '%sp_WhoisActive%'" + + if ($server.Databases[$Database]) { + $ProcedureExists = ($server.Query($ProcedureExists_Query, $Database)).proc_count + foreach ($batch in $batches) { + try { + $null = $server.databases[$Database].ExecuteNonQuery($batch) + } catch { + Stop-Function -Message "Failed to install stored procedure." -ErrorRecord $_ -Continue -Target $instance + } + } + + if ($ProcedureExists -gt 0) { + $status = 'Updated' + } else { + $status = 'Installed' + } + + + [PSCustomObject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + Database = $Database + Name = 'sp_WhoisActive' + Version = $versionWhoIsActive + Status = $status + } + } else { + Stop-Function -Message "Failed to find database $Database on $instance or $Database is not writeable." -ErrorRecord $_ -Continue -Target $instance + } + + } catch { + Stop-Function -Message "Failed to install stored procedure." -ErrorRecord $_ -Continue -Target $instance + } + + } + } + } + end { + if ($PSCmdlet.ShouldProcess($env:computername, "Post-install cleanup")) { + Get-Item $sqlfile | Remove-Item + } + Test-DbaDeprecation -DeprecatedOn "1.0.0" -EnableException:$false -Alias Install-SqlWhoIsActive + } +} +function Invoke-DbaAdvancedRestore { + <# + .SYNOPSIS + Allows the restore of modified BackupHistory Objects + For 90% of users Restore-DbaDatabase should be your point of access to this function. The other 10% use it at their own risk + + .DESCRIPTION + This is the final piece in the Restore-DbaDatabase Stack. Usually a BackupHistory object will arrive here from `Restore-Dbadatabase` via the following pipeline: + `Get-DbaBackupInformation | Select-DbaBackupInformation | Format-DbaBackupInformation | Test-DbaBackupInformation | Invoke-DbaAdvancedRestore` + + We have exposed these functions publicly to allow advanced users to perform operations that we don't support, or won't add as they would make things too complex for the majority of our users + + For example if you wanted to do some very complex redirection during a migration, then doing the rewrite of destinations may be better done with your own custom scripts rather than via `Format-DbaBackupInformation` + + We would recommend ALWAYS pushing your input through `Test-DbaBackupInformation` just to make sure that it makes sense to us. + + .PARAMETER BackupHistory + The BackupHistory object to be restored. + Can be passed in on the pipeline + + .PARAMETER SqlInstance + The SqlInstance to which the backups should be restored + + .PARAMETER SqlCredential + SqlCredential to be used to connect to the target SqlInstance + + .PARAMETER OutputScriptOnly + If set, the restore will not be performed, but the T-SQL scripts to perform it will be returned + + .PARAMETER VerifyOnly + If set, performs a Verify of the backups rather than a full restore + + .PARAMETER RestoreTime + Point in Time to which the database should be restored. + + This should be the same value or earlier, as used in the previous pipeline stages + + .PARAMETER StandbyDirectory + A folder path where a standby file should be created to put the recovered databases in a standby mode + + .PARAMETER NoRecovery + Leave the database in a restoring state so that further restore may be made + + .PARAMETER MaxTransferSize + Parameter to set the unit of transfer. Values must be a multiple by 64kb + + .PARAMETER Blocksize + Specifies the block size to use. Must be one of 0.5kb,1kb,2kb,4kb,8kb,16kb,32kb or 64kb + Can be specified in bytes + Refer to https://msdn.microsoft.com/en-us/library/ms178615.aspx for more detail + + .PARAMETER BufferCount + Number of I/O buffers to use to perform the operation. + Refer to https://msdn.microsoft.com/en-us/library/ms178615.aspx for more detail + + .PARAMETER Continue + Indicates that the restore is continuing a restore, so target database must be in Recovering or Standby states + + .PARAMETER AzureCredential + AzureCredential required to connect to blob storage holding the backups + + .PARAMETER WithReplace + Indicated that if the database already exists it should be replaced + + .PARAMETER KeepCDC + Indicates whether CDC information should be restored as part of the database + + .PARAMETER PageRestore + The output from Get-DbaSuspect page containing the suspect pages to be restored. + + .PARAMETER WhatIf + Shows what would happen if the cmdlet runs. The cmdlet is not run. + + .PARAMETER Confirm + Prompts you for confirmation before running the cmdlet. + + .PARAMETER EnableException + Replaces user friendly yellow warnings with bloody red exceptions of doom! + Use this if you want the function to throw terminating errors you want to catch. + + .NOTES + Tags: Restore, Backup + Author: Stuart Moore (@napalmgram - http://stuart-moore.com) + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Invoke-DbaAdvancedRestore + + .EXAMPLE + PS C:\> $BackupHistory | Invoke-DbaAdvancedRestore -SqlInstance MyInstance + + Will restore all the backups in the BackupHistory object according to the transformations it contains + + .EXAMPLE + PS C:\> $BackupHistory | Invoke-DbaAdvancedRestore -SqlInstance MyInstance -OutputScriptOnly + PS C:\> $BackupHistory | Invoke-DbaAdvancedRestore -SqlInstance MyInstance + + First generates just the T-SQL restore scripts so they can be sanity checked, and then if they are good perform the full restore. + By reusing the BackupHistory object there is no need to rescan all the backup files again + + #> + [CmdletBinding(SupportsShouldProcess, ConfirmImpact = "Low")] + [Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSAvoidUsingPlainTextForPassword", "AzureCredential", Justification = "For Parameter AzureCredential")] + [Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSUseOutputTypeCorrectly", "", Justification = "PSSA Rule Ignored by BOH")] + param ( + [parameter(Mandatory, ValueFromPipeline)] + [Object[]]$BackupHistory, + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter]$SqlInstance, + [PSCredential]$SqlCredential, + [switch]$OutputScriptOnly, + [switch]$VerifyOnly, + [datetime]$RestoreTime = (Get-Date).AddDays(2), + [string]$StandbyDirectory, + [switch]$NoRecovery, + [int]$MaxTransferSize, + [int]$BlockSize, + [int]$BufferCount, + [switch]$Continue, + [string]$AzureCredential, + [switch]$WithReplace, + [switch]$KeepCDC, + [object[]]$PageRestore, + [switch]$EnableException + ) + begin { + try { + $server = Connect-SqlInstance -SqlInstance $SqlInstance -SqlCredential $SqlCredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + return + } + if ($KeepCDC -and ($NoRecovery -or ('' -ne $StandbyDirectory))) { + Stop-Function -Category InvalidArgument -Message "KeepCDC cannot be specified with Norecovery or Standby as it needs recovery to work" + return + } + + if ($null -ne $PageRestore) { + Write-Message -Message "Doing Page Recovery" -Level Verbose + $tmpPages = @() + foreach ($Page in $PageRestore) { + $tmppages += "$($Page.FileId):$($Page.PageID)" + } + $NoRecovery = $True + $Pages = $tmpPages -join ',' + } + $InternalHistory = @() + } + process { + foreach ($bh in $BackupHistory) { + $InternalHistory += $bh + } + } + end { + if (Test-FunctionInterrupt) { return } + $Databases = $InternalHistory.Database | Select-Object -Unique + foreach ($Database in $Databases) { + $DatabaseRestoreStartTime = Get-Date + if ($Database -in $Server.Databases.Name) { + if (-not $OutputScriptOnly -and -not $VerifyOnly) { + if ($Pscmdlet.ShouldProcess("Killing processes in $Database on $SqlInstance as it exists and WithReplace specified `n", "Cannot proceed if processes exist, ", "Database Exists and WithReplace specified, need to kill processes to restore")) { + try { + Write-Message -Level Verbose -Message "Killing processes on $Database" + $null = Stop-DbaProcess -SqlInstance $Server -Database $Database -WarningAction Silentlycontinue + $null = $server.Query("Alter database $Database set offline with rollback immediate; alter database $Database set restricted_user; Alter database $Database set online with rollback immediate", 'master') + $server.ConnectionContext.Connect() + } catch { + Write-Message -Level Verbose -Message "No processes to kill in $Database" + } + } + } elseif (-not $WithReplace -and (-not $VerifyOnly)) { + Write-Message -Level verbose -Message "$Database exists and WithReplace not specified, stopping" + continue + } + } + Write-Message -Message "WithReplace = $WithReplace" -Level Debug + $backups = @($InternalHistory | Where-Object {$_.Database -eq $Database} | Sort-Object -Property Type, FirstLsn) + $BackupCnt = 1 + foreach ($backup in $backups) { + $FileRestoreStartTime = Get-Date + $Restore = New-Object Microsoft.SqlServer.Management.Smo.Restore + if (($backup -ne $backups[-1]) -or $true -eq $NoRecovery) { + $Restore.NoRecovery = $True + } elseif ($backup -eq $backups[-1] -and '' -ne $StandbyDirectory) { + $Restore.StandbyFile = $StandByDirectory + "\" + $Database + (get-date -Format yyyMMddHHmmss) + ".bak" + Write-Message -Level Verbose -Message "Setting standby on last file $($Restore.StandbyFile)" + } else { + $Restore.NoRecovery = $False + } + if ($restoretime -gt (Get-Date) -or $Restore.RestoreTime -gt (Get-Date) -or $backup.RecoveryModel -eq 'Simple') { + $Restore.ToPointInTime = $null + } else { + if ($RestoreTime -ne $Restore.RestoreTime) { + $Restore.ToPointInTime = $backup.RestoreTime + } else { + $Restore.ToPointInTime = $RestoreTime + } + } + $Restore.Database = $database + $Restore.ReplaceDatabase = $WithReplace + if ($MaxTransferSize) { + $Restore.MaxTransferSize = $MaxTransferSize + } + if ($BufferCount) { + $Restore.BufferCount = $BufferCount + } + if ($BlockSize) { + $Restore.Blocksize = $BlockSize + } + if ($true -ne $Continue -and ($null -eq $Pages)) { + foreach ($file in $backup.FileList) { + $MoveFile = New-Object Microsoft.SqlServer.Management.Smo.RelocateFile + $MoveFile.LogicalFileName = $File.LogicalName + $MoveFile.PhysicalFileName = $File.PhysicalName + $null = $Restore.RelocateFiles.Add($MoveFile) + } + } + $Action = switch ($backup.Type) { + '1' {'Database'} + '2' {'Log'} + '5' {'Database'} + 'Transaction Log' {'Log'} + Default {'Database'} + } + + Write-Message -Level Debug -Message "restore action = $Action" + $Restore.Action = $Action + foreach ($File in $backup.FullName) { + Write-Message -Message "Adding device $file" -Level Debug + $Device = New-Object -TypeName Microsoft.SqlServer.Management.Smo.BackupDeviceItem + $Device.Name = $file + if ($file.StartsWith("http")) { + $Device.devicetype = "URL" + } else { + $Device.devicetype = "File" + } + + if ($AzureCredential) { + $Restore.CredentialName = $AzureCredential + } + + $Restore.FileNumber = $backup.Position + $Restore.Devices.Add($Device) + } + Write-Message -Level Verbose -Message "Performing restore action" + $ConfirmMessage = "`n Restore Database $Database on $SqlInstance `n from files: $RestoreFileNames `n with these file moves: `n $LogicalFileMovesString `n $ConfirmPointInTime `n" + if ($Pscmdlet.ShouldProcess("$Database on $SqlInstance `n `n", $ConfirmMessage)) { + try { + $RestoreComplete = $true + if ($KeepCDC -and $Restore.NoRecovery -eq $false) { + $script = $Restore.Script($server) + if ($script -like '*WITH*') { + $script = $script.TrimEnd() + ' , KEEP_CDC' + } else { + $script = $script.TrimEnd() + ' WITH KEEP_CDC' + } + if ($true -ne $OutputScriptOnly) { + Write-Progress -id 1 -activity "Restoring $Database to $sqlinstance - Backup $BackupCnt of $($Backups.count)" -percentcomplete 0 -status ([System.String]::Format("Progress: {0} %", 0)) + $null = $server.ConnectionContext.ExecuteNonQuery($script) + Write-Progress -id 1 -activity "Restoring $Database to $sqlinstance - Backup $BackupCnt of $($Backups.count)" -status "Complete" -Completed + } + } elseif ($null -ne $Pages -and $Action -eq 'Database') { + $script = $Restore.Script($server) + $script = $script -replace "] FROM", "] PAGE='$pages' FROM" + if ($true -ne $OutputScriptOnly) { + Write-Progress -id 1 -activity "Restoring $Database to $sqlinstance - Backup $BackupCnt of $($Backups.count)" -percentcomplete 0 -status ([System.String]::Format("Progress: {0} %", 0)) + $null = $server.ConnectionContext.ExecuteNonQuery($script) + Write-Progress -id 1 -activity "Restoring $Database to $sqlinstance - Backup $BackupCnt of $($Backups.count)" -status "Complete" -Completed + } + } elseif ($OutputScriptOnly) { + $script = $Restore.Script($server) + } elseif ($VerifyOnly) { + Write-Message -Message "VerifyOnly restore" -Level Verbose + Write-Progress -id 1 -activity "Verifying $Database backup file on $sqlinstance - Backup $BackupCnt of $($Backups.count)" -percentcomplete 0 -status ([System.String]::Format("Progress: {0} %", 0)) + $Verify = $Restore.SqlVerify($server) + Write-Progress -id 1 -activity "Verifying $Database backup file on $sqlinstance - Backup $BackupCnt of $($Backups.count)" -status "Complete" -Completed + if ($verify -eq $true) { + Write-Message -Message "VerifyOnly restore Succeeded" -Level Verbose + return "Verify successful" + } else { + Write-Message -Message "VerifyOnly restore Failed" -Level Verbose + return "Verify failed" + } + } else { + $outerProgress = $BackupCnt / $Backups.Count * 100 + if ($BackupCnt -eq 1) { + Write-Progress -id 1 -Activity "Restoring $Database to $sqlinstance - Backup $BackupCnt of $($Backups.count)" -percentcomplete 0 + } + Write-Progress -id 2 -ParentId 1 -Activity "Restore $($backup.FullName -Join ',')" -percentcomplete 0 + $script = $Restore.Script($Server) + $percentcomplete = [Microsoft.SqlServer.Management.Smo.PercentCompleteEventHandler] { + Write-Progress -id 2 -ParentId 1 -Activity "Restore $($backup.FullName -Join ',')" -percentcomplete $_.Percent -status ([System.String]::Format("Progress: {0} %", $_.Percent)) + } + $Restore.add_PercentComplete($percentcomplete) + $Restore.PercentCompleteNotification = 1 + $Restore.SqlRestore($Server) + Write-Progress -id 2 -ParentId 1 -Activity "Restore $($backup.FullName -Join ',')" -Completed + Write-Progress -id 1 -Activity "Restoring $Database to $sqlinstance - Backup $BackupCnt of $($Backups.count)" -percentcomplete $outerProgress -status ([System.String]::Format("Progress: {0:N2} %", $outerProgress)) + } + } catch { + Write-Message -Level Verbose -Message "Failed, Closing Server connection" + $RestoreComplete = $False + $ExitError = $_.Exception.InnerException + Stop-Function -Message "Failed to restore db $Database, stopping" -ErrorRecord $_ + return + } finally { + if ($OutputScriptOnly -eq $false) { + $pathSep = Get-DbaPathSep -Server $server + $RestoreDirectory = ((Split-Path $backup.FileList.PhysicalName -Parent) | Sort-Object -Unique).Replace('\', $pathSep) -Join ',' + [PSCustomObject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + Database = $backup.Database + DatabaseName = $backup.Database + DatabaseOwner = $server.ConnectionContext.TrueLogin + Owner = $server.ConnectionContext.TrueLogin + NoRecovery = $Restore.NoRecovery + WithReplace = $WithReplace + RestoreComplete = $RestoreComplete + BackupFilesCount = $backup.FullName.Count + RestoredFilesCount = $backup.Filelist.PhysicalName.count + BackupSizeMB = if ([bool]($backup.psobject.Properties.Name -contains 'TotalSize')) { [Math]::Round(($backup | Measure-Object -Property TotalSize -Sum).Sum / 1mb, 2) } else { $null } + CompressedBackupSizeMB = if ([bool]($backup.psobject.Properties.Name -contains 'CompressedBackupSize')) { [Math]::Round(($backup | Measure-Object -Property CompressedBackupSize -Sum).Sum / 1mb, 2) } else { $null } + BackupFile = $backup.FullName -Join ',' + RestoredFile = $((Split-Path $backup.FileList.PhysicalName -Leaf) | Sort-Object -Unique) -Join ',' + RestoredFileFull = ($backup.Filelist.PhysicalName -Join ',') + RestoreDirectory = $RestoreDirectory + BackupSize = if ([bool]($backup.psobject.Properties.Name -contains 'TotalSize')) { [dbasize](($backup | Measure-Object -Property TotalSize -Sum).Sum) } else { $null } + CompressedBackupSize = if ([bool]($backup.psobject.Properties.Name -contains 'CompressedBackupSize')) { [dbasize](($backup | Measure-Object -Property CompressedBackupSize -Sum).Sum) } else { $null } + Script = $script + BackupFileRaw = ($backups.Fullname) + FileRestoreTime = New-TimeSpan -Seconds ((Get-Date) - $FileRestoreStartTime).TotalSeconds + DatabaseRestoreTime = New-TimeSpan -Seconds ((Get-Date) - $DatabaseRestoreStartTime).TotalSeconds + ExitError = $ExitError + } | Select-DefaultView -Property ComputerName, InstanceName, SqlInstance, BackupFile, BackupFilesCount, BackupSize, CompressedBackupSize, Database, Owner, DatabaseRestoreTime, FileRestoreTime, NoRecovery, RestoreComplete, RestoredFile, RestoredFilesCount, Script, RestoreDirectory, WithReplace + } else { + $script + } + if ($Restore.Devices.Count -gt 0) { + $Restore.Devices.Clear() + } + Write-Message -Level Verbose -Message "Succeeded, Closing Server connection" + $server.ConnectionContext.Disconnect() + } + } + $BackupCnt++ + } + Write-Progress -id 2 -Activity "Finished" -Completed + if ($server.ConnsectionContext.exists) { + $server.ConnectionContext.Disconnect() + } + Write-Progress -id 1 -Activity "Finished" -Completed + } + } +} +Function Invoke-DbaAdvancedUpdate { + <# + .SYNOPSIS + Designed for internal use, implements parallel execution for Update-DbaInstance. + + .DESCRIPTION + Invokes an update process for a single computer and restarts it if needed + + .PARAMETER ComputerName + Target computer with SQL instance or instances. + + .PARAMETER Action + An object containing the action plan + + .PARAMETER Restart + Restart computer automatically after a successful installation of a patch and wait until it comes back online. + Using this parameter is the only way to chain-install more than 1 patch on a computer, since every single patch will require a restart of said computer. + + .PARAMETER Credential + Windows Credential with permission to log on to the remote server. + Must be specified for any remote connection if update Repository is located on a network folder. + + .PARAMETER Authentication + Chooses an authentication protocol for remote connections. + If the protocol fails to establish a connection + + Defaults: + * CredSSP when -Credential is specified - due to the fact that repository Path is usually a network share and credentials need to be passed to the remote host + to avoid the double-hop issue. + * Default when -Credential is not specified. Will likely fail if a network path is specified. + + .PARAMETER WhatIf + Shows what would happen if the command were to run. No actions are actually performed. + + .PARAMETER Confirm + Prompts you for confirmation before executing any changing operations within the command. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .EXAMPLE + PS C:\> Invoke-DbaAdvancedUpdate -ComputerName SQL1 -Action $actions + + Invokes update actions on SQL1 after restarting it. + #> + [CmdletBinding(SupportsShouldProcess)] + Param ( + [string]$ComputerName, + [object[]]$Action, + [bool]$Restart, + [ValidateSet('Default', 'Basic', 'Negotiate', 'NegotiateWithImplicitCredential', 'Credssp', 'Digest', 'Kerberos')] + [string]$Authentication = 'Credssp', + [pscredential]$Credential, + [switch]$EnableException + ) + $computer = $ComputerName + $activity = "Updating SQL Server components on $computer" + $restarted = $false + $restartParams = @{ + ComputerName = $computer + ErrorAction = 'Stop' + For = 'WinRM' + Wait = $true + Force = $true + } + if ($Credential) { + $restartParams.Credential = $Credential + } + try { + $restartNeeded = Test-PendingReboot -ComputerName $computer -Credential $Credential + } catch { + $restartNeeded = $false + Stop-Function -Message "Failed to get reboot status from $computer" -ErrorRecord $_ + } + if ($restartNeeded -and $Restart) { + # Restart the computer prior to doing anything + Write-ProgressHelper -ExcludePercent -Activity $activity -Message "Restarting computer $($computer) due to pending restart" + Write-Message -Level Verbose "Restarting computer $($computer) due to pending restart" + try { + $null = Restart-Computer @restartParams + $restarted = $true + } catch { + Stop-Function -Message "Failed to restart computer" -ErrorRecord $_ + } + } + Write-Message -Level Debug -Message "Processing $($computer) with $(($Actions | Measure-Object).Count) actions" + #foreach action passed to the script for this particular computer + foreach ($currentAction in $Action) { + $output = $currentAction + $output.Successful = $false + $output.Restarted = $restarted + ## Start the installation sequence + Write-ProgressHelper -ExcludePercent -Activity $activity -Message "Launching installation of $($currentAction.TargetLevel) KB$($currentAction.KB) ($($currentAction.Installer)) for SQL$($currentAction.MajorVersion) ($($currentAction.Build))" + $execParams = @{ + ComputerName = $computer + ErrorAction = 'Stop' + Authentication = $Authentication + } + if ($Credential) { + $execParams.Credential = $Credential + } else { + if (Test-Bound -Not Authentication) { + # Use Default authentication instead of CredSSP when Authentication is not specified and Credential is null + $execParams.Authentication = "Default" + } + } + # Find a temporary folder to extract to - the drive that has most free space + try { + $chosenDrive = (Get-DbaDiskSpace -ComputerName $computer -Credential $Credential -EnableException:$true | Sort-Object -Property Free -Descending | Select-Object -First 1).Name + if (!$chosenDrive) { + # Fall back to the system drive + $chosenDrive = Invoke-Command2 -ComputerName $computer -Credential $Credential -ScriptBlock { $env:SystemDrive } -Raw -ErrorAction Stop + } + } catch { + $msg = "Failed to retrieve a disk drive to extract the update" + $output.Notes += $msg + Stop-Function -Message $msg -ErrorRecord $_ + return $output + } + $spExtractPath = $chosenDrive.TrimEnd('\') + "\dbatools_KB$($currentAction.KB)_Extract" + $output.ExtractPath = $spExtractPath + try { + # Extract file + Write-ProgressHelper -ExcludePercent -Activity $activity -Message "Extracting $($currentAction.Installer) to $spExtractPath" + Write-Message -Level Verbose -Message "Extracting $($currentAction.Installer) to $spExtractPath" + $extractResult = Invoke-Program @execParams -Path $currentAction.Installer -ArgumentList "/x`:`"$spExtractPath`" /quiet" -Fallback + if (-not $extractResult.Successful) { + $msg = "Extraction failed with exit code $($extractResult.ExitCode)" + $output.Notes += $msg + Stop-Function -Message $msg + return $output + } + # Install the patch + if ($currentAction.InstanceName) { + $instanceClause = "/instancename=$($currentAction.InstanceName)" + } else { + $instanceClause = '/allinstances' + } + Write-ProgressHelper -ExcludePercent -Activity $activity -Message "Now installing update SQL$($currentAction.MajorVersion)$($currentAction.TargetLevel) from $spExtractPath" + Write-Message -Level Verbose -Message "Starting installation from $spExtractPath" + $updateResult = Invoke-Program @execParams -Path "$spExtractPath\setup.exe" -ArgumentList @('/quiet', $instanceClause, '/IAcceptSQLServerLicenseTerms') -WorkingDirectory $spExtractPath -Fallback + $output.ExitCode = $updateResult.ExitCode + if ($updateResult.Successful) { + $output.Successful = $true + } else { + $msg = "Update failed with exit code $($updateResult.ExitCode)" + $output.Notes += $msg + Stop-Function -Message $msg + return $output + } + $output.Log = $updateResult.stdout + } catch { + Stop-Function -Message "Upgrade failed" -ErrorRecord $_ + $output.Notes += $_.Exception.Message + return $output + } finally { + ## Cleanup temp + Write-ProgressHelper -ExcludePercent -Activity $activity -Message "Cleaning up extracted files from $spExtractPath" + try { + Write-ProgressHelper -ExcludePercent -Activity $activity -Message "Removing temporary files" + $null = Invoke-CommandWithFallBack @execParams -ScriptBlock { + if ($args[0] -like '*\dbatools_KB*_Extract' -and (Test-Path $args[0])) { + Remove-Item -Recurse -Force -LiteralPath $args[0] -ErrorAction Stop + } + } -Raw -ArgumentList $spExtractPath + } catch { + $message = "Failed to cleanup temp folder on computer $($computer)`: $($_.Exception.Message)" + Write-Message -Level Verbose -Message $message + $output.Notes += $message + } + } + #double check if restart is needed + try { + $restartNeeded = Test-PendingReboot -ComputerName $computer -Credential $Credential + } catch { + $restartNeeded = $false + Stop-Function -Message "Failed to get reboot status from $computer" -ErrorRecord $_ + } + if ($updateResult.ExitCode -eq 3010 -or $restartNeeded) { + if ($Restart) { + # Restart the computer + Write-ProgressHelper -ExcludePercent -Activity $activity -Message "Restarting computer $($computer) and waiting for it to come back online" + Write-Message -Level Verbose "Restarting computer $($computer) and waiting for it to come back online" + try { + $null = Restart-Computer @restartParams + $output.Restarted = $true + } catch { + Stop-Function -Message "Failed to restart computer" -ErrorRecord $_ + return $output + } + } else { + $output.Notes += "Restart is required for computer $($computer) to finish the installation of SQL$($currentAction.MajorVersion)$($currentAction.TargetLevel)" + } + } + $output + Write-Progress -Activity $activity -Completed + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function Invoke-DbaAgFailover { + <# + .SYNOPSIS + Failover an availability group. + + .DESCRIPTION + Failover an availability group. + + .PARAMETER SqlInstance + The SQL Server instance. Server version must be SQL Server version 2012 or higher. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential). + + .PARAMETER AvailabilityGroup + Only failover specific availability groups. + + .PARAMETER InputObject + Enables piping from Get-DbaAvailabilityGroup + + .PARAMETER WhatIf + Shows what would happen if the command were to run. No actions are actually performed. + + .PARAMETER Confirm + Prompts you for confirmation before executing any changing operations within the command. + + .PARAMETER Force + Force Failover and allow data loss + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: AG, AvailabilityGroup, HA + Author: Chrissy LeMaire (@cl), netnerds.net + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Invoke-DbaAgFailover + + .EXAMPLE + PS C:\> Invoke-DbaAgFailover -SqlInstance sql2017 -AvailabilityGroup SharePoint + + Safely (no potential data loss) fails over the SharePoint AG to sql2017. Prompts for confirmation. + + .EXAMPLE + PS C:\> Get-DbaAvailabilityGroup -SqlInstance sql2017 | Out-GridView -Passthru | Invoke-DbaAgFailover -Confirm:$false + + Safely (no potential data loss) fails over the selected availability groups to sql2017. Does not prompt for confirmation. + + .EXAMPLE + PS C:\> Invoke-DbaAgFailover -SqlInstance sql2017 -AvailabilityGroup SharePoint -Force + + Forcefully (with potential data loss) fails over the SharePoint AG to sql2017. Prompts for confirmation. + #> + [CmdletBinding(SupportsShouldProcess, ConfirmImpact = 'High')] + param ( + [parameter(Mandatory)] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [string[]]$AvailabilityGroup, + [parameter(ValueFromPipeline)] + [Microsoft.SqlServer.Management.Smo.AvailabilityGroup[]]$InputObject, + [switch]$Force, + [switch]$EnableException + ) + process { + if ($SqlInstance -and -not $AvailabilityGroup) { + Stop-Function -Message "You must specify at least one availability group when using SqlInstance." + return + } + + if ($SqlInstance) { + $InputObject += Get-DbaAvailabilityGroup -SqlInstance $SqlInstance -SqlCredential $SqlCredential -AvailabilityGroup $AvailabilityGroup + } + + foreach ($ag in $InputObject) { + try { + $server = $ag.Parent + if ($Force) { + if ($Pscmdlet.ShouldProcess($server.Name, "Forcefully failing over $($ag.Name), allowing potential data loss")) { + $ag.FailoverWithPotentialDataLoss() + $ag.Refresh() + $ag + } + } else { + if ($Pscmdlet.ShouldProcess($server.Name, "Gracefully failing over $($ag.Name)")) { + $ag.Failover() + $ag.Refresh() + $ag + } + } + } catch { + Stop-Function -Continue -Message "Failure" -ErrorRecord $_ + } + } + } +} +function Invoke-DbaBalanceDataFiles { + <# + .SYNOPSIS + Re-balance data between data files + + .DESCRIPTION + When you have a large database with a single data file and add another file, SQL Server will only use the new file until it's about the same size. + You may want to balance the data between all the data files. + + The function will check the server version and edition to see if the it allows for online index rebuilds. + If the server does support it, it will try to rebuild the index online. + If the server doesn't support it, it will rebuild the index offline. Be carefull though, this can cause downtime + + The tables must have a clustered index to be able to balance out the data. + The function does NOT yet support heaps. + + The function will also check if the file groups are subject to balance out. + A file group whould have at least have 2 data files and should be writable. + If a table is within such a file group it will be subject for processing. If not the table will be skipped. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Database + The database(s) to process. + + .PARAMETER Table + The tables(s) of the database to process. If unspecified, all tables will be processed. + + .PARAMETER RebuildOffline + Will set all the indexes to rebuild offline. + This option is also needed when the server version is below 2005. + + .PARAMETER WhatIf + Shows what would happen if the command were to run + + .PARAMETER Confirm + Prompts for confirmation of every step. For example: + + The server does not support online rebuilds of indexes. + Do you want to rebuild the indexes offline? + [Y] Yes [N] No [?] Help (default is "Y"): + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .PARAMETER Force + This will disable the check for enough disk space for the action to be successful. + Use this with caution!! + + .NOTES + Tags: Database, FileManagement, File, Space + Author: Sander Stad (@sqlstad), sqlstad.nl + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .EXAMPLE + PS C:\> Invoke-DbaBalanceDataFiles -SqlInstance sql1 -Database db1 + + This command will distribute the data in database db1 on instance sql1 + + .EXAMPLE + PS C:\> Invoke-DbaBalanceDataFiles -SqlInstance sql1 -Database db1 | Select-Object -ExpandProperty DataFilesEnd + + This command will distribute the data in database db1 on instance sql1 + + .EXAMPLE + PS C:\> Invoke-DbaBalanceDataFiles -SqlInstance sql1 -Database db1 -Table table1,table2,table5 + + This command will distribute the data for only the tables table1,table2 and table5 + + .EXAMPLE + PS C:\> Invoke-DbaBalanceDataFiles -SqlInstance sql1 -Database db1 -RebuildOffline + + This command will consider the fact that there might be a SQL Server edition that does not support online rebuilds of indexes. + By supplying this parameter you give permission to do the rebuilds offline if the edition does not support it. + + #> + [CmdletBinding(DefaultParameterSetName = "Default", SupportsShouldProcess)] + [Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSUseSingularNouns", "", Justification = "Singular Noun doesn't make sense")] + param ( + [parameter(ParameterSetName = "Pipe", Mandatory)] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [Alias("Databases")] + [object[]]$Database, + [Alias("Tables")] + [object[]]$Table, + [switch]$RebuildOffline, + [switch]$EnableException, + [switch]$Force + ) + + process { + + Write-Message -Message "Starting balancing out data files" -Level Verbose + + # Set the initial success flag + [bool]$success = $true + + foreach ($instance in $sqlinstance) { + # Try connecting to the instance + try { + $Server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + # Check the database parameter + if ($Database) { + if ($Database -notin $server.Databases.Name) { + Stop-Function -Message "One or more databases cannot be found on instance on instance $instance" -Target $instance -Continue + } + + $DatabaseCollection = $server.Databases | Where-Object { $_.Name -in $Database } + } else { + Stop-Function -Message "Please supply a database to balance out" -Target $instance -Continue + } + + # Get the server version + $serverVersion = $server.Version.Major + + # Check edition of the sql instance + if ($RebuildOffline) { + Write-Message -Message "Continuing with offline rebuild." -Level Verbose + } elseif (-not $RebuildOffline -and ($serverVersion -lt 9 -or (([string]$Server.Edition -notmatch "Developer") -and ($Server.Edition -notmatch "Enterprise")))) { + # Set up the confirm part + $message = "The server does not support online rebuilds of indexes. `nDo you want to rebuild the indexes offline?" + $choiceYes = New-Object System.Management.Automation.Host.ChoiceDescription "&Yes", "Answer Yes." + $choiceNo = New-Object System.Management.Automation.Host.ChoiceDescription "&No", "Answer No." + $options = [System.Management.Automation.Host.ChoiceDescription[]]($choiceYes, $choiceNo) + $result = $host.ui.PromptForChoice($title, $message, $options, 0) + + # Check the result from the confirm + switch ($result) { + # If yes + 0 { + # Set the option to generate a full backup + Write-Message -Message "Continuing with offline rebuild." -Level Verbose + + [bool]$supportOnlineRebuild = $false + } + 1 { + Stop-Function -Message "You chose to not allow offline rebuilds of indexes. Use -RebuildOffline" -Target $instance + return + } + } # switch + } elseif ($serverVersion -ge 9 -and (([string]$Server.Edition -like "Developer*") -or ($Server.Edition -like "Enterprise*"))) { + [bool]$supportOnlineRebuild = $true + } + + # Loop through each of the databases + foreach ($db in $DatabaseCollection) { + $dataFilesStarting = Get-DbaDbFile -SqlInstance $server -Database $db.Name | Where-Object { $_.TypeDescription -eq 'ROWS' } | Select-Object ID, LogicalName, PhysicalName, Size, UsedSpace, AvailableSpace | Sort-Object ID + + if (-not $Force) { + # Check the amount of disk space available + $query = "SELECT SUBSTRING(physical_name, 0, 4) AS 'Drive' , + SUM(( size * 8 ) / 1024) AS 'SizeMB' + FROM sys.master_files + WHERE DB_NAME(database_id) = '$($db.Name)' + GROUP BY SUBSTRING(physical_name, 0, 4)" + # Execute the query + $dbDiskUsage = $Server.Query($query) + + # Get the free space for each drive + $result = $Server.Query("xp_fixeddrives") + $MbFreeColName = $result[0].psobject.Properties.Name[1] + $diskFreeSpace = $result | Select-Object Drive, @{ Name = 'FreeMB'; Expression = { $_.$MbFreeColName } } + + # Loop through each of the drives to see if the size of files on that + # particular disk do not exceed the free space of that disk + foreach ($d in $dbDiskUsage) { + $freeSpace = $diskFreeSpace | Where-Object { $_.Drive -eq $d.Drive.Trim(':\') } | Select-Object FreeMB + if ($d.SizeMB -gt $freeSpace.FreeMB) { + # Set the success flag + $success = $false + + Stop-Function -Message "The available space may not be sufficient to continue the process. Please use -Force to try anyway." -Target $instance -Continue + return + } + } + } + + # Create the start time + $start = Get-Date + + # Check if the function needs to continue + if ($success) { + + # Get the database files before all the alterations + Write-Message -Message "Retrieving data files before data move" -Level Verbose + Write-Message -Message "Processing database $db" -Level Verbose + + # Check the datafiles of the database + $dataFiles = Get-DbaDbFile -SqlInstance $instance -Database $db | Where-Object { $_.TypeDescription -eq 'ROWS' } + if ($dataFiles.Count -eq 1) { + # Set the success flag + $success = $false + + Stop-Function -Message "Database $db only has one data file. Please add a data file to balance out the data" -Target $instance -Continue + } + + # Check the tables parameter + if ($Table) { + if ($Table -notin $db.Table) { + # Set the success flag + $success = $false + + Stop-Function -Message "One or more tables cannot be found in database $db on instance $instance" -Target $instance -Continue + } + + $TableCollection = $db.Tables | Where-Object { $_.Name -in $Table } + } else { + $TableCollection = $db.Tables + } + + # Get the database file groups and check the aount of data files + Write-Message -Message "Retrieving file groups" -Level Verbose + $fileGroups = $Server.Databases[$db.Name].FileGroups + + # ARray to hold the file groups with properties + $balanceableTables = @() + + # Loop through each of the file groups + + foreach ($fg in $fileGroups) { + + # If there is less than 2 files balancing out data is not possible + if (($fg.Files.Count -ge 2) -and ($fg.Readonly -eq $false)) { + $balanceableTables += $fg.EnumObjects() | Where-Object { $_.GetType().Name -eq 'Table' } + } + } + + $unsuccessfulTables = @() + + # Loop through each of the tables + foreach ($tbl in $TableCollection) { + + # Chck if the table balanceable + if ($tbl.Name -in $balanceableTables.Name) { + + Write-Message -Message "Processing table $tbl" -Level Verbose + + # Chck the tables and get the clustered indexes + if ($TableCollection.Indexes.Count -lt 1) { + # Set the success flag + $success = $false + + Stop-Function -Message "Table $tbl does not contain any indexes" -Target $instance -Continue + } else { + + # Get all the clustered indexes for the table + $clusteredIndexes = $TableCollection.Indexes | Where-Object { $_.IndexType -eq 'ClusteredIndex' } + + if ($clusteredIndexes.Count -lt 1) { + # Set the success flag + $success = $false + + Stop-Function -Message "No clustered indexes found in table $tbl" -Target $instance -Continue + } + } + + # Loop through each of the clustered indexes and rebuild them + Write-Message -Message "$($clusteredIndexes.Count) clustered index(es) found for table $tbl" -Level Verbose + if ($PSCmdlet.ShouldProcess("Rebuilding indexes to balance data")) { + foreach ($ci in $clusteredIndexes) { + + Write-Message -Message "Rebuilding index $($ci.Name)" -Level Verbose + + # Get the original index operation + [bool]$originalIndexOperation = $ci.OnlineIndexOperation + + # Set the rebuild option to be either offline or online + if ($RebuildOffline) { + $ci.OnlineIndexOperation = $false + } elseif ($serverVersion -ge 9 -and $supportOnlineRebuild -and -not $RebuildOffline) { + Write-Message -Message "Setting the index operation for index $($ci.Name) to online" -Level Verbose + $ci.OnlineIndexOperation = $true + } + + # Rebuild the index + try { + Write-Message -Message "Rebuilding index $($ci.Name)" -Level Verbose + $ci.Rebuild() + + # Set the success flag + $success = $true + } catch { + # Set the original index operation back for the index + $ci.OnlineIndexOperation = $originalIndexOperation + + # Set the success flag + $success = $false + + Stop-Function -Message "Something went wrong rebuilding index $($ci.Name). `n$($_.Exception.Message)" -ErrorRecord $_ -Target $instance -Continue + } + + # Set the original index operation back for the index + Write-Message -Message "Setting the index operation for index $($ci.Name) back to the original value" -Level Verbose + $ci.OnlineIndexOperation = $originalIndexOperation + + } # foreach index + + } # if process + + } # if table is balanceable + else { + # Add the table to the unsuccessful array + $unsuccessfulTables += $tbl.Name + + # Set the success flag + $success = $false + + Write-Message -Message "Table $tbl cannot be balanced out" -Level Verbose + } + + } #foreach table + } + + # Create the end time + $end = Get-Date + + # Create the time span + $timespan = New-TimeSpan -Start $start -End $end + $ts = [timespan]::fromseconds($timespan.TotalSeconds) + $elapsed = "{0:HH:mm:ss}" -f ([datetime]$ts.Ticks) + + # Get the database files after all the alterations + Write-Message -Message "Retrieving data files after data move" -Level Verbose + $dataFilesEnding = Get-DbaDbFile -SqlInstance $server -Database $db.Name | Where-Object { $_.TypeDescription -eq 'ROWS' } | Select-Object ID, LogicalName, PhysicalName, Size, UsedSpace, AvailableSpace | Sort-Object ID + + [pscustomobject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + Database = $db.Name + Start = $start + End = $end + Elapsed = $elapsed + Success = $success + Unsuccessful = $unsuccessfulTables -join "," + DataFilesStart = $dataFilesStarting + DataFilesEnd = $dataFilesEnding + } + + } # foreach database + + } # end process + } +} +function Invoke-DbaCycleErrorLog { + <# + .SYNOPSIS + Cycles the current instance or agent log. + + .DESCRIPTION + Cycles the current error log for the instance (SQL Server) and/or SQL Server Agent. + + .PARAMETER SqlInstance + The target SQL Server instance or instances.You must have sysadmin access and server version must be SQL Server version 2000 or higher. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Type + The log to cycle. + Accepts: instance or agent. + + .PARAMETER WhatIf + If this switch is enabled, no actions are performed but informational messages will be displayed that explain what would happen if the command were to run. + + .PARAMETER Confirm + If this switch is enabled, you will be prompted for confirmation before executing any operations that change state. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Log, Cycle + Author: Shawn Melton (@wsmelton), https://wsmelton.github.io + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Invoke-DbaCycleLog + + .EXAMPLE + PS C:\> Invoke-DbaCycleLog -SqlInstance sql2016 -Type agent + + Cycles the current error log for the SQL Server Agent on SQL Server instance sql2016 + + .EXAMPLE + PS C:\> Invoke-DbaCycleLog -SqlInstance sql2016 -Type instance + + Cycles the current error log for the SQL Server instance on SQL Server instance sql2016 + + .EXAMPLE + PS C:\> Invoke-DbaCycleLog -SqlInstance sql2016 + + Cycles the current error log for both SQL Server instance and SQL Server Agent on SQL Server instance sql2016 + + #> + [CmdletBinding(SupportsShouldProcess, ConfirmImpact = 'Low')] + param ( + [parameter(Mandatory, ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [Alias("Credential")] + [PSCredential]$SqlCredential, + [ValidateSet('instance', 'agent')] + [string]$Type, + [Alias('Silent')] + [switch]$EnableException + ) + + begin { + if (Test-Bound 'Type') { + if ($Type -notin 'instance', 'agent') { + Stop-Function -Message "The type provided [$Type] for $SqlInstance is not an accepted value. Please use 'Instance' or 'Agent'" + return + } + } + $logToCycle = @() + switch ($Type) { + 'agent' { + $sql = "EXEC msdb.dbo.sp_cycle_agent_errorlog;" + $logToCycle = $Type + } + 'instance' { + $sql = "EXEC master.dbo.sp_cycle_errorlog;" + $logToCycle = $Type + } + default { + $sql = " + EXEC master.dbo.sp_cycle_errorlog; + EXEC msdb.dbo.sp_cycle_agent_errorlog;" + $logToCycle = 'instance', 'agent' + } + } + + } + process { + if (Test-FunctionInterrupt) { return } + + foreach ($instance in $SqlInstance) { + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential -MinimumVersion 9 + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + try { + $logs = $logToCycle -join ',' + if ($Pscmdlet.ShouldProcess($server, "Cycle the log(s): $logs")) { + $null = $server.Query($sql) + [pscustomobject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + LogType = $logToCycle + IsSuccessful = $true + Notes = $null + } + } + } catch { + [pscustomobject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + LogType = $logToCycle + IsSuccessful = $false + Notes = $_.Exception + } + Stop-Function -Message "Issue cycling $logs on $server" -Target $server -ErrorRecord $_ -Exception $_.Exception -Continue + } + } + } +} +function Invoke-DbaDbccDropCleanBuffer { + <# + .SYNOPSIS + Execution of Database Console Command DBCC DROPCLEANBUFFERS + + .DESCRIPTION + Allows execution of Database Console Command DBCC DROPCLEANBUFFERS + + Removes all clean buffers from the buffer pool, and columnstore objects from the columnstore object pool. + + Read more: + - https://docs.microsoft.com/en-us/sql/t-sql/database-console-commands/dbcc-dropcleanbuffers-transact-sql + + .PARAMETER SqlInstance + The target SQL Server instance or instances. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER NoInformationalMessages + Suppresses all informational messages. + + .PARAMETER WhatIf + Shows what would happen if the cmdlet runs. The cmdlet is not run. + + .PARAMETER Confirm + Prompts you for confirmation before running the cmdlet. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: DBCC + Author: Patrick Flynn (@sqllensman) + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Invoke-DbaDbccDropCleanBuffer + + .EXAMPLE + PS C:\> Invoke-DbaDbccDropCleanBuffer -SqlInstance SqlServer2017 + + Runs the command DBCC DROPCLEANBUFFERS against the instance SqlServer2017 using Windows Authentication + + .EXAMPLE + PS C:\> Invoke-DbaDbccDropCleanBuffer -SqlInstance SqlServer2017 -NoInformationalMessages + + Runs the command DBCC DROPCLEANBUFFERS WITH NO_INFOMSGS against the instance SqlServer2017 using Windows Authentication + + .EXAMPLE + PS C:\> 'Sql1','Sql2/sqlexpress' | Invoke-DbaDbccDropCleanBuffer -WhatIf + + Displays what will happen if command DBCC DROPCLEANBUFFERS is called against Sql1 and Sql2/sqlexpress + + .EXAMPLE + PS C:\> $cred = Get-Credential sqladmin + PS C:\> Invoke-DbaDbccDropCleanBuffer -SqlInstance Server1 -SqlCredential $cred + + Connects using sqladmin credential and executes command DBCC DROPCLEANBUFFERS for instance Server1 + + #> + [CmdletBinding(SupportsShouldProcess, ConfirmImpact = 'High')] + param ( + [parameter(Mandatory, ValueFromPipeline)] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [switch]$NoInformationalMessages, + [switch]$EnableException + ) + begin { + + $stringBuilder = New-Object System.Text.StringBuilder + $null = $stringBuilder.Append("DBCC DROPCLEANBUFFERS") + if (Test-Bound -ParameterName NoInformationalMessages) { + $null = $stringBuilder.Append(" WITH NO_INFOMSGS") + } + } + process { + $query = $StringBuilder.ToString() + + foreach ($instance in $SqlInstance) { + Write-Message -Message "Attempting Connection to $instance" -Level Verbose + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + try { + if ($Pscmdlet.ShouldProcess($server.Name, "Execute the command $query against $instance")) { + Write-Message -Message "Query to run: $query" -Level Verbose + $results = $server | Invoke-DbaQuery -Query $query -MessagesToOutput + } + } catch { + Stop-Function -Message "Failure running DBCC DROPCLEANBUFFERS" -ErrorRecord $_ -Target $server -Continue + } + If ($Pscmdlet.ShouldProcess("console", "Outputting object")) { + [PSCustomObject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + Cmd = $query.ToString() + Output = $results + } + } + } + } +} +function Invoke-DbaDbccFreeCache { + <# + .SYNOPSIS + Execution of Database Console Commands that clear Server level Memory caches + + .DESCRIPTION + Allows execution of Database Console Commands that act at Server Level to clear Memory caches + + Allows execution of the following commands + DBCC FREEPROCCACHE + DBCC FREESESSIONCACHE + DBCC FREESYSTEMCACHE + + Read more: + - https://docs.microsoft.com/en-us/sql/t-sql/database-console-commands/dbcc-freeproccache-transact-sql + - https://docs.microsoft.com/en-us/sql/t-sql/database-console-commands/dbcc-freesessioncache-transact-sql + - https://docs.microsoft.com/en-us/sql/t-sql/database-console-commands/dbcc-freesystemcache-transact-sql + + .PARAMETER SqlInstance + The target SQL Server instance or instances. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Operation + DBCC Operation to Perform - Supports specific set of operations + + .PARAMETER InputValue + Value used for Operation - meaning depends on Operation + DBCC FREEPROCCACHE accepts + a plan_handle of type varbinary(64) + a sql_handle of type varbinary(64) + or the name of a Resource Governor resource pool of type sysname + If blank then clears all elements from the plan cache + DBCC FREESYSTEMCACHE accepts + 'ALL' for ALL specifies all supported caches + or name of a Resource Governor pool cache + Not required for other values + + .PARAMETER NoInformationalMessages + Suppresses all informational messages. + + .PARAMETER MarkInUseForRemoval + Used when Operation = DBCC FREESYSTEMCACHE + Asynchronously frees currently used entries from their respective caches after they become unused + + .PARAMETER WhatIf + Shows what would happen if the cmdlet runs. The cmdlet is not run. + + .PARAMETER Confirm + Prompts you for confirmation before running the cmdlet. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: DBCC + Author: Patrick Flynn (@sqllensman) + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Invoke-DbaDbccFreeCache + + .EXAMPLE + PS C:\> Invoke-DbaDbccFreeCache -SqlInstance SqlServer2017 -Operation FREEPROCCACHE + + Runs the command DBCC FREEPROCCACHE against the instance SqlServer2017 using Windows Authentication + + .EXAMPLE + PS C:\> Invoke-DbaDbccFreeCache -SqlInstance SqlServer2017 -Operation FREESESSIONCACHE -NoInformationalMessages + + Runs the command DBCC FREESESSIONCACHE WITH NO_INFOMSGS against the instance SqlServer2017 using Windows Authentication + + .EXAMPLE + PS C:\> Invoke-DbaDbccFreeCache -SqlInstance SqlServer2017 -Operation FREESYSTEMCACHE -NoInformationalMessages + + Runs the command DBCC FREESYSTEMCACHE WITH NO_INFOMSGS against the instance SqlServer2017 using Windows Authentication + + .EXAMPLE + PS C:\> Invoke-DbaDbccFreeCache -SqlInstance SqlServer2017 -Operation FREEPROCCACHE -InputValue 0x060006001ECA270EC0215D05000000000000000000000000 + + Remove a specific plan with plan_handle 0x060006001ECA270EC0215D05000000000000000000000000 from the cache via the command DBCC FREEPROCCACHE(0x060006001ECA270EC0215D05000000000000000000000000) against the instance SqlServer2017 using Windows Authentication + + .EXAMPLE + PS C:\> Invoke-DbaDbccFreeCache -SqlInstance SqlServer2017 -Operation FREEPROCCACHE -InputValue default + + Runs the command DBCC FREEPROCCACHE('default') against the instance SqlServer2017 using Windows Authentication. This clears all cache entries associated with a resource pool 'default'. + + .EXAMPLE + PS C:\> Invoke-DbaDbccFreeCache -SqlInstance SqlServer2017 -Operation FREESYSTEMCACHE -InputValue default + + Runs the command DBCC FREESYSTEMCACHE ('ALL', default) against the instance SqlServer2017 using Windows Authentication. This will clean all the caches with entries specific to the resource pool named "default". + + .EXAMPLE + PS C:\> Invoke-DbaDbccFreeCache -SqlInstance SqlServer2017 -Operation FREESYSTEMCACHE -InputValue default -MarkInUseForRemoval + + Runs the command DBCC FREESYSTEMCACHE ('ALL', default) WITH MARK_IN_USE_FOR_REMOVAL against the instance SqlServer2017 using Windows Authentication. This will to release entries once the entries become unused for all the caches with entries specific to the resource pool named "default". + + #> + [CmdletBinding(DefaultParameterSetName = "Default", SupportsShouldProcess, ConfirmImpact = 'High')] + param ( + [parameter(Mandatory, ValueFromPipeline)] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [ValidateSet('FreeProcCache', 'FreeSessionCache', 'FreeSystemCache')] + [string]$Operation = "FreeProcCache", + [string]$InputValue, + [switch]$NoInformationalMessages, + [switch]$MarkInUseForRemoval, + [switch]$EnableException + ) + begin { + + if (Test-Bound -ParameterName Operation) { + $Operation = $Operation.ToUpper() + } else { + Write-Message -Level Warning -Message "You must specify an operation " + continue + } + + $stringBuilder = New-Object System.Text.StringBuilder + if ($Operation -eq 'FREESESSIONCACHE') { + $null = $stringBuilder.Append("DBCC $Operation") + if (Test-Bound -ParameterName NoInformationalMessages) { + $null = $stringBuilder.Append(" WITH NO_INFOMSGS") + } + } + if ($Operation -eq 'FREEPROCCACHE') { + if (Test-Bound -ParameterName InputValue) { + if ($InputValue.StartsWith('0x')) { + $null = $stringBuilder.Append("DBCC $Operation($InputValue)") + } else { + $null = $stringBuilder.Append("DBCC $Operation('$InputValue')") + } + if (Test-Bound -ParameterName NoInformationalMessages) { + $null = $stringBuilder.Append(" WITH NO_INFOMSGS") + } + } else { + $null = $stringBuilder.Append("DBCC $Operation") + if (Test-Bound -ParameterName NoInformationalMessages) { + $null = $stringBuilder.Append(" WITH NO_INFOMSGS") + } + } + } + if ($Operation -eq 'FREESYSTEMCACHE') { + if (Test-Bound -ParameterName InputValue) { + $null = $stringBuilder.Append("DBCC FREESYSTEMCACHE('ALL', $InputValue)") + } else { + $null = $stringBuilder.Append("DBCC FREESYSTEMCACHE('ALL')") + } + if (Test-Bound -ParameterName NoInformationalMessages) { + if (Test-Bound -ParameterName MarkInUseForRemoval) { + $null = $stringBuilder.Append(" WITH NO_INFOMSGS, MARK_IN_USE_FOR_REMOVAL") + } else { + $null = $stringBuilder.Append(" WITH NO_INFOMSGS") + } + } elseif (Test-Bound -ParameterName MarkInUseForRemoval) { + $null = $stringBuilder.Append(" WITH MARK_IN_USE_FOR_REMOVAL") + } + } + } + process { + $query = $StringBuilder.ToString() + + foreach ($instance in $SqlInstance) { + Write-Message -Message "Attempting Connection to $instance" -Level Verbose + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + try { + if ($Pscmdlet.ShouldProcess($server.Name, "Execute the command $query against $instance")) { + Write-Message -Message "Query to run: $query" -Level Verbose + $results = $server | Invoke-DbaQuery -Query $query -MessagesToOutput + } + } catch { + Stop-Function -Message "Failure" -ErrorRecord $_ -Target $server -Continue + } + if ($Pscmdlet.ShouldProcess("console", "Outputting object")) { + [PSCustomObject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + Operation = $Operation + Cmd = $query.ToString() + Output = $results + } + } + } + } +} +function Invoke-DbaDbClone { + <# + .SYNOPSIS + Clones a database schema and statistics + + .DESCRIPTION + Clones a database schema and statistics. + + This can be useful for testing query performance without requiring all the space needed for the data in the database. + + Read more: + - https://sqlperformance.com/2016/08/sql-statistics/expanding-dbcc-clonedatabase + - https://support.microsoft.com/en-us/help/3177838/how-to-use-dbcc-clonedatabase-to-generate-a-schema-and-statistics-only + + Thanks to Microsoft Tiger Team for the code and idea https://github.com/Microsoft/tigertoolbox/ + + .PARAMETER SqlInstance + The target SQL Server instance or instances. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Database + The database to clone - this list is auto-populated from the server. + + .PARAMETER InputObject + Enables piping from Get-DbaDatabase + + .PARAMETER CloneDatabase + The name(s) to clone to. + + .PARAMETER ExcludeStatistics + Exclude the statistics in the cloned database + + .PARAMETER ExcludeQueryStore + Exclude the QueryStore data in the cloned database + + .PARAMETER UpdateStatistics + Update the statistics prior to cloning (per Microsoft Tiger Team formula) + + .PARAMETER WhatIf + Shows what would happen if the command were to run. No actions are actually performed. + + .PARAMETER Confirm + Prompts you for confirmation before executing any changing operations within the command. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Statistics, Performance, Clone + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Invoke-DbaDbClone + + .EXAMPLE + PS C:\> Invoke-DbaDbClone -SqlInstance sql2016 -Database mydb -CloneDatabase myclone + + Clones mydb to myclone on sql2016 + + .EXAMPLE + PS C:\> Get-DbaDatabase -SqlInstance sql2016 -Database mydb | Invoke-DbaDbClone -CloneDatabase myclone, myclone2 -UpdateStatistics + + Updates the statistics of mydb then clones to myclone and myclone2 + +#> + [CmdletBinding(SupportsShouldProcess, ConfirmImpact = 'Medium')] + param ( + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [string[]]$Database, + [parameter(ValueFromPipeline)] + [Microsoft.SqlServer.Management.Smo.Database[]]$InputObject, + [string[]]$CloneDatabase, + [switch]$ExcludeStatistics, + [switch]$ExcludeQueryStore, + [switch]$UpdateStatistics, + [switch]$EnableException + ) + + begin { + if (-not $Database -and $SqlInstance) { + Stop-Function -Message "You must specify a database name if you did not pipe a database" + } + + $sqlStats = "DECLARE @out TABLE(id INT IDENTITY(1,1), s SYSNAME, o SYSNAME, i SYSNAME, stats_stream VARBINARY(MAX), rows BIGINT, pages BIGINT) + DECLARE @dbcc TABLE(stats_stream VARBINARY(MAX), rows BIGINT, pages BIGINT) + DECLARE c CURSOR FOR + SELECT OBJECT_SCHEMA_NAME(object_id) s, OBJECT_NAME(object_id) o, name i + FROM sys.indexes + WHERE type_desc IN ('CLUSTERED COLUMNSTORE', 'NONCLUSTERED COLUMNSTORE') + DECLARE @s SYSNAME, @o SYSNAME, @i SYSNAME + OPEN c + FETCH NEXT FROM c INTO @s, @o, @i + WHILE @@FETCH_STATUS = 0 + BEGIN + DECLARE @showStats NVARCHAR(MAX) = N'DBCC SHOW_STATISTICS(""' + QUOTENAME(@s) + '.' + QUOTENAME(@o) + '"", ' + QUOTENAME(@i) + ') WITH stats_stream' + INSERT @dbcc EXEC sp_executesql @showStats + INSERT @out SELECT @s, @o, @i, stats_stream, rows, pages FROM @dbcc + DELETE @dbcc + FETCH NEXT FROM c INTO @s, @o, @i + END + CLOSE c + DEALLOCATE c + + DECLARE @sql NVARCHAR(MAX); + DECLARE @id INT; + SELECT TOP 1 @id=id,@sql= + 'UPDATE STATISTICS ' + QUOTENAME(s) + '.' + QUOTENAME(o) + '(' + QUOTENAME(i) + + ') WITH stats_stream = ' + CONVERT(NVARCHAR(MAX), stats_stream, 1) + + ', rowcount = ' + CONVERT(NVARCHAR(MAX), rows) + ', pagecount = ' + CONVERT(NVARCHAR(MAX), pages) + FROM @out + + WHILE (@@ROWCOUNT <> 0) + BEGIN + EXEC sp_executesql @sql + DELETE @out WHERE id = @id + SELECT TOP 1 @id=id,@sql= + 'UPDATE STATISTICS ' + QUOTENAME(s) + '.' + QUOTENAME(o) + '(' + QUOTENAME(i) + + ') WITH stats_stream = ' + CONVERT(NVARCHAR(MAX), stats_stream, 1) + + ', rowcount = ' + CONVERT(NVARCHAR(MAX), rows) + ', pagecount = ' + CONVERT(NVARCHAR(MAX), pages) + FROM @out + END + " + + $noStats = "NO_STATISTICS" + $noQueryStore = "NO_QUERYSTORE" + if ( (Test-Bound -ParameterName 'ExcludeStatistics') -or (Test-Bound -ParameterName 'ExcludeQueryStore') ) { + $sqlWith = "" + if ($ExcludeStatistics) { + $sqlWith = "WITH $noStats" + } + if ($ExcludeQueryStore) { + $sqlWith = "WITH $noQueryStore" + } + if ($ExcludeStatistics -and $ExcludeQueryStore) { + $sqlWith = "WITH $noStats,$noQueryStore" + } + } + + $sql2012min = [version]"11.0.7001.0" # SQL 2012 SP4 + $sql2014min = [version]"12.0.5000.0" # SQL 2014 SP2 + $sql2014CuMin = [version]"12.0.5538" # SQL 2014 SP2 + CU3 + $sql2016min = [version]"13.0.4001.0" # SQL 2016 SP1 + } + process { + if (Test-FunctionInterrupt) { return } + + if ($SqlInstance) { + $InputObject += Get-DbaDatabase -SqlInstance $SqlInstance -SqlCredential $SqlCredential -Database $Database + } + + foreach ($db in $InputObject) { + $server = $db.Parent + $instance = $server.Name + + if (-not (Test-Bound -ParameterName CloneDatabase)) { + $CloneDatabase = "$($db.Name)_clone" + } + + if ($server.VersionMajor -eq 11 -and $server.Version -lt $sql2012min) { + Stop-Function -Message "Unsupported version for $instance. SQL Server 2012 SP4 and above required." -Target $server -Continue + } + + if ($server.VersionMajor -eq 12 -and $server.Version -lt $sql2014min) { + Stop-Function -Message "Unsupported version for $instance. SQL Server 2014 SP2 and above required." -Target $server -Continue + } + + if ($server.VersionMajor -eq 13 -and $server.Version -lt $sql2016min) { + Stop-Function -Message "Unsupported version for $instance. SQL Server 2016 SP1 and above required." -Target $server -Continue + } + + if (Test-Bound -ParameterName 'ExcludeStatistics') { + if ($server.VersionMajor -eq 12 -and $server.Version -lt $sql2014CuMin) { + Stop-Function -Message "Unsupported version for $instance. SQL Server 2014 SP1 + CU3 and above required." -Target $server -Continue + } + if ($server.VersionMajor -eq 13 -and $server.Version -lt $sql2016min) { + Stop-Function -Message "Unsupported version for $instance. SQL Server 2016 SP1 and above required." -Target $server -Continue + } + } + + if (Test-Bound -ParameterName 'ExcludeQueryStore') { + if ($server.VersionMajor -lt 13 - ($server.VersionMajor -eq 13 -and $server.Version -lt $sql2016min)) { + Stop-Function -Message "Unsupported version for $instance. SQL Server 2016 SP1 and above required." -Target $server -Continue + } + } + + if ($db.IsSystemObject) { + Stop-Function -Message "Only user databases are supported" -Target $instance -Continue + } + + if ( (Test-Bound -ParameterName 'UpdateStatistics') -and (Test-Bound -ParameterName 'ExcludeStatistics' -Not) ) { + if ($Pscmdlet.ShouldProcess($instance, "Update statistics in $($db.Name)")) { + try { + Write-Message -Level Verbose -Message "Updating statistics" + $null = $db.Query($sqlStats) + } catch { + Stop-Function -Message "Failure" -ErrorRecord $_ -Target $server -Continue + } + } + } + + $dbName = $db.Name + + foreach ($clonedb in $CloneDatabase) { + Write-Message -Level Verbose -Message "Cloning $clonedb from $db" + if ($server.Databases[$clonedb]) { + Stop-Function -Message "Destination clone database $clonedb already exists" -Target $instance -Continue + } else { + if ($Pscmdlet.ShouldProcess($instance, "Execute DBCC CloneDatabase($dbName, $clonedb)")) { + try { + $sql = "DBCC CLONEDATABASE('$dbName','$clonedb') $sqlWith" + Write-Message -Level Debug -Message "Sql Statement: $sql" + $null = $db.Query($sql) + $server.Databases.Refresh() + Get-DbaDatabase -SqlInstance $server -Database $clonedb + } catch { + Stop-Function -Message "Failure" -ErrorRecord $_ -Target $server -Continue + } + } + } + } + } + } + end { + Test-DbaDeprecation -DeprecatedOn "1.0.0" -EnableException:$false -Alias Invoke-DbaDatabaseClone + } +} +function Invoke-DbaDbDataMasking { + <# + .SYNOPSIS + Masks data by using randomized values determined by a configuration file and a randomizer framework + + .DESCRIPTION + TMasks data by using randomized values determined by a configuration file and a randomizer framework + + It will use a configuration file that can be made manually or generated using New-DbaDbMaskingConfig + + Note that the following column and data types are not currently supported: + Identity + ForeignKey + Computed + Hierarchyid + Geography + Geometry + Xml + + .PARAMETER SqlInstance + The target SQL Server instance or instances. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Database + Databases to process through + + .PARAMETER Table + Tables to process. By default all the tables will be processed + + .PARAMETER Column + Columns to process. By default all the columns will be processed + + .PARAMETER FilePath + Configuration file that contains the which tables and columns need to be masked + + .PARAMETER Query + If you would like to mask only a subset of a table, use the Query parameter, otherwise all data will be masked. + + .PARAMETER Locale + Set the local to enable certain settings in the masking + + .PARAMETER CharacterString + The characters to use in string data. 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789' by default + + .PARAMETER ExcludeTable + Exclude specific tables even if it's listed in the config file. + + .PARAMETER ExcludeColumn + Exclude specific columns even if it's listed in the config file. + + .PARAMETER MaxValue + Force a max length of strings instead of relying on datatype maxes. Note if a string datatype has a lower MaxValue, that will be used instead. + + Useful for adhoc updates and testing, otherwise, the config file should be used. + + .PARAMETER ModulusFactor + Calculating the next nullable by using the remainder from the modulus. Default is every 10. + + .PARAMETER ExactLength + Mask string values to the same length. So 'Tate' will be replaced with 4 random characters. + + .PARAMETER Force + Forcefully execute commands when needed + + .PARAMETER WhatIf + If this switch is enabled, no actions are performed but informational messages will be displayed that explain what would happen if the command were to run. + + .PARAMETER Confirm + If this switch is enabled, you will be prompted for confirmation before executing any operations that change state. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: DataMasking, Database + Author: Sander Stad (@sqlstad, sqlstad.nl) | Chrissy LeMaire (@cl, netnerds.net) + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Invoke-DbaDbDataMasking + + .EXAMPLE + Invoke-DbaDbDataMasking -SqlInstance SQLDB2 -Database DB1 -FilePath C:\Temp\sqldb1.db1.tables.json + + Apply the data masking configuration from the file "sqldb1.db1.tables.json" to the db1 database on sqldb2. Prompt for confirmation for each table. + + .EXAMPLE + Get-ChildItem -Path C:\Temp\sqldb1.db1.tables.json | Invoke-DbaDbDataMasking -SqlInstance SQLDB2 -Database DB1 -Confirm:$false + + Apply the data masking configuration from the file "sqldb1.db1.tables.json" to the db1 database on sqldb2. Do not prompt for confirmation. + + .EXAMPLE + New-DbaDbMaskingConfig -SqlInstance SQLDB1 -Database DB1 -Path C:\Temp\clone -OutVariable file + $file | Invoke-DbaDbDataMasking -SqlInstance SQLDB2 -Database DB1 -Confirm:$false + + Create the data masking configuration file "sqldb1.db1.tables.json", then use it to mask the db1 database on sqldb2. Do not prompt for confirmation. + + .EXAMPLE + Get-ChildItem -Path C:\Temp\sqldb1.db1.tables.json | Invoke-DbaDbDataMasking -SqlInstance SQLDB2, sqldb3 -Database DB1 -Confirm:$false + + See what would happen if you the data masking configuration from the file "sqldb1.db1.tables.json" to the db1 database on sqldb2 and sqldb3. Do not prompt for confirmation. + + #> + [CmdLetBinding(SupportsShouldProcess, ConfirmImpact = "High")] + param ( + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [string[]]$Database, + [parameter(Mandatory, ValueFromPipeline)] + [Alias('Path', 'FullName')] + [object]$FilePath, + [string]$Locale = 'en', + [string]$CharacterString = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', + [string[]]$Table, + [string[]]$Column, + [string[]]$ExcludeTable, + [string[]]$ExcludeColumn, + [string]$Query, + [int]$MaxValue, + [int]$ModulusFactor = 10, + [switch]$ExactLength, + [switch]$EnableException + ) + begin { + # Create the faker objects + Add-Type -Path (Resolve-Path -Path "$script:PSModuleRoot\bin\datamasking\Bogus.dll") + $faker = New-Object Bogus.Faker($Locale) + + $supportedDataTypes = 'bit', 'bool', 'char', 'date', 'datetime', 'datetime2', 'decimal', 'int', 'money', 'nchar', 'ntext', 'nvarchar', 'smalldatetime', 'text', 'time', 'uniqueidentifier', 'userdefineddatatype', 'varchar' + + $supportedFakerMaskingTypes = ($faker | Get-Member -MemberType Property | Select-Object Name -ExpandProperty Name) + + $supportedFakerSubTypes = ($faker | Get-Member -MemberType Property) | ForEach-Object { ($faker.$($_.Name)) | Get-Member -MemberType Method | Where-Object {$_.Name -notlike 'To*' -and $_.Name -notlike 'Get*' -and $_.Name -notlike 'Trim*' -and $_.Name -notin 'Add', 'Equals', 'CompareTo', 'Clone', 'Contains', 'CopyTo', 'EndsWith', 'IndexOf', 'IndexOfAny', 'Insert', 'IsNormalized', 'LastIndexOf', 'LastIndexOfAny', 'Normalize', 'PadLeft', 'PadRight', 'Remove', 'Replace', 'Split', 'StartsWith', 'Substring', 'Letter', 'Lines', 'Paragraph', 'Paragraphs', 'Sentence', 'Sentences'} | Select-Object name -ExpandProperty Name } + + $supportedFakerSubTypes += "Date" + } + + process { + if (Test-FunctionInterrupt) { + return + } + + if ($FilePath.ToString().StartsWith('http')) { + $tables = Invoke-RestMethod -Uri $FilePath + } else { + # Check if the destination is accessible + if (-not (Test-Path -Path $FilePath)) { + Stop-Function -Message "Could not find masking config file $FilePath" -Target $FilePath + return + } + + # Get all the items that should be processed + try { + $tables = Get-Content -Path $FilePath -ErrorAction Stop | ConvertFrom-Json -ErrorAction Stop + } catch { + Stop-Function -Message "Could not parse masking config file" -ErrorRecord $_ -Target $FilePath + return + } + } + + foreach ($tabletest in $tables.Tables) { + if ($Table -and $tabletest.Name -notin $Table) { + continue + } + foreach ($columntest in $tabletest.Columns) { + if ($columntest.ColumnType -in 'hierarchyid', 'geography', 'xml', 'geometry' -and $columntest.Name -notin $Column) { + Stop-Function -Message "$($columntest.ColumnType) is not supported, please remove the column $($columntest.Name) from the $($tabletest.Name) table" -Target $tables + } + } + } + + if (Test-FunctionInterrupt) { + return + } + + $dictionary = @{} + + foreach ($instance in $SqlInstance) { + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential -MinimumVersion 9 + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + if ($Database) { + $dbs = Get-DbaDatabase -SqlInstance $server -SqlCredential $SqlCredential -Database $Database + } else { + $dbs = Get-DbaDatabase -SqlInstance $server -SqlCredential $SqlCredential -Database $tables.Name + } + + $sqlconn = $server.ConnectionContext.SqlConnectionObject.PsObject.Copy() + $sqlconn.Open() + + foreach ($db in $dbs) { + + $stepcounter = $nullmod = 0 + + foreach ($tableobject in $tables.Tables) { + $uniqueValues = @() + $uniqueValueColumns = @() + + if ($tableobject.Name -in $ExcludeTable) { + Write-Message -Level Verbose -Message "Skipping $($tableobject.Name) because it is explicitly excluded" + continue + } + + if ($tableobject.Name -notin $db.Tables.Name) { + Stop-Function -Message "Table $($tableobject.Name) is not present in $db" -Target $db -Continue + } + + $dbTable = $db.Tables | Where-Object {$_.Schema -eq $tableobject.Schema -and $_.Name -eq $tableobject.Name} + + try { + if (-not (Test-Bound -ParameterName Query)) { + $columnString = "[" + (($dbTable.Columns | Where-Object DataType -in $supportedDataTypes | Select-Object Name -ExpandProperty Name) -join "],[") + "]" + $query = "SELECT $($columnString) FROM [$($tableobject.Schema)].[$($tableobject.Name)]" + } + $data = $server.Databases[$($db.Name)].Query($query) | ConvertTo-DbaDataTable + } catch { + Stop-Function -Message "Failure retrieving the data from table $($tableobject.Name)" -Target $Database -ErrorRecord $_ -Continue + } + + # Check if the table contains unique indexes + if ($tableobject.HasUniqueIndex) { + + # Loop through the rows and generate a unique value for each row + Write-Message -Level Verbose -Message "Generating unique values for $($tableobject.Name)" + + for ($i = 0; $i -lt $data.Rows.Count; $i++) { + $rowValue = New-Object PSCustomObject + + # Loop through each of the unique indexes + foreach ($index in ($db.Tables[$($tableobject.Name)].Indexes | Where-Object IsUnique -eq $true )) { + + # Loop through the index columns + foreach ($indexColumn in $index.IndexedColumns) { + # Get the column mask info + $columnMaskInfo = $tableobject.Columns | Where-Object Name -eq $indexColumn.Name + + # Generate a new value + $newValue = $faker.$($columnMaskInfo.MaskingType).$($columnMaskInfo.SubType)() + + # Check if the value is already present as a property + if (($rowValue | Get-Member -MemberType NoteProperty).Name -notcontains $indexColumn.Name) { + $rowValue | Add-Member -Name $indexColumn.Name -Type NoteProperty -Value $newValue + } + + } + + # To be sure the values are unique, loop as long as long as needed to generate a unique value + while (($uniqueValues | Select-Object -Property ($rowValue | Get-Member -MemberType NoteProperty | Select-Object -ExpandProperty Name)) -match $rowValue) { + + $rowValue = New-Object PSCustomObject + + # Loop through the index columns + foreach ($indexColumn in $index.IndexedColumns) { + # Get the column mask info + $columnMaskInfo = $tableobject.Columns | Where-Object Name -eq $indexColumn.Name + + # Generate a new value + $newValue = $faker.$($columnMaskInfo.MaskingType).$($columnMaskInfo.SubType)() + + # Check if the value is already present as a property + if (($rowValue | Get-Member -MemberType NoteProperty).Name -notcontains $indexColumn.Name) { + $rowValue | Add-Member -Name $indexColumn.Name -Type NoteProperty -Value $newValue + $uniqueValueColumns += $indexColumn.Name + } + + } + } + + } + + # Add the row value to the array + $uniqueValues += $rowValue + + } + + } + + $uniqueValueColumns = $uniqueValueColumns | Select-Object -Unique + + $sqlconn.ChangeDatabase($db.Name) + + $deterministicColumns = $tables.Tables.Columns | Where-Object Deterministic -eq $true + $tablecolumns = $tableobject.Columns + + if ($Column) { + $tablecolumns = $tablecolumns | Where-Object Name -in $Column + } + + if ($ExcludeColumn) { + if ([string]$uniqueIndex.Columns -match ($ExcludeColumn -join "|")) { + Stop-Function -Message "Column present in -ExcludeColumn cannot be excluded because it's part of an unique index" -Target $ExcludeColumn -Continue + } + + $tablecolumns = $tablecolumns | Where-Object Name -notin $ExcludeColumn + } + + if (-not $tablecolumns) { + Write-Message -Level Verbose "No columns to process in $($db.Name).$($tableobject.Schema).$($tableobject.Name), moving on" + continue + } + + if ($Pscmdlet.ShouldProcess($instance, "Masking $($tablecolumns.Name -join ', ') in $($data.Rows.Count) rows in $($db.Name).$($tableobject.Schema).$($tableobject.Name)")) { + + $transaction = $sqlconn.BeginTransaction() + $elapsed = [System.Diagnostics.Stopwatch]::StartNew() + Write-ProgressHelper -StepNumber ($stepcounter++) -TotalSteps $tables.Tables.Count -Activity "Masking data" -Message "Updating $($data.Rows.Count) rows in $($tableobject.Schema).$($tableobject.Name) in $($db.Name) on $instance" + + # Loop through each of the rows and change them + $rowNumber = 0 + + foreach ($row in $data.Rows) { + $updates = $wheres = @() + $newValue = $null + + foreach ($columnobject in $tablecolumns) { + + if ($columnobject.ColumnType -notin $supportedDataTypes) { + Stop-Function -Message "Unsupported data type '$($columnobject.ColumnType)' for column $($columnobject.Name)" -Target $columnobject -Continue + } + + if ($columnobject.MaskingType -notin $supportedFakerMaskingTypes) { + Stop-Function -Message "Unsupported masking type '$($columnobject.MaskingType)' for column $($columnobject.Name)" -Target $columnobject -Continue + } + + if ($columnobject.SubType -notin $supportedFakerSubTypes) { + Stop-Function -Message "Unsupported masking sub type '$($columnobject.SubType)' for column $($columnobject.Name)" -Target $columnobject -Continue + } + + if ($columnobject.Nullable -and (($nullmod++) % $ModulusFactor -eq 0)) { + $newValue = $null + } elseif ($tableobject.HasUniqueIndex -and $columnobject.Name -in $uniqueValueColumns) { + + if ($uniqueValues.Count -lt 1) { + Stop-Function -Message "Could not find any unique values in dictionary" -Target $tableobject + return + } + + $newValue = $uniqueValues[$rowNumber].$($columnobject.Name) + + } else { + + # make sure max is good + if ($MaxValue) { + if ($columnobject.MaxValue -le $MaxValue) { + $max = $columnobject.MaxValue + } else { + $max = $MaxValue + } + } else { + $max = $columnobject.MaxValue + } + + if (-not $columnobject.MaxValue -and -not (Test-Bound -ParameterName MaxValue)) { + $max = 10 + } + + if ($columnobject.CharacterString) { + $charstring = $columnobject.CharacterString + } else { + $charstring = $CharacterString + } + + # make sure min is good + if ($columnobject.MinValue) { + $min = $columnobject.MinValue + } else { + if ($columnobject.CharacterString) { + $min = 1 + } else { + $min = 0 + } + } + + if (($columnobject.MinValue -or $columnobject.MaxValue) -and ($columnobject.ColumnType -match 'date')) { + $nowmin = $columnobject.MinValue + $nowmax = $columnobject.MaxValue + if (-not $nowmin) { + $nowmin = (Get-Date -Date $nowmax).AddDays(-365) + } + if (-not $nowmax) { + $nowmax = (Get-Date -Date $nowmin).AddDays(365) + } + } + + try { + $newValue = $null + + if ($columnobject.Deterministic -and ($row.$($columnobject.Name) -in $dictionary.Keys)) { + $newValue = $dictionary.$($row.$($columnobject.Name)) + } + + if (-not $newValue) { + $newValue = switch ($columnobject.ColumnType) { + { + $psitem -in 'bit', 'bool' + } { + $faker.System.Random.Bool() + } + { + $psitem -match 'date' + } { + if ($columnobject.MinValue -or $columnobject.MaxValue) { + ($faker.Date.Between($nowmin, $nowmax)).ToString("yyyyMMdd") + } else { + ($faker.Date.Past()).ToString("yyyyMMdd") + } + } + { + $psitem -match 'int' + } { + if ($columnobject.MinValue -or $columnobject.MaxValue) { + $faker.System.Random.Int($columnobject.MinValue, $columnobject.MaxValue) + } else { + $faker.System.Random.Int(0, $max) + } + } + 'money' { + if ($columnobject.MinValue -or $columnobject.MaxValue) { + $faker.Finance.Amount($columnobject.MinValue, $columnobject.MaxValue) + } else { + $faker.Finance.Amount(0, $max) + } + } + 'time' { + ($faker.Date.Past()).ToString("h:mm tt zzz") + } + 'uniqueidentifier' { + $faker.System.Random.Guid().Guid + } + 'userdefineddatatype' { + if ($columnobject.MaxValue -eq 1) { + $faker.System.Random.Bool() + } else { + $null + } + } + default { + $null + } + } + } + + if (-not $newValue) { + $newValue = switch ($columnobject.SubType.ToLower()) { + 'number' { + $faker.$($columnobject.MaskingType).$($columnobject.SubType)($columnobject.MaxValue) + } + { + $psitem -in 'bit', 'bool' + } { + $faker.System.Random.Bool() + } + { + $psitem -in 'date', 'datetime', 'datetime2', 'smalldatetime' + } { + if ($columnobject.MinValue -or $columnobject.MaxValue) { + ($faker.Date.Between($nowmin, $nowmax)).ToString("yyyyMMdd") + } else { + ($faker.Date.Past()).ToString("yyyyMMdd") + } + } + 'shuffle' { + ($row.($columnobject.Name) -split '' | Sort-Object { + Get-Random + }) -join '' + } + 'string' { + if ($max -eq -1) { + $max = 1024 + } + + if ($columnobject.SubType -eq "String" -and (Test-Bound -ParameterName ExactLength)) { + $max = ($row.$($columnobject.Name)).Length + } + + if ($columnobject.ColumnType -eq 'xml') { + $null + } else { + $faker.$($columnobject.MaskingType).String2($max, $charstring) + } + } + default { + $null + } + } + } + + if (-not $newValue) { + $newValue = switch ($columnobject.MaskingType.ToLower()) { + { + $psitem -in 'bit', 'bool' + } { + $faker.System.Random.Bool() + } + { + $psitem -in 'address', 'commerce', 'company', 'context', 'database', 'date', 'finance', 'hacker', 'hashids', 'image', 'internet', 'lorem', 'name', 'person', 'phone', 'random', 'rant', 'system' + } { + if ($columnobject.Format) { + $faker.$($columnobject.MaskingType).$($columnobject.SubType)("$($columnobject.Format)") + } else { + $faker.$($columnobject.MaskingType).$($columnobject.SubType)() + } + } + default { + if ($max -eq -1) { + $max = 1024 + } + if ((Test-Bound -ParameterName ExactLength)) { + $max = ($row.$($columnobject.Name)).ToString().Length + } + if ($max -eq 1) { + $faker.System.Random.Bool() + } else { + try { + if ($columnobject.Format) { + $faker.$($columnobject.MaskingType).$($columnobject.SubType)("$($columnobject.Format)") + } else { + $faker.$($columnobject.MaskingType).$($columnobject.SubType)() + } + } catch { + $faker.Random.String2($max, $charstring) + } + } + } + } + } + } catch { + Stop-Function -Message "Failure" -Target $faker -Continue -ErrorRecord $_ + } + } + + if ($columnobject.ColumnType -eq 'xml') { + # nothing, unsure how i'll handle this + } elseif ($columnobject.ColumnType -in 'uniqueidentifier') { + if ($null -eq $newValue -and $columnobject.Nullable) { + $updates += "[$($columnobject.Name)] = NULL" + } else { + $updates += "[$($columnobject.Name)] = '$newValue'" + } + } elseif ($columnobject.ColumnType -match 'int') { + if ($null -eq $newValue -and $columnobject.Nullable) { + $updates += "[$($columnobject.Name)] = NULL" + } else { + $updates += "[$($columnobject.Name)] = $newValue" + } + } elseif ($columnobject.ColumnType -in 'bit', 'bool') { + if ($null -eq $newValue -and $columnobject.Nullable) { + $updates += "[$($columnobject.Name)] = NULL" + } else { + if ($newValue) { + $updates += "[$($columnobject.Name)] = 1" + } else { + $updates += "[$($columnobject.Name)] = 0" + } + } + } else { + if ($null -eq $newValue -and $columnobject.Nullable) { + $updates += "[$($columnobject.Name)] = NULL" + } else { + $newValue = ($newValue).Tostring().Replace("'", "''") + $updates += "[$($columnobject.Name)] = '$newValue'" + } + } + + if ($columnobject.Deterministic -and ($row.$($columnobject.Name) -notin $dictionary.Keys)) { + $dictionary.Add($row.$($columnobject.Name), $newValue) + } + } + + $rowItems = $row | Get-Member -MemberType Properties | Select-Object Name -ExpandProperty Name + foreach ($item in $rowItems) { + $itemColumnType = $dbTable.Columns[$item].DataType.SqlDataType.ToString().ToLower() + + if (($row.$($item)).GetType().Name -match 'DBNull') { + $wheres += "[$item] IS NULL" + } elseif ($itemColumnType -in 'bit', 'bool') { + if ($row.$item) { + $wheres += "[$item] = 1" + } else { + $wheres += "[$item] = 0" + } + } elseif ($itemColumnType -like '*int*' -or $itemColumnType -in 'decimal') { + $oldValue = $row.$item + $wheres += "[$item] = $oldValue" + } elseif ($itemColumnType -in 'text', 'ntext') { + $oldValue = ($row.$item).Tostring().Replace("'", "''") + $wheres += "CAST([$item] AS VARCHAR(MAX)) = '$oldValue'" + } elseif ($itemColumnType -like 'datetime') { + $oldValue = ($row.$item).Tostring("yyyy-MM-dd HH:mm:ss.fff") + $wheres += "[$item] = '$oldValue'" + } elseif ($itemColumnType -like 'datetime2') { + $oldValue = ($row.$item).Tostring("yyyy-MM-dd HH:mm:ss.fffffff") + $wheres += "[$item] = '$oldValue'" + } elseif ($itemColumnType -like 'date') { + $oldValue = ($row.$item).Tostring("yyyy-MM-dd") + $wheres += "[$item] = '$oldValue'" + } elseif ($itemColumnType -like '*date*') { + $oldValue = ($row.$item).Tostring("yyyy-MM-dd HH:mm:ss") + $wheres += "[$item] = '$oldValue'" + } else { + $oldValue = ($row.$item).Tostring().Replace("'", "''") + $wheres += "[$item] = '$oldValue'" + } + } + + $updatequery = "UPDATE [$($tableobject.Schema)].[$($tableobject.Name)] SET $($updates -join ', ') WHERE $($wheres -join ' AND ')" + + try { + $sqlcmd = New-Object System.Data.SqlClient.SqlCommand($updatequery, $sqlconn, $transaction) + $null = $sqlcmd.ExecuteNonQuery() + } catch { + Write-Message -Level VeryVerbose -Message "$updatequery" + $errormessage = $_.Exception.Message.ToString() + Stop-Function -Message "Error updating $($tableobject.Schema).$($tableobject.Name): $errormessage" -Target $updatequery -Continue -ErrorRecord $_ + } + + # Increase the row number + $rowNumber++ + } + try { + $null = $transaction.Commit() + [pscustomobject]@{ + ComputerName = $db.Parent.ComputerName + InstanceName = $db.Parent.ServiceName + SqlInstance = $db.Parent.DomainInstanceName + Database = $db.Name + Schema = $tableobject.Schema + Table = $tableobject.Name + Columns = $tableobject.Columns.Name + Rows = $($data.Rows.Count) + Elapsed = [prettytimespan]$elapsed.Elapsed + Status = "Masked" + } + } catch { + Stop-Function -Message "Error updating $($tableobject.Schema).$($tableobject.Name)" -Target $updatequery -Continue -ErrorRecord $_ + } + } + + # Empty the unique values array + $uniqueValues = $null + } + } + try { + $sqlconn.Close() + } catch { + Stop-Function -Message "Failure" -Continue -ErrorRecord $_ + } + } + } +} +function Invoke-DbaDbDbccCheckConstraint { + <# + .SYNOPSIS + Execution of Database Console Command DBCC CHECKCONSTRAINTS + + .DESCRIPTION + Executes the command DBCC CHECKCONSTRAINTS and returns results + + Reports and corrects pages and row count inaccuracies in the catalog views. + These inaccuracies may cause incorrect space usage reports returned by the sp_spaceused system stored procedure. + + Read more: + - https://docs.microsoft.com/en-us/sql/t-sql/database-console-commands/dbcc-checkconstraints-transact-sql + + .PARAMETER SqlInstance + The target SQL Server instance or instances. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Database + The database(s) to process - this list is auto-populated from the server. If unspecified, all databases will be processed. + + .PARAMETER Object + The table or constraint to be checked. + When table_name or table_id is specified, all enabled constraints on that table are checked. + When constraint_name or constraint_id is specified, only that constraint is checked. + If neither a table identifier nor a constraint identifier is specified, all enabled constraints on all tables in the current database are checked. + + .PARAMETER AllConstraints + Checks all enabled and disabled constraints on the table if the table name is specified or if all tables are checked; + Otherwise, checks only the enabled constraint. + Has no effect when a constraint is specified + + .PARAMETER AllErrorMessages + Returns all rows that violate constraints in the table that is checked. + The default is the first 200 rows. + + .PARAMETER NoInformationalMessages + Suppresses all informational messages. + + .PARAMETER WhatIf + Shows what would happen if the cmdlet runs. The cmdlet is not run. + + .PARAMETER Confirm + Prompts you for confirmation before running the cmdlet. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: DBCC + Author: Patrick Flynn (@sqllensman) + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Invoke-DbaDbDbccCheckConstraint + + .EXAMPLE + PS C:\> Invoke-DbaDbDbccCheckConstraint -SqlInstance SqlServer2017 + + Runs the command DBCC CHECKCONSTRAINTS to check all enabled constraints on all tables for all databases for the instance SqlServer2017. Connect using Windows Authentication + + .EXAMPLE + PS C:\> Invoke-DbaDbDbccCheckConstraint -SqlInstance SqlServer2017 -Database CurrentDB + + Connect to instance SqlServer2017 using Windows Authentication and run the command DBCC CHECKCONSTRAINTS to check all enabled constraints on all tables in the CurrentDB database. + + .EXAMPLE + PS C:\> Invoke-DbaDbDbccCheckConstraint -SqlInstance SqlServer2017 -Database CurrentDB -Object Sometable + + Connects to CurrentDB on instance SqlServer2017 using Windows Authentication and runs the command DBCC CHECKCONSTRAINTS(SometableId) to check all enabled constraints in the table. + + .EXAMPLE + PS C:\> Invoke-DbaDbDbccCheckConstraint -SqlInstance SqlServer2017 -Database CurrentDB -Object ConstraintId + + Connects to CurrentDB on instance SqlServer2017 using Windows Authentication and runs the command DBCC CHECKCONSTRAINTS(ConstraintId) to check the constraint with constraint_id = ConstraintId. + + .EXAMPLE + PS C:\> $cred = Get-Credential sqladmin + PS C:\> Invoke-DbaDbDbccCheckConstraint -SqlInstance SqlServer2017 -SqlCredential $cred -Database CurrentDB -Object TableId -AllConstraints -AllErrorMessages -NoInformationalMessages + + Connects to CurrentDB on instance SqlServer2017 using sqladmin credential and runs the command DBCC CHECKCONSTRAINTS(TableId) WITH ALL_CONSTRAINTS, ALL_ERRORMSGS, NO_INFOMSGS to check all enabled and disabled constraints on the table with able_id = TableId. Returns all rows that violate constraints. + + .EXAMPLE + PS C:\> 'Sql1','Sql2/sqlexpress' | Invoke-DbaDbDbccCheckConstraint -WhatIf + + Displays what will happen if command DBCC CHECKCONSTRAINTS is called against all databses on Sql1 and Sql2/sqlexpress + + #> + [CmdletBinding(SupportsShouldProcess, ConfirmImpact = 'Low')] + param ( + [parameter(Mandatory, ValueFromPipeline)] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [string[]]$Database, + [string]$Object, + [switch]$AllConstraints, + [switch]$AllErrorMessages, + [switch]$NoInformationalMessages, + [switch]$EnableException + ) + begin { + $withCount = 0 + $stringBuilder = New-Object System.Text.StringBuilder + $null = $stringBuilder.Append("DBCC CHECKCONSTRAINTS(#options#)") + if (Test-Bound -ParameterName AllConstraints) { + $null = $stringBuilder.Append(" WITH ALL_CONSTRAINTS") + $withCount++ + } + if (Test-Bound -ParameterName AllErrorMessages) { + if ($withCount -eq 0) { + $null = $stringBuilder.Append(" WITH ALL_ERRORMSGS") + } else { + $null = $stringBuilder.Append(", ALL_ERRORMSGS") + } + $withCount++ + } + if (Test-Bound -ParameterName NoInformationalMessages) { + if ($withCount -eq 0) { + $null = $stringBuilder.Append(" WITH NO_INFOMSGS") + } else { + $null = $stringBuilder.Append(", NO_INFOMSGS") + } + } + + } + process { + foreach ($instance in $SqlInstance) { + Write-Message -Message "Attempting Connection to $instance" -Level Verbose + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + $dbs = $server.Databases + + if ($Database) { + $dbs = $dbs | Where-Object Name -In $Database + } + + foreach ($db in $dbs) { + Write-Message -Level Verbose -Message "Processing $db on $instance" + + if ($db.IsAccessible -eq $false) { + Stop-Function -Message "The database $db is not accessible. Skipping." -Continue + } + + try { + $query = $StringBuilder.ToString() + if (Test-Bound -ParameterName Object) { + if ($object -match '^\d+$') { + $query = $query.Replace('#options#', "$Object") + } else { + $query = $query.Replace('#options#', "'$Object'") + } + } else { + $query = $query.Replace('(#options#)', "") + } + + if ($Pscmdlet.ShouldProcess($server.Name, "Execute the command $query against $instance")) { + Write-Message -Message "Query to run: $query" -Level Verbose + $results = $server | Invoke-DbaQuery -Query $query -Database $db.Name -MessagesToOutput + } + } catch { + Stop-Function -Message "Error capturing data on $db" -Target $instance -ErrorRecord $_ -Exception $_.Exception -Continue + } + + if ($Pscmdlet.ShouldProcess("console", "Outputting object")) { + $output = $null + if (($null -eq $results) -or ($results.GetType().Name -eq 'String') ) { + [PSCustomObject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + Database = $db.Name + Cmd = $query.ToString() + Output = $results + Table = $null + Constraint = $null + Where = $null + } + } elseif (($results.GetType().Name -eq 'Object[]') -or ($results.GetType().Name -eq 'DataRow')) { + foreach ($row in $results) { + if ($row.GetType().Name -eq 'String') { + $output = $row.ToString() + } else { + [PSCustomObject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + Database = $db.Name + Cmd = $query.ToString() + Output = $output + Table = $row[0] + Constraint = $row[1] + Where = $row[2] + + } + } + } + } + } + } + } + } +} +function Invoke-DbaDbDbccCleanTable { + <# + .SYNOPSIS + Execution of Database Console Command DBCC CLEANTABLE + + .DESCRIPTION + Executes the command DBCC CLEANTABLE against defined objects and returns results + + Reclaims space from dropped variable-length columns in tables or indexed views + + Read more: + - https://docs.microsoft.com/en-us/sql/t-sql/database-console-commands/dbcc-cleantable-transact-sql + + .PARAMETER SqlInstance + The target SQL Server instance or instances. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Database + The database(s) to process. If unspecified, all databases will be processed. + + .PARAMETER Object + The table(s) or indexed view(s) to be cleaned. + + .PARAMETER BatchSize + Is the number of rows processed per transaction. + If not specified, or if 0 is specified, the statement processes the whole table in one transaction. + + .PARAMETER NoInformationalMessages + Suppresses all informational messages. + + .PARAMETER WhatIf + Shows what would happen if the cmdlet runs. The cmdlet is not run. + + .PARAMETER Confirm + Prompts you for confirmation before running the cmdlet. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: DBCC + Author: Patrick Flynn (@sqllensman) + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Invoke-DbaDbDbccCleanTable + + .EXAMPLE + PS C:\> Invoke-DbaDbDbccCleanTable -SqlInstance SqlServer2017 -Database CurrentDB -Object 'dbo.SomeTable' + + Connects to CurrentDB on instance SqlServer2017 using Windows Authentication and runs the command DBCC CLEANTABLE('CurrentDB', 'dbo.SomeTable') to reclaim space after variable-length columns have been dropped. + + .EXAMPLE + PS C:\> Invoke-DbaDbDbccCleanTable -SqlInstance SqlServer2017 -Database CurrentDB -Object 34636372 -BatchSize 5000 + + Connects to CurrentDB on instance SqlServer2017 using Windows Authentication and runs the command DBCC CLEANTABLE('CurrentDB', 34636372, 5000) to reclaim space from table with Table_Id = 34636372 after variable-length columns have been dropped. + + .EXAMPLE + PS C:\> $cred = Get-Credential sqladmin + PS C:\> Invoke-DbaDbDbccCleanTable -SqlInstance SqlServer2017 -SqlCredential $cred -Database CurrentDB -Object 'dbo.SomeTable' -NoInformationalMessages + + Connects to CurrentDB on instance SqlServer2017 using sqladmin credential and runs the command DBCC CLEANTABLE('CurrentDB', 'dbo.SomeTable') WITH NO_INFOMSGS to reclaim space after variable-length columns have been dropped. + + .EXAMPLE + PS C:\> 'Sql1','Sql2/sqlexpress' | Invoke-DbaDbDbccCleanTable -Object 'dbo.SomeTable' -BatchSize 5000 + + Runs the command DBCC CLEANTABLE('DatabaseName', 'dbo.SomeTable', 5000) against all databses on Sql1 and Sql2/sqlexpress + + #> + [CmdletBinding(SupportsShouldProcess, ConfirmImpact = 'High')] + param ( + [parameter(Mandatory, ValueFromPipeline)] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [string[]]$Database, + [string[]]$Object, + [int]$BatchSize, + [switch]$NoInformationalMessages, + [switch]$EnableException + ) + begin { + $stringBuilder = New-Object System.Text.StringBuilder + $null = $stringBuilder.Append("DBCC CLEANTABLE(#options#)") + if (Test-Bound -ParameterName NoInformationalMessages) { + $null = $stringBuilder.Append(" WITH NO_INFOMSGS") + } + } + process { + if (Test-Bound -Not -ParameterName Object) { + Stop-Function -Message "You must specify a table or indexed view to execute against using -Object" + return + } + foreach ($instance in $SqlInstance) { + Write-Message -Message "Attempting Connection to $instance" -Level Verbose + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + $dbs = $server.Databases + + if ($Database) { + $dbs = $dbs | Where-Object Name -In $Database + } + + foreach ($db in $dbs) { + Write-Message -Level Verbose -Message "Processing $db on $instance" + + if ($db.IsAccessible -eq $false) { + Stop-Function -Message "The database $db is not accessible. Skipping." -Continue + } + + foreach ($obj in $Object) { + try { + $query = $StringBuilder.ToString() + $options = New-Object System.Text.StringBuilder + if ($obj -match '^\d+$') { + $null = $options.Append("'$($db.Name)', $($obj)") + } else { + $null = $options.Append("'$($db.Name)', '$($obj)'") + } + if (Test-Bound -ParameterName BatchSize) { + $null = $options.Append(", $($BatchSize)") + } + + $query = $query.Replace('#options#', "$($options.ToString())") + Write-Message -Message "Query to run: $query" -Level Verbose + + if ($Pscmdlet.ShouldProcess($server.Name, "Execute the command $query against $instance")) { + Write-Message -Message "Query to run: $query" -Level Verbose + $results = $server | Invoke-DbaQuery -Query $query -Database $db.Name -MessagesToOutput + } + } catch { + Stop-Function -Message "Error running $query against $db" -Target $instance -ErrorRecord $_ -Exception $_.Exception -Continue + } + if ($Pscmdlet.ShouldProcess("console", "Outputting object")) { + if (($null -eq $results) -or ($results.GetType().Name -eq 'String') ) { + [PSCustomObject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + Database = $db.Name + Object = $obj + Cmd = $query.ToString() + Output = $results + } + } + } + } + } + } + } +} +function Invoke-DbaDbDbccUpdateUsage { + <# + .SYNOPSIS + Execution of Database Console Command DBCC UPDATEUSAGE + + .DESCRIPTION + Executes the command DBCC UPDATEUSAGE and returns results + + Reports and corrects pages and row count inaccuracies in the catalog views. + These inaccuracies may cause incorrect space usage reports returned by the sp_spaceused system stored procedure. + + Read more: + - https://docs.microsoft.com/en-us/sql/t-sql/database-console-commands/dbcc-updateusage-transact-sql + + .PARAMETER SqlInstance + The target SQL Server instance or instances. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Database + The database(s) to process. If unspecified, all databases will be processed. + The Name or Id of a database can be specified + Database names must comply with the rules for identifiers. + + .PARAMETER Table + The table or indexed view to process. + Table and view names must comply with the rules for identifiers + The Id of Table or View can be specified + If not specified, all tables or indexed views will be processed + + .PARAMETER Index + The Index to process. + The Id of Index can be specified + If not specified, all indexes for the specified table or view will be processed. + + .PARAMETER NoInformationalMessages + Suppresses all informational messages. + + .PARAMETER CountRows + Specifies that the row count column is updated with the current count of the number of rows in the table or view. + + .PARAMETER WhatIf + Shows what would happen if the cmdlet runs. The cmdlet is not run. + + .PARAMETER Confirm + Prompts you for confirmation before running the cmdlet. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: DBCC + Author: Patrick Flynn (@sqllensman) + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Invoke-DbaDbDbccUpdateUsage + + .EXAMPLE + PS C:\> Invoke-DbaDbDbccUpdateUsage -SqlInstance SqlServer2017 + + Runs the command DBCC UPDATEUSAGE to update the page or row counts or both for all objects in all databases for the instance SqlServer2017. Connect using Windows Authentication + + .EXAMPLE + PS C:\> Invoke-DbaDbDbccUpdateUsage -SqlInstance SqlServer2017 -Database CurrentDB + + Runs the command DBCC UPDATEUSAGE to update the page or row counts or both for all objects in the CurrentDB database for the instance SqlServer2017. Connect using Windows Authentication + + .EXAMPLE + PS C:\> Invoke-DbaDbDbccUpdateUsage -SqlInstance SqlServer2017 -Database CurrentDB -Table Sometable + + Connects to CurrentDB on instance SqlServer2017 using Windows Authentication and runs the command DBCC UPDATEUSAGE(SometableId) to update the page or row counts for all indexes in the table. + + .EXAMPLE + PS C:\> $cred = Get-Credential sqladmin + PS C:\> Invoke-DbaDbDbccUpdateUsage -SqlInstance SqlServer2017 -SqlCredential $cred -Database CurrentDB -Table 'SometableId -Index IndexName -NoInformationalMessages -CountRows + + Connects to CurrentDB on instance SqlServer2017 using sqladmin credential and runs the command DBCC UPDATEUSAGE(SometableId, IndexName) WITH NO_INFOMSGS, COUNT_ROWS to update the page or row counts. + + .EXAMPLE + PS C:\> 'Sql1','Sql2/sqlexpress' | Invoke-DbaDbDbccUpdateUsage -WhatIf + + Displays what will happen if command DBCC UPDATEUSAGE is called against all databses on Sql1 and Sql2/sqlexpress + + #> + [CmdletBinding(SupportsShouldProcess, ConfirmImpact = 'High')] + param ( + [parameter(Mandatory, ValueFromPipeline)] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [string[]]$Database, + [string]$Table, + [string]$Index, + [switch]$NoInformationalMessages, + [switch]$CountRows, + [switch]$EnableException + ) + begin { + + $stringBuilder = New-Object System.Text.StringBuilder + $null = $stringBuilder.Append("DBCC UPDATEUSAGE(#options#)") + if (Test-Bound -ParameterName NoInformationalMessages) { + $null = $stringBuilder.Append(" WITH NO_INFOMSGS") + if (Test-Bound -ParameterName CountRows) { + $null = $stringBuilder.Append(", COUNT_ROWS") + } + } else { + if (Test-Bound -ParameterName CountRows) { + $null = $stringBuilder.Append(" WITH COUNT_ROWS") + } + } + Write-Message -Message "$($StringBuilder.ToString())" -Level Verbose + + } + process { + foreach ($instance in $SqlInstance) { + Write-Message -Message "Attempting Connection to $instance" -Level Verbose + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + $dbs = $server.Databases + + if (Test-Bound -ParameterName Database) { + $dbs = $dbs | Where-Object {($_.Name -In $Database) -or ($_.ID -In $Database) } + } + + foreach ($db in $dbs) { + Write-Message -Level Verbose -Message "Processing $db on $instance" + + if ($db.IsAccessible -eq $false) { + Stop-Function -Message "The database $db is not accessible. Skipping." -Continue + } + + try { + $query = $StringBuilder.ToString() + if (Test-Bound -ParameterName Table) { + if (Test-Bound -ParameterName Index) { + if ($Table -match '^\d+$') { + if ($Index -match '^\d+$') { + $query = $query.Replace('#options#', "'$($db.name)', $Table, $Index") + } else { + $query = $query.Replace('#options#', "'$($db.name)', $Table, '$Index'") + } + } else { + if ($Index -match '^\d+$') { + $query = $query.Replace('#options#', "'$($db.name)', '$Table', $Index") + } else { + $query = $query.Replace('#options#', "'$($db.name)', '$Table', '$Index'") + } + } + } else { + if ($Table -match '^\d+$') { + $query = $query.Replace('#options#', "'$($db.name)', $Table") + } else { + $query = $query.Replace('#options#', "'$($db.name)', '$Table'") + } + } + } else { + $query = $query.Replace('#options#', "'$($db.name)'") + } + + if ($Pscmdlet.ShouldProcess($server.Name, "Execute the command $query against $instance")) { + Write-Message -Message "Query to run: $query" -Level Verbose + $results = $server | Invoke-DbaQuery -Query $query -MessagesToOutput + Write-Message -Message "$($results.Count)" -Level Verbose + } + } catch { + Stop-Function -Message "Error capturing data on $db" -Target $instance -ErrorRecord $_ -Exception $_.Exception -Continue + } + + foreach ($row in $results) { + if ($Pscmdlet.ShouldProcess("console", "Outputting object")) { + [PSCustomObject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + Database = $db.name + Cmd = $query.ToString() + Output = $results + } + } + } + } + } + } +} +function Invoke-DbaDbDecryptObject { + <# + .SYNOPSIS + Invoke-DbaDbDecryptObject returns the decrypted version of an object + + .DESCRIPTION + When a procedure or a function is created with encryption and you lost the code you're in trouble. + You cannot alter the object or view the definition. + With this command you can search for the object and decrypt the it. + + The command will output the results to the console. + There is an option to export all the results to a folder creating .sql files. + + Make sure the instance allowed dedicated administrator connections (DAC). + The binary versions of the objects can only be retrieved using a DAC connection. + You can check the DAC connection with: + 'Get-DbaSpConfigure -SqlInstance [yourinstance] -ConfigName RemoteDacConnectionsEnabled' + It should say 1 in the ConfiguredValue. + + To change the configurations you can use the Set-DbaSpConfigure command: + 'Set-DbaSpConfigure -SqlInstance [yourinstance] -ConfigName RemoteDacConnectionsEnabled -Value 1' + In some cases you may need to reboot the instance. + + .PARAMETER SqlInstance + The target SQL Server instance + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Database + Database to look through for the object. + + .PARAMETER ObjectName + The name of the object to search for in the database. + + .PARAMETER EncodingType + The encoding that's used to decrypt and encrypt values. + + .PARAMETER ExportDestination + Used for exporting the results to. + The destiation will use the instance name, database name and object type i.e.: C:\temp\decrypt\SQLDB1\DB1\StoredProcedure + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Encryption, Decrypt, Database + Author: Sander Stad (@sqlstad), sqlstad.nl + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Invoke-DbaDbDecryptObject + + .EXAMPLE + PS C:\> Invoke-DbaDbDecryptObject -SqlInstance SQLDB1 -Database DB1 -ObjectName Function1 + + Decrypt object "Function1" in DB1 of instance SQLDB1 and output the data to the user. + + .EXAMPLE + PS C:\> Invoke-DbaDbDecryptObject -SqlInstance SQLDB1 -Database DB1 -ObjectName Function1 -ExportDestination C:\temp\decrypt + + Decrypt object "Function1" in DB1 of instance SQLDB1 and output the data to the folder "C:\temp\decrypt". + + .EXAMPLE + PS C:\> Invoke-DbaDbDecryptObject -SqlInstance SQLDB1 -Database DB1 -ExportDestination C:\temp\decrypt + + Decrypt all objects in DB1 of instance SQLDB1 and output the data to the folder "C:\temp\decrypt" + + .EXAMPLE + PS C:\> Invoke-DbaDbDecryptObject -SqlInstance SQLDB1 -Database DB1 -ObjectName Function1, Function2 + + Decrypt objects "Function1" and "Function2" and output the data to the user. + + .EXAMPLE + PS C:\> "SQLDB1" | Invoke-DbaDbDecryptObject -Database DB1 -ObjectName Function1, Function2 + + Decrypt objects "Function1" and "Function2" and output the data to the user using a pipeline for the instance. + + #> + [CmdletBinding()] + param( + [parameter(Mandatory, ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter]$SqlInstance, + [PSCredential]$SqlCredential, + [parameter(Mandatory)] + [object[]]$Database, + [string[]]$ObjectName, + [ValidateSet('ASCII', 'UTF8')] + [string]$EncodingType = 'ASCII', + [string]$ExportDestination, + [switch]$EnableException + ) + + begin { + + function Invoke-DecryptData() { + param( + [parameter(Mandatory)] + [byte[]]$Secret, + [parameter(Mandatory)] + [byte[]]$KnownPlain, + [parameter(Mandatory)] + [byte[]]$KnownSecret + ) + + # Declare pointers + [int]$i = 0 + + # Loop through each of the characters and apply an XOR to decrypt the data + $result = $( + + # Loop through the byte string + while ($i -lt $Secret.Length) { + + # Compare the byte string character to the key character using XOR + if ($i -lt $Secret.Length) { + $Secret[$i] -bxor $KnownPlain[$i] -bxor $KnownSecret[$i] + } + + # Increment the byte string indicator + $i += 2 + + } # end while loop + + ) # end data value + + # Get the string value from the data + $decryptedData = $Encoding.GetString($result) + + # Return the decrypted data + return $decryptedData + } + + # Create array list to hold the results + $objectCollection = New-Object System.Collections.ArrayList + + # Set the encoding + if ($EncodingType -eq 'ASCII') { + $encoding = [System.Text.Encoding]::ASCII + } elseif ($EncodingType -eq 'UTF8') { + $encoding = [System.Text.Encoding]::UTF8 + } + + # Check the export parameter + if ($ExportDestination -and -not (Test-Path $ExportDestination)) { + try { + # Create the new destination + New-Item -Path $ExportDestination -ItemType Directory -Force | Out-Null + } catch { + Stop-Function -Message "Couldn't create destination folder $ExportDestination" -ErrorRecord $_ -Target $instance -Continue + } + } + + } + + process { + + if (Test-FunctionInterrupt) { return } + + # Loop through all the instances + foreach ($instance in $SqlInstance) { + + # Check the configuration of the intance to see if the DAC is enabled + $config = Get-DbaSpConfigure -SqlInstance $instance -ConfigName RemoteDacConnectionsEnabled + if ($config.ConfiguredValue -ne 1) { + Stop-Function -Message "DAC is not enabled for instance $instance.`nPlease use 'Set-DbaSpConfigure -SqlInstance $instance -ConfigName RemoteDacConnectionsEnabled -Value 1' to configure the instance to allow DAC connections" -Target $instance -Continue + } + + # Try to connect to instance + try { + $server = New-Object Microsoft.SqlServer.Management.Smo.Server "ADMIN:$instance" + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + # Get all the databases that compare to the database parameter + $databaseCollection = $server.Databases | Where-Object {$_.Name -in $Database} + + # Loop through each of databases + foreach ($db in $databaseCollection) { + # Get the objects + if ($ObjectName) { + $storedProcedures = @($db.StoredProcedures | Where-Object {$_.Name -in $ObjectName -and $_.IsEncrypted -eq $true} | Select-Object Name, Schema, @{N = "ObjectType"; E = {'StoredProcedure'}}, @{N = "SubType"; E = {''}}) + $functions = @($db.UserDefinedFunctions | Where-Object {$_.Name -in $ObjectName -and $_.IsEncrypted -eq $true} | Select-Object Name, Schema, @{N = "ObjectType"; E = {"UserDefinedFunction"}}, @{N = "SubType"; E = {$_.FunctionType.ToString().Trim()}}) + $views = @($db.Views | Where-Object {$_.Name -in $ObjectName -and $_.IsEncrypted -eq $true} | Select-Object Name, Schema, @{N = "ObjectType"; E = {'View'}}, @{N = "SubType"; E = {''}}) + } else { + # Get all encrypted objects + $storedProcedures = @($db.StoredProcedures | Where-Object {$_.IsEncrypted -eq $true} | Select-Object Name, Schema, @{N = "ObjectType"; E = {'StoredProcedure'}}, @{N = "SubType"; E = {''}}) + $functions = @($db.UserDefinedFunctions | Where-Object {$_.IsEncrypted -eq $true} | Select-Object Name, Schema, @{N = "ObjectType"; E = {"UserDefinedFunction"}}, @{N = "SubType"; E = {$_.FunctionType.ToString().Trim()}}) + $views = @($db.Views | Where-Object {$_.IsEncrypted -eq $true} | Select-Object Name, Schema, @{N = "ObjectType"; E = {'View'}}, @{N = "SubType"; E = {''}}) + } + + <# Get all the objects + $storedProcedures = @($db.StoredProcedures | Where-Object {$_.Name -in $ObjectName -and $_.IsEncrypted -eq $true} | Select-Object Name, Schema, @{N = "ObjectType"; E = {'StoredProcedure'}}, @{N = "SubType"; E = {''}}) + $functions = @($db.UserDefinedFunctions | Where-Object {$_.Name -in $ObjectName -and $_.IsEncrypted -eq $true} | Select-Object Name, Schema, @{N = "ObjectType"; E = {"UserDefinedFunction"}}, @{N = "SubType"; E = {$_.FunctionType.ToString().Trim()}}) + $views = @($db.Views | Where-Object {$_.Name -in $ObjectName -and $_.IsEncrypted -eq $true} | Select-Object Name, Schema, @{N = "ObjectType"; E = {'View'}}, @{N = "SubType"; E = {''}}) + #> + + # Check if there are any objects + if ($storedProcedures.Count -ge 1) { + $objectCollection += $storedProcedures + } + if ($functions.Count -ge 1) { + $objectCollection += $functions + } + if ($views.Count -ge 1) { + $objectCollection += $views + } + + # Loop through all the objects + foreach ($object in $objectCollection) { + + # Setup the query to get the secret + $querySecret = "SELECT imageval AS Value FROM sys.sysobjvalues WHERE objid = OBJECT_ID('$($object.Name)')" + + # Get the result of the secret query + try { + $secret = $server.Databases[$db.Name].Query($querySecret) + } catch { + Stop-Function -Message "Couldn't retrieve secret from $instance" -ErrorRecord $_ -Target $instance -Continue + } + + # Check if at least a value came back + if ($secret) { + + # Setup a known plain command and get the binary version of it + switch ($object.ObjectType) { + + 'StoredProcedure' { + $queryKnownPlain = (" " * $secret.Value.Length) + "ALTER PROCEDURE $($object.Schema).$($object.Name) WITH ENCRYPTION AS RETURN 0;" + } + 'UserDefinedFunction' { + + switch ($object.SubType) { + 'Inline' { + $queryKnownPlain = (" " * $secret.value.length) + "ALTER FUNCTION $($object.Schema).$($object.Name)() RETURNS TABLE WITH ENCRYPTION AS BEGIN RETURN SELECT 0 i END;" + } + 'Scalar' { + $queryKnownPlain = (" " * $secret.value.length) + "ALTER FUNCTION $($object.Schema).$($object.Name)() RETURNS INT WITH ENCRYPTION AS BEGIN RETURN 0 END;" + } + 'Table' { + $queryKnownPlain = (" " * $secret.value.length) + "ALTER FUNCTION $($object.Schema).$($object.Name)() RETURNS @r TABLE(i INT) WITH ENCRYPTION AS BEGIN RETURN END;" + } + } + } + 'View' { + $queryKnownPlain = (" " * $secret.Value.Length) + "ALTER VIEW $($object.Schema).$($object.Name) WITH ENCRYPTION AS SELECT NULL AS [Value];" + } + } + + # Convert the known plain into binary + if ($queryKnownPlain) { + try { + $knownPlain = $encoding.GetBytes(($queryKnownPlain)) + } catch { + Stop-Function -Message "Couldn't convert the known plain to binary" -ErrorRecord $_ -Target $instance -Continue + } + } else { + Stop-Function -Message "Something went wrong setting up the known plain" -ErrorRecord $_ -Target $instance -Continue + } + + # Setup the query to change the object in SQL Server and roll it back getting the encrypted version + $queryKnownSecret = " + BEGIN TRANSACTION; + EXEC ('$queryKnownPlain'); + SELECT imageval AS Value + FROM sys.sysobjvalues + WHERE objid = OBJECT_ID('$($object.Name)'); + ROLLBACK; + " + + # Get the result for the known encrypted + try { + $knownSecret = $server.Databases[$db.Name].Query($queryKnownSecret) + } catch { + Stop-Function -Message "Couldn't retrieve known secret from $instance" -ErrorRecord $_ -Target $instance -Continue + } + + # Get the result + $result = Invoke-DecryptData -Secret $secret.value -KnownPlain $knownPlain -KnownSecret $knownSecret.value + + # Check if the results need to be exported + if ($ExportDestination) { + # make up the file name + $filename = "$($object.Schema).$($object.Name).sql" + + # Check the export destination + if ($ExportDestination.EndsWith("\")) { + $destinationFolder = "$ExportDestination$instance\$($db.Name)\$($object.ObjectType)\" + } else { + $destinationFolder = "$ExportDestination\$instance\$($db.Name)\$($object.ObjectType)\" + } + + # Check if the destination folder exists + if (-not (Test-Path $destinationFolder)) { + try { + # Create the new destination + New-Item -Path $destinationFolder -ItemType Directory -Force:$Force | Out-Null + } catch { + Stop-Function -Message "Couldn't create destination folder $destinationFolder" -ErrorRecord $_ -Target $instance -Continue + } + } + + # Combine the destination folder and the file name to get the path + $filePath = $destinationFolder + $filename + + # Export the result + try { + $result | Out-File -FilePath $filePath -Force + } catch { + Stop-Function -Message "Couldn't export the results of $($object.Name) to $filePath" -ErrorRecord $_ -Target $instance -Continue + } + + } + + # Add the results to the custom object + [PSCustomObject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + Database = $db.Name + Type = $object.ObjectType + Schema = $object.Schema + Name = $object.Name + FullName = "$($object.Schema).$($object.Name)" + Script = $result + } + + } # end if secret + + } # end for each object + + } # end for each database + + } # end for each instance + + } # process + + end { + if (Test-FunctionInterrupt) { return } + + Write-Message -Message "Finished decrypting data" -Level Verbose + } +} +function Invoke-DbaDbLogShipping { + <# + .SYNOPSIS + Invoke-DbaDbLogShipping sets up log shipping for one or more databases + + .DESCRIPTION + Invoke-DbaDbLogShipping helps to easily set up log shipping for one or more databases. + + This function will make a lot of decisions for you assuming you want default values like a daily interval for the schedules with a 15 minute interval on the day. + There are some settings that cannot be made by the function and they need to be prepared before the function is executed. + + The following settings need to be made before log shipping can be initiated: + - Backup destination (the folder and the privileges) + - Copy destination (the folder and the privileges) + + * Privileges + Make sure your agent service on both the primary and the secondary instance is an Active Directory account. + Also have the credentials ready to set the folder permissions + + ** Network share + The backup destination needs to be shared and have the share privileges of FULL CONTROL to Everyone. + + ** NTFS permissions + The backup destination must have at least read/write permissions for the primary instance agent account. + The backup destination must have at least read permissions for the secondary instance agent account. + The copy destination must have at least read/write permission for the secondary instance agent acount. + + .PARAMETER SourceSqlInstance + Source SQL Server instance which contains the databases to be log shipped. + You must have sysadmin access and server version must be SQL Server version 2000 or greater. + + .PARAMETER DestinationSqlInstance + Destination SQL Server instance which contains the databases to be log shipped. + You must have sysadmin access and server version must be SQL Server version 2000 or greater. + + .PARAMETER SourceSqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER SourceCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER DestinationSqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER DestinationCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Database + Database to set up log shipping for. + + .PARAMETER BackupNetworkPath + The backup unc path to place the backup files. This is the root directory. + A directory with the name of the database will be created in this path. + + .PARAMETER BackupLocalPath + If the backup path is locally for the source server you can also set this value. + + .PARAMETER BackupJob + Name of the backup that will be created in the SQL Server agent. + The parameter works as a prefix where the name of the database will be added to the backup job name. + The default is "LSBackup_[databasename]" + + .PARAMETER BackupRetention + The backup retention period in minutes. Default is 4320 / 72 hours + + .PARAMETER BackupSchedule + Name of the backup schedule created for the backup job. + The parameter works as a prefix where the name of the database will be added to the backup job schedule name. + Default is "LSBackupSchedule_[databasename]" + + .PARAMETER BackupScheduleDisabled + Parameter to set the backup schedule to disabled upon creation. + By default the schedule is enabled. + + .PARAMETER BackupScheduleFrequencyType + A value indicating when a job is to be executed. + Allowed values are "Daily", "AgentStart", "IdleComputer" + + .PARAMETER BackupScheduleFrequencyInterval + The number of type periods to occur between each execution of the backup job. + + .PARAMETER BackupScheduleFrequencySubdayType + Specifies the units for the sub-day FrequencyInterval. + Allowed values are "Time", "Seconds", "Minutes", "Hours" + + .PARAMETER BackupScheduleFrequencySubdayInterval + The number of sub-day type periods to occur between each execution of the backup job. + + .PARAMETER BackupScheduleFrequencyRelativeInterval + A job's occurrence of FrequencyInterval in each month, if FrequencyInterval is 32 (monthlyrelative). + + .PARAMETER BackupScheduleFrequencyRecurrenceFactor + The number of weeks or months between the scheduled execution of a job. FrequencyRecurrenceFactor is used only if FrequencyType is 8, "Weekly", 16, "Monthly", 32 or "MonthlyRelative". + + .PARAMETER BackupScheduleStartDate + The date on which execution of a job can begin. + + .PARAMETER BackupScheduleEndDate + The date on which execution of a job can stop. + + .PARAMETER BackupScheduleStartTime + The time on any day to begin execution of a job. Format HHMMSS / 24 hour clock. + Example: '010000' for 01:00:00 AM. + Example: '140000' for 02:00:00 PM. + + .PARAMETER BackupScheduleEndTime + The time on any day to end execution of a job. Format HHMMSS / 24 hour clock. + Example: '010000' for 01:00:00 AM. + Example: '140000' for 02:00:00 PM. + + .PARAMETER BackupThreshold + Is the length of time, in minutes, after the last backup before a threshold alert error is raised. + The default is 60. + + .PARAMETER CompressBackup + Do the backups need to be compressed. By default the backups are not compressed. + + .PARAMETER CopyDestinationFolder + The path to copy the transaction log backup files to. This is the root directory. + A directory with the name of the database will be created in this path. + + .PARAMETER CopyJob + Name of the copy job that will be created in the SQL Server agent. + The parameter works as a prefix where the name of the database will be added to the copy job name. + The default is "LSBackup_[databasename]" + + .PARAMETER CopyRetention + The copy retention period in minutes. Default is 4320 / 72 hours + + .PARAMETER CopySchedule + Name of the backup schedule created for the copy job. + The parameter works as a prefix where the name of the database will be added to the copy job schedule name. + Default is "LSCopy_[DestinationServerName]_[DatabaseName]" + + .PARAMETER CopyScheduleDisabled + Parameter to set the copy schedule to disabled upon creation. + By default the schedule is enabled. + + .PARAMETER CopyScheduleFrequencyType + A value indicating when a job is to be executed. + Allowed values are "Daily", "AgentStart", "IdleComputer" + + .PARAMETER CopyScheduleFrequencyInterval + The number of type periods to occur between each execution of the copy job. + + .PARAMETER CopyScheduleFrequencySubdayType + Specifies the units for the subday FrequencyInterval. + Allowed values are "Time", "Seconds", "Minutes", "Hours" + + .PARAMETER CopyScheduleFrequencySubdayInterval + The number of subday type periods to occur between each execution of the copy job. + + .PARAMETER CopyScheduleFrequencyRelativeInterval + A job's occurrence of FrequencyInterval in each month, if FrequencyInterval is 32 (monthlyrelative). + + .PARAMETER CopyScheduleFrequencyRecurrenceFactor + The number of weeks or months between the scheduled execution of a job. FrequencyRecurrenceFactor is used only if FrequencyType is 8, "Weekly", 16, "Monthly", 32 or "MonthlyRelative". + + .PARAMETER CopyScheduleStartDate + The date on which execution of a job can begin. + + .PARAMETER CopyScheduleEndDate + The date on which execution of a job can stop. + + .PARAMETER CopyScheduleStartTime + The time on any day to begin execution of a job. Format HHMMSS / 24 hour clock. + Example: '010000' for 01:00:00 AM. + Example: '140000' for 02:00:00 PM. + + .PARAMETER CopyScheduleEndTime + The time on any day to end execution of a job. Format HHMMSS / 24 hour clock. + Example: '010000' for 01:00:00 AM. + Example: '140000' for 02:00:00 PM. + + .PARAMETER DisconnectUsers + If this parameter is set in combinations of standby the users will be disconnected during restore. + + .PARAMETER FullBackupPath + Path to an existing full backup. Use this when an existing backup needs to used to initialize the database on the secondary instance. + + .PARAMETER GenerateFullBackup + If the database is not initialized on the secondary instance it can be done by creating a new full backup and + restore it for you. + + .PARAMETER HistoryRetention + Is the length of time in minutes in which the history is retained. + The default value is 14420 + + .PARAMETER NoRecovery + If this parameter is set the database will be in recovery mode. The database will not be readable. + This setting is default. + + .PARAMETER NoInitialization + If this parameter is set the secondary database will not be initialized. + The database needs to be on the secondary instance in recovery mode. + + .PARAMETER PrimaryMonitorServer + Is the name of the monitor server for the primary server. + The default is the name of the primary sql server. + + .PARAMETER PrimaryMonitorCredential + Allows you to login to enter a secure credential. Only needs to be used when the PrimaryMonitorServerSecurityMode is 0 or "sqlserver" + To use: $scred = Get-Credential, then pass $scred object to the -PrimaryMonitorCredential parameter. + + .PARAMETER PrimaryMonitorServerSecurityMode + The security mode used to connect to the monitor server for the primary server. Allowed values are 0, "sqlserver", 1, "windows" + The default is 1 or Windows. + + .PARAMETER PrimaryThresholdAlertEnabled + Enables the Threshold alert for the primary database + + .PARAMETER RestoreDataFolder + Folder to be used to restore the database data files. Only used when parameter GenerateFullBackup or UseExistingFullBackup are set. + If the parameter is not set the default data folder of the secondary instance will be used including the name of the database. + If the folder is set but doesn't exist the default data folder of the secondary instance will be used including the name of the database. + + .PARAMETER RestoreLogFolder + Folder to be used to restore the database log files. Only used when parameter GenerateFullBackup or UseExistingFullBackup are set. + If the parameter is not set the default transaction log folder of the secondary instance will be used. + If the folder is set but doesn't exist the default transaction log folder of the secondary instance will be used. + + .PARAMETER RestoreDelay + In case a delay needs to be set for the restore. + The default is 0. + + .PARAMETER RestoreAlertThreshold + The amount of minutes after which an alert will be raised is no restore has taken place. + The default is 45 minutes. + + .PARAMETER RestoreJob + Name of the restore job that will be created in the SQL Server agent. + The parameter works as a prefix where the name of the database will be added to the restore job name. + The default is "LSRestore_[databasename]" + + .PARAMETER RestoreRetention + The backup retention period in minutes. Default is 4320 / 72 hours + + .PARAMETER RestoreSchedule + Name of the backup schedule created for the restore job. + The parameter works as a prefix where the name of the database will be added to the restore job schedule name. + Default is "LSRestore_[DestinationServerName]_[DatabaseName]" + + .PARAMETER RestoreScheduleDisabled + Parameter to set the restore schedule to disabled upon creation. + By default the schedule is enabled. + + .PARAMETER RestoreScheduleFrequencyType + A value indicating when a job is to be executed. + Allowed values are "Daily", "AgentStart", "IdleComputer" + + .PARAMETER RestoreScheduleFrequencyInterval + The number of type periods to occur between each execution of the restore job. + + .PARAMETER RestoreScheduleFrequencySubdayType + Specifies the units for the subday FrequencyInterval. + Allowed values are "Time", "Seconds", "Minutes", "Hours" + + .PARAMETER RestoreScheduleFrequencySubdayInterval + The number of subday type periods to occur between each execution of the restore job. + + .PARAMETER RestoreScheduleFrequencyRelativeInterval + A job's occurrence of FrequencyInterval in each month, if FrequencyInterval is 32 (monthlyrelative). + + .PARAMETER RestoreScheduleFrequencyRecurrenceFactor + The number of weeks or months between the scheduled execution of a job. FrequencyRecurrenceFactor is used only if FrequencyType is 8, "Weekly", 16, "Monthly", 32 or "MonthlyRelative". + + .PARAMETER RestoreScheduleStartDate + The date on which execution of a job can begin. + + .PARAMETER RestoreScheduleEndDate + The date on which execution of a job can stop. + + .PARAMETER RestoreScheduleStartTime + The time on any day to begin execution of a job. Format HHMMSS / 24 hour clock. + Example: '010000' for 01:00:00 AM. + Example: '140000' for 02:00:00 PM. + + .PARAMETER RestoreScheduleEndTime + The time on any day to end execution of a job. Format HHMMSS / 24 hour clock. + Example: '010000' for 01:00:00 AM. + Example: '140000' for 02:00:00 PM. + + .PARAMETER RestoreThreshold + The number of minutes allowed to elapse between restore operations before an alert is generated. + The default value = 0 + + .PARAMETER SecondaryDatabasePrefix + The secondary database can be renamed to include a prefix. + + .PARAMETER SecondaryDatabaseSuffix + The secondary database can be renamed to include a suffix. + + .PARAMETER SecondaryMonitorServer + Is the name of the monitor server for the secondary server. + The default is the name of the secondary sql server. + + .PARAMETER SecondaryMonitorCredential + Allows you to login to enter a secure credential. Only needs to be used when the SecondaryMonitorServerSecurityMode is 0 or "sqlserver" + To use: $scred = Get-Credential, then pass $scred object to the -SecondaryMonitorCredential parameter. + + .PARAMETER SecondaryMonitorServerSecurityMode + The security mode used to connect to the monitor server for the secondary server. Allowed values are 0, "sqlserver", 1, "windows" + The default is 1 or Windows. + + .PARAMETER SecondaryThresholdAlertEnabled + Enables the Threshold alert for the secondary database + + .PARAMETER Standby + If this parameter is set the database will be set to standby mode making the database readable. + If not set the database will be in recovery mode. + + .PARAMETER StandbyDirectory + Directory to place the standby file(s) in + + .PARAMETER UseExistingFullBackup + If the database is not initialized on the secondary instance it can be done by selecting an existing full backup + and restore it for you. + + .PARAMETER UseBackupFolder + This enables the user to specify a specific backup folder containing one or more backup files to initialize the database on the secondary instance. + + .PARAMETER WhatIf + Shows what would happen if the command were to run. No actions are actually performed. + + .PARAMETER Confirm + Prompts you for confirmation before executing any changing operations within the command. + + .PARAMETER EnableException + Use this switch to disable any kind of verbose messages + + .PARAMETER Force + The force parameter will ignore some errors in the parameters and assume defaults. + It will also remove the any present schedules with the same name for the specific job. + + .NOTES + Tags: LogShipping + Author: Sander Stad (@sqlstad), sqlstad.nl + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Invoke-DbaDbLogShipping + + .EXAMPLE + PS C:\> $params = @{ + >> SourceSqlInstance = 'sql1' + >> DestinationSqlInstance = 'sql2' + >> Database = 'db1' + >> BackupNetworkPath= '\\sql1\logshipping' + >> BackupLocalPath= 'D:\Data\logshipping' + >> BackupScheduleFrequencyType = 'daily' + >> BackupScheduleFrequencyInterval = 1 + >> CompressBackup = $true + >> CopyScheduleFrequencyType = 'daily' + >> CopyScheduleFrequencyInterval = 1 + >> GenerateFullBackup = $true + >> RestoreScheduleFrequencyType = 'daily' + >> RestoreScheduleFrequencyInterval = 1 + >> SecondaryDatabaseSuffix = 'DR' + >> CopyDestinationFolder = '\\sql2\logshippingdest' + >> Force = $true + >> } + >> + PS C:\> Invoke-DbaDbLogShipping @params + + Sets up log shipping for database "db1" with the backup path to a network share allowing local backups. + It creates daily schedules for the backup, copy and restore job with all the defaults to be executed every 15 minutes daily. + The secondary database will be called "db1_LS". + + .EXAMPLE + PS C:\> $params = @{ + >> SourceSqlInstance = 'sql1' + >> DestinationSqlInstance = 'sql2' + >> Database = 'db1' + >> BackupNetworkPath= '\\sql1\logshipping' + >> GenerateFullBackup = $true + >> Force = $true + >> } + >> + PS C:\> Invoke-DbaDbLogShipping @params + + Sets up log shipping with all defaults except that a backup file is generated. + The script will show a message that the copy destination has not been supplied and asks if you want to use the default which would be the backup directory of the secondary server with the folder "logshipping" i.e. "D:\SQLBackup\Logshiping". + + #> + [CmdletBinding(DefaultParameterSetName = "Default", SupportsShouldProcess)] + + param( + [parameter(Mandatory)] + [ValidateNotNullOrEmpty()] + [Alias("SourceServerInstance", "SourceSqlServerSqlServer", "Source")] + [object]$SourceSqlInstance, + + [parameter(Mandatory)] + [ValidateNotNullOrEmpty()] + [Alias("DestinationServerInstance", "DestinationSqlServer", "Destination")] + [object[]]$DestinationSqlInstance, + + [System.Management.Automation.PSCredential] + $SourceSqlCredential, + + [System.Management.Automation.PSCredential] + $SourceCredential, + + [System.Management.Automation.PSCredential] + $DestinationSqlCredential, + + [System.Management.Automation.PSCredential] + $DestinationCredential, + + [Parameter(Mandatory, ValueFromPipeline)] + [object[]]$Database, + + [parameter(Mandatory)] + [string]$BackupNetworkPath, + + [string]$BackupLocalPath, + + [string]$BackupJob, + + [int]$BackupRetention, + + [string]$BackupSchedule, + + [switch]$BackupScheduleDisabled, + + [ValidateSet("Daily", "Weekly", "AgentStart", "IdleComputer")] + [object]$BackupScheduleFrequencyType, + + [object[]]$BackupScheduleFrequencyInterval, + + [ValidateSet('Time', 'Seconds', 'Minutes', 'Hours')] + [object]$BackupScheduleFrequencySubdayType, + + [int]$BackupScheduleFrequencySubdayInterval, + + [ValidateSet('Unused', 'First', 'Second', 'Third', 'Fourth', 'Last')] + [object]$BackupScheduleFrequencyRelativeInterval, + + [int]$BackupScheduleFrequencyRecurrenceFactor, + + [string]$BackupScheduleStartDate, + + [string]$BackupScheduleEndDate, + + [string]$BackupScheduleStartTime, + + [string]$BackupScheduleEndTime, + + [int]$BackupThreshold, + + [switch]$CompressBackup, + + [string]$CopyDestinationFolder, + + [string]$CopyJob, + + [int]$CopyRetention, + + [string]$CopySchedule, + + [switch]$CopyScheduleDisabled, + + [ValidateSet("Daily", "Weekly", "AgentStart", "IdleComputer")] + [object]$CopyScheduleFrequencyType, + + [object[]]$CopyScheduleFrequencyInterval, + + [ValidateSet('Time', 'Seconds', 'Minutes', 'Hours')] + [object]$CopyScheduleFrequencySubdayType, + + [int]$CopyScheduleFrequencySubdayInterval, + + [ValidateSet('Unused', 'First', 'Second', 'Third', 'Fourth', 'Last')] + [object]$CopyScheduleFrequencyRelativeInterval, + + [int]$CopyScheduleFrequencyRecurrenceFactor, + + [string]$CopyScheduleStartDate, + + [string]$CopyScheduleEndDate, + + [string]$CopyScheduleStartTime, + + [string]$CopyScheduleEndTime, + + [switch]$DisconnectUsers, + + [string]$FullBackupPath, + + [switch]$GenerateFullBackup, + + [int]$HistoryRetention, + + [switch]$NoRecovery, + + [switch]$NoInitialization, + + [string]$PrimaryMonitorServer, + + [System.Management.Automation.PSCredential] + $PrimaryMonitorCredential, + + [ValidateSet(0, "sqlserver", 1, "windows")] + [object]$PrimaryMonitorServerSecurityMode, + + [switch]$PrimaryThresholdAlertEnabled, + + [string]$RestoreDataFolder, + + [string]$RestoreLogFolder, + + [int]$RestoreDelay, + + [int]$RestoreAlertThreshold, + + [string]$RestoreJob, + + [int]$RestoreRetention, + + [string]$RestoreSchedule, + + [switch]$RestoreScheduleDisabled, + + [ValidateSet("Daily", "Weekly", "AgentStart", "IdleComputer")] + [object]$RestoreScheduleFrequencyType, + + [object[]]$RestoreScheduleFrequencyInterval, + + [ValidateSet('Time', 'Seconds', 'Minutes', 'Hours')] + [object]$RestoreScheduleFrequencySubdayType, + + [int]$RestoreScheduleFrequencySubdayInterval, + + [ValidateSet('Unused', 'First', 'Second', 'Third', 'Fourth', 'Last')] + [object]$RestoreScheduleFrequencyRelativeInterval, + + [int]$RestoreScheduleFrequencyRecurrenceFactor, + + [string]$RestoreScheduleStartDate, + + [string]$RestoreScheduleEndDate, + + [string]$RestoreScheduleStartTime, + + [string]$RestoreScheduleEndTime, + + [int]$RestoreThreshold, + + [string]$SecondaryDatabasePrefix, + + [string]$SecondaryDatabaseSuffix, + + [string]$SecondaryMonitorServer, + + [System.Management.Automation.PSCredential] + $SecondaryMonitorCredential, + + [ValidateSet(0, "sqlserver", 1, "windows")] + [object]$SecondaryMonitorServerSecurityMode, + + [switch]$SecondaryThresholdAlertEnabled, + + [switch]$Standby, + + [string]$StandbyDirectory, + + [switch]$UseExistingFullBackup, + + [string]$UseBackupFolder, + + [switch]$Force, + + [Alias('Silent')] + [switch]$EnableException + ) + + begin { + Write-Message -Message "Started log shipping for $SourceSqlInstance to $DestinationSqlInstance" -Level Verbose + + # Try connecting to the instance + try { + $SourceServer = Connect-SqlInstance -SqlInstance $SourceSqlInstance -SqlCredential $SourceSqlCredential + } catch { + Stop-Function -Message "Could not connect to Sql Server instance $SourceSqlInstance" -ErrorRecord $_ -Target $SourceSqlInstance + return + } + + + # Check the instance if it is a named instance + $SourceServerName, $SourceInstanceName = $SourceSqlInstance.Split("\") + + if ($null -eq $SourceInstanceName) { + $SourceInstanceName = "MSSQLSERVER" + } + + # Set up regex strings for several checks + $RegexDate = '(?:`"/\\|?*]+)+$' + + + # Check the connection timeout + if ($SourceServer.ConnectionContext.StatementTimeout -ne 0) { + $SourceServer.ConnectionContext.StatementTimeout = 0 + Write-Message -Message "Connection timeout of $SourceServer is set to 0" -Level Verbose + } + + # Check the backup network path + Write-Message -Message "Testing backup network path $BackupNetworkPath" -Level Verbose + if ((Test-DbaPath -Path $BackupNetworkPath -SqlInstance $SourceSqlInstance -SqlCredential $SourceCredential) -ne $true) { + Stop-Function -Message "Backup network path $BackupNetworkPath is not valid or can't be reached." -Target $SourceSqlInstance + return + } elseif ($BackupNetworkPath -notmatch $RegexUnc) { + Stop-Function -Message "Backup network path $BackupNetworkPath has to be in the form of \\server\share." -Target $SourceSqlInstance + return + } + + # Check the backup compression + if ($SourceServer.Version.Major -gt 9) { + if ($CompressBackup) { + Write-Message -Message "Setting backup compression to 1." -Level Verbose + [bool]$BackupCompression = 1 + } else { + $backupServerSetting = (Get-DbaSpConfigure -SqlInstance $SourceSqlInstance -ConfigName DefaultBackupCompression).ConfiguredValue + Write-Message -Message "Setting backup compression to default server setting $backupServerSetting." -Level Verbose + [bool]$BackupCompression = $backupServerSetting + } + } else { + Write-Message -Message "Source server $SourceServer does not support backup compression" -Level Verbose + } + + # Check the database parameter + if ($Database) { + foreach ($db in $Database) { + if ($db -notin $SourceServer.Databases.Name) { + Stop-Function -Message "Database $db cannot be found on instance $SourceSqlInstance" -Target $SourceSqlInstance + } + + $DatabaseCollection = $SourceServer.Databases | Where-Object { $_.Name -in $Database } + } + } else { + Stop-Function -Message "Please supply a database to set up log shipping for" -Target $SourceSqlInstance -Continue + } + + # Set the database mode + if ($Standby) { + $DatabaseStatus = 1 + Write-Message -Message "Destination database status set to STANDBY" -Level Verbose + } else { + $DatabaseStatus = 0 + Write-Message -Message "Destination database status set to NO RECOVERY" -Level Verbose + } + + # Setting defaults + if (-not $BackupRetention) { + $BackupRetention = 4320 + Write-Message -Message "Backup retention set to $BackupRetention" -Level Verbose + } + if (-not $BackupThreshold) { + $BackupThreshold = 60 + Write-Message -Message "Backup Threshold set to $BackupThreshold" -Level Verbose + } + if (-not $CopyRetention) { + $CopyRetention = 4320 + Write-Message -Message "Copy retention set to $CopyRetention" -Level Verbose + } + if (-not $HistoryRetention) { + $HistoryRetention = 14420 + Write-Message -Message "History retention set to $HistoryRetention" -Level Verbose + } + if (-not $RestoreAlertThreshold) { + $RestoreAlertThreshold = 45 + Write-Message -Message "Restore alert Threshold set to $RestoreAlertThreshold" -Level Verbose + } + if (-not $RestoreDelay) { + $RestoreDelay = 0 + Write-Message -Message "Restore delay set to $RestoreDelay" -Level Verbose + } + if (-not $RestoreRetention) { + $RestoreRetention = 4320 + Write-Message -Message "Restore retention set to $RestoreRetention" -Level Verbose + } + if (-not $RestoreThreshold) { + $RestoreThreshold = 0 + Write-Message -Message "Restore Threshold set to $RestoreThreshold" -Level Verbose + } + if (-not $PrimaryMonitorServerSecurityMode) { + $PrimaryMonitorServerSecurityMode = 1 + Write-Message -Message "Primary monitor server security mode set to $PrimaryMonitorServerSecurityMode" -Level Verbose + } + if (-not $SecondaryMonitorServerSecurityMode) { + $SecondaryMonitorServerSecurityMode = 1 + Write-Message -Message "Secondary monitor server security mode set to $SecondaryMonitorServerSecurityMode" -Level Verbose + } + if (-not $BackupScheduleFrequencyType) { + $BackupScheduleFrequencyType = "Daily" + Write-Message -Message "Backup frequency type set to $BackupScheduleFrequencyType" -Level Verbose + } + if (-not $BackupScheduleFrequencyInterval) { + $BackupScheduleFrequencyInterval = "EveryDay" + Write-Message -Message "Backup frequency interval set to $BackupScheduleFrequencyInterval" -Level Verbose + } + if (-not $BackupScheduleFrequencySubdayType) { + $BackupScheduleFrequencySubdayType = "Minutes" + Write-Message -Message "Backup frequency subday type set to $BackupScheduleFrequencySubdayType" -Level Verbose + } + if (-not $BackupScheduleFrequencySubdayInterval) { + $BackupScheduleFrequencySubdayInterval = 15 + Write-Message -Message "Backup frequency subday interval set to $BackupScheduleFrequencySubdayInterval" -Level Verbose + } + if (-not $BackupScheduleFrequencyRelativeInterval) { + $BackupScheduleFrequencyRelativeInterval = "Unused" + Write-Message -Message "Backup frequency relative interval set to $BackupScheduleFrequencyRelativeInterval" -Level Verbose + } + if (-not $BackupScheduleFrequencyRecurrenceFactor) { + $BackupScheduleFrequencyRecurrenceFactor = 0 + Write-Message -Message "Backup frequency recurrence factor set to $BackupScheduleFrequencyRecurrenceFactor" -Level Verbose + } + if (-not $CopyScheduleFrequencyType) { + $CopyScheduleFrequencyType = "Daily" + Write-Message -Message "Copy frequency type set to $CopyScheduleFrequencyType" -Level Verbose + } + if (-not $CopyScheduleFrequencyInterval) { + $CopyScheduleFrequencyInterval = "EveryDay" + Write-Message -Message "Copy frequency interval set to $CopyScheduleFrequencyInterval" -Level Verbose + } + if (-not $CopyScheduleFrequencySubdayType) { + $CopyScheduleFrequencySubdayType = "Minutes" + Write-Message -Message "Copy frequency subday type set to $CopyScheduleFrequencySubdayType" -Level Verbose + } + if (-not $CopyScheduleFrequencySubdayInterval) { + $CopyScheduleFrequencySubdayInterval = 15 + Write-Message -Message "Copy frequency subday interval set to $CopyScheduleFrequencySubdayInterval" -Level Verbose + } + if (-not $CopyScheduleFrequencyRelativeInterval) { + $CopyScheduleFrequencyRelativeInterval = "Unused" + Write-Message -Message "Copy frequency relative interval set to $CopyScheduleFrequencyRelativeInterval" -Level Verbose + } + if (-not $CopyScheduleFrequencyRecurrenceFactor) { + $CopyScheduleFrequencyRecurrenceFactor = 0 + Write-Message -Message "Copy frequency recurrence factor set to $CopyScheduleFrequencyRecurrenceFactor" -Level Verbose + } + if (-not $RestoreScheduleFrequencyType) { + $RestoreScheduleFrequencyType = "Daily" + Write-Message -Message "Restore frequency type set to $RestoreScheduleFrequencyType" -Level Verbose + } + if (-not $RestoreScheduleFrequencyInterval) { + $RestoreScheduleFrequencyInterval = "EveryDay" + Write-Message -Message "Restore frequency interval set to $RestoreScheduleFrequencyInterval" -Level Verbose + } + if (-not $RestoreScheduleFrequencySubdayType) { + $RestoreScheduleFrequencySubdayType = "Minutes" + Write-Message -Message "Restore frequency subday type set to $RestoreScheduleFrequencySubdayType" -Level Verbose + } + if (-not $RestoreScheduleFrequencySubdayInterval) { + $RestoreScheduleFrequencySubdayInterval = 15 + Write-Message -Message "Restore frequency subday interval set to $RestoreScheduleFrequencySubdayInterval" -Level Verbose + } + if (-not $RestoreScheduleFrequencyRelativeInterval) { + $RestoreScheduleFrequencyRelativeInterval = "Unused" + Write-Message -Message "Restore frequency relative interval set to $RestoreScheduleFrequencyRelativeInterval" -Level Verbose + } + if (-not $RestoreScheduleFrequencyRecurrenceFactor) { + $RestoreScheduleFrequencyRecurrenceFactor = 0 + Write-Message -Message "Restore frequency recurrence factor set to $RestoreScheduleFrequencyRecurrenceFactor" -Level Verbose + } + + # Checking for contradicting variables + if ($NoInitialization -and ($GenerateFullBackup -or $UseExistingFullBackup)) { + Stop-Function -Message "Cannot use -NoInitialization with -GenerateFullBackup or -UseExistingFullBackup" -Target $DestinationSqlInstance + return + } + + if ($UseBackupFolder -and ($GenerateFullBackup -or $NoInitialization -or $UseExistingFullBackup)) { + Stop-Function -Message "Cannot use -UseBackupFolder with -GenerateFullBackup, -NoInitialization or -UseExistingFullBackup" -Target $DestinationSqlInstance + return + } + + # Check the subday interval + if (($BackupScheduleFrequencySubdayType -in 2, "Seconds", 4, "Minutes") -and (-not ($BackupScheduleFrequencySubdayInterval -ge 1 -or $BackupScheduleFrequencySubdayInterval -le 59))) { + Stop-Function -Message "Backup subday interval $BackupScheduleFrequencySubdayInterval must be between 1 and 59 when subday type is 2, 'Seconds', 4 or 'Minutes'" -Target $SourceSqlInstance + return + } elseif (($BackupScheduleFrequencySubdayType -in 8, "Hours") -and (-not ($BackupScheduleFrequencySubdayInterval -ge 1 -and $BackupScheduleFrequencySubdayInterval -le 23))) { + Stop-Function -Message "Backup Subday interval $BackupScheduleFrequencySubdayInterval must be between 1 and 23 when subday type is 8 or 'Hours" -Target $SourceSqlInstance + return + } + + # Check the subday interval + if (($CopyScheduleFrequencySubdayType -in 2, "Seconds", 4, "Minutes") -and (-not ($CopyScheduleFrequencySubdayInterval -ge 1 -or $CopyScheduleFrequencySubdayInterval -le 59))) { + Stop-Function -Message "Copy subday interval $CopyScheduleFrequencySubdayInterval must be between 1 and 59 when subday type is 2, 'Seconds', 4 or 'Minutes'" -Target $DestinationSqlInstance + return + } elseif (($CopyScheduleFrequencySubdayType -in 8, "Hours") -and (-not ($CopyScheduleFrequencySubdayInterval -ge 1 -and $CopyScheduleFrequencySubdayInterval -le 23))) { + Stop-Function -Message "Copy subday interval $CopyScheduleFrequencySubdayInterval must be between 1 and 23 when subday type is 8 or 'Hours'" -Target $DestinationSqlInstance + return + } + + # Check the subday interval + if (($RestoreScheduleFrequencySubdayType -in 2, "Seconds", 4, "Minutes") -and (-not ($RestoreScheduleFrequencySubdayInterval -ge 1 -or $RestoreScheduleFrequencySubdayInterval -le 59))) { + Stop-Function -Message "Restore subday interval $RestoreScheduleFrequencySubdayInterval must be between 1 and 59 when subday type is 2, 'Seconds', 4 or 'Minutes'" -Target $DestinationSqlInstance + return + } elseif (($RestoreScheduleFrequencySubdayType -in 8, "Hours") -and (-not ($RestoreScheduleFrequencySubdayInterval -ge 1 -and $RestoreScheduleFrequencySubdayInterval -le 23))) { + Stop-Function -Message "Restore subday interval $RestoreScheduleFrequencySubdayInterval must be between 1 and 23 when subday type is 8 or 'Hours" -Target $DestinationSqlInstance + return + } + + # Check the backup start date + if (-not $BackupScheduleStartDate) { + $BackupScheduleStartDate = (Get-Date -format "yyyyMMdd") + Write-Message -Message "Backup start date set to $BackupScheduleStartDate" -Level Verbose + } else { + if ($BackupScheduleStartDate -notmatch $RegexDate) { + Stop-Function -Message "Backup start date $BackupScheduleStartDate needs to be a valid date with format yyyyMMdd" -Target $SourceSqlInstance + return + } + } + + # Check the back start time + if (-not $BackupScheduleStartTime) { + $BackupScheduleStartTime = '000000' + Write-Message -Message "Backup start time set to $BackupScheduleStartTime" -Level Verbose + } elseif ($BackupScheduleStartTime -notmatch $RegexTime) { + Stop-Function -Message "Backup start time $BackupScheduleStartTime needs to match between '000000' and '235959'" -Target $SourceSqlInstance + return + } + + # Check the back end time + if (-not $BackupScheduleEndTime) { + $BackupScheduleEndTime = '235959' + Write-Message -Message "Backup end time set to $BackupScheduleEndTime" -Level Verbose + } elseif ($BackupScheduleStartTime -notmatch $RegexTime) { + Stop-Function -Message "Backup end time $BackupScheduleStartTime needs to match between '000000' and '235959'" -Target $SourceSqlInstance + return + } + + # Check the backup end date + if (-not $BackupScheduleEndDate) { + $BackupScheduleEndDate = '99991231' + } elseif ($BackupScheduleEndDate -notmatch $RegexDate) { + Stop-Function -Message "Backup end date $BackupScheduleEndDate needs to be a valid date with format yyyyMMdd" -Target $SourceSqlInstance + return + } + + # Check the copy start date + if (-not $CopyScheduleStartDate) { + $CopyScheduleStartDate = (Get-Date -format "yyyyMMdd") + Write-Message -Message "Copy start date set to $CopyScheduleStartDate" -Level Verbose + } else { + if ($CopyScheduleStartDate -notmatch $RegexDate) { + Stop-Function -Message "Copy start date $CopyScheduleStartDate needs to be a valid date with format yyyyMMdd" -Target $SourceSqlInstance + return + } + } + + # Check the copy end date + if (-not $CopyScheduleEndDate) { + $CopyScheduleEndDate = '99991231' + } elseif ($CopyScheduleEndDate -notmatch $RegexDate) { + Stop-Function -Message "Copy end date $CopyScheduleEndDate needs to be a valid date with format yyyyMMdd" -Target $SourceSqlInstance + return + } + + # Check the copy start time + if (-not $CopyScheduleStartTime) { + $CopyScheduleStartTime = '000000' + Write-Message -Message "Copy start time set to $CopyScheduleStartTime" -Level Verbose + } elseif ($CopyScheduleStartTime -notmatch $RegexTime) { + Stop-Function -Message "Copy start time $CopyScheduleStartTime needs to match between '000000' and '235959'" -Target $SourceSqlInstance + return + } + + # Check the copy end time + if (-not $CopyScheduleEndTime) { + $CopyScheduleEndTime = '235959' + Write-Message -Message "Copy end time set to $CopyScheduleEndTime" -Level Verbose + } elseif ($CopyScheduleEndTime -notmatch $RegexTime) { + Stop-Function -Message "Copy end time $CopyScheduleEndTime needs to match between '000000' and '235959'" -Target $SourceSqlInstance + return + } + + # Check the restore start date + if (-not $RestoreScheduleStartDate) { + $RestoreScheduleStartDate = (Get-Date -format "yyyyMMdd") + Write-Message -Message "Restore start date set to $RestoreScheduleStartDate" -Level Verbose + } else { + if ($RestoreScheduleStartDate -notmatch $RegexDate) { + Stop-Function -Message "Restore start date $RestoreScheduleStartDate needs to be a valid date with format yyyyMMdd" -Target $SourceSqlInstance + return + } + } + + # Check the restore end date + if (-not $RestoreScheduleEndDate) { + $RestoreScheduleEndDate = '99991231' + } elseif ($RestoreScheduleEndDate -notmatch $RegexDate) { + Stop-Function -Message "Restore end date $RestoreScheduleEndDate needs to be a valid date with format yyyyMMdd" -Target $SourceSqlInstance + return + } + + # Check the restore start time + if (-not $RestoreScheduleStartTime) { + $RestoreScheduleStartTime = '000000' + Write-Message -Message "Restore start time set to $RestoreScheduleStartTime" -Level Verbose + } elseif ($RestoreScheduleStartTime -notmatch $RegexTime) { + Stop-Function -Message "Restore start time $RestoreScheduleStartTime needs to match between '000000' and '235959'" -Target $SourceSqlInstance + return + } + + # Check the restore end time + if (-not $RestoreScheduleEndTime) { + $RestoreScheduleEndTime = '235959' + Write-Message -Message "Restore end time set to $RestoreScheduleEndTime" -Level Verbose + } elseif ($RestoreScheduleEndTime -notmatch $RegexTime) { + Stop-Function -Message "Restore end time $RestoreScheduleEndTime needs to match between '000000' and '235959'" -Target $SourceSqlInstance + return + } + } + + process { + + if (Test-FunctionInterrupt) { return } + + foreach ($destInstance in $DestinationSqlInstance) { + + $setupResult = "Success" + $comment = "" + + # Try connecting to the instance + try { + $DestinationServer = Connect-SqlInstance -SqlInstance $destInstance -SqlCredential $DestinationSqlCredential + } catch { + Stop-Function -Message "Could not connect to Sql Server instance $destInstance" -ErrorRecord $_ -Target $destInstance + return + } + + $DestinationServerName, $DestinationInstanceName = $destInstance.Split("\") + + if ($null -eq $DestinationInstanceName) { + $DestinationInstanceName = "MSSQLSERVER" + } + + $IsDestinationLocal = $false + + # Check if it's local or remote + if ($DestinationServerName -in ".", "localhost", $env:ServerName, "127.0.0.1") { + $IsDestinationLocal = $true + } + + # Check the instance names and the database settings + if (($SourceSqlInstance -eq $destInstance) -and (-not $SecondaryDatabasePrefix -or $SecondaryDatabaseSuffix)) { + $setupResult = "Failed" + $comment = "The destination database is the same as the source" + Stop-Function -Message "The destination database is the same as the source`nPlease enter a prefix or suffix using -SecondaryDatabasePrefix or -SecondaryDatabaseSuffix." -Target $SourceSqlInstance + return + } + + if ($DestinationServer.ConnectionContext.StatementTimeout -ne 0) { + $DestinationServer.ConnectionContext.StatementTimeout = 0 + Write-Message -Message "Connection timeout of $DestinationServer is set to 0" -Level Verbose + } + + # Check the copy destination + if (-not $CopyDestinationFolder) { + # Make a default copy destination by retrieving the backup folder and adding a directory + $CopyDestinationFolder = "$($DestinationServer.Settings.BackupDirectory)\Logshipping" + + # Check to see if the path already exists + Write-Message -Message "Testing copy destination path $CopyDestinationFolder" -Level Verbose + if (Test-DbaPath -Path $CopyDestinationFolder -SqlInstance $destInstance -SqlCredential $DestinationCredential) { + Write-Message -Message "Copy destination $CopyDestinationFolder already exists" -Level Verbose + } else { + # Check if force is being used + if (-not $Force) { + # Set up the confirm part + $message = "The copy destination is missing. Do you want to use the default $($CopyDestinationFolder)?" + $choiceYes = New-Object System.Management.Automation.Host.ChoiceDescription "&Yes", "Answer Yes." + $choiceNo = New-Object System.Management.Automation.Host.ChoiceDescription "&No", "Answer No." + $options = [System.Management.Automation.Host.ChoiceDescription[]]($choiceYes, $choiceNo) + $result = $host.ui.PromptForChoice($title, $message, $options, 0) + + # Check the result from the confirm + switch ($result) { + # If yes + 0 { + # Try to create the new directory + try { + # If the destination server is remote and the credential is set + if (-not $IsDestinationLocal -and $DestinationCredential) { + Invoke-Command2 -ComputerName $DestinationServerName -Credential $DestinationCredential -ScriptBlock { + Write-Message -Message "Creating copy destination folder $CopyDestinationFolder" -Level Verbose + New-Item -Path $CopyDestinationFolder -ItemType Directory -Credential $DestinationCredential -Force:$Force | Out-Null + } + } + # If the server is local and the credential is set + elseif ($DestinationCredential) { + Invoke-Command2 -Credential $DestinationCredential -ScriptBlock { + Write-Message -Message "Creating copy destination folder $CopyDestinationFolder" -Level Verbose + New-Item -Path $CopyDestinationFolder -ItemType Directory -Credential $DestinationCredential -Force:$Force | Out-Null + } + } + # If the server is local and the credential is not set + else { + Write-Message -Message "Creating copy destination folder $CopyDestinationFolder" -Level Verbose + New-Item -Path $CopyDestinationFolder -Force:$Force -ItemType Directory | Out-Null + } + Write-Message -Message "Copy destination $CopyDestinationFolder created." -Level Verbose + } catch { + $setupResult = "Failed" + $comment = "Something went wrong creating the copy destination folder" + Stop-Function -Message "Something went wrong creating the copy destination folder $CopyDestinationFolder. `n$_" -Target $destInstance -ErrorRecord $_ + return + } + } + 1 { + $setupResult = "Failed" + $comment = "Copy destination is a mandatory parameter" + Stop-Function -Message "Copy destination is a mandatory parameter. Please make sure the value is entered." -Target $destInstance + return + } + } # switch + } # if not force + else { + # Try to create the copy destination on the local server + try { + Write-Message -Message "Creating copy destination folder $CopyDestinationFolder" -Level Verbose + New-Item $CopyDestinationFolder -ItemType Directory -Credential $DestinationCredential -Force:$Force | Out-Null + Write-Message -Message "Copy destination $CopyDestinationFolder created." -Level Verbose + } catch { + $setupResult = "Failed" + $comment = "Something went wrong creating the copy destination folder" + Stop-Function -Message "Something went wrong creating the copy destination folder $CopyDestinationFolder. `n$_" -Target $destInstance -ErrorRecord $_ + return + } + } # else not force + } # if test path copy destination + } # if not copy destination + + Write-Message -Message "Testing copy destination path $CopyDestinationFolder" -Level Verbose + if ((Test-DbaPath -Path $CopyDestinationFolder -SqlInstance $destInstance -SqlCredential $DestinationCredential) -ne $true) { + $setupResult = "Failed" + $comment = "Copy destination folder $CopyDestinationFolder is not valid or can't be reached" + Stop-Function -Message "Copy destination folder $CopyDestinationFolder is not valid or can't be reached." -Target $destInstance + return + } elseif ($CopyDestinationFolder.StartsWith("\\") -and $CopyDestinationFolder -notmatch $RegexUnc) { + $setupResult = "Failed" + $comment = "Copy destination folder $CopyDestinationFolder has to be in the form of \\server\share" + Stop-Function -Message "Copy destination folder $CopyDestinationFolder has to be in the form of \\server\share." -Target $destInstance + return + } + + if (-not ($SecondaryDatabasePrefix -or $SecondaryDatabaseSuffix) -and ($SourceServer.Name -eq $DestinationServer.Name) -and ($SourceServer.InstanceName -eq $DestinationServer.InstanceName)) { + if ($Force) { + $SecondaryDatabaseSuffix = "_LS" + } else { + $setupResult = "Failed" + $comment = "Destination database is the same as source database" + Stop-Function -Message "Destination database is the same as source database.`nPlease check the secondary server, database prefix or suffix or use -Force to set the secondary database using a suffix." -Target $SourceSqlInstance + return + } + } + + # Check if standby is being used + if ($Standby) { + # Check the stand-by directory + if ($StandbyDirectory) { + # Check if the path is reachable for the destination server + if ((Test-DbaPath -Path $StandbyDirectory -SqlInstance $destInstance -SqlCredential $DestinationCredential) -ne $true) { + $setupResult = "Failed" + $comment = "The directory $StandbyDirectory cannot be reached by the destination instance" + Stop-Function -Message "The directory $StandbyDirectory cannot be reached by the destination instance. Please check the permission and credentials." -Target $destInstance + return + } + } elseif (-not $StandbyDirectory -and $Force) { + $StandbyDirectory = $destInstance.BackupDirectory + Write-Message -Message "Stand-by directory was not set. Setting it to $StandbyDirectory" -Level Verbose + } else { + $setupResult = "Failed" + $comment = "Please set the parameter -StandbyDirectory when using -Standby" + Stop-Function -Message "Please set the parameter -StandbyDirectory when using -Standby" -Target $SourceSqlInstance + return + } + } + + # Loop through each of the databases + foreach ($db in $DatabaseCollection) { + + # Check the status of the database + if ($db.RecoveryModel -ne 'Full') { + $setupResult = "Failed" + $comment = "Database $db is not in FULL recovery mode" + + Stop-Function -Message "Database $db is not in FULL recovery mode" -Target $SourceSqlInstance -Continue + } + + # Set the intital destination database + $SecondaryDatabase = $db.Name + + # Set the database prefix + if ($SecondaryDatabasePrefix) { + $SecondaryDatabase = "$SecondaryDatabasePrefix$($db.Name)" + } + + # Set the database suffix + if ($SecondaryDatabaseSuffix) { + $SecondaryDatabase += $SecondaryDatabaseSuffix + } + + # Check is the database is already initialized a check if the database exists on the secondary instance + if ($NoInitialization -and ($DestinationServer.Databases.Name -notcontains $SecondaryDatabase)) { + $setupResult = "Failed" + $comment = "Database $SecondaryDatabase needs to be initialized before log shipping setting can continue" + + Stop-Function -Message "Database $SecondaryDatabase needs to be initialized before log shipping setting can continue." -Target $SourceSqlInstance -Continue + } + + # Check the local backup path + if ($BackupLocalPath) { + if ($BackupLocalPath.EndsWith("\")) { + $DatabaseBackupLocalPath = "$BackupLocalPath$($db.Name)" + } else { + $DatabaseBackupLocalPath = "$BackupLocalPath\$($db.Name)" + } + } else { + $BackupLocalPath = $BackupNetworkPath + + if ($BackupLocalPath.EndsWith("\")) { + $DatabaseBackupLocalPath = "$BackupLocalPath$($db.Name)" + } else { + $DatabaseBackupLocalPath = "$BackupLocalPath\$($db.Name)" + } + } + Write-Message -Message "Backup local path set to $DatabaseBackupLocalPath." -Level Verbose + + # Setting the backup network path for the database + if ($BackupNetworkPath.EndsWith("\")) { + $DatabaseBackupNetworkPath = "$BackupNetworkPath$($db.Name)" + } else { + $DatabaseBackupNetworkPath = "$BackupNetworkPath\$($db.Name)" + } + Write-Message -Message "Backup network path set to $DatabaseBackupNetworkPath." -Level Verbose + + + # Checking if the database network path exists + if ($setupResult -ne 'Failed') { + Write-Message -Message "Testing database backup network path $DatabaseBackupNetworkPath" -Level Verbose + if ((Test-DbaPath -Path $DatabaseBackupNetworkPath -SqlInstance $SourceSqlInstance -SqlCredential $SourceCredential) -ne $true) { + # To to create the backup directory for the database + try { + Write-Message -Message "Database backup network path $DatabaseBackupNetworkPath not found. Trying to create it.." -Level Verbose + + Invoke-Command2 -Credential $SourceCredential -ScriptBlock { + Write-Message -Message "Creating backup folder $DatabaseBackupNetworkPath" -Level Verbose + $null = New-Item -Path $DatabaseBackupNetworkPath -ItemType Directory -Credential $SourceCredential -Force:$Force + } + } catch { + $setupResult = "Failed" + $comment = "Something went wrong creating the backup directory" + + Stop-Function -Message "Something went wrong creating the backup directory" -ErrorRecord $_ -Target $SourceSqlInstance -Continue + } + } + } + + # Check if the backup job name is set + if ($BackupJob) { + $DatabaseBackupJob = "$($BackupJob)$($db.Name)" + } else { + $DatabaseBackupJob = "LSBackup_$($db.Name)" + } + Write-Message -Message "Backup job name set to $DatabaseBackupJob" -Level Verbose + + # Check if the backup job schedule name is set + if ($BackupSchedule) { + $DatabaseBackupSchedule = "$($BackupSchedule)$($db.Name)" + } else { + $DatabaseBackupSchedule = "LSBackupSchedule_$($db.Name)" + } + Write-Message -Message "Backup job schedule name set to $DatabaseBackupSchedule" -Level Verbose + + # Check if secondary database is present on secondary instance + if (-not $Force -and -not $NoInitialization -and ($DestinationServer.Databases[$SecondaryDatabase].Status -ne 'Restoring') -and ($DestinationServer.Databases.Name -contains $SecondaryDatabase)) { + $setupResult = "Failed" + $comment = "Secondary database already exists on instance" + + Stop-Function -Message "Secondary database already exists on instance $destInstance." -ErrorRecord $_ -Target $destInstance -Continue + } + + # Check if the secondary database needs to be initialized + if ($setupResult -ne 'Failed') { + if (-not $NoInitialization) { + # Check if the secondary database exists on the secondary instance + if ($DestinationServer.Databases.Name -notcontains $SecondaryDatabase) { + # Check if force is being used and no option to generate the full backup is set + if ($Force -and -not ($GenerateFullBackup -or $UseExistingFullBackup)) { + # Set the option to generate a full backup + Write-Message -Message "Set option to initialize secondary database with full backup" -Level Verbose + $GenerateFullBackup = $true + } elseif (-not $Force -and -not $GenerateFullBackup -and -not $UseExistingFullBackup -and -not $UseBackupFolder) { + # Set up the confirm part + $message = "The database $SecondaryDatabase does not exist on instance $destInstance. `nDo you want to initialize it by generating a full backup?" + $choiceYes = New-Object System.Management.Automation.Host.ChoiceDescription "&Yes", "Answer Yes." + $choiceNo = New-Object System.Management.Automation.Host.ChoiceDescription "&No", "Answer No." + $options = [System.Management.Automation.Host.ChoiceDescription[]]($choiceYes, $choiceNo) + $result = $host.ui.PromptForChoice($title, $message, $options, 0) + + # Check the result from the confirm + switch ($result) { + # If yes + 0 { + # Set the option to generate a full backup + Write-Message -Message "Set option to initialize secondary database with full backup." -Level Verbose + $GenerateFullBackup = $true + } + 1 { + $setupResult = "Failed" + $comment = "The database is not initialized on the secondary instance" + + Stop-Function -Message "The database is not initialized on the secondary instance. `nPlease initialize the database on the secondary instance, use -GenerateFullbackup or use -Force." -Target $destInstance + return + } + } # switch + } + } + } + } + + + # Check the parameters for initialization of the secondary database + if (-not $NoInitialization -and ($GenerateFullBackup -or $UseExistingFullBackup -or $UseBackupFolder)) { + # Check if the restore data and log folder are set + if ($setupResult -ne 'Failed') { + if (-not $RestoreDataFolder -or -not $RestoreLogFolder) { + Write-Message -Message "Restore data folder or restore log folder are not set. Using server defaults" -Level Verbose + + # Get the default data folder + if (-not $RestoreDataFolder) { + $DatabaseRestoreDataFolder = $DestinationServer.DefaultFile + } else { + # Set the restore data folder + if ($RestoreDataFolder.EndsWith("\")) { + $DatabaseRestoreDataFolder = "$RestoreDataFolder$($db.Name)" + } else { + $DatabaseRestoreDataFolder = "$RestoreDataFolder\$($db.Name)" + } + } + + Write-Message -Message "Restore data folder set to $DatabaseRestoreDataFolder" -Level Verbose + + # Get the default log folder + if (-not $RestoreLogFolder) { + $DatabaseRestoreLogFolder = $DestinationServer.DefaultLog + } + + Write-Message -Message "Restore log folder set to $DatabaseRestoreLogFolder" -Level Verbose + + # Check if the restore data folder exists + Write-Message -Message "Testing database restore data path $DatabaseRestoreDataFolder" -Level Verbose + if ((Test-DbaPath -Path $DatabaseRestoreDataFolder -SqlInstance $destInstance -SqlCredential $DestinationCredential) -ne $true) { + if ($PSCmdlet.ShouldProcess($DestinationServerName, "Creating database restore data folder $DatabaseRestoreDataFolder on $DestinationServerName")) { + # Try creating the data folder + try { + Invoke-Command2 -Credential $DestinationCredential -ScriptBlock { + Write-Message -Message "Creating data folder $DatabaseRestoreDataFolder" -Level Verbose + $null = New-Item -Path $DatabaseRestoreDataFolder -ItemType Directory -Credential $DestinationCredential -Force:$Force + } + } catch { + $setupResult = "Failed" + $comment = "Something went wrong creating the restore data directory" + Stop-Function -Message "Something went wrong creating the restore data directory" -ErrorRecord $_ -Target $SourceSqlInstance -Continue + } + } + } + + # Check if the restore log folder exists + Write-Message -Message "Testing database restore log path $DatabaseRestoreLogFolder" -Level Verbose + if ((Test-DbaPath -Path $DatabaseRestoreLogFolder -SqlInstance $destInstance -SqlCredential $DestinationCredential) -ne $true) { + if ($PSCmdlet.ShouldProcess($DestinationServerName, "Creating database restore log folder $DatabaseRestoreLogFolder on $DestinationServerName")) { + # Try creating the log folder + try { + Write-Message -Message "Restore log folder $DatabaseRestoreLogFolder not found. Trying to create it.." -Level Verbose + + Invoke-Command2 -Credential $DestinationCredential -ScriptBlock { + Write-Message -Message "Restore log folder $DatabaseRestoreLogFolder not found. Trying to create it.." -Level Verbose + $null = New-Item -Path $DatabaseRestoreLogFolder -ItemType Directory -Credential $DestinationCredential -Force:$Force + } + } catch { + $setupResult = "Failed" + $comment = "Something went wrong creating the restore log directory" + Stop-Function -Message "Something went wrong creating the restore log directory" -ErrorRecord $_ -Target $SourceSqlInstance -Continue + } + } + } + } + } + + # Check if the full backup path can be reached + if ($setupResult -ne 'Failed') { + if ($FullBackupPath) { + Write-Message -Message "Testing full backup path $FullBackupPath" -Level Verbose + if ((Test-DbaPath -Path $FullBackupPath -SqlInstance $destInstance -SqlCredential $DestinationCredential) -ne $true) { + $setupResult = "Failed" + $comment = "The path to the full backup could not be reached" + Stop-Function -Message ("The path to the full backup could not be reached. Check the path and/or the crdential") -ErrorRecord $_ -Target $destInstance -Continue + } + } elseif ($UseBackupFolder.Length -ge 1) { + Write-Message -Message "Testing backup folder $UseBackupFolder" -Level Verbose + if ((Test-DbaPath -Path $UseBackupFolder -SqlInstance $destInstance -SqlCredential $DestinationCredential) -ne $true) { + $setupResult = "Failed" + $comment = "The path to the backup folder could not be reached" + Stop-Function -Message ("The path to the backup folder could not be reached. Check the path and/or the crdential") -ErrorRecord $_ -Target $destInstance -Continue + } + + $BackupPath = $UseBackupFolder + } elseif ($UseExistingFullBackup) { + Write-Message -Message "No path to the full backup is set. Trying to retrieve the last full backup for $db from $SourceSqlInstance" -Level Verbose + + # Get the last full backup + $LastBackup = Get-DbaBackupHistory -SqlInstance $SourceSqlInstance -Databases $($db.Name) -LastFull -Credential $SourceSqlCredential + + # Check if there was a last backup + if ($null -eq $LastBackup) { + # Test the path to the backup + Write-Message -Message "Testing last backup path $(($LastBackup[-1]).Path[-1])" -Level Verbose + if ((Test-DbaPath -Path ($LastBackup[-1]).Path[-1] -SqlInstance $SourceSqlInstance -SqlCredential $SourceCredential) -ne $true) { + $setupResult = "Failed" + $comment = "The full backup could not be found" + Stop-Function -Message "The full backup could not be found on $($LastBackup.Path). Check path and/or credentials" -ErrorRecord $_ -Target $destInstance -Continue + } + # Check if the source for the last full backup is remote and the backup is on a shared location + elseif (($LastBackup.Computername -ne $SourceServerName) -and (($LastBackup[-1]).Path[-1].StartsWith('\\') -eq $false)) { + $setupResult = "Failed" + $comment = "The last full backup is not located on shared location" + Stop-Function -Message "The last full backup is not located on shared location. `n$($_.Exception.Message)" -ErrorRecord $_ -Target $destInstance -Continue + } else { + #$FullBackupPath = $LastBackup.Path + $BackupPath = $LastBackup.Path + Write-Message -Message "Full backup found for $db. Path $BackupPath" -Level Verbose + } + } else { + Write-Message -Message "No Full backup found for $db." -Level Verbose + } + } + } + } + + # Set the copy destination folder to include the database name + if ($CopyDestinationFolder.EndsWith("\")) { + $DatabaseCopyDestinationFolder = "$CopyDestinationFolder$($db.Name)" + } else { + $DatabaseCopyDestinationFolder = "$CopyDestinationFolder\$($db.Name)" + } + Write-Message -Message "Copy destination folder set to $DatabaseCopyDestinationFolder." -Level Verbose + + # Check if the copy job name is set + if ($CopyJob) { + $DatabaseCopyJob = "$($CopyJob)$($db.Name))" + } else { + $DatabaseCopyJob = "LSCopy_$($SourceServerName)_$($db.Name)" + } + Write-Message -Message "Copy job name set to $DatabaseCopyJob" -Level Verbose + + # Check if the copy job schedule name is set + if ($CopySchedule) { + $DatabaseCopySchedule = "$($CopySchedule)$($db.Name)" + } else { + $DatabaseCopySchedule = "LSCopySchedule_$($SourceServerName)_$($db.Name)" + Write-Message -Message "Copy job schedule name set to $DatabaseCopySchedule" -Level Verbose + } + + # Check if the copy destination folder exists + if ($setupResult -ne 'Failed') { + Write-Message -Message "Testing database copy destination path $DatabaseCopyDestinationFolder" -Level Verbose + if ((Test-DbaPath -Path $DatabaseCopyDestinationFolder -SqlInstance $destInstance -SqlCredential $DestinationCredential) -ne $true) { + if ($PSCmdlet.ShouldProcess($DestinationServerName, "Creating copy destination folder on $DestinationServerName")) { + try { + Invoke-Command2 -Credential $DestinationCredential -ScriptBlock { + Write-Message -Message "Copy destination folder $DatabaseCopyDestinationFolder not found. Trying to create it.. ." -Level Verbose + $null = New-Item -Path $DatabaseCopyDestinationFolder -ItemType Directory -Credential $DestinationCredential -Force:$Force + } + } catch { + $setupResult = "Failed" + $comment = "Something went wrong creating the database copy destination folder" + Stop-Function -Message "Something went wrong creating the database copy destination folder. `n$($_.Exception.Message)" -ErrorRecord $_ -Target $DestinationServerName -Continue + } + } + } + } + + # Check if the restore job name is set + if ($RestoreJob) { + $DatabaseRestoreJob = "$($RestoreJob)$($db.Name)" + } else { + $DatabaseRestoreJob = "LSRestore_$($SourceServerName)_$($db.Name)" + } + Write-Message -Message "Restore job name set to $DatabaseRestoreJob" -Level Verbose + + # Check if the restore job schedule name is set + if ($RestoreSchedule) { + $DatabaseRestoreSchedule = "$($RestoreSchedule)$($db.Name)" + } else { + $DatabaseRestoreSchedule = "LSRestoreSchedule_$($SourceServerName)_$($db.Name)" + } + Write-Message -Message "Restore job schedule name set to $DatabaseRestoreSchedule" -Level Verbose + + # If the database needs to be backed up first + if ($setupResult -ne 'Failed') { + if ($GenerateFullBackup) { + if ($PSCmdlet.ShouldProcess($SourceSqlInstance, "Backing up database $db")) { + + Write-Message -Message "Generating full backup." -Level Verbose + Write-Message -Message "Backing up database $db to $DatabaseBackupNetworkPath" -Level Verbose + + try { + $Timestamp = Get-Date -format "yyyyMMddHHmmss" + + $LastBackup = Backup-DbaDatabase -SqlInstance $SourceSqlInstance ` + -SqlCredential $SourceSqlCredential ` + -BackupDirectory $DatabaseBackupNetworkPath ` + -BackupFileName "FullBackup_$($db.Name)_PreLogShipping_$Timestamp.bak" ` + -Databases $($db.Name) ` + -Type Full + + Write-Message -Message "Backup completed." -Level Verbose + + # Get the last full backup path + #$FullBackupPath = $LastBackup.BackupPath + $BackupPath = $LastBackup.BackupPath + + Write-Message -Message "Backup is located at $BackupPath" -Level Verbose + } catch { + $setupResult = "Failed" + $comment = "Something went wrong generating the full backup" + Stop-Function -Message "Something went wrong generating the full backup" -ErrorRecord $_ -Target $DestinationServerName -Continue + } + } + } + } + + # Check of the MonitorServerSecurityMode value is of type string and set the integer value + if ($PrimaryMonitorServerSecurityMode -notin 0, 1) { + $PrimaryMonitorServerSecurityMode = switch ($PrimaryMonitorServerSecurityMode) { + "SQLSERVER" { 0 } "WINDOWS" { 1 } default { 1 } + } + } + + # Check the primary monitor server + if ($Force -and (-not$PrimaryMonitorServer -or [string]$PrimaryMonitorServer -eq '' -or $null -eq $PrimaryMonitorServer)) { + Write-Message -Message "Setting monitor server for primary server to $SourceSqlInstance." -Level Verbose + $PrimaryMonitorServer = $SourceSqlInstance + } + + # Check the PrimaryMonitorServerSecurityMode if it's SQL Server authentication + if ($PrimaryMonitorServerSecurityMode -eq 0) { + if ($PrimaryMonitorServerLogin) { + $setupResult = "Failed" + $comment = "The PrimaryMonitorServerLogin cannot be empty" + Stop-Function -Message "The PrimaryMonitorServerLogin cannot be empty when using SQL Server authentication." -Target $SourceSqlInstance -Continue + } + + if ($PrimaryMonitorServerPassword) { + $setupResult = "Failed" + $comment = "The PrimaryMonitorServerPassword cannot be empty" + Stop-Function -Message "The PrimaryMonitorServerPassword cannot be empty when using SQL Server authentication." -Target $ -Continue + } + } + + # Check of the SecondaryMonitorServerSecurityMode value is of type string and set the integer value + if ($SecondaryMonitorServerSecurityMode -notin 0, 1) { + $SecondaryMonitorServerSecurityMode = switch ($SecondaryMonitorServerSecurityMode) { + "SQLSERVER" { 0 } "WINDOWS" { 1 } default { 1 } + } + } + + # Check the secondary monitor server + if ($Force -and (-not $SecondaryMonitorServer -or [string]$SecondaryMonitorServer -eq '' -or $null -eq $SecondaryMonitorServer)) { + Write-Message -Message "Setting secondary monitor server for $destInstance to $SourceSqlInstance." -Level Verbose + $SecondaryMonitorServer = $SourceSqlInstance + } + + # Check the MonitorServerSecurityMode if it's SQL Server authentication + if ($SecondaryMonitorServerSecurityMode -eq 0) { + if ($SecondaryMonitorServerLogin) { + $setupResult = "Failed" + $comment = "The SecondaryMonitorServerLogin cannot be empty" + Stop-Function -Message "The SecondaryMonitorServerLogin cannot be empty when using SQL Server authentication." -Target $SourceSqlInstance -Continue + } + + if ($SecondaryMonitorServerPassword) { + $setupResult = "Failed" + $comment = "The SecondaryMonitorServerPassword cannot be empty" + Stop-Function -Message "The SecondaryMonitorServerPassword cannot be empty when using SQL Server authentication." -Target $SourceSqlInstance -Continue + } + } + + # Now that all the checks have been done we can start with the fun stuff ! + + # Restore the full backup + if ($setupResult -ne 'Failed') { + if ($PSCmdlet.ShouldProcess($destInstance, "Restoring database $db to $SecondaryDatabase on $destInstance")) { + if ($GenerateFullBackup -or $UseExistingFullBackup -or $UseBackupFolder) { + try { + Write-Message -Message "Start database restore" -Level Verbose + if ($NoRecovery -or (-not $Standby)) { + if ($Force) { + $null = Restore-DbaDatabase -SqlInstance $destInstance ` + -SqlCredential $DestinationSqlCredential ` + -Path $BackupPath ` + -DestinationFilePrefix $SecondaryDatabasePrefix ` + -DestinationFileSuffix $SecondaryDatabaseSuffix ` + -DestinationDataDirectory $DatabaseRestoreDataFolder ` + -DestinationLogDirectory $DatabaseRestoreLogFolder ` + -DatabaseName $SecondaryDatabase ` + -DirectoryRecurse ` + -NoRecovery ` + -WithReplace + } else { + $null = Restore-DbaDatabase -SqlInstance $destInstance ` + -SqlCredential $DestinationSqlCredential ` + -Path $BackupPath ` + -DestinationFilePrefix $SecondaryDatabasePrefix ` + -DestinationFileSuffix $SecondaryDatabaseSuffix ` + -DestinationDataDirectory $DatabaseRestoreDataFolder ` + -DestinationLogDirectory $DatabaseRestoreLogFolder ` + -DatabaseName $SecondaryDatabase ` + -DirectoryRecurse ` + -NoRecovery + } + } + + # If the database needs to be in standby + if ($Standby) { + # Setup the path to the standby file + $StandbyDirectory = "$DatabaseCopyDestinationFolder" + + # Check if credentials need to be used + if ($DestinationSqlCredential) { + $null = Restore-DbaDatabase -SqlInstance $destInstance ` + -SqlCredential $DestinationSqlCredential ` + -Path $BackupPath ` + -DestinationFilePrefix $SecondaryDatabasePrefix ` + -DestinationFileSuffix $SecondaryDatabaseSuffix ` + -DestinationDataDirectory $DatabaseRestoreDataFolder ` + -DestinationLogDirectory $DatabaseRestoreLogFolder ` + -DatabaseName $SecondaryDatabase ` + -DirectoryRecurse ` + -StandbyDirectory $StandbyDirectory + } else { + $null = Restore-DbaDatabase -SqlInstance $destInstance ` + -Path $BackupPath ` + -DestinationFilePrefix $SecondaryDatabasePrefix ` + -DestinationFileSuffix $SecondaryDatabaseSuffix ` + -DestinationDataDirectory $DatabaseRestoreDataFolder ` + -DestinationLogDirectory $DatabaseRestoreLogFolder ` + -DatabaseName $SecondaryDatabase ` + -DirectoryRecurse ` + -StandbyDirectory $StandbyDirectory + } + } + } catch { + $setupResult = "Failed" + $comment = "Something went wrong restoring the secondary database" + Stop-Function -Message "Something went wrong restoring the secondary database" -ErrorRecord $_ -Target $SourceSqlInstance -Continue + } + + Write-Message -Message "Restore completed." -Level Verbose + } + } + } + + #region Set up log shipping on the primary instance + # Set up log shipping on the primary instance + if ($setupResult -ne 'Failed') { + if ($PSCmdlet.ShouldProcess($SourceSqlInstance, "Configuring logshipping for primary database $db on $SourceSqlInstance")) { + try { + + Write-Message -Message "Configuring logshipping for primary database" -Level Verbose + + New-DbaLogShippingPrimaryDatabase -SqlInstance $SourceSqlInstance ` + -SqlCredential $SourceSqlCredential ` + -Database $($db.Name) ` + -BackupDirectory $DatabaseBackupLocalPath ` + -BackupJob $DatabaseBackupJob ` + -BackupRetention $BackupRetention ` + -BackupShare $DatabaseBackupNetworkPath ` + -BackupThreshold $BackupThreshold ` + -CompressBackup:$BackupCompression ` + -HistoryRetention $HistoryRetention ` + -MonitorServer $PrimaryMonitorServer ` + -MonitorServerSecurityMode $PrimaryMonitorServerSecurityMode ` + -MonitorCredential $PrimaryMonitorCredential ` + -ThresholdAlertEnabled:$PrimaryThresholdAlertEnabled ` + -Force:$Force + + # Check if the backup job needs to be enabled or disabled + if ($BackupScheduleDisabled) { + $null = Set-DbaAgentJob -SqlInstance $SourceSqlInstance -SqlCredential $SourceSqlCredential -Job $DatabaseBackupJob -Disabled + Write-Message -Message "Disabling backup job $DatabaseBackupJob" -Level Verbose + } else { + $null = Set-DbaAgentJob -SqlInstance $SourceSqlInstance -SqlCredential $SourceSqlCredential -Job $DatabaseBackupJob -Enabled + Write-Message -Message "Enabling backup job $DatabaseBackupJob" -Level Verbose + } + + Write-Message -Message "Create backup job schedule $DatabaseBackupSchedule" -Level Verbose + + #Variable $BackupJobSchedule marked as unused by PSScriptAnalyzer replaced with $null for catching output + $null = New-DbaAgentSchedule -SqlInstance $SourceSqlInstance ` + -SqlCredential $SourceSqlCredential ` + -Job $DatabaseBackupJob ` + -Schedule $DatabaseBackupSchedule ` + -FrequencyType $BackupScheduleFrequencyType ` + -FrequencyInterval $BackupScheduleFrequencyInterval ` + -FrequencySubdayType $BackupScheduleFrequencySubdayType ` + -FrequencySubdayInterval $BackupScheduleFrequencySubdayInterval ` + -FrequencyRelativeInterval $BackupScheduleFrequencyRelativeInterval ` + -FrequencyRecurrenceFactor $BackupScheduleFrequencyRecurrenceFactor ` + -StartDate $BackupScheduleStartDate ` + -EndDate $BackupScheduleEndDate ` + -StartTime $BackupScheduleStartTime ` + -EndTime $BackupScheduleEndTime ` + -Force:$Force + + Write-Message -Message "Configuring logshipping from primary to secondary database." -Level Verbose + + New-DbaLogShippingPrimarySecondary -SqlInstance $SourceSqlInstance ` + -SqlCredential $SourceSqlCredential ` + -PrimaryDatabase $($db.Name) ` + -SecondaryDatabase $SecondaryDatabase ` + -SecondaryServer $destInstance ` + -SecondarySqlCredential $DestinationSqlCredential + } catch { + $setupResult = "Failed" + $comment = "Something went wrong setting up log shipping for primary instance" + Stop-Function -Message "Something went wrong setting up log shipping for primary instance" -ErrorRecord $_ -Target $SourceSqlInstance -Continue + } + } + } + #endregion Set up log shipping on the primary instance + + #region Set up log shipping on the secondary instance + # Set up log shipping on the secondary instance + if ($setupResult -ne 'Failed') { + if ($PSCmdlet.ShouldProcess($destInstance, "Configuring logshipping for secondary database $SecondaryDatabase on $destInstance")) { + try { + + Write-Message -Message "Configuring logshipping from secondary database $SecondaryDatabase to primary database $db." -Level Verbose + + New-DbaLogShippingSecondaryPrimary -SqlInstance $destInstance ` + -SqlCredential $DestinationSqlCredential ` + -BackupSourceDirectory $DatabaseBackupNetworkPath ` + -BackupDestinationDirectory $DatabaseCopyDestinationFolder ` + -CopyJob $DatabaseCopyJob ` + -FileRetentionPeriod $BackupRetention ` + -MonitorServer $SecondaryMonitorServer ` + -MonitorServerSecurityMode $SecondaryMonitorServerSecurityMode ` + -MonitorCredential $SecondaryMonitorCredential ` + -PrimaryServer $SourceSqlInstance ` + -PrimaryDatabase $($db.Name) ` + -RestoreJob $DatabaseRestoreJob ` + -Force:$Force + + Write-Message -Message "Create copy job schedule $DatabaseCopySchedule" -Level Verbose + #Variable $CopyJobSchedule marked as unused by PSScriptAnalyzer replaced with $null for catching output + $null = New-DbaAgentSchedule -SqlInstance $destInstance ` + -SqlCredential $DestinationSqlCredential ` + -Job $DatabaseCopyJob ` + -Schedule $DatabaseCopySchedule ` + -FrequencyType $CopyScheduleFrequencyType ` + -FrequencyInterval $CopyScheduleFrequencyInterval ` + -FrequencySubdayType $CopyScheduleFrequencySubdayType ` + -FrequencySubdayInterval $CopyScheduleFrequencySubdayInterval ` + -FrequencyRelativeInterval $CopyScheduleFrequencyRelativeInterval ` + -FrequencyRecurrenceFactor $CopyScheduleFrequencyRecurrenceFactor ` + -StartDate $CopyScheduleStartDate ` + -EndDate $CopyScheduleEndDate ` + -StartTime $CopyScheduleStartTime ` + -EndTime $CopyScheduleEndTime ` + -Force:$Force + + Write-Message -Message "Create restore job schedule $DatabaseRestoreSchedule" -Level Verbose + + #Variable $RestoreJobSchedule marked as unused by PSScriptAnalyzer replaced with $null for catching output + $null = New-DbaAgentSchedule -SqlInstance $destInstance ` + -SqlCredential $DestinationSqlCredential ` + -Job $DatabaseRestoreJob ` + -Schedule $DatabaseRestoreSchedule ` + -FrequencyType $RestoreScheduleFrequencyType ` + -FrequencyInterval $RestoreScheduleFrequencyInterval ` + -FrequencySubdayType $RestoreScheduleFrequencySubdayType ` + -FrequencySubdayInterval $RestoreScheduleFrequencySubdayInterval ` + -FrequencyRelativeInterval $RestoreScheduleFrequencyRelativeInterval ` + -FrequencyRecurrenceFactor $RestoreScheduleFrequencyRecurrenceFactor ` + -StartDate $RestoreScheduleStartDate ` + -EndDate $RestoreScheduleEndDate ` + -StartTime $RestoreScheduleStartTime ` + -EndTime $RestoreScheduleEndTime ` + -Force:$Force + + Write-Message -Message "Configuring logshipping for secondary database." -Level Verbose + + New-DbaLogShippingSecondaryDatabase -SqlInstance $destInstance ` + -SqlCredential $DestinationSqlCredential ` + -SecondaryDatabase $SecondaryDatabase ` + -PrimaryServer $SourceSqlInstance ` + -PrimaryDatabase $($db.Name) ` + -RestoreDelay $RestoreDelay ` + -RestoreMode $DatabaseStatus ` + -DisconnectUsers:$DisconnectUsers ` + -RestoreThreshold $RestoreThreshold ` + -ThresholdAlertEnabled:$SecondaryThresholdAlertEnabled ` + -HistoryRetention $HistoryRetention ` + -MonitorServer $PrimaryMonitorServer ` + -MonitorServerSecurityMode $PrimaryMonitorServerSecurityMode ` + -MonitorCredential $PrimaryMonitorCredential + + # Check if the copy job needs to be enabled or disabled + if ($CopyScheduleDisabled) { + $null = Set-DbaAgentJob -SqlInstance $destInstance -SqlCredential $DestinationSqlCredential -Job $DatabaseCopyJob -Disabled + } else { + $null = Set-DbaAgentJob -SqlInstance $destInstance -SqlCredential $DestinationSqlCredential -Job $DatabaseCopyJob -Enabled + } + + # Check if the restore job needs to be enabled or disabled + if ($RestoreScheduleDisabled) { + $null = Set-DbaAgentJob -SqlInstance $destInstance -SqlCredential $DestinationSqlCredential -Job $DatabaseRestoreJob -Disabled + } else { + $null = Set-DbaAgentJob -SqlInstance $destInstance -SqlCredential $DestinationSqlCredential -Job $DatabaseRestoreJob -Enabled + } + + } catch { + $setupResult = "Failed" + $comment = "Something went wrong setting up log shipping for secondary instance" + Stop-Function -Message "Something went wrong setting up log shipping for secondary instance.`n$($_.Exception.Message)" -ErrorRecord $_ -Target $destInstance -Continue + } + } + } + #endregion Set up log shipping on the secondary instance + + Write-Message -Message "Completed configuring log shipping for database $db" -Level Verbose + + [PSCustomObject]@{ + PrimaryInstance = $SourceServer.DomainInstanceName + SecondaryInstance = $DestinationServer.DomainInstanceName + PrimaryDatabase = $($db.Name) + SecondaryDatabase = $SecondaryDatabase + Result = $setupResult + Comment = $comment + } + + } # for each database + } # end for each destination server + } # end process + end { + Write-Message -Message "Finished setting up log shipping." -Level Verbose + Test-DbaDeprecation -DeprecatedOn "1.0.0" -Alias Invoke-DbaLogShipping + } +} +function Invoke-DbaDbLogShipRecovery { + <# + .SYNOPSIS + Invoke-DbaDbLogShipRecovery recovers log shipped databases to a normal state to act upon a migration or disaster. + + .DESCRIPTION + By default all the databases for a particular instance are recovered. + If the database is in the right state, either standby or recovering, the process will try to recover the database. + + At first the function will check if the backup source directory can still be reached. + If so it will look up the last transaction log backup for the database. If that backup file is not the last copied file the log shipping copy job will be started. + If the directory cannot be reached for the function will continue to the restoring process. + After the copy job check is performed the job is disabled to prevent the job to run. + + For the restore the log shipping status is checked in the msdb database. + If the last restored file is not the same as the last file name found, the log shipping restore job will be executed. + After the restore job check is performed the job is disabled to prevent the job to run + + The last part is to set the database online by restoring the databases with recovery + + .PARAMETER SqlInstance + The target SQL Server instance or instances. + + .PARAMETER Database + Database to perform the restore for. This value can also be piped enabling multiple databases to be recovered. + If this value is not supplied all databases will be recovered. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER NoRecovery + Allows you to choose to not restore the database to a functional state (Normal) in the final steps of the process. + By default the database is restored to a functional state (Normal). + + .PARAMETER InputObject + Allows piped input from Get-DbaDatabase + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .PARAMETER Force + Use this parameter to force the function to continue and perform any adjusting actions to successfully execute + + .PARAMETER Delay + Set the delay in seconds to wait for the copy and/or restore jobs. + By default the delay is 5 seconds + + .PARAMETER WhatIf + Shows what would happen if the command were to run. No actions are actually performed. + + .PARAMETER Confirm + Prompts you for confirmation before executing any changing operations within the command. + + .NOTES + Tags: LogShipping + Author: Sander Stad (@sqlstad), sqlstad.nl + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Invoke-DbaDbLogShipRecovery + + .EXAMPLE + PS C:\> Invoke-DbaDbLogShipRecovery -SqlInstance server1 + + Recovers all the databases on the instance that are enabled for log shipping + + .EXAMPLE + PS C:\> Invoke-DbaDbLogShipRecovery -SqlInstance server1 -SqlCredential $cred -Verbose + + Recovers all the databases on the instance that are enabled for log shipping using a credential + + .EXAMPLE + PS C:\> Invoke-DbaDbLogShipRecovery -SqlInstance server1 -database db_logship -Verbose + + Recovers the database "db_logship" to a normal status + + .EXAMPLE + PS C:\> db1, db2, db3, db4 | Invoke-DbaDbLogShipRecovery -SqlInstance server1 -Verbose + + Recovers the database db1, db2, db3, db4 to a normal status + + .EXAMPLE + PS C:\> Invoke-DbaDbLogShipRecovery -SqlInstance server1 -WhatIf + + Shows what would happen if the command were executed. + + #> + [CmdletBinding(SupportsShouldProcess)] + param + ( + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [string[]]$Database, + [PSCredential]$SqlCredential, + [switch]$NoRecovery, + [Alias('Silent')] + [switch]$EnableException, + [switch]$Force, + [Parameter(ValueFromPipeline)] + [Microsoft.SqlServer.Management.Smo.Database[]]$InputObject, + [int]$Delay = 5 + ) + begin { + $stepCounter = 0 + } + process { + foreach ($instance in $SqlInstance) { + if (-not $Force -and -not $Database) { + Stop-Function -Message "You must specify a -Database or -Force for all databases" -Target $server.name + return + } + $InputObject += Get-DbaDatabase -SqlInstance $instance -SqlCredential $SqlCredential -Database $Database + } + + # Loop through all the databases + foreach ($db in $InputObject) { + $stepCounter = 0 + $server = $db.Parent + $instance = $server.Name + $activity = "Performing log shipping recovery for $($db.Name) on $($server.Name)" + # Try to get the agent service details + try { + # Get the service details + $agentStatus = $server.Query("SELECT COUNT(*) as AgentCount FROM master.dbo.sysprocesses WITH (nolock) WHERE Program_Name LIKE 'SQLAgent%'") + + if ($agentStatus.AgentCount -lt 1) { + Stop-Function -Message "The agent service is not in a running state. Please start the service." -ErrorRecord $_ -Target $server.name + return + } + } catch { + Stop-Function -Message "Unable to get SQL Server Agent Service status" -ErrorRecord $_ -Target $server.name + return + } + # Query for retrieving the log shipping information + $query = "SELECT lss.primary_server, lss.primary_database, lsd.secondary_database, lss.backup_source_directory, + lss.backup_destination_directory, lss.last_copied_file, lss.last_copied_date, + lsd.last_restored_file, sj1.name AS 'copyjob', sj2.name AS 'restorejob' + FROM msdb.dbo.log_shipping_secondary AS lss + INNER JOIN msdb.dbo.log_shipping_secondary_databases AS lsd ON lsd.secondary_id = lss.secondary_id + INNER JOIN msdb.dbo.sysjobs AS sj1 ON sj1.job_id = lss.copy_job_id + INNER JOIN msdb.dbo.sysjobs AS sj2 ON sj2.job_id = lss.restore_job_id + WHERE lsd.secondary_database = '$($db.Name)'" + + # Retrieve the log shipping information from the secondary instance + try { + Write-Message -Message "Retrieving log shipping information from the secondary instance" -Level Verbose + Write-ProgressHelper -Activity $activity -StepNumber ($stepCounter++) -Message "Retrieving log shipping information from the secondary instance" + $logshipping_details = $server.Query($query) + } catch { + Stop-Function -Message "Error retrieving the log shipping details: $($_.Exception.Message)" -ErrorRecord $_ -Target $server.name + return + } + + # Check if there are any databases to recover + if ($null -eq $logshipping_details) { + Stop-Function -Message "The database $db is not configured as a secondary database for log shipping." -Continue + } else { + # Loop through each of the log shipped databases + foreach ($ls in $logshipping_details) { + $secondarydb = $ls.secondary_database + + $recoverResult = "Success" + $comment = "" + $jobOutputs = @() + + # Check if the database is in the right state + if ($server.Databases[$secondarydb].Status -notin ('Normal, Standby', 'Standby', 'Restoring')) { + Stop-Function -Message "The database $db doesn't have the right status to be recovered" -Continue + } else { + Write-Message -Message "Started Recovery for $secondarydb" -Level Verbose + + # Start the job to get the latest files + if ($PSCmdlet.ShouldProcess($server.name, ("Starting copy job $($ls.copyjob)"))) { + Write-Message -Message "Starting copy job $($ls.copyjob)" -Level Verbose + + Write-ProgressHelper -Activity $activity -StepNumber ($stepCounter++) -Message "Starting copy job" + try { + $null = Start-DbaAgentJob -SqlInstance $instance -SqlCredential $sqlcredential -Job $ls.copyjob + } catch { + $recoverResult = "Failed" + $comment = "Something went wrong starting the copy job $($ls.copyjob)" + Stop-Function -Message "Something went wrong starting the copy job.`n$($_)" -ErrorRecord $_ -Target $server.name + } + + if ($recoverResult -ne 'Failed') { + Write-Message -Message "Copying files to $($ls.backup_destination_directory)" -Level Verbose + + Write-Message -Message "Waiting for the copy action to complete.." -Level Verbose + + # Get the job status + $jobStatus = Get-DbaAgentJob -SqlInstance $instance -SqlCredential $sqlcredential -Job $ls.copyjob + + while ($jobStatus.CurrentRunStatus -ne 'Idle') { + # Sleep for while to let the files be copied + Start-Sleep -Seconds $Delay + + # Get the job status + $jobStatus = Get-DbaAgentJob -SqlInstance $instance -SqlCredential $sqlcredential -Job $ls.copyjob + } + + # Check the lat outcome of the job + if ($jobStatus.LastRunOutcome -eq 'Failed') { + $recoverResult = "Failed" + $comment = "The copy job for database $db failed. Please check the error log." + Stop-Function -Message "The copy job for database $db failed. Please check the error log." + } + + $jobOutputs += $jobStatus + + Write-Message -Message "Copying of backup files finished" -Level Verbose + } + } # if should process + + # Disable the log shipping copy job on the secondary instance + if ($recoverResult -ne 'Failed') { + Write-ProgressHelper -Activity $activity -StepNumber ($stepCounter++) -Message "Disabling copy job" + + if ($PSCmdlet.ShouldProcess($server.name, "Disabling copy job $($ls.copyjob)")) { + try { + Write-Message -Message "Disabling copy job $($ls.copyjob)" -Level Verbose + $null = Set-DbaAgentJob -SqlInstance $instance -SqlCredential $sqlcredential -Job $ls.copyjob -Disabled + } catch { + $recoverResult = "Failed" + $comment = "Something went wrong disabling the copy job." + Stop-Function -Message "Something went wrong disabling the copy job.`n$($_)" -ErrorRecord $_ -Target $server.name + } + } + } + + if ($recoverResult -ne 'Failed') { + # Start the restore job + Write-ProgressHelper -Activity $activity -StepNumber ($stepCounter++) -Message "Starting restore job" + + if ($PSCmdlet.ShouldProcess($server.name, ("Starting restore job " + $ls.restorejob))) { + Write-Message -Message "Starting restore job $($ls.restorejob)" -Level Verbose + try { + $null = Start-DbaAgentJob -SqlInstance $instance -SqlCredential $sqlcredential -Job $ls.restorejob + } catch { + $comment = "Something went wrong starting the restore job." + Stop-Function -Message "Something went wrong starting the restore job.`n$($_)" -ErrorRecord $_ -Target $server.name + } + + Write-Message -Message "Waiting for the restore action to complete.." -Level Verbose + + # Get the job status + $jobStatus = Get-DbaAgentJob -SqlInstance $instance -SqlCredential $sqlcredential -Job $ls.restorejob + + while ($jobStatus.CurrentRunStatus -ne 'Idle') { + # Sleep for while to let the files be copied + Start-Sleep -Seconds $Delay + + # Get the job status + $jobStatus = Get-DbaAgentJob -SqlInstance $instance -SqlCredential $sqlcredential -Job $ls.restorejob + } + + # Check the lat outcome of the job + if ($jobStatus.LastRunOutcome -eq 'Failed') { + $recoverResult = "Failed" + $comment = "The restore job for database $db failed. Please check the error log." + Stop-Function -Message "The restore job for database $db failed. Please check the error log." + } + + $jobOutputs += $jobStatus + } + } + + if ($recoverResult -ne 'Failed') { + # Disable the log shipping restore job on the secondary instance + if ($PSCmdlet.ShouldProcess($server.name, "Disabling restore job $($ls.restorejob)")) { + try { + Write-Message -Message ("Disabling restore job " + $ls.restorejob) -Level Verbose + $null = Set-DbaAgentJob -SqlInstance $instance -SqlCredential $sqlcredential -Job $ls.restorejob -Disabled + } catch { + $recoverResult = "Failed" + $comment = "Something went wrong disabling the restore job." + Stop-Function -Message "Something went wrong disabling the restore job.`n$($_)" -ErrorRecord $_ -Target $server.name + } + } + } + + if ($recoverResult -ne 'Failed') { + # Check if the database needs to recovered to its normal state + if ($NoRecovery -eq $false) { + if ($PSCmdlet.ShouldProcess($secondarydb, "Restoring database with recovery")) { + Write-Message -Message "Restoring the database to it's normal state" -Level Verbose + try { + $query = "RESTORE DATABASE [$secondarydb] WITH RECOVERY" + $server.Query($query) + + } catch { + $recoverResult = "Failed" + $comment = "Something went wrong restoring the database to a normal state." + Stop-Function -Message "Something went wrong restoring the database to a normal state.`n$($_)" -ErrorRecord $_ -Target $secondarydb + } + } + } else { + $comment = "Skipping restore with recovery." + Write-Message -Message "Skipping restore with recovery" -Level Verbose + } + + Write-Message -Message ("Finished Recovery for $secondarydb") -Level Verbose + } + + # Reset the log ship details + $logshipping_details = $null + + [PSCustomObject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.InstanceName + SqlInstance = $server.DomainInstanceName + Database = $secondarydb + RecoverResult = $recoverResult + Comment = $comment + } + + } + } + } + Write-Progress -Activity $activity -Completed + $stepCounter = 0 + } + } + end { + Test-DbaDeprecation -DeprecatedOn "1.0.0" -Alias Invoke-DbaLogShippingRecovery + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function Invoke-DbaDbMirrorFailover { + <# + .SYNOPSIS + Failover a mirrored database + + .DESCRIPTION + Failover a mirrored database + + .PARAMETER SqlInstance + SQL Server name or SMO object representing the primary SQL Server. + + .PARAMETER SqlCredential + Login to the primary instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Database + The database or databases to mirror + + .PARAMETER InputObject + Allows piping from Get-DbaDatabase + + .PARAMETER Force + Force Failover and allow data loss + + .PARAMETER WhatIf + Shows what would happen if the command were to run. No actions are actually performed. + + .PARAMETER Confirm + Prompts you for confirmation before executing any changing operations within the command. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Mirror, HA + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + TODO: add service accounts + + .LINK + https://dbatools.io/Invoke-DbaDbMirrorFailover + + .EXAMPLE + PS C:\> Invoke-DbaDbMirrorFailover -SqlInstance sql2016 -Database pubs + + Fails over the pubs database on sql2016. Prompts for confirmation. + + .EXAMPLE + PS C:\> Get-DbaDatabase -SqlInstance sql2016 -Database pubs | Invoke-DbaDbMirrorFailover -Force -Confirm:$false + + Forces the failover of the pubs database on sql2016 and allows data loss. + Does not prompt for confirmation. + + #> + [CmdletBinding(SupportsShouldProcess, ConfirmImpact = 'High')] + param ( + [DbaInstanceParameter]$SqlInstance, + [PSCredential]$SqlCredential, + [string[]]$Database, + [parameter(ValueFromPipeline)] + [Microsoft.SqlServer.Management.Smo.Database[]]$InputObject, + [switch]$Force, + [switch]$EnableException + ) + process { + if ((Test-Bound -ParameterName SqlInstance) -and (Test-Bound -Not -ParameterName Database)) { + Stop-Function -Message "Database is required when SqlInstance is specified" + return + } + + $InputObject += Get-DbaDatabase -SqlInstance $SqlInstance -SqlCredential $SqlCredential -Database $Database + + foreach ($db in $InputObject) { + # if it's async, you have to break the mirroring and allow data loss + # alter database set partner force_service_allow_data_loss + # if it's sync mirroring you know it's all in sync, so you can just do alter database [dbname] set partner failover + if ($Force) { + if ($Pscmdlet.ShouldProcess($db.Parent.Name, "Forcing failover of $db and allowing data loss")) { + $db | Set-DbaDbMirror -State ForceFailoverAndAllowDataLoss + } + } else { + if ($Pscmdlet.ShouldProcess($db.Parent.Name, "Setting safety level to full and failing over $db to partner server")) { + $db | Set-DbaDbMirror -SafetyLevel Full + $db | Set-DbaDbMirror -State Failover + } + } + } + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function Invoke-DbaDbMirroring { + <# + .SYNOPSIS + Automates the creation of database mirrors. + + .DESCRIPTION + Automates the creation of database mirrors. + + * Verifies that a mirror is possible + * Sets the recovery model to Full if needed + * If the database does not exist on mirror or witness, a backup/restore is performed + * Sets up endpoints if necessary + * Creates a login and grants permissions to service accounts if needed + * Starts endpoints if needed + * Sets up partner for mirror + * Sets up partner for primary + * Sets up witness if one is specified + + NOTE: If a backup / restore is performed, the backups will be left in tact on the network share. + + .PARAMETER Primary + SQL Server name or SMO object representing the primary SQL Server. + + .PARAMETER PrimarySqlCredential + Login to the primary instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Mirror + SQL Server name or SMO object representing the mirror SQL Server. + + .PARAMETER MirrorSqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Witness + SQL Server name or SMO object representing the witness SQL Server. + + .PARAMETER WitnessSqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Database + The database or databases to mirror. + + .PARAMETER SharedPath + The network share where the backups will be backed up and restored from. + + Each SQL Server service account must have access to this share. + + NOTE: If a backup / restore is performed, the backups will be left in tact on the network share. + + .PARAMETER InputObject + Enables piping from Get-DbaDatabase. + + .PARAMETER UseLastBackup + Use the last full backup of database. + + .PARAMETER Force + Drop and recreate the database on remote servers using fresh backup. + + .PARAMETER WhatIf + Shows what would happen if the command were to run. No actions are actually performed. + + .PARAMETER Confirm + Prompts you for confirmation before executing any changing operations within the command. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Mirror, HA + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Invoke-DbaDbMirroring + + .EXAMPLE + PS C:\> $params = @{ + >> Primary = 'sql2017a' + >> Mirror = 'sql2017b' + >> MirrorSqlCredential = 'sqladmin' + >> Witness = 'sql2019' + >> Database = 'pubs' + >> SharedPath = '\\nas\sql\share' + >> } + >> + PS C:\> Invoke-DbaDbMirroring @params + + Performs a bunch of checks to ensure the pubs database on sql2017a + can be mirrored from sql2017a to sql2017b. Logs in to sql2019 and sql2017a + using Windows credentials and sql2017b using a SQL credential. + + Prompts for confirmation for most changes. To avoid confirmation, use -Confirm:$false or + use the syntax in the second example. + + .EXAMPLE + PS C:\> $params = @{ + >> Primary = 'sql2017a' + >> Mirror = 'sql2017b' + >> MirrorSqlCredential = 'sqladmin' + >> Witness = 'sql2019' + >> Database = 'pubs' + >> SharedPath = '\\nas\sql\share' + >> Force = $true + >> Confirm = $false + >> } + >> + PS C:\> Invoke-DbaDbMirroring @params + + Performs a bunch of checks to ensure the pubs database on sql2017a + can be mirrored from sql2017a to sql2017b. Logs in to sql2019 and sql2017a + using Windows credentials and sql2017b using a SQL credential. + + Drops existing pubs database on Mirror and Witness and restores them with + a fresh backup. + + Does all the things in the decription, does not prompt for confirmation. + + .EXAMPLE + PS C:\> $map = @{ 'database_data' = 'M:\Data\database_data.mdf' 'database_log' = 'L:\Log\database_log.ldf' } + PS C:\> Get-ChildItem \\nas\seed | Restore-DbaDatabase -SqlInstance sql2017b -FileMapping $map -NoRecovery + PS C:\> Get-DbaDatabase -SqlInstance sql2017a -Database pubs | Invoke-DbaDbMirroring -Mirror sql2017b -Confirm:$false + + Restores backups from sql2017a to a specific file struture on sql2017b then creates mirror with no prompts for confirmation. + + .EXAMPLE + PS C:\> Get-DbaDatabase -SqlInstance sql2017a -Database pubs | + >> Invoke-DbaDbMirroring -Mirror sql2017b -UseLastBackup -Confirm:$false + + Mirrors pubs on sql2017a to sql2017b and uses the last full and logs from sql2017a to seed. Doesn't prompt for confirmation. + + #> + [CmdletBinding(SupportsShouldProcess, ConfirmImpact = 'High')] + param ( + [DbaInstanceParameter]$Primary, + [PSCredential]$PrimarySqlCredential, + [parameter(Mandatory)] + [DbaInstanceParameter[]]$Mirror, + [PSCredential]$MirrorSqlCredential, + [DbaInstanceParameter]$Witness, + [PSCredential]$WitnessSqlCredential, + [string[]]$Database, + [Alias("NetworkShare")] + [string]$SharedPath, + [parameter(ValueFromPipeline)] + [Microsoft.SqlServer.Management.Smo.Database[]]$InputObject, + [switch]$UseLastBackup, + [switch]$Force, + [switch]$EnableException + ) + begin { + Test-DbaDeprecation -DeprecatedOn 1.0.0 -Parameter NetworkShare -CustomMessage "Using the parameter NetworkShare is deprecated. This parameter will be removed in version 1.0.0 or before. Use SharedPath instead." + + $params = $PSBoundParameters + $null = $params.Remove('UseLastBackup') + $null = $params.Remove('Force') + $null = $params.Remove('Confirm') + $null = $params.Remove('Whatif') + } + process { + if ((Test-Bound -ParameterName Primary) -and (Test-Bound -Not -ParameterName Database)) { + Stop-Function -Message "Database is required when Primary is specified" + return + } + + if ($Force -and (-not $SharedPath -and -not $UseLastBackup)) { + Stop-Function -Message "SharedPath or UseLastBackup is required when Force is used" + return + } + + if ($Primary) { + $InputObject += Get-DbaDatabase -SqlInstance $Primary -SqlCredential $PrimarySqlCredential -Database $Database + } + + foreach ($primarydb in $InputObject) { + $stepCounter = 0 + $Primary = $source = $primarydb.Parent + + try { + $dest = Connect-SqlInstance -SqlInstance $Mirror -SqlCredential $MirrorSqlCredential + + if ($Witness) { + $witserver = Connect-SqlInstance -SqlInstance $Witness -SqlCredential $WitnessSqlCredential + } + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + $dbName = $primarydb.Name + + Write-ProgressHelper -StepNumber ($stepCounter++) -Message "Validating mirror setup" + # Thanks to https://github.com/mmessano/PowerShell/blob/master/SQL-ConfigureDatabaseMirroring.ps1 for the tips + + $validation = Invoke-DbMirrorValidation @params + + if ((Test-Bound -ParameterName SharedPath) -and -not $validation.AccessibleShare) { + Stop-Function -Continue -Message "Cannot access $SharedPath from $($dest.Name)" + } + + if (-not $validation.EditionMatch) { + Stop-Function -Continue -Message "This mirroring configuration is not supported. Because the principal server instance, $source, is $($source.EngineEdition) Edition, the mirror server instance must also be $($source.EngineEdition) Edition." + } + + if ($validation.MirroringStatus -ne "None") { + Stop-Function -Continue -Message "Cannot setup mirroring on database ($dbname) due to its current mirroring state: $($primarydb.MirroringStatus)" + } + + if ($primarydb.Status -ne "Normal") { + Stop-Function -Continue -Message "Cannot setup mirroring on database ($dbname) due to its current state: $($primarydb.Status)" + } + + Write-ProgressHelper -StepNumber ($stepCounter++) -Message "Setting recovery model for $dbName on $($source.Name) to Full" + + if ($primarydb.RecoveryModel -ne "Full") { + if ((Test-Bound -ParameterName UseLastBackup)) { + Stop-Function -Continue -Message "$dbName not set to full recovery. UseLastBackup cannot be used." + } else { + Set-DbaDbRecoveryModel -SqlInstance $source -Database $primarydb.Name -RecoveryModel Full + } + } + + Write-ProgressHelper -StepNumber ($stepCounter++) -Message "Copying $dbName from primary to mirror" + if (-not $validation.DatabaseExistsOnMirror -or $Force) { + if ($UseLastBackup) { + $allbackups = Get-DbaBackupHistory -SqlInstance $primarydb.Parent -Database $primarydb.Name -IncludeCopyOnly -Last + } else { + if ($Force -or $Pscmdlet.ShouldProcess("$Primary", "Creating full and log backups of $primarydb on $SharedPath")) { + $fullbackup = $primarydb | Backup-DbaDatabase -BackupDirectory $SharedPath -Type Full + $logbackup = $primarydb | Backup-DbaDatabase -BackupDirectory $SharedPath -Type Log + $allbackups = $fullbackup, $logbackup + } + } + if ($Pscmdlet.ShouldProcess("$Mirror", "Restoring full and log backups of $primarydb from $Primary")) { + foreach ($mirrorinstance in $Mirror) { + try { + $null = $allbackups | Restore-DbaDatabase -SqlInstance $mirrorinstance -SqlCredential $MirrorSqlCredential -WithReplace -NoRecovery -TrustDbBackupHistory -EnableException + } catch { + Stop-Function -Message "Failure" -ErrorRecord $_ -Target $dest -Continue + } + } + } + + if ($SharedPath) { + Write-Message -Level Verbose -Message "Backups still exist on $SharedPath" + } + } + + $mirrordb = Get-DbaDatabase -SqlInstance $dest -Database $dbName + + Write-ProgressHelper -StepNumber ($stepCounter++) -Message "Copying $dbName from primary to witness" + + if ($Witness -and (-not $validation.DatabaseExistsOnWitness -or $Force)) { + if (-not $allbackups) { + if ($UseLastBackup) { + $allbackups = Get-DbaBackupHistory -SqlInstance $primarydb.Parent -Database $primarydb.Name -IncludeCopyOnly -Last + } else { + if ($Force -or $Pscmdlet.ShouldProcess("$Primary", "Creating full and log backups of $primarydb on $SharedPath")) { + $fullbackup = $primarydb | Backup-DbaDatabase -BackupDirectory $SharedPath -Type Full + $logbackup = $primarydb | Backup-DbaDatabase -BackupDirectory $SharedPath -Type Log + $allbackups = $fullbackup, $logbackup + } + } + } + + if ($Pscmdlet.ShouldProcess("$Witness", "Restoring full and log backups of $primarydb from $Primary")) { + try { + $null = $allbackups | Restore-DbaDatabase -SqlInstance $Witness -SqlCredential $WitnessSqlCredential -WithReplace -NoRecovery -TrustDbBackupHistory -EnableException + } catch { + Stop-Function -Message "Failure" -ErrorRecord $_ -Target $witserver -Continue + } + } + } + + $primaryendpoint = Get-DbaEndpoint -SqlInstance $source | Where-Object EndpointType -eq DatabaseMirroring + $mirrorendpoint = Get-DbaEndpoint -SqlInstance $dest | Where-Object EndpointType -eq DatabaseMirroring + + if (-not $primaryendpoint) { + Write-ProgressHelper -StepNumber ($stepCounter++) -Message "Setting up endpoint for primary" + $primaryendpoint = New-DbaEndpoint -SqlInstance $source -Type DatabaseMirroring -Role Partner -Name Mirroring -EncryptionAlgorithm RC4 + $null = $primaryendpoint | Stop-DbaEndpoint + $null = $primaryendpoint | Start-DbaEndpoint + } + + if (-not $mirrorendpoint) { + Write-ProgressHelper -StepNumber ($stepCounter++) -Message "Setting up endpoint for mirror" + $mirrorendpoint = New-DbaEndpoint -SqlInstance $dest -Type DatabaseMirroring -Role Partner -Name Mirroring -EncryptionAlgorithm RC4 + $null = $mirrorendpoint | Stop-DbaEndpoint + $null = $mirrorendpoint | Start-DbaEndpoint + } + + if ($witserver) { + Write-ProgressHelper -StepNumber ($stepCounter++) -Message "Setting up endpoint for witness" + $witnessendpoint = Get-DbaEndpoint -SqlInstance $witserver | Where-Object EndpointType -eq DatabaseMirroring + if (-not $witnessendpoint) { + $witnessendpoint = New-DbaEndpoint -SqlInstance $witserver -Type DatabaseMirroring -Role Witness -Name Mirroring -EncryptionAlgorithm RC4 + $null = $witnessendpoint | Stop-DbaEndpoint + $null = $witnessendpoint | Start-DbaEndpoint + } + } + + Write-ProgressHelper -StepNumber ($stepCounter++) -Message "Granting permissions to service account" + + $serviceaccounts = $source.ServiceAccount, $dest.ServiceAccount, $witserver.ServiceAccount | Select-Object -Unique + + foreach ($account in $serviceaccounts) { + if ($Pscmdlet.ShouldProcess("primary, mirror and witness (if specified)", "Creating login $account and granting CONNECT ON ENDPOINT")) { + $null = New-DbaLogin -SqlInstance $source -Login $account -WarningAction SilentlyContinue + $null = New-DbaLogin -SqlInstance $dest -Login $account -WarningAction SilentlyContinue + try { + $null = $source.Query("GRANT CONNECT ON ENDPOINT::$primaryendpoint TO [$account]") + $null = $dest.Query("GRANT CONNECT ON ENDPOINT::$mirrorendpoint TO [$account]") + if ($witserver) { + $null = New-DbaLogin -SqlInstance $witserver -Login $account -WarningAction SilentlyContinue + $witserver.Query("GRANT CONNECT ON ENDPOINT::$witnessendpoint TO [$account]") + } + } catch { + Stop-Function -Continue -Message "Failure" -ErrorRecord $_ + } + } + } + + Write-ProgressHelper -StepNumber ($stepCounter++) -Message "Starting endpoints if necessary" + try { + $null = $primaryendpoint, $mirrorendpoint, $witnessendpoint | Start-DbaEndpoint -EnableException + } catch { + Stop-Function -Continue -Message "Failure" -ErrorRecord $_ + } + + try { + Write-ProgressHelper -StepNumber ($stepCounter++) -Message "Setting up partner for mirror" + $null = $mirrordb | Set-DbaDbMirror -Partner $primaryendpoint.Fqdn -EnableException + } catch { + Stop-Function -Continue -Message "Failure on mirror" -ErrorRecord $_ + } + + try { + Write-ProgressHelper -StepNumber ($stepCounter++) -Message "Setting up partner for primary" + $null = $primarydb | Set-DbaDbMirror -Partner $mirrorendpoint.Fqdn -EnableException + } catch { + Stop-Function -Continue -Message "Failure on primary" -ErrorRecord $_ + } + + try { + if ($witnessendpoint) { + $null = $primarydb | Set-DbaDbMirror -Witness $witnessendpoint.Fqdn -EnableException + } + } catch { + Stop-Function -Continue -Message "Failure with the new last part" -ErrorRecord $_ + } + + if ($Pscmdlet.ShouldProcess("console", "Showing results")) { + $results = [pscustomobject]@{ + Primary = $Primary + Mirror = $Mirror -join ", " + Witness = $Witness + Database = $primarydb.Name + Status = "Success" + } + if ($Witness) { + $results | Select-DefaultView -Property Primary, Mirror, Witness, Database, Status + } else { + $results | Select-DefaultView -Property Primary, Mirror, Database, Status + } + } + } + } +} +function Invoke-DbaDbShrink { + <# + .SYNOPSIS + Shrinks all files in a database. This is a command that should rarely be used. + + - Shrinks can cause severe index fragmentation (to the tune of 99%) + - Shrinks can cause massive growth in the database's transaction log + - Shrinks can require a lot of time and system resources to perform data movement + + .DESCRIPTION + Shrinks all files in a database. Databases should be shrunk only when completely necessary. + + Many awesome SQL people have written about why you should not shrink your data files. Paul Randal and Kalen Delaney wrote great posts about this topic: + + http://www.sqlskills.com/blogs/paul/why-you-should-not-shrink-your-data-files + http://sqlmag.com/sql-server/shrinking-data-files + + However, there are some cases where a database will need to be shrunk. In the event that you must shrink your database: + + 1. Ensure you have plenty of space for your T-Log to grow + 2. Understand that shrinks require a lot of CPU and disk resources + 3. Consider running DBCC INDEXDEFRAG or ALTER INDEX ... REORGANIZE after the shrink is complete. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. Defaults to the default instance on localhost. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential). + + .PARAMETER Database + The database(s) to process - this list is auto-populated from the server. If unspecified, all databases will be processed. + + .PARAMETER ExcludeDatabase + The database(s) to exclude - this list is auto-populated from the server. + + .PARAMETER AllUserDatabases + Run command against all user databases. + + .PARAMETER PercentFreeSpace + Specifies how much free space to leave, defaults to 0. + + .PARAMETER ShrinkMethod + Specifies the method that is used to shrink the database + Default + Data in pages located at the end of a file is moved to pages earlier in the file. Files are truncated to reflect allocated space. + EmptyFile + Migrates all of the data from the referenced file to other files in the same filegroup. (DataFile and LogFile objects only). + NoTruncate + Data in pages located at the end of a file is moved to pages earlier in the file. + TruncateOnly + Data distribution is not affected. Files are truncated to reflect allocated space, recovering free space at the end of any file. + + .PARAMETER StatementTimeout + Timeout in minutes. Defaults to infinity (shrinks can take a while). + + .PARAMETER LogsOnly + Deprecated. Use FileType instead. + + .PARAMETER FileType + Specifies the files types that will be shrunk + All - All Data and Log files are shrunk, using database shrink (Default) + Data - Just the Data files are shrunk using file shrink + Log - Just the Log files are shrunk using file shrink + + .PARAMETER StepSize + Measured in bits - but no worries! PowerShell has a very cool way of formatting bits. Just specify something like: 1MB or 10GB. See the examples for more information. + + If specified, this will chunk a larger shrink operation into multiple smaller shrinks. + If shrinking a file by a large amount there are benefits of doing multiple smaller chunks. + + .PARAMETER ExcludeIndexStats + Exclude statistics about fragmentation. + + .PARAMETER ExcludeUpdateUsage + Exclude DBCC UPDATE USAGE for database. + + .PARAMETER WhatIf + Shows what would happen if the command were to run. + + .PARAMETER Confirm + Prompts for confirmation of every step. For example: + + Are you sure you want to perform this action? + Performing the operation "Shrink database" on target "pubs on SQL2016\VNEXT". + [Y] Yes [A] Yes to All [N] No [L] No to All [S] Suspend [?] Help (default is "Y"): + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Shrink, Database + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Invoke-DbaDbShrink + + .EXAMPLE + PS C:\> Invoke-DbaDbShrink -SqlInstance sql2016 -Database Northwind,pubs,Adventureworks2014 + + Shrinks Northwind, pubs and Adventureworks2014 to have as little free space as possible. + + .EXAMPLE + PS C:\> Invoke-DbaDbShrink -SqlInstance sql2014 -Database AdventureWorks2014 -PercentFreeSpace 50 + + Shrinks AdventureWorks2014 to have 50% free space. So let's say AdventureWorks2014 was 1GB and it's using 100MB space. The database free space would be reduced to 50MB. + + .EXAMPLE + PS C:\> Invoke-DbaDbShrink -SqlInstance sql2014 -Database AdventureWorks2014 -PercentFreeSpace 50 -FileType Data -StepSize 25MB + + Shrinks AdventureWorks2014 to have 50% free space, runs shrinks in 25MB chunks for improved performance. + + .EXAMPLE + PS C:\> Invoke-DbaDbShrink -SqlInstance sql2012 -AllUserDatabases + + Shrinks all user databases on SQL2012 (not ideal for production) + + #> + [CmdletBinding(SupportsShouldProcess, ConfirmImpact = 'Low')] + param ( + [parameter(Mandatory, ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [Alias("Credential")] + [PSCredential]$SqlCredential, + [Alias("Databases")] + [object[]]$Database, + [object[]]$ExcludeDatabase, + [switch]$AllUserDatabases, + [ValidateRange(0, 99)] + [int]$PercentFreeSpace = 0, + [ValidateSet('Default', 'EmptyFile', 'NoTruncate', 'TruncateOnly')] + [string]$ShrinkMethod = "Default", + [ValidateSet('All', 'Data', 'Log')] + [string]$FileType = "All", + [int]$StepSize, + [int]$StatementTimeout = 0, + [switch]$LogsOnly, + [switch]$ExcludeIndexStats, + [switch]$ExcludeUpdateUsage, + [Alias('Silent')] + [switch]$EnableException + ) + + begin { + if ($LogsOnly) { + Test-DbaDeprecation -DeprecatedOn "1.0.0" -Parameter "LogsOnly" + $FileType = 'Log' + } + if (-not $Database -and -not $ExcludeDatabase -and -not $AllUserDatabases) { + Stop-Function -Message "You must specify databases to execute against using either -Database, -Exclude or -AllUserDatabases" + return + } + + if ((Test-Bound -ParameterName StepSize) -and $StepSize -lt 1024) { + Stop-Function -Message "StepSize is measured in bits. Did you mean $StepSize bits? If so, please use 1024 or above. If not, then use the PowerShell bit notation like $($StepSize)MB or $($StepSize)GB" + return + } + + if ($StepSize) { + $stepSizeKB = ([dbasize]($StepSize)).Kilobyte + } + $StatementTimeoutSeconds = $StatementTimeout * 60 + + $sql = "SELECT + avg(avg_fragmentation_in_percent) as [avg_fragmentation_in_percent] + , max(avg_fragmentation_in_percent) as [max_fragmentation_in_percent] + FROM sys.dm_db_index_physical_stats (DB_ID(), NULL, NULL, NULL, NULL) AS indexstats + WHERE indexstats.avg_fragmentation_in_percent > 0 AND indexstats.page_count > 100 + GROUP BY indexstats.database_id" + } + + process { + if (Test-FunctionInterrupt) { return } + + foreach ($instance in $SqlInstance) { + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + $server.ConnectionContext.StatementTimeout = $StatementTimeoutSeconds + Write-Message -Level Verbose -Message "Connection timeout set to $StatementTimeout" + + $dbs = $server.Databases | Where-Object {$_.IsAccessible} + + if ($AllUserDatabases) { + $dbs = $dbs | Where-Object { $_.IsSystemObject -eq $false } + } + + if ($Database) { + $dbs = $dbs | Where-Object Name -In $Database + } + + if ($ExcludeDatabase) { + $dbs = $dbs | Where-Object Name -NotIn $ExcludeDatabase + } + + foreach ($db in $dbs) { + + Write-Message -Level Verbose -Message "Processing $db on $instance" + + if ($db.IsDatabaseSnapshot) { + Write-Message -Level Warning -Message "The database $db on server $instance is a snapshot and cannot be shrunk. Skipping database." + continue + } + + $files = @() + if ($FileType -in ('Log', 'All')) { + $files += $db.LogFiles + } + if ($FileType -in ('Data', 'All')) { + $files += $db.FileGroups.Files + } + + foreach ($file in $files) { + $startingSize = $file.Size + $spaceUsed = $file.UsedSpace + $spaceAvailable = ($file.Size - $file.UsedSpace) + $desiredSpaceAvailable = [math]::ceiling((($PercentFreeSpace / 100)) * $spaceUsed) + $desiredFileSize = $spaceUsed + $desiredSpaceAvailable + + Write-Message -Level Verbose -Message "File: $($file.Name)" + Write-Message -Level Verbose -Message "Initial Size (KB): $([int]$startingSize)" + Write-Message -Level Verbose -Message "Space Used (KB): $([int]$spaceUsed)" + Write-Message -Level Verbose -Message "Initial Freespace (KB): $([int]$spaceAvailable)" + Write-Message -Level Verbose -Message "Target Freespace (KB): $([int]$desiredSpaceAvailable)" + Write-Message -Level Verbose -Message "Target FileSize (KB): $([int]$desiredFileSize)" + + if ($spaceAvailable -le $desiredSpaceAvailable) { + Write-Message -Level Warning -Message "File size of ($startingSize) is less than or equal to the desired outcome ($desiredFileSize) for $($file.Name)" + } else { + if ($Pscmdlet.ShouldProcess("$db on $instance", "Shrinking from $([int]$startingSize)KB to $([int]$desiredFileSize)KB")) { + if ($server.VersionMajor -gt 8 -and $ExcludeIndexStats -eq $false) { + Write-Message -Level Verbose -Message "Getting starting average fragmentation" + $dataRow = $server.Query($sql, $db.name) + $startingFrag = $dataRow.avg_fragmentation_in_percent + $startingTopFrag = $dataRow.max_fragmentation_in_percent + } else { + $startingTopFrag = $startingFrag = $null + } + + $start = Get-Date + try { + Write-Message -Level Verbose -Message "Beginning shrink of files" + + $shrinkGap = ($startingSize - $desiredFileSize) + Write-Message -Level Verbose -Message "ShrinkGap: $([int]$shrinkGap) KB" + Write-Message -Level Verbose -Message "Step Size: $($stepSizeKB) KB" + + if ($stepSizeKB -and ($shrinkGap -ge $stepSizeKB)) { + for ($i = 1; $i -le [int](($shrinkGap) / $stepSizeKB); $i++) { + Write-Message -Level Verbose -Message "Step: $i / $([int](($shrinkGap) / $stepSizeKB))" + $shrinkSize = $startingSize - ($stepSizeKB * $i) + if ($shrinkSize -lt $desiredFileSize) { + $shrinkSize = $desiredFileSize + } + Write-Message -Level Verbose -Message ("Shrinking {0} to {1}" -f $file.Name, $shrinkSize) + $file.Shrink(($shrinkSize / 1024), $ShrinkMethod) + $file.Refresh() + + if ($startingSize -eq $file.Size) { + Write-Message -Level Verbose -Message ("Unable to shrink further") + break + } + } + } else { + $file.Shrink(($desiredFileSize / 1024), $ShrinkMethod) + $file.Refresh() + } + $success = $true + } catch { + $success = $false + Stop-Function -message "Failure" -EnableException $EnableException -ErrorRecord $_ -Continue + continue + } + $end = Get-Date + $finalFileSize = $file.Size + $finalSpaceAvailable = ($file.Size - $file.UsedSpace) + Write-Message -Level Verbose -Message "Final file size: $([int]$finalFileSize) KB" + Write-Message -Level Verbose -Message "Final file space available: $($finalSpaceAvailable) KB" + + if ($server.VersionMajor -gt 8 -and $ExcludeIndexStats -eq $false -and $success -and $FileType -ne 'Log') { + Write-Message -Level Verbose -Message "Getting ending average fragmentation" + $dataRow = $server.Query($sql, $db.name) + $endingDefrag = $dataRow.avg_fragmentation_in_percent + $endingTopDefrag = $dataRow.max_fragmentation_in_percent + } else { + $endingTopDefrag = $endingDefrag = $null + } + + $timSpan = New-TimeSpan -Start $start -End $end + $ts = [TimeSpan]::fromseconds($timSpan.TotalSeconds) + $elapsed = "{0:HH:mm:ss}" -f ([datetime]$ts.Ticks) + + $object = [PSCustomObject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + Database = $db.name + File = $file.name + Start = $start + End = $end + Elapsed = $elapsed + Success = $success + InitialSize = [dbasize]($startingSize * 1024) + InitialUsed = [dbasize]($spaceUsed * 1024) + InitialAvailable = [dbasize]($spaceAvailable * 1024) + TargetAvailable = [dbasize]($desiredSpaceAvailable * 1024) + FinalAvailable = [dbasize]($finalSpaceAvailable * 1024) + FinalSize = [dbasize]($finalFileSize * 1024) + InitialAverageFragmentation = [math]::Round($startingFrag, 1) + FinalAverageFragmentation = [math]::Round($endingDefrag, 1) + InitialTopFragmentation = [math]::Round($startingTopFrag, 1) + FinalTopFragmentation = [math]::Round($endingTopDefrag, 1) + Notes = "Database shrinks can cause massive index fragmentation and negatively impact performance. You should now run DBCC INDEXDEFRAG or ALTER INDEX ... REORGANIZE" + } + if ($ExcludeIndexStats) { + Select-DefaultView -InputObject $object -ExcludeProperty InitialAverageFragmentation, FinalAverageFragmentation, InitialTopFragmentation, FinalTopFragmentation + } else { + $object + } + } + } + } + } + } + } + end { + Test-DbaDeprecation -DeprecatedOn "1.0.0" -Alias Invoke-DbaDatabaseShrink + } +} +function Invoke-DbaDbUpgrade { + <# + .SYNOPSIS + Take a database and upgrades it to compatibility of the SQL Instance its hosted on. Based on https://thomaslarock.com/2014/06/upgrading-to-sql-server-2014-a-dozen-things-to-check/ + + .DESCRIPTION + Updates compatibility level, then runs CHECKDB with data_purity, DBCC updateusage, sp_updatestats and finally sp_refreshview against all user views. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. + + .PARAMETER SqlCredential + SqlCredential object used to connect to the SQL Server as a different user. + + .PARAMETER Database + The database(s) to process - this list is autopopulated from the server. If unspecified, all databases will be processed. + + .PARAMETER ExcludeDatabase + The database(s) to exclude - this list is autopopulated from the server + + .PARAMETER AllUserDatabases + Run command against all user databases + + .PARAMETER Force + Don't skip over databases that are already at the same level the instance is + + .PARAMETER NoCheckDb + Skip checkdb + + .PARAMETER NoUpdateUsage + Skip usage update + + .PARAMETER NoUpdateStats + Skip stats update + + .PARAMETER NoRefreshView + Skip view update + + .PARAMETER InputObject + A collection of databases (such as returned by Get-DbaDatabase) + + .PARAMETER WhatIf + Shows what would happen if the command were to run + + .PARAMETER Confirm + Prompts for confirmation of every step. For example: + + Are you sure you want to perform this action? + Performing the operation "Update database" on target "pubs on SQL2016\VNEXT". + [Y] Yes [A] Yes to All [N] No [L] No to All [S] Suspend [?] Help (default is "Y"): + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Shrink, Database + Author: Stephen Bennett, https://sqlnotesfromtheunderground.wordpress.com/ + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Invoke-DbaDbUpgrade + + .EXAMPLE + PS C:\> Invoke-DbaDbUpgrade -SqlInstance PRD-SQL-MSD01 -Database Test + + Runs the below processes against the databases + -- Puts compatibility of database to level of SQL Instance + -- Runs CHECKDB DATA_PURITY + -- Runs DBCC UPDATESUSAGE + -- Updates all users statistics + -- Runs sp_refreshview against every view in the database + + .EXAMPLE + PS C:\> Invoke-DbaDbUpgrade -SqlInstance PRD-SQL-INT01 -Database Test -NoRefreshView + + Runs the upgrade command skipping the sp_refreshview update on all views + + .EXAMPLE + PS C:\> Invoke-DbaDbUpgrade -SqlInstance PRD-SQL-INT01 -Database Test -Force + + If database Test is already at the correct compatibility, runs every necessary step + + .EXAMPLE + PS C:\> Get-DbaDatabase -SqlInstance sql2016 | Out-GridView -Passthru | Invoke-DbaDbUpgrade + + Get only specific databases using GridView and pass those to Invoke-DbaDbUpgrade + + #> + [CmdletBinding(SupportsShouldProcess)] + param ( + [parameter(Position = 0)] + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [System.Management.Automation.PSCredential]$SqlCredential, + [object[]]$Database, + [object[]]$ExcludeDatabase, + [switch]$NoCheckDb, + [switch]$NoUpdateUsage, + [switch]$NoUpdateStats, + [switch]$NoRefreshView, + [switch]$AllUserDatabases, + [switch]$Force, + [parameter(ValueFromPipeline)] + [Microsoft.SqlServer.Management.Smo.Database[]]$InputObject, + [Alias('Silent')] + [switch]$EnableException + ) + process { + + if (Test-Bound -not 'SqlInstance', 'InputObject') { + Write-Message -Level Warning -Message "You must specify either a SQL instance or pipe a database collection" + continue + } + + if (Test-Bound -not 'Database', 'InputObject', 'ExcludeDatabase', 'AllUserDatabases') { + Write-Message -Level Warning -Message "You must explicitly specify a database. Use -Database, -ExcludeDatabase, -AllUserDatabases or pipe a database collection" + continue + } + + foreach ($instance in $SqlInstance) { + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential + $server.ConnectionContext.StatementTimeout = [Int32]::MaxValue + } catch { + Stop-Function -Message "Failed to process Instance $Instance" -ErrorRecord $_ -Target $instance -Continue + } + $InputObject += $server.Databases | Where-Object IsAccessible + } + + $InputObject = $InputObject | Where-Object { $_.IsSystemObject -eq $false } + if ($Database) { + $InputObject = $InputObject | Where-Object Name -In $Database + } + if ($ExcludeDatabase) { + $InputObject = $InputObject | Where-Object Name -NotIn $ExcludeDatabase + } + + foreach ($db in $InputObject) { + # create objects to use in updates + $server = $db.Parent + $ServerVersion = $server.VersionMajor + Write-Message -Level Verbose -Message "SQL Server is using Version: $ServerVersion" + + $ogcompat = $db.CompatibilityLevel + $dbname = $db.Name + $dbversion = switch ($db.CompatibilityLevel) { + "Version100" { 10 } # SQL Server 2008 + "Version110" { 11 } # SQL Server 2012 + "Version120" { 12 } # SQL Server 2014 + "Version130" { 13 } # SQL Server 2016 + "Version140" { 14 } # SQL Server 2017 + default { 9 } # SQL Server 2005 + } + if (-not $Force) { + # skip over databases at the correct level, unless -Force + if ($dbversion -ge $ServerVersion) { + Write-Message -Level VeryVerbose -Message "Skipping $db because compatibility is at the correct level. Use -Force if you want to run all the additional steps" + continue + } + } + Write-Message -Level Verbose -Message "Updating $db compatibility to SQL Instance level" + if ($dbversion -lt $ServerVersion) { + If ($Pscmdlet.ShouldProcess($server, "Updating $db version on $server from $dbversion to $ServerVersion")) { + $Comp = $ServerVersion * 10 + $tsqlComp = "ALTER DATABASE $db SET COMPATIBILITY_LEVEL = $Comp" + try { + $db.ExecuteNonQuery($tsqlComp) + $comResult = $Comp + } catch { + Write-Message -Level Warning -Message "Failed run Compatibility Upgrade" -ErrorRecord $_ -Target $instance + $comResult = "Fail" + } + } + } else { + $comResult = "No change" + } + + if (!($NoCheckDb)) { + Write-Message -Level Verbose -Message "Updating $db with DBCC CHECKDB DATA_PURITY" + If ($Pscmdlet.ShouldProcess($server, "Updating $db with DBCC CHECKDB DATA_PURITY")) { + $tsqlCheckDB = "DBCC CHECKDB ('$dbname') WITH DATA_PURITY, NO_INFOMSGS" + try { + $db.ExecuteNonQuery($tsqlCheckDB) + $DataPurityResult = "Success" + } catch { + Write-Message -Level Warning -Message "Failed run DBCC CHECKDB with DATA_PURITY on $db" -ErrorRecord $_ -Target $instance + $DataPurityResult = "Fail" + } + } + } else { + Write-Message -Level Verbose -Message "Ignoring CHECKDB DATA_PURITY" + } + + if (!($NoUpdateUsage)) { + Write-Message -Level Verbose -Message "Updating $db with DBCC UPDATEUSAGE" + If ($Pscmdlet.ShouldProcess($server, "Updating $db with DBCC UPDATEUSAGE")) { + $tsqlUpdateUsage = "DBCC UPDATEUSAGE ($db) WITH NO_INFOMSGS;" + try { + $db.ExecuteNonQuery($tsqlUpdateUsage) + $UpdateUsageResult = "Success" + } catch { + Write-Message -Level Warning -Message "Failed to run DBCC UPDATEUSAGE on $db" -ErrorRecord $_ -Target $instance + $UpdateUsageResult = "Fail" + } + } + } else { + Write-Message -Level Verbose -Message "Ignore DBCC UPDATEUSAGE" + $UpdateUsageResult = "Skipped" + } + + if (!($NoUpdatestats)) { + Write-Message -Level Verbose -Message "Updating $db statistics" + If ($Pscmdlet.ShouldProcess($server, "Updating $db statistics")) { + $tsqlStats = "EXEC sp_updatestats;" + try { + $db.ExecuteNonQuery($tsqlStats) + $UpdateStatsResult = "Success" + } catch { + Write-Message -Level Warning -Message "Failed to run sp_updatestats on $db" -ErrorRecord $_ -Target $instance + $UpdateStatsResult = "Fail" + } + } + } else { + Write-Message -Level Verbose -Message "Ignoring sp_updatestats" + $UpdateStatsResult = "Skipped" + } + + if (!($NoRefreshView)) { + Write-Message -Level Verbose -Message "Refreshing $db Views" + $dbViews = $db.Views | Where-Object IsSystemObject -eq $false + $RefreshViewResult = "Success" + foreach ($dbview in $dbviews) { + $viewName = $dbView.Name + $viewSchema = $dbView.Schema + $fullName = $viewSchema + "." + $viewName + + $tsqlupdateView = "EXECUTE sp_refreshview N'$fullName'; " + + If ($Pscmdlet.ShouldProcess($server, "Refreshing view $fullName on $db")) { + try { + $db.ExecuteNonQuery($tsqlupdateView) + } catch { + Write-Message -Level Warning -Message "Failed update view $fullName on $db" -ErrorRecord $_ -Target $instance + $RefreshViewResult = "Fail" + } + } + } + } else { + Write-Message -Level Verbose -Message "Ignore View Refreshes" + $RefreshViewResult = "Skipped" + } + + If ($Pscmdlet.ShouldProcess("console", "Outputting object")) { + $db.Refresh() + + [PSCustomObject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + Database = $db.name + OriginalCompatibility = $ogcompat.ToString().Replace('Version', '') + CurrentCompatibility = $db.CompatibilityLevel.ToString().Replace('Version', '') + Compatibility = $comResult + DataPurity = $DataPurityResult + UpdateUsage = $UpdateUsageResult + UpdateStats = $UpdateStatsResult + RefreshViews = $RefreshViewResult + } + } + } + } + end { + Test-DbaDeprecation -DeprecatedOn "1.0.0" -EnableException:$false -Alias Invoke-DbaDatabaseUpgrade + } +} +function Invoke-DbaDiagnosticQuery { + <# + .SYNOPSIS + Invoke-DbaDiagnosticQuery runs the scripts provided by Glenn Berry's DMV scripts on specified servers + + .DESCRIPTION + This is the main function of the Sql Server Diagnostic Queries related functions in dbatools. + The diagnostic queries are developed and maintained by Glenn Berry and they can be found here along with a lot of documentation: + http://www.sqlskills.com/blogs/glenn/category/dmv-queries/ + + The most recent version of the diagnostic queries are included in the dbatools module. + But it is possible to download a newer set or a specific version to an alternative location and parse and run those scripts. + It will run all or a selection of those scripts on one or multiple servers and return the result as a PowerShell Object + + .PARAMETER SqlInstance + The target SQL Server instance or instances. Can be either a string or SMO server + + .PARAMETER SqlCredential + Allows alternative Windows or SQL login credentials to be used + + .PARAMETER Path + Alternate path for the diagnostic scripts + + .PARAMETER Database + The database(s) to process. If unspecified, all databases will be processed + + .PARAMETER ExcludeDatabase + The database(s) to exclude + + .PARAMETER ExcludeQuery + The Queries to exclude + + .PARAMETER UseSelectionHelper + Provides a gridview with all the queries to choose from and will run the selection made by the user on the Sql Server instance specified. + + .PARAMETER QueryName + Only run specific query + + .PARAMETER InstanceOnly + Run only instance level queries + + .PARAMETER DatabaseSpecific + Run only database level queries + + .PARAMETER ExcludeQueryTextColumn + Use this switch to exclude the [Complete Query Text] column from relevant queries + + .PARAMETER ExcludePlanColumn + Use this switch to exclude the [Query Plan] column from relevant queries + + .PARAMETER NoColumnParsing + Does not parse the [Complete Query Text] and [Query Plan] columns and disregards the ExcludeQueryTextColumn and NoColumnParsing switches + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .PARAMETER Confirm + Prompts to confirm certain actions + + .PARAMETER WhatIf + Shows what would happen if the command would execute, but does not actually perform the command + + .PARAMETER OutputPath + Directory to parsed diagnostict queries to. This will split them based on server, databasename, and query. + + .PARAMETER ExportQueries + Use this switch to export the diagnostic queries to sql files. I + nstead of running the queries, the server will be evaluated to find the appropriate queries to run based on SQL Version. + These sql files will then be created in the OutputDirectory + + .NOTES + Tags: Database, DMV + Author: Andre Kamman (@AndreKamman), http://clouddba.io + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Invoke-DbaDiagnosticQuery + + .EXAMPLE + PS C:\>Invoke-DbaDiagnosticQuery -SqlInstance sql2016 + + Run the selection made by the user on the Sql Server instance specified. + + .EXAMPLE + PS C:\>Invoke-DbaDiagnosticQuery -SqlInstance sql2016 -UseSelectionHelper | Export-DbaDiagnosticQuery -Path C:\temp\gboutput + + Provides a gridview with all the queries to choose from and will run the selection made by the user on the SQL Server instance specified. + Then it will export the results to Export-DbaDiagnosticQuery. + + .EXAMPLE + PS C:\> Invoke-DbaDiagnosticQuery -SqlInstance localhost -ExportQueries -OutputPath "C:\temp\DiagnosticQueries" + + Export All Queries to Disk + + .EXAMPLE + PS C:\> Invoke-DbaDiagnosticQuery -SqlInstance localhost -DatabaseSpecific -ExportQueries -OutputPath "C:\temp\DiagnosticQueries" + + Export Database Specific Queries for all User Dbs + + .EXAMPLE + PS C:\> Invoke-DbaDiagnosticQuery -SqlInstance localhost -DatabaseSpecific -DatabaseName 'tempdb' -ExportQueries -OutputPath "C:\temp\DiagnosticQueries" + + Export Database Specific Queries For One Target Database + + .EXAMPLE + PS C:\> Invoke-DbaDiagnosticQuery -SqlInstance localhost -DatabaseSpecific -DatabaseName 'tempdb' -ExportQueries -OutputPath "C:\temp\DiagnosticQueries" -queryname 'Database-scoped Configurations' + + Export Database Specific Queries For One Target Database and One Specific Query + + .EXAMPLE + PS C:\> Invoke-DbaDiagnosticQuery -SqlInstance localhost -UseSelectionHelper + + Choose Queries To Export + + .EXAMPLE + PS C:\> [PSObject[]]$results = Invoke-DbaDiagnosticQuery -SqlInstance localhost -whatif + + Parse the appropriate diagnostic queries by connecting to server, and instead of running them, return as [PSCustomObject[]] to work with further + + .EXAMPLE + PS C:\> $results = Invoke-DbaDiagnosticQuery -SqlInstance Sql2017 -DatabaseSpecific -queryname 'Database-scoped Configurations' -databasename TestStuff + + Run diagnostic queries targeted at specific database, and only run database level queries against this database. + + #> + + [CmdletBinding(SupportsShouldProcess)] + [outputtype([pscustomobject[]])] + param ( + [parameter(Mandatory, ValueFromPipeline, Position = 0)] + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + + [Alias('DatabaseName')] + [object[]]$Database, + + [object[]]$ExcludeDatabase, + + [object[]]$ExcludeQuery, + + [Alias('Credential')] + [PSCredential]$SqlCredential, + [System.IO.FileInfo]$Path, + [string[]]$QueryName, + [switch]$UseSelectionHelper, + [switch]$InstanceOnly, + [switch]$DatabaseSpecific, + [Switch]$ExcludeQueryTextColumn, + [Switch]$ExcludePlanColumn, + [Switch]$NoColumnParsing, + + [string]$OutputPath, + [switch]$ExportQueries, + + [switch][Alias('Silent')] + [switch]$EnableException + ) + + begin { + $ProgressId = Get-Random + + function Invoke-DiagnosticQuerySelectionHelper { + [CmdletBinding()] + param ( + [parameter(Mandatory)] + $ParsedScript + ) + + $ParsedScript | Select-Object QueryNr, QueryName, DBSpecific, Description | Out-GridView -Title "Diagnostic Query Overview" -OutputMode Multiple | Sort-Object QueryNr | Select-Object -ExpandProperty QueryName + + } + + Write-Message -Level Verbose -Message "Interpreting DMV Script Collections" + + $module = Get-Module -Name dbatools + $base = $module.ModuleBase + + if (!$Path) { + $Path = "$base\bin\diagnosticquery" + } + + $scriptversions = @() + $scriptfiles = Get-ChildItem "$Path\SQLServerDiagnosticQueries_*_*.sql" + + if (!$scriptfiles) { + Write-Message -Level Warning -Message "Diagnostic scripts not found in $Path. Using the ones within the module." + + $Path = "$base\bin\diagnosticquery" + + $scriptfiles = Get-ChildItem "$base\bin\diagnosticquery\SQLServerDiagnosticQueries_*_*.sql" + if (!$scriptfiles) { + Stop-Function -Message "Unable to download scripts, do you have an internet connection? $_" -ErrorRecord $_ + return + } + } + + [int[]]$filesort = $null + + foreach ($file in $scriptfiles) { + $filesort += $file.BaseName.Split("_")[2] + } + + $currentdate = $filesort | Sort-Object -Descending | Select-Object -First 1 + + foreach ($file in $scriptfiles) { + if ($file.BaseName.Split("_")[2] -eq $currentdate) { + $parsedscript = Invoke-DbaDiagnosticQueryScriptParser -filename $file.fullname -ExcludeQueryTextColumn:$ExcludeQueryTextColumn -ExcludePlanColumn:$ExcludePlanColumn -NoColumnParsing:$NoColumnParsing + + $newscript = [pscustomobject]@{ + Version = $file.Basename.Split("_")[1] + Script = $parsedscript + } + $scriptversions += $newscript + } + } + } + + process { + if (Test-FunctionInterrupt) { return } + + foreach ($instance in $SqlInstance) { + $counter = 0 + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $sqlcredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + Write-Message -Level Verbose -Message "Collecting diagnostic query data from server: $instance" + + if ($server.VersionMinor -eq 50) { + $version = "2008R2" + } else { + $version = switch ($server.VersionMajor) { + 9 { "2005" } + 10 { "2008" } + 11 { "2012" } + 12 { "2014" } + 13 { "2016" } + 14 { "2017" } + } + } + + if ($version -eq "2016" -and $server.VersionMinor -gt 5026 ) { + $version = "2016SP2" + } + + if ($server.DatabaseEngineType -eq "SqlAzureDatabase") { + $version = "AzureSQLDatabase" + } + + if (!$instanceOnly) { + if (-not $Database) { + $databases = (Get-DbaDatabase -SqlInstance $server -ExcludeSystem -ExcludeDatabase $ExcludeDatabase).Name + } else { + $databases = (Get-DbaDatabase -SqlInstance $server -ExcludeSystem -Database $Database -ExcludeDatabase $ExcludeDatabase).Name + } + } + + $parsedscript = $scriptversions | Where-Object -Property Version -eq $version | Select-Object -ExpandProperty Script + + if ($null -eq $first) { $first = $true } + if ($UseSelectionHelper -and $first) { + $QueryName = Invoke-DiagnosticQuerySelectionHelper $parsedscript + $first = $false + if ($QueryName.Count -eq 0) { + Write-Message -Level Output -Message "No query selected through SelectionHelper, halting script execution" + return + } + } + + if ($QueryName.Count -eq 0) { + $QueryName = $parsedscript | Select-Object -ExpandProperty QueryName + } + + if ($ExcludeQuery) { + $QueryName = Compare-Object -ReferenceObject $QueryName -DifferenceObject $ExcludeQuery | Where-Object SideIndicator -eq "<=" | Select-Object -ExpandProperty InputObject + } + + #since some database level queries can take longer (such as fragmentation) calculate progress with database specific queries * count of databases to run against into context + $CountOfDatabases = ($databases).Count + + if ($QueryName.Count -ne 0) { + #if running all queries, then calculate total to run by instance queries count + (db specific count * databases to run each against) + $countDBSpecific = @($parsedscript | Where-Object {$_.QueryName -in $QueryName -and $_.DBSpecific -eq $true}).Count + $countInstanceSpecific = @($parsedscript | Where-Object {$_.QueryName -in $QueryName -and $_.DBSpecific -eq $false}).Count + } else { + #if narrowing queries to database specific, calculate total to process based on instance queries count + (db specific count * databases to run each against) + $countDBSpecific = @($parsedscript | Where-Object DBSpecific).Count + $countInstanceSpecific = @($parsedscript | Where-Object DBSpecific -eq $false).Count + + } + if (!$instanceonly -and !$DatabaseSpecific -and !$QueryName) { + $scriptcount = $countInstanceSpecific + ($countDBSpecific * $CountOfDatabases ) + } elseif ($instanceOnly) { + $scriptcount = $countInstanceSpecific + } elseif ($DatabaseSpecific) { + $scriptcount = $countDBSpecific * $CountOfDatabases + } elseif ($QueryName.Count -ne 0) { + $scriptcount = $countInstanceSpecific + ($countDBSpecific * $CountOfDatabases ) + + + } + + foreach ($scriptpart in $parsedscript) { + # ensure results are null with each part, otherwise duplicated information may be returned + $result = $null + if (($QueryName.Count -ne 0) -and ($QueryName -notcontains $scriptpart.QueryName)) { continue } + if (!$scriptpart.DBSpecific -and !$DatabaseSpecific) { + if ($ExportQueries) { + $null = New-Item -Path $OutputPath -ItemType Directory -Force + $FileName = Remove-InvalidFileNameChars ('{0}.sql' -f $Scriptpart.QueryName) + $FullName = Join-Path $OutputPath $FileName + Write-Message -Level Verbose -Message "Creating file: $FullName" + $scriptPart.Text | out-file -FilePath $FullName -Encoding UTF8 -force + continue + } + + if ($PSCmdlet.ShouldProcess($instance, $scriptpart.QueryName)) { + + if (-not $EnableException) { + $Counter++ + Write-Progress -Id $ProgressId -ParentId 0 -Activity "Collecting diagnostic query data from $instance" -Status "Processing $counter of $scriptcount" -CurrentOperation $scriptpart.QueryName -PercentComplete (($counter / $scriptcount) * 100) + } + + try { + $result = $server.Query($scriptpart.Text) + Write-Message -Level Verbose -Message "Processed $($scriptpart.QueryName) on $instance" + if (-not $result) { + [pscustomobject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + Number = $scriptpart.QueryNr + Name = $scriptpart.QueryName + Description = $scriptpart.Description + DatabaseSpecific = $scriptpart.DBSpecific + Database = $null + Notes = "Empty Result for this Query" + Result = $null + } + Write-Message -Level Verbose -Message ("Empty result for Query {0} - {1} - {2}" -f $scriptpart.QueryNr, $scriptpart.QueryName, $scriptpart.Description) + } + } catch { + Write-Message -Level Verbose -Message ('Some error has occured on Server: {0} - Script: {1}, result unavailable' -f $instance, $scriptpart.QueryName) -Target $instance -ErrorRecord $_ + } + if ($result) { + [pscustomobject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + Number = $scriptpart.QueryNr + Name = $scriptpart.QueryName + Description = $scriptpart.Description + DatabaseSpecific = $scriptpart.DBSpecific + Database = $null + Notes = $null + #Result = Select-DefaultView -InputObject $result -Property * + #Not using Select-DefaultView because excluding the fields below doesn't seem to work + Result = $result | Select-Object * -ExcludeProperty 'Item', 'RowError', 'RowState', 'Table', 'ItemArray', 'HasErrors' + } + + } + } else { + # if running WhatIf, then return the queries that would be run as an object, not just whatif output + + [pscustomobject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + Number = $scriptpart.QueryNr + Name = $scriptpart.QueryName + Description = $scriptpart.Description + DatabaseSpecific = $scriptpart.DBSpecific + Database = $null + Notes = "WhatIf - Bypassed Execution" + Result = $null + } + } + + } elseif ($scriptpart.DBSpecific -and !$instanceOnly) { + + foreach ($currentdb in $databases) { + if ($ExportQueries) { + $null = New-Item -Path $OutputPath -ItemType Directory -Force + $FileName = Remove-InvalidFileNameChars ('{0}-{1}-{2}.sql' -f $server.DomainInstanceName, $currentDb, $Scriptpart.QueryName) + $FullName = Join-Path $OutputPath $FileName + Write-Message -Level Verbose -Message "Creating file: $FullName" + $scriptPart.Text | out-file -FilePath $FullName -encoding UTF8 -force + continue + } + + + if ($PSCmdlet.ShouldProcess(('{0} ({1})' -f $instance, $currentDb), $scriptpart.QueryName)) { + + if (-not $EnableException) { + $Counter++ + Write-Progress -Id $ProgressId -ParentId 0 -Activity "Collecting diagnostic query data from $($currentDb) on $instance" -Status ('Processing {0} of {1}' -f $counter, $scriptcount) -CurrentOperation $scriptpart.QueryName -PercentComplete (($Counter / $scriptcount) * 100) + } + + Write-Message -Level Verbose -Message "Collecting diagnostic query data from $($currentDb) for $($scriptpart.QueryName) on $instance" + try { + $result = $server.Query($scriptpart.Text, $currentDb) + if (-not $result) { + [pscustomobject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + Number = $scriptpart.QueryNr + Name = $scriptpart.QueryName + Description = $scriptpart.Description + DatabaseSpecific = $scriptpart.DBSpecific + Database = $currentdb + Notes = "Empty Result for this Query" + Result = $null + } + Write-Message -Level Verbose -Message ("Empty result for Query {0} - {1} - {2}" -f $scriptpart.QueryNr, $scriptpart.QueryName, $scriptpart.Description) -Target $scriptpart -ErrorRecord $_ + } + } catch { + Write-Message -Level Verbose -Message ('Some error has occured on Server: {0} - Script: {1} - Database: {2}, result will not be saved' -f $instance, $scriptpart.QueryName, $currentDb) -Target $currentdb -ErrorRecord $_ + } + + if ($result) { + [pscustomobject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + Number = $scriptpart.QueryNr + Name = $scriptpart.QueryName + Description = $scriptpart.Description + DatabaseSpecific = $scriptpart.DBSpecific + Database = $currentDb + Notes = $null + #Result = Select-DefaultView -InputObject $result -Property * + #Not using Select-DefaultView because excluding the fields below doesn't seem to work + Result = $result | Select-Object * -ExcludeProperty 'Item', 'RowError', 'RowState', 'Table', 'ItemArray', 'HasErrors' + } + } + } else { + # if running WhatIf, then return the queries that would be run as an object, not just whatif output + + [pscustomobject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + Number = $scriptpart.QueryNr + Name = $scriptpart.QueryName + Description = $scriptpart.Description + DatabaseSpecific = $scriptpart.DBSpecific + Database = $null + Notes = "WhatIf - Bypassed Execution" + Result = $null + } + } + } + } + } + } + } + end { + Write-Progress -Id $ProgressId -Activity 'Invoke-DbaDiagnosticQuery' -Completed + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function Invoke-DbaPfRelog { + <# + .SYNOPSIS + Pipeline-compatible wrapper for the relog command which is available on modern Windows platforms. + + .DESCRIPTION + Pipeline-compatible wrapper for the relog command. Relog is useful for converting Windows Perfmon. + + Extracts performance counters from performance counter logs into other formats, + such as text-TSV (for tab-delimited text), text-CSV (for comma-delimited text), binary-BIN, or SQL. + + `relog "C:\PerfLogs\Admin\System Correlation\WORKSTATIONX_20180112-000001\DataCollector01.blg" -o C:\temp\foo.csv -f tsv` + + If you find any input hangs, please send us the output so we can accommodate for it then use -Raw for an immediate solution. + + .PARAMETER Path + Specifies the pathname of an existing performance counter log or performance counter path. You can specify multiple input files. + + .PARAMETER Destination + Specifies the pathname of the output file or SQL database where the counters will be written. Defaults to the same directory as the source. + + .PARAMETER Type + The output format. Defaults to tsv. Options include tsv, csv, bin, and sql. + + For a SQL database, the output file specifies the DSN!counter_log. You can specify the database location by using the ODBC manager to configure the DSN (Database System Name). + + For more information, read here: https://technet.microsoft.com/en-us/library/bb490958.aspx + + .PARAMETER Append + If this switch is enabled, output will be appended to the specified file instead of overwriting. This option does not apply to SQL format where the default is always to append. + + .PARAMETER AllowClobber + If this switch is enabled, the destination file will be overwritten if it exists. + + .PARAMETER PerformanceCounter + Specifies the performance counter path to log. + + .PARAMETER PerformanceCounterPath + Specifies the pathname of the text file that lists the performance counters to be included in a relog file. Use this option to list counter paths in an input file, one per line. Default setting is all counters in the original log file are relogged. + + .PARAMETER Interval + Specifies sample intervals in "n" records. Includes every nth data point in the relog file. Default is every data point. + + .PARAMETER BeginTime + This is is Get-Date object and we format it for you. + + .PARAMETER EndTime + Specifies end time for copying last record from the input file. This is is Get-Date object and we format it for you. + + .PARAMETER ConfigPath + Specifies the pathname of the settings file that contains command-line parameters. + + .PARAMETER Summary + If this switch is enabled, the performance counters and time ranges of log files specified in the input file will be displayed. + + .PARAMETER Multithread + If this switch is enabled, processing will be done in parallel. This may speed up large batches or large files. + + .PARAMETER AllTime + If this switch is enabled and a datacollector or datacollectorset is passed in via the pipeline, collects all logs, not just the latest. + + .PARAMETER Raw + If this switch is enabled, the results of the DOS command instead of Get-ChildItem will be displayed. This does not run in parallel. + + .PARAMETER InputObject + Accepts the output of Get-DbaPfDataCollector and Get-DbaPfDataCollectorSet as input via the pipeline. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Performance, DataCollector, PerfCounter, Relog + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Invoke-DbaPfRelog + + .EXAMPLE + PS C:\> Invoke-DbaPfRelog -Path C:\temp\perfmon.blg + + Creates C:\temp\perfmon.tsv from C:\temp\perfmon.blg. + + .EXAMPLE + PS C:\> Invoke-DbaPfRelog -Path C:\temp\perfmon.blg -Destination C:\temp\a\b\c + + Creates the temp, a, and b directories if needed, then generates c.tsv (tab separated) from C:\temp\perfmon.blg. + + Returns the newly created file as a file object. + + .EXAMPLE + PS C:\> Get-DbaPfDataCollectorSet -ComputerName sql2016 | Get-DbaPfDataCollector | Invoke-DbaPfRelog -Destination C:\temp\perf + + Creates C:\temp\perf if needed, then generates computername-datacollectorname.tsv (tab separated) from the latest logs of all data collector sets on sql2016. This destination format was chosen to avoid naming conflicts with piped input. + + .EXAMPLE + PS C:\> Invoke-DbaPfRelog -Path C:\temp\perfmon.blg -Destination C:\temp\a\b\c -Raw + ``` + [Invoke-DbaPfRelog][21:21:35] relog "C:\temp\perfmon.blg" -f csv -o C:\temp\a\b\c + + Input + ---------------- + File(s): + C:\temp\perfmon.blg (Binary) + + Begin: 1/13/2018 5:13:23 + End: 1/13/2018 14:29:55 + Samples: 2227 + + 100.00% + + Output + ---------------- + File: C:\temp\a\b\c.csv + + Begin: 1/13/2018 5:13:23 + End: 1/13/2018 14:29:55 + Samples: 2227 + + The command completed successfully. + ``` + + Creates the temp, a, and b directories if needed, then generates c.tsv (tab separated) from C:\temp\perfmon.blg then outputs the raw results of the relog command. + + .EXAMPLE + PS C:\> Invoke-DbaPfRelog -Path 'C:\temp\perflog with spaces.blg' -Destination C:\temp\a\b\c -Type csv -BeginTime ((Get-Date).AddDays(-30)) -EndTime ((Get-Date).AddDays(-1)) + + Creates the temp, a, and b directories if needed, then generates c.csv (comma separated) from C:\temp\perflog with spaces.blg', starts 30 days ago and ends one day ago. + + .EXAMPLE + PS C:\> $servers | Get-DbaPfDataCollectorSet | Get-DbaPfDataCollector | Invoke-DbaPfRelog -Multithread -AllowClobber + + Relogs latest data files from all collectors within the servers listed in $servers. + + .EXAMPLE + PS C:\> Get-DbaPfDataCollector -Collector DataCollector01 | Invoke-DbaPfRelog -AllowClobber -AllTime + + Relogs all the log files from the DataCollector01 on the local computer and allows overwrite. + + #> + [CmdletBinding()] + param ( + [parameter(ValueFromPipelineByPropertyName)] + [Alias("FullName")] + [string[]]$Path, + [string]$Destination, + [ValidateSet("tsv", "csv", "bin", "sql")] + [string]$Type = "tsv", + [switch]$Append, + [switch]$AllowClobber, + [string[]]$PerformanceCounter, + [string]$PerformanceCounterPath, + [int]$Interval, + [datetime]$BeginTime, + [datetime]$EndTime, + [string]$ConfigPath, + [switch]$Summary, + [parameter(ValueFromPipeline)] + [object[]]$InputObject, + [switch]$Multithread, + [switch]$AllTime, + [switch]$Raw, + [switch]$EnableException + ) + begin { + + + if (Test-Bound -ParameterName BeginTime) { + $script:beginstring = ($BeginTime -f 'M/d/yyyy hh:mm:ss' | Out-String).Trim() + } + if (Test-Bound -ParameterName EndTime) { + $script:endstring = ($EndTime -f 'M/d/yyyy hh:mm:ss' | Out-String).Trim() + } + + $allpaths = @() + $allpaths += $Path + + # to support multithreading + if (Test-Bound -ParameterName Destination) { + $script:destinationset = $true + $originaldestination = $Destination + } else { + $script:destinationset = $false + } + } + process { + if ($Append -and $Type -ne "bin") { + Stop-Function -Message "Append can only be used with -Type bin." -Target $Path + return + } + + if ($InputObject) { + foreach ($object in $InputObject) { + # DataCollectorSet + if ($object.OutputLocation -and $object.RemoteOutputLocation) { + $instance = [dbainstance]$object.ComputerName + + if (-not $AllTime) { + if ($instance.IsLocalHost) { + $allpaths += (Get-ChildItem -Recurse -Path $object.LatestOutputLocation -Include *.blg -ErrorAction SilentlyContinue).FullName + } else { + $allpaths += (Get-ChildItem -Recurse -Path $object.RemoteLatestOutputLocation -Include *.blg -ErrorAction SilentlyContinue).FullName + } + } else { + if ($instance.IsLocalHost) { + $allpaths += (Get-ChildItem -Recurse -Path $object.OutputLocation -Include *.blg -ErrorAction SilentlyContinue).FullName + } else { + $allpaths += (Get-ChildItem -Recurse -Path $object.RemoteOutputLocation -Include *.blg -ErrorAction SilentlyContinue).FullName + } + } + + + $script:perfmonobject = $true + } + # DataCollector + if ($object.LatestOutputLocation -and $object.RemoteLatestOutputLocation) { + $instance = [dbainstance]$object.ComputerName + + if (-not $AllTime) { + if ($instance.IsLocalHost) { + $allpaths += (Get-ChildItem -Recurse -Path $object.LatestOutputLocation -Include *.blg -ErrorAction SilentlyContinue).FullName + } else { + $allpaths += (Get-ChildItem -Recurse -Path $object.RemoteLatestOutputLocation -Include *.blg -ErrorAction SilentlyContinue).FullName + } + } else { + if ($instance.IsLocalHost) { + $allpaths += (Get-ChildItem -Recurse -Path (Split-Path $object.LatestOutputLocation) -Include *.blg -ErrorAction SilentlyContinue).FullName + } else { + $allpaths += (Get-ChildItem -Recurse -Path (Split-Path $object.RemoteLatestOutputLocation) -Include *.blg -ErrorAction SilentlyContinue).FullName + } + } + $script:perfmonobject = $true + } + } + } + } + + # Gotta collect all the paths first then process them otherwise there may be duplicates + end { + $allpaths = $allpaths | Where-Object { $_ -match '.blg' } | Select-Object -Unique + + if (-not $allpaths) { + Stop-Function -Message "Could not find matching .blg files" -Target $file -Continue + return + } + + $scriptblock = { + if ($args) { + $file = $args + } else { + $file = $psitem + } + $item = Get-ChildItem -Path $file -ErrorAction SilentlyContinue + + if ($null -eq $item) { + Stop-Function -Message "$file does not exist." -Target $file -Continue + return + } + + if (-not $script:destinationset -and $file -match "C\:\\.*Admin.*") { + $null = Test-ElevationRequirement -ComputerName $env:COMPUTERNAME -Continue + } + + if ($script:destinationset -eq $false -and -not $Append) { + $Destination = Join-Path (Split-Path $file) $item.BaseName + } + + if ($Destination -and $Destination -notmatch "\." -and -not $Append -and $script:perfmonobject) { + # if destination is set, then it needs a different name + if ($script:destinationset -eq $true) { + if ($file -match "\:") { + $computer = $env:COMPUTERNAME + } else { + $computer = $file.Split("\")[2] + } + # Avoid naming conflicts + $timestamp = Get-Date -format yyyyMMddHHmmfff + $Destination = Join-Path $originaldestination "$computer - $($item.BaseName) - $timestamp" + } + } + + $params = @("`"$file`"") + + if ($Append) { + $params += "-a" + } + + if ($PerformanceCounter) { + $parsedcounters = $PerformanceCounter -join " " + $params += "-c `"$parsedcounters`"" + } + + if ($PerformanceCounterPath) { + $params += "-cf `"$PerformanceCounterPath`"" + } + + $params += "-f $Type" + + if ($Interval) { + $params += "-t $Interval" + } + + if ($Destination) { + $params += "-o `"$Destination`"" + } + + if ($script:beginstring) { + $params += "-b $script:beginstring" + } + + if ($script:endstring) { + $params += "-e $script:endstring" + } + + if ($ConfigPath) { + $params += "-config $ConfigPath" + } + + if ($Summary) { + $params += "-q" + } + + + if (-not ($Destination.StartsWith("DSN"))) { + $outputisfile = $true + } else { + $outputisfile = $false + } + + if ($outputisfile) { + if ($Destination) { + $dir = Split-Path $Destination + if (-not (Test-Path -Path $dir)) { + try { + $null = New-Item -ItemType Directory -Path $dir -ErrorAction Stop + } catch { + Stop-Function -Message "Failure" -ErrorRecord $_ -Target $Destination -Continue + } + } + + if ((Test-Path $Destination) -and -not $Append -and ((Get-Item $Destination) -isnot [System.IO.DirectoryInfo])) { + if ($AllowClobber) { + try { + Remove-Item -Path "$Destination" -ErrorAction Stop + } catch { + Stop-Function -Message "Failure" -ErrorRecord $_ -Continue + } + } else { + if ($Type -eq "bin") { + Stop-Function -Message "$Destination exists. Use -AllowClobber to overwrite or -Append to append." -Continue + } else { + Stop-Function -Message "$Destination exists. Use -AllowClobber to overwrite." -Continue + } + } + } + + if ((Test-Path "$Destination.$type") -and -not $Append) { + if ($AllowClobber) { + try { + Remove-Item -Path "$Destination.$type" -ErrorAction Stop + } catch { + Stop-Function -Message "Failure" -ErrorRecord $_ -Continue + } + } else { + if ($Type -eq "bin") { + Stop-Function -Message "$("$Destination.$type") exists. Use -AllowClobber to overwrite or -Append to append." -Continue + } else { + Stop-Function -Message "$("$Destination.$type") exists. Use -AllowClobber to overwrite." -Continue + } + } + } + } + } + + $arguments = ($params -join " ") + + try { + if ($Raw) { + Write-Message -Level Output -Message "relog $arguments" + cmd /c "relog $arguments" + } else { + Write-Message -Level Verbose -Message "relog $arguments" + $scriptblock = { + $output = (cmd /c "relog $arguments" | Out-String).Trim() + + if ($output -notmatch "Success") { + Stop-Function -Continue -Message $output.Trim("Input") + } else { + Write-Message -Level Verbose -Message "$output" + $array = $output -Split [environment]::NewLine + $files = $array | Select-String "File:" + + foreach ($rawfile in $files) { + $rawfile = $rawfile.ToString().Replace("File:", "").Trim() + $gcierror = $null + Get-ChildItem $rawfile -ErrorAction SilentlyContinue -ErrorVariable gcierror | Add-Member -MemberType NoteProperty -Name RelogFile -Value $true -PassThru -ErrorAction Ignore + if ($gcierror) { + Write-Message -Level Verbose -Message "$gcierror" + } + } + } + } + Invoke-Command -ScriptBlock $scriptblock + } + } catch { + Stop-Function -Message "Failure" -ErrorRecord $_ -Target $path + } + } + + if ($Multithread) { + $allpaths | Invoke-Parallel -ImportVariables -ImportModules -ScriptBlock $scriptblock -ErrorAction SilentlyContinue -ErrorVariable parallelerror + if ($parallelerror) { + Write-Message -Level Verbose -Message "$parallelerror" + } + } else { + foreach ($file in $allpaths) { Invoke-Command -ScriptBlock $scriptblock -ArgumentList $file } + } + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function Invoke-DbaQuery { + <# + .SYNOPSIS + A command to run explicit T-SQL commands or files. + + .DESCRIPTION + This function is a wrapper command around Invoke-DbaAsync, which in turn is based on Invoke-SqlCmd2. + It was designed to be more convenient to use in a pipeline and to behave in a way consistent with the rest of our functions. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. This can be a collection and receive pipeline input to allow the function to be executed against multiple SQL Server instances. + + .PARAMETER SqlCredential + Credential object used to connect to the SQL Server Instance as a different user. This can be a Windows or SQL Server account. Windows users are determined by the existence of a backslash, so if you are intending to use an alternative Windows connection instead of a SQL login, ensure it contains a backslash. + + .PARAMETER Database + The database to select before running the query. This list is auto-populated from the server. + + .PARAMETER Query + Specifies one or more queries to be run. The queries can be Transact-SQL, XQuery statements, or sqlcmd commands. Multiple queries in a single batch may be separated by a semicolon or a GO + + Escape any double quotation marks included in the string. + + Consider using bracketed identifiers such as [MyTable] instead of quoted identifiers such as "MyTable". + + .PARAMETER QueryTimeout + Specifies the number of seconds before the queries time out. + + .PARAMETER File + Specifies the path to one or several files to be used as the query input. + + .PARAMETER SqlObject + Specify on or multiple SQL objects. Those will be converted to script and their scripts run on the target system(s). + + .PARAMETER As + Specifies output type. Valid options for this parameter are 'DataSet', 'DataTable', 'DataRow', 'PSObject', and 'SingleValue' + + PSObject output introduces overhead but adds flexibility for working with results: http://powershell.org/wp/forums/topic/dealing-with-dbnull/ + + .PARAMETER SqlParameters + Specifies a hashtable of parameters for parameterized SQL queries. http://blog.codinghorror.com/give-me-parameterized-sql-or-give-me-death/ + + .PARAMETER AppendServerInstance + If this switch is enabled, the SQL Server instance will be appended to PSObject and DataRow output. + + .PARAMETER MessagesToOutput + Use this switch to have on the output stream messages too (e.g. PRINT statements). Output will hold the resultset too. See examples for detail + + .PARAMETER InputObject + A collection of databases (such as returned by Get-DbaDatabase) + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .PARAMETER ReadOnly + Execute the query with ReadOnly application intent. + + .NOTES + Tags: Database, Query + Author: Friedrich Weinmann (@FredWeinmann) + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Invoke-DbaQuery + + .EXAMPLE + PS C:\> Invoke-DbaQuery -SqlInstance server\instance -Query 'SELECT foo FROM bar' + + Runs the sql query 'SELECT foo FROM bar' against the instance 'server\instance' + + .EXAMPLE + PS C:\> Get-DbaCmsRegServer -SqlInstance [SERVERNAME] -Group [GROUPNAME] | Invoke-DbaQuery -Query 'SELECT foo FROM bar' + + Runs the sql query 'SELECT foo FROM bar' against all instances in the group [GROUPNAME] on the CMS [SERVERNAME] + + .EXAMPLE + PS C:\> "server1", "server1\nordwind", "server2" | Invoke-DbaQuery -File "C:\scripts\sql\rebuild.sql" + + Runs the sql commands stored in rebuild.sql against the instances "server1", "server1\nordwind" and "server2" + + .EXAMPLE + PS C:\> Get-DbaDatabase -SqlInstance "server1", "server1\nordwind", "server2" | Invoke-DbaQuery -File "C:\scripts\sql\rebuild.sql" + + Runs the sql commands stored in rebuild.sql against all accessible databases of the instances "server1", "server1\nordwind" and "server2" + + .EXAMPLE + PS C:\> Invoke-DbaQuery -SqlInstance . -Query 'SELECT * FROM users WHERE Givenname = @name' -SqlParameters @{ Name = "Maria" } + + Executes a simple query against the users table using SQL Parameters. + This avoids accidental SQL Injection and is the safest way to execute queries with dynamic content. + Keep in mind the limitations inherent in parameters - it is quite impossible to use them for content references. + While it is possible to parameterize a where condition, it is impossible to use this to select which columns to select. + The inserted text will always be treated as string content, and not as a reference to any SQL entity (such as columns, tables or databases). + .EXAMPLE + PS C:\> Invoke-DbaQuery -SqlInstance aglistener1 -ReadOnly -Query "select something from readonlydb.dbo.atable" + + Executes a query with ReadOnly application intent on aglistener1. + #> + [CmdletBinding(DefaultParameterSetName = "Query")] + param ( + [parameter(ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer")] + [DbaInstance[]]$SqlInstance, + [Alias("Credential")] + [PsCredential]$SqlCredential, + [string]$Database, + [Parameter(Mandatory, Position = 0, ParameterSetName = "Query")] + [string]$Query, + [Int32]$QueryTimeout = 600, + [Parameter(Mandatory, ParameterSetName = "File")] + [Alias("InputFile")] + [object[]]$File, + [Parameter(Mandatory, ParameterSetName = "SMO")] + [Microsoft.SqlServer.Management.Smo.SqlSmoObject[]]$SqlObject, + [ValidateSet("DataSet", "DataTable", "DataRow", "PSObject", "SingleValue")] + [string]$As = "DataRow", + [System.Collections.IDictionary]$SqlParameters, + [switch]$AppendServerInstance, + [switch]$MessagesToOutput, + [parameter(ValueFromPipeline)] + [Microsoft.SqlServer.Management.Smo.Database[]]$InputObject, + [switch]$ReadOnly, + [switch]$EnableException + ) + + begin { + Write-Message -Level Debug -Message "Bound parameters: $($PSBoundParameters.Keys -join ", ")" + + $splatInvokeDbaSqlAsync = @{ + As = $As + } + + if (Test-Bound -ParameterName "SqlParameters") { + $splatInvokeDbaSqlAsync["SqlParameters"] = $SqlParameters + } + if (Test-Bound -ParameterName "AppendServerInstance") { + $splatInvokeDbaSqlAsync["AppendServerInstance"] = $AppendServerInstance + } + if (Test-Bound -ParameterName "Query") { + $splatInvokeDbaSqlAsync["Query"] = $Query + } + if (Test-Bound -ParameterName "QueryTimeout") { + $splatInvokeDbaSqlAsync["QueryTimeout"] = $QueryTimeout + } + if (Test-Bound -ParameterName "MessagesToOutput") { + $splatInvokeDbaSqlAsync["MessagesToOutput"] = $MessagesToOutput + } + if (Test-Bound -ParameterName "Verbose") { + $splatInvokeDbaSqlAsync["Verbose"] = $Verbose + } + + + if (Test-Bound -ParameterName "File") { + $files = @() + $temporaryFiles = @() + $temporaryFilesCount = 0 + $temporaryFilesPrefix = (97 .. 122 | Get-Random -Count 10 | ForEach-Object { [char]$_ }) -join '' + + foreach ($item in $File) { + if ($null -eq $item) { continue } + + $type = $item.GetType().FullName + + switch ($type) { + "System.IO.DirectoryInfo" { + if (-not $item.Exists) { + Stop-Function -Message "Directory not found!" -Category ObjectNotFound + return + } + $files += ($item.GetFiles() | Where-Object Extension -EQ ".sql").FullName + + } + "System.IO.FileInfo" { + if (-not $item.Exists) { + Stop-Function -Message "Directory not found!" -Category ObjectNotFound + return + } + + $files += $item.FullName + } + "System.String" { + $uri = [uri]$item + + switch -regex ($uri.Scheme) { + "http" { + $tempfile = "$env:TEMP\$temporaryFilesPrefix-$temporaryFilesCount.sql" + try { + try { + Invoke-TlsWebRequest -Uri $item -OutFile $tempfile -ErrorAction Stop + } catch { + (New-Object System.Net.WebClient).Proxy.Credentials = [System.Net.CredentialCache]::DefaultNetworkCredentials + Invoke-TlsWebRequest -Uri $item -OutFile $tempfile -ErrorAction Stop + } + $files += $tempfile + $temporaryFilesCount++ + $temporaryFiles += $tempfile + } catch { + Stop-Function -Message "Failed to download file $item" -ErrorRecord $_ + return + } + } + default { + try { + $paths = Resolve-Path $item | Select-Object -ExpandProperty Path | Get-Item -ErrorAction Stop + } catch { + Stop-Function -Message "Failed to resolve path: $item" -ErrorRecord $_ + return + } + + foreach ($path in $paths) { + if (-not $path.PSIsContainer) { + if (([uri]$path.FullName).Scheme -ne 'file') { + Stop-Function -Message "Could not resolve path $path as filesystem object" + return + } + $files += $path.FullName + } + } + } + } + } + default { + Stop-Function -Message "Unkown input type: $type" -Category InvalidArgument + return + } + } + } + } + + if (Test-Bound -ParameterName "SqlObject") { + $files = @() + $temporaryFiles = @() + $temporaryFilesCount = 0 + $temporaryFilesPrefix = (97 .. 122 | Get-Random -Count 10 | ForEach-Object { [char]$_ }) -join '' + + foreach ($object in $SqlObject) { + try { $code = Export-DbaScript -InputObject $object -Passthru -EnableException } + catch { + Stop-Function -Message "Failed to generate script for object $object" -ErrorRecord $_ + return + } + + try { + $newfile = "$env:TEMP\$temporaryFilesPrefix-$temporaryFilesCount.sql" + Set-Content -Value $code -Path $newfile -Force -ErrorAction Stop -Encoding UTF8 + $files += $newfile + $temporaryFilesCount++ + $temporaryFiles += $newfile + } catch { + Stop-Function -Message "Failed to write sql script to temp" -ErrorRecord $_ + return + } + } + } + } + + process { + if (Test-FunctionInterrupt) { return } + if (Test-Bound -ParameterName "Database", "InputObject" -And) { + Stop-Function -Category InvalidArgument -Message "You can't use -Database with piped databases" + return + } + if (Test-Bound -ParameterName "SqlInstance", "InputObject" -And) { + Stop-Function -Category InvalidArgument -Message "You can't use -SqlInstance with piped databases" + return + } + + foreach ($db in $InputObject) { + if (!$db.IsAccessible) { + Write-Message -Level Warning -Message "Database $db is not accessible. Skipping." + continue + } + $server = $db.Parent + $conncontext = $server.ConnectionContext + if ($conncontext.DatabaseName -ne $db.Name) { + $conncontext = $server.ConnectionContext.Copy() + $conncontext.DatabaseName = $db.Name + } + try { + if ($File -or $SqlObject) { + foreach ($item in $files) { + if ($null -eq $item) {continue} + $filePath = $(Resolve-Path -LiteralPath $item).ProviderPath + $QueryfromFile = [System.IO.File]::ReadAllText("$filePath") + Invoke-DbaAsync -SQLConnection $conncontext @splatInvokeDbaSqlAsync -Query $QueryfromFile + } + } else { Invoke-DbaAsync -SQLConnection $conncontext @splatInvokeDbaSqlAsync } + } catch { + Stop-Function -Message "[$db] Failed during execution" -ErrorRecord $_ -Target $server -Continue + } + } + foreach ($instance in $SqlInstance) { + try { + $connDbaInstanceParams = @{ + SqlInstance = $instance + SqlCredential = $SqlCredential + Database = $Database + } + if ($ReadOnly) { + $connDbaInstanceParams.ApplicationIntent = "ReadOnly" + } + $server = Connect-DbaInstance @connDbaInstanceParams + } catch { + Stop-Function -Message "Failure" -ErrorRecord $_ -Target $instance -Continue + } + $conncontext = $server.ConnectionContext + try { + if ($Database -and $conncontext.DatabaseName -ne $Database) { + $conncontext = $server.ConnectionContext.Copy() + $conncontext.DatabaseName = $Database + } + if ($File -or $SqlObject) { + foreach ($item in $files) { + if ($null -eq $item) {continue} + $filePath = $(Resolve-Path -LiteralPath $item).ProviderPath + $QueryfromFile = [System.IO.File]::ReadAllText("$filePath") + Invoke-DbaAsync -SQLConnection $conncontext @splatInvokeDbaSqlAsync -Query $QueryfromFile + } + } else { + Invoke-DbaAsync -SQLConnection $conncontext @splatInvokeDbaSqlAsync + } + } catch { + Stop-Function -Message "[$instance] Failed during execution" -ErrorRecord $_ -Target $instance -Continue + } + } + } + + end { + # Execute end even when interrupting, as only used for cleanup + + if ($temporaryFiles) { + # Clean up temporary files that were downloaded + foreach ($item in $temporaryFiles) { + Remove-Item -Path $item -ErrorAction Ignore + } + } + Test-DbaDeprecation -DeprecatedOn '1.0.0' -Alias Invoke-DbaCmd + Test-DbaDeprecation -DeprecatedOn "1.0.0" -EnableException:$false -Alias Invoke-DbaSqlQuery + } +} +function Invoke-DbatoolsFormatter { + <# + .SYNOPSIS + Helps formatting function files to dbatools' standards + + .DESCRIPTION + Uses PSSA's Invoke-Formatter to format the target files and saves it without the BOM. + + .PARAMETER Path + The path to the ps1 file that needs to be formatted + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Formatting + Author: Simone Bizzotto + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Invoke-DbatoolsFormatter + + .EXAMPLE + PS C:\> Invoke-DbatoolsFormatter -Path C:\dbatools\functions\Get-DbaDatabase.ps1 + + Reformats C:\dbatools\functions\Get-DbaDatabase.ps1 to dbatools' standards + + #> + [CmdletBinding()] + param ( + [parameter(Mandatory, ValueFromPipeline)] + [object[]]$Path, + [switch]$EnableException + ) + begin { + $HasInvokeFormatter = $null -ne (Get-Command Invoke-Formatter -ErrorAction SilentlyContinue).Version + if (!($HasInvokeFormatter)) { + Stop-Function -Message "You need a recent version of PSScriptAnalyzer installed" + } + $CBHRex = [regex]'(?smi)\s+<#[^#]*#>' + $CBHStartRex = [regex]'(?[ ]+)<#' + $CBHEndRex = [regex]'(?[ ]*)#>' + } + process { + if (Test-FunctionInterrupt) { return } + foreach ($p in $Path) { + try { + $realPath = (Resolve-Path -Path $p -ErrorAction Stop).Path + } catch { + Stop-Function -Message "Cannot find or resolve $p" -Continue + } + + $content = Get-Content -Path $realPath -Raw -Encoding UTF8 + #strip ending empty lines + $content = $content -replace "(?s)`r`n\s*$" + try { + $content = Invoke-Formatter -ScriptDefinition $content -Settings CodeFormattingOTBS -ErrorAction Stop + } catch { + Write-Message -Level Warning "Unable to format $p" + } + #match the ending indentation of CBH with the starting one, see #4373 + $CBH = $CBHRex.Match($content).Value + if ($CBH) { + #get starting spaces + $startSpaces = $CBHStartRex.Match($CBH).Groups['spaces'] + if ($startSpaces) { + #get end + $newCBH = $CBHEndRex.Replace($CBH, "$startSpaces#>") + if ($newCBH) { + #replace the CBH + $content = $content.Replace($CBH, $newCBH) + } + } + } + $Utf8NoBomEncoding = New-Object System.Text.UTF8Encoding $False + $realContent = @() + #trim whitespace lines + foreach ($line in $content.Split("`n")) { + $realContent += $line.TrimEnd() + } + [System.IO.File]::WriteAllText($realPath, ($realContent -Join "`r`n"), $Utf8NoBomEncoding) + } + } +} +function Invoke-DbatoolsRenameHelper { + <# + .SYNOPSIS + Older dbatools command names have been changed. This script helps keep up. + + .DESCRIPTION + Older dbatools command names have been changed. This script helps keep up. + + .PARAMETER InputObject + A piped in object from Get-ChildItem + + .PARAMETER Encoding + Specifies the file encoding. The default is UTF8. + + Valid values are: + -- ASCII: Uses the encoding for the ASCII (7-bit) character set. + -- BigEndianUnicode: Encodes in UTF-16 format using the big-endian byte order. + -- Byte: Encodes a set of characters into a sequence of bytes. + -- String: Uses the encoding type for a string. + -- Unicode: Encodes in UTF-16 format using the little-endian byte order. + -- UTF7: Encodes in UTF-7 format. + -- UTF8: Encodes in UTF-8 format. + -- Unknown: The encoding type is unknown or invalid. The data can be treated as binary. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .PARAMETER WhatIf + Shows what would happen if the command were to run. No actions are actually performed + + .PARAMETER Confirm + Prompts you for confirmation before executing any changing operations within the command + + .NOTES + Tags: Module + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Invoke-DbatoolsRenameHelper + + .EXAMPLE + PS C:\> Get-ChildItem C:\temp\ps\*.ps1 -Recurse | Invoke-DbatoolsRenameHelper + + Checks to see if any ps1 file in C:\temp\ps matches an old command name. + If so, then the command name within the text is updated and the resulting changes are written to disk in UTF-8. + + .EXAMPLE + PS C:\> Get-ChildItem C:\temp\ps\*.ps1 -Recurse | Invoke-DbatoolsRenameHelper -Encoding Ascii -WhatIf + + Shows what would happen if the command would run. If the command would run and there were matches, + the resulting changes would be written to disk as Ascii encoded. + + #> + [CmdletBinding(SupportsShouldProcess)] + param ( + [parameter(Mandatory, ValueFromPipeline)] + [System.IO.FileInfo[]]$InputObject, + [ValidateSet('ASCII', 'BigEndianUnicode', 'Byte', 'String', 'Unicode', 'UTF7', 'UTF8', 'Unknown')] + [string]$Encoding = 'UTF8', + [switch]$EnableException + ) + begin { + $morerenames = @( + @{ + "AliasName" = "Invoke-Sqlcmd2" + "Definition" = "Invoke-DbaQuery" + }, + @{ + "AliasName" = "UseLastBackups" + "Definition" = "UseLastBackup" + }, + @{ + "AliasName" = "NetworkShare" + "Definition" = "SharedPath" + }, + @{ + "AliasName" = "NoSystemLogins" + "Definition" = "ExcludeSystemLogins" + }, + @{ + "AliasName" = "NoJobSteps" + "Definition" = "ExcludeJobSteps" + }, + @{ + "AliasName" = "NoSystemObjects" + "Definition" = "ExcludeSystemObjects" + }, + @{ + "AliasName" = "NoJobs" + "Definition" = "ExcludeJobs" + }, + @{ + "AliasName" = "NoDatabases" + "Definition" = "ExcludeDatabases" + }, + @{ + "AliasName" = "NoDisabledJobs" + "Definition" = "ExcludeDisabledJobs" + }, + @{ + "AliasName" = "NoJobSteps" + "Definition" = "ExcludeJobSteps" + }, + @{ + "AliasName" = "NoSystem" + "Definition" = "ExcludeSystemLogins" + }, + @{ + "AliasName" = "NoSystemDb" + "Definition" = "ExcludeSystem" + }, + @{ + "AliasName" = "NoSystemObjects" + "Definition" = "ExcludeSystemObjects" + }, + @{ + "AliasName" = "NoSystemSpid" + "Definition" = "ExcludeSystemSpids" + }, + @{ + "AliasName" = "NoQueryTextColumn" + "Definition" = "ExcludeQueryTextColumn" + }, + @{ + "AliasName" = "ExcludeAllSystemDb" + "Definition" = "ExcludeSystem" + }, + @{ + "AliasName" = "ExcludeAllUserDb" + "Definition" = "ExcludeUser" + } + ) + + $allrenames = $script:renames + $morerenames + } + process { + foreach ($fileobject in $InputObject) { + $file = $fileobject.FullName + + foreach ($name in $allrenames) { + if ((Select-String -Pattern $name.AliasName -Path $file)) { + if ($Pscmdlet.ShouldProcess($file, "Replacing $($name.AliasName) with $($name.Definition)")) { + $content = (Get-Content -Path $file -Raw).Replace($name.AliasName, $name.Definition).Trim() + Set-Content -Path $file -Encoding $Encoding -Value $content + [pscustomobject]@{ + Path = $file + Pattern = $name.AliasName + ReplacedWith = $name.Definition + } + } + } + } + } + } +} +function Invoke-DbaWhoIsActive { + <# + .SYNOPSIS + Outputs results of Adam Machanic's sp_WhoIsActive DataTable + + .DESCRIPTION + Output results of Adam Machanic's sp_WhoIsActive + + This command was built with Adam's permission. To read more about sp_WhoIsActive, please visit: + + Updates: http://sqlblog.com/blogs/adam_machanic/archive/tags/who+is+active/default.aspx + + Also, consider donating to Adam if you find this stored procedure helpful: http://tinyurl.com/WhoIsActiveDonate + + .PARAMETER SqlInstance + The target SQL Server instance or instances. You must have sysadmin access and server version must be SQL Server version 2000 or higher. + + .PARAMETER Database + The database where sp_WhoIsActive is installed. Defaults to master. If the sp_WhoIsActive is not installed, the command will warn and exit. + + .PARAMETER Filter + FiltersBoth inclusive and exclusive + Set either filter to '' to disable + Session is a session ID, and either 0 or '' can be used to indicate "all" sessions + All other filter types support % or _ as wildcards + + .PARAMETER FilterType + Valid filter types are: session, program, database, login, and host + + .PARAMETER NotFilter + FiltersBoth inclusive and exclusive + Set either filter to '' to disable + Session is a session ID, and either 0 or '' can be used to indicate "all" sessions + All other filter types support % or _ as wildcards + + .PARAMETER NotFilterType + Valid filter types are: session, program, database, login, and host + + .PARAMETER ShowOwnSpid + Retrieve data about the calling session? + + .PARAMETER ShowSystemSpids + Retrieve data about system sessions? + + .PARAMETER ShowSleepingSpids + Controls how sleeping SPIDs are handled, based on the idea of levels of interest + 0 does not pull any sleeping SPIDs + 1 pulls only those sleeping SPIDs that also have an open transaction + 2 pulls all sleeping SPIDs + + .PARAMETER GetFullInnerText + If 1, gets the full stored procedure or running batch, when available + If 0, gets only the actual statement that is currently running in the batch or procedure + + .PARAMETER GetPlans + Get associated query plans for running tasks, if available + If 1, gets the plan based on the request's statement offset + If 2, gets the entire plan based on the request's plan_handle + + .PARAMETER GetOuterCommand + Get the associated outer ad hoc query or stored procedure call, if available + + .PARAMETER GetTransactionInfo + Enables pulling transaction log write info and transaction duration + + .PARAMETER GetTaskInfo + Get information on active tasks, based on three interest levels + Level 0 does not pull any task-related information + Level 1 is a lightweight mode that pulls the top non-CXPACKET wait, giving preference to blockers + Level 2 pulls all available task-based metrics, including: + number of active tasks, current wait stats, physical I/O, context switches, and blocker information + + .PARAMETER GetLocks + Gets associated locks for each request, aggregated in an XML format + + .PARAMETER GetAverageTime + Get average time for past runs of an active query + (based on the combination of plan handle, sql handle, and offset) + + .PARAMETER GetAdditonalInfo + Get additional non-performance-related information about the session or request + text_size, language, date_format, date_first, quoted_identifier, arithabort, ansi_null_dflt_on, + ansi_defaults, ansi_warnings, ansi_padding, ansi_nulls, concat_null_yields_null, + transaction_isolation_level, lock_timeout, deadlock_priority, row_count, command_type + + If a SQL Agent job is running, an subnode called agent_info will be populated with some or all of + the following: job_id, job_name, step_id, step_name, msdb_query_error (in the event of an error) + + If @get_task_info is set to 2 and a lock wait is detected, a subnode called block_info will be + populated with some or all of the following: lock_type, database_name, object_id, file_id, hobt_id, + applock_hash, metadata_resource, metadata_class_id, object_name, schema_name + + .PARAMETER FindBlockLeaders + Walk the blocking chain and count the number of + total SPIDs blocked all the way down by a given session + Also enables task_info Level 1, if @get_task_info is set to 0 + + .PARAMETER DeltaInterval + Pull deltas on various metrics + Interval in seconds to wait before doing the second data pull + + .PARAMETER OutputColumnList + List of desired output columns, in desired order + Note that the final output will be the intersection of all enabled features and all + columns in the list. Therefore, only columns associated with enabled features will + actually appear in the output. Likewise, removing columns from this list may effectively + disable features, even if they are turned on + + Each element in this list must be one of the valid output column names. Names must be + delimited by square brackets. White space, formatting, and additional characters are + allowed, as long as the list contains exact matches of delimited valid column names. + + .PARAMETER SortOrder + Column(s) by which to sort output, optionally with sort directions. + Valid column choices: + session_id, physical_io, reads, physical_reads, writes, tempdb_allocations, + tempdb_current, CPU, context_switches, used_memory, physical_io_delta, + reads_delta, physical_reads_delta, writes_delta, tempdb_allocations_delta, + tempdb_current_delta, CPU_delta, context_switches_delta, used_memory_delta, + tasks, tran_start_time, open_tran_count, blocking_session_id, blocked_session_count, + percent_complete, host_name, login_name, database_name, start_time, login_time + + Note that column names in the list must be bracket-delimited. Commas and/or white + space are not required. + + .PARAMETER FormatOutput + Formats some of the output columns in a more "human readable" form + 0 disables output format + 1 formats the output for variable-width fonts + 2 formats the output for fixed-width fonts + + .PARAMETER DestinationTable + If set to a non-blank value, the script will attempt to insert into the specified destination table. Please note that the script will not verify that the table exists, or that it has the correct schema, before doing the insert. Table can be specified in one, two, or three-part format + + .PARAMETER ReturnSchema + If set to 1, no data collection will happen and no result set will be returned; instead, + a CREATE TABLE statement will be returned via the @schema parameter, which will match + the schema of the result set that would be returned by using the same collection of the + rest of the parameters. The CREATE TABLE statement will have a placeholder token of + in place of an actual table name. + + .PARAMETER Schema + If set to 1, no data collection will happen and no result set will be returned; instead, + a CREATE TABLE statement will be returned via the @schema parameter, which will match + the schema of the result set that would be returned by using the same collection of the + rest of the parameters. The CREATE TABLE statement will have a placeholder token of + in place of an actual table name. + + .PARAMETER Help + Help! What do I do? + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER WhatIf + Shows what would happen if the command were to run. No actions are actually performed. + + .PARAMETER Confirm + Prompts you for confirmation before executing any changing operations within the command. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: AdamMechanic, WhoIsActive, SpWhoIsActive + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Invoke-DbaWhoIsActive + + .EXAMPLE + PS C:\> Invoke-DbaWhoIsActive -SqlInstance sqlserver2014a + + Execute sp_whoisactive on sqlserver2014a. This command expects sp_WhoIsActive to be in the master database. Logs into the SQL Server with Windows credentials. + + .EXAMPLE + PS C:\> Invoke-DbaWhoIsActive -SqlInstance sqlserver2014a -SqlCredential $credential -Database dbatools + + Execute sp_whoisactive on sqlserver2014a. This command expects sp_WhoIsActive to be in the dbatools database. Logs into the SQL Server with SQL Authentication. + + .EXAMPLE + PS C:\> Invoke-DbaWhoIsActive -SqlInstance sqlserver2014a -GetAverageTime + + Similar to running sp_WhoIsActive @get_avg_time + + .EXAMPLE + PS C:\> Invoke-DbaWhoIsActive -SqlInstance sqlserver2014a -GetOuterCommand -FindBlockLeaders + + Similar to running sp_WhoIsActive @get_outer_command = 1, @find_block_leaders = 1 + + #> + [CmdletBinding()] + param ( + [parameter(Mandatory, ValueFromPipeline)] + [Alias('ServerInstance', 'SqlServer')] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential] + $SqlCredential, + [object]$Database, + [Alias('As')] + [ValidateLength(0, 128)] + [string]$Filter, + [ValidateSet('Session', 'Program', 'Database', 'Login', 'Host')] + [string]$FilterType = 'Session', + [ValidateLength(0, 128)] + [string]$NotFilter, + [ValidateSet('Session', 'Program', 'Database', 'Login', 'Host')] + [string]$NotFilterType = 'Session', + [switch]$ShowOwnSpid, + [switch]$ShowSystemSpids, + [ValidateRange(0, 255)] + [int]$ShowSleepingSpids, + [switch]$GetFullInnerText, + [ValidateRange(0, 255)] + [int]$GetPlans, + [switch]$GetOuterCommand, + [switch]$GetTransactionInfo, + [ValidateRange(0, 2)] + [int]$GetTaskInfo, + [switch]$GetLocks, + [switch]$GetAverageTime, + [switch]$GetAdditonalInfo, + [switch]$FindBlockLeaders, + [ValidateRange(0, 255)] + [int]$DeltaInterval, + [ValidateLength(0, 8000)] + [string]$OutputColumnList = '[dd%][session_id][sql_text][sql_command][login_name][wait_info][tasks][tran_log%][cpu%][temp%][block%][reads%][writes%][context%][physical%][query_plan][locks][%]', + [ValidateLength(0, 500)] + [string]$SortOrder = '[start_time] ASC', + [ValidateRange(0, 255)] + [int]$FormatOutput = 1, + [ValidateLength(0, 4000)] + [string]$DestinationTable = '', + [switch]$ReturnSchema, + [string]$Schema, + [switch]$Help, + [Alias('Silent')] + [switch]$EnableException + ) + + begin { + $passedparams = $psboundparameters.Keys | Where-Object { 'Silent', 'SqlServer', 'SqlCredential', 'OutputAs', 'ServerInstance', 'SqlInstance', 'Database' -notcontains $_ } + $localparams = $psboundparameters + } + + process { + + foreach ($instance in $sqlinstance) { + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $sqlcredential -MinimumVersion 9 + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + if ($server.VersionMajor -lt 9) { + throw "sp_WhoIsActive is only supported in SQL Server 2005 and above" + } + + $paramdictionary = @{ + Filter = '@filter' + FilterType = '@filter_type' + NotFilter = 'not_filter' + NotFilterType = '@not_filter_type' + ShowOwnSpid = '@show_own_spid' + ShowSystemSpids = '@show_system_spids' + ShowSleepingSpids = '@show_sleeping_spids' + GetFullInnerText = '@get_full_inner_text' + GetPlans = '@get_plans' + GetOuterCommand = '@get_outer_command' + GetTransactionInfo = '@get_transaction_info' + GetTaskInfo = '@get_task_info' + GetLocks = '@get_locks ' + GetAverageTime = '@get_avg_time' + GetAdditonalInfo = '@get_additional_info' + FindBlockLeaders = '@find_block_leaders' + DeltaInterval = '@delta_interval' + OutputColumnList = '@output_column_list' + SortOrder = '@sort_order' + FormatOutput = '@format_output ' + DestinationTable = '@destination_table ' + ReturnSchema = '@return_schema' + Schema = '@schema' + Help = '@help' + } + + Write-Message -Level Verbose -Message "Collecting sp_whoisactive data from server: $instance" + try { + $sqlconnection = New-Object System.Data.SqlClient.SqlConnection + $sqlconnection.ConnectionString = $server.ConnectionContext.ConnectionString + $sqlconnection.Open() + + if ($Database) { + # database is being returned as something weird. change it to string without using a method then trim. + $Database = "$Database" + $Database = $Database.Trim() + $sqlconnection.ChangeDatabase($Database) + } + + $sqlcommand = New-Object System.Data.SqlClient.SqlCommand + $sqlcommand.CommandType = "StoredProcedure" + $sqlcommand.CommandText = "dbo.sp_WhoIsActive" + $sqlcommand.Connection = $sqlconnection + + foreach ($param in $passedparams) { + Write-Message -Level Verbose -Message "Check parameter '$param'" + + $sqlparam = $paramdictionary[$param] + + if ($sqlparam) { + + $value = $localparams[$param] + + switch ($value) { + $true { $value = 1 } + $false { $value = 0 } + } + Write-Message -Level Verbose -Message "Adding parameter '$sqlparam' with value '$value'" + [Void]$sqlcommand.Parameters.AddWithValue($sqlparam, $value) + } + } + + $datatable = New-Object system.Data.DataSet + $dataadapter = New-Object system.Data.SqlClient.SqlDataAdapter($sqlcommand) + $dataadapter.fill($datatable) | Out-Null + $datatable.Tables.Rows + } catch { + if ($_.Exception.InnerException -Like "*Could not find*") { + Stop-Function -Message "sp_whoisactive not found, please install using Install-DbaWhoIsActive." -Continue + } else { + Stop-Function -Message "Invalid query." -Continue + } + } + } + } + end { + Test-DbaDeprecation -DeprecatedOn "1.0.0" -EnableException:$false -Alias Show-SqlWhoIsActive -CustomMessage "Show-SqlWhoIsActive is no longer supported. Use Invoke-DbaWhoIsActive | Out-GridView for similar results." + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function Invoke-DbaXeReplay { + <# + .SYNOPSIS + This command replays events from Read-DbaXEFile on one or more target servers + + .DESCRIPTION + This command replays events from Read-DbaXEFile. It is simplistic in its approach. + + - Writes all queries to a temp sql file + - Executes temp file using . $sqlcmd so that batches are executed properly + - Deletes temp file + + .PARAMETER SqlInstance + Target SQL Server(s) + + .PARAMETER SqlCredential + Used to provide alternative credentials. + + .PARAMETER Database + The initial starting database. + + .PARAMETER Event + Each Response can be limited to processing specific events, while ignoring all the other ones. When this attribute is omitted, all events are processed. + + .PARAMETER Raw + By dafault, the results of . $sqlcmd are collected, cleaned up and displayed. If you'd like to see all results immeidately, use Raw. + + .PARAMETER InputObject + Accepts the object output of Read-DbaXESession. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: ExtendedEvent, XE, XEvent + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Invoke-DbaXEReplay + + .EXAMPLE + PS C:\> Read-DbaXEFile -Path C:\temp\sample.xel | Invoke-DbaXeReplay -SqlInstance sql2017 + + Runs all batch_text for sql_batch_completed against tempdb on sql2017. + + .EXAMPLE + PS C:\> Read-DbaXEFile -Path C:\temp\sample.xel | Invoke-DbaXeReplay -SqlInstance sql2017 -Database planning -Event sql_batch_completed + + Sets the *initial* database to planning then runs only sql_batch_completed against sql2017. + + .EXAMPLE + PS C:\> Read-DbaXEFile -Path C:\temp\sample.xel | Invoke-DbaXeReplay -SqlInstance sql2017, sql2016 + + Runs all batch_text for sql_batch_completed against tempdb on sql2017 and sql2016. + + + #> + [Cmdletbinding()] + [Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSUseOutputTypeCorrectly", "", Justification = "PSSA Rule Ignored by BOH")] + param ( + [Parameter(Mandatory)] + [Alias("ServerInstance", "SqlServer")] + [DbaInstance[]]$SqlInstance, + [Alias("Credential")] + [PsCredential]$SqlCredential, + [string[]]$Database, + [string[]]$Event = @('sql_batch_completed', 'rcp_completed'), + [Parameter(Mandatory, ValueFromPipeline)] + [object]$InputObject, + [switch]$Raw, + [switch]$EnableException + ) + + begin { + #Variable marked as unused by PSScriptAnalyzer + #$querycolumns = 'statement', 'batch_text' + $timestamp = (Get-Date -Format yyyyMMddHHmm) + $temp = ([System.IO.Path]::GetTempPath()).TrimEnd("\") + $filename = "$temp\dbatools-replay-$timestamp.sql" + Set-Content $filename -Value $null + + $sqlcmd = "$script:PSModuleRoot\bin\sqlcmd\sqlcmd.exe" + } + process { + if (Test-FunctionInterrupt) { return } + if ($InputObject.Name -notin $Event) { + continue + } + + if ($InputObject.statement) { + if ($InputObject.statement -notmatch "ALTER EVENT SESSION") { + Add-Content -Path $filename -Value $InputObject.statement + Add-Content -Path $filename -Value "GO" + } + } else { + if ($InputObject.batch_text -notmatch "ALTER EVENT SESSION") { + Add-Content -Path $filename -Value $InputObject.batch_text + Add-Content -Path $filename -Value "GO" + } + } + } + end { + if (Test-FunctionInterrupt) { return } + foreach ($instance in $SqlInstance) { + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential + } catch { + Stop-Function -Message "Failure" -ErrorRecord $_ -Target $instance -Continue + } + + + if ($Raw) { + Write-Message -Message "Invoking XEReplay against $instance running on $($server.name) with raw output" -Level Verbose + if (Test-Bound -ParameterName SqlCredential) { + . $sqlcmd -S $instance -i $filename -U $SqlCredential.Username -P $SqlCredential.GetNetworkCredential().Password + continue + } else { + . $sqlcmd -S $instance -i $filename + continue + } + } + + Write-Message -Message "Invoking XEReplay against $instance running on $($server.name)" -Level Verbose + if (Test-Bound -ParameterName SqlCredential) { + $output = . $sqlcmd -S $instance -i $filename -U $SqlCredential.Username -P $SqlCredential.GetNetworkCredential().Password + } else { + $output = . $sqlcmd -S $instance -i $filename + } + + foreach ($line in $output) { + $newline = $line.Trim() + if ($newline -and $newline -notmatch "------------------------------------------------------------------------------------") { + "$newline" + } + } + } + Remove-Item -Path $filename -ErrorAction Ignore + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function Join-DbaAvailabilityGroup { + <# + .SYNOPSIS + Joins a secondary replica to an availability group on a SQL Server instance. + + .DESCRIPTION + Joins a secondary replica to an availability group on a SQL Server instance. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. Server version must be SQL Server version 2012 or higher. + + .PARAMETER SqlCredential + Login to the SqlInstance instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER AvailabilityGroup + The availability group to join. + + .PARAMETER ClusterType + Cluster type of the Availability Group. Only supported in SQL Server 2017 and above. + Options include: External, Wsfc or None. + + .PARAMETER InputObject + Enables piped input from Get-DbaAvailabilityGroup. + + .PARAMETER WhatIf + Shows what would happen if the command were to run. No actions are actually performed. + + .PARAMETER Confirm + Prompts you for confirmation before executing any changing operations within the command. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: AvailabilityGroup, HA, AG + Author: Chrissy LeMaire (@cl), netnerds.net + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Join-DbaAvailabilityGroup + + .EXAMPLE + PS C:\> Get-DbaAvailabilityGroup -SqlInstance sql01 -AvailabilityGroup SharePoint | Join-DbaAvailabilityGroup -SqlInstance sql02 + + Joins sql02 to the SharePoint availability group on sql01 + + .EXAMPLE + PS C:\> $ag = Get-DbaAvailabilityGroup -SqlInstance sql01 -AvailabilityGroup SharePoint + PS C:\> Join-DbaAvailabilityGroup -SqlInstance sql02 -InputObject $ag + + Joins sql02 to the SharePoint availability group on sql01 + + .EXAMPLE + PS C:\> Get-DbaAvailabilityGroup -SqlInstance sql01 -AvailabilityGroup SharePoint | Join-DbaAvailabilityGroup -SqlInstance sql02 -WhatIf + + Shows what would happen if the command were to run. No actions are actually performed. + + .EXAMPLE + PS C:\> Get-DbaAvailabilityGroup -SqlInstance sql01 -AvailabilityGroup SharePoint | Join-DbaAvailabilityGroup -SqlInstance sql02 -Confirm + + Prompts for confirmation then joins sql02 to the SharePoint availability group on sql01. + #> + [CmdletBinding(SupportsShouldProcess, ConfirmImpact = 'Low')] + param ( + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [string[]]$AvailabilityGroup, + [ValidateSet('External', 'Wsfc', 'None')] + [string]$ClusterType, + [parameter(ValueFromPipeline)] + [Microsoft.SqlServer.Management.Smo.AvailabilityGroup[]]$InputObject, + [switch]$EnableException + ) + process { + + if ($InputObject) { + $AvailabilityGroup += $InputObject.Name + if (-not $ClusterType) { + $tempclustertype = ($InputObject | Select-Object -First 1).ClusterType + if ($tempclustertype) { + $ClusterType = $tempclustertype + } + } + } + + if (-not $AvailabilityGroup) { + Stop-Function -Message "No availability group to add" + return + } + + foreach ($instance in $SqlInstance) { + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $sqlcredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + foreach ($ag in $AvailabilityGroup) { + if ($Pscmdlet.ShouldProcess($server.Name, "Joining $ag")) { + try { + if ($ClusterType -and $server.VersionMajor -ge 14) { + $server.Query("ALTER AVAILABILITY GROUP [$ag] JOIN WITH (CLUSTER_TYPE = $ClusterType)") + } else { + $server.JoinAvailabilityGroup($ag) + } + } catch { + Stop-Function -Message "Failure" -ErrorRecord $_ -Continue + } + } + } + } + } +} +function Measure-DbaBackupThroughput { + <# + .SYNOPSIS + Determines how quickly SQL Server is backing up databases to media. + + .DESCRIPTION + Returns backup history details for one or more databases on a SQL Server. + + Output looks like this: + SqlInstance : sql2016 + Database : SharePoint_Config + AvgThroughput : 1.07 MB + AvgSize : 24.17 + AvgDuration : 00:00:01.1000000 + MinThroughput : 0.02 MB + MaxThroughput : 2.26 MB + MinBackupDate : 8/6/2015 10:22:01 PM + MaxBackupDate : 6/19/2016 12:57:45 PM + BackupCount : 10 + + .PARAMETER SqlInstance + The target SQL Server instance or instances. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Database + The database(s) to process. Options for this list are auto-populated from the server. If unspecified, all databases will be processed. + + .PARAMETER ExcludeDatabase + The database(s) to exclude. Options for this list are auto-populated from the server. + + .PARAMETER Type + By default, this command measures the speed of Full backups. Valid options are "Full", "Log" and "Differential". + + .PARAMETER Since + All backups taken on or after the point in time represented by this datetime object will be processed. + + .PARAMETER Last + If this switch is enabled, only the last backup will be measured. + + .PARAMETER DeviceType + Specifies one or more DeviceTypes to use in filtering backup sets. Valid values are "Disk", "Permanent Disk Device", "Tape", "Permanent Tape Device", "Pipe", "Permanent Pipe Device" and "Virtual Device", as well as custom integers for your own DeviceTypes. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Backup, Database + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Measure-DbaBackupThroughput + + .EXAMPLE + PS C:\> Measure-DbaBackupThroughput -SqlInstance sql2016 + + Parses every backup in msdb's backuphistory for stats on all databases. + + .EXAMPLE + PS C:\> Measure-DbaBackupThroughput -SqlInstance sql2016 -Database AdventureWorks2014 + + Parses every backup in msdb's backuphistory for stats on AdventureWorks2014. + + .EXAMPLE + PS C:\> Measure-DbaBackupThroughput -SqlInstance sql2005 -Last + + Processes the last full, diff and log backups every backup for all databases on sql2005. + + .EXAMPLE + PS C:\> Measure-DbaBackupThroughput -SqlInstance sql2005 -Last -Type Log + + Processes the last log backups every backup for all databases on sql2005. + + .EXAMPLE + PS C:\> Measure-DbaBackupThroughput -SqlInstance sql2016 -Since (Get-Date).AddDays(-7) | Where-Object { $_.MinThroughput.Gigabyte -gt 1 } + + Gets backup calculations for the last week and filters results that have a minimum of 1GB throughput + + .EXAMPLE + PS C:\> Measure-DbaBackupThroughput -SqlInstance sql2016 -Since (Get-Date).AddDays(-365) -Database bigoldb + + Gets backup calculations, limited to the last year and only the bigoldb database + + #> + [CmdletBinding()] + param ( + [parameter(Position = 0, Mandatory, ValueFromPipeline)] + [Alias("ServerInstance", "Instance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [Alias("Credential")] + [PSCredential]$SqlCredential, + [Alias("Databases")] + [object[]]$Database, + [object[]]$ExcludeDatabase, + [datetime]$Since, + [switch]$Last, + [ValidateSet("Full", "Log", "Differential", "File", "Differential File", "Partial Full", "Partial Differential")] + [string]$Type = "Full", + [string[]]$DeviceType, + [Alias('Silent')] + [switch]$EnableException + ) + + process { + foreach ($instance in $SqlInstance) { + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $sqlcredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + if ($Database) { + $DatabaseCollection = $server.Databases | Where-Object Name -in $Database + } else { + $DatabaseCollection = $server.Databases + } + + if ($ExcludeDatabase) { + $DatabaseCollection = $DatabaseCollection | Where-Object Name -NotIn $ExcludeDatabase + } + + foreach ($db in $DatabaseCollection) { + Write-Message -Level VeryVerbose -Message "Retrieving history for $db." + $allhistory = @() + + # Splatting didn't work + if ($since) { + $histories = Get-DbaBackupHistory -SqlInstance $server -Database $db.name -Since $since -DeviceType $DeviceType -Type $Type + } else { + $histories = Get-DbaBackupHistory -SqlInstance $server -Database $db.name -Last:$last -DeviceType $DeviceType -Type $Type + } + + foreach ($history in $histories) { + $timetaken = New-TimeSpan -Start $history.Start -End $history.End + + if ($timetaken.TotalMilliseconds -eq 0) { + $throughput = $history.TotalSize.Megabyte + } else { + $throughput = $history.TotalSize.Megabyte / $timetaken.TotalSeconds + } + + Add-Member -Force -InputObject $history -MemberType Noteproperty -Name MBps -value $throughput + + $allhistory += $history | Select-Object ComputerName, InstanceName, SqlInstance, Database, MBps, TotalSize, Start, End + } + + Write-Message -Level VeryVerbose -Message "Calculating averages for $db." + foreach ($db in ($allhistory | Sort-Object Database | Group-Object Database)) { + + $measuremb = $db.Group.MBps | Measure-Object -Average -Minimum -Maximum + $measurestart = $db.Group.Start | Measure-Object -Minimum + $measureend = $db.Group.End | Measure-Object -Maximum + $measuresize = $db.Group.TotalSize.Megabyte | Measure-Object -Average + $avgduration = $db.Group | ForEach-Object { New-TimeSpan -Start $_.Start -End $_.End } | Measure-Object -Average TotalSeconds + + [pscustomobject]@{ + ComputerName = $db.Group.ComputerName | Select-Object -First 1 + InstanceName = $db.Group.InstanceName | Select-Object -First 1 + SqlInstance = $db.Group.SqlInstance | Select-Object -First 1 + Database = $db.Name + AvgThroughput = [dbasize]([System.Math]::Round($measuremb.Average, 2) * 1024 * 1024) + AvgSize = [dbasize]([System.Math]::Round($measuresize.Average, 2) * 1024 * 1024) + AvgDuration = [dbatimespan](New-TimeSpan -Seconds $avgduration.Average) + MinThroughput = [dbasize]([System.Math]::Round($measuremb.Minimum, 2) * 1024 * 1024) + MaxThroughput = [dbasize]([System.Math]::Round($measuremb.Maximum, 2) * 1024 * 1024) + MinBackupDate = [dbadatetime]$measurestart.Minimum + MaxBackupDate = [dbadatetime]$measureend.Maximum + BackupCount = $db.Count + } | Select-DefaultView -ExcludeProperty ComputerName, InstanceName + } + } + } + } +} +function Measure-DbaDiskSpaceRequirement { + <# + .SYNOPSIS + Calculate the space needed to copy and possibly replace a database from one SQL server to another. + + .DESCRIPTION + Returns a file list from source and destination where source file may overwrite destination. Complex scenarios where a new file may exist is taken into account. + This command will accept a hash object in pipeline with the following keys: Source, SourceDatabase, Destination. Using this command will provide a way to prepare before a complex migration with multiple databases from different sources and destinations. + + .PARAMETER Source + Source SQL Server. + + .PARAMETER SourceSqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Database + The database to copy. It MUST exist. + + .PARAMETER Destination + Destination SQL Server instance. + + .PARAMETER DestinationSqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER DestinationDatabase + The database name at destination. + May or may not be present, if unspecified it will default to the database name provided in SourceDatabase. + + .PARAMETER Credential + The credentials to use to connect via CIM/WMI/PowerShell remoting. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Database, DiskSpace, Migration + Author: Pollus Brodeur (@pollusb) + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Measure-DbaDiskSpaceRequirement + + .EXAMPLE + PS C:\> Measure-DbaDiskSpaceRequirement -Source INSTANCE1 -Database DB1 -Destination INSTANCE2 + + Calculate space needed for a simple migration with one database with the same name at destination. + + .EXAMPLE + PS C:\> @( + >> [PSCustomObject]@{Source='SQL1';Destination='SQL2';Database='DB1'}, + >> [PSCustomObject]@{Source='SQL1';Destination='SQL2';Database='DB2'} + >> ) | Measure-DbaDiskSpaceRequirement + + Using a PSCustomObject with 2 databases to migrate on SQL2. + + .EXAMPLE + PS C:\> Import-Csv -Path .\migration.csv -Delimiter "`t" | Measure-DbaDiskSpaceRequirement | Format-Table -AutoSize + + Using a CSV file. You will need to use this header line "SourceDestinationDatabaseDestinationDatabase". + + .EXAMPLE + PS C:\> $qry = "SELECT Source, Destination, Database FROM dbo.Migrations" + PS C:\> Invoke-DbaCmd -SqlInstance DBA -Database Migrations -Query $qry | Measure-DbaDiskSpaceRequirement + + Using a SQL table. We are DBA after all! + + #> + [CmdletBinding()] + [Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSUseOutputTypeCorrectly", "", Justification = "PSSA Rule Ignored by BOH")] + param( + [Parameter(Mandatory, ValueFromPipelineByPropertyName = $true)] + [DbaInstanceParameter]$Source, + [Parameter(Mandatory, ValueFromPipelineByPropertyName = $true)] + [string]$Database, + [Parameter(ValueFromPipelineByPropertyName = $true)] + [PSCredential]$SourceSqlCredential, + [Parameter(Mandatory, ValueFromPipelineByPropertyName = $true)] + [DbaInstanceParameter]$Destination, + [Parameter(ValueFromPipelineByPropertyName = $true)] + [string]$DestinationDatabase, + [Parameter(ValueFromPipelineByPropertyName = $true)] + [PSCredential]$DestinationSqlCredential, + [Parameter(ValueFromPipelineByPropertyName = $true)] + [PSCredential]$Credential, + [Alias('Silent')] + [switch]$EnableException + ) + begin { + $local:cacheMP = @{} + $local:cacheDP = @{} + function Get-MountPoint { + [CmdletBinding()] + param( + [Parameter(Mandatory)] + $computerName, + [PSCredential]$credential + ) + Get-DbaCmObject -Class Win32_MountPoint -ComputerName $computerName -Credential $credential | + Select-Object @{n = 'Mountpoint'; e = {$_.Directory.split('=')[1].Replace('"', '').Replace('\\', '\')}} + } + function Get-MountPointFromPath { + [CmdletBinding()] + param( + [Parameter(Mandatory)] + $path, + [Parameter(Mandatory)] + $computerName, + [PSCredential]$credential + ) + if (!$cacheMP[$computerName]) { + try { + $cacheMP.Add($computerName, (Get-MountPoint -computerName $computerName -credential $credential)) + Write-Message -Level Verbose -Message "cacheMP[$computerName] is now cached" + } catch { + # This way, I won't be asking again for this computer. + $cacheMP.Add($computerName, '?') + Stop-Function -Message "Can't connect to $computerName. cacheMP[$computerName] = ?" -ErrorRecord $_ -Target $computerName -Continue + } + } + if ($cacheMP[$computerName] -eq '?') { + return '?' + } + foreach ($m in ($cacheMP[$computerName] | Sort-Object -Property Mountpoint -Descending)) { + if ($path -like "$($m.Mountpoint)*") { + return $m.Mountpoint + } + } + Write-Message -Level Warning -Message "Path $path can't be found in any MountPoints of $computerName" + } + function Get-MountPointFromDefaultPath { + [CmdletBinding()] + param( + [Parameter(Mandatory)] + [ValidateSet('Log', 'Data')] + $DefaultPathType, + [Parameter(Mandatory)] + $SqlInstance, + [PSCredential]$SqlCredential, + # Could probably use the computer defined in SqlInstance but info was already available from the caller + $computerName, + [PSCredential]$Credential + ) + if (!$cacheDP[$SqlInstance]) { + try { + $cacheDP.Add($SqlInstance, (Get-DbaDefaultPath -SqlInstance $SqlInstance -SqlCredential $SqlCredential -EnableException)) + Write-Message -Level Verbose -Message "cacheDP[$SqlInstance] is now cached" + } catch { + Stop-Function -Message "Can't connect to $SqlInstance" -Continue + $cacheDP.Add($SqlInstance, '?') + return '?' + } + } + if ($cacheDP[$SqlInstance] -eq '?') { + return '?' + } + if (!$computerName) { + $computerName = $cacheDP[$SqlInstance].ComputerName + } + if (!$cacheMP[$computerName]) { + try { + $cacheMP.Add($computerName, (Get-MountPoint -computerName $computerName -Credential $Credential)) + } catch { + Stop-Function -Message "Can't connect to $computerName." -Continue + $cacheMP.Add($computerName, '?') + return '?' + } + } + if ($DefaultPathType -eq 'Log') { + $path = $cacheDP[$SqlInstance].Log + } else { + $path = $cacheDP[$SqlInstance].Data + } + foreach ($m in ($cacheMP[$computerName] | Sort-Object -Property Mountpoint -Descending)) { + if ($path -like "$($m.Mountpoint)*") { + return $m.Mountpoint + } + } + } + } + process { + try { + $sourceServer = Connect-SqlInstance -SqlInstance $Source -SqlCredential $SourceSqlCredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $Source + } + + try { + $destServer = Connect-SqlInstance -SqlInstance $Destination -SqlCredential $DestinationSqlCredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $Destination + } + + if (Test-Bound 'DestinationDatabase' -not) { + $DestinationDatabase = $Database + } + Write-Message -Level Verbose -Message "$Source.[$Database] -> $Destination.[$DestinationDatabase]" + + $sourceDb = Get-DbaDatabase -SqlInstance $sourceServer -Database $Database -SqlCredential $SourceSqlCredential + if (Test-Bound 'Database' -not) { + Stop-Function -Message "Database [$Database] MUST exist on Source Instance $Source." -ErrorRecord $_ + } + $sourceFiles = @($sourceDb.FileGroups.Files | Select-Object Name, FileName, Size, @{n = 'Type'; e = {'Data'}}) + $sourceFiles += @($sourceDb.LogFiles | Select-Object Name, FileName, Size, @{n = 'Type'; e = {'Log'}}) + + if ($destDb = Get-DbaDatabase -SqlInstance $destServer -Database $DestinationDatabase -SqlCredential $DestinationSqlCredential) { + $destFiles = @($destDb.FileGroups.Files | Select-Object Name, FileName, Size, @{n = 'Type'; e = {'Data'}}) + $destFiles += @($destDb.LogFiles | Select-Object Name, FileName, Size, @{n = 'Type'; e = {'Log'}}) + $computerName = $destDb.ComputerName + } else { + Write-Message -Level Verbose -Message "Database [$DestinationDatabase] does not exist on Destination Instance $Destination." + $computerName = $destServer.ComputerName + } + + foreach ($sourceFile in $sourceFiles) { + foreach ($destFile in $destFiles) { + if (($found = ($sourceFile.Name -eq $destFile.Name))) { + # Files found on both sides + [PSCustomObject]@{ + SourceComputerName = $sourceServer.ComputerName + SourceInstance = $sourceServer.ServiceName + SourceSqlInstance = $sourceServer.DomainInstanceName + DestinationComputerName = $destServer.ComputerName + DestinationInstance = $destServer.ServiceName + DestinationSqlInstance = $destServer.DomainInstanceName + SourceDatabase = $sourceDb.Name + SourceLogicalName = $sourceFile.Name + SourceFileName = $sourceFile.FileName + SourceFileSize = [DbaSize]($sourceFile.Size * 1000) + DestinationDatabase = $destDb.Name + DestinationLogicalName = $destFile.Name + DestinationFileName = $destFile.FileName + DestinationFileSize = [DbaSize]($destFile.Size * 1000) * -1 + DifferenceSize = [DbaSize]( ($sourceFile.Size * 1000) - ($destFile.Size * 1000) ) + MountPoint = Get-MountPointFromPath -Path $destFile.Filename -ComputerName $computerName -Credential $Credential + FileLocation = 'Source and Destination' + } | Select-DefaultView -ExcludeProperty SourceComputerName, SourceInstance, DestinationInstance, DestinationLogicalName + break + } + } + if (!$found) { + # Files on source but not on destination + [PSCustomObject]@{ + SourceComputerName = $sourceServer.ComputerName + SourceInstance = $sourceServer.ServiceName + SourceSqlInstance = $sourceServer.DomainInstanceName + DestinationComputerName = $destServer.ComputerName + DestinationInstance = $destServer.ServiceName + DestinationSqlInstance = $destServer.DomainInstanceName + SourceDatabase = $sourceDb.Name + SourceLogicalName = $sourceFile.Name + SourceFileName = $sourceFile.FileName + SourceFileSize = [DbaSize]($sourceFile.Size * 1000) + DestinationDatabase = $DestinationDatabase + DestinationLogicalName = $null + DestinationFileName = $null + DestinationFileSize = [DbaSize]0 + DifferenceSize = [DbaSize]($sourceFile.Size * 1000) + MountPoint = Get-MountPointFromDefaultPath -DefaultPathType $sourceFile.Type -SqlInstance $Destination ` + -SqlCredential $DestinationSqlCredential -computerName $computerName -credential $Credential + FileLocation = 'Only on Source' + } | Select-DefaultView -ExcludeProperty SourceComputerName, SourceInstance, DestinationInstance, DestinationLogicalName + } + } + if ($destDb) { + # Files on destination but not on source (strange scenario but possible) + $destFilesNotSource = Compare-Object -ReferenceObject $destFiles -DifferenceObject $sourceFiles -Property Name -PassThru + foreach ($destFileNotSource in $destFilesNotSource) { + [PSCustomObject]@{ + SourceComputerName = $sourceServer.ComputerName + SourceInstance = $sourceServer.ServiceName + SourceSqlInstance = $sourceServer.DomainInstanceName + DestinationComputerName = $destServer.ComputerName + DestinationInstance = $destServer.ServiceName + DestinationSqlInstance = $destServer.DomainInstanceName + SourceDatabaseName = $Database + SourceLogicalName = $null + SourceFileName = $null + SourceFileSize = [DbaSize]0 + DestinationDatabaseName = $destDb.Name + DestinationLogicalName = $destFileNotSource.Name + DestinationFileName = $destFile.FileName + DestinationFileSize = [DbaSize]($destFileNotSource.Size * 1000) * -1 + DifferenceSize = [DbaSize]($destFileNotSource.Size * 1000) * -1 + MountPoint = Get-MountPointFromPath -Path $destFileNotSource.Filename -ComputerName $computerName -Credential $Credential + FileLocation = 'Only on Destination' + } | Select-DefaultView -ExcludeProperty SourceComputerName, SourceInstance, DestinationInstance, DestinationLogicalName + } + } + $DestinationDatabase = $null + } +} +function Measure-DbatoolsImport { + <# + .SYNOPSIS + Displays the import load times of the dbatools PowerShell module + + .DESCRIPTION + Displays the import load times of the dbatools PowerShell module + + .NOTES + Tags: Debug + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Measure-DbatoolsImport + + .EXAMPLE + PS C:\> Measure-DbatoolsImport + Displays the import load times of the dbatools PowerShell module + + .EXAMPLE + PS C:\> Import-Module dbatools + PS C:\> Measure-DbatoolsImport + + Displays the import load times of the dbatools PowerShell module + + #> + [Sqlcollaborative.Dbatools.dbaSystem.DebugHost]::ImportTime +} +function Mount-DbaDatabase { + <# + .SYNOPSIS + Attach a SQL Server Database - aliased to Attach-DbaDatabase + + .DESCRIPTION + This command will attach a SQL Server database. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Database + The database(s) to attach. + + .PARAMETER FileStructure + A StringCollection object value that contains a list database files. If FileStructure is not specified, BackupHistory will be used to guess the structure. + + .PARAMETER DatabaseOwner + Sets the database owner for the database. The sa account (or equivalent) will be used if DatabaseOwner is not specified. + + .PARAMETER AttachOption + An AttachOptions object value that contains the attachment options. Valid options are "None", "RebuildLog", "EnableBroker", "NewBroker" and "ErrorBrokerConversations". + + .PARAMETER WhatIf + If this switch is enabled, no actions are performed but informational messages will be displayed that explain what would happen if the command were to run. + + .PARAMETER Confirm + If this switch is enabled, you will be prompted for confirmation before executing any operations that change state. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Database + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Mount-DbaDatabase + + .EXAMPLE + PS C:\> $fileStructure = New-Object System.Collections.Specialized.StringCollection + PS C:\> $fileStructure.Add("E:\archive\example.mdf") + PS C:\> $filestructure.Add("E:\archive\example.ldf") + PS C:\> $filestructure.Add("E:\archive\example.ndf") + PS C:\> Mount-DbaDatabase -SqlInstance sql2016 -Database example -FileStructure $fileStructure + + Attaches a database named "example" to sql2016 with the files "E:\archive\example.mdf", "E:\archive\example.ldf" and "E:\archive\example.ndf". The database owner will be set to sa and the attach option is None. + + .EXAMPLE + PS C:\> Mount-DbaDatabase -SqlInstance sql2016 -Database example + + Since the FileStructure was not provided, this command will attempt to determine it based on backup history. If found, a database named example will be attached to sql2016. + + .EXAMPLE + PS C:\> Mount-DbaDatabase -SqlInstance sql2016 -Database example -WhatIf + + Shows what would happen if the command were executed (without actually performing the command) + + #> + [CmdletBinding(SupportsShouldProcess)] + param ( + [parameter(Mandatory, ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential] + $SqlCredential, + [parameter(Mandatory)] + [string[]]$Database, + [System.Collections.Specialized.StringCollection]$FileStructure, + [string]$DatabaseOwner, + [ValidateSet('None', 'RebuildLog', 'EnableBroker', 'NewBroker', 'ErrorBrokerConversations')] + [string]$AttachOption = "None", + [Alias('Silent')] + [switch]$EnableException + ) + process { + foreach ($instance in $SqlInstance) { + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $sqlcredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + if (-not $server.Logins.Item($DatabaseOwner)) { + try { + $DatabaseOwner = ($server.Logins | Where-Object { $_.id -eq 1 }).Name + } catch { + $DatabaseOwner = "sa" + } + } + + foreach ($db in $database) { + + if ($server.Databases[$db]) { + Stop-Function -Message "$db is already attached to $server." -Target $db -Continue + } + + if ($server.Databases[$db].IsSystemObject) { + Stop-Function -Message "$db is a system database and cannot be attached using this method." -Target $db -Continue + } + + if (-Not (Test-Bound -Parameter FileStructure)) { + $backuphistory = Get-DbaBackupHistory -SqlInstance $server -Database $db -Type Full | Sort-Object End -Descending | Select-Object -First 1 + + if (-not $backuphistory) { + $message = "Could not enumerate backup history to automatically build FileStructure. Rerun the command and provide the filestructure parameter." + Stop-Function -Message $message -Target $db -Continue + } + + $backupfile = $backuphistory.Path[0] + $filepaths = (Read-DbaBackupHeader -SqlInstance $server -FileList -Path $backupfile).PhysicalName + + $FileStructure = New-Object System.Collections.Specialized.StringCollection + foreach ($file in $filepaths) { + $exists = Test-Dbapath -SqlInstance $server -Path $file + if (-not $exists) { + $message = "Could not find the files to build the FileStructure. Rerun the command and provide the FileStructure parameter." + Stop-Function -Message $message -Target $file -Continue + } + + $null = $FileStructure.Add($file) + } + } + + If ($Pscmdlet.ShouldProcess($server, "Attaching $Database with $DatabaseOwner as database owner and $AttachOption as attachoption")) { + try { + $server.AttachDatabase($db, $FileStructure, $DatabaseOwner, [Microsoft.SqlServer.Management.Smo.AttachOptions]::$AttachOption) + + [pscustomobject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + Database = $db + AttachResult = "Success" + AttachOption = $AttachOption + FileStructure = $FileStructure + } + } catch { + Stop-Function -Message "Failure" -ErrorRecord $_ -Target $server + } + } + } + } + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function Move-DbaCmsRegServer { + <# + .SYNOPSIS + Moves registered servers around SQL Server Central Management Server (CMS) + + .DESCRIPTION + Moves registered servers around SQL Server Central Management Server (CMS) + + .PARAMETER SqlInstance + The target SQL Server instance or instances. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Name + Specifies one or more reg servers to move. Name is the visible name in SSMS CMS interface (labeled Registered Server Name) + + .PARAMETER ServerName + Specifies one or more reg servers to move. Server Name is the actual instance name (labeled Server Name) + + .PARAMETER NewGroup + The new group. If no new group is specified, the default root will used + + .PARAMETER InputObject + Allows results from Get-DbaCmsRegServer to be piped in + + .PARAMETER WhatIf + Shows what would happen if the command were to run. No actions are actually performed. + + .PARAMETER Confirm + Prompts you for confirmation before executing any changing operations within the command. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: RegisteredServer, CMS + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Move-DbaCmsRegServer + + .EXAMPLE + PS C:\> Move-DbaCmsRegServer -SqlInstance sql2012 -Name 'Web SQL Cluster' -NewGroup HR\Prod + + Moves the registered server on sql2012 titled 'Web SQL Cluster' to the Prod group within the HR group + + .EXAMPLE + PS C:\> Get-DbaCmsRegServer -SqlInstance sql2017 -Name 'Web SQL Cluster' | Move-DbaCmsRegServer -NewGroup Web + + Moves the registered server 'Web SQL Cluster' on sql2017 to the Web group, also on sql2017 + + #> + + [CmdletBinding(SupportsShouldProcess)] + param ( + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [string[]]$Name, + [string[]]$ServerName, + [string]$NewGroup, + [parameter(ValueFromPipeline)] + [Microsoft.SqlServer.Management.RegisteredServers.RegisteredServer[]]$InputObject, + [switch]$EnableException + ) + + begin { + if ((Test-Bound -ParameterName SqlInstance) -and (Test-Bound -Not -ParameterName Name) -and (Test-Bound -Not -ParameterName ServerName)) { + Stop-Function -Message "Name or ServerName must be specified when using -SqlInstance" + } + } + process { + if (Test-FunctionInterrupt) { return } + + foreach ($instance in $SqlInstance) { + $InputObject += Get-DbaCmsRegServer -SqlInstance $instance -SqlCredential $SqlCredential -Name $Name -ServerName $ServerName + + } + + foreach ($regserver in $InputObject) { + $parentserver = Get-RegServerParent -InputObject $regserver + + if ($null -eq $parentserver) { + Stop-Function -Message "Something went wrong and it's hard to explain, sorry. This basically shouldn't happen." -Continue + } + + $server = $parentserver.ServerConnection.SqlConnectionObject + + if ((Test-Bound -ParameterName NewGroup)) { + $group = Get-DbaCmsRegServerGroup -SqlInstance $server -Group $NewGroup + + if (-not $group) { + Stop-Function -Message "$NewGroup not found on $server" -Continue + } + } else { + $group = Get-DbaCmsRegServerGroup -SqlInstance $server -Id 1 + } + + if ($Pscmdlet.ShouldProcess($regserver.SqlInstance, "Moving $($regserver.Name) to $group")) { + try { + $null = $parentserver.ServerConnection.ExecuteNonQuery($regserver.ScriptMove($group).GetScript()) + Get-DbaCmsRegServer -SqlInstance $server -Name $regserver.Name -ServerName $regserver.ServerName + $parentserver.ServerConnection.Disconnect() + } catch { + Stop-Function -Message "Failed to move $($regserver.Name) to $NewGroup on $($regserver.SqlInstance)" -ErrorRecord $_ -Continue + } + } + } + } + end { + Test-DbaDeprecation -DeprecatedOn "1.0.0" -Alias Move-DbaRegisteredServer + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function Move-DbaCmsRegServerGroup { + <# + .SYNOPSIS + Moves registered server groups around SQL Server Central Management Server (CMS). + + .DESCRIPTION + Moves registered server groups around SQL Server Central Management Server (CMS). + + .PARAMETER SqlInstance + The target SQL Server instance or instances. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Group + Specifies one or more groups to include from SQL Server Central Management Server. + + .PARAMETER NewGroup + The new location. + + .PARAMETER InputObject + Allows results from Get-DbaCmsRegServerGroup to be piped in + + .PARAMETER WhatIf + Shows what would happen if the command were to run. No actions are actually performed. + + .PARAMETER Confirm + Prompts you for confirmation before executing any changing operations within the command. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: RegisteredServer, CMS + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Move-DbaCmsRegServerGroup + + .EXAMPLE + PS C:\> Move-DbaCmsRegServerGroup -SqlInstance sql2012 -Group HR\Development -NewGroup AD\Prod + + Moves the Development group within HR to the Prod group within AD + + .EXAMPLE + PS C:\> Get-DbaCmsRegServerGroup -SqlInstance sql2017 -Group HR\Development| Move-DbaCmsRegServer -NewGroup Web + + Moves the Development group within HR to the Web group + + #> + [CmdletBinding(SupportsShouldProcess)] + param ( + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [string[]]$Group, + [parameter(Mandatory)] + [string]$NewGroup, + [parameter(ValueFromPipeline)] + [Microsoft.SqlServer.Management.RegisteredServers.ServerGroup[]]$InputObject, + [switch]$EnableException + ) + begin { + if ((Test-Bound -ParameterName SqlInstance) -and (Test-Bound -Not -ParameterName Group)) { + Stop-Function -Message "Group must be specified when using -SqlInstance" + } + } + process { + if (Test-FunctionInterrupt) { return } + + foreach ($instance in $SqlInstance) { + $InputObject += Get-DbaCmsRegServerGroup -SqlInstance $instance -SqlCredential $SqlCredential -Group $Group + } + + foreach ($regservergroup in $InputObject) { + $parentserver = Get-RegServerParent -InputObject $regservergroup + + if ($null -eq $parentserver) { + Stop-Function -Message "Something went wrong and it's hard to explain, sorry. This basically shouldn't happen." -Continue + } + + $server = $parentserver.ServerConnection.SqlConnectionObject + + if ($NewGroup -eq 'Default') { + $groupobject = Get-DbaCmsRegServerGroup -SqlInstance $server -Id 1 + } else { + $groupobject = Get-DbaCmsRegServerGroup -SqlInstance $server -Group $NewGroup + } + + Write-Message -Level Verbose -Message "Found $($groupobject.Name) on $($parentserver.ServerConnection.ServerName)" + + if (-not $groupobject) { + Stop-Function -Message "Group '$NewGroup' not found on $server" -Continue + } + + if ($Pscmdlet.ShouldProcess($regservergroup.SqlInstance, "Moving $($regservergroup.Name) to $($groupobject.Name)")) { + try { + Write-Message -Level Verbose -Message "Parsing $groupobject" + $newname = Get-RegServerGroupReverseParse $groupobject + $newname = "$newname\$($regservergroup.Name)" + Write-Message -Level Verbose -Message "Executing $($regservergroup.ScriptMove($groupobject).GetScript())" + $null = $parentserver.ServerConnection.ExecuteNonQuery($regservergroup.ScriptMove($groupobject).GetScript()) + Get-DbaCmsRegServerGroup -SqlInstance $server -Group $newname + $parentserver.ServerConnection.Disconnect() + } catch { + Stop-Function -Message "Failed to move $($regserver.Name) to $NewGroup on $($regserver.SqlInstance)" -ErrorRecord $_ -Continue + } + } + } + } + end { + Test-DbaDeprecation -DeprecatedOn "1.0.0" -Alias Move-DbaRegisteredServerGroup + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function New-DbaAgentJob { + <# + .SYNOPSIS + New-DbaAgentJob creates a new job + + .DESCRIPTION + New-DbaAgentJob makes is possible to create a job in the SQL Server Agent. + It returns an array of the job(s) created + + .PARAMETER SqlInstance + The target SQL Server instance or instances. You must have sysadmin access and server version must be SQL Server version 2000 or greater. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Job + The name of the job. The name must be unique and cannot contain the percent (%) character. + + .PARAMETER Schedule + Schedule to attach to job. This can be more than one schedule. + + .PARAMETER ScheduleId + Schedule ID to attach to job. This can be more than one schedule ID. + + .PARAMETER Disabled + Sets the status of the job to disabled. By default a job is enabled. + + .PARAMETER Description + The description of the job. + + .PARAMETER StartStepId + The identification number of the first step to execute for the job. + + .PARAMETER Category + The category of the job. + + .PARAMETER OwnerLogin + The name of the login that owns the job. + + .PARAMETER EventLogLevel + Specifies when to place an entry in the Microsoft Windows application log for this job. + Allowed values 0, "Never", 1, "OnSuccess", 2, "OnFailure", 3, "Always" + The text value can either be lowercase, uppercase or something in between as long as the text is correct. + + .PARAMETER EmailLevel + Specifies when to send an e-mail upon the completion of this job. + Allowed values 0, "Never", 1, "OnSuccess", 2, "OnFailure", 3, "Always" + The text value can either be lowercase, uppercase or something in between as long as the text is correct. + + .PARAMETER NetsendLevel + Specifies when to send a network message upon the completion of this job. + Allowed values 0, "Never", 1, "OnSuccess", 2, "OnFailure", 3, "Always" + The text value can either be lowercase, uppercase or something in between as long as the text is correct. + + .PARAMETER PageLevel + Specifies when to send a page upon the completion of this job. + Allowed values 0, "Never", 1, "OnSuccess", 2, "OnFailure", 3, "Always" + The text value can either be lowercase, uppercase or something in between as long as the text is correct. + + .PARAMETER EmailOperator + The e-mail name of the operator to whom the e-mail is sent when EmailLevel is reached. + + .PARAMETER NetsendOperator + The name of the operator to whom the network message is sent. + + .PARAMETER PageOperator + The name of the operator to whom a page is sent. + + .PARAMETER DeleteLevel + Specifies when to delete the job. + Allowed values 0, "Never", 1, "OnSuccess", 2, "OnFailure", 3, "Always" + The text value can either be lowercase, uppercase or something in between as long as the text is correct. + + .PARAMETER Force + The force parameter will ignore some errors in the parameters and assume defaults. + + .PARAMETER WhatIf + Shows what would happen if the command were to run. No actions are actually performed. + + .PARAMETER Confirm + Prompts you for confirmation before executing any changing operations within the command. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Agent, Job, JobStep + Author: Sander Stad (@sqlstad), sqlstad.nl + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/New-DbaAgentJob + + .EXAMPLE + PS C:\> New-DbaAgentJob -SqlInstance sql1 -Job 'Job One' -Description 'Just another job' + + Creates a job with the name "Job1" and a small description + + .EXAMPLE + PS C:\> New-DbaAgentJob -SqlInstance sql1 -Job 'Job One' -Disabled + + Creates the job but sets it to disabled + + .EXAMPLE + PS C:\> New-DbaAgentJob -SqlInstance sql1 -Job 'Job One' -EventLogLevel OnSuccess + + Creates the job and sets the notification to write to the Windows Application event log on success + + .EXAMPLE + PS C:\> New-DbaAgentJob -SqlInstance SSTAD-PC -Job 'Job One' -EmailLevel OnFailure -EmailOperator dba + + Creates the job and sets the notification to send an e-mail to the e-mail operator + + .EXAMPLE + PS C:\> New-DbaAgentJob -SqlInstance sql1 -Job 'Job One' -Description 'Just another job' -Whatif + + Doesn't create the job but shows what would happen. + + .EXAMPLE + PS C:\> New-DbaAgentJob -SqlInstance sql1, sql2, sql3 -Job 'Job One' + + Creates a job with the name "Job One" on multiple servers + + .EXAMPLE + PS C:\> "sql1", "sql2", "sql3" | New-DbaAgentJob -Job 'Job One' + + Creates a job with the name "Job One" on multiple servers using the pipe line + + #> + + [CmdletBinding(SupportsShouldProcess, ConfirmImpact = "Low")] + param ( + [parameter(Mandatory, ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [Parameter(Mandatory)] + [ValidateNotNullOrEmpty()] + [string]$Job, + [object[]]$Schedule, + [int[]]$ScheduleId, + [switch]$Disabled, + [string]$Description, + [int]$StartStepId, + [string]$Category, + [string]$OwnerLogin, + [ValidateSet(0, "Never", 1, "OnSuccess", 2, "OnFailure", 3, "Always")] + [object]$EventLogLevel, + [ValidateSet(0, "Never", 1, "OnSuccess", 2, "OnFailure", 3, "Always")] + [object]$EmailLevel, + [ValidateSet(0, "Never", 1, "OnSuccess", 2, "OnFailure", 3, "Always")] + [Parameter()] + [ValidateSet(0, "Never", 1, "OnSuccess", 2, "OnFailure", 3, "Always")] + [object]$PageLevel, + [string]$EmailOperator, + [string]$NetsendOperator, + [string]$PageOperator, + [ValidateSet(0, "Never", 1, "OnSuccess", 2, "OnFailure", 3, "Always")] + [object]$DeleteLevel, + [switch]$Force, + [Alias('Silent')] + [switch]$EnableException + ) + + begin { + + # Check of the event log level is of type string and set the integer value + if ($EventLogLevel -notin 1, 2, 3) { + $EventLogLevel = switch ($EventLogLevel) { + "Never" { 0 } "OnSuccess" { 1 } "OnFailure" { 2 } "Always" { 3 } + default { 0 } + } + } + + # Check of the email level is of type string and set the integer value + if ($EmailLevel -notin 1, 2, 3) { + $EmailLevel = switch ($EmailLevel) { + "Never" { 0 } "OnSuccess" { 1 } "OnFailure" { 2 } "Always" { 3 } + default { 0 } + } + } + + # Check of the net send level is of type string and set the integer value + if ($NetsendLevel -notin 1, 2, 3) { + $NetsendLevel = switch ($NetsendLevel) { + "Never" { 0 } "OnSuccess" { 1 } "OnFailure" { 2 } "Always" { 3 } + default { 0 } + } + } + + # Check of the page level is of type string and set the integer value + if ($PageLevel -notin 1, 2, 3) { + $PageLevel = switch ($PageLevel) { + "Never" { 0 } "OnSuccess" { 1 } "OnFailure" { 2 } "Always" { 3 } + default { 0 } + } + } + + # Check of the delete level is of type string and set the integer value + if ($DeleteLevel -notin 1, 2, 3) { + $DeleteLevel = switch ($DeleteLevel) { + "Never" { 0 } "OnSuccess" { 1 } "OnFailure" { 2 } "Always" { 3 } + default { 0 } + } + } + + # Check the e-mail operator name + if (($EmailLevel -ge 1) -and (-not $EmailOperator)) { + Stop-Function -Message "Please set the e-mail operator when the e-mail level parameter is set." -Target $sqlinstance + return + } + + # Check the e-mail operator name + if (($NetsendLevel -ge 1) -and (-not $NetsendOperator)) { + Stop-Function -Message "Please set the netsend operator when the netsend level parameter is set." -Target $sqlinstance + return + } + + # Check the e-mail operator name + if (($PageLevel -ge 1) -and (-not $PageOperator)) { + Stop-Function -Message "Please set the page operator when the page level parameter is set." -Target $sqlinstance + return + } + } + + process { + + if (Test-FunctionInterrupt) { return } + + foreach ($instance in $sqlinstance) { + # Try connecting to the instance + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + # Check if the job already exists + if (-not $Force -and ($server.JobServer.Jobs.Name -contains $Job)) { + Stop-Function -Message "Job $Job already exists on $instance" -Target $instance -Continue + } elseif ($Force -and ($server.JobServer.Jobs.Name -contains $Job)) { + Write-Message -Message "Job $Job already exists on $instance. Removing.." -Level Verbose + + if ($PSCmdlet.ShouldProcess($instance, "Removing the job $Job on $instance")) { + try { + Remove-DbaAgentJob -SqlInstance $instance -Job $Job -EnableException + } catch { + Stop-Function -Message "Couldn't remove job $Job from $instance" -Target $instance -Continue -ErrorRecord $_ + } + } + + } + + if ($PSCmdlet.ShouldProcess($instance, "Creating the job on $instance")) { + # Create the job object + try { + $currentjob = New-Object Microsoft.SqlServer.Management.Smo.Agent.Job($server.JobServer, $Job) + } catch { + Stop-Function -Message "Something went wrong creating the job. `n" -Target $Job -Continue -ErrorRecord $_ + } + + #region job options + # Settings the options for the job + if ($Disabled) { + Write-Message -Message "Setting job to disabled" -Level Verbose + $currentjob.IsEnabled = $false + } else { + Write-Message -Message "Setting job to enabled" -Level Verbose + $currentjob.IsEnabled = $true + } + + if ($Description.Length -ge 1) { + Write-Message -Message "Setting job description" -Level Verbose + $currentjob.Description = $Description + } + + if ($StartStepId -ge 1) { + Write-Message -Message "Setting job start step id" -Level Verbose + $currentjob.StartStepID = $StartStepId + } + + if ($Category.Length -ge 1) { + # Check if the job category exists + if ($Category -notin $server.JobServer.JobCategories.Name) { + if ($Force) { + if ($PSCmdlet.ShouldProcess($instance, "Creating job category on $instance")) { + try { + # Create the category + New-DbaAgentJobCategory -SqlInstance $instance -Category $Category + } catch { + Stop-Function -Message "Couldn't create job category $Category from $instance" -Target $instance -Continue -ErrorRecord $_ + } + } + } else { + Stop-Function -Message "Job category $Category doesn't exist on $instance. Use -Force to create it." -Target $instance + return + } + } else { + Write-Message -Message "Setting job category" -Level Verbose + $currentjob.Category = $Category + } + } + + if ($OwnerLogin.Length -ge 1) { + # Check if the login name is present on the instance + if ($server.Logins.Name -contains $OwnerLogin) { + Write-Message -Message "Setting job owner login name to $OwnerLogin" -Level Verbose + $currentjob.OwnerLoginName = $OwnerLogin + } else { + Stop-Function -Message "The owner $OwnerLogin does not exist on instance $instance" -Target $Job -Continue + } + } + + if ($EventLogLevel -ge 0) { + Write-Message -Message "Setting job event log level" -Level Verbose + $currentjob.EventLogLevel = $EventLogLevel + } + + if ($EmailOperator) { + if ($EmailLevel -ge 1) { + # Check if the operator name is present + if ($server.JobServer.Operators.Name -contains $EmailOperator) { + Write-Message -Message "Setting job e-mail level" -Level Verbose + $currentjob.EmailLevel = $EmailLevel + + Write-Message -Message "Setting job e-mail operator" -Level Verbose + $currentjob.OperatorToEmail = $EmailOperator + } else { + Stop-Function -Message "The e-mail operator name $EmailOperator does not exist on instance $instance. Exiting.." -Target $Job -Continue + } + } else { + Stop-Function -Message "Invalid combination of e-mail operator name $EmailOperator and email level $EmailLevel. Not setting the notification." -Target $Job -Continue + } + } + + if ($NetsendOperator) { + if ($NetsendLevel -ge 1) { + # Check if the operator name is present + if ($server.JobServer.Operators.Name -contains $NetsendOperator) { + Write-Message -Message "Setting job netsend level" -Level Verbose + $currentjob.NetSendLevel = $NetsendLevel + + Write-Message -Message "Setting job netsend operator" -Level Verbose + $currentjob.OperatorToNetSend = $NetsendOperator + } else { + Stop-Function -Message "The netsend operator name $NetsendOperator does not exist on instance $instance. Exiting.." -Target $Job -Continue + } + } else { + Write-Message -Message "Invalid combination of netsend operator name $NetsendOperator and netsend level $NetsendLevel. Not setting the notification." + } + } + + if ($PageOperator) { + if ($PageLevel -ge 1) { + # Check if the operator name is present + if ($server.JobServer.Operators.Name -contains $PageOperator) { + Write-Message -Message "Setting job pager level" -Level Verbose + $currentjob.PageLevel = $PageLevel + + Write-Message -Message "Setting job pager operator" -Level Verbose + $currentjob.OperatorToPage = $PageOperator + } else { + Stop-Function -Message "The page operator name $PageOperator does not exist on instance $instance. Exiting.." -Target $Job -Continue + } + } else { + Write-Message -Message "Invalid combination of page operator name $PageOperator and page level $PageLevel. Not setting the notification." -Level Warning + } + } + + if ($DeleteLevel -ge 0) { + Write-Message -Message "Setting job delete level" -Level Verbose + $currentjob.DeleteLevel = $DeleteLevel + } + #endregion job options + + try { + Write-Message -Message "Creating the job" -Level Verbose + + # Create the job + $currentjob.Create() + + Write-Message -Message "Job created with UID $($currentjob.JobID)" -Level Verbose + + # Make sure the target is set for the job + Write-Message -Message "Applying the target (local) to job $Job" -Level Verbose + $currentjob.ApplyToTargetServer("(local)") + + # If a schedule needs to be attached + if ($Schedule) { + Set-DbaAgentJob -SqlInstance $instance -Job $currentjob -Schedule $Schedule -SqlCredential $SqlCredential + } + + if ($ScheduleId) { + Set-DbaAgentJob -SqlInstance $instance -Job $currentjob -ScheduleId $ScheduleId -SqlCredential $SqlCredential + } + } catch { + Stop-Function -Message "Something went wrong creating the job" -Target $currentjob -ErrorRecord $_ -Continue + } + } + + # Return the job + return $currentjob + } + } + + end { + if (Test-FunctionInterrupt) { return } + Write-Message -Message "Finished creating job(s)." -Level Verbose + } + +} +function New-DbaAgentJobCategory { + <# + .SYNOPSIS + New-DbaAgentJobCategory creates a new job category. + + .DESCRIPTION + New-DbaAgentJobCategory makes it possible to create a job category that can be used with jobs. + It returns an array of the job(s) created . + + .PARAMETER SqlInstance + The target SQL Server instance or instances. You must have sysadmin access and server version must be SQL Server version 2000 or greater. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Category + The name of the category + + .PARAMETER CategoryType + The type of category. This can be "LocalJob", "MultiServerJob" or "None". + The default is "LocalJob" and will automatically be set when no option is chosen. + + .PARAMETER Force + The force parameter will ignore some errors in the parameters and assume defaults. + + .PARAMETER WhatIf + Shows what would happen if the command were to run. No actions are actually performed. + + .PARAMETER Confirm + Prompts you for confirmation before executing any changing operations within the command. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Agent, Job, JobCategory + Author: Sander Stad (@sqlstad), sqlstad.nl + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/New-DbaAgentJobCategory + + .EXAMPLE + PS C:\> New-DbaAgentJobCategory -SqlInstance sql1 -Category 'Category 1' + + Creates a new job category with the name 'Category 1'. + + .EXAMPLE + PS C:\> New-DbaAgentJobCategory -SqlInstance sql1 -Category 'Category 2' -CategoryType MultiServerJob + + Creates a new job category with the name 'Category 2' and assign the category type for a multi server job. + + #> + + [CmdletBinding(SupportsShouldProcess, ConfirmImpact = "Low")] + param ( + [parameter(Mandatory, ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [Parameter(Mandatory)] + [ValidateNotNullOrEmpty()] + [string[]]$Category, + [ValidateSet("LocalJob", "MultiServerJob", "None")] + [string]$CategoryType, + [switch]$Force, + [Alias('Silent')] + [switch]$EnableException + ) + + begin { + # Check the category type + if (-not $CategoryType) { + # Setting category type to default + Write-Message -Message "Setting the category type to 'LocalJob'" -Level Verbose + $CategoryType = "LocalJob" + } + } + + process { + + foreach ($instance in $sqlinstance) { + # Try connecting to the instance + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + foreach ($cat in $Category) { + # Check if the category already exists + if ($cat -in $server.JobServer.JobCategories.Name) { + Stop-Function -Message "Job category $cat already exists on $instance" -Target $instance -Continue + } else { + if ($PSCmdlet.ShouldProcess($instance, "Adding the job category $cat")) { + try { + $jobcategory = New-Object Microsoft.SqlServer.Management.Smo.Agent.JobCategory($server.JobServer, $cat) + $jobcategory.CategoryType = $CategoryType + + $jobcategory.Create() + + $server.JobServer.Refresh() + } catch { + Stop-Function -Message "Something went wrong creating the job category $cat on $instance" -Target $cat -Continue -ErrorRecord $_ + } + + } # if should process + + } # end else category exists + + # Return the job category + Get-DbaAgentJobCategory -SqlInstance $server -Category $cat + + } # for each category + + } # for each instance + } + + end { + if (Test-FunctionInterrupt) { return } + Write-Message -Message "Finished creating job category." -Level Verbose + } + +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function New-DbaAgentJobStep { + <# + .SYNOPSIS + New-DbaAgentJobStep creates a new job step for a job + + .DESCRIPTION + New-DbaAgentJobStep creates a new job in the SQL Server Agent for a specific job + + .PARAMETER SqlInstance + The target SQL Server instance or instances. You must have sysadmin access and server version must be SQL Server version 2000 or greater. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Job + The name of the job to which to add the step. + + .PARAMETER StepId + The sequence identification number for the job step. Step identification numbers start at 1 and increment without gaps. + + .PARAMETER StepName + The name of the step. + + .PARAMETER SubSystem + The subsystem used by the SQL Server Agent service to execute command. + Allowed values 'ActiveScripting','AnalysisCommand','AnalysisQuery','CmdExec','Distribution','LogReader','Merge','PowerShell','QueueReader','Snapshot','Ssis','TransactSql' + The default is 'TransactSql' + + .PARAMETER SubSystemServer + The subsystems AnalysisScripting, AnalysisCommand, AnalysisQuery ned the server property to be able to apply + + .PARAMETER Command + The commands to be executed by SQLServerAgent service through subsystem. + + .PARAMETER CmdExecSuccessCode + The value returned by a CmdExec subsystem command to indicate that command executed successfully. + + .PARAMETER OnSuccessAction + The action to perform if the step succeeds. + Allowed values "QuitWithSuccess" (default), "QuitWithFailure", "GoToNextStep", "GoToStep". + The text value van either be lowercase, uppercase or something in between as long as the text is correct. + + .PARAMETER OnSuccessStepId + The ID of the step in this job to execute if the step succeeds and OnSuccessAction is "GoToStep". + + .PARAMETER OnFailAction + The action to perform if the step fails. + Allowed values "QuitWithSuccess" (default), "QuitWithFailure", "GoToNextStep", "GoToStep". + The text value van either be lowercase, uppercase or something in between as long as the text is correct. + + .PARAMETER OnFailStepId + The ID of the step in this job to execute if the step fails and OnFailAction is "GoToStep". + + .PARAMETER Database + The name of the database in which to execute a Transact-SQL step. The default is 'master'. + + .PARAMETER DatabaseUser + The name of the user account to use when executing a Transact-SQL step. + + .PARAMETER RetryAttempts + The number of retry attempts to use if this step fails. The default is 0. + + .PARAMETER RetryInterval + The amount of time in minutes between retry attempts. The default is 0. + + .PARAMETER OutputFileName + The name of the file in which the output of this step is saved. + + .PARAMETER Flag + Sets the flag(s) for the job step. + + Flag Description + ---------------------------------------------------------------------------- + AppendAllCmdExecOutputToJobHistory Job history, including command output, is appended to the job history file. + AppendToJobHistory Job history is appended to the job history file. + AppendToLogFile Job history is appended to the SQL Server log file. + AppendToTableLog Job history is appended to a log table. + LogToTableWithOverwrite Job history is written to a log table, overwriting previous contents. + None Job history is not appended to a file. + ProvideStopProcessEvent Job processing is stopped. + + .PARAMETER ProxyName + The name of the proxy that the job step runs as. + + .PARAMETER WhatIf + Shows what would happen if the command were to run. No actions are actually performed. + + .PARAMETER Confirm + Prompts you for confirmation before executing any changing operations within the command. + + .PARAMETER Force + The force parameter will ignore some errors in the parameters and assume defaults. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Agent, Job, JobStep + Author: Sander Stad (@sqlstad), sqlstad.nl + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/New-DbaAgentJobStep + + .EXAMPLE + PS C:\> New-DbaAgentJobStep -SqlInstance sql1 -Job Job1 -StepName Step1 + + Create a step in "Job1" with the name Step1 with the default subsystem TransactSql. + + .EXAMPLE + PS C:\> New-DbaAgentJobStep -SqlInstance sql1 -Job Job1 -StepName Step1 -Database msdb + + Create a step in "Job1" with the name Step1 where the database will the msdb + + .EXAMPLE + PS C:\> New-DbaAgentJobStep -SqlInstance sql1, sql2, sql3 -Job Job1 -StepName Step1 -Database msdb + + Create a step in "Job1" with the name Step1 where the database will the "msdb" for multiple servers + + .EXAMPLE + PS C:\> New-DbaAgentJobStep -SqlInstance sql1, sql2, sql3 -Job Job1, Job2, 'Job Three' -StepName Step1 -Database msdb + + Create a step in "Job1" with the name Step1 where the database will the "msdb" for multiple servers for multiple jobs + + .EXAMPLE + PS C:\> sql1, sql2, sql3 | New-DbaAgentJobStep -Job Job1 -StepName Step1 -Database msdb + + Create a step in "Job1" with the name Step1 where the database will the "msdb" for multiple servers using pipeline + + #> + + [CmdletBinding(SupportsShouldProcess, ConfirmImpact = "Low")] + param ( + [parameter(Mandatory, ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [Parameter(Mandatory)] + [ValidateNotNullOrEmpty()] + [object[]]$Job, + [int]$StepId, + [Parameter(Mandatory)] + [ValidateNotNullOrEmpty()] + [string]$StepName, + [ValidateSet('ActiveScripting', 'AnalysisCommand', 'AnalysisQuery', 'CmdExec', 'Distribution', 'LogReader', 'Merge', 'PowerShell', 'QueueReader', 'Snapshot', 'Ssis', 'TransactSql')] + [string]$Subsystem = 'TransactSql', + [string]$SubsystemServer, + [string]$Command, + [int]$CmdExecSuccessCode, + [ValidateSet('QuitWithSuccess', 'QuitWithFailure', 'GoToNextStep', 'GoToStep')] + [string]$OnSuccessAction = 'QuitWithSuccess', + [int]$OnSuccessStepId = 0, + [ValidateSet('QuitWithSuccess', 'QuitWithFailure', 'GoToNextStep', 'GoToStep')] + [string]$OnFailAction = 'QuitWithFailure', + [int]$OnFailStepId = 0, + [object]$Database, + [string]$DatabaseUser, + [int]$RetryAttempts, + [int]$RetryInterval, + [string]$OutputFileName, + [ValidateSet('AppendAllCmdExecOutputToJobHistory', 'AppendToJobHistory', 'AppendToLogFile', 'LogToTableWithOverwrite', 'None', 'ProvideStopProcessEvent')] + [string[]]$Flag, + [string]$ProxyName, + [switch]$Force, + [Alias('Silent')] + [switch]$EnableException + ) + + begin { + # Check the parameter on success step id + if (($OnSuccessAction -ne 'GoToStep') -and ($OnSuccessStepId -ge 1)) { + Stop-Function -Message "Parameter OnSuccessStepId can only be used with OnSuccessAction 'GoToStep'." -Target $SqlInstance + return + } + + # Check the parameter on fail step id + if (($OnFailAction -ne 'GoToStep') -and ($OnFailStepId -ge 1)) { + Stop-Function -Message "Parameter OnFailStepId can only be used with OnFailAction 'GoToStep'." -Target $SqlInstance + return + } + + if ($Subsystem -in 'AnalysisScripting', 'AnalysisCommand', 'AnalysisQuery') { + if (-not $SubsystemServer) { + Stop-Function -Message "Please enter the server value using -SubSystemServer for subsystem $Subsystem." -Target $Subsystem + return + } + } + } + + process { + + if (Test-FunctionInterrupt) { return } + + foreach ($instance in $sqlinstance) { + # Try connecting to the instance + try { + $Server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + foreach ($j in $Job) { + + # Check if the job exists + if ($Server.JobServer.Jobs.Name -notcontains $j) { + Write-Message -Message "Job $j doesn't exists on $instance" -Level Warning + } else { + # Create the job step object + try { + # Get the job + $currentjob = $Server.JobServer.Jobs[$j] + + # Create the job step + $JobStep = New-Object Microsoft.SqlServer.Management.Smo.Agent.JobStep + + # Set the job where the job steps belongs to + $JobStep.Parent = $currentjob + } catch { + Stop-Function -Message "Something went wrong creating the job step" -Target $instance -ErrorRecord $_ -Continue + } + + #region job step options + # Setting the options for the job step + if ($StepName) { + # Check if the step already exists + if ($Server.JobServer.Jobs[$j].JobSteps.Name -notcontains $StepName) { + $JobStep.Name = $StepName + } elseif (($Server.JobServer.Jobs[$j].JobSteps.Name -contains $StepName) -and $Force) { + Write-Message -Message "Step $StepName already exists for job. Force is used. Removing existing step" -Level Verbose + + # Remove the job step based on the name + Remove-DbaAgentJobStep -SqlInstance $instance -Job $currentjob -StepName $StepName -SqlCredential $SqlCredential + + # Set the name job step object + $JobStep.Name = $StepName + } else { + Stop-Function -Message "The step name $StepName already exists for job $j" -Target $instance -Continue + } + } + + # If the step id need to be set + if ($StepId) { + # Check if the used step id is already in place + if ($Job.JobSteps.ID -notcontains $StepId) { + Write-Message -Message "Setting job step step id to $StepId" -Level Verbose + $JobStep.ID = $StepId + } elseif (($Job.JobSteps.ID -contains $StepId) -and $Force) { + Write-Message -Message "Step ID $StepId already exists for job. Force is used. Removing existing step" -Level Verbose + + # Remove the existing job step + $StepName = ($Server.JobServer.Jobs[$j].JobSteps | Where-Object {$_.ID -eq 1}).Name + Remove-DbaAgentJobStep -SqlInstance $instance -Job $currentjob -StepName $StepName -SqlCredential $SqlCredential + + # Set the ID job step object + $JobStep.ID = $StepId + } else { + Stop-Function -Message "The step id $StepId already exists for job $j" -Target $instance -Continue + } + } else { + # Get the job step count + $JobStep.ID = $Job.JobSteps.Count + 1 + } + + if ($Subsystem) { + Write-Message -Message "Setting job step subsystem to $Subsystem" -Level Verbose + $JobStep.Subsystem = $Subsystem + } + + if ($SubsystemServer) { + Write-Message -Message "Setting job step subsystem server to $SubsystemServer" -Level Verbose + $JobStep.Server = $SubsystemServer + } + + if ($Command) { + Write-Message -Message "Setting job step command to $Command" -Level Verbose + $JobStep.Command = $Command + } + + if ($CmdExecSuccessCode) { + Write-Message -Message "Setting job step command exec success code to $CmdExecSuccessCode" -Level Verbose + $JobStep.CommandExecutionSuccessCode = $CmdExecSuccessCode + } + + if ($OnSuccessAction) { + Write-Message -Message "Setting job step success action to $OnSuccessAction" -Level Verbose + $JobStep.OnSuccessAction = $OnSuccessAction + } + + if ($OnSuccessStepId) { + Write-Message -Message "Setting job step success step id to $OnSuccessStepId" -Level Verbose + $JobStep.OnSuccessStep = $OnSuccessStepId + } + + if ($OnFailAction) { + Write-Message -Message "Setting job step fail action to $OnFailAction" -Level Verbose + $JobStep.OnFailAction = $OnFailAction + } + + if ($OnFailStepId) { + Write-Message -Message "Setting job step fail step id to $OnFailStepId" -Level Verbose + $JobStep.OnFailStep = $OnFailStepId + } + + if ($Database) { + # Check if the database is present on the server + if ($Server.Databases.Name -contains $Database) { + Write-Message -Message "Setting job step database name to $Database" -Level Verbose + $JobStep.DatabaseName = $Database + } else { + Stop-Function -Message "The database is not present on instance $instance." -Target $instance -Continue + } + } + + if ($DatabaseUser -and $DatabaseName) { + # Check if the username is present in the database + if ($Server.Databases[$DatabaseName].Users.Name -contains $DatabaseUser) { + + Write-Message -Message "Setting job step database username to $DatabaseUser" -Level Verbose + $JobStep.DatabaseUserName = $DatabaseUser + } else { + Stop-Function -Message "The database user is not present in the database $DatabaseName on instance $instance." -Target $instance -Continue + } + } + + if ($RetryAttempts) { + Write-Message -Message "Setting job step retry attempts to $RetryAttempts" -Level Verbose + $JobStep.RetryAttempts = $RetryAttempts + } + + if ($RetryInterval) { + Write-Message -Message "Setting job step retry interval to $RetryInterval" -Level Verbose + $JobStep.RetryInterval = $RetryInterval + } + + if ($OutputFileName) { + Write-Message -Message "Setting job step output file name to $OutputFileName" -Level Verbose + $JobStep.OutputFileName = $OutputFileName + } + + if ($ProxyName) { + # Check if the proxy exists + if ($Server.JobServer.ProxyAccounts.Name -contains $ProxyName) { + Write-Message -Message "Setting job step proxy name to $ProxyName" -Level Verbose + $JobStep.ProxyName = $ProxyName + } else { + Stop-Function -Message "The proxy name $ProxyName doesn't exist on instance $instance." -Target $instance -Continue + } + } + + if ($Flag.Count -ge 1) { + Write-Message -Message "Setting job step flag(s) to $($Flags -join ',')" -Level Verbose + $JobStep.JobStepFlags = $Flag + } + #endregion job step options + + # Execute + if ($PSCmdlet.ShouldProcess($instance, "Creating the job step $StepName")) { + try { + Write-Message -Message "Creating the job step" -Level Verbose + + # Create the job step + $JobStep.Create() + $currentjob.Alter() + } catch { + Stop-Function -Message "Something went wrong creating the job step" -Target $instance -ErrorRecord $_ -Continue + } + } + + # Return the job step + $JobStep + } + } # foreach object job + } # foreach object instance + } # process + + end { + if (Test-FunctionInterrupt) { return } + Write-Message -Message "Finished creating job step(s)" -Level Verbose + } +} +function New-DbaAgentProxy { + <# + .SYNOPSIS + Adds one or more proxies to SQL Server Agent + + .DESCRIPTION + Adds one or more proxies to SQL Server Agent + + .PARAMETER SqlInstance + The target SQL Server instance or instances.You must have sysadmin access and server version must be SQL Server version 2000 or higher. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Name + The name of the proxy or proxies you want to create + + .PARAMETER ProxyCredential + The associated SQL Server Credential. The credential must be created prior to creating the Proxy. + + .PARAMETER SubSystem + The associated subsystem or subsystems. Defaults to CmdExec. + + Valid options include: + ActiveScripting + AnalysisCommand + AnalysisQuery + CmdExec + Distribution + LogReader + Merge + PowerShell + QueueReader + Snapshot + Ssis + TransactSql + + .PARAMETER Description + A description of the proxy + + .PARAMETER Login + The SQL Server login or logins (known as proxy principals) to assign to the proxy + + .PARAMETER ServerRole + The SQL Server role or roles (known as proxy principals) to assign to the proxy + + .PARAMETER MsdbRole + The msdb role or roles (known as proxy principals) to assign to the proxy + + .PARAMETER Disabled + Create the proxy as disabled + + .PARAMETER Force + Drop and recreate the proxy if it already exists + + .PARAMETER WhatIf + If this switch is enabled, no actions are performed but informational messages will be displayed that explain what would happen if the command were to run. + + .PARAMETER Confirm + If this switch is enabled, you will be prompted for confirmation before executing any operations that change state. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Agent, Proxy + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/New-DbaAgentProxy + + .EXAMPLE + PS C:\> New-DbaAgentProxy -SqlInstance sql2016 -Name STIG -ProxyCredential 'PowerShell Proxy' + + Creates an Agent Proxy on sql2016 with the name STIG with the 'PowerShell Proxy' credential. + The proxy is automatically added to the CmdExec subsystem. + + .EXAMPLE + PS C:\> New-DbaAgentProxy -SqlInstance localhost\sql2016 -Name STIG -ProxyCredential 'PowerShell Proxy' -Description "Used for auditing purposes" -Login ad\sqlstig -SubSystem CmdExec, PowerShell -ServerRole securtyadmin -MsdbRole ServerGroupAdministratorRole + + Creates an Agent Proxy on sql2016 with the name STIG with the 'PowerShell Proxy' credential and the following principals: + + Login: ad\sqlstig + ServerRole: securtyadmin + MsdbRole: ServerGroupAdministratorRole + + By default, only sysadmins have access to create job steps with proxies. This will allow 3 additional principals access: + The proxy is then added to the CmdExec and PowerShell subsystems + + #> + [CmdletBinding(SupportsShouldProcess, ConfirmImpact = 'Low')] + [Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSAvoidUsingPlainTextForPassword", "", Justification = "For Parameter ProxyCredential")] + param ( + [parameter(Mandatory, ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [parameter(Mandatory)] + [string[]]$Name, + [parameter(Mandatory)] + [string[]]$ProxyCredential, + [ValidateSet("ActiveScripting", "AnalysisCommand", "AnalysisQuery", "CmdExec", "Distribution", "LogReader", "Merge", "PowerShell", "QueueReader", "Snapshot", "Ssis", "TransactSql")] + [string[]]$SubSystem = "CmdExec", + [string]$Description, + [string[]]$Login, + [string[]]$ServerRole, + [string[]]$MsdbRole, + [switch]$Disabled, + [switch]$Force, + [Alias('Silent')] + [switch]$EnableException + ) + + process { + foreach ($instance in $SqlInstance) { + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential -MinimumVersion 9 + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + try { + $jobServer = $server.JobServer + } catch { + Stop-Function -Message "Failure. Is SQL Agent started?" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + foreach ($proxyname in $name) { + + if ($jobServer.ProxyAccounts[$proxyName]) { + if ($force) { + if ($Pscmdlet.ShouldProcess($instance, "Dropping $proxyname")) { + $jobServer.ProxyAccounts[$proxyName].Drop() + $jobServer.ProxyAccounts.Refresh() + } + } else { + Write-Message -Level Warning -Message "Proxy account $proxy already exists on $instance. Use -Force to drop and recreate." + continue + } + } + + if (-not $server.Credentials[$ProxyCredential]) { + Write-Message -Level Warning -Message "Credential '$ProxyCredential' does not exist on $instance" + continue + } + + if ($Pscmdlet.ShouldProcess($instance, "Adding $proxyname with the $ProxyCredential credential")) { + # the new-object is stubborn and $true/$false has to be forced in + switch (Test-Bound -ParameterName Disabled) { + $false { + $proxy = New-Object Microsoft.SqlServer.Management.Smo.Agent.ProxyAccount -ArgumentList $jobServer, $ProxyName, $ProxyCredential, $true, $Description + } + $true { + $proxy = New-Object Microsoft.SqlServer.Management.Smo.Agent.ProxyAccount -ArgumentList $jobServer, $ProxyName, $ProxyCredential, $false, $Description + } + } + + try { + $proxy.Create() + } catch { + Stop-Function -Message "Could not create proxy account" -ErrorRecord $_ -Target $instance -Continue + } + } + + foreach ($loginname in $login) { + if ($server.Logins[$loginname]) { + if ($Pscmdlet.ShouldProcess($instance, "Adding login $loginname to proxy")) { + $proxy.AddLogin($loginname) + } + } else { + Write-Message -Level Warning -Message "Login '$loginname' does not exist on $instance" + } + } + + foreach ($role in $ServerRole) { + if ($server.Roles[$role]) { + if ($Pscmdlet.ShouldProcess($instance, "Adding server role $role to proxy")) { + $proxy.AddServerRole($role) + } + } else { + Write-Message -Level Warning -Message "Server Role '$role' does not exist on $instance" + } + } + + foreach ($role in $MsdbRole) { + if ($server.Databases['msdb'].Roles[$role]) { + if ($Pscmdlet.ShouldProcess($instance, "Adding msdb role $role to proxy")) { + $proxy.AddMsdbRole($role) + } + } else { + Write-Message -Level Warning -Message "msdb role '$role' does not exist on $instance" + } + } + + foreach ($system in $SubSystem) { + if ($Pscmdlet.ShouldProcess($instance, "Adding subsystem $system to proxy")) { + $proxy.AddSubSystem($system) + } + } + + if ($Pscmdlet.ShouldProcess("console", "Outputting Proxy object")) { + $proxy.Alter() + $proxy.Refresh() + Add-Member -Force -InputObject $proxy -MemberType NoteProperty -Name ComputerName -value $server.ComputerName + Add-Member -Force -InputObject $proxy -MemberType NoteProperty -Name InstanceName -value $server.ServiceName + Add-Member -Force -InputObject $proxy -MemberType NoteProperty -Name SqlInstance -value $server.DomainInstanceName + Add-Member -Force -InputObject $proxy -MemberType NoteProperty -Name Logins -value $proxy.EnumLogins() + Add-Member -Force -InputObject $proxy -MemberType NoteProperty -Name ServerRoles -value $proxy.EnumServerRoles() + Add-Member -Force -InputObject $proxy -MemberType NoteProperty -Name MsdbRoles -value $proxy.EnumMsdbRoles() + Add-Member -Force -InputObject $proxy -MemberType NoteProperty -Name Subsystems -value $proxy.EnumSubSystems() + + Select-DefaultView -InputObject $proxy -Property ComputerName, InstanceName, SqlInstance, ID, Name, CredentialName, CredentialIdentity, Description, Logins, ServerRoles, MsdbRoles, SubSystems, IsEnabled + } + } + } + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function New-DbaAgentSchedule { + <# + .SYNOPSIS + New-DbaAgentSchedule creates a new schedule in the msdb database. + + .DESCRIPTION + New-DbaAgentSchedule will help create a new schedule for a job. + If the job parameter is not supplied the schedule will not be attached to a job. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. You must have sysadmin access and server version must be SQL Server version 2000 or greater. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Job + The name of the job that has the schedule. + + .PARAMETER Schedule + The name of the schedule. + + .PARAMETER Disabled + Set the schedule to disabled. Default is enabled + + .PARAMETER FrequencyType + A value indicating when a job is to be executed. + + Allowed values: Once, Daily, Weekly, Monthly, MonthlyRelative, AgentStart or IdleComputer + + If force is used the default will be "Once". + + .PARAMETER FrequencyInterval + The days that a job is executed + + Allowed values: Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Weekdays, Weekend or EveryDay. + The other allowed values are the numbers 1 to 31 for each day of the month. + + If "Weekdays", "Weekend" or "EveryDay" is used it over writes any other value that has been passed before. + + If force is used the default will be 1. + + .PARAMETER FrequencySubdayType + Specifies the units for the subday FrequencyInterval. + + Allowed values: Time, Seconds, Minutes, or Hours + + .PARAMETER FrequencySubdayInterval + The number of subday type periods to occur between each execution of a job. + + .PARAMETER FrequencyRelativeInterval + A job's occurrence of FrequencyInterval in each month, if FrequencyInterval is 32 (monthlyrelative). + + Allowed values: First, Second, Third, Fourth or Last + + .PARAMETER FrequencyRecurrenceFactor + The number of weeks or months between the scheduled execution of a job. + + FrequencyRecurrenceFactor is used only if FrequencyType is "Weekly", "Monthly" or "MonthlyRelative". + + .PARAMETER StartDate + The date on which execution of a job can begin. + + If force is used the start date will be the current day + + .PARAMETER EndDate + The date on which execution of a job can stop. + + If force is used the end date will be '9999-12-31' + + .PARAMETER StartTime + The time on any day to begin execution of a job. Format HHMMSS / 24 hour clock. + Example: '010000' for 01:00:00 AM. + Example: '140000' for 02:00:00 PM. + + If force is used the start time will be '00:00:00' + + .PARAMETER EndTime + The time on any day to end execution of a job. Format HHMMSS / 24 hour clock. + Example: '010000' for 01:00:00 AM. + Example: '140000' for 02:00:00 PM. + + If force is used the start time will be '23:59:59' + + .PARAMETER Owner + The name of the server principal that owns the schedule. If no value is given the schedule is owned by the creator. + + .PARAMETER WhatIf + Shows what would happen if the command were to run. No actions are actually performed. + + .PARAMETER Confirm + Prompts you for confirmation before executing any changing operations within the command. + + .PARAMETER Force + The force parameter will ignore some errors in the parameters and assume defaults. + It will also remove the any present schedules with the same name for the specific job. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Agent, Job, JobStep + Author: Sander Stad (@sqlstad), sqlstad.nl + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/New-DbaAgentSchedule + + .EXAMPLE + PS C:\> New-DbaAgentSchedule -SqlInstance localhost\SQL2016 -Schedule daily -FrequencyType Daily -FrequencyInterval Everyday -Force + + Creates a schedule with a daily frequency every day. It assumes default values for the start date, start time, end date and end time due to -Force. + + .EXAMPLE + PS C:\> New-DbaAgentSchedule -SqlInstance sstad-pc -Schedule MonthlyTest -FrequencyType Monthly -FrequencyInterval 10 -FrequencyRecurrenceFactor 1 -Force + + Create a schedule with a monhtly frequency occuring every 10th of the month. It assumes default values for the start date, start time, end date and end time due to -Force. + + #> + [CmdletBinding(SupportsShouldProcess, ConfirmImpact = "Low")] + [Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSUseOutputTypeCorrectly", "", Justification = "PSSA Rule Ignored by BOH")] + param ( + [parameter(Mandatory, ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [System.Management.Automation.PSCredential] + $SqlCredential, + [object[]]$Job, + [object]$Schedule, + [switch]$Disabled, + [ValidateSet('Once', 'Daily', 'Weekly', 'Monthly', 'MonthlyRelative', 'AgentStart', 'IdleComputer')] + [object]$FrequencyType, + [ValidateSet('EveryDay', 'Weekdays', 'Weekend', 'Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 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)] + [object[]]$FrequencyInterval, + [ValidateSet('Time', 'Seconds', 'Minutes', 'Hours')] + [object]$FrequencySubdayType, + [int]$FrequencySubdayInterval, + [ValidateSet('Unused', 'First', 'Second', 'Third', 'Fourth', 'Last')] + [object]$FrequencyRelativeInterval, + [int]$FrequencyRecurrenceFactor, + [string]$StartDate, + [string]$EndDate, + [string]$StartTime, + [string]$EndTime, + [switch]$Force, + [Alias('Silent')] + [switch]$EnableException + ) + + begin { + # if a Schedule is not provided there is no much point + if (!$Schedule) { + Stop-Function -Message "A schedule was not provided! Please provide a schedule name." + return + } + + [int]$Interval = 0 + + # Translate FrequencyType value from string to the integer value + if (!$FrequencyType -or $FrequencyType) { + [int]$FrequencyType = + switch ($FrequencyType) { + "Once" { 1 } + "Daily" { 4 } + "Weekly" { 8 } + "Monthly" { 16 } + "MonthlyRelative" { 32 } + "AgentStart" { 64 } + "IdleComputer" { 128 } + default { 1 } + } + } + + # Translate FrequencySubdayType value from string to the integer value + if (!$FrequencySubdayType -or $FrequencySubdayType) { + [int]$FrequencySubdayType = + switch ($FrequencySubdayType) { + "Time" { 1 } + "Seconds" { 2 } + "Minutes" { 4 } + "Hours" { 8 } + default { 1 } + } + } + + # Check of the relative FrequencyInterval value is of type string and set the integer value + [int]$FrequencyRelativeInterval = + switch ($FrequencyRelativeInterval) { + "First" { 1 } + "Second" { 2 } + "Third" { 4 } + "Fourth" { 8 } + "Last" { 16 } + "Unused" { 0 } + default {0} + } + + # Check if the interval is valid + if (($FrequencyType -in 4, "Daily") -and (($FrequencyInterval -lt 1 -or $FrequencyInterval -ge 365) -and -not $FrequencyInterval -eq "EveryDay")) { + Stop-Function -Message "The frequency interval $FrequencyInterval requires a frequency interval to be between 1 and 365." -Target $SqlInstance + return + } + + # Check if the recurrence factor is set for weekly or monthly interval + if (($FrequencyType -in (16, 8)) -and $FrequencyRecurrenceFactor -lt 1) { + if ($Force) { + $FrequencyRecurrenceFactor = 1 + Write-Message -Message "Recurrence factor not set for weekly or monthly interval. Setting it to $FrequencyRecurrenceFactor." -Level Verbose + } else { + Stop-Function -Message "The recurrence factor $FrequencyRecurrenceFactor (parameter FrequencyRecurrenceFactor) needs to be at least one when using a weekly or monthly interval." -Target $SqlInstance + return + } + } + + # Check the subday interval + if (($FrequencySubdayType -in 2, "Seconds", 4, "Minutes") -and (-not ($FrequencySubdayInterval -ge 1 -or $FrequencySubdayInterval -le 59))) { + Stop-Function -Message "Subday interval $FrequencySubdayInterval must be between 1 and 59 when subday type is 'Seconds' or 'Minutes'" -Target $SqlInstance + return + } elseif (($FrequencySubdayType -eq 8, "Hours") -and (-not ($FrequencySubdayInterval -ge 1 -and $FrequencySubdayInterval -le 23))) { + Stop-Function -Message "Subday interval $FrequencySubdayInterval must be between 1 and 23 when subday type is 'Hours'" -Target $SqlInstance + return + } + + # If the FrequencyInterval is set for the daily FrequencyType + if ($FrequencyType -in 4, 'Daily') { + # Create the interval to hold the value(s) + [int]$Interval = 0 + + # Create the interval to hold the value(s) + switch ($FrequencyInterval) { + "EveryDay" { $Interval = 1} + default {$Interval = 1 } + } + + } + + # If the FrequencyInterval is set for the weekly FrequencyType + if ($FrequencyType -in 8, 'Weekly') { + # Create the interval to hold the value(s) + [int]$Interval = 0 + + # Loop through the array + foreach ($Item in $FrequencyInterval) { + + switch ($Item) { + "Sunday" { $Interval += 1 } + "Monday" { $Interval += 2 } + "Tuesday" { $Interval += 4 } + "Wednesday" { $Interval += 8 } + "Thursday" { $Interval += 16 } + "Friday" { $Interval += 32 } + "Saturday" { $Interval += 64 } + "Weekdays" { $Interval = 62 } + "Weekend" { $Interval = 65 } + "EveryDay" {$Interval = 127 } + 1 { $Interval += 1 } + 2 { $Interval += 2 } + 4 { $Interval += 4 } + 8 { $Interval += 8 } + 16 { $Interval += 16 } + 32 { $Interval += 32 } + 64 { $Interval += 64 } + 62 { $Interval = 62 } + 65 { $Interval = 65 } + 127 {$Interval = 127 } + default { $Interval = 0 } + } + } + } + + # If the FrequencyInterval is set for the monthly FrequencyInterval + if ($FrequencyType -in 16, 'Monthly') { + # Create the interval to hold the value(s) + [int]$Interval = 0 + + # Loop through the array + foreach ($Item in $FrequencyInterval) { + $FrequencyInterval + switch ($Item) { + {[int]$_ -ge 1 -and [int]$_ -le 31} { $Interval = [int]$Item } + } + } + + + } + + # If the FrequencyInterval is set for the relative monthly FrequencyInterval + if ($FrequencyType -eq 32) { + # Create the interval to hold the value(s) + [int]$Interval = 0 + + # Loop through the array + foreach ($Item in $FrequencyInterval) { + switch ($Item) { + "Sunday" { $Interval += 1 } + "Monday" { $Interval += 2 } + "Tuesday" { $Interval += 3 } + "Wednesday" { $Interval += 4 } + "Thursday" { $Interval += 5 } + "Friday" { $Interval += 6 } + "Saturday" { $Interval += 7 } + "Day" { $Interval += 8 } + "Weekday" { $Interval += 9 } + "WeekendDay" { $Interval += 10 } + 1 { $Interval += 1 } + 2 { $Interval += 2 } + 3 { $Interval += 3 } + 4 { $Interval += 4 } + 5 { $Interval += 5 } + 6 { $Interval += 6 } + 7 { $Interval += 7 } + 8 { $Interval += 8 } + 9 { $Interval += 9 } + 10 { $Interval += 10 } + } + } + } + + # Check if the interval is valid for the frequency + if ($FrequencyType -eq 0) { + if ($Force) { + Write-Message -Message "Parameter FrequencyType must be set to at least [Once]. Setting it to 'Once'." -Level Warning + $FrequencyType = 1 + } else { + Stop-Function -Message "Parameter FrequencyType must be set to at least [Once]" -Target $SqlInstance + return + } + } + + # Check if the interval is valid for the frequency + if (($FrequencyType -in 4, 8, 32) -and ($Interval -lt 1)) { + if ($Force) { + Write-Message -Message "Parameter FrequencyInterval must be provided for a recurring schedule. Setting it to first day of the week." -Level Warning + $Interval = 1 + } else { + Stop-Function -Message "Parameter FrequencyInterval must be provided for a recurring schedule." -Target $SqlInstance + return + } + } + + # Setup the regex + $RegexDate = '(? New-DbaAvailabilityGroup -Primary sql2016a -Name SharePoint + + Creates a new availability group on sql2016a named SharePoint + + .EXAMPLE + PS C:\> New-DbaAvailabilityGroup -Primary sql2016a -Name SharePoint -Secondary sql2016b + + Creates a new availability group on sql2016a named SharePoint with a secondary replica, sql2016b + + .EXAMPLE + PS C:\> New-DbaAvailabilityGroup -Primary sql2016std -Name BAG1 -Basic -Confirm:$false + + Creates a basic availability group named BAG1 on sql2016std and does not confirm when setting up + + .EXAMPLE + PS C:\> New-DbaAvailabilityGroup -Primary sql2016b -Name AG1 -ClusterType Wsfc -Dhcp -Database db1 -UseLastBackup + + Creates an availability group on sql2016b with the name ag1. Uses the last backups available to add the database db1 to the AG. + + .EXAMPLE + PS C:\> New-DbaAvailabilityGroup -Primary sql2017 -Name SharePoint -ClusterType None -FailoverMode Manual + + Creates a new availability group on sql2017 named SharePoint with a cluster type of none and a failover mode of manual + + .EXAMPLE + PS C:\> New-DbaAvailabilityGroup -Primary sql1 -Secondary sql2 -Name ag1 -Database pubs -ClusterType None -SeedingMode Automatic -FailoverMode Manual + + Creates a new availability group with a primary replica on sql1 and a secondary on sql2. Automatically adds the database pubs. + + .EXAMPLE + PS C:\> $cred = Get-Credential sqladmin + PS C:\> $params = @{ + >> Primary = "sql1" + >> PrimarySqlCredential = $cred + >> Secondary = "sql2" + >> SecondarySqlCredential = $cred + >> Name = "test-ag" + >> Database = "pubs" + >> ClusterType = "None" + >> SeedingMode = "Automatic" + >> FailoverMode = "Manual" + >> Confirm = $false + >> } + PS C:\> New-DbaAvailabilityGroup @params + + This exact command was used to create an availability group on docker! + #> + [CmdletBinding(SupportsShouldProcess, ConfirmImpact = 'High')] + param ( + [parameter(ValueFromPipeline)] + [DbaInstanceParameter]$Primary, + [PSCredential]$PrimarySqlCredential, + [DbaInstanceParameter[]]$Secondary, + [PSCredential]$SecondarySqlCredential, + # AG + + [parameter(Mandatory)] + [string]$Name, + [switch]$DtcSupport, + [ValidateSet('External', 'Wsfc', 'None')] + [string]$ClusterType = 'External', + [ValidateSet('None', 'Primary', 'Secondary', 'SecondaryOnly')] + [string]$AutomatedBackupPreference = 'Secondary', + [ValidateSet('OnAnyQualifiedFailureCondition', 'OnCriticalServerErrors', 'OnModerateServerErrors', 'OnServerDown', 'OnServerUnresponsive')] + [string]$FailureConditionLevel = "OnServerDown", + [int]$HealthCheckTimeout = 30000, + [switch]$Basic, + [switch]$DatabaseHealthTrigger, + [switch]$Passthru, + # database + + [string[]]$Database, + [Alias("NetworkShare")] + [string]$SharedPath, + [switch]$UseLastBackup, + [switch]$Force, + # replica + + [ValidateSet('AsynchronousCommit', 'SynchronousCommit')] + [string]$AvailabilityMode = "SynchronousCommit", + [ValidateSet('Automatic', 'Manual', 'External')] + [string]$FailoverMode = "Automatic", + [int]$BackupPriority = 50, + [ValidateSet('AllowAllConnections', 'AllowReadWriteConnections')] + [string]$ConnectionModeInPrimaryRole = 'AllowAllConnections', + [ValidateSet('AllowAllConnections', 'AllowNoConnections', 'AllowReadIntentConnectionsOnly')] + [string]$ConnectionModeInSecondaryRole = 'AllowAllConnections', + [ValidateSet('Automatic', 'Manual')] + [string]$SeedingMode = 'Manual', + [string]$Endpoint, + [string]$ReadonlyRoutingConnectionUrl, + [string]$Certificate, + # network + + [ipaddress[]]$IPAddress, + [ipaddress]$SubnetMask = "255.255.255.0", + [int]$Port = 1433, + [switch]$Dhcp, + [switch]$EnableException + ) + begin { + Test-DbaDeprecation -DeprecatedOn 1.0.0 -Parameter NetworkShare -CustomMessage "Using the parameter NetworkShare is deprecated. This parameter will be removed in version 1.0.0 or before. Use SharedPath instead." + } + process { + $stepCounter = $wait = 0 + + if ($Force -and $Secondary -and (-not $SharedPath -and -not $UseLastBackup) -and ($SeedingMode -ne 'Automatic')) { + Stop-Function -Message "SharedPath or UseLastBackup is required when Force is used" + return + } + + try { + $server = Connect-SqlInstance -SqlInstance $Primary -SqlCredential $PrimarySqlCredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $Primary + return + } + + if ($SeedingMode -eq 'Automatic' -and $server.VersionMajor -lt 13) { + Stop-Function -Message "Automatic seeding mode only supported in SQL Server 2016 and above" -Target $Primary + return + } + + if ($Basic -and $server.VersionMajor -lt 13) { + Stop-Function -Message "Basic availability groups are only supported in SQL Server 2016 and above" -Target $Primary + return + } + + Write-ProgressHelper -StepNumber ($stepCounter++) -Message "Checking perquisites" + + # Don't reuse $server here, it fails + if (Get-DbaAvailabilityGroup -SqlInstance $Primary -SqlCredential $PrimarySqlCredential -AvailabilityGroup $Name) { + Stop-Function -Message "Availability group named $Name already exists on $Primary" + return + } + + if ($Certificate) { + $cert = Get-DbaDbCertificate -SqlInstance $Primary -SqlCredential $PrimarySqlCredential -Certificate $Certificate + if (-not $cert) { + Stop-Function -Message "Certificate $Certificate does not exist on $Primary" -ErrorRecord $_ -Target $Primary + return + } + } + + if (($SharedPath)) { + if (-not (Test-DbaPath -SqlInstance $Primary -SqlCredential $PrimarySqlCredential -Path $SharedPath)) { + Stop-Function -Continue -Message "Cannot access $SharedPath from $Primary" + return + } + } + + if ($Database -and -not $UseLastBackup -and -not $SharedPath -and $Secondary -and $SeedingMode -ne 'Automatic') { + Stop-Function -Continue -Message "You must specify a SharedPath when adding databases to a manually seeded availability group" + return + } + + if ($server.HostPlatform -eq "Linux") { + # New to SQL Server 2017 (14.x) is the introduction of a cluster type for AGs. For Linux, there are two valid values: External and None. + if ($ClusterType -notin "External", "None") { + Stop-Function -Continue -Message "Linux only supports ClusterType of External or None" + return + } + # Microsoft Distributed Transaction Coordinator (DTC) is not supported under Linux in SQL Server 2017 + if ($DtcSupport) { + Stop-Function -Continue -Message "Microsoft Distributed Transaction Coordinator (DTC) is not supported under Linux" + return + } + } + + if ($ClusterType -eq "None" -and $server.VersionMajor -lt 14) { + Stop-Function -Message "ClusterType of None only supported in SQL Server 2017 and above" + return + } + + if ($Secondary) { + $secondaries = @() + foreach ($computer in $Secondary) { + try { + $secondaries += Connect-SqlInstance -SqlInstance $computer -SqlCredential $SecondarySqlCredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $Primary + return + } + } + + if ($SeedingMode -eq "Automatic") { + $primarypath = Get-DbaDefaultPath -SqlInstance $server + foreach ($second in $secondaries) { + $secondarypath = Get-DbaDefaultPath -SqlInstance $second + if ($primarypath.Data -ne $secondarypath.Data) { + Write-Message -Level Warning -Message "Primary and secondary ($second) default data paths do not match. Trying anyway." + } + if ($primarypath.Log -ne $secondarypath.Log) { + Write-Message -Level Warning -Message "Primary and secondary ($second) default log paths do not match. Trying anyway." + } + } + } + } + + # database checks + if ($Database) { + $dbs += Get-DbaDatabase -SqlInstance $Primary -SqlCredential $PrimarySqlCredential -Database $Database + } + + foreach ($primarydb in $dbs) { + if ($primarydb.MirroringStatus -ne "None") { + Stop-Function -Message "Cannot setup mirroring on database ($dbname) due to its current mirroring state: $($primarydb.MirroringStatus)" + return + } + + if ($primarydb.Status -ne "Normal") { + Stop-Function -Message "Cannot setup mirroring on database ($dbname) due to its current state: $($primarydb.Status)" + return + } + + if ($primarydb.RecoveryModel -ne "Full") { + if ((Test-Bound -ParameterName UseLastBackup)) { + Stop-Function -Message "$dbName not set to full recovery. UseLastBackup cannot be used." + return + } else { + Set-DbaDbRecoveryModel -SqlInstance $Primary -SqlCredential $PrimarySqlCredential -Database $primarydb.Name -RecoveryModel Full + } + } + } + + Write-ProgressHelper -StepNumber ($stepCounter++) -Message "Creating availability group named $Name on $Primary" + + # Start work + if ($Pscmdlet.ShouldProcess($Primary, "Setting up availability group named $Name and adding primary replica")) { + try { + $ag = New-Object Microsoft.SqlServer.Management.Smo.AvailabilityGroup -ArgumentList $server, $Name + $ag.AutomatedBackupPreference = [Microsoft.SqlServer.Management.Smo.AvailabilityGroupAutomatedBackupPreference]::$AutomatedBackupPreference + $ag.FailureConditionLevel = [Microsoft.SqlServer.Management.Smo.AvailabilityGroupFailureConditionLevel]::$FailureConditionLevel + $ag.HealthCheckTimeout = $HealthCheckTimeout + + if ($server.VersionMajor -ge 13) { + $ag.BasicAvailabilityGroup = $Basic + $ag.DatabaseHealthTrigger = $DatabaseHealthTrigger + } + + if ($server.VersionMajor -ge 14) { + $ag.ClusterType = $ClusterType + } + + if ($PassThru) { + $defaults = 'LocalReplicaRole', 'Name as AvailabilityGroup', 'PrimaryReplicaServerName as PrimaryReplica', 'AutomatedBackupPreference', 'AvailabilityReplicas', 'AvailabilityDatabases', 'AvailabilityGroupListeners' + return (Select-DefaultView -InputObject $ag -Property $defaults) + } + + $replicaparams = @{ + InputObject = $ag + AvailabilityMode = $AvailabilityMode + FailoverMode = $FailoverMode + BackupPriority = $BackupPriority + ConnectionModeInPrimaryRole = $ConnectionModeInPrimaryRole + ConnectionModeInSecondaryRole = $ConnectionModeInSecondaryRole + Endpoint = $Endpoint + ReadonlyRoutingConnectionUrl = $ReadonlyRoutingConnectionUrl + Certificate = $Certificate + } + + if ($server.VersionMajor -ge 13) { + $replicaparams += @{SeedingMode = $SeedingMode} + } + + $null = Add-DbaAgReplica @replicaparams -EnableException -SqlInstance $server + } catch { + $msg = $_.Exception.InnerException.InnerException.Message + if (-not $msg) { + $msg = $_ + } + Stop-Function -Message $msg -ErrorRecord $_ -Target $Primary + return + } + } + + # Add cluster permissions + if ($ClusterType -eq 'Wsfc') { + Write-ProgressHelper -StepNumber ($stepCounter++) -Message "Adding endpoint connect permissions" + + foreach ($second in $secondaries) { + if ($Pscmdlet.ShouldProcess($Primary, "Adding cluster permissions for availability group named $Name")) { + Write-Message -Level Verbose -Message "WSFC Cluster requires granting [NT AUTHORITY\SYSTEM] a few things. Setting now." + $sql = "GRANT ALTER ANY AVAILABILITY GROUP TO [NT AUTHORITY\SYSTEM] + GRANT CONNECT SQL TO [NT AUTHORITY\SYSTEM] + GRANT VIEW SERVER STATE TO [NT AUTHORITY\SYSTEM]" + try { + $null = $server.Query($sql) + foreach ($second in $secondaries) { + $null = $second.Query($sql) + } + } catch { + Stop-Function -Message "Failure adding cluster service account permissions" -ErrorRecord $_ + } + } + } + } + + # Add replicas + Write-ProgressHelper -StepNumber ($stepCounter++) -Message "Adding secondary replicas" + + foreach ($second in $secondaries) { + if ($Pscmdlet.ShouldProcess($second.Name, "Adding replica to availability group named $Name")) { + try { + # Add replicas + $null = Add-DbaAgReplica @replicaparams -EnableException -SqlInstance $second + } catch { + Stop-Function -Message "Failure" -ErrorRecord $_ -Target $second -Continue + } + } + } + + try { + # something is up with .net create(), force a stop + Invoke-Create -Object $ag + } catch { + $msg = $_.Exception.InnerException.InnerException.Message + if (-not $msg) { + $msg = $_ + } + Stop-Function -Message $msg -ErrorRecord $_ -Target $Primary + return + } + + # Add listener + if ($IPAddress -or $Dhcp) { + $progressmsg = "Adding listener" + } else { + $progressmsg = "Joining availability group" + } + Write-ProgressHelper -StepNumber ($stepCounter++) -Message $progressmsg + + if ($IPAddress) { + if ($Pscmdlet.ShouldProcess($Primary, "Adding static IP listener for $Name to the Primary replica")) { + $null = Add-DbaAgListener -InputObject $ag -IPAddress $IPAddress[0] -SubnetMask $SubnetMask -Port $Port -Dhcp:$Dhcp + } + } elseif ($Dhcp) { + if ($Pscmdlet.ShouldProcess($Primary, "Adding DHCP listener for $Name to all replicas")) { + $null = Add-DbaAgListener -InputObject $ag -Port $Port -Dhcp:$Dhcp + foreach ($second in $secondaries) { + $secag = Get-DbaAvailabilityGroup -SqlInstance $second -AvailabilityGroup $Name + $null = Add-DbaAgListener -InputObject $secag -Port $Port -Dhcp:$Dhcp + } + } + } + + Write-ProgressHelper -StepNumber ($stepCounter++) -Message "Joining availability group" + + foreach ($second in $secondaries) { + if ($Pscmdlet.ShouldProcess("Joining $($second.Name) to $Name")) { + try { + # join replicas to ag + Join-DbaAvailabilityGroup -SqlInstance $second -InputObject $ag -EnableException + } catch { + Stop-Function -Message "Failure" -ErrorRecord $_ -Target $second -Continue + } + } + } + + Write-ProgressHelper -StepNumber ($stepCounter++) -Message "Granting permissions on availability group, this may take a moment" + + # Grant permissions, but first, get all necessary service accounts + $primaryserviceaccount = $server.ServiceAccount.Trim() + $saname = ([DbaInstanceParameter]($server.DomainInstanceName)).ComputerName + + if ($primaryserviceaccount) { + if ($primaryserviceaccount.StartsWith("NT ")) { + $primaryserviceaccount = "$saname`$" + } + if ($primaryserviceaccount.StartsWith("$saname")) { + $primaryserviceaccount = "$saname`$" + } + if ($primaryserviceaccount.StartsWith(".")) { + $primaryserviceaccount = "$saname`$" + } + } + + if (-not $primaryserviceaccount) { + $primaryserviceaccount = "$saname`$" + } + + $serviceaccounts = @($primaryserviceaccount) + + foreach ($second in $secondaries) { + # If service account is empty, add the computer account instead + $secondaryserviceaccount = $second.ServiceAccount.Trim() + $saname = ([DbaInstanceParameter]($second.DomainInstanceName)).ComputerName + + if ($secondaryserviceaccount) { + if ($secondaryserviceaccount.StartsWith("NT ")) { + $secondaryserviceaccount = "$saname`$" + } + if ($secondaryserviceaccount.StartsWith("$saname")) { + $secondaryserviceaccount = "$saname`$" + } + if ($secondaryserviceaccount.StartsWith(".")) { + $secondaryserviceaccount = "$saname`$" + } + } + + if (-not $secondaryserviceaccount) { + $secondaryserviceaccount = "$saname`$" + } + + $serviceaccounts += $secondaryserviceaccount + } + + $serviceaccounts = $serviceaccounts | Select-Object -Unique + + if ($SeedingMode -eq 'Automatic') { + try { + if ($Pscmdlet.ShouldProcess($server.Name, "Seeding mode is automatic. Adding CreateAnyDatabase permissions to availability group.")) { + $null = $server.Query("ALTER AVAILABILITY GROUP [$Name] GRANT CREATE ANY DATABASE") + } + } catch { + # Log the exception but keep going + Stop-Function -Message "Failure" -ErrorRecord $_ + } + } + + # Add databases + Write-ProgressHelper -StepNumber ($stepCounter++) -Message "Adding databases" + + $null = Add-DbaAgDatabase -SqlInstance $Primary -SqlCredential $PrimarySqlCredential -AvailabilityGroup $Name -Database $Database -SeedingMode $SeedingMode -SharedPath $SharedPath -Secondary $Secondary -SecondarySqlCredential $SecondarySqlCredential + + foreach ($second in $secondaries) { + if ($server.HostPlatform -ne "Linux" -and $second.HostPlatform -ne "Linux") { + if ($Pscmdlet.ShouldProcess($second.Name, "Granting Connect permissions to service accounts: $serviceaccounts")) { + $null = Grant-DbaAgPermission -SqlInstance $server, $second -Login $serviceaccounts -Type Endpoint -Permission Connect + } + } + if ($SeedingMode -eq 'Automatic') { + $done = $false + try { + if ($Pscmdlet.ShouldProcess($second.Name, "Seeding mode is automatic. Adding CreateAnyDatabase permissions to availability group.")) { + do { + $second.Refresh() + $second.AvailabilityGroups.Refresh() + if (Get-DbaAvailabilityGroup -SqlInstance $second -AvailabilityGroup $Name) { + $null = $second.Query("ALTER AVAILABILITY GROUP [$Name] GRANT CREATE ANY DATABASE") + $done = $true + } else { + $wait++ + Start-Sleep -Seconds 1 + } + } while ($wait -lt 20 -and $done -eq $false) + } + } catch { + # Log the exception but keep going + Stop-Function -Message "Failure" -ErrorRecord $_ + } + } + } + + # Get results + Get-DbaAvailabilityGroup -SqlInstance $Primary -SqlCredential $PrimarySqlCredential -AvailabilityGroup $Name + } +} +function New-DbaClientAlias { + <# + .SYNOPSIS + Creates/updates a sql alias for the specified server - mimics cliconfg.exe + + .DESCRIPTION + Creates/updates a SQL Server alias by altering HKLM:\SOFTWARE\Microsoft\MSSQLServer\Client + + .PARAMETER ComputerName + The target computer where the alias will be created + + .PARAMETER Credential + Allows you to login to remote computers using alternative credentials + + .PARAMETER ServerName + The target SQL Server + + .PARAMETER Alias + The alias to be created + + .PARAMETER Protocol + The protocol for the connection, either TCPIP or NetBIOS. Defaults to TCPIP. + + .PARAMETER WhatIf + If this switch is enabled, no actions are performed but informational messages will be displayed that explain what would happen if the command were to run. + + .PARAMETER Confirm + If this switch is enabled, you will be prompted for confirmation before executing any operations that change state. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Alias + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/New-DbaClientAlias + + .EXAMPLE + PS C:\> New-DbaClientAlias -ServerName sqlcluster\sharepoint -Alias sp + + Creates a new TCP alias on the local workstation called sp, which points sqlcluster\sharepoint + + + .EXAMPLE + PS C:\> New-DbaClientAlias -ServerName 'sqlcluster,14443' -Alias spinstance + + Creates a new TCP alias on the local workstation called spinstance, which points to sqlcluster, port 14443. + + .EXAMPLE + PS C:\> New-DbaClientAlias -ServerName sqlcluster\sharepoint -Alias sp -Protocol NamedPipes + + Creates a new NamedPipes alias on the local workstation called sp, which points sqlcluster\sharepoint + + #> + [CmdletBinding(SupportsShouldProcess)] + param ( + [DbaInstanceParameter[]]$ComputerName = $env:COMPUTERNAME, + [PSCredential]$Credential, + [parameter(Mandatory, ValueFromPipeline)] + [DbaInstanceParameter[]]$ServerName, + [parameter(Mandatory)] + [string]$Alias, + [ValidateSet("TCPIP", "NamedPipes")] + [string]$Protocol = "TCPIP", + [Alias('Silent')] + [switch]$EnableException + ) + + begin { + # This is a script block so cannot use messaging system + $scriptblock = { + $basekeys = "HKLM:\SOFTWARE\WOW6432Node\Microsoft\MSSQLServer", "HKLM:\SOFTWARE\Microsoft\MSSQLServer" + #Variable marked as unused by PSScriptAnalyzer + #$ServerName = $args[0] + $Alias = $args[1] + $serverstring = $args[2] + + if ($env:PROCESSOR_ARCHITECTURE -like "*64*") { $64bit = $true } + + foreach ($basekey in $basekeys) { + if ($64bit -ne $true -and $basekey -like "*WOW64*") { continue } + + if ((Test-Path $basekey) -eq $false) { + throw "Base key ($basekey) does not exist. Quitting." + } + + $client = "$basekey\Client" + + if ((Test-Path $client) -eq $false) { + # "Creating $client key" + $null = New-Item -Path $client -Force + } + + $connect = "$client\ConnectTo" + + if ((Test-Path $connect) -eq $false) { + # "Creating $connect key" + $null = New-Item -Path $connect -Force + } + + <# + #Variable marked as unused by PSScriptAnalyzer + #Looks like it was once used for a Verbose Message + if ($basekey -like "*WOW64*") { + $architecture = "32-bit" + } else { + $architecture = "64-bit" + } + #> + <# DO NOT use Write-Message as this is inside of a script block #> + # Write-Verbose "Creating/updating alias for $ComputerName for $architecture" + $null = New-ItemProperty -Path $connect -Name $Alias -Value $serverstring -PropertyType String -Force + } + } + } + + process { + if ($protocol -eq "TCPIP") { + $serverstring = "DBMSSOCN,$ServerName" + } else { + $serverstring = "DBNMPNTW,\\$ServerName\pipe\sql\query" + } + + foreach ($computer in $ComputerName.ComputerName) { + + $null = Test-ElevationRequirement -ComputerName $computer -Continue + + if ($PScmdlet.ShouldProcess($computer, "Adding $alias")) { + try { + Invoke-Command2 -ComputerName $computer -Credential $Credential -ScriptBlock $scriptblock -ErrorAction Stop -ArgumentList $ServerName, $Alias, $serverstring + } catch { + Stop-Function -Message "Failure" -ErrorRecord $_ -Target $computer -Continue + } + } + } + + Get-DbaClientAlias -ComputerName $computer -Credential $Credential | Where-Object AliasName -eq $Alias + } +} +function New-DbaCmConnection { + <# + .SYNOPSIS + Generates a connection object for use in remote computer management. + + .DESCRIPTION + Generates a connection object for use in remote computer management. + Those objects are used for the purpose of cim/wmi queries, caching which protocol worked, optimizing performance and minimizing authentication errors. + + New-DbaCmConnection will create a NEW object and overwrite any existing ones for the specified computer. + Furthermore, information stored in the input beyond the computername will be discarded in favor of the new settings. + + Unless the connection cache has been disabled, all connections will automatically be registered in the cache, so no further action is necessary. + The output is primarily for information purposes, however it may be used to pass objects and circumvent the cache with those. + + NOTE: Generally, this function need not be used, as a first connection to a computer using any connecting function such as "Get-DbaCmObject" will automatically register a new default connection for it. + + This function exists to be able to preconfigure connections. + + .PARAMETER ComputerName + The computer to build the connection object for. + + .PARAMETER Credential + The credential to register. + + .PARAMETER UseWindowsCredentials + Whether using the default windows credentials is legit. + Not setting this will not exclude using windows credentials, but only not pre-confirm them as working. + + .PARAMETER OverrideExplicitCredential + Setting this will enable the credential override. + The override will cause the system to ignore explicitly specified credentials, so long as known, good credentials are available. + + .PARAMETER DisabledConnectionTypes + Exlicitly disable connection types. + These types will then not be used for connecting to the computer. + + .PARAMETER DisableBadCredentialCache + Will prevent the caching of credentials if set to true. + + .PARAMETER DisableCimPersistence + Will prevent Cim-Sessions to be reused. + + .PARAMETER DisableCredentialAutoRegister + Will prevent working credentials from being automatically cached + + .PARAMETER EnableCredentialFailover + Will enable automatic failing over to known to work credentials, when using bad credentials. + By default, passing bad credentials will cause the Computer Management functions to interrupt with a warning (Or exception if in silent mode). + + .PARAMETER WindowsCredentialsAreBad + Will prevent the windows credentials of the currently logged on user from being used for the remote connection. + + .PARAMETER CimWinRMOptions + Specify a set of options to use when connecting to the target computer using CIM over WinRM. + Use 'New-CimSessionOption' to create such an object. + + .PARAMETER CimDCOMOptions + Specify a set of options to use when connecting to the target computer using CIM over DCOM. + Use 'New-CimSessionOption' to create such an object. + + .PARAMETER WhatIf + If this switch is enabled, no actions are performed but informational messages will be displayed that explain what would happen if the command were to run. + + .PARAMETER Confirm + If this switch is enabled, you will be prompted for confirmation before executing any operations that change state. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: ComputerManagement, CIM + Friedrich Weinmann (@FredWeinmann) + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/New-DbaCmConnection + + .EXAMPLE + PS C:\> New-DbaCmConnection -ComputerName sql2014 -UseWindowsCredentials -OverrideExplicitCredential -DisabledConnectionTypes CimRM + + Returns a new configuration object for connecting to the computer sql2014. + - The current user credentials are set as valid + - The connection is configured to ignore explicit credentials (so all connections use the windows credentials) + - The connections will not try using CIM over WinRM + + Unless caching is globally disabled, this is automatically stored in the connection cache and will be applied automatically. + In that (the default) case, the output is for information purposes only and need not be used. + + .EXAMPLE + PS C:\> Get-Content computers.txt | New-DbaCmConnection -Credential $cred -CimWinRMOptions $options -DisableBadCredentialCache -OverrideExplicitCredential + + Gathers a list of computers from a text file, then creates and registers connections for each of them, setting them to ... + - use the credentials stored in $cred + - use the options stored in $options when connecting using CIM over WinRM + - not store credentials that are known to not work + - to ignore explicitly specified credentials + + Essentially, this configures all connections to those computers to prefer failure with the specified credentials over using alternative credentials. + + #> + [CmdletBinding(SupportsShouldProcess, DefaultParameterSetName = 'Credential')] + param ( + [Parameter(ValueFromPipeline)] + [Sqlcollaborative.Dbatools.Parameter.DbaCmConnectionParameter[]] + $ComputerName = $env:COMPUTERNAME, + [Parameter(ParameterSetName = "Credential")] + [PSCredential] + $Credential, + [Parameter(ParameterSetName = "Windows")] + [switch] + $UseWindowsCredentials, + [switch] + $OverrideExplicitCredential, + [Sqlcollaborative.Dbatools.Connection.ManagementConnectionType] + $DisabledConnectionTypes = 'None', + [switch] + $DisableBadCredentialCache, + [switch] + $DisableCimPersistence, + [switch] + $DisableCredentialAutoRegister, + [switch] + $EnableCredentialFailover, + [Parameter(ParameterSetName = "Credential")] + [switch] + $WindowsCredentialsAreBad, + [Microsoft.Management.Infrastructure.Options.WSManSessionOptions] + $CimWinRMOptions, + [Microsoft.Management.Infrastructure.Options.DComSessionOptions] + $CimDCOMOptions, + [switch] + [Alias('Silent')]$EnableException + ) + + begin { + Write-Message -Level InternalComment -Message "Starting execution" + Write-Message -Level Verbose -Message "Bound parameters: $($PSBoundParameters.Keys -join ", ")" + + $disable_cache = Get-DbatoolsConfigValue -Name 'ComputerManagement.Cache.Disable.All' -Fallback $false + } + process { + foreach ($connectionObject in $ComputerName) { + if ($Pscmdlet.ShouldProcess($($connectionObject.connection.computername), "Creating connection object")) { + if (-not $connectionObject.Success) { Stop-Function -Message "Failed to interpret computername input: $($connectionObject.InputObject)" -Category InvalidArgument -Target $connectionObject.InputObject -Continue } + Write-Message -Level VeryVerbose -Message "Processing computer: $($connectionObject.Connection.ComputerName)" -Target $connectionObject.Connection + + $connection = New-Object -TypeName Sqlcollaborative.Dbatools.Connection.ManagementConnection -ArgumentList $connectionObject.Connection.ComputerName + if (Test-Bound "Credential") { $connection.Credentials = $Credential } + if (Test-Bound "UseWindowsCredentials") { + $connection.Credentials = $null + $connection.UseWindowsCredentials = $UseWindowsCredentials + } + if (Test-Bound "OverrideExplicitCredential") { $connection.OverrideExplicitCredential = $OverrideExplicitCredential } + if (Test-Bound "DisabledConnectionTypes") { $connection.DisabledConnectionTypes = $DisabledConnectionTypes } + if (Test-Bound "DisableBadCredentialCache") { $connection.DisableBadCredentialCache = $DisableBadCredentialCache } + if (Test-Bound "DisableCimPersistence") { $connection.DisableCimPersistence = $DisableCimPersistence } + if (Test-Bound "DisableCredentialAutoRegister") { $connection.DisableCredentialAutoRegister = $DisableCredentialAutoRegister } + if (Test-Bound "EnableCredentialFailover") { $connection.DisableCredentialAutoRegister = $EnableCredentialFailover } + if (Test-Bound "WindowsCredentialsAreBad") { $connection.WindowsCredentialsAreBad = $WindowsCredentialsAreBad } + if (Test-Bound "CimWinRMOptions") { $connection.CimWinRMOptions = $CimWinRMOptions } + if (Test-Bound "CimDCOMOptions") { $connection.CimDCOMOptions = $CimDCOMOptions } + + if (-not $disable_cache) { + Write-Message -Level Verbose -Message "Writing connection to cache" + [Sqlcollaborative.Dbatools.Connection.ConnectionHost]::Connections[$connectionObject.Connection.ComputerName] = $connection + } else { Write-Message -Level Verbose -Message "Skipping writing to cache, since the cache has been disabled!" } + $connection + } + } + } + end { + Write-Message -Level InternalComment -Message "Stopping execution" + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function New-DbaComputerCertificate { + <# + .SYNOPSIS + Creates a new computer certificate useful for Forcing Encryption + + .DESCRIPTION + Creates a new computer certificate - self-signed or signed by an Active Directory CA, using the Web Server certificate. + + By default, a key with a length of 1024 and a friendly name of the machines FQDN is generated. + + This command was originally intended to help automate the process so that SSL certificates can be available for enforcing encryption on connections. + + It makes a lot of assumptions - namely, that your account is allowed to auto-enroll and that you have permission to do everything it needs to do ;) + + References: + http://sqlmag.com/sql-server/7-steps-ssl-encryption + https://azurebi.jppp.org/2016/01/23/using-lets-encrypt-certificates-for-secure-sql-server-connections/ + https://blogs.msdn.microsoft.com/sqlserverfaq/2016/09/26/creating-and-registering-ssl-certificates/ + + The certificate is generated using AD's webserver SSL template on the client machine and pushed to the remote machine. + + .PARAMETER ComputerName + The target SQL Server instance or instances. Defaults to localhost. If target is a cluster, you must also specify ClusterInstanceName (see below) + + .PARAMETER Credential + Allows you to login to $ComputerName using alternative credentials. + + .PARAMETER CaServer + Optional - the CA Server where the request will be sent to + + .PARAMETER CaName + The properly formatted CA name of the corresponding CaServer + + .PARAMETER ClusterInstanceName + When creating certs for a cluster, use this parameter to create the certificate for the cluster node name. Use ComputerName for each of the nodes. + + .PARAMETER SecurePassword + Password to encrypt/decrypt private key for export to remote machine + + .PARAMETER FriendlyName + The FriendlyName listed in the certificate. This defaults to the FQDN of the $ComputerName + + .PARAMETER CertificateTemplate + The domain's Certificate Template - WebServer by default. + + .PARAMETER KeyLength + The length of the key - defaults to 1024 + + .PARAMETER Store + Certificate store - defaults to LocalMachine + + .PARAMETER Folder + Certificate folder - defaults to My (Personal) + + .PARAMETER Dns + Specify the Dns entries listed in SAN. By default, it will be ComputerName + FQDN, or in the case of clusters, clustername + cluster FQDN. + + .PARAMETER SelfSigned + Creates a self-signed certificate. All other parameters can still apply except CaServer and CaName because the command does not go and get the certificate signed. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .PARAMETER WhatIf + Shows what would happen if the command were to run. No actions are actually performed. + + .PARAMETER Confirm + Prompts you for confirmation before executing any changing operations within the command. + + .NOTES + Tags: Certificate + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .EXAMPLE + PS C:\> New-DbaComputerCertificate + + Creates a computer certificate signed by the local domain CA for the local machine with the keylength of 1024. + + .EXAMPLE + PS C:\> New-DbaComputerCertificate -ComputerName Server1 + + Creates a computer certificate signed by the local domain CA _on the local machine_ for server1 with the keylength of 1024. + + The certificate is then copied to the new machine over WinRM and imported. + + .EXAMPLE + PS C:\> New-DbaComputerCertificate -ComputerName sqla, sqlb -ClusterInstanceName sqlcluster -KeyLength 4096 + + Creates a computer certificate for sqlcluster, signed by the local domain CA, with the keylength of 4096. + + The certificate is then copied to sqla _and_ sqlb over WinRM and imported. + + .EXAMPLE + PS C:\> New-DbaComputerCertificate -ComputerName Server1 -WhatIf + + Shows what would happen if the command were run + + .EXAMPLE + PS C:\> New-DbaComputerCertificate -SelfSigned + + Creates a self-signed certificate + + #> + [CmdletBinding(SupportsShouldProcess, ConfirmImpact = "Low")] + [Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSUseOutputTypeCorrectly", "", Justification = "PSSA Rule Ignored by BOH")] + param ( + [parameter(ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer", "SqlInstance")] + [DbaInstance[]]$ComputerName = $env:COMPUTERNAME, + [PSCredential]$Credential, + [string]$CaServer, + [string]$CaName, + [string]$ClusterInstanceName, + [Alias("Password")] + [securestring]$SecurePassword, + [string]$FriendlyName = "SQL Server", + [string]$CertificateTemplate = "WebServer", + [int]$KeyLength = 1024, + [string]$Store = "LocalMachine", + [string]$Folder = "My", + [string[]]$Dns, + [switch]$SelfSigned, + [Alias('Silent')] + [switch]$EnableException + ) + begin { + $englishCodes = 9, 1033, 2057, 3081, 4105, 5129, 6153, 7177, 8201, 9225 + if ($englishCodes -notcontains (Get-DbaCmObject Win32_OperatingSystem).OSLanguage) { + Stop-Function -Message "Currently, this command is only supported in English OS locales. OS Locale detected: $([System.Globalization.CultureInfo]::GetCultureInfo([int](Get-DbaCmObject Win32_OperatingSystem).OSLanguage).DisplayName)`nWe apologize for the inconvenience and look into providing universal language support in future releases." + return + } + + if (-not (Test-ElevationRequirement -ComputerName $env:COMPUTERNAME)) { + return + } + + function GetHexLength { + [cmdletbinding()] + param( + [int]$strLen + ) + $hex = [String]::Format("{0:X2}", $strLen) + + if ($strLen -gt 127) { [String]::Format("{0:X2}", 128 + ($hex.Length / 2)) + $hex } + else { $hex } + } + + function Get-SanExt { + [cmdletbinding()] + param( + [string[]]$hostName + ) + # thanks to Lincoln of + # https://social.technet.microsoft.com/Forums/windows/en-US/f568edfa-7f93-46a4-aab9-a06151592dd9/converting-ascii-to-asn1-der + + $temp = '' + foreach ($fqdn in $hostName) { + # convert each character of fqdn to hex + $hexString = ($fqdn.ToCharArray() | ForEach-Object { [String]::Format("{0:X2}", [int]$_) }) -join '' + + # length of hex fqdn, in hex + $hexLength = GetHexLength ($hexString.Length / 2) + + # concatenate special code 82, hex length, hex string + $temp += "82${hexLength}${hexString}" + } + # calculate total length of concatenated string, in hex + $totalHexLength = GetHexLength ($temp.Length / 2) + # concatenate special code 30, hex length, hex string + $temp = "30${totalHexLength}${temp}" + # convert to binary + $bytes = $( + for ($i = 0; $i -lt $temp.Length; $i += 2) { + [byte]"0x$($temp.SubString($i, 2))" + } + ) + # convert to base 64 + $base64 = [Convert]::ToBase64String($bytes) + # output in proper format + for ($i = 0; $i -lt $base64.Length; $i += 64) { + $line = $base64.SubString($i, [Math]::Min(64, $base64.Length - $i)) + if ($i -eq 0) { "2.5.29.17=$line" } + else { "_continue_=$line" } + } + } + + if ((!$CaServer -or !$CaName) -and !$SelfSigned) { + try { + Write-Message -Level Verbose -Message "No CaServer or CaName specified. Performing lookup." + # hat tip Vadims Podans + $domain = ([System.DirectoryServices.ActiveDirectory.Domain]::GetCurrentDomain()).Name + $domain = "DC=" + $domain -replace '\.', ", DC=" + $pks = [ADSI]"LDAP://CN=Enrollment Services, CN=Public Key Services, CN=Services, CN=Configuration, $domain" + $cas = $pks.psBase.Children + + $allCas = @() + foreach ($ca in $cas) { + $allCas += [pscustomobject]@{ + CA = $ca | ForEach-Object { $_.Name } + Computer = $ca | ForEach-Object { $_.DNSHostName } + } + } + } catch { + Stop-Function -Message "Cannot access Active Directory or find the Certificate Authority" -ErrorRecord $_ + return + } + + if (!$CaServer) { + $CaServer = ($allCas | Select-Object -First 1).Computer + Write-Message -Level Verbose -Message "Root Server: $CaServer" + } + + if (!$CaName) { + $CaName = ($allCas | Select-Object -First 1).CA + Write-Message -Level Verbose -Message "Root CA name: $CaName" + } + } + + $tempDir = ([System.IO.Path]::GetTempPath()).TrimEnd("\") + $certTemplate = "CertificateTemplate:$CertificateTemplate" + } + + process { + if (Test-FunctionInterrupt) { return } + + # uses dos command locally + + + foreach ($computer in $ComputerName) { + + if (!$secondaryNode) { + + if ($ClusterInstanceName) { + if ($ClusterInstanceName -notmatch "\.") { + $fqdn = "$ClusterInstanceName.$env:USERDNSDOMAIN" + } else { + $fqdn = $ClusterInstanceName + } + } else { + $resolved = Resolve-DbaNetworkName -ComputerName $computer.ComputerName -WarningAction SilentlyContinue + + if (!$resolved) { + $fqdn = "$ComputerName.$env:USERDNSDOMAIN" + Write-Message -Level Warning -Message "Server name cannot be resolved. Guessing it's $fqdn" + } else { + $fqdn = $resolved.fqdn + } + } + + $certDir = "$tempDir\$fqdn" + $certCfg = "$certDir\request.inf" + $certCsr = "$certDir\$fqdn.csr" + $certCrt = "$certDir\$fqdn.crt" + $certPfx = "$certDir\$fqdn.pfx" + $tempPfx = "$certDir\temp-$fqdn.pfx" + + if (Test-Path($certDir)) { + Write-Message -Level Output -Message "Deleting files from $certDir" + $null = Remove-Item "$certDir\*.*" + } else { + Write-Message -Level Output -Message "Creating $certDir" + $null = New-Item -Path $certDir -ItemType Directory -Force + } + + # Make sure output is compat with clusters + $shortName = $fqdn.Split(".")[0] + + if (!$dns) { + $dns = $shortName, $fqdn + } + + $san = Get-SanExt $dns + # Write config file + Set-Content $certCfg "[Version]" + Add-Content $certCfg 'Signature="$Windows NT$"' + Add-Content $certCfg "[NewRequest]" + Add-Content $certCfg "Subject = ""CN=$fqdn""" + Add-Content $certCfg "KeySpec = 1" + Add-Content $certCfg "KeyLength = $KeyLength" + Add-Content $certCfg "Exportable = TRUE" + Add-Content $certCfg "MachineKeySet = TRUE" + Add-Content $certCfg "FriendlyName=""$FriendlyName""" + Add-Content $certCfg "SMIME = False" + Add-Content $certCfg "PrivateKeyArchive = FALSE" + Add-Content $certCfg "UserProtected = FALSE" + Add-Content $certCfg "UseExistingKeySet = FALSE" + Add-Content $certCfg "ProviderName = ""Microsoft RSA SChannel Cryptographic Provider""" + Add-Content $certCfg "ProviderType = 12" + if ($SelfSigned) { + Add-Content $certCfg "RequestType = Cert" + } else { + Add-Content $certCfg "RequestType = PKCS10" + } + Add-Content $certCfg "KeyUsage = 0xa0" + Add-Content $certCfg "[EnhancedKeyUsageExtension]" + Add-Content $certCfg "OID=1.3.6.1.5.5.7.3.1" + Add-Content $certCfg "[Extensions]" + Add-Content $certCfg $san + Add-Content $certCfg "Critical=2.5.29.17" + + + if ($PScmdlet.ShouldProcess("local", "Creating certificate for $computer")) { + Write-Message -Level Output -Message "Running: certreq -new $certCfg $certCsr" + $create = certreq -new $certCfg $certCsr + } + + if ($SelfSigned) { + $serial = (($create -Split "Serial Number:" -Split "Subject")[2]).Trim() # D: + $storedCert = Get-ChildItem Cert:\LocalMachine\My -Recurse | Where-Object SerialNumber -eq $serial + + if ($computer.IsLocalHost) { + $storedCert | Select-Object * | Select-DefaultView -Property FriendlyName, DnsNameList, Thumbprint, NotBefore, NotAfter, Subject, Issuer + } + } else { + if ($PScmdlet.ShouldProcess("local", "Submitting certificate request for $computer to $CaServer\$CaName")) { + Write-Message -Level Output -Message "certreq -submit -config `"$CaServer\$CaName`" -attrib $certTemplate $certCsr $certCrt $certPfx" + $submit = certreq -submit -config ""$CaServer\$CaName"" -attrib $certTemplate $certCsr $certCrt $certPfx + } + + if ($submit -match "ssued") { + Write-Message -Level Output -Message "certreq -accept -machine $certCrt" + $null = certreq -accept -machine $certCrt + $cert = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2 + $cert.Import($certCrt, $null, [System.Security.Cryptography.X509Certificates.X509KeyStorageFlags]::DefaultKeySet) + $storedCert = Get-ChildItem "Cert:\$store\$folder" -Recurse | Where-Object { $_.Thumbprint -eq $cert.Thumbprint } + } elseif ($submit) { + Write-Message -Level Warning -Message "Something went wrong" + Write-Message -Level Warning -Message "$create" + Write-Message -Level Warning -Message "$submit" + Stop-Function -Message "Failure when attempting to create the cert on $computer. Exception: $_" -ErrorRecord $_ -Target $computer -Continue + } + + if ($Computer.IsLocalHost) { + $storedCert | Select-Object * | Select-DefaultView -Property FriendlyName, DnsNameList, Thumbprint, NotBefore, NotAfter, Subject, Issuer + } + } + } + + if (!$Computer.IsLocalHost) { + + if (!$secondaryNode) { + if ($PScmdlet.ShouldProcess("local", "Generating pfx and reading from disk")) { + Write-Message -Level Output -Message "Exporting PFX with password to $tempPfx" + $certdata = $storedCert.Export([System.Security.Cryptography.X509Certificates.X509ContentType]::PFX, $SecurePassword) + } + + if ($PScmdlet.ShouldProcess("local", "Removing cert from disk but keeping it in memory")) { + $storedCert | Remove-Item + } + + if ($ClusterInstanceName) { $secondaryNode = $true } + } + + $scriptblock = { + $cert = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2 + $cert.Import($args[0], $args[1], "Exportable,PersistKeySet") + + $certstore = New-Object System.Security.Cryptography.X509Certificates.X509Store($args[3], $args[2]) + $certstore.Open('ReadWrite') + $certstore.Add($cert) + $certstore.Close() + Get-ChildItem "Cert:\$($args[2])\$($args[3])" -Recurse | Where-Object { $_.Thumbprint -eq $cert.Thumbprint } + } + + if ($PScmdlet.ShouldProcess("local", "Connecting to $computer to import new cert")) { + try { + Invoke-Command2 -ComputerName $computer -Credential $Credential -ArgumentList $certdata, $SecurePassword, $Store, $Folder -ScriptBlock $scriptblock -ErrorAction Stop | + Select-DefaultView -Property DnsNameList, Thumbprint, NotBefore, NotAfter, Subject, Issuer + } catch { + Stop-Function -Message "Issue importing new cert on $computer" -ErrorRecord $_ -Target $computer -Continue + } + } + } + if ($PScmdlet.ShouldProcess("local", "Removing all files from $certDir")) { + try { + Remove-Item -Force -Recurse $certDir -ErrorAction SilentlyContinue + } catch { + Stop-Function "Isue removing files from $certDir" -Target $certDir -ErrorRecord $_ + } + } + } + } +} +function New-DbaConnectionString { + <# + .SYNOPSIS + Builds or extracts a SQL Server Connection String + + .DESCRIPTION + Builds or extracts a SQL Server Connection String + + See https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.connectionstring.aspx + and https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnectionstringbuilder.aspx + and https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.aspx + + .PARAMETER SqlInstance + The target SQL Server instance or instances. + + .PARAMETER Credential + Credential object used to connect to the SQL Server as a different user be it Windows or SQL Server. Windows users are determined by the existence of a backslash, so if you are intending to use an alternative Windows connection instead of a SQL login, ensure it contains a backslash. + + .PARAMETER AccessToken + Gets or sets the access token for the connection. + + .PARAMETER AppendConnectionString + Appends to the current connection string. Note that you cannot pass authentication information using this method. Use -SqlInstance and, optionally, -SqlCredential to set authentication information. + + .PARAMETER ApplicationIntent + Declares the application workload type when connecting to a server. Possible values are ReadOnly and ReadWrite. + + .PARAMETER BatchSeparator + By default, this is "GO" + + .PARAMETER ClientName + By default, this command sets the client to "dbatools PowerShell module - dbatools.io - custom connection" if you're doing anything that requires profiling, you can look for this client name. Using -ClientName allows you to set your own custom client. + + .PARAMETER Database + Database name + + .PARAMETER ConnectTimeout + The length of time (in seconds) to wait for a connection to the server before terminating the attempt and generating an error. + + Valid values are greater than or equal to 0 and less than or equal to 2147483647. + + When opening a connection to a Azure SQL Database, set the connection timeout to 30 seconds. + + .PARAMETER EncryptConnection + When true, SQL Server uses SSL encryption for all data sent between the client and server if the server has a certificate installed. Recognized values are true, false, yes, and no. For more information, see Connection String Syntax. + + Beginning in .NET Framework 4.5, when TrustServerCertificate is false and Encrypt is true, the server name (or IP address) in a SQL Server SSL certificate must exactly match the server name (or IP address) specified in the connection string. Otherwise, the connection attempt will fail. For information about support for certificates whose subject starts with a wildcard character (*), see Accepted wildcards used by server certificates for server authentication. + + .PARAMETER FailoverPartner + The name of the failover partner server where database mirroring is configured. + + If the value of this key is "", then Initial Catalog must be present, and its value must not be "". + + The server name can be 128 characters or less. + + If you specify a failover partner but the failover partner server is not configured for database mirroring and the primary server (specified with the Server keyword) is not available, then the connection will fail. + + If you specify a failover partner and the primary server is not configured for database mirroring, the connection to the primary server (specified with the Server keyword) will succeed if the primary server is available. + + .PARAMETER IsActiveDirectoryUniversalAuth + Azure related + + .PARAMETER LockTimeout + Sets the time in seconds required for the connection to time out when the current transaction is locked. + + .PARAMETER MaxPoolSize + Sets the maximum number of connections allowed in the connection pool for this specific connection string. + + .PARAMETER MinPoolSize + Sets the minimum number of connections allowed in the connection pool for this specific connection string. + + .PARAMETER MultipleActiveResultSets + When used, an application can maintain multiple active result sets (MARS). When false, an application must process or cancel all result sets from one batch before it can execute any other batch on that connection. + + .PARAMETER MultiSubnetFailover + If your application is connecting to an AlwaysOn availability group (AG) on different subnets, setting MultiSubnetFailover provides faster detection of and connection to the (currently) active server. For more information about SqlClient support for Always On Availability Groups + + .PARAMETER NetworkProtocol + Connect explicitly using 'TcpIp','NamedPipes','Multiprotocol','AppleTalk','BanyanVines','Via','SharedMemory' and 'NWLinkIpxSpx' + + .PARAMETER NonPooledConnection + Request a non-pooled connection + + .PARAMETER PacketSize + Sets the size in bytes of the network packets used to communicate with an instance of SQL Server. Must match at server. + + .PARAMETER PooledConnectionLifetime + When a connection is returned to the pool, its creation time is compared with the current time, and the connection is destroyed if that time span (in seconds) exceeds the value specified by Connection Lifetime. This is useful in clustered configurations to force load balancing between a running server and a server just brought online. + + A value of zero (0) causes pooled connections to have the maximum connection timeout. + + .PARAMETER SqlExecutionModes + The SqlExecutionModes enumeration contains values that are used to specify whether the commands sent to the referenced connection to the server are executed immediately or saved in a buffer. + + Valid values include CaptureSql, ExecuteAndCaptureSql and ExecuteSql. + + .PARAMETER StatementTimeout + Sets the number of seconds a statement is given to run before failing with a time-out error. + + .PARAMETER TrustServerCertificate + Sets a value that indicates whether the channel will be encrypted while bypassing walking the certificate chain to validate trust. + + .PARAMETER WorkstationId + Sets the name of the workstation connecting to SQL Server. + + .PARAMETER WhatIf + If this switch is enabled, no actions are performed but informational messages will be displayed that explain what would happen if the command were to run. + + .PARAMETER Confirm + If this switch is enabled, you will be prompted for confirmation before executing any operations that change state. + + .NOTES + Tags: Connection, Connect, ConnectionString + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/New-DbaConnectionString + + .EXAMPLE + PS C:\> New-DbaConnectionString -SqlInstance sql2014 + + Creates a connection string that connects using Windows Authentication + + .EXAMPLE + PS C:\> Connect-DbaInstance -SqlInstance sql2016 | New-DbaConnectionString + + Builds a connected SMO object using Connect-DbaInstance then extracts and displays the connection string + + .EXAMPLE + PS C:\> $wincred = Get-Credential ad\sqladmin + PS C:\> New-DbaConnectionString -SqlInstance sql2014 -Credential $wincred + + Creates a connection string that connects using alternative Windows credentials + + .EXAMPLE + PS C:\> $sqlcred = Get-Credential sqladmin + PS C:\> $server = New-DbaConnectionString -SqlInstance sql2014 -Credential $sqlcred + + Login to sql2014 as SQL login sqladmin. + + .EXAMPLE + PS C:\> $server = New-DbaConnectionString -SqlInstance sql2014 -ClientName "mah connection" + + Creates a connection string that connects using Windows Authentication and uses the client name "mah connection". So when you open up profiler or use extended events, you can search for "mah connection". + + .EXAMPLE + PS C:\> $server = New-DbaConnectionString -SqlInstance sql2014 -AppendConnectionString "Packet Size=4096;AttachDbFilename=C:\MyFolder\MyDataFile.mdf;User Instance=true;" + + Creates a connection string that connects to sql2014 using Windows Authentication, then it sets the packet size (this can also be done via -PacketSize) and other connection attributes. + + .EXAMPLE + PS C:\> $server = New-DbaConnectionString -SqlInstance sql2014 -NetworkProtocol TcpIp -MultiSubnetFailover + + Creates a connection string with Windows Authentication that uses TCPIP and has MultiSubnetFailover enabled. + + .EXAMPLE + PS C:\> $connstring = New-DbaConnectionString sql2016 -ApplicationIntent ReadOnly + + Creates a connection string with ReadOnly ApplicationIntent. + + #> + [CmdletBinding(SupportsShouldProcess)] + param ( + [Parameter(Mandatory, ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [Alias("SqlCredential")] + [PSCredential]$Credential, + [string]$AccessToken, + [ValidateSet('ReadOnly', 'ReadWrite')] + [string]$ApplicationIntent, + [string]$BatchSeparator, + [string]$ClientName = "custom connection", + [int]$ConnectTimeout, + [string]$Database, + [switch]$EncryptConnection, + [string]$FailoverPartner, + [switch]$IsActiveDirectoryUniversalAuth, + [int]$LockTimeout, + [int]$MaxPoolSize, + [int]$MinPoolSize, + [switch]$MultipleActiveResultSets, + [switch]$MultiSubnetFailover, + [ValidateSet('TcpIp', 'NamedPipes', 'Multiprotocol', 'AppleTalk', 'BanyanVines', 'Via', 'SharedMemory', 'NWLinkIpxSpx')] + [string]$NetworkProtocol, + [switch]$NonPooledConnection, + [int]$PacketSize, + [int]$PooledConnectionLifetime, + [ValidateSet('CaptureSql', 'ExecuteAndCaptureSql', 'ExecuteSql')] + [string]$SqlExecutionModes, + [int]$StatementTimeout, + [switch]$TrustServerCertificate, + [string]$WorkstationId, + [string]$AppendConnectionString + ) + + process { + foreach ($instance in $sqlinstance) { + if ($Pscmdlet.ShouldProcess($instance, "Making a new Connection String")) { + if ($instance.ComputerName -match "database\.windows\.net" -and -not $instance.InputObject.ConnectionContext.IsOpen) { + if (-not $Database) { + Stop-Function -Message "You must specify -Database when connecting to a SQL Azure databse" -Continue + } + $isAzure = $true + + if (-not (Test-Bound -ParameterName ConnectTimeout)) { + $ConnectTimeout = 30 + } + + if (-not (Test-Bound -ParameterName ClientName)) { + $ClientName = "dbatools PowerShell module - dbatools.io" + + } + $EncryptConnection = $true + $instance = [DbaInstanceParameter]"tcp:$($instance.ComputerName),$($instance.Port)" + } + + if ($instance.GetType() -eq [Microsoft.SqlServer.Management.Smo.Server]) { + return $instance.ConnectionContext.ConnectionString + } else { + $guid = [System.Guid]::NewGuid() + $server = New-Object Microsoft.SqlServer.Management.Smo.Server $guid + + if ($AppendConnectionString) { + $connstring = $server.ConnectionContext.ConnectionString + $server.ConnectionContext.ConnectionString = "$connstring;$appendconnectionstring" + $server.ConnectionContext.ConnectionString + } else { + + $server.ConnectionContext.ApplicationName = $clientname + + if ($AccessToken) { $server.ConnectionContext.AccessToken = $AccessToken } + if ($BatchSeparator) { $server.ConnectionContext.BatchSeparator = $BatchSeparator } + if ($ConnectTimeout) { $server.ConnectionContext.ConnectTimeout = $ConnectTimeout } + if ($Database) { $server.ConnectionContext.DatabaseName = $Database } + if ($EncryptConnection) { $server.ConnectionContext.EncryptConnection = $true } + if ($IsActiveDirectoryUniversalAuth) { $server.ConnectionContext.IsActiveDirectoryUniversalAuth = $true } + if ($LockTimeout) { $server.ConnectionContext.LockTimeout = $LockTimeout } + if ($MaxPoolSize) { $server.ConnectionContext.MaxPoolSize = $MaxPoolSize } + if ($MinPoolSize) { $server.ConnectionContext.MinPoolSize = $MinPoolSize } + if ($MultipleActiveResultSets) { $server.ConnectionContext.MultipleActiveResultSets = $true } + if ($NetworkProtocol) { $server.ConnectionContext.NetworkProtocol = $NetworkProtocol } + if ($NonPooledConnection) { $server.ConnectionContext.NonPooledConnection = $true } + if ($PacketSize) { $server.ConnectionContext.PacketSize = $PacketSize } + if ($PooledConnectionLifetime) { $server.ConnectionContext.PooledConnectionLifetime = $PooledConnectionLifetime } + if ($StatementTimeout) { $server.ConnectionContext.StatementTimeout = $StatementTimeout } + if ($SqlExecutionModes) { $server.ConnectionContext.SqlExecutionModes = $SqlExecutionModes } + if ($TrustServerCertificate) { $server.ConnectionContext.TrustServerCertificate = $true } + if ($WorkstationId) { $server.ConnectionContext.WorkstationId = $WorkstationId } + + if ($null -ne $Credential.username) { + $username = ($Credential.username).TrimStart("\") + + if ($username -like "*\*") { + $username = $username.Split("\")[1] + #Variable marked as unused by PSScriptAnalyzer + #$authtype = "Windows Authentication with Credential" + $server.ConnectionContext.LoginSecure = $true + $server.ConnectionContext.ConnectAsUser = $true + $server.ConnectionContext.ConnectAsUserName = $username + $server.ConnectionContext.ConnectAsUserPassword = ($Credential).GetNetworkCredential().Password + } else { + #Variable marked as unused by PSScriptAnalyzer + #$authtype = "SQL Authentication" + $server.ConnectionContext.LoginSecure = $false + $server.ConnectionContext.set_Login($username) + $server.ConnectionContext.set_SecurePassword($Credential.Password) + } + } + + $connstring = $server.ConnectionContext.ConnectionString + if ($MultiSubnetFailover) { $connstring = "$connstring;MultiSubnetFailover=True" } + if ($FailoverPartner) { $connstring = "$connstring;Failover Partner=$FailoverPartner" } + if ($ApplicationIntent) { $connstring = "$connstring;ApplicationIntent=$ApplicationIntent;" } + + if ($isAzure) { + if ($Credential) { + if ($Credential.UserName -like "*\*" -or $Credential.UserName -like "*@*") { + $connstring = "$connstring;Authentication=`"Active Directory Password`"" + } else { + $username = ($Credential.username).TrimStart("\") + $server.ConnectionContext.LoginSecure = $false + $server.ConnectionContext.set_Login($username) + $server.ConnectionContext.set_SecurePassword($Credential.Password) + } + } else { + $connstring = $connstring.Replace("Integrated Security=True;", "") + $connstring = "$connstring;Authentication=`"Active Directory Integrated`"" + } + } + + if ($connstring -ne $server.ConnectionContext.ConnectionString) { + $server.ConnectionContext.ConnectionString = $connstring + } + + ($server.ConnectionContext.ConnectionString).Replace($guid, $instance) + } + } + } + } + } + end { + Test-DbaDeprecation -DeprecatedOn "1.0.0" -EnableException:$false -Alias New-DbaSqlConnectionString + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function New-DbaConnectionStringBuilder { + <# + .SYNOPSIS + Returns a System.Data.SqlClient.SqlConnectionStringBuilder with the string specified + + .DESCRIPTION + Creates a System.Data.SqlClient.SqlConnectionStringBuilder from a connection string. + + .PARAMETER ConnectionString + A Connection String + + .PARAMETER ApplicationName + The application name to tell SQL Server the connection is associated with. + + .PARAMETER DataSource + The Sql Server to connect to. + + .PARAMETER InitialCatalog + The initial database on the server to connect to. + + .PARAMETER IntegratedSecurity + Set to true to use windows authentication. + + .PARAMETER UserName + Sql User Name to connect with. + + .PARAMETER Password + Password to use to connect with. + + .PARAMETER MultipleActiveResultSets + Enable Multiple Active Result Sets. + + .PARAMETER ColumnEncryptionSetting + Enable Always Encrypted. + + .PARAMETER WorkstationID + Set the Workstation Id that is associated with the connection. + + .PARAMETER WhatIf + If this switch is enabled, no actions are performed but informational messages will be displayed that explain what would happen if the command were to run. + + .PARAMETER Confirm + If this switch is enabled, you will be prompted for confirmation before executing any operations that change state. + + .NOTES + Tags: SqlBuild, ConnectionString, Connection + Author: zippy1981 | Chrissy LeMaire (@cl) + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/New-DbaConnectionStringBuilder + + .EXAMPLE + PS C:\> New-DbaConnectionStringBuilder + + Returns an empty ConnectionStringBuilder + + .EXAMPLE + PS C:\> "Data Source=localhost,1433;Initial Catalog=AlwaysEncryptedSample;UID=sa;PWD=alwaysB3Encrypt1ng;Application Name=Always Encrypted Sample MVC App;Column Encryption Setting=enabled" | New-DbaConnectionStringBuilder + + Returns a connection string builder that can be used to connect to the local sql server instance on the default port. + + #> + [CmdletBinding(SupportsShouldProcess)] + [Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSAvoidUsingPlainTextForPassword", "")] + [Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSAvoidUsingUserNameAndPassWordParams", "")] + param ( + [Parameter(ValueFromPipeline)] + [string[]]$ConnectionString = "", + [string]$ApplicationName = "dbatools Powershell Module", + [string]$DataSource = $null, + [string]$InitialCatalog = $null, + [Nullable[bool]]$IntegratedSecurity = $null, + [string]$UserName = $null, + # No point in securestring here, the memory is never stored securely in memory. + [string]$Password = $null, + [Alias('MARS')] + [switch]$MultipleActiveResultSets, + [Alias('AlwaysEncrypted')] + [Data.SqlClient.SqlConnectionColumnEncryptionSetting]$ColumnEncryptionSetting = + [Data.SqlClient.SqlConnectionColumnEncryptionSetting]::Enabled, + [string]$WorkstationId = $env:COMPUTERNAME + ) + process { + foreach ($cs in $ConnectionString) { + if ($Pscmdlet.ShouldProcess($cs, "Creating new connection string")) { + $builder = New-Object Data.SqlClient.SqlConnectionStringBuilder $cs + if ($builder.ApplicationName -eq ".Net SqlClient Data Provider") { + $builder['Application Name'] = $ApplicationName + } + if (![string]::IsNullOrWhiteSpace($DataSource)) { + $builder['Data Source'] = $DataSource + } + if (![string]::IsNullOrWhiteSpace($InitialCatalog)) { + $builder['Initial Catalog'] = $InitialCatalog + } + if (![string]::IsNullOrWhiteSpace($IntegratedSecurity)) { + $builder['Integrated Security'] = $IntegratedSecurity + } + if (![string]::IsNullOrWhiteSpace($UserName)) { + $builder["User ID"] = $UserName + } + if (![string]::IsNullOrWhiteSpace($Password)) { + $builder['Password'] = $Password + } + if (![string]::IsNullOrWhiteSpace($WorkstationId)) { + $builder['Workstation ID'] = $WorkstationId + } + if ($MultipleActiveResultSets -eq $true) { + $builder['MultipleActiveResultSets'] = $true + } + if ($ColumnEncryptionSetting -eq [Data.SqlClient.SqlConnectionColumnEncryptionSetting]::Enabled) { + $builder['Column Encryption Setting'] = [Data.SqlClient.SqlConnectionColumnEncryptionSetting]::Enabled + } + $builder + } + } + } + end { + Test-DbaDeprecation -DeprecatedOn "1.0.0" -EnableException:$false -Alias New-DbaSqlConnectionStringBuilder + } +} +function New-DbaCredential { + <# + .SYNOPSIS + Creates a new SQL Server credential + + .DESCRIPTION + Creates a new credential + + .PARAMETER SqlInstance + The target SQL Server(s) + + .PARAMETER SqlCredential + Allows you to login to SQL Server using alternative credentials + + .PARAMETER Name + The Credential name + + .PARAMETER Identity + The Credential Identity + + .PARAMETER SecurePassword + Secure string used to authenticate the Credential Identity + + .PARAMETER MappedClassType + Sets the class associated with the credential. + + .PARAMETER ProviderName + Sets the name of the provider + + .PARAMETER Force + If credential exists, drop and recreate + + .PARAMETER WhatIf + Shows what would happen if the command were to run. No actions are actually performed + + .PARAMETER Confirm + Prompts you for confirmation before executing any changing operations within the command + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Certificate + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .EXAMPLE + PS C:\> New-DbaCredential -SqlInstance Server1 + + You will be prompted to securely enter your password, then a credential will be created in the master database on server1 if it does not exist. + + .EXAMPLE + PS C:\> New-DbaCredential -SqlInstance Server1 -Confirm:$false + + Suppresses all prompts to install but prompts to securely enter your password and creates a credential on Server1. + + .EXAMPLE + PS C:\> New-DbaCredential -SqlInstance Server1 -Name AzureBackupBlobStore -Identity '' -SecurePassword (ConvertTo-SecureString '' -AsPlainText -Force) + + Create credential on SQL Server 2012 CU2, SQL Server 2014 for use with BACKUP TO URL. + CredentialIdentity needs to be supplied with the Azure Storage Account Name. + Password needs to be one of the Access Keys for the account. + + .EXAMPLE + PS C:\> New-DbaCredential -SqlInstance Server1 -Name 'https://.blob.core.windows.net/' -Identity 'SHARED ACCESS SIGNATURE' -SecurePassword (ConvertTo-SecureString '' -AsPlainText -Force) + + Create Credential on SQL Server 2016 or higher for use with BACKUP TO URL. + Name has to be the full URL for the blob store container that will be the backup target. + Password needs to be passed the Shared Access Token (SAS Key). + + #> + [CmdletBinding(SupportsShouldProcess)] #, ConfirmImpact = "High" + param ( + [parameter(Mandatory, ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [object[]]$Name = $Identity, + [parameter(Mandatory)] + [Alias("CredentialIdentity")] + [string[]]$Identity, + [Alias("Password")] + [Security.SecureString]$SecurePassword, + [ValidateSet('CryptographicProvider', 'None')] + [string]$MappedClassType = "None", + [string]$ProviderName, + [switch]$Force, + [switch]$EnableException + ) + + begin { + $mappedclass = switch ($MappedClassType) { + "CryptographicProvider" { 1 } + "None" { 0 } + } + } + + process { + if (!$SecurePassword) { + Read-Host -AsSecureString -Prompt "Enter the credential password" + } + + foreach ($instance in $SqlInstance) { + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $sqlcredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + foreach ($cred in $Identity) { + $currentcred = $server.Credentials[$name] + + if ($currentcred) { + if ($force) { + Write-Message -Level Verbose -Message "Dropping credential $name" + $currentcred.Drop() + } else { + Stop-Function -Message "Credential exists and Force was not specified" -Target $name -Continue + } + } + + + if ($Pscmdlet.ShouldProcess($SqlInstance, "Creating credential for database '$cred' on $instance")) { + try { + $credential = New-Object Microsoft.SqlServer.Management.Smo.Credential -ArgumentList $server, $name + $credential.MappedClassType = $mappedclass + $credential.ProviderName = $ProviderName + $credential.Create($Identity, $SecurePassword) + + Add-Member -Force -InputObject $credential -MemberType NoteProperty -Name ComputerName -value $server.ComputerName + Add-Member -Force -InputObject $credential -MemberType NoteProperty -Name InstanceName -value $server.ServiceName + Add-Member -Force -InputObject $credential -MemberType NoteProperty -Name SqlInstance -value $server.DomainInstanceName + + Select-DefaultView -InputObject $credential -Property ComputerName, InstanceName, SqlInstance, Name, Identity, CreateDate, MappedClassType, ProviderName + } catch { + Stop-Function -Message "Failed to create credential in $cred on $instance. Exception: $($_.Exception.InnerException)" -Target $credential -InnerErrorRecord $_ -Continue + } + } + } + } + } +} +function New-DbaDacOption { + <# + .SYNOPSIS + Creates a new Microsoft.SqlServer.Dac.DacExtractOptions/DacExportOptions object depending on the chosen Type + + .DESCRIPTION + Creates a new Microsoft.SqlServer.Dac.DacExtractOptions/DacExportOptions object that can be used during DacPackage extract. Basically saves you the time from remembering the SMO assembly name ;) + + See: + https://msdn.microsoft.com/en-us/library/microsoft.sqlserver.dac.dacexportoptions.aspx + https://msdn.microsoft.com/en-us/library/microsoft.sqlserver.dac.dacextractoptions.aspx + for more information + + .PARAMETER Type + Selecting the type of the export: Dacpac (default) or Bacpac. + + .PARAMETER Action + Choosing an intended action: Publish or Export. + + .PARAMETER PublishXml + Specifies the publish profile which will include options and sqlCmdVariables. + + .PARAMETER WhatIf + If this switch is enabled, no actions are performed but informational messages will be displayed that explain what would happen if the command were to run. + + .PARAMETER Confirm + If this switch is enabled, you will be prompted for confirmation before executing any operations that change state. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Migration, Database, Dacpac + Author: Kirill Kravtsov (@nvarscar), nvarscar.wordpress.com + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/New-DbaDacOption + + .EXAMPLE + PS C:\> $options = New-DbaDacOption -Type Dacpac -Action Export + PS C:\> $options.ExtractAllTableData = $true + PS C:\> $options.CommandTimeout = 0 + PS C:\> Export-DbaDacPackage -SqlInstance sql2016 -Database DB1 -Options $options + + Uses DacOption object to set the CommandTimeout to 0 then extracts the dacpac for SharePoint_Config on sql2016 to C:\temp\SharePoint_Config.dacpac including all table data. + + .EXAMPLE + PS C:\> $options = New-DbaDacOption -Type Dacpac -Action Publish + PS C:\> $options.DeployOptions.DropObjectsNotInSource = $true + PS C:\> Publish-DbaDacPackage -SqlInstance sql2016 -Database DB1 -Options $options -Path c:\temp\db.dacpac + + Uses DacOption object to set Deployment Options and publish the db.dacpac dacpac file as DB1 on sql2016 + + #> + [CmdletBinding(SupportsShouldProcess)] + Param ( + [ValidateSet('Dacpac', 'Bacpac')] + [string]$Type = 'Dacpac', + [Parameter(Mandatory)] + [ValidateSet('Publish', 'Export')] + [string]$Action, + [string]$PublishXml, + [switch]$EnableException + ) + if ($PScmdlet.ShouldProcess("$type", "Creating New DacOptions of $action")) { + if (-not $script:core) { + $dacfxPath = "$script:PSModuleRoot\bin\smo\Microsoft.SqlServer.Dac.dll" + if ((Test-Path $dacfxPath) -eq $false) { + Stop-Function -Message 'Dac Fx library not found.' -EnableException $EnableException + return + } else { + try { + Add-Type -Path $dacfxPath + Write-Message -Level Verbose -Message "Dac Fx loaded." + } catch { + Stop-Function -Message 'No usable version of Dac Fx found.' -ErrorRecord $_ + return + } + } + } + + # Pick proper option object depending on type and action + if ($Action -eq 'Export') { + if ($Type -eq 'Dacpac') { + New-Object -TypeName Microsoft.SqlServer.Dac.DacExtractOptions + } elseif ($Type -eq 'Bacpac') { + New-Object -TypeName Microsoft.SqlServer.Dac.DacExportOptions + } + } elseif ($Action -eq 'Publish') { + if ($Type -eq 'Dacpac') { + $output = New-Object -TypeName Microsoft.SqlServer.Dac.PublishOptions + if ($PublishXml) { + try { + $dacProfile = [Microsoft.SqlServer.Dac.DacProfile]::Load($PublishXml) + $output.DeployOptions = $dacProfile.DeployOptions + } catch { + Stop-Function -Message "Could not load profile." -ErrorRecord $_ + return + } + } else { + $output.DeployOptions = New-Object -TypeName Microsoft.SqlServer.Dac.DacDeployOptions + } + $output.GenerateDeploymentScript = $false + $output + } elseif ($Type -eq 'Bacpac') { + New-Object -TypeName Microsoft.SqlServer.Dac.DacImportOptions + } + } + } +} +function New-DbaDacProfile { + <# + .SYNOPSIS + Creates a new Publish Profile. + + .DESCRIPTION + The New-DbaDacProfile command generates a standard publish profile xml file that can be used by the DacFx (this and everything else) to control the deployment of your dacpac + This generates a standard template XML which is enough to dpeloy a dacpac but it is highly recommended that you add additional options to the publish profile. + If you use Visual Studio you can open a publish.xml file and use the ui to edit the file - + To create a new file, right click on an SSDT project, choose "Publish" then "Load Profile" and load your profile or create a new one. + Once you have loaded it in Visual Studio, clicking advanced shows you the list of options available to you. + For a full list of options that you can add to the profile, google "sqlpackage.exe command line switches" or (https://msdn.microsoft.com/en-us/library/hh550080(v=vs.103).aspx) + + .PARAMETER SqlInstance + The target SQL Server instance or instances. Alternatively, you can provide a ConnectionString. + + .PARAMETER SqlCredential + Allows you to login to servers using alternative logins instead Integrated, accepts Credential object created by Get-Credential + + .PARAMETER Database + The database name you are targeting + + .PARAMETER ConnectionString + The connection string to the database you are upgrading. + + Alternatively, you can provide a SqlInstance (and optionally SqlCredential) and the script will connect and generate the connectionstring. + + .PARAMETER Path + The directory where you would like to save the profile xml file(s). + + .PARAMETER PublishOptions + Optional hashtable to set publish options. Key/value pairs in the hashtable get converted to strings of "value". + + .PARAMETER WhatIf + If this switch is enabled, no actions are performed but informational messages will be displayed that explain what would happen if the command were to run. + + .PARAMETER Confirm + If this switch is enabled, you will be prompted for confirmation before executing any operations that change state. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Dacpac + Author: Richie lee (@richiebzzzt) + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/New-DbaDacProfile + + .EXAMPLE + PS C:\> New-DbaDacProfile -SqlInstance sql2017 -SqlCredential ad\sqldba -Database WorldWideImporters -Path C:\temp + + In this example, a prompt will appear for alternative credentials, then a connection will be made to sql2017. Using that connection, + the ConnectionString will be extracted and used within the Publish Profile XML file which will be created at C:\temp\sql2017-WorldWideImporters-publish.xml + + .EXAMPLE + PS C:\> New-DbaDacProfile -Database WorldWideImporters -Path C:\temp -ConnectionString "SERVER=(localdb)\MSSQLLocalDB;Integrated Security=True;Database=master" + + In this example, no connections are made, and a Publish Profile XML would be created at C:\temp\localdb-MSSQLLocalDB-WorldWideImporters-publish.xml + + #> + [CmdletBinding(SupportsShouldProcess)] + param ( + [parameter(ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer")] + [DbaInstance[]]$SqlInstance, + [Alias("Credential")] + [PSCredential]$SqlCredential, + [Parameter(Mandatory)] + [string[]]$Database, + [string]$Path = "$home\Documents", + [string[]]$ConnectionString, + [hashtable]$PublishOptions, + [switch]$EnableException + ) + begin { + if ((Test-Bound -Not -ParameterName SqlInstance) -and (Test-Bound -Not -ParameterName ConnectionString)) { + Stop-Function -Message "You must specify either SqlInstance or ConnectionString" + } + + if (-not (Test-Path $Path)) { + Stop-Function -Message "$Path doesn't exist or access denied" + } + + if ((Get-Item $path) -isnot [System.IO.DirectoryInfo]) { + Stop-Function -Message "Path must be a directory" + } + + function Convert-HashtableToXMLString($PublishOptions) { + $return = @() + if ($PublishOptions) { + $PublishOptions.GetEnumerator() | ForEach-Object { + $key = $PSItem.Key.ToString() + $value = $PSItem.Value.ToString() + $return += "<$key>$value" + } + } + $return | Out-String + } + + function Get-Template ($db, $connstring) { + " + + + {0} + {1} + 1 + {2} + + " -f $db[0], $connstring, $(Convert-HashtableToXMLString($PublishOptions)) + } + + function Get-ServerName ($connstring) { + $builder = New-Object System.Data.Common.DbConnectionStringBuilder + $builder.set_ConnectionString($connstring) + $instance = $builder['data source'] + + if (-not $instance) { + $instance = $builder['server'] + } + + return $instance.ToString().Replace('\', '--') + } + } + process { + if (Test-FunctionInterrupt) { return } + + foreach ($instance in $sqlinstance) { + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $sqlcredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + $ConnectionString += $server.ConnectionContext.ConnectionString.Replace(';Application Name="dbatools PowerShell module - dbatools.io"', '') + + } + + foreach ($connstring in $ConnectionString) { + foreach ($db in $Database) { + if ($Pscmdlet.ShouldProcess($db, "Creating new DAC Profile")) { + $profileTemplate = Get-Template $db, $connstring + $instancename = Get-ServerName $connstring + + try { + $server = [DbaInstance]($instancename.ToString().Replace('--', '\')) + $PublishProfile = Join-Path $Path "$($instancename.Replace('--','-'))-$db-publish.xml" -ErrorAction Stop + Write-Message -Level Verbose -Message "Writing to $PublishProfile" + $profileTemplate | Out-File $PublishProfile -ErrorAction Stop + [pscustomobject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.InstanceName + SqlInstance = $server.FullName + Database = $db + FileName = $PublishProfile + ConnectionString = $connstring + ProfileTemplate = $profileTemplate + } | Select-DefaultView -ExcludeProperty ComputerName, InstanceName, ProfileTemplate + } catch { + Stop-Function -ErrorRecord $_ -Message "Failure" -Target $instancename -Continue + } + } + } + } + } + end { + Test-DbaDeprecation -DeprecatedOn "1.0.0" -EnableException:$false -Alias New-DbaPublishProfile + } +} +#ValidationTags#CodeStyle,Messaging,FlowControl,Pipeline# +function New-DbaDatabase { + <# + .SYNOPSIS + Creates a new database + + .DESCRIPTION + This command creates a new database. + + It allows creation with multiple files, and sets all growth settings to be fixed size rather than percentage growth. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Name + The name of the new database or databases to be created. + + .PARAMETER DataFilePath + The location that data files will be placed, otherwise the default SQL Server data path will be used. + + .PARAMETER LogFilePath + The location the log file will be placed, otherwise the default SQL Server log path will be used. + + .PARAMETER Collation + The database collation, if not supplied the default server collation will be used. + + .PARAMETER Recoverymodel + The recovery model for the database, if not supplied the recovery model from the model database will be used. + + .PARAMETER Owner + The login that will be used as the database owner. + + .PARAMETER PrimaryFilesize + The size in MB for the Primary file. If this is less than the primary file size for the model database, then the model size will be used instead. + + .PARAMETER PrimaryFileGrowth + The size in MB that the Primary file will autogrow by. + + .PARAMETER PrimaryFileMaxSize + The maximum permitted size in MB for the Primary File. If this is less the primary file size for the model database, then the model size will be used instead. + + .PARAMETER LogSize + The size in MB that the Transaction log will be created. + + .PARAMETER LogGrowth + The amount in MB that the log file will be set to autogrow by. + + .PARAMETER SecondaryFileCount + The number of files to create in the Secondary filegroup for the database. + + .PARAMETER SecondaryFilesize + The size in MB of the files to be added to the Secondary filegroup. Each file added will be created with this size setting. + + .PARAMETER SecondaryFileMaxSize + The maximum permitted size in MB for the Secondary data files to grow to. Each file added will be created with this max size setting. + + .PARAMETER SecondaryFileGrowth + The amount in MB that the Secondary files will be set to autogrow by. Use 0 for no growth allowed. Each file added will be created with this growth setting. + + .PARAMETER DefaultFileGroup + Sets the default file group. Either primary or secondary. + + .PARAMETER WhatIf + If this switch is enabled, no actions are performed but informational messages will be displayed that explain what would happen if the command were to run. + + .PARAMETER Confirm + If this switch is enabled, you will be prompted for confirmation before executing any operations that change state. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Database + Author: Matthew Darwin (@evoDBA, naturalselectiondba.wordpress.com) | Chrissy LeMaire (@cl) + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/New-DbaDatabase + + .EXAMPLE + New-DbaDatabase -SqlInstance sql1 + + Creates a randomly named database (random-N) on instance sql1 + + .EXAMPLE + New-DbaDatabase -SqlInstance sql1 -Name dbatools, dbachecks + + Creates a database named dbatools and a database named dbachecks on sql1 + + .EXAMPLE + New-DbaDatabase -SqlInstance sql1, sql2, sql3 -Name multidb, multidb2 -SecondaryFilesize 20 -SecondaryFileGrowth 20 -LogSize 20 -LogGrowth 20 + + Creates two databases, multidb and multidb2, on 3 instances (sql1, sql2 and sql3) and sets the secondary data file size to 20MB, the file growth to 20MB and the log growth to 20MB for each + + .EXAMPLE + New-DbaDatabase -SqlInstance sql1 -Name nondefault -DataFilePath M:\Data -LogFilePath 'L:\Logs with spaces' -SecondaryFileCount 2 + + Creates a database named nondefault and places data files in in the M:\data directory and log files in "L:\Logs with spaces". + + Creates a secondary group with 2 files in the Secondary filegroup. + + #> + [Cmdletbinding(SupportsShouldProcess, ConfirmImpact = "Low")] + param + ( + [parameter(Mandatory, ValueFromPipeline)] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [string[]]$Name, + [string]$Collation, + [string]$Recoverymodel, + [string]$Owner, + [string]$DataFilePath, + [string]$LogFilePath, + [int32]$PrimaryFilesize, + [int32]$PrimaryFileGrowth, + [int32]$PrimaryFileMaxSize, + [int32]$LogSize, + [int32]$LogGrowth, + [int32]$SecondaryFilesize, + [int32]$SecondaryFileGrowth, + [int32]$SecondaryFileMaxSize, + [int32]$SecondaryFileCount, + [ValidateSet('Primary', 'Secondary')] + [string]$DefaultFileGroup, + [switch]$EnableException + ) + + begin { + # do some checks to see if the advanced config settings will be invoked + if (Test-Bound -ParameterName DataFilePath, LogFilePath, DefaultFileGroup) { + $advancedconfig = $true + } + + if (Test-Bound -ParameterName PrimaryFilesize, PrimaryFileGrowth, PrimaryFileMaxSize) { + $advancedconfig = $true + } + + if (Test-Bound -ParameterName LogSize, LogGrowth) { + $advancedconfig = $true + } + + if (Test-Bound -ParameterName SecondaryFilesize, SecondaryFileMaxSize, SecondaryFileGrowth, SecondaryFileCount) { + $advancedconfig = $true + } + + if ($advancedconfig) { + Write-Message -Message "Advanced data file configuration will be invoked" -Level Verbose + } + } + + process { + if (Test-FunctionInterrupt) { + return + } + + foreach ($instance in $SqlInstance) { + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $sqlcredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + if ($advancedconfig -and $server.VersionMajor -eq 8) { + Stop-Function -Message "Advanced configuration options are not available to SQL Server 2000. Aborting creation of database on $instance" -Target $instance -Continue + } + + if (-not (Test-Bound -ParameterName Name)) { + $Name = "random-$(Get-Random)" + } + + if (-not (Test-Bound -ParameterName DataFilePath)) { + $DataFilePath = (Get-DbaDefaultPath -SqlInstance $server).Data + } + + if (-not (Test-Bound -ParameterName LogFilePath)) { + $LogFilePath = (Get-DbaDefaultPath -SqlInstance $server).Log + } + + if (-not (Test-DbaPath -SqlInstance $server -Path $LogFilePath)) { + try { + Write-Message -Message "Creating directory $LogFilePath" -Level Verbose + $null = New-DbaDirectory -SqlInstance $server -Path $LogFilePath -EnableException + } catch { + Stop-Function -Message "Error creating log file directory $LogFilePath" -Target $instance -Continue + } + } + + if (-not (Test-DbaPath -SqlInstance $server -Path $DataFilePath)) { + try { + Write-Message -Message "Creating directory $DataFilePath" -Level Verbose + $null = New-DbaDirectory -SqlInstance $server -Path $DataFilePath -EnableException + } catch { + Stop-Function -Message "Error creating secondary file directory $DataFilePath on $instance" -Target $instance -Continue + } + } + + Write-Message -Message "Set local data path to $DataFilePath and local log path to $LogFilePath" -Level Verbose + + foreach ($dbname in $Name) { + if ($server.Databases[$dbname].Name) { + Stop-Function -Message "Database $dbname already exists on $instance" -Target $instance -Continue + } + + try { + Write-Message -Message "Creating smo object for new database $dbname" -Level Verbose + $newdb = New-Object Microsoft.SqlServer.Management.Smo.Database($server, $dbname) + } catch { + Stop-Function -Message "Error creating database object for $dbname on server $server" -ErrorRecord $_ -Target $instance -Continue + } + + if ($Collation) { + Write-Message -Message "Setting collation to $Collation" -Level Verbose + $newdb.Collation = $Collation + } + + if ($Recoverymodel) { + Write-Message -Message "Setting recovery model to $Recoverymodel" -Level Verbose + $newdb.Recoverymodel = $Recoverymodel + } + + if ($advancedconfig) { + try { + Write-Message -Message "Creating PRIMARY filegroup" -Level Verbose + $primaryfg = New-Object Microsoft.SqlServer.Management.Smo.Filegroup($newdb, "PRIMARY") + $newdb.Filegroups.Add($primaryfg) + } catch { + Stop-Function -Message "Error creating Primary filegroup object" -ErrorRecord $_ -Target $instance -Continue + } + + #add the primary file + try { + $primaryfilename = $dbname + "_PRIMARY" + Write-Message -Message "Creating file name $primaryfilename in filegroup PRIMARY" -Level Verbose + + #check the size of the modeldev file; if larger than our $PrimaryFilesize setting use that instead + if ($server.Databases["model"].FileGroups["PRIMARY"].Files["modeldev"].Size -gt ($PrimaryFilesize * 1024)) { + Write-Message -Message "model database modeldev larger than our the PrimaryFilesize so using modeldev size for Primary file" -Level Verbose + $PrimaryFilesize = ($server.Databases["model"].FileGroups["PRIMARY"].Files["modeldev"].Size / 1024) + if ($PrimaryFilesize -gt $PrimaryFileMaxSize) { + Write-Message -Message "Resetting Primary File Max size to be the new Primary File Size setting" -Level Verbose + $PrimaryFileMaxSize = $PrimaryFilesize + } + } + + #create the filegroup object + $primaryfile = New-Object Microsoft.SqlServer.Management.Smo.DataFile($primaryfg, $primaryfilename) + $primaryfile.FileName = $DataFilePath + "\" + $primaryfilename + ".mdf" + $primaryfile.IsPrimaryFile = $true + + if (Test-Bound -ParameterName PrimaryFilesize) { + $primaryfile.Size = ($PrimaryFilesize * 1024) + } + if (Test-Bound -ParameterName PrimaryFileGrowth) { + $primaryfile.Growth = ($PrimaryFileGrowth * 1024) + $primaryfile.GrowthType = "KB" + } + if (Test-Bound -ParameterName PrimaryFileMaxSize) { + $primaryfile.MaxSize = ($PrimaryFileMaxSize * 1024) + } + + #add the file to the filegroup + $primaryfg.Files.Add($primaryfile) + } catch { + Stop-Function -Message "Error adding file to Primary filegroup" -ErrorRecord $_ -Target $instance -Continue + } + + try { + $logname = $dbname + "_Log" + Write-Message -Message "Creating log $logname" -Level Verbose + + #check the size of the modellog file; if larger than our $LogSize setting use that instead + if ($server.Databases["model"].LogFiles["modellog"].Size -gt ($LogSize * 1024)) { + Write-Message -Message "model database modellog larger than our the LogSize so using modellog size for Log file size" -Level Verbose + $LogSize = ($server.Databases["model"].LogFiles["modellog"].Size / 1024) + } + + $tlog = New-Object Microsoft.SqlServer.Management.Smo.LogFile($newdb, $logname) + $tlog.FileName = $LogFilePath + "\" + $logname + ".ldf" + + if (Test-Bound -ParameterName LogSize) { + $tlog.Size = ($LogSize * 1024) + } + if (Test-Bound -ParameterName LogGrowth) { + $tlog.Growth = ($LogGrowth * 1024) + $tlog.GrowthType = "KB" + } + + #add the log to the db + $newdb.LogFiles.Add($tlog) + } catch { + Stop-Function -Message "Error adding log file to database." -ErrorRecord $_ -Target $instance -Continue + } + + if (Test-Bound -ParameterName SecondaryFileMaxSize, SecondaryFileGrowth, SecondaryFilesize) { + #add the Secondary data file group + try { + $secondaryfilegroupname = $dbname + "_MainData" + Write-Message -Message "Creating Secondary filegroup $secondaryfilegroupname" -Level Verbose + + $secondaryfg = New-Object Microsoft.SqlServer.Management.Smo.Filegroup($newdb, $secondaryfilegroupname) + $newdb.Filegroups.Add($secondaryfg) + } catch { + Stop-Function -Message "Error creating Secondary filegroup" -ErrorRecord $_ -Target $instance -Continue + } + + # add the required number of files to the filegroup in a loop + $secondaryfgcount = $bail = 0 + + # open a loop while the filecounter is less than the required number of files + do { + $secondaryfgcount++ + try { + $secondaryfilename = "$($secondaryfilegroupname)_$($secondaryfgcount)" + Write-Message -Message "Creating file name $secondaryfilename in filegroup $secondaryfilegroupname" -Level Verbose + $secondaryfile = New-Object Microsoft.SQLServer.Management.Smo.Datafile($secondaryfg, $secondaryfilename) + $secondaryfile.FileName = $DataFilePath + "\" + $secondaryfilename + ".ndf" + + if (Test-Bound -ParameterName SecondaryFilesize) { + $secondaryfile.Size = ($SecondaryFilesize * 1024) + } + if (Test-Bound -ParameterName SecondaryFileGrowth) { + $secondaryfile.Growth = ($SecondaryFileGrowth * 1024) + $secondaryfile.GrowthType = "KB" + } + if (Test-Bound -ParameterName SecondaryFileMaxSize) { + $secondaryfile.MaxSize = ($SecondaryFileMaxSize * 1024) + } + + $secondaryfg.Files.Add($secondaryfile) + } catch { + $bail = $true + Stop-Function -Message "Error adding file $secondaryfg to $secondaryfilegroupname" -ErrorRecord $_ -Target $instance + return + } + } while ($secondaryfgcount -le $SecondaryFileCount -or $bail) + } + } + + Write-Message -Message "Creating Database $dbname" -Level Verbose + if ($PSCmdlet.ShouldProcess($instance, "Creating the database $dbname on instance $instance")) { + try { + $newdb.Create() + } catch { + Stop-Function -Message "Error creating Database $dbname on server $instance" -ErrorRecord $_ -Target $instance -Continue + } + + if ($Owner) { + Write-Message -Message "Setting database owner to $Owner" -Level Verbose + try { + $newdb.SetOwner($Owner) + } catch { + Stop-Function -Message "Error setting Database Owner to $Owner" -ErrorRecord $_ -Target $instance -Continue + } + } + + if ($DefaultFileGroup -eq "Secondary") { + Write-Message -Message "Setting default filegroup to $secondaryfilegroupname" -Level Verbose + try { + $newdb.SetDefaultFileGroup($secondaryfilegroupname) + } catch { + Stop-Function -Message "Error setting default filegorup to $secondaryfilegroupname" -ErrorRecord $_ -Target $instance -Continue + } + } + + Get-DbaDatabase -SqlInstance $server -Database $dbname + } + } + } + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function New-DbaDbCertificate { + <# + .SYNOPSIS + Creates a new database certificate + + .DESCRIPTION + Creates a new database certificate. If no database is specified, the certificate will be created in master. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. + + .PARAMETER SqlCredential + Allows you to login to SQL Server using alternative credentials. + + .PARAMETER Database + The database where the certificate will be created. Defaults to master. + + .PARAMETER Name + Optional name to create the certificate. Defaults to database name. + + .PARAMETER Subject + Optional subject to create the certificate. + + .PARAMETER StartDate + Optional secure string used to create the certificate. + + .PARAMETER ExpirationDate + Optional secure string used to create the certificate. + + .PARAMETER ActiveForServiceBrokerDialog + Optional secure string used to create the certificate. + + .PARAMETER SecurePassword + Optional password - if no password is supplied, the password will be protected by the master key + + .PARAMETER InputObject + Enables piping from Get-DbaDatabase + + .PARAMETER WhatIf + Shows what would happen if the command were to run. No actions are actually performed. + + .PARAMETER Confirm + Prompts you for confirmation before executing any changing operations within the command. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Certificate + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .EXAMPLE + PS C:\> New-DbaDbCertificate -SqlInstance Server1 + + You will be prompted to securely enter your password, then a certificate will be created in the master database on server1 if it does not exist. + + .EXAMPLE + PS C:\> New-DbaDbCertificate -SqlInstance Server1 -Database db1 -Confirm:$false + + Suppresses all prompts to install but prompts to securely enter your password and creates a certificate in the 'db1' database + + #> + [CmdletBinding(SupportsShouldProcess, ConfirmImpact = "Low")] + param ( + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [string[]]$Name, + [string[]]$Database = "master", + [string[]]$Subject, + [datetime]$StartDate = (Get-Date), + [datetime]$ExpirationDate = $StartDate.AddYears(5), + [switch]$ActiveForServiceBrokerDialog, + [Alias("Password")] + [Security.SecureString]$SecurePassword, + [parameter(ValueFromPipeline)] + [Microsoft.SqlServer.Management.Smo.Database[]]$InputObject, + [switch]$EnableException + ) + begin { + Test-DbaDeprecation -DeprecatedOn "1.0.0" -Alias New-DbaDatabaseCertificate + } + process { + if ($SqlInstance) { + $InputObject += Get-DbaDatabase -SqlInstance $SqlInstance -SqlCredential $SqlCredential -Database $Database + } + + foreach ($db in $InputObject) { + if ((Test-Bound -Not -ParameterName Name)) { + Write-Message -Level Verbose -Message "Name of certificate not specified, setting it to '$db'" + $Name = $db.Name + } + + if ((Test-Bound -Not -ParameterName Subject)) { + Write-Message -Level Verbose -Message "Subject not specified, setting it to '$Name Database Certificate'" + $subject = "$Name Database Certificate" + } + + foreach ($cert in $Name) { + if ($null -ne $db.Certificates[$cert]) { + Stop-Function -Message "Certificate '$cert' already exists in $($db.Name) on $($db.Parent.Name)" -Target $db -Continue + } + + if ($Pscmdlet.ShouldProcess($db.Parent.Name, "Creating certificate for database '$($db.Name)'")) { + + # something is up with .net, force a stop + $eap = $ErrorActionPreference + $ErrorActionPreference = 'Stop' + try { + $smocert = New-Object -TypeName Microsoft.SqlServer.Management.Smo.Certificate $db, $cert + $smocert.StartDate = $StartDate + $smocert.Subject = $Subject + $smocert.ExpirationDate = $ExpirationDate + $smocert.ActiveForServiceBrokerDialog = $ActiveForServiceBrokerDialog + + if ($SecurePassword) { + $smocert.Create(([System.Runtime.InteropServices.marshal]::PtrToStringAuto([System.Runtime.InteropServices.marshal]::SecureStringToBSTR($SecurePassword)))) + } else { + $smocert.Create() + } + + Add-Member -Force -InputObject $smocert -MemberType NoteProperty -Name ComputerName -value $db.Parent.ComputerName + Add-Member -Force -InputObject $smocert -MemberType NoteProperty -Name InstanceName -value $db.Parent.ServiceName + Add-Member -Force -InputObject $smocert -MemberType NoteProperty -Name SqlInstance -value $db.Parent.DomainInstanceName + Add-Member -Force -InputObject $smocert -MemberType NoteProperty -Name Database -value $db.Name + + Select-DefaultView -InputObject $smocert -Property ComputerName, InstanceName, SqlInstance, Database, Name, Subject, StartDate, ActiveForServiceBrokerDialog, ExpirationDate, Issuer, LastBackupDate, Owner, PrivateKeyEncryptionType, Serial + } catch { + $ErrorActionPreference = $eap + Stop-Function -Message "Failed to create certificate in $($db.Name) on $($db.Parent.Name)" -Target $smocert -ErrorRecord $_ -Continue + } + $ErrorActionPreference = $eap + } + } + } + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function New-DbaDbMailProfile { + <# + .SYNOPSIS + Creates a new database mail profile + + .DESCRIPTION + Creates a new database mail profile, and optionally associates it to a database mail account + + .PARAMETER SqlInstance + The target SQL Server instance or instances. You must have sysadmin access and server version must be SQL Server version 2008 or higher. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Name + The Name of the profile to be created. + + .PARAMETER Description + Sets the description of the purpose of the mail profile. + + .PARAMETER MailAccountName + Associates a db mail account to link to this db mail profile. + + .PARAMETER MailAccountPriority + Sets the priority of the linked db mail account when linking to this db mail profile. + + .PARAMETER WhatIf + If this switch is enabled, no actions are performed but informational messages will be displayed that explain what would happen if the command were to run. + + .PARAMETER Confirm + If this switch is enabled, you will be prompted for confirmation before executing any operations that change state. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: DbMail + Author: Ian Lanham (@ilanham) + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/New-DbaDbMailProfile + + .EXAMPLE + PS C:\> $profile = New-DbaDbMailProfile -SqlInstance sql2017 -Name 'The DBA Team' + + Creates a new db mail profile + + #> + [CmdletBinding(SupportsShouldProcess, ConfirmImpact = "Low")] + param ( + [parameter(Mandatory, ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [parameter(Mandatory)] + [string]$Name, + [string]$Description, + [string]$MailAccountName, + [int]$MailAccountPriority, + [switch]$EnableException + ) + process { + foreach ($instance in $SqlInstance) { + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential -MinimumVersion 11 + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + if ($Pscmdlet.ShouldProcess($instance, "Creating new db mail profile called $Name")) { + try { + $profile = New-Object Microsoft.SqlServer.Management.SMO.Mail.MailProfile $server.Mail, $Name + if (Test-Bound -ParameterName 'Description') { + $profile.Description = $Description + } + $profile.Create() + if (Test-Bound -ParameterName 'MailAccountName') { + if (!$MailAccountPriority) { + $MailAccountPriority = 1 + } + $profile.AddAccount($MailAccountName, $MailAccountPriority) # sequenceNumber correlates to "Priority" when associating a db mail Account to a db mail Profile + } + Add-Member -Force -InputObject $profile -MemberType NoteProperty -Name ComputerName -value $server.ComputerName + Add-Member -Force -InputObject $profile -MemberType NoteProperty -Name InstanceName -value $server.ServiceName + Add-Member -Force -InputObject $profile -MemberType NoteProperty -Name SqlInstance -value $server.DomainInstanceName + + $profile | Select-DefaultView -Property ComputerName, InstanceName, SqlInstance, Id, Name, Description, IsBusyProfile + } catch { + Stop-Function -Message "Failure" -ErrorRecord $_ -Continue + } + } + } + } +} +function New-DbaDbMaskingConfig { + <# + .SYNOPSIS + Generates a new data masking configuration file to be used with Invoke-DbaDbDataMasking + + .DESCRIPTION + Generates a new data masking configuration file. This file is important to apply any data masking to the data in a database. + + Note that the following column and data types are not currently supported: + Identity + ForeignKey + Computed + Hierarchyid + Geography + Geometry + Xml + + Read more here: + https://sachabarbs.wordpress.com/2018/06/11/bogus-simple-fake-data-tool/ + https://github.com/bchavez/Bogus + + .PARAMETER SqlInstance + The target SQL Server instance or instances. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Database + Databases to process through + + .PARAMETER Table + Tables to process. By default all the tables will be processed + + .PARAMETER Column + Columns to process. By default all the columns will be processed + + .PARAMETER Path + Path where to save the generated JSON files. + Th naming convention will be "servername.databasename.tables.json" + + .PARAMETER Locale + Set the local to enable certain settings in the masking + + .PARAMETER Force + Forcefully execute commands when needed + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: DataMasking, Database + Author: Sander Stad (@sqlstad, sqlstad.nl) | Chrissy LeMaire (@cl, netnerds.net) + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/New-DbaDbMaskingConfig + + .EXAMPLE + New-DbaDbMaskingConfig -SqlInstance SQLDB1 -Database DB1 -Path C:\Temp\clone + + Process all tables and columns for database DB1 on instance SQLDB1 + + .EXAMPLE + New-DbaDbMaskingConfig -SqlInstance SQLDB1 -Database DB1 -Table Customer -Path C:\Temp\clone + + Process only table Customer with all the columns + + .EXAMPLE + New-DbaDbMaskingConfig -SqlInstance SQLDB1 -Database DB1 -Table Customer -Column City -Path C:\Temp\clone + + Process only table Customer and only the column named "City" + + #> + [CmdLetBinding()] + param ( + [parameter(Mandatory)] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [string[]]$Database, + [string[]]$Table, + [string[]]$Column, + [parameter(Mandatory)] + [string]$Path, + [string]$Locale = 'en', + [switch]$Force, + [switch]$EnableException + ) + begin { + + # Get all the different column types + try { + $columnTypes = Get-Content -Path "$script:PSModuleRoot\bin\datamasking\columntypes.json" | ConvertFrom-Json + } catch { + Stop-Function -Message "Something went wrong importing the column types" -ErrorRecord $_ -Continue + } + # Check if the Path is accessible + if (-not (Test-Path -Path $Path)) { + try { + $null = New-Item -Path $Path -ItemType Directory -Force:$Force + } catch { + Stop-Function -Message "Could not create Path directory" -ErrorRecord $_ -Target $Path + } + } else { + if ((Get-Item $path) -isnot [System.IO.DirectoryInfo]) { + Stop-Function -Message "$Path is not a directory" + } + } + + $supportedDataTypes = 'bit', 'bool', 'char', 'date', 'datetime', 'datetime2', 'decimal', 'int', 'money', 'nchar', 'ntext', 'nvarchar', 'smalldatetime', 'text', 'time', 'uniqueidentifier', 'userdefineddatatype', 'varchar' + } + + process { + if (Test-FunctionInterrupt) { + return + } + + if ($SqlInstance) { + $InputObject += Get-DbaDatabase -SqlInstance $SqlInstance -SqlCredential $SqlCredential -Database $Database + } + + $results = @() + foreach ($db in $InputObject) { + $server = $db.Parent + $tables = @() + + # Get the tables + if ($Table) { + $tablecollection = $db.Tables | Where-Object Name -in $Table + } else { + $tablecollection = $db.Tables + } + + if ($tablecollection.Count -lt 1) { + Stop-Function -Message "The database does not contain any tables" -Target $db -Continue + } + + # Loop through the tables + foreach ($tableobject in $tablecollection) { + Write-Message -Message "Processing table $($tableobject.Name)" -Level Verbose + + $hasUniqueIndex = $false + + if ($tableobject.Indexes.IsUnique) { + $hasUniqueIndex = $true + } + + $columns = @() + + # Get the columns + if ($Column) { + [array]$columncollection = $tableobject.Columns | Where-Object Name -in $Column + } else { + [array]$columncollection = $tableobject.Columns + } + + foreach ($columnobject in $columncollection) { + # Skip incompatible columns + if ($columnobject.Identity) { + Write-Message -Level Verbose -Message "Skipping $columnobject because it is an identity column" + continue + } + + if ($columnobject.IsForeignKey) { + Write-Message -Level Verbose -Message "Skipping $columnobject because it is a foreign key" + continue + } + + if ($columnobject.Computed) { + Write-Message -Level Verbose -Message "Skipping $columnobject because it is a computed column" + continue + } + + if ($server.VersionMajor -ge 13 -and $columnobject.GeneratedAlwaysType -ne 'None') { + Write-Message -Level Verbose -Message "Skipping $columnobject because it is a computed column for temporal tables" + continue + } + + if ($columnobject.DataType.Name -notin $supportedDataTypes) { + Write-Message -Level Verbose -Message "Skipping $columnobject because it is not a supported data type" + continue + } + + if ($columnobject.DataType.SqlDataType.ToString().ToLower() -eq 'xml') { + Write-Message -Level Verbose -Message "Skipping $columnobject because it is a xml column" + continue + } + + $maskingType = $min = $null + $columnLength = $columnobject.Datatype.MaximumLength + $columnType = $columnobject.DataType.SqlDataType.ToString().ToLower() + + if ($columnobject.InPrimaryKey -and $columnobject.DataType.SqlDataType.ToString().ToLower() -notmatch 'date') { + $min = 2 + } + if (-not $columnType) { + $columnType = $columnobject.DataType.Name.ToLower() + } + + # Get the masking type with the synonym + $maskingType = $columnTypes | Where-Object { + $columnobject.Name -in $_.Synonym + } + + if ($maskingType) { + # Make it easier to get the type name + $maskingType = $maskingType | Select-Object TypeName -ExpandProperty TypeName + + switch ($maskingType.ToLower()) { + "address" { + $columns += [PSCustomObject]@{ + Name = $columnobject.Name + ColumnType = $columnType + CharacterString = $null + MinValue = $min + MaxValue = $columnLength + MaskingType = "Address" + SubType = "StreetAddress" + Format = $null + Deterministic = $false + Nullable = $columnobject.Nullable + } + } + "bic" { + $columns += [PSCustomObject]@{ + Name = $columnobject.Name + ColumnType = $columnType + CharacterString = $null + MinValue = $min + MaxValue = $columnLength + MaskingType = "Finance" + SubType = "Bic" + Format = $null + Deterministic = $false + Nullable = $columnobject.Nullable + } + } + "bitcoin" { + $columns += [PSCustomObject]@{ + Name = $columnobject.Name + ColumnType = $columnType + CharacterString = $null + MinValue = $min + MaxValue = $columnLength + MaskingType = "Finance" + SubType = "BitcoinAddress" + Format = $null + Deterministic = $false + Nullable = $columnobject.Nullable + } + } + "country" { + $columns += [PSCustomObject]@{ + Name = $columnobject.Name + ColumnType = $columnType + CharacterString = $null + MinValue = $min + MaxValue = $columnLength + MaskingType = "Address" + SubType = "Country" + Format = $null + Deterministic = $false + Nullable = $columnobject.Nullable + } + } + "countrycode" { + $columns += [PSCustomObject]@{ + Name = $columnobject.Name + ColumnType = $columnType + CharacterString = $null + MinValue = $min + MaxValue = $columnLength + MaskingType = "Address" + SubType = "CountryCode" + Format = $null + Deterministic = $false + Nullable = $columnobject.Nullable + } + } + "ethereum" { + $columns += [PSCustomObject]@{ + Name = $columnobject.Name + ColumnType = $columnType + CharacterString = $null + MinValue = $min + MaxValue = $columnLength + MaskingType = "Finance" + SubType = "EthereumAddress" + Format = $null + Deterministic = $false + Nullable = $columnobject.Nullable + } + } + "city" { + $columns += [PSCustomObject]@{ + Name = $columnobject.Name + ColumnType = $columnType + CharacterString = $null + MinValue = $min + MaxValue = $columnLength + MaskingType = "Address" + SubType = "City" + Format = $null + Deterministic = $false + Nullable = $columnobject.Nullable + } + } + "creditcardcvv" { + $columns += [PSCustomObject]@{ + Name = $columnobject.Name + ColumnType = $columnType + CharacterString = $null + MinValue = $min + MaxValue = $columnLength + MaskingType = "Finance" + SubType = "CreditCardCvv" + Format = $null + Deterministic = $false + Nullable = $columnobject.Nullable + } + } + "company" { + $columns += [PSCustomObject]@{ + Name = $columnobject.Name + ColumnType = $columnType + CharacterString = $null + MinValue = $min + MaxValue = $columnLength + MaskingType = "Company" + SubType = "CompanyName" + Format = $null + Deterministic = $false + Nullable = $columnobject.Nullable + } + } + "creditcard" { + $columns += [PSCustomObject]@{ + Name = $columnobject.Name + ColumnType = $columnType + CharacterString = $null + MinValue = $min + MaxValue = $columnLength + MaskingType = "Finance" + SubType = "CreditcardNumber" + Format = $null + Deterministic = $false + Nullable = $columnobject.Nullable + } + } + "email" { + $columns += [PSCustomObject]@{ + Name = $columnobject.Name + ColumnType = $columnType + CharacterString = $null + MinValue = $min + MaxValue = $columnLength + MaskingType = "Internet" + SubType = "Email" + Format = $null + Deterministic = $false + Nullable = $columnobject.Nullable + } + } + "firstname" { + $columns += [PSCustomObject]@{ + Name = $columnobject.Name + ColumnType = $columnType + CharacterString = $null + MinValue = $min + MaxValue = $columnLength + MaskingType = "Name" + SubType = "Firstname" + Format = $null + Deterministic = $false + Nullable = $columnobject.Nullable + } + } + "fullname" { + $columns += [PSCustomObject]@{ + Name = $columnobject.Name + ColumnType = $columnType + CharacterString = $null + MinValue = $min + MaxValue = $columnLength + MaskingType = "Name" + SubType = "FullName" + Format = $null + Deterministic = $false + Nullable = $columnobject.Nullable + } + } + "iban" { + $columns += [PSCustomObject]@{ + Name = $columnobject.Name + ColumnType = $columnType + CharacterString = $null + MinValue = $min + MaxValue = $columnLength + MaskingType = "Finance" + SubType = "Iban" + Format = $null + Deterministic = $false + Nullable = $columnobject.Nullable + } + } + "lastname" { + $columns += [PSCustomObject]@{ + Name = $columnobject.Name + ColumnType = $columnType + CharacterString = $null + MinValue = $min + MaxValue = $columnLength + MaskingType = "Name" + SubType = "Lastname" + Format = $null + Deterministic = $false + Nullable = $columnobject.Nullable + } + } + "latitude" { + $columns += [PSCustomObject]@{ + Name = $columnobject.Name + ColumnType = $columnType + CharacterString = $null + MinValue = $min + MaxValue = $columnLength + MaskingType = "Address" + SubType = "Latitude" + Format = $null + Deterministic = $false + Nullable = $columnobject.Nullable + } + } + "longitude" { + $columns += [PSCustomObject]@{ + Name = $columnobject.Name + ColumnType = $columnType + CharacterString = $null + MinValue = $min + MaxValue = $columnLength + MaskingType = "Address" + SubType = "Longitude" + Format = $null + Deterministic = $false + Nullable = $columnobject.Nullable + } + } + "phone" { + $columns += [PSCustomObject]@{ + Name = $columnobject.Name + ColumnType = $columnType + CharacterString = $null + MinValue = $min + MaxValue = $columnLength + MaskingType = "Phone" + SubType = "PhoneNumber" + Format = $null + Deterministic = $false + Nullable = $columnobject.Nullable + } + } + "state" { + $columns += [PSCustomObject]@{ + Name = $columnobject.Name + ColumnType = $columnType + CharacterString = $null + MinValue = $min + MaxValue = $columnLength + MaskingType = "Address" + SubType = "State" + Format = $null + Deterministic = $false + Nullable = $columnobject.Nullable + } + } + "stateabbr" { + $columns += [PSCustomObject]@{ + Name = $columnobject.Name + ColumnType = $columnType + CharacterString = $null + MinValue = $min + MaxValue = $columnLength + MaskingType = "Address" + SubType = "StateAbbr" + Format = $null + Deterministic = $false + Nullable = $columnobject.Nullable + } + } + "zipcode" { + $columns += [PSCustomObject]@{ + Name = $columnobject.Name + ColumnType = $columnType + CharacterString = $null + MinValue = $min + MaxValue = $columnLength + MaskingType = "Address" + SubType = "Zipcode" + Format = $null + Deterministic = $false + Nullable = $columnobject.Nullable + } + } + "username" { + $columns += [PSCustomObject]@{ + Name = $columnobject.Name + ColumnType = $columnType + CharacterString = $null + MinValue = $min + MaxValue = $columnLength + MaskingType = "Internet" + SubType = "UserName" + Format = $null + Deterministic = $false + Nullable = $columnobject.Nullable + } + } + } + } else { + $type = "Random" + + switch ($columnType) { + { + $_ -in "bit", "bool" + } { + $subType = "Bool" + $MaxValue = $null + } + "bigint" { + $subType = "Number" + $MaxValue = 9223372036854775807 + } + "int" { + $subType = "Number" + $MaxValue = 2147483647 + } + "date" { + $subType = "Date" + $MaxValue = $null + } + "datetime" { + $subType = "Date" + $MaxValue = $null + } + "datetime2" { + $subType = "Date" + $MaxValue = $null + } + "decimal" { + $subType = "Decimal" + $MaxValue = $null + } + "float" { + $subType = "Float" + $MaxValue = $null + } + "money" { + $type = "Commerce" + $subType = "Price" + $min = -922337203685477.5808 + $MaxValue = 922337203685477.5807 + } + "smallint" { + $subType = "Number" + $MaxValue = 32767 + } + "smalldatetime" { + $subType = "Date" + $MaxValue = $null + } + "text" { + $subType = "String" + $maxValue = 2147483647 + } + "tinyint" { + $subType = "Number" + $MaxValue = 255 + } + "varbinary" { + $subType = "Byte" + $MaxValue = $columnLength + } + "userdefineddatatype" { + if ($columnLength -eq 1) { + $subType = "Bool" + $MaxValue = $columnLength + } else { + $subType = "String" + $MaxValue = $columnLength + } + } + default { + $subType = "String" + $MaxValue = $columnLength + } + } + + $columns += [PSCustomObject]@{ + Name = $columnobject.Name + ColumnType = $columnType + CharacterString = $null + MinValue = $min + MaxValue = $MaxValue + MaskingType = $type + SubType = $subType + Format = $null + Deterministic = $false + Nullable = $columnobject.Nullable + } + } + } + + + # Check if something needs to be generated + if ($columns) { + $tables += [PSCustomObject]@{ + Name = $tableobject.Name + Schema = $tableobject.Schema + Columns = $columns + HasUniqueIndex = $hasUniqueIndex + } + } else { + Write-Message -Message "No columns match for masking in table $($tableobject.Name)" -Level Verbose + } + } + + # Check if something needs to be generated + if ($tables) { + $results += [PSCustomObject]@{ + Name = $db.Name + Tables = $tables + } + } else { + Write-Message -Message "No columns match for masking in table $($tableobject.Name)" -Level Verbose + } + } + + # Write the data to the Path + if ($results) { + try { + $temppath = "$Path\$($server.Name.Replace('\', '$')).$($db.Name).tables.json" + if (-not $script:isWindows) { + $temppath = $temppath.Replace("\", "/") + } + Set-Content -Path $temppath -Value ($results | ConvertTo-Json -Depth 5) + Get-ChildItem -Path $temppath + } catch { + Stop-Function -Message "Something went wrong writing the results to the $Path" -Target $Path -Continue -ErrorRecord $_ + } + } else { + Write-Message -Message "No tables to save for database $($db.Name) on $($server.Name)" -Level Verbose + } + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function New-DbaDbMasterKey { + <# + .SYNOPSIS + Creates a new database master key + + .DESCRIPTION + Creates a new database master key. If no database is specified, the master key will be created in master. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. + + .PARAMETER SqlCredential + Allows you to login to SQL Server using alternative credentials. + + .PARAMETER Credential + Enables easy creation of a secure password. + + .PARAMETER Database + The database where the master key will be created. Defaults to master. + + .PARAMETER SecurePassword + Secure string used to create the key. + + .PARAMETER InputObject + Database object piped in from Get-DbaDatabase. + + .PARAMETER WhatIf + Shows what would happen if the command were to run. No actions are actually performed. + + .PARAMETER Confirm + Prompts you for confirmation before executing any changing operations within the command. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Certificate + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .EXAMPLE + PS C:\> New-DbaDbMasterKey -SqlInstance Server1 + + You will be prompted to securely enter your password, then a master key will be created in the master database on server1 if it does not exist. + + + .EXAMPLE + PS C:\> New-DbaDbMasterKey -SqlInstance Server1 -Credential usernamedoesntmatter + + You will be prompted by a credential interface to securely enter your password, then a master key will be created in the master database on server1 if it does not exist. + + .EXAMPLE + PS C:\> New-DbaDbMasterKey -SqlInstance Server1 -Database db1 -Confirm:$false + + Suppresses all prompts to install but prompts in th console to securely enter your password and creates a master key in the 'db1' database + + #> + [CmdletBinding(SupportsShouldProcess, ConfirmImpact = "High")] + param ( + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [PSCredential]$Credential, + [string[]]$Database = "master", + [Alias("Password")] + [Security.SecureString]$SecurePassword, + [parameter(ValueFromPipeline)] + [Microsoft.SqlServer.Management.Smo.Database[]]$InputObject, + [switch]$EnableException + ) + begin { + if ($Credential) { + $SecurePassword = $Credential.Password + } else { + if (-not $SecurePassword) { + $SecurePassword = Read-Host "Password" -AsSecureString + } + } + } + process { + if ($SqlInstance) { + $InputObject += Get-DbaDatabase -SqlInstance $SqlInstance -Database $Database -ExcludeDatabase $ExcludeDatabase + } + + foreach ($db in $InputObject) { + if ($null -ne $db.MasterKey) { + Stop-Function -Message "Master key already exists in the $db database on $($db.Parent.Name)" -Target $db -Continue + } + + if ($Pscmdlet.ShouldProcess($db.Parent.Name, "Creating master key for database '$($db.Name)'")) { + try { + $masterkey = New-Object Microsoft.SqlServer.Management.Smo.MasterKey $db + $masterkey.Create(([System.Runtime.InteropServices.marshal]::PtrToStringAuto([System.Runtime.InteropServices.marshal]::SecureStringToBSTR($SecurePassword)))) + + Add-Member -Force -InputObject $masterkey -MemberType NoteProperty -Name ComputerName -value $db.Parent.ComputerName + Add-Member -Force -InputObject $masterkey -MemberType NoteProperty -Name InstanceName -value $db.Parent.ServiceName + Add-Member -Force -InputObject $masterkey -MemberType NoteProperty -Name SqlInstance -value $db.Parent.DomainInstanceName + Add-Member -Force -InputObject $masterkey -MemberType NoteProperty -Name Database -value $db.Name + + Select-DefaultView -InputObject $masterkey -Property ComputerName, InstanceName, SqlInstance, Database, CreateDate, DateLastModified, IsEncryptedByServer + } catch { + Stop-Function -Message "Failed to create master key in $db on $instance. Exception: $($_.Exception.InnerException)" -Target $masterkey -ErrorRecord $_ -Continue + } + } + } + } + end { + Test-DbaDeprecation -DeprecatedOn "1.0.0" -EnableException:$false -Alias New-DbaDatabaseMasterKey + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function New-DbaDbSnapshot { + <# + .SYNOPSIS + Creates database snapshots + + .DESCRIPTION + Creates database snapshots without hassles + + .PARAMETER SqlInstance + The target SQL Server instance or instances. + + .PARAMETER SqlCredential + Credential object used to connect to the SQL Server as a different user + + .PARAMETER AllDatabases + Creates snapshot for all eligible databases + + .PARAMETER Database + The database(s) to process - this list is auto-populated from the server. If unspecified, all databases will be processed. + + .PARAMETER ExcludeDatabase + The database(s) to exclude - this list is auto-populated from the server + + .PARAMETER WhatIf + Shows what would happen if the command were to run + + .PARAMETER Confirm + Prompts for confirmation of every step. + + .PARAMETER Name + The specific snapshot name you want to create. Works only if you target a single database. If you need to create multiple snapshot, + you must use the NameSuffix parameter + + .PARAMETER NameSuffix + When you pass a simple string, it'll be appended to use it to build the name of the snapshot. By default snapshots are created with yyyyMMdd_HHmmss suffix + You can also pass a standard placeholder, in which case it'll be interpolated (e.g. '{0}' gets replaced with the database name) + + .PARAMETER Path + Snapshot files will be created here (by default the filestructure will be created in the same folder as the base db) + + .PARAMETER InputObject + Allows Piping from Get-DbaDatabase + + .PARAMETER Force + Databases with Filestream FG can be snapshotted, but the Filestream FG is marked offline + in the snapshot. To create a "partial" snapshot, you need to pass -Force explicitely + + NB: You can't then restore the Database from the newly-created snapshot. + For details, check https://msdn.microsoft.com/en-us/library/bb895334.aspx + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Snapshot, Restore, Database + Author: Simone Bizzotto (@niphold) + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/New-DbaDbSnapshot + + .EXAMPLE + PS C:\> New-DbaDbSnapshot -SqlInstance sqlserver2014a -Database HR, Accounting + + Creates snapshot for HR and Accounting, returning a custom object displaying Server, Database, DatabaseCreated, SnapshotOf, SizeMB, DatabaseCreated, PrimaryFilePath, Status, Notes + + .EXAMPLE + PS C:\> New-DbaDbSnapshot -SqlInstance sqlserver2014a -Database HR -Name HR_snap + + Creates snapshot named "HR_snap" for HR + + .EXAMPLE + PS C:\> New-DbaDbSnapshot -SqlInstance sqlserver2014a -Database HR -NameSuffix 'fool_{0}_snap' + + Creates snapshot named "fool_HR_snap" for HR + + .EXAMPLE + PS C:\> New-DbaDbSnapshot -SqlInstance sqlserver2014a -Database HR, Accounting -Path F:\snapshotpath + + Creates snapshots for HR and Accounting databases, storing files under the F:\snapshotpath\ dir + + .EXAMPLE + PS C:\> Get-DbaDatabase -SqlInstance sql2016 -Database df | New-DbaDbSnapshot + + Creates a snapshot for the database df on sql2016 + + #> + + [CmdletBinding(SupportsShouldProcess)] + param ( + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [Alias("Credential")] + [PSCredential]$SqlCredential, + [Alias("Databases")] + [object[]]$Database, + [object[]]$ExcludeDatabase, + [switch]$AllDatabases, + [string]$Name, + [string]$NameSuffix, + [string]$Path, + [switch]$Force, + [parameter(ValueFromPipeline)] + [Microsoft.SqlServer.Management.Smo.Database[]]$InputObject, + [Alias('Silent')] + [switch]$EnableException + ) + + begin { + + $NoSupportForSnap = @('model', 'master', 'tempdb') + # Evaluate the default suffix here for naming consistency + $DefaultSuffix = (Get-Date -Format "yyyyMMdd_HHmmss") + if ($NameSuffix.Length -gt 0) { + #Validate if Name can be interpolated + try { + $null = $NameSuffix -f 'some_string' + } catch { + Stop-Function -Message "NameSuffix parameter must be a template only containing one parameter {0}" -ErrorRecord $_ + } + } + + function Resolve-SnapshotError($server) { + $errhelp = '' + $CurrentEdition = $server.Edition.toLower() + $CurrentVersion = $server.Version.Major * 1000000 + $server.Version.Minor * 10000 + $server.Version.Build + if ($server.Version.Major -lt 9) { + $errhelp = 'Not supported before 2005' + } + if ($CurrentVersion -lt 12002000 -and $errhelp.Length -eq 0) { + if ($CurrentEdition -notmatch '.*enterprise.*|.*developer.*|.*datacenter.*') { + $errhelp = 'Supported only for Enterprise, Developer or Datacenter editions' + } + } + $message = "" + if ($errhelp.Length -gt 0) { + $message += "Please make sure your version supports snapshots : ($errhelp)" + } else { + $message += "This module can't tell you why the snapshot creation failed. Feel free to report back to dbatools what happened" + } + Write-Message -Level Warning -Message $message + } + } + process { + if (-not $InputObject -and -not $Database -and $AllDatabases -eq $false) { + Stop-Function -Message "You must specify a -AllDatabases or -Database to continue" -EnableException $EnableException + return + } + + foreach ($instance in $SqlInstance) { + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential -MinimumVersion 9 + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + #Checks for path existence, left the length test because test-bound wasn't working for some reason + if ($Path.Length -gt 0) { + if (!(Test-DbaPath -SqlInstance $instance -Path $Path)) { + Stop-Function -Message "$instance cannot access the directory $Path" -ErrorRecord $_ -Target $instance -Continue -EnableException $EnableException + } + } + + if ($AllDatabases) { + $dbs = $server.Databases + } + + if ($Database) { + $dbs = $server.Databases | Where-Object { $Database -contains $_.Name } + } + + if ($ExcludeDatabase) { + $dbs = $server.Databases | Where-Object { $ExcludeDatabase -notcontains $_.Name } + } + + ## double check for gotchas + foreach ($db in $dbs) { + if ($db.IsDatabaseSnapshot) { + Write-Message -Level Warning -Message "$($db.name) is a snapshot, skipping" + } elseif ($db.name -in $NoSupportForSnap) { + Write-Message -Level Warning -Message "$($db.name) snapshots are prohibited" + } elseif ($db.IsAccessible -ne $true) { + Write-Message -Level Verbose -Message "$($db.name) is not accessible, skipping" + } else { + $InputObject += $db + } + } + + if ($InputObject.Length -gt 1 -and $Name) { + Stop-Function -Message "You passed the Name parameter that is fixed but selected multiple databases to snapshot: use the NameSuffix parameter" -Continue -EnableException $EnableException + } + } + + foreach ($db in $InputObject) { + $server = $db.Parent + + # In case stuff is piped in + if ($server.VersionMajor -lt 9) { + Stop-Function -Message "SQL Server version 9 required - $server not supported" -Continue + } + + if ($NameSuffix.Length -gt 0) { + $SnapName = $NameSuffix -f $db.Name + if ($SnapName -eq $NameSuffix) { + #no interpolation, just append + $SnapName = '{0}{1}' -f $db.Name, $NameSuffix + } + } elseif ($Name.Length -gt 0) { + $SnapName = $Name + } else { + $SnapName = "{0}_{1}" -f $db.Name, $DefaultSuffix + } + if ($SnapName -in $server.Databases.Name) { + Write-Message -Level Warning -Message "A database named $Snapname already exists, skipping" + continue + } + $all_FSD = $db.FileGroups | Where-Object FileGroupType -eq 'FileStreamDataFileGroup' + $all_MMO = $db.FileGroups | Where-Object FileGroupType -eq 'MemoryOptimizedDataFileGroup' + $has_FSD = $all_FSD.Count -gt 0 + $has_MMO = $all_MMO.Count -gt 0 + if ($has_MMO) { + Write-Message -Level Warning -Message "MEMORY_OPTIMIZED_DATA detected, snapshots are not possible" + continue + } + if ($has_FSD -and $Force -eq $false) { + Write-Message -Level Warning -Message "Filestream detected, skipping. You need to specify -Force. See Get-Help for details" + continue + } + $snaptype = "db snapshot" + if ($has_FSD) { + $snaptype = "partial db snapshot" + } + If ($Pscmdlet.ShouldProcess($server, "Create $snaptype $SnapName of $($db.Name)")) { + $CustomFileStructure = @{ } + $counter = 0 + foreach ($fg in $db.FileGroups) { + $CustomFileStructure[$fg.Name] = @() + if ($fg.FileGroupType -eq 'FileStreamDataFileGroup') { + Continue + } + foreach ($file in $fg.Files) { + $counter += 1 + $basename = [IO.Path]::GetFileNameWithoutExtension($file.FileName) + $basepath = Split-Path $file.FileName -Parent + # change path if specified + if ($Path.Length -gt 0) { + $basepath = $Path + } + # we need to avoid cases where basename is the same for multiple FG + $fname = [IO.Path]::Combine($basepath, ("{0}_{1}_{2:0000}_{3:000}" -f $basename, $DefaultSuffix, (Get-Date).MilliSecond, $counter)) + # fixed extension is hardcoded as "ss", which seems a "de-facto" standard + $fname = [IO.Path]::ChangeExtension($fname, "ss") + $CustomFileStructure[$fg.Name] += @{ 'name' = $file.name; 'filename' = $fname } + } + } + + $SnapDB = New-Object -TypeName Microsoft.SqlServer.Management.Smo.Database -ArgumentList $server, $Snapname + $SnapDB.DatabaseSnapshotBaseName = $db.Name + + foreach ($fg in $CustomFileStructure.Keys) { + $SnapFG = New-Object -TypeName Microsoft.SqlServer.Management.Smo.FileGroup $SnapDB, $fg + $SnapDB.FileGroups.Add($SnapFG) + foreach ($file in $CustomFileStructure[$fg]) { + $SnapFile = New-Object -TypeName Microsoft.SqlServer.Management.Smo.DataFile $SnapFG, $file['name'], $file['filename'] + $SnapDB.FileGroups[$fg].Files.Add($SnapFile) + } + } + + # we're ready to issue a Create, but SMO is a little uncooperative here + # there are cases we can manage and others we can't, and we need all the + # info we can get both from testers and from users + + $sql = $SnapDB.Script() + + try { + $SnapDB.Create() + $server.Databases.Refresh() + Get-DbaDbSnapshot -SqlInstance $server -Snapshot $Snapname + } catch { + try { + $server.Databases.Refresh() + if ($SnapName -notin $server.Databases.Name) { + # previous creation failed completely, snapshot is not there already + $null = $server.Query($sql[0]) + $server.Databases.Refresh() + $SnapDB = Get-DbaDbSnapshot -SqlInstance $server -Snapshot $Snapname + } else { + $SnapDB = Get-DbaDbSnapshot -SqlInstance $server -Snapshot $Snapname + } + + $Notes = @() + if ($db.ReadOnly -eq $true) { + $Notes += 'SMO is probably trying to set a property on a read-only snapshot, run with -Debug to find out and report back' + } + if ($has_FSD) { + #Variable marked as unused by PSScriptAnalyzer + #$Status = 'Partial' + $Notes += 'Filestream groups are not viable for snapshot' + } + $Notes = $Notes -Join ';' + + $hints = @("Executing these commands led to a partial failure") + foreach ($stmt in $sql) { + $hints += $stmt + } + + Write-Message -Level Debug -Message ($hints -Join "`n") + + $SnapDB + } catch { + # Resolve-SnapshotError $server + $hints = @("Executing these commands led to a failure") + foreach ($stmt in $sql) { + $hints += $stmt + } + Write-Message -Level Debug -Message ($hints -Join "`n") + + Stop-Function -Message "Failure" -ErrorRecord $_ -Target $SnapDB -Continue + } + } + } + } + } + end { + Test-DbaDeprecation -DeprecatedOn "1.0.0" -Alias New-DbaDatabaseSnapshot + } +} +function New-DbaDbUser { + <# + .SYNOPSIS + Creates a new user for the specified database. + + .DESCRIPTION + Creates a new user for a specified database with provided specifications. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. Defaults to the default instance on localhost. + + .PARAMETER SqlCredential + Allows you to login to servers using SQL Logins instead of Windows Authentication (AKA Integrated or Trusted). To use: + + $scred = Get-Credential, then pass $scred object to the -SqlCredential parameter. + + Windows Authentication will be used if SqlCredential is not specified. SQL Server does not accept Windows credentials being passed as credentials. + + To connect to SQL Server as a different Windows user, run PowerShell as that user. + + .PARAMETER Database + Specifies the database(s) to process. Options for this list are auto-populated from the server. If unspecified, all databases will be processed. + + .PARAMETER ExcludeDatabase + Specifies the database(s) to exclude from processing. Options for this list are auto-populated from the server. By default, system databases are excluded. + + .PARAMETER IncludeSystem + If this switch is enabled, the user will be added to system databases. + + .PARAMETER Login + When specified, the user will be associated to this SQL login and have the same name as the Login. + + .PARAMETER Username + When specified, the user will have this name. + + .PARAMETER Force + If user exists, drop and recreate. + + .PARAMETER WhatIf + If this switch is enabled, no actions are performed but informational messages will be displayed that explain what would happen if the command were to run. + + .PARAMETER Confirm + If this switch is enabled, you will be prompted for confirmation before executing any operations that change state. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Database, User + Author: Frank Henninger (@osiris687) + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/New-DbaDbUser + + .EXAMPLE + PS C:\> New-DbaDbUser -SqlInstance sqlserver2014 -Database DB1 -Login user1 + + Creates a new sql user with login named user1 in the specified database. + + .EXAMPLE + PS C:\> New-DbaDbUser -SqlInstance sqlserver2014 -Database DB1 -Username user1 + + Creates a new sql user without login named user1 in the specified database. + + .EXAMPLE + PS C:\> New-DbaDbUser -SqlInstance sqlserver2014 -Database DB1 -Login Login1 -Username user1 + + Creates a new sql user named user1 mapped to Login1 in the specified database. + + .EXAMPLE + PS C:\> Get-DbaDbUser -SqlInstance sqlserver1 -Database DB1 | New-DbaDbUser -SqlInstance sqlserver2 -Database DB1 + + Copies users from sqlserver1.DB1 to sqlserver2.DB1. Does not copy permissions! + + #> + [CmdletBinding(SupportsShouldProcess, DefaultParameterSetName = "NoLogin")] + param( + [parameter(Mandatory, Position = 1)] + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [Alias("Databases")] + [object[]]$Database, + [object[]]$ExcludeDatabase, + [switch]$IncludeSystem, + [parameter(ParameterSetName = "Login")] + [string[]]$Login, + [parameter(ParameterSetName = "NoLogin")] + [parameter(ParameterSetName = "Login")] + [string[]]$Username, + [switch]$Force, + [Alias('Silent')] + [switch]$EnableException + ) + + begin { + function Test-SqlLoginInDatabase { + param( + [Microsoft.SqlServer.Management.Smo.Login]$Login, + [Microsoft.SqlServer.Management.Smo.Database]$Database + ) + + # Does user exist with same login? + if ( $existingUser = ( $Database.Users | Where-Object Login -eq $smoLogin ) ) { + if (Test-Bound 'Force') { + if ($Pscmdlet.ShouldProcess($existingUser, "Dropping existing user $($existingUser.Name) because -Force was used")) { + try { + $existingUser.Drop() + } catch { + Stop-Function -Message "Could not remove existing user $($existingUser.Name), skipping." -Target $existingUser -ErrorRecord $_ -Exception $_.Exception.InnerException.InnerException.InnerException -Continue + } + } + } else { + Stop-Function -Message "User $($existingUser.Name) already exists and -Force was not specified" -Target $existingUser -Continue + } + } + } + + function Test-SqlUserInDatabase { + param( + [string[]]$Username, + [Microsoft.SqlServer.Management.Smo.Database]$Database + ) + + # Does user exist with same login? + if ( $existingUser = ( $Database.Users | Where-Object Name -eq $Username ) ) { + if (Test-Bound 'Force') { + if ($Pscmdlet.ShouldProcess($existingUser, "Dropping existing user $($existingUser.Name) because -Force was used")) { + try { + $existingUser.Drop() + } catch { + Stop-Function -Message "Could not remove existing user $($existingUser.Name), skipping." -Target $existingUser -ErrorRecord $_ -Exception $_.Exception.InnerException.InnerException.InnerException -Continue + } + } + } else { + Stop-Function -Message "User $($existingUser.Name) already exists and -Force was not specified" -Target $existingUser -Continue + } + } + } + } + + process { + foreach ($instance in $SqlInstance) { + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $sqlcredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + $databases = $server.Databases | Where-Object IsAccessible -eq $true + + if ($Database) { + $databases = $databases | Where-Object Name -In $Database + } + if ($ExcludeDatabase) { + $databases = $databases | Where-Object Name -NotIn $ExcludeDatabase + } + if (Test-Bound 'IncludeSystem' -Not) { + $databases = $databases | Where-Object IsSystemObject -NE $true + } + + foreach ($db in $databases) { + Write-Message -Level Verbose -Message "Add users to Database $db on target $server" + + switch -Wildcard ($PSCmdlet.ParameterSetName) { + "Login*" { + # Creates a user with Login + Write-Message -Level VeryVerbose -Message "Using UserType: SqlLogin" + + if ($PSBoundParameters.Keys -notcontains 'Login') { + Stop-Function -Message "Parameter -Login is required " -Target $instance + } + if ($Login.GetType().Name -eq 'Login') { + $smoLogin = $Login + } else { + #get the login associated with the given name. + $smoLogin = $server.Logins | Where-Object Name -eq $Login + if ($null -eq $smoLogin) { + Stop-Function -Message "Invalid Login: $Login is not found on $Server" -Target $instance; + return + } + } + + Test-SqlLoginInDatabase -Database $db -Login $smoLogin + + if ( $PSCmdlet.ParameterSetName -eq "LoginWithNewUsername" ) { + $Name = $Username + Write-Message -Level Verbose -Message "Using UserName: $Username" + } else { + $Name = $smoLogin.Name + Write-Message -Level Verbose -Message "Using LoginName: $Name" + } + + $Login = $smoLogin + $UserType = [Microsoft.SqlServer.Management.Smo.UserType]::SqlLogin + } + + "NoLogin" { + # Creates a user without login + Write-Message -Level Verbose -Message "Using UserType: NoLogin" + $UserType = [Microsoft.SqlServer.Management.Smo.UserType]::NoLogin + $Name = $Username + } + } #switch + + # Does user exist with same name? + Test-SqlUserInDatabase -Database $db -Username $Name + + if ($Pscmdlet.ShouldProcess($db, "Creating user $Name")) { + try { + $smoUser = New-Object Microsoft.SqlServer.Management.Smo.User + $smoUser.Parent = $db + $smoUser.Name = $Name + + if ( $PSBoundParameters.Keys -contains 'Login' -and $Login.GetType().Name -eq 'Login' ) { + $smoUser.Login = Login + } + $smoUser.UserType = $UserType + + $smoUser.Create() + } catch { + Stop-Function -Message "Failed to add user $Name in $db to $instance" -Category InvalidOperation -ErrorRecord $_ -Target $instance -Continue + } + $smoUser.Refresh() + + if ( $PSBoundParameters.Keys -contains 'Username' -and $smoUser.Name -ne $Username ) { + $smoUser.Rename($Username) + } + + Write-Message -Level Verbose -Message "Successfully added $smoUser in $db to $instance." + } + + #Display Results + Get-DbaDbUser -SqlInstance $instance -SqlCredential $sqlcredential -Database $db.Name | Where-Object name -eq $smoUser.Name + } + } + } +} +function New-DbaDirectory { + <# + .SYNOPSIS + Creates new path as specified by the path variable + + .DESCRIPTION + Uses master.dbo.xp_create_subdir to create the path + Returns $true if the path can be created, $false otherwise + + .PARAMETER SqlInstance + The SQL Server you want to run the test on. + + .PARAMETER Path + The Path to tests. Can be a file or directory. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER WhatIf + If this switch is enabled, no actions are performed but informational messages will be displayed that explain what would happen if the command were to run. + + .PARAMETER Confirm + If this switch is enabled, you will be prompted for confirmation before executing any operations that change state. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Path, Directory, Folder + Author: Stuart Moore + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + Requires: Admin access to server (not SQL Services), + Remoting must be enabled and accessible if $SqlInstance is not local + + .LINK + https://dbatools.io/New-DbaDirectory + + .EXAMPLE + PS C:\> New-DbaDirectory -SqlInstance sqlcluster -Path L:\MSAS12.MSSQLSERVER\OLAP + + If the SQL Server instance sqlcluster can create the path L:\MSAS12.MSSQLSERVER\OLAP it will do and return $true, if not it will return $false. + + .EXAMPLE + PS C:\> $credential = Get-Credential + PS C:\> New-DbaDirectory -SqlInstance sqlcluster -SqlCredential $credential -Path L:\MSAS12.MSSQLSERVER\OLAP + + If the SQL Server instance sqlcluster can create the path L:\MSAS12.MSSQLSERVER\OLAP it will do and return $true, if not it will return $false. Uses a SqlCredential to connect + + #> + [CmdletBinding(SupportsShouldProcess)] + param ( + [Parameter(Mandatory)] + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [Parameter(Mandatory)] + [string]$Path, + [PSCredential]$SqlCredential, + [switch]$EnableException + ) + + Test-DbaDeprecation -DeprecatedOn "1.0.0" -EnableException:$false -Alias New-DbaSqlDirectory + + foreach ($instance in $SqlInstance) { + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $sqlcredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + $Path = $Path.Replace("'", "''") + + $exists = Test-DbaPath -SqlInstance $sqlinstance -SqlCredential $SqlCredential -Path $Path + + if ($exists) { + Stop-Function -Message "$Path already exists" -Target $server -Continue + } + + $sql = "EXEC master.dbo.xp_create_subdir'$path'" + Write-Message -Level Debug -Message $sql + if ($Pscmdlet.ShouldProcess($path, "Creating a new path on $($server.name)")) { + try { + $null = $server.Query($sql) + $Created = $true + } catch { + $Created = $false + Stop-Function -Message "Failure" -ErrorRecord $_ + } + + [pscustomobject]@{ + Server = $SqlInstance + Path = $Path + Created = $Created + } + } + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function New-DbaEndpoint { + <# + .SYNOPSIS + Creates endpoints on a SQL Server instance. + + .DESCRIPTION + Creates endpoints on a SQL Server instance. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Name + The name of the endpoint. If a name is not specified, one will be auto-generated. + + .PARAMETER Type + The type of endpoint. Defaults to DatabaseMirroring. Options: DatabaseMirroring, ServiceBroker, Soap, TSql + + .PARAMETER Protocol + The type of protocol. Defaults to tcp. Options: Tcp, NamedPipes, Http, Via, SharedMemory + + .PARAMETER Role + The type of role. Defaults to All. Options: All, None, Partner, Witness + + .PARAMETER Port + Port for TCP. If one is not provided, it will be autogenerated. + + .PARAMETER SslPort + Port for SSL + + .PARAMETER Certificate + Database certificate used for authentication. + + .PARAMETER EndpointEncryption + Used to specify the state of encryption on the endpoint. Defaults to required. + Disabled + Required + Supported + + .PARAMETER EncryptionAlgorithm + Specifies an encryption algorithm used on an endpoint. Defaults to Aes. + + Options are: + AesRC4 + Aes + None + RC4 + RC4Aes + + .PARAMETER WhatIf + Shows what would happen if the command were to run. No actions are actually performed. + + .PARAMETER Owner + Owner of the endpoint. Defaults to sa. + + .PARAMETER Confirm + Prompts you for confirmation before executing any changing operations within the command. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Endpoint + Author: Chrissy LeMaire (@cl), netnerds.net + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/New-DbaEndpoint + + .EXAMPLE + PS C:\> New-DbaEndpoint -SqlInstance localhost + + Creates all Endpoint(s) on the local default SQL Server instance + + .EXAMPLE + PS C:\> New-DbaEndpoint -SqlInstance localhost, sql2016 + + Returns all Endpoint(s) for the local and sql2016 SQL Server instances + + #> + [CmdletBinding(SupportsShouldProcess, ConfirmImpact = 'Low')] + param ( + [parameter(Position = 0, Mandatory, ValueFromPipeline)] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [string]$Name, + [ValidateSet('DatabaseMirroring', 'ServiceBroker', 'Soap', 'TSql')] + [string]$Type = 'DatabaseMirroring', + [ValidateSet('Tcp', 'NamedPipes', 'Http', 'Via', 'SharedMemory')] + [string]$Protocol = 'Tcp', + [ValidateSet('All', 'None', 'Partner', 'Witness')] + [string]$Role = 'All', + [ValidateSet('Disabled', 'Required', 'Supported')] + [string]$EndpointEncryption = 'Required', + [ValidateSet('Aes', 'AesRC4', 'None', 'RC4', 'RC4Aes')] + [string]$EncryptionAlgorithm = 'Aes', + [string]$Certificate, + [int]$Port, + [int]$SslPort, + [string]$Owner, + [switch]$EnableException + ) + process { + if ((Test-Bound -ParameterName Name -Not)) { + $name = "endpoint-" + [DateTime]::Now.ToString('s').Replace(":", "-") + } + + foreach ($instance in $SqlInstance) { + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + if (-not (Test-Bound -ParameterName Owner)) { + $Owner = Get-SaLoginName -SqlInstance $server + } + + if ($Certificate) { + $cert = Get-DbaDbCertificate -SqlInstance $server -Certificate $Certificate + if (-not $cert) { + Stop-Function -Message "Certificate $Certificate does not exist on $instance" -ErrorRecord $_ -Target $Certificate -Continue + } + } + + # Thanks to https://github.com/mmessano/PowerShell/blob/master/SQL-ConfigureDatabaseMirroring.ps1 + if ($Port) { + $tcpPort = $port + } else { + $thisport = (Get-DbaEndPoint -SqlInstance $server).Protocol.Tcp + $measure = $thisport | Measure-Object ListenerPort -Maximum + + if ($thisport.ListenerPort -eq 0) { + $tcpPort = 5022 + } elseif ($measure.Maximum) { + $maxPort = $measure.Maximum + #choose a random port that is greater than the current max port + $tcpPort = $maxPort + (New-Object Random).Next(1, 500) + } else { + $maxPort = 5000 + #choose a random port that is greater than the current max port + $tcpPort = $maxPort + (New-Object Random).Next(1, 500) + } + } + + if ($Pscmdlet.ShouldProcess($server.Name, "Creating endpoint $Name of type $Type using protocol $Protocol and if TCP then using Port $tcpPort")) { + try { + $endpoint = New-Object Microsoft.SqlServer.Management.Smo.EndPoint $server, $Name + $endpoint.ProtocolType = [Microsoft.SqlServer.Management.Smo.ProtocolType]::$Protocol + $endpoint.EndpointType = [Microsoft.SqlServer.Management.Smo.EndpointType]::$Type + $endpoint.Owner = $Owner + if ($Protocol -eq "TCP") { + $endpoint.Protocol.Tcp.ListenerPort = $tcpPort + $endpoint.Payload.DatabaseMirroring.ServerMirroringRole = [Microsoft.SqlServer.Management.Smo.ServerMirroringRole]::$Role + if (Test-Bound -ParameterName SslPort) { + $endpoint.Protocol.Tcp.SslPort = $SslPort + } + + $endpoint.Payload.DatabaseMirroring.EndpointEncryption = [Microsoft.SqlServer.Management.Smo.EndpointEncryption]::$EndpointEncryption + $endpoint.Payload.DatabaseMirroring.EndpointEncryptionAlgorithm = [Microsoft.SqlServer.Management.Smo.EndpointEncryptionAlgorithm]::$EncryptionAlgorithm + + } + if ($Certificate) { + $outscript = $endpoint.Script() + $outscript = $outscript.Replace("ROLE = ALL,", "ROLE = ALL, AUTHENTICATION = CERTIFICATE $cert,") + $server.Query($outscript) + } else { + $null = $endpoint.Create() + } + + $server.Endpoints.Refresh() + Get-DbaEndpoint -SqlInstance $server -Endpoint $name + } catch { + Stop-Function -Message "Failure" -ErrorRecord $_ -Continue + } + } + } + } +} +function New-DbaLogin { + <# + .SYNOPSIS + Creates a new SQL Server login + + .DESCRIPTION + Creates a new SQL Server login with provided specifications + + .PARAMETER SqlInstance + The target SQL Server(s) + + .PARAMETER SqlCredential + Allows you to login to SQL Server using alternative credentials + + .PARAMETER Login + The Login name(s) + + .PARAMETER SecurePassword + Secure string used to authenticate the Login + + .PARAMETER HashedPassword + Hashed password string used to authenticate the Login + + .PARAMETER InputObject + Takes the parameters required from a Login object that has been piped into the command + + .PARAMETER LoginRenameHashtable + Pass a hash table into this parameter to change login names when piping objects into the procedure + + .PARAMETER MapToCertificate + Map the login to a certificate + + .PARAMETER MapToAsymmetricKey + Map the login to an asymmetric key + + .PARAMETER MapToCredential + Map the login to a credential + + .PARAMETER Sid + Provide an explicit Sid that should be used when creating the account. Can be [byte[]] or hex [string] ('0xFFFF...') + + .PARAMETER DefaultDatabase + Default database for the login + + .PARAMETER Language + Login's default language + + .PARAMETER PasswordExpiration + Enforces password expiration policy. Requires PasswordPolicy to be enabled. Can be $true or $false(default) + + .PARAMETER PasswordPolicy + Enforces password complexity policy. Can be $true or $false(default) + + .PARAMETER Disabled + Create the login in a disabled state + + .PARAMETER NewSid + Ignore sids from the piped login object to generate new sids on the server. Useful when copying login onto the same server + + .PARAMETER Force + If login exists, drop and recreate + + .PARAMETER WhatIf + Shows what would happen if the command were to run. No actions are actually performed + + .PARAMETER Confirm + Prompts you for confirmation before executing any changing operations within the command + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Login, Security + Author: Kirill Kravtsov (@nvarscar) + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/New-DbaLogin + + .EXAMPLE + PS C:\> New-DbaLogin -SqlInstance Server1,Server2 -Login Newlogin + + You will be prompted to securely enter the password for a login [Newlogin]. The login would be created on servers Server1 and Server2 with default parameters. + + .EXAMPLE + PS C:\> $securePassword = Read-Host "Input password" -AsSecureString + PS C:\> New-DbaLogin -SqlInstance Server1\sql1 -Login Newlogin -Password $securePassword -PasswordPolicy -PasswordExpiration + + Creates a login on Server1\sql1 with a predefined password. The login will have password and expiration policies enforced onto it. + + .EXAMPLE + PS C:\> Get-DbaLogin -SqlInstance sql1 -Login Oldlogin | New-DbaLogin -SqlInstance sql1 -LoginRenameHashtable @{Oldlogin = 'Newlogin'} -Force -NewSid -Disabled:$false + + Copies a login [Oldlogin] to the same instance sql1 with the same parameters (including password). New login will have a new sid, a new name [Newlogin] and will not be disabled. Existing login [Newlogin] will be removed prior to creation. + + .EXAMPLE + PS C:\> Get-DbaLogin -SqlInstance sql1 -Login Login1,Login2 | New-DbaLogin -SqlInstance sql2 -PasswordPolicy -PasswordExpiration -DefaultDatabase tempdb -Disabled + + Copies logins [Login1] and [Login2] from instance sql1 to instance sql2, but enforces password and expiration policies for the new logins. New logins will also have a default database set to [tempdb] and will be created in a disabled state. + + .EXAMPLE + PS C:\> New-DbaLogin -SqlInstance sql1 -Login domain\user + + Creates a new Windows Authentication backed login on sql1. The login will be part of the public server role. + + #> + [CmdletBinding(SupportsShouldProcess, DefaultParameterSetName = "Password", ConfirmImpact = "Low")] + [Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSAvoidUsingPlainTextForPassword", "", Justification = "For Parameters Password and MapToCredential")] + param ( + [parameter(Mandatory, Position = 1)] + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [Alias("Name", "LoginName")] + [parameter(ParameterSetName = "Password", Position = 2)] + [parameter(ParameterSetName = "PasswordHash")] + [parameter(ParameterSetName = "MapToCertificate")] + [parameter(ParameterSetName = "MapToAsymmetricKey")] + [string[]]$Login, + [parameter(ValueFromPipeline)] + [parameter(ParameterSetName = "Password")] + [parameter(ParameterSetName = "PasswordHash")] + [parameter(ParameterSetName = "MapToCertificate")] + [parameter(ParameterSetName = "MapToAsymmetricKey")] + [object[]]$InputObject, + [Alias("Rename")] + [hashtable]$LoginRenameHashtable, + [parameter(ParameterSetName = "Password", Position = 3)] + [Alias("Password")] + [Security.SecureString]$SecurePassword, + [Alias("Hash", "PasswordHash")] + [parameter(ParameterSetName = "PasswordHash")] + [string]$HashedPassword, + [parameter(ParameterSetName = "MapToCertificate")] + [string]$MapToCertificate, + [parameter(ParameterSetName = "MapToAsymmetricKey")] + [string]$MapToAsymmetricKey, + [string]$MapToCredential, + [object]$Sid, + [Alias("DefaultDB")] + [parameter(ParameterSetName = "Password")] + [parameter(ParameterSetName = "PasswordHash")] + [string]$DefaultDatabase, + [parameter(ParameterSetName = "Password")] + [parameter(ParameterSetName = "PasswordHash")] + [string]$Language, + [Alias("Expiration", "CheckExpiration")] + [parameter(ParameterSetName = "Password")] + [parameter(ParameterSetName = "PasswordHash")] + [switch]$PasswordExpiration, + [Alias("Policy", "CheckPolicy")] + [parameter(ParameterSetName = "Password")] + [parameter(ParameterSetName = "PasswordHash")] + [switch]$PasswordPolicy, + [Alias("Disable")] + [switch]$Disabled, + [switch]$NewSid, + [switch]$Force, + [Alias('Silent')] + [switch]$EnableException + ) + + begin { + if ($Sid) { + if ($Sid.GetType().Name -ne 'Byte[]') { + foreach ($symbol in $Sid.TrimStart("0x").ToCharArray()) { + if ($symbol -notin "0123456789ABCDEF".ToCharArray()) { + Stop-Function -Message "Sid has invalid character '$symbol', cannot proceed." -Category InvalidArgument -EnableException $EnableException + return + } + } + $Sid = Convert-HexStringToByte $Sid + } + } + + if ($HashedPassword) { + if ($HashedPassword.GetType().Name -eq 'Byte[]') { + $HashedPassword = Convert-ByteToHexString $HashedPassword + } + } + } + + process { + #At least one of those should be specified + if (!($Login -or $InputObject)) { + Stop-Function -Message "No logins have been specified." -Category InvalidArgument -EnableException $EnableException + Return + } + + $loginCollection = @() + if ($InputObject) { + $loginCollection += $InputObject + if ($Login) { + Stop-Function -Message "Parameter -Login is not supported when processing objects from -InputObject. If you need to rename the logins, please use -LoginRenameHashtable." -Category InvalidArgument -EnableException $EnableException + Return + } + } else { + $loginCollection += $Login + } + foreach ($instance in $SqlInstance) { + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $sqlcredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + foreach ($loginItem in $loginCollection) { + #check if $loginItem is an SMO Login object + if ($loginItem.GetType().Name -eq 'Login') { + #Get all the necessary fields + $loginName = $loginItem.Name + $loginType = $loginItem.LoginType + $currentSid = $loginItem.Sid + $currentDefaultDatabase = $loginItem.DefaultDatabase + $currentLanguage = $loginItem.Language + $currentPasswordExpiration = $loginItem.PasswordExpiration + $currentPasswordPolicyEnforced = $loginItem.PasswordPolicyEnforced + $currentDisabled = $loginItem.IsDisabled + + #Get previous password + if ($loginType -eq 'SqlLogin' -and !($SecurePassword -or $HashedPassword)) { + $sourceServer = $loginItem.Parent + switch ($sourceServer.versionMajor) { + 0 { $sql = "SELECT CONVERT(VARBINARY(256),password) as hashedpass FROM master.dbo.syslogins WHERE loginname='$loginName'" } + 8 { $sql = "SELECT CONVERT(VARBINARY(256),password) as hashedpass FROM dbo.syslogins WHERE name='$loginName'" } + 9 { $sql = "SELECT CONVERT(VARBINARY(256),password_hash) as hashedpass FROM sys.sql_logins where name='$loginName'" } + default { + $sql = "SELECT CAST(CONVERT(VARCHAR(256), CAST(LOGINPROPERTY(name,'PasswordHash') + AS VARBINARY(256)), 1) AS NVARCHAR(max)) AS hashedpass + FROM sys.server_principals + WHERE principal_id = $($loginItem.id)" + } + } + + try { + $hashedPass = $sourceServer.ConnectionContext.ExecuteScalar($sql) + } catch { + $hashedPassDt = $sourceServer.Databases['master'].ExecuteWithResults($sql) + $hashedPass = $hashedPassDt.Tables[0].Rows[0].Item(0) + } + + if ($hashedPass.GetType().Name -ne "String") { + $hashedPass = Convert-ByteToHexString $hashedPass + } + $currentHashedPassword = $hashedPass + } + + #Get cryptography and attached credentials + if ($loginType -eq 'AsymmetricKey') { + $currentAsymmetricKey = $loginItem.AsymmetricKey + } + if ($loginType -eq 'Certificate') { + $currentCertificate = $loginItem.Certificate + } + #This method or property is accessible only while working with SQL Server 2008 or later. + if ($sourceServer.versionMajor -gt 9) { + if ($loginItem.EnumCredentials()) { + $currentCredential = $loginItem.EnumCredentials() + } + } + } else { + $loginName = $loginItem + $currentSid = $currentDefaultDatabase = $currentLanguage = $currentPasswordExpiration = $currentAsymmetricKey = $currentCertificate = $currentCredential = $currentDisabled = $currentPasswordPolicyEnforced = $null + + if ($PsCmdlet.ParameterSetName -eq "MapToCertificate") { $loginType = 'Certificate' } + elseif ($PsCmdlet.ParameterSetName -eq "MapToAsymmetricKey") { $loginType = 'AsymmetricKey' } + elseif ($loginItem.IndexOf('\') -eq -1) { $loginType = 'SqlLogin' } + else { $loginType = 'WindowsUser' } + } + + if (($server.LoginMode -ne [Microsoft.SqlServer.Management.Smo.ServerLoginMode]::Mixed) -and ($loginType -eq 'SqlLogin')) { + Write-Message -Level Warning -Message "$instance does not have Mixed Mode enabled. [$loginName] is an SQL Login. Enable mixed mode authentication after the migration completes to use this type of login." + } + + if ($Sid) { + $currentSid = $Sid + } + if ($DefaultDatabase) { + $currentDefaultDatabase = $DefaultDatabase + } + if ($Language) { + $currentLanguage = $Language + } + if ($PSBoundParameters.Keys -contains 'PasswordExpiration') { + $currentPasswordExpiration = $PasswordExpiration + } + if ($PSBoundParameters.Keys -contains 'PasswordPolicy') { + $currentPasswordPolicyEnforced = $PasswordPolicy + } + if ($PSBoundParameters.Keys -contains 'MapToAsymmetricKey') { + $currentAsymmetricKey = $MapToAsymmetricKey + } + if ($PSBoundParameters.Keys -contains 'MapToCertificate') { + $currentCertificate = $MapToCertificate + } + if ($PSBoundParameters.Keys -contains 'MapToCredential') { + $currentCredential = $MapToCredential + } + if ($PSBoundParameters.Keys -contains 'Disabled') { + $currentDisabled = $Disabled + } + + #Apply renaming if necessary + if ($LoginRenameHashtable.Keys -contains $loginName) { + $loginName = $LoginRenameHashtable[$loginName] + } + + #Requesting password if required + if ($loginItem.GetType().Name -ne 'Login' -and $loginType -eq 'SqlLogin' -and !($SecurePassword -or $HashedPassword)) { + $SecurePassword = Read-Host -AsSecureString -Prompt "Enter a new password for the SQL Server login(s)" + } + + #verify if login exists on the server + if (($existingLogin = $server.Logins[$loginName])) { + if ($force) { + if ($Pscmdlet.ShouldProcess($existingLogin, "Dropping existing login $loginName on $instance because -Force was used")) { + try { + $existingLogin.Drop() + } catch { + Stop-Function -Message "Could not remove existing login $loginName on $instance, skipping." -Target $loginName -Continue + } + } + } else { + Stop-Function -Message "Login $loginName already exists on $instance and -Force was not specified" -Target $loginName -Continue + } + } + + + if ($Pscmdlet.ShouldProcess($SqlInstance, "Creating login $loginName on $instance")) { + try { + $newLogin = New-Object Microsoft.SqlServer.Management.Smo.Login($server, $loginName) + $newLogin.LoginType = $loginType + + $withParams = "" + + if ($loginType -eq 'SqlLogin' -and $currentSid -and !$NewSid) { + Write-Message -Level Verbose -Message "Setting $loginName SID" + $withParams += ", SID = " + (Convert-ByteToHexString $currentSid) + $newLogin.Set_Sid($currentSid) + } + + if ($loginType -in ("WindowsUser", "WindowsGroup", "SqlLogin")) { + if ($currentDefaultDatabase) { + Write-Message -Level Verbose -Message "Setting $loginName default database to $currentDefaultDatabase" + $withParams += ", DEFAULT_DATABASE = [$currentDefaultDatabase]" + $newLogin.DefaultDatabase = $currentDefaultDatabase + } + + if ($currentLanguage) { + Write-Message -Level Verbose -Message "Setting $loginName language to $currentLanguage" + $withParams += ", DEFAULT_LANGUAGE = [$currentLanguage]" + $newLogin.Language = $currentLanguage + } + + #CHECK_EXPIRATION: default - OFF + if ($currentPasswordExpiration) { + $withParams += ", CHECK_EXPIRATION = ON" + $newLogin.PasswordExpirationEnabled = $true + } else { + $withParams += ", CHECK_EXPIRATION = OFF" + $newLogin.PasswordExpirationEnabled = $false + } + + #CHECK_POLICY: default - ON + if ($currentPasswordPolicyEnforced) { + $withParams += ", CHECK_POLICY = ON" + $newLogin.PasswordPolicyEnforced = $true + } else { + $withParams += ", CHECK_POLICY = OFF" + $newLogin.PasswordPolicyEnforced = $false + } + + #Generate hashed password if necessary + if ($SecurePassword) { + $currentHashedPassword = Get-PasswordHash $SecurePassword $server.versionMajor + } elseif ($HashedPassword) { + $currentHashedPassword = $HashedPassword + } + } elseif ($loginType -eq 'AsymmetricKey') { + $newLogin.AsymmetricKey = $currentAsymmetricKey + } elseif ($loginType -eq 'Certificate') { + $newLogin.Certificate = $currentCertificate + } + + #Add credential + if ($currentCredential) { + $withParams += ", CREDENTIAL = [$currentCredential]" + } + + Write-Message -Level Verbose -Message "Adding as login type $loginType" + + # Attempt to add login using SMO, then T-SQL + try { + if ($loginType -in ("WindowsUser", "WindowsGroup", "AsymmetricKey", "Certificate")) { + if ($withParams) { $withParams = " WITH " + $withParams.TrimStart(',') } + $newLogin.Create() + } elseif ($loginType -eq "SqlLogin") { + $newLogin.Create($currentHashedPassword, [Microsoft.SqlServer.Management.Smo.LoginCreateOptions]::IsHashed) + } + $newLogin.Refresh() + + #Adding credential + if ($currentCredential) { + try { + $newLogin.AddCredential($currentCredential) + } catch { + $newLogin.Drop() + Stop-Function -Message "Failed to add $loginName to $instance." -Category InvalidOperation -ErrorRecord $_ -Target $instance -Continue + } + } + Write-Message -Level Verbose -Message "Successfully added $loginName to $instance." + } catch { + Write-Message -Level Verbose -Message "Failed to create $loginName on $instance using SMO, trying T-SQL." + try { + if ($loginType -eq 'AsymmetricKey') { $sql = "CREATE LOGIN [$loginName] FROM ASYMMETRIC KEY [$currentAsymmetricKey]" } + elseif ($loginType -eq 'Certificate') { $sql = "CREATE LOGIN [$loginName] FROM CERTIFICATE [$currentCertificate]" } + elseif ($loginType -eq 'SqlLogin' -and $server.DatabaseEngineType -eq 'SqlAzureDatabase') { + $BSTR = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($SecurePassword) # Azure SQL doesn't support HASHED so we have to dump out the plain text password :( + $unsecurePassword = [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($BSTR) + $sql = "CREATE LOGIN [$loginName] WITH PASSWORD = '$unsecurePassword'" + } elseif ($loginType -eq 'SqlLogin' ) { $sql = "CREATE LOGIN [$loginName] WITH PASSWORD = $currentHashedPassword HASHED" + $withParams } + else { $sql = "CREATE LOGIN [$loginName] FROM WINDOWS" + $withParams } + + $null = $server.Query($sql) + $newLogin = $server.logins[$loginName] + Write-Message -Level Verbose -Message "Successfully added $loginName to $instance." + } catch { + Stop-Function -Message "Failed to add $loginName to $instance." -Category InvalidOperation -ErrorRecord $_ -Target $instance -Continue + } + } + + #Process the Disabled property + if ($currentDisabled) { + try { + $newLogin.Disable() + Write-Message -Level Verbose -Message "Login $loginName has been disabled on $instance." + } catch { + Write-Message -Level Verbose -Message "Failed to disable $loginName on $instance using SMO, trying T-SQL." + try { + $sql = "ALTER LOGIN [$loginName] DISABLE" + $null = $server.Query($sql) + Write-Message -Level Verbose -Message "Login $loginName has been disabled on $instance." + } catch { + Stop-Function -Message "Failed to disable $loginName on $instance." -Category InvalidOperation -ErrorRecord $_ -Target $instance -Continue + } + } + } + #Display results + Get-DbaLogin -SqlInstance $server -Login $loginName + } catch { + Stop-Function -Message "Failed to create login $loginName on $instance." -Target $credential -InnerErrorRecord $_ -Continue + } + } + } + } + } +} +function New-DbaScriptingOption { + <# + .SYNOPSIS + Creates a new Microsoft.SqlServer.Management.Smo.ScriptingOptions object + + .DESCRIPTION + Creates a new Microsoft.SqlServer.Management.Smo.ScriptingOptions object. Basically saves you the time from remembering the SMO assembly name ;) + + See https://msdn.microsoft.com/en-us/library/microsoft.sqlserver.management.smo.scriptingoptions.aspx for more information + + .NOTES + Tags: Migration, Backup, DR + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/New-DbaScriptingOption + + .EXAMPLE + PS C:\> $options = New-DbaScriptingOption + PS C:\> $options.ScriptDrops = $false + PS C:\> $options.WithDependencies = $true + PS C:\> Get-DbaAgentJob -SqlInstance sql2016 | Export-DbaScript -ScriptingOptionObject $options + + Exports Agent Jobs with the Scripting Options ScriptDrops set to $false and WithDependencies set to true + + #> + [Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSUseShouldProcessForStateChangingFunctions", "")] + param() + New-Object Microsoft.SqlServer.Management.Smo.ScriptingOptions +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function New-DbaServiceMasterKey { + <# + .SYNOPSIS + Creates a new service master key. + + .DESCRIPTION + Creates a new service master key in the master database. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. + + .PARAMETER SqlCredential + Allows you to login to SQL Server using alternative credentials. + + .PARAMETER SecurePassword + Secure string used to create the key. + + .PARAMETER Credential + Enables easy creation of a secure password. + + .PARAMETER WhatIf + Shows what would happen if the command were to run. No actions are actually performed. + + .PARAMETER Confirm + Prompts you for confirmation before executing any changing operations within the command. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Certificate + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .EXAMPLE + PS C:\> New-DbaServiceMasterKey -SqlInstance Server1 + + You will be prompted to securely enter your Service Key password, then a master key will be created in the master database on server1 if it does not exist. + + #> + [CmdletBinding(SupportsShouldProcess)] + param ( + [parameter(Mandatory, ValueFromPipeline)] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [PSCredential]$Credential, + [Alias("Password")] + [Security.SecureString]$SecurePassword, + [switch]$EnableException + ) + + process { + foreach ($instance in $SqlInstance) { + if ($PSCmdlet.ShouldProcess("$instance", "Creating New MasterKey")) { + New-DbaDbMasterKey -SqlInstance $instance -Database master -SecurePassword $SecurePassword -Credential $Credential + } + } + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function New-DbaSsisCatalog { + <# + .SYNOPSIS + Enables the SSIS Catalog on a SQL Server 2012+ + + .DESCRIPTION + After installing the SQL Server Engine and SSIS you still have to enable the SSIS Catalog. This function will enable the catalog and gives the option of supplying the password. + + .PARAMETER SqlInstance + SQL Server you wish to run the function on. + + .PARAMETER SqlCredential + Credentials used to connect to the SQL Server + + .PARAMETER SecurePassword + Required password that will be used for the security key in SSISDB. + + .PARAMETER Credential + Use a credential object instead of a securepassword + + .PARAMETER SsisCatalog + SSIS catalog name. By default, this is SSISDB. + + .PARAMETER WhatIf + Shows what would happen if the command were to run. No actions are actually performed. + + .PARAMETER Confirm + Prompts you for confirmation before executing any changing operations within the command. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: SSIS, SSISDB, Catalog + Author: Stephen Bennett, https://sqlnotesfromtheunderground.wordpress.com/ + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/New-DbaSsisCatalog + + .EXAMPLE + PS C:\> $SecurePassword = Read-Host -AsSecureString -Prompt "Enter password" + PS C:\> New-DbaSsisCatalog -SqlInstance DEV01 -SecurePassword $SecurePassword + + Creates the SSIS Catalog on server DEV01 with the specified password. + + .EXAMPLE + PS C:\> New-DbaSsisCatalog -SqlInstance sql2016 -Credential usernamedoesntmatter + + Creates the SSIS Catalog on server DEV01 with the specified password in the credential prompt. As the example username suggets the username does not matter. + This is simply an easier way to get a secure password. + #> + [CmdletBinding(SupportsShouldProcess)] + param ( + [parameter(Mandatory, ValueFromPipeline)] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [PSCredential]$Credential, + [Alias("Password")] + [Security.SecureString]$SecurePassword, + [string]$SsisCatalog = "SSISDB", + [switch]$EnableException + ) + begin { + if (-not $SecurePassword -and -not $Credential) { + Stop-Function -Message "You must specify either -SecurePassword or -Credential" + return + } + if (-not $SecurePassword -and $Credential) { + $SecurePassword = $Credential.Password + } + } + process { + if (Test-FunctionInterrupt) { + return + } + foreach ($instance in $SqlInstance) { + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential -MinimumVersion 10 + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + ## check if SSIS and Engine running on box + $services = Get-DbaService -ComputerName $server.ComputerName + + $ssisservice = $Services | Where-Object { + $_.ServiceType -eq "SSIS" -and $_.State -eq "Running" + } + + if (-not $ssisservice) { + Stop-Function -Message "SSIS is not running on $instance" -Continue -Target $instance + } + + #if SQL 2012 or higher only validate databases with ContainmentType = NONE + $clrenabled = Get-DbaSpConfigure -SqlInstance $server -Name IsSqlClrEnabled + + if (-not $clrenabled.RunningValue) { + Stop-Function -Message 'CLR Integration must be enabled. You can enable it by running Set-DbaSpConfigure -SqlInstance sql2012 -Config IsSqlClrEnabled -Value $true' -Continue -Target $instance + } + + try { + $ssis = New-Object Microsoft.SqlServer.Management.IntegrationServices.IntegrationServices $server + } catch { + Stop-Function -Message "Can't load server" -Target $instance -ErrorRecord $_ + return + } + + if ($ssis.Catalogs.Count -gt 0) { + Stop-Function -Message "SSIS Catalog already exists" -Continue -Target $ssis.Catalogs + } else { + if ($Pscmdlet.ShouldProcess($server, "Creating SSIS catalog: $SsisCatalog")) { + try { + $ssisdb = New-Object Microsoft.SqlServer.Management.IntegrationServices.Catalog ($ssis, $SsisCatalog, $(([System.Runtime.InteropServices.marshal]::PtrToStringAuto([System.Runtime.InteropServices.marshal]::SecureStringToBSTR($SecurePassword))))) + } catch { + Stop-Function -Message "Failed to create SSIS Catalog: $_" -Target $_ -Continue + } + try { + $ssisdb.Create() + [pscustomobject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + SsisCatalog = $SsisCatalog + Created = $true + } + } catch { + $msg = $_.Exception.InnerException.InnerException.Message + if (-not $msg) { + $msg = $_ + } + Stop-Function -Message "$msg" -Target $_ -Continue + } + } + } + } + } +} +function New-DbatoolsSupportPackage { + <# + .SYNOPSIS + Creates a package of troubleshooting information that can be used by dbatools to help debug issues. + + .DESCRIPTION + This function creates an extensive debugging package that can help with reproducing and fixing issues. + + The file will be created on the desktop by default and will contain quite a bit of information: + - OS Information + - Hardware Information (CPU, Ram, things like that) + - .NET Information + - PowerShell Information + - Your input history + - The In-Memory message log + - The In-Memory error log + - Screenshot of the console buffer (Basically, everything written in your current console, even if you have to scroll upwards to see it. + + .PARAMETER Path + The folder where to place the output xml in. + + .PARAMETER Variables + Name of additional variables to attach. + This allows you to add the content of variables to the support package, if you believe them to be relevant to the case. + + .PARAMETER PassThru + Returns file object that was created during execution. + + .PARAMETER WhatIf + If this switch is enabled, no actions are performed but informational messages will be displayed that explain what would happen if the command were to run. + + .PARAMETER Confirm + If this switch is enabled, you will be prompted for confirmation before executing any operations that change state. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Debug + Author: Friedrich Weinmann (@FredWeinmann) + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/New-DbatoolsSupportPackage + + .EXAMPLE + PS C:\> New-DbatoolsSupportPackage + + Creates a large support pack in order to help us troubleshoot stuff. + + #> + [CmdletBinding(SupportsShouldProcess)] + param ( + [string] + $Path = "$($env:USERPROFILE)\Desktop", + + [string[]] + $Variables, + + [switch] + $PassThru, + + [switch] + [Alias('Silent')]$EnableException + ) + + begin { + Write-Message -Level InternalComment -Message "Starting" + Write-Message -Level Verbose -Message "Bound parameters: $($PSBoundParameters.Keys -join ", ")" + + #region Helper functions + function Get-ShellBuffer { + [CmdletBinding()] + param () + + try { + # Define limits + $rec = New-Object System.Management.Automation.Host.Rectangle + $rec.Left = 0 + $rec.Right = $host.ui.rawui.BufferSize.Width - 1 + $rec.Top = 0 + $rec.Bottom = $host.ui.rawui.BufferSize.Height - 1 + + # Load buffer + $buffer = $host.ui.rawui.GetBufferContents($rec) + + # Convert Buffer to list of strings + $int = 0 + $lines = @() + while ($int -le $rec.Bottom) { + $n = 0 + $line = "" + while ($n -le $rec.Right) { + $line += $buffer[$int, $n].Character + $n++ + } + $line = $line.TrimEnd() + $lines += $line + $int++ + } + + # Measure empty lines at the beginning + $int = 0 + $temp = $lines[$int] + while ($temp -eq "") { $int++; $temp = $lines[$int] } + + # Measure empty lines at the end + $z = $rec.Bottom + $temp = $lines[$z] + while ($temp -eq "") { $z--; $temp = $lines[$z] } + + # Skip the line launching this very function + $z-- + + # Measure empty lines at the end (continued) + $temp = $lines[$z] + while ($temp -eq "") { $z--; $temp = $lines[$z] } + + # Cut results to the limit and return them + return $lines[$int .. $z] + } catch { + # here to avoid an empty catch + $null = 1 + } + } + #endregion Helper functions + } + process { + if ($Pscmdlet.ShouldProcess("Creating a Support Package for diagnosing Dbatools")) { + + $filePathXml = "$($Path.Trim('\'))\dbatools_support_pack_$(Get-Date -Format "yyyy_MM_dd-HH_mm_ss").xml" + $filePathZip = $filePathXml -replace "\.xml$", ".zip" + + Write-Message -Level Critical -Message @" +Gathering information... +Will write the final output to: $filePathZip + +Please submit this file to the team, to help with troubleshooting whatever issue you encountered. +Be aware that this package contains a lot of information including your input history in the console. +Please make sure no sensitive data (such as passwords) can be caught this way. + +Ideally start a new console, perform the minimal steps required to reproduce the issue, then run this command. +This will make it easier for us to troubleshoot and you won't be sending us the keys to your castle. +"@ + + $hash = @{ } + Write-Message -Level Output -Message "Collecting dbatools logged messages (Get-DbatoolsLog)" + $hash["Messages"] = Get-DbatoolsLog + Write-Message -Level Output -Message "Collecting dbatools logged errors (Get-DbatoolsLog -Errors)" + $hash["Errors"] = Get-DbatoolsLog -Errors + Write-Message -Level Output -Message "Collecting copy of console buffer (what you can see on your console)" + $hash["ConsoleBuffer"] = Get-ShellBuffer + Write-Message -Level Output -Message "Collecting Operating System information (Win32_OperatingSystem)" + $hash["OperatingSystem"] = Get-DbaCmObject -ClassName Win32_OperatingSystem + Write-Message -Level Output -Message "Collecting CPU information (Win32_Processor)" + $hash["CPU"] = Get-DbaCmObject -ClassName Win32_Processor + Write-Message -Level Output -Message "Collecting Ram information (Win32_PhysicalMemory)" + $hash["Ram"] = Get-DbaCmObject -ClassName Win32_PhysicalMemory + Write-Message -Level Output -Message "Collecting PowerShell & .NET Version (`$PSVersionTable)" + $hash["PSVersion"] = $PSVersionTable + Write-Message -Level Output -Message "Collecting Input history (Get-History)" + $hash["History"] = Get-History + Write-Message -Level Output -Message "Collecting list of loaded modules (Get-Module)" + $hash["Modules"] = Get-Module + # Snapins not supported in Core: https://github.com/PowerShell/PowerShell/issues/6135 + if ($PSVersionTable.PSEdition -ne 'Core') { + Write-Message -Level Output -Message "Collecting list of loaded snapins (Get-PSSnapin)" + $hash["SnapIns"] = Get-PSSnapin + } + Write-Message -Level Output -Message "Collecting list of loaded assemblies (Name, Version, and Location)" + $hash["Assemblies"] = [appdomain]::CurrentDomain.GetAssemblies() | Select-Object CodeBase, FullName, Location, ImageRuntimeVersion, GlobalAssemblyCache, IsDynamic + + if (Test-Bound "Variables") { + Write-Message -Level Output -Message "Adding variables specified for export: $($Variables -join ", ")" + $hash["Variables"] = $Variables | Get-Variable -ErrorAction Ignore + } + + $data = [pscustomobject]$hash + + try { $data | Export-Clixml -Path $filePathXml -ErrorAction Stop } + catch { + Stop-Function -Message "Failed to export dump to file!" -ErrorRecord $_ -Target $filePathXml + return + } + + try { Compress-Archive -Path $filePathXml -DestinationPath $filePathZip -ErrorAction Stop } + catch { + Stop-Function -Message "Failed to pack dump-file into a zip archive. Please do so manually before submitting the results as the unpacked xml file will be rather large." -ErrorRecord $_ -Target $filePathZip + return + } + + Remove-Item -Path $filePathXml -ErrorAction Ignore + if ($PassThru) { + Get-Item $filePathZip + } + } + } + end { + Write-Message -Level InternalComment -Message "Ending" + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function New-DbaXESession { + <# + .SYNOPSIS + Creates a new XESession object - for the dogged. + + .DESCRIPTION + Creates a new XESession object - for the dogged (very manual, Import-DbaXESessionTemplate is recommended). See the following for more info: + + https://docs.microsoft.com/en-us/sql/relational-databases/extended-events/use-the-powershell-provider-for-extended-events + + .PARAMETER SqlInstance + The target SQL Server instance or instances. You must have sysadmin access and server version must be SQL Server version 2008 or higher. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Name + The Name of the session to be created. + + .PARAMETER WhatIf + If this switch is enabled, no actions are performed but informational messages will be displayed that explain what would happen if the command were to run. + + .PARAMETER Confirm + If this switch is enabled, you will be prompted for confirmation before executing any operations that change state. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: ExtendedEvent, XE, XEvent + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/New-DbaXESession + + .EXAMPLE + PS C:\> $session = New-DbaXESession -SqlInstance sql2017 -Name XeSession_Test + PS C:\> $event = $session.AddEvent("sqlserver.file_written") + PS C:\> $event.AddAction("package0.callstack") + PS C:\> $session.Create() + + Returns a new XE Session object from sql2017 then adds an event, an action then creates it. + + #> + [CmdletBinding(SupportsShouldProcess)] + param ( + [parameter(Mandatory, ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [parameter(Mandatory)] + [string]$Name, + [switch]$EnableException + ) + process { + foreach ($instance in $SqlInstance) { + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential -MinimumVersion 11 + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + if ($Pscmdlet.ShouldProcess($instance, "Creating new XESession")) { + $SqlConn = $server.ConnectionContext.SqlConnectionObject + $SqlStoreConnection = New-Object Microsoft.SqlServer.Management.Sdk.Sfc.SqlStoreConnection $SqlConn + $store = New-Object Microsoft.SqlServer.Management.XEvent.XEStore $SqlStoreConnection + + $store.CreateSession($Name) + } + } + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function New-DbaXESmartCsvWriter { + <# + .SYNOPSIS + This response type is used to write Extended Events to a CSV file. + + .DESCRIPTION + This response type is used to write Extended Events to a CSV file. + + .PARAMETER OutputFile + Specifies the path to the output CSV file. + + .PARAMETER Overwrite + Specifies whether any existiting file should be overwritten or not. + + .PARAMETER OutputColumn + Specifies the list of columns to output from the events. XESmartTarget will capture in memory and write to the target table only the columns (fields or targets) that are present in this list. + + Fields and actions are matched in a case-sensitive manner. + + Expression columns are supported. Specify a column with ColumnName AS Expression to add an expression column (Example: Total AS Reads + Writes) + + .PARAMETER Event + Specifies a list of events to be processed (with others being ignored. By default, all events are processed. + + .PARAMETER Filter + Specifies a filter expression in the same form as you would use in the WHERE clause of a SQL query. + + Example: duration > 10000 AND cpu_time > 10000 + + .PARAMETER WhatIf + If this switch is enabled, no actions are performed but informational messages will be displayed that explain what would happen if the command were to run. + + .PARAMETER Confirm + If this switch is enabled, you will be prompted for confirmation before executing any operations that change state. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: ExtendedEvent, XE, XEvent, SmartTarget + Author: Chrissy LeMaire (@cl) | SmartTarget by Gianluca Sartori (@spaghettidba) + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/New-DbaXESmartCsvWriter + + .EXAMPLE + PS C:\> $columns = "cpu_time", "duration", "physical_reads", "logical_reads", "writes", "row_count" + PS C:\> $response = New-DbaXESmartCsvWriter -OutputFile c:\temp\workload.csv -OutputColumn $columns -OverWrite -Event "sql_batch_completed" + PS C:\> Start-DbaXESmartTarget -SqlInstance localhost\sql2017 -Session "Profiler Standard" -Responder $response + + Writes Extended Events to the file "C:\temp\workload.csv". + + #> + [CmdletBinding(SupportsShouldProcess)] + param ( + [parameter(Mandatory)] + [string]$OutputFile, + [switch]$Overwrite, + [string[]]$Event, + [string[]]$OutputColumn, + [string]$Filter, + [switch]$EnableException + ) + + begin { + try { + Add-Type -Path "$script:PSModuleRoot\bin\XESmartTarget\XESmartTarget.Core.dll" -ErrorAction Stop + } catch { + Stop-Function -Message "Could not load XESmartTarget.Core.dll" -ErrorRecord $_ -Target "XESmartTarget" + return + } + } + process { + if (Test-FunctionInterrupt) { return } + + if ($Pscmdlet.ShouldProcess("Creating new XESmartCsvWriter Object")) { + try { + $writer = New-Object -TypeName XESmartTarget.Core.Responses.CsvAppenderResponse + $writer.OutputFile = $OutputFile + $writer.OverWrite = $Overwrite + if (Test-Bound -ParameterName "Event") { + $writer.Events = $Event + } + if (Test-Bound -ParameterName "OutputColumn") { + $writer.OutputColumns = $OutputColumn + } + if (Test-Bound -ParameterName "Filter") { + $writer.Filter = $Filter + } + $writer + } catch { + Stop-Function -Message "Failure" -ErrorRecord $_ -Target "XESmartTarget" -Continue + } + } + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function New-DbaXESmartEmail { + <# + .SYNOPSIS + This response type can be used to send an email each time an event is captured. + + .DESCRIPTION + This response type can be used to send an email each time an event is captured. + + .PARAMETER SmtpServer + Address of the SMTP server for outgoing mail. + + .PARAMETER Sender + Sender's email address. + + .PARAMETER To + Address of the To recipient(s). + + .PARAMETER Cc + Address of the Cc recipient(s). + + .PARAMETER Bcc + Address of the Bcc recipient(s). + + .PARAMETER Credential + Credential object containing username and password used to authenticate on the SMTP server. When blank, no authentication is performed. + + .PARAMETER Subject + Subject of the mail message. Accepts placeholders in the text. + + Placeholders are in the form {PropertyName}, where PropertyName is one of the fields or actions available in the Event object. + + For instance, a valid Subject in a configuration file looks like this: "An event of name {Name} occurred at {collection_time}" + + .PARAMETER Body + Body of the mail message. The body can be static text or any property taken from the underlying event. See Subject for a description of how placeholders work. + + .PARAMETER Attachment + Data to attach to the email message. At this time, it can be any of the fields/actions of the underlying event. The data from the field/action is attached to the message as an ASCII stream. A single attachment is supported. + + .PARAMETER AttachmentFileName + File name to assign to the attachment. + + .PARAMETER PlainText + If this switch is enabled, the email will be sent in plain text. By default, HTML formatting is used. + + .PARAMETER Event + Each Response can be limited to processing specific events, while ignoring all the other ones. When this attribute is omitted, all events are processed. + + .PARAMETER Filter + You can specify a filter expression by using this attribute. The filter expression is in the same form that you would use in a SQL query. For example, a valid example looks like this: duration > 10000 AND cpu_time > 10000 + + .PARAMETER WhatIf + If this switch is enabled, no actions are performed but informational messages will be displayed that explain what would happen if the command were to run. + + .PARAMETER Confirm + If this switch is enabled, you will be prompted for confirmation before executing any operations that change state. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: ExtendedEvent, XE, XEvent, SmartTarget + Author: Chrissy LeMaire (@cl) | SmartTarget by Gianluca Sartori (@spaghettidba) + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/New-DbaXESmartEmail + + .EXAMPLE + PS C:\> $params = @{ + >> SmtpServer = "smtp.ad.local" + >> To = "admin@ad.local" + >> Sender = "reports@ad.local" + >> Subject = "Query executed" + >> Body = "Query executed at {collection_time}" + >> Attachment = "batch_text" + >> AttachmentFileName = "query.sql" + >> } + >> + PS C:\> $emailresponse = New-DbaXESmartEmail @params + PS C:\> Start-DbaXESmartTarget -SqlInstance sql2017 -Session querytracker -Responder $emailresponse + + Sends an email each time a querytracker event is captured. + + #> + [CmdletBinding(SupportsShouldProcess)] + param ( + [parameter(Mandatory)] + [string]$SmtpServer, + [parameter(Mandatory)] + [string]$Sender, + [parameter(Mandatory)] + [string[]]$To, + [string[]]$Cc, + [string[]]$Bcc, + [pscredential]$Credential, + [parameter(Mandatory)] + [string]$Subject, + [parameter(Mandatory)] + [string]$Body, + [string]$Attachment, + [string]$AttachmentFileName, + [string]$PlainText, + [string[]]$Event, + [string]$Filter, + [switch]$EnableException + ) + begin { + try { + Add-Type -Path "$script:PSModuleRoot\bin\XESmartTarget\XESmartTarget.Core.dll" -ErrorAction Stop + } catch { + Stop-Function -Message "Could not load XESmartTarget.Core.dll." -ErrorRecord $_ -Target "XESmartTarget" + return + } + } + process { + if (Test-FunctionInterrupt) { return } + + if ($Pscmdlet.ShouldProcess("Creating new XESmartEmail Object")) { + try { + $email = New-Object -TypeName XESmartTarget.Core.Responses.EmailResponse + $email.SmtpServer = $SmtpServer + $email.Sender = $Sender + $email.To = $To + $email.Cc = $Cc + $email.Bcc = $Bcc + $email.Subject = $Subject + $email.Body = $Body + $email.Attachment = $Attachment + $email.AttachmentFileName = $AttachmentFileName + $email.HTMLFormat = ($PlainText -eq $false) + if (Test-Bound -ParameterName "Event") { + $email.Events = $Event + } + if (Test-Bound -ParameterName "Filter") { + $email.Filter = $Filter + } + + if ($Credential) { + $email.UserName = $Credential.UserName + $email.Password = $Credential.GetNetworkCredential().Password + } + + $email + } catch { + Stop-Function -Message "Failure" -ErrorRecord $_ -Target "XESmartTarget" -Continue + } + } + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function New-DbaXESmartQueryExec { + <# + .SYNOPSIS + This response type executes a T-SQL command against a target database whenever an event is recorded. + + .DESCRIPTION + This response type executes a T-SQL command against a target database whenever an event is recorded. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. You must have sysadmin access and server version must be SQL Server version 2008 or higher. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Database + Specifies the name of the database that contains the target table. + + .PARAMETER Query + The T-SQL command to execute. This string can contain placeholders for properties taken from the events. + + Placeholders are in the form {PropertyName}, where PropertyName is one of the fields or actions available in the Event object. + + .PARAMETER Event + Each Response can be limited to processing specific events, while ignoring all the other ones. When this attribute is omitted, all events are processed. + + .PARAMETER Filter + You can specify a filter expression by using this attribute. The filter expression is in the same form that you would use in a SQL query. For example, a valid example looks like this: duration > 10000 AND cpu_time > 10000 + + .PARAMETER WhatIf + If this switch is enabled, no actions are performed but informational messages will be displayed that explain what would happen if the command were to run. + + .PARAMETER Confirm + If this switch is enabled, you will be prompted for confirmation before executing any operations that change state. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: ExtendedEvent, XE, XEvent, SmartTarget + Author: Chrissy LeMaire (@cl) | SmartTarget by Gianluca Sartori (@spaghettidba) + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/New-DbaXESmartQueryExec + + .EXAMPLE + PS C:\> $response = New-DbaXESmartQueryExec -SqlInstance sql2017 -Database dbadb -Query "update table set whatever = 1" + PS C:\> Start-DbaXESmartTarget -SqlInstance sql2017 -Session deadlock_tracker -Responder $response + + Executes a T-SQL command against dbadb on sql2017 whenever a deadlock event is recorded. + + #> + [CmdletBinding(SupportsShouldProcess)] + param ( + [parameter(Mandatory, ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [string]$Database, + [string]$Query, + [switch]$EnableException, + [string[]]$Event, + [string]$Filter + ) + begin { + try { + Add-Type -Path "$script:PSModuleRoot\XESmartTarget\XESmartTarget.Core.dll" -ErrorAction Stop + } catch { + Stop-Function -Message "Could not load XESmartTarget.Core.dll" -ErrorRecord $_ -Target "XESmartTarget" + return + } + } + process { + if (Test-FunctionInterrupt) { + return + } + + foreach ($instance in $SqlInstance) { + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential -MinimumVersion 11 + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + if ($Pscmdlet.ShouldProcess($instance, "Creating new XESmartQueryExec")) { + $execute = New-Object -TypeName XESmartTarget.Core.Responses.ExecuteTSQLResponse + $execute.ServerName = $server.Name + $execute.DatabaseName = $Database + $execute.TSQL = $Query + + if ($SqlCredential) { + $execute.UserName = $SqlCredential.UserName + $execute.Password = $SqlCredential.GetNetworkCredential().Password + } + + if (Test-Bound -ParameterName "Event") { + $execute.Events = $Event + } + if (Test-Bound -ParameterName "Filter") { + $execute.Filter = $Filter + } + + $execute + } + } + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function New-DbaXESmartReplay { + <# + .SYNOPSIS + This response type can be used to replay execution related events to a target SQL Server instance. + + .DESCRIPTION + This response type can be used to replay execution related events to a target SQL Server instance. The events that you can replay are of the type sql_batch_completed and rpc_completed: all other events are ignored. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. You must have sysadmin access and server version must be SQL Server version 2008 or higher. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Database + Name of the initial catalog to connect to. Statements will be replayed by changing database to the same database where the event was originally captured, so this property only controls the initial database to connect to. + + .PARAMETER Event + Each Response can be limited to processing specific events, while ignoring all the other ones. When this attribute is omitted, all events are processed. + + .PARAMETER Filter + Specifies a filter expression in the same form as you would use in the WHERE clause of a SQL query. + + Example: duration > 10000 AND cpu_time > 10000 + + .PARAMETER DelaySeconds + Specifies the duration of the delay in seconds. + + .PARAMETER ReplayIntervalSeconds + Specifies the duration of the replay interval in seconds. + + .PARAMETER StopOnError + If this switch is enabled, the replay will be stopped when the first error is encountered. By default, error messages are piped to the log and console output, and replay proceeds. + + .PARAMETER WhatIf + If this switch is enabled, no actions are performed but informational messages will be displayed that explain what would happen if the command were to run. + + .PARAMETER Confirm + If this switch is enabled, you will be prompted for confirmation before executing any operations that change state. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: ExtendedEvent, XE, XEvent, SmartTarget + Author: Chrissy LeMaire (@cl) | SmartTarget by Gianluca Sartori (@spaghettidba) + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/New-DbaXESmartReplay + + .EXAMPLE + PS C:\> $response = New-DbaXESmartReplay -SqlInstance sql2017 -Database planning + PS C:\> Start-DbaXESmartTarget -SqlInstance sql2016 -Session loadrelay -Responder $response + + Replays events from sql2016 on sql2017 in the planning database. Returns a PowerShell job object. + + To see a list of all SmartTarget job objects, use Get-DbaXESmartTarget. + + .EXAMPLE + PS C:\> $response = New-DbaXESmartReplay -SqlInstance sql2017 -Database planning + PS C:\> Start-DbaXESmartTarget -SqlInstance sql2017 -Session 'Profiler Standard' -Responder $response -NotAsJob + + Replays events from the 'Profiler Standard' session on sql2016 to sql2017's planning database. Does not run as a job so you can see the raw output. + + #> + [CmdletBinding(SupportsShouldProcess)] + param ( + [parameter(Mandatory, ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [string]$Database, + [string[]]$Event = "sql_batch_completed", + [string]$Filter, + [int]$DelaySeconds, + [switch]$StopOnError, + [int]$ReplayIntervalSeconds, + [switch]$EnableException + ) + begin { + try { + Add-Type -Path "$script:PSModuleRoot\bin\XESmartTarget\XESmartTarget.Core.dll" -ErrorAction Stop + } catch { + Stop-Function -Message "Could not load XESmartTarget.Core.dll" -ErrorRecord $_ -Target "XESmartTarget" + return + } + } + process { + if (Test-FunctionInterrupt) { return } + + foreach ($instance in $SqlInstance) { + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential -MinimumVersion 11 + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + if ($Pscmdlet.ShouldProcess($instance, "Creating new XESmartReply")) { + Write-Message -Message "Making a New XE SmartReplay for $Event against $instance running on $($server.name)" -Level Verbose + try { + $replay = New-Object -TypeName XESmartTarget.Core.Responses.ReplayResponse + $replay.ServerName = $instance + $replay.DatabaseName = $Database + $replay.Events = $Event + $replay.StopOnError = $StopOnError + $replay.Filter = $Filter + $replay.DelaySeconds = $DelaySeconds + $replay.ReplayIntervalSeconds = $ReplayIntervalSeconds + + if ($SqlCredential) { + $replay.UserName = $SqlCredential.UserName + $replay.Password = $SqlCredential.GetNetworkCredential().Password + } + + $replay + } catch { + $message = $_.Exception.InnerException.InnerException | Out-String + Stop-Function -Message $message -Target "XESmartTarget" -Continue + } + } + } + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function New-DbaXESmartTableWriter { + <# + .SYNOPSIS + This response type is used to write Extended Events to a database table. + + .DESCRIPTION + This response type is used to write Extended Events to a database table. The events are temporarily stored in memory before being written to the database at regular intervals. + + The target table can be created manually upfront or you can let the TableAppenderResponse create a target table based on the fields and actions available in the events captured. + + The columns of the target table and the fields/actions of the events are mapped by name (case-sensitive). + + .PARAMETER SqlInstance + The target SQL Server instance or instances. You must have sysadmin access and server version must be SQL Server version 2008 or higher. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Database + Specifies the name of the database that contains the target table. + + .PARAMETER Table + Specifies the name of the target table. + + .PARAMETER AutoCreateTargetTable + If this switch is enabled, XESmartTarget will infer the definition of the target table from the columns captured in the Extended Events session. + + If the target table already exists, it will not be recreated. + + .PARAMETER UploadIntervalSeconds + Specifies the number of seconds XESmartTarget will keep the events in memory before dumping them to the target table. The default is 10 seconds. + + .PARAMETER OutputColumn + Specifies the list of columns to output from the events. XESmartTarget will capture in memory and write to the target table only the columns (fields or targets) that are present in this list. + + Fields and actions are matched in a case-sensitive manner. + + Expression columns are supported. Specify a column with ColumnName AS Expression to add an expression column (Example: Total AS Reads + Writes) + + .PARAMETER Event + Specifies a list of events to be processed (with others being ignored. By default, all events are processed. + + .PARAMETER Filter + Specifies a filter expression in the same form as you would use in the WHERE clause of a SQL query. + + Example: duration > 10000 AND cpu_time > 10000 + + .PARAMETER WhatIf + If this switch is enabled, no actions are performed but informational messages will be displayed that explain what would happen if the command were to run. + + .PARAMETER Confirm + If this switch is enabled, you will be prompted for confirmation before executing any operations that change state. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: ExtendedEvent, XE, XEvent, SmartTarget + Author: Chrissy LeMaire (@cl) | SmartTarget by Gianluca Sartori (@spaghettidba) + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + SmartTarget: by Gianluca Sartori (@spaghettidba) + + .LINK + https://dbatools.io/New-DbaXESmartTableWriter + + .EXAMPLE + PS C:\> $columns = "cpu_time", "duration", "physical_reads", "logical_reads", "writes", "row_count", "batch_text" + PS C:\> $response = New-DbaXESmartTableWriter -SqlInstance sql2017 -Database dbadb -Table deadlocktracker -OutputColumn $columns -Filter "duration > 10000" + PS C:\> Start-DbaXESmartTarget -SqlInstance sql2017 -Session deadlock_tracker -Responder $response + + Writes Extended Events to the deadlocktracker table in dbadb on sql2017. + + #> + [CmdletBinding(SupportsShouldProcess)] + param ( + [parameter(Mandatory, ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [parameter(Mandatory)] + [string]$Database, + [parameter(Mandatory)] + [string]$Table, + [switch]$AutoCreateTargetTable, + [int]$UploadIntervalSeconds = 10, + [string[]]$Event, + [string[]]$OutputColumn, + [string]$Filter, + [switch]$EnableException + ) + begin { + try { + Add-Type -Path "$script:PSModuleRoot\bin\XESmartTarget\XESmartTarget.Core.dll" -ErrorAction Stop + } catch { + Stop-Function -Message "Could not load XESmartTarget.Core.dll" -ErrorRecord $_ -Target "XESmartTarget" + return + } + } + process { + if (Test-FunctionInterrupt) { return } + + foreach ($instance in $SqlInstance) { + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential -MinimumVersion 11 + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + if ($Pscmdlet.ShouldProcess($instance, "Creating new XESmartTableWriter")) { + try { + $writer = New-Object -TypeName XESmartTarget.Core.Responses.TableAppenderResponse + $writer.ServerName = $server.Name + $writer.DatabaseName = $Database + $writer.TableName = $Table + $writer.AutoCreateTargetTable = $AutoCreateTargetTable + $writer.UploadIntervalSeconds = $UploadIntervalSeconds + if (Test-Bound -ParameterName "Event") { + $writer.Events = $Event + } + if (Test-Bound -ParameterName "OutputColumn") { + $writer.OutputColumns = $OutputColumn + } + if (Test-Bound -ParameterName "Filter") { + $writer.Filter = $Filter + } + $writer + } catch { + Stop-Function -Message "Failure" -ErrorRecord $_ -Target "XESmartTarget" -Continue + } + } + } + } +} +function Publish-DbaDacPackage { + <# + .SYNOPSIS + The Publish-DbaDacPackage command takes a dacpac which is the output from an SSDT project and publishes it to a database. Changing the schema to match the dacpac and also to run any scripts in the dacpac (pre/post deploy scripts). + + .DESCRIPTION + Deploying a dacpac uses the DacFx which historically needed to be installed on a machine prior to use. In 2016 the DacFx was supplied by Microsoft as a nuget package (Microsoft.Data.Tools.MSBuild) and this uses that nuget package. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Path + Specifies the filesystem path to the DACPAC + + .PARAMETER PublishXml + Specifies the publish profile which will include options and sqlCmdVariables. + + .PARAMETER Database + Specifies the name of the database being published. + + .PARAMETER ConnectionString + Specifies the connection string to the database you are upgrading. This is not required if SqlInstance is specified. + + .PARAMETER GenerateDeploymentScript + If this switch is enabled, the publish script will be generated. + + .PARAMETER GenerateDeploymentReport + If this switch is enabled, the publish XML report will be generated. + + .PARAMETER Type + Selecting the type of the export: Dacpac (default) or Bacpac. + + .PARAMETER DacOption + Export options for a corresponding export type. Can be created by New-DbaDacOption -Type Dacpac | Bacpac + + .PARAMETER OutputPath + Specifies the filesystem path (directory) where output files will be generated. + + .PARAMETER ScriptOnly + If this switch is enabled, only the change scripts will be generated. + + .PARAMETER IncludeSqlCmdVars + If this switch is enabled, SqlCmdVars in publish.xml will have their values overwritten. + + .PARAMETER WhatIf + Shows what would happen if the command were to run. No actions are actually performed. + + .PARAMETER Confirm + Prompts you for confirmation before executing any changing operations within the command. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .PARAMETER DacFxPath + Path to the dac dll. If this is ommited, then the version of dac dll which is packaged with dbatools is used. + + .NOTES + Tags: Migration, Database, Dacpac + Author: Richie lee (@richiebzzzt) + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Publish-DbaDacPackage + + .EXAMPLE + PS C:\> $options = New-DbaDacOption -Type Dacpac -Action Publish + PS C:\> $options.DeployOptions.DropObjectsNotInSource = $true + PS C:\> Publish-DbaDacPackage -SqlInstance sql2016 -Database DB1 -DacOption $options -Path c:\temp\db.dacpac + + Uses DacOption object to set Deployment Options and updates DB1 database on sql2016 from the db.dacpac dacpac file, dropping objects that are missing from source. + + .EXAMPLE + PS C:\> Publish-DbaDacPackage -SqlInstance sql2017 -Database WideWorldImporters -Path C:\temp\sql2016-WideWorldImporters.dacpac -PublishXml C:\temp\sql2016-WideWorldImporters-publish.xml -Confirm + + Updates WideWorldImporters on sql2017 from the sql2016-WideWorldImporters.dacpac using the sql2016-WideWorldImporters-publish.xml publish profile. Prompts for confirmation. + + .EXAMPLE + PS C:\> New-DbaDacProfile -SqlInstance sql2016 -Database db2 -Path C:\temp + PS C:\> Export-DbaDacPackage -SqlInstance sql2016 -Database db2 | Publish-DbaDacPackage -PublishXml C:\temp\sql2016-db2-publish.xml -Database db1, db2 -SqlInstance sql2017 + + Creates a publish profile at C:\temp\sql2016-db2-publish.xml, exports the .dacpac to $home\Documents\sql2016-db2.dacpac. Does not prompt for confirmation. + then publishes it to the sql2017 server database db2 + + .EXAMPLE + PS C:\> $loc = "C:\Users\bob\source\repos\Microsoft.Data.Tools.Msbuild\lib\net46\Microsoft.SqlServer.Dac.dll" + PS C:\> Publish-DbaDacPackage -SqlInstance "local" -Database WideWorldImporters -Path C:\temp\WideWorldImporters.dacpac -PublishXml C:\temp\WideWorldImporters.publish.xml -DacFxPath $loc -Confirm + + Publishes the dacpac using a specific dacfx library. Prompts for confirmation. + + .EXAMPLE + PS C:\> Publish-DbaDacPackage -SqlInstance sql2017 -Database WideWorldImporters -Path C:\temp\sql2016-WideWorldImporters.dacpac -PublishXml C:\temp\sql2016-WideWorldImporters-publish.xml -GenerateDeploymentScript -ScriptOnly + + Does not deploy the changes, but will generate the deployment script that would be executed against WideWorldImporters. + + .EXAMPLE + PS C:\> Publish-DbaDacPackage -SqlInstance sql2017 -Database WideWorldImporters -Path C:\temp\sql2016-WideWorldImporters.dacpac -PublishXml C:\temp\sql2016-WideWorldImporters-publish.xml -GenerateDeploymentReport -ScriptOnly + + Does not deploy the changes, but will generate the deployment report that would be executed against WideWorldImporters. + #> + [CmdletBinding(DefaultParameterSetName = 'Obj', SupportsShouldProcess, ConfirmImpact = 'Medium')] + param ( + [Alias("ServerInstance", "SqlServer")] + [DbaInstance[]]$SqlInstance, + [Alias("Credential")] + [PSCredential]$SqlCredential, + [Parameter(Mandatory, ValueFromPipelineByPropertyName)] + [string]$Path, + [Parameter(Mandatory, ParameterSetName = 'Xml')] + [string]$PublishXml, + [Parameter(Mandatory, ValueFromPipelineByPropertyName)] + [string[]]$Database, + [string[]]$ConnectionString, + [parameter(ParameterSetName = 'Xml')] + [switch]$GenerateDeploymentScript, + [parameter(ParameterSetName = 'Xml')] + [switch]$GenerateDeploymentReport, + [Switch]$ScriptOnly, + [ValidateSet('Dacpac', 'Bacpac')] + [string]$Type = 'Dacpac', + [string]$OutputPath = "$home\Documents", + [switch]$IncludeSqlCmdVars, + [Parameter(ParameterSetName = 'Obj')] + [Alias("Option")] + [object]$DacOption, + [switch]$EnableException, + [String]$DacFxPath + ) + + begin { + if ((Test-Bound -Not -ParameterName SqlInstance) -and (Test-Bound -Not -ParameterName ConnectionString)) { + Stop-Function -Message "You must specify either SqlInstance or ConnectionString." + return + } + if ($Type -eq 'Dacpac') { + if ((Test-Bound -ParameterName GenerateDeploymentScript) -or (Test-Bound -ParameterName GenerateDeploymentReport)) { + $defaultcolumns = 'ComputerName', 'InstanceName', 'SqlInstance', 'Database', 'Dacpac', 'PublishXml', 'Result', 'DatabaseScriptPath', 'MasterDbScriptPath', 'DeploymentReport', 'DeployOptions', 'SqlCmdVariableValues' + } else { + $defaultcolumns = 'ComputerName', 'InstanceName', 'SqlInstance', 'Database', 'Dacpac', 'PublishXml', 'Result', 'DeployOptions', 'SqlCmdVariableValues' + } + } elseif ($Type -eq 'Bacpac') { + if ($ScriptOnly -or $GenerateDeploymentReport -or $GenerateDeploymentScript) { + Stop-Function -Message "ScriptOnly, GenerateDeploymentScript, and GenerateDeploymentReport cannot be used in a Bacpac scenario." -ErrorRecord $_ + return + } + $defaultcolumns = 'ComputerName', 'InstanceName', 'SqlInstance', 'Database', 'Bacpac', 'Result', 'DeployOptions' + } + + if ((Test-Bound -ParameterName ScriptOnly) -and (Test-Bound -Not -ParameterName GenerateDeploymentScript) -and (Test-Bound -Not -ParameterName GenerateDeploymentScript)) { + Stop-Function -Message "You must at least one of GenerateDeploymentScript or GenerateDeploymentReport when using ScriptOnly" + return + } + + function Get-ServerName ($connstring) { + $builder = New-Object System.Data.Common.DbConnectionStringBuilder + $builder.set_ConnectionString($connstring) + $instance = $builder['data source'] + + if (-not $instance) { + $instance = $builder['server'] + } + + return $instance.ToString().Replace('\', '-').Replace('(', '').Replace(')', '') + } + + if ((Test-Bound -Not -ParameterName 'DacfxPath') -and (-not $script:core)) { + $dacfxPath = "$script:PSModuleRoot\bin\smo\Microsoft.SqlServer.Dac.dll" + + if ((Test-Path $dacfxPath) -eq $false) { + Stop-Function -Message 'No usable version of Dac Fx found.' -EnableException $EnableException + return + } else { + try { + Add-Type -Path $dacfxPath + Write-Message -Level Verbose -Message "Dac Fx loaded." + } catch { + Stop-Function -Message 'No usable version of Dac Fx found.' -EnableException $EnableException -ErrorRecord $_ + } + } + } + + #Check Option object types - should have a specific type + if ($Type -eq 'Dacpac') { + if ($DacOption -and $DacOption -isnot [Microsoft.SqlServer.Dac.PublishOptions]) { + Stop-Function -Message "Microsoft.SqlServer.Dac.PublishOptions object type is expected - got $($DacOption.GetType())." + return + } + } elseif ($Type -eq 'Bacpac') { + if ($DacOption -and $DacOption -isnot [Microsoft.SqlServer.Dac.DacImportOptions]) { + Stop-Function -Message "Microsoft.SqlServer.Dac.DacImportOptions object type is expected - got $($DacOption.GetType())." + return + } + } + } + + process { + if (Test-FunctionInterrupt) { + return + } + + if (-not (Test-Path -Path $Path)) { + Stop-Function -Message "$Path not found!" + return + } + + if ($PsCmdlet.ParameterSetName -eq 'Xml') { + if (-not (Test-Path -Path $PublishXml)) { + Stop-Function -Message "$PublishXml not found!" + return + } + } + + foreach ($instance in $sqlinstance) { + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $sqlcredential + } catch { + Stop-Function -Message "Failure." -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + $ConnectionString += $server.ConnectionContext.ConnectionString.Replace('"', "'") + } + + #Use proper class to load the object + if ($Type -eq 'Dacpac') { + try { + $dacPackage = [Microsoft.SqlServer.Dac.DacPackage]::Load($Path) + } catch { + Stop-Function -Message "Could not load Dacpac." -ErrorRecord $_ + return + } + } elseif ($Type -eq 'Bacpac') { + try { + $bacPackage = [Microsoft.SqlServer.Dac.BacPackage]::Load($Path) + } catch { + Stop-Function -Message "Could not load Bacpac." -ErrorRecord $_ + return + } + } + #Load XML profile when used + if ($PsCmdlet.ParameterSetName -eq 'Xml') { + try { + $options = New-DbaDacOption -Type $Type -Action Publish -PublishXml $PublishXml -EnableException + } catch { + Stop-Function -Message "Could not load profile." -ErrorRecord $_ + return + } + } + #Create/re-use deployment options object + elseif ($PsCmdlet.ParameterSetName -eq 'Obj') { + if (!$DacOption) { + $options = New-DbaDacOption -Type $Type -Action Publish + } else { + $options = $DacOption + } + } + #Replace variables if defined + if ($IncludeSqlCmdVars) { + Get-SqlCmdVars -SqlCommandVariableValues $options.DeployOptions.SqlCommandVariableValues + } + + foreach ($connstring in $ConnectionString) { + $cleaninstance = Get-ServerName $connstring + $instance = $cleaninstance.ToString().Replace('--', '\') + + foreach ($dbname in $database) { + #Set deployment properties when specified + if (Test-Bound -ParameterName GenerateDeploymentScript) { + $options.GenerateDeploymentScript = $GenerateDeploymentScript + } + if (Test-Bound -ParameterName GenerateDeploymentReport) { + $options.GenerateDeploymentReport = $GenerateDeploymentReport + } + #Set output file paths when needed + $timeStamp = (Get-Date).ToString("yyMMdd_HHmmss_f") + if ($GenerateDeploymentScript) { + $options.DatabaseScriptPath = Join-Path $OutputPath "$cleaninstance-$dbname`_DeployScript_$timeStamp.sql" + $options.MasterDbScriptPath = Join-Path $OutputPath "$cleaninstance-$dbname`_Master.DeployScript_$timeStamp.sql" + } + if ($connstring -notmatch 'Database=') { + $connstring = "$connstring;Database=$dbname" + } + + #Create services object + try { + $dacServices = New-Object Microsoft.SqlServer.Dac.DacServices $connstring + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $server -Continue + } + + try { + $null = $output = Register-ObjectEvent -InputObject $dacServices -EventName "Message" -SourceIdentifier "msg" -ErrorAction SilentlyContinue -Action { + $EventArgs.Message.Message + } + #Perform proper action depending on the Type + if ($Type -eq 'Dacpac') { + if ($ScriptOnly) { + if (!$options.GenerateDeploymentScript) { + Stop-Function -Message "GenerateDeploymentScript option should be specified when running with -ScriptOnly" -EnableException $true + } + if (!$options.DatabaseScriptPath) { + Stop-Function -Message "DatabaseScriptPath option should be specified when running with -ScriptOnly" -EnableException $true + } + if ($Pscmdlet.ShouldProcess($instance, "Generating script")) { + $result = $dacServices.Script($dacPackage, $dbname, $options) + } + } else { + if ($Pscmdlet.ShouldProcess($instance, "Executing Dacpac publish")) { + $result = $dacServices.Publish($dacPackage, $dbname, $options) + } + } + } elseif ($Type -eq 'Bacpac') { + if ($Pscmdlet.ShouldProcess($instance, "Executing Bacpac import")) { + $dacServices.ImportBacpac($bacPackage, $dbname, $options, $null) + } + } + } catch [Microsoft.SqlServer.Dac.DacServicesException] { + Stop-Function -Message "Deployment failed" -ErrorRecord $_ -Continue + } finally { + Unregister-Event -SourceIdentifier "msg" + if ($Pscmdlet.ShouldProcess($instance, "Generating deployment report and output")) { + if ($options.GenerateDeploymentReport) { + $deploymentReport = Join-Path $OutputPath "$cleaninstance-$dbname`_Result.DeploymentReport_$timeStamp.xml" + $result.DeploymentReport | Out-File $deploymentReport + Write-Message -Level Verbose -Message "Deployment Report - $deploymentReport." + } + if ($options.GenerateDeploymentScript) { + Write-Message -Level Verbose -Message "Database change script - $($options.DatabaseScriptPath)." + if ((Test-Path $options.MasterDbScriptPath)) { + Write-Message -Level Verbose -Message "Master database change script - $($result.MasterDbScript)." + } + } + $resultoutput = ($output.output -join "`r`n" | Out-String).Trim() + if ($resultoutput -match "Failed" -and ($options.GenerateDeploymentReport -or $options.GenerateDeploymentScript)) { + Write-Message -Level Warning -Message "Seems like the attempt to publish/script may have failed. If scripts have not generated load dacpac into Visual Studio to check SQL is valid." + } + $server = [dbainstance]$instance + if ($Type -eq 'Dacpac') { + $output = [pscustomobject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.InstanceName + SqlInstance = $server.FullName + Database = $dbname + Result = $resultoutput + Dacpac = $Path + PublishXml = $PublishXml + ConnectionString = $connstring + DatabaseScriptPath = $options.DatabaseScriptPath + MasterDbScriptPath = $options.MasterDbScriptPath + DeploymentReport = $DeploymentReport + DeployOptions = $options.DeployOptions | Select-Object -Property * -ExcludeProperty "SqlCommandVariableValues" + SqlCmdVariableValues = $options.DeployOptions.SqlCommandVariableValues.Keys + } + } elseif ($Type -eq 'Bacpac') { + $output = [pscustomobject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.InstanceName + SqlInstance = $server.FullName + Database = $dbname + Result = $resultoutput + Bacpac = $Path + ConnectionString = $connstring + DeployOptions = $options + } + } + $output | Select-DefaultView -Property $defaultcolumns + } + } + } + } + } + end { + Test-DbaDeprecation -DeprecatedOn "1.0.0" -EnableException:$false -Alias Publish-DbaDacpac + } +} +function Read-DbaAuditFile { + <# + .SYNOPSIS + Read Audit details from *.sqlaudit files. + + .DESCRIPTION + Read Audit details from *.sqlaudit files. + + .PARAMETER Path + The path to the *.sqlaudit file. This is relative to the computer executing the command. UNC paths are supported. + + .PARAMETER Exact + If this switch is enabled, only an exact search will be used for the Path. By default, this command will add a wildcard to the Path because Eventing uses the file name as a template and adds characters. + + .PARAMETER Raw + If this switch is enabled, the Microsoft.SqlServer.XEvent.Linq.PublishedEvent enumeration object will be returned. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: ExtendedEvent, Audit + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Read-DbaAuditFile + + .EXAMPLE + PS C:\> Read-DbaAuditFile -Path C:\temp\logins.sqlaudit + + Returns events from C:\temp\logins.sqlaudit. + + .EXAMPLE + PS C:\> Get-ChildItem C:\temp\audit\*.sqlaudit | Read-DbaAuditFile + + Returns events from all .sqlaudit files in C:\temp\audit. + + .EXAMPLE + PS C:\> Get-DbaServerAudit -SqlInstance sql2014 -Audit LoginTracker | Read-DbaAuditFile + + Reads remote Audit details by accessing the file over the admin UNC share. + + #> + [CmdletBinding()] + param ( + [parameter(Mandatory, ValueFromPipeline)] + [Alias('FullName')] + [object[]]$Path, + [switch]$Exact, + [switch]$Raw, + [switch]$EnableException + ) + process { + foreach ($file in $path) { + # in order to ensure CSV gets all fields, all columns will be + # collected and output in the first (all all subsequent) object + $columns = @("name", "timestamp") + + if ($file -is [System.String]) { + $currentfile = $file + #Variable marked as unused by PSScriptAnalyzer + #$manualadd = $true + } elseif ($file -is [System.IO.FileInfo]) { + $currentfile = $file.FullName + #Variable marked as unused by PSScriptAnalyzer + #$manualadd = $true + } else { + if ($file -isnot [Microsoft.SqlServer.Management.Smo.Audit]) { + Stop-Function -Message "Unsupported file type." + return + } + + if ($file.FullName.Length -eq 0) { + Stop-Function -Message "This Audit does not have an associated file." + return + } + + $instance = [dbainstance]$file.ComputerName + + if ($instance.IsLocalHost) { + $currentfile = $file.FullName + } else { + $currentfile = $file.RemoteFullName + } + } + + if (-not $Exact) { + $currentfile = $currentfile.Replace('.sqlaudit', '*.sqlaudit') + + if ($currentfile -notmatch "sqlaudit") { + $currentfile = "$currentfile*.sqlaudit" + } + } + + $accessible = Test-Path -Path $currentfile + $whoami = whoami + + if (-not $accessible) { + if ($file.Status -eq "Stopped") { continue } + Stop-Function -Continue -Message "$currentfile cannot be accessed from $($env:COMPUTERNAME). Does $whoami have access?" + } + + if ($raw) { + return New-Object Microsoft.SqlServer.XEvent.Linq.QueryableXEventData($currentfile) + } + + $enum = New-Object Microsoft.SqlServer.XEvent.Linq.QueryableXEventData($currentfile) + $newcolumns = ($enum.Fields.Name | Select-Object -Unique) + + $actions = ($enum.Actions.Name | Select-Object -Unique) + foreach ($action in $actions) { + $newcolumns += ($action -Split '\.')[-1] + } + + $newcolumns = $newcolumns | Sort-Object + $columns = ($columns += $newcolumns) | Select-Object -Unique + + # Make it selectable, otherwise it's a weird enumeration + foreach ($event in (New-Object Microsoft.SqlServer.XEvent.Linq.QueryableXEventData($currentfile))) { + $hash = [ordered]@{ } + + foreach ($column in $columns) { + $null = $hash.Add($column, $event.$column) + } + + foreach ($action in $event.Actions) { + $hash[$action.Name] = $action.Value + } + + foreach ($field in $event.Fields) { + $hash[$field.Name] = $field.Value + } + + [pscustomobject]$hash + } + } + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function Read-DbaBackupHeader { + <# + .SYNOPSIS + Reads and displays detailed information about a SQL Server backup. + + .DESCRIPTION + Reads full, differential and transaction log backups. An online SQL Server is required to parse the backup files and the path specified must be relative to that SQL Server. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Path + Path to SQL Server backup file. This can be a full, differential or log backup file. Accepts valid filesystem paths and URLs. + + .PARAMETER Simple + If this switch is enabled, fewer columns are returned, giving an easy overview. + + .PARAMETER FileList + If this switch is enabled, detailed information about the files within the backup is returned. + + .PARAMETER AzureCredential + Name of the SQL Server credential that should be used for Azure storage access. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: DisasterRecovery, Backup, Restore + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Read-DbaBackupHeader + + .EXAMPLE + PS C:\> Read-DbaBackupHeader -SqlInstance sql2016 -Path S:\backups\mydb\mydb.bak + + Logs into sql2016 using Windows authentication and reads the local file on sql2016, S:\backups\mydb\mydb.bak. + + If you are running this command on a workstation and connecting remotely, remember that sql2016 cannot access files on your own workstation. + + .EXAMPLE + PS C:\> Read-DbaBackupHeader -SqlInstance sql2016 -Path \\nas\sql\backups\mydb\mydb.bak, \\nas\sql\backups\otherdb\otherdb.bak + + Logs into sql2016 and reads two backup files - mydb.bak and otherdb.bak. The SQL Server service account must have rights to read this file. + + .EXAMPLE + PS C:\> Read-DbaBackupHeader -SqlInstance . -Path C:\temp\myfile.bak -Simple + + Logs into the local workstation (or computer) and shows simplified output about C:\temp\myfile.bak. The SQL Server service account must have rights to read this file. + + .EXAMPLE + PS C:\> $backupinfo = Read-DbaBackupHeader -SqlInstance . -Path C:\temp\myfile.bak + PS C:\> $backupinfo.FileList + + Displays detailed information about each of the datafiles contained in the backupset. + + .EXAMPLE + PS C:\> Read-DbaBackupHeader -SqlInstance . -Path C:\temp\myfile.bak -FileList + + Also returns detailed information about each of the datafiles contained in the backupset. + + .EXAMPLE + PS C:\> "C:\temp\myfile.bak", "\backupserver\backups\myotherfile.bak" | Read-DbaBackupHeader -SqlInstance sql2016 | Where-Object { $_.BackupSize.Megabyte -gt 100 } + + Reads the two files and returns only backups larger than 100 MB + + .EXAMPLE + PS C:\> Get-ChildItem \\nas\sql\*.bak | Read-DbaBackupHeader -SqlInstance sql2016 + + Gets a list of all .bak files on the \\nas\sql share and reads the headers using the server named "sql2016". This means that the server, sql2016, must have read access to the \\nas\sql share. + + .EXAMPLE + PS C:\> Read-DbaBackupHeader -SqlInstance sql2016 -Path https://dbatoolsaz.blob.core.windows.net/azbackups/restoretime/restoretime_201705131850.bak -AzureCredential AzureBackupUser + + Gets the backup header information from the SQL Server backup file stored at https://dbatoolsaz.blob.core.windows.net/azbackups/restoretime/restoretime_201705131850.bak on Azure + + #> + [Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSAvoidUsingPlainTextForPassword", 'AzureCredential', Justification = "For Parameter AzureCredential")] + [CmdletBinding()] + param ( + [parameter(Mandatory)] + [Alias("ServerInstance", "SqlServer")] + [DbaInstance]$SqlInstance, + [PsCredential]$SqlCredential, + [parameter(Mandatory, ValueFromPipeline)] + [object[]]$Path, + [switch]$Simple, + [switch]$FileList, + [string]$AzureCredential, + [Alias('Silent')] + [switch]$EnableException + ) + + begin { + foreach ($p in $path) { + if ([System.IO.Path]::GetExtension($p).Length -eq 0) { + Stop-Function -Message "Path ($p) should be a file, not a folder" -Category InvalidArgument + return + } + } + Write-Message -Level InternalComment -Message "Starting reading headers" + try { + $server = Connect-SqlInstance -SqlInstance $SqlInstance -SqlCredential $SqlCredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + return + } + $getHeaderScript = { + param ( + $SqlInstance, + $Path, + $DeviceType, + $AzureCredential + ) + #Copy existing connection to create an independent TSQL session + $server = New-Object Microsoft.SqlServer.Management.Smo.Server $SqlInstance.ConnectionContext.Copy() + $restore = New-Object Microsoft.SqlServer.Management.Smo.Restore + + if ($DeviceType -eq 'URL') { + $restore.CredentialName = $AzureCredential + } + + $device = New-Object Microsoft.SqlServer.Management.Smo.BackupDeviceItem $Path, $DeviceType + $restore.Devices.Add($device) + $dataTable = $restore.ReadBackupHeader($server) + $null = $dataTable.Columns.Add("FileList", [object]) + $null = $dataTable.Columns.Add("SqlVersion") + $null = $dataTable.Columns.Add("BackupPath") + + foreach ($row in $dataTable) { + $row.BackupPath = $Path + + $backupsize = $row.BackupSize + $null = $dataTable.Columns.Remove("BackupSize") + $null = $dataTable.Columns.Add("BackupSize", [dbasize]) + if ($backupsize -isnot [dbnull]) { + $row.BackupSize = [dbasize]$backupsize + } + + $cbackupsize = $row.CompressedBackupSize + $null = $dataTable.Columns.Remove("CompressedBackupSize") + $null = $dataTable.Columns.Add("CompressedBackupSize", [dbasize]) + if ($cbackupsize -isnot [dbnull]) { + $row.CompressedBackupSize = [dbasize]$cbackupsize + } + + $restore.FileNumber = $row.Position + <# Select-Object does a quick and dirty conversion from datatable to PS object #> + $row.FileList = $restore.ReadFileList($server) | Select-Object * + } + $dataTable + } + } + + process { + if (Test-FunctionInterrupt) { return } + + #Extract fullnames from the file system objects + $pathStrings = @() + foreach ($pathItem in $Path) { + if ($null -ne $pathItem.FullName) { + $pathStrings += $pathItem.FullName + } else { + $pathStrings += $pathItem + } + } + #Group by filename + $pathGroup = $pathStrings | Group-Object -NoElement | Select-Object -ExpandProperty Name + + $pathCount = ($pathGroup | Measure-Object).Count + Write-Message -Level Verbose -Message "$pathCount unique files to scan." + Write-Message -Level Verbose -Message "Checking accessibility for all the files." + + $testPath = Test-DbaPath -SqlInstance $server -Path $pathGroup + + #Setup initial session state + $InitialSessionState = [System.Management.Automation.Runspaces.InitialSessionState]::CreateDefault() + $defaultrunspace = [System.Management.Automation.Runspaces.Runspace]::DefaultRunspace + #Create Runspace pool, min - 1, max - 10 sessions: there is internal SQL Server queue for the restore operations. 10 threads seem to perform best + $runspacePool = [runspacefactory]::CreateRunspacePool(1, 10, $InitialSessionState, $Host) + $runspacePool.Open() + + $threads = @() + + foreach ($file in $pathGroup) { + if ($file -like 'http*') { + $deviceType = 'URL' + } else { + $deviceType = 'FILE' + } + if ($pathCount -eq 1) { + $fileExists = $testPath + } else { + $fileExists = ($testPath | Where-Object FilePath -eq $file).FileExists + } + if ($fileExists -or $deviceType -eq 'URL') { + #Create parameters hashtable + $argsRunPool = @{ + SqlInstance = $server + Path = $file + AzureCredential = $AzureCredential + DeviceType = $deviceType + } + Write-Message -Level Verbose -Message "Scanning file $file." + #Create new runspace thread + $thread = [powershell]::Create() + $thread.RunspacePool = $runspacePool + $thread.AddScript($getHeaderScript) | Out-Null + $thread.AddParameters($argsRunPool) | Out-Null + #Start the thread + $handle = $thread.BeginInvoke() + $threads += [pscustomobject]@{ + handle = $handle + thread = $thread + file = $file + deviceType = $deviceType + isRetrieved = $false + started = Get-Date + } + } else { + Write-Message -Level Warning -Message "File $file does not exist or access denied. The SQL Server service account may not have access to the source directory." + } + } + #receive runspaces + while ($threads | Where-Object { $_.isRetrieved -eq $false }) { + $totalThreads = ($threads | Measure-Object).Count + $totalRetrievedThreads = ($threads | Where-Object { $_.isRetrieved -eq $true } | Measure-Object).Count + Write-Progress -Id 1 -Activity Updating -Status 'Progress' -CurrentOperation "Scanning Restore headers: $totalRetrievedThreads/$totalThreads" -PercentComplete ($totalRetrievedThreads / $totalThreads * 100) + foreach ($thread in ($threads | Where-Object { $_.isRetrieved -eq $false })) { + if ($thread.Handle.IsCompleted) { + $dataTable = $thread.thread.EndInvoke($thread.handle) + $thread.isRetrieved = $true + #Check if thread had any errors + if ($thread.thread.HadErrors) { + if ($thread.deviceType -eq 'FILE') { + Stop-Function -Message "Problem found with $($thread.file)." -Target $thread.file -ErrorRecord $thread.thread.Streams.Error -Continue + } else { + Stop-Function -Message "Unable to read $($thread.file), check credential $AzureCredential and network connectivity." -Target $thread.file -ErrorRecord $thread.thread.Streams.Error -Continue + } + } + #Process the result of this thread + + $dbVersion = $dataTable[0].DatabaseVersion + $SqlVersion = (Convert-DbVersionToSqlVersion $dbVersion) + foreach ($row in $dataTable) { + $row.SqlVersion = $SqlVersion + if ($row.BackupName -eq "*** INCOMPLETE ***") { + Stop-Function -Message "$($thread.file) appears to be from a new version of SQL Server than $SqlInstance, skipping" -Target $thread.file -Continue + } + } + if ($Simple) { + $dataTable | Select-Object DatabaseName, BackupFinishDate, RecoveryModel, BackupSize, CompressedBackupSize, DatabaseCreationDate, UserName, ServerName, SqlVersion, BackupPath + } elseif ($FileList) { + $dataTable.filelist + } else { + $dataTable + } + + $thread.thread.Dispose() + } + } + Start-Sleep -Milliseconds 500 + } + #Close the runspace pool + $runspacePool.Close() + [System.Management.Automation.Runspaces.Runspace]::DefaultRunspace = $defaultrunspace + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function Read-DbaTraceFile { + <# + .SYNOPSIS + Reads SQL Server trace files + + .DESCRIPTION + Using the fn_trace_gettable function, a trace file is read and returned as a PowerShell object + + This function returns the whole of the trace file. The information is presented in the format that the trace subsystem uses. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Path + Path to the trace file. This path is relative to the SQL Server instance. + + .PARAMETER Database + Search for results only with specific DatabaseName. Uses IN for comparisons. + + .PARAMETER Login + Search for results only with specific Logins. Uses IN for comparisons. + + .PARAMETER Spid + Search for results only with specific Spids. Uses IN for comparisons. + + .PARAMETER EventClass + Search for results only with specific EventClasses. Uses IN for comparisons. + + .PARAMETER ObjectType + Search for results only with specific ObjectTypes. Uses IN for comparisons. + + .PARAMETER ErrorId + Search for results only with specific Errors. Filters 'Error in ($ErrorId)' Uses IN for comparisons. + + .PARAMETER EventSequence + Search for results only with specific EventSequences. Uses IN for comparisons. + + .PARAMETER TextData + Search for results only with specific TextData. Uses LIKE for comparisons. + + .PARAMETER ApplicationName + Search for results only with specific ApplicationNames. Uses LIKE for comparisons. + + .PARAMETER ObjectName + Search for results only with specific ObjectNames. Uses LIKE for comparisons. + + .PARAMETER Where + Custom where clause - use without the word "WHERE". Here are the available columns: + + TextData + BinaryData + DatabaseID + TransactionID + LineNumber + NTUserName + NTDomainName + HostName + ClientProcessID + ApplicationName + LoginName + SPID + Duration + StartTime + EndTime + Reads + Writes + CPU + Permissions + Severity + EventSubClass + ObjectID + Success + IndexID + IntegerData + ServerName + EventClass + ObjectType + NestLevel + State + Error + Mode + Handle + ObjectName + DatabaseName + FileName + OwnerName + RoleName + TargetUserName + DBUserName + LoginSid + TargetLoginName + TargetLoginSid + ColumnPermissions + LinkedServerName + ProviderName + MethodName + RowCounts + RequestID + XactSequence + EventSequence + BigintData1 + BigintData2 + GUID + IntegerData2 + ObjectID2 + Type + OwnerID + ParentName + IsSystem + Offset + SourceDatabaseID + SqlHandle + SessionLoginName + PlanHandle + GroupID + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Security, Trace + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .EXAMPLE + PS C:\> Read-DbaTraceFile -SqlInstance sql2016 -Database master, tempdb -Path C:\traces\big.trc + + Reads the tracefile C:\traces\big.trc, stored on the sql2016 sql server. Filters only results that have master or tempdb as the DatabaseName. + + .EXAMPLE + PS C:\> Read-DbaTraceFile -SqlInstance sql2016 -Database master, tempdb -Path C:\traces\big.trc -TextData 'EXEC SP_PROCOPTION' + + Reads the tracefile C:\traces\big.trc, stored on the sql2016 sql server. + Filters only results that have master or tempdb as the DatabaseName and that have 'EXEC SP_PROCOPTION' somewhere in the text. + + .EXAMPLE + PS C:\> Read-DbaTraceFile -SqlInstance sql2016 -Path C:\traces\big.trc -Where "LinkedServerName = 'myls' and StartTime > '5/30/2017 4:27:52 PM'" + + Reads the tracefile C:\traces\big.trc, stored on the sql2016 sql server. + Filters only results where LinkServerName = myls and StartTime is greater than '5/30/2017 4:27:52 PM'. + + .EXAMPLE + PS C:\> Get-DbaTrace -SqlInstance sql2014 | Read-DbaTraceFile + + Reads every trace file on sql2014 + + #> + [CmdletBinding()] + param ( + [parameter(Position = 0, Mandatory, ValueFromPipelineByPropertyName)] + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [parameter(ValueFromPipelineByPropertyName)] + [PSCredential]$SqlCredential, + [parameter(ValueFromPipelineByPropertyName)] + [string[]]$Path, + [string[]]$Database, + [string[]]$Login, + [int[]]$Spid, + [string[]]$EventClass, + [string[]]$ObjectType, + [int[]]$ErrorId, + [int[]]$EventSequence, + [string[]]$TextData, + [string[]]$ApplicationName, + [string[]]$ObjectName, + [string]$Where, + [Alias('Silent')] + [switch]$EnableException + ) + + begin { + if ($where) { + $Where = "where $where" + } elseif ($Database -or $Login -or $Spid -or $ApplicationName -or $EventClass -or $ObjectName -or $ObjectType -or $EventSequence -or $ErrorId) { + + $tempwhere = @() + + if ($Database) { + $where = $database -join "','" + $tempwhere += "databasename in ('$where')" + } + + if ($Login) { + $where = $Login -join "','" + $tempwhere += "LoginName in ('$where')" + } + + if ($Spid) { + $where = $Spid -join "," + $tempwhere += "Spid in ($where)" + } + + if ($EventClass) { + $where = $EventClass -join "," + $tempwhere += "EventClass in ($where)" + } + + if ($ObjectType) { + $where = $ObjectType -join "," + $tempwhere += "ObjectType in ($where)" + } + + if ($ErrorId) { + $where = $ErrorId -join "," + $tempwhere += "Error in ($where)" + } + + if ($EventSequence) { + $where = $EventSequence -join "," + $tempwhere += "EventSequence in ($where)" + } + + if ($TextData) { + $where = $TextData -join "%','%" + $tempwhere += "TextData like ('%$where%')" + } + + if ($ApplicationName) { + $where = $ApplicationName -join "%','%" + $tempwhere += "ApplicationName like ('%$where%')" + } + + if ($ObjectName) { + $where = $ObjectName -join "%','%" + $tempwhere += "ObjectName like ('%$where%')" + } + + $tempwhere = $tempwhere -join " and " + $Where = "where $tempwhere" + } + } + process { + foreach ($instance in $sqlInstance) { + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential -MinimumVersion 9 + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + return + } + + if (Test-Bound -Parameter Path) { + $currentpath = $path + } else { + $currentpath = $server.ConnectionContext.ExecuteScalar("Select path from sys.traces where is_default = 1") + } + + foreach ($file in $currentpath) { + Write-Message -Level Verbose -Message "Parsing $file" + + $exists = Test-DbaPath -SqlInstance $server -Path $file + + if (!$exists) { + Write-Message -Level Warning -Message "Path does not exist" -Target $file + Continue + } + + $sql = "select SERVERPROPERTY('MachineName') AS ComputerName, + ISNULL(SERVERPROPERTY('InstanceName'), 'MSSQLSERVER') AS InstanceName, + SERVERPROPERTY('ServerName') AS SqlInstance, + * FROM [fn_trace_gettable]('$file', DEFAULT) $Where" + + try { + $server.Query($sql) + } catch { + Stop-Function -Message "Error returned from SQL Server: $_" -Target $server -InnerErrorRecord $_ + } + } + } + } +} +function Read-DbaTransactionLog { + <# + .SYNOPSIS + Reads the live Transaction log from specified SQL Server Database + + .DESCRIPTION + Using the fn_dblog function, the live transaction log is read and returned as a PowerShell object + + This function returns the whole of the log. The information is presented in the format that the logging subsystem uses. + + A soft limit of 0.5GB of log as been implemented. This is based on testing. This limit can be overridden + at the users request, but please be aware that this may have an impact on your target databases and on the + system running this function + + .PARAMETER SqlInstance + The target SQL Server instance or instances + + .PARAMETER SqlCredential + A credential to use to connect to the SQL Instance rather than using Windows Authentication + + .PARAMETER Database + Database to read the transaction log of + + .PARAMETER IgnoreLimit + Switch to indicate that you wish to bypass the recommended limits of the function + + .PARAMETER RowLimit + Will limit the number of rows returned from the transaction log + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Database, Log, LogFile + Author: Stuart Moore (@napalmgram), stuart-moore.com + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .EXAMPLE + PS C:\> $Log = Read-DbaTransactionLog -SqlInstance sql2016 -Database MyDatabase + + Will read the contents of the transaction log of MyDatabase on SQL Server Instance sql2016 into the local PowerShell object $Log + + .EXAMPLE + PS C:\> $Log = Read-DbaTransactionLog -SqlInstance sql2016 -Database MyDatabase -IgnoreLimit + + Will read the contents of the transaction log of MyDatabase on SQL Server Instance sql2016 into the local PowerShell object $Log, ignoring the recommendation of not returning more that 0.5GB of log + + #> + [CmdletBinding(DefaultParameterSetName = "Default")] + param ( + [parameter(Position = 0, Mandatory)] + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter]$SqlInstance, + [PSCredential]$SqlCredential, + [parameter(Mandatory)] + [object]$Database, + [Switch]$IgnoreLimit, + [int]$RowLimit = 0, + [Alias('Silent')] + [switch]$EnableException + ) + + try { + $server = Connect-SqlInstance -SqlInstance $SqlInstance -SqlCredential $SqlCredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + return + } + + if (-not $server.databases[$Database]) { + Stop-Function -Message "$Database does not exist" + return + } + + if ('Normal' -notin ($server.databases[$Database].Status -split ',')) { + Stop-Function -Message "$Database is not in a normal State, command will not run." + return + } + + if ($RowLimit -gt 0) { + Write-Message -Message "Limiting results to $RowLimit rows" -Level Verbose + $RowLimitSql = " TOP $RowLimit " + $IgnoreLimit = $true + } else { + $RowLimitSql = "" + } + + + if ($IgnoreLimit) { + Write-Message -Level Verbose -Message "Please be aware that ignoring the recommended limits may impact on the performance of the SQL Server database and the calling system" + } else { + #Warn if more than 0.5GB of live log. Dodgy conversion as SMO returns the value in an unhelpful format :( + $SqlSizeCheck = "select + sum(FileProperty(sf.name,'spaceused')*8/1024) as 'SizeMb' + from sys.sysfiles sf + where CONVERT(INT,sf.status & 0x40) / 64=1" + $TransLogSize = $server.Query($SqlSizeCheck, $Database) + if ($TransLogSize.SizeMb -ge 500) { + Stop-Function -Message "$Database has more than 0.5 Gb of live log data, returning this may have an impact on the database and the calling system. If you wish to proceed please rerun with the -IgnoreLimit switch" + return + } + } + + $sql = "select $RowLimitSql * from fn_dblog(NULL,NULL)" + Write-Message -Level Debug -Message $sql + Write-Message -Level Verbose -Message "Starting Log retrieval" + $server.Query($sql, $Database) + +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function Read-DbaXEFile { + <# + .SYNOPSIS + Read XEvents from a *.xel or *.xem file. + + .DESCRIPTION + Read XEvents from a *.xel or *.xem file. + + .PARAMETER Path + The path to the *.xem or *.xem file. This is relative to the computer executing the command. UNC paths are supported. + + .PARAMETER Exact + If this switch is enabled, only an exact search will be used for the Path. By default, this command will add a wildcard to the Path because Eventing uses the file name as a template and adds characters. + + .PARAMETER Raw + If this switch is enabled, the Microsoft.SqlServer.XEvent.Linq.PublishedEvent enumeration object will be returned. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: ExtendedEvent, XE, XEvent + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Read-DbaXEFile + + .EXAMPLE + PS C:\> Read-DbaXEFile -Path C:\temp\deadocks.xel + + Returns events from C:\temp\deadocks.xel. + + .EXAMPLE + PS C:\> Get-ChildItem C:\temp\xe\*.xel | Read-DbaXEFile + + Returns events from all .xel files in C:\temp\xe. + + .EXAMPLE + PS C:\> Get-DbaXESession -SqlInstance sql2014 -Session deadlocks | Read-DbaXEFile + + Reads remote XEvents by accessing the file over the admin UNC share. + + #> + [CmdletBinding()] + param ( + [parameter(Mandatory, ValueFromPipeline)] + [Alias('FullName')] + [object[]]$Path, + [switch]$Exact, + [switch]$Raw, + [switch][Alias('Silent')] + $EnableException + ) + process { + foreach ($file in $path) { + # in order to ensure CSV gets all fields, all columns will be + # collected and output in the first (all all subsequent) object + $columns = @("name", "timestamp") + + if ($file -is [System.String]) { + $currentfile = $file + #Variable marked as unused by PSScriptAnalyzer + #$manualadd = $true + } elseif ($file -is [System.IO.FileInfo]) { + $currentfile = $file.FullName + #Variable marked as unused by PSScriptAnalyzer + #$manualadd = $true + } else { + if ($file -isnot [Microsoft.SqlServer.Management.XEvent.Session]) { + Stop-Function -Message "Unsupported file type." + return + } + + if ($file.TargetFile.Length -eq 0) { + Stop-Function -Message "This session does not have an associated Target File." + return + } + + $instance = [dbainstance]$file.ComputerName + + if ($instance.IsLocalHost) { + $currentfile = $file.TargetFile + } else { + $currentfile = $file.RemoteTargetFile + } + } + + if (-not $Exact) { + $currentfile = $currentfile.Replace('.xel', '*.xel') + $currentfile = $currentfile.Replace('.xem', '*.xem') + + if ($currentfile -notmatch "xel" -and $currentfile -notmatch "xem") { + $currentfile = "$currentfile*.xel" + } + } + + $accessible = Test-Path -Path $currentfile + $whoami = whoami + + if (-not $accessible) { + if ($file.Status -eq "Stopped") { continue } + Stop-Function -Continue -Message "$currentfile cannot be accessed from $($env:COMPUTERNAME). Does $whoami have access?" + } + + if ($raw) { + return New-Object Microsoft.SqlServer.XEvent.Linq.QueryableXEventData($currentfile) + } + + $enum = New-Object Microsoft.SqlServer.XEvent.Linq.QueryableXEventData($currentfile) + $newcolumns = ($enum.Fields.Name | Select-Object -Unique) + + $actions = ($enum.Actions.Name | Select-Object -Unique) + foreach ($action in $actions) { + $newcolumns += ($action -Split '\.')[-1] + } + + $newcolumns = $newcolumns | Sort-Object + $columns = ($columns += $newcolumns) | Select-Object -Unique + + # Make it selectable, otherwise it's a weird enumeration + foreach ($event in $enum) { + $hash = [ordered]@{ } + + foreach ($column in $columns) { + $null = $hash.Add($column, $event.$column) + } + + foreach ($action in $event.Actions) { + $hash[$action.Name] = $action.Value + } + + foreach ($field in $event.Fields) { + $hash[$field.Name] = $field.Value + } + + [pscustomobject]$hash + } + $enum.Dispose() + } + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function Remove-DbaAgDatabase { + <# + .SYNOPSIS + Removes a database from an availability group on a SQL Server instance. + + .DESCRIPTION + Removes a database from an availability group on a SQL Server instance. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. Server version must be SQL Server version 2012 or higher. + + .PARAMETER SqlCredential + Login to the SqlInstance instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Database + The database or databases to remove. + + .PARAMETER AvailabilityGroup + Only remove databases from specific availability groups. + + .PARAMETER WhatIf + Shows what would happen if the command were to run. No actions are actually performed. + + .PARAMETER Confirm + Prompts you for confirmation before executing any changing operations within the command. + + .PARAMETER InputObject + Enables piping from Get-DbaDatabase + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: AvailabilityGroup, HA, AG + Author: Chrissy LeMaire (@cl), netnerds.net + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Remove-DbaAgDatabase + + .EXAMPLE + PS C:\> Remove-DbaAgDatabase -SqlInstance sqlserver2012 -AvailabilityGroup ag1, ag2 -Confirm:$false + + Removes the ag1 and ag2 availability groups on sqlserver2012. Does not prompt for confirmation. + + .EXAMPLE + PS C:\> Get-DbaAvailabilityGroup -SqlInstance sqlserver2012 -AvailabilityGroup availabilitygroup1 | Remove-DbaAgDatabase + + Removes the availability groups returned from the Get-DbaAvailabilityGroup function. Prompts for confirmation. + #> + [CmdletBinding(SupportsShouldProcess, ConfirmImpact = 'High')] + param ( + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [string[]]$Database, + [string[]]$AvailabilityGroup, + # needs to accept db or agdb so generic object + + [parameter(ValueFromPipeline)] + [object[]]$InputObject, + [switch]$EnableException + ) + process { + if ((Test-Bound -ParameterName SqlInstance)) { + if ((Test-Bound -Not -ParameterName Database)) { + Stop-Function -Message "You must specify one or more databases and one or more Availability Groups when using the SqlInstance parameter." + return + } + } + + if ($InputObject) { + if ($InputObject[0].GetType().Name -eq 'Database') { + $Database += $InputObject.Name + } + } + + if ($SqlInstance) { + $InputObject += Get-DbaAgDatabase -SqlInstance $SqlInstance -SqlCredential $SqlCredential -Database $Database + } + + foreach ($db in $InputObject) { + if ($Pscmdlet.ShouldProcess($db.Parent.Parent.Name, "Removing availability group database $db")) { + try { + $ag = $db.Parent.Name + $db.Parent.AvailabilityDatabases[$db.Name].Drop() + [pscustomobject]@{ + ComputerName = $db.ComputerName + InstanceName = $db.InstanceName + SqlInstance = $db.SqlInstance + AvailabilityGroup = $ag + Database = $db.Name + Status = "Removed" + } + } catch { + Stop-Function -Message "Failure" -ErrorRecord $_ -Continue + } + } + } + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function Remove-DbaAgentJob { + <# + .SYNOPSIS + Remove-DbaAgentJob removes a job. + + .DESCRIPTION + Remove-DbaAgentJob removes a job in the SQL Server Agent. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. This can be a collection and receive pipeline input to allow the function to be executed against multiple SQL Server instances. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Job + The name of the job. Can be null if the the job id is being used. + + .PARAMETER KeepHistory + Specifies to keep the history for the job. By default history is deleted. + + .PARAMETER KeepUnusedSchedule + Specifies to keep the schedules attached to this job if they are not attached to any other job. + By default the unused schedule is deleted. + + .PARAMETER Mode + Default: Strict + How strict does the command take lesser issues? + Strict: Interrupt if the job specified doesn't exist. + Lazy: Silently skip over jobs that don't exist. + + .PARAMETER InputObject + Accepts piped input from Get-DbaAgentJob + + .PARAMETER WhatIf + Shows what would happen if the command were to run. No actions are actually performed. + + .PARAMETER Confirm + Prompts you for confirmation before executing any changing operations within the command. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Agent, Job + Author: Sander Stad (@sqlstad, sqlstad.nl) + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Remove-DbaAgentJob + + .EXAMPLE + PS C:\> Remove-DbaAgentJob -SqlInstance sql1 -Job Job1 + + Removes the job from the instance with the name Job1 + + .EXAMPLE + PS C:\> GetDbaAgentJob -SqlInstance sql1 -Job Job1 | Remove-DbaAgentJob -KeepHistory + + Removes teh job but keeps the history + + .EXAMPLE + PS C:\> Remove-DbaAgentJob -SqlInstance sql1 -Job Job1 -KeepUnusedSchedule + + Removes the job but keeps the unused schedules + + .EXAMPLE + PS C:\> Remove-DbaAgentJob -SqlInstance sql1, sql2, sql3 -Job Job1 + + Removes the job from multiple servers + + #> + [CmdletBinding(SupportsShouldProcess, ConfirmImpact = "Low")] + param ( + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [object[]]$Job, + [switch]$KeepHistory, + [switch]$KeepUnusedSchedule, + [DbaMode]$Mode = (Get-DbatoolsConfigValue -FullName 'message.mode.default' -Fallback "Strict"), + [parameter(ValueFromPipeline)] + [Microsoft.SqlServer.Management.Smo.Agent.Job[]]$InputObject, + [Alias('Silent')] + [switch]$EnableException + ) + process { + foreach ($instance in $SqlInstance) { + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + foreach ($j in $Job) { + if ($Server.JobServer.Jobs.Name -notcontains $j) { + switch ($Mode) { + 'Lazy' { + Write-Message -Level Verbose -Message "Job $j doesn't exists on $instance." -Target $instance + } + 'Strict' { + Stop-Function -Message "Job $j doesn't exist on $instance." -Continue -ContinueLabel main -Target $instance -Category InvalidData + } + } + } + $InputObject += ($Server.JobServer.Jobs | Where-Object Name -eq $j) + } + } + foreach ($currentJob in $InputObject) { + $j = $currentJob.Name + $server = $currentJob.Parent.Parent + + if ($PSCmdlet.ShouldProcess($instance, "Removing the job $j from $server")) { + try { + $dropHistory = $dropSchedule = 1 + + if (Test-Bound -ParameterName KeepHistory) { + Write-Message -Level SomewhatVerbose -Message "Job history will be kept" + $dropHistory = 0 + } + if (Test-Bound -ParameterName KeepUnusedSchedule) { + Write-Message -Level SomewhatVerbose -Message "Unused job schedules will be kept" + $dropSchedule = 0 + } + Write-Message -Level SomewhatVerbose -Message "Removing job" + $dropJobQuery = ("EXEC dbo.sp_delete_job @job_name = '{0}', @delete_history = {1}, @delete_unused_schedule = {2}" -f $currentJob.Name.Replace("'", "''"), $dropHistory, $dropSchedule) + $server.Databases['msdb'].ExecuteNonQuery($dropJobQuery) + [pscustomobject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + Name = $currentJob.Name + Status = 'Dropped' + } + } catch { + Write-Message -Level Verbose -Message "Could not drop job $job on $server" + + [pscustomobject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + Name = $currentJob.Name + Status = "Failed. $(Get-ErrorMessage -Record $_)" + } + } + } + } + } +} +function Remove-DbaAgentJobCategory { + <# + .SYNOPSIS + Remove-DbaAgentJobCategory removes a job category. + + .DESCRIPTION + Remove-DbaAgentJobCategory makes it possible to remove a job category. + Be assured that the category you want to remove is not used with other jobs. If another job uses this category it will be get the category [Uncategorized (Local)]. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. You must have sysadmin access and server version must be SQL Server version 2000 or greater. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Category + The name of the category + + .PARAMETER Force + The force parameter will ignore some errors in the parameters and assume defaults. + + .PARAMETER WhatIf + Shows what would happen if the command were to run. No actions are actually performed. + + .PARAMETER Confirm + Prompts you for confirmation before executing any changing operations within the command. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Agent, Job, JobCategory + Author: Sander Stad (@sqlstad, sqlstad.nl) + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Remove-DbaAgentJobCategory + + .EXAMPLE + PS C:\> Remove-DbaAgentJobCategory -SqlInstance sql1 -Category 'Category 1' + + Remove the job category Category 1 from the instance. + + .EXAMPLE + PS C:\> Remove-DbaAgentJobCategory -SqlInstance sql1 -Category Category1, Category2, Category3 + + Remove multiple job categories from the instance. + + .EXAMPLE + PS C:\> Remove-DbaAgentJobCategory -SqlInstance sql1, sql2, sql3 -Category Category1, Category2, Category3 + + Remove multiple job categories from the multiple instances. + + #> + [CmdletBinding(SupportsShouldProcess, ConfirmImpact = "Low")] + param ( + [parameter(Mandatory, ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [ValidateNotNullOrEmpty()] + [string[]]$Category, + [switch]$Force, + [Alias('Silent')] + [switch]$EnableException + ) + + process { + + foreach ($instance in $sqlinstance) { + # Try connecting to the instance + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + # Loop through each of the categories + foreach ($cat in $Category) { + + # Check if the job category exists + if ($cat -notin $server.JobServer.JobCategories.Name) { + Stop-Function -Message "Job category $cat doesn't exist on $instance" -Target $instance -Continue + } + + # Remove the category + if ($PSCmdlet.ShouldProcess($instance, "Changing the job category $Category")) { + try { + # Get the category + $currentCategory = $server.JobServer.JobCategories[$cat] + + Write-Message -Message "Removing job category $cat" -Level Verbose + + $currentCategory.Drop() + } catch { + Stop-Function -Message "Something went wrong removing the job category $cat on $instance" -Target $cat -Continue -ErrorRecord $_ + } + + } #if should process + + } # for each category + + } # for each instance + + } # end process + + end { + if (Test-FunctionInterrupt) { return } + Write-Message -Message "Finished removing job category." -Level Verbose + } + +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function Remove-DbaAgentJobStep { + <# + .SYNOPSIS + Removes a step from the specified SQL Agent job. + + .DESCRIPTION + Removes a job step from a SQL Server Agent job. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. This can be a collection and receive pipeline input to allow the function to be executed against multiple SQL Server instances. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Job + The name of the job. + + .PARAMETER StepName + The name of the job step. + + .PARAMETER Mode + Default: Strict + How strict does the command take lesser issues? + Strict: Interrupt if the configuration already has the same value as the one specified. + Lazy: Silently skip over instances that already have this configuration at the specified value. + + .PARAMETER WhatIf + If this switch is enabled, no actions are performed but informational messages will be displayed that explain what would happen if the command were to run. + + .PARAMETER Confirm + If this switch is enabled, you will be prompted for confirmation before executing any operations that change state. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Agent, Job, JobStep + Author: Sander Stad (@sqlstad), sqlstad.nl + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Remove-DbaAgentJobStep + + .EXAMPLE + PS C:\> Remove-DbaAgentJobStep -SqlInstance sql1 -Job Job1 -StepName Step1 + + Remove 'Step1' from job 'Job1' on sql1. + + .EXAMPLE + PS C:\> Remove-DbaAgentJobStep -SqlInstance sql1 -Job Job1, Job2, Job3 -StepName Step1 + + Remove the job step from multiple jobs. + + .EXAMPLE + PS C:\> Remove-DbaAgentJobStep -SqlInstance sql1, sql2, sql3 -Job Job1 -StepName Step1 + + Remove the job step from the job on multiple servers. + + .EXAMPLE + PS C:\> sql1, sql2, sql3 | Remove-DbaAgentJobStep -Job Job1 -StepName Step1 + + Remove the job step from the job on multiple servers using pipeline. + + #> + [CmdletBinding(SupportsShouldProcess, ConfirmImpact = "Low")] + param ( + [parameter(Mandatory, ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [Parameter(Mandatory)] + [ValidateNotNullOrEmpty()] + [object[]]$Job, + [Parameter(Mandatory)] + [ValidateNotNullOrEmpty()] + [string]$StepName, + [DbaMode]$Mode = (Get-DbatoolsConfigValue -Name 'message.mode.default' -Fallback "Strict"), + [Alias('Silent')] + [switch]$EnableException + ) + + process { + foreach ($instance in $SqlInstance) { + + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + foreach ($j in $Job) { + Write-Message -Level Verbose -Message "Processing job $j" + # Check if the job exists + if ($Server.JobServer.Jobs.Name -notcontains $j) { + switch ($Mode) { + 'Lazy' { + Write-Message -Level Verbose -Message "Job $j doesn't exists on $instance." -Target $instance + } + 'Strict' { + Stop-Function -Message "Job $j doesnn't exist on $instance." -Continue -ContinueLabel main -Target $instance -Category InvalidData + } + } + } else { + # Check if the job step exists + if ($Server.JobServer.Jobs[$j].JobSteps.Name -notcontains $StepName) { + switch ($Mode) { + 'Lazy' { + Write-Message -Level Verbose -Message "Step $StepName doesn't exist for $job on $instance." -Target $instance + } + 'Strict' { + Stop-Function -Message "Step $StepName doesn't exist for $job on $instance." -Continue -ContinueLabel main -Target $instance -Category InvalidData + } + } + } else { + # Execute + if ($PSCmdlet.ShouldProcess($instance, "Removing the job step $StepName for job $j")) { + try { + $JobStep = $Server.JobServer.Jobs[$j].JobSteps[$StepName] + Write-Message -Level SomewhatVerbose -Message "Removing the job step $StepName for job $j." + $JobStep.Drop() + } catch { + Stop-Function -Message "Something went wrong removing the job step" -Target $JobStep -Continue -ErrorRecord $_ + Write-Message -Level Verbose -Message "Could not remove the job step $StepName from $j" + } + } + } + } + } + } + } + end { + Write-Message -Message "Finished removing the jobs step(s)" -Level Verbose + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function Remove-DbaAgentSchedule { + <# + .SYNOPSIS + Remove-DbaAgentJobSchedule removes a job schedule. + + .DESCRIPTION + Remove-DbaAgentJobSchedule removes a job in the SQL Server Agent. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. You must have sysadmin access and server version must be SQL Server version 2000 or greater. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Schedule + The name of the job schedule. + + .PARAMETER InputObject + A collection of schedule (such as returned by Get-DbaAgentSchedule), to be removed. + + .PARAMETER WhatIf + Shows what would happen if the command were to run. No actions are actually performed. + + .PARAMETER Confirm + Prompts you for confirmation before executing any changing operations within the command. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .PARAMETER Force + The force parameter will ignore some errors in the parameters and assume defaults. + It will also remove the any present schedules with the same name for the specific job. + + .NOTES + Tags: Agent, Job, Schedule + Author: Sander Stad (@sqlstad), sqlstad.nl + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Remove-DbaAgentJobSchedule + + .EXAMPLE + PS C:\> Remove-DbaAgentSchedule -SqlInstance sql1 -Schedule weekly + + Remove the schedule weekly + + .EXAMPLE + PS C:\> Remove-DbaAgentSchedule -SqlInstance sql1 -Schedule weekly -Force + + Remove the schedule weekly from the job even if the schedule is being used by another job. + + .EXAMPLE + PS C:\> Remove-DbaAgentSchedule -SqlInstance sql1 -Schedule daily, weekly + + Remove multiple schedule + + .EXAMPLE + PS C:\> Remove-DbaAgentSchedule -SqlInstance sql1, sql2, sql3 -Schedule daily, weekly + Remove the schedule on multiple servers for multiple schedules + + .EXAMPLE + sql1, sql2, sql3 | Remove-DbaAgentSchedule -Schedule daily, weekly + Remove the schedule on multiple servers using pipe line + + .EXAMPLE + Get-DbaAgentSchedule -SqlInstance sql1 -Schedule sched1, sched2, sched3 | Remove-DbaAgentSchedule + + Remove the schedules using a pipeline + + #> + [CmdletBinding(SupportsShouldProcess, ConfirmImpact = "Low")] + param ( + [parameter(Mandatory, ValueFromPipeline, ParameterSetName = "instance")] + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [System.Management.Automation.PSCredential]$SqlCredential, + [Parameter(Mandatory, ParameterSetName = "instance")] + [ValidateNotNullOrEmpty()] + [Alias("Schedules")] + [object[]]$Schedule, + [Parameter(ValueFromPipeline, Mandatory, ParameterSetName = "schedules")] + [Microsoft.SqlServer.Management.Smo.Agent.ScheduleBase[]]$InputObject, + [Alias('Silent')] + [switch]$EnableException, + [switch]$Force + ) + + process { + + foreach ($instance in $sqlinstance) { + # Try connecting to the instance + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + $InputObject += $server.JobServer.SharedSchedules + + if ($Schedule) { + $InputObject = $InputObject | Where-Object Name -in $Schedule + } + + } # foreach object instance + + foreach ($currentschedule in $InputObject) { + $server = $currentschedule.Parent.Parent + + if (-not $server) { + $server = $currentschedule.Parent + } + + $server.JobServer.SharedSchedules.Refresh() + $schedulename = $currentschedule.Name + $jobCount = $server.JobServer.SharedSchedules[$currentschedule].JobCount + + # Check if the schedule is shared among other jobs + if ($jobCount -ge 1 -and -not $Force) { + Stop-Function -Message "The schedule $schedulename is shared connected to one or more jobs. If removal is neccesary use -Force." -Target $instance -Continue + } + + # Remove the job schedule + if ($PSCmdlet.ShouldProcess($instance, "Removing schedule $currentschedule on $instance")) { + # Loop through each of the schedules and drop them + Write-Message -Message "Removing schedule $schedulename on $instance" -Level Verbose + + #Check if jobs use the schedule + if ($jobCount -ge 1) { + # Get the job object + $smoSchedules = $server.JobServer.SharedSchedules | Where-Object { ($_.Name -eq $currentschedule.Name) } + + Write-Message -Message "Schedule $schedulename is used in one or more jobs. Removing it for each job." -Level Verbose + + # Loop through each if the schedules + foreach ($smoSchedule in ($smoSchedules)) { + + # Get the job ids + $jobGuids = $Server.JobServer.SharedSchedules[$smoSchedule].EnumJobReferences() + + if (($jobCount -gt 1 -and $Force) -or $jobCount -eq 1) { + + # Loop though each of the jobs + foreach ($guid in $jobGuids) { + # Get the job object + $smoJob = $Server.JobServer.GetJobByID($guid) + + # Get the job schedule + $jobSchedules = $Server.JobServer.Jobs[$smoJob].JobSchedules | Where-Object { $_.Name -eq $smoSchedule } + + foreach ($jobSchedule in ($jobSchedules)) { + try { + Write-Message -Message "Removing the schedule $jobSchedule for job $smoJob" -Level Verbose + + $jobSchedule.Drop() + } catch { + Stop-Function -Message "Failure" -Target $instance -ErrorRecord $_ -Continue + } + } + } + } + } + } + + Write-Message -Message "Removing schedules that are not being used by other jobs." -Level Verbose + $server.JobServer.SharedSchedules.Refresh() + # Get the schedules + $smoSchedules = $server.JobServer.SharedSchedules | Where-Object { ($_.Name -eq $currentschedule.Name) -and ($_.JobCount -eq 0) } + + # Remove the schedules that have no jobs + foreach ($smoSchedule in $smoSchedules) { + try { + $smoSchedule.Drop() + } catch { + Stop-Function -Message "Something went wrong removing the schedule" -Target $instance -ErrorRecord $_ -Continue + } + } + } + } + } + end { + Write-Message -Message "Finished removing jobs schedule(s)." -Level Verbose + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function Remove-DbaAgListener { + <# + .SYNOPSIS + Removes a listener from an availability group on a SQL Server instance. + + .DESCRIPTION + Removes a listener from an availability group on a SQL Server instance. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. Server version must be SQL Server version 2012 or higher. + + .PARAMETER SqlCredential + Login to the SqlInstance instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Listener + The listener or listeners to remove. + + .PARAMETER AvailabilityGroup + Only remove listeners from specific availability groups. + + .PARAMETER WhatIf + Shows what would happen if the command were to run. No actions are actually performed. + + .PARAMETER Confirm + Prompts you for confirmation before executing any changing operations within the command. + + .PARAMETER InputObject + Enables piping from Get-DbaListener + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: AvailabilityGroup, HA, AG + Author: Chrissy LeMaire (@cl), netnerds.net + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Remove-DbaAgListener + + .EXAMPLE + PS C:\> Remove-DbaAgListener -SqlInstance sqlserver2012 -AvailabilityGroup ag1, ag2 -Confirm:$false + + Removes the ag1 and ag2 availability groups on sqlserver2012. Does not prompt for confirmation. + + .EXAMPLE + PS C:\> Get-DbaAvailabilityGroup -SqlInstance sqlserver2012 -AvailabilityGroup availabilitygroup1 | Remove-DbaAgListener + + Removes the listeners returned from the Get-DbaAvailabilityGroup function. Prompts for confirmation. + #> + [CmdletBinding(SupportsShouldProcess, ConfirmImpact = 'High')] + param ( + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [string[]]$Listener, + [string[]]$AvailabilityGroup, + [parameter(ValueFromPipeline)] + [Microsoft.SqlServer.Management.Smo.AvailabilityGroupListener[]]$InputObject, + [switch]$EnableException + ) + process { + if ((Test-Bound -ParameterName SqlInstance)) { + if ((Test-Bound -Not -ParameterName Listener)) { + Stop-Function -Message "You must specify one or more listeners and one or more Availability Groups when using the SqlInstance parameter." + return + } + } + + if ($SqlInstance) { + $InputObject += Get-DbaAgListener -SqlInstance $SqlInstance -SqlCredential $SqlCredential -Listener $Listener + } + + foreach ($aglistener in $InputObject) { + if ($Pscmdlet.ShouldProcess($aglistener.Parent.Parent.Name, "Removing availability group listener $aglistener")) { + try { + $ag = $aglistener.Parent.Name + $aglistener.Parent.AvailabilityGroupListeners[$aglistener.Name].Drop() + [pscustomobject]@{ + ComputerName = $aglistener.ComputerName + InstanceName = $aglistener.InstanceName + SqlInstance = $aglistener.SqlInstance + AvailabilityGroup = $ag + Listener = $aglistener.Name + Status = "Removed" + } + } catch { + Stop-Function -Message "Failure" -ErrorRecord $_ -Continue + } + } + } + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function Remove-DbaAgReplica { + <# + .SYNOPSIS + Removes availability group replicas from availability groups. + + .DESCRIPTION + Removes availability group replicas from availability groups. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. Server version must be SQL Server version 2012 or higher. + + .PARAMETER SqlCredential + Login to the SqlInstance instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER AvailabilityGroup + The specific availability group to query. + + .PARAMETER Replica + The replica to remove. + + .PARAMETER InputObject + Enables piped input from Get-DbaAgReplica. + + .PARAMETER WhatIf + Shows what would happen if the command were to run. No actions are actually performed. + + .PARAMETER Confirm + Prompts you for confirmation before executing any changing operations within the command. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: AG, HA, AvailabilityGroup, Replica + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Remove-DbaAgReplica + + .EXAMPLE + PS C:\> Remove-DbaAgReplica -SqlInstance sql2017a -AvailabilityGroup SharePoint -Replica sp1 + + Removes the sp1 replica from the SharePoint ag on sql2017a. Prompts for confirmation. + + .EXAMPLE + PS C:\> Remove-DbaAgReplica -SqlInstance sql2017a | Select-Object * + + Returns full object properties on all availability group replicas found on sql2017a + + #> + [CmdletBinding(SupportsShouldProcess, ConfirmImpact = 'High')] + param ( + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [string[]]$AvailabilityGroup, + [string[]]$Replica, + [parameter(ValueFromPipeline)] + [Microsoft.SqlServer.Management.Smo.AvailabilityReplica[]]$InputObject, + [switch]$EnableException + ) + process { + if ($SqlInstance -and -not $Replica) { + Stop-Function -Message "You must specify a replica when using the SqlInstance parameter." + return + } + + if ($SqlInstance) { + $InputObject += Get-DbaAgReplica -SqlInstance $SqlInstance -SqlCredential $SqlCredential -Replica $Replica -AvailabilityGroup $AvailabilityGroup + } + + foreach ($agreplica in $InputObject) { + if ($Pscmdlet.ShouldProcess($agreplica.Parent.Parent.Name, "Removing availability group replica $agreplica")) { + try { + $agreplica.Drop() + [pscustomobject]@{ + ComputerName = $agreplica.ComputerName + InstanceName = $agreplica.InstanceName + SqlInstance = $agreplica.SqlInstance + AvailabilityGroup = $agreplica.Parent.Name + Replica = $agreplica.Name + Status = "Removed" + } + } catch { + Stop-Function -Message "Failure" -ErrorRecord $_ -Continue + } + } + } + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function Remove-DbaAvailabilityGroup { + <# + .SYNOPSIS + Removes availability groups on a SQL Server instance. + + .DESCRIPTION + Removes availability groups on a SQL Server instance. + + If possible, remove the availability group only while connected to the server instance that hosts the primary replica. + When the availability group is dropped from the primary replica, changes are allowed in the former primary databases (without high availability protection). + Deleting an availability group from a secondary replica leaves the primary replica in the RESTORING state, and changes are not allowed on the databases. + + Avoid dropping an availability group when the Windows Server Failover Clustering (WSFC) cluster has no quorum. + If you must drop an availability group while the cluster lacks quorum, the metadata availability group that is stored in the cluster is not removed. + After the cluster regains quorum, you will need to drop the availability group again to remove it from the WSFC cluster. + + For more information: https://docs.microsoft.com/en-us/sql/t-sql/statements/drop-availability-group-transact-sql + + .PARAMETER SqlInstance + The target SQL Server instance or instances. Server version must be SQL Server version 2012 or higher. + + .PARAMETER SqlCredential + Login to the SqlInstance instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER AvailabilityGroup + Only remove specific availability groups. + + .PARAMETER AllAvailabilityGroups + Remove all availability groups on an instance. + + .PARAMETER InputObject + Enables piping from Get-DbaAvailabilityGroup. + + .PARAMETER WhatIf + Shows what would happen if the command were to run. No actions are actually performed. + + .PARAMETER Confirm + Prompts you for confirmation before executing any changing operations within the command. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: AvailabilityGroup, HA, AG + Author: Chrissy LeMaire (@cl), netnerds.net + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Remove-DbaAvailabilityGroup + + .EXAMPLE + PS C:\> Remove-DbaAvailabilityGroup -SqlInstance sqlserver2012 -AllAvailabilityGroups + + Removes all availability groups on the sqlserver2014 instance. Prompts for confirmation. + + .EXAMPLE + PS C:\> Remove-DbaAvailabilityGroup -SqlInstance sqlserver2012 -AvailabilityGroup ag1, ag2 -Confirm:$false + + Removes the ag1 and ag2 availability groups on sqlserver2012. Does not prompt for confirmation. + + .EXAMPLE + PS C:\> Get-DbaAvailabilityGroup -SqlInstance sqlserver2012 -AvailabilityGroup availabilitygroup1 | Remove-DbaAvailabilityGroup + + Removes the availability groups returned from the Get-DbaAvailabilityGroup function. Prompts for confirmation. + #> + [CmdletBinding(SupportsShouldProcess, ConfirmImpact = 'High')] + param ( + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [string[]]$AvailabilityGroup, + [switch]$AllAvailabilityGroups, + [parameter(ValueFromPipeline)] + [Microsoft.SqlServer.Management.Smo.AvailabilityGroup[]]$InputObject, + [switch]$EnableException + ) + process { + if ((Test-Bound -ParameterName SqlInstance) -and (Test-Bound -Not -ParameterName AvailabilityGroup, AllAvailabilityGroups)) { + Stop-Function -Message "You must specify AllAvailabilityGroups groups or AvailabilityGroups when using the SqlInstance parameter." + return + } + if ($SqlInstance) { + $InputObject += Get-DbaAvailabilityGroup -SqlInstance $SqlInstance -SqlCredential $SqlCredential -AvailabilityGroup $AvailabilityGroup + } + foreach ($ag in $InputObject) { + if ($Pscmdlet.ShouldProcess($ag.Parent.Name, "Removing availability group $ag")) { + # avoid enumeration issues + try { + $ag.Parent.Query("DROP AVAILABILITY GROUP $ag") + [pscustomobject]@{ + ComputerName = $ag.ComputerName + InstanceName = $ag.InstanceName + SqlInstance = $ag.SqlInstance + AvailabilityGroup = $ag.Name + Status = "Removed" + } + } catch { + Stop-Function -Message "Failure" -ErrorRecord $_ -Continue + } + } + } + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function Remove-DbaBackup { + <# + .SYNOPSIS + Removes SQL Server backups from disk. + + .DESCRIPTION + Removes SQL Server backups from disk. + + Provides all of the same functionality for removing SQL backups from disk as a standard maintenance plan would. + + As an addition you have the ability to check the Archive bit on files before deletion. This will allow you to ensure backups have been archived to your archive location before removal. + + Also included is the ability to remove empty folders as part of this cleanup activity. + + .PARAMETER Path + Specifies the name of the base level folder to search for backup files. Deletion of backup files will be recursive from this location. + + .PARAMETER BackupFileExtension + Specifies the filename extension of the backup files you wish to remove (typically 'bak', 'trn' or 'log'). Do not include the period. + + .PARAMETER RetentionPeriod + Specifies the retention period for backup files. Correct format is ##U. + + ## is the retention value and must be an integer value + U signifies the units where the valid units are: + h = hours + d = days + w = weeks + m = months + + Formatting Examples: + '48h' = 48 hours + '7d' = 7 days + '4w' = 4 weeks + '1m' = 1 month + + .PARAMETER CheckArchiveBit + If this switch is enabled, the filesystem Archive bit is checked before deletion. If this bit is set (which translates to "it has not been backed up to another location yet", the file won't be deleted. + + .PARAMETER RemoveEmptyBackupFolder + If this switch is enabled, empty folders will be removed after the cleanup process is complete. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .PARAMETER WhatIf + If this switch is enabled, no actions are performed but informational messages will be displayed that explain what would happen if the command were to run. + + .PARAMETER Confirm + If this switch is enabled, you will be prompted for confirmation before executing any operations that change state.i + + .NOTES + Tags: Storage, DisasterRecovery, Backup + Author: Chris Sommer (@cjsommer), www.cjsommer.com + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Remove-DbaBackup + + .EXAMPLE + PS C:\> Remove-DbaBackup -Path 'C:\MSSQL\SQL Backup\' -BackupFileExtension trn -RetentionPeriod 48h + + '*.trn' files in 'C:\MSSQL\SQL Backup\' and all subdirectories that are more than 48 hours old will be removed. + + .EXAMPLE + PS C:\> Remove-DbaBackup -Path 'C:\MSSQL\SQL Backup\' -BackupFileExtension trn -RetentionPeriod 48h -WhatIf + + Same as example #1, but doesn't actually remove any files. The function will instead show you what would be done. + This is useful when first experimenting with using the function. + + .EXAMPLE + PS C:\> Remove-DbaBackup -Path 'C:\MSSQL\Backup\' -BackupFileExtension bak -RetentionPeriod 7d -CheckArchiveBit + + '*.bak' files in 'C:\MSSQL\Backup\' and all subdirectories that are more than 7 days old will be removed, but only if the files have been backed up to another location as verified by checking the Archive bit. + + .EXAMPLE + PS C:\> Remove-DbaBackup -Path 'C:\MSSQL\Backup\' -BackupFileExtension bak -RetentionPeriod 1w -RemoveEmptyBackupFolder + + '*.bak' files in 'C:\MSSQL\Backup\' and all subdirectories that are more than 1 week old will be removed. Any folders left empty will be removed as well. + +#> + [CmdletBinding(SupportsShouldProcess)] + param ( + [parameter(Mandatory, HelpMessage = "Full path to the root level backup folder (ex. 'C:\SQL\Backups'")] + [Alias("BackupFolder")] + [string]$Path, + [parameter(Mandatory, HelpMessage = "Backup File extension to remove (ex. bak, trn, dif)")] + [string]$BackupFileExtension , + [parameter(Mandatory, HelpMessage = "Backup retention period. (ex. 24h, 7d, 4w, 6m)")] + [string]$RetentionPeriod , + [switch]$CheckArchiveBit = $false , + [switch]$RemoveEmptyBackupFolder = $false, + [Alias('Silent')] + [switch]$EnableException + ) + begin { + # Ensure BackupFileExtension does not begin with a . + if ($BackupFileExtension -match "^[.]") { + Write-Message -Level Warning -Message "Parameter -BackupFileExtension begins with a period '$BackupFileExtension'. A period is automatically prepended to -BackupFileExtension and need not be passed in." + } + } + process { + # Process stuff + Write-Message -Message "Removing backups from $Path" -Level Verbose + Find-DbaBackup -Path $Path -BackupFileExtension $BackupFileExtension -RetentionPeriod $RetentionPeriod -CheckArchiveBit:$CheckArchiveBit -EnableException | + Foreach-Object { + $file = $_ + if ($PSCmdlet.ShouldProcess($file.Directory.FullName, "Removing backup file $($file.Name)")) { + try { + $file | Remove-Item -Force -EA Stop + } catch { + Write-Message -Message "Failed to remove $file." -Level Warning -ErrorRecord $_ + } + } + } + Write-Message -Message "File Cleaning ended." -Level Verbose + # Cleanup empty backup folders. + if ($RemoveEmptyBackupFolder) { + Write-Message -Message "Removing empty folders." -Level Verbose + (Get-ChildItem -Directory -Path $Path -Recurse -ErrorAction SilentlyContinue -ErrorVariable EnumErrors).FullName | + Sort-Object -Descending | + Foreach-Object { + $OrigPath = $_ + try { + $Contents = @(Get-ChildItem -Force $OrigPath -ErrorAction Stop) + } catch { + Write-Message -Message "Can't enumerate $OrigPath." -Level Warning -ErrorRecord $_ + } + if ($Contents.Count -eq 0) { + return $_ + } + } | + Foreach-Object { + $FolderPath = $_ + if ($PSCmdlet.ShouldProcess($Path, "Removing empty folder .$($FolderPath.Replace($Path, ''))")) { + try { + $FolderPath | Remove-Item -ErrorAction Stop + } catch { + Write-Message -Message "Failed to remove $FolderPath." -Level Warning -ErrorRecord $_ + } + } + } + if ($EnumErrors) { + Write-Message "Errors encountered enumerating folders." -Level Warning -ErrorRecord $EnumErrors + } + Write-Message -Message "Removed empty folders." -Level Verbose + } + } +} +function Remove-DbaClientAlias { + <# + .SYNOPSIS + Removes a sql alias for the specified server - mimics cliconfg.exe + + .DESCRIPTION + Removes a sql alias for the specified server by altering HKLM:\SOFTWARE\Microsoft\MSSQLServer\Client - mimics cliconfg.exe. + + .PARAMETER ComputerName + The target computer where the alias will be created. + + .PARAMETER Credential + Allows you to login to remote computers using alternative credentials + + .PARAMETER Alias + The alias or array of aliases to be deleted + + .PARAMETER WhatIf + If this switch is enabled, no actions are performed but informational messages will be displayed that explain what would happen if the command were to run. + + .PARAMETER Confirm + If this switch is enabled, you will be prompted for confirmation before executing any operations that change state. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Alias + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Remove-DbaClientAlias + + .EXAMPLE + PS C:\> Remove-DbaClientAlias -ComputerName workstationx -Alias sqlps + + Removes the sqlps SQL client alias on workstationx + + .EXAMPLE + PS C:\> Get-DbaClientAlias | Remove-DbaClientAlias + + Removes all SQL Server client aliases on the local computer + + #> + [CmdletBinding(SupportsShouldProcess)] + param ( + [parameter(ValueFromPipelineByPropertyName = $true)] + [DbaInstanceParameter[]]$ComputerName = $env:COMPUTERNAME, + [PSCredential]$Credential, + [parameter(Mandatory, ValueFromPipelineByPropertyName = $true)] + [Alias('AliasName')] + [string[]]$Alias, + [Alias('Silent')] + [switch]$EnableException + ) + + begin { + $scriptblock = { + $Alias = $args + + $basekeys = "HKLM:\SOFTWARE\WOW6432Node\Microsoft\MSSQLServer", "HKLM:\SOFTWARE\Microsoft\MSSQLServer" + + foreach ($basekey in $basekeys) { + $fullKey = "$basekey\Client\ConnectTo" + if ((Test-Path $fullKey) -eq $false) { + <# DO NOT use Write-Message as this is inside of a script block #> + Write-Warning "Registry key ($fullKey) does not exist. Quitting." + continue + } + + if ($basekey -like "*WOW64*") { + $architecture = "32-bit" + } else { + $architecture = "64-bit" + } + + $all = Get-Item -Path $fullKey + foreach ($entry in $all) { + $e = $entry.ToString().Replace('HKEY_LOCAL_MACHINE', 'HKLM:\') + foreach ($a in $Alias) { + if ($entry.Property -contains $a) { + Remove-ItemProperty -Path $e -Name $a + + [PSCustomObject]@{ + ComputerName = $computer + Architecture = $architecture + Alias = $a + Status = "Removed" + } + } + } + } + } + } + } + + process { + foreach ($computer in $ComputerName) { + $null = Test-ElevationRequirement -ComputerName $computer -Continue + + if ($PSCmdlet.ShouldProcess("$($Alias -join ', ') on $computer", "Remove aliases")) { + try { + Invoke-Command2 -ComputerName $computer -Credential $Credential -ScriptBlock $scriptblock -ErrorAction Stop -Verbose:$false -ArgumentList $Alias + } catch { + Stop-Function -Message "Failure" -ErrorRecord $_ -Target $computer -Continue + } + } + } + } +} +function Remove-DbaCmConnection { + <# + .SYNOPSIS + Removes connection objects from the connection cache used for remote computer management. + + .DESCRIPTION + Removes connection objects from the connection cache used for remote computer management. + + .PARAMETER ComputerName + The target computer. Accepts both text as well as the output of Get-DbaCmConnection. + + .PARAMETER WhatIf + If this switch is enabled, no actions are performed but informational messages will be displayed that explain what would happen if the command were to run. + + .PARAMETER Confirm + If this switch is enabled, you will be prompted for confirmation before executing any operations that change state. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: ComputerManagement, CIM + Author: Friedrich Weinmann (@FredWeinmann) + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Remove-DbaCmConnection + + .EXAMPLE + PS C:\> Remove-DbaCmConnection -ComputerName sql2014 + + Removes the cached connection to the server sql2014 from the cache. + + .EXAMPLE + PS C:\> Get-DbaCmConnection | Remove-DbaCmConnection + + Clears the entire connection cache. + + #> + [CmdletBinding(SupportsShouldProcess, ConfirmImpact = 'High')] + param ( + [Parameter(ValueFromPipeline, Mandatory)] + [Sqlcollaborative.Dbatools.Parameter.DbaCmConnectionParameter[]] + $ComputerName, + + [switch] + [Alias('Silent')]$EnableException + ) + + begin { + Write-Message -Level InternalComment -Message "Starting" + Write-Message -Level Verbose -Message "Bound parameters: $($PSBoundParameters.Keys -join ", ")" + } + process { + foreach ($connectionObject in $ComputerName) { + if (-not $connectionObject.Success) { Stop-Function -Message "Failed to interpret computername input: $($connectionObject.InputObject)" -Category InvalidArgument -Target $connectionObject.InputObject -Continue } + Write-Message -Level VeryVerbose -Message "Removing from connection cache: $($connectionObject.Connection.ComputerName)" -Target $connectionObject.Connection.ComputerName + if ($Pscmdlet.ShouldProcess($($connectionObject.Connection.ComputerName), "Removing Connection")) { + if ([Sqlcollaborative.Dbatools.Connection.ConnectionHost]::Connections.ContainsKey($connectionObject.Connection.ComputerName)) { + $null = [Sqlcollaborative.Dbatools.Connection.ConnectionHost]::Connections.Remove($connectionObject.Connection.ComputerName) + Write-Message -Level Verbose -Message "Successfully removed $($connectionObject.Connection.ComputerName)" -Target $connectionObject.Connection.ComputerName + } else { + Write-Message -Level Verbose -Message "Not found: $($connectionObject.Connection.ComputerName)" -Target $connectionObject.Connection.ComputerName + } + } + } + } + end { + Write-Message -Level InternalComment -Message "Ending" + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function Remove-DbaCmsRegServer { + <# + .SYNOPSIS + Removes registered servers found in SQL Server Central Management Server (CMS). + + .DESCRIPTION + Removes registered servers found in SQL Server Central Management Server (CMS). + + .PARAMETER SqlInstance + The target SQL Server instance or instances. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Name + Specifies one or more names to include. Name is the visible name in SSMS CMS interface (labeled Registered Server Name) + + .PARAMETER ServerName + Specifies one or more server names to include. Server Name is the actual instance name (labeled Server Name) + + .PARAMETER Group + Specifies one or more groups to include from SQL Server Central Management Server. + + .PARAMETER InputObject + Allows results from Get-DbaCmsRegServer to be piped in + + .PARAMETER WhatIf + Shows what would happen if the command were to run. No actions are actually performed. + + .PARAMETER Confirm + Prompts you for confirmation before executing any changing operations within the command. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: RegisteredServer, CMS + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Remove-DbaCmsRegServer + + .EXAMPLE + PS C:\> Remove-DbaCmsRegServer -SqlInstance sql2012 -Group HR, Accounting + + Removes all servers from the HR and Accounting groups on sql2012 + + .EXAMPLE + PS C:\> Remove-DbaCmsRegServer -SqlInstance sql2012 -Group HR\Development + + Removes all servers from the HR and sub-group Development from the CMS on sql2012. + + .EXAMPLE + PS C:\> Remove-DbaCmsRegServer -SqlInstance sql2012 -Confirm:$false + + Removes all registered servers on sql2012 and turns off all prompting + + #> + + [CmdletBinding(SupportsShouldProcess, ConfirmImpact = 'High')] + param ( + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [string[]]$Name, + [string[]]$ServerName, + [string[]]$Group, + [parameter(ValueFromPipeline)] + [Microsoft.SqlServer.Management.RegisteredServers.RegisteredServer[]]$InputObject, + [switch]$EnableException + ) + + process { + foreach ($instance in $SqlInstance) { + $InputObject += Get-DbaCmsRegServer -SqlInstance $instance -SqlCredential $SqlCredential -Group $Group -ExcludeGroup $ExcludeGroup -Name $Name -ServerName $ServerName + } + + foreach ($regserver in $InputObject) { + $server = $regserver.Parent + + if ($Pscmdlet.ShouldProcess($regserver.Parent, "Removing $regserver")) { + $null = $regserver.Drop() + Disconnect-RegServer -Server $server + + try { + [pscustomobject]@{ + ComputerName = $regserver.ComputerName + InstanceName = $regserver.InstanceName + SqlInstance = $regserver.SqlInstance + Name = $regserver.Name + ServerName = $regserver.ServerName + Status = "Dropped" + } + } catch { + Stop-Function -Message "Failed to drop $regserver on $server" -ErrorRecord $_ -Continue + } + } + } + } + end { + Test-DbaDeprecation -DeprecatedOn "1.0.0" -Alias Remove-DbaRegisteredServer + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function Remove-DbaCmsRegServerGroup { + <# + .SYNOPSIS + Gets list of Server Groups objects stored in SQL Server Central Management Server (CMS). + + .DESCRIPTION + Returns an array of Server Groups found in the CMS. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Name + Specifies one or more groups to include from SQL Server Central Management Server. + + .PARAMETER InputObject + Allows results from Get-DbaCmsRegServerGroup to be piped in + + .PARAMETER WhatIf + Shows what would happen if the command were to run. No actions are actually performed. + + .PARAMETER Confirm + Prompts you for confirmation before executing any changing operations within the command. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: RegisteredServer, CMS + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Remove-DbaCmsRegServerGroup + + .EXAMPLE + PS C:\> Remove-DbaCmsRegServerGroup -SqlInstance sql2012 -Group HR, Accounting + + Removes the HR and Accounting groups on sql2012 + + .EXAMPLE + PS C:\> Remove-DbaCmsRegServerGroup -SqlInstance sql2012 -Group HR\Development -Confirm:$false + + Removes the Development subgroup within the HR group on sql2012 and turns off all prompting + + #> + [CmdletBinding(SupportsShouldProcess, ConfirmImpact = 'High')] + param ( + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [Alias("Group")] + [string[]]$Name, + [parameter(ValueFromPipeline)] + [Microsoft.SqlServer.Management.RegisteredServers.ServerGroup[]]$InputObject, + [switch]$EnableException + ) + process { + foreach ($instance in $SqlInstance) { + $InputObject += Get-DbaCmsRegServerGroup -SqlInstance $instance -SqlCredential $SqlCredential -Group $Name + } + + foreach ($regservergroup in $InputObject) { + $parentserver = Get-RegServerParent -InputObject $regservergroup + + if ($null -eq $parentserver) { + Stop-Function -Message "Something went wrong and it's hard to explain, sorry. This basically shouldn't happen." -Continue + } + + if ($Pscmdlet.ShouldProcess($parentserver.DomainInstanceName, "Removing $($regservergroup.Name) CMS Group")) { + $null = $parentserver.ServerConnection.ExecuteNonQuery($regservergroup.ScriptDrop().GetScript()) + $parentserver.ServerConnection.Disconnect() + try { + [pscustomobject]@{ + ComputerName = $parentserver.ComputerName + InstanceName = $parentserver.InstanceName + SqlInstance = $parentserver.SqlInstance + Name = $regservergroup.Name + Status = "Dropped" + } + } catch { + Stop-Function -Message "Failed to drop $regservergroup on $parentserver" -ErrorRecord $_ -Continue + } + } + } + } + end { + Test-DbaDeprecation -DeprecatedOn "1.0.0" -Alias Remove-DbaRegisteredServerGroup + } +} +function Remove-DbaComputerCertificate { + <# + .SYNOPSIS + Removes a computer certificate - useful for removing easily certs from remote computers + + .DESCRIPTION + Removes a computer certificate from a local or remote compuer + + .PARAMETER ComputerName + The target computer. Defaults to localhost. + + .PARAMETER Credential + Allows you to login to $ComputerName using alternative credentials + + .PARAMETER Thumbprint + The thumbprint of the certificate object + + .PARAMETER Store + Certificate store - defaults to LocalMachine (otherwise exceptions can be thrown on remote connections) + + .PARAMETER Folder + Certificate folder + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .PARAMETER WhatIf + Shows what would happen if the command were to run. No actions are actually performed. + + .PARAMETER Confirm + Prompts you for confirmation before executing any changing operations within the command. + + .NOTES + Tags: Certificate + Author: Chrissy LeMaire (@cl), netnerds.net + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Remove-DbaComputerCertificate + + .EXAMPLE + PS C:\> Remove-DbaComputerCertificate -ComputerName Server1 -Thumbprint C2BBE81A94FEE7A26FFF86C2DFDAF6BFD28C6C94 + + Removes certificate with thumbprint C2BBE81A94FEE7A26FFF86C2DFDAF6BFD28C6C94 in the LocalMachine store on Server1 + + .EXAMPLE + PS C:\> Get-DbaComputerCertificate | Where-Object Thumbprint -eq E0A071E387396723C45E92D42B2D497C6A182340 | Remove-DbaComputerCertificate + + Removes certificate using the pipeline + + .EXAMPLE + PS C:\> Remove-DbaComputerCertificate -ComputerName Server1 -Thumbprint C2BBE81A94FEE7A26FFF86C2DFDAF6BFD28C6C94 -Store User -Folder My + + Removes certificate with thumbprint C2BBE81A94FEE7A26FFF86C2DFDAF6BFD28C6C94 in the User\My (Personal) store on Server1 + + #> + [CmdletBinding(SupportsShouldProcess, ConfirmImpact = "High")] + param ( + [Alias("ServerInstance", "SqlServer", "SqlInstance")] + [DbaInstanceParameter[]]$ComputerName = $env:COMPUTERNAME, + [PSCredential]$Credential, + [parameter(ValueFromPipelineByPropertyName, Mandatory)] + [string[]]$Thumbprint, + [string]$Store = "LocalMachine", + [string]$Folder = "My", + [Alias('Silent')] + [switch]$EnableException + ) + + begin { + #region Scriptblock for remoting + $scriptblock = { + param ( + $Thumbprint, + $Store, + $Folder + ) + <# DO NOT use Write-Message as this is inside of a script block #> + Write-Verbose "Searching Cert:\$Store\$Folder for thumbprint: $thumbprint" + function Get-CoreCertStore { + [CmdletBinding()] + param ( + [ValidateSet("CurrentUser", "LocalMachine")] + [string]$Store, + [ValidateSet("AddressBook", "AuthRoot, CertificateAuthority", "Disallowed", "My", "Root", "TrustedPeople", "TrustedPublisher")] + [string]$Folder, + [ValidateSet("ReadOnly", "ReadWrite")] + [string]$Flag = "ReadOnly" + ) + + $storename = [System.Security.Cryptography.X509Certificates.StoreLocation]::$Store + $foldername = [System.Security.Cryptography.X509Certificates.StoreName]::$Folder + $flags = [System.Security.Cryptography.X509Certificates.OpenFlags]::$Flag + $certstore = [System.Security.Cryptography.X509Certificates.X509Store]::New($foldername, $storename) + $certstore.Open($flags) + + $certstore + } + + function Get-CoreCertificate { + [CmdletBinding()] + param ( + [ValidateSet("CurrentUser", "LocalMachine")] + [string]$Store, + [ValidateSet("AddressBook", "AuthRoot, CertificateAuthority", "Disallowed", "My", "Root", "TrustedPeople", "TrustedPublisher")] + [string]$Folder, + [ValidateSet("ReadOnly", "ReadWrite")] + [string]$Flag = "ReadOnly", + [string[]]$Thumbprint, + [System.Security.Cryptography.X509Certificates.X509Store[]]$InputObject + ) + + if (-not $InputObject) { + $InputObject += Get-CoreCertStore -Store $Store -Folder $Folder -Flag $Flag + } + + $certs = ($InputObject).Certificates + + if ($Thumbprint) { + $certs = $certs | Where-Object Thumbprint -in $Thumbprint + } + $certs + } + + if ($Thumbprint) { + try { + <# DO NOT use Write-Message as this is inside of a script block #> + Write-Verbose "Searching Cert:\$Store\$Folder" + $cert = Get-CoreCertificate -Store $Store -Folder $Folder -Thumbprint $Thumbprint + } catch { + # don't care - there's a weird issue with remoting where an exception gets thrown for no apparent reason + # here to avoid an empty catch + $null = 1 + } + } + + if ($cert) { + $certstore = Get-CoreCertStore -Store $Store -Folder $Folder -Flag ReadWrite + $certstore.Remove($cert) + $status = "Removed" + } else { + $status = "Certificate not found in Cert:\$Store\$Folder" + } + + [pscustomobject]@{ + ComputerName = $env:COMPUTERNAME + Store = $Store + Folder = $Folder + Thumbprint = $thumbprint + Status = $status + } + } + #endregion Scriptblock for remoting + } + + process { + foreach ($computer in $computername) { + foreach ($thumb in $Thumbprint) { + if ($PScmdlet.ShouldProcess("local", "Connecting to $computer to remove cert from Cert:\$Store\$Folder")) { + try { + Invoke-Command2 -ComputerName $computer -Credential $Credential -ArgumentList $thumb, $Store, $Folder -ScriptBlock $scriptblock -ErrorAction Stop + } catch { + Stop-Function -Message $_ -ErrorRecord $_ -Target $computer -Continue + } + } + } + } + } +} +function Remove-DbaDatabase { + <# + .SYNOPSIS + Drops a database, hopefully even the really stuck ones. + + .DESCRIPTION + Tries a bunch of different ways to remove a database or two or more. + + .PARAMETER SqlInstance + The target SQL Server instance or instances.You must have sysadmin access and server version must be SQL Server version 2000 or higher. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Database + The database(s) to process - this list is auto-populated from the server. If unspecified, all databases will be processed. + + .PARAMETER InputObject + A collection of databases (such as returned by Get-DbaDatabase), to be removed. + + .PARAMETER IncludeSystemDb + Use this switch to disable any kind of verbose messages + + .PARAMETER WhatIf + Shows what would happen if the command were to run. No actions are actually performed. + + .PARAMETER Confirm + Prompts you for confirmation before executing any changing operations within the command. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Delete, Databases + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Remove-DbaDatabase + + .EXAMPLE + PS C:\> Remove-DbaDatabase -SqlInstance sql2016 -Database containeddb + + Prompts then removes the database containeddb on SQL Server sql2016 + + .EXAMPLE + PS C:\> Remove-DbaDatabase -SqlInstance sql2016 -Database containeddb, mydb + + Prompts then removes the databases containeddb and mydb on SQL Server sql2016 + + .EXAMPLE + PS C:\> Remove-DbaDatabase -SqlInstance sql2016 -Database containeddb -Confirm:$false + + Does not prompt and swiftly removes containeddb on SQL Server sql2016 + + .EXAMPLE + PS C:\> Get-DbaDatabase -SqlInstance server\instance -ExcludeSystem | Remove-DbaDatabase + + Removes all the user databases from server\instance + + .EXAMPLE + PS C:\> Get-DbaDatabase -SqlInstance server\instance -ExcludeSystem | Remove-DbaDatabase -Confirm:$false + + Removes all the user databases from server\instance without any confirmation + #> + [CmdletBinding(SupportsShouldProcess, ConfirmImpact = 'High', DefaultParameterSetName = "Default")] + param ( + [parameter(Mandatory, ParameterSetName = "instance")] + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [Alias("Credential")] + [PSCredential] + $SqlCredential, + [parameter(Mandatory, ParameterSetName = "instance")] + [Alias("Databases")] + [object[]]$Database, + [Parameter(ValueFromPipeline, Mandatory, ParameterSetName = "databases")] + [Microsoft.SqlServer.Management.Smo.Database[]]$InputObject, + [switch]$IncludeSystemDb, + [Alias('Silent')] + [switch]$EnableException + ) + + process { + + foreach ($instance in $SqlInstance) { + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $sqlcredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + $InputObject += $server.Databases | Where-Object { $_.Name -in $Database } + } + + $system_dbs = @( "master", "model", "tempdb", "resource", "msdb" ) + + if (-not($IncludeSystemDb)) { + $InputObject = $InputObject | Where-Object { $_.Name -notin $system_dbs} + } + + foreach ($db in $InputObject) { + try { + $server = $db.Parent + if ($Pscmdlet.ShouldProcess("$db on $server", "KillDatabase")) { + $server.KillDatabase($db.name) + $server.Refresh() + + [pscustomobject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + Database = $db.name + Status = "Dropped" + } + } + } catch { + try { + if ($Pscmdlet.ShouldProcess("$db on $server", "alter db set single_user with rollback immediate then drop")) { + $null = $server.Query("if exists (select * from sys.databases where name = '$($db.name)' and state = 0) alter database $db set single_user with rollback immediate; drop database $db") + + [pscustomobject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + Database = $db.name + Status = "Dropped" + } + } + } catch { + try { + if ($Pscmdlet.ShouldProcess("$db on $server", "SMO drop")) { + $dbname = $db.Name + $db.Parent.databases[$dbname].Drop() + $server.Refresh() + + [pscustomobject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + Database = $db.name + Status = "Dropped" + } + } + } catch { + Write-Message -Level Verbose -Message "Could not drop database $db on $server" + + [pscustomobject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + Database = $db.name + Status = (Get-ErrorMessage -Record $_) + } + } + } + } + } + } +} +function Remove-DbaDatabaseSafely { + <# + .SYNOPSIS + Safely removes a SQL Database and creates an Agent Job to restore it. + + .DESCRIPTION + Performs a DBCC CHECKDB on the database, backs up the database with Checksum and verify only to a final (golden) backup location, creates an Agent Job to restore from that backup, drops the database, runs the agent job to restore the database, performs a DBCC CHECKDB and drops the database. + + With huge thanks to Grant Fritchey and his verify your backups video. Take a look, it's only 3 minutes long. http://sqlps.io/backuprant + + .PARAMETER SqlInstance + The target SQL Server instance or instances. You must have sysadmin access and server version must be SQL Server version 2000 or higher. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Destination + If specified, Agent jobs will be created on this server. By default, the jobs will be created on the server specified by SqlInstance. You must have sysadmin access and the server must be SQL Server 2000 or higher. The SQL Agent service will be started if it is not already running. + + .PARAMETER DestinationCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Database + Specifies one or more databases to remove. + + .PARAMETER NoDbccCheckDb + If this switch is enabled, the initial DBCC CHECK DB will be skipped. This will make the process quicker but will also allow you to create an Agent job that restores a database backup containing a corrupt database. + + A second DBCC CHECKDB is performed on the restored database so you will still be notified BUT USE THIS WITH CARE. + + .PARAMETER BackupFolder + Specifies the path to a folder where the final backups of the removed databases will be stored. If you are using separate source and destination servers, you must specify a UNC path such as \\SERVER1\BACKUPSHARE\ + + .PARAMETER JobOwner + Specifies the name of the account which will own the Agent jobs. By default, sa is used. + + .PARAMETER UseDefaultFilePaths + If this switch is enabled, the default file paths for the data and log files on the instance where the database is restored will be used. By default, the original file paths will be used. + + .PARAMETER CategoryName + Specifies the Category Name for the Agent job that is created for restoring the database(s). By default, the name is "Rationalisation". + + .PARAMETER BackupCompression + If this switch is enabled, compression will be used for the backup regardless of the SQL Server instance setting. By default, the SQL Server instance setting for backup compression is used. + + .PARAMETER AllDatabases + If this switch is enabled, all user databases on the server will be removed. This is useful when decommissioning a server. You should use a Destination with this switch. + + .PARAMETER ReuseSourceFolderStructure + If this switch is enabled, the source folder structure will be used when restoring instead of using the destination instance default folder structure. + + .PARAMETER Force + If this switch is enabled, all actions will be performed even if DBCC errors are detected. An Agent job will be created with 'DBCCERROR' in the name and the backup file will have 'DBCC' in its name. + + .PARAMETER WhatIf + If this switch is enabled, no actions are performed but informational messages will be displayed that explain what would happen if the command were to run. + + .PARAMETER Confirm + If this switch is enabled, you will be prompted for confirmation before executing any operations that change state. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Database, Remove + Author: Rob Sewell (@SQLDBAWithBeard), sqldbawithabeard.com + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Remove-DbaDatabaseSafely + + .EXAMPLE + PS C:\> Remove-DbaDatabaseSafely -SqlInstance 'Fade2Black' -Database RideTheLightning -BackupFolder 'C:\MSSQL\Backup\Rationalised - DO NOT DELETE' + + Performs a DBCC CHECKDB on database RideTheLightning on server Fade2Black. If there are no errors, the database is backup to the folder C:\MSSQL\Backup\Rationalised - DO NOT DELETE. Then, an Agent job to restore the database from that backup is created. The database is then dropped, the Agent job to restore it run, a DBCC CHECKDB run against the restored database, and then it is dropped again. + + Any DBCC errors will be written to your documents folder + + .EXAMPLE + PS C:\> $Database = 'DemoNCIndex','RemoveTestDatabase' + PS C:\> Remove-DbaDatabaseSafely -SqlInstance 'Fade2Black' -Database $Database -BackupFolder 'C:\MSSQL\Backup\Rationalised - DO NOT DELETE' + + Performs a DBCC CHECKDB on two databases, 'DemoNCIndex' and 'RemoveTestDatabase' on server Fade2Black. Then, an Agent job to restore each database from those backups is created. The databases are then dropped, the Agent jobs to restore them run, a DBCC CHECKDB run against the restored databases, and then they are dropped again. + + Any DBCC errors will be written to your documents folder + + .EXAMPLE + PS C:\> Remove-DbaDatabaseSafely -SqlInstance 'Fade2Black' -Destination JusticeForAll -Database RideTheLightning -BackupFolder '\\BACKUPSERVER\BACKUPSHARE\MSSQL\Rationalised - DO NOT DELETE' + + Performs a DBCC CHECKDB on database RideTheLightning on server Fade2Black. If there are no errors, the database is backup to the folder \\BACKUPSERVER\BACKUPSHARE\MSSQL\Rationalised - DO NOT DELETE . Then, an Agent job is created on server JusticeForAll to restore the database from that backup is created. The database is then dropped on Fade2Black, the Agent job to restore it on JusticeForAll is run, a DBCC CHECKDB run against the restored database, and then it is dropped from JusticeForAll. + + Any DBCC errors will be written to your documents folder + + .EXAMPLE + PS C:\> Remove-DbaDatabaseSafely -SqlInstance IronMaiden -Database $Database -Destination TheWildHearts -BackupFolder Z:\Backups -NoDbccCheckDb -JobOwner 'THEBEARD\Rob' + + For the databases $Database on the server IronMaiden a DBCC CHECKDB will not be performed before backing up the databases to the folder Z:\Backups. Then, an Agent job is created on server TheWildHearts with a Job Owner of THEBEARD\Rob to restore each database from that backup using the instance's default file paths. The database(s) is(are) then dropped on IronMaiden, the Agent job(s) run, a DBCC CHECKDB run on the restored database(s), and then the database(s) is(are) dropped. + + .EXAMPLE + PS C:\> Remove-DbaDatabaseSafely -SqlInstance IronMaiden -Database $Database -Destination TheWildHearts -BackupFolder Z:\Backups + + The databases $Database on the server IronMaiden will be backed up the to the folder Z:\Backups. Then, an Agent job is created on server TheWildHearts with a Job Owner of THEBEARD\Rob to restore each database from that backup using the instance's default file paths. The database(s) is(are) then dropped on IronMaiden, the Agent job(s) run, a DBCC CHECKDB run on the restored database(s), and then the database(s) is(are) dropped. + + If there is a DBCC Error, the function will continue to perform rest of the actions and will create an Agent job with 'DBCCERROR' in the name and a Backup file with 'DBCCError' in the name. + + #> + [CmdletBinding(SupportsShouldProcess, DefaultParameterSetName = "Default")] + param ( + [parameter(Mandatory, ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter]$SqlInstance, + [Alias("Credential")] + [PSCredential] + $SqlCredential, + [Alias("Databases")] + [object[]]$Database, + [DbaInstanceParameter]$Destination = $sqlinstance, + [PSCredential] + $DestinationCredential, + [Alias("NoCheck")] + [switch]$NoDbccCheckDb, + [parameter(Mandatory)] + [string]$BackupFolder, + [string]$CategoryName = 'Rationalisation', + [string]$JobOwner, + [switch]$AllDatabases, + [ValidateSet("Default", "On", "Of")] + [string]$BackupCompression = 'Default', + [switch]$ReuseSourceFolderStructure, + [switch]$Force, + [Alias('Silent')] + [switch]$EnableException + ) + + begin { + if (!$AllDatabases -and !$Database) { + Stop-Function -Message "You must specify at least one database. Use -Database or -AllDatabases." -ErrorRecord $_ + return + } + + $sourceserver = Connect-SqlInstance -SqlInstance $SqlInstance -SqlCredential $sqlCredential + + if (-not $destination) { + $destination = $sqlinstance + $DestinationCredential = $SqlCredential + } + + if ($sqlinstance -ne $destination) { + + $destserver = Connect-SqlInstance -SqlInstance $destination -SqlCredential $DestinationCredential + + $sourcenb = $instance.ComputerName + $destnb = $instance.ComputerName + + if ($BackupFolder.StartsWith("\\") -eq $false -and $sourcenb -ne $destnb) { + Stop-Function -Message "Backup folder must be a network share if the source and destination servers are not the same." -ErrorRecord $_ -Target $backupFolder + return + } + } else { + $destserver = $sourceserver + } + + $source = $sourceserver.DomainInstanceName + $destination = $destserver.DomainInstanceName + + if (!$jobowner) { + $jobowner = Get-SqlSaLogin $destserver + } + + if ($alldatabases -or !$Database) { + $database = ($sourceserver.databases | Where-Object { $_.IsSystemObject -eq $false -and ($_.Status -match 'Offline') -eq $false }).Name + } + + if (!(Test-DbaPath -SqlInstance $destserver -Path $backupFolder)) { + $serviceaccount = $destserver.ServiceAccount + Stop-Function -Message "Can't access $backupFolder Please check if $serviceaccount has permissions." -ErrorRecord $_ -Target $backupFolder + } + + $jobname = "Rationalised Final Database Restore for $dbname" + $jobStepName = "Restore the $dbname database from Final Backup" + + if (!($destserver.Logins | Where-Object { $_.Name -eq $jobowner })) { + Stop-Function -Message "$destination does not contain the login $jobowner - Please fix and try again - Aborting." -ErrorRecord $_ -Target $jobowner + } + + function Start-SqlAgent { + <# + .SYNOPSIS + #> + [CmdletBinding(SupportsShouldProcess)] + param () + if ($destserver.VersionMajor -eq 8) { + $serviceName = 'MSSQLSERVER' + } else { + $instance = $destserver.InstanceName + if ($instance.length -eq 0) { $instance = "MSSQLSERVER" } + $serviceName = "SQL Server Agent ($instance)" + } + + if ($Pscmdlet.ShouldProcess($destination, "Starting Sql Agent")) { + try { + $ipaddr = Resolve-SqlIpAddress $destserver + $agentservice = Get-Service -ComputerName $ipaddr -DisplayName $serviceName + + if ($agentservice.Status -ne 'Running') { + $agentservice.Start() + $timeout = New-Timespan -seconds 60 + $sw = [diagnostics.stopwatch]::StartNew() + $agentstatus = (Get-Service -ComputerName $ipaddr -DisplayName $serviceName).Status + while ($AgentStatus -ne 'Running' -and $sw.elapsed -lt $timeout) { + $agentStatus = (Get-Service -ComputerName $ipaddr -DisplayName $serviceName).Status + } + } + } + + catch { + throw $_ + } + + if ($agentservice.Status -ne 'Running') { + throw "Cannot start Agent Service on $destination - Aborting." + } + } + } + + function Start-DbccCheck { + <# + .SYNOPSIS + + #> + + [CmdletBinding(SupportsShouldProcess)] + param ( + [object]$server, + [string]$dbname + ) + + $servername = $server.name + $db = $server.databases[$dbname] + + if ($Pscmdlet.ShouldProcess($sourceserver, "Running dbcc check on $dbname on $servername")) { + try { + $null = $db.CheckTables('None') + Write-Message -Level Verbose -Message "DBCC CHECKDB finished successfully for $dbname on $servername." + } + + catch { + Write-Message -Level Warning -Message "DBCC CHECKDB failed." + Stop-Function -Message "Error occured: $_" -Target $agentservice -ErrorRecord $_ -Continue + + if ($force) { + return $true + } else { + return $false + } + } + } + } + + function New-SqlAgentJobCategory { + <# + .SYNOPSIS + + #> + [CmdletBinding(SupportsShouldProcess)] + param ([string]$categoryname, + [object]$jobServer) + + if (!$jobServer.JobCategories[$categoryname]) { + if ($Pscmdlet.ShouldProcess($sourceserver, "Running dbcc check on $dbname on $sourceserver")) { + try { + Write-Message -Level Verbose -Message "Creating Agent Job Category $categoryname." + $category = New-Object Microsoft.SqlServer.Management.Smo.Agent.JobCategory + $category.Parent = $jobServer + $category.Name = $categoryname + $category.Create() + Write-Message -Level Verbose -Message "Created Agent Job Category $categoryname." + } catch { + Stop-Function -Message "FAILED : To Create Agent Job Category - $categoryname - Aborting." -Target $categoryname -ErrorRecord $_ + return + } + } + } + } + + function Restore-Database { + <# + .SYNOPSIS + Internal function. Restores .bak file to Sql database. Creates db if it doesn't exist. $filestructure is + a custom object that contains logical and physical file locations. + #> + + param ( + [Parameter(Mandatory)] + [Alias('ServerInstance', 'SqlInstance', 'SqlServer')] + [object]$server, + [Parameter(Mandatory)] + [ValidateNotNullOrEmpty()] + [string]$dbname, + [Parameter(Mandatory)] + [string]$backupfile, + [string]$filetype = 'Database', + [Parameter(Mandatory)] + [object]$filestructure, + [switch]$norecovery, + [PSCredential]$sqlCredential, + [switch]$TSql = $false + ) + + $server = Connect-SqlInstance -SqlInstance $server -SqlCredential $sqlCredential + $servername = $server.name + $server.ConnectionContext.StatementTimeout = 0 + $restore = New-Object 'Microsoft.SqlServer.Management.Smo.Restore' + $restore.ReplaceDatabase = $true + + foreach ($file in $filestructure.values) { + $movefile = New-Object 'Microsoft.SqlServer.Management.Smo.RelocateFile' + $movefile.LogicalFileName = $file.logical + $movefile.PhysicalFileName = $file.physical + $null = $restore.RelocateFiles.Add($movefile) + } + + try { + if ($TSql) { + $restore.PercentCompleteNotification = 1 + $restore.add_Complete($complete) + $restore.ReplaceDatabase = $true + $restore.Database = $dbname + $restore.Action = $filetype + $restore.NoRecovery = $norecovery + $device = New-Object -TypeName Microsoft.SqlServer.Management.Smo.BackupDeviceItem + $device.name = $backupfile + $device.devicetype = 'File' + $restore.Devices.Add($device) + $restorescript = $restore.script($server) + return $restorescript + } else { + $percent = [Microsoft.SqlServer.Management.Smo.PercentCompleteEventHandler] { + Write-Progress -id 1 -activity "Restoring $dbname to $servername" -percentcomplete $_.Percent -status ([System.String]::Format("Progress: {0} %", $_.Percent)) + } + $restore.add_PercentComplete($percent) + $restore.PercentCompleteNotification = 1 + $restore.add_Complete($complete) + $restore.ReplaceDatabase = $true + $restore.Database = $dbname + $restore.Action = $filetype + $restore.NoRecovery = $norecovery + $device = New-Object -TypeName Microsoft.SqlServer.Management.Smo.BackupDeviceItem + $device.name = $backupfile + $device.devicetype = 'File' + $restore.Devices.Add($device) + + Write-Progress -id 1 -activity "Restoring $dbname to $servername" -percentcomplete 0 -status ([System.String]::Format("Progress: {0} %", 0)) + $restore.sqlrestore($server) + Write-Progress -id 1 -activity "Restoring $dbname to $servername" -status 'Complete' -Completed + + return $true + } + } catch { + Stop-Function -Message "Restore failed" -ErrorRecord $_ -Target $dbname + return $false + } + } + + } + process { + if (Test-FunctionInterrupt) { + return + } + try { + Start-SqlAgent + } catch { + Stop-Function -Message "Failure starting SQL Agent" -ErrorRecord $_ + return + } + + $start = Get-Date + Write-Message -Level Verbose -Message "Starting Rationalisation Script at $start." + + foreach ($dbname in $Database) { + + $db = $sourceserver.databases[$dbname] + + # The db check is needed when the number of databases exceeds 255, then it's no longer auto-populated + if (!$db) { + Stop-Function -Message "$dbname does not exist on $source. Aborting routine for this database." -Continue + } + + $lastFullBckDuration = (Get-DbaBackupHistory -SqlInstance $sourceserver -Database $dbname -LastFull).Duration + + if (-NOT ([string]::IsNullOrEmpty($lastFullBckDuration))) { + $lastFullBckDurationSec = $lastFullBckDuration.TotalSeconds + $lastFullBckDurationMin = [Math]::Round($lastFullBckDuration.TotalMinutes, 2) + + Write-Message -Level Verbose -Message "From the backup history the last full backup took $lastFullBckDurationSec seconds ($lastFullBckDurationMin minutes)" + if ($lastFullBckDurationSec -gt 600) { + Write-Message -Level Verbose -Message "Last full backup took more than 10 minutes. Do you want to continue?" + + # Set up the parts for the user choice + $Title = "Backup duration" + $Info = "Last full backup took more than $lastFullBckDurationMin minutes. Do you want to continue?" + + $Options = [System.Management.Automation.Host.ChoiceDescription[]] @("&Yes", "&No (Skip)") + [int]$Defaultchoice = 0 + $choice = $host.UI.PromptForChoice($Title, $Info, $Options, $Defaultchoice) + # Check the given option + if ($choice -eq 1) { + Stop-Function -Message "You have chosen skipping the database $dbname because of last known backup time ($lastFullBckDurationMin minutes)." -ErrorRecord $_ -Target $dbname -Continue + Continue + } + } + } else { + Write-Message -Level Verbose -Message "Couldn't find last full backup time for database $dbname using Get-DbaBackupHistory." + } + + $jobname = "Rationalised Database Restore Script for $dbname" + $jobStepName = "Restore the $dbname database from Final Backup" + $jobServer = $destserver.JobServer + + if ($jobServer.Jobs[$jobname].count -gt 0) { + if ($force -eq $false) { + Stop-Function -Message "FAILED: The Job $jobname already exists. Have you done this before? Rename the existing job and try again or use -Force to drop and recreate." -Continue + } else { + if ($Pscmdlet.ShouldProcess($dbname, "Dropping $jobname on $source")) { + Write-Message -Level Verbose -Message "Dropping $jobname on $source." + $jobServer.Jobs[$jobname].Drop() + $jobServer.Jobs.Refresh() + } + } + } + + + Write-Message -Level Verbose -Message "Starting Rationalisation of $dbname." + ## if we want to Dbcc before to abort if we have a corrupt database to start with + if ($NoDbccCheckDb -eq $false) { + if ($Pscmdlet.ShouldProcess($dbname, "Running dbcc check on $dbname on $source")) { + Write-Message -Level Verbose -Message "Starting DBCC CHECKDB for $dbname on $source." + $dbccgood = Start-DbccCheck -Server $sourceserver -DBName $dbname + + if ($dbccgood -eq $false) { + if ($force -eq $false) { + Write-Message -Level Verbose -Message "DBCC failed for $dbname (you should check that). Aborting routine for this database." + continue + } else { + Write-Message -Level Verbose -Message "DBCC failed, but Force specified. Continuing." + } + } + } + } + + if ($Pscmdlet.ShouldProcess($source, "Backing up $dbname")) { + Write-Message -Level Verbose -Message "Starting Backup for $dbname on $source." + ## Take a Backup + try { + $timenow = [DateTime]::Now.ToString('yyyyMMdd_HHmmss') + $backup = New-Object -TypeName Microsoft.SqlServer.Management.Smo.Backup + $backup.Action = [Microsoft.SqlServer.Management.SMO.BackupActionType]::Database + $backup.BackupSetDescription = "Final Full Backup of $dbname Prior to Dropping" + $backup.Database = $dbname + $backup.Checksum = $True + if ($sourceserver.versionMajor -gt 9) { + $backup.CompressionOption = $BackupCompression + } + if ($force -and $dbccgood -eq $false) { + + $filename = "$backupFolder\$($dbname)_DBCCERROR_$timenow.bak" + } else { + $filename = "$backupFolder\$($dbname)_Final_Before_Drop_$timenow.bak" + } + + $devicetype = [Microsoft.SqlServer.Management.Smo.DeviceType]::File + $backupDevice = New-Object -TypeName Microsoft.SqlServer.Management.Smo.BackupDeviceItem($filename, $devicetype) + + $backup.Devices.Add($backupDevice) + #Progress + $percent = [Microsoft.SqlServer.Management.Smo.PercentCompleteEventHandler] { + Write-Progress -id 1 -activity "Backing up database $dbname on $source to $filename" -percentcomplete $_.Percent -status ([System.String]::Format("Progress: {0} %", $_.Percent)) + } + $backup.add_PercentComplete($percent) + $backup.add_Complete($complete) + Write-Progress -id 1 -activity "Backing up database $dbname on $source to $filename" -percentcomplete 0 -status ([System.String]::Format("Progress: {0} %", 0)) + $backup.SqlBackup($sourceserver) + $null = $backup.Devices.Remove($backupDevice) + Write-Progress -id 1 -activity "Backing up database $dbname on $source to $filename" -status "Complete" -Completed + Write-Message -Level Verbose -Message "Backup Completed for $dbname on $source." + + Write-Message -Level Verbose -Message "Running Restore Verify only on Backup of $dbname on $source." + try { + $restoreverify = New-Object 'Microsoft.SqlServer.Management.Smo.Restore' + $restoreverify.Database = $dbname + $restoreverify.Devices.AddDevice($filename, $devicetype) + $result = $restoreverify.SqlVerify($sourceserver) + + if ($result -eq $false) { + Write-Message -Level Warning -Message "FAILED : Restore Verify Only failed for $filename on $server - aborting routine for this database." + continue + } + + Write-Message -Level Verbose -Message "Restore Verify Only for $filename succeeded." + } catch { + Stop-Function -Message "FAILED : Restore Verify Only failed for $filename on $server - aborting routine for this database. Exception: $_" -Target $filename -ErrorRecord $_ -Continue + } + } catch { + Stop-Function -Message "FAILED : Restore Verify Only failed for $filename on $server - aborting routine for this database. Exception: $_" -Target $filename -ErrorRecord $_ -Continue + } + } + + if ($Pscmdlet.ShouldProcess($destination, "Creating Automated Restore Job from Golden Backup for $dbname on $destination")) { + Write-Message -Level Verbose -Message "Creating Automated Restore Job from Golden Backup for $dbname on $destination." + try { + if ($force -eq $true -and $dbccgood -eq $false) { + $jobName = $jobname -replace "Rationalised", "DBCC ERROR" + } + + ## Create an agent job to restore the database + $job = New-Object Microsoft.SqlServer.Management.Smo.Agent.Job $jobServer, $jobname + $job.Name = $jobname + $job.OwnerLoginName = $jobowner + $job.Description = "This job will restore the $dbname database using the final backup located at $filename." + + ## Create a Job Category + if (!$jobServer.JobCategories[$categoryname]) { + New-SqlAgentJobCategory -JobServer $jobServer -categoryname $categoryname + } + + $job.Category = $categoryname + try { + if ($Pscmdlet.ShouldProcess($destination, "Creating Agent Job on $destination")) { + Write-Message -Level Verbose -Message "Created Agent Job $jobname on $destination." + $job.Create() + } + } catch { + Stop-Function -Message "FAILED : To Create Agent Job $jobname on $destination - aborting routine for this database." -Target $categoryname -ErrorRecord $_ -Continue + } + + ## Create Job Step + ## Aaron's Suggestion: In the restore script, add a comment block that tells the last known size of each file in the database. + ## Suggestion check for disk space before restore + ## Create Restore Script + try { + $restore = New-Object Microsoft.SqlServer.Management.Smo.Restore + $device = New-Object -TypeName Microsoft.SqlServer.Management.Smo.BackupDeviceItem $filename, 'FILE' + $restore.Devices.Add($device) + try { + $filelist = $restore.ReadFileList($destserver) + } + + catch { + throw 'File list could not be determined. This is likely due to connectivity issues or tiemouts with the Sql Server, the database version is incorrect, or the Sql Server service account does not have access to the file share. Script terminating.' + } + + $filestructure = Get-OfflineSqlFileStructure $destserver $dbname $filelist $ReuseSourceFolderStructure + + $jobStepCommand = Restore-Database $destserver $dbname $filename "Database" $filestructure -TSql -ErrorAction Stop + $jobStep = new-object Microsoft.SqlServer.Management.Smo.Agent.JobStep $job, $jobStepName + $jobStep.SubSystem = 'TransactSql' # 'PowerShell' + $jobStep.DatabaseName = 'master' + $jobStep.Command = $jobStepCommand + $jobStep.OnSuccessAction = 'QuitWithSuccess' + $jobStep.OnFailAction = 'QuitWithFailure' + if ($Pscmdlet.ShouldProcess($destination, "Creating Agent JobStep on $destination")) { + $null = $jobStep.Create() + } + $jobStartStepid = $jobStep.ID + Write-Message -Level Verbose -Message "Created Agent JobStep $jobStepName on $destination." + } catch { + Stop-Function -Message "FAILED : To Create Agent JobStep $jobStepName on $destination - Aborting." -Target $jobStepName -ErrorRecord $_ -Continue + } + if ($Pscmdlet.ShouldProcess($destination, "Applying Agent Job $jobname to $destination")) { + $job.ApplyToTargetServer($destination) + $job.StartStepID = $jobStartStepid + $job.Alter() + } + } catch { + Stop-Function -Message "FAILED : To Create Agent Job $jobname on $destination - aborting routine for $dbname. Exception: $_" -Target $jobname -ErrorRecord $_ -Continue + } + } + + if ($Pscmdlet.ShouldProcess($destination, "Dropping Database $dbname on $sourceserver")) { + ## Drop the database + try { + $null = Remove-DbaDatabase -SqlInstance $sourceserver -Database $dbname -Confirm:$false + Write-Message -Level Verbose -Message "Dropped $dbname Database on $source prior to running the Agent Job" + } catch { + Stop-Function -Message "FAILED : To Drop database $dbname on $server - aborting routine for $dbname. Exception: $_" -Continue + } + } + + if ($Pscmdlet.ShouldProcess($destination, "Running Agent Job on $destination to restore $dbname")) { + ## Run the restore job to restore it + Write-Message -Level Verbose -Message "Starting $jobname on $destination." + try { + $job = $destserver.JobServer.Jobs[$jobname] + $job.Start() + $job.Refresh() + $status = $job.CurrentRunStatus + + while ($status -ne 'Idle') { + Write-Message -Level Verbose -Message "Restore Job for $dbname on $destination is $status." + Start-Sleep -Seconds 15 + $job.Refresh() + $status = $job.CurrentRunStatus + } + + Write-Message -Level Verbose -Message "Restore Job $jobname has completed on $destination." + Write-Message -Level Verbose -Message "Sleeping for a few seconds to ensure the next step (DBCC) succeeds." + Start-Sleep -Seconds 10 ## This is required to ensure the next DBCC Check succeeds + } catch { + Stop-Function -Message "FAILED : Restore Job $jobname failed on $destination - aborting routine for $dbname. Exception: $_" -Continue + } + + if ($job.LastRunOutcome -ne 'Succeeded') { + # LOL, love the plug. + Write-Message -Level Warning -Message "FAILED : Restore Job $jobname failed on $destination - aborting routine for $dbname." + Write-Message -Level Warning -Message "Check the Agent Job History on $destination - if you have SSMS2016 July release or later." + Write-Message -Level Warning -Message "Get-SqlAgentJobHistory -JobName '$jobname' -ServerInstance $destination -OutcomesType Failed." + continue + } + } + + $refreshRetries = 1 + + while ($null -eq ($destserver.databases[$dbname]) -and $refreshRetries -lt 6) { + Write-Message -Level verbose -Message "Database $dbname not found! Refreshing collection." + + #refresh database list, otherwise the next step (DBCC) can fail + $destserver.Databases.Refresh() + + Start-Sleep -Seconds 1 + + $refreshRetries += 1 + } + + + ## Run a Dbcc No choice here + if ($Pscmdlet.ShouldProcess($dbname, "Running Dbcc CHECKDB on $dbname on $destination")) { + Write-Message -Level Verbose -Message "Starting Dbcc CHECKDB for $dbname on $destination." + $null = Start-DbccCheck -Server $destserver -DbName $dbname + } + + if ($Pscmdlet.ShouldProcess($dbname, "Dropping Database $dbname on $destination")) { + ## Drop the database + try { + $null = Remove-DbaDatabase -SqlInstance $sourceserver -Database $dbname -Confirm:$false + Write-Message -Level Verbose -Message "Dropped $dbname database on $destination." + } catch { + Stop-Function -Message "FAILED : To Drop database $dbname on $destination - Aborting. Exception: $_" -Target $dbname -ErrorRecord $_ -Continue + } + } + Write-Message -Level Verbose -Message "Rationalisation Finished for $dbname." + + [PSCustomObject]@{ + SqlInstance = $source + DatabaseName = $dbname + JobName = $jobname + TestingInstance = $destination + BackupFolder = $backupFolder + } + } + } + + end { + if (Test-FunctionInterrupt) { + return + } + if ($Pscmdlet.ShouldProcess("console", "Showing final message")) { + $End = Get-Date + Write-Message -Level Verbose -Message "Finished at $End." + $Duration = $End - $start + Write-Message -Level Verbose -Message "Script Duration: $Duration." + } + + Test-DbaDeprecation -DeprecatedOn "1.0.0" -EnableException:$false -Alias Remove-SqlDatabaseSafely + } +} +function Remove-DbaDbBackupRestoreHistory { + <# + .SYNOPSIS + Reduces the size of the backup and restore history tables by deleting old entries for backup sets. + + .DESCRIPTION + Reduces the size of the backup and restore history tables by deleting the entries for backup sets. + + Can be used at server level, in this case a retention period -KeepDays can be set (default is 30 days). + Can also be used at database level, in this case the complete history for the database(s) is deleted. + + The backup and restore history tables reside in the msdb database. + + To periodically remove old data from backup and restore history tables it is recommended to schedule the agent job sp_delete_backuphistory from the + SQL Server Maintenance Solution created by Ola Hallengren (https://ola.hallengren.com). + + .PARAMETER SqlInstance + The target SQL Server instance or instances. You must have sysadmin access and server version must be SQL Server version 2000 or higher. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER KeepDays + The number of days of history to keep. Defaults to 30 days. + + .PARAMETER Database + The database(s) to process. If unspecified, all databases will be processed. + + .PARAMETER InputObject + Enables piped input from Get-DbaDatabase + + .PARAMETER WhatIf + Shows what would happen if the command were to run. No actions are actually performed. + + .PARAMETER Confirm + Prompts you for confirmation before executing any changing operations within the command. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Delete + Author: IJeb Reitsma + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Remove-DbaDbBackupRestoreHistory + + .EXAMPLE + PS C:\> Remove-DbaDbBackupRestoreHistory -SqlInstance sql2016 + + Prompts for confirmation then deletes backup and restore history on SQL Server sql2016 older than 30 days (default period) + + PS C:\> Remove-DbaDbBackupRestoreHistory -SqlInstance sql2016 -KeepDays 100 -Confirm:$false + + Remove backup and restore history on SQL Server sql2016 older than 100 days. Does not prompt for confirmation. + + PS C:\> Remove-DbaDbBackupRestoreHistory -SqlInstance sql2016 -Database db1 + + Prompts for confirmation then deletes all backup and restore history for database db1 on SQL Server sql2016 + + PS C:\> Get-DbaDatabase -SqlInstance sql2016 | Remove-DbaDbBackupRestoreHistory -WhatIf + + Remove complete backup and restore history for all databases on SQL Server sql2016 + #> + [CmdletBinding(SupportsShouldProcess, ConfirmImpact = 'High')] + param ( + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [int]$KeepDays, + [string[]]$Database, + [Parameter(ValueFromPipeline)] + [Microsoft.SqlServer.Management.Smo.Database[]]$InputObject, + [switch]$EnableException + ) + + begin { + if (-not $KeepDays -and -not $Database) { + $KeepDays = 30 + } + $odt = (Get-Date).AddDays(-$KeepDays) + } + + process { + if ($KeepDays -and $Database) { + Stop-Function -Message "KeepDays cannot be used with Database. When Database is specified, all backup/restore history for that database is deleted." + return + } + foreach ($instance in $SqlInstance) { + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $sqlcredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + if (-not $Database) { + try { + if ($Pscmdlet.ShouldProcess($server, "Remove backup/restore history before $($odt) for all databases")) { + # While this method is named DeleteBackupHistory, it also removes restore history + $server.DeleteBackupHistory($odt) + $server.Refresh() + } + } catch { + Stop-Function -Message "Could not remove backup/restore history on $server" -Continue + } + } else { + $InputObject += $server.Databases | Where-Object { $_.Name -in $Database } + } + } + + foreach ($db in $InputObject) { + try { + $servername = $db.Parent.Name + if ($Pscmdlet.ShouldProcess("$db on $servername", "Remove complete backup/restore history")) { + # While this method is named DeleteBackupHistory, it also removes restore history + $db.DropBackupHistory() + $db.Refresh() + } + } catch { + Stop-Function -Message "Could not remove backup/restore history for database $db on $servername" -Continue + } + } + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function Remove-DbaDbCertificate { + <# + .SYNOPSIS + Deletes specified database certificate + + .DESCRIPTION + Deletes specified database certificate + + .PARAMETER SqlInstance + The SQL Server to create the certificates on. + + .PARAMETER SqlCredential + Allows you to login to SQL Server using alternative credentials. + + .PARAMETER Database + The database where the certificate will be removed. + + .PARAMETER Certificate + The certificate that will be removed + + .PARAMETER WhatIf + Shows what would happen if the command were to run. No actions are actually performed. + + .PARAMETER Confirm + Prompts you for confirmation before executing any changing operations within the command. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .PARAMETER InputObject + Piped certificate objects + + .NOTES + Tags: Certificate + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .EXAMPLE + PS C:\> Remove-DbaDbCertificate -SqlInstance Server1 + + The certificate in the master database on server1 will be removed if it exists. + + .EXAMPLE + PS C:\> Remove-DbaDbCertificate -SqlInstance Server1 -Database db1 -Confirm:$false + + Suppresses all prompts to remove the certificate in the 'db1' database and drops the key. + + #> + [CmdletBinding(DefaultParameterSetName = "Default", SupportsShouldProcess, ConfirmImpact = "High")] + param ( + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [string[]]$Database, + [string[]]$Certificate, + [parameter(ValueFromPipeline)] + [Microsoft.SqlServer.Management.Smo.Certificate[]]$InputObject, + [switch]$EnableException + ) + begin { + Test-DbaDeprecation -DeprecatedOn "1.0.0" -Alias Remove-DbaDatabaseCertificate + } + process { + if ($SqlInstance) { + $InputObject += Get-DbaDbCertificate -SqlInstance $SqlInstance -SqlCredential $SqlCredential -Certificate $Certificate -Database $Database + } + foreach ($cert in $InputObject) { + $db = $cert.Parent + $server = $db.Parent + + if ($Pscmdlet.ShouldProcess($server.Name, "Dropping the certificate named $cert for database $db")) { + try { + # erroractionprefs are not invoked for .net methods suddenly (??), so use Invoke-DbaQuery + # Avoids modifying the collection + Invoke-DbaQuery -SqlInstance $server -Database $db.Name -Query "DROP CERTIFICATE $cert" -EnableException + Write-Message -Level Verbose -Message "Successfully removed certificate named $cert from the $db database on $server" + [pscustomobject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + Database = $db.Name + Certificate = $cert.Name + Status = "Success" + } + } catch { + Stop-Function -Message "Failed to drop certificate named $($cert.Name) from $($db.Name) on $($server.Name)." -Target $smocert -ErrorRecord $_ -Continue + } + } + } + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function Remove-DbaDbMasterKey { + <# + .SYNOPSIS + Deletes specified database master key + + .DESCRIPTION + Deletes specified database master key + + .PARAMETER SqlInstance + The target SQL Server instance or instances. + + .PARAMETER SqlCredential + Allows you to login to SQL Server using alternative credentials + + .PARAMETER Database + The database where the master key will be removed. + + .PARAMETER ExcludeDatabase + List of databases to exclude from clearing all master keys + + .PARAMETER All + Purge the master keys from all databases on an instance + + .PARAMETER InputObject + Enables pipeline input from Get-DbaDatabase + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .PARAMETER WhatIf + Shows what would happen if the command were to run. No actions are actually performed. + + .PARAMETER Confirm + Prompts you for confirmation before executing any changing operations within the command. + + .NOTES + Tags: Certificate, Masterkey + Author: Chrissy LeMaire (@cl), netnerds.net + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Remove-DbaMasterKey + + .EXAMPLE + PS C:\> Remove-DbaDbMasterKey -SqlInstance sql2017, sql2016 -Database pubs + + The master key in the pubs database on sql2017 and sql2016 will be removed if it exists. + + .EXAMPLE + PS C:\> Remove-DbaDbMasterKey -SqlInstance sql2017 -Database db1 -Confirm:$false + + Suppresses all prompts to remove the master key in the 'db1' database and drops the key. + + .EXAMPLE + PS C:\> Get-DbaDbMasterKey -SqlInstance sql2017 -Database db1 | Remove-DbaDbMasterKey -Confirm:$false + + Suppresses all prompts to remove the master key in the 'db1' database and drops the key. + + #> + [CmdletBinding(DefaultParameterSetName = "Default", SupportsShouldProcess, ConfirmImpact = "High")] + param ( + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [System.Management.Automation.PSCredential]$SqlCredential, + [string[]]$Database, + [string[]]$ExcludeDatabase, + [switch]$All, + [parameter(ValueFromPipeline)] + [Microsoft.SqlServer.Management.Smo.MasterKey[]]$InputObject, + [switch]$EnableException + ) + + process { + if ($SqlInstance) { + if (-not $Database -and -not $ExcludeDatabase -and -not $All) { + Stop-Function -Message "You must specify Database, ExcludeDatabase or All when using SqlInstance" + return + } + # all does not need to be addressed in the code because it gets all the dbs if $databases is empty + $databases = Get-DbaDatabase -SqlInstance $SqlInstance -SqlCredential $SqlCredential -Database $Database -ExcludeDatabase $ExcludeDatabase + if ($databases) { + foreach ($key in $databases.MasterKey) { + $InputObject += $key + } + } + } + + foreach ($masterkey in $InputObject) { + $server = $masterkey.Parent.Parent + $db = $masterkey.Parent + if ($Pscmdlet.ShouldProcess($server.Name, "Removing master key on $($db.Name)")) { + # avoid enumeration issues + try { + $masterkey.Parent.Query("DROP MASTER KEY") + [pscustomobject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + Database = $db.Name + Status = "Master key removed" + } + } catch { + Stop-Function -Message "Failure" -ErrorRecord $_ -Continue + } + } + } + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function Remove-DbaDbMirror { + <# + .SYNOPSIS + Removes database mirrors. + + .DESCRIPTION + Removes database mirrors. Does not set databases in recovery to recovered. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. This can be a collection and receive pipeline input to allow the function + to be executed against multiple SQL Server instances. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Database + The target database. + + .PARAMETER Partner + The partner fqdn. + + .PARAMETER Witness + The witness fqdn. + + .PARAMETER InputObject + Allows piping from Get-DbaDatabase. + + .PARAMETER WhatIf + Shows what would happen if the command were to run. No actions are actually performed. + + .PARAMETER Confirm + Prompts you for confirmation before executing any changing operations within the command. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Mirror, HA + Author: Chrissy LeMaire (@cl), netnerds.net + dbatools PowerShell module (https://dbatools.io, clemaire@gmail.com) + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Set-DbaDbMirror + + .EXAMPLE + PS C:\> Set-DbaDbMirror -SqlInstance localhost + + Returns all Endpoint(s) on the local default SQL Server instance + + .EXAMPLE + PS C:\> Set-DbaDbMirror -SqlInstance localhost, sql2016 + + Returns all Endpoint(s) for the local and sql2016 SQL Server instances + + #> + [CmdletBinding(SupportsShouldProcess, ConfirmImpact = 'High')] + param ( + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [string[]]$Database, + [parameter(ValueFromPipeline)] + [Microsoft.SqlServer.Management.Smo.Database[]]$InputObject, + [switch]$EnableException + ) + process { + if ((Test-Bound -ParameterName SqlInstance) -and (Test-Bound -Not -ParameterName Database)) { + Stop-Function -Message "Database is required when SqlInstance is specified" + return + } + foreach ($instance in $SqlInstance) { + $InputObject += Get-DbaDatabase -SqlInstance $instance -SqlCredential $SqlCredential -Database $Database + } + + foreach ($db in $InputObject) { + if ($Pscmdlet.ShouldProcess($db.Parent.Name, "Turning off mirror for $db")) { + # use t-sql cuz $db.Alter() doesnt always work against restoring dbs + try { + try { + $db.ChangeMirroringState([Microsoft.SqlServer.Management.Smo.MirroringOption]::Off) + $db.Alter() + } catch { + try { + $db.Parent.Query("ALTER DATABASE $db SET PARTNER OFF") + } catch { + Stop-Function -Message "Failure on $($db.Parent) for $db" -ErrorRecord $_ -Continue + } + } + [pscustomobject]@{ + ComputerName = $db.ComputerName + InstanceName = $db.InstanceName + SqlInstance = $db.SqlInstance + Database = $db.Name + Status = "Removed" + } + } catch { + Stop-Function -Message "Failure on $($db.Parent.Name)" -ErrorRecord $_ + } + } + } + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function Remove-DbaDbMirrorMonitor { + <# + .SYNOPSIS + Stops and deletes the mirroring monitor job for all the databases on the server instance. + + .DESCRIPTION + Stops and deletes the mirroring monitor job for all the databases on the server instance. + + Basically executes sp_dbmmonitordropmonitoring. + + .PARAMETER SqlInstance + The target SQL Server instance + + .PARAMETER SqlCredential + Login to the target instance using alternate Windows or SQL Login Authentication. Accepts credential objects (Get-Credential). + + .PARAMETER WhatIf + Shows what would happen if the command were to run. No actions are actually performed. + + .PARAMETER Confirm + Prompts you for confirmation before executing any changing operations within the command. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Mirror, HA, Monitor + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Remove-DbaDbMirrorMonitor + + .EXAMPLE + PS C:\> Remove-DbaDbMirrorMonitor -SqlInstance sql2008, sql2012 + + Stops and deletes the mirroring monitor job for all the databases on sql2008 and sql2012. + + #> + [CmdletBinding(SupportsShouldProcess, ConfirmImpact = 'Low')] + param ( + [parameter(Mandatory, ValueFromPipeline)] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [switch]$EnableException + ) + process { + foreach ($instance in $SqlInstance) { + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential -MinimumVersion 9 + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + if ($Pscmdlet.ShouldProcess($instance, "Removing mirror monitoring")) { + try { + $server.Query("msdb.dbo.sp_dbmmonitordropmonitoring") + [pscustomobject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + MonitorStatus = "Removed" + } + } catch { + Stop-Function -Message "Failure" -ErrorRecord $_ -Continue + } + } + } + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function Remove-DbaDbOrphanUser { + <# + .SYNOPSIS + Drop orphan users with no existing login to map + + .DESCRIPTION + An orphan user is defined by a user that does not have their matching login. (Login property = ""). + + If user is the owner of the schema with the same name and if if the schema does not have any underlying objects the schema will be dropped. + + If user owns more than one schema, the owner of the schemas that does not have the same name as the user, will be changed to 'dbo'. If schemas have underlying objects, you must specify the -Force parameter so the user can be dropped. + + If exists a login to map the drop will not be performed unless you specify the -Force parameter (only when calling from Repair-DbaDbOrphanUser. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Database + Specifies the database(s) to process. Options for this list are auto-populated from the server. If unspecified, all databases will be processed. + + .PARAMETER ExcludeDatabase + Specifies the database(s) to exclude from processing. Options for this list are auto-populated from the server + + .PARAMETER User + Specifies the list of users to remove. + + .PARAMETER Force + If this switch is enabled: + If exists any schema which owner is the User, this will force the change of the owner to 'dbo'. + If exists a login to map the drop will not be performed unless you specify this parameter. + + .PARAMETER WhatIf + If this switch is enabled, no actions are performed but informational messages will be displayed that explain what would happen if the command were to run. + + .PARAMETER Confirm + If this switch is enabled, you will be prompted for confirmation before executing any operations that change state. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Orphan, Database, Security, Login + Author: Claudio Silva (@ClaudioESSilva) | Simone Bizzotto (@niphlod) + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Remove-DbaDbOrphanUser + + .EXAMPLE + PS C:\> Remove-DbaDbOrphanUser -SqlInstance sql2005 + + Finds and drops all orphan users without matching Logins in all databases present on server 'sql2005'. + + .EXAMPLE + PS C:\> Remove-DbaDbOrphanUser -SqlInstance sqlserver2014a -SqlCredential $cred + + Finds and drops all orphan users without matching Logins in all databases present on server 'sqlserver2014a'. SQL Server authentication will be used in connecting to the server. + + .EXAMPLE + PS C:\> Remove-DbaDbOrphanUser -SqlInstance sqlserver2014a -Database db1, db2 -Force + + Finds and drops orphan users even if they have a matching Login on both db1 and db2 databases. + + .EXAMPLE + PS C:\> Remove-DbaDbOrphanUser -SqlInstance sqlserver2014a -ExcludeDatabase db1, db2 -Force + + Finds and drops orphan users even if they have a matching Login from all databases except db1 and db2. + + .EXAMPLE + PS C:\> Remove-DbaDbOrphanUser -SqlInstance sqlserver2014a -User OrphanUser + + Removes user OrphanUser from all databases only if there is no matching login. + + .EXAMPLE + PS C:\> Remove-DbaDbOrphanUser -SqlInstance sqlserver2014a -User OrphanUser -Force + + Removes user OrphanUser from all databases even if they have a matching Login. Any schema that the user owns will change ownership to dbo. + + #> + [CmdletBinding(SupportsShouldProcess)] + param ( + [parameter(Mandatory, ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [Alias("Credential")] + [PSCredential] + $SqlCredential, + [Alias("Databases")] + [object[]]$Database, + [object[]]$ExcludeDatabase, + [parameter(ValueFromPipeline)] + [object[]]$User, + [switch]$Force, + [Alias('Silent')] + [switch]$EnableException + ) + process { + foreach ($Instance in $SqlInstance) { + try { + $server = Connect-SqlInstance -SqlInstance $Instance -SqlCredential $SqlCredential + } catch { + Write-Message -Level Warning -Message "Can't connect to $Instance or access denied. Skipping." + continue + } + + $DatabaseCollection = $server.Databases | Where-Object IsAccessible + + if ($Database) { + $DatabaseCollection = $DatabaseCollection | Where-Object Name -In $Database + } + if ($ExcludeDatabase) { + $DatabaseCollection = $DatabaseCollection | Where-Object Name -NotIn $ExcludeDatabase + } + + $CallStack = Get-PSCallStack | Select-Object -Property * + if ($CallStack.Count -eq 1) { + $StackSource = $CallStack[0].Command + } else { + #-2 because index base is 0 and we want the one before the last (the last is the actual command) + $StackSource = $CallStack[($CallStack.Count - 2)].Command + } + + if ($DatabaseCollection) { + foreach ($db in $DatabaseCollection) { + try { + #if SQL 2012 or higher only validate databases with ContainmentType = NONE + if ($server.versionMajor -gt 10) { + if ($db.ContainmentType -ne [Microsoft.SqlServer.Management.Smo.ContainmentType]::None) { + Write-Message -Level Warning -Message "Database '$db' is a contained database. Contained databases can't have orphaned users. Skipping validation." + Continue + } + } + + if ($StackSource -eq "Repair-DbaDbOrphanUser") { + Write-Message -Level Verbose -Message "Call origin: Repair-DbaDbOrphanUser." + #Will use collection from parameter ($User) + } else { + Write-Message -Level Verbose -Message "Validating users on database $db." + + if ($User.Count -eq 0) { + #the third validation will remove from list sql users without login or mapped to certificate. The rule here is Sid with length higher than 16 + $User = $db.Users | Where-Object { $_.Login -eq "" -and ($_.ID -gt 4) -and (($_.Sid.Length -gt 16 -and $_.LoginType -in @([Microsoft.SqlServer.Management.Smo.LoginType]::SqlLogin, [Microsoft.SqlServer.Management.Smo.LoginType]::Certificate)) -eq $false) } + } else { + #the fourth validation will remove from list sql users without login or mapped to certificate. The rule here is Sid with length higher than 16 + $User = $db.Users | Where-Object { $_.Login -eq "" -and ($_.ID -gt 4) -and ($User -contains $_.Name) -and (($_.Sid.Length -gt 16 -and $_.LoginType -in @([Microsoft.SqlServer.Management.Smo.LoginType]::SqlLogin, [Microsoft.SqlServer.Management.Smo.LoginType]::Certificate)) -eq $false) } + } + } + + if ($User.Count -gt 0) { + Write-Message -Level Verbose -Message "Orphan users found." + foreach ($dbuser in $User) { + $SkipUser = $false + + $ExistLogin = $null + + if ($StackSource -ne "Repair-DbaDbOrphanUser") { + #Need to validate Existing Login because the call does not came from Repair-DbaDbOrphanUser + $ExistLogin = $server.logins | Where-Object { + $_.Isdisabled -eq $False -and + $_.IsSystemObject -eq $False -and + $_.IsLocked -eq $False -and + $_.Name -eq $dbuser.Name + } + } + + #Schemas only appears on SQL Server 2005 (v9.0) + if ($server.versionMajor -gt 8) { + + #reset variables + $AlterSchemaOwner = "" + $DropSchema = "" + + #Validate if user owns any schema + $Schemas = @() + $Schemas = $db.Schemas | Where-Object Owner -eq $dbuser.Name + + if (@($Schemas).Count -gt 0) { + Write-Message -Level Verbose -Message "User $dbuser owns one or more schemas." + + foreach ($sch in $Schemas) { + <# + On sql server 2008 or lower the EnumObjects method does not accept empty parameter. + 0x1FFFFFFF is the way we can say we want everything known by those versions + + When it is a higher version we can use empty to get all + #> + if ($server.versionMajor -lt 11) { + $NumberObjects = ($db.EnumObjects(0x1FFFFFFF) | Where-Object { $_.Schema -eq $sch.Name } | Measure-Object).Count + } else { + $NumberObjects = ($db.EnumObjects() | Where-Object { $_.Schema -eq $sch.Name } | Measure-Object).Count + } + + if ($NumberObjects -gt 0) { + if ($Force) { + Write-Message -Level Verbose -Message "Parameter -Force was used! The schema '$($sch.Name)' have $NumberObjects underlying objects. We will change schema owner to 'dbo' and drop the user." + + if ($Pscmdlet.ShouldProcess($db.Name, "Changing schema '$($sch.Name)' owner to 'dbo'. -Force used.")) { + $AlterSchemaOwner += "ALTER AUTHORIZATION ON SCHEMA::[$($sch.Name)] TO [dbo]`r`n" + + [pscustomobject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + DatabaseName = $db.Name + SchemaName = $sch.Name + Action = "ALTER OWNER" + SchemaOwnerBefore = $sch.Owner + SchemaOwnerAfter = "dbo" + } + } + } else { + Write-Message -Level Warning -Message "Schema '$($sch.Name)' owned by user $($dbuser.Name) have $NumberObjects underlying objects. If you want to change the schemas' owner to 'dbo' and drop the user anyway, use -Force parameter. Skipping user '$dbuser'." + $SkipUser = $true + break + } + } else { + if ($sch.Name -eq $dbuser.Name) { + Write-Message -Level Verbose -Message "The schema '$($sch.Name)' have the same name as user $dbuser. Schema will be dropped." + + if ($Pscmdlet.ShouldProcess($db.Name, "Dropping schema '$($sch.Name)'.")) { + $DropSchema += "DROP SCHEMA [$($sch.Name)]" + + [pscustomobject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + DatabaseName = $db.Name + SchemaName = $sch.Name + Action = "DROP" + SchemaOwnerBefore = $sch.Owner + SchemaOwnerAfter = "N/A" + } + } + } else { + Write-Message -Level Warning -Message "Schema '$($sch.Name)' does not have any underlying object. Ownership will be changed to 'dbo' so the user can be dropped. Remember to re-check permissions on this schema!" + + if ($Pscmdlet.ShouldProcess($db.Name, "Changing schema '$($sch.Name)' owner to 'dbo'.")) { + $AlterSchemaOwner += "ALTER AUTHORIZATION ON SCHEMA::[$($sch.Name)] TO [dbo]`r`n" + + [pscustomobject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + DatabaseName = $db.Name + SchemaName = $sch.Name + Action = "ALTER OWNER" + SchemaOwnerBefore = $sch.Owner + SchemaOwnerAfter = "dbo" + } + } + } + } + } + + } else { + Write-Message -Level Verbose -Message "User $dbuser does not own any schema. Will be dropped." + } + + $query = "$AlterSchemaOwner `r`n$DropSchema `r`nDROP USER " + $dbuser + + Write-Message -Level Debug -Message $query + } else { + $query = "EXEC master.dbo.sp_droplogin @loginame = N'$($dbuser.name)'" + } + + if ($ExistLogin) { + if (-not $SkipUser) { + if ($Force) { + if ($Pscmdlet.ShouldProcess($db.Name, "Dropping user $dbuser using -Force")) { + $server.Databases[$db.Name].ExecuteNonQuery($query) | Out-Null + Write-Message -Level Verbose -Message "User $dbuser was dropped from $($db.Name). -Force parameter was used!" + } + } else { + Write-Message -Level Warning -Message "Orphan user $($dbuser.Name) has a matching login. The user will not be dropped. If you want to drop anyway, use -Force parameter." + Continue + } + } + } else { + if (-not $SkipUser) { + if ($Pscmdlet.ShouldProcess($db.Name, "Dropping user $dbuser")) { + $server.Databases[$db.Name].ExecuteNonQuery($query) | Out-Null + Write-Message -Level Verbose -Message "User $dbuser was dropped from $($db.Name)." + } + } + } + } + } else { + Write-Message -Level Verbose -Message "No orphan users found on database $db." + } + #reset collection + $User = $null + } catch { + Stop-Function -Message "Failure" -ErrorRecord $_ -Target $db -Continue + } + } + } else { + Write-Message -Level Verbose -Message "There are no databases to analyse." + } + } + } + end { + Test-DbaDeprecation -DeprecatedOn 1.0.0 -Alias Remove-SqlOrphanUser + Test-DbaDeprecation -DeprecatedOn 1.0.0 -Alias Remove-DbaOrphanUser + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function Remove-DbaDbSnapshot { + <# + .SYNOPSIS + Removes database snapshots + + .DESCRIPTION + Removes (drops) database snapshots from the server + + .PARAMETER SqlInstance + The target SQL Server instance or instances + + .PARAMETER SqlCredential + Credential object used to connect to the SQL Server as a different user + + .PARAMETER Database + Removes snapshots for only this specific base db + + .PARAMETER ExcludeDatabase + Removes snapshots excluding this specific base dbs + + .PARAMETER Snapshot + Restores databases from snapshot with this name only + + .PARAMETER AllSnapshots + Specifies that you want to remove all snapshots from the server + + .PARAMETER Force + Will forcibly kill all running queries that prevent the drop process. + + .PARAMETER WhatIf + Shows what would happen if the command were to run + + .PARAMETER Confirm + Prompts for confirmation of every step. + + .PARAMETER InputObject + Enables input from Get-DbaDbSnapshot + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Snapshot, Database + Author: Simone Bizzotto (@niphold) + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Remove-DbaDbSnapshot + + .EXAMPLE + PS C:\> Remove-DbaDbSnapshot -SqlInstance sql2014 -Snapshot HR_snap_20161201, HR_snap_20161101 + + Removes database snapshots named HR_snap_20161201 and HR_snap_20161101 + + .EXAMPLE + PS C:\> Remove-DbaDbSnapshot -SqlInstance sql2014 -Database HR, Accounting + + Removes all database snapshots having HR and Accounting as base dbs + + .EXAMPLE + PS C:\> Get-DbaDbSnapshot -SqlInstance sql2014 -Database HR, Accounting | Remove-DbaDbSnapshot + + Removes all database snapshots having HR and Accounting as base dbs + + .EXAMPLE + PS C:\> Remove-DbaDbSnapshot -SqlInstance sql2014 -Snapshot HR_snapshot, Accounting_snapshot + + Removes HR_snapshot and Accounting_snapshot + + .EXAMPLE + PS C:\> Get-DbaDbSnapshot -SqlInstance sql2016 | Where SnapshotOf -like '*dumpsterfire*' | Remove-DbaDbSnapshot + + Removes all snapshots associated with databases that have dumpsterfire in the name + + .EXAMPLE + PS C:\> Get-DbaDbSnapshot -SqlInstance sql2016 | Out-GridView -Passthru | Remove-DbaDbSnapshot + + Allows the selection of snapshots on sql2016 to remove + + .EXAMPLE + PS C:\> Remove-DbaDbSnapshot -SqlInstance sql2014 -AllSnapshots + + Removes all database snapshots from sql2014 + + .EXAMPLE + PS C:\> Remove-DbaDbSnapshot -SqlInstance sql2014 -AllSnapshots -Confirm + + Removes all database snapshots from sql2014 and prompts for each database + + #> + [CmdletBinding(SupportsShouldProcess)] + param ( + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [Alias("Credential")] + [PSCredential]$SqlCredential, + [Alias("Databases")] + [string[]]$Database, + [string[]]$ExcludeDatabase, + [string[]]$Snapshot, + [parameter(ValueFromPipeline)] + [Microsoft.SqlServer.Management.Smo.Database[]]$InputObject, + [switch]$AllSnapshots, + [switch]$Force, + [Alias('Silent')] + [switch]$EnableException + ) + begin { + $defaultprops = 'ComputerName', 'InstanceName', 'SqlInstance', 'Database as Name', 'Status' + } + process { + if (!$Snapshot -and !$Database -and !$AllSnapshots -and $null -eq $InputObject -and !$ExcludeDatabase) { + Stop-Function -Message "You must pipe in a snapshot or specify -Snapshot, -Database, -ExcludeDatabase or -AllSnapshots" + return + } + + # if piped value either doesn't exist or is not the proper type + foreach ($instance in $SqlInstance) { + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + $InputObject += Get-DbaDbSnapshot -SqlInstance $server -Database $Database -ExcludeDatabase $ExcludeDatabase -Snapshot $Snapshot + } + + foreach ($db in $InputObject) { + $server = $db.Parent + + if (-not $db.DatabaseSnapshotBaseName) { + Stop-Function -Message "$db on $server is not a database snapshot" -Continue + } + + if ($Force) { + $db | Remove-DbaDatabase -Confirm:$false | Select-DefaultView -Property $defaultprops + } else { + try { + if ($Pscmdlet.ShouldProcess("$db on $server", "Drop snapshot")) { + $db.Drop() + $server.Refresh() + + [pscustomobject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + Database = $db.name + Status = "Dropped" + } | Select-DefaultView -Property $defaultprops + } + } catch { + Write-Message -Level Verbose -Message "Could not drop database $db on $server" + + [pscustomobject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + Database = $db.name + Status = (Get-ErrorMessage -Record $_) + } | Select-DefaultView -Property $defaultprops + } + } + } + } + end { + Test-DbaDeprecation -DeprecatedOn "1.0.0" -Alias Remove-DbaDatabaseSnapshot + } +} +function Remove-DbaDbUser { + <# + .SYNOPSIS + Drop database user + + .DESCRIPTION + If user is the owner of a schema with the same name and if if the schema does not have any underlying objects the schema will be + dropped. If user owns more than one schema, the owner of the schemas that does not have the same name as the user, will be + changed to 'dbo'. If schemas have underlying objects, you must specify the -Force parameter so the user can be dropped. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. + + .PARAMETER SqlCredential + Credential object used to connect to the SQL Server as a different user. + + .PARAMETER Database + Specifies the database(s) to process. Options for this list are auto-populated from the server. If unspecified, all databases will be processed. + + .PARAMETER ExcludeDatabase + Specifies the database(s) to exclude from processing. Options for this list are auto-populated from the server. + + .PARAMETER User + Specifies the list of users to remove. + + .PARAMETER InputObject + Support piping from Get-DbaDbUser. + + .PARAMETER Force + If enabled this will force the change of the owner to 'dbo' for any schema which owner is the User. + + .PARAMETER WhatIf + Shows what would happen if the command were to run. No actions are actually performed. + + .PARAMETER Confirm + If this switch is enabled, you will be prompted for confirmation before executing any operations that change state. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Database, User, Login, Security + Author: Doug Meyers (@dgmyrs) + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Remove-DbaDbUser + + .EXAMPLE + PS C:\> Remove-DbaDbUser -SqlInstance sqlserver2014 -User user1 + + Drops user1 from all databases it exists in on server 'sqlserver2014'. + + .EXAMPLE + PS C:\> Remove-DbaDbUser -SqlInstance sqlserver2014 -Database database1 -User user1 + + Drops user1 from the database1 database on server 'sqlserver2014'. + + .EXAMPLE + PS C:\> Remove-DbaDbUser -SqlInstance sqlserver2014 -ExcludeDatabase model -User user1 + + Drops user1 from all databases it exists in on server 'sqlserver2014' except for the model database. + + .EXAMPLE + PS C:\> Get-DbaDbUser sqlserver2014 | Where-Object Name -In "user1" | Remove-DbaDbUser + + Drops user1 from all databases it exists in on server 'sqlserver2014'. + + #> + + [CmdletBinding(DefaultParameterSetName = 'User', SupportsShouldProcess)] + param ( + [parameter(Position = 1, Mandatory, ValueFromPipeline, ParameterSetName = 'User')] + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + + [parameter(ParameterSetName = 'User')] + [Alias("Credential")] + [PSCredential] + $SqlCredential, + + [parameter(ParameterSetName = 'User')] + [Alias("Databases")] + [object[]]$Database, + + [parameter(ParameterSetName = 'User')] + [object[]]$ExcludeDatabase, + + [parameter(Mandatory, ParameterSetName = 'User')] + [object[]]$User, + + [parameter(Mandatory, ValueFromPipeline, ParameterSetName = 'Object')] + [Microsoft.SqlServer.Management.Smo.User[]]$InputObject, + + [parameter(ParameterSetName = 'User')] + [parameter(ParameterSetName = 'Object')] + [switch]$Force, + + [Alias('Silent')] + [switch]$EnableException + ) + + begin { + function Remove-DbUser { + [CmdletBinding(SupportsShouldProcess)] + param ([Microsoft.SqlServer.Management.Smo.User[]]$users) + + foreach ($user in $users) { + $db = $user.Parent + $server = $db.Parent + $ownedObjects = $false + $alterSchemas = @() + $dropSchemas = @() + Write-Message -Level Verbose -Message "Removing User $user from Database $db on target $server" + + if ($Pscmdlet.ShouldProcess($user, "Removing user from Database $db")) { + # Drop Schemas owned by the user before droping the user + $schemaUrns = $user.EnumOwnedObjects() | Where-Object Type -EQ Schema + if ($schemaUrns) { + Write-Message -Level Verbose -Message "User $user owns $($schemaUrns.Count) schema(s)." + + # Need to gather up the schema changes so they can be done in a non-desctructive order + foreach ($schemaUrn in $schemaUrns) { + $schema = $server.GetSmoObject($schemaUrn) + + # Drop any schema that is the same name as the user + if ($schema.Name -EQ $user.Name) { + # Check for owned objects early so we can exit before any changes are made + $ownedUrns = $schema.EnumOwnedObjects() + if (-Not $ownedUrns) { + $dropSchemas += $schema + } else { + Write-Message -Level Warning -Message "User owns objects in the database and will not be removed." + foreach ($ownedUrn in $ownedUrns) { + $obj = $server.GetSmoObject($ownedUrn) + Write-Message -Level Warning -Message "User $user owns $($obj.GetType().Name) $obj" + } + $ownedObjects = $true + } + } + + # Change the owner of any schema not the same name as the user + if ($schema.Name -NE $user.Name) { + # Check for owned objects early so we can exit before any changes are made + $ownedUrns = $schema.EnumOwnedObjects() + if (($ownedUrns -And $Force) -Or (-Not $ownedUrns)) { + $alterSchemas += $schema + } else { + Write-Message -Level Warning -Message "User $user owns the Schema $schema, which owns $($ownedUrns.Count) Object(s). If you want to change the schemas' owner to [dbo] and drop the user anyway, use -Force parameter. User $user will not be removed." + $ownedObjects = $true + } + } + } + } + + if (-Not $ownedObjects) { + try { + # Alter Schemas + foreach ($schema in $alterSchemas) { + Write-Message -Level Verbose -Message "Owner of Schema $schema will be changed to [dbo]." + if ($PSCmdlet.ShouldProcess($server, "Change the owner of Schema $schema to [dbo].")) { + $schema.Owner = "dbo" + $schema.Alter() + } + } + + # Drop Schemas + foreach ($schema in $dropSchemas) { + if ($PSCmdlet.ShouldProcess($server, "Drop Schema $schema from Database $db.")) { + $schema.Drop() + } + } + + # Finally, Drop user + if ($PSCmdlet.ShouldProcess($server, "Drop User $user from Database $db.")) { + $user.Drop() + } + + $status = "Dropped" + + } catch { + Write-Error -Message "Could not drop $user from Database $db on target $server" + $status = "Not Dropped" + } + + [pscustomobject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + Database = $db.name + User = $user + Status = $status + } + } + } + } + } + } + + process { + if ($InputObject) { + Remove-DbUser $InputObject + } else { + foreach ($instance in $SqlInstance) { + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $sqlcredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + $databases = $server.Databases | Where-Object IsAccessible + + if ($Database) { + $databases = $databases | Where-Object Name -In $Database + } + if ($ExcludeDatabase) { + $databases = $databases | Where-Object Name -NotIn $ExcludeDatabase + } + + foreach ($db in $databases) { + Write-Message -Level Verbose -Message "Get users in Database $db on target $server" + $users = Get-DbaDbUser -SqlInstance $server -Database $db.Name + $users = $users | Where-Object Name -In $User + Remove-DbUser $users + } + } + } + } + +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function Remove-DbaEndpoint { + <# + .SYNOPSIS + Removes endpoints from a SQL Server instance. + + .DESCRIPTION + Removes endpoints from a SQL Server instance. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Endpoint + Only remove specific endpoints. + + .PARAMETER AllEndpoints + Remove all endpoints on an instance. + + .PARAMETER InputObject + Enables piping from Get-Endpoint. + + .PARAMETER WhatIf + Shows what would happen if the command were to run. No actions are actually performed. + + .PARAMETER Confirm + Prompts you for confirmation before executing any changing operations within the command. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Endpoint + Author: Chrissy LeMaire (@cl), netnerds.net + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Remove-DbaEndpoint + + .EXAMPLE + PS C:\> Remove-DbaEndpoint -SqlInstance sqlserver2012 -AllEndpoints + + Removes all endpoints on the sqlserver2014 instance. Prompts for confirmation. + + .EXAMPLE + PS C:\> Remove-DbaEndpoint -SqlInstance sqlserver2012 -Endpoint endpoint1,endpoint2 -Confirm:$false + + Removes the endpoint1 and endpoint2 endpoints. Does not prompt for confirmation. + + .EXAMPLE + PS C:\> Get-DbaEndpoint -SqlInstance sqlserver2012 -Endpoint endpoint1 | Remove-DbaEndpoint + + Removes the endpoints returned from the Get-DbaEndpoint function. Prompts for confirmation. + #> + [CmdletBinding(SupportsShouldProcess, ConfirmImpact = 'High')] + param ( + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [string[]]$EndPoint, + [switch]$AllEndpoints, + [parameter(ValueFromPipeline)] + [Microsoft.SqlServer.Management.Smo.Endpoint[]]$InputObject, + [switch]$EnableException + ) + process { + if ((Test-Bound -ParameterName SqlInstance) -and (Test-Bound -Not -ParameterName Endpoint, AllEndpoints)) { + Stop-Function -Message "You must specify AllEndpoints or Endpoint when using the SqlInstance parameter." + return + } + foreach ($instance in $SqlInstance) { + $InputObject += Get-DbaEndpoint -SqlInstance $instance -SqlCredential $SqlCredential -EndPoint $Endpoint + } + + foreach ($ep in $InputObject) { + if ($Pscmdlet.ShouldProcess($ep.Parent.name, "Removing endpoint $ep")) { + try { + # avoid enumeration issues + $ep.Parent.Query("DROP ENDPOINT $ep") + [pscustomobject]@{ + ComputerName = $ep.ComputerName + InstanceName = $ep.InstanceName + SqlInstance = $ep.SqlInstance + Endpoint = $ep.Name + Status = "Removed" + } + } catch { + Stop-Function -Message "Failure" -ErrorRecord $_ -Continue + } + } + } + } +} +function Remove-DbaLogin { + <# + .SYNOPSIS + Drops a Login + + .DESCRIPTION + Tries a bunch of different ways to remove a Login or two or more. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. + + .PARAMETER SqlCredential + Allows you to login to servers using alternative credentials. + + .PARAMETER Login + The Login(s) to process - this list is auto-populated from the server. If unspecified, all Logins will be processed. + + .PARAMETER InputObject + A collection of Logins (such as returned by Get-DbaLogin), to be removed. + + .PARAMETER Force + Kills any sessions associated with the login prior to drop + + .PARAMETER WhatIf + Shows what would happen if the command were to run. No actions are actually performed. + + .PARAMETER Confirm + Prompts you for confirmation before executing any changing operations within the command. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Delete, Login + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Remove-DbaLogin + + .EXAMPLE + PS C:\> Remove-DbaLogin -SqlInstance sql2016 -Login mylogin + + Prompts then removes the Login mylogin on SQL Server sql2016 + + .EXAMPLE + PS C:\> Remove-DbaLogin -SqlInstance sql2016 -Login mylogin, yourlogin + + Prompts then removes the Logins mylogin and yourlogin on SQL Server sql2016 + + .EXAMPLE + PS C:\> Remove-DbaLogin -SqlInstance sql2016 -Login mylogin -Confirm:$false + + Does not prompt and swiftly removes mylogin on SQL Server sql2016 + + .EXAMPLE + PS C:\> Get-DbaLogin -SqlInstance server\instance -Login yourlogin | Remove-DbaLogin + + Removes mylogin on SQL Server server\instance + + #> + [CmdletBinding(SupportsShouldProcess, ConfirmImpact = 'High', DefaultParameterSetName = "Default")] + param ( + [parameter(Mandatory, ParameterSetName = "instance")] + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [Alias("Credential")] + [PSCredential]$SqlCredential, + [parameter(Mandatory, ParameterSetName = "instance")] + [string[]]$Login, + [Parameter(ValueFromPipeline, Mandatory, ParameterSetName = "Logins")] + [Microsoft.SqlServer.Management.Smo.Login[]]$InputObject, + [switch]$Force, + [switch]$EnableException + ) + + process { + + foreach ($instance in $SqlInstance) { + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $sqlcredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + $InputObject += $server.Logins | Where-Object { $_.Name -in $Login } + } + + foreach ($currentlogin in $InputObject) { + try { + $server = $currentlogin.Parent + if ($Pscmdlet.ShouldProcess("$currentlogin on $server", "KillLogin")) { + if ($force) { + $null = Stop-DbaProcess -SqlInstance $server -Login $currentlogin.name + } + + $currentlogin.Drop() + + [pscustomobject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + Login = $currentlogin.name + Status = "Dropped" + } + } + } catch { + [pscustomobject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + Login = $currentlogin.name + Status = $_ + } + Stop-Function -Message "Could not drop Login $currentlogin on $server" -ErrorRecord $_ -Target $currentlogin -Continue + } + } + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# + +function Remove-DbaNetworkCertificate { + <# + .SYNOPSIS + Removes the network certificate for SQL Server instance + + .DESCRIPTION + Removes the network certificate for SQL Server instance. This setting is found in Configuration Manager. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. Defaults to localhost. If target is a cluster, you must also specify InstanceClusterName (see below) + + .PARAMETER Credential + Allows you to login to the computer (not sql instance) using alternative credentials. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .PARAMETER WhatIf + Shows what would happen if the command were to run. No actions are actually performed. + + .PARAMETER Confirm + Prompts you for confirmation before executing any changing operations within the command. + + .NOTES + Tags: Certificate + Author: Chrissy LeMaire (@cl), netnerds.net + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Remove-DbaNetworkCertificate + + .EXAMPLE + PS C:\> Remove-DbaNetworkCertificate + + Removes the Network Certificate for the default instance (MSSQLSERVER) on localhost + + .EXAMPLE + PS C:\> Remove-DbaNetworkCertificate -SqlInstance sql1\SQL2008R2SP2 + + Removes the Network Certificate for the SQL2008R2SP2 instance on sql1 + + .EXAMPLE + PS C:\> Remove-DbaNetworkCertificate -SqlInstance localhost\SQL2008R2SP2 -WhatIf + + Shows what would happen if the command were run + + #> + [CmdletBinding(SupportsShouldProcess, ConfirmImpact = "Low", DefaultParameterSetName = 'Default')] + param ( + [Parameter(ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer", "ComputerName")] + [DbaInstanceParameter[]]$SqlInstance = $env:COMPUTERNAME, + [PSCredential]$Credential, + [switch]$EnableException + ) + process { + # Registry access + + + foreach ($instance in $sqlinstance) { + Write-Message -Level VeryVerbose -Message "Processing $instance" -Target $instance + $null = Test-ElevationRequirement -ComputerName $instance -Continue + + Write-Message -Level Verbose -Message "Resolving hostname" + $resolved = $null + $resolved = Resolve-DbaNetworkName -ComputerName $instance -Turbo + + if ($null -eq $resolved) { + Stop-Function -Message "Can't resolve $instance" -Target $instance -Continue -Category InvalidArgument + } + + try { + $sqlwmi = Invoke-ManagedComputerCommand -ComputerName $resolved.FQDN -ScriptBlock { $wmi.Services } -Credential $Credential -ErrorAction Stop | Where-Object DisplayName -eq "SQL Server ($($instance.InstanceName))" + } catch { + Stop-Function -Message "Failed to access $instance" -Target $instance -Continue -ErrorRecord $_ + } + + $regroot = ($sqlwmi.AdvancedProperties | Where-Object Name -eq REGROOT).Value + $vsname = ($sqlwmi.AdvancedProperties | Where-Object Name -eq VSNAME).Value + $instancename = $sqlwmi.DisplayName.Replace('SQL Server (', '').Replace(')', '') # Don't clown, I don't know regex :( + $serviceaccount = $sqlwmi.ServiceAccount + + if ([System.String]::IsNullOrEmpty($regroot)) { + $regroot = $sqlwmi.AdvancedProperties | Where-Object { $_ -match 'REGROOT' } + $vsname = $sqlwmi.AdvancedProperties | Where-Object { $_ -match 'VSNAME' } + + if (![System.String]::IsNullOrEmpty($regroot)) { + $regroot = ($regroot -Split 'Value\=')[1] + $vsname = ($vsname -Split 'Value\=')[1] + } else { + Stop-Function -Message "Can't find instance $vsname on $instance" -Continue -Category ObjectNotFound -Target $instance + } + } + + if ([System.String]::IsNullOrEmpty($vsname)) { $vsname = $instance } + + Write-Message -Level Output -Message "Regroot: $regroot" -Target $instance + Write-Message -Level Output -Message "ServiceAcct: $serviceaccount" -Target $instance + Write-Message -Level Output -Message "InstanceName: $instancename" -Target $instance + Write-Message -Level Output -Message "VSNAME: $vsname" -Target $instance + + $scriptblock = { + $regroot = $args[0] + $serviceaccount = $args[1] + $instancename = $args[2] + $vsname = $args[3] + + $regpath = "Registry::HKEY_LOCAL_MACHINE\$($regroot)\MSSQLServer\SuperSocketNetLib" + $cert = (Get-ItemProperty -Path $regpath -Name Certificate).Certificate + Set-ItemProperty -Path $regpath -Name Certificate -Value $null + + [pscustomobject]@{ + ComputerName = $env:COMPUTERNAME + InstanceName = $instancename + SqlInstance = $vsname + ServiceAccount = $serviceaccount + RemovedThumbprint = $cert.Thumbprint + } + } + + if ($PScmdlet.ShouldProcess("local", "Connecting to $ComputerName to remove the cert")) { + try { + Invoke-Command2 -ComputerName $resolved.fqdn -Credential $Credential -ArgumentList $regroot, $serviceaccount, $instancename, $vsname -ScriptBlock $scriptblock -ErrorAction Stop + } catch { + Stop-Function -Message "Failed to connect to $($resolved.fqdn) using PowerShell remoting!" -ErrorRecord $_ -Target $instance -Continue + } + } + } + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function Remove-DbaPfDataCollectorCounter { + <# + .SYNOPSIS + Removes a Performance Data Collector Counter. + + .DESCRIPTION + Removes a Performance Data Collector Counter. + + .PARAMETER ComputerName + The target computer. Defaults to localhost. + + .PARAMETER Credential + Allows you to login to the target computer using alternative credentials. To use: + + $cred = Get-Credential, then pass $cred object to the -Credential parameter. + + .PARAMETER CollectorSet + The name of the Collector Set to search. + + .PARAMETER Collector + The name of the Collector to remove. + + .PARAMETER Counter + The name of the Counter - in the form of '\Processor(_Total)\% Processor Time'. + + .PARAMETER InputObject + Accepts the object output by Get-DbaPfDataCollectorSet via the pipeline. + + .PARAMETER WhatIf + If this switch is enabled, no actions are performed but informational messages will be displayed that explain what would happen if the command were to run. + + .PARAMETER Confirm + If this switch is enabled, you will be prompted for confirmation before executing any operations that change state. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: PerfMon + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Remove-DbaPfDataCollectorCounter + + .EXAMPLE + PS C:\> Remove-DbaPfDataCollectorCounter -ComputerName sql2017 -CollectorSet 'System Correlation' -Collector DataCollector01 -Counter '\LogicalDisk(*)\Avg. Disk Queue Length' + + Prompts for confirmation then removes the '\LogicalDisk(*)\Avg. Disk Queue Length' counter within the DataCollector01 collector within the System Correlation collector set on sql2017. + + .EXAMPLE + PS C:\> Get-DbaPfDataCollectorCounter | Out-GridView -PassThru | Remove-DbaPfDataCollectorCounter -Confirm:$false + + Allows you to select which counters you'd like on localhost and does not prompt for confirmation. + + #> + [CmdletBinding(SupportsShouldProcess, ConfirmImpact = "High")] + param ( + [DbaInstance[]]$ComputerName = $env:COMPUTERNAME, + [PSCredential]$Credential, + [Alias("DataCollectorSet")] + [string[]]$CollectorSet, + [Alias("DataCollector")] + [string[]]$Collector, + [parameter(Mandatory, ValueFromPipelineByPropertyName)] + [Alias("Name")] + [object[]]$Counter, + [parameter(ValueFromPipeline)] + [object[]]$InputObject, + [switch]$EnableException + ) + begin { + $setscript = { + $setname = $args[0]; $removexml = $args[1] + $CollectorSet = New-Object -ComObject Pla.DataCollectorSet + $CollectorSet.SetXml($removexml) + $CollectorSet.Commit($setname, $null, 0x0003) #add or modify. + $CollectorSet.Query($setname, $Null) + } + } + process { + + + if ($InputObject.Credential -and (Test-Bound -ParameterName Credential -Not)) { + $Credential = $InputObject.Credential + } + + if (-not $InputObject -or ($InputObject -and (Test-Bound -ParameterName ComputerName))) { + foreach ($computer in $ComputerName) { + $InputObject += Get-DbaPfDataCollectorCounter -ComputerName $computer -Credential $Credential -CollectorSet $CollectorSet -Collector $Collector -Counter $Counter + } + } + + if ($InputObject) { + if (-not $InputObject.CounterObject) { + Stop-Function -Message "InputObject is not of the right type. Please use Get-DbaPfDataCollectorCounter." + return + } + } + + foreach ($object in $InputObject) { + $computer = $InputObject.ComputerName + $null = Test-ElevationRequirement -ComputerName $computer -Continue + $setname = $InputObject.DataCollectorSet + $collectorname = $InputObject.DataCollector + + $xml = [xml]($InputObject.DataCollectorSetXml) + + foreach ($countername in $counter) { + $node = $xml.SelectSingleNode("//Name[.='$collectorname']").SelectSingleNode("//Counter[.='$countername']") + $null = $node.ParentNode.RemoveChild($node) + $node = $xml.SelectSingleNode("//Name[.='$collectorname']").SelectSingleNode("//CounterDisplayName[.='$countername']") + $null = $node.ParentNode.RemoveChild($node) + } + + $plainxml = $xml.OuterXml + + if ($Pscmdlet.ShouldProcess("$computer", "Remove $countername from $collectorname with the $setname collection set")) { + try { + $results = Invoke-Command2 -ComputerName $computer -Credential $Credential -ScriptBlock $setscript -ArgumentList $setname, $plainxml -ErrorAction Stop -Raw + Write-Message -Level Verbose -Message " $results" + [pscustomobject]@{ + ComputerName = $computer + DataCollectorSet = $setname + DataCollector = $collectorname + Name = $counterName + Status = "Removed" + } + } catch { + Stop-Function -Message "Failure importing $Countername to $computer." -ErrorRecord $_ -Target $computer -Continue + } + } + } + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function Remove-DbaPfDataCollectorSet { + <# + .SYNOPSIS + Removes a Performance Monitor Data Collector Set + + .DESCRIPTION + Removes a Performance Monitor Data Collector Set. When removing data collector sets from the local instance, Run As Admin is required. + + .PARAMETER ComputerName + The target computer. Defaults to localhost. + + .PARAMETER Credential + Allows you to login to the target computer using alternative credentials. To use: + + $cred = Get-Credential, then pass $cred object to the -Credential parameter. + + .PARAMETER CollectorSet + The name of the Collector Set to remove. + + .PARAMETER InputObject + Accepts the object output by Get-DbaPfDataCollectorSet via the pipeline. + + .PARAMETER WhatIf + If this switch is enabled, no actions are performed but informational messages will be displayed that explain what would happen if the command were to run. + + .PARAMETER Confirm + If this switch is enabled, you will be prompted for confirmation before executing any operations that change state. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: PerfMon + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Remove-DbaPfDataCollectorSet + + .EXAMPLE + PS C:\> Remove-DbaPfDataCollectorSet + + Prompts for confirmation then removes all ready Collectors on localhost. + + .EXAMPLE + PS C:\> Remove-DbaPfDataCollectorSet -ComputerName sql2017 -Confirm:$false + + Attempts to remove all ready Collectors on localhost and does not prompt to confirm. + + .EXAMPLE + PS C:\> Remove-DbaPfDataCollectorSet -ComputerName sql2017, sql2016 -Credential ad\sqldba -CollectorSet 'System Correlation' + + Prompts for confirmation then removes the 'System Correlation' Collector on sql2017 and sql2016 using alternative credentials. + + .EXAMPLE + PS C:\> Get-DbaPfDataCollectorSet -CollectorSet 'System Correlation' | Remove-DbaPfDataCollectorSet + + Removes the 'System Correlation' Collector. + + .EXAMPLE + PS C:\> Get-DbaPfDataCollectorSet -CollectorSet 'System Correlation' | Stop-DbaPfDataCollectorSet | Remove-DbaPfDataCollectorSet + + Stops and removes the 'System Correlation' Collector. + + #> + [CmdletBinding(SupportsShouldProcess, ConfirmImpact = "High")] + param ( + [DbaInstance[]]$ComputerName = $env:COMPUTERNAME, + [PSCredential]$Credential, + [Alias("DataCollectorSet")] + [string[]]$CollectorSet, + [parameter(ValueFromPipeline)] + [object[]]$InputObject, + [switch]$EnableException + ) + begin { + $setscript = { + $setname = $args + $collectorset = New-Object -ComObject Pla.DataCollectorSet + $collectorset.Query($setname, $null) + if ($collectorset.name -eq $setname) { + $null = $collectorset.Delete() + } else { + <# DO NOT use Write-Message as this is inside of a script block #> + Write-Warning "Data Collector Set $setname does not exist on $env:COMPUTERNAME." + } + } + } + process { + + + if (-not $InputObject -or ($InputObject -and (Test-Bound -ParameterName ComputerName))) { + foreach ($computer in $ComputerName) { + $InputObject += Get-DbaPfDataCollectorSet -ComputerName $computer -Credential $Credential -CollectorSet $CollectorSet + } + } + + if ($InputObject) { + if (-not $InputObject.DataCollectorSetObject) { + Stop-Function -Message "InputObject is not of the right type. Please use Get-DbaPfDataCollectorSet." + return + } + } + + # Check to see if its running first + foreach ($set in $InputObject) { + $setname = $set.Name + $computer = $set.ComputerName + $status = $set.State + + $null = Test-ElevationRequirement -ComputerName $computer -Continue + + Write-Message -Level Verbose -Message "$setname on $ComputerName is $status." + + if ($status -eq "Running") { + Stop-Function -Message "$setname on $computer is running. Use Stop-DbaPfDataCollectorSet to stop first." -Continue + } + + if ($Pscmdlet.ShouldProcess("$computer", "Removing collector set $setname")) { + try { + Invoke-Command2 -ComputerName $computer -Credential $Credential -ScriptBlock $setscript -ArgumentList $setname -ErrorAction Stop + [pscustomobject]@{ + ComputerName = $computer + Name = $setname + Status = "Removed" + } + } catch { + Stop-Function -Message "Failure Removing $setname on $computer." -ErrorRecord $_ -Target $computer -Continue + } + } + } + } +} +#ValidationTags#FlowControl,Pipeline# +function Remove-DbaSpn { + <# + .SYNOPSIS + Removes an SPN for a given service account in active directory and also removes delegation to the same SPN, if found + + .DESCRIPTION + This function will connect to Active Directory and search for an account. If the account is found, it will attempt to remove the specified SPN. Once the SPN is removed, the function will also remove delegation to that service. + + In order to run this function, the credential you provide must have write access to Active Directory. + + .PARAMETER SPN + The SPN you want to remove + + .PARAMETER ServiceAccount + The account you want the SPN remove from + + .PARAMETER Credential + The credential you want to use to connect to Active Directory to make the changes + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .PARAMETER Confirm + Turns confirmations before changes on or off + + .PARAMETER WhatIf + Shows what would happen if the command was executed + + .NOTES + Tags: SPN + Author: Drew Furgiuele (@pittfurg), http://www.port1433.com + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Remove-DbaSpn + + .EXAMPLE + PS C:\> Remove-DbaSpn -SPN MSSQLSvc\SQLSERVERA.domain.something -ServiceAccount domain\account + + Connects to Active Directory and removes a provided SPN from the given account (and also the relative delegation) + + .EXAMPLE + PS C:\> Remove-DbaSpn -SPN MSSQLSvc\SQLSERVERA.domain.something -ServiceAccount domain\account -EnableException + + Connects to Active Directory and removes a provided SPN from the given account, suppressing all error messages and throw exceptions that can be caught instead + + .EXAMPLE + PS C:\> Remove-DbaSpn -SPN MSSQLSvc\SQLSERVERA.domain.something -ServiceAccount domain\account -Credential ad\sqldba + + Connects to Active Directory and removes a provided SPN to the given account. Uses alternative account to connect to AD. + + .EXAMPLE + PS C:\> Test-DbaSpn -ComputerName sql2005 | Where { $_.isSet -eq $true } | Remove-DbaSpn -WhatIf + + Shows what would happen trying to remove all set SPNs for sql2005 and the relative delegations + + .EXAMPLE + PS C:\> Test-DbaSpn -ComputerName sql2005 | Where { $_.isSet -eq $true } | Remove-DbaSpn + + Removes all set SPNs for sql2005 and the relative delegations + + #> + [cmdletbinding(SupportsShouldProcess, DefaultParameterSetName = "Default")] + param ( + [Parameter(Mandatory, ValueFromPipelineByPropertyName)] + [Alias("RequiredSPN")] + [string]$SPN, + [Parameter(Mandatory, ValueFromPipelineByPropertyName)] + [Alias("InstanceServiceAccount", "AccountName")] + [string]$ServiceAccount, + [Parameter(ValueFromPipelineByPropertyName)] + [PSCredential]$Credential, + [Alias('Silent')] + [switch]$EnableException + ) + + process { + Write-Message -Message "Looking for account $ServiceAccount..." -Level Verbose + $searchfor = 'User' + if ($ServiceAccount.EndsWith('$')) { + $searchfor = 'Computer' + } + try { + $Result = Get-DbaADObject -ADObject $ServiceAccount -Type $searchfor -Credential $Credential -EnableException + } catch { + Stop-Function -Message "AD lookup failure. This may be because the domain cannot be resolved for the SQL Server service account ($ServiceAccount). $($_.Exception.Message)" -EnableException $EnableException -InnerErrorRecord $_ -Target $ServiceAccount + } + if ($Result.Count -gt 0) { + try { + $adentry = $Result.GetUnderlyingObject() + } catch { + Stop-Function -Message "The SQL Service account ($ServiceAccount) has been found, but you don't have enough permission to inspect its properties $($_.Exception.Message)" -EnableException $EnableException -InnerErrorRecord $_ -Target $ServiceAccount + } + } else { + Stop-Function -Message "The SQL Service account ($ServiceAccount) has not been found" -EnableException $EnableException -Target $ServiceAccount + } + + # Cool! Remove an SPN + $delegate = $true + $spnadobject = $adentry.Properties['servicePrincipalName'] + + if ($spnadobject -notcontains $spn) { + Write-Message -Level Warning -Message "SPN $SPN not found" + $status = "SPN not found" + $set = $false + } + + if ($PSCmdlet.ShouldProcess("$spn", "Removing SPN for service account")) { + try { + if ($spnadobject -contains $spn) { + $null = $spnadobject.Remove($spn) + $adentry.CommitChanges() + Write-Message -Message "Remove SPN $spn for $serviceaccount" -Level Verbose + $set = $false + $status = "Successfully removed SPN" + } + } catch { + Write-Message -Message "Could not remove SPN. $($_.Exception.Message)" -Level Warning -EnableException $EnableException.ToBool() -ErrorRecord $_ -Target $ServiceAccountWrite + $set = $true + $status = "Failed to remove SPN" + $delegate = $false + } + + [pscustomobject]@{ + Name = $spn + ServiceAccount = $ServiceAccount + Property = "servicePrincipalName" + IsSet = $set + Notes = $status + } + } + # if we removed the SPN, we should clean up also the delegation + if ($PSCmdlet.ShouldProcess("$spn", "Removing delegation for service account for SPN")) { + # if we didn't remove the SPN we shouldn't do anything + if ($delegate) { + # even if we removed the SPN, delegation could have been not set at all. We should not raise an error + if ($adentry.Properties['msDS-AllowedToDelegateTo'] -notcontains $spn) { + [pscustomobject]@{ + Name = $spn + ServiceAccount = $ServiceAccount + Property = "msDS-AllowedToDelegateTo" + IsSet = $false + Notes = "Delegation not found" + } + } else { + # we indeed need the cleanup + try { + $null = $adentry.Properties['msDS-AllowedToDelegateTo'].Remove($spn) + $adentry.CommitChanges() + Write-Message -Message "Removed kerberos delegation $spn for $ServiceAccount" -Level Verbose + $set = $false + $status = "Successfully removed delegation" + } catch { + Write-Message -Message "Could not remove delegation. $($_.Exception.Message)" -Level Warning -EnableException $EnableException.ToBool() -ErrorRecord $_ -Target $ServiceAccount + $set = $true + $status = "Failed to remove delegation" + } + + [pscustomobject]@{ + Name = $spn + ServiceAccount = $ServiceAccount + Property = "msDS-AllowedToDelegateTo" + IsSet = $set + Notes = $status + } + } + } + + } + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function Remove-DbaTrace { + <# + .SYNOPSIS + Stops and closes the specified trace and deletes its definition from the server. + + .DESCRIPTION + Stops and closes the specified trace and deletes its definition from the server. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Id + A list of trace ids. + + .PARAMETER InputObject + Internal parameter for piping. + + .PARAMETER WhatIf + If this switch is enabled, no actions are performed but informational messages will be displayed that explain what would happen if the command were to run. + + .PARAMETER Confirm + If this switch is enabled, you will be prompted for confirmation before executing any operations that change state. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Security, Trace + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .EXAMPLE + PS C:\> Remove-DbaTrace -SqlInstance sql2008 + + Stops and removes all traces on sql2008 + + .EXAMPLE + PS C:\> Remove-DbaTrace -SqlInstance sql2008 -Id 1 + + Stops and removes all trace with ID 1 on sql2008 + + .EXAMPLE + PS C:\> Get-DbaTrace -SqlInstance sql2008 | Out-GridView -PassThru | Remove-DbaTrace + + Stops and removes selected traces on sql2008 + + #> + [CmdletBinding(SupportsShouldProcess)] + param ( + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [int[]]$Id, + [parameter(ValueFromPipeline)] + [object[]]$InputObject, + [switch]$EnableException + ) + process { + if (-not $InputObject -and $SqlInstance) { + $InputObject = Get-DbaTrace -SqlInstance $SqlInstance -SqlCredential $SqlCredential -Id $Id + } + + foreach ($trace in $InputObject) { + if (-not $trace.id -and -not $trace.Parent) { + Stop-Function -Message "Input is of the wrong type. Use Get-DbaTrace." -Continue + return + } + + $server = $trace.Parent + $traceid = $trace.id + $default = Get-DbaTrace -SqlInstance $server -Default + + if ($default.id -eq $traceid) { + Stop-Function -Message "The default trace on $server cannot be stopped. Use Set-DbaSpConfigure to turn it off." -Continue + } + + $stopsql = "sp_trace_setstatus $traceid, 0" + $removesql = "sp_trace_setstatus $traceid, 2" + + if ($Pscmdlet.ShouldProcess($traceid, "Removing the trace")) { + try { + $server.Query($stopsql) + if (Get-DbaTrace -SqlInstance $server -Id $traceid) { + $server.Query($removesql) + } + [pscustomobject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + Id = $traceid + Status = "Stopped, closed and deleted" + } + } catch { + Stop-Function -Message "Failure" -ErrorRecord $_ -Target $server -Continue + return + } + } + } + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function Remove-DbaXESession { + <# + .SYNOPSIS + Removes Extended Events sessions. + + .DESCRIPTION + This script removes Extended Events sessions on a SQL Server instance. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. You must have sysadmin access and server version must be SQL Server version 2008 or higher. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Session + Specifies a list of Extended Events sessions to remove. + + .PARAMETER AllSessions + If this switch is enabled, all Extended Events sessions will be removed except the packaged sessions AlwaysOn_health, system_health, telemetry_xevents. + + .PARAMETER InputObject + Accepts a collection of XEsession objects as output by Get-DbaXESession. + + .PARAMETER WhatIf + If this switch is enabled, no actions are performed but informational messages will be displayed that explain what would happen if the command were to run. + + .PARAMETER Confirm + If this switch is enabled, you will be prompted for confirmation before executing any operations that change state. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: ExtendedEvent, XE, XEvent + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Remove-DbaXESession + + .EXAMPLE + PS C:\> Remove-DbaXESession -SqlInstance sql2012 -AllSessions + + Removes all Extended Event Session on the sqlserver2014 instance. + + .EXAMPLE + PS C:\> Remove-DbaXESession -SqlInstance sql2012 -Session xesession1,xesession2 + + Removes the xesession1 and xesession2 Extended Event sessions. + + .EXAMPLE + PS C:\> Get-DbaXESession -SqlInstance sql2017 | Remove-DbaXESession -Confirm:$false + + Removes all sessions from sql2017, bypassing prompts. + + .EXAMPLE + PS C:\> Get-DbaXESession -SqlInstance sql2012 -Session xesession1 | Remove-DbaXESession + + Removes the sessions returned from the Get-DbaXESession function. + + #> + [CmdletBinding(DefaultParameterSetName = 'Session', SupportsShouldProcess, ConfirmImpact = 'High')] + [Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSUseSingularNouns", "", Justification = "Internal functions are ignored")] + param ( + [parameter(Position = 1, Mandatory, ParameterSetName = 'Session')] + [parameter(Position = 1, Mandatory, ParameterSetName = 'All')] + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [parameter(ParameterSetName = 'Session')] + [parameter(ParameterSetName = 'All')] + [PSCredential]$SqlCredential, + [parameter(Mandatory, ParameterSetName = 'Session')] + [Alias("Sessions")] + [object[]]$Session, + [parameter(Mandatory, ParameterSetName = 'All')] + [switch]$AllSessions, + [parameter(Mandatory, ValueFromPipeline, ParameterSetName = 'Object')] + [Microsoft.SqlServer.Management.XEvent.Session[]]$InputObject, + [switch]$EnableException + ) + + begin { + # Remove each XESession + function Remove-XESessions { + [CmdletBinding(SupportsShouldProcess)] + param ([Microsoft.SqlServer.Management.XEvent.Session[]]$xeSessions) + + foreach ($xe in $xeSessions) { + $instance = $xe.Parent.Name + $session = $xe.Name + + if ($Pscmdlet.ShouldProcess("$instance", "Removing XEvent Session $session")) { + try { + $xe.Drop() + [pscustomobject]@{ + ComputerName = $xe.Parent.ComputerName + InstanceName = $xe.Parent.ServiceName + SqlInstance = $xe.Parent.DomainInstanceName + Session = $session + Status = "Removed" + } + } catch { + Stop-Function -Message "Could not remove XEvent Session on $instance" -Target $session -ErrorRecord $_ -Continue + } + } + } + } + } + + process { + if ($InputObject) { + # avoid the collection issue + $sessions = Get-DbaXESession -SqlInstance $InputObject.Parent -Session $InputObject.Name + foreach ($item in $sessions) { + Remove-XESessions $item + } + } else { + foreach ($instance in $SqlInstance) { + $xeSessions = Get-DbaXESession -SqlInstance $instance -SqlCredential $SqlCredential + + # Filter xeSessions based on parameters + if ($Session) { + $xeSessions = $xeSessions | Where-Object { $_.Name -in $Session } + } elseif ($AllSessions) { + $systemSessions = @('AlwaysOn_health', 'system_health', 'telemetry_xevents') + $xeSessions = $xeSessions | Where-Object { $_.Name -notin $systemSessions } + } + + Remove-XESessions $xeSessions + } + } + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function Remove-DbaXESmartTarget { + <# + .SYNOPSIS + Removes XESmartTarget PowerShell jobs. + + .DESCRIPTION + Removes XESmartTarget PowerShell jobs. + + .PARAMETER InputObject + Specifies one or more XESmartTarget job objects as output by Get-DbaXESmartTarget. + + .PARAMETER WhatIf + If this switch is enabled, no actions are performed but informational messages will be displayed that explain what would happen if the command were to run. + + .PARAMETER Confirm + If this switch is enabled, you will be prompted for confirmation before executing any operations that change state. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: ExtendedEvent, XE, XEvent + Author: Chrissy LeMaire (@cl) | SmartTarget by Gianluca Sartori (@spaghettidba) + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + https://github.com/spaghettidba/XESmartTarget/wiki + + .LINK + https://dbatools.io/Remove-DbaXESmartTarget + + .EXAMPLE + PS C:\> Get-DbaXESmartTarget | Remove-DbaXESmartTarget + + Removes all XESmartTarget jobs. + + .EXAMPLE + PS C:\> Get-DbaXESmartTarget | Where-Object Id -eq 2 | Remove-DbaXESmartTarget + + Removes a specific XESmartTarget job. + + #> + [CmdletBinding(SupportsShouldProcess)] + param ( + [parameter(Mandatory, ValueFromPipeline)] + [object[]]$InputObject, + [switch]$EnableException + ) + process { + if ($Pscmdlet.ShouldProcess("localhost", "Removing job $id")) { + try { + $id = $InputObject.Id + Write-Message -Level Output -Message "Removing job $id, this may take a couple minutes." + Get-Job -ID $InputObject.Id | Remove-Job -Force + Write-Message -Level Output -Message "Successfully removed $id." + } catch { + Stop-Function -Message "Failure" -ErrorRecord $_ + } + } + } +} +function Rename-DbaDatabase { + <# + .SYNOPSIS + Changes database name, logical file names, file group names and physical file names (optionally handling the move). BETA VERSION. + + .DESCRIPTION + Can change every database metadata that can be renamed. + The ultimate goal is choosing to have a default template to enforce in your environment + so your naming convention for every bit can be put in place in no time. + The process is as follows (it follows the hierarchy of the entities): + - database name is changed (optionally, forcing users out) + - filegroup name(s) are changed accordingly + - logical name(s) are changed accordingly + - physical file(s) are changed accordingly + - if Move is specified, the database will be taken offline and the move will initiate, then it will be taken online + - if Move is not specified, the database remains online (unless SetOffline), and you are in charge of moving files + If any of the above fails, the process stops. + Please take a backup of your databases BEFORE using this, and remember to backup AFTER (also a FULL backup of master) + + It returns an object for each database with all the renames done, plus hidden properties showing a "human" representation of them. + + It's better you store the resulting object in a variable so you can inspect it in case of issues, e.g. "$result = Rename-DbaDatabase ....." + + To get a grasp without worrying of what would happen under the hood, use "Rename-DbaDatabase .... -Preview | Select-Object *" + + .PARAMETER SqlInstance + Target any number of instances, in order to return their build state. + + .PARAMETER SqlCredential + When connecting to an instance, use the credentials specified. + + .PARAMETER Database + Targets only specified databases + + .PARAMETER ExcludeDatabase + Excludes only specified databases + + .PARAMETER AllDatabases + If you want to apply the naming convention system wide, you need to pass this parameter + + .PARAMETER DatabaseName + Pass a template to rename the database name. Valid placeholders are: + - current database name + - date (yyyyMMdd) + + .PARAMETER FileGroupName + Pass a template to rename file group name. Valid placeholders are: + - current filegroup name + - current database name + - date (yyyyMMdd) + If distinct names cannot be generated, a counter will be appended (0001, 0002, 0003, etc) + + .PARAMETER LogicalName + Pass a template to rename logical name. Valid placeholders are: + - file type (ROWS, LOG) + - current logical name + - current filegroup name + - current database name + - date (yyyyMMdd) + If distinct names cannot be generated, a counter will be appended (0001, 0002, 0003, etc) + + .PARAMETER FileName + Pass a template to rename file name. Valid placeholders are: + - current file name (the basename, without directory nor extension) + - file type (ROWS, LOG, MMO, FS) + - current logical name + - current filegroup name + - current database name + - date (yyyyMMdd) + If distinct names cannot be generated, a counter will be appended (0001, 0002, 0003, etc) + + .PARAMETER ReplaceBefore + If you pass this switch, all upper level "current names" will be inspected and replaced BEFORE doing the + rename according to the template in the current level (remember the hierarchy): + Let's say you have a database named "dbatools_HR", composed by 3 files + - dbatools_HR_Data.mdf + - dbatools_HR_Index.ndf + - dbatools_HR_log.ldf + Rename-DbaDatabase .... -Database "dbatools_HR" -DatabaseName "dbatools_HRARCHIVE" -FileName '' + would end up with this logic: + - database --> no placeholders specified + - dbatools_HR to dbatools_HRARCHIVE + - filenames placeholders specified + --> current database name + current filename" + - dbatools_HR_Data.mdf to dbatools_HRARCHIVEdbatools_HR_Data.mdf + - dbatools_HR_Index.mdf to dbatools_HRARCHIVEdbatools_HR_Data.mdf + - dbatools_HR_log.ldf to dbatools_HRARCHIVEdbatools_HR_log.ldf + Passing this switch, instead, e.g. + Rename-DbaDatabase .... -Database "dbatools_HR" -DatabaseName "dbatools_HRARCHIVE" -FileName '' -ReplaceBefore + end up with this logic instead: + - database --> no placeholders specified + - dbatools_HR to dbatools_HRARCHIVE + - filenames placeholders specified, + , plus -ReplaceBefore --> current database name + replace OLD "upper level" names inside the current filename + - dbatools_HR_Data.mdf to dbatools_HRARCHIVE_Data.mdf + - dbatools_HR_Index.mdf to dbatools_HRARCHIVE_Data.mdf + - dbatools_HR_log.ldf to dbatools_HRARCHIVE_log.ldf + + .PARAMETER Force + Kills any open session to be able to do renames. + + .PARAMETER SetOffline + Kills any open session and sets the database offline to be able to move files + + .PARAMETER Move + If you want this function to move files, else you're the one in charge of it. + This enables the same functionality as SetOffline, killing open transactions and putting the database + offline, then do the actual rename and setting it online again afterwards + + .PARAMETER Preview + Shows the renames without performing any operation (recommended to find your way around this function parameters ;-) ) + + .PARAMETER WhatIf + If this switch is enabled, no actions are performed but informational messages will be displayed that explain what would happen if the command were to run. + + .PARAMETER Confirm + If this switch is enabled, you will be prompted for confirmation before executing any operations that change state. + + .PARAMETER InputObject + Accepts piped database objects + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Database, Rename + Author: Simone Bizzotto (@niphold) + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Rename-DbaDatabase + + .EXAMPLE + PS C:\> Rename-DbaDatabase -SqlInstance sqlserver2014a -Database HR -DatabaseName HR2 -Preview | select * + + Shows the detailed result set you'll get renaming the HR database to HR2 without doing anything + + .EXAMPLE + PS C:\> Rename-DbaDatabase -SqlInstance sqlserver2014a -Database HR -DatabaseName HR2 + + Renames the HR database to HR2 + + .EXAMPLE + PS C:\> Get-DbaDatabase -SqlInstance sqlserver2014a -Database HR | Rename-DbaDatabase -DatabaseName HR2 + + Same as before, but with a piped database (renames the HR database to HR2) + + .EXAMPLE + PS C:\> Rename-DbaDatabase -SqlInstance sqlserver2014a -Database HR -DatabaseName "dbatools_" + + Renames the HR database to dbatools_HR + + .EXAMPLE + PS C:\> Rename-DbaDatabase -SqlInstance sqlserver2014a -Database HR -DatabaseName "dbatools__" + + Renames the HR database to dbatools_HR_20170807 (if today is 07th Aug 2017) + + .EXAMPLE + PS C:\> Rename-DbaDatabase -SqlInstance sqlserver2014a -Database HR -FileGroupName "dbatools_" + + Renames every FileGroup within HR to "dbatools_[the original FileGroup name]" + + .EXAMPLE + PS C:\> Rename-DbaDatabase -SqlInstance sqlserver2014a -Database HR -DatabaseName "dbatools_" -FileGroupName "_" + + Renames the HR database to "dbatools_HR", then renames every FileGroup within to "dbatools_HR_[the original FileGroup name]" + + .EXAMPLE + PS C:\> Rename-DbaDatabase -SqlInstance sqlserver2014a -Database HR -FileGroupName "dbatools__" + PS C:\> Rename-DbaDatabase -SqlInstance sqlserver2014a -Database HR -DatabaseName "dbatools_" + + Renames the HR database to "dbatools_HR", then renames every FileGroup within to "dbatools_HR_[the original FileGroup name]" + + .EXAMPLE + PS C:\> Rename-DbaDatabase -SqlInstance sqlserver2014a -Database HR -DatabaseName "dbatools_" -FileName "__" + + Renames the HR database to "dbatools_HR" and then all filenames as "dbatools_HR_[Name of the FileGroup]_[original_filename]" + The db stays online (watch out!). You can then proceed manually to move/copy files by hand, set the db offline and then online again to finish the rename process + + .EXAMPLE + PS C:\> Rename-DbaDatabase -SqlInstance sqlserver2014a -Database HR -DatabaseName "dbatools_" -FileName "__" -SetOffline + + Renames the HR database to "dbatools_HR" and then all filenames as "dbatools_HR_[Name of the FileGroup]_[original_filename]" + The db is then set offline (watch out!). You can then proceed manually to move/copy files by hand and then set it online again to finish the rename process + + .EXAMPLE + PS C:\> Rename-DbaDatabase -SqlInstance sqlserver2014a -Database HR -DatabaseName "dbatools_" -FileName "__" -Move + + Renames the HR database to "dbatools_HR" and then all filenames as "dbatools_HR_[Name of the FileGroup]_[original_filename]" + The db is then set offline (watch out!). The function tries to do a simple rename and then sets the db online again to finish the rename process + + #> + [CmdletBinding(SupportsShouldProcess)] + param ( + [parameter(Mandatory, ParameterSetName = "Server")] + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [Alias("Credential")] + [PSCredential] + $SqlCredential, + [parameter(ParameterSetName = "Server")] + [Alias("Databases")] + [object[]]$Database, + [object[]]$ExcludeDatabase, + [switch]$AllDatabases, + [string]$DatabaseName, + [string]$FileGroupName, + [string]$LogicalName, + [string]$FileName, + [switch]$ReplaceBefore, + [switch]$Force, + [switch]$Move, + [switch]$SetOffline, + [switch]$Preview, + [parameter(Mandatory, ValueFromPipeline, ParameterSetName = "Pipe")] + [Microsoft.SqlServer.Management.Smo.Database[]]$InputObject, + [Alias('Silent')] + [switch]$EnableException + ) + + begin { + $CurrentDate = Get-Date -Format 'yyyyMMdd' + + function Get-DbaNameStructure($database) { + $obj = @() + # db name + $obj += "- Database : $database" + # FileGroups + foreach ($fg in $database.FileGroups) { + $obj += " - FileGroup: $($fg.Name)" + # LogicalNames + foreach ($ln in $fg.Files) { + $obj += " - Logical: $($ln.Name)" + $obj += " - FileName: $($ln.FileName)" + } + } + $obj += " - Logfiles" + foreach ($log in $database.LogFiles) { + $obj += " - Logical: $($log.Name)" + $obj += " - FileName: $($log.FileName)" + } + return $obj -Join "`n" + } + + + function Get-DbaKeyByValue($hashtable, $Value) { + ($hashtable.GetEnumerator() | Where-Object Value -eq $Value).Name + } + + if ((Test-Bound -ParameterName SetOffline) -and (-not(Test-Bound -ParameterName FileName))) { + Stop-Function -Category InvalidArgument -Message "-SetOffline is only useful when -FileName is passed. Quitting." + } + } + process { + if (Test-FunctionInterrupt) { return } + if (!$Database -and !$AllDatabases -and !$InputObject -and !$ExcludeDatabase) { + Stop-Function -Message "You must specify a -AllDatabases or -Database/ExcludeDatabase to continue" + return + } + if (!$DatabaseName -and !$FileGroupName -and !$LogicalName -and !$FileName) { + Stop-Function -Message "You must specify at least one of -DatabaseName,-FileGroupName,-LogicalName or -Filename to continue" + return + } + $dbs = @() + if ($InputObject) { + if ($InputObject.Name) { + # comes from Get-DbaDatabase + $dbs += $InputObject + } + } else { + foreach ($instance in $SqlInstance) { + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $sqlCredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + $all_dbs = $server.Databases | Where-Object IsAccessible + $dbs += $all_dbs | Where-Object { @('master', 'model', 'msdb', 'tempdb', 'distribution') -notcontains $_.Name } + if ($Database) { + $dbs = $dbs | Where-Object { $Database -contains $_.Name } + } + if ($ExcludeDatabase) { + $dbs = $dbs | Where-Object { $ExcludeDatabase -notcontains $_.Name } + } + } + } + + # holds all dbs per instance to avoid naming clashes + $InstanceDbs = @{} + + # holds all db file enumerations (used for -Move only) + $InstanceFiles = @{} + + #region db loop + foreach ($db in $dbs) { + # used to stop futher operations on database + $failed = $false + + # pending renames initialized at db level + $Pending_Renames = @() + + $Entities_Before = @{} + + $server = $db.Parent + if ($db.Name -in @('master', 'model', 'msdb', 'tempdb', 'distribution')) { + Write-Message -Level Warning -Message "Database $($db.Name) is a system one, skipping..." + continue + } + if (!$db.IsAccessible) { + Write-Message -Level Warning -Message "Database $($db.Name) is not accessible, skipping..." + continue + } + if ($db.IsMirroringEnabled -eq $true -or $db.AvailabilityGroupName.Length -gt 0) { + Write-Message -Level Warning -Message "Database $($db.Name) is either mirrored or in an AG, skipping..." + continue + } + $Server_Id = $server.DomainInstanceName + if ( !$InstanceDbs.ContainsKey($Server_Id) ) { + $InstanceDbs[$Server_Id] = @{} + foreach ($dn in $server.Databases.Name) { + $InstanceDbs[$Server_Id][$dn] = 1 + } + } + + $Entities_Before['DBN'] = @{} + $Entities_Before['FGN'] = @{} + $Entities_Before['LGN'] = @{} + $Entities_Before['FNN'] = @{} + $Entities_Before['DBN'][$db.Name] = $db.Name + #region databasename + if ($DatabaseName) { + $Orig_DBName = $db.Name + # fixed replacements + $NewDBName = $DatabaseName.Replace('', $Orig_DBName).Replace('', $CurrentDate) + if ($Orig_DBName -eq $NewDBName) { + Write-Message -Level VeryVerbose -Message "Database name unchanged, skipping" + } else { + if ($InstanceDbs[$Server_Id].ContainsKey($NewDBName)) { + Write-Message -Level Warning -Message "Database $NewDBName exists already, skipping this rename" + $failed = $true + } else { + if ($PSCmdlet.ShouldProcess($db, "Renaming Database $db to $NewDBName")) { + if ($Force) { + $server.KillAllProcesses($Orig_DBName) + } + try { + if (!$Preview) { + $db.Rename($NewDBName) + } + $InstanceDbs[$Server_Id].Remove($Orig_DBName) + $InstanceDbs[$Server_Id][$NewDBName] = 1 + $Entities_Before['DBN'][$Orig_DBName] = $NewDBName + #$db.Refresh() + } catch { + Stop-Function -Message "Failed to rename Database : $($_.Exception.InnerException.InnerException.InnerException)" -ErrorRecord $_ -Target $server.DomainInstanceName -OverrideExceptionMessage + # stop any further renames + $failed = $true + } + } + } + } + } + #endregion databasename + #region filegroupname + if ($ReplaceBefore) { + #backfill PRIMARY + $Entities_Before['FGN']['PRIMARY'] = 'PRIMARY' + foreach ($fg in $db.FileGroups.Name) { + $Entities_Before['FGN'][$fg] = $fg + } + } + + if (!$failed -and $FileGroupName) { + $Editable_FGs = $db.FileGroups | Where-Object Name -ne 'PRIMARY' + $New_FGNames = @{} + foreach ($fg in $db.FileGroups.Name) { + $New_FGNames[$fg] = 1 + } + $FGCounter = 0 + foreach ($fg in $Editable_FGs) { + $Orig_FGName = $fg.Name + $Orig_Placeholder = $Orig_FGName + if ($ReplaceBefore) { + # at Filegroup level, we need to worry about database name + $Orig_Placeholder = $Orig_Placeholder.Replace($Entities_Before['DBN'][$Orig_DBName], '') + } + $NewFGName = $FileGroupName.Replace('', $Entities_Before['DBN'][$db.Name]).Replace('', $CurrentDate).Replace('', $Orig_Placeholder) + $FinalFGName = $NewFGName + while ($fg.Name -ne $FinalFGName) { + if ($FinalFGName -in $New_FGNames.Keys) { + $FGCounter += 1 + $FinalFGName = "$NewFGName$($FGCounter.ToString('000'))" + } else { + break + } + } + if ($fg.Name -eq $FinalFGName) { + Write-Message -Level VeryVerbose -Message "No rename necessary for FileGroup $($fg.Name) (on $db)" + continue + } + if ($PSCmdlet.ShouldProcess($db, "Renaming FileGroup $($fg.Name) to $FinalFGName")) { + try { + if (!$Preview) { + $fg.Rename($FinalFGName) + } + $New_FGNames.Remove($Orig_FGName) + $New_FGNames[$FinalFGName] = 1 + $Entities_Before['FGN'][$Orig_FGName] = $FinalFGName + } catch { + Stop-Function -Message "Failed to rename FileGroup : $($_.Exception.InnerException.InnerException.InnerException)" -ErrorRecord $_ -Target $server.DomainInstanceName -OverrideExceptionMessage + # stop any further renames + $failed = $true + break + } + } + } + #$db.FileGroups.Refresh() + } + + #endregion filegroupname + #region logicalname + if ($ReplaceBefore) { + foreach ($fn in $db.FileGroups.Files.Name) { + $Entities_Before['LGN'][$fn] = $fn + } + foreach ($fn in $db.Logfiles.Name) { + $Entities_Before['LGN'][$fn] = $fn + } + } + if (!$failed -and $LogicalName) { + $New_LogicalNames = @{} + foreach ($fn in $db.FileGroups.Files.Name) { + $New_LogicalNames[$fn] = 1 + } + foreach ($fn in $db.Logfiles.Name) { + $New_LogicalNames[$fn] = 1 + } + $LNCounter = 0 + foreach ($fg in $db.FileGroups) { + $logicalfiles = @($fg.Files) + for ($i = 0; $i -lt $logicalfiles.Count; $i++) { + $logical = $logicalfiles[$i] + $FileType = switch ($fg.FileGroupType) { + 'RowsFileGroup' { 'ROWS' } + 'MemoryOptimizedDataFileGroup' { 'MMO' } + 'FileStreamDataFileGroup' { 'FS' } + default { 'STD' } + } + $Orig_LGName = $logical.Name + $Orig_Placeholder = $Orig_LGName + if ($ReplaceBefore) { + # at Logical Name level, we need to worry about database name and filegroup name + $Orig_Placeholder = $Orig_Placeholder.Replace((Get-DbaKeyByValue -HashTable $Entities_Before['DBN'] -Value $db.Name), '').Replace( + (Get-DbaKeyByValue -HashTable $Entities_Before['FGN'] -Value $fg.Name), '') + } + $NewLGName = $LogicalName.Replace('', $db.Name).Replace('', $CurrentDate).Replace('', $fg.Name).Replace( + '', $FileType).Replace('', $Orig_Placeholder) + $FinalLGName = $NewLGName + while ($logical.Name -ne $FinalLGName) { + if ($FinalLGName -in $New_LogicalNames.Keys) { + $LNCounter += 1 + $FinalLGName = "$NewLGName$($LNCounter.ToString('000'))" + } else { + break + } + } + if ($logical.Name -eq $FinalLGName) { + Write-Message -Level VeryVerbose -Message "No rename necessary for LogicalFile $($logical.Name) (on FileGroup $($fg.Name) (on $db))" + continue + } + if ($PSCmdlet.ShouldProcess($db, "Renaming LogicalFile $($logical.Name) to $FinalLGName (on FileGroup $($fg.Name))")) { + try { + if (!$Preview) { + $logical.Rename($FinalLGName) + } + $New_LogicalNames.Remove($Orig_LGName) + $New_LogicalNames[$FinalLGName] = 1 + $Entities_Before['LGN'][$Orig_LGName] = $FinalLGName + } catch { + Stop-Function -Message "Failed to Rename Logical File : $($_.Exception.InnerException.InnerException.InnerException)" -ErrorRecord $_ -Target $server.DomainInstanceName -OverrideExceptionMessage + # stop any further renames + $failed = $true + break + } + } + } + } + #$fg.Files.Refresh() + if (!$failed) { + $logfiles = @($db.LogFiles) + for ($i = 0; $i -lt $logfiles.Count; $i++) { + $logicallog = $logfiles[$i] + $Orig_LGName = $logicallog.Name + $Orig_Placeholder = $Orig_LGName + if ($ReplaceBefore) { + # at Logical Name level, we need to worry about database name and filegroup name, but for logfiles filegroup is not there + $Orig_Placeholder = $Orig_Placeholder.Replace((Get-DbaKeyByValue -HashTable $Entities_Before['DBN'] -Value $db.Name), '').Replace( + (Get-DbaKeyByValue -HashTable $Entities_Before['FGN'] -Value $fg.Name), '') + } + $NewLGName = $LogicalName.Replace('', $db.Name).Replace('', $CurrentDate).Replace('', '').Replace( + '', 'LOG').Replace('', $Orig_Placeholder) + $FinalLGName = $NewLGName + if ($FinalLGName.Length -eq 0) { + #someone passed in -LogicalName ''.... but we don't have FGN here + $FinalLGName = $Orig_LGName + } + while ($logicallog.Name -ne $FinalLGName) { + if ($FinalLGName -in $New_LogicalNames.Keys) { + $LNCounter += 1 + $FinalLGName = "$NewLGName$($LNCounter.ToString('000'))" + } else { + break + } + } + if ($logicallog.Name -eq $FinalLGName) { + Write-Message -Level VeryVerbose -Message "No Rename necessary for LogicalFile log $($logicallog.Name) (LOG on (on $db))" + continue + } + if ($PSCmdlet.ShouldProcess($db, "Renaming LogicalFile log $($logicallog.Name) to $FinalLGName (LOG)")) { + try { + if (!$Preview) { + $logicallog.Rename($FinalLGName) + } + $New_LogicalNames.Remove($Orig_LGName) + $New_LogicalNames[$FinalLGName] = 1 + $Entities_Before['LGN'][$Orig_LGName] = $FinalLGName + } catch { + Stop-Function -Message "Failed to Rename Logical File : $($_.Exception.InnerException.InnerException.InnerException)" -ErrorRecord $_ -Target $server.DomainInstanceName -OverrideExceptionMessage + # stop any further renames + $failed = $true + break + } + } + } + #$db.Logfiles.Refresh() + } + } + #endregion logicalname + #region filename + if ($ReplaceBefore) { + foreach ($fn in $db.FileGroups.Files.FileName) { + $Entities_Before['FNN'][$fn] = $fn + } + foreach ($fn in $db.Logfiles.FileName) { + $Entities_Before['FNN'][$fn] = $fn + } + } + if (!$failed -and $FileName) { + + $New_FileNames = @{} + foreach ($fn in $db.FileGroups.Files.FileName) { + $New_FileNames[$fn] = 1 + } + foreach ($fn in $db.Logfiles.FileName) { + $New_FileNames[$fn] = 1 + } + # we need to inspect what files are in the same directory + # to avoid failing the process because the move won't work + # here we have a dict keyed by instance and then keyed by path + if ( !$InstanceFiles.ContainsKey($Server_Id) ) { + $InstanceFiles[$Server_Id] = @{} + } + foreach ($fn in $New_FileNames.Keys) { + $dirname = [IO.Path]::GetDirectoryName($fn) + if ( !$InstanceFiles[$Server_Id].ContainsKey($dirname) ) { + $InstanceFiles[$Server_Id][$dirname] = @{} + try { + $dirfiles = Get-DbaFile -SqlInstance $server -Path $dirname -EnableException + } catch { + Write-Message -Level Warning -Message "Failed to enumerate existing files at $dirname, move could go wrong" + } + foreach ($f in $dirfiles) { + $InstanceFiles[$Server_Id][$dirname][$f.Filename] = 1 + } + } + } + $FNCounter = 0 + foreach ($fg in $db.FileGroups) { + $FG_Files = @($fg.Files) + foreach ($logical in $FG_Files) { + $FileType = switch ($fg.FileGroupType) { + 'RowsFileGroup' { 'ROWS' } + 'MemoryOptimizedDataFileGroup' { 'MMO' } + 'FileStreamDataFileGroup' { 'FS' } + default { 'STD' } + } + $FNName = $logical.FileName + $FNNameDir = [IO.Path]::GetDirectoryName($FNName) + $Orig_FNNameLeaf = [IO.Path]::GetFileNameWithoutExtension($logical.FileName) + $Orig_Placeholder = $Orig_FNNameLeaf + if ($ReplaceBefore) { + # at Filename level, we need to worry about database name, filegroup name and logical file name + $Orig_Placeholder = $Orig_Placeholder.Replace((Get-DbaKeyByValue -HashTable $Entities_Before['DBN'] -Value $db.Name), '').Replace( + (Get-DbaKeyByValue -HashTable $Entities_Before['FGN'] -Value $fg.Name), '').Replace( + (Get-DbaKeyByValue -HashTable $Entities_Before['LGN'] -Value $logical.Name), '') + } + $NewFNName = $FileName.Replace('', $db.Name).Replace('', $CurrentDate).Replace('', $fg.Name).Replace( + '', $FileType).Replace('', $logical.Name).Replace('', $Orig_Placeholder) + $FinalFNName = [IO.Path]::Combine($FNNameDir, "$NewFNName$([IO.Path]::GetExtension($FNName))") + + while ($logical.FileName -ne $FinalFNName) { + if ($InstanceFiles[$Server_Id][$FNNameDir].ContainsKey($FinalFNName)) { + $FNCounter += 1 + $FinalFNName = [IO.Path]::Combine($FNNameDir, "$NewFNName$($FNCounter.ToString('000'))$([IO.Path]::GetExtension($FNName))" + ) + } else { + break + } + } + if ($logical.FileName -eq $FinalFNName) { + Write-Message -Level VeryVerbose -Message "No rename necessary (on FileGroup $($fg.Name) (on $db))" + continue + } + if ($PSCmdlet.ShouldProcess($db, "Renaming FileName $($logical.FileName) to $FinalFNName (on FileGroup $($fg.Name))")) { + try { + if (!$Preview) { + $logical.FileName = $FinalFNName + $db.Alter() + } + $InstanceFiles[$Server_Id][$FNNameDir].Remove($FNName) + $InstanceFiles[$Server_Id][$FNNameDir][$FinalFNName] = 1 + $Entities_Before['FNN'][$FNName] = $FinalFNName + $Pending_Renames += [pscustomobject]@{ + Source = $FNName + Destination = $FinalFNName + } + } catch { + Stop-Function -Message "Failed to Rename FileName : $($_.Exception.InnerException.InnerException.InnerException)" -ErrorRecord $_ -Target $server.DomainInstanceName -OverrideExceptionMessage + # stop any further renames + $failed = $true + break + } + } + } + if (!$failed) { + $FG_Files = @($db.Logfiles) + foreach ($logical in $FG_Files) { + $FNName = $logical.FileName + $FNNameDir = [IO.Path]::GetDirectoryName($FNName) + $Orig_FNNameLeaf = [IO.Path]::GetFileNameWithoutExtension($logical.FileName) + $Orig_Placeholder = $Orig_FNNameLeaf + if ($ReplaceBefore) { + # at Filename level, we need to worry about database name, filegroup name and logical file name + $Orig_Placeholder = $Orig_Placeholder.Replace((Get-DbaKeyByValue -HashTable $Entities_Before['DBN'] -Value $db.Name), '').Replace( + (Get-DbaKeyByValue -HashTable $Entities_Before['FGN'] -Value $fg.Name), '').Replace( + (Get-DbaKeyByValue -HashTable $Entities_Before['LGN'] -Value $logical.Name), '') + } + $NewFNName = $FileName.Replace('', $db.Name).Replace('', $CurrentDate).Replace('', '').Replace( + '', 'LOG').Replace('', $logical.Name).Replace('', $Orig_Placeholder) + $FinalFNName = [IO.Path]::Combine($FNNameDir, "$NewFNName$([IO.Path]::GetExtension($FNName))") + while ($logical.FileName -ne $FinalFNName) { + if ($InstanceFiles[$Server_Id][$FNNameDir].ContainsKey($FinalFNName)) { + $FNCounter += 1 + $FinalFNName = [IO.Path]::Combine($FNNameDir, "$NewFNName$($FNCounter.ToString('000'))$([IO.Path]::GetExtension($FNName))") + } else { + break + } + } + if ($logical.FileName -eq $FinalFNName) { + Write-Message -Level VeryVerbose -Message "No rename necessary for $($logical.FileName) (LOG on (on $db))" + continue + } + + if ($PSCmdlet.ShouldProcess($db, "Renaming FileName $($logical.FileName) to $FinalFNName (LOG)")) { + try { + if (!$Preview) { + $logical.FileName = $FinalFNName + $db.Alter() + } + $InstanceFiles[$Server_Id][$FNNameDir].Remove($FNName) + $InstanceFiles[$Server_Id][$FNNameDir][$FinalFNName] = 1 + $Entities_Before['FNN'][$FNName] = $FinalFNName + $Pending_Renames += [pscustomobject]@{ + Source = $FNName + Destination = $FinalFNName + } + } catch { + Stop-Function -Message "Failed to Rename FileName : $($_.Exception.InnerException.InnerException.InnerException)" -ErrorRecord $_ -Target $server.DomainInstanceName -OverrideExceptionMessage + # stop any further renames + $failed = $true + break + } + } + } + } + + } + #endregion filename + #region move + $ComputerName = $null + $Final_Renames = New-Object System.Collections.ArrayList + if ([DbaValidate]::IsLocalhost($server.ComputerName)) { + # locally ran so we can just use rename-item + $ComputerName = $server.ComputerName + } else { + # let's start checking if we can access .ComputerName + $testPS = $false + if ($SqlCredential) { + # why does Test-PSRemoting require a Credential param ? this is ugly... + $testPS = Test-PSRemoting -ComputerName $server.ComputerName -Credential $SqlCredential -ErrorAction Stop + } else { + $testPS = Test-PSRemoting -ComputerName $server.ComputerName -ErrorAction Stop + } + if (!($testPS)) { + # let's try to resolve it to a more qualified name, without "cutting" knowledge about the domain (only $server.Name possibly holds the complete info) + $Resolved = (Resolve-DbaNetworkName -ComputerName $server.Name).FullComputerName + if ($SqlCredential) { + $testPS = Test-PSRemoting -ComputerName $Resolved -Credential $SqlCredential -ErrorAction Stop + } else { + $testPS = Test-PSRemoting -ComputerName $Resolved -ErrorAction Stop + } + if ($testPS) { + $ComputerName = $Resolved + } + } else { + $ComputerName = $server.ComputerName + } + } + foreach ($op in $pending_renames) { + if ([DbaValidate]::IsLocalhost($server.ComputerName)) { + $null = $Final_Renames.Add([pscustomobject]@{ + Source = $op.Source + Destination = $op.Destination + ComputerName = $ComputerName + }) + } else { + if ($null -eq $ComputerName) { + # if we don't have remote access ($ComputerName is null) we can fallback to admin shares if they're available + if (Test-Path (Join-AdminUnc -ServerName $server.ComputerName -filepath $op.Source)) { + $null = $Final_Renames.Add([pscustomobject]@{ + Source = Join-AdminUnc -ServerName $server.ComputerName -filepath $op.Source + Destination = Join-AdminUnc -ServerName $server.ComputerName -filepath $op.Destination + ComputerName = $server.ComputerName + }) + } else { + # flag the impossible rename ($ComputerName is $null) + $null = $Final_Renames.Add([pscustomobject]@{ + Source = $op.Source + Destination = $op.Destination + ComputerName = $ComputerName + }) + } + } else { + # we can do renames in a remote pssession + $null = $Final_Renames.Add([pscustomobject]@{ + Source = $op.Source + Destination = $op.Destination + ComputerName = $ComputerName + }) + } + } + } + $Status = 'FULL' + if (!$failed -and ($SetOffline -or $Move) -and $Final_Renames) { + if (!$Move) { + Write-Message -Level VeryVerbose -Message "Setting the database offline. You are in charge of moving the files to the new location" + # because renames still need to be dealt with + $Status = 'PARTIAL' + } else { + if ($PSCmdlet.ShouldProcess($db, "File Rename required, setting db offline")) { + $SetState = Set-DbaDbState -SqlInstance $server -Database $db.Name -Offline -Force + if ($SetState.Status -ne 'OFFLINE') { + Write-Message -Level Warning -Message "Setting db offline failed, You are in charge of moving the files to the new location" + # because it was impossible to set the database offline + $Status = 'PARTIAL' + } else { + try { + while ($Final_Renames.Count -gt 0) { + $op = $Final_Renames.Item(0) + if ($null -eq $op.ComputerName) { + Stop-Function -Message "No access to physical files for renames" + } else { + Write-Message -Level VeryVerbose -Message "Moving file $($op.Source) to $($op.Destination)" + if (!$Preview) { + $scriptblock = { + $op = $args[0] + Rename-Item -Path $op.Source -NewName $op.Destination + } + Invoke-Command2 -ComputerName $op.ComputerName -Credential $sqlCredential -ScriptBlock $scriptblock -ArgumentList $op + } + } + $null = $Final_Renames.RemoveAt(0) + } + } catch { + $failed = $true + # because a rename operation failed + $Status = 'PARTIAL' + Stop-Function -Message "Failed to rename $($op.Source) to $($op.Destination), you are in charge of moving the files to the new location" -ErrorRecord $_ -Target $instance -Exception $_.Exception -Continue + } + if (!$failed) { + if ($PSCmdlet.ShouldProcess($db, "Setting database online")) { + $SetState = Set-DbaDbState -SqlInstance $server -Database $db.Name -Online -Force + if ($SetState.Status -ne 'ONLINE') { + Write-Message -Level Warning -Message "Setting db online failed" + # because renames were done, but the database didn't wake up + $Status = 'PARTIAL' + } else { + $Status = 'FULL' + } + } + } + } + } + } + } else { + # because of a previous error with renames to do + $Status = 'PARTIAL' + } + } else { + if (!$failed) { + # because no previous error and not filename + $Status = 'FULL' + } else { + # because previous errors and not filename + $Status = 'PARTIAL' + } + } + #endregion move + # remove entities that match for the output + foreach ($k in $Entities_Before.Keys) { + $ToRemove = $Entities_Before[$k].GetEnumerator() | Where-Object { $_.Name -eq $_.Value } | Select-Object -ExpandProperty Name + foreach ($el in $ToRemove) { + $Entities_Before[$k].Remove($el) + } + } + [pscustomobject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + Database = $db + DBN = $Entities_Before['DBN'] + DatabaseRenames = ($Entities_Before['DBN'].GetEnumerator() | Foreach-Object { "$($_.Name) --> $($_.Value)" }) -Join "`n" + FGN = $Entities_Before['FGN'] + FileGroupsRenames = ($Entities_Before['FGN'].GetEnumerator() | Foreach-Object { "$($_.Name) --> $($_.Value)" }) -Join "`n" + LGN = $Entities_Before['LGN'] + LogicalNameRenames = ($Entities_Before['LGN'].GetEnumerator() | Foreach-Object { "$($_.Name) --> $($_.Value)" }) -Join "`n" + FNN = $Entities_Before['FNN'] + FileNameRenames = ($Entities_Before['FNN'].GetEnumerator() | Foreach-Object { "$($_.Name) --> $($_.Value)" }) -Join "`n" + PendingRenames = $Final_Renames + Status = $Status + } | Select-DefaultView -ExcludeProperty DatabaseRenames, FileGroupsRenames, LogicalNameRenames, FileNameRenames + } + #endregion db loop + } +} +function Rename-DbaLogin { + <# + .SYNOPSIS + Rename-DbaLogin will rename login and database mapping for a specified login. + + .DESCRIPTION + There are times where you might want to rename a login that was copied down, or if the name is not descriptive for what it does. + + It can be a pain to update all of the mappings for a specific user, this does it for you. + + .PARAMETER SqlInstance + Source SQL Server.You must have sysadmin access and server version must be SQL Server version 2000 or greater. + + .PARAMETER Destination + Destination Sql Server. You must have sysadmin access and server version must be SQL Server version 2000 or greater. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Login + The current Login on the server - this list is auto-populated from the server. + + .PARAMETER NewLogin + The new Login that you wish to use. If it is a windows user login, then the SID must match. + + .PARAMETER Confirm + Prompts to confirm actions + + .PARAMETER WhatIf + Shows what would happen if the command were to run. No actions are actually performed. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Login + Author: Mitchell Hamann (@SirCaptainMitch) + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Rename-DbaLogin + + .EXAMPLE + PS C:\>Rename-DbaLogin -SqlInstance localhost -Login DbaToolsUser -NewLogin captain + + SQL Login Example + + .EXAMPLE + PS C:\>Rename-DbaLogin -SqlInstance localhost -Login domain\oldname -NewLogin domain\newname + + Change the windowsuser login name. + + .EXAMPLE + PS C:\>Rename-DbaLogin -SqlInstance localhost -Login dbatoolsuser -NewLogin captain -WhatIf + + WhatIf Example + + #> + [CmdletBinding(DefaultParameterSetName = "Default", SupportsShouldProcess)] + param ( + [parameter(Mandatory)] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [parameter(Mandatory)] + [string]$Login, + [parameter(Mandatory)] + [string]$NewLogin, + [switch]$EnableException + ) + + process { + foreach ($instance in $SqlInstance) { + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $sqlcredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + $Databases = $server.Databases | Where-Object IsAccessible + $currentLogin = $server.Logins[$Login] + + if ($Pscmdlet.ShouldProcess($SqlInstance, "Changing Login name from [$Login] to [$NewLogin]")) { + try { + $dbenums = $currentLogin.EnumDatabaseMappings() + $currentLogin.rename($NewLogin) + [pscustomobject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + Database = $null + PreviousLogin = $Login + NewLogin = $NewLogin + Status = "Successful" + } + } catch { + $dbenums = $null + [pscustomobject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + Database = $null + PreviousLogin = $Login + NewLogin = $NewLogin + Status = "Failure" + } + Stop-Function -Message "Failure" -ErrorRecord $_ -Target $login + } + } + + foreach ($db in $dbenums) { + $db = $databases[$db.DBName] + $user = $db.Users[$Login] + Write-Message -Level Verbose -Message "Starting update for $db" + + if ($Pscmdlet.ShouldProcess($SqlInstance, "Changing database $db user $user from [$Login] to [$NewLogin]")) { + try { + $oldname = $user.name + $user.Rename($NewLogin) + [pscustomobject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + Database = $db.name + PreviousUser = $oldname + NewUser = $NewLogin + Status = "Successful" + } + + } catch { + Write-Message -Level Warning -Message "Rolling back update to login: $Login" + $currentLogin.rename($Login) + + [pscustomobject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + Database = $db.name + PreviousUser = $NewLogin + NewUser = $oldname + Status = "Failure to rename. Rolled back change." + } + Stop-Function -Message "Failure" -ErrorRecord $_ -Target $NewLogin + } + } + } + } + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function Repair-DbaDbMirror { + <# + .SYNOPSIS + Attempts to repair a suspended or paused mirroring database. + + .DESCRIPTION + Attempts to repair a suspended mirroring database. + + Restarts the endpoints then sets the partner to resume. See this article for more info: + + http://www.sqlservercentral.com/blogs/vivekssqlnotes/2016/09/03/how-to-resume-suspended-database-mirroring-in-sql-server-/ + + .PARAMETER SqlInstance + The target SQL Server instance or instances. This can be a collection and receive pipeline input to allow the function + to be executed against multiple SQL Server instances. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Database + The target database. + + .PARAMETER InputObject + Allows piping from Get-DbaDatabase. + + .PARAMETER WhatIf + Shows what would happen if the command were to run. No actions are actually performed. + + .PARAMETER Confirm + Prompts you for confirmation before executing any changing operations within the command. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Mirror, HA + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Repair-DbaDbMirror + + .EXAMPLE + PS C:\> Repair-DbaDbMirror -SqlInstance sql2017 -Database pubs + + Attempts to repair the mirrored but suspended pubs database on sql2017. + Restarts the endpoints then sets the partner to resume. Prompts for confirmation. + + .EXAMPLE + PS C:\> Get-DbaDatabase -SqlInstance sql2017 -Database pubs | Repair-DbaDbMirror -Confirm:$false + + Attempts to repair the mirrored but suspended pubs database on sql2017. + Restarts the endpoints then sets the partner to resume. Does not prompt for confirmation. + + #> + [CmdletBinding(SupportsShouldProcess, ConfirmImpact = 'High')] + param ( + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [string[]]$Database, + [parameter(ValueFromPipeline)] + [Microsoft.SqlServer.Management.Smo.Database[]]$InputObject, + [switch]$EnableException + ) + process { + if ((Test-Bound -ParameterName SqlInstance) -and (Test-Bound -Not -ParameterName Database)) { + Stop-Function -Message "Database is required when SqlInstance is specified" + return + } + foreach ($instance in $SqlInstance) { + $InputObject += Get-DbaDatabase -SqlInstance $instance -SqlCredential $SqlCredential -Database $Database + } + + foreach ($db in $InputObject) { + try { + Get-DbaEndpoint -SqlInstance $db.Parent | Where-Object EndpointType -eq DatabaseMirroring | Stop-DbaEndPoint + Get-DbaEndpoint -SqlInstance $db.Parent | Where-Object EndpointType -eq DatabaseMirroring | Start-DbaEndPoint + $db | Set-DbaDbMirror -State Resume + if ($Pscmdlet.ShouldProcess("console", "displaying output")) { + $db + } + } catch { + Stop-Function -Message "Failure" -ErrorRecord $_ + } + } + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function Repair-DbaDbOrphanUser { + <# + .SYNOPSIS + Finds orphan users with existing login and remaps them. + + .DESCRIPTION + An orphan user is defined by a user that does not have a matching login (Login property = ""). + + If the matching login exists it must be: + Enabled + Not a system object + Not locked + Have the same name that user + + You can drop users that does not have their matching login by specifying the parameter -RemoveNotExisting. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Database + Specifies the database(s) to process. Options for this list are auto-populated from the server. If unspecified, all databases will be processed. + + .PARAMETER ExcludeDatabase + Specifies the database(s) to exclude from processing. Options for this list are auto-populated from the server + + .PARAMETER Users + Specifies the list of usernames to repair. + + .PARAMETER Force + Forces alter schema to dbo owner so users can be dropped. + + .PARAMETER RemoveNotExisting + If this switch is enabled, all users that do not have a matching login will be dropped from the database. + + .PARAMETER WhatIf + If this switch is enabled, no actions are performed but informational messages will be displayed that explain what would happen if the command were to run. + + .PARAMETER Confirm + If this switch is enabled, you will be prompted for confirmation before executing any operations that change state. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Orphan + Author: Claudio Silva (@ClaudioESSilva) | Simone Bizzotto (@niphlod) + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Repair-DbaDbOrphanUser + + .EXAMPLE + PS C:\> Repair-DbaDbOrphanUser -SqlInstance sql2005 + + Finds and repairs all orphan users of all databases present on server 'sql2005' + + .EXAMPLE + PS C:\> Repair-DbaDbOrphanUser -SqlInstance sqlserver2014a -SqlCredential $cred + + Finds and repair all orphan users in all databases present on server 'sqlserver2014a'. SQL credentials are used to authenticate to the server. + + .EXAMPLE + PS C:\> Repair-DbaDbOrphanUser -SqlInstance sqlserver2014a -Database db1, db2 + + Finds and repairs all orphan users in both db1 and db2 databases. + + .EXAMPLE + PS C:\> Repair-DbaDbOrphanUser -SqlInstance sqlserver2014a -Database db1 -Users OrphanUser + + Finds and repairs user 'OrphanUser' in 'db1' database. + + .EXAMPLE + PS C:\> Repair-DbaDbOrphanUser -SqlInstance sqlserver2014a -Users OrphanUser + + Finds and repairs user 'OrphanUser' on all databases + + .EXAMPLE + PS C:\> Repair-DbaDbOrphanUser -SqlInstance sqlserver2014a -RemoveNotExisting + + Finds all orphan users of all databases present on server 'sqlserver2014a'. Removes all users that do not have matching Logins. + + #> + [CmdletBinding(SupportsShouldProcess)] + param ( + [parameter(Mandatory, ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [Alias("Databases")] + [object[]]$Database, + [object[]]$ExcludeDatabase, + [parameter(ValueFromPipeline)] + [object[]]$Users, + [switch]$RemoveNotExisting, + [switch]$Force, + [Alias('Silent')] + [switch]$EnableException + ) + + process { + + foreach ($instance in $SqlInstance) { + + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential + } catch { + Write-Message -Level Warning -Message "Failed to connect to: $SqlInstance." + continue + } + + $DatabaseCollection = $server.Databases | Where-Object IsAccessible + + if ($Database) { + $DatabaseCollection = $DatabaseCollection | Where-Object Name -In $Database + } + if ($ExcludeDatabase) { + $DatabaseCollection = $DatabaseCollection | Where-Object Name -NotIn $ExcludeDatabase + } + + if ($DatabaseCollection.Count -gt 0) { + foreach ($db in $DatabaseCollection) { + try { + #if SQL 2012 or higher only validate databases with ContainmentType = NONE + if ($server.versionMajor -gt 10) { + if ($db.ContainmentType -ne [Microsoft.SqlServer.Management.Smo.ContainmentType]::None) { + Write-Message -Level Warning -Message "Database '$db' is a contained database. Contained databases can't have orphaned users. Skipping validation." + Continue + } + } + + Write-Message -Level Verbose -Message "Validating users on database '$db'." + + if ($Users.Count -eq 0) { + #the third validation will remove from list sql users without login. The rule here is Sid with length higher than 16 + $UsersToWork = $db.Users | Where-Object { $_.Login -eq "" -and ($_.ID -gt 4) -and (($_.Sid.Length -gt 16 -and $_.LoginType -in @([Microsoft.SqlServer.Management.Smo.LoginType]::SqlLogin, [Microsoft.SqlServer.Management.Smo.LoginType]::Certificate)) -eq $false) } + } else { + #the fourth validation will remove from list sql users without login. The rule here is Sid with length higher than 16 + $UsersToWork = $db.Users | Where-Object { $_.Login -eq "" -and ($_.ID -gt 4) -and ($Users -contains $_.Name) -and (($_.Sid.Length -gt 16 -and $_.LoginType -in @([Microsoft.SqlServer.Management.Smo.LoginType]::SqlLogin, [Microsoft.SqlServer.Management.Smo.LoginType]::Certificate)) -eq $false) } + } + + if ($UsersToWork.Count -gt 0) { + Write-Message -Level Verbose -Message "Orphan users found" + $UsersToRemove = @() + foreach ($User in $UsersToWork) { + $ExistLogin = $server.logins | Where-Object { + $_.Isdisabled -eq $False -and + $_.IsSystemObject -eq $False -and + $_.IsLocked -eq $False -and + $_.Name -eq $User.Name + } + + if ($ExistLogin) { + if ($server.versionMajor -gt 8) { + $query = "ALTER USER " + $User + " WITH LOGIN = " + $User + } else { + $query = "exec sp_change_users_login 'update_one', '$User'" + } + + if ($Pscmdlet.ShouldProcess($db.Name, "Mapping user '$($User.Name)'")) { + $server.Databases[$db.Name].ExecuteNonQuery($query) | Out-Null + Write-Message -Level Verbose -Message "User '$($User.Name)' mapped with their login." + + [PSCustomObject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + DatabaseName = $db.Name + User = $User.Name + Status = "Success" + } + } + } else { + if ($RemoveNotExisting) { + #add user to collection + $UsersToRemove += $User + } else { + Write-Message -Level Verbose -Message "Orphan user $($User.Name) does not have matching login." + [PSCustomObject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + DatabaseName = $db.Name + User = $User.Name + Status = "No matching login" + } + } + } + } + + #With the collection complete invoke remove. + if ($RemoveNotExisting) { + if ($Force) { + if ($Pscmdlet.ShouldProcess($db.Name, "Remove-DbaDbOrphanUser")) { + Write-Message -Level Verbose -Message "Calling 'Remove-DbaDbOrphanUser' with -Force." + Remove-DbaDbOrphanUser -SqlInstance $server -Database $db.Name -User $UsersToRemove -Force + } + } else { + if ($Pscmdlet.ShouldProcess($db.Name, "Remove-DbaDbOrphanUser")) { + Write-Message -Level Verbose -Message "Calling 'Remove-DbaDbOrphanUser'." + Remove-DbaDbOrphanUser -SqlInstance $server -Database $db.Name -User $UsersToRemove + } + } + } + } else { + Write-Message -Level Verbose -Message "No orphan users found on database '$db'." + } + #reset collection + $UsersToWork = $null + } catch { + Stop-Function -Message $_ -Continue + } + } + } else { + Write-Message -Level Verbose -Message "There are no databases to analyse." + } + } + } + end { + Test-DbaDeprecation -DeprecatedOn 1.0.0 -Alias Repair-DbaOrphanUser + Test-DbaDeprecation -DeprecatedOn 1.0.0 -Alias Repair-SqlOrphanUser + } +} +function Repair-DbaServerName { + <# + .SYNOPSIS + Renames @@SERVERNAME to match with the Windows name. + + .DESCRIPTION + When a SQL Server's host OS is renamed, the SQL Server should be as well. This helps with Availability Groups and Kerberos. + + This command renames @@SERVERNAME to match with the Windows name. The new name is automatically determined. It does not matter if you use an alias to connect to the SQL instance. + + If the automatically determined new name matches the old name, the command will not run. + + https://www.mssqltips.com/sqlservertip/2525/steps-to-change-the-server-name-for-a-sql-server-machine/ + + .PARAMETER SqlInstance + The target SQL Server instance or instances. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER AutoFix + If this switch is enabled, the repair will be performed automatically. + + .PARAMETER Force + If this switch is enabled, most confirmation prompts will be skipped. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .PARAMETER WhatIf + If this switch is enabled, no actions are performed but informational messages will be displayed that explain what would happen if the command were to run. + + .PARAMETER Confirm + If this switch is enabled, you will be prompted for confirmation before executing any operations that change state. + + .NOTES + Tags: SPN + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Repair-DbaServerName + + .EXAMPLE + PS C:\> Repair-DbaServerName -SqlInstance sql2014 + + Checks to see if the server name is updatable and changes the name with a number of prompts. + + .EXAMPLE + PS C:\> Repair-DbaServerName -SqlInstance sql2014 -AutoFix + + Checks to see if the server name is updatable and automatically performs the change. Replication or mirroring will be broken if necessary. + + .EXAMPLE + PS C:\> Repair-DbaServerName -SqlInstance sql2014 -AutoFix -Force + + Checks to see if the server name is updatable and automatically performs the change, bypassing most prompts and confirmations. Replication or mirroring will be broken if necessary. + + #> + [CmdletBinding(SupportsShouldProcess, ConfirmImpact = "High")] + param ( + [parameter(Mandatory, ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [Alias("Credential")] + [PSCredential]$SqlCredential, + [switch]$AutoFix, + [switch]$Force, + [switch][Alias('Silent')] + $EnableException + ) + + begin { + if ($Force -eq $true) { + $ConfirmPreference = "None" + } + } + + process { + foreach ($instance in $SqlInstance) { + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential -MinimumVersion 9 + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + if ($server.isClustered) { + Write-Message -Level Warning -Message "$instance is a cluster. Microsoft does not support renaming clusters." + continue + } + + + # Check to see if we can easily proceed + + $nametest = Test-DbaServerName $server -EnableException | Select-Object * + $oldserverinstancename = $nametest.ServerName + $SqlInstancename = $nametest.SqlInstance + + if ($nametest.RenameRequired -eq $false) { + Stop-Function -Continue -Message "Good news! $oldserverinstancename's @@SERVERNAME does not need to be changed. If you'd like to rename it, first rename the Windows server." + } + + if (-not $nametest.updatable) { + Write-Message -Level Output -Message "Test-DbaServerName reports that the rename cannot proceed with a rename in this $instance's current state." + + foreach ($nametesterror in $nametest.Blockers) { + if ($nametesterror -like '*replication*') { + + if (-not $AutoFix) { + Stop-Function -Message "Cannot proceed because some databases are involved in replication. You can run exec sp_dropdistributor @no_checks = 1 but that may be pretty dangerous. Alternatively, you can run -AutoFix to automatically fix this issue. AutoFix will also break all database mirrors." + return + } else { + if ($Pscmdlet.ShouldProcess("console", "Prompt will appear for confirmation to break replication.")) { + $title = "You have chosen to AutoFix the blocker: replication." + $message = "We can run sp_dropdistributor which will pretty much destroy replication on this server. Do you wish to continue? (Y/N)" + $yes = New-Object System.Management.Automation.Host.ChoiceDescription "&Yes", "Will continue" + $no = New-Object System.Management.Automation.Host.ChoiceDescription "&No", "Will exit" + $options = [System.Management.Automation.Host.ChoiceDescription[]]($yes, $no) + $result = $host.ui.PromptForChoice($title, $message, $options, 1) + + if ($result -eq 1) { + Stop-Function -Message "Failure" -Target $server -ErrorRecord $_ -Continue + } else { + Write-Message -Level Output -Message "`nPerforming sp_dropdistributor @no_checks = 1." + $sql = "sp_dropdistributor @no_checks = 1" + Write-Message -Level Debug -Message $sql + try { + $null = $server.Query($sql) + } catch { + Stop-Function -Message "Failure" -Target $server -ErrorRecord $_ -Continue + } + } + } + } + } elseif ($Error -like '*mirror*') { + if ($AutoFix -eq $false) { + Stop-Function -Message "Cannot proceed because some databases are being mirrored. Stop mirroring to proceed. Alternatively, you can run -AutoFix to automatically fix this issue. AutoFix will also stop replication." -Continue + } else { + if ($Pscmdlet.ShouldProcess("console", "Prompt will appear for confirmation to break replication.")) { + $title = "You have chosen to AutoFix the blocker: mirroring." + $message = "We can run sp_dropdistributor which will pretty much destroy replication on this server. Do you wish to continue? (Y/N)" + $yes = New-Object System.Management.Automation.Host.ChoiceDescription "&Yes", "Will continue" + $no = New-Object System.Management.Automation.Host.ChoiceDescription "&No", "Will exit" + $options = [System.Management.Automation.Host.ChoiceDescription[]]($yes, $no) + $result = $host.ui.PromptForChoice($title, $message, $options, 1) + + if ($result -eq 1) { + Write-Message -Level Output -Message "Okay, moving on." + } else { + Write-Message -Level Verbose -Message "Removing Mirroring" + + foreach ($database in $server.Databases) { + if ($database.IsMirroringEnabled) { + $dbname = $database.name + + try { + Write-Message -Level Verbose -Message "Breaking mirror for $dbname." + $database.ChangeMirroringState([Microsoft.SqlServer.Management.Smo.MirroringOption]::Off) + $database.Alter() + $database.Refresh() + } catch { + Stop-Function -Message "Failure" -Target $server -ErrorRecord $_ + return + #throw "Could not break mirror for $dbname. Skipping." + } + } + } + } + } + } + } + } + } + # ^ That's embarrassing + + $instancename = $server.InstanceName + + if (-not $instancename) { + $instancename = "MSSQLSERVER" + } + + try { + $allsqlservices = Get-Service -ComputerName $instance.ComputerName -ErrorAction SilentlyContinue | Where-Object { $_.DisplayName -like "SQL*$instancename*" -and $_.Status -eq "Running" } + } catch { + Write-Message -Level Warning -Message "Can't contact $instance using Get-Service. This means the script will not be able to automatically restart SQL services." + } + + if ($nametest.Warnings.length -gt 0) { + $reportingservice = Get-Service -ComputerName $instance.ComputerName -DisplayName "SQL Server Reporting Services ($instancename)" -ErrorAction SilentlyContinue + + if ($reportingservice.Status -eq "Running") { + if ($Pscmdlet.ShouldProcess($server.name, "Reporting Services is running for this instance. Would you like to automatically stop this service?")) { + $reportingservice | Stop-Service + Write-Message -Level Warning -Message "You must reconfigure Reporting Services using Reporting Services Configuration Manager or PowerShell once the server has been successfully renamed." + } + } + } + + if ($Pscmdlet.ShouldProcess($server.name, "Performing sp_dropserver to remove the old server name, $oldserverinstancename, then sp_addserver to add $SqlInstancename")) { + $sql = "sp_dropserver '$oldserverinstancename'" + Write-Message -Level Debug -Message $sql + try { + $null = $server.Query($sql) + } catch { + Stop-Function -Message "Failure" -Target $server -ErrorRecord $_ + return + } + + $sql = "sp_addserver '$SqlInstancename', local" + Write-Message -Level Debug -Message $sql + + try { + $null = $server.Query($sql) + } catch { + Stop-Function -Message "Failure" -Target $server -ErrorRecord $_ + return + } + $renamed = $true + } + + if ($null -eq $allsqlservices) { + Write-Message -Level Warning -Message "Could not contact $($instance.ComputerName) using Get-Service. You must manually restart the SQL Server instance." + $needsrestart = $true + } else { + if ($Pscmdlet.ShouldProcess($instance.ComputerName, "Rename complete! The SQL Service must be restarted to commit the changes. Would you like to restart the $instancename instance now?")) { + try { + Write-Message -Level Verbose -Message "Stopping SQL Services for the $instancename instance" + $allsqlservices | Stop-Service -Force -WarningAction SilentlyContinue # because it reports the wrong name + Write-Message -Level Verbose -Message "Starting SQL Services for the $instancename instance." + $allsqlservices | Where-Object { $_.DisplayName -notlike "*reporting*" } | Start-Service -WarningAction SilentlyContinue # because it reports the wrong name + } catch { + Stop-Function -Message "Failure" -Target $server -ErrorRecord $_ -Continue + } + } + } + + if ($renamed -eq $true) { + Write-Message -Level Verbose -Message "$instance successfully renamed from $oldserverinstancename to $SqlInstancename." + Test-DbaServerName -SqlInstance $server + } + + if ($needsrestart -eq $true) { + Write-Message -Level Warning -Message "SQL Service restart for $SqlInstancename still required." + } + } + } +} +function Reset-DbaAdmin { + <# + .SYNOPSIS + This function allows administrators to regain access to SQL Servers in the event that passwords or access was lost. + + Supports SQL Server 2005 and above. Windows administrator access is required. + + .DESCRIPTION + This function allows administrators to regain access to local or remote SQL Servers by either resetting the sa password, adding the sysadmin role to existing login, or adding a new login (SQL or Windows) and granting it sysadmin privileges. + + This is accomplished by stopping the SQL services or SQL Clustered Resource Group, then restarting SQL via the command-line using the /mReset-DbaAdmin parameter which starts the server in Single-User mode and only allows this script to connect. + + Once the service is restarted, the following tasks are performed: + - Login is added if it doesn't exist + - If login is a Windows User, an attempt is made to ensure it exists + - If login is a SQL Login, password policy will be set to OFF when creating the login, and SQL Server authentication will be set to Mixed Mode. + - Login will be enabled and unlocked + - Login will be added to sysadmin role + + If failures occur at any point, a best attempt is made to restart the SQL Server. + + In order to make this script as portable as possible, System.Data.SqlClient and Get-WmiObject are used (as opposed to requiring the Failover Cluster Admin tools or SMO). + + If using this function against a remote SQL Server, ensure WinRM is configured and accessible. If this is not possible, run the script locally. + + Tested on Windows XP, 7, 8.1, Server 2012 and Windows Server Technical Preview 2. + Tested on SQL Server 2005 SP4 through 2016 CTP2. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. SQL Server must be 2005 and above, and can be a clustered or stand-alone instance. + + .PARAMETER SqlCredential + Instead of using Login and SecurePassword, you can just pass in a credential object. + + .PARAMETER Login + By default, the Login parameter is "sa" but any other SQL or Windows account can be specified. If a login does not currently exist, it will be added. + + When adding a Windows login to remote servers, ensure the SQL Server can add the login (ie, don't add WORKSTATION\Admin to remoteserver\instance. Domain users and Groups are valid input. + + .PARAMETER SecurePassword + By default, if a SQL Login is detected, you will be prompted for a password. Use this to securely bypass the prompt. + + .PARAMETER WhatIf + If this switch is enabled, no actions are performed but informational messages will be displayed that explain what would happen if the command were to run. + + .PARAMETER Confirm + If this switch is enabled, you will be prompted for confirmation before executing any operations that change state. + + .PARAMETER Force + If this switch is enabled, the Login(s) will be dropped and recreated on Destination. Logins that own Agent jobs cannot be dropped at this time. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: WSMan + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + Requires: Admin access to server (not SQL Services), + Remoting must be enabled and accessible if $instance is not local + + .LINK + https://dbatools.io/Reset-DbaAdmin + + .EXAMPLE + PS C:\> Reset-DbaAdmin -SqlInstance sqlcluster -SqlCredential sqladmin + + Prompts for password, then resets the "sqladmin" account password on sqlcluster. + + .EXAMPLE + PS C:\> Reset-DbaAdmin -SqlInstance sqlserver\sqlexpress -Login ad\administrator -Confirm:$false + + Adds the domain account "ad\administrator" as a sysadmin to the SQL instance. + + If the account already exists, it will be added to the sysadmin role. + + Does not prompt for a password since it is not a SQL login. Does not prompt for confirmation since -Confirm is set to $false. + + .EXAMPLE + PS C:\> Reset-DbaAdmin -SqlInstance sqlserver\sqlexpress -Login sqladmin -Force + + Skips restart confirmation, prompts for password, then adds a SQL Login "sqladmin" with sysadmin privileges. + If the account already exists, it will be added to the sysadmin role and the password will be reset. + + #> + [CmdletBinding(SupportsShouldProcess, ConfirmImpact = "High")] + [Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSAvoidUsingWMICmdlet", "", Justification = "Using Get-WmiObject for client backwards compatibilty")] + param ( + [Parameter(Mandatory)] + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter]$SqlInstance, + [pscredential]$SqlCredential, + [string]$Login = "sa", + [SecureString]$SecurePassword, + [switch]$Force, + [switch]$EnableException + ) + + begin { + Test-DbaDeprecation -DeprecatedOn "1.0.0" -EnableException:$false -Alias Reset-SqlAdmin + + #region Utility functions + function ConvertTo-PlainText { + <# + .SYNOPSIS + Internal function. + #> + [CmdletBinding()] + param ( + [Parameter(Mandatory)] + [Security.SecureString]$Password + ) + + $marshal = [Runtime.InteropServices.Marshal] + $plaintext = $marshal::PtrToStringAuto($marshal::SecureStringToBSTR($Password)) + return $plaintext + } + + function Invoke-ResetSqlCmd { + <# + .SYNOPSIS + Internal function. Executes a SQL statement against specified computer, and uses "Reset-DbaAdmin" as the Application Name. + #> + [OutputType([System.Boolean])] + [CmdletBinding()] + param ( + [Parameter(Mandatory)] + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter]$instance, + [string]$sql, + [switch]$EnableException + ) + try { + $connstring = "Data Source=$instance;Integrated Security=True;Connect Timeout=20;Application Name=Reset-DbaAdmin" + $conn = New-Object System.Data.SqlClient.SqlConnection $connstring + $conn.Open() + $cmd = New-Object system.data.sqlclient.sqlcommand($null, $conn) + $cmd.CommandText = $sql + $cmd.ExecuteNonQuery() | Out-Null + $cmd.Dispose() + $conn.Close() + $conn.Dispose() + $true + } catch { + Stop-Function -Message "Failure" -ErrorRecord $_ + } + } + #endregion Utility functions + if ($Force) { + $ConfirmPreference = "none" + } + + if ($SqlCredential) { + $Login = $SqlCredential.UserName + $SecurePassword = $SqlCredential.Password + } + } + + process { + foreach ($instance in $sqlinstance) { + $stepcounter = 0 + $baseaddress = $instance.ComputerName + # Get hostname + + if ($baseaddress.IsLocalHost) { + $ipaddr = "." + $hostname = $env:COMPUTERNAME + $baseaddress = $env:COMPUTERNAME + } + + # If server is not local, get IP address and NetBios name in case CNAME records were referenced in the SQL hostname + if ($baseaddress -ne $env:COMPUTERNAME) { + # Test for WinRM #Test-WinRM neh + winrm id -r:$baseaddress 2>$null | Out-Null + if ($LastExitCode -ne 0) { + Stop-Function -Continue -Message "Remote PowerShell access not enabled on on $instance or access denied. Quitting." + } + + # Test Connection first using ping class which requires ICMP access then failback to tcp if pings are blocked + Write-Message -Level Verbose -Message "Testing connection to $baseaddress" + $ping = New-Object System.Net.NetworkInformation.Ping + $timeout = 1000 #milliseconds + $reply = $ping.Send($baseaddress, $timeout) + if ($reply.Status -ne 'Success') { + Write-Message -Level Verbose -Message "First attempt using ICMP failed. Trying to connect using sockets. This may take up to 20 seconds." + $tcp = New-Object System.Net.Sockets.TcpClient + try { + $tcp.Connect($hostname, 135) + $tcp.Close() + $tcp.Dispose() + } catch { + Stop-Function -Continue -ErrorRecord $_ -Message "Can't connect to $baseaddress either via ping or tcp (WMI port 135)" + } + } + Write-Message -Level Verbose -Message "Resolving IP address." + try { + $hostentry = [System.Net.Dns]::GetHostEntry($baseaddress) + $ipaddr = ($hostentry.AddressList | Where-Object { + $_ -notlike '169.*' + } | Select-Object -First 1).IPAddressToString + } catch { + Stop-Function -Continue -ErrorRecord $_ -Message "Could not resolve SqlServer IP or NetBIOS name" + } + + Write-Message -Level Verbose -Message "Resolving NetBIOS name." + try { + # this is required otherwise, the ip is returned + $hostname = (Get-WmiObject -Class Win32_NetworkAdapterConfiguration -Filter IPEnabled=TRUE -ComputerName $ipaddr -ErrorAction Stop).PSComputerName + if ($null -eq $hostname) { + $hostname = (nbtstat -A $ipaddr | Where-Object { + $_ -match '\<00\> UNIQUE' + } | ForEach-Object { + $_.SubString(4, 14) + }).Trim() + } + } catch { + Stop-Function -Continue -ErrorRecord $_ -Message "Could not access remote WMI object. Check permissions and firewall." + } + } + + # Setup remote session if server is not local + if (-not $instance.IsLocalHost) { + try { + $session = New-PSSession -ComputerName $hostname -ErrorAction Stop + } catch { + Stop-Function -Continue -ErrorRecord $_ -Message "Can't access $hostname using PSSession. Check your firewall settings and ensure Remoting is enabled or run the script locally." + } + } + + Write-Message -Level Verbose -Message "Detecting login type." + # Is login a Windows login? If so, does it exist? + if ($login -match "\\") { + Write-Message -Level Verbose -Message "Windows login detected. Checking to ensure account is valid." + $windowslogin = $true + try { + if ($hostname -eq $env:COMPUTERNAME) { + $account = New-Object System.Security.Principal.NTAccount($args) + #Variable $sid marked as unused by PSScriptAnalyzer replace with $null to catch output + $null = $account.Translate([System.Security.Principal.SecurityIdentifier]) + } else { + Invoke-Command -ErrorAction Stop -Session $session -ArgumentList $login -ScriptBlock { + $account = New-Object System.Security.Principal.NTAccount($args) + #Variable $sid marked as unused by PSScriptAnalyzer replace with $null to catch output + $null = $account.Translate([System.Security.Principal.SecurityIdentifier]) + } + } + } catch { + Write-Message -Level Warning -Message "Cannot resolve Windows User or Group $login. Trying anyway." + } + } + + # If it's not a Windows login, it's a SQL login, so it needs a password. + if (-not $windowslogin -and -not $SecurePassword) { + Write-Message -Level Verbose -Message "SQL login detected" + do { + $Password = Read-Host -AsSecureString "Please enter a new password for $login" + } while ($Password.Length -eq 0) + } + + If ($SecurePassword) { + $Password = $SecurePassword + } + + # Get instance and service display name, then get services + $instancename = $null + $instancename = $instance.InstanceName + if (-not $instancename) { + $instancename = "MSSQLSERVER" + } + $displayName = "SQL Server ($instancename)" + + try { + if ($hostname -eq $env:COMPUTERNAME) { + $instanceservices = Get-Service -ErrorAction Stop | Where-Object { + $_.DisplayName -like "*($instancename)*" -and $_.Status -eq "Running" + } + $sqlservice = Get-Service -ErrorAction Stop | Where-Object DisplayName -eq "SQL Server ($instancename)" + } else { + $instanceservices = Get-Service -ComputerName $ipaddr -ErrorAction Stop | Where-Object { + $_.DisplayName -like "*($instancename)*" -and $_.Status -eq "Running" + } + $sqlservice = Get-Service -ComputerName $ipaddr -ErrorAction Stop | Where-Object DisplayName -eq "SQL Server ($instancename)" + } + } catch { + Stop-Function -Message "Cannot connect to WMI on $hostname or SQL Service does not exist. Check permissions, firewall and SQL Server running status." -ErrorRecord $_ -Target $instance + return + } + + if (-not $instanceservices) { + Stop-Function -Message "Couldn't find SQL Server instance. Check the spelling, ensure the service is running and try again." -Target $instance + return + } + + Write-Message -Level Verbose -Message "Attempting to stop SQL Services." + + # Check to see if service is clustered. Clusters don't support -m (since the cluster service + # itself connects immediately) or -f, so they are handled differently. + try { + $checkcluster = Get-Service -ComputerName $ipaddr -ErrorAction Stop | Where-Object { + $_.Name -eq "ClusSvc" -and $_.Status -eq "Running" + } + } catch { + Stop-Function -Message "Can't check services." -Target $instance -ErrorRecord $_ + return + } + + if ($null -ne $checkcluster) { + $clusterResource = Get-DbaCmObject -ClassName "MSCluster_Resource" -Namespace "root\mscluster" -ComputerName $hostname | + Where-Object { + $_.Name.StartsWith("SQL Server") -and $_.OwnerGroup -eq "SQL Server ($instancename)" + } + } + + + if ($pscmdlet.ShouldProcess($baseaddress, "Stop $instance to restart in single-user mode")) { + Write-ProgressHelper -StepNumber ($stepCounter++) -Message "Stopping $instance to restart in single-user mode" + # Take SQL Server offline so that it can be started in single-user mode + if ($clusterResource.count -gt 0) { + $isclustered = $true + try { + $clusterResource | Where-Object { + $_.Name -eq "SQL Server" + } | ForEach-Object { + $_.TakeOffline(60) + } + } catch { + $clusterResource | Where-Object { + $_.Name -eq "SQL Server" + } | ForEach-Object { + $_.BringOnline(60) + } + $clusterResource | Where-Object { + $_.Name -ne "SQL Server" + } | ForEach-Object { + $_.BringOnline(60) + } + Stop-Function -Message "Could not stop the SQL Service. Restarted SQL Service and quit." -ErrorRecord $_ -Target $instance + return + } + } else { + try { + Stop-Service -InputObject $sqlservice -Force -ErrorAction Stop + Write-Message -Level Verbose -Message "Successfully stopped SQL service." + } catch { + Start-Service -InputObject $instanceservices -ErrorAction Stop + Stop-Function -Message "Could not stop the SQL Service. Restarted SQL service and quit." -ErrorRecord $_ -Target $instance + return + } + } + } + + # /mReset-DbaAdmin Starts an instance of SQL Server in single-user mode and only allows this script to connect. + if ($pscmdlet.ShouldProcess($baseaddress, "Starting $instance in single-user mode")) { + Write-ProgressHelper -StepNumber ($stepCounter++) -Message "Starting $instance in single-user mode" + try { + if ($instance.IsLocalHost) { + $netstart = net start ""$displayname"" /mReset-DbaAdmin 2>&1 + if ("$netstart" -notmatch "success") { + Stop-Function -Message "Restart failure" -Continue + } + } else { + $netstart = Invoke-Command -ErrorAction Stop -Session $session -ArgumentList $displayname -ScriptBlock { + net start ""$args"" /mReset-DbaAdmin + } 2>&1 + foreach ($line in $netstart) { + if ($line.length -gt 0) { + Write-Message -Level Verbose -Message $line + } + } + } + } catch { + Stop-Service -InputObject $sqlservice -Force -ErrorAction SilentlyContinue + + if ($isclustered) { + $clusterResource | Where-Object Name -eq "SQL Server" | ForEach-Object { + $_.BringOnline(60) + } + $clusterResource | Where-Object Name -ne "SQL Server" | ForEach-Object { + $_.BringOnline(60) + } + } else { + Start-Service -InputObject $instanceservices -ErrorAction SilentlyContinue + } + Stop-Function -Message "Couldn't execute net start command. Restarted services and quit." -ErrorRecord $_ + return + } + } + + if ($pscmdlet.ShouldProcess($baseaddress, "Testing $instance to ensure it's back up")) { + Write-ProgressHelper -StepNumber ($stepCounter++) -Message "Testing $instance to ensure it's back up" + try { + $null = Invoke-ResetSqlCmd -instance $instance -Sql "SELECT 1" -EnableException + } catch { + try { + Start-Sleep 3 + $null = Invoke-ResetSqlCmd -instance $instance -Sql "SELECT 1" -EnableException + } catch { + Stop-Service Input-Object $sqlservice -Force -ErrorAction SilentlyContinue + if ($isclustered) { + $clusterResource | Where-Object { + $_.Name -eq "SQL Server" + } | ForEach-Object { + $_.BringOnline(60) + } + $clusterResource | Where-Object { + $_.Name -ne "SQL Server" + } | ForEach-Object { + $_.BringOnline(60) + } + } else { + Start-Service -InputObject $instanceservices -ErrorAction SilentlyContinue + } + Stop-Function -Message "Could not stop the SQL Service. Restarted SQL Service and quit." -ErrorRecord $_ + } + } + } + + # Get login. If it doesn't exist, create it. + if ($pscmdlet.ShouldProcess($instance, "Adding login $login if it doesn't exist")) { + Write-ProgressHelper -StepNumber ($stepCounter++) -Message "Adding login $login if it doesn't exist" + if ($windowslogin) { + $sql = "IF NOT EXISTS (SELECT name FROM master.sys.server_principals WHERE name = '$login') + BEGIN CREATE LOGIN [$login] FROM WINDOWS END" + if (-not (Invoke-ResetSqlCmd -instance $instance -Sql $sql)) { + Write-Message -Level Warning -Message "Couldn't create Windows login." + } + + } elseif ($login -ne "sa") { + # Create new sql user + $sql = "IF NOT EXISTS (SELECT name FROM master.sys.server_principals WHERE name = '$login') + BEGIN CREATE LOGIN [$login] WITH PASSWORD = '$(ConvertTo-PlainText $Password)', CHECK_POLICY = OFF, CHECK_EXPIRATION = OFF END" + if (-not (Invoke-ResetSqlCmd -instance $instance -Sql $sql)) { + Write-Message -Level Warning -Message "Couldn't create SQL login." + } + } + } + + + # If $login is a SQL Login, Mixed mode authentication is required. + if ($windowslogin -ne $true) { + if ($pscmdlet.ShouldProcess($instance, "Enabling mixed mode authentication for $login and ensuring account is unlocked")) { + Write-ProgressHelper -StepNumber ($stepCounter++) -Message "Enabling mixed mode authentication for $login and ensuring account is unlocked" + $sql = "EXEC xp_instance_regwrite N'HKEY_LOCAL_MACHINE', N'Software\Microsoft\MSSQLServer\MSSQLServer', N'LoginMode', REG_DWORD, 2" + if (-not (Invoke-ResetSqlCmd -instance $instance -Sql $sql)) { + Write-Message -Level Warning -Message "Couldn't set to Mixed Mode." + } + + $sql = "ALTER LOGIN [$login] WITH CHECK_POLICY = OFF + ALTER LOGIN [$login] WITH PASSWORD = '$(ConvertTo-PlainText $Password)' UNLOCK" + if (-not (Invoke-ResetSqlCmd -instance $instance -Sql $sql)) { + Write-Message -Level Warning -Message "Couldn't unlock account." + } + } + } + + if ($pscmdlet.ShouldProcess($instance, "Enabling $login")) { + Write-ProgressHelper -StepNumber ($stepCounter++) -Message "Ensuring login is enabled" + $sql = "ALTER LOGIN [$login] ENABLE" + if (-not (Invoke-ResetSqlCmd -instance $instance -Sql $sql)) { + Write-Message -Level Warning -Message "Couldn't enable login." + } + } + + if ($login -ne "sa") { + if ($pscmdlet.ShouldProcess($instance, "Ensuring $login exists within sysadmin role")) { + Write-ProgressHelper -StepNumber ($stepCounter++) -Message "Ensuring $login exists within sysadmin role" + $sql = "EXEC sp_addsrvrolemember '$login', 'sysadmin'" + if (-not (Invoke-ResetSqlCmd -instance $instance -Sql $sql)) { + Write-Message -Level Warning -Message "Couldn't add to sysadmin role." + } + } + } + + if ($pscmdlet.ShouldProcess($instance, "Finished with login tasks. Restarting")) { + Write-ProgressHelper -StepNumber ($stepCounter++) -Message "Finished with login tasks. Restarting." + try { + Stop-Service -InputObject $sqlservice -Force -ErrorAction Stop + if ($isclustered -eq $true) { + $clusterResource | Where-Object Name -eq "SQL Server" | ForEach-Object { + $_.BringOnline(60) + } + $clusterResource | Where-Object Name -ne "SQL Server" | ForEach-Object { + $_.BringOnline(60) + } + } else { + Start-Service -InputObject $instanceservices -ErrorAction Stop + } + } catch { + Stop-Function -Message "Failure" -ErrorRecord $_ + } + } + + if ($pscmdlet.ShouldProcess($instance, "Logging in to get account information")) { + Write-ProgressHelper -StepNumber ($stepCounter++) -Message "Logging in to get account information" + if ($securePassword) { + $cred = New-Object System.Management.Automation.PSCredential ($Login, $securePassword) + Get-DbaLogin -SqlInstance $instance -SqlCredential $cred -Login $Login + } elseif ($SqlCredential) { + Get-DbaLogin -SqlInstance $instance -SqlCredential $SqlCredential -Login $Login + } else { + try { + Get-DbaLogin -SqlInstance $instance -SqlCredential $SqlCredential -Login $Login -EnableException + } catch { + Stop-Function -Message "Password not supplied, tried logging in with Integrated authentication and it failed. Either way, $Login should work now on $instance." -Continue + } + } + } + + } + } + end { + Write-Message -Level Verbose -Message "Script complete!" + } +} +function Resolve-DbaNetworkName { + <# + .SYNOPSIS + Returns information about the network connection of the target computer including NetBIOS name, IP Address, domain name and fully qualified domain name (FQDN). + + .DESCRIPTION + Retrieves the IPAddress, ComputerName from one computer. + The object can be used to take action against its name or IPAddress. + + First ICMP is used to test the connection, and get the connected IPAddress. + + Multiple protocols (e.g. WMI, CIM, etc) are attempted before giving up. + + Important: Remember that FQDN doesn't always match "ComputerName dot Domain" as AD intends. + There are network setup (google "disjoint domain") where AD and DNS do not match. + "Full computer name" (as reported by sysdm.cpl) is the only match between the two, + and it matches the "DNSHostName" property of the computer object stored in AD. + This means that the notation of FQDN that matches "ComputerName dot Domain" is incorrect + in those scenarios. + In other words, the "suffix" of the FQDN CAN be different from the AD Domain. + + This cmdlet has been providing good results since its inception but for lack of useful + names some doubts may arise. + Let this clear the doubts: + - InputName: whatever has been passed in + - ComputerName: hostname only + - IPAddress: IP Address + - DNSHostName: hostname only, coming strictly from DNS (as reported from the calling computer) + - DNSDomain: domain only, coming strictly from DNS (as reported from the calling computer) + - Domain: domain only, coming strictly from AD (i.e. the domain the ComputerName is joined to) + - DNSHostEntry: Fully name as returned by DNS [System.Net.Dns]::GetHostEntry + - FQDN: "legacy" notation of ComputerName "dot" Domain (coming from AD) + - FullComputerName: Full name as configured from within the Computer (i.e. the only secure match between AD and DNS) + + So, if you need to use something, go with FullComputerName, always, as it is the most correct in every scenario. + + .PARAMETER ComputerName + The target SQL Server instance or instances. + This can be the name of a computer, a SMO object, an IP address or a SQL Instance. + + .PARAMETER Credential + Credential object used to connect to the SQL Server as a different user + + .PARAMETER Turbo + Resolves without accessing the server itself. Faster but may be less accurate because it relies on DNS only, + so it may fail spectacularly for disjoin-domain setups. Also, everyone has its own DNS (i.e. results may vary + changing the computer where the function runs) + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Network, Resolve + Author: Klaas Vandenberghe (@PowerDBAKlaas) | Simone Bizzotto (@niphold) + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Resolve-DbaNetworkName + + .EXAMPLE + PS C:\> Resolve-DbaNetworkName -ComputerName ServerA + + Returns a custom object displaying InputName, ComputerName, IPAddress, DNSHostName, DNSDomain, Domain, DNSHostEntry, FQDN, DNSHostEntry for ServerA + + .EXAMPLE + PS C:\> Resolve-DbaNetworkName -SqlInstance sql2016\sqlexpress + + Returns a custom object displaying InputName, ComputerName, IPAddress, DNSHostName, DNSDomain, Domain, DNSHostEntry, FQDN, DNSHostEntry for the SQL instance sql2016\sqlexpress + + .EXAMPLE + PS C:\> Resolve-DbaNetworkName -SqlInstance sql2016\sqlexpress, sql2014 + + Returns a custom object displaying InputName, ComputerName, IPAddress, DNSHostName, DNSDomain, Domain, DNSHostEntry, FQDN, DNSHostEntry for the SQL instance sql2016\sqlexpress and sql2014 + + .EXAMPLE + PS C:\> Get-DbaCmsRegServer -SqlInstance sql2014 | Resolve-DbaNetworkName + + Returns a custom object displaying InputName, ComputerName, IPAddress, DNSHostName, Domain, FQDN for all SQL Servers returned by Get-DbaCmsRegServer + + #> + [CmdletBinding()] + param ( + [parameter(ValueFromPipeline)] + [Alias('cn', 'host', 'ServerInstance', 'Server', 'SqlInstance')] + [DbaInstanceParameter[]]$ComputerName = $env:COMPUTERNAME, + [PSCredential]$Credential, + [Alias('FastParrot')] + [switch]$Turbo, + [Alias('Silent')] + [switch]$EnableException + ) + begin { + Function Get-ComputerDomainName { + Param ( + $FQDN, + $ComputerName + ) + # deduce the domain name based on resolved name + original request + if ($fqdn -notmatch "\.") { + if ($ComputerName -match "\.") { + return $ComputerName.Substring($ComputerName.IndexOf(".") + 1) + } else { + return "$env:USERDNSDOMAIN".ToLower() + } + } else { + return $fqdn.Substring($fqdn.IndexOf(".") + 1) + } + } + } + process { + if (-not (Test-Windows -NoWarn)) { + Write-Message -Level Verbose -Message "Non-Windows client detected. Turbo (DNS resolution only) set to $true" + $Turbo = $true + } + + foreach ($computer in $ComputerName) { + if ($computer.IsLocalhost) { + $cName = $env:COMPUTERNAME + } else { + $cName = $computer.ComputerName + } + + # resolve IP address + try { + Write-Message -Level VeryVerbose -Message "Resolving $cName using .NET.Dns GetHostEntry" + $resolved = [System.Net.Dns]::GetHostEntry($cName) + $ipaddresses = $resolved.AddressList | Sort-Object -Property AddressFamily # prioritize IPv4 + $ipaddress = $ipaddresses[0].IPAddressToString + } catch { + Stop-Function -Message "DNS name $cName not found" -Continue -ErrorRecord $_ + } + + # try to resolve IP into a hostname + try { + Write-Message -Level VeryVerbose -Message "Resolving $ipaddress using .NET.Dns GetHostByAddress" + $fqdn = [System.Net.Dns]::GetHostByAddress($ipaddress).HostName + } catch { + Write-Message -Level Debug -Message "Failed to resolve $ipaddress using .NET.Dns GetHostByAddress" + $fqdn = $resolved.HostName + } + + $dnsDomain = Get-ComputerDomainName -FQDN $fqdn -ComputerName $cName + # augment fqdn if needed + if ($fqdn -notmatch "\." -and $dnsDomain) { + $fqdn = "$fqdn.$dnsdomain" + } + $hostname = $fqdn.Split(".")[0] + + # create an output object with some preliminary data gathered so far + $result = [PSCustomObject]@{ + InputName = $computer + ComputerName = $hostname.ToUpper() + IPAddress = $ipaddress + DNSHostname = $hostname + DNSDomain = $dnsdomain + Domain = $dnsdomain + DNSHostEntry = $fqdn + FQDN = $fqdn + FullComputerName = $cName + } + if ($Turbo) { + # that's a finish line for a Turbo mode + return $result + } + + # finding out which IP to use by pinging all of them. The first to respond is the one. + $ping = New-Object System.Net.NetworkInformation.Ping + $timeout = 1000 #milliseconds + foreach ($ip in $ipaddresses) { + $reply = $ping.Send($ip, $timeout) + if ($reply.Status -eq 'Success') { + $ipaddress = $ip.IPAddressToString + break + } + } + $result.IPAddress = $ipaddress + + # re-try DNS reverse zone lookup if the IP to use is not the first one + if ($ipaddresses[0].IPAddressToString -ne $ipaddress) { + try { + Write-Message -Level VeryVerbose -Message "Resolving $ipaddress using .NET.Dns GetHostByAddress" + $fqdn = [System.Net.Dns]::GetHostByAddress($ipaddress).HostName + # re-adjust DNS domain again + $dnsDomain = Get-ComputerDomainName -FQDN $fqdn -ComputerName $cName + # augment fqdn if needed + if ($fqdn -notmatch "\." -and $dnsDomain) { + $fqdn = "$fqdn.$dnsdomain" + } + $hostname = $fqdn.Split(".")[0] + + # update result fields accordingly + $result.ComputerName = $hostname.ToUpper() + $result.DNSHostname = $hostname + $result.DNSDomain = $dnsdomain + $result.Domain = $dnsdomain + $result.DNSHostEntry = $fqdn + $result.FQDN = $fqdn + } catch { + Write-Message -Level VeryVerbose -Message "Failed to obtain a new name from $ipaddress, re-using $fqdn" + } + } + + + Write-Message -Level Debug -Message "Getting domain name from the remote host $fqdn" + try { + $ScBlock = { + return [System.Net.NetworkInformation.IPGlobalProperties]::GetIPGlobalProperties().DomainName + } + $cParams = @{ + ComputerName = $cName + } + if ($Credential) { $cParams.Credential = $Credential } + + $conn = Get-DbaCmObject @cParams -ClassName win32_ComputerSystem -EnableException + if ($conn) { + # update results accordingly + $result.ComputerName = $conn.Name + $dnsHostname = $conn.DNSHostname + $dnsDomain = $conn.Domain + $result.FQDN = "$dnsHostname.$dnsDomain".TrimEnd('.') + $result.DNSHostName = $dnsHostname + $result.Domain = $dnsDomain + } + try { + Write-Message -Level Debug -Message "Getting DNS domain from the remote host $($cParams.ComputerName)" + $dnsSuffix = Invoke-Command2 @cParams -ScriptBlock $ScBlock -ErrorAction Stop -Raw + $result.DNSDomain = $dnsSuffix + if ($dnsSuffix) { + $fullComputerName = $result.DNSHostName + "." + $dnsSuffix + } else { + $fullComputerName = $result.DNSHostName + } + $result.FullComputerName = $fullComputerName + } catch { + Write-Message -Level Verbose -Message "Unable to get DNS domain information from $($cParams.ComputerName)" + } + } catch { + Write-Message -Level Verbose -Message "Unable to get domain name from $($cParams.ComputerName)" + } + + # getting a DNS host entry for the full name + try { + Write-Message -Level VeryVerbose -Message "Resolving $($result.FullComputerName) using .NET.Dns GetHostEntry" + $result.DNSHostEntry = ([System.Net.Dns]::GetHostEntry($result.FullComputerName)).HostName + } catch { + Write-Message -Level Verbose -Message ".NET.Dns GetHostEntry failed for $($result.FullComputerName)" + } + + # returning the final result + return $result + } + } +} +function Restart-DbaService { + <# + .SYNOPSIS + Restarts SQL Server services on a computer. + + .DESCRIPTION + Restarts the SQL Server related services on one or more computers. Will follow SQL Server service dependencies. + + Requires Local Admin rights on destination computer(s). + + .PARAMETER ComputerName + The target SQL Server instance or instances. + + .PARAMETER InstanceName + Only affects services that belong to the specific instances. + + .PARAMETER Credential + Credential object used to connect to the computer as a different user. + + .PARAMETER Type + Use -Type to collect only services of the desired SqlServiceType. + Can be one of the following: "Agent","Browser","Engine","FullText","SSAS","SSIS","SSRS" + + .PARAMETER Timeout + How long to wait for the start/stop request completion before moving on. Specify 0 to wait indefinitely. + + .PARAMETER InputObject + A collection of services from Get-DbaService + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .PARAMETER WhatIf + Shows what would happen if the cmdlet runs. The cmdlet is not run. + + .PARAMETER Confirm + Prompts you for confirmation before running the cmdlet. + + .PARAMETER Force + Will stop dependent SQL Server agents when stopping Engine services. + + .NOTES + Tags: Service, Instance, Restart + Author: Kirill Kravtsov (@nvarscar) + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + Requires Local Admin rights on destination computer(s). + + .LINK + https://dbatools.io/Restart-DbaService + + .EXAMPLE + PS C:\> Restart-DbaService -ComputerName sqlserver2014a + + Restarts the SQL Server related services on computer sqlserver2014a. + + .EXAMPLE + PS C:\> 'sql1','sql2','sql3'| Get-DbaService | Restart-DbaService + + Gets the SQL Server related services on computers sql1, sql2 and sql3 and restarts them. + + .EXAMPLE + PS C:\> Restart-DbaService -ComputerName sql1,sql2 -InstanceName MSSQLSERVER + + Restarts the SQL Server services related to the default instance MSSQLSERVER on computers sql1 and sql2. + + .EXAMPLE + PS C:\> Restart-DbaService -ComputerName $MyServers -Type SSRS + + Restarts the SQL Server related services of type "SSRS" (Reporting Services) on computers in the variable MyServers. + + .EXAMPLE + PS C:\> Restart-DbaService -ComputerName sql1 -Type Engine -Force + + Restarts SQL Server database engine services on sql1 forcing dependent SQL Server Agent services to restart as well. + + #> + [CmdletBinding(DefaultParameterSetName = "Server", SupportsShouldProcess)] + param ( + [Parameter(ParameterSetName = "Server", Position = 1)] + [Alias("cn", "host", "Server")] + [DbaInstanceParameter[]]$ComputerName = $env:COMPUTERNAME, + [Alias("Instance")] + [string[]]$InstanceName, + [ValidateSet("Agent", "Browser", "Engine", "FullText", "SSAS", "SSIS", "SSRS")] + [string[]]$Type, + [parameter(ValueFromPipeline, Mandatory, ParameterSetName = "Service")] + [Alias("ServiceCollection")] + [object[]]$InputObject, + [int]$Timeout = 60, + [PSCredential]$Credential, + [switch]$Force, + [Alias('Silent')] + [switch]$EnableException + ) + begin { + $processArray = @() + if ($PsCmdlet.ParameterSetName -eq "Server") { + $serviceParams = @{ ComputerName = $ComputerName } + if ($InstanceName) { $serviceParams.InstanceName = $InstanceName } + if ($Type) { $serviceParams.Type = $Type } + if ($Credential) { $serviceParams.Credential = $Credential } + if ($EnableException) { $serviceParams.Silent = $EnableException } + $InputObject = Get-DbaService @serviceParams + } + } + process { + #Get all the objects from the pipeline before proceeding + $processArray += $InputObject + } + end { + $processArray = [array]($processArray | Where-Object { (!$InstanceName -or $_.InstanceName -in $InstanceName) -and (!$Type -or $_.ServiceType -in $Type) }) + foreach ($service in $processArray) { + if ($Force -and $service.ServiceType -eq 'Engine' -and !($processArray | Where-Object { $_.ServiceType -eq 'Agent' -and $_.InstanceName -eq $service.InstanceName -and $_.ComputerName -eq $service.ComputerName })) { + Write-Message -Level Verbose -Message "Adding Agent service to the list for service $($service.ServiceName) on $($service.ComputerName), since -Force has been specified" + #Construct parameters to call Get-DbaService + $serviceParams = @{ + ComputerName = $service.ComputerName + InstanceName = $service.InstanceName + Type = 'Agent' + } + if ($Credential) { $serviceParams.Credential = $Credential } + if ($EnableException) { $serviceParams.Silent = $EnableException } + $processArray += @(Get-DbaService @serviceParams) + } + } + if ($processArray) { + if ($PSCmdlet.ShouldProcess("$ProcessArray", "Restarting Service")) { + $services = Update-ServiceStatus -InputObject $processArray -Action 'stop' -Timeout $Timeout -EnableException $EnableException + foreach ($service in ($services | Where-Object { $_.Status -eq 'Failed'})) { + $service + } + $services = $services | Where-Object { $_.Status -eq 'Successful'} + if ($services) { + Update-ServiceStatus -InputObject $services -Action 'restart' -Timeout $Timeout -EnableException $EnableException + } + } + } else { + Stop-Function -EnableException $EnableException -Message "No SQL Server services found with current parameters." + } + + Test-DbaDeprecation -DeprecatedOn "1.0.0" -EnableException:$false -Alias Restart-DbaSqlService + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function Restore-DbaBackupFromDirectory { + <# + .SYNOPSIS + Please use `Get-ChildItem | Restore-DbaDatabase` instead. This command is no longer supported. + + .DESCRIPTION + Please use `Get-ChildItem | Restore-DbaDatabase` instead. This command is no longer supported. + + .PARAMETER SqlInstance + The SQL Server instance to which you will be restoring the database. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Path + Specifies the full path to the directory that contains the database backups. The SQL Server service must have read access to this path. + + .PARAMETER ReuseSourceFolderStructure + If this switch is enabled, the folder structure used on the instance where the backup was made will be recreated. By default, the database files will be restored to the default data and log directories for the instance you're restoring onto. + + .PARAMETER NoRecovery + If this switch is enabled, the database is left in the No Recovery state to enable further backups to be added. + + .PARAMETER Force + If this switch is enabled, any existing database matching the name of a database being restored will be overwritten. + + .PARAMETER WhatIf + If this switch is enabled, no actions are performed but informational messages will be displayed that explain what would happen if the command were to run. + + .PARAMETER Confirm + If this switch is enabled, you will be prompted for confirmation before executing any operations that change state. + + .NOTES + Tags: DisasterRecovery, Backup, Restore + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Restore-SqlBackupFromDirectory + + .EXAMPLE + PS C:\> Restore-SqlBackupFromDirectory -SqlInstance sqlcluster -Path \\fileserver\share\sqlbackups\SQLSERVER2014A + + All user databases contained within \\fileserver\share\sqlbackups\SQLSERVERA will be restored to sqlcluster, down the most recent full/differential/logs. + + #> + #Requires -Version 3.0 + [CmdletBinding()] + param ( + [parameter(Mandatory)] + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter]$SqlInstance, + [parameter(Mandatory)] + [string]$Path, + [switch]$NoRecovery, + [Alias("ReuseFolderStructure")] + [switch]$ReuseSourceFolderStructure, + [PSCredential]$SqlCredential, + [switch]$Force + ) + + Write-Message -Level Warning -Message "This command is no longer supported. Please use Get-ChildItem | Restore-DbaDatabase instead" +} +function Restore-DbaDatabase { + <# + .SYNOPSIS + Restores a SQL Server Database from a set of backup files + + .DESCRIPTION + Upon being passed a list of potential backups files this command will scan the files, select those that contain SQL Server + backup sets. It will then filter those files down to a set that can perform the requested restore, checking that we have a + full restore chain to the point in time requested by the caller. + + The function defaults to working on a remote instance. This means that all paths passed in must be relative to the remote instance. + XpDirTree will be used to perform the file scans + + Various means can be used to pass in a list of files to be considered. The default is to non recursively scan the folder + passed in. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. + + .PARAMETER SqlCredential + Allows you to login to servers using SQL Logins as opposed to Windows Auth/Integrated/Trusted. + + .PARAMETER Path + Path to SQL Server backup files. + + Paths passed in as strings will be scanned using the desired method, default is a non recursive folder scan + Accepts multiple paths separated by ',' + + Or it can consist of FileInfo objects, such as the output of Get-ChildItem or Get-Item. This allows you to work with + your own file structures as needed + + .PARAMETER DatabaseName + Name to restore the database under. + Only works with a single database restore. If multiple database are found in the provided paths then we will exit + + .PARAMETER DestinationDataDirectory + Path to restore the SQL Server backups to on the target instance. + If only this parameter is specified, then all database files (data and log) will be restored to this location + + .PARAMETER DestinationLogDirectory + Path to restore the database log files to. + This parameter can only be specified alongside DestinationDataDirectory. + + .PARAMETER DestinationFileStreamDirectory + Path to restore FileStream data to + This parameter can only be specified alongside DestinationDataDirectory + + .PARAMETER RestoreTime + Specify a DateTime object to which you want the database restored to. Default is to the latest point available in the specified backups + + .PARAMETER NoRecovery + Indicates if the databases should be recovered after last restore. Default is to recover + + .PARAMETER WithReplace + Switch indicated is the restore is allowed to replace an existing database. + + .PARAMETER XpDirTree + Switch that indicated file scanning should be performed by the SQL Server instance using xp_dirtree + This will scan recursively from the passed in path + You must have sysadmin role membership on the instance for this to work. + + .PARAMETER OutputScriptOnly + Switch indicates that ONLY T-SQL scripts should be generated, no restore takes place + + .PARAMETER VerifyOnly + Switch indicate that restore should be verified + + .PARAMETER MaintenanceSolutionBackup + Switch to indicate the backup files are in a folder structure as created by Ola Hallengreen's maintenance scripts. + This switch enables a faster check for suitable backups. Other options require all files to be read first to ensure we have an anchoring full backup. Because we can rely on specific locations for backups performed with OlaHallengren's backup solution, we can rely on file locations. + + .PARAMETER FileMapping + A hashtable that can be used to move specific files to a location. + `$FileMapping = @{'DataFile1'='c:\restoredfiles\Datafile1.mdf';'DataFile3'='d:\DataFile3.mdf'}` + And files not specified in the mapping will be restored to their original location + This Parameter is exclusive with DestinationDataDirectory + + .PARAMETER IgnoreLogBackup + This switch tells the function to ignore transaction log backups. The process will restore to the latest full or differential backup point only + + .PARAMETER UseDestinationDefaultDirectories + Switch that tells the restore to use the default Data and Log locations on the target server. If they don't exist, the function will try to create them + + .PARAMETER ReuseSourceFolderStructure + By default, databases will be migrated to the destination Sql Server's default data and log directories. You can override this by specifying -ReuseSourceFolderStructure. + The same structure on the SOURCE will be kept exactly, so consider this if you're migrating between different versions and use part of Microsoft's default Sql structure (MSSql12.INSTANCE, etc) + + *Note, to reuse destination folder structure, specify -WithReplace + + .PARAMETER DestinationFilePrefix + This value will be prefixed to ALL restored files (log and data). This is just a simple string prefix. If you want to perform more complex rename operations then please use the FileMapping parameter + + This will apply to all file move options, except for FileMapping + + .PARAMETER DestinationFileSuffix + This value will be suffixed to ALL restored files (log and data). This is just a simple string suffix. If you want to perform more complex rename operations then please use the FileMapping parameter + + This will apply to all file move options, except for FileMapping + + .PARAMETER RestoredDatabaseNamePrefix + A string which will be prefixed to the start of the restore Database's Name + Useful if restoring a copy to the same sql server for testing. + + .PARAMETER TrustDbBackupHistory + This switch can be used when piping the output of Get-DbaBackupHistory or Backup-DbaDatabase into this command. + It allows the user to say that they trust that the output from those commands is correct, and skips the file header read portion of the process. This means a faster process, but at the risk of not knowing till halfway through the restore that something is wrong with a file. + + .PARAMETER MaxTransferSize + Parameter to set the unit of transfer. Values must be a multiple by 64kb + + .PARAMETER Blocksize + Specifies the block size to use. Must be one of 0.5kb,1kb,2kb,4kb,8kb,16kb,32kb or 64kb + Can be specified in bytes + Refer to https://msdn.microsoft.com/en-us/library/ms178615.aspx for more detail + + .PARAMETER BufferCount + Number of I/O buffers to use to perform the operation. + Refer to https://msdn.microsoft.com/en-us/library/ms178615.aspx for more detail + + .PARAMETER XpNoRecurse + If specified, prevents the XpDirTree process from recursing (its default behaviour) + + .PARAMETER DirectoryRecurse + If specified the specified directory will be recursed into + + .PARAMETER Continue + If specified we will to attempt to recover more transaction log backups onto database(s) in Recovering or Standby states + + .PARAMETER StandbyDirectory + If a directory is specified the database(s) will be restored into a standby state, with the standby file placed into this directory (which must exist, and be writable by the target Sql Server instance) + + .PARAMETER AzureCredential + The name of the SQL Server credential to be used if restoring from an Azure hosted backup using Storage Access Keys + If a backup path beginning http is passed in and this parameter is not specified then if a credential with a name matching the URL + + .PARAMETER ReplaceDbNameInFile + If switch set and occurrence of the original database's name in a data or log file will be replace with the name specified in the DatabaseName parameter + + .PARAMETER Recover + If set will perform recovery on the indicated database + + .PARAMETER GetBackupInformation + Passing a string value into this parameter will cause a global variable to be created holding the output of Get-DbaBackupInformation + + .PARAMETER SelectBackupInformation + Passing a string value into this parameter will cause a global variable to be created holding the output of Select-DbaBackupInformation + + .PARAMETER FormatBackupInformation + Passing a string value into this parameter will cause a global variable to be created holding the output of Format-DbaBackupInformation + + .PARAMETER TestBackupInformation + Passing a string value into this parameter will cause a global variable to be created holding the output of Test-DbaBackupInformation + + .PARAMETER StopAfterGetBackupInformation + Switch which will cause the function to exit after returning GetBackupInformation + + .PARAMETER StopAfterSelectBackupInformation + Switch which will cause the function to exit after returning SelectBackupInformation + + .PARAMETER StopAfterFormatBackupInformation + Switch which will cause the function to exit after returning FormatBackupInformation + + .PARAMETER StopAfterTestBackupInformation + Switch which will cause the function to exit after returning TestBackupInformation + + .PARAMETER StatementTimeOut + Timeout in minutes. Defaults to infinity (restores can take a while.) + + .PARAMETER KeepCDC + Indicates whether CDC information should be restored as part of the database + + .PARAMETER PageRestore + Passes in an object from Get-DbaSuspectPages containing suspect pages from a single database. + Setting this Parameter will cause an Online Page restore if the target Instance is Enterprise Edition, or offline if not. + This will involve taking a tail log backup, so you must check your restore chain once it has completed + + .PARAMETER PageRestoreTailFolder + This parameter passes in a location for the tail log backup required for page level restore + + .PARAMETER AllowContinue + This parameter has been deprecated and will be removed in v1.0 + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .PARAMETER Confirm + Prompts to confirm certain actions + + .PARAMETER WhatIf + Shows what would happen if the command would execute, but does not actually perform the command + + .NOTES + Tags: DisasterRecovery, Backup, Restore + Author: Stuart Moore (@napalmgram), stuart-moore.com + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Restore-DbaDatabase + + .EXAMPLE + PS C:\> Restore-DbaDatabase -SqlInstance server1\instance1 -Path \\server2\backups + + Scans all the backup files in \\server2\backups, filters them and restores the database to server1\instance1 + + .EXAMPLE + PS C:\> Restore-DbaDatabase -SqlInstance server1\instance1 -Path \\server2\backups -MaintenanceSolutionBackup -DestinationDataDirectory c:\restores + + Scans all the backup files in \\server2\backups$ stored in an Ola Hallengren style folder structure, + filters them and restores the database to the c:\restores folder on server1\instance1 + + .EXAMPLE + PS C:\> Get-ChildItem c:\SQLbackups1\, \\server\sqlbackups2 | Restore-DbaDatabase -SqlInstance server1\instance1 + + Takes the provided files from multiple directories and restores them on server1\instance1 + + .EXAMPLE + PS C:\> $RestoreTime = Get-Date('11:19 23/12/2016') + PS C:\> Restore-DbaDatabase -SqlInstance server1\instance1 -Path \\server2\backups -MaintenanceSolutionBackup -DestinationDataDirectory c:\restores -RestoreTime $RestoreTime + + Scans all the backup files in \\server2\backups stored in an Ola Hallengren style folder structure, + filters them and restores the database to the c:\restores folder on server1\instance1 up to 11:19 23/12/2016 + + .EXAMPLE + PS C:\> $result = Restore-DbaDatabase -SqlInstance server1\instance1 -Path \\server2\backups -DestinationDataDirectory c:\restores -OutputScriptOnly + PS C:\> $result | Select-Object -ExpandProperty Tsql | Out-File -Filepath c:\scripts\restore.sql + + Scans all the backup files in \\server2\backups stored in an Ola Hallengren style folder structure, + filters them and generate the T-SQL Scripts to restore the database to the latest point in time, + and then stores the output in a file for later retrieval + + .EXAMPLE + PS C:\> Restore-DbaDatabase -SqlInstance server1\instance1 -Path c:\backups -DestinationDataDirectory c:\DataFiles -DestinationLogDirectory c:\LogFile + + Scans all the files in c:\backups and then restores them onto the SQL Server Instance server1\instance1, placing data files + c:\DataFiles and all the log files into c:\LogFiles + + .EXAMPLE + PS C:\> Restore-DbaDatabase -SqlInstance server1\instance1 -Path http://demo.blob.core.windows.net/backups/dbbackup.bak -AzureCredential MyAzureCredential + + Will restore the backup held at http://demo.blob.core.windows.net/backups/dbbackup.bak to server1\instance1. The connection to Azure will be made using the + credential MyAzureCredential held on instance Server1\instance1 + + .EXAMPLE + PS C:\> Restore-DbaDatabase -SqlInstance server1\instance1 -Path http://demo.blob.core.windows.net/backups/dbbackup.bak + + Will attempt to restore the backups from http://demo.blob.core.windows.net/backups/dbbackup.bak if a SAS credential with the name http://demo.blob.core.windows.net/backups exists on server1\instance1 + + .EXAMPLE + PS C:\> $File = Get-ChildItem c:\backups, \\server1\backups -recurse + PS C:\> $File | Restore-DbaDatabase -SqlInstance Server1\Instance -UseDestinationDefaultDirectories + + This will take all of the files found under the folders c:\backups and \\server1\backups, and pipeline them into + Restore-DbaDatabase. Restore-DbaDatabase will then scan all of the files, and restore all of the databases included + to the latest point in time covered by their backups. All data and log files will be moved to the default SQL Server + folder for those file types as defined on the target instance. + + .EXAMPLE + PS C:\> $files = Get-ChildItem C:\dbatools\db1 + PS C:\> $params = @{ + >> SqlInstance = 'server\instance1' + >> DestinationFilePrefix = 'prefix' + >> DatabaseName ='Restored' + >> RestoreTime = (get-date "14:58:30 22/05/2017") + >> NoRecovery = $true + >> WithReplace = $true + >> StandbyDirectory = 'C:\dbatools\standby' + >> } + >> + PS C:\> $files | Restore-DbaDatabase @params + PS C:\> Invoke-DbaQuery -SQLInstance server\instance1 -Query "select top 1 * from Restored.dbo.steps order by dt desc" + PS C:\> $params.RestoredTime = (get-date "15:09:30 22/05/2017") + PS C:\> $params.NoRecovery = $false + PS C:\> $params.Add("Continue",$true) + PS C:\> $files | Restore-DbaDatabase @params + PS C:\> Invoke-DbaQuery -SQLInstance server\instance1 -Query "select top 1 * from restored.dbo.steps order by dt desc" + PS C:\> Restore-DbaDatabase -SqlInstance server\instance1 -DestinationFilePrefix prefix -DatabaseName Restored -Continue -WithReplace + + In this example we step through the backup files held in c:\dbatools\db1 folder. + First we restore the database to a point in time in standby mode. This means we can check some details in the databases + We then roll it on a further 9 minutes to perform some more checks + And finally we continue by rolling it all the way forward to the latest point in the backup. + At each step, only the log files needed to roll the database forward are restored. + + .EXAMPLE + PS C:\> Restore-DbaDatabase -SqlInstance server\instance1 -Path c:\backups -DatabaseName example1 -NoRecovery + PS C:\> Restore-DbaDatabase -SqlInstance server\instance1 -Recover -DatabaseName example1 + + In this example we restore example1 database with no recovery, and then the second call is to set the database to recovery. + + .EXAMPLE + PS C:\> Get-DbaBackupHistory - SqlInstance server\instance1 -Database ProdFinance -Last | Restore-DbaDatabase -PageRestore + PS C:\> $SuspectPage -PageRestoreTailFolder c:\temp -TrustDbBackupHistory + + Gets a list of Suspect Pages using Get-DbaSuspectPage. The uses Get-DbaBackupHistory and Restore-DbaDatabase to perform a restore of the suspect pages and bring them up to date + If server\instance1 is Enterprise edition this will be done online, if not it will be performed offline + + .EXAMPLE + PS C:\> $BackupHistory = Get-DbaBackupInformation -SqlInstance sql2005 -Path \\backups\sql2000\ProdDb + PS C:\> $BackupHistory | Restore-DbaDatabase -SqlInstance sql2000 -TrustDbBackupHistory + + Due to SQL Server 2000 not returning all the backup headers we cannot restore directly. As this is an issues with the SQL engine all we can offer is the following workaround + This will use a SQL Server instance > 2000 to read the headers, and then pass them in to Restore-DbaDatabase as a BackupHistory object. + + .EXAMPLE + PS C:\> Restore-DbaDatabase -SqlInstance server1\instance1 -Path "C:\Temp\devops_prod_full.bak" -DatabaseName "DevOps_DEV" -ReplaceDbNameInFile + PS C:\> Rename-DbaDatabase -SqlInstance server1\instance1 -Database "DevOps_DEV" -LogicalName "_" + + This will restore the database from the "C:\Temp\devops_prod_full.bak" file, with the new name "DevOps_DEV" and store the different physical files with the new name. It will use the system default configured data and log locations. + After the restore the logical names of the database files will be renamed with the "DevOps_DEV_ROWS" for MDF/NDF and "DevOps_DEV_LOG" for LDF + + .EXAMPLE + PS C:\> $FileStructure = @{ + >> 'database_data' = 'C:\Data\database_data.mdf' + >> 'database_log' = 'C:\Log\database_log.ldf' + >> } + >> + PS C:\> Restore-DbaDatabase -SqlInstance server1 -Path \\ServerName\ShareName\File -DatabaseName database -FileMapping $FileStructure + + Restores 'database' to 'server1' and moves the files to new locations. The format for the $FileStructure HashTable is the file logical name as the Key, and the new location as the Value. + +#> + [CmdletBinding(SupportsShouldProcess, DefaultParameterSetName = "Restore")] + [Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSAvoidUsingPlainTextForPassword", "AzureCredential", Justification = "For Parameter AzureCredential")] + param ( + [parameter(Mandatory)][Alias("ServerInstance", "SqlServer")][DbaInstanceParameter]$SqlInstance, + [PSCredential]$SqlCredential, + [parameter(Mandatory, ValueFromPipeline, ParameterSetName = "Restore")][parameter(Mandatory, ValueFromPipeline, ParameterSetName = "RestorePage")][object[]]$Path, + [parameter(ValueFromPipeline)][Alias("Name")][object[]]$DatabaseName, + [parameter(ParameterSetName = "Restore")][String]$DestinationDataDirectory, + [parameter(ParameterSetName = "Restore")][String]$DestinationLogDirectory, + [parameter(ParameterSetName = "Restore")][String]$DestinationFileStreamDirectory, + [parameter(ParameterSetName = "Restore")][DateTime]$RestoreTime = (Get-Date).AddYears(1), + [parameter(ParameterSetName = "Restore")][switch]$NoRecovery, + [parameter(ParameterSetName = "Restore")][switch]$WithReplace, + [parameter(ParameterSetName = "Restore")][Switch]$XpDirTree, + [switch]$OutputScriptOnly, + [parameter(ParameterSetName = "Restore")][switch]$VerifyOnly, + [parameter(ParameterSetName = "Restore")][switch]$MaintenanceSolutionBackup, + [parameter(ParameterSetName = "Restore")][hashtable]$FileMapping, + [parameter(ParameterSetName = "Restore")][switch]$IgnoreLogBackup, + [parameter(ParameterSetName = "Restore")][switch]$UseDestinationDefaultDirectories, + [parameter(ParameterSetName = "Restore")][switch]$ReuseSourceFolderStructure, + [parameter(ParameterSetName = "Restore")][string]$DestinationFilePrefix = '', + [parameter(ParameterSetName = "Restore")][string]$RestoredDatabaseNamePrefix, + [parameter(ParameterSetName = "Restore")][parameter(ParameterSetName = "RestorePage")][switch]$TrustDbBackupHistory, + [parameter(ParameterSetName = "Restore")][parameter(ParameterSetName = "RestorePage")][int]$MaxTransferSize, + [parameter(ParameterSetName = "Restore")][parameter(ParameterSetName = "RestorePage")][int]$BlockSize, + [parameter(ParameterSetName = "Restore")][parameter(ParameterSetName = "RestorePage")][int]$BufferCount, + [parameter(ParameterSetName = "Restore")][switch]$DirectoryRecurse, + [switch]$EnableException, + [parameter(ParameterSetName = "Restore")][string]$StandbyDirectory, + [parameter(ParameterSetName = "Restore")][switch]$Continue, + [string]$AzureCredential, + [parameter(ParameterSetName = "Restore")][switch]$ReplaceDbNameInFile, + [parameter(ParameterSetName = "Restore")][string]$DestinationFileSuffix, + [parameter(ParameterSetName = "Recovery")][switch]$Recover, + [parameter(ParameterSetName = "Restore")][switch]$KeepCDC, + [string]$GetBackupInformation, + [switch]$StopAfterGetBackupInformation, + [string]$SelectBackupInformation, + [switch]$StopAfterSelectBackupInformation, + [string]$FormatBackupInformation, + [switch]$StopAfterFormatBackupInformation, + [string]$TestBackupInformation, + [switch]$StopAfterTestBackupInformation, + [parameter(Mandatory, ParameterSetName = "RestorePage")][object]$PageRestore, + [parameter(Mandatory, ParameterSetName = "RestorePage")][string]$PageRestoreTailFolder, + [int]$StatementTimeout = 0, + [switch]$AllowContinue + ) + begin { + Write-Message -Level InternalComment -Message "Starting" + Write-Message -Level Debug -Message "Parameters bound: $($PSBoundParameters.Keys -join ", ")" + + #region Validation + try { + $RestoreInstance = Connect-SqlInstance -SqlInstance $SqlInstance -SqlCredential $SqlCredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + return + } + if ($PSCmdlet.ParameterSetName -eq "Restore") { + $UseDestinationDefaultDirectories = $true + $paramCount = 0 + + if (Test-Bound "AllowContinue") { + Write-Message -Level Warning -Message "AllowContinue is deprecated and will be removed in v1.0" + } + if (Test-Bound "FileMapping") { + $paramCount += 1 + } + if (Test-Bound "ReuseSourceFolderStructure") { + $paramCount += 1 + } + if (Test-Bound "DestinationDataDirectory") { + $paramCount += 1 + } + if ($paramCount -gt 1) { + Stop-Function -Category InvalidArgument -Message "You've specified incompatible Location parameters. Please only specify one of FileMapping, ReuseSourceFolderStructure or DestinationDataDirectory" + return + } + if (($ReplaceDbNameInFile) -and !(Test-Bound "DatabaseName")) { + Stop-Function -Category InvalidArgument -Message "To use ReplaceDbNameInFile you must specify DatabaseName" + return + } + + if ((Test-Bound "DestinationLogDirectory") -and (Test-Bound "ReuseSourceFolderStructure")) { + Stop-Function -Category InvalidArgument -Message "The parameters DestinationLogDirectory and UseDestinationDefaultDirectories are mutually exclusive" + return + } + if ((Test-Bound "DestinationLogDirectory") -and -not (Test-Bound "DestinationDataDirectory")) { + Stop-Function -Category InvalidArgument -Message "The parameter DestinationLogDirectory can only be specified together with DestinationDataDirectory" + return + } + if ((Test-Bound "DestinationFileStreamDirectory") -and (Test-Bound "ReuseSourceFolderStructure")) { + Stop-Function -Category InvalidArgument -Message "The parameters DestinationFileStreamDirectory and UseDestinationDefaultDirectories are mutually exclusive" + return + } + if ((Test-Bound "DestinationFileStreamDirectory") -and -not (Test-Bound "DestinationDataDirectory")) { + Stop-Function -Category InvalidArgument -Message "The parameter DestinationFileStreamDirectory can only be specified together with DestinationDataDirectory" + return + } + if ((Test-Bound "ReuseSourceFolderStructure") -and (Test-Bound "UseDestinationDefaultDirectories")) { + Stop-Function -Category InvalidArgument -Message "The parameters UseDestinationDefaultDirectories and ReuseSourceFolderStructure cannot both be applied " + return + } + + if (($null -ne $FileMapping) -or $ReuseSourceFolderStructure -or ($DestinationDataDirectory -ne '')) { + $UseDestinationDefaultDirectories = $false + } + if (($MaxTransferSize % 64kb) -ne 0 -or $MaxTransferSize -gt 4mb) { + Stop-Function -Category InvalidArgument -Message "MaxTransferSize value must be a multiple of 64kb and no greater than 4MB" + return + } + if ($BlockSize) { + if ($BlockSize -notin (0.5kb, 1kb, 2kb, 4kb, 8kb, 16kb, 32kb, 64kb)) { + Stop-Function -Category InvalidArgument -Message "Block size must be one of 0.5kb,1kb,2kb,4kb,8kb,16kb,32kb,64kb" + return + } + } + if ('' -ne $StandbyDirectory) { + if (!(Test-DbaPath -Path $StandbyDirectory -SqlInstance $RestoreInstance)) { + Stop-Function -Message "$SqlServer cannot see the specified Standby Directory $StandbyDirectory" -Target $SqlInstance + return + } + } + if ($KeepCDC -and ($NoRecovery -or ('' -ne $StandbyDirectory))) { + Stop-Function -Category InvalidArgument -Message "KeepCDC cannot be specified with Norecovery or Standby as it needs recovery to work" + return + } + if ($Continue) { + Write-Message -Message "Called with continue, so assume we have an existing db in norecovery" + $ContinuePoints = Get-RestoreContinuableDatabase -SqlInstance $RestoreInstance + $LastRestoreType = Get-DbaDbRestoreHistory -SqlInstance $RestoreInstance -Last + } + if (!($PSBoundParameters.ContainsKey("DataBasename"))) { + $PipeDatabaseName = $true + } + } + + if ($StatementTimeout -eq 0) { + Write-Message -Level Verbose -Message "Changing statement timeout to infinity" + } else { + Write-Message -Level Verbose -Message "Changing statement timeout to ($StatementTimeout) minutes" + } + $RestoreInstance.ConnectionContext.StatementTimeout = ($StatementTimeout * 60) + #endregion Validation + + if ($UseDestinationDefaultDirectories) { + $DefaultPath = (Get-DbaDefaultPath -SqlInstance $RestoreInstance) + $DestinationDataDirectory = $DefaultPath.Data + $DestinationLogDirectory = $DefaultPath.Log + } + + $BackupHistory = @() + } + process { + if (Test-FunctionInterrupt) { + return + } + if ($RestoreInstance.VersionMajor -eq 8 -and $true -ne $TrustDbBackupHistory) { + foreach ($file in $Path) { + $bh = Get-DbaBackupInformation -SqlInstance $RestoreInstance -Path $file + $bound = $PSBoundParameters + $bound['TrustDbBackupHistory'] = $true + $bound['Path'] = $bh + Restore-Dbadatabase @bound + } + break + } + if ($PSCmdlet.ParameterSetName -like "Restore*") { + if ($PipeDatabaseName -eq $true) { + $DatabaseName = '' + } + Write-Message -message "ParameterSet = Restore" -Level Verbose + if ($TrustDbBackupHistory -or $path[0].GetType().ToString() -eq 'Sqlcollaborative.Dbatools.Database.BackupHistory') { + foreach ($f in $path) { + Write-Message -Level Verbose -Message "Trust Database Backup History Set" + if ("BackupPath" -notin $f.PSobject.Properties.name) { + Write-Message -Level Verbose -Message "adding BackupPath - $($_.FullName)" + $f = $f | Select-Object *, @{ + Name = "BackupPath"; Expression = { + $_.FullName + } + } + } + if ("DatabaseName" -notin $f.PSobject.Properties.Name) { + $f = $f | Select-Object *, @{ + Name = "DatabaseName"; Expression = { + $_.Database + } + } + } + if ("Database" -notin $f.PSobject.Properties.Name) { + $f = $f | Select-Object *, @{ + Name = "Database"; Expression = { + $_.DatabaseName + } + } + } + if ("BackupSetGUID" -notin $f.PSobject.Properties.Name) { + $f = $f | Select-Object *, @{ + Name = "BackupSetGUID"; Expression = { + $_.BackupSetID + } + } + } + + if ($f.BackupPath -like 'http*') { + if ('' -ne $AzureCredential) { + Write-Message -Message "At least one Azure backup passed in with a credential, assume correct" -Level Verbose + Write-Message -Message "Storage Account Identity access means striped backups cannot be restore" + } else { + $f.BackupPath -match 'https://.*/.*/' + if (Get-DbaCredential -SqlInstance $RestoreInstance -name $matches[0].trim('/') ) { + Write-Message -Message "We have a SAS credential to use with $($f.BackupPath)" -Level Verbose + } else { + Stop-Function -Message "A URL to a backup has been passed in, but no credential can be found to access it" + return + } + } + } + $BackupHistory += $F | Select-Object *, @{ + Name = "ServerName"; Expression = { + $_.SqlInstance + } + }, @{ + Name = "BackupStartDate"; Expression = { + $_.Start -as [DateTime] + } + } + } + } else { + $files = @() + foreach ($f in $Path) { + if ($f -is [System.IO.FileSystemInfo]) { + $files += $f.FullName + } else { + $files += $f + } + } + Write-Message -Level Verbose -Message "Unverified input, full scans - $($files -join ';')" + if ($BackupHistory.GetType().ToString() -eq 'Sqlcollaborative.Dbatools.Database.BackupHistory') { + $BackupHistory = @($BackupHistory) + } + $BackupHistory += Get-DbaBackupInformation -SqlInstance $RestoreInstance -SqlCredential $SqlCredential -Path $files -DirectoryRecurse:$DirectoryRecurse -MaintenanceSolution:$MaintenanceSolutionBackup -IgnoreLogBackup:$IgnoreLogBackup -AzureCredential $AzureCredential + } + if ($PSCmdlet.ParameterSetName -eq "RestorePage") { + if (-not (Test-DbaPath -SqlInstance $RestoreInstance -Path $PageRestoreTailFolder)) { + Stop-Function -Message "Instance $RestoreInstance cannot read $PageRestoreTailFolder, cannot proceed" -Target $PageRestoreTailFolder + return + } + $WithReplace = $true + } + } elseif ($PSCmdlet.ParameterSetName -eq "Recovery") { + Write-Message -Message "$($Database.Count) databases to recover" -level Verbose + foreach ($Database in $DatabaseName) { + if ($Database -is [object]) { + #We've got an object, try the normal options Database, DatabaseName, Name + if ("Database" -in $Database.PSobject.Properties.Name) { + [string]$DataBase = $Database.Database + } elseif ("DatabaseName" -in $Database.PSobject.Properties.Name) { + [string]$DataBase = $Database.DatabaseName + } elseif ("Name" -in $Database.PSobject.Properties.Name) { + [string]$Database = $Database.name + } + } + Write-Message -Level Verbose -Message "existence - $($RestoreInstance.Databases[$DataBase].State)" + if ($RestoreInstance.Databases[$DataBase].State -ne 'Existing') { + Write-Message -Message "$Database does not exist on $RestoreInstance" -level Warning + continue + } + if ($RestoreInstance.Databases[$Database].Status -ne "Restoring") { + Write-Message -Message "$Database on $RestoreInstance is not in a Restoring State" -Level Warning + continue + } + $RestoreComplete = $true + $RecoverSql = "RESTORE DATABASE $Database WITH RECOVERY" + Write-Message -Message "Recovery Sql Query - $RecoverSql" -level verbose + try { + $RestoreInstance.query($RecoverSql) + } catch { + $RestoreComplete = $False + $ExitError = $_.Exception.InnerException + Write-Message -Level Warning -Message "Failed to recover $Database on $RestoreInstance, `n $ExitError" + } finally { + [PSCustomObject]@{ + SqlInstance = $SqlInstance + DatabaseName = $Database + RestoreComplete = $RestoreComplete + Scripts = $RecoverSql + } + } + } + } + } + end { + if (Test-FunctionInterrupt) { + return + } + if ($PSCmdlet.ParameterSetName -like "Restore*") { + if ($BackupHistory.Count -eq 0) { + Write-Message -Level Warning -Message "No backups passed through. `n This could mean the SQL instance cannot see the referenced files, the file's headers could not be read or some other issue" + return + } + Write-Message -message "Processing DatabaseName - $DatabaseName" -Level Verbose + $FilteredBackupHistory = @() + if (Test-Bound -ParameterName GetBackupInformation) { + Write-Message -Message "Setting $GetBackupInformation to BackupHistory" -Level Verbose + Set-Variable -Name $GetBackupInformation -Value $BackupHistory -Scope Global + } + if ($StopAfterGetBackupInformation) { + return + } + $pathSep = Get-DbaPathSep -Server $RestoreInstance + $null = $BackupHistory | Format-DbaBackupInformation -DataFileDirectory $DestinationDataDirectory -LogFileDirectory $DestinationLogDirectory -DestinationFileStreamDirectory $DestinationFileStreamDirectory -DatabaseFileSuffix $DestinationFileSuffix -DatabaseFilePrefix $DestinationFilePrefix -DatabaseNamePrefix $RestoredDatabaseNamePrefix -ReplaceDatabaseName $DatabaseName -Continue:$Continue -ReplaceDbNameInFile:$ReplaceDbNameInFile -FileMapping $FileMapping -PathSep $pathSep + + if (Test-Bound -ParameterName FormatBackupInformation) { + Set-Variable -Name $FormatBackupInformation -Value $BackupHistory -Scope Global + } + if ($StopAfterFormatBackupInformation) { + return + } + if ($VerifyOnly) { + $FilteredBackupHistory = $BackupHistory + } else { + $FilteredBackupHistory = $BackupHistory | Select-DbaBackupInformation -RestoreTime $RestoreTime -IgnoreLogs:$IgnoreLogBackups -ContinuePoints $ContinuePoints -LastRestoreType $LastRestoreType -DatabaseName $DatabaseName + } + if (Test-Bound -ParameterName SelectBackupInformation) { + Write-Message -Message "Setting $SelectBackupInformation to FilteredBackupHistory" -Level Verbose + Set-Variable -Name $SelectBackupInformation -Value $FilteredBackupHistory -Scope Global + + } + if ($StopAfterSelectBackupInformation) { + return + } + try { + Write-Message -Level Verbose -Message "VerifyOnly = $VerifyOnly" + $null = $FilteredBackupHistory | Test-DbaBackupInformation -SqlInstance $RestoreInstance -WithReplace:$WithReplace -Continue:$Continue -VerifyOnly:$VerifyOnly -EnableException:$true -OutputScriptOnly:$OutputScriptOnly + } catch { + Stop-Function -ErrorRecord $_ -Message "Failure" -Continue + } + if (Test-Bound -ParameterName TestBackupInformation) { + Set-Variable -Name $TestBackupInformation -Value $FilteredBackupHistory -Scope Global + } + if ($StopAfterTestBackupInformation) { + return + } + $DbVerfied = ($FilteredBackupHistory | Where-Object { + $_.IsVerified -eq $True + } | Select-Object -Property Database -Unique).Database -join ',' + Write-Message -Message "$DbVerfied passed testing" -Level Verbose + if ((@($FilteredBackupHistory | Where-Object { + $_.IsVerified -eq $True + })).count -lt $FilteredBackupHistory.count) { + $DbUnVerified = ($FilteredBackupHistory | Where-Object { + $_.IsVerified -eq $False + } | Select-Object -Property Database -Unique).Database -join ',' + Write-Message -Level Warning -Message "Database $DbUnverified failed testing, skipping" + } + If ($PSCmdlet.ParameterSetName -eq "RestorePage") { + if (($FilteredBackupHistory.Database | select-Object -unique | Measure-Object).count -ne 1) { + Stop-Function -Message "Must only 1 database passed in for Page Restore. Sorry" + return + } else { + $WithReplace = $false + } + } + Write-Message -Message "Passing in to restore" -Level Verbose + if ($PSCmdlet.ParameterSetName -eq "RestorePage" -and $RestoreInstance.Edition -notlike '*Enterprise*') { + Write-Message -Message "Taking Tail log backup for page restore for non-Enterprise" -Level Verbose + $TailBackup = Backup-DbaDatabase -SqlInstance $RestoreInstance -Database $DatabaseName -Type Log -BackupDirectory $PageRestoreTailFolder -Norecovery -CopyOnly + } + try { + $FilteredBackupHistory | Where-Object { + $_.IsVerified -eq $true + } | Invoke-DbaAdvancedRestore -SqlInstance $RestoreInstance -WithReplace:$WithReplace -RestoreTime $RestoreTime -StandbyDirectory $StandbyDirectory -NoRecovery:$NoRecovery -Continue:$Continue -OutputScriptOnly:$OutputScriptOnly -BlockSize $BlockSize -MaxTransferSize $MaxTransferSize -Buffercount $Buffercount -KeepCDC:$KeepCDC -VerifyOnly:$VerifyOnly -PageRestore $PageRestore -EnableException -AzureCredential $AzureCredential + } catch { + Stop-Function -Message "Failure" -ErrorRecord $_ -Continue -Target $RestoreInstance + } + if ($PSCmdlet.ParameterSetName -eq "RestorePage") { + if ($RestoreInstance.Edition -like '*Enterprise*') { + Write-Message -Message "Taking Tail log backup for page restore for Enterprise" -Level Verbose + $TailBackup = Backup-DbaDatabase -SqlInstance $RestoreInstance -Database $DatabaseName -Type Log -BackupDirectory $PageRestoreTailFolder -Norecovery -CopyOnly + } + Write-Message -Message "Restoring Tail log backup for page restore" -Level Verbose + $TailBackup | Restore-DbaDatabase -SqlInstance $RestoreInstance -TrustDbBackupHistory -NoRecovery -OutputScriptOnly:$OutputScriptOnly -BlockSize $BlockSize -MaxTransferSize $MaxTransferSize -Buffercount $Buffercount -Continue + Restore-DbaDatabase -SqlInstance $RestoreInstance -Recover -DatabaseName $DatabaseName -OutputScriptOnly:$OutputScriptOnly + } + } + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function Restore-DbaDbCertificate { + <# + .SYNOPSIS + Imports certificates from .cer files using SMO. + + .DESCRIPTION + Imports certificates from.cer files using SMO. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Path + The Path the contains the certificate and private key files. The path can be a directory or a specific certificate. + + .PARAMETER SecurePassword + Secure string used to decrypt the private key. + + .PARAMETER EncryptionPassword + If specified this will be used to encrypt the private key. + + .PARAMETER Database + The database where the certificate imports into. Defaults to master. + + .PARAMETER WhatIf + Shows what would happen if the command were to run. No actions are actually performed. + + .PARAMETER Confirm + Prompts you for confirmation before executing any changing operations within the command. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Migration, Certificate + Author: Jess Pomfret (@jpomfret), jesspomfret.com + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Restore-DbaDbCertificate + + .EXAMPLE + PS C:\> Restore-DbaDbCertificate -SqlInstance Server1 -Path \\Server1\Certificates -SecurePassword (ConvertTo-SecureString -Force -AsPlainText GoodPass1234!!) + + Restores all the certificates in the specified path, password is used to both decrypt and encrypt the private key. + + .EXAMPLE + PS C:\> Restore-DbaDbCertificate -SqlInstance Server1 -Path \\Server1\Certificates\DatabaseTDE.cer -SecurePassword (ConvertTo-SecureString -force -AsPlainText GoodPass1234!!) + + Restores the DatabaseTDE certificate to Server1 and uses the MasterKey to encrypt the private key. + + #> + [CmdletBinding(DefaultParameterSetName = "Default", SupportsShouldProcess, ConfirmImpact = "High")] + param ( + [Parameter(Mandatory)] + [DbaInstanceParameter]$SqlInstance, + [PSCredential]$SqlCredential, + [parameter(Mandatory, ValueFromPipeline)] + [Alias("FullName")] + [object[]]$Path, + [Security.SecureString]$EncryptionPassword, + [string]$Database = "master", + [Alias("Password")] + [Security.SecureString]$SecurePassword = (Read-Host "Password" -AsSecureString), + [switch]$EnableException + ) + process { + try { + $server = Connect-SqlInstance -SqlInstance $SqlInstance -SqlCredential $sqlcredential + } catch { + Stop-Function -Message "Failed to connect to: $SqlInstance" -Target $SqlInstance -ErrorRecord $_ + return + } + + foreach ($fullname in $Path) { + if (-not $SqlInstance.IsLocalHost -and -not $fullname.StartsWith('\')) { + Stop-Function -Message "Path ($fullname) must be a UNC share when SQL instance is not local." -Continue -Target $fullname + } + + if (-not (Test-DbaPath -SqlInstance $server -Path $fullname)) { + Stop-Function -Message "$SqlInstance cannot access $fullname" -Continue -Target $fullname + } + + $directory = Split-Path $fullname + $filename = Split-Path $fullname -Leaf + $certname = [io.path]::GetFileNameWithoutExtension($filename) + + if ($Pscmdlet.ShouldProcess("$certname on $SqlInstance", "Importing Certificate")) { + $smocert = New-Object Microsoft.SqlServer.Management.Smo.Certificate + $smocert.Name = $certname + $smocert.Parent = $server.Databases[$Database] + Write-Message -Level Verbose -Message "Creating Certificate: $certname" + try { + $fullcertname = "$directory\$certname.cer" + $privatekey = "$directory\$certname.pvk" + Write-Message -Level Verbose -Message "Full certificate path: $fullcertname" + Write-Message -Level Verbose -Message "Private key: $privatekey" + $fromfile = $true + + if ($EncryptionPassword) { + $smocert.Create($fullcertname, $fromfile, $privatekey, [System.Runtime.InteropServices.marshal]::PtrToStringAuto([System.Runtime.InteropServices.marshal]::SecureStringToBSTR($password)), [System.Runtime.InteropServices.marshal]::PtrToStringAuto([System.Runtime.InteropServices.marshal]::SecureStringToBSTR($password))) + } else { + $smocert.Create($fullcertname, $fromfile, $privatekey, [System.Runtime.InteropServices.marshal]::PtrToStringAuto([System.Runtime.InteropServices.marshal]::SecureStringToBSTR($password))) + } + $cert = $smocert + } catch { + Write-Message -Level Warning -Message $_ -ErrorRecord $_ -Target $instance + } + } + Get-DbaDbCertificate -SqlInstance $server -Database $Database -Certificate $cert.Name + } + } + end { + Test-DbaDeprecation -DeprecatedOn "1.0.0" -Alias Retore-DbaDatabaseCertificate + + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function Restore-DbaDbSnapshot { + <# + .SYNOPSIS + Restores databases from snapshots + + .DESCRIPTION + Restores the database from the snapshot, discarding every modification made to the database + NB: Restoring to a snapshot will result in every other snapshot of the same database to be dropped + It also fixes some long-standing bugs in SQL Server when restoring from snapshots + + .PARAMETER SqlInstance + The target SQL Server instance or instances + + .PARAMETER SqlCredential + Credential object used to connect to the SQL Server as a different user + + .PARAMETER Database + Restores from the last snapshot databases with this names only. You can pass either Databases or Snapshots + + .PARAMETER ExcludeDatabase + The database(s) to exclude - this list is auto-populated from the server + + .PARAMETER Snapshot + Restores databases from snapshots with this names only. You can pass either Databases or Snapshots + + .PARAMETER InputObject + Allows piping from other Snapshot commands + + .PARAMETER Force + If restoring from a snapshot involves dropping any other snapshot, you need to explicitly + use -Force to let this command delete the ones not involved in the restore process. + Also, -Force will forcibly kill all running queries that prevent the restore process. + + .PARAMETER WhatIf + Shows what would happen if the command were to run + + .PARAMETER Confirm + Prompts for confirmation of every step. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Snapshot, Backup, Restore, Database + Author: Simone Bizzotto (@niphold) + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Restore-DbaDbSnapshot + + .EXAMPLE + PS C:\> Restore-DbaDbSnapshot -SqlInstance sql2014 -Database HR, Accounting + + Restores HR and Accounting databases using the latest snapshot available + + .EXAMPLE + PS C:\> Restore-DbaDbSnapshot -SqlInstance sql2014 -Database HR -Force + + Restores HR database from latest snapshot and kills any active connections in the database on sql2014. + + .EXAMPLE + PS C:\> Get-DbaDbSnapshot -SqlInstance sql2016 -Database HR | Restore-DbaDbSnapshot -Force + + Restores HR database from latest snapshot and kills any active connections in the database on sql2016. + + .EXAMPLE + PS C:\> Get-DbaDbSnapshot -SqlInstance sql2016 | Out-GridView -PassThru | Restore-DbaDbSnapshot + + Allows the selection of snapshots on sql2016 to restore + + .EXAMPLE + PS C:\> Restore-DbaDbSnapshot -SqlInstance sql2014 -Snapshot HR_snap_20161201, Accounting_snap_20161101 + + Restores databases from snapshots named HR_snap_20161201 and Accounting_snap_20161101 + + #> + [CmdletBinding(SupportsShouldProcess)] + param ( + [Alias("ServerInstance", "SqlServer")] + [DbaInstance[]]$SqlInstance, + [Alias("Credential")] + [PSCredential]$SqlCredential, + [Alias("Databases")] + [object[]]$Database, + [object[]]$ExcludeDatabase, + [object[]]$Snapshot, + [Parameter(ValueFromPipeline)] + [Microsoft.SqlServer.Management.Smo.Database[]]$InputObject, + [switch]$Force, + [Alias('Silent')] + [switch]$EnableException + ) + + process { + if (-not $Snapshot -and -not $Database -and -not $ExcludeDatabase -and -not $InputObject) { + Stop-Function -Message "You must specify either -Snapshot (to restore from) or -Database/-ExcludeDatabase (to restore to) or pipe in a snapshot" + return + } + + foreach ($instance in $SqlInstance) { + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + $InputObject += Get-DbaDbSnapshot -SqlInstance $server -Database $Database -ExcludeDatabase $ExcludeDatabase -Snapshot $Snapshot | Sort-Object CreateDate -Descending + + if ($Snapshot) { + # Restore databases from these snapshots + Write-Message -Level Verbose -Message "Selected only snapshots" + $dbs = $InputObject | Where-Object { $Snapshot -contains $_.Name } + $baseDatabases = $dbs | Select-Object -ExpandProperty DatabaseSnapshotBaseName | Get-Unique + if ($baseDatabases.Count -ne $Snapshot.Count -and $dbs.Count -ne 0) { + Stop-Function -Message "Failure. Multiple snapshots selected for the same database" -Continue + } + } + } + + foreach ($snap in $InputObject) { + # In the event someone passed -Database and it got all the snaps, most of which were dropped by the first + if ($snap.Parent) { + $server = $snap.Parent + + if (-not $snap.IsDatabaseSnapshot) { + Stop-Function -Continue -Message "$snap on $server is not a valid snapshot" + } + + if (-not ($snap.IsAccessible)) { + Stop-Function -Message "Database $snap is not accessible on $($snap.Parent)." -Continue + } + + $othersnaps = $server.Databases | Where-Object { $_.DatabaseSnapshotBaseName -eq $snap.DatabaseSnapshotBaseName -and $_.Name -ne $snap.Name } + + $db = $server.Databases | Where-Object Name -eq $snap.DatabaseSnapshotBaseName + $loginfo = $db.LogFiles | Select-Object Id, Size, Growth, GrowthType + + if (($snap | Where-Object FileGroupType -eq 'FileStreamDataFileGroup')) { + Stop-Function -Message "Database $snap on $server has FileStream group(s). You cannot restore from snapshots" -Continue + } + + if ($othersnaps -and -not $force) { + Stop-Function -Message "The restore process for $db from $snap needs to drop other snapshots on $db. Use -Force if you want to drop these snapshots" -Continue + } + + if ($Pscmdlet.ShouldProcess($server, "Remove other db snapshots for $db")) { + try { + $null = $othersnaps | Remove-DbaDatabase -Confirm:$false -EnableException + } catch { + Stop-Function -Message "Failed to remove other snapshots for $db on $server" -ErrorRecord $_ -Continue + } + } + + # Need a proper restore now + if ($Pscmdlet.ShouldProcess($server, "Restore db $db from $snap")) { + try { + if ($Force) { + $null = Stop-DbaProcess -SqlInstance $server -Database $db.Name, $snap.Name -WarningAction SilentlyContinue + } + + $null = $server.Query("USE master; RESTORE DATABASE [$($db.Name)] FROM DATABASE_SNAPSHOT='$($snap.Name)'") + } catch { + Stop-Function -Message "Failiure attempting to restore $db on $server" -ErrorRecord $_ -Continue + } + } + + # Comparing sizes before and after, need to refresh to see if size + foreach ($log in $db.LogFiles) { + $log.Refresh() + } + + foreach ($log in $db.LogFiles) { + $matching = $loginfo | Where-Object ID -eq $log.ID + $changeflag = 0 + foreach ($prop in @('Size', 'Growth', 'Growth', 'GrowthType')) { + if ($matching.$prop -ne $log.$prop) { + $changeflag = 1 + $log.$prop = $matching.$prop + } + } + if ($changeflag -ne 0) { + Write-Message -Level Verbose -Message "Restoring original settings for log file" + $log.Alter() + } + } + + Write-Message -Level Verbose -Message "Restored. Remember to take a backup now, and also to remove the snapshot if not needed." + Get-DbaDatabase -SqlInstance $server -Database $db.Name + } + } + } + end { + Test-DbaDeprecation -DeprecatedOn "1.0.0" -Alias Restore-DbaFromDatabaseSnapshot + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function Resume-DbaAgDbDataMovement { + <# + .SYNOPSIS + Resumes data movement for an availability group database on a SQL Server instance. + + .DESCRIPTION + Resumes data movement for an availability group database on a SQL Server instance. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. Server version must be SQL Server version 2012 or higher. + + .PARAMETER SqlCredential + Login to the SqlInstance instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Database + The database or databases to resume movement upon. + + .PARAMETER AvailabilityGroup + The availability group where the database movement will be resumeed. + + .PARAMETER InputObject + Enables piping from Get-DbaAgDatabase + + .PARAMETER WhatIf + Shows what would happen if the command were to run. No actions are actually performed. + + .PARAMETER Confirm + Prompts you for confirmation before executing any changing operations within the command. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: AvailabilityGroup, HA, AG + Author: Chrissy LeMaire (@cl), netnerds.net + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Resume-DbaAgDbDataMovement + + .EXAMPLE + PS C:\> Resume-DbaAgDbDataMovement -SqlInstance sql2017a -AvailabilityGroup ag1 -Database db1, db2 + + Resumes data movement on db1 and db2 to ag1 on sql2017a. Prompts for confirmation. + + .EXAMPLE + PS C:\> Get-DbaAgDatabase -SqlInstance sql2017a, sql2019 | Out-GridView -Passthru | Resume-DbaAgDbDataMovement -Confirm:$false + + Resumes data movement on the selected availability group databases. Does not prompt for confirmation. + + #> + [CmdletBinding(SupportsShouldProcess, ConfirmImpact = 'High')] + param ( + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [string]$AvailabilityGroup, + [string[]]$Database, + [parameter(ValueFromPipeline)] + [Microsoft.SqlServer.Management.Smo.AvailabilityDatabase[]]$InputObject, + [switch]$EnableException + ) + process { + if ((Test-Bound -ParameterName SqlInstance)) { + if ((Test-Bound -Not -ParameterName Database) -and (Test-Bound -Not -ParameterName AvailabilityGroup)) { + Stop-Function -Message "You must specify one or more databases and one Availability Groups when using the SqlInstance parameter." + return + } + } + + foreach ($instance in $SqlInstance) { + $InputObject += Get-DbaAgDatabase -SqlInstance $instance -SqlCredential $SqlCredential -Database $Database + } + + foreach ($agdb in $InputObject) { + if ($Pscmdlet.ShouldProcess($ag.Parent.Name, "Seting availability group $db to $($db.Parent.Name)")) { + try { + $null = $agdb.ResumeDataMovement() + $agdb + } catch { + Stop-Function -Message "Failure" -ErrorRecord $_ -Continue + } + } + } + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function Revoke-DbaAgPermission { + <# + .SYNOPSIS + Revokes endpoint and availability group permissions to a login. + + .DESCRIPTION + Revokes endpoint and availability group permissions to a login. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. Server version must be SQL Server version 2012 or higher. + + .PARAMETER SqlCredential + Login to the SqlInstance instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Login + The login or logins to modify. + + .PARAMETER AvailabilityGroup + Only modify specific availability groups. + + .PARAMETER Type + Specify type: Endpoint or AvailabilityGroup. Endpoint will modify the DatabaseMirror endpoint type. + + .PARAMETER Permission + Revokes one or more permissions: + Alter + Connect + Control + CreateAnyDatabase + CreateSequence + Delete + Execute + Impersonate + Insert + Receive + References + Select + Send + TakeOwnership + Update + ViewChangeTracking + ViewDefinition + + Connect is default. + + .PARAMETER InputObject + Enables piping from Get-DbaLogin. + + .PARAMETER WhatIf + Shows what would happen if the command were to run. No actions are actually performed. + + .PARAMETER Confirm + Prompts you for confirmation before executing any changing operations within the command. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: AvailabilityGroup, HA, AG + Author: Chrissy LeMaire (@cl), netnerds.net + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Revoke-DbaAgPermission + + .EXAMPLE + PS C:\> Revoke-DbaAgPermission -SqlInstance sql2017a -Type AvailabilityGroup -AvailabilityGroup SharePoint -Login ad\spservice -Permission CreateAnyDatabase + + Removes CreateAnyDatabase permissions from ad\spservice on the SharePoint availability group on sql2017a. Does not prompt for confirmation. + + .EXAMPLE + PS C:\> Revoke-DbaAgPermission -SqlInstance sql2017a -Type AvailabilityGroup -AvailabilityGroup ag1, ag2 -Login ad\spservice -Permission CreateAnyDatabase -Confirm + + Removes CreateAnyDatabase permissions from ad\spservice on the ag1 and ag2 availability groups on sql2017a. Prompts for confirmation. + + .EXAMPLE + PS C:\> Get-DbaLogin -SqlInstance sql2017a | Out-GridView -Passthru | Revoke-DbaAgPermission -Type EndPoint + + Revokes the selected logins Connect permissions on the DatabaseMirroring endpoint for sql2017a. + #> + [CmdletBinding(SupportsShouldProcess, ConfirmImpact = 'Low')] + param ( + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [string[]]$Login, + [string[]]$AvailabilityGroup, + [parameter(Mandatory)] + [ValidateSet('Endpoint', 'AvailabilityGroup')] + [string[]]$Type, + [ValidateSet('Alter', 'Connect', 'Control', 'CreateAnyDatabase', 'CreateSequence', 'Delete', 'Execute', 'Impersonate', 'Insert', 'Receive', 'References', 'Select', 'Send', 'TakeOwnership', 'Update', 'ViewChangeTracking', 'ViewDefinition')] + [string[]]$Permission = "Connect", + [parameter(ValueFromPipeline)] + [Microsoft.SqlServer.Management.Smo.Login[]]$InputObject, + [switch]$EnableException + ) + process { + if ($SqlInstance -and -not $Login -and -not $AvailabilityGroup) { + Stop-Function -Message "You must specify one or more logins when using the SqlInstance parameter." + return + } + + if ($Type -contains "AvailabilityGroup" -and -not $AvailabilityGroup) { + Stop-Function -Message "You must specify at least one availability group when using the AvailabilityGroup type." + return + } + + foreach ($instance in $SqlInstance) { + if ($perm -contains "CreateAnyDatabase") { + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $sqlcredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + foreach ($ag in $AvailabilityGroup) { + try { + $server.Query("ALTER AVAILABILITY GROUP $ag GRANT CREATE ANY DATABASE") + } catch { + Stop-Function -Message "Failure" -ErrorRecord $_ -Target $instance + return + } + } + } elseif ($Login) { + $InputObject += Get-DbaLogin -SqlInstance $instance -SqlCredential $SqlCredential -Login $Login + foreach ($account in $Login) { + if ($account -notin $InputObject.Name) { + try { + $InputObject += New-DbaLogin -SqlInstance $server -Login $account -EnableException + } catch { + Stop-Function -Message "Failure" -ErrorRecord $_ -Target $instance + return + } + } + } + } + } + + foreach ($account in $InputObject) { + $server = $account.Parent + if ($Type -contains "Endpoint") { + $server.Endpoints.Refresh() + $endpoint = $server.Endpoints | Where-Object EndpointType -eq DatabaseMirroring + + if (-not $endpoint) { + Stop-Function -Message "DatabaseMirroring endpoint does not exist on $server" -Target $server -Continue + } + + foreach ($perm in $Permission) { + if ($Pscmdlet.ShouldProcess($server.Name, "Revokeing $perm on $endpoint")) { + if ($perm -in 'CreateAnyDatabase') { + Stop-Function -Message "$perm not supported by endpoints" -Continue + } + try { + $bigperms = New-Object Microsoft.SqlServer.Management.Smo.ObjectPermissionSet([Microsoft.SqlServer.Management.Smo.ObjectPermission]::$perm) + $endpoint.Revoke($bigperms, $account.Name) + [pscustomobject]@{ + ComputerName = $account.ComputerName + InstanceName = $account.InstanceName + SqlInstance = $account.SqlInstance + Name = $account.Name + Permission = $perm + Type = "Revoke" + Status = "Success" + } + } catch { + Stop-Function -Message "Failure" -ErrorRecord $_ -Target $ag -Continue + } + } + } + } + + if ($Type -contains "AvailabilityGroup") { + $ags = Get-DbaAvailabilityGroup -SqlInstance $account.Parent -AvailabilityGroup $AvailabilityGroup + foreach ($ag in $ags) { + foreach ($perm in $Permission) { + if ($perm -notin 'Alter', 'Control', 'TakeOwnership', 'ViewDefinition') { + Stop-Function -Message "$perm not supported by availability groups" -Continue + } + if ($Pscmdlet.ShouldProcess($server.Name, "Revokeing $perm on $ags")) { + try { + $bigperms = New-Object Microsoft.SqlServer.Management.Smo.ObjectPermissionSet([Microsoft.SqlServer.Management.Smo.ObjectPermission]::$perm) + $ag.Revoke($bigperms, $account.Name) + [pscustomobject]@{ + ComputerName = $account.ComputerName + InstanceName = $account.InstanceName + SqlInstance = $account.SqlInstance + Name = $account.Name + Permission = $perm + Type = "Revoke" + Status = "Success" + } + } catch { + Stop-Function -Message "Failure" -ErrorRecord $_ -Target $ag -Continue + } + } + } + } + } + } + } +} +function Save-DbaDiagnosticQueryScript { + <# + .SYNOPSIS + Save-DbaDiagnosticQueryScript downloads the most recent version of all Glenn Berry DMV scripts + + .DESCRIPTION + The dbatools module will have the diagnostic queries pre-installed. Use this only to update to a more recent version or specific versions. + + This function is mainly used by Invoke-DbaDiagnosticQuery, but can also be used independently to download the Glenn Berry DMV scripts. + + Use this function to pre-download the scripts from a device with an Internet connection. + + The function Invoke-DbaDiagnosticQuery will try to download these scripts automatically, but it obviously needs an internet connection to do that. + + .PARAMETER Path + Specifies the path to the output + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Diagnostic, DMV, Troubleshooting + Author: Andre Kamman (@AndreKamman), http://clouddba.io + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .EXAMPLE + PS C:\> Save-DbaDiagnosticQueryScript -Path c:\temp + + Downloads the most recent version of all Glenn Berry DMV scripts to the specified location. + If Path is not specified, the "My Documents" location will be used. + + #> + [CmdletBinding()] + param ( + [System.IO.FileInfo]$Path = [Environment]::GetFolderPath("mydocuments"), + [Alias('Silent')] + [switch]$EnableException + ) + function Get-WebData { + param ($uri) + try { + try { + $data = (Invoke-TlsWebRequest -uri $uri -ErrorAction Stop) + } catch { + (New-Object System.Net.WebClient).Proxy.Credentials = [System.Net.CredentialCache]::DefaultNetworkCredentials + $data = (Invoke-TlsWebRequest -uri $uri -ErrorAction Stop) + } + return $data + } catch { + Stop-Function -Message "Invoke-TlsWebRequest failed: $_" -Target $data -ErrorRecord $_ + return + } + } + + if (-not (Test-Path $Path)) { + Stop-Function -Message "Path does not exist or access denied" -Target $path + return + } + + Add-Type -AssemblyName System.Web + $glenberryrss = "http://www.sqlskills.com/blogs/glenn/feed/" + $glenberrysql = @() + + Write-Message -Level Verbose -Message "Downloading RSS Feed" + $rss = [xml](get-webdata -uri $glenberryrss) + $Feed = $rss.rss.Channel + + $glenberrysql = @() + $RssPostFilter = "SQL Server Diagnostic Information Queries for*" + $DropboxLinkFilter = "*dropbox.com*" + $LinkTitleFilter = "*Diagnostic*" + + foreach ($post in $Feed.item) { + if ($post.title -like $RssPostFilter) { + # We found the first post that matches it, lets go visit and scrape. + $page = Get-WebData -uri $post.link + $glenberrysql += ($page.Links | Where-Object { $_.href -like $DropboxLinkFilter -and $_.innerText -like $LinkTitleFilter } | ForEach-Object { + [pscustomobject]@{ + URL = $_.href + SQLVersion = $_.innerText -replace " Diagnostic Information Queries", "" -replace "SQL Server ", "" -replace ' ', '' + FileYear = ($post.title -split " ")[-1] + FileMonth = "{0:00}" -f [int]([CultureInfo]::InvariantCulture.DateTimeFormat.MonthNames.IndexOf(($post.title -split " ")[-2])) + } + }) + break + } + } + Write-Message -Level Verbose -Message "Found $($glenberrysql.Count) documents to download" + foreach ($doc in $glenberrysql) { + try { + $link = $doc.URL.ToString().Replace('dl=0', 'dl=1') + Write-Message -Level Verbose -Message "Downloading $link)" + Write-ProgressHelper -Activity "Downloading Glenn Berry's most recent DMVs" -ExcludePercent -Message "Downloading $link" -StepNumber 1 + $filename = "{0}\SQLServerDiagnosticQueries_{1}_{2}.sql" -f $Path, $doc.SQLVersion, "$($doc.FileYear)$($doc.FileMonth)" + Invoke-TlsWebRequest -Uri $link -OutFile $filename -ErrorAction Stop + Get-ChildItem -Path $filename + } catch { + Stop-Function -Message "Requesting and writing file failed: $_" -Target $filename -ErrorRecord $_ + return + } + } +} +function Select-DbaBackupInformation { + <# + .SYNOPSIS + Select a subset of backups from a dbatools backup history object + + .DESCRIPTION + Select-DbaBackupInformation filters out a subset of backups from the dbatools backup history object with parameters supplied. + + .PARAMETER BackupHistory + A dbatools.BackupHistory object containing backup history records + + .PARAMETER RestoreTime + The point in time you want to restore to + + .PARAMETER IgnoreLogs + This switch will cause Log Backups to be ignored. So will restore to the last Full or Diff backup only + + .PARAMETER IgnoreDiffs + This switch will cause Differential backups to be ignored. Unless IgnoreLogs is specified, restore to point in time will still occur, just using all available log backups + + .PARAMETER DatabaseName + A string array of Database Names that you want to filter to + + .PARAMETER ServerName + A string array of Server Names that you want to filter + + .PARAMETER ContinuePoints + The Output of Get-RestoreContinuableDatabase while provides 'Database',redo_start_lsn,'FirstRecoveryForkID' values. Used to filter backups to continue a restore on a database + Sets IgnoreDiffs, and also filters databases to only those within the ContinuePoints object, or the ContinuePoints object AND DatabaseName if both specified + + .PARAMETER LastRestoreType + The Output of Get-DbaDbRestoreHistory -last + This is used to check the last type of backup to a database to see if a differential backup can be restored + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Backup, Restore + Author:Stuart Moore (@napalmgram), stuart-moore.com + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Select-DbaBackupInformation + + .EXAMPLE + PS C:\> $Backups = Get-DbaBackupInformation -SqlInstance Server1 -Path \\server1\backups$ + PS C:\> $FilteredBackups = $Backups | Select-DbaBackupInformation -RestoreTime (Get-Date).AddHours(-1) + + Returns all backups needed to restore all the backups in \\server1\backups$ to 1 hour ago + + .EXAMPLE + PS C:\> $Backups = Get-DbaBackupInformation -SqlInstance Server1 -Path \\server1\backups$ + PS C:\> $FilteredBackups = $Backups | Select-DbaBackupInformation -RestoreTime (Get-Date).AddHours(-1) -DatabaseName ProdFinance + + Returns all the backups needed to restore Database ProdFinance to an hour ago + + .EXAMPLE + PS C:\> $Backups = Get-DbaBackupInformation -SqlInstance Server1 -Path \\server1\backups$ + PS C:\> $FilteredBackups = $Backups | Select-DbaBackupInformation -RestoreTime (Get-Date).AddHours(-1) -IgnoreLogs + + Returns all the backups in \\server1\backups$ to restore to as close prior to 1 hour ago as can be managed with only full and differential backups + + .EXAMPLE + PS C:\> $Backups = Get-DbaBackupInformation -SqlInstance Server1 -Path \\server1\backups$ + PS C:\> $FilteredBackups = $Backups | Select-DbaBackupInformation -RestoreTime (Get-Date).AddHours(-1) -IgnoreDiffs + + Returns all the backups in \\server1\backups$ to restore to 1 hour ago using only Full and Diff backups. + + #> + [CmdletBinding()] + param ( + [parameter(Mandatory, ValueFromPipeline)] + [object]$BackupHistory, + [DateTime]$RestoreTime = (get-date).addmonths(1), + [switch]$IgnoreLogs, + [switch]$IgnoreDiffs, + [string[]]$DatabaseName, + [string[]]$ServerName, + [object]$ContinuePoints, + [object]$LastRestoreType, + [switch]$EnableException + ) + begin { + $InternalHistory = @() + $IgnoreFull = $false + if ((Test-Bound -ParameterName ContinuePoints) -and $null -ne $ContinuePoints) { + Write-Message -Message "ContinuePoints provided so setting up for a continue" -Level Verbose + $IgnoreFull = $true + $Continue = $True + if (Test-Bound -ParameterName DatabaseName) { + $DatabaseName = $DatabaseName | Where-Object {$_ -in ($ContinuePoints | Select-Object -Property Database).Database} + + $DroppedDatabases = $DatabaseName | Where-Object {$_ -notin ($ContinuePoints | Select-Object -Property Database).Database} + if ($null -ne $DroppedDatabases) { + Write-Message -Message "$($DroppedDatabases.join(',')) filtered out as not in ContinuePoints" -Level Verbose + } + } else { + $DatabaseName = ($ContinuePoints | Select-Object -Property Database).Database + } + } + } + process { + $internalHistory += $BackupHistory + } + + end { + ForEach ($History in $InternalHistory) { + if ("RestoreTime" -notin $History.PSobject.Properties.name) { + $History | Add-Member -Name 'RestoreTime' -Type NoteProperty -Value $RestoreTime + } + } + if ((Test-Bound -ParameterName DatabaseName) -and '' -ne $DatabaseName) { + Write-Message -Message "Filtering by DatabaseName" -Level Verbose + # $InternalHistory = $InternalHistory | Where-Object {$_.Database -in $DatabaseName} + } + + if (Test-Bound -ParameterName ServerName) { + Write-Message -Message "Filtering by ServerName" -Level Verbose + $InternalHistory = $InternalHistory | Where-Object {$_.InstanceName -in $servername} + } + + $Databases = ($InternalHistory | Select-Object -Property Database -unique).Database + if ($continue -and $Databases.count -gt 1 -and $DatabaseName.count -gt 1) { + Stop-Function -Message "Cannot perform continuing restores on multiple databases with renames, exiting" + return + } + + + ForEach ($Database in $Databases) { + #Cope with restores renaming the db + # $database = the name of database in the backups being scanned + # $databasefilter = the name of the database the backups are being restore to/against + if ($null -ne $DatabaseName) { + $databasefilter = $DatabaseName + } else { + $databasefilter = $database + } + + if ($true -eq $Continue) { + #Test if Database is in a continuing state and the LSN to continue from: + if ($Databasefilter -in ($ContinuePoints | Select-Object -Property Database).Database) { + Write-Message -Message "$Database in ContinuePoints, will attmept to continue" -Level verbose + $IgnoreFull = $True + #Check what the last backup restored was + if (($LastRestoreType | Where-Object {$_.Database -eq $Databasefilter}).RestoreType -eq 'log') { + #log Backup last restored, so diffs cannot be used + $IgnoreDiffs = $true + } else { + #Last restore was a diff or full, so can restore diffs or logs + $IgnoreDiffs = $false + } + } else { + Write-Message -Message "$Database not in ContinuePoints, will attmept normal restore" -Level Warning + } + } + + $dbhistory = @() + $DatabaseHistory = $internalhistory | Where-Object {$_.Database -eq $Database} + #For a standard restore, work out the full backup + if ($false -eq $IgnoreFull) { + $Full = $DatabaseHistory | Where-Object {$_.Type -in ('Full', 'Database') -and $_.Start -le $RestoreTime} | Sort-Object -Property LastLsn -Descending | Select-Object -First 1 + if ($full.Fullname) { + $full.Fullname = ($DatabaseHistory | Where-Object { $_.Type -in ('Full', 'Database') -and $_.BackupSetID -eq $Full.BackupSetID }).Fullname + } else { + Stop-Function -Message "Fullname property not found. This could mean that a full backup could not be found or the command must be re-run with the -Continue switch." + return + } + $dbHistory += $full + } elseif ($true -eq $IgnoreFull -and $false -eq $IgnoreDiffs) { + #Fake the Full backup + Write-Message -Message "Continuing, so setting a fake full backup from the existing database" + $Full = [PsCustomObject]@{ + CheckpointLSN = ($ContinuePoints | Where-Object {$_.Database -eq $DatabaseFilter}).differential_base_lsn + } + } + + if ($false -eq $IgnoreDiffs) { + Write-Message -Message "processing diffs" -Level Verbose + $Diff = $DatabaseHistory | Where-Object {$_.Type -in ('Differential', 'Database Differential') -and $_.Start -le $RestoreTime -and $_.DatabaseBackupLSN -eq $Full.CheckpointLSN} | Sort-Object -Property LastLsn -Descending | Select-Object -First 1 + if ($null -ne $Diff) { + if ($Diff.FullName) { + $Diff.FullName = ($DatabaseHistory | Where-Object { $_.Type -in ('Differential', 'Database Differential') -and $_.BackupSetID -eq $diff.BackupSetID }).Fullname + } else { + Stop-Function -Message "Fullname property not found. This could mean that a full backup could not be found or the command must be re-run with the -Continue switch." + return + } + $dbhistory += $Diff + } + } + + #Sort out the LSN for the log restores + if ($null -ne ($dbHistory | Sort-Object -Property LastLsn -Descending | select-object -First 1).lastLsn) { + #We have history so use this + [bigint]$LogBaseLsn = ($dbHistory | Sort-Object -Property LastLsn -Descending | select-object -First 1).lastLsn.ToString() + $FirstRecoveryForkID = $Full.FirstRecoveryForkID + Write-Message -Level Verbose -Message "Found LogBaseLsn: $LogBaseLsn and FirstRecoveryForkID: $FirstRecoveryForkID" + } else { + Write-Message -Message "No full or diff, so attempting to pull from Continue informmation" -Level Verbose + try { + [bigint]$LogBaseLsn = ($ContinuePoints | Where-Object {$_.Database -eq $DatabaseFilter}).redo_start_lsn + $FirstRecoveryForkID = ($ContinuePoints | Where-Object {$_.Database -eq $DatabaseFilter}).FirstRecoveryForkID + Write-Message -Level Verbose -Message "Found LogBaseLsn: $LogBaseLsn and FirstRecoveryForkID: $FirstRecoveryForkID from Continue information" + } catch { + Stop-Function -Message "Failed to find LSN or RecoveryForkID for $DatabaseFilter" -Category InvalidOperation -Target $DatabaseFilter + } + } + + if ($true -eq $IgnoreFull -and $true -eq $IgnoreDiffs) { + #Set a Fake starting LSN + } + + if ($false -eq $IgnoreLogs) { + $FilteredLogs = $DatabaseHistory | Where-Object {$_.Type -in ('Log', 'Transaction Log') -and $_.Start -le $RestoreTime -and $_.LastLSN -ge $LogBaseLsn -and $_.FirstLSN -ne $_.LastLSN} | Sort-Object -Property LastLsn, FirstLsn + $GroupedLogs = $FilteredLogs | Group-Object -Property LastLSN, FirstLSN + ForEach ($Group in $GroupedLogs) { + $Log = $DatabaseHistory | Where-Object { $_.BackupSetID -eq $Group.group[0].BackupSetID } | select-object -First 1 + if ($Log.FullName) { + $Log.FullName = ($DatabaseHistory | Where-Object { $_.BackupSetID -eq $Group.group[0].BackupSetID }).Fullname + } else { + Stop-Function -Message "Fullname property not found. This could mean that a full backup could not be found or the command must be re-run with the -Continue switch." + return + } + #$dbhistory += $Log + $dbhistory += $DatabaseHistory | Where-Object {$_.BackupSetID -eq $Group.group[0].BackupSetID} + } + # Get Last T-log + $dbHistory += $DatabaseHistory | Where-Object {$_.Type -in ('Log', 'Transaction Log') -and $_.End -ge $RestoreTime -and $_.DatabaseBackupLSN -eq $Full.CheckpointLSN} | Sort-Object -Property LastLsn, FirstLsn | Select-Object -First 1 + } + $dbhistory + } + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function Set-DbaAgentAlert { + <# + .SYNOPSIS + Set-DbaAgentAlert updates the status of a SQL Agent Alert. + + .DESCRIPTION + Set-DbaAgentAlert updates an alert in the SQL Server Agent with parameters supplied. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. You must have sysadmin access and server version must be SQL Server version 2000 or greater. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Alert + The name of the alert. + + .PARAMETER NewName + The new name for the alert. + + .PARAMETER Enabled + Enabled the alert. + + .PARAMETER Disabled + Disabled the alert. + + .PARAMETER Force + The force parameter will ignore some errors in the parameters and assume defaults. + + .PARAMETER InputObject + Enables piping alert objects + + .PARAMETER WhatIf + Shows what would happen if the command were to run. No actions are actually performed. + + .PARAMETER Confirm + Prompts you for confirmation before executing any changing operations within the command. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Agent, Alert + Author: Garry Bargsley (@gbargsley), garrybargsley.com + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Set-DbaAgentAlert + + .EXAMPLE + PS C:\> Set-DbaAgentAlert -SqlInstance sql1 -Alert 'Severity 025: Fatal Error' -Disabled + + Changes the alert to disabled. + + .EXAMPLE + PS C:\> Set-DbaAgentAlert -SqlInstance sql1 -Alert 'Severity 025: Fatal Error', 'Error Number 825', 'Error Number 824' -Enabled + + Changes multiple alerts to enabled. + + .EXAMPLE + PS C:\> Set-DbaAgentAlert -SqlInstance sql1, sql2, sql3 -Alert 'Severity 025: Fatal Error', 'Error Number 825', 'Error Number 824' -Enabled + + Changes multiple alerts to enabled on multiple servers. + + .EXAMPLE + PS C:\> Set-DbaAgentAlert -SqlInstance sql1 -Alert 'Severity 025: Fatal Error' -Disabled -WhatIf + + Doesn't Change the alert but shows what would happen. + + #> + [CmdletBinding(SupportsShouldProcess, ConfirmImpact = "Low")] + param ( + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [object[]]$Alert, + [string]$NewName, + [switch]$Enabled, + [switch]$Disabled, + [switch]$Force, + [parameter(ValueFromPipeline)] + [Microsoft.SqlServer.Management.Smo.Agent.Alert[]]$InputObject, + [switch][Alias('Silent')] + $EnableException + ) + + begin { + } + process { + + if (Test-FunctionInterrupt) { return } + + if ((-not $InputObject) -and (-not $Alert)) { + Stop-Function -Message "You must specify an alert name or pipe in results from another command" -Target $sqlinstance + return + } + + foreach ($instance in $sqlinstance) { + # Try connecting to the instance + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + foreach ($a in $Alert) { + # Check if the alert exists + if ($server.JobServer.Alerts.Name -notcontains $a) { + Stop-Function -Message "Alert $a doesn't exists on $instance" -Target $instance + } else { + # Get the alert + try { + $InputObject += $server.JobServer.Alerts[$a] + + # Refresh the object + $InputObject.Refresh() + } catch { + Stop-Function -Message "Something went wrong retrieving the alert" -Target $a -ErrorRecord $_ -Continue + } + } + } + } + + foreach ($currentalert in $InputObject) { + $server = $currentalert.Parent.Parent + + #region alert options + # Settings the options for the alert + if ($NewName) { + Write-Message -Message "Setting alert name to $NewName" -Level Verbose + $currentalert.Rename($NewName) + } + + if ($Enabled) { + Write-Message -Message "Setting alert to enabled" -Level Verbose + $currentalert.IsEnabled = $true + } + + if ($Disabled) { + Write-Message -Message "Setting alert to disabled" -Level Verbose + $currentalert.IsEnabled = $false + } + + #endregion alert options + + # Execute + if ($PSCmdlet.ShouldProcess($SqlInstance, "Changing the alert $a")) { + try { + Write-Message -Message "Changing the alert" -Level Verbose + + # Change the alert + $currentalert.Alter() + } catch { + Stop-Function -Message "Something went wrong changing the alert" -ErrorRecord $_ -Target $instance -Continue + } + Get-DbaAgentAlert -SqlInstance $server | Where-Object Name -eq $currentalert.name + } + } + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function Set-DbaAgentJob { + <# + .SYNOPSIS + Set-DbaAgentJob updates a job. + + .DESCRIPTION + Set-DbaAgentJob updates a job in the SQL Server Agent with parameters supplied. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. You must have sysadmin access and server version must be SQL Server version 2000 or greater. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Job + The name of the job. + + .PARAMETER Schedule + Schedule to attach to job. This can be more than one schedule. + + .PARAMETER ScheduleId + Schedule ID to attach to job. This can be more than one schedule ID. + + .PARAMETER NewName + The new name for the job. + + .PARAMETER Enabled + Enabled the job. + + .PARAMETER Disabled + Disabled the job + + .PARAMETER Description + The description of the job. + + .PARAMETER StartStepId + The identification number of the first step to execute for the job. + + .PARAMETER Category + The category of the job. + + .PARAMETER OwnerLogin + The name of the login that owns the job. + + .PARAMETER EventLogLevel + Specifies when to place an entry in the Microsoft Windows application log for this job. + Allowed values 0, "Never", 1, "OnSuccess", 2, "OnFailure", 3, "Always" + The text value van either be lowercase, uppercase or something in between as long as the text is correct. + + .PARAMETER EmailLevel + Specifies when to send an e-mail upon the completion of this job. + Allowed values 0, "Never", 1, "OnSuccess", 2, "OnFailure", 3, "Always" + The text value van either be lowercase, uppercase or something in between as long as the text is correct. + + .PARAMETER NetsendLevel + Specifies when to send a network message upon the completion of this job. + Allowed values 0, "Never", 1, "OnSuccess", 2, "OnFailure", 3, "Always" + The text value van either be lowercase, uppercase or something in between as long as the text is correct. + + .PARAMETER PageLevel + Specifies when to send a page upon the completion of this job. + Allowed values 0, "Never", 1, "OnSuccess", 2, "OnFailure", 3, "Always" + The text value van either be lowercase, uppercase or something in between as long as the text is correct. + + .PARAMETER EmailOperator + The e-mail name of the operator to whom the e-mail is sent when EmailLevel is reached. + + .PARAMETER NetsendOperator + The name of the operator to whom the network message is sent. + + .PARAMETER PageOperator + The name of the operator to whom a page is sent. + + .PARAMETER DeleteLevel + Specifies when to delete the job. + Allowed values 0, "Never", 1, "OnSuccess", 2, "OnFailure", 3, "Always" + The text value van either be lowercase, uppercase or something in between as long as the text is correct. + + .PARAMETER Force + The force parameter will ignore some errors in the parameters and assume defaults. + + .PARAMETER InputObject + Enables piping job objects + + .PARAMETER WhatIf + Shows what would happen if the command were to run. No actions are actually performed. + + .PARAMETER Confirm + Prompts you for confirmation before executing any changing operations within the command. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Agent, Job + Author: Sander Stad (@sqlstad), sqlstad.nl + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Set-DbaAgentJob + + .EXAMPLE + PS C:\> Set-DbaAgentJob sql1 -Job Job1 -Disabled + + Changes the job to disabled + + .EXAMPLE + PS C:\> Set-DbaAgentJob sql1 -Job Job1 -OwnerLogin user1 + + Changes the owner of the job + + .EXAMPLE + PS C:\> Set-DbaAgentJob -SqlInstance sql1 -Job Job1 -EventLogLevel OnSuccess + + Changes the job and sets the notification to write to the Windows Application event log on success + + .EXAMPLE + PS C:\> Set-DbaAgentJob -SqlInstance sql1 -Job Job1 -EmailLevel OnFailure -EmailOperator dba + + Changes the job and sets the notification to send an e-mail to the e-mail operator + + .EXAMPLE + PS C:\> Set-DbaAgentJob -SqlInstance sql1 -Job Job1, Job2, Job3 -Enabled + + Changes multiple jobs to enabled + + .EXAMPLE + PS C:\> Set-DbaAgentJob -SqlInstance sql1, sql2, sql3 -Job Job1, Job2, Job3 -Enabled + + Changes multiple jobs to enabled on multiple servers + + .EXAMPLE + PS C:\> Set-DbaAgentJob -SqlInstance sql1 -Job Job1 -Description 'Just another job' -Whatif + + Doesn't Change the job but shows what would happen. + + .EXAMPLE + PS C:\> Set-DbaAgentJob -SqlInstance sql1, sql2, sql3 -Job 'Job One' -Description 'Job One' + + Changes a job with the name "Job1" on multiple servers to have another description + + .EXAMPLE + PS C:\> sql1, sql2, sql3 | Set-DbaAgentJob -Job Job1 -Description 'Job One' + + Changes a job with the name "Job1" on multiple servers to have another description using pipe line + + #> + [CmdletBinding(SupportsShouldProcess, ConfirmImpact = "Low")] + param ( + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [object[]]$Job, + [object[]]$Schedule, + [int[]]$ScheduleId, + [string]$NewName, + [switch]$Enabled, + [switch]$Disabled, + [string]$Description, + [int]$StartStepId, + [string]$Category, + [string]$OwnerLogin, + [ValidateSet(0, "Never", 1, "OnSuccess", 2, "OnFailure", 3, "Always")] + [object]$EventLogLevel, + [ValidateSet(0, "Never", 1, "OnSuccess", 2, "OnFailure", 3, "Always")] + [object]$EmailLevel, + [ValidateSet(0, "Never", 1, "OnSuccess", 2, "OnFailure", 3, "Always")] + [object]$NetsendLevel, + [ValidateSet(0, "Never", 1, "OnSuccess", 2, "OnFailure", 3, "Always")] + [object]$PageLevel, + [string]$EmailOperator, + [string]$NetsendOperator, + [string]$PageOperator, + [ValidateSet(0, "Never", 1, "OnSuccess", 2, "OnFailure", 3, "Always")] + [object]$DeleteLevel, + [switch]$Force, + [parameter(ValueFromPipeline)] + [Microsoft.SqlServer.Management.Smo.Agent.Job[]]$InputObject, + [switch][Alias('Silent')] + $EnableException + ) + + begin { + # Check of the event log level is of type string and set the integer value + if (($EventLogLevel -notin 0, 1, 2, 3) -and ($null -ne $EventLogLevel)) { + $EventLogLevel = switch ($EventLogLevel) { "Never" { 0 } "OnSuccess" { 1 } "OnFailure" { 2 } "Always" { 3 } } + } + + # Check of the email level is of type string and set the integer value + if (($EmailLevel -notin 0, 1, 2, 3) -and ($null -ne $EmailLevel)) { + $EmailLevel = switch ($EmailLevel) { "Never" { 0 } "OnSuccess" { 1 } "OnFailure" { 2 } "Always" { 3 } } + } + + # Check of the net send level is of type string and set the integer value + if (($NetsendLevel -notin 0, 1, 2, 3) -and ($null -ne $NetsendLevel)) { + $NetsendLevel = switch ($NetsendLevel) { "Never" { 0 } "OnSuccess" { 1 } "OnFailure" { 2 } "Always" { 3 } } + } + + # Check of the page level is of type string and set the integer value + if (($PageLevel -notin 0, 1, 2, 3) -and ($null -ne $PageLevel)) { + $PageLevel = switch ($PageLevel) { "Never" { 0 } "OnSuccess" { 1 } "OnFailure" { 2 } "Always" { 3 } } + } + + # Check of the delete level is of type string and set the integer value + if (($DeleteLevel -notin 0, 1, 2, 3) -and ($null -ne $DeleteLevel)) { + $DeleteLevel = switch ($DeleteLevel) { "Never" { 0 } "OnSuccess" { 1 } "OnFailure" { 2 } "Always" { 3 } } + } + + # Check the e-mail operator name + if (($EmailLevel -ge 1) -and (-not $EmailOperator)) { + Stop-Function -Message "Please set the e-mail operator when the e-mail level parameter is set." -Target $sqlinstance + return + } + + # Check the e-mail operator name + if (($NetsendLevel -ge 1) -and (-not $NetsendOperator)) { + Stop-Function -Message "Please set the netsend operator when the netsend level parameter is set." -Target $sqlinstance + return + } + + # Check the e-mail operator name + if (($PageLevel -ge 1) -and (-not $PageOperator)) { + Stop-Function -Message "Please set the page operator when the page level parameter is set." -Target $sqlinstance + return + } + } + + process { + + if (Test-FunctionInterrupt) { return } + + if ((-not $InputObject) -and (-not $Job)) { + Stop-Function -Message "You must specify a job name or pipe in results from another command" -Target $sqlinstance + return + } + + foreach ($instance in $sqlinstance) { + # Try connecting to the instance + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + foreach ($j in $Job) { + + # Check if the job exists + if ($server.JobServer.Jobs.Name -notcontains $j) { + Stop-Function -Message "Job $j doesn't exists on $instance" -Target $instance + } else { + # Get the job + try { + $InputObject += $server.JobServer.Jobs[$j] + + # Refresh the object + $InputObject.Refresh() + } catch { + Stop-Function -Message "Something went wrong retrieving the job" -Target $j -ErrorRecord $_ -Continue + } + } + } + } + + foreach ($currentjob in $InputObject) { + $server = $currentjob.Parent.Parent + + #region job options + # Settings the options for the job + if ($NewName) { + Write-Message -Message "Setting job name to $NewName" -Level Verbose + $currentjob.Rename($NewName) + } + + if ($Schedule) { + # Loop through each of the schedules + foreach ($s in $Schedule) { + if ($server.JobServer.SharedSchedules.Name -contains $s) { + # Get the schedule ID + $sID = $server.JobServer.SharedSchedules[$s].ID + + # Add schedule to job + Write-Message -Message "Adding schedule id $sID to job" -Level Verbose + $currentjob.AddSharedSchedule($sID) + } else { + Stop-Function -Message "Schedule $s cannot be found on instance $instance" -Target $s -Continue + } + + } + } + + if ($ScheduleId) { + # Loop through each of the schedules IDs + foreach ($sID in $ScheduleId) { + # Check if the schedule is + if ($server.JobServer.SharedSchedules.ID -contains $sID) { + # Add schedule to job + Write-Message -Message "Adding schedule id $sID to job" -Level Verbose + $currentjob.AddSharedSchedule($sID) + + } else { + Stop-Function -Message "Schedule ID $sID cannot be found on instance $instance" -Target $sID -Continue + } + } + } + + if ($Enabled) { + Write-Message -Message "Setting job to enabled" -Level Verbose + $currentjob.IsEnabled = $true + } + + if ($Disabled) { + Write-Message -Message "Setting job to disabled" -Level Verbose + $currentjob.IsEnabled = $false + } + + if ($Description) { + Write-Message -Message "Setting job description to $Description" -Level Verbose + $currentjob.Description = $Description + } + + if ($Category) { + # Check if the job category exists + if ($Category -notin $server.JobServer.JobCategories.Name) { + if ($Force) { + if ($PSCmdlet.ShouldProcess($instance, "Creating job category on $instance")) { + try { + # Create the category + New-DbaAgentJobCategory -SqlInstance $instance -Category $Category + + Write-Message -Message "Setting job category to $Category" -Level Verbose + $currentjob.Category = $Category + } catch { + Stop-Function -Message "Couldn't create job category $Category from $instance" -Target $instance -ErrorRecord $_ + } + } + } else { + Stop-Function -Message "Job category $Category doesn't exist on $instance. Use -Force to create it." -Target $instance + return + } + } else { + Write-Message -Message "Setting job category to $Category" -Level Verbose + $currentjob.Category = $Category + } + } + + if ($StartStepId) { + # Get the job steps + $currentjobSteps = $currentjob.JobSteps + + # Check if there are any job steps + if ($currentjobSteps.Count -ge 1) { + # Check if the start step id value is one of the job steps in the job + if ($currentjobSteps.ID -contains $StartStepId) { + Write-Message -Message "Setting job start step id to $StartStepId" -Level Verbose + $currentjob.StartStepID = $StartStepId + } else { + Write-Message -Message "The step id is not present in job $j on instance $instance" -Warning + } + + } else { + Stop-Function -Message "There are no job steps present for job $j on instance $instance" -Target $instance -Continue + } + + } + + if ($OwnerLogin) { + # Check if the login name is present on the instance + if ($server.Logins.Name -contains $OwnerLogin) { + Write-Message -Message "Setting job owner login name to $OwnerLogin" -Level Verbose + $currentjob.OwnerLoginName = $OwnerLogin + } else { + Stop-Function -Message "The given owner log in name $OwnerLogin does not exist on instance $instance" -Target $instance -Continue + } + } + + if (Test-Bound -ParameterName EventLogLevel) { + Write-Message -Message "Setting job event log level to $EventlogLevel" -Level Verbose + $currentjob.EventLogLevel = $EventLogLevel + } + + if (Test-Bound -ParameterName EmailLevel) { + # Check if the notifiction needs to be removed + if ($EmailLevel -eq 0) { + # Remove the operator + $currentjob.OperatorToEmail = $null + + # Remove the notification + $currentjob.EmailLevel = $EmailLevel + } else { + # Check if either the operator e-mail parameter is set or the operator is set in the job + if ($EmailOperator -or $currentjob.OperatorToEmail) { + Write-Message -Message "Setting job e-mail level to $EmailLevel" -Level Verbose + $currentjob.EmailLevel = $EmailLevel + } else { + Stop-Function -Message "Cannot set e-mail level $EmailLevel without a valid e-mail operator name" -Target $instance -Continue + } + } + } + + if (Test-Bound -ParameterName NetsendLevel) { + # Check if the notifiction needs to be removed + if ($NetsendLevel -eq 0) { + # Remove the operator + $currentjob.OperatorToNetSend = $null + + # Remove the notification + $currentjob.NetSendLevel = $NetsendLevel + } else { + # Check if either the operator netsend parameter is set or the operator is set in the job + if ($NetsendOperator -or $currentjob.OperatorToNetSend) { + Write-Message -Message "Setting job netsend level to $NetsendLevel" -Level Verbose + $currentjob.NetSendLevel = $NetsendLevel + } else { + Stop-Function -Message "Cannot set netsend level $NetsendLevel without a valid netsend operator name" -Target $instance -Continue + } + } + } + + if (Test-Bound -ParameterName PageLevel) { + # Check if the notifiction needs to be removed + if ($PageLevel -eq 0) { + # Remove the operator + $currentjob.OperatorToPage = $null + + # Remove the notification + $currentjob.PageLevel = $PageLevel + } else { + # Check if either the operator pager parameter is set or the operator is set in the job + if ($PageOperator -or $currentjob.OperatorToPage) { + Write-Message -Message "Setting job pager level to $PageLevel" -Level Verbose + $currentjob.PageLevel = $PageLevel + } else { + Stop-Function -Message "Cannot set page level $PageLevel without a valid netsend operator name" -Target $instance -Continue + } + } + } + + # Check the current setting of the job's email level + if ($EmailOperator) { + # Check if the operator name is present + if ($server.JobServer.Operators.Name -contains $EmailOperator) { + Write-Message -Message "Setting job e-mail operator to $EmailOperator" -Level Verbose + $currentjob.OperatorToEmail = $EmailOperator + } else { + Stop-Function -Message "The e-mail operator name $EmailOperator does not exist on instance $instance. Exiting.." -Target $j -Continue + } + } + + if ($NetsendOperator) { + # Check if the operator name is present + if ($server.JobServer.Operators.Name -contains $NetsendOperator) { + Write-Message -Message "Setting job netsend operator to $NetsendOperator" -Level Verbose + $currentjob.OperatorToNetSend = $NetsendOperator + } else { + Stop-Function -Message "The netsend operator name $NetsendOperator does not exist on instance $instance. Exiting.." -Target $j -Continue + } + } + + if ($PageOperator) { + # Check if the operator name is present + if ($server.JobServer.Operators.Name -contains $PageOperator) { + Write-Message -Message "Setting job pager operator to $PageOperator" -Level Verbose + $currentjob.OperatorToPage = $PageOperator + } else { + Stop-Function -Message "The page operator name $PageOperator does not exist on instance $instance. Exiting.." -Target $instance -Continue + } + } + + if (Test-Bound -ParameterName DeleteLevel) { + Write-Message -Message "Setting job delete level to $DeleteLevel" -Level Verbose + $currentjob.DeleteLevel = $DeleteLevel + } + #endregion job options + + # Execute + if ($PSCmdlet.ShouldProcess($SqlInstance, "Changing the job $j")) { + try { + Write-Message -Message "Changing the job" -Level Verbose + + # Change the job + $currentjob.Alter() + } catch { + Stop-Function -Message "Something went wrong changing the job" -ErrorRecord $_ -Target $instance -Continue + } + Get-DbaAgentJob -SqlInstance $server | Where-Object Name -eq $currentjob.name + } + } + } + + end { + Write-Message -Message "Finished changing job(s)" -Level Verbose + } +} +function Set-DbaAgentJobCategory { + <# + .SYNOPSIS + Set-DbaAgentJobCategory changes a job category. + + .DESCRIPTION + Set-DbaAgentJobCategory makes it possible to change a job category. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. You must have sysadmin access and server version must be SQL Server version 2000 or greater. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Category + The name of the category + + .PARAMETER NewName + New name of the job category + + .PARAMETER Force + The force parameter will ignore some errors in the parameters and assume defaults. + + .PARAMETER WhatIf + Shows what would happen if the command were to run. No actions are actually performed. + + .PARAMETER Confirm + Prompts you for confirmation before executing any changing operations within the command. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Agent, Job, JobCategory + Author: Sander Stad (@sqlstad), sqlstad.nl + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Set-DbaAgentJobCategory + + .EXAMPLE + PS C:\> New-DbaAgentJobCategory -SqlInstance sql1 -Category 'Category 1' -NewName 'Category 2' + + Change the name of the category from 'Category 1' to 'Category 2'. + + .EXAMPLE + PS C:\> Set-DbaAgentJobCategory -SqlInstance sql1, sql2 -Category Category1, Category2 -NewName cat1, cat2 + + Rename multiple jobs in one go on multiple servers. + + #> + [CmdletBinding(SupportsShouldProcess, ConfirmImpact = "Low")] + [Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSUseOutputTypeCorrectly", "", Justification = "PSSA Rule Ignored by BOH")] + param ( + [parameter(Mandatory, ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [ValidateNotNullOrEmpty()] + [string[]]$Category, + [string[]]$NewName, + [switch]$Force, + [Alias('Silent')] + [switch]$EnableException + ) + + begin { + # Create array list to hold the results + $collection = New-Object System.Collections.ArrayList + + # Check if multiple categories are being changed + if ($Category.Count -gt 1 -and $NewName.Count -eq 1) { + Stop-Function -Message "You cannot rename multiple jobs to the same name" -Target $instance + } + } + + process { + + foreach ($instance in $sqlinstance) { + # Try connecting to the instance + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + # Loop through each of the categories + foreach ($cat in $Category) { + # Check if the category exists + if ($cat -notin $server.JobServer.JobCategories.Name) { + Stop-Function -Message "Job category $cat doesn't exist on $instance" -Target $instance -Continue + } + + # Check if the category already exists + if ($NewName -and ($NewName -in $server.JobServer.JobCategories.Name)) { + Stop-Function -Message "Job category $NewName already exists on $instance" -Target $instance -Continue + } + + if ($PSCmdlet.ShouldProcess($instance, "Changing the job category $Category")) { + try { + # Get the job category object + $currentCategory = $server.JobServer.JobCategories[$cat] + + Write-Message -Message "Changing job category $cat" -Level Verbose + + # Get and set the original and new values + $originalCategoryName = $currentCategory.Name + $newCategoryName = $null + + # Check if the job category needs to be renamed + if ($NewName) { + $currentCategory.Rename($NewName[$Category.IndexOf($cat)]) + $newCategoryName = $currentCategory.Name + } + + Get-DbaAgentJobCategory -SqlInstance $server -Category $newCategoryName + } catch { + Stop-Function -Message "Something went wrong changing the job category $cat on $instance" -Target $cat -Continue -ErrorRecord $_ + } + } + } + } + } + end { + Write-Message -Message "Finished changing job category." -Level Verbose + } +} +function Set-DbaAgentJobOutputFile { + <# + .Synopsis + Set the output file for a step within an Agent job. + + .DESCRIPTION + Sets the Output File for a step of an agent job with the Job Names and steps provided dynamically if required + + .PARAMETER SqlInstance + The target SQL Server instance or instances. + + .PARAMETER SQLCredential + Credential object used to connect to the SQL Server as a different user be it Windows or SQL Server. Windows users are determined by the existence of a backslash, so if you are intending to use an alternative Windows connection instead of a SQL login, ensure it contains a backslash. + + .PARAMETER Job + The job to process - this list is auto-populated from the server. + + .PARAMETER Step + The Agent Job Step to provide Output File Path for. Also available dynamically + + .PARAMETER OutputFile + The Full Path to the New Output file + + .PARAMETER WhatIf + Shows what would happen if the command were to run. No actions are actually performed. + + .PARAMETER Confirm + Prompts you for confirmation before executing any changing operations within the command. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Agent, Job, SqlAgent + Author: Rob Sewell, https://sqldbawithabeard.com + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .EXAMPLE + PS C:\> Set-DbaAgentJobOutputFile -SqlInstance SERVERNAME -Job 'The Agent Job' -OutPutFile E:\Logs\AgentJobStepOutput.txt + + Sets the Job step for The Agent job on SERVERNAME to E:\Logs\AgentJobStepOutput.txt + + #> + [CmdletBinding(SupportsShouldProcess)] + param ( + [Parameter(Mandatory, HelpMessage = 'The SQL Server Instance', + ValueFromPipeline, + ValueFromPipelineByPropertyName = $true, + ValueFromRemainingArguments = $false, + Position = 0)] + [ValidateNotNull()] + [ValidateNotNullOrEmpty()] + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [Parameter(HelpMessage = 'SQL Credential', + ValueFromPipeline, + ValueFromPipelineByPropertyName = $true, + ValueFromRemainingArguments = $false)] + [PSCredential]$SqlCredential, + [object[]]$Job, + [Parameter(HelpMessage = 'The Job Step name', + ValueFromPipeline, + ValueFromPipelineByPropertyName = $true)] + [ValidateNotNull()] + [ValidateNotNullOrEmpty()] + [object[]]$Step, + [Parameter(Mandatory, HelpMessage = 'The Full Output File Path', + ValueFromPipeline, + ValueFromPipelineByPropertyName = $true, + ValueFromRemainingArguments = $false)] + [ValidateNotNull()] + [ValidateNotNullOrEmpty()] + [string]$OutputFile, + [Alias('Silent')] + [switch]$EnableException + ) + + foreach ($instance in $sqlinstance) { + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $sqlcredential + } catch { + Write-Message -Level Warning -Message "Failed to connect to: $instance" + continue + } + + if (!$Job) { + # This is because jobname isn't yet required + Write-Message -Level Warning -Message "You must specify a job using the -Job parameter." + return + } + + foreach ($name in $Job) { + $currentJob = $server.JobServer.Jobs[$name] + + if ($Step) { + $steps = $currentJob.JobSteps | Where-Object Name -in $Step + + if (!$steps) { + Write-Message -Level Warning -Message "$Step didn't return any steps" + return + } + } else { + if (($currentJob.JobSteps).Count -gt 1) { + Write-Message -Level Output -Message "Which Job Step do you wish to add output file to?" + $steps = $currentJob.JobSteps | Out-GridView -Title "Choose the Job Steps to add an output file to" -PassThru -Verbose + } else { + $steps = $currentJob.JobSteps + } + } + + if (!$steps) { + $steps = $currentJob.JobSteps + } + + foreach ($jobstep in $steps) { + $currentoutputfile = $jobstep.OutputFileName + + Write-Message -Level Verbose -Message "Current Output File for $currentJob is $currentoutputfile" + Write-Message -Level Verbose -Message "Adding $OutputFile to $jobstep for $currentJob" + + try { + if ($Pscmdlet.ShouldProcess($jobstep, "Changing Output File from $currentoutputfile to $OutputFile")) { + $jobstep.OutputFileName = $OutputFile + $jobstep.Alter() + $jobstep.Refresh() + + [pscustomobject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + Job = $currentJob.Name + JobStep = $jobstep.Name + OutputFileName = $currentoutputfile + } + } + } catch { + Stop-Function -Message "Failed to add $OutputFile to $jobstep for $currentJob" -InnerErrorRecord $_ -Target $currentJob + } + } + } + } +} +function Set-DbaAgentJobOwner { + <# + .SYNOPSIS + Sets SQL Agent job owners with a desired login if jobs do not match that owner. + + .DESCRIPTION + This function alters SQL Agent Job ownership to match a specified login if their current owner does not match the target login. By default, the target login will be 'sa', + but the the user may specify a different login for ownership. This be applied to all jobs or only to a select collection of jobs. + + Best practice reference: http://sqlmag.com/blog/sql-server-tip-assign-ownership-jobs-sysadmin-account + + If the 'sa' account was renamed, the new name will be used. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Job + Specifies the job(s) to process. Options for this list are auto-populated from the server. If unspecified, all jobs will be processed. + + .PARAMETER ExcludeJob + Specifies the job(s) to exclude from processing. Options for this list are auto-populated from the server. + + .PARAMETER InputObject + Enables piped input from Get-DbaAgentJob + + .PARAMETER Login + Specifies the login that you wish check for ownership. This defaults to 'sa' or the sysadmin name if sa was renamed. This must be a valid security principal which exists on the target server. + + .PARAMETER WhatIf + If this switch is enabled, no actions are performed but informational messages will be displayed that explain what would happen if the command were to run. + + .PARAMETER Confirm + If this switch is enabled, you will be prompted for confirmation before executing any operations that change state. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Agent, Job + Author: Michael Fal (@Mike_Fal), http://mikefal.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Set-DbaAgentJobOwner + + .EXAMPLE + PS C:\> Set-DbaAgentJobOwner -SqlInstance localhost + + Sets SQL Agent Job owner to sa on all jobs where the owner does not match sa. + + .EXAMPLE + PS C:\> Set-DbaAgentJobOwner -SqlInstance localhost -Login DOMAIN\account + + Sets SQL Agent Job owner to 'DOMAIN\account' on all jobs where the owner does not match 'DOMAIN\account'. Note + that Login must be a valid security principal that exists on the target server. + + .EXAMPLE + PS C:\> Set-DbaAgentJobOwner -SqlInstance localhost -Job job1, job2 + + Sets SQL Agent Job owner to 'sa' on the job1 and job2 jobs if their current owner does not match 'sa'. + + .EXAMPLE + PS C:\> 'sqlserver','sql2016' | Set-DbaAgentJobOwner + + Sets SQL Agent Job owner to sa on all jobs where the owner does not match sa on both sqlserver and sql2016. + + .EXAMPLE + PS C:\> Get-DbaAgentJob -SqlInstance vmsql | Where-Object OwnerLoginName -eq login1 | Set-DbaAgentJobOwner -TargetLogin login2 | Out-Gridview + + Sets SQL Agent Job owner to login2 where their current owner is login1 on instance vmsql. Send result to gridview. + #> + [CmdletBinding(SupportsShouldProcess)] + param ( + [parameter(ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [Alias("Jobs")] + [object[]]$Job, + [object[]]$ExcludeJob, + [Parameter(ValueFromPipeline)] + [Microsoft.SqlServer.Management.Smo.Agent.Job[]]$InputObject, + [Alias("TargetLogin")] + [string]$Login, + [Alias('Silent')] + [switch]$EnableException + ) + begin { + Test-DbaDeprecation -DeprecatedOn "1.0.0" -Alias Set-DbaJobOwner + } + process { + foreach ($instance in $SqlInstance) { + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $sqlcredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + #Get job list. If value for -Job is passed, massage to make it a string array. + #Otherwise, use all jobs on the instance where owner not equal to -TargetLogin + Write-Message -Level Verbose -Message "Gathering jobs to update." + + if ($Job) { + $jobcollection = $server.JobServer.Jobs | Where-Object {$Job -contains $_.Name} + } else { + $jobcollection = $server.JobServer.Jobs + } + + if ($ExcludeJob) { + $jobcollection = $jobcollection | Where-Object { $ExcludeJob -notcontains $_.Name } + } + + $InputObject += $jobcollection + } + + Write-Message -Level Verbose -Message "Updating $($InputObject.Count) job(s)." + foreach ($agentJob in $InputObject) { + $jobname = $agentJob.Name + $server = $agentJob.Parent.Parent + + if (-not $Login) { + # dynamic sa name for orgs who have changed their sa name + $newLogin = ($server.logins | Where-Object { $_.id -eq 1 }).Name + } else { + $newLogin = $Login + } + + #Validate login + if ($agentJob.OwnerLoginName -eq $newLogin) { + $status = 'Skipped' + $notes = "Owner already set" + } else { + if (($server.Logins.Name) -notcontains $newLogin) { + $status = 'Failed' + $notes = "Login $newLogin not valid" + } else { + if ($server.logins[$newLogin].LoginType -eq 'WindowsGroup') { + $status = 'Failed' + $notes = "$newLogin is a Windows Group and can not be a job owner." + } else { + if ($PSCmdlet.ShouldProcess($instance, "Setting job owner for $jobname to $newLogin")) { + try { + Write-Message -Level Verbose -Message "Setting job owner for $jobname to $newLogin on $instance." + #Set job owner to $TargetLogin (default 'sa') + $agentJob.OwnerLoginName = $newLogin + $agentJob.Alter() + $status = 'Successful' + $notes = '' + } catch { + Stop-Function -Message "Issue setting job owner on $jobName." -Target $jobName -InnerErrorRecord $_ -Category InvalidOperation + } + } + } + } + } + Add-Member -Force -InputObject $agentJob -MemberType NoteProperty -Name ComputerName -value $server.ComputerName + Add-Member -Force -InputObject $agentJob -MemberType NoteProperty -Name InstanceName -value $server.ServiceName + Add-Member -Force -InputObject $agentJob -MemberType NoteProperty -Name SqlInstance -value $server.DomainInstanceName + Add-Member -Force -InputObject $agentJob -MemberType NoteProperty -Name Status -value $status + Add-Member -Force -InputObject $agentJob -MemberType NoteProperty -Name Notes -value $notes + Select-DefaultView -InputObject $agentJob -Property ComputerName, InstanceName, SqlInstance, Name, Category, OwnerLoginName, Status, Notes + } + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function Set-DbaAgentJobStep { + <# + .SYNOPSIS + Set-DbaAgentJobStep updates a job step. + + .DESCRIPTION + Set-DbaAgentJobStep updates a job step in the SQL Server Agent with parameters supplied. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. You must have sysadmin access and server version must be SQL Server version 2000 or greater. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Job + The name of the job. Can be null if the the job id is being used. + + .PARAMETER StepName + The name of the step. + + .PARAMETER NewName + The new name for the step in case it needs to be renamed. + + .PARAMETER SubSystem + The subsystem used by the SQL Server Agent service to execute command. + Allowed values 'ActiveScripting','AnalysisCommand','AnalysisQuery','CmdExec','Distribution','LogReader','Merge','PowerShell','QueueReader','Snapshot','Ssis','TransactSql' + + .PARAMETER SubSystemServer + The subsystems AnalysisScripting, AnalysisCommand, AnalysisQuery ned the server property to be able to apply + + .PARAMETER Command + The commands to be executed by SQLServerAgent service through subsystem. + + .PARAMETER CmdExecSuccessCode + The value returned by a CmdExec subsystem command to indicate that command executed successfully. + + .PARAMETER OnSuccessAction + The action to perform if the step succeeds. + Allowed values "QuitWithSuccess" (default), "QuitWithFailure", "GoToNextStep", "GoToStep". + The text value van either be lowercase, uppercase or something in between as long as the text is correct. + + .PARAMETER OnSuccessStepId + The ID of the step in this job to execute if the step succeeds and OnSuccessAction is "GoToNextStep". + + .PARAMETER OnFailAction + The action to perform if the step fails. + Allowed values "QuitWithSuccess" (default), "QuitWithFailure", "GoToNextStep", "GoToStep". + The text value van either be lowercase, uppercase or something in between as long as the text is correct. + + .PARAMETER OnFailStepId + The ID of the step in this job to execute if the step fails and OnFailAction is "GoToNextStep". + + .PARAMETER Database + The name of the database in which to execute a Transact-SQL step. The default is 'master'. + + .PARAMETER DatabaseUser + The name of the user account to use when executing a Transact-SQL step. The default is 'sa'. + + .PARAMETER RetryAttempts + The number of retry attempts to use if this step fails. The default is 0. + + .PARAMETER RetryInterval + The amount of time in minutes between retry attempts. The default is 0. + + .PARAMETER OutputFileName + The name of the file in which the output of this step is saved. + + .PARAMETER Flag + Sets the flag(s) for the job step. + + Flag Description + ---------------------------------------------------------------------------- + AppendAllCmdExecOutputToJobHistory Job history, including command output, is appended to the job history file. + AppendToJobHistory Job history is appended to the job history file. + AppendToLogFile Job history is appended to the SQL Server log file. + AppendToTableLog Job history is appended to a log table. + LogToTableWithOverwrite Job history is written to a log table, overwriting previous contents. + None Job history is not appended to a file. + ProvideStopProcessEvent Job processing is stopped. + + .PARAMETER ProxyName + The name of the proxy that the job step runs as. + + .PARAMETER WhatIf + Shows what would happen if the command were to run. No actions are actually performed. + + .PARAMETER Confirm + Prompts you for confirmation before executing any changing operations within the command. + + .PARAMETER InputObject + Enables piping job objects + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .PARAMETER Force + The force parameter will ignore some errors in the parameters and assume defaults. + + .NOTES + Tags: Agent, Job, JobStep + Author: Sander Stad (@sqlstad), sqlstad.nl + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Set-DbaAgentJobStep + + .EXAMPLE + PS C:\> Set-DbaAgentJobStep -SqlInstance sql1 -Job Job1 -StepName Step1 -NewName Step2 + + Changes the name of the step in "Job1" with the name Step1 to Step2 + + .EXAMPLE + PS C:\> Set-DbaAgentJobStep -SqlInstance sql1 -Job Job1 -StepName Step1 -Database msdb + + Changes the database of the step in "Job1" with the name Step1 to msdb + + .EXAMPLE + PS C:\> Set-DbaAgentJobStep -SqlInstance sql1 -Job Job1, Job2 -StepName Step1 -Database msdb + + Changes job steps in multiple jobs with the name Step1 to msdb + + .EXAMPLE + PS C:\> Set-DbaAgentJobStep -SqlInstance sql1, sql2, sql3 -Job Job1, Job2 -StepName Step1 -Database msdb + + Changes job steps in multiple jobs on multiple servers with the name Step1 to msdb + + .EXAMPLE + PS C:\> Set-DbaAgentJobStep -SqlInstance sql1, sql2, sql3 -Job Job1 -StepName Step1 -Database msdb + + Changes the database of the step in "Job1" with the name Step1 to msdb for multiple servers + + .EXAMPLE + PS C:\> sql1, sql2, sql3 | Set-DbaAgentJobStep -Job Job1 -StepName Step1 -Database msdb + + Changes the database of the step in "Job1" with the name Step1 to msdb for multiple servers using pipeline + + #> + [CmdletBinding(SupportsShouldProcess, ConfirmImpact = "Low")] + param ( + [parameter(Mandatory)] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [object[]]$Job, + [string]$StepName, + [string]$NewName, + [ValidateSet('ActiveScripting', 'AnalysisCommand', 'AnalysisQuery', 'CmdExec', 'Distribution', 'LogReader', 'Merge', 'PowerShell', 'QueueReader', 'Snapshot', 'Ssis', 'TransactSql')] + [string]$Subsystem, + [string]$SubsystemServer, + [string]$Command, + [int]$CmdExecSuccessCode, + [ValidateSet('QuitWithSuccess', 'QuitWithFailure', 'GoToNextStep', 'GoToStep')] + [string]$OnSuccessAction, + [int]$OnSuccessStepId, + [ValidateSet('QuitWithSuccess', 'QuitWithFailure', 'GoToNextStep', 'GoToStep')] + [string]$OnFailAction, + [int]$OnFailStepId, + [string]$Database, + [string]$DatabaseUser, + [int]$RetryAttempts, + [int]$RetryInterval, + [string]$OutputFileName, + [ValidateSet('AppendAllCmdExecOutputToJobHistory', 'AppendToJobHistory', 'AppendToLogFile', 'LogToTableWithOverwrite', 'None', 'ProvideStopProcessEvent')] + [string[]]$Flag, + [string]$ProxyName, + [parameter(ValueFromPipeline)] + [Microsoft.SqlServer.Management.Smo.Agent.JobStep[]]$InputObject, + [switch]$EnableException, + [switch]$Force + ) + + begin { + # Check the parameter on success step id + if (($OnSuccessAction -ne 'GoToStep') -and ($OnSuccessStepId -ge 1)) { + Stop-Function -Message "Parameter OnSuccessStepId can only be used with OnSuccessAction 'GoToStep'." -Target $SqlInstance + return + } + + # Check the parameter on success step id + if (($OnFailAction -ne 'GoToStep') -and ($OnFailStepId -ge 1)) { + Stop-Function -Message "Parameter OnFailStepId can only be used with OnFailAction 'GoToStep'." -Target $SqlInstance + return + } + } + + process { + + if (Test-FunctionInterrupt) { return } + + if ((-not $InputObject) -and (-not $Job)) { + Stop-Function -Message "You must specify a job name or pipe in results from another command" -Target $sqlinstance + return + } + + if ((-not $InputObject) -and (-not $StepName)) { + Stop-Function -Message "You must specify a job step name or pipe in results from another command" -Target $sqlinstance + return + } + + foreach ($instance in $sqlinstance) { + # Try connecting to the instance + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + foreach ($j in $Job) { + + # Check if the job exists + if ($server.JobServer.Jobs.Name -notcontains $j) { + Stop-Function -Message "Job $j doesn't exists on $instance" -Target $instance + } else { + # Get the job step + try { + $InputObject += $server.JobServer.Jobs[$j].JobSteps | Where-Object Name -in $StepName + + # Refresh the object + $InputObject.Refresh() + } catch { + Stop-Function -Message "Something went wrong retrieving the job step(s)" -Target $j -ErrorRecord $_ -Continue + } + } + } + } + + if ($Job) { + $InputObject = $InputObject | Where-Object {$_.Parent.Name -in $Job} + } + + if ($StepName) { + $InputObject = $InputObject | Where-Object Name -in $StepName + } + + foreach ($instance in $sqlinstance) { + + # Try connecting to the instance + try { + $Server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + foreach ($currentJobStep in $InputObject) { + if (-not $Force -and ($Server.JobServer.Jobs[$currentJobStep.Parent.Name].JobSteps.Name -notcontains $currentJobStep.Name)) { + Stop-Function -Message "Step $StepName doesn't exists for job $j" -Target $instance -Continue + } elseif ($Force -and ($Server.JobServer.Jobs[$currentJobStep.Parent.Name].JobSteps.Name -notcontains $currentJobStep.Name)) { + Write-Message -Message "Adding job step $($currentJobStep.Name) to $($currentJobStep.Parent.Name) on $instance" -Level Verbose + + try { + New-DbaAgentJobStep -SqlInstance $instance -SqlCredential $SqlCredential ` + -Job $currentJobStep.Parent.Name ` + -StepId $currentJobStep.ID ` + -StepName $currentJobStep.Name ` + -Subsystem $currentJobStep.SubSystem ` + -SubsystemServer $currentJobStep.Server ` + -Command $currentJobStep.Command ` + -CmdExecSuccessCode $currentJobStep.CmdExecSuccessCode ` + -OnFailAction $currentJobStep.OnFailAction ` + -OnSuccessAction $currentJobStep.OnSuccessAction ` + -OnSuccessStepId $currentJobStep..OnSuccessStepId ` + -OnFailStepId $currentJobStep.OnFailStepId ` + -Database $currentJobStep.Database ` + -DatabaseUser $currentJobStep.DatabaseUser ` + -RetryAttempts $currentJobStep.RetryAttempts ` + -RetryInterval $currentJobStep.RetryInterval ` + -OutputFileName $currentJobStep.OutputFileName ` + -Flag $currentJobStep.Flag ` + -ProxyName $currentJobStep.ProxyName ` + -EnableException + } catch { + Stop-Function -Message "Something went wrong creating the job step" -Target $instance -ErrorRecord $_ -Continue + } + + } else { + $JobStep = $server.JobServer.Jobs[$currentJobStep.Parent.Name].JobSteps[$currentJobStep.Name] + + Write-Message -Message "Modifying job $j on $instance" -Level Verbose + + #region job step options + # Setting the options for the job step + if ($NewName) { + Write-Message -Message "Setting job step name to $NewName" -Level Verbose + $JobStep.Rename($NewName) + } + + if ($Subsystem) { + Write-Message -Message "Setting job step subsystem to $Subsystem" -Level Verbose + $JobStep.Subsystem = $Subsystem + } else { + Write-Message -Message "Setting job step subsystem to $($currentJobStep.SubSystem)" -Level Verbose + $JobStep.Subsystem = $currentJobStep.Subsystem + } + + if ($SubsystemServer) { + Write-Message -Message "Setting job step subsystem server to $SubsystemServer" -Level Verbose + $JobStep.Server = $SubsystemServer + } elseif ($currentJobStep.Server) { + Write-Message -Message "Setting job step subsystem server to $($currentJobStep.Server)" -Level Verbose + $JobStep.Server = $currentJobStep.Server + } + + if ($Command) { + Write-Message -Message "Setting job step command to $Command" -Level Verbose + $JobStep.Command = $Command + } else { + Write-Message -Message "Setting job step command to $($currentJobStep.Command)" -Level Verbose + $JobStep.Command = $currentJobStep.Command + } + + if ($CmdExecSuccessCode) { + Write-Message -Message "Setting job step command exec success code to $CmdExecSuccessCode" -Level Verbose + $JobStep.CommandExecutionSuccessCode = $CmdExecSuccessCode + } else { + Write-Message -Message "Setting job step command exec success code to $($currentJobStep.CommandExecutionSuccessCode)" -Level Verbose + $JobStep.CommandExecutionSuccessCode = $currentJobStep.CommandExecutionSuccessCode + } + + if ($OnSuccessAction) { + Write-Message -Message "Setting job step success action to $OnSuccessAction" -Level Verbose + $JobStep.OnSuccessAction = $OnSuccessAction + } else { + Write-Message -Message "Setting job step success action to $($currentJobStep.OnSuccessAction)" -Level Verbose + $JobStep.OnSuccessAction = $currentJobStep.OnSuccessAction + } + + if ($OnSuccessStepId) { + Write-Message -Message "Setting job step success step id to $OnSuccessStepId" -Level Verbose + $JobStep.OnSuccessStep = $OnSuccessStepId + } else { + Write-Message -Message "Setting job step success step id to $($currentJobStep.OnSuccessStep)" -Level Verbose + $JobStep.OnSuccessStep = $currentJobStep.OnSuccessStep + } + + if ($OnFailAction) { + Write-Message -Message "Setting job step fail action to $OnFailAction" -Level Verbose + $JobStep.OnFailAction = $OnFailAction + } else { + Write-Message -Message "Setting job step fail action to $($currentJobStep.OnFailAction)" -Level Verbose + $JobStep.OnFailAction = $currentJobStep.OnFailAction + } + + if ($OnFailStepId) { + Write-Message -Message "Setting job step fail step id to $OnFailStepId" -Level Verbose + $JobStep.OnFailStep = $OnFailStepId + } else { + Write-Message -Message "Setting job step fail step id to $($currentJobStep.OnFailStep)" -Level Verbose + $JobStep.OnFailStep = $currentJobStep.OnFailStep + } + + if ($Database) { + # Check if the database is present on the server + if ($server.Databases.Name -contains $Database) { + Write-Message -Message "Setting job step database name to $Database" -Level Verbose + $JobStep.DatabaseName = $Database + } else { + Stop-Function -Message "The database is not present on instance $instance." -Target $instance -Continue + } + } else { + # Check if the database is present on the server + if ($server.Databases.Name -contains $currentJobStep.DatabaseName) { + Write-Message -Message "Setting job step database name to $($currentJobStep.DatabaseName)" -Level Verbose + $JobStep.DatabaseName = $currentJobStep.DatabaseName + } else { + Stop-Function -Message "The database is not present on instance $instance." -Target $instance -Continue + } + } + + if (($DatabaseUser) -and ($Database)) { + # Check if the username is present in the database + if ($Server.Databases[$currentJobStep.DatabaseName].Users.Name -contains $DatabaseUser) { + Write-Message -Message "Setting job step database username to $DatabaseUser" -Level Verbose + $JobStep.DatabaseUserName = $DatabaseUser + } else { + Stop-Function -Message "The database user is not present in the database $($currentJobStep.DatabaseName) on instance $instance." -Target $instance -Continue + } + } elseif ($currentJobStep.DatabaseUserName) { + # Check if the username is present in the database + if ($Server.Databases[$currentJobStep.DatabaseName].Users.Name -contains $currentJobStep.DatabaseUserName) { + Write-Message -Message "Setting job step database username to $($currentJobStep.DatabaseUserName)" -Level Verbose + $JobStep.DatabaseUserName = $currentJobStep.DatabaseUserName + } else { + Stop-Function -Message "The database user is not present in the database $($currentJobStep.DatabaseName) on instance $instance." -Target $instance -Continue + } + } + + if ($RetryAttempts) { + Write-Message -Message "Setting job step retry attempts to $RetryAttempts" -Level Verbose + $JobStep.RetryAttempts = $RetryAttempts + } else { + Write-Message -Message "Setting job step retry attempts to $($currentJobStep.RetryAttempts)" -Level Verbose + $JobStep.RetryAttempts = $currentJobStep.RetryAttempts + } + + if ($RetryInterval) { + Write-Message -Message "Setting job step retry interval to $RetryInterval" -Level Verbose + $JobStep.RetryInterval = $RetryInterval + } else { + Write-Message -Message "Setting job step retry interval to $($currentJobStep.RetryInterval)" -Level Verbose + $JobStep.RetryInterval = $currentJobStep.RetryInterval + } + + if ($OutputFileName) { + Write-Message -Message "Setting job step output file name to $OutputFileName" -Level Verbose + $JobStep.OutputFileName = $OutputFileName + } else { + Write-Message -Message "Setting job step output file name to $($currentJobStep.OutputFileName)" -Level Verbose + $JobStep.OutputFileName = $currentJobStep.OutputFileName + } + + if ($ProxyName) { + # Check if the proxy exists + if ($Server.JobServer.ProxyAccounts.Name -contains $ProxyName) { + Write-Message -Message "Setting job step proxy name to $ProxyName" -Level Verbose + $JobStep.ProxyName = $ProxyName + } else { + Stop-Function -Message "The proxy name $ProxyName doesn't exist on instance $instance." -Target $instance -Continue + } + } elseif ($currentJobStep.ProxyName) { + # Check if the proxy exists + if ($Server.JobServer.ProxyAccounts.Name -contains $currentJobStep.ProxyName) { + Write-Message -Message "Setting job step proxy name to $($currentJobStep.ProxyName)" -Level Verbose + $JobStep.ProxyName = $ProxyName + } else { + Stop-Function -Message "The proxy name $($currentJobStep.ProxyName) doesn't exist on instance $instance." -Target $instance -Continue + } + } + + if ($Flag.Count -ge 1) { + Write-Message -Message "Setting job step flag(s) to $($Flags -join ',')" -Level Verbose + $JobStep.JobStepFlags = $Flag + } else { + Write-Message -Message "Setting job step flag(s) to $($currentJobStep.JobStepFlags -join ',')" -Level Verbose + $JobStep.JobStepFlags = $currentJobStep.JobStepFlags + } + #region job step options + + # Execute + if ($PSCmdlet.ShouldProcess($instance, "Changing the job step $StepName for job $j")) { + try { + Write-Message -Message "Changing the job step $StepName for job $j" -Level Verbose + + # Change the job step + $JobStep.Alter() + } catch { + Stop-Function -Message "Something went wrong changing the job step" -ErrorRecord $_ -Target $instance -Continue + } + } + } + + } # end for each job step + + } # end for each instance + + } # process + + end { + if (Test-FunctionInterrupt) { return } + Write-Message -Message "Finished changing job step(s)" -Level Verbose + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function Set-DbaAgentSchedule { + <# + .SYNOPSIS + Set-DbaAgentSchedule updates a schedule in the msdb database. + + .DESCRIPTION + Set-DbaAgentSchedule will help update a schedule for a job. It does not attach the schedule to a job. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. You must have sysadmin access and server version must be SQL Server version 2000 or greater. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Job + The name of the job that has the schedule. + + .PARAMETER ScheduleName + The name of the schedule. + + .PARAMETER NewName + The new name for the schedule. + + .PARAMETER Enabled + Set the schedule to enabled. + + .PARAMETER Disabled + Set the schedule to disabled. + + .PARAMETER FrequencyType + A value indicating when a job is to be executed. + Allowed values are 1, "Once", 4, "Daily", 8, "Weekly", 16, "Monthly", 32, "MonthlyRelative", 64, "AgentStart", 128 or "IdleComputer" + + .PARAMETER FrequencyInterval + The days that a job is executed + Allowed values are 1, "Sunday", 2, "Monday", 4, "Tuesday", 8, "Wednesday", 16, "Thursday", 32, "Friday", 64, "Saturday", 62, "Weekdays", 65, "Weekend", 127, "EveryDay". + If 62, "Weekdays", 65, "Weekend", 127, "EveryDay" is used it overwwrites any other value that has been passed before. + + .PARAMETER FrequencySubdayType + Specifies the units for the subday FrequencyInterval. + Allowed values are 1, "Time", 2, "Seconds", 4, "Minutes", 8 or "Hours" + + .PARAMETER FrequencySubdayInterval + The number of subday type periods to occur between each execution of a job. + + .PARAMETER FrequencySubdayInterval + The number of subday type periods to occur between each execution of a job. + + .PARAMETER FrequencyRelativeInterval + A job's occurrence of FrequencyInterval in each month, if FrequencyInterval is 32 (monthlyrelative). + + .PARAMETER FrequencyRecurrenceFactor + The number of weeks or months between the scheduled execution of a job. FrequencyRecurrenceFactor is used only if FrequencyType is 8, "Weekly", 16, "Monthly", 32 or "MonthlyRelative". + + .PARAMETER StartDate + The date on which execution of a job can begin. + + .PARAMETER EndDate + The date on which execution of a job can stop. + + .PARAMETER StartTime + The time on any day to begin execution of a job. Format HHMMSS / 24 hour clock. + Example: '010000' for 01:00:00 AM. + Example: '140000' for 02:00:00 PM. + + .PARAMETER EndTime + The time on any day to end execution of a job. Format HHMMSS / 24 hour clock. + Example: '010000' for 01:00:00 AM. + Example: '140000' for 02:00:00 PM. + + .PARAMETER Owner + The name of the server principal that owns the schedule. If no value is given the schedule is owned by the creator. + + .PARAMETER WhatIf + Shows what would happen if the command were to run. No actions are actually performed. + + .PARAMETER Confirm + Prompts you for confirmation before executing any changing operations within the command. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .PARAMETER Force + The force parameter will ignore some errors in the parameters and assume defaults. + It will also remove the any present schedules with the same name for the specific job. + + .NOTES + Tags: Agent, Job, JobStep + Author: Sander Stad (@sqlstad, sqlstad.nl) + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Set-DbaAgentSchedule + + .EXAMPLE + PS C:\> Set-DbaAgentSchedule -SqlInstance sql1 -Job Job1 -ScheduleName daily -Enabled + + Changes the schedule for Job1 with the name 'daily' to enabled + + .EXAMPLE + PS C:\> Set-DbaAgentSchedule -SqlInstance sql1 -Job Job1 -ScheduleName daily -NewName weekly -FrequencyType Weekly -FrequencyInterval Monday, Wednesday, Friday + + Changes the schedule for Job1 with the name daily to have a new name weekly + + .EXAMPLE + PS C:\> Set-DbaAgentSchedule -SqlInstance sql1 -Job Job1, Job2, Job3 -ScheduleName daily -StartTime '230000' + + Changes the start time of the schedule for Job1 to 11 PM for multiple jobs + + .EXAMPLE + PS C:\> Set-DbaAgentSchedule -SqlInstance sql1, sql2, sql3 -Job Job1 -ScheduleName daily -Enabled + + Changes the schedule for Job1 with the name daily to enabled on multiple servers + + .EXAMPLE + PS C:\> sql1, sql2, sql3 | Set-DbaAgentSchedule -Job Job1 -ScheduleName 'daily' -Enabled + + Changes the schedule for Job1 with the name 'daily' to enabled on multiple servers using pipe line + + #> + [CmdletBinding(SupportsShouldProcess, ConfirmImpact = "Low")] + param ( + [parameter(Mandatory, ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [Parameter(Mandatory, ValueFromPipeline)] + [ValidateNotNullOrEmpty()] + [object[]]$Job, + [Parameter(Mandatory, ValueFromPipeline)] + [ValidateNotNullOrEmpty()] + [string]$ScheduleName, + [string]$NewName, + [switch]$Enabled, + [switch]$Disabled, + [ValidateSet(1, "Once", 4, "Daily", 8, "Weekly", 16, "Monthly", 32, "MonthlyRelative", 64, "AgentStart", 128, "IdleComputer")] + [object]$FrequencyType, + [object[]]$FrequencyInterval, + [ValidateSet(1, "Time", 2, "Seconds", 4, "Minutes", 8, "Hours")] + [object]$FrequencySubdayType, + [int]$FrequencySubdayInterval, + [ValidateSet('Unused', 'First', 'Second', 'Third', 'Fourth', 'Last')] + [object]$FrequencyRelativeInterval, + [int]$FrequencyRecurrenceFactor, + [string]$StartDate, + [string]$EndDate, + [string]$StartTime, + [string]$EndTime, + [Alias('Silent')] + [switch]$EnableException, + [switch]$Force + ) + + begin { + + # Check of the FrequencyType value is of type string and set the integer value + if ($FrequencyType -notin 0, 1, 4, 8, 16, 32, 64, 128) { + [int]$FrequencyType = switch ($FrequencyType) { "Once" { 1 } "Daily" { 4 } "Weekly" { 8 } "Monthly" { 16 } "MonthlyRelative" { 32 } "AgentStart" { 64 } "IdleComputer" { 128 } } + } + + # Check of the FrequencySubdayType value is of type string and set the integer value + if ($FrequencySubdayType -notin 0, 1, 2, 4, 8) { + [int]$FrequencySubdayType = switch ($FrequencySubdayType) { "Time" { 1 } "Seconds" { 2 } "Minutes" { 4 } "Hours" { 8 } default {0} } + } + + # Check if the interval is valid + if (($FrequencyType -eq 4) -and ($FrequencyInterval -lt 1 -or $FrequencyInterval -ge 365)) { + Stop-Function -Message "The interval $FrequencyInterval needs to be higher than 1 and lower than 365 when using a daily frequency the interval." -Target $SqlInstance + return + } + + # Check if the recurrence factor is set for weekly or monthly interval + if (($FrequencyType -in 8, 16) -and $FrequencyRecurrenceFactor -lt 1) { + if ($Force) { + $FrequencyRecurrenceFactor = 1 + Write-Message -Message "Recurrence factor not set for weekly or monthly interval. Setting it to $FrequencyRecurrenceFactor." -Level Verbose + } else { + Stop-Function -Message "The recurrence factor $FrequencyRecurrenceFactor needs to be at least on when using a weekly or monthly interval." -Target $SqlInstance + return + } + } + + # Check the subday interval + if (($FrequencySubdayType -in 2, 4) -and (-not ($FrequencySubdayInterval -ge 1 -or $FrequencySubdayInterval -le 59))) { + Stop-Function -Message "Subday interval $FrequencySubdayInterval must be between 1 and 59 when subday type is 2, 'Seconds', 4 or 'Minutes'" -Target $SqlInstance + return + } elseif (($FrequencySubdayType -eq 8) -and (-not ($FrequencySubdayInterval -ge 1 -and $FrequencySubdayInterval -le 23))) { + Stop-Function -Message "Subday interval $FrequencySubdayInterval must be between 1 and 23 when subday type is 8 or 'Hours" -Target $SqlInstance + return + } + + # Check of the FrequencyInterval value is of type string and set the integer value + if (($null -ne $FrequencyType)) { + # Create the interval to hold the value(s) + [int]$Interval = 0 + + # If the FrequencyInterval is set for the weekly FrequencyType + if ($FrequencyType -eq 8) { + # Loop through the array + foreach ($Item in $FrequencyInterval) { + switch ($Item) { + "Sunday" { $Interval += 1 } + "Monday" { $Interval += 2 } + "Tuesday" { $Interval += 4 } + "Wednesday" { $Interval += 8 } + "Thursday" { $Interval += 16 } + "Friday" { $Interval += 32 } + "Saturday" { $Interval += 64 } + "Weekdays" { $Interval = 62 } + "Weekend" { $Interval = 65 } + "EveryDay" {$Interval = 127 } + 1 { $Interval += 1 } + 2 { $Interval += 2 } + 4 { $Interval += 4 } + 8 { $Interval += 8 } + 16 { $Interval += 16 } + 31 { $Interval += 32 } + 64 { $Interval += 64 } + 62 { $Interval = 62 } + 65 { $Interval = 65 } + 127 {$Interval = 127 } + } + } + } + + # If the FrequencyInterval is set for the relative monthly FrequencyInterval + if ($FrequencyType -eq 32) { + # Loop through the array + foreach ($Item in $FrequencyInterval) { + switch ($Item) { + "Sunday" { $Interval += 1 } + "Monday" { $Interval += 2 } + "Tuesday" { $Interval += 3 } + "Wednesday" { $Interval += 4 } + "Thursday" { $Interval += 5 } + "Friday" { $Interval += 6 } + "Saturday" { $Interval += 7 } + "Day" { $Interval += 8 } + "Weekday" { $Interval += 9 } + "WeekendDay" { $Interval += 10 } + 1 { $Interval += 1 } + 2 { $Interval += 2 } + 3 { $Interval += 3 } + 4 { $Interval += 4 } + 5 { $Interval += 5 } + 6 { $Interval += 6 } + 7 { $Interval += 7 } + 8 { $Interval += 8 } + 9 { $Interval += 9 } + 10 { $Interval += 10 } + } + } + } + } + + # Check of the relative FrequencyInterval value is of type string and set the integer value + if (($FrequencyRelativeInterval -notin 1, 2, 4, 8, 16) -and $null -ne $FrequencyRelativeInterval) { + [int]$FrequencyRelativeInterval = switch ($FrequencyRelativeInterval) { "First" { 1 } "Second" { 2 } "Third" { 4 } "Fourth" { 8 } "Last" { 16 } "Unused" { 0 } default { 0 }} + } + + # Check if the interval is valid + if (($FrequencyType -eq 4) -and ($FrequencyInterval -lt 1 -or $FrequencyInterval -ge 365)) { + Stop-Function -Message "The interval $FrequencyInterval needs to be higher than 1 and lower than 365 when using a daily frequency the interval." -Target $SqlInstance + return + } + + # Setup the regex + $RegexDate = '(? Set-DbaAgentServer -SqlInstance sql1 -MaximumHistoryRows 10000 -MaximumJobHistoryRows 100 + + Changes the job history retention to 10000 rows with an maximum of 100 rows per job. + + .EXAMPLE + PS C:\> Set-DbaAgentServer -SqlInstance sql1 -CpuPolling Enabled + + Enable the CPU Polling configurations. + + .EXAMPLE + PS C:\> Set-DbaAgentServer -SqlInstance sql1, sql2, sql3 -AgentLogLevel 'Errors, Warnings' + + Set the agent log level to Errors and Warnings on multiple servers. + + .EXAMPLE + PS C:\> Set-DbaAgentServer -SqlInstance sql1 -CpuPolling Disabled + + Disable the CPU Polling configurations. + + #> + [CmdletBinding(SupportsShouldProcess = $true, ConfirmImpact = "Low")] + param ( + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [parameter(ValueFromPipeline)] + [Microsoft.SqlServer.Management.Smo.Agent.JobServer[]]$InputObject, + [ValidateSet(1, "Errors", 2, "Warnings", 3, "Errors, Warnings", 4, "Informational", 5, "Errors, Informational", 6, "Warnings, Informational", 7, "All")] + [object]$AgentLogLevel, + [ValidateSet(0, "SqlAgentMail", 1, "DatabaseMail")] + [object]$AgentMailType, + [int]$AgentShutdownWaitTime, + [string]$DatabaseMailProfile, + [string]$ErrorLogFile, + [int]$IdleCpuDuration, + [int]$IdleCpuPercentage, + [ValidateSet("Enabled", "Disabled")] + [string]$CpuPolling, + [string]$LocalHostAlias, + [int]$LoginTimeout, + [int]$MaximumHistoryRows, + [int]$MaximumJobHistoryRows, + [string]$NetSendRecipient, + [ValidateSet("Enabled", "Disabled")] + [string]$ReplaceAlertTokens, + [ValidateSet("Enabled", "Disabled")] + [string]$SaveInSentFolder, + [ValidateSet("Enabled", "Disabled")] + [string]$SqlAgentAutoStart, + [string]$SqlAgentMailProfile, + [ValidateSet("Enabled", "Disabled")] + [string]$SqlAgentRestart, + [ValidateSet("Enabled", "Disabled")] + [string]$SqlServerRestart, + [ValidateSet("Enabled", "Disabled")] + [string]$WriteOemErrorLog, + [switch]$EnableException + ) + + begin { + # Check of the agent mail type is of type string and set the integer value + if (($AgentMailType -notin 0, 1) -and ($null -ne $AgentMailType)) { + $AgentMailType = switch ($AgentMailType) { "SqlAgentMail" { 0 } "DatabaseMail" { 1 } } + } + + # Check of the agent log level is of type string and set the integer value + if (($AgentLogLevel -notin 0, 1) -and ($null -ne $AgentLogLevel)) { + $AgentLogLevel = switch ($AgentLogLevel) { "Errors" { 1 } "Warnings" { 2 } "Errors, Warnings" { 3 } "Informational" { 4 } "Errors, Informational" { 5 } "Warnings, Informational" { 6 } "All" { 7 } } + } + } + process { + + if (Test-FunctionInterrupt) { return } + + if ((-not $InputObject) -and (-not $SqlInstance)) { + Stop-Function -Message "You must specify an Instance or pipe in results from another command" -Target $sqlinstance + return + } + + foreach ($instance in $sqlinstance) { + # Try connecting to the instance + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + $InputObject += $server.JobServer + $InputObject.Refresh() + } + + foreach ($jobServer in $InputObject) { + $server = $jobServer.Parent + + #region job server options + # Settings the options for the job server + if ($AgentLogLevel) { + Write-Message -Message "Setting Agent log level to $AgentLogLevel" -Level Verbose + $jobServer.AgentLogLevel = $AgentLogLevel + } + + if ($AgentMailType) { + Write-Message -Message "Setting Agent Mail Type to $AgentMailType" -Level Verbose + $jobServer.AgentMailType = $AgentMailType + } + + if ($AgentShutdownWaitTime) { + Write-Message -Message "Setting Agent Shutdown Wait Time to $AgentShutdownWaitTime" -Level Verbose + $jobServer.AgentShutdownWaitTime = $AgentShutdownWaitTime + } + + if ($DatabaseMailProfile) { + if ($DatabaseMailProfile -in (Get-DbaDbMail -SqlInstance $server).Profiles.Name) { + Write-Message -Message "Setting Database Mail Profile to $DatabaseMailProfile" -Level Verbose + $jobServer.DatabaseMailProfile = $DatabaseMailProfile + } else { + Write-Message -Message "Database mail profile not found on $server" -Level Warning + } + } + + if ($ErrorLogFile) { + Write-Message -Message "Setting agent server ErrorLogFile to $ErrorLogFile" -Level Verbose + $jobServer.ErrorLogFile = $ErrorLogFile + } + + if ($IdleCpuDuration) { + Write-Message -Message "Setting agent server IdleCpuDuration to $IdleCpuDuration" -Level Verbose + $jobServer.IdleCpuDuration = $IdleCpuDuration + } + + if ($IdleCpuPercentage) { + Write-Message -Message "Setting agent server IdleCpuPercentage to $IdleCpuPercentage" -Level Verbose + $jobServer.IdleCpuPercentage = $IdleCpuPercentage + } + + if ($CpuPolling) { + Write-Message -Message "Setting agent server IsCpuPollingEnabled to $IsCpuPollingEnabled" -Level Verbose + $jobServer.IsCpuPollingEnabled = if ($CpuPolling -eq "Enabled") {$true} else {$false} + } + + if ($LocalHostAlias) { + Write-Message -Message "Setting agent server LocalHostAlias to $LocalHostAlias" -Level Verbose + $jobServer.LocalHostAlias = $LocalHostAlias + } + + if ($LoginTimeout) { + Write-Message -Message "Setting agent server LoginTimeout to $LoginTimeout" -Level Verbose + $jobServer.LoginTimeout = $LoginTimeout + } + + if ($MaximumHistoryRows) { + Write-Message -Message "Setting agent server MaximumHistoryRows to $MaximumHistoryRows" -Level Verbose + $jobServer.MaximumHistoryRows = $MaximumHistoryRows + } + + if ($MaximumJobHistoryRows) { + Write-Message -Message "Setting agent server MaximumJobHistoryRows to $MaximumJobHistoryRows" -Level Verbose + $jobServer.MaximumJobHistoryRows = $MaximumJobHistoryRows + } + + if ($NetSendRecipient) { + Write-Message -Message "Setting agent server NetSendRecipient to $NetSendRecipient" -Level Verbose + $jobServer.NetSendRecipient = $NetSendRecipient + } + + if ($ReplaceAlertTokens) { + Write-Message -Message "Setting agent server ReplaceAlertTokensEnabled to $ReplaceAlertTokens" -Level Verbose + $jobServer.ReplaceAlertTokens = if ($ReplaceAlertTokens -eq "Enabled") {$true} else {$false} + } + + if ($SaveInSentFolder) { + Write-Message -Message "Setting agent server SaveInSentFolder to $SaveInSentFolder" -Level Verbose + $jobServer.SaveInSentFolder = if ($SaveInSentFolder -eq "Enabled") {$true} else {$false} + } + + if ($SqlAgentAutoStart) { + Write-Message -Message "Setting agent server SqlAgentAutoStart to $SqlAgentAutoStart" -Level Verbose + $jobServer.SqlAgentAutoStart = if ($SqlAgentAutoStart -eq "Enabled") {$true} else {$false} + } + + if ($SqlAgentMailProfile) { + Write-Message -Message "Setting agent server SqlAgentMailProfile to $SqlAgentMailProfile" -Level Verbose + $jobServer.SqlAgentMailProfile = $SqlAgentMailProfile + } + + if ($SqlAgentRestart) { + Write-Message -Message "Setting agent server SqlAgentRestart to $SqlAgentRestart" -Level Verbose + $jobServer.SqlAgentRestart = if ($SqlAgentRestart -eq "Enabled") {$true} else {$false} + } + + if ($SqlServerRestart) { + Write-Message -Message "Setting agent server SqlServerRestart to $SqlServerRestart" -Level Verbose + $jobServer.SqlServerRestart = if ($SqlServerRestart -eq "Enabled") {$true} else {$false} + } + + if ($WriteOemErrorLog) { + Write-Message -Message "Setting agent server WriteOemErrorLog to $WriteOemErrorLog" -Level Verbose + $jobServer.WriteOemErrorLog = if ($WriteOemErrorLog -eq "Enabled") {$true} else {$false} + } + + #endregion server agent options + + # Execute + if ($PSCmdlet.ShouldProcess($SqlInstance, "Changing the agent server")) { + try { + Write-Message -Message "Changing the agent server" -Level Verbose + + # Change the agent server + $jobServer.Alter() + } catch { + Stop-Function -Message "Something went wrong changing the agent server" -ErrorRecord $_ -Target $instance -Continue + } + + Get-DbaAgentServer -SqlInstance $server | Where-Object Name -eq $jobServer.name + } + } + } + end { + Write-Message -Message "Finished changing agent server(s)" -Level Verbose + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function Set-DbaAgListener { + <# + .SYNOPSIS + Sets a listener property for an availability group on a SQL Server instance. + + .DESCRIPTION + Sets a listener property for an availability group on a SQL Server instance. + + Basically, only the port is settable at this time, so this command updates the listener port. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. Server version must be SQL Server version 2012 or higher. + + .PARAMETER SqlCredential + Login to the SqlInstance instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER AvailabilityGroup + The Availability Group to which a property will be changed. + + .PARAMETER Port + Sets the port number used to communicate with the availability group. + + .PARAMETER Listener + Modify only specific listeners. + + .PARAMETER InputObject + Enables piping from Get-DbaAvailabilityGroup + + .PARAMETER WhatIf + Shows what would happen if the command were to run. No actions are actually performed. + + .PARAMETER Confirm + Prompts you for confirmation before executing any changing operations within the command. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: AvailabilityGroup, HA, AG + Author: Chrissy LeMaire (@cl), netnerds.net + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Set-DbaAgListener + + .EXAMPLE + PS C:\> Set-DbaAgListener -SqlInstance sql2017 -AvailabilityGroup SharePoint -Port 14333 + + Changes the port for the SharePoint AG Listener on sql2017. Prompts for confirmation. + + .EXAMPLE + PS C:\> Get-DbaAgListener -SqlInstance sql2017 | Out-GridView -Passthru | Set-DbaAgListener -Port 1433 -Confirm:$false + + Changes the port for selected AG listeners to 1433. Does not prompt for confirmation. + #> + [CmdletBinding(SupportsShouldProcess, ConfirmImpact = 'High')] + param ( + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [string[]]$AvailabilityGroup, + [string[]]$Listener, + [Parameter(Mandatory)] + [int]$Port, + [parameter(ValueFromPipeline)] + [Microsoft.SqlServer.Management.Smo.AvailabilityGroup[]]$InputObject, + [switch]$EnableException + ) + process { + if ((Test-Bound -ParameterName SqlInstance) -and (Test-Bound -Not -ParameterName AvailabilityGroup)) { + Stop-Function -Message "You must specify one or more databases and one or more Availability Groups when using the SqlInstance parameter." + return + } + + if ($SqlInstance) { + $InputObject += Get-DbaAgListener -SqlInstance $SqlInstance -SqlCredential $SqlCredential -AvailabilityGroup $AvailabilityGroup -Listener $Listener + } + + foreach ($aglistener in $InputObject) { + if ($Pscmdlet.ShouldProcess($ag.Parent.Name, "Setting port to $Port for $($ag.Name)")) { + try { + $aglistener.PortNumber = $Port + $aglistener.Alter() + $aglistener + } catch { + Stop-Function -Message "Failure" -ErrorRecord $_ + } + } + } + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function Set-DbaAgReplica { + <# + .SYNOPSIS + Sets the properties for a replica to an availability group on a SQL Server instance. + + .DESCRIPTION + Sets the properties for a replica to an availability group on a SQL Server instance. + + Automatically creates a database mirroring endpoint if required. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. Server version must be SQL Server version 2012 or higher. + + .PARAMETER SqlCredential + Login to the SqlInstance instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Replica + The replicas to modify. + + .PARAMETER AvailabilityGroup + The availability group of the replica. + + .PARAMETER AvailabilityMode + Sets the availability mode of the availability group replica. Options are: AsynchronousCommit and SynchronousCommit. SynchronousCommit is default. + + .PARAMETER FailoverMode + Sets the failover mode of the availability group replica. Options are Automatic and Manual. + + .PARAMETER BackupPriority + Sets the backup priority availability group replica. Default is 50. + + .PARAMETER EndpointUrl + The endpoint URL. + + .PARAMETER InputObject + Enables piping from Get-DbaAgReplica. + + .PARAMETER ConnectionModeInPrimaryRole + Sets the connection intent modes of an Availability Replica in primary role. + + .PARAMETER ConnectionModeInSecondaryRole + Sets the connection modes of an Availability Replica in secondary role. + + .PARAMETER ReadonlyRoutingConnectionUrl + Sets the read only routing connection url for the availability replica. + + .PARAMETER SeedingMode + Specifies how the secondary replica will be initially seeded. + + Automatic enables direct seeding. This method will seed the secondary replica over the network. This method does not require you to backup and restore a copy of the primary database on the replica. + + Manual requires you to create a backup of the database on the primary replica and manually restore that backup on the secondary replica. + + .PARAMETER WhatIf + Shows what would happen if the command were to run. No actions are actually performed. + + .PARAMETER Confirm + Prompts you for confirmation before executing any changing operations within the command. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: AvailabilityGroup, HA, AG + Author: Chrissy LeMaire (@cl), netnerds.net + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Set-DbaAgReplica + + .EXAMPLE + PS C:\> Set-DbaAgReplica -SqlInstance sql2016 -Replica sql2016 -AvailabilityGroup SharePoint -BackupPriority 5000 + + Sets the backup priority to 5000 for the sql2016 replica for the SharePoint availability group on sql2016 + + .EXAMPLE + PS C:\> Get-DbaAgReplica -SqlInstance sql2016 | Out-GridView -Passthru | Set-DbaAgReplica -BackupPriority 5000 + + Sets the backup priority to 5000 for the selected availability groups. + #> + [CmdletBinding(SupportsShouldProcess, ConfirmImpact = 'Medium')] + param ( + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [string]$AvailabilityGroup, + [string]$Replica, + [ValidateSet('AsynchronousCommit', 'SynchronousCommit')] + [string]$AvailabilityMode, + [ValidateSet('Automatic', 'Manual', 'External')] + [string]$FailoverMode, + [int]$BackupPriority, + [ValidateSet('AllowAllConnections', 'AllowReadWriteConnections')] + [string]$ConnectionModeInPrimaryRole, + [ValidateSet('AllowAllConnections', 'AllowNoConnections', 'AllowReadIntentConnectionsOnly')] + [string]$ConnectionModeInSecondaryRole, + [ValidateSet('Automatic', 'Manual')] + [string]$SeedingMode, + [string]$EndpointUrl, + [string]$ReadonlyRoutingConnectionUrl, + [parameter(ValueFromPipeline)] + [Microsoft.SqlServer.Management.Smo.AvailabilityReplica]$InputObject, + [switch]$EnableException + ) + process { + if (-not $InputObject) { + if (-not $AvailabilityGroup -or -not $Replica) { + Stop-Function -Message "You must specify an AvailabilityGroup and replica or pipe in an availabilty group to continue." + return + } + } + + if ($SqlInstance) { + $InputObject += Get-DbaAgReplica -SqlInstance $SqlInstance -SqlCredential $SqlCredential -AvailabilityGroup $AvailabilityGroup -Replica $Replica + } + + foreach ($agreplica in $InputObject) { + $server = $agreplica.Parent.Parent + if ($Pscmdlet.ShouldProcess($server.Name, "Modifying replica for $($agreplica.Name) named $Name")) { + try { + if ($EndpointUrl) { + $agreplica.EndpointUrl = $EndpointUrl + } + + if ($FailoverMode) { + $agreplica.FailoverMode = [Microsoft.SqlServer.Management.Smo.AvailabilityReplicaFailoverMode]::$FailoverMode + } + + if ($AvailabilityMode) { + $agreplica.AvailabilityMode = [Microsoft.SqlServer.Management.Smo.AvailabilityReplicaAvailabilityMode]::$AvailabilityMode + } + + if ($ConnectionModeInPrimaryRole) { + $agreplica.ConnectionModeInPrimaryRole = [Microsoft.SqlServer.Management.Smo.AvailabilityReplicaConnectionModeInPrimaryRole]::$ConnectionModeInPrimaryRole + } + + if ($ConnectionModeInSecondaryRole) { + $agreplica.ConnectionModeInSecondaryRole = [Microsoft.SqlServer.Management.Smo.AvailabilityReplicaConnectionModeInSecondaryRole]::$ConnectionModeInSecondaryRole + } + + if ($BackupPriority) { + $agreplica.BackupPriority = $BackupPriority + } + + if ($ReadonlyRoutingConnectionUrl) { + $agreplica.ReadonlyRoutingConnectionUrl = $ReadonlyRoutingConnectionUrl + } + + if ($SeedingMode) { + $agreplica.SeedingMode = $SeedingMode + } + + $agreplica.Alter() + $agreplica + + } catch { + Stop-Function -Message "Failure" -ErrorRecord $_ -Continue + } + } + } + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function Set-DbaAvailabilityGroup { + <# + .SYNOPSIS + Sets availability group properties on a SQL Server instance. + + .DESCRIPTION + Sets availability group properties on a SQL Server instance. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. Server version must be SQL Server version 2012 or higher. + + .PARAMETER SqlCredential + Login to the SqlInstance instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER AvailabilityGroup + Only set specific availability group properties. + + .PARAMETER AllAvailabilityGroups + Set properties for all availability group on an instance. + + .PARAMETER DtcSupportEnabled + Enables DtcSupport. + + .PARAMETER ClusterType + Cluster type of the Availability Group. Only supported in SQL Server 2017 and above. + Options include: External, Wsfc or None. + + .PARAMETER AutomatedBackupPreference + Specifies how replicas in the primary role are treated in the evaluation to pick the desired replica to perform a backup. + + .PARAMETER FailureConditionLevel + Specifies the different conditions that can trigger an automatic failover in Availability Group. + + .PARAMETER HealthCheckTimeout + This setting used to specify the length of time, in milliseconds, that the SQL Server resource DLL should wait for information returned by the sp_server_diagnostics stored procedure before reporting the Always On Failover Cluster Instance (FCI) as unresponsive. + + Changes that are made to the timeout settings are effective immediately and do not require a restart of the SQL Server resource. + + Defaults is 30000 (30 seconds). + + .PARAMETER BasicAvailabilityGroup + Indicates whether the availability group is basic. Basic availability groups like pumpkin spice and uggs. + + https://docs.microsoft.com/en-us/sql/database-engine/availability-groups/windows/basic-availability-groups-always-on-availability-groups + + .PARAMETER DatabaseHealthTrigger + Indicates whether the availability group triggers the database health. + + .PARAMETER IsDistributedAvailabilityGroup + Indicates whether the availability group is distributed. + + .PARAMETER InputObject + Enables piping from Get-DbaAvailabilityGroup. + + .PARAMETER WhatIf + Shows what would happen if the command were to run. No actions are actually performed. + + .PARAMETER Confirm + Prompts you for confirmation before executing any changing operations within the command. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: AvailabilityGroup, HA, AG + Author: Chrissy LeMaire (@cl), netnerds.net + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Set-DbaAvailabilityGroup + + .EXAMPLE + PS C:\> Get-DbaAvailabilityGroup -SqlInstance sql2016 | Set-DbaAvailabilityGroup -DtcSupportEnabled + + Enables DTC for all availability groups on sql2016 + + .EXAMPLE + PS C:\> Get-DbaAvailabilityGroup -SqlInstance sql2016 -AvailabilityGroup AG1 | Set-DbaAvailabilityGroup -DtcSupportEnabled:$false + + Disables DTC support for the availability group AG1 + + .EXAMPLE + PS C:\> Set-DbaAvailabilityGroup -SqlInstance sql2016 -AvailabilityGroup AG1 -DtcSupportEnabled:$false + + Disables DTC support for the availability group AG1 + #> + + [CmdletBinding(SupportsShouldProcess, ConfirmImpact = 'Medium')] + param ( + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [string[]]$AvailabilityGroup, + [switch]$AllAvailabilityGroups, + [switch]$DtcSupportEnabled, + [ValidateSet('External', 'Wsfc', 'None')] + [string]$ClusterType, + [ValidateSet('None', 'Primary', 'Secondary', 'SecondaryOnly')] + [string]$AutomatedBackupPreference, + [ValidateSet('OnAnyQualifiedFailureCondition', 'OnCriticalServerErrors', 'OnModerateServerErrors', 'OnServerDown', 'OnServerUnresponsive')] + [string]$FailureConditionLevel, + [int]$HealthCheckTimeout, + [switch]$BasicAvailabilityGroup, + [switch]$DatabaseHealthTrigger, + [switch]$IsDistributedAvailabilityGroup, + [parameter(ValueFromPipeline)] + [Microsoft.SqlServer.Management.Smo.AvailabilityGroup[]]$InputObject, + [switch]$EnableException + ) + process { + if ((Test-Bound -ParameterName SqlInstance) -and (Test-Bound -Not -ParameterName AvailabilityGroup, AllAvailabilityGroups)) { + Stop-Function -Message "You must specify AllAvailabilityGroups groups or AvailabilityGroups when using the SqlInstance parameter." + return + } + if ($SqlInstance) { + $InputObject += Get-DbaAvailabilityGroup -SqlInstance $SqlInstance -SqlCredential $SqlCredential -AvailabilityGroup $AvailabilityGroup + } + $props = "Name", "AutomatedBackupPreference", "BasicAvailabilityGroup", "ClusterType", "DatabaseHealthTrigger", "DtcSupportEnabled", "FailureConditionLevel", "HealthCheckTimeout", "IsDistributedAvailabilityGroup" + + foreach ($ag in $InputObject) { + try { + if ($Pscmdlet.ShouldProcess($ag.Parent.Name, "Seting properties on $ag")) { + foreach ($prop in $props) { + if (Test-Bound -ParameterName $prop) { + $ag.$prop = (Get-Variable -Name $prop -ValueOnly) + } + } + $ag.Alter() + $ag + } + } catch { + Stop-Function -Message "Failure" -ErrorRecord $_ -Continue + } + } + } +} +function Set-DbaCmConnection { + <# + .SYNOPSIS + Configures a connection object for use in remote computer management. + + .DESCRIPTION + Configures a connection object for use in remote computer management. + This function will either create new records for computers that have no connection registered so far, or it will configure existing connections if already present. + + As such it can be handy in making bulk-edits on connections or manually adjusting some settings. + + .PARAMETER ComputerName + The computer to build the connection object for. + + .PARAMETER Credential + The credential to register. + + .PARAMETER UseWindowsCredentials + Whether using the default windows credentials is legit. + Not setting this will not exclude using windows credentials, but only not pre-confirm them as working. + + .PARAMETER OverrideExplicitCredential + Setting this will enable the credential override. + The override will cause the system to ignore explicitly specified credentials, so long as known, good credentials are available. + + .PARAMETER OverrideConnectionPolicy + Setting this will configure the connection policy override. + By default, global configurations enforce, which connection type is available at all and which is disabled. + + .PARAMETER DisabledConnectionTypes + Explicitly disable connection types. + These types will then not be used for connecting to the computer. + + .PARAMETER DisableBadCredentialCache + Will prevent the caching of credentials if set to true. + + .PARAMETER DisableCimPersistence + Will prevent Cim-Sessions to be reused. + + .PARAMETER DisableCredentialAutoRegister + Will prevent working credentials from being automatically cached + + .PARAMETER EnableCredentialFailover + Will enable automatic failing over to known to work credentials, when using bad credentials. + By default, passing bad credentials will cause the Computer Management functions to interrupt with a warning (Or exception if in silent mode). + + .PARAMETER WindowsCredentialsAreBad + Will prevent the windows credentials of the currently logged on user from being used for the remote connection. + + .PARAMETER CimWinRMOptions + Specify a set of options to use when connecting to the target computer using CIM over WinRM. + Use 'New-CimSessionOption' to create such an object. + + .PARAMETER CimDCOMOptions + Specify a set of options to use when connecting to the target computer using CIM over DCOM. + Use 'New-CimSessionOption' to create such an object. + + .PARAMETER AddBadCredential + Adds credentials to the bad credential cache. + These credentials will not be used when connecting to the target remote computer. + + .PARAMETER RemoveBadCredential + Removes credentials from the bad credential cache. + + .PARAMETER ClearBadCredential + Clears the cache of credentials that didn't worked. + Will be applied before adding entries to the credential cache. + + .PARAMETER ClearCredential + Clears the cache of credentials that worked. + Will be applied before adding entries to the credential cache. + + .PARAMETER ResetCredential + Resets all credential-related caches: + - Clears bad credential cache + - Removes last working credential + - Un-Confirms the windows credentials as working + - Un-Confirms the windows credentials as not working + + Automatically implies the parameters -ClearCredential and -ClearBadCredential. Using them together is redundant. + Will be applied before adding entries to the credential cache. + + .PARAMETER ResetConnectionStatus + Restores all connection status to default, as if no connection protocol had ever been tested. + + .PARAMETER ResetConfiguration + Restores the configuration back to system default. + Configuration elements are the basic behavior controlling settings, such as whether to cache bad credentials, etc. + These can be configured globally using the dbatools configuration system and overridden locally on a per-connection basis. + For a list of all available settings, use "Get-DbatoolsConfig -Module ComputerManagement". + + .PARAMETER WhatIf + If this switch is enabled, no actions are performed but informational messages will be displayed that explain what would happen if the command were to run. + + .PARAMETER Confirm + If this switch is enabled, you will be prompted for confirmation before executing any operations that change state. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: ComputerManagement, CIM + Author: Friedrich Weinmann (@FredWeinmann) + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/set-DbaCmConnection + + .EXAMPLE + PS C:\> Get-DbaCmConnection sql2014 | Set-DbaCmConnection -ClearBadCredential -UseWindowsCredentials + + Retrieves the already existing connection to sql2014, removes the list of not working credentials and configures it to default to the credentials of the logged on user. + + .EXAMPLE + PS C:\> Get-DbaCmConnection | Set-DbaCmConnection -RemoveBadCredential $cred + + Removes the credentials stored in $cred from all connections' list of "known to not work" credentials. + Handy to update changes in privilege. + + .EXAMPLE + PS C:\> Get-DbaCmConnection | Export-Clixml .\connections.xml + PS C:\> Import-Clixml .\connections.xml | Set-DbaCmConnection -ResetConfiguration + + At first, the current cached connections are stored in an xml file. At a later time - possibly in the profile when starting the console again - those connections are imported again and applied again to the connection cache. + + In this example, the configuration settings will also be reset, since after re-import those will be set to explicit, rather than deriving them from the global settings. + In many cases, using the default settings is desirable. For specific settings, use New-DbaCmConnection as part of the profile in order to explicitly configure a connection. + + #> + [CmdletBinding(SupportsShouldProcess, DefaultParameterSetName = 'Credential')] + param ( + [Parameter(ValueFromPipeline)] + [Sqlcollaborative.Dbatools.Parameter.DbaCmConnectionParameter[]] + $ComputerName = $env:COMPUTERNAME, + + [Parameter(ParameterSetName = "Credential")] + [PSCredential] + $Credential, + + [Parameter(ParameterSetName = "Windows")] + [switch] + $UseWindowsCredentials, + + [switch] + $OverrideExplicitCredential, + + [switch] + $OverrideConnectionPolicy, + + [Sqlcollaborative.Dbatools.Connection.ManagementConnectionType] + $DisabledConnectionTypes = 'None', + + [switch] + $DisableBadCredentialCache, + + [switch] + $DisableCimPersistence, + + [switch] + $DisableCredentialAutoRegister, + + [switch] + $EnableCredentialFailover, + + [Parameter(ParameterSetName = "Credential")] + [switch] + $WindowsCredentialsAreBad, + + [Microsoft.Management.Infrastructure.Options.WSManSessionOptions] + $CimWinRMOptions, + + [Microsoft.Management.Infrastructure.Options.DComSessionOptions] + $CimDCOMOptions, + + [System.Management.Automation.PSCredential[]] + $AddBadCredential, + + [System.Management.Automation.PSCredential[]] + $RemoveBadCredential, + + [switch] + $ClearBadCredential, + + [switch] + $ClearCredential, + + [switch] + $ResetCredential, + + [switch] + $ResetConnectionStatus, + + [switch] + $ResetConfiguration, + + [switch] + [Alias('Silent')]$EnableException + ) + + begin { + Write-Message -Level InternalComment -Message "Starting execution" + Write-Message -Level Verbose -Message "Bound parameters: $($PSBoundParameters.Keys -join ", ")" + + $disable_cache = Get-DbatoolsConfigValue -Name 'ComputerManagement.Cache.Disable.All' -Fallback $false + } + process { + foreach ($connectionObject in $ComputerName) { + if ($Pscmdlet.ShouldProcess($($connectionObject.Connection.ComputerName), "Setting Connection")) { + if (-not $connectionObject.Success) { Stop-Function -Message "Failed to interpret computername input: $($connectionObject.InputObject)" -Category InvalidArgument -Target $connectionObject.InputObject -Continue } + Write-Message -Level VeryVerbose -Message "Processing computer: $($connectionObject.Connection.ComputerName)" + + $connection = $connectionObject.Connection + + if ($ResetConfiguration) { + Write-Message -Level Verbose -Message "Resetting the configuration to system default" + + $connection.RestoreDefaultConfiguration() + } + + if ($ResetConnectionStatus) { + Write-Message -Level Verbose -Message "Resetting the connection status" + + $connection.CimRM = 'Unknown' + $connection.CimDCOM = 'Unknown' + $connection.Wmi = 'Unknown' + $connection.PowerShellRemoting = 'Unknown' + + $connection.LastCimRM = New-Object System.DateTime(0) + $connection.LastCimDCOM = New-Object System.DateTime(0) + $connection.LastWmi = New-Object System.DateTime(0) + $connection.LastPowerShellRemoting = New-Object System.DateTime(0) + } + + if ($ResetCredential) { + Write-Message -Level Verbose -Message "Resetting credentials" + + $connection.KnownBadCredentials.Clear() + $connection.Credentials = $null + $connection.UseWindowsCredentials = $false + $connection.WindowsCredentialsAreBad = $false + } else { + if ($ClearBadCredential) { + Write-Message -Level Verbose -Message "Clearing bad credentials" + + $connection.KnownBadCredentials.Clear() + $connection.WindowsCredentialsAreBad = $false + } + + if ($ClearCredential) { + Write-Message -Level Verbose -Message "Clearing credentials" + + $connection.Credentials = $null + $connection.UseWindowsCredentials = $false + } + } + + foreach ($badCred in $RemoveBadCredential) { + $connection.RemoveBadCredential($badCred) + } + + foreach ($badCred in $AddBadCredential) { + $connection.AddBadCredential($badCred) + } + + if (Test-Bound "Credential") { $connection.Credentials = $Credential } + if ($UseWindowsCredentials) { + $connection.Credentials = $null + $connection.UseWindowsCredentials = $UseWindowsCredentials + } + if (Test-Bound "OverrideExplicitCredential") { $connection.OverrideExplicitCredential = $OverrideExplicitCredential } + if (Test-Bound "DisabledConnectionTypes") { $connection.DisabledConnectionTypes = $DisabledConnectionTypes } + if (Test-Bound "DisableBadCredentialCache") { $connection.DisableBadCredentialCache = $DisableBadCredentialCache } + if (Test-Bound "DisableCimPersistence") { $connection.DisableCimPersistence = $DisableCimPersistence } + if (Test-Bound "DisableCredentialAutoRegister") { $connection.DisableCredentialAutoRegister = $DisableCredentialAutoRegister } + if (Test-Bound "EnableCredentialFailover") { $connection.DisableCredentialAutoRegister = $EnableCredentialFailover } + if (Test-Bound "WindowsCredentialsAreBad") { $connection.WindowsCredentialsAreBad = $WindowsCredentialsAreBad } + if (Test-Bound "CimWinRMOptions") { $connection.CimWinRMOptions = $CimWinRMOptions } + if (Test-Bound "CimDCOMOptions") { $connection.CimDCOMOptions = $CimDCOMOptions } + if (Test-Bound "OverrideConnectionPolicy") { $connection.OverrideConnectionPolicy = $OverrideConnectionPolicy } + + if (-not $disable_cache) { + Write-Message -Level Verbose -Message "Writing connection to cache" + [Sqlcollaborative.Dbatools.Connection.ConnectionHost]::Connections[$connectionObject.Connection.ComputerName] = $connection + } else { Write-Message -Level Verbose -Message "Skipping writing to cache, since the cache has been disabled!" } + $connection + } + } + } + end { + Write-Message -Level InternalComment -Message "Stopping execution" + } +} +function Set-DbaDbCompatibility { + <# + .SYNOPSIS + Sets the compatibility level for SQL Server databases. + + .DESCRIPTION + Sets the current database compatibility level for all databases on a server or list of databases passed in to the function. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. + + .PARAMETER SqlCredential + SqlCredential object used to connect to the SQL Server as a different user. + + .PARAMETER Database + The database or databases to process. If unspecified, all databases will be processed. + + .PARAMETER TargetCompatibility + The target compatibility level version. This is an int and follows Microsoft's versioning: + + 9 = SQL Server 2005 + 10 = SQL Server 2008 + 11 = SQL Server 2012 + 12 = SQL Server 2014 + 13 = SQL Server 2016 + 14 = SQL Server 2017 + 15 = SQL Server 2019 + + .PARAMETER InputObject + A collection of databases (such as returned by Get-DbaDatabase) + + .PARAMETER WhatIf + Shows what would happen if the command were to run + + .PARAMETER Confirm + Prompts for confirmation of every step. For example: + + Are you sure you want to perform this action? + Performing the operation "Update database" on target "pubs on SQL2016\VNEXT". + [Y] Yes [A] Yes to All [N] No [L] No to All [S] Suspend [?] Help (default is "Y"): + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Compatibility, Database + Author: Garry Bargsley, http://blog.garrybargsley.com/ + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Set-DbaDbCompatibility + + .EXAMPLE + PS C:\> Set-DbaDbCompatibility -SqlInstance localhost\sql2017 + + Changes database compatibility level for all user databases on server localhost\sql2017 that have a Compatibility level that do not match + + .EXAMPLE + PS C:\> Set-DbaDbCompatibility -SqlInstance localhost\sql2017 -TargetCompatibility 12 + + Changes database compatibility level for all user databases on server localhost\sql2017 to Version120 + + .EXAMPLE + PS C:\> Set-DbaDbCompatibility -SqlInstance localhost\sql2017 -Database Test -TargetCompatibility 12 + + Changes database compatibility level for database Test on server localhost\sql2017 to Version 120 + #> + [CmdletBinding(SupportsShouldProcess)] + param ( + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [string[]]$Database, + [ValidateSet(9, 10, 11, 12, 13, 14, 15)] + [int]$TargetCompatibility, + [parameter(ValueFromPipeline)] + [Microsoft.SqlServer.Management.Smo.Database[]]$InputObject, + [switch]$EnableException + ) + process { + + if (Test-Bound -not 'SqlInstance', 'InputObject') { + Write-Message -Level Warning -Message "You must specify either a SQL instance or pipe a database collection" + continue + } + + if ($SqlInstance) { + $InputObject += Get-DbaDatabase -SqlInstance $SqlInstance -SqlCredential $SqlCredential -Database $Database + } + + foreach ($db in $InputObject) { + $server = $db.Parent + $ServerVersion = $server.VersionMajor + Write-Message -Level Verbose -Message "SQL Server is using Version: $ServerVersion" + + $ogcompat = $db.CompatibilityLevel + $dbversion = switch ($ogcompat) { + "Version100" { 10 } # SQL Server 2008 + "Version110" { 11 } # SQL Server 2012 + "Version120" { 12 } # SQL Server 2014 + "Version130" { 13 } # SQL Server 2016 + "Version140" { 14 } # SQL Server 2017 + "Version150" { 15 } # SQL Server 2019 + default { 9 } # SQL Server 2005 + } + + if (-not $TargetCompatibility) { + if ($dbversion -lt $ServerVersion) { + If ($Pscmdlet.ShouldProcess($server.Name, "Updating $db version from $dbversion to $ServerVersion")) { + $comp = $ServerVersion * 10 + $sql = "ALTER DATABASE $db SET COMPATIBILITY_LEVEL = $comp" + try { + $db.ExecuteNonQuery($sql) + $db.Refresh() + Get-DbaDbCompatibility -SqlInstance $server -Database $db.Name + } catch { + Stop-Function -Message "Failed to change Compatibility Level" -ErrorRecord $_ -Target $instance -Continue + } + } + } + } else { + if ($Pscmdlet.ShouldProcess($server.Name, "Updating $db version from $dbversion to $TargetCompatibility")) { + $comp = $TargetCompatibility * 10 + $sql = "ALTER DATABASE $db SET COMPATIBILITY_LEVEL = $comp" + try { + $db.ExecuteNonQuery($sql) + $db.Refresh() + Get-DbaDbCompatibility -SqlInstance $server -Database $db.Name + } catch { + Stop-Function -Message "Failed to change Compatibility Level" -ErrorRecord $_ -Target $instance -Continue + } + } + } + } + } +} +function Set-DbaDbCompression { + <# + .SYNOPSIS + Sets tables and indexes with preferred compression setting. + + .DESCRIPTION + This function sets the appropriate compression recommendation, determined either by using the Tiger Team's query or set to the CompressionType parameter. + + Remember Uptime is critical for the Tiger Team query, the longer uptime, the more accurate the analysis is. + You would probably be best if you utilized Get-DbaUptime first, before running this command. + + Set-DbaDbCompression script derived from GitHub and the tigertoolbox + (https://github.com/Microsoft/tigertoolbox/tree/master/Evaluate-Compression-Gains) + + .PARAMETER SqlInstance + The target SQL Server instance or instances. This can be a collection and receive pipeline input to allow the function to be executed against multiple SQL Server instances. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Database + The database(s) to process - this list is auto populated from the server. If unspecified, all databases will be processed. + + .PARAMETER ExcludeDatabase + The database(s) to exclude - this list is auto populated from the server. + + .PARAMETER CompressionType + Control the compression type applied. Default is 'Recommended' which uses the Tiger Team query to use the most appropriate setting per object. Other option is to compress all objects to either Row or Page. + + .PARAMETER MaxRunTime + Will continue to alter tables and indexes for the given amount of minutes. + + .PARAMETER PercentCompression + Will only work on the tables/indexes that have the calculated savings at and higher for the given number provided. + + .PARAMETER InputObject + Takes the output of Test-DbaDbCompression as an object and applied compression based on those recommendations. + + .PARAMETER WhatIf + If this switch is enabled, no actions are performed but informational messages will be displayed that explain what would happen if the command were to run. + + .PARAMETER Confirm + If this switch is enabled, you will be prompted for confirmation before executing any operations that change state. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Compression, Table, Database + Author: Jason Squires (@js_0505), jstexasdba@gmail.com + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Set-DbaDbCompression + + .EXAMPLE + PS C:\> Set-DbaDbCompression -SqlInstance localhost -MaxRunTime 60 -PercentCompression 25 + + Set the compression run time to 60 minutes and will start the compression of tables/indexes that have a difference of 25% or higher between current and recommended. + + .EXAMPLE + PS C:\> Set-DbaDbCompression -SqlInstance ServerA -Database DBName -CompressionType Page + + Utilizes Page compression for all objects in DBName on ServerA with no time limit. + + .EXAMPLE + PS C:\> Set-DbaDbCompression -SqlInstance ServerA -Database DBName -PercentCompression 25 | Out-GridView + + Will compress tables/indexes within the specified database that would show any % improvement with compression and with no time limit. The results will be piped into a nicely formatted GridView. + + .EXAMPLE + PS C:\> $testCompression = Test-DbaDbCompression -SqlInstance ServerA -Database DBName + PS C:\> Set-DbaDbCompression -SqlInstance ServerA -Database DBName -InputObject $testCompression + + Gets the compression suggestions from Test-DbaDbCompression into a variable, this can then be reviewed and passed into Set-DbaDbCompression. + + .EXAMPLE + PS C:\> $cred = Get-Credential sqladmin + PS C:\> Set-DbaDbCompression -SqlInstance ServerA -ExcludeDatabase Database -SqlCredential $cred -MaxRunTime 60 -PercentCompression 25 + + Set the compression run time to 60 minutes and will start the compression of tables/indexes for all databases except the specified excluded database. Only objects that have a difference of 25% or higher between current and recommended will be compressed. + + .EXAMPLE + PS C:\> $servers = 'Server1','Server2' + PS C:\> foreach ($svr in $servers) { + >> Set-DbaDbCompression -SqlInstance $svr -MaxRunTime 60 -PercentCompression 25 | Export-Csv -Path C:\temp\CompressionAnalysisPAC.csv -Append + >> } + + Set the compression run time to 60 minutes and will start the compression of tables/indexes across all listed servers that have a difference of 25% or higher between current and recommended. Output of command is exported to a csv. + + #> + [CmdletBinding(DefaultParameterSetName = "Default", SupportsShouldProcess)] + [Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSUseOutputTypeCorrectly", "", Justification = "PSSA Rule Ignored by BOH")] + param ( + [parameter(Mandatory, ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [object[]]$Database, + [object[]]$ExcludeDatabase, + [ValidateSet("Recommended", "Page", "Row", "None")]$CompressionType = "Recommended", + [int]$MaxRunTime = 0, + [int]$PercentCompression = 0, + $InputObject, + [Alias('Silent')] + [switch]$EnableException + ) + + process { + $starttime = Get-Date + foreach ($instance in $SqlInstance) { + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential -MinimumVersion 10 + } catch { + Stop-Function -Message "Failed to process Instance $instance" -ErrorRecord $_ -Target $instance -Continue + } + + $Server.ConnectionContext.StatementTimeout = 0 + + #The reason why we do this is because of SQL 2016 and they now allow for compression on standard edition. + if ($server.EngineEdition -notmatch 'Enterprise' -and $server.VersionMajor -lt '13') { + Stop-Function -Message "Only SQL Server Enterprise Edition supports compression on $server" -Target $server -Continue + } + try { + $dbs = $server.Databases | Where-Object { $_.IsAccessible -and $_.IsSystemObject -eq 0} + if ($Database) { + $dbs = $dbs | Where-Object { $_.Name -in $Database } + } + if ($ExcludeDatabase) { + $dbs = $dbs | Where-Object { $_.Name -NotIn $ExcludeDatabase } + } + } catch { + Stop-Function -Message "Unable to gather list of databases for $instance" -Target $instance -ErrorRecord $_ -Continue + } + + foreach ($db in $dbs) { + try { + Write-Message -Level Verbose -Message "Querying $instance - $db" + if ($db.status -ne 'Normal' -or $db.IsAccessible -eq $false) { + Write-Message -Level Warning -Message "$db is not accessible" -Target $db + continue + } + if ($db.CompatibilityLevel -lt 'Version100') { + Stop-Function -Message "$db has a compatibility level lower than Version100 and will be skipped." -Target $db -Continue + } + if ($CompressionType -eq "Recommended") { + if (Test-Bound "InputObject") { + Write-Message -Level Verbose -Message "Using passed in compression suggestions" + $compressionSuggestion = $InputObject | Where-Object {$_.Database -eq $db.name} + } else { + Write-Message -Level Verbose -Message "Testing database for compression suggestions for $instance.$db" + $compressionSuggestion = Test-DbaDbCompression -SqlInstance $server -Database $db.Name + } + } + } catch { + Stop-Function -Message "Unable to query $instance - $db" -Target $db -ErrorRecord $_ -Continue + } + + try { + if ($CompressionType -eq "Recommended") { + if ($Pscmdlet.ShouldProcess($db, "Applying suggested compression using results from Test-DbaDbCompression")) { + Write-Message -Level Verbose -Message "Applying suggested compression settings using Test-DbaDbCompression" + $results += $compressionSuggestion | Select-Object *, @{l = 'AlreadyProcessed'; e = {"False"}} + foreach ($obj in ($results | Where-Object {$_.CompressionTypeRecommendation -notin @('NO_GAIN', '?') -and $_.PercentCompression -ge $PercentCompression} | Sort-Object PercentCompression -Descending)) { + if ($MaxRunTime -ne 0 -and ($(get-date) - $starttime).TotalMinutes -ge $MaxRunTime) { + Write-Message -Level Verbose -Message "Reached max run time of $MaxRunTime" + break + } + if ($obj.indexId -le 1) { + ##heaps and clustered indexes + Write-Message -Level Verbose -Message "Applying $($obj.CompressionTypeRecommendation) compression to $($obj.Database).$($obj.Schema).$($obj.TableName)" + $($server.Databases[$obj.Database].Tables[$obj.TableName, $obj.Schema].PhysicalPartitions | Where-Object {$_.PartitionNumber -eq $obj.Partition}).DataCompression = $($obj.CompressionTypeRecommendation) + $server.Databases[$obj.Database].Tables[$obj.TableName, $($obj.Schema)].Rebuild() + $obj.AlreadyProcessed = "True" + } else { + ##nonclustered indexes + Write-Message -Level Verbose -Message "Applying $($obj.CompressionTypeRecommendation) compression to $($obj.Database).$($obj.Schema).$($obj.TableName).$($obj.IndexName)" + $($server.Databases[$obj.Database].Tables[$obj.TableName, $obj.Schema].Indexes[$obj.IndexName].PhysicalPartitions | Where-Object {$_.PartitionNumber -eq $obj.Partition}).DataCompression = $($obj.CompressionTypeRecommendation) + $server.Databases[$obj.Database].Tables[$obj.TableName, $obj.Schema].Indexes[$obj.IndexName].Rebuild() + $obj.AlreadyProcessed = "True" + } + $obj + } + } + } else { + if ($Pscmdlet.ShouldProcess($db, "Applying $CompressionType compression")) { + Write-Message -Level Verbose -Message "Applying $CompressionType compression to all objects in $($db.name)" + foreach ($obj in $server.Databases[$($db.name)].Tables | Where-Object {!$_.IsMemoryOptimized}) { + if ($MaxRunTime -ne 0 -and ($(get-date) - $starttime).TotalMinutes -ge $MaxRunTime) { + Write-Message -Level Verbose -Message "Reached max run time of $MaxRunTime" + break + } + foreach ($p in $($obj.PhysicalPartitions | Where-Object {$_.DataCompression -notin ($CompressionType, 'ColumnStore', 'ColumnStoreArchive')})) { + Write-Message -Level Verbose -Message "Compressing table $($obj.Schema).$($obj.Name)" + $($obj.PhysicalPartitions | Where-Object {$_.PartitionNumber -eq $P.PartitionNumber}).DataCompression = $CompressionType + $obj.Rebuild() + [pscustomobject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + Database = $db.Name + Schema = $obj.Schema + TableName = $obj.Name + IndexName = $null + Partition = $p.PartitionNumber + IndexID = 0 + IndexType = Switch ($obj.HasHeapIndex) {$false {"ClusteredIndex"} $true {"Heap"}} + PercentScan = $null + PercentUpdate = $null + RowEstimatePercentOriginal = $null + PageEstimatePercentOriginal = $null + CompressionTypeRecommendation = $CompressionType.ToUpper() + SizeCurrent = $null + SizeRequested = $null + PercentCompression = $null + AlreadyProcessed = "True" + } + } + + foreach ($index in $($obj.Indexes | Where-Object {!$_.IsMemoryOptimized -and $_.IndexType -notmatch 'Columnstore'})) { + if ($MaxRunTime -ne 0 -and ($(get-date) - $starttime).TotalMinutes -ge $MaxRunTime) { + Write-Message -Level Verbose -Message "Reached max run time of $MaxRunTime" + break + } + foreach ($p in $($index.PhysicalPartitions | Where-Object {$_.DataCompression -ne $CompressionType})) { + Write-Message -Level Verbose -Message "Compressing $($Index.IndexType) $($Index.Name) Partition $($p.PartitionNumber)" + + ## There is a bug in SMO where setting compression to None at the index level doesn't work + ## Once this UserVoice item is fixed the workaround can be removed + ## https://feedback.azure.com/forums/908035-sql-server/suggestions/34080112-data-compression-smo-bug + if ($CompressionType -eq "None") { + $query = "ALTER INDEX [$($index.Name)] ON $($index.Parent) REBUILD PARTITION = ALL WITH (DATA_COMPRESSION = $CompressionType)" + $Server.Query($query, $db.Name) + } else { + $($Index.PhysicalPartitions | Where-Object {$_.PartitionNumber -eq $P.PartitionNumber}).DataCompression = $CompressionType + $index.Rebuild() + } + + [pscustomobject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + Database = $db.Name + Schema = $obj.Schema + TableName = $obj.Name + IndexName = $index.Name + Partition = $p.PartitionNumber + IndexID = $index.Id + IndexType = $index.IndexType + PercentScan = $null + PercentUpdate = $null + RowEstimatePercentOriginal = $null + PageEstimatePercentOriginal = $null + CompressionTypeRecommendation = $CompressionType.ToUpper() + SizeCurrent = $null + SizeRequested = $null + PercentCompression = $null + AlreadyProcessed = "True" + } + } + } + } + foreach ($index in $($server.Databases[$($db.name)].Views | Where-Object {$_.Indexes}).Indexes) { + foreach ($p in $($index.PhysicalPartitions | Where-Object {$_.DataCompression -ne $CompressionType})) { + Write-Message -Level Verbose -Message "Compressing $($index.IndexType) $($index.Name) Partition $($p.PartitionNumber)" + + ## There is a bug in SMO where setting compression to None at the index level doesn't work + ## Once this UserVoice item is fixed the workaround can be removed + ## https://feedback.azure.com/forums/908035-sql-server/suggestions/34080112-data-compression-smo-bug + if ($CompressionType -eq "None") { + $query = "ALTER INDEX [$($index.Name)] ON $($index.Parent) REBUILD PARTITION = ALL WITH (DATA_COMPRESSION = $CompressionType)" + $query + $Server.Query($query, $db.Name) + } else { + $($index.PhysicalPartitions | Where-Object {$_.PartitionNumber -eq $P.PartitionNumber}).DataCompression = $CompressionType + $index.Rebuild() + } + + [pscustomobject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + Database = $db.Name + Schema = $obj.Schema + TableName = $obj.Name + IndexName = $index.Name + Partition = $p.PartitionNumber + IndexID = $index.Id + IndexType = $index.IndexType + PercentScan = $null + PercentUpdate = $null + RowEstimatePercentOriginal = $null + PageEstimatePercentOriginal = $null + CompressionTypeRecommendation = $CompressionType.ToUpper() + SizeCurrent = $null + SizeRequested = $null + PercentCompression = $null + AlreadyProcessed = "True" + } + } + } + } + } + } catch { + Stop-Function -Message "Compression failed for $instance - $db" -Target $db -ErrorRecord $_ -Continue + } + } + } + } +} +function Set-DbaDbIdentity { + <# + .SYNOPSIS + Checks and updates the current identity value via DBCC CHECKIDENT + + .DESCRIPTION + Use the command DBCC CHECKIDENT to check and if necessary update the current identity value of a table and return results + Can update an individual table via the ReSeedValue and RESEED option of DBCC CHECKIDENT + + Read more: + - https://docs.microsoft.com/en-us/sql/t-sql/database-console-commands/dbcc-checkident-transact-sql + + .PARAMETER SqlInstance + The target SQL Server instance or instances. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Database + The database(s) to process - this list is auto-populated from the server. If unspecified, all databases will be processed. + Only one database should be specified when using a RESEED value + + .PARAMETER Table + The table(s) for which to check the current identity value. + Only one table should be specified when using a RESEED value + + .PARAMETER ReSeedValue + The new reseed value to be used to set as the current identity value. + + .PARAMETER WhatIf + Shows what would happen if the cmdlet runs. The cmdlet is not run. + + .PARAMETER Confirm + Prompts you for confirmation before running the cmdlet. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: DBCC + Author: Patrick Flynn (@sqllensman) + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Set-DbaDbIdentity + + .EXAMPLE + PS C:\> Set-DbaDbIdentity -SqlInstance SQLServer2017 -Database AdventureWorks2014 -Table 'Production.ScrapReason' + + Connects to AdventureWorks2014 on instance SqlServer2017 using Windows Authentication and runs the command DBCC CHECKIDENT('Production.ScrapReason') to return the current identity value. + + .EXAMPLE + PS C:\> $cred = Get-Credential sqladmin + PS C:\> 'Sql1','Sql2/sqlexpress' | Set-DbaDbIdentity -SqlCredential $cred -Database AdventureWorks2014 -Table 'Production.ScrapReason' + + Connects to AdventureWorks2014 on instances Sql1 and Sql2/sqlexpress using sqladmin credential and runs the command DBCC CHECKIDENT('Production.ScrapReason') to return the current identity value. + + .EXAMPLE + PS C:\> $query = "Select Schema_Name(t.schema_id) +'.' + t.name as TableName from sys.columns c INNER JOIN sys.tables t on t.object_id = c.object_id WHERE is_identity = 1" + PS C:\> $IdentityTables = Invoke-DbaQuery -SqlInstance SQLServer2017 -Database AdventureWorks2014 -Query $query + PS C:\> foreach ($tbl in $IdentityTables) { + PS C:\> Set-DbaDbIdentity -SqlInstance SQLServer2017 -Database AdventureWorks2014 -Table $tbl.TableName + PS C:\> } + + Checks the current identity value for all tables with an Identity in the AdventureWorks2014 database on the SQLServer2017 and, if it is needed, changes the identity value. + + + #> + [CmdletBinding(SupportsShouldProcess, ConfirmImpact = 'High')] + param ( + [parameter(Mandatory, ValueFromPipeline)] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [string[]]$Database, + [string[]]$Table, + [int]$ReSeedValue, + [switch]$EnableException + ) + begin { + $stringBuilder = New-Object System.Text.StringBuilder + $null = $stringBuilder.Append("DBCC CHECKIDENT(#options#)") + } + process { + if (Test-Bound -ParameterName ReSeedValue) { + if ((Test-Bound -Not -ParameterName Database) -or (Test-Bound -Not -ParameterName Table)) { + Stop-Function -Message "When using a reseed value you must specify a database and a table to execute against." + return + } + + if (($Database.Count -gt 1) -or ($Table.Count -gt 1)) { + Stop-Function -Message "When using a reseed value you must specify a single database and a single table to execute against." + return + } + } + + foreach ($instance in $SqlInstance) { + Write-Message -Message "Attempting Connection to $instance" -Level Verbose + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + $dbs = $server.Databases + + if ($Database) { + $dbs = $dbs | Where-Object Name -In $Database + } + + foreach ($db in $dbs) { + Write-Message -Level Verbose -Message "Processing $db on $instance" + + if ($db.IsAccessible -eq $false) { + Stop-Function -Message "The database $db is not accessible. Skipping." -Continue + } + + foreach ($tbl in $Table) { + try { + $query = $StringBuilder.ToString() + if (Test-Bound -Not -ParameterName ReSeedValue) { + $query = $query.Replace('#options#', "'$($tbl)'") + } else { + $query = $query.Replace('#options#', "'$($tbl)', RESEED, $($ReSeedValue)") + } + + if ($Pscmdlet.ShouldProcess($server.Name, "Execute the command $query against $instance")) { + Write-Message -Message "Query to run: $query" -Level Verbose + $results = $server | Invoke-DbaQuery -Query $query -Database $db.Name -MessagesToOutput + if ($null -ne $results) { + $words = $results.Split(" ") + $identityValue = $words[6].Replace("'", "").Replace(",", "") + if (Test-Bound -Not -ParameterName ReSeedValue) { + $columnValue = $words[10].Replace("'", "").Replace(".", "") + } else { + $columnValue = '' + } + + } else { + $identityValue = $null + $columnValue = $null + } + } + } catch { + Stop-Function -Message "Error running $query against $db" -Target $instance -ErrorRecord $_ -Exception $_.Exception -Continue + } + if ($Pscmdlet.ShouldProcess("console", "Outputting object")) { + [PSCustomObject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + Database = $db.Name + Table = $tbl + Cmd = $query.ToString() + IdentityValue = $identityValue + ColumnValue = $columnValue + Output = $results + } + } + } + } + } + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function Set-DbaDbMirror { + <# + .SYNOPSIS + Sets properties of database mirrors. + + .DESCRIPTION + Sets properties of database mirrors. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. This can be a collection and receive pipeline input to allow the function + to be executed against multiple SQL Server instances. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Database + The target database. + + .PARAMETER Partner + Sets the partner fqdn. + + .PARAMETER Witness + Sets the witness fqdn. + + .PARAMETER SafetyLevel + Sets the mirroring safety level. + + .PARAMETER State + Sets the mirror state. + + .PARAMETER InputObject + Allows piping from Get-DbaDatabase. + + .PARAMETER WhatIf + Shows what would happen if the command were to run. No actions are actually performed. + + .PARAMETER Confirm + Prompts you for confirmation before executing any changing operations within the command. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Mirror, HA + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Set-DbaDbMirror + + .EXAMPLE + PS C:\> Set-DbaDbMirror -SqlInstance sql2005 -Database dbatools -Partner TCP://SQL2008.ad.local:5374 + + Prompts for confirmation then sets the partner to TCP://SQL2008.ad.local:5374 for the database "dbtools" + + .EXAMPLE + PS C:\> Set-DbaDbMirror -SqlInstance sql2005 -Database dbatools -Witness TCP://SQL2012.ad.local:5502 -Confirm:$false + + Does not prompt for confirmation and sets the witness to TCP://SQL2012.ad.local:5502 for the database "dbtools" + + .EXAMPLE + PS C:\> Get-DbaDatabase -SqlInstance sql2005 | Out-GridView -PassThru | Set-DbaDbMirror -SafetyLevel Full -Confirm:$false + + Sets the safety level to Full for databases selected from a grid view. Does not prompt for confirmation. + + .EXAMPLE + PS C:\> Set-DbaDbMirror -SqlInstance sql2005 -Database dbatools -State Suspend -Confirm:$false + + Does not prompt for confirmation and sets the state to suspend for the database "dbtools" + + #> + [CmdletBinding(SupportsShouldProcess, ConfirmImpact = 'High')] + param ( + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [string[]]$Database, + [string]$Partner, + [string]$Witness, + [ValidateSet('Full', 'Off', 'None')] + [string]$SafetyLevel, + [ValidateSet('ForceFailoverAndAllowDataLoss', 'Failover', 'RemoveWitness', 'Resume', 'Suspend', 'Off')] + [string]$State, + [parameter(ValueFromPipeline)] + [Microsoft.SqlServer.Management.Smo.Database[]]$InputObject, + [switch]$EnableException + ) + process { + if ((Test-Bound -ParameterName SqlInstance) -and (Test-Bound -Not -ParameterName Database)) { + Stop-Function -Message "Database is required when SqlInstance is specified" + return + } + foreach ($instance in $SqlInstance) { + $InputObject += Get-DbaDatabase -SqlInstance $instance -SqlCredential $SqlCredential -Database $Database + } + + foreach ($db in $InputObject) { + try { + if ($Partner) { + if ($Pscmdlet.ShouldProcess($db.Parent.Name, "Setting partner on $db")) { + # use t-sql cuz $db.Alter() doesnt always work against restoring dbs + $db.Parent.Query("ALTER DATABASE $db SET PARTNER = N'$Partner'") + } + } elseif ($Witness) { + if ($Pscmdlet.ShouldProcess($db.Parent.Name, "Setting witness on $db")) { + $db.Parent.Query("ALTER DATABASE $db SET WITNESS = N'$Witness'") + } + } + + if ($SafetyLevel) { + if ($Pscmdlet.ShouldProcess($db.Parent.Name, "Changing safety level to $SafetyLevel on $db")) { + $db.Parent.Query("ALTER DATABASE $db SET PARTNER SAFETY $SafetyLevel") + # $db.MirroringSafetyLevel = $SafetyLevel + } + } + + if ($State) { + if ($Pscmdlet.ShouldProcess($db.Parent.Name, "Changing mirror state to $State on $db")) { + $db.ChangeMirroringState($State) + $db.Alter() + $db + } + } + } catch { + Stop-Function -Message "Failure" -ErrorRecord $_ + } + } + } +} +function Set-DbaDbOwner { + <# + .SYNOPSIS + Sets database owners with a desired login if databases do not match that owner. + + .DESCRIPTION + This function will alter database ownership to match a specified login if their current owner does not match the target login. By default, the target login will be 'sa', but the function will allow the user to specify a different login for ownership. The user can also apply this to all databases or only to a select list of databases (passed as either a comma separated list or a string array). + + Best Practice reference: http://weblogs.sqlteam.com/dang/archive/2008/01/13/Database-Owner-Troubles.aspx + + .PARAMETER SqlInstance + The target SQL Server instance or instances. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Database + Specifies the database(s) to process. Options for this list are auto-populated from the server. If unspecified, all databases will be processed. + + .PARAMETER ExcludeDatabase + Specifies the database(s) to exclude from processing. Options for this list are auto-populated from the server. + + .PARAMETER TargetLogin + Specifies the login that you wish check for ownership. This defaults to 'sa' or the sysadmin name if sa was renamed. This must be a valid security principal which exists on the target server. + + .PARAMETER WhatIf + If this switch is enabled, no actions are performed but informational messages will be displayed that explain what would happen if the command were to run. + + .PARAMETER Confirm + If this switch is enabled, you will be prompted for confirmation before executing any operations that change state. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Database, Owner, DbOwner + Author: Michael Fal (@Mike_Fal), http://mikefal.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Set-DbaDbOwner + + .EXAMPLE + PS C:\> Set-DbaDbOwner -SqlInstance localhost + + Sets database owner to 'sa' on all databases where the owner does not match 'sa'. + + .EXAMPLE + PS C:\> Set-DbaDbOwner -SqlInstance localhost -TargetLogin DOMAIN\account + + Sets the database owner to DOMAIN\account on all databases where the owner does not match DOMAIN\account. + + .EXAMPLE + PS C:\> Set-DbaDbOwner -SqlInstance sqlserver -Database db1, db2 + + Sets database owner to 'sa' on the db1 and db2 databases if their current owner does not match 'sa'. + + #> + [CmdletBinding(SupportsShouldProcess)] + param ( + [parameter(Mandatory, ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [Alias("Credential")] + [PSCredential]$SqlCredential, + [Alias("Databases")] + [object[]]$Database, + [object[]]$ExcludeDatabase, + [Alias("Login")] + [string]$TargetLogin, + [Alias('Silent')] + [switch]$EnableException + ) + + process { + foreach ($instance in $SqlInstance) { + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential + } catch { + Stop-Function -Message "Failure." -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + # dynamic sa name for orgs who have changed their sa name + if (!$TargetLogin) { + $TargetLogin = ($server.logins | Where-Object { $_.id -eq 1 }).Name + } + + #Validate login + if (($server.Logins.Name) -notcontains $TargetLogin) { + Stop-Function -Message "$TargetLogin is not a valid login on $instance. Moving on." -Continue -EnableException $EnableException + } + + #Owner cannot be a group + $TargetLoginObject = $server.Logins | where-object {$PSItem.Name -eq $TargetLogin }| Select-Object -property Name, LoginType + if ($TargetLoginObject.LoginType -eq 'WindowsGroup') { + Stop-Function -Message "$TargetLogin is a group, therefore can't be set as owner. Moving on." -Continue -EnableException $EnableException + } + + #Get database list. If value for -Database is passed, massage to make it a string array. + #Otherwise, use all databases on the instance where owner not equal to -TargetLogin + #use where owner and target login do not match + #exclude system dbs + $dbs = $server.Databases | Where-Object { $_.IsAccessible -and $_.Owner -ne $TargetLogin -and @('master', 'model', 'msdb', 'tempdb', 'distribution') -notcontains $_.Name} + + #filter collection based on -Databases/-Exclude parameters + if ($Database) { + $dbs = $dbs | Where-Object { $Database -contains $_.Name } + } + + if ($ExcludeDatabase) { + $dbs = $dbs | Where-Object { $ExcludeDatabase -notcontains $_.Name } + } + + Write-Message -Level Verbose -Message "Updating $($dbs.Count) database(s)." + foreach ($db in $dbs) { + $dbname = $db.name + if ($PSCmdlet.ShouldProcess($instance, "Setting database owner for $dbname to $TargetLogin")) { + try { + Write-Message -Level Verbose -Message "Setting database owner for $dbname to $TargetLogin on $instance." + # Set database owner to $TargetLogin (default 'sa') + # Ownership validations checks + + #Database is online and accessible + if ($db.Status -notmatch 'Normal') { + Write-Message -Level Warning -Message "$dbname on $instance is in a $($db.Status) state and can not be altered. It will be skipped." + } + #Database is updatable, not read-only + elseif ($db.IsUpdateable -eq $false) { + Write-Message -Level Warning -Message "$dbname on $instance is not in an updateable state and can not be altered. It will be skipped." + } + #Is the login mapped as a user? Logins already mapped in the database can not be the owner + elseif ($db.Users.name -contains $TargetLogin) { + Write-Message -Level Warning -Message "$dbname on $instance has $TargetLogin as a mapped user. Mapped users can not be database owners." + } else { + $db.SetOwner($TargetLogin) + [PSCustomObject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + Database = $db + Owner = $TargetLogin + } + } + } catch { + Stop-Function -Message "Failure updating owner." -ErrorRecord $_ -Target $instance -Continue + } + } + } + } + } + end { + Test-DbaDeprecation -DeprecatedOn "1.0.0" -EnableException:$false -Alias Set-DbaDatabaseOwner + } +} +#ValidationTags#CodeStyle,Messaging,FlowControl,Pipeline# +function Set-DbaDbQueryStoreOption { + <# + .SYNOPSIS + Configure Query Store settings for a specific or multiple databases. + + .DESCRIPTION + Configure Query Store settings for a specific or multiple databases. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. + + .PARAMETER SqlCredential + SqlCredential object used to connect to the SQL Server as a different user. + + .PARAMETER Database + The database(s) to process - this list is auto-populated from the server. If unspecified, all databases will be processed. + + .PARAMETER ExcludeDatabase + The database(s) to exclude - this list is auto-populated from the server + + .PARAMETER AllDatabases + Run command against all user databases + + .PARAMETER State + Set the state of the Query Store. Valid options are "ReadWrite", "ReadOnly" and "Off". + + .PARAMETER FlushInterval + Set the flush to disk interval of the Query Store in seconds. + + .PARAMETER CollectionInterval + Set the runtime statistics collection interval of the Query Store in minutes. + + .PARAMETER MaxSize + Set the maximum size of the Query Store in MB. + + .PARAMETER CaptureMode + Set the query capture mode of the Query Store. Valid options are "Auto" and "All". + + .PARAMETER CleanupMode + Set the query cleanup mode policy. Valid options are "Auto" and "Off". + + .PARAMETER StaleQueryThreshold + Set the stale query threshold in days. + + .PARAMETER WhatIf + Shows what would happen if the command were to run + + .PARAMETER Confirm + Prompts for confirmation of every step. For example: + + Are you sure you want to perform this action? + Performing the operation "Changing Desired State" on target "pubs on SQL2016\VNEXT". + [Y] Yes [A] Yes to All [N] No [L] No to All [S] Suspend [?] Help (default is "Y"): + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: QueryStore + Author: Enrico van de Laar (@evdlaar) + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Set-DbaQueryStoreOptions + + .EXAMPLE + PS C:\> Set-DbaDbQueryStoreOption -SqlInstance ServerA\SQL -State ReadWrite -FlushInterval 600 -CollectionInterval 10 -MaxSize 100 -CaptureMode All -CleanupMode Auto -StaleQueryThreshold 100 -AllDatabases + + Configure the Query Store settings for all user databases in the ServerA\SQL Instance. + + .EXAMPLE + PS C:\> Set-DbaDbQueryStoreOption -SqlInstance ServerA\SQL -FlushInterval 600 + + Only configure the FlushInterval setting for all Query Store databases in the ServerA\SQL Instance. + + .EXAMPLE + PS C:\> Set-DbaDbQueryStoreOption -SqlInstance ServerA\SQL -Database AdventureWorks -State ReadWrite -FlushInterval 600 -CollectionInterval 10 -MaxSize 100 -CaptureMode all -CleanupMode Auto -StaleQueryThreshold 100 + + Configure the Query Store settings for the AdventureWorks database in the ServerA\SQL Instance. + + .EXAMPLE + PS C:\> Set-DbaDbQueryStoreOption -SqlInstance ServerA\SQL -Exclude AdventureWorks -State ReadWrite -FlushInterval 600 -CollectionInterval 10 -MaxSize 100 -CaptureMode all -CleanupMode Auto -StaleQueryThreshold 100 + + Configure the Query Store settings for all user databases except the AdventureWorks database in the ServerA\SQL Instance. + + #> + [CmdletBinding(SupportsShouldProcess)] + param ( + [parameter(Mandatory, ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [Alias("Credential")] + [PSCredential] + $SqlCredential, + [Alias("Databases")] + [object[]]$Database, + [object[]]$ExcludeDatabase, + [switch]$AllDatabases, + [ValidateSet('ReadWrite', 'ReadOnly', 'Off')] + [string[]]$State, + [int64]$FlushInterval, + [int64]$CollectionInterval, + [int64]$MaxSize, + [ValidateSet('Auto', 'All')] + [string[]]$CaptureMode, + [ValidateSet('Auto', 'Off')] + [string[]]$CleanupMode, + [int64]$StaleQueryThreshold, + [Alias('Silent')] + [switch]$EnableException + ) + begin { + $ExcludeDatabase += 'master', 'tempdb' + } + + process { + if (!$Database -and !$ExcludeDatabase -and !$AllDatabases) { + Stop-Function -Message "You must specify a database(s) to execute against using either -Database, -ExcludeDatabase or -AllDatabases" + return + } + + if (!$State -and !$FlushInterval -and !$CollectionInterval -and !$MaxSize -and !$CaptureMode -and !$CleanupMode -and !$StaleQueryThreshold) { + Stop-Function -Message "You must specify something to change." + return + } + + foreach ($instance in $SqlInstance) { + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential -MinimumVersion 13 + + } catch { + Stop-Function -Message "Can't connect to $instance. Moving on." -Category InvalidOperation -InnerErrorRecord $_ -Target $instance -Continue + } + + # We have to exclude all the system databases since they cannot have the Query Store feature enabled + $dbs = Get-DbaDatabase -SqlInstance $server -ExcludeDatabase $ExcludeDatabase -Database $Database | Where-Object IsAccessible + + foreach ($db in $dbs) { + Write-Message -Level Verbose -Message "Processing $($db.name) on $instance" + + if ($db.IsAccessible -eq $false) { + Write-Message -Level Warning -Message "The database $db on server $instance is not accessible. Skipping database." + continue + } + + if ($State) { + if ($Pscmdlet.ShouldProcess("$db on $instance", "Changing DesiredState to $state")) { + $db.QueryStoreOptions.DesiredState = $State + $db.QueryStoreOptions.Alter() + $db.QueryStoreOptions.Refresh() + } + } + + if ($db.QueryStoreOptions.DesiredState -eq "Off" -and (Test-Bound -Parameter State -Not)) { + Write-Message -Level Warning -Message "State is set to Off; cannot change values. Please update State to ReadOnly or ReadWrite." + continue + } + + if ($FlushInterval) { + if ($Pscmdlet.ShouldProcess("$db on $instance", "Changing DataFlushIntervalInSeconds to $FlushInterval")) { + $db.QueryStoreOptions.DataFlushIntervalInSeconds = $FlushInterval + } + } + + if ($CollectionInterval) { + if ($Pscmdlet.ShouldProcess("$db on $instance", "Changing StatisticsCollectionIntervalInMinutes to $CollectionInterval")) { + $db.QueryStoreOptions.StatisticsCollectionIntervalInMinutes = $CollectionInterval + } + } + + if ($MaxSize) { + if ($Pscmdlet.ShouldProcess("$db on $instance", "Changing MaxStorageSizeInMB to $MaxSize")) { + $db.QueryStoreOptions.MaxStorageSizeInMB = $MaxSize + } + } + + if ($CaptureMode) { + if ($Pscmdlet.ShouldProcess("$db on $instance", "Changing QueryCaptureMode to $CaptureMode")) { + $db.QueryStoreOptions.QueryCaptureMode = $CaptureMode + } + } + + if ($CleanupMode) { + if ($Pscmdlet.ShouldProcess("$db on $instance", "Changing SizeBasedCleanupMode to $CleanupMode")) { + $db.QueryStoreOptions.SizeBasedCleanupMode = $CleanupMode + } + } + + if ($StaleQueryThreshold) { + if ($Pscmdlet.ShouldProcess("$db on $instance", "Changing StaleQueryThresholdInDays to $StaleQueryThreshold")) { + $db.QueryStoreOptions.StaleQueryThresholdInDays = $StaleQueryThreshold + } + } + + # Alter the Query Store Configuration + if ($Pscmdlet.ShouldProcess("$db on $instance", "Altering Query Store configuration on database")) { + try { + $db.QueryStoreOptions.Alter() + $db.Alter() + $db.Refresh() + } catch { + Stop-Function -Message "Could not modify configuration." -Category InvalidOperation -InnerErrorRecord $_ -Target $db -Continue + } + } + + if ($Pscmdlet.ShouldProcess("$db on $instance", "Getting results from Get-DbaDbQueryStoreOption")) { + # Display resulting changes + Get-DbaDbQueryStoreOption -SqlInstance $server -Database $db.name -Verbose:$false + } + } + } + } + end { + Test-DbaDeprecation -DeprecatedOn "1.0.0" -EnableException:$false -Alias Set-DbaDbQueryStoreOptions + } +} +function Set-DbaDbRecoveryModel { + <# + .SYNOPSIS + Set-DbaDbRecoveryModel sets the Recovery Model. + + .DESCRIPTION + Set-DbaDbRecoveryModel sets the Recovery Model for user databases. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Database + The database(s) to process - this list is auto-populated from the server. if unspecified, all databases will be processed. + + .PARAMETER ExcludeDatabase + The database(s) to exclude - this list is auto-populated from the server + + .PARAMETER AllDatabases + This is a parameter that was included for safety, so you don't accidentally set options on all databases without specifying + + .PARAMETER RecoveryModel + Recovery Model to be set. Valid options are 'Simple', 'Full', 'BulkLogged' + + Details about the recovery models can be found here: + https://docs.microsoft.com/en-us/sql/relational-databases/backup-restore/recovery-models-sql-server + + .PARAMETER WhatIf + If this switch is enabled, no actions are performed but informational messages will be displayed that explain what would happen if the command were to run. + + .PARAMETER Confirm + Prompts for confirmation. For example: + + Are you sure you want to perform this action? + Performing the operation "ALTER DATABASE [model] SET RECOVERY Full" on target "[model] on WERES14224". + [Y] Yes [A] Yes to All [N] No [L] No to All [S] Suspend [?] Help (default is "Y"): + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .PARAMETER InputObject + A collection of databases (such as returned by Get-DbaDatabase) + + .NOTES + Tags: RecoveryModel, Database + Author: Viorel Ciucu (@viorelciucu), https://www.cviorel.com + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Set-DbaDbRecoveryModel + + .EXAMPLE + PS C:\> Set-DbaDbRecoveryModel -SqlInstance sql2014 -RecoveryModel BulkLogged -Database model -Confirm:$true -Verbose + + Sets the Recovery Model to BulkLogged for database [model] on SQL Server instance sql2014. User is requested to confirm the action. + + .EXAMPLE + PS C:\> Get-DbaDatabase -SqlInstance sql2014 -Database TestDB | Set-DbaDbRecoveryModel -RecoveryModel Simple -Confirm:$false + + Sets the Recovery Model to Simple for database [TestDB] on SQL Server instance sql2014. Confirmation is not required. + + .EXAMPLE + PS C:\> Set-DbaDbRecoveryModel -SqlInstance sql2014 -RecoveryModel Simple -Database TestDB -Confirm:$false + + Sets the Recovery Model to Simple for database [TestDB] on SQL Server instance sql2014. Confirmation is not required. + + .EXAMPLE + PS C:\> Set-DbaDbRecoveryModel -SqlInstance sql2014 -RecoveryModel Simple -AllDatabases -Confirm:$false + + Sets the Recovery Model to Simple for ALL uses databases MODEL database on SQL Server instance sql2014. Runs without asking for confirmation. + + .EXAMPLE + PS C:\> Set-DbaDbRecoveryModel -SqlInstance sql2014 -RecoveryModel BulkLogged -Database TestDB1, TestDB2 -Confirm:$false -Verbose + + Sets the Recovery Model to BulkLogged for [TestDB1] and [TestDB2] databases on SQL Server instance sql2014. Runs without asking for confirmation. + + #> + [CmdletBinding(DefaultParameterSetName = "Default", SupportsShouldProcess, ConfirmImpact = 'High')] + param ( + [parameter(Mandatory, ParameterSetName = "Instance")] + [Alias("ServerInstance", "SqlServer")] + [DbaInstance[]]$SqlInstance, + [PSCredential]$SqlCredential, + [parameter(Mandatory)] + [ValidateSet('Simple', 'Full', 'BulkLogged')] + [string]$RecoveryModel, + [object[]]$Database, + [object[]]$ExcludeDatabase, + [switch]$AllDatabases, + [switch]$EnableException, + [parameter(Mandatory, ValueFromPipeline, ParameterSetName = "Pipeline")] + [Microsoft.SqlServer.Management.Smo.Database[]]$InputObject + ) + process { + foreach ($instance in $SqlInstance) { + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + if (!$Database -and !$AllDatabases -and !$ExcludeDatabase) { + Stop-Function -Message "You must specify -AllDatabases or -Database to continue" + return + } + + # We need to be able to change the RecoveryModel for model database + $systemdbs = @("tempdb") + $databases = $server.Databases | Where-Object { $systemdbs -notcontains $_.Name -and $_.IsAccessible } + + # filter collection based on -Database/-Exclude parameters + if ($Database) { + $databases = $databases | Where-Object Name -In $Database + } + + if ($ExcludeDatabase) { + $databases = $databases | Where-Object Name -NotIn $ExcludeDatabase + } + + if (!$databases) { + Stop-Function -Message "The database(s) you specified do not exist on the instance $instance." + return + } + + $InputObject += $databases + } + + foreach ($db in $InputObject) { + if ($db.RecoveryModel -eq $RecoveryModel) { + Stop-Function -Message "Recovery Model for database $db is already set to $RecoveryModel" -Category ConnectionError -Target $instance -Continue + } else { + if ($Pscmdlet.ShouldProcess("$db on $instance", "ALTER DATABASE $db SET RECOVERY $RecoveryModel")) { + $db.RecoveryModel = $RecoveryModel + $db.Alter() + Write-Message -Level Verbose -Message "Recovery Model set to $RecoveryModel for database $db" + } + } + Get-DbaDbRecoveryModel -SqlInstance $db.Parent -Database $db.name + } + } +} +#ValidationTags#Messaging,FlowControl,Pipeline# +function Set-DbaDbState { + <# + .SYNOPSIS + Sets various options for databases, hereby called "states" + + .DESCRIPTION + Sets some common "states" on databases: + - "RW" options (ReadOnly, ReadWrite) + - "Status" options (Online, Offline, Emergency, plus a special "Detached") + - "Access" options (SingleUser, RestrictedUser, MultiUser) + + Returns an object with SqlInstance, Database, RW, Status, Access, Notes + + Notes gets filled when something went wrong setting the state + + .PARAMETER SqlInstance + The target SQL Server instance or instances + + .PARAMETER SqlCredential + Credential object used to connect to the SQL Server as a different user + + .PARAMETER Database + The database(s) to process - this list is auto-populated from the server. if unspecified, all databases will be processed. + + .PARAMETER ExcludeDatabase + The database(s) to exclude - this list is auto-populated from the server + + .PARAMETER AllDatabases + This is a parameter that was included for safety, so you don't accidentally set options on all databases without specifying + + .PARAMETER ReadOnly + RW Option : Sets the database as READ_ONLY + + .PARAMETER ReadWrite + RW Option : Sets the database as READ_WRITE + + .PARAMETER Online + Status Option : Sets the database as ONLINE + + .PARAMETER Offline + Status Option : Sets the database as OFFLINE + + .PARAMETER Emergency + Status Option : Sets the database as EMERGENCY + + .PARAMETER Detached + Status Option : Detaches the database + + .PARAMETER SingleUser + Access Option : Sets the database as SINGLE_USER + + .PARAMETER RestrictedUser + Access Option : Sets the database as RESTRICTED_USER + + .PARAMETER MultiUser + Access Option : Sets the database as MULTI_USER + + .PARAMETER WhatIf + Shows what would happen if the command were to run. No actions are actually performed. + + .PARAMETER Confirm + Prompts you for confirmation before executing any changing operations within the command. + + .PARAMETER Force + For most options, this translates to instantly rolling back any open transactions + that may be stopping the process. + For -Detached it is required to break mirroring and Availability Groups + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .PARAMETER InputObject + Accepts piped database objects + + .NOTES + Tags: Database, State + Author: Simone Bizzotto (@niphold) + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Set-DbaDbState + + .EXAMPLE + PS C:\> Set-DbaDbState -SqlInstance sqlserver2014a -Database HR -Offline + + Sets the HR database as OFFLINE + + .EXAMPLE + PS C:\> Set-DbaDbState -SqlInstance sqlserver2014a -AllDatabases -Exclude HR -ReadOnly -Force + + Sets all databases of the sqlserver2014a instance, except for HR, as READ_ONLY + + .EXAMPLE + PS C:\> Get-DbaDbState -SqlInstance sql2016 | Where-Object Status -eq 'Offline' | Set-DbaDbState -Online + + Finds all offline databases and sets them to online + + .EXAMPLE + PS C:\> Set-DbaDbState -SqlInstance sqlserver2014a -Database HR -SingleUser + + Sets the HR database as SINGLE_USER + + .EXAMPLE + PS C:\> Set-DbaDbState -SqlInstance sqlserver2014a -Database HR -SingleUser -Force + + Sets the HR database as SINGLE_USER, dropping all other connections (and rolling back open transactions) + + .EXAMPLE + PS C:\> Get-DbaDatabase -SqlInstance sqlserver2014a -Database HR | Set-DbaDbState -SingleUser -Force + + Gets the databases from Get-DbaDatabase, and sets them as SINGLE_USER, dropping all other connections (and rolling back open transactions) + + #> + [CmdletBinding(DefaultParameterSetName = "Default", SupportsShouldProcess)] + param ( + [parameter(Mandatory, ValueFromPipelineByPropertyName, ParameterSetName = "Server")] + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [Alias("Credential")] + [PSCredential] + $SqlCredential, + [Alias("Databases")] + [object[]]$Database, + [object[]]$ExcludeDatabase, + [switch]$AllDatabases, + [switch]$ReadOnly, + [switch]$ReadWrite, + [switch]$Online, + [switch]$Offline, + [switch]$Emergency, + [switch]$Detached, + [switch]$SingleUser, + [switch]$RestrictedUser, + [switch]$MultiUser, + [switch]$Force, + [Alias('Silent')] + [switch]$EnableException, + [parameter(Mandatory, ValueFromPipeline, ParameterSetName = "Database")] + [PsCustomObject[]]$InputObject + ) + + begin { + function Get-WrongCombo($optset, $allparams) { + $x = 0 + foreach ($opt in $optset) { + if ($allparams.ContainsKey($opt)) { $x += 1 } + } + if ($x -gt 1) { + $msg = $optset -Join ',-' + $msg = "You can only specify one of: -" + $msg + throw $msg + } + } + + function Edit-DatabaseState($sqlinstance, $dbname, $opt, $immediate = $false) { + $warn = $null + $sql = "ALTER DATABASE [$dbname] SET $opt" + if ($immediate) { + $sql += " WITH ROLLBACK IMMEDIATE" + } else { + $sql += " WITH NO_WAIT" + } + try { + Write-Message -Level System -Message $sql + if ($immediate) { + # this can be helpful only for SINGLE_USER databases + # but since $immediate is called, it does no more harm + # than the immediate rollback + $sqlinstance.KillAllProcesses($dbname) + } + $null = $sqlinstance.Query($sql) + } catch { + $warn = "Failed to set '$dbname' to $opt" + Write-Message -Level Warning -Message $warn + } + return $warn + } + + $StatusHash = @{ + 'Offline' = 'OFFLINE' + 'Normal' = 'ONLINE' + 'EmergencyMode' = 'EMERGENCY' + } + + function Get-DbState($databaseName, $dbStatuses) { + $base = $dbStatuses | Where-Object DatabaseName -ceq $databaseName + foreach ($status in $StatusHash.Keys) { + if ($base.Status -match $status) { + $base.Status = $StatusHash[$status] + break + } + } + return $base + } + + $RWExclusive = @('ReadOnly', 'ReadWrite') + $StatusExclusive = @('Online', 'Offline', 'Emergency', 'Detached') + $AccessExclusive = @('SingleUser', 'RestrictedUser', 'MultiUser') + $allparams = $PSBoundParameters + try { + Get-WrongCombo -optset $RWExclusive -allparams $allparams + } catch { + Stop-Function -Message $_ + return + } + try { + Get-WrongCombo -optset $StatusExclusive -allparams $allparams + } catch { + Stop-Function -Message $_ + return + } + try { + Get-WrongCombo -optset $AccessExclusive -allparams $allparams + } catch { + Stop-Function -Message $_ + return + } + } + process { + if (Test-FunctionInterrupt) { return } + $dbs = @() + if (!$Database -and !$AllDatabases -and !$InputObject -and !$ExcludeDatabase) { + Stop-Function -Message "You must specify a -AllDatabases or -Database to continue" + return + } + + if ($InputObject) { + if ($InputObject.Database) { + # comes from Get-DbaDbState + $dbs += $InputObject.Database + } elseif ($InputObject.Name) { + # comes from Get-DbaDatabase + $dbs += $InputObject + } + } else { + foreach ($instance in $SqlInstance) { + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + $all_dbs = $server.Databases + $dbs += $all_dbs | Where-Object { @('master', 'model', 'msdb', 'tempdb', 'distribution') -notcontains $_.Name } + + if ($database) { + $dbs = $dbs | Where-Object { $database -contains $_.Name } + } + if ($ExcludeDatabase) { + $dbs = $dbs | Where-Object { $ExcludeDatabase -notcontains $_.Name } + } + } + } + + # need to pick up here + foreach ($db in $dbs) { + if ($db.Name -in @('master', 'model', 'msdb', 'tempdb', 'distribution')) { + Write-Message -Level Warning -Message "Database $db is a system one, skipping" + Continue + } + $dbStatuses = @{} + $server = $db.Parent + if ($server -notin $dbStatuses.Keys) { + $dbStatuses[$server] = Get-DbaDbState -SqlInstance $server + } + + # normalizing properties returned by SMO to something more "fixed" + $db_status = Get-DbState -DatabaseName $db.Name -dbStatuses $dbStatuses[$server] + + + $warn = @() + + if ($db.DatabaseSnapshotBaseName.Length -gt 0) { + Write-Message -Level Warning -Message "Database $db is a snapshot, skipping" + Continue + } + + if ($ReadOnly -eq $true) { + if ($db_status.RW -eq 'READ_ONLY') { + Write-Message -Level VeryVerbose -Message "Database $db is already READ_ONLY" + } else { + if ($Pscmdlet.ShouldProcess($server, "Set $db to READ_ONLY")) { + Write-Message -Level VeryVerbose -Message "Setting database $db to READ_ONLY" + $partial = Edit-DatabaseState -sqlinstance $server -dbname $db.Name -opt "READ_ONLY" -immediate $Force + $warn += $partial + if (!$partial) { + $db_status.RW = 'READ_ONLY' + } + } + } + } + + if ($ReadWrite -eq $true) { + if ($db_status.RW -eq 'READ_WRITE') { + Write-Message -Level VeryVerbose -Message "Database $db is already READ_WRITE" + } else { + if ($Pscmdlet.ShouldProcess($server, "Set $db to READ_WRITE")) { + Write-Message -Level VeryVerbose -Message "Setting database $db to READ_WRITE" + $partial = Edit-DatabaseState -sqlinstance $server -dbname $db.Name -opt "READ_WRITE" -immediate $Force + $warn += $partial + if (!$partial) { + $db_status.RW = 'READ_WRITE' + } + } + } + } + + if ($Online -eq $true) { + if ($db_status.Status -eq 'ONLINE') { + Write-Message -Level VeryVerbose -Message "Database $db is already ONLINE" + } else { + if ($Pscmdlet.ShouldProcess($server, "Set $db to ONLINE")) { + Write-Message -Level VeryVerbose -Message "Setting database $db to ONLINE" + $partial = Edit-DatabaseState -sqlinstance $server -dbname $db.Name -opt "ONLINE" -immediate $Force + $warn += $partial + if (!$partial) { + $db_status.Status = 'ONLINE' + } + } + } + } + + if ($Offline -eq $true) { + if ($db_status.Status -eq 'OFFLINE') { + Write-Message -Level VeryVerbose -Message "Database $db is already OFFLINE" + } else { + if ($Pscmdlet.ShouldProcess($server, "Set $db to OFFLINE")) { + Write-Message -Level VeryVerbose -Message "Setting database $db to OFFLINE" + $partial = Edit-DatabaseState -sqlinstance $server -dbname $db.Name -opt "OFFLINE" -immediate $Force + $warn += $partial + if (!$partial) { + $db_status.Status = 'OFFLINE' + } + } + } + } + + if ($Emergency -eq $true) { + if ($db_status.Status -eq 'EMERGENCY') { + Write-Message -Level VeryVerbose -Message "Database $db is already EMERGENCY" + } else { + if ($Pscmdlet.ShouldProcess($server, "Set $db to EMERGENCY")) { + Write-Message -Level VeryVerbose -Message "Setting database $db to EMERGENCY" + $partial = Edit-DatabaseState -sqlinstance $server -dbname $db.Name -opt "EMERGENCY" -immediate $Force + if (!$partial) { + $db_status.Status = 'EMERGENCY' + } + } + } + } + + if ($SingleUser -eq $true) { + if ($db_status.Access -eq 'SINGLE_USER') { + Write-Message -Level VeryVerbose -Message "Database $db is already SINGLE_USER" + } else { + if ($Pscmdlet.ShouldProcess($server, "Set $db to SINGLE_USER")) { + Write-Message -Level VeryVerbose -Message "Setting $db to SINGLE_USER" + $partial = Edit-DatabaseState -sqlinstance $server -dbname $db.Name -opt "SINGLE_USER" -immediate $Force + if (!$partial) { + $db_status.Access = 'SINGLE_USER' + } + } + } + } + + if ($RestrictedUser -eq $true) { + if ($db_status.Access -eq 'RESTRICTED_USER') { + Write-Message -Level VeryVerbose -Message "Database $db is already RESTRICTED_USER" + } else { + if ($Pscmdlet.ShouldProcess($server, "Set $db to RESTRICTED_USER")) { + Write-Message -Level VeryVerbose -Message "Setting $db to RESTRICTED_USER" + $partial = Edit-DatabaseState -sqlinstance $server -dbname $db.Name -opt "RESTRICTED_USER" -immediate $Force + if (!$partial) { + $db_status.Access = 'RESTRICTED_USER' + } + } + } + } + + if ($MultiUser -eq $true) { + if ($db_status.Access -eq 'MULTI_USER') { + Write-Message -Level VeryVerbose -Message "Database $db is already MULTI_USER" + } else { + if ($Pscmdlet.ShouldProcess($server, "Set $db to MULTI_USER")) { + Write-Message -Level VeryVerbose -Message "Setting $db to MULTI_USER" + $partial = Edit-DatabaseState -sqlinstance $server -dbname $db.Name -opt "MULTI_USER" -immediate $Force + if (!$partial) { + $db_status.Access = 'MULTI_USER' + } + } + } + } + + if ($Detached -eq $true) { + # Refresh info about database state here (before detaching) + $db.Refresh() + # we need to see what snaps are on the server, as base databases cannot be dropped + $snaps = $server.Databases | Where-Object { $_.DatabaseSnapshotBaseName.Length -gt 0 } + $snaps = $snaps.DatabaseSnapshotBaseName | Get-Unique + if ($db.Name -in $snaps) { + Write-Message -Level Warning -Message "Database $db has snapshots, you need to drop them before detaching, skipping..." + Continue + } + if ($db.IsMirroringEnabled -eq $true -or $db.AvailabilityGroupName.Length -gt 0) { + if ($Force -eq $false) { + Write-Message -Level Warning -Message "Needs -Force to detach $db, skipping" + Continue + } + } + + if ($db.IsMirroringEnabled) { + if ($Pscmdlet.ShouldProcess($server, "Break mirroring for $db")) { + try { + $db.ChangeMirroringState([Microsoft.SqlServer.Management.Smo.MirroringOption]::Off) + $db.Alter() + $db.Refresh() + Write-Message -Level VeryVerbose -Message "Broke mirroring for $db" + } catch { + Stop-Function -Message "Could not break mirror for $db. Skipping." -ErrorRecord $_ -Target $server -Continue + } + } + } + + if ($db.AvailabilityGroupName) { + $agname = $db.AvailabilityGroupName + if ($Pscmdlet.ShouldProcess($server, "Removing $db from AG [$agname]")) { + try { + $server.AvailabilityGroups[$db.AvailabilityGroupName].AvailabilityDatabases[$db.Name].Drop() + Write-Message -Level VeryVerbose -Message "Successfully removed $db from AG [$agname] on $server" + } catch { + Stop-Function -Message "Could not remove $db from AG [$agname] on $server" -ErrorRecord $_ -Target $server -Continue + } + } + } + + # DBA 101 should encourage detaching just OFFLINE databases + # we can do that here + if ($Pscmdlet.ShouldProcess($server, "Detaching $db")) { + if ($db_status.Status -ne 'OFFLINE') { + $null = Edit-DatabaseState -sqlinstance $server -dbname $db.Name -opt "OFFLINE" -immediate $true + } + try { + $sql = "EXEC master.dbo.sp_detach_db N'$($db.Name)'" + Write-Message -Level System -Message $sql + $null = $server.Query($sql) + $db_status.Status = 'DETACHED' + } catch { + Stop-Function -Message "Failed to detach $db" -ErrorRecord $_ -Target $server -Continue + $warn += "Failed to detach" + } + + } + + } + if ($warn) { + $warn = $warn | Get-Unique + $warn = $warn -Join ';' + } else { + $warn = $null + } + if ($Detached -eq $true) { + [PSCustomObject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + DatabaseName = $db.Name + RW = $db_status.RW + Status = $db_status.Status + Access = $db_status.Access + Notes = $warn + Database = $db + } | Select-DefaultView -ExcludeProperty Database + } else { + $db.Refresh() + if ($null -eq $warn) { + # we avoid reenumerating properties + $newstate = $db_status + } else { + $newstate = Get-DbState -databaseName $db.Name -dbStatuses $dbStatuses[$server] + } + + [PSCustomObject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + DatabaseName = $db.Name + RW = $newstate.RW + Status = $newstate.Status + Access = $newstate.Access + Notes = $warn + Database = $db + } | Select-DefaultView -ExcludeProperty Database + } + } + + } + end { + Test-DbaDeprecation -DeprecatedOn "1.0.0" -EnableException:$false -Alias Set-DbaDatabaseState + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function Set-DbaEndpoint { + <# + .SYNOPSIS + Sets endpoint properties on a SQL Server instance. + + .DESCRIPTION + Sets endpoint properties on a SQL Server instance. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Owner + Change the endpoint owner. + + .PARAMETER Type + Change the endpoint type. Options: DatabaseMirroring, ServiceBroker, Soap, TSql + + .PARAMETER Endpoint + Only set specific endpoint properties. + + .PARAMETER AllEndpoints + Set all endpoint properties on an instance. + + .PARAMETER InputObject + Enables piping from Get-Endpoint. + + .PARAMETER WhatIf + Shows what would happen if the command were to run. No actions are actually performed. + + .PARAMETER Confirm + Prompts you for confirmation before executing any changing operations within the command. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Endpoint + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Set-DbaEndpoint + + .EXAMPLE + PS C:\> Set-DbaEndpoint -SqlInstance sql2016 -AllEndpoints -Owner sa + + Sets all endpoint owners to sa on sql2016 + + .EXAMPLE + PS C:\> Get-DbaEndpoint -SqlInstance sql2016 -Endpoint ep1 | Set-DbaEndpoint -Type TSql + + Changes the endpoint type to tsql on endpoint ep1 + + #> + [CmdletBinding(SupportsShouldProcess, ConfirmImpact = 'Low')] + param ( + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [string[]]$EndPoint, + [string]$Owner, + [ValidateSet('DatabaseMirroring', 'ServiceBroker', 'Soap', 'TSql')] + [string]$Type, + [switch]$AllEndpoints, + [parameter(ValueFromPipeline)] + [Microsoft.SqlServer.Management.Smo.Endpoint[]]$InputObject, + [switch]$EnableException + ) + + process { + if ((Test-Bound -ParameterName SqlInstance) -And (Test-Bound -Not -ParameterName Endpoint, AllEndpoints)) { + Stop-Function -Message "You must specify AllEndpoints or Endpoint when using the SqlInstance parameter." + return + } + foreach ($instance in $SqlInstance) { + $InputObject += Get-DbaEndpoint -SqlInstance $instance -SqlCredential $SqlCredential -EndPoint $Endpoint + } + + $props = "Owner", "Type" + foreach ($ep in $InputObject) { + try { + if ($Pscmdlet.ShouldProcess($ep.Parent.Name, "Seting properties on $ep")) { + foreach ($prop in $props) { + if ($prop -eq "Type") { + $realprop = "EndpointType" + if (Test-Bound -ParameterName $prop) { + $ep.$realprop = (Get-Variable -Name $prop -ValueOnly) + } + } elseif (Test-Bound -ParameterName $prop) { + $ep.$prop = (Get-Variable -Name $prop -ValueOnly) + } + } + $ep.Alter() + $ep + } + } catch { + Stop-Function -Message "Failure" -ErrorRecord $_ -Continue + } + } + } +} +function Set-DbaErrorLogConfig { + <# + .SYNOPSIS + Set the configuration for the ErrorLog on a given SQL Server instance + + .DESCRIPTION + Sets the number of log files configured on all versions, and size in KB in SQL Server 2012+ and above. + + To set the Path to the ErrorLog, use Set-DbaStartupParameter -ErrorLog. Note that this command requires + remote, administrative access to the Windows/WMI server, similar to SQL Configuration Manager. + + .PARAMETER SqlInstance + The target SQL Server instance or instances + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER LogCount + Integer value between 6 and 99 for setting the number of error log files to keep for SQL Server instance. + + .PARAMETER LogSize + Integer value for the size in KB that you want the error log file to grow. This is feature only in SQL Server 2012 and higher. When the file reaches that limit SQL Server will roll the error log over. + + .PARAMETER WhatIf + If this switch is enabled, no actions are performed but informational messages will be displayed that explain what would happen if the command were to run. + + .PARAMETER Confirm + If this switch is enabled, you will be prompted for confirmation before executing any operations that change state. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Instance, ErrorLog + Author: Shawn Melton (@wsmelton), https://wsmelton.github.com + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Set-DbaErrorLogConfig + + .EXAMPLE + PS C:\> Set-DbaErrorLogConfig -SqlInstance sql2017,sql2014 -LogCount 25 + + Sets the number of error log files to 25 on sql2017 and sql2014 + + .EXAMPLE + PS C:\> Set-DbaErrorLogConfig -SqlInstance sql2014 -LogSize 102400 + + Sets the size of the error log file, before it rolls over, to 102400 KB (100 MB) on sql2014 + + .EXAMPLE + PS C:\> Set-DbaErrorLogConfig -SqlInstance sql2012 -LogCount 25 -LogSize 500 + + Sets the number of error log files to 25 and size before it will roll over to 500 KB on sql2012 + + #> + [cmdletbinding(SupportsShouldProcess)] + param( + [Parameter(ValueFromPipelineByPropertyName, Mandatory)] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [ValidateRange(6, 99)] + [int]$LogCount, + [int]$LogSize, + [switch]$EnableException + ) + process { + foreach ($instance in $SqlInstance) { + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + $currentNumLogs = $server.NumberOfLogFiles + $currentLogSize = $server.ErrorLogSizeKb + + $collection = [PSCustomObject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + LogCount = $currentNumLogs + LogSize = [dbasize]($currentLogSize * 1024) + } + if (Test-Bound -ParameterName 'LogSize') { + if ($server.VersionMajor -lt 11) { + Stop-Function -Message "Size is cannot be set on $instance. SQL Server 2008 R2 and below not supported." -Continue + } + if ($LogSize -eq $currentLogSize) { + Write-Message -Level Warning -Message "The provided value for LogSize is already set to $LogSize KB on $instance" + } else { + if ($PSCmdlet.ShouldProcess($server, "Updating log size from [$currentLogSize] to [$LogSize]")) { + try { + $server.ErrorLogSizeKb = $LogSize + $server.Alter() + } catch { + Stop-Function -Message "Issue setting number of log files on $instance" -Target $instance -ErrorRecord $_ -Exception $_.Exception.InnerException.InnerException.InnerException -Continue + } + } + if ($PSCmdlet.ShouldProcess($server, "Output final results of setting error log size")) { + $server.Refresh() + $collection.LogSize = [dbasize]($server.ErrorLogSizeKb * 1024) + } + } + } + + if (Test-Bound -ParameterName 'LogCount') { + if ($LogCount -eq $currentNumLogs) { + Write-Message -Level Warning -Message "The provided value for LogCount is already set to $LogCount on $instance" + } else { + if ($PSCmdlet.ShouldProcess($server, "Setting number of logs from [$currentNumLogs] to [$LogCount]")) { + try { + $server.NumberOfLogFiles = $LogCount + $server.Alter() + } catch { + Stop-Function -Message "Issue setting number of log files on $instance" -Target $instance -ErrorRecord $_ -Exception $_.Exception.InnerException.InnerException.InnerException -Continue + } + } + if ($PSCmdlet.ShouldProcess($server, "Output final results of setting number of log files")) { + $server.Refresh() + $collection.LogCount = $server.NumberOfLogFiles + } + } + } + $collection + } + } +} +function Set-DbaLogin { + <# + .SYNOPSIS + Set-DbaLogin makes it possible to make changes to one or more logins. + + .DESCRIPTION + Set-DbaLogin will enable you to change the password, unlock, rename, disable or enable, deny or grant login privileges to the login. It's also possible to add or remove server roles from the login. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. You must have sysadmin access and server version must be SQL Server version 2000 or greater. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Login + The login that needs to be changed + + .PARAMETER SecurePassword + The new password for the login This can be either a credential or a secure string. + + .PARAMETER DefaultDatabase + Default database for the login + + .PARAMETER Unlock + Switch to unlock an account. This will only be used in conjunction with the -SecurePassword parameter. + The default is false. + + .PARAMETER MustChange + Does the user need to change his/her password. This will only be used in conjunction with the -SecurePassword parameter. + The default is false. + + .PARAMETER NewName + The new name for the login. + + .PARAMETER Disable + Disable the login + + .PARAMETER Enable + Enable the login + + .PARAMETER DenyLogin + Deny access to SQL Server + + .PARAMETER GrantLogin + Grant access to SQL Server + + .PARAMETER PasswordPolicyEnforced + Should the password policy be enforced. + + .PARAMETER AddRole + Add one or more server roles to the login + The following roles can be used "bulkadmin", "dbcreator", "diskadmin", "processadmin", "public", "securityadmin", "serveradmin", "setupadmin", "sysadmin". + + .PARAMETER RemoveRole + Remove one or more server roles to the login + The following roles can be used "bulkadmin", "dbcreator", "diskadmin", "processadmin", "public", "securityadmin", "serveradmin", "setupadmin", "sysadmin". + + .PARAMETER InputObject + Allows logins to be piped in from Get-DbaLogin + + .PARAMETER WhatIf + If this switch is enabled, no actions are performed but informational messages will be displayed that explain what would happen if the command were to run. + + .PARAMETER Confirm + If this switch is enabled, you will be prompted for confirmation before executing any operations that change state. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Login + Author: Sander Stad (@sqlstad), sqlstad.nl + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Set-DbaLogin + + .EXAMPLE + PS C:\> $SecurePassword = ConvertTo-SecureString "PlainTextPassword" -AsPlainText -Force + PS C:\> $cred = New-Object System.Management.Automation.PSCredential ("username", $SecurePassword) + PS C:\> Set-DbaLogin -SqlInstance sql1 -Login login1 -SecurePassword $cred -Unlock -MustChange + + Set the new password for login1 using a credential, unlock the account and set the option + that the user must change password at next logon. + + .EXAMPLE + PS C:\> Set-DbaLogin -SqlInstance sql1 -Login login1 -Enable + + Enable the login + + .EXAMPLE + PS C:\> Set-DbaLogin -SqlInstance sql1 -Login login1, login2, login3, login4 -Enable + + Enable multiple logins + + .EXAMPLE + PS C:\> Set-DbaLogin -SqlInstance sql1, sql2, sql3 -Login login1, login2, login3, login4 -Enable + + Enable multiple logins on multiple instances + + .EXAMPLE + PS C:\> Set-DbaLogin -SqlInstance sql1 -Login login1 -Disable + + Disable the login + + .EXAMPLE + PS C:\> Set-DbaLogin -SqlInstance sql1 -Login login1 -DenyLogin + + Deny the login to connect to the instance + + .EXAMPLE + PS C:\> Set-DbaLogin -SqlInstance sql1 -Login login1 -GrantLogin + + Grant the login to connect to the instance + + .EXAMPLE + PS C:\> Set-DbaLogin -SqlInstance sql1 -Login login1 -PasswordPolicyEnforced + + Enforces the password policy on a login + + .EXAMPLE + PS C:\> Set-DbaLogin -SqlInstance sql1 -Login login1 -PasswordPolicyEnforced:$false + + Disables enforcement of the password policy on a login + + .EXAMPLE + PS C:\> Set-DbaLogin -SqlInstance sql1 -Login test -AddRole serveradmin + + Add the server role "serveradmin" to the login + + .EXAMPLE + PS C:\> Set-DbaLogin -SqlInstance sql1 -Login test -RemoveRole bulkadmin + + Remove the server role "bulkadmin" to the login + + .EXAMPLE + PS C:\> $login = Get-DbaLogin -SqlInstance sql1 -Login test + PS C:\> $login | Set-DbaLogin -Disable + + Disable the login from the pipeline + + .EXAMPLE + PS C:\> Set-DbaLogin -SqlInstance sql1 -Login login1 -DefaultDatabase master + + Set the default database to master on a login + + #> + + [CmdletBinding(SupportsShouldProcess)] + [Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSAvoidUsingPlainTextForPassword", "", Justification = "For Parameter Password")] + param ( + [Alias('ServerInstance', 'SqlServer')] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [string[]]$Login, + [Alias("Password")] + [object]$SecurePassword, #object so that it can accept credential or securestring + [Alias("DefaultDB")] + [string]$DefaultDatabase, + [switch]$Unlock, + [switch]$MustChange, + [string]$NewName, + [switch]$Disable, + [switch]$Enable, + [switch]$DenyLogin, + [switch]$GrantLogin, + [switch]$PasswordPolicyEnforced, + [ValidateSet('bulkadmin', 'dbcreator', 'diskadmin', 'processadmin', 'public', 'securityadmin', 'serveradmin', 'setupadmin', 'sysadmin')] + [string[]]$AddRole, + [ValidateSet('bulkadmin', 'dbcreator', 'diskadmin', 'processadmin', 'public', 'securityadmin', 'serveradmin', 'setupadmin', 'sysadmin')] + [string[]]$RemoveRole, + [parameter(ValueFromPipeline)] + [Microsoft.SqlServer.Management.Smo.Login[]]$InputObject, + [Alias('Silent')] + [switch]$EnableException + ) + + begin { + # Check the parameters + if ((Test-Bound -ParameterName 'SqlInstance') -and (Test-Bound -ParameterName 'Login' -Not)) { + Stop-Function -Message 'You must specify a Login when using SqlInstance' + } + + if ((Test-Bound -ParameterName 'NewName') -and $Login -eq $NewName) { + Stop-Function -Message 'Login name is the same as the value in -NewName' -Target $Login -Continue + } + + if ((Test-Bound -ParameterName 'Disable') -and (Test-Bound -ParameterName 'Enable')) { + Stop-Function -Message 'You cannot use both -Enable and -Disable together' -Target $Login -Continue + } + + if ((Test-Bound -ParameterName 'GrantLogin') -and (Test-Bound -ParameterName 'DenyLogin')) { + Stop-Function -Message 'You cannot use both -GrantLogin and -DenyLogin together' -Target $Login -Continue + } + + if (Test-bound -ParameterName 'SecurePassword') { + switch ($SecurePassword.GetType().Name) { + 'PSCredential' { $NewSecurePassword = $SecurePassword.Password } + 'SecureString' { $NewSecurePassword = $SecurePassword } + default { + Stop-Function -Message 'Password must be a PSCredential or SecureString' -Target $Login + } + } + } + } + + process { + if (Test-FunctionInterrupt) { return } + + $allLogins = @{} + foreach ($instance in $sqlinstance) { + # Try connecting to the instance + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential -MinimumVersion 9 + } catch { + Stop-Function -Message 'Failure' -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + $allLogins[$instance.ToString()] = Get-DbaLogin -SqlInstance $server + $InputObject += $allLogins[$instance.ToString()] | Where-Object { ($_.Name -eq $Login) -and ($_.IsSystemObject -eq $false) -and ($_.Name -notlike '##*') } + } + + # Loop through all the logins + foreach ($l in $InputObject) { + if ($Pscmdlet.ShouldProcess($l, "Setting Changes to Login on $($server.name)")) { + $server = $l.Parent + + # Create the notes + $notes = @() + + # Change the name + if (Test-Bound -ParameterName 'NewName') { + # Check if the new name doesn't already exist + if ($allLogins[$server.Name].Name -notcontains $NewName) { + try { + $l.Rename($NewName) + } catch { + $notes += "Couldn't rename login" + Stop-Function -Message "Something went wrong changing the name for $l" -Target $l -ErrorRecord $_ -Continue + } + } else { + $notes += 'New login name already exists' + Write-Message -Message "New login name $NewName already exists on $instance" -Level Verbose + } + } + + # Change the password + if (Test-bound -ParameterName 'SecurePassword') { + try { + $l.ChangePassword($NewSecurePassword, $Unlock, $MustChange) + $passwordChanged = $true + } catch { + $notes += "Couldn't change password" + $passwordChanged = $false + Stop-Function -Message "Something went wrong changing the password for $l" -Target $l -ErrorRecord $_ -Continue + } + } + + # Disable the login + if (Test-Bound -ParameterName 'Disable') { + if ($l.IsDisabled) { + Write-Message -Message "Login $l is already disabled" -Level Verbose + } else { + try { + $l.Disable() + } catch { + $notes += "Couldn't disable login" + Stop-Function -Message "Something went wrong disabling $l" -Target $l -ErrorRecord $_ -Continue + } + } + } + + # Enable the login + if (Test-Bound -ParameterName 'Enable') { + if (-not $l.IsDisabled) { + Write-Message -Message "Login $l is already enabled" -Level Verbose + } else { + try { + $l.Enable() + } catch { + $notes += "Couldn't enable login" + Stop-Function -Message "Something went wrong enabling $l" -Target $l -ErrorRecord $_ -Continue + } + } + } + + # Deny access + if (Test-Bound -ParameterName 'DenyLogin') { + if ($l.DenyWindowsLogin) { + Write-Message -Message "Login $l already has login access denied" -Level Verbose + } else { + $l.DenyWindowsLogin = $true + } + } + + # Grant access + if (Test-Bound -ParameterName 'GrantLogin') { + if (-not $l.DenyWindowsLogin) { + Write-Message -Message "Login $l already has login access granted" -Level Verbose + } else { + $l.DenyWindowsLogin = $false + } + } + + # Enforce password policy + if (Test-Bound -ParameterName 'PasswordPolicyEnforced') { + if ($l.PasswordPolicyEnforced -eq $PasswordPolicyEnforced) { + Write-Message -Message "Login $l password policy is already set to $($l.PasswordPolicyEnforced)" -Level Verbose + } else { + $l.PasswordPolicyEnforced = $PasswordPolicyEnforced + } + } + + # Add server roles to login + if ($AddRole) { + # Loop through each of the roles + foreach ($role in $AddRole) { + try { + $l.AddToRole($role) + } catch { + $notes += "Couldn't add role $role" + Stop-Function -Message "Something went wrong adding role $role to $l" -Target $l -ErrorRecord $_ -Continue + } + } + } + + # Remove server roles from login + if ($RemoveRole) { + # Loop through each of the roles + foreach ($role in $RemoveRole) { + try { + $server.Roles[$role].DropMember($l.Name) + } catch { + $notes += "Couldn't remove role $role" + Stop-Function -Message "Something went wrong removing role $role to $l" -Target $l -ErrorRecord $_ -Continue + } + } + } + + # Set the default database + if (Test-Bound -ParameterName 'DefaultDatabase') { + if ($l.DefaultDatabase -eq $DefaultDatabase) { + Write-Message -Message "Login $l default database is already set to $($l.DefaultDatabase)" -Level Verbose + } else { + $l.DefaultDatabase = $DefaultDatabase + } + } + + # Alter the login to make the changes + $l.Alter() + + # Retrieve the server roles for the login + $roles = Get-DbaServerRoleMember -SqlInstance $server | Where-Object { $_.Name -eq $l.Name } + + # Check if there were any notes to include in the results + if ($notes) { + $notes = $notes | Get-Unique + $notes = $notes -Join ';' + } else { + $notes = $null + } + $rolenames = $roles.Role | Select-Object -Unique + + Add-Member -Force -InputObject $l -MemberType NoteProperty -Name ComputerName -Value $server.ComputerName + Add-Member -Force -InputObject $l -MemberType NoteProperty -Name InstanceName -Value $server.ServiceName + Add-Member -Force -InputObject $l -MemberType NoteProperty -Name SqlInstance -Value $server.DomainInstanceName + Add-Member -Force -InputObject $l -MemberType NoteProperty -Name PasswordChanged -Value $passwordChanged + Add-Member -Force -InputObject $l -MemberType NoteProperty -Name ServerRole -Value ($rolenames -join ', ') + Add-Member -Force -InputObject $l -MemberType NoteProperty -Name Notes -Value $notes + + # backwards compatibility: LoginName, DenyLogin + Add-Member -Force -InputObject $l -MemberType NoteProperty -Name LoginName -Value $l.Name + Add-Member -Force -InputObject $l -MemberType NoteProperty -Name DenyLogin -Value $l.DenyWindowsLogin + + $defaults = 'ComputerName', 'InstanceName', 'SqlInstance', 'LoginName', 'DenyLogin', 'IsDisabled', 'IsLocked', + 'PasswordPolicyEnforced', 'MustChangePassword', 'PasswordChanged', 'ServerRole', 'Notes' + + Select-DefaultView -InputObject $l -Property $defaults + } + } + } +} +function Set-DbaMaxDop { + <# + .SYNOPSIS + Sets SQL Server maximum degree of parallelism (Max DOP), then displays information relating to SQL Server Max DOP configuration settings. Works on SQL Server 2005 and higher. + + .DESCRIPTION + Uses the Test-DbaMaxDop command to get the recommended value if -MaxDop parameter is not specified. + + These are just general recommendations for SQL Server and are a good starting point for setting the "max degree of parallelism" option. + + You can set MaxDop database scoped configurations if the server is version 2016 or higher + + .PARAMETER SqlInstance + The target SQL Server instance or instances. Defaults to localhost. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Database + Specifies one or more databases to process. Options for this list are auto-populated from the server. If unspecified, all databases will be processed. + + .PARAMETER ExcludeDatabase + Specifies one or more databases to exclude from processing. Options for this list are auto-populated from the server + + .PARAMETER MaxDop + Specifies the Max DOP value to set. + + .PARAMETER AllDatabases + If this switch is enabled, Max DOP will be set on all databases. This switch is only useful on SQL Server 2016 and higher. + + .PARAMETER InputObject + If Test-SqlMaxDop has been executed prior to this function, the results may be passed in via this parameter. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .PARAMETER WhatIf + Shows what would happen if the cmdlet runs. The cmdlet is not run. + + .PARAMETER Confirm + Prompts you for confirmation before running the cmdlet. + + .NOTES + Tags: MaxDop, SpConfigure + Author: Claudio Silva (@claudioessilva) + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Set-DbaMaxDop + + .EXAMPLE + PS C:\> Set-DbaMaxDop -SqlInstance sql2008, sql2012 + + Sets Max DOP to the recommended value for servers sql2008 and sql2012. + + .EXAMPLE + PS C:\> Set-DbaMaxDop -SqlInstance sql2014 -MaxDop 4 + + Sets Max DOP to 4 for server sql2014. + + .EXAMPLE + PS C:\> Test-DbaMaxDop -SqlInstance sql2008 | Set-DbaMaxDop + + Gets the recommended Max DOP from Test-DbaMaxDop and applies it to to sql2008. + + .EXAMPLE + PS C:\> Set-DbaMaxDop -SqlInstance sql2016 -Database db1 + + Set recommended Max DOP for database db1 on server sql2016. + + .EXAMPLE + PS C:\> Set-DbaMaxDop -SqlInstance sql2016 -AllDatabases + + Set recommended Max DOP for all databases on server sql2016. + + #> + [CmdletBinding(SupportsShouldProcess)] + param ( + [parameter(Position = 0, Mandatory, ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [Alias("Credential")] + [PSCredential]$SqlCredential, + [Alias("Databases")] + [object[]]$Database, + [object[]]$ExcludeDatabase, + [int]$MaxDop = -1, + [Parameter(ValueFromPipeline)] + [pscustomobject]$InputObject, + [Alias("All")] + [switch]$AllDatabases, + [switch]$EnableException + ) + + process { + if ((Test-Bound -Parameter Database) -and (Test-Bound -Parameter AllDatabases) -and (Test-Bound -Parameter ExcludeDatabase)) { + Stop-Function -Category InvalidArgument -Message "-Database, -AllDatabases and -ExcludeDatabase are mutually exclusive. Please choose only one. Quitting." + return + } + + $dbscopedconfiguration = $false + + if ($MaxDop -eq -1) { + $UseRecommended = $true + } + + if ((Test-Bound -Not -Parameter InputObject)) { + $InputObject = Test-DbaMaxDop -SqlInstance $sqlinstance -SqlCredential $SqlCredential -Verbose:$false + } elseif ($null -eq $InputObject.SqlInstance) { + $InputObject = Test-DbaMaxDop -SqlInstance $sqlinstance -SqlCredential $SqlCredential -Verbose:$false + } + + $InputObject | Add-Member -Force -NotePropertyName PreviousInstanceMaxDopValue -NotePropertyValue 0 + $InputObject | Add-Member -Force -NotePropertyName PreviousDatabaseMaxDopValue -NotePropertyValue 0 + + #If we have servers 2016 or higher we will have a row per database plus the instance level, getting unique we only run one time per instance + $servers = $InputObject | Select-Object SqlInstance -Unique + + foreach ($server in $servers) { + $servername = $server.SqlInstance + + try { + $server = Connect-SqlInstance -SqlInstance $servername -SqlCredential $SqlCredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $servername -Continue + } + + if (!(Test-SqlSa -SqlInstance $server -SqlCredential $SqlCredential)) { + Stop-Function -Message "Not a sysadmin on $server. Skipping." -Category PermissionDenied -ErrorRecord $_ -Target $currentServer -Continue + } + + if ($server.versionMajor -ge 13) { + Write-Message -Level Verbose -Message "Server '$servername' supports Max DOP configuration per database." + + if ((Test-Bound -Not -Parameter Database) -and (Test-Bound -Not -Parameter ExcludeDatabase)) { + #Set at instance level + $InputObject = $InputObject | Where-Object { $_.DatabaseMaxDop -eq "N/A" } + } else { + $dbscopedconfiguration = $true + + if ((Test-Bound -Not -Parameter AllDatabases) -and (Test-Bound -Parameter Database)) { + $InputObject = $InputObject | Where-Object { $_.Database -in $Database } + } elseif ((Test-Bound -Not -Parameter AllDatabases) -and (Test-Bound -Parameter ExcludeDatabase)) { + $InputObject = $InputObject | Where-Object { $_.Database -notin $ExcludeDatabase } + } else { + if (Test-Bound -Parameter AllDatabases) { + $InputObject = $InputObject | Where-Object { $_.DatabaseMaxDop -ne "N/A" } + } else { + $InputObject = $InputObject | Where-Object { $_.DatabaseMaxDop -eq "N/A" } + $dbscopedconfiguration = $false + } + } + } + } else { + if ((Test-Bound -Parameter database) -or (Test-Bound -Parameter AllDatabases)) { + Write-Message -Level Warning -Message "Server '$servername' (v$($server.versionMajor)) does not support Max DOP configuration at the database level. Remember that this option is only available from SQL Server 2016 (v13). Run the command again without using database related parameters. Skipping." + Continue + } + } + + foreach ($row in $InputObject | Where-Object { $_.SqlInstance -eq $servername }) { + if ($UseRecommended -and ($row.RecommendedMaxDop -eq $row.CurrentInstanceMaxDop) -and !($dbscopedconfiguration)) { + Write-Message -Level Verbose -Message "$servername is configured properly. No change required." + Continue + } + + if ($UseRecommended -and ($row.RecommendedMaxDop -eq $row.DatabaseMaxDop) -and $dbscopedconfiguration) { + Write-Message -Level Verbose -Message "Database $($row.Database) on $servername is configured properly. No change required." + Continue + } + + $row.PreviousInstanceMaxDopValue = $row.CurrentInstanceMaxDop + + try { + if ($UseRecommended) { + if ($dbscopedconfiguration) { + $row.PreviousDatabaseMaxDopValue = $row.DatabaseMaxDop + + if ($resetDatabases) { + Write-Message -Level Verbose -Message "Changing $($row.Database) database max DOP to $($row.DatabaseMaxDop)." + $server.Databases["$($row.Database)"].MaxDop = $row.DatabaseMaxDop + } else { + Write-Message -Level Verbose -Message "Changing $($row.Database) database max DOP from $($row.DatabaseMaxDop) to $($row.RecommendedMaxDop)." + $server.Databases["$($row.Database)"].MaxDop = $row.RecommendedMaxDop + $row.DatabaseMaxDop = $row.RecommendedMaxDop + } + + } else { + Write-Message -Level Verbose -Message "Changing $server SQL Server max DOP from $($row.CurrentInstanceMaxDop) to $($row.RecommendedMaxDop)." + $server.Configuration.MaxDegreeOfParallelism.ConfigValue = $row.RecommendedMaxDop + $row.CurrentInstanceMaxDop = $row.RecommendedMaxDop + } + } else { + if ($dbscopedconfiguration) { + $row.PreviousDatabaseMaxDopValue = $row.DatabaseMaxDop + + Write-Message -Level Verbose -Message "Changing $($row.Database) database max DOP from $($row.DatabaseMaxDop) to $MaxDop." + $server.Databases["$($row.Database)"].MaxDop = $MaxDop + $row.DatabaseMaxDop = $MaxDop + } else { + Write-Message -Level Verbose -Message "Changing $servername SQL Server max DOP from $($row.CurrentInstanceMaxDop) to $MaxDop." + $server.Configuration.MaxDegreeOfParallelism.ConfigValue = $MaxDop + $row.CurrentInstanceMaxDop = $MaxDop + } + } + + if ($dbscopedconfiguration) { + if ($Pscmdlet.ShouldProcess($row.Database, "Setting max dop on database")) { + $server.Databases["$($row.Database)"].Alter() + } + } else { + if ($Pscmdlet.ShouldProcess($servername, "Setting max dop on instance")) { + $server.Configuration.Alter() + } + } + + $results = [pscustomobject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + InstanceVersion = $row.InstanceVersion + Database = $row.Database + DatabaseMaxDop = $row.DatabaseMaxDop + CurrentInstanceMaxDop = $row.CurrentInstanceMaxDop + RecommendedMaxDop = $row.RecommendedMaxDop + PreviousDatabaseMaxDopValue = $row.PreviousDatabaseMaxDopValue + PreviousInstanceMaxDopValue = $row.PreviousInstanceMaxDopValue + } + + if ($dbscopedconfiguration) { + Select-DefaultView -InputObject $results -Property InstanceName, Database, PreviousDatabaseMaxDopValue, @{ + name = "CurrentDatabaseMaxDopValue"; expression = { + $_.DatabaseMaxDop + } + } + } else { + Select-DefaultView -InputObject $results -Property InstanceName, PreviousInstanceMaxDopValue, CurrentInstanceMaxDop + } + } catch { + Stop-Function -Message "Could not modify Max Degree of Parallelism for $server." -ErrorRecord $_ -Target $server -Continue + } + } + } + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function Set-DbaMaxMemory { + <# + .SYNOPSIS + Sets SQL Server 'Max Server Memory' configuration setting to a new value then displays information this setting. + + .DESCRIPTION + Sets SQL Server max memory then displays information relating to SQL Server Max Memory configuration settings. + + Inspired by Jonathan Kehayias's post about SQL Server Max memory (http://bit.ly/sqlmemcalc), this uses a formula to + determine the default optimum RAM to use, then sets the SQL max value to that number. + + Jonathan notes that the formula used provides a *general recommendation* that doesn't account for everything that may + be going on in your specific environment. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Max + Specifies the max megabytes (MB) + + .PARAMETER InputObject + A InputObject returned by Test-DbaMaxMemory + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .PARAMETER WhatIf + Shows what would happen if the cmdlet runs. The cmdlet is not run. + + .PARAMETER Confirm + Prompts you for confirmation before running the cmdlet. + + .NOTES + Tags: MaxMemory, Memory + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Set-DbaMaxMemory + + .EXAMPLE + PS C:\> Set-DbaMaxMemory sqlserver1 + + Set max memory to the recommended on just one server named "sqlserver1" + + .EXAMPLE + PS C:\> Set-DbaMaxMemory -SqlInstance sqlserver1 -Max 2048 + + Explicitly set max memory to 2048 on just one server, "sqlserver1" + + .EXAMPLE + PS C:\> Get-DbaCmsRegServer -SqlInstance sqlserver | Test-DbaMaxMemory | Where-Object { $_.MaxValue -gt $_.Total } | Set-DbaMaxMemory + + Find all servers in SQL Server Central Management Server that have Max SQL memory set to higher than the total memory + of the server (think 2147483647), then pipe those to Set-DbaMaxMemory and use the default recommendation. + + #> + [CmdletBinding(SupportsShouldProcess, ConfirmImpact = 'Medium')] + param ( + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [int]$Max, + [Parameter(ValueFromPipeline)] + [PSCustomObject[]]$InputObject, + [switch]$EnableException + ) + begin { + if ($Max -eq 0) { + $UseRecommended = $true + } + } + process { + if ($SqlInstance) { + $InputObject += Test-DbaMaxMemory -SqlInstance $SqlInstance -SqlCredential $SqlCredential + } + + foreach ($result in $InputObject) { + $server = $result.Server + Add-Member -Force -InputObject $result -NotePropertyName PreviousMaxValue -NotePropertyValue $result.MaxValue + + try { + if ($UseRecommended) { + Write-Message -Level Verbose -Message "Change $server SQL Server Max Memory from $($result.MaxValue) to $($result.RecommendedValue) " + + if ($result.RecommendedValue -eq 0 -or $null -eq $result.RecommendedValue) { + $maxMem = $result.RecommendedValue + Write-Message -Level VeryVerbose -Message "Max memory recommended: $maxMem" + $server.Configuration.MaxServerMemory.ConfigValue = $maxMem + } else { + $server.Configuration.MaxServerMemory.ConfigValue = $result.RecommendedValue + } + } else { + Write-Message -Level Verbose -Message "Change $server SQL Server Max Memory from $($result.MaxValue) to $Max " + $server.Configuration.MaxServerMemory.ConfigValue = $Max + } + + if ($PSCmdlet.ShouldProcess($server.Name, "Change Max Memory from $($result.PreviousMaxValue) to $($server.Configuration.MaxServerMemory.ConfigValue)")) { + try { + $server.Configuration.Alter() + $result.MaxValue = $server.Configuration.MaxServerMemory.ConfigValue + } catch { + Stop-Function -Message "Failed to apply configuration change for $server" -ErrorRecord $_ -Target $server -Continue + } + } + } catch { + Stop-Function -Message "Could not modify Max Server Memory for $server" -ErrorRecord $_ -Target $server -Continue + } + + Add-Member -InputObject $result -Force -MemberType NoteProperty -Name MaxValue -Value $result.MaxValue + Select-DefaultView -InputObject $result -Property ComputerName, InstanceName, SqlInstance, Total, MaxValue, PreviousMaxValue + } + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function Set-DbaNetworkCertificate { + <# + .SYNOPSIS + Sets the network certificate for SQL Server instance + + .DESCRIPTION + Sets the network certificate for SQL Server instance. This setting is found in Configuration Manager. + + This command also grants read permissions for the service account on the certificate's private key. + + References: + http://sqlmag.com/sql-server/7-steps-ssl-encryption + https://azurebi.jppp.org/2016/01/23/using-lets-encrypt-certificates-for-secure-sql-server-connections/ + https://blogs.msdn.microsoft.com/sqlserverfaq/2016/09/26/creating-and-registering-ssl-certificates/ + + .PARAMETER SqlInstance + The target SQL Server instance or instances. Defaults to localhost. + + .PARAMETER Credential + Allows you to login to the computer (not sql instance) using alternative credentials. + + .PARAMETER Certificate + The target certificate object + + .PARAMETER Thumbprint + The thumbprint of the target certificate + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .PARAMETER WhatIf + Shows what would happen if the command were to run. No actions are actually performed. + + .PARAMETER Confirm + Prompts you for confirmation before executing any changing operations within the command. + + .NOTES + Tags: Certificate + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Set-DbaNetworkCertificate + + .EXAMPLE + PS C:\> New-DbaComputerCertificate | Set-DbaNetworkCertificate -SqlInstance localhost\SQL2008R2SP2 + + Creates and imports a new certificate signed by an Active Directory CA on localhost then sets the network certificate for the SQL2008R2SP2 to that newly created certificate. + + .EXAMPLE + PS C:\> Set-DbaNetworkCertificate -SqlInstance sql1\SQL2008R2SP2 -Thumbprint 1223FB1ACBCA44D3EE9640F81B6BA14A92F3D6E2 + + Sets the network certificate for the SQL2008R2SP2 instance to the certificate with the thumbprint of 1223FB1ACBCA44D3EE9640F81B6BA14A92F3D6E2 in LocalMachine\My on sql1 + + #> + [CmdletBinding(SupportsShouldProcess, ConfirmImpact = "Low", DefaultParameterSetName = 'Default')] + param ( + [Parameter(ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer", "ComputerName")] + [DbaInstanceParameter[]]$SqlInstance = $env:COMPUTERNAME, + [PSCredential]$Credential, + [parameter(Mandatory, ParameterSetName = "Certificate", ValueFromPipeline)] + [System.Security.Cryptography.X509Certificates.X509Certificate2]$Certificate, + [parameter(Mandatory, ParameterSetName = "Thumbprint")] + [string]$Thumbprint, + [switch]$EnableException + ) + + process { + # Registry access + + if (Test-FunctionInterrupt) { return } + + if (-not $Certificate -and -not $Thumbprint) { + Stop-Function -Message "You must specify a certificate or thumbprint" + return + } + + if (-not $Thumbprint) { + Write-Message -Level SomewhatVerbose -Message "Getting thumbprint" + $Thumbprint = $Certificate.Thumbprint + } + + foreach ($instance in $sqlinstance) { + Write-Message -Level VeryVerbose -Message "Processing $instance" -Target $instance + $null = Test-ElevationRequirement -ComputerName $instance -Continue + + Write-Message -Level Verbose -Message "Resolving hostname" + $resolved = $null + $resolved = Resolve-DbaNetworkName -ComputerName $instance -Turbo + + if ($null -eq $resolved) { + Stop-Function -Message "Can't resolve $instance" -Target $instance -Continue -Category InvalidArgument + } + + $computername = $instance.ComputerName + $instancename = $instance.instancename + + try { + $sqlwmi = Invoke-ManagedComputerCommand -ComputerName $resolved.FQDN -ScriptBlock { $wmi.Services } -Credential $Credential -ErrorAction Stop | Where-Object DisplayName -eq "SQL Server ($instancename)" + } catch { + Stop-Function -Message "Failed to access $instance" -Target $instance -Continue -ErrorRecord $_ + } + + if (-not $sqlwmi) { + Stop-Function -Message "Cannot find $instancename on $computerName" -Continue -Category ObjectNotFound -Target $instance + } + + $regroot = ($sqlwmi.AdvancedProperties | Where-Object Name -eq REGROOT).Value + $vsname = ($sqlwmi.AdvancedProperties | Where-Object Name -eq VSNAME).Value + $instancename = $sqlwmi.DisplayName.Replace('SQL Server (', '').Replace(')', '') # Don't clown, I don't know regex :( + $serviceaccount = $sqlwmi.ServiceAccount + + if ([System.String]::IsNullOrEmpty($regroot)) { + $regroot = $sqlwmi.AdvancedProperties | Where-Object { $_ -match 'REGROOT' } + $vsname = $sqlwmi.AdvancedProperties | Where-Object { $_ -match 'VSNAME' } + + if (![System.String]::IsNullOrEmpty($regroot)) { + $regroot = ($regroot -Split 'Value\=')[1] + $vsname = ($vsname -Split 'Value\=')[1] + } else { + Stop-Function -Message "Can't find instance $vsname on $instance" -Continue -Category ObjectNotFound -Target $instance + } + } + + if ([System.String]::IsNullOrEmpty($vsname)) { $vsname = $instance } + + Write-Message -Level Output -Message "Regroot: $regroot" -Target $instance + Write-Message -Level Output -Message "ServiceAcct: $serviceaccount" -Target $instance + Write-Message -Level Output -Message "InstanceName: $instancename" -Target $instance + Write-Message -Level Output -Message "VSNAME: $vsname" -Target $instance + + $scriptblock = { + $regroot = $args[0] + $serviceaccount = $args[1] + $instancename = $args[2] + $vsname = $args[3] + $Thumbprint = $args[4] + + $regpath = "Registry::HKEY_LOCAL_MACHINE\$regroot\MSSQLServer\SuperSocketNetLib" + + $oldthumbprint = (Get-ItemProperty -Path $regpath -Name Certificate).Certificate + + $cert = Get-ChildItem Cert:\LocalMachine -Recurse -ErrorAction Stop | Where-Object { $_.Thumbprint -eq $Thumbprint } + + if ($null -eq $cert) { + <# DO NOT use Write-Message as this is inside of a script block #> + Write-Warning "Certificate does not exist on $env:COMPUTERNAME" + return + } + + $permission = $serviceaccount, "Read", "Allow" + $accessRule = New-Object -TypeName System.Security.AccessControl.FileSystemAccessRule -ArgumentList $permission + + $keyPath = $env:ProgramData + "\Microsoft\Crypto\RSA\MachineKeys\" + $keyName = $cert.PrivateKey.CspKeyContainerInfo.UniqueKeyContainerName + $keyFullPath = $keyPath + $keyName + + $acl = Get-Acl -Path $keyFullPath + $null = $acl.AddAccessRule($accessRule) + Set-Acl -Path $keyFullPath -AclObject $acl + + if ($acl) { + Set-ItemProperty -Path $regpath -Name Certificate -Value $Thumbprint.ToString().ToLower() # to make it compat with SQL config + } else { + <# DO NOT use Write-Message as this is inside of a script block #> + Write-Warning "Read-only permissions could not be granted to certificate" + return + } + + if (![System.String]::IsNullOrEmpty($oldthumbprint)) { + $notes = "Granted $serviceaccount read access to certificate private key. Replaced thumbprint: $oldthumbprint." + } else { + $notes = "Granted $serviceaccount read access to certificate private key" + } + + $newthumbprint = (Get-ItemProperty -Path $regpath -Name Certificate).Certificate + + [pscustomobject]@{ + ComputerName = $env:COMPUTERNAME + InstanceName = $instancename + SqlInstance = $vsname + ServiceAccount = $serviceaccount + CertificateThumbprint = $newthumbprint + Notes = $notes + } + } + + if ($PScmdlet.ShouldProcess("local", "Connecting to $instanceName to import new cert")) { + try { + Invoke-Command2 -Raw -ComputerName $resolved.fqdn -Credential $Credential -ArgumentList $regroot, $serviceaccount, $instancename, $vsname, $Thumbprint -ScriptBlock $scriptblock -ErrorAction Stop + } catch { + Stop-Function -Message "Failed to connect to $($resolved.fqdn) using PowerShell remoting!" -ErrorRecord $_ -Target $instance -Continue + } + } + } + } +} +function Set-DbaPowerPlan { + <# + .SYNOPSIS + Sets the SQL Server OS's Power Plan. + + .DESCRIPTION + Sets the SQL Server OS's Power Plan. Defaults to High Performance which is best practice. + + If your organization uses a custom power plan that is considered best practice, specify -CustomPowerPlan. + + References: + https://support.microsoft.com/en-us/kb/2207548 + http://www.sqlskills.com/blogs/glenn/windows-power-plan-effects-on-newer-intel-processors/ + + .PARAMETER ComputerName + The server(s) to set the Power Plan on. + + .PARAMETER Credential + Specifies a PSCredential object to use in authenticating to the server(s), instead of the current user account. + + .PARAMETER PowerPlan + Specifies the Power Plan that you wish to use. Valid options for this match the Windows default Power Plans of "Power Saver", "Balanced", and "High Performance". + + .PARAMETER CustomPowerPlan + Specifies the name of a custom Power Plan to use. + + .PARAMETER InputObject + Enables piping from Get-DbaPowerPlan + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .PARAMETER WhatIf + If this switch is enabled, no actions are performed but informational messages will be displayed that explain what would happen if the command were to run. + + .PARAMETER Confirm + If this switch is enabled, you will be prompted for confirmation before executing any operations that change state. + + .NOTES + Tags: PowerPlan, OS, Configure + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + Requires: WMI access to servers + + .LINK + https://dbatools.io/Set-DbaPowerPlan + + .EXAMPLE + PS C:\> Set-DbaPowerPlan -ComputerName sql2017 + + Sets the Power Plan to High Performance. Skips it if its already set. + + .EXAMPLE + PS C:\> 'Server1', 'Server2' | Set-DbaPowerPlan -PowerPlan Balanced + + Sets the Power Plan to Balanced for Server1 and Server2. Skips it if its already set. + + .EXAMPLE + PS C:\> $cred = Get-Credential 'Domain\User' + PS C:\> Set-DbaPowerPlan -ComputerName sql2017 -Credential $cred + + Connects using alternative Windows credential and sets the Power Plan to High Performance. Skips it if its already set. + + .EXAMPLE + PS C:\> Set-DbaPowerPlan -ComputerName sqlcluster -CustomPowerPlan 'Maximum Performance' + + Sets the Power Plan to the custom power plan called "Maximum Performance". Skips it if its already set. + + #> + [CmdletBinding(SupportsShouldProcess)] + [Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSUseOutputTypeCorrectly", "", Justification = "PSSA Rule Ignored by BOH")] + param ( + [parameter(ValueFromPipeline)] + [DbaInstance[]]$ComputerName, + [PSCredential]$Credential, + [string]$PowerPlan = 'High Performance', + [string]$CustomPowerPlan, + [parameter(ValueFromPipeline)] + [pscustomobject]$InputObject, + [switch]$EnableException + ) + + begin { + if ($CustomPowerPlan) { + $powerPlanRequested = $CustomPowerPlan + } else { + $powerPlanRequested = $PowerPlan + } + function Set-DbaPowerPlanInternal { + [CmdletBinding(SupportsShouldProcess)] + param ( + [string]$ComputerName, + [PSCredential]$Credential + ) + + if (Test-Bound -ParameterName Credential) { + $IncludeCred = $true + } + try { + Write-Message -Level Verbose -Message "Testing connection to $computer" + $computerResolved = Resolve-DbaNetworkName -ComputerName $computer -Credential $Credential + + $computerResolved = $computerResolved.FullComputerName + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $computer + return + } + + $splatDbaCmObject = @{ + ComputerName = $computerResolved + EnableException = $true + } + if ($IncludeCred) { + $splatDbaCmObject["Credential"] = $Credential + } + + try { + Write-Message -Level Verbose -Message "Getting Power Plan information from $computer." + $currentplan = Get-DbaCmObject @splatDbaCmObject -ClassName Win32_PowerPlan -Namespace "root\cimv2\power" | Where-Object IsActive -eq 'True' + $currentplan = $currentplan.ElementName + } catch { + if ($_.Exception -match "namespace") { + Stop-Function -Message "Can't get Power Plan Info for $computer. Unsupported operating system." -Continue -ErrorRecord $_ -Target $computer + } else { + Stop-Function -Message "Can't get Power Plan Info for $computer. Check logs for more details." -Continue -ErrorRecord $_ -Target $computer + } + } + + if ($null -eq $currentplan) { + # the try/catch above isn't working, so make it silent and handle it here. + Stop-Function -Message "Cannot get Power Plan for $computer." -Category ConnectionError -ErrorRecord $_ -Target $computer + return + } + + $planinfo = [PSCustomObject]@{ + ComputerName = $computer + PreviousPowerPlan = $currentplan + ActivePowerPlan = $powerPlanRequested + } + if ($Pscmdlet.ShouldProcess($powerPlanRequested, "Setting Powerplan on $computer")) { + if ($powerPlanRequested -ne $currentplan) { + if ($Pscmdlet.ShouldProcess($computer, "Changing Power Plan from $CurrentPlan to $powerPlanRequested")) { + Write-Message -Level Verbose -Message "Creating CIMSession on $computer over WSMan" + if ($IncludeCred) { + $cimSession = New-CimSession -ComputerName $computer -ErrorAction SilentlyContinue -Credential $Credential + } else { + $cimSession = New-CimSession -ComputerName $computer -ErrorAction SilentlyContinue + } + if (-not $cimSession) { + Write-Message -Level Verbose -Message "Creating CIMSession on $computer over WSMan failed. Creating CIMSession on $computer over DCom" + $sessionOption = New-CimSessionOption -Protocol DCom + if ($IncludeCred) { + $cimSession = New-CimSession -ComputerName $computer -SessionOption $sessionoption -ErrorAction SilentlyContinue -Credential $Credential + } else { + $cimSession = New-CimSession -ComputerName $computer -SessionOption $sessionoption -ErrorAction SilentlyContinue + } + } + if ($cimSession) { + Write-Message -Level Verbose -Message "Setting Power Plan to $powerPlanRequested." + + $cimInstance = Get-CimInstance -Namespace root\cimv2\power -ClassName win32_PowerPlan -Filter "ElementName = '$powerPlanRequested'" -CimSession $CIMSession + if ($cimInstance) { + $cimResult = Invoke-CimMethod -InputObject $cimInstance[0] -MethodName Activate -CimSession $cimSession + if (!$cimResult) { + Stop-Function -Message "Couldn't set the requested Power Plan '$powerPlanRequested' on $computer." -Category ConnectionError -Target $computer + return + } + } else { + Stop-Function -Message "Couldn't find the requested Power Plan '$powerPlanRequested' on $computer." -Category ConnectionError -Target $computer + return + } + } else { + Stop-Function -Message "Couldn't set Power Plan on $computer." -Category ConnectionError -ErrorRecord $_ -Target $computer + return + } + } + } else { + if ($Pscmdlet.ShouldProcess($computer, "Stating power plan is already set to $powerPlanRequested, won't change.")) { + Write-Message -Level Verbose -Message "PowerPlan on $computer is already set to $powerPlanRequested. Skipping." + } + } + + return $planInfo + } + } + } + + process { + # uses cim commands + + + if (Test-Bound -ParameterName ComputerName) { + $InputObject += Get-DbaPowerPlan -ComputerName $ComputerName -Credential $Credential + } + + foreach ($pplan in $InputObject) { + $computer = $pplan.ComputerName + $Credential = $pplan.Credential + Write-Message -Level Verbose -Message "Calling Set-DbaPowerPlanInternal for $computer" + if (Test-Bound -ParameterName Credential) { + $data = Set-DbaPowerPlanInternal -ComputerName $Computer -Credential $Credential + } else { + $data = Set-DbaPowerPlanInternal -ComputerName $Computer + } + + if ($data.Count -gt 1) { + $data.GetEnumerator() | ForEach-Object { + $_ + } + } else { + $data + } + } + } +} +function Set-DbaPrivilege { + <# + .SYNOPSIS + Adds the SQL Service account to local privileges on one or more computers. + + .DESCRIPTION + Adds the SQL Service account to local privileges 'Lock Pages in Memory', 'Instant File Initialization', 'Logon as Batch' on one or more computers. + + Requires Local Admin rights on destination computer(s). + + .PARAMETER ComputerName + The target SQL Server instance or instances. + + .PARAMETER Credential + Credential object used to connect to the computer as a different user. + + .PARAMETER Type + Use this to choose the privilege(s) to which you want to add the SQL Service account. + Accepts 'IFI', 'LPIM' and/or 'BatchLogon' for local privileges 'Instant File Initialization', 'Lock Pages in Memory' and 'Logon as Batch'. + + .PARAMETER WhatIf + If this switch is enabled, no actions are performed but informational messages will be displayed that explain what would happen if the command were to run. + + .PARAMETER Confirm + If this switch is enabled, you will be prompted for confirmation before executing any operations that change state. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Privilege + Author: Klaas Vandenberghe ( @PowerDBAKlaas ) + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Set-DbaPrivilege + + .EXAMPLE + PS C:\> Set-DbaPrivilege -ComputerName sqlserver2014a -Type LPIM,IFI + + Adds the SQL Service account(s) on computer sqlserver2014a to the local privileges 'SeManageVolumePrivilege' and 'SeLockMemoryPrivilege'. + + .EXAMPLE + PS C:\> 'sql1','sql2','sql3' | Set-DbaPrivilege -Type IFI + + Adds the SQL Service account(s) on computers sql1, sql2 and sql3 to the local privilege 'SeManageVolumePrivilege'. + + #> + [CmdletBinding(SupportsShouldProcess)] + param ( + [parameter(ValueFromPipeline)] + [Alias("cn", "host", "Server")] + [dbainstanceparameter[]]$ComputerName = $env:COMPUTERNAME, + [PSCredential]$Credential, + [Parameter(Mandatory)] + [ValidateSet('IFI', 'LPIM', 'BatchLogon')] + [string[]]$Type, + [switch][Alias('Silent')] + $EnableException + ) + + begin { + $ResolveAccountToSID = @" +function Convert-UserNameToSID ([string] `$Acc ) { +`$objUser = New-Object System.Security.Principal.NTAccount(`"`$Acc`") +`$strSID = `$objUser.Translate([System.Security.Principal.SecurityIdentifier]) +`$strSID.Value +} +"@ + $ComputerName = $ComputerName.ComputerName | Select-Object -Unique + } + process { + foreach ($computer in $ComputerName) { + if ($Pscmdlet.ShouldProcess($computer, "Setting Privilege for SQL Service Account")) { + try { + $null = Test-ElevationRequirement -ComputerName $Computer -Continue + if (Test-PSRemoting -ComputerName $Computer) { + Write-Message -Level Verbose -Message "Exporting Privileges on $Computer" + Invoke-Command2 -Raw -ComputerName $computer -Credential $Credential -ScriptBlock { + $temp = ([System.IO.Path]::GetTempPath()).TrimEnd(""); secedit /export /cfg $temp\secpolByDbatools.cfg > $NULL; + } + Write-Message -Level Verbose -Message "Getting SQL Service Accounts on $computer" + $SQLServiceAccounts = (Get-DbaService -ComputerName $computer -Type Engine).StartName + if ($SQLServiceAccounts.count -ge 1) { + Write-Message -Level Verbose -Message "Setting Privileges on $Computer" + Invoke-Command2 -Raw -ComputerName $computer -Credential $Credential -Verbose -ArgumentList $ResolveAccountToSID, $SQLServiceAccounts, $BatchLogon, $IFI, $LPIM -ScriptBlock { + [CmdletBinding()] + param ($ResolveAccountToSID, + $SQLServiceAccounts, + $BatchLogon, + $IFI, + $LPIM) + . ([ScriptBlock]::Create($ResolveAccountToSID)) + $temp = ([System.IO.Path]::GetTempPath()).TrimEnd(""); + $tempfile = "$temp\secpolByDbatools.cfg" + if ('BatchLogon' -in $Type) { + $BLline = Get-Content $tempfile | Where-Object { $_ -match "SeBatchLogonRight" } + ForEach ($acc in $SQLServiceAccounts) { + $SID = Convert-UserNameToSID -Acc $acc; + if ($BLline -notmatch $SID) { + (Get-Content $tempfile) -replace "SeBatchLogonRight = ", "SeBatchLogonRight = *$SID," | + Set-Content $tempfile + <# DO NOT use Write-Message as this is inside of a script block #> + Write-Verbose "Added $acc to Batch Logon Privileges on $env:ComputerName" + } else { + <# DO NOT use Write-Message as this is inside of a script block #> + Write-Warning "$acc already has Batch Logon Privilege on $env:ComputerName" + } + } + } + if ('IFI' -in $Type) { + $IFIline = Get-Content $tempfile | Where-Object { $_ -match "SeManageVolumePrivilege" } + ForEach ($acc in $SQLServiceAccounts) { + $SID = Convert-UserNameToSID -Acc $acc; + if ($IFIline -notmatch $SID) { + (Get-Content $tempfile) -replace "SeManageVolumePrivilege = ", "SeManageVolumePrivilege = *$SID," | + Set-Content $tempfile + <# DO NOT use Write-Message as this is inside of a script block #> + Write-Verbose "Added $acc to Instant File Initialization Privileges on $env:ComputerName" + } else { + <# DO NOT use Write-Message as this is inside of a script block #> + Write-Warning "$acc already has Instant File Initialization Privilege on $env:ComputerName" + } + } + } + if ('LPIM' -in $Type) { + $LPIMline = Get-Content $tempfile | Where-Object { $_ -match "SeLockMemoryPrivilege" } + ForEach ($acc in $SQLServiceAccounts) { + $SID = Convert-UserNameToSID -Acc $acc; + if ($LPIMline -notmatch $SID) { + (Get-Content $tempfile) -replace "SeLockMemoryPrivilege = ", "SeLockMemoryPrivilege = *$SID," | + Set-Content $tempfile + <# DO NOT use Write-Message as this is inside of a script block #> + Write-Verbose "Added $acc to Lock Pages in Memory Privileges on $env:ComputerName" + } else { + <# DO NOT use Write-Message as this is inside of a script block #> + Write-Warning "$acc already has Lock Pages in Memory Privilege on $env:ComputerName" + } + } + } + $null = secedit /configure /cfg $tempfile /db secedit.sdb /areas USER_RIGHTS /overwrite /quiet + } -ErrorAction SilentlyContinue + Write-Message -Level Verbose -Message "Removing secpol file on $computer" + Invoke-Command2 -Raw -ComputerName $computer -Credential $Credential -ScriptBlock { $temp = ([System.IO.Path]::GetTempPath()).TrimEnd(""); Remove-Item $temp\secpolByDbatools.cfg -Force > $NULL } + } else { + Write-Message -Level Warning -Message "No SQL Service Accounts found on $Computer" + } + } else { + Write-Message -Level Warning -Message "Failed to connect to $Computer" + } + } catch { + Stop-Function -Message "Failure" -ErrorRecord $_ -Target $computer -Continue + } + } + } + } +} +function Set-DbaSpConfigure { + <# + .SYNOPSIS + Changes the server level system configuration (sys.configuration/sp_configure) value for a given configuration + + .DESCRIPTION + This function changes the configured value for sp_configure settings. If the setting is dynamic this setting will be used, otherwise the user will be warned that a restart of SQL is required. + This is designed to be safe and will not allow for configurations to be set outside of the defined configuration min and max values. + While it is possible to set below the min, or above the max this can cause serious problems with SQL Server (including startup failures), and so is not permitted. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. This can be a + collection and receive pipeline input + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Name + The name of the configuration to be set -- Configs is auto-populated for tabbing convenience. + + .PARAMETER Value + The new value for the configuration + + .PARAMETER InputObject + Piped objects from Get-DbaSpConfigure + + .PARAMETER WhatIf + Shows what would happen if the command were to run. No actions are actually performed. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .PARAMETER Confirm + Prompts you for confirmation before executing any changing operations within the command. + + .NOTES + Tags: SpConfigure + Author: Nic Cain, https://sirsql.net/ + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Set-DbaSpConfigure + + .EXAMPLE + PS C:\> Set-DbaSpConfigure -SqlInstance localhost -Name ScanForStartupProcedures -Value 1 + + Adjusts the Scan for startup stored procedures configuration value to 1 and notifies the user that this requires a SQL restart to take effect + + .EXAMPLE + PS C:\> Get-DbaSpConfigure -SqlInstance sql2017, sql2014 -Name XPCmdShellEnabled, IsSqlClrEnabled | Set-DbaSpConfigure -Value $false + + Sets the values for XPCmdShellEnabled and IsSqlClrEnabled on sql2017 and sql2014 to False + + .EXAMPLE + PS C:\> Set-DbaSpConfigure -SqlInstance localhost -Name XPCmdShellEnabled -Value 1 + + Adjusts the xp_cmdshell configuration value to 1. + + .EXAMPLE + PS C:\> Set-DbaSpConfigure -SqlInstance localhost -Name XPCmdShellEnabled -Value 1 -WhatIf + + Returns information on the action that would be performed. No actual change will be made. + + #> + [CmdletBinding(SupportsShouldProcess)] + param ( + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [System.Management.Automation.PSCredential]$SqlCredential, + [Alias("NewValue", "NewConfig")] + [int]$Value, + [Alias("Config", "ConfigName")] + [string[]]$Name, + [parameter(ValueFromPipeline)] + [object[]]$InputObject, + [switch][Alias('Silent')] + $EnableException + ) + process { + foreach ($instance in $SqlInstance) { + $InputObject += Get-DbaSpConfigure -SqlInstance $SqlInstance -SqlCredential $SqlCredential -Name $Name + } + + foreach ($configobject in $InputObject) { + $server = $InputObject.Parent + $currentRunValue = $configobject.RunningValue + $currentConfigValue = $configobject.ConfiguredValue + $minValue = $configobject.MinValue + $maxValue = $configobject.MaxValue + $isDynamic = $configobject.IsDynamic + $configuration = $configobject.Name + + #Let us not waste energy setting the value to itself + if ($currentConfigValue -eq $value) { + Stop-Function -Message "Value to set is the same as the existing value. No work being performed." -Continue -Target $server -Category InvalidData + } + + #Going outside the min/max boundary can be done, but it can break SQL, so I don't think allowing that is wise at this juncture + if ($value -lt $minValue -or $value -gt $maxValue) { + Stop-Function -Message "Value out of range for $configuration ($minValue <-> $maxValue)" -Continue -Category InvalidArgument + } + + If ($Pscmdlet.ShouldProcess($SqlInstance, "Adjusting server configuration $configuration from $currentConfigValue to $value.")) { + try { + $server.Configuration.$configuration.ConfigValue = $value + $server.Configuration.Alter() + + [pscustomobject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + ConfigName = $configuration + PreviousValue = $currentConfigValue + NewValue = $value + } + + #If it's a dynamic setting we're all clear, otherwise let the user know that SQL needs to be restarted for the change to take + if ($isDynamic -eq $false) { + Write-Message -Level Warning -Message "Configuration setting $configuration has been set, but restart of SQL Server is required for the new value `"$value`" to be used (old value: `"$currentRunValue`")" -Target $Instance + } + } catch { + Stop-Function -Message "Unable to change config setting" -Target $Instance -ErrorRecord $_ -Continue -ContinueLabel main + } + } + } + } +} +#ValidationTags#FlowControl,Pipeline# +function Set-DbaSpn { + <# + .SYNOPSIS + Sets an SPN for a given service account in active directory (and also enables delegation to the same SPN by default) + + .DESCRIPTION + This function will connect to Active Directory and search for an account. If the account is found, it will attempt to add an SPN. Once the SPN is added, the function will also set delegation to that service, unless -NoDelegation is specified. In order to run this function, the credential you provide must have write access to Active Directory. + + Note: This function supports -WhatIf + + .PARAMETER SPN + The SPN you want to add + + .PARAMETER ServiceAccount + The account you want the SPN added to + + .PARAMETER Credential + The credential you want to use to connect to Active Directory to make the changes + + .PARAMETER NoDelegation + Skips setting the delegation + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .PARAMETER Confirm + Turns confirmations before changes on or off + + .PARAMETER WhatIf + Shows what would happen if the command was executed + + .NOTES + Tags: SPN + Author: Drew Furgiuele (@pittfurg), http://www.port1433.com + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Set-DbaSpn + + .EXAMPLE + PS C:\> Set-DbaSpn -SPN MSSQLSvc/SQLSERVERA.domain.something -ServiceAccount domain\account + PS C:\> Set-DbaSpn -SPN MSSQLSvc/SQLSERVERA.domain.something -ServiceAccount domain\account -EnableException + + Connects to Active Directory and adds a provided SPN to the given account. + Connects to Active Directory and adds a provided SPN to the given account, suppressing all error messages and throw exceptions that can be caught instead + + .EXAMPLE + PS C:\> Set-DbaSpn -SPN MSSQLSvc/SQLSERVERA.domain.something -ServiceAccount domain\account -Credential ad\sqldba + + Connects to Active Directory and adds a provided SPN to the given account. Uses alternative account to connect to AD. + + .EXAMPLE + PS C:\> Set-DbaSpn -SPN MSSQLSvc/SQLSERVERA.domain.something -ServiceAccount domain\account -NoDelegation + + Connects to Active Directory and adds a provided SPN to the given account, without the delegation. + + .EXAMPLE + PS C:\> Test-DbaSpn -ComputerName sql2016 | Where { $_.isSet -eq $false } | Set-DbaSpn + + Sets all missing SPNs for sql2016 + + .EXAMPLE + PS C:\> Test-DbaSpn -ComputerName sql2016 | Where { $_.isSet -eq $false } | Set-DbaSpn -WhatIf + + Displays what would happen trying to set all missing SPNs for sql2016 + + #> + [cmdletbinding(SupportsShouldProcess, DefaultParameterSetName = "Default")] + param ( + [Parameter(Mandatory, ValueFromPipelineByPropertyName)] + [Alias("RequiredSPN")] + [string]$SPN, + [Parameter(Mandatory, ValueFromPipelineByPropertyName)] + [Alias("InstanceServiceAccount", "AccountName")] + [string]$ServiceAccount, + [Parameter(ValueFromPipelineByPropertyName)] + [PSCredential]$Credential, + [switch]$NoDelegation, + [Alias('Silent')] + [switch]$EnableException + ) + + process { + #did we find the server account? + Write-Message -Message "Looking for account $ServiceAccount..." -Level Verbose + $searchfor = 'User' + if ($ServiceAccount.EndsWith('$')) { + $searchfor = 'Computer' + } + try { + $Result = Get-DbaADObject -ADObject $ServiceAccount -Type $searchfor -Credential $Credential -EnableException + } catch { + Stop-Function -Message "AD lookup failure. This may be because the domain cannot be resolved for the SQL Server service account ($ServiceAccount). $($_.Exception.Message)" -EnableException $EnableException -InnerErrorRecord $_ -Target $ServiceAccount + } + if ($Result.Count -gt 0) { + try { + $adentry = $Result.GetUnderlyingObject() + } catch { + Stop-Function -Message "The SQL Service account ($ServiceAccount) has been found, but you don't have enough permission to inspect its properties $($_.Exception.Message)" -EnableException $EnableException -InnerErrorRecord $_ -Target $ServiceAccount + } + } else { + Stop-Function -Message "The SQL Service account ($ServiceAccount) has not been found" -EnableException $EnableException -Target $ServiceAccount + } + # Cool! Add an SPN + $delegate = $true + if ($PSCmdlet.ShouldProcess("$spn", "Adding SPN to service account")) { + try { + $null = $adentry.Properties['serviceprincipalname'].Add($spn) + $status = "Successfully added SPN" + $adentry.CommitChanges() + Write-Message -Message "Added SPN $spn to $ServiceAccount" -Level Verbose + $set = $true + } catch { + Write-Message -Message "Could not add SPN. $($_.Exception.Message)" -Level Warning -EnableException $EnableException.ToBool() -ErrorRecord $_ -Target $ServiceAccount + $set = $false + $status = "Failed to add SPN" + $delegate = $false + } + + [pscustomobject]@{ + Name = $spn + ServiceAccount = $ServiceAccount + Property = "servicePrincipalName" + IsSet = $set + Notes = $status + } + } + + #if we have the SPN set, we can add the delegation + if ($delegate) { + # but only if $NoDelegation is not passed + if (!$NoDelegation) { + if ($PSCmdlet.ShouldProcess("$spn", "Adding constrained delegation to service account for SPN")) { + try { + $null = $adentry.Properties['msDS-AllowedToDelegateTo'].Add($spn) + $adentry.CommitChanges() + Write-Message -Message "Added kerberos delegation to $spn for $ServiceAccount" -Level Verbose + $set = $true + $status = "Successfully added constrained delegation" + } catch { + Write-Message -Message "Could not add delegation. $($_.Exception.Message)" -Level Warning -EnableException $EnableException.ToBool() -ErrorRecord $_ -Target $ServiceAccount + $set = $false + $status = "Failed to add constrained delegation" + } + + [pscustomobject]@{ + Name = $spn + ServiceAccount = $ServiceAccount + Property = "msDS-AllowedToDelegateTo" + IsSet = $set + Notes = $status + } + } + } else { + Write-Message -Message "Skipping delegation as instructed" -Level Verbose + } + } + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function Set-DbaStartupParameter { + <# + .SYNOPSIS + Sets the Startup Parameters for a SQL Server instance + + .DESCRIPTION + Modifies the startup parameters for a specified SQL Server Instance + + For full details of what each parameter does, please refer to this MSDN article - https://msdn.microsoft.com/en-us/library/ms190737(v=sql.105).aspx + + .PARAMETER SqlInstance + The SQL Server instance to be modified + + If the Sql Instance is offline path parameters will be ignored as we cannot test the instance's access to the path. If you want to force this to work then please use the Force switch + + .PARAMETER SqlCredential + Windows or Sql Login Credential with permission to log into the SQL instance + + .PARAMETER Credential + Windows Credential with permission to log on to the server running the SQL instance + + .PARAMETER MasterData + Path to the data file for the Master database + + Will be ignored if SqlInstance is offline or the Offline switch is set. To override this behaviour use the Force switch. This is to ensure you understand the risk as we cannot validate the path if the instance is offline + + .PARAMETER MasterLog + Path to the log file for the Master database + + Will be ignored if SqlInstance is offline or the Offline switch is set. To override this behaviour use the Force switch. This is to ensure you understand the risk as we cannot validate the path if the instance is offline + + .PARAMETER ErrorLog + Path to the SQL Server error log file + + Will be ignored if SqlInstance is offline or the Offline switch is set. To override this behaviour use the Force switch. This is to ensure you understand the risk as we cannot validate the path if the instance is offline + + .PARAMETER TraceFlags + A comma separated list of TraceFlags to be applied at SQL Server startup + By default these will be appended to any existing trace flags set + + .PARAMETER CommandPromptStart + Shortens startup time when starting SQL Server from the command prompt. Typically, the SQL Server Database Engine starts as a service by calling the Service Control Manager. + Because the SQL Server Database Engine does not start as a service when starting from the command prompt + + .PARAMETER MinimalStart + Starts an instance of SQL Server with minimal configuration. This is useful if the setting of a configuration value (for example, over-committing memory) has + prevented the server from starting. Starting SQL Server in minimal configuration mode places SQL Server in single-user mode + + .PARAMETER MemoryToReserve + Specifies an integer number of megabytes (MB) of memory that SQL Server will leave available for memory allocations within the SQL Server process, + but outside the SQL Server memory pool. The memory outside of the memory pool is the area used by SQL Server for loading items such as extended procedure .dll files, + the OLE DB providers referenced by distributed queries, and automation objects referenced in Transact-SQL statements. The default is 256 MB. + + .PARAMETER SingleUser + Start Sql Server in single user mode + + .PARAMETER NoLoggingToWinEvents + Don't use Windows Application events log + + .PARAMETER StartAsNamedInstance + Allows you to start a named instance of SQL Server + + .PARAMETER DisableMonitoring + Disables the following monitoring features: + + SQL Server performance monitor counters + Keeping CPU time and cache-hit ratio statistics + Collecting information for the DBCC SQLPERF command + Collecting information for some dynamic management views + Many extended-events event points + + ** Warning *\* When you use the -x startup option, the information that is available for you to diagnose performance and functional problems with SQL Server is greatly reduced. + + .PARAMETER SingleUserDetails + The username for single user + + .PARAMETER IncreasedExtents + Increases the number of extents that are allocated for each file in a filegroup. + + .PARAMETER TraceFlagsOverride + Overrides the default behaviour and replaces any existing trace flags. If not trace flags specified will just remove existing ones + + .PARAMETER StartUpConfig + Pass in a previously saved SQL Instance startup config + using this parameter will set TraceFlagsOverride to true, so existing Trace Flags will be overridden + + .PARAMETER Offline + Setting this switch will try perform the requested actions without connect to the SQL Server Instance, this will speed things up if you know the Instance is offline. + + When working offline, path inputs (MasterData, MasterLog and ErrorLog) will be ignored, unless Force is specified + + .PARAMETER Force + By default we test the values passed in via MasterData, MasterLog, ErrorLog + + .PARAMETER WhatIf + Shows what would happen if the command were to run. No actions are actually performed. + + .PARAMETER Confirm + Prompts you for confirmation before executing any changing operations within the command. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Startup, Parameter, Configure + Author: Stuart Moore (@napalmgram), stuart-moore.com + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .EXAMPLE + PS C:\> Set-DbaStartupParameter -SqlInstance server1\instance1 -SingleUser + + Will configure the SQL Instance server1\instance1 to startup up in Single User mode at next startup + + .EXAMPLE + PS C:\> Set-DbaStartupParameter -SqlInstance sql2016 -IncreasedExtents + + Will configure the SQL Instance sql2016 to IncreasedExtents = True (-E) + + .EXAMPLE + PS C:\> Set-DbaStartupParameter -SqlInstance sql2016 -IncreasedExtents:$false -WhatIf + + Shows what would happen if you attempted to configure the SQL Instance sql2016 to IncreasedExtents = False (no -E) + + .EXAMPLE + PS C:\> Set-DbaStartupParameter -SqlInstance server1\instance1 -SingleUser -TraceFlags 8032,8048 + + This will append Trace Flags 8032 and 8048 to the startup parameters + + .EXAMPLE + PS C:\> Set-DbaStartupParameter -SqlInstance sql2016 -SingleUser:$false -TraceFlagsOverride + + This will remove all trace flags and set SingleUser to false + + .EXAMPLE + PS C:\> Set-DbaStartupParameter -SqlInstance server1\instance1 -SingleUser -TraceFlags 8032,8048 -TraceFlagsOverride + + This will set Trace Flags 8032 and 8048 to the startup parameters, removing any existing Trace Flags + + .EXAMPLE + PS C:\> Set-DbaStartupParameter -SqlInstance sql2016 -SingleUser:$false -TraceFlagsOverride -Offline + + This will remove all trace flags and set SingleUser to false from an offline instance + + .EXAMPLE + PS C:\> Set-DbaStartupParameter -SqlInstance sql2016 -ErrorLog c:\Sql\ -Offline + + This will attempt to change the ErrorLog path to c:\sql\. However, with the offline switch this will not happen. To force it, use the -Force switch like so: + + Set-DbaStartupParameter -SqlInstance sql2016 -ErrorLog c:\Sql\ -Offline -Force + + .EXAMPLE + PS C:\> $StartupConfig = Get-DbaStartupParameter -SqlInstance server1\instance1 + PS C:\> Set-DbaStartupParameter -SqlInstance server1\instance1 -SingleUser -NoLoggingToWinEvents + PS C:\> #Restart your SQL instance with the tool of choice + PS C:\> #Do Some work + PS C:\> Set-DbaStartupParameter -SqlInstance server1\instance1 -StartUpConfig $StartUpConfig + PS C:\> #Restart your SQL instance with the tool of choice and you're back to normal + + In this example we take a copy of the existing startup configuration of server1\instance1 + + We then change the startup parameters ahead of some work + + After the work has been completed, we can push the original startup parameters back to server1\instance1 and resume normal operation + +#> + [CmdletBinding(SupportsShouldProcess, ConfirmImpact = "High")] + param ([parameter(Mandatory)] + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter]$SqlInstance, + [PSCredential]$SqlCredential, + [PSCredential]$Credential, + [string]$MasterData, + [string]$MasterLog, + [string]$ErrorLog, + [string[]]$TraceFlags, + [switch]$CommandPromptStart, + [switch]$MinimalStart, + [int]$MemoryToReserve, + [switch]$SingleUser, + [string]$SingleUserDetails, + [switch]$NoLoggingToWinEvents, + [switch]$StartAsNamedInstance, + [switch]$DisableMonitoring, + [switch]$IncreasedExtents, + [switch]$TraceFlagsOverride, + [object]$StartUpConfig, + [switch]$Offline, + [switch]$Force, + [Alias('Silent')] + [switch]$EnableException + ) + process { + + if (-not $Offline) { + try { + $server = Connect-SqlInstance -SqlInstance $SqlInstance -SqlCredential $SqlCredential + } catch { + Write-Message -Level Warning -Message "Failed to connect to $SqlInstance, will try to work with just WMI. Path options will be ignored unless Force was indicated" + $Server = $SqlInstance + $Offline = $true + } + } else { + Write-Message -Level Verbose -Message "Offline switch set, proceeding with just WMI" + $Server = $SqlInstance + } + + #Get Current parameters: + $currentstartup = Get-DbaStartupParameter -SqlInstance $SqlInstance -Credential $Credential + $originalparamstring = $currentstartup.ParameterString + + Write-Message -Level Verbose -Message "Original startup parameter string: $originalparamstring" + + if ('startUpconfig' -in $PsBoundParameters.keys) { + Write-Message -Level VeryVerbose -Message "StartupObject passed in" + $newstartup = $StartUpConfig + $TraceFlagsOverride = $true + } else { + Write-Message -Level VeryVerbose -Message "Parameters passed in" + $newstartup = $currentstartup.PSObject.copy() + foreach ($param in ($PsBoundParameters.keys | Where-Object { $_ -in ($newstartup.PSObject.Properties.name) })) { + if ($PsBoundParameters.item($param) -ne $newstartup.$param) { + $newstartup.$param = $PsBoundParameters.item($param) + } + } + } + + if (!($currentstartup.SingleUser)) { + + if ($newstartup.Masterdata.length -gt 0) { + if ($Offline -and -not $Force) { + Write-Message -Level Warning -Message "Working offline, skipping untested MasterData path" + $ParameterString += "-d$($CurrentStartup.MasterData);" + + } else { + if ($Force) { + $ParameterString += "-d$($newstartup.MasterData);" + } elseif (Test-DbaPath -SqlInstance $server -SqlCredential $SqlCredential -Path (Split-Path $newstartup.MasterData -Parent)) { + $ParameterString += "-d$($newstartup.MasterData);" + } else { + Stop-Function -Message "Specified folder for Master Data file is not reachable by instance $SqlInstance" + return + } + } + } else { + Stop-Function -Message "MasterData value must be provided" + return + } + + if ($newstartup.ErrorLog.length -gt 0) { + if ($Offline -and -not $Force) { + Write-Message -Level Warning -Message "Working offline, skipping untested ErrorLog path" + $ParameterString += "-e$($CurrentStartup.ErrorLog);" + } else { + if ($Force) { + $ParameterString += "-e$($newstartup.ErrorLog);" + } elseif (Test-DbaPath -SqlInstance $server -SqlCredential $SqlCredential -Path (Split-Path $newstartup.ErrorLog -Parent)) { + $ParameterString += "-e$($newstartup.ErrorLog);" + } else { + Stop-Function -Message "Specified folder for ErrorLog file is not reachable by $SqlInstance" + return + } + } + } else { + Stop-Function -Message "ErrorLog value must be provided" + return + } + + if ($newstartup.MasterLog.Length -gt 0) { + if ($offline -and -not $Force) { + Write-Message -Level Warning -Message "Working offline, skipping untested MasterLog path" + $ParameterString += "-l$($CurrentStartup.MasterLog);" + } else { + if ($Force) { + $ParameterString += "-l$($newstartup.MasterLog);" + } elseif (Test-DbaPath -SqlInstance $server -SqlCredential $SqlCredential -Path (Split-Path $newstartup.MasterLog -Parent)) { + $ParameterString += "-l$($newstartup.MasterLog);" + } else { + Stop-Function -Message "Specified folder for Master Log file is not reachable by $SqlInstance" + return + } + } + } else { + Stop-Function -Message "MasterLog value must be provided." + return + } + } else { + + Write-Message -Level Verbose -Message "Sql instance is presently configured for single user, skipping path validation" + if ($newstartup.MasterData.Length -gt 0) { + $ParameterString += "-d$($newstartup.MasterData);" + } else { + Stop-Function -Message "Must have a value for MasterData" + return + } + if ($newstartup.ErrorLog.Length -gt 0) { + $ParameterString += "-e$($newstartup.ErrorLog);" + } else { + Stop-Function -Message "Must have a value for Errorlog" + return + } + if ($newstartup.MasterLog.Length -gt 0) { + $ParameterString += "-l$($newstartup.MasterLog);" + } else { + Stop-Function -Message "Must have a value for MsterLog" + return + } + } + + if ($newstartup.CommandPromptStart) { + $ParameterString += "-c;" + } + if ($newstartup.MinimalStart) { + $ParameterString += "-f;" + } + if ($newstartup.MemoryToReserve -notin ($null, 0)) { + $ParameterString += "-g$($newstartup.MemoryToReserve)" + } + if ($newstartup.SingleUser) { + if ($SingleUserDetails.length -gt 0) { + if ($SingleUserDetails -match ' ') { + $SingleUserDetails = """$SingleUserDetails""" + } + $ParameterString += "-m$SingleUserDetails;" + } else { + $ParameterString += "-m;" + } + } + if ($newstartup.NoLoggingToWinEvents) { + $ParameterString += "-n;" + } + If ($newstartup.StartAsNamedInstance) { + $ParameterString += "-s;" + } + if ($newstartup.DisableMonitoring) { + $ParameterString += "-x;" + } + if ($newstartup.IncreasedExtents) { + $ParameterString += "-E;" + } + if ($newstartup.TraceFlags -eq 'None') { + $newstartup.TraceFlags = '' + } + if ($TraceFlagsOverride -and 'TraceFlags' -in $PsBoundParameters.keys) { + if ($null -ne $TraceFlags -and '' -ne $TraceFlags) { + $newstartup.TraceFlags = $TraceFlags -join ',' + $ParameterString += (($TraceFlags.split(',') | ForEach-Object { "-T$_" }) -join ';') + ";" + } + } else { + if ('TraceFlags' -in $PsBoundParameters.keys) { + if ($null -eq $TraceFlags) { $TraceFlags = '' } + $oldflags = @($currentstartup.TraceFlags) -split ',' | Where-Object { $_ -ne 'None' } + $newflags = $TraceFlags + $newstartup.TraceFlags = (@($oldFlags) + @($newflags) | Sort-Object -Unique) -join ',' + } elseif ($TraceFlagsOverride) { + $newstartup.TraceFlags = '' + } else { + $newstartup.TraceFlags = if ($currentstartup.TraceFlags -eq 'None') { } + else { $currentstartup.TraceFlags -join ',' } + } + If ($newstartup.TraceFlags.Length -ne 0) { + $ParameterString += (($newstartup.TraceFlags.split(',') | ForEach-Object { "-T$_" }) -join ';') + ";" + } + } + + $instance = $SqlInstance.ComputerName + $instancename = $SqlInstance.InstanceName + + if ($instancename.Length -eq 0) { $instancename = "MSSQLSERVER" } + + $displayname = "SQL Server ($instancename)" + + $Scriptblock = { + #Variable marked as unused by PSScriptAnalyzer + #$instance = $args[0] + $displayname = $args[1] + $ParameterString = $args[2] + + $wmisvc = $wmi.Services | Where-Object { $_.DisplayName -eq $displayname } + $wmisvc.StartupParameters = $ParameterString + $wmisvc.Alter() + $wmisvc.Refresh() + if ($wmisvc.StartupParameters -eq $ParameterString) { + $true + } else { + $false + } + } + + if ($pscmdlet.ShouldProcess("Setting Sql Server start parameters on $SqlInstance to $ParameterString")) { + try { + if ($Credential) { + #Variable $response marked as unused by PSScriptAnalyzer replace with $null to catch output + $null = Invoke-ManagedComputerCommand -ComputerName $server.ComputerName -Credential $Credential -ScriptBlock $Scriptblock -ArgumentList $server.ComputerName, $displayname, $ParameterString -EnableException + $output = Get-DbaStartupParameter -SqlInstance $server.ComputerName -Credential $Credential -EnableException + Add-Member -Force -InputObject $output -MemberType NoteProperty -Name OriginalStartupParameters -Value $originalparamstring + } else { + #Variable $response marked as unused by PSScriptAnalyzer replace with $null to catch output + $null = Invoke-ManagedComputerCommand -ComputerName $server.ComputerName -ScriptBlock $Scriptblock -ArgumentList $server.ComputerName, $displayname, $ParameterString -EnableException + $output = Get-DbaStartupParameter -SqlInstance $server.ComputerName -EnableException + Add-Member -Force -InputObject $output -MemberType NoteProperty -Name OriginalStartupParameters -Value $originalparamstring + Add-Member -Force -InputObject $output -MemberType NoteProperty -Name Notes -Value "Startup parameters changed on $SqlInstance. You must restart SQL Server for changes to take effect." + } + + $output + } catch { + Stop-Function -Message "Startup parameters failed to change on $SqlInstance. " -Target $SqlInstance -ErrorRecord $_ + return + } + } + } +} +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function Set-DbaTcpPort { + <# + .SYNOPSIS + Changes the TCP port used by the specified SQL Server. + + .DESCRIPTION + This function changes the TCP port used by the specified SQL Server. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. + + .PARAMETER SqlCredential + Credential object used to connect to the SQL Server instance as a different user + + .PARAMETER Credential + Credential object used to connect to the Windows server itself as a different user (like SQL Configuration Manager) + + .PARAMETER Port + TCPPort that SQLService should listen on. + + .PARAMETER IpAddress + Which IpAddress should the portchange , if omitted allip (0.0.0.0) will be changed with the new port number. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .PARAMETER WhatIf + Shows what would happen if the command were to run. No actions are actually performed. + + .PARAMETER Confirm + Prompts you for confirmation before executing any changing operations within the command. + + .NOTES + Tags: Service, Port, TCP, Configure + Author: @H0s0n77 + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Set-DbaTcpPort + + .EXAMPLE + PS C:\> Set-DbaTcpPort -SqlInstance sql2017 -Port 1433 + + Sets the port number 1433 for all IP Addresses on the default instance on sql2017. Prompts for confirmation. + + .EXAMPLE + PS C:\> Set-DbaTcpPort -SqlInstance winserver\sqlexpress -IpAddress 192.168.1.22 -Port 1433 -Confirm:$false + + Sets the port number 1433 for IP 192.168.1.22 on the sqlexpress instance on winserver. Does not prompt for confirmation. + + .EXAMPLE + PS C:\> Set-DbaTcpPort -SqlInstance sql2017, sql2019 -port 1337 -Credential ad\dba + + Sets the port number 1337 for all IP Addresses on SqlInstance sql2017 and sql2019 using the credentials for ad\dba. Prompts for confirmation. + + #> + [CmdletBinding(SupportsShouldProcess, ConfirmImpact = "High")] + param ( + [parameter(Mandatory, ValueFromPipeline)] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$Credential, + [parameter(Mandatory)] + [ValidateRange(1, 65535)] + [int]$Port, + [IpAddress[]]$IpAddress, + [switch]$EnableException + ) + + begin { + if (-not $IpAddress) { + $IpAddress = '0.0.0.0' + } else { + if ($SqlInstance.Count -gt 1) { + Stop-Function -Message "-IpAddress switch cannot be used with a collection of serveraddresses" -Target $SqlInstance + return + } + } + $scriptblock = { + $computername = $args[0] + $wmiinstancename = $args[1] + $port = $args[2] + $IpAddress = $args[3] + $sqlinstanceName = $args[4] + + $wmi = New-Object Microsoft.SqlServer.Management.Smo.Wmi.ManagedComputer $computername + $wmiinstance = $wmi.ServerInstances | Where-Object { + $_.Name -eq $wmiinstancename + } + $tcp = $wmiinstance.ServerProtocols | Where-Object { + $_.DisplayName -eq 'TCP/IP' + } + $IpAddress = $tcp.IpAddresses | where-object { + $_.IpAddress -eq $IpAddress + } + $tcpport = $IpAddress.IpAddressProperties | Where-Object { + $_.Name -eq 'TcpPort' + } + + $oldport = $tcpport.Value + try { + $tcpport.value = $port + $tcp.Alter() + [pscustomobject]@{ + ComputerName = $computername + InstanceName = $wmiinstancename + SqlInstance = $sqlinstanceName + PreviousPortNumber = $oldport + PortNumber = $Port + Status = "Success" + } + } catch { + [pscustomobject]@{ + ComputerName = $computername + InstanceName = $wmiinstancename + SqlInstance = $sqlinstanceName + PreviousPortNumber = $oldport + PortNumber = $Port + Status = "Failed: $_" + } + } + } + } + process { + if (Test-FunctionInterrupt) { + return + } + + foreach ($instance in $SqlInstance) { + $wmiinstancename = $instance.InstanceName + $computerName = $instance.ComputerName + + if ($Pscmdlet.ShouldProcess($computerName, "Setting port to $Port for $wmiinstancename")) { + try { + $computerName = $instance.ComputerName + $resolved = Resolve-DbaNetworkName -ComputerName $computerName + Invoke-ManagedComputerCommand -ComputerName $resolved.FullComputerName -ScriptBlock $scriptblock -ArgumentList $instance.ComputerName, $wmiinstancename, $port, $IpAddress, $instance.InputObject -Credential $Credential + } catch { + try { + Invoke-ManagedComputerCommand -ComputerName $instance.ComputerName -ScriptBlock $scriptblock -ArgumentList $instance.ComputerName, $wmiinstancename, $port, $IpAddress, $instance.InputObject -Credential $Credential + } catch { + Stop-Function -Message "Failure setting port to $Port for $wmiinstancename on $computerName" -Continue + } + } + } + } + } +} +function Set-DbaTempdbConfig { + <# + .SYNOPSIS + Sets tempdb data and log files according to best practices. + + .DESCRIPTION + Calculates tempdb size and file configurations based on passed parameters, calculated values, and Microsoft best practices. User must declare SQL Server to be configured and total data file size as mandatory values. Function then calculates the number of data files based on logical cores on the target host and create evenly sized data files based on the total data size declared by the user, with a log file 25% of the total data file size. + + Other parameters can adjust the settings as the user desires (such as different file paths, number of data files, and log file size). No functions that shrink or delete data files are performed. If you wish to do this, you will need to resize tempdb so that it is "smaller" than what the function will size it to before running the function. + + .PARAMETER SqlInstance + The target SQL Server instance or instances. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER DataFileCount + Specifies the number of data files to create. If this number is not specified, the number of logical cores of the host will be used. + + .PARAMETER DataFileSize + Specifies the total data file size in megabytes. This is distributed across the total number of data files. + + .PARAMETER LogFileSize + Specifies the log file size in megabytes. If not specified, this will be set to 25% of total data file size. + + .PARAMETER DataFileGrowth + Specifies the growth amount for the data file(s) in megabytes. The default is 512 MB. + + .PARAMETER LogFileGrowth + Specifies the growth amount for the log file in megabytes. The default is 512 MB. + + .PARAMETER DataPath + Specifies the filesystem path in which to create the tempdb data files. If not specified, current tempdb location will be used. + + .PARAMETER LogPath + Specifies the filesystem path in which to create the tempdb log file. If not specified, current tempdb location will be used. + + .PARAMETER OutputScriptOnly + If this switch is enabled, only the T-SQL script to change the tempdb configuration is created and output. + + .PARAMETER OutFile + Specifies the filesystem path into which the generated T-SQL script will be saved. + + .PARAMETER DisableGrowth + If this switch is enabled, the tempdb files will be configured to not grow. This overrides -DataFileGrowth and -LogFileGrowth. + + .PARAMETER WhatIf + If this switch is enabled, no actions are performed but informational messages will be displayed that explain what would happen if the command were to run. + + .PARAMETER Confirm + If this switch is enabled, you will be prompted for confirmation before executing any operations that change state. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Tempdb, Space, Configure, Configuration + Author: Michael Fal (@Mike_Fal), http://mikefal.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Set-DbaTempdbConfig + + .EXAMPLE + PS C:\> Set-DbaTempdbConfig -SqlInstance localhost -DataFileSize 1000 + + Creates tempdb with a number of data files equal to the logical cores where each file is equal to 1000MB divided by the number of logical cores, with a log file of 250MB. + + .EXAMPLE + PS C:\> Set-DbaTempdbConfig -SqlInstance localhost -DataFileSize 1000 -DataFileCount 8 + + Creates tempdb with 8 data files, each one sized at 125MB, with a log file of 250MB. + + .EXAMPLE + PS C:\> Set-DbaTempdbConfig -SqlInstance localhost -DataFileSize 1000 -OutputScriptOnly + + Provides a SQL script output to configure tempdb according to the passed parameters. + + .EXAMPLE + PS C:\> Set-DbaTempdbConfig -SqlInstance localhost -DataFileSize 1000 -DisableGrowth + + Disables the growth for the data and log files. + + .EXAMPLE + PS C:\> Set-DbaTempdbConfig -SqlInstance localhost -DataFileSize 1000 -OutputScriptOnly + + Returns the T-SQL script representing tempdb configuration. + + #> + [CmdletBinding(SupportsShouldProcess, ConfirmImpact = 'Medium')] + [Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSUseOutputTypeCorrectly", "", Justification = "PSSA Rule Ignored by BOH")] + param ( + [parameter(Mandatory)] + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [int]$DataFileCount, + [Parameter(Mandatory)] + [int]$DataFileSize, + [int]$LogFileSize, + [int]$DataFileGrowth = 512, + [int]$LogFileGrowth = 512, + [string]$DataPath, + [string]$LogPath, + [string]$OutFile, + [switch]$OutputScriptOnly, + [switch]$DisableGrowth, + [switch]$EnableException + ) + process { + foreach ($instance in $SqlInstance) { + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential -MinimumVersion 9 + + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + $cores = $server.Processors + if ($cores -gt 8) { + $cores = 8 + } + + #Set DataFileCount if not specified. If specified, check against best practices. + if (-not $DataFileCount) { + $DataFileCount = $cores + Write-Message -Message "Data file count set to number of cores: $DataFileCount" -Level Verbose + } else { + if ($DataFileCount -gt $cores) { + Write-Message -Message "Data File Count of $DataFileCount exceeds the Logical Core Count of $cores. This is outside of best practices." -Level Warning + } + Write-Message -Message "Data file count set explicitly: $DataFileCount" -Level Verbose + } + + $DataFilesizeSingle = $([Math]::Floor($DataFileSize / $DataFileCount)) + Write-Message -Message "Single data file size (MB): $DataFilesizeSingle." -Level Verbose + + if (Test-Bound -ParameterName DataPath) { + if ((Test-DbaPath -SqlInstance $server -Path $DataPath) -eq $false) { + Stop-Function -Message "$datapath is an invalid path." -Continue + } + } else { + $Filepath = $server.Databases['tempdb'].ExecuteWithResults('SELECT physical_name as FileName FROM sys.database_files WHERE file_id = 1').Tables[0].Rows[0].FileName + $DataPath = Split-Path $Filepath + } + + Write-Message -Message "Using data path: $datapath." -Level Verbose + + if (Test-Bound -ParameterName LogPath) { + if ((Test-DbaPath -SqlInstance $server -Path $LogPath) -eq $false) { + Stop-Function -Message "$LogPath is an invalid path." -Continue + } + } else { + $Filepath = $server.Databases['tempdb'].ExecuteWithResults('SELECT physical_name as FileName FROM sys.database_files WHERE file_id = 2').Tables[0].Rows[0].FileName + $LogPath = Split-Path $Filepath + } + Write-Message -Message "Using log path: $LogPath." -Level Verbose + + # Check if the file growth needs to be disabled + if ($DisableGrowth) { + $DataFileGrowth = 0 + $LogFileGrowth = 0 + } + + # Check current tempdb. Throw an error if current tempdb is larger than config. + $CurrentFileCount = $server.Databases['tempdb'].ExecuteWithResults('SELECT count(1) as FileCount FROM sys.database_files WHERE type=0').Tables[0].Rows[0].FileCount + $TooBigCount = $server.Databases['tempdb'].ExecuteWithResults("SELECT TOP 1 (size/128) as Size FROM sys.database_files WHERE size/128 > $DataFilesizeSingle AND type = 0").Tables[0].Rows[0].Size + + if ($CurrentFileCount -gt $DataFileCount) { + Stop-Function -Message "Current tempdb in $instance is not suitable to be reconfigured. The current tempdb has a greater number of files ($CurrentFileCount) than the calculated configuration ($DataFileCount)." -Continue + } + + if ($TooBigCount) { + Stop-Function -Message "Current tempdb in $instance is not suitable to be reconfigured. The current tempdb ($TooBigCount MB) is larger than the calculated individual file configuration ($DataFilesizeSingle MB)." -Continue + } + + $EqualCount = $server.Databases['tempdb'].ExecuteWithResults("SELECT count(1) as FileCount FROM sys.database_files WHERE size/128 = $DataFilesizeSingle AND type = 0").Tables[0].Rows[0].FileCount + + Write-Message -Message "tempdb configuration validated." -Level Verbose + + $DataFiles = $server.Databases['tempdb'].ExecuteWithResults("select f.name as Name, f.physical_name as FileName from sys.filegroups fg join sys.database_files f on fg.data_space_id = f.data_space_id where fg.name = 'PRIMARY' and f.type_desc = 'ROWS'").Tables[0]; + + #Checks passed, process reconfiguration + for ($i = 0; $i -lt $DataFileCount; $i++) { + $File = $DataFiles.Rows[$i] + if ($File) { + $Filename = Split-Path $File.FileName -Leaf + $LogicalName = $File.Name + $NewPath = "$datapath\$Filename" + $sql += "ALTER DATABASE tempdb MODIFY FILE(name=$LogicalName,filename='$NewPath',size=$DataFilesizeSingle MB,filegrowth=$DataFileGrowth);" + } else { + $NewName = "tempdev$i.ndf" + $NewPath = "$datapath\$NewName" + $sql += "ALTER DATABASE tempdb ADD FILE(name=tempdev$i,filename='$NewPath',size=$DataFilesizeSingle MB,filegrowth=$DataFileGrowth);" + } + } + + if (-not $LogFileSize) { + $LogFileSize = [Math]::Floor($DataFileSize / 4) + } + + $logfile = $server.Databases['tempdb'].ExecuteWithResults("SELECT name, physical_name as FileName FROM sys.database_files WHERE file_id = 2").Tables[0].Rows[0]; + $Filename = Split-Path $logfile.FileName -Leaf + $LogicalName = $logfile.Name + $NewPath = "$LogPath\$Filename" + $sql += "ALTER DATABASE tempdb MODIFY FILE(name=$LogicalName,filename='$NewPath',size=$LogFileSize MB,filegrowth=$LogFileGrowth);" + + Write-Message -Message "SQL Statement to resize tempdb." -Level Verbose + Write-Message -Message ($sql -join "`n`n") -Level Verbose + + if ($OutputScriptOnly) { + return $sql + } elseif ($OutFile) { + $sql | Set-Content -Path $OutFile + } else { + if ($Pscmdlet.ShouldProcess($instance, "Executing query and informing that a restart is required.")) { + try { + $server.Databases['master'].ExecuteNonQuery($sql) + Write-Message -Level Verbose -Message "tempdb successfully reconfigured." + + [PSCustomObject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + DataFileCount = $DataFileCount + DataFileSize = [dbasize]($DataFileSize * 1024 * 1024) + SingleDataFileSize = [dbasize]($DataFilesizeSingle * 1024 * 1024) + LogSize = [dbasize]($LogFileSize * 1024 * 1024) + DataPath = $DataPath + LogPath = $LogPath + DataFileGrowth = [dbasize]($DataFileGrowth * 1024 * 1024) + LogFileGrowth = [dbasize]($LogFileGrowth * 1024 * 1024) + } + + Write-Message -Level Output -Message "tempdb reconfigured. You must restart the SQL Service for settings to take effect." + } catch { + Stop-Function -Message "Unable to reconfigure tempdb. Exception: $_" -Target $sql -ErrorRecord $_ -Continue + } + } + } + } + } + end { + Test-DbaDeprecation -DeprecatedOn "1.0.0" -EnableException:$false -Alias Set-SqlTempDbConfiguration + Test-DbaDeprecation -DeprecatedOn "1.0.0" -EnableException:$false -Alias Set-DbaTempDbConfiguration + } +} +function Show-DbaDbList { + <# + .SYNOPSIS + Shows a list of databases in a GUI. + + .DESCRIPTION + Shows a list of databases in a GUI. Returns a string holding the name of the selected database. Hitting cancel returns null. + + .PARAMETER SqlInstance + The target SQL Server instance or instances.. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Title + Title of the window being displayed. Default is "Select Database". + + .PARAMETER Header + Header text displayed above the database listing. Default is "Select the database:". + + .PARAMETER DefaultDb + Specify a database to have selected when the window appears. + + .NOTES + Tags: Database, FileSystem + Author: Chrissy LeMaire (@cl), netnerds.net + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Show-DbaDbList + + .EXAMPLE + PS C:\> Show-DbaDbList -SqlInstance sqlserver2014a + + Shows a GUI list of databases using Windows Authentication to connect to the SQL Server. Returns a string of the selected database. + + .EXAMPLE + PS C:\> Show-DbaDbList -SqlInstance sqlserver2014a -SqlCredential $cred + + Shows a GUI list of databases using SQL credentials to connect to the SQL Server. Returns a string of the selected database. + + .EXAMPLE + PS C:\> Show-DbaDbList -SqlInstance sqlserver2014a -DefaultDb master + + Shows a GUI list of databases using Windows Authentication to connect to the SQL Server. The "master" database will be selected when the lists shows. Returns a string of the selected database. + + #> + [CmdletBinding()] + param ( + [parameter(Mandatory, ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter]$SqlInstance, + [PSCredential]$SqlCredential, + [string]$Title = "Select Database", + [string]$Header = "Select the database:", + [string]$DefaultDb + ) + + begin { + try { + Add-Type -AssemblyName PresentationFramework + } catch { + throw "Windows Presentation Framework required but not installed" + } + + function Add-TreeItem { + param ( + [string]$name, + [object]$parent, + [string]$tag + ) + + $childitem = New-Object System.Windows.Controls.TreeViewItem + $textblock = New-Object System.Windows.Controls.TextBlock + $textblock.Margin = "5,0" + $stackpanel = New-Object System.Windows.Controls.StackPanel + $stackpanel.Orientation = "Horizontal" + $image = New-Object System.Windows.Controls.Image + $image.Height = 20 + $image.Width = 20 + $image.Stretch = "Fill" + $image.Source = $dbicon + $textblock.Text = $name + $childitem.Tag = $name + + if ($name -eq $DefaultDb) { + $childitem.IsSelected = $true + $script:selected = $name + } + + [void]$stackpanel.Children.Add($image) + [void]$stackpanel.Children.Add($textblock) + + $childitem.Header = $stackpanel + [void]$parent.Items.Add($childitem) + } + + function Convert-b64toimg { + param ($base64) + + $bitmap = New-Object System.Windows.Media.Imaging.BitmapImage + $bitmap.BeginInit() + $bitmap.StreamSource = [System.IO.MemoryStream][System.Convert]::FromBase64String($base64) + $bitmap.EndInit() + $bitmap.Freeze() + return $bitmap + } + + $dbicon = Convert-b64toimg "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAYdEVYdFNvZnR3YXJlAHBhaW50Lm5ldCA0LjAuNWWFMmUAAAFRSURBVDhPY/j//z9VMVZBSjCCgQZunFn6/8zenv+7llf83zA75/+6WTn/N80v+L93ddP/M/tnY2jAayDIoNvn5/5/cX/t/89vdv7/9fUQGIPYj2+t/H/xyJT/O1ZUoWjCaeCOxcX///48ShSeWhMC14jXwC9Xs/5/fzHr/6/PW+GaQS78/WH9/y+Pe8DyT3fYEmcgKJw+HHECawJp/vZ60f8v95v/fzgd8P/tVtn/L1cw/n+0iOH/7TlMxBkIigBiDewr9iVsICg2qWrg6qnpA2dgW5YrYQOX9icPAQPfU9PA2S2RRLuwMtaGOAOf73X+//FyGl4DL03jIM5AEFjdH/x//+Lo/1cOlP9/dnMq2MA3x/z/312l/P/4JNH/axoU/0/INUHRhNdAEDi+pQ1cZIFcDEpvoPCaVOTwf1Gjy/9ds5MxNGAYSC2MVZB8/J8BAGcHwqQBNWHRAAAAAElFTkSuQmCC" + $foldericon = Convert-b64toimg "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAYdEVYdFNvZnR3YXJlAHBhaW50Lm5ldCA0LjAuNWWFMmUAAAHaSURBVDhPY/j//z9VMVZBSjBWQUowVkFKMApnzZL+/+gYWZ4YDGeANL95sun/j3fbwPjbm5X/Pz+cRLKhcAayq2B45YKe/8vndoHx4lltYLxgajMKhumHYRQDf37Yh4J/fNry//fb1f9/v1n6/8/Tqf//3O/6/+dO9f9fV4v+fzmV/v/L0aj/lflJQO1YDAS5AmwI1MvfPyAZ9KgbYtDlvP/fzyT9/3w45P+HPT7/z8+UwG0gyDvIBmIYBnQVyDCQq0CGPV9p8v94P/f/rKQwoHYsBs4HhgfIQJjLfr+YjdOwt5tt/z9eov1/fxf3/+ggD6B2HAaCXQYKM6hhv+81oYQXzLCXq03/P5qn/H9LE/9/LycroHYsBs7oq4EYCDIM6FVshr3Z4gg2DOS6O9Nk/q+sFvlvZawD1I7FwKldleC0h2zY9wuZEMP2+aMYdn+W/P/rE0T/zy+T+q+jJg/UjsXASe1l/z/cX/T/1dn8/492ePy/vc7s/82VOv8vLVT9f3yGwv89ffL/1zXL/l9dJwF2GciwaYVy/xVlxIDasRjY31Lyv7Uy+39ZTvz/1JiA/8Hejv8dLA3+62sqgTWJC/HixDAzQBjOoBbGKkgJxipICcYqSD7+zwAAkIiWzSGuSg0AAAAASUVORK5CYII=" + $dbatoolsicon = Convert-b64toimg "iVBORw0KGgoAAAANSUhEUgAAABkAAAAZCAYAAADE6YVjAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAYdEVYdFNvZnR3YXJlAHBhaW50Lm5ldCA0LjAuNWWFMmUAAAO9SURBVEhL3VVdTFNXHO9MzPTF+OzDeBixFdTMINIWsAUK3AIVkFvAIQVFRLYZKR8Wi1IEKV9DYB8PGFAyEx8QScySabYY5+I2JvK18iWISKGk0JGhLzA3+e2c29uHtpcvH/0lv9yennN+v3vO/3fOFb2fCAg4vXWPNOmMRJ745TtTSskqeElviGXJ0XtkWvjJkyGLPoFAVQZoe/NkX/n6Mh/ysu4Qy7WZdJAutxRW6zT6LcNQaE4LiGgREH4cibpCMNqzCIk9hbScEoSSZ0zKOa7fRxG/k5d1h8ukvO4a5ubmMT1jw5E0vZcBZWzqOTS3dcB8tRXZeRX4/v5DZH5uIu0Wrn8NEzaNDjgYoUPd120oMjViX2iql8H6ZFd8DzE7eFl3iOWpuyQydlh44kbJroilSd8RuQ+cqh7wC9Z+JJaxY8KTN0gp+5Yk9DaREzYhb5FOBwZFZ6LlZifKa5ux//AxYTHCvSEp8A9O5n77B6dwqXS119guZ+GrGq9jfn4eM7ZZxB/PdxN2UfOpHq3kRWq/uoE8Yx3u/fQLzhSYUdN0g+tfN126z0oxNj6BJz0Dq0b4E2UawuJzuPhKyZmKYr/AocgMrk37VzWRBLGRdE/psuXqk9wkT/GNUCJLWqS3By/rDh9FxjaSrnahiZ7cq8wCUzKImLIJqC+Ngbk4gmjjIKKKB6Aq7l+OLBmfVF0YnlQZR1p4eSd2y5IiyEr+oyJ0CwIi0gUNKAOPmnG04Q0utf+DHweWkFjjQOyVWajLpsCUPkeUcRgqAzE09Dfz8k64aqI9YcDziUk87bMgOCZL0CQ0ux2J9UtIbXyFwall/PD0NeLKrU6DkhGymj8RXtRDjU7x8k64TKpJQmi6bLOzSEgv8DYhNWMujiK+9jU0VQs4Vm/H2MwSOh4vcP+rii2cQVh+F+IqbRJe3glyReuoSFBUJtpu3eWulv2h3ueE1iOu0g5N9QL3jLk8jerbdrz59y1yGoYQUdSLsII/CLscIsD9UPrLUz4myXhBhWjCPMVdPBBnhMbsIAZzSDDbcOvRIhyLy6i4+Qyq82QFxECR9xjK/K5OXtodNHo+CsW2tagunbxADbK+sXP16Bv/G7lNQ8hpHEX21UGoDb/j8NmfoSzoNvCymwdTPvMotsKGB32LaL1H0mS0oOHOFLpH/0L3iAOF3/YSk4dgTBMh/JTNgdVbtzNl1il12UuSpHE+SRayTb0IL3yCMP2vUJKtUuh/szNNK8Jfxw3BZNpiMoGjiKPJm54Ffw8gEv0PQRYX7wDAUKEAAAAASUVORK5CYII=" + + $sourceserver = Connect-SqlInstance -SqlInstance $SqlInstance -SqlCredential $SqlCredential + } + + process { + # Create XAML form in Visual Studio, ensuring the ListView looks chromeless + [xml]$xaml = " + + + 8GPQJvi(50iwpDG+iy@}BfJj9^9O{b zUBlHT@RfFjR(zkVcItBRRF=hN_s&A_NmnZU|IEG1Z)8c9=Ev?yK%3F~t&v8AN{#M@ zhB=i%cPBYojQ9!$gJh6RMh2(3P|1VzWOxKgXS>rgk}NcYDRf~3t+lCcK!7A@G3dnz z=v`L{5Re%Q?X(o2oifI!enY80}?bLlci}MDQoOhaSE;<&={08b_%kY&w;YE@t~XC_`R*Rhk444 zg(-*8D};86J{*W$u9Oi`QUxe;N19_zhl}_vNH9+phM2zvt-1IFAgf1WFE0aSMTk+@ z&K2P;$}aHtVTh%f_vIT|u5A5N{B?Cm!ZV#Nl9#`~;g}W9R*N>KI))h?EmF-i#sJN{ zOz|
  • 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 uz>*hG-{$~E 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 PbT>Tk20!fGr7 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 b{rO8tfk(bz|Nf=l|4WJeUm^W(NrC?tK&;CV literal 0 HcmV?d00001 diff --git a/bin/datamasking/columntypes.json b/bin/datamasking/columntypes.json new file mode 100644 index 0000000000..8d6ac5277a --- /dev/null +++ b/bin/datamasking/columntypes.json @@ -0,0 +1,162 @@ +[ + { + "TypeName": "Address", + "Synonym": [ + "Address", + "Location", + "Headquarters", + "Street" + ] + }, + { + "TypeName": "Bic", + "Synonym": [ + "Bic", + "BicAddress" + ] + }, + { + "TypeName": "Bitcoin", + "Synonym": [ + "Bitcoin", + "BitcoinAddress" + ] + }, + { + "TypeName": "Email", + "Synonym": [ + "Email", + "E-mail", + "EmailAddress" + ] + }, + { + "TypeName": "Ethereum", + "Synonym": [ + "Ethereum", + "EthereumAddress" + ] + }, + { + "TypeName": "Creditcard", + "Synonym": [ + "Creditcard", + "CreditcardNumber" + ] + }, + { + "TypeName": "CreditcardCVV", + "Synonym": [ + "Cvv", + "CreditcardCvv" + ] + }, + { + "TypeName": "City", + "Synonym": [ + "City" + ] + }, + { + "TypeName": "Company", + "Synonym": [ + "Company", + "CompanyName" + ] + }, + { + "TypeName": "Country", + "Synonym": [ + "Country" + ] + }, + { + "TypeName": "CountryCode", + "Synonym": [ + "CountryCode" + ] + }, + { + "TypeName": "Firstname", + "Synonym": [ + "Firstname", + "Forename" + ] + }, + { + "TypeName": "Fullname", + "Synonym": [ + "Fullname", + "TypeName" + ] + }, + { + "TypeName": "Iban", + "Synonym": [ + "Iban", + "IbanNumber" + ] + }, + { + "TypeName": "Lastname", + "Synonym": [ + "Lastname", + "Surname" + ] + }, + { + "TypeName": "Latitude", + "Synonym": [ + "Latitude", + "Lat" + ] + }, + { + "TypeName": "Longitude", + "Synonym": [ + "Longitude", + "Lon" + ] + }, + { + "TypeName": "Phone", + "Synonym": [ + "Fax", + "FaxNumber", + "Phonenumber", + "Phone", + "Telephone", + "TelephoneNumber" + ] + }, + { + "TypeName": "State", + "Synonym": [ + "State" + ] + }, + { + "TypeName": "StateAbbr", + "Synonym": [ + "StateAbbreviation", + "StateCode" + ] + }, + { + "TypeName": "Username", + "Synonym": [ + "Login", + "LoginId", + "User", + "UserId" + ] + }, + { + "TypeName": "Zipcode", + "Synonym": [ + "Zipcode", + "Zip", + "Postalcode" + ] + } +] \ No newline at end of file diff --git a/bin/datamasking/example.tables.json b/bin/datamasking/example.tables.json new file mode 100644 index 0000000000..fc50437f85 --- /dev/null +++ b/bin/datamasking/example.tables.json @@ -0,0 +1,48 @@ +[ + { + "Name": "Credicards", + "Columns": { + "Name": "CredicardNumber", + "MaskingType": "CreditCard", + "SubType": "MasterCard" + } + }, + { + "Name": "Customer", + "Columns": [ + { + "Name": "Firstname", + "MaskingType": "FirstName" + }, + { + "Name": "Lastname", + "MaskingType": "Lastname" + }, + { + "Name": "Address", + "MaskingType": "Address" + }, + { + "Name": "Zipcode", + "MaskingType": "Zipcode" + }, + { + "Name": "City", + "MaskingType": "City" + } + ] + }, + { + "Name": "ContactInformation", + "Columns": [ + { + "Name": "EmailAddress", + "MaskingType": "Email" + }, + { + "Name": "HomePhone", + "MaskingType": "Phone" + } + ] + } +] \ No newline at end of file diff --git a/bin/datamasking/firstnames_all.txt b/bin/datamasking/firstnames_all.txt new file mode 100644 index 0000000000..d5d0174256 --- /dev/null +++ b/bin/datamasking/firstnames_all.txt @@ -0,0 +1,5163 @@ +Aaron +Abbey +Abbie +Abby +Abdul +Abe +Abel +Abigail +Abraham +Abram +Ada +Adah +Adalberto +Adaline +Adam +Adan +Addie +Adela +Adelaida +Adelaide +Adele +Adelia +Adelina +Adeline +Adell +Adella +Adelle +Adena +Adina +Adolfo +Adolph +Adria +Adrian +Adriana +Adriane +Adrianna +Adrianne +Adrien +Adriene +Adrienne +Afton +Agatha +Agnes +Agnus +Agripina +Agueda +Agustin +Agustina +Ahmad +Ahmed +Ai +Aida +Aide +Aiko +Aileen +Ailene +Aimee +Aisha +Aja +Akiko +Akilah +Al +Alaina +Alaine +Alan +Alana +Alane +Alanna +Alayna +Alba +Albert +Alberta +Albertha +Albertina +Albertine +Alberto +Albina +Alda +Alden +Aldo +Alease +Alec +Alecia +Aleen +Aleida +Aleisha +Alejandra +Alejandrina +Alejandro +Alena +Alene +Alesha +Aleshia +Alesia +Alessandra +Aleta +Aletha +Alethea +Alethia +Alex +Alexa +Alexander +Alexandra +Alexandria +Alexia +Alexis +Alfonso +Alfonzo +Alfred +Alfreda +Alfredia +Alfredo +Ali +Alia +Alica +Alice +Alicia +Alida +Alina +Aline +Alisa +Alise +Alisha +Alishia +Alisia +Alison +Alissa +Alita +Alix +Aliza +Alla +Allan +Alleen +Allegra +Allen +Allena +Allene +Allie +Alline +Allison +Allyn +Allyson +Alma +Almeda +Almeta +Alona +Alonso +Alonzo +Alpha +Alphonse +Alphonso +Alta +Altagracia +Altha +Althea +Alton +Alva +Alvaro +Alvera +Alverta +Alvin +Alvina +Alyce +Alycia +Alysa +Alyse +Alysha +Alysia +Alyson +Alyssa +Amada +Amado +Amal +Amalia +Amanda +Amber +Amberly +Ambrose +Amee +Amelia +America +Ami +Amie +Amiee +Amina +Amira +Ammie +Amos +Amparo +Amy +An +Ana +Anabel +Analisa +Anamaria +Anastacia +Anastasia +Andera +Anderson +Andra +Andre +Andrea +Andreas +Andree +Andres +Andrew +Andria +Andy +Anette +Angel +Angela +Angele +Angelena +Angeles +Angelia +Angelic +Angelica +Angelika +Angelina +Angeline +Angelique +Angelita +Angella +Angelo +Angelyn +Angie +Angila +Angla +Angle +Anglea +Anh +Anibal +Anika +Anisa +Anisha +Anissa +Anita +Anitra +Anja +Anjanette +Anjelica +Ann +Anna +Annabel +Annabell +Annabelle +Annalee +Annalisa +Annamae +Annamaria +Annamarie +Anne +Anneliese +Annelle +Annemarie +Annett +Annetta +Annette +Annice +Annie +Annika +Annis +Annita +Annmarie +Anthony +Antione +Antionette +Antoine +Antoinette +Anton +Antone +Antonetta +Antonette +Antonia +Antonietta +Antonina +Antonio +Antony +Antwan +Anya +Apolonia +April +Apryl +Ara +Araceli +Aracelis +Aracely +Arcelia +Archie +Ardath +Ardelia +Ardell +Ardella +Ardelle +Arden +Ardis +Ardith +Aretha +Argelia +Argentina +Ariana +Ariane +Arianna +Arianne +Arica +Arie +Ariel +Arielle +Arla +Arlean +Arleen +Arlen +Arlena +Arlene +Arletha +Arletta +Arlette +Arlie +Arlinda +Arline +Arlyne +Armand +Armanda +Armandina +Armando +Armida +Arminda +Arnetta +Arnette +Arnita +Arnold +Arnoldo +Arnulfo +Aron +Arron +Art +Arthur +Artie +Arturo +Arvilla +Asa +Asha +Ashanti +Ashely +Ashlea +Ashlee +Ashleigh +Ashley +Ashli +Ashlie +Ashly +Ashlyn +Ashton +Asia +Asley +Assunta +Astrid +Asuncion +Athena +Aubrey +Audie +Audra +Audrea +Audrey +Audria +Audrie +Audry +August +Augusta +Augustina +Augustine +Augustus +Aundrea +Aura +Aurea +Aurelia +Aurelio +Aurora +Aurore +Austin +Autumn +Ava +Avelina +Avery +Avis +Avril +Awilda +Ayako +Ayana +Ayanna +Ayesha +Azalee +Azucena +Azzie +Babara +Babette +Bailey +Bambi +Bao +Barabara +Barb +Barbar +Barbara +Barbera +Barbie +Barbra +Bari +Barney +Barrett +Barrie +Barry +Bart +Barton +Basil +Basilia +Bea +Beata +Beatrice +Beatris +Beatriz +Beau +Beaulah +Bebe +Becki +Beckie +Becky +Bee +Belen +Belia +Belinda +Belkis +Bell +Bella +Belle +Belva +Ben +Benedict +Benita +Benito +Benjamin +Bennett +Bennie +Benny +Benton +Berenice +Berna +Bernadette +Bernadine +Bernard +Bernarda +Bernardina +Bernardine +Bernardo +Berneice +Bernetta +Bernice +Bernie +Berniece +Bernita +Berry +Bert +Berta +Bertha +Bertie +Bertram +Beryl +Bess +Bessie +Beth +Bethanie +Bethann +Bethany +Bethel +Betsey +Betsy +Bette +Bettie +Bettina +Betty +Bettyann +Bettye +Beula +Beulah +Bev +Beverlee +Beverley +Beverly +Bianca +Bibi +Bill +Billi +Billie +Billy +Billye +Birdie +Birgit +Blaine +Blair +Blake +Blanca +Blanch +Blanche +Blondell +Blossom +Blythe +Bo +Bob +Bobbi +Bobbie +Bobby +Bobbye +Bobette +Bok +Bong +Bonita +Bonnie +Bonny +Booker +Boris +Boyce +Boyd +Brad +Bradford +Bradley +Bradly +Brady +Brain +Branda +Brande +Brandee +Branden +Brandi +Brandie +Brandon +Brandy +Brant +Breana +Breann +Breanna +Breanne +Bree +Brenda +Brendan +Brendon +Brenna +Brent +Brenton +Bret +Brett +Brian +Briana +Brianna +Brianne +Brice +Bridget +Bridgett +Bridgette +Brigette +Brigid +Brigida +Brigitte +Brinda +Britany +Britney +Britni +Britt +Britta +Brittaney +Brittani +Brittanie +Brittany +Britteny +Brittney +Brittni +Brittny +Brock +Broderick +Bronwyn +Brook +Brooke +Brooks +Bruce +Bruna +Brunilda +Bruno +Bryan +Bryanna +Bryant +Bryce +Brynn +Bryon +Buck +Bud +Buddy +Buena +Buffy +Buford +Bula +Bulah +Bunny +Burl +Burma +Burt +Burton +Buster +Byron +Caitlin +Caitlyn +Calandra +Caleb +Calista +Callie +Calvin +Camelia +Camellia +Cameron +Cami +Camie +Camila +Camilla +Camille +Cammie +Cammy +Candace +Candance +Candelaria +Candi +Candice +Candida +Candie +Candis +Candra +Candy +Candyce +Caprice +Cara +Caren +Carey +Cari +Caridad +Carie +Carin +Carina +Carisa +Carissa +Carita +Carl +Carla +Carlee +Carleen +Carlena +Carlene +Carletta +Carley +Carli +Carlie +Carline +Carlita +Carlo +Carlos +Carlota +Carlotta +Carlton +Carly +Carlyn +Carma +Carman +Carmel +Carmela +Carmelia +Carmelina +Carmelita +Carmella +Carmelo +Carmen +Carmina +Carmine +Carmon +Carol +Carola +Carolann +Carole +Carolee +Carolin +Carolina +Caroline +Caroll +Carolyn +Carolyne +Carolynn +Caron +Caroyln +Carri +Carrie +Carrol +Carroll +Carry +Carson +Carter +Cary +Caryl +Carylon +Caryn +Casandra +Casey +Casie +Casimira +Cassandra +Cassaundra +Cassey +Cassi +Cassidy +Cassie +Cassondra +Cassy +Catalina +Catarina +Caterina +Catharine +Catherin +Catherina +Catherine +Cathern +Catheryn +Cathey +Cathi +Cathie +Cathleen +Cathrine +Cathryn +Cathy +Catina +Catrice +Catrina +Cayla +Cecelia +Cecil +Cecila +Cecile +Cecilia +Cecille +Cecily +Cedric +Cedrick +Celena +Celesta +Celeste +Celestina +Celestine +Celia +Celina +Celinda +Celine +Celsa +Ceola +Cesar +Chad +Chadwick +Chae +Chan +Chana +Chance +Chanda +Chandra +Chanel +Chanell +Chanelle +Chang +Chantal +Chantay +Chante +Chantel +Chantell +Chantelle +Chara +Charis +Charise +Charissa +Charisse +Charita +Charity +Charla +Charleen +Charlena +Charlene +Charles +Charlesetta +Charlette +Charley +Charlie +Charline +Charlott +Charlotte +Charlsie +Charlyn +Charmain +Charmaine +Charolette +Chas +Chase +Chasidy +Chasity +Chassidy +Chastity +Chau +Chauncey +Chaya +Chelsea +Chelsey +Chelsie +Cher +Chere +Cheree +Cherelle +Cheri +Cherie +Cherilyn +Cherise +Cherish +Cherly +Cherlyn +Cherri +Cherrie +Cherry +Cherryl +Chery +Cheryl +Cheryle +Cheryll +Chester +Chet +Cheyenne +Chi +Chia +Chieko +Chin +China +Ching +Chiquita +Chloe +Chong +Chris +Chrissy +Christa +Christal +Christeen +Christel +Christen +Christena +Christene +Christi +Christia +Christian +Christiana +Christiane +Christie +Christin +Christina +Christine +Christinia +Christoper +Christopher +Christy +Chrystal +Chu +Chuck +Chun +Chung +Ciara +Cicely +Ciera +Cierra +Cinda +Cinderella +Cindi +Cindie +Cindy +Cinthia +Cira +Clair +Claire +Clara +Clare +Clarence +Claretha +Claretta +Claribel +Clarice +Clarinda +Clarine +Claris +Clarisa +Clarissa +Clarita +Clark +Classie +Claud +Claude +Claudette +Claudia +Claudie +Claudine +Claudio +Clay +Clayton +Clelia +Clemencia +Clement +Clemente +Clementina +Clementine +Clemmie +Cleo +Cleopatra +Cleora +Cleotilde +Cleta +Cletus +Cleveland +Cliff +Clifford +Clifton +Clint +Clinton +Clora +Clorinda +Clotilde +Clyde +Codi +Cody +Colby +Cole +Coleen +Coleman +Colene +Coletta +Colette +Colin +Colleen +Collen +Collene +Collette +Collin +Colton +Columbus +Concepcion +Conception +Concetta +Concha +Conchita +Connie +Conrad +Constance +Consuela +Consuelo +Contessa +Cora +Coral +Coralee +Coralie +Corazon +Cordelia +Cordell +Cordia +Cordie +Coreen +Corene +Coretta +Corey +Cori +Corie +Corina +Corine +Corinna +Corinne +Corliss +Cornelia +Cornelius +Cornell +Corrie +Corrin +Corrina +Corrine +Corrinne +Cortez +Cortney +Cory +Courtney +Coy +Craig +Creola +Cris +Criselda +Crissy +Crista +Cristal +Cristen +Cristi +Cristie +Cristin +Cristina +Cristine +Cristobal +Cristopher +Cristy +Cruz +Crysta +Crystal +Crystle +Cuc +Curt +Curtis +Cyndi +Cyndy +Cynthia +Cyril +Cyrstal +Cyrus +Cythia +Dacia +Dagmar +Dagny +Dahlia +Daina +Daine +Daisey +Daisy +Dakota +Dale +Dalene +Dalia +Dalila +Dallas +Dalton +Damaris +Damian +Damien +Damion +Damon +Dan +Dana +Danae +Dane +Danelle +Danette +Dani +Dania +Danial +Danica +Daniel +Daniela +Daniele +Daniell +Daniella +Danielle +Danika +Danille +Danilo +Danita +Dann +Danna +Dannette +Dannie +Dannielle +Danny +Dante +Danuta +Danyel +Danyell +Danyelle +Daphine +Daphne +Dara +Darby +Darcel +Darcey +Darci +Darcie +Darcy +Darell +Daren +Daria +Darin +Dario +Darius +Darla +Darleen +Darlena +Darlene +Darline +Darnell +Daron +Darrel +Darrell +Darren +Darrick +Darrin +Darron +Darryl +Darwin +Daryl +Dave +David +Davida +Davina +Davis +Dawn +Dawna +Dawne +Dayle +Dayna +Daysi +Deadra +Dean +Deana +Deandra +Deandre +Deandrea +Deane +Deangelo +Deann +Deanna +Deanne +Deb +Debbi +Debbie +Debbra +Debby +Debera +Debi +Debora +Deborah +Debra +Debrah +Debroah +Dede +Dedra +Dee +Deeann +Deeanna +Deedee +Deedra +Deena +Deetta +Deidra +Deidre +Deirdre +Deja +Del +Delaine +Delana +Delbert +Delcie +Delena +Delfina +Delia +Delicia +Delila +Delilah +Delinda +Delisa +Dell +Della +Delma +Delmar +Delmer +Delmy +Delois +Deloise +Delora +Deloras +Delores +Deloris +Delorse +Delpha +Delphia +Delphine +Delsie +Delta +Demarcus +Demetra +Demetria +Demetrice +Demetrius +Dena +Denae +Deneen +Denese +Denice +Denis +Denise +Denisha +Denisse +Denita +Denna +Dennis +Dennise +Denny +Denver +Denyse +Deon +Deonna +Derek +Derick +Derrick +Deshawn +Desirae +Desire +Desiree +Desmond +Despina +Dessie +Destiny +Detra +Devin +Devon +Devona +Devora +Devorah +Dewayne +Dewey +Dewitt +Dexter +Dia +Diamond +Dian +Diana +Diane +Diann +Dianna +Dianne +Dick +Diedra +Diedre +Diego +Dierdre +Digna +Dillon +Dimple +Dina +Dinah +Dino +Dinorah +Dion +Dione +Dionna +Dionne +Dirk +Divina +Dixie +Dodie +Dollie +Dolly +Dolores +Doloris +Domenic +Domenica +Dominga +Domingo +Dominic +Dominica +Dominick +Dominique +Dominque +Domitila +Domonique +Don +Dona +Donald +Donella +Donetta +Donette +Dong +Donita +Donn +Donna +Donnell +Donnetta +Donnette +Donnie +Donny +Donovan +Donte +Donya +Dora +Dorathy +Dorcas +Doreatha +Doreen +Dorene +Doretha +Dorethea +Doretta +Dori +Doria +Dorian +Dorie +Dorinda +Dorine +Doris +Dorla +Dorotha +Dorothea +Dorothy +Dorris +Dorsey +Dortha +Dorthea +Dorthey +Dorthy +Dot +Dottie +Dotty +Doug +Douglas +Douglass +Dovie +Doyle +Dreama +Drema +Drew +Drucilla +Drusilla +Duane +Dudley +Dulce +Dulcie +Duncan +Dung +Dusti +Dustin +Dusty +Dwain +Dwana +Dwayne +Dwight +Dyan +Dylan +Earl +Earle +Earlean +Earleen +Earlene +Earlie +Earline +Earnest +Earnestine +Eartha +Easter +Eboni +Ebonie +Ebony +Echo +Ed +Eda +Edda +Eddie +Eddy +Edelmira +Eden +Edgar +Edgardo +Edie +Edison +Edith +Edmond +Edmund +Edmundo +Edna +Edra +Edris +Eduardo +Edward +Edwardo +Edwin +Edwina +Edyth +Edythe +Effie +Efrain +Efren +Ehtel +Eileen +Eilene +Ela +Eladia +Elaina +Elaine +Elana +Elane +Elanor +Elayne +Elba +Elbert +Elda +Elden +Eldon +Eldora +Eldridge +Eleanor +Eleanora +Eleanore +Elease +Elena +Elene +Eleni +Elenor +Elenora +Elenore +Eleonor +Eleonora +Eleonore +Elfreda +Elfrieda +Elfriede +Eli +Elia +Eliana +Elias +Elicia +Elida +Elidia +Elijah +Elin +Elina +Elinor +Elinore +Elisa +Elisabeth +Elise +Eliseo +Elisha +Elissa +Eliz +Eliza +Elizabet +Elizabeth +Elizbeth +Elizebeth +Elke +Ella +Ellamae +Ellan +Ellen +Ellena +Elli +Ellie +Elliot +Elliott +Ellis +Ellsworth +Elly +Ellyn +Elma +Elmer +Elmira +Elmo +Elna +Elnora +Elodia +Elois +Eloisa +Eloise +Elouise +Eloy +Elroy +Elsa +Else +Elsie +Elsy +Elton +Elva +Elvera +Elvia +Elvie +Elvin +Elvina +Elvira +Elvis +Elwanda +Elwood +Elyse +Elza +Ema +Emanuel +Emelda +Emelia +Emelina +Emeline +Emely +Emerald +Emerita +Emerson +Emery +Emiko +Emil +Emile +Emilee +Emilia +Emilie +Emilio +Emily +Emma +Emmaline +Emmanuel +Emmett +Emmie +Emmitt +Emmy +Emogene +Emory +Ena +Enda +Enedina +Eneida +Enid +Enoch +Enola +Enrique +Enriqueta +Epifania +Era +Erasmo +Eric +Erica +Erich +Erick +Ericka +Erik +Erika +Erin +Erinn +Erlene +Erlinda +Erline +Erma +Ermelinda +Erminia +Erna +Ernest +Ernestina +Ernestine +Ernesto +Ernie +Errol +Ervin +Erwin +Eryn +Esmeralda +Esperanza +Essie +Esta +Esteban +Estefana +Estela +Estell +Estella +Estelle +Ester +Esther +Estrella +Etha +Ethan +Ethel +Ethelene +Ethelyn +Ethyl +Etsuko +Etta +Ettie +Eufemia +Eugena +Eugene +Eugenia +Eugenie +Eugenio +Eula +Eulah +Eulalia +Eun +Euna +Eunice +Eura +Eusebia +Eusebio +Eustolia +Eva +Evalyn +Evan +Evangelina +Evangeline +Eve +Evelia +Evelin +Evelina +Eveline +Evelyn +Evelyne +Evelynn +Everett +Everette +Evette +Evia +Evie +Evita +Evon +Evonne +Ewa +Exie +Ezekiel +Ezequiel +Ezra +Fabian +Fabiola +Fae +Fairy +Faith +Fallon +Fannie +Fanny +Farah +Farrah +Fatima +Fatimah +Faustina +Faustino +Fausto +Faviola +Fawn +Fay +Faye +Fe +Federico +Felecia +Felica +Felice +Felicia +Felicidad +Felicita +Felicitas +Felipa +Felipe +Felisa +Felisha +Felix +Felton +Ferdinand +Fermin +Fermina +Fern +Fernanda +Fernande +Fernando +Ferne +Fidel +Fidela +Fidelia +Filiberto +Filomena +Fiona +Flavia +Fleta +Fletcher +Flo +Flor +Flora +Florance +Florence +Florencia +Florencio +Florene +Florentina +Florentino +Floretta +Floria +Florida +Florinda +Florine +Florrie +Flossie +Floy +Floyd +Fonda +Forest +Forrest +Foster +Fran +France +Francene +Frances +Francesca +Francesco +Franchesca +Francie +Francina +Francine +Francis +Francisca +Francisco +Francoise +Frank +Frankie +Franklin +Franklyn +Fransisca +Fred +Freda +Fredda +Freddie +Freddy +Frederic +Frederica +Frederick +Fredericka +Fredia +Fredric +Fredrick +Fredricka +Freeda +Freeman +Freida +Frida +Frieda +Fritz +Fumiko +Gabriel +Gabriela +Gabriele +Gabriella +Gabrielle +Gail +Gala +Gale +Galen +Galina +Garfield +Garland +Garnet +Garnett +Garret +Garrett +Garry +Garth +Gary +Gaston +Gavin +Gay +Gaye +Gayla +Gayle +Gaylene +Gaylord +Gaynell +Gaynelle +Gearldine +Gema +Gemma +Gena +Genaro +Gene +Genesis +Geneva +Genevie +Genevieve +Genevive +Genia +Genie +Genna +Gennie +Genny +Genoveva +Geoffrey +Georgann +George +Georgeann +Georgeanna +Georgene +Georgetta +Georgette +Georgia +Georgiana +Georgiann +Georgianna +Georgianne +Georgie +Georgina +Georgine +Gerald +Geraldine +Geraldo +Geralyn +Gerard +Gerardo +Gerda +Geri +Germaine +German +Gerri +Gerry +Gertha +Gertie +Gertrud +Gertrude +Gertrudis +Gertude +Ghislaine +Gia +Gianna +Gidget +Gigi +Gil +Gilbert +Gilberte +Gilberto +Gilda +Gillian +Gilma +Gina +Ginette +Ginger +Ginny +Gino +Giovanna +Giovanni +Gisela +Gisele +Giselle +Gita +Giuseppe +Giuseppina +Gladis +Glady +Gladys +Glayds +Glen +Glenda +Glendora +Glenn +Glenna +Glennie +Glennis +Glinda +Gloria +Glory +Glynda +Glynis +Golda +Golden +Goldie +Gonzalo +Gordon +Grace +Gracia +Gracie +Graciela +Grady +Graham +Graig +Grant +Granville +Grayce +Grazyna +Greg +Gregg +Gregoria +Gregorio +Gregory +Greta +Gretchen +Gretta +Gricelda +Grisel +Griselda +Grover +Guadalupe +Gudrun +Guillermina +Guillermo +Gus +Gussie +Gustavo +Guy +Gwen +Gwenda +Gwendolyn +Gwenn +Gwyn +Gwyneth +Ha +Hae +Hai +Hailey +Hal +Haley +Halina +Halley +Hallie +Han +Hana +Hang +Hanh +Hank +Hanna +Hannah +Hannelore +Hans +Harlan +Harland +Harley +Harmony +Harold +Harriet +Harriett +Harriette +Harris +Harrison +Harry +Harvey +Hassan +Hassie +Hattie +Haydee +Hayden +Hayley +Haywood +Hazel +Heath +Heather +Hector +Hedwig +Hedy +Hee +Heide +Heidi +Heidy +Heike +Helaine +Helen +Helena +Helene +Helga +Hellen +Henrietta +Henriette +Henry +Herb +Herbert +Heriberto +Herlinda +Herma +Herman +Hermelinda +Hermila +Hermina +Hermine +Herminia +Herschel +Hershel +Herta +Hertha +Hester +Hettie +Hiedi +Hien +Hilaria +Hilario +Hilary +Hilda +Hilde +Hildegard +Hildegarde +Hildred +Hillary +Hilma +Hilton +Hipolito +Hiram +Hiroko +Hisako +Hoa +Hobert +Holley +Holli +Hollie +Hollis +Holly +Homer +Honey +Hong +Hope +Horace +Horacio +Hortencia +Hortense +Hortensia +Hosea +Houston +Howard +Hoyt +Hsiu +Hubert +Hue +Huey +Hugh +Hugo +Hui +Hulda +Humberto +Hung +Hunter +Huong +Hwa +Hyacinth +Hye +Hyman +Hyo +Hyon +Hyun +Ian +Ida +Idalia +Idell +Idella +Iesha +Ignacia +Ignacio +Ike +Ila +Ilana +Ilda +Ileana +Ileen +Ilene +Iliana +Illa +Ilona +Ilse +Iluminada +Ima +Imelda +Imogene +In +Ina +India +Indira +Inell +Ines +Inez +Inga +Inge +Ingeborg +Inger +Ingrid +Inocencia +Iola +Iona +Ione +Ira +Iraida +Irena +Irene +Irina +Iris +Irish +Irma +Irmgard +Irvin +Irving +Irwin +Isa +Isaac +Isabel +Isabell +Isabella +Isabelle +Isadora +Isaiah +Isaias +Isaura +Isela +Isiah +Isidra +Isidro +Isis +Ismael +Isobel +Israel +Isreal +Issac +Iva +Ivan +Ivana +Ivelisse +Ivette +Ivey +Ivonne +Ivory +Ivy +Izetta +Izola +Ja +Jacalyn +Jacelyn +Jacinda +Jacinta +Jacinto +Jack +Jackeline +Jackelyn +Jacki +Jackie +Jacklyn +Jackqueline +Jackson +Jaclyn +Jacob +Jacqualine +Jacque +Jacquelin +Jacqueline +Jacquelyn +Jacquelyne +Jacquelynn +Jacques +Jacquetta +Jacqui +Jacquie +Jacquiline +Jacquline +Jacqulyn +Jada +Jade +Jadwiga +Jae +Jaime +Jaimee +Jaimie +Jake +Jaleesa +Jalisa +Jama +Jamaal +Jamal +Jamar +Jame +Jamee +Jamel +James +Jamey +Jami +Jamie +Jamika +Jamila +Jamison +Jammie +Jan +Jana +Janae +Janay +Jane +Janean +Janee +Janeen +Janel +Janell +Janella +Janelle +Janene +Janessa +Janet +Janeth +Janett +Janetta +Janette +Janey +Jani +Janice +Janie +Janiece +Janina +Janine +Janis +Janise +Janita +Jann +Janna +Jannet +Jannette +Jannie +January +Janyce +Jaqueline +Jaquelyn +Jared +Jarod +Jarred +Jarrett +Jarrod +Jarvis +Jasmin +Jasmine +Jason +Jasper +Jaunita +Javier +Jay +Jaye +Jayme +Jaymie +Jayna +Jayne +Jayson +Jazmin +Jazmine +Jc +Jean +Jeana +Jeane +Jeanelle +Jeanene +Jeanett +Jeanetta +Jeanette +Jeanice +Jeanie +Jeanine +Jeanmarie +Jeanna +Jeanne +Jeannetta +Jeannette +Jeannie +Jeannine +Jed +Jeff +Jefferey +Jefferson +Jeffery +Jeffie +Jeffrey +Jeffry +Jen +Jena +Jenae +Jene +Jenee +Jenell +Jenelle +Jenette +Jeneva +Jeni +Jenice +Jenifer +Jeniffer +Jenine +Jenise +Jenna +Jennefer +Jennell +Jennette +Jenni +Jennie +Jennifer +Jenniffer +Jennine +Jenny +Jerald +Jeraldine +Jeramy +Jere +Jeremiah +Jeremy +Jeri +Jerica +Jerilyn +Jerlene +Jermaine +Jerold +Jerome +Jeromy +Jerrell +Jerri +Jerrica +Jerrie +Jerrod +Jerrold +Jerry +Jesenia +Jesica +Jess +Jesse +Jessenia +Jessi +Jessia +Jessica +Jessie +Jessika +Jestine +Jesus +Jesusa +Jesusita +Jetta +Jettie +Jewel +Jewell +Ji +Jill +Jillian +Jim +Jimmie +Jimmy +Jin +Jina +Jinny +Jo +Joan +Joana +Joane +Joanie +Joann +Joanna +Joanne +Joannie +Joaquin +Joaquina +Jocelyn +Jodee +Jodi +Jodie +Jody +Joe +Joeann +Joel +Joella +Joelle +Joellen +Joesph +Joetta +Joette +Joey +Johana +Johanna +Johanne +John +Johna +Johnathan +Johnathon +Johnetta +Johnette +Johnie +Johnna +Johnnie +Johnny +Johnsie +Johnson +Joi +Joie +Jolanda +Joleen +Jolene +Jolie +Joline +Jolyn +Jolynn +Jon +Jona +Jonah +Jonas +Jonathan +Jonathon +Jone +Jonell +Jonelle +Jong +Joni +Jonie +Jonna +Jonnie +Jordan +Jordon +Jorge +Jose +Josef +Josefa +Josefina +Josefine +Joselyn +Joseph +Josephina +Josephine +Josette +Josh +Joshua +Josiah +Josie +Joslyn +Jospeh +Josphine +Josue +Jovan +Jovita +Joy +Joya +Joyce +Joycelyn +Joye +Juan +Juana +Juanita +Jude +Judi +Judie +Judith +Judson +Judy +Jule +Julee +Julene +Jules +Juli +Julia +Julian +Juliana +Juliane +Juliann +Julianna +Julianne +Julie +Julieann +Julienne +Juliet +Julieta +Julietta +Juliette +Julio +Julissa +Julius +June +Jung +Junie +Junior +Junita +Junko +Justa +Justin +Justina +Justine +Jutta +Ka +Kacey +Kaci +Kacie +Kacy +Kai +Kaila +Kaitlin +Kaitlyn +Kala +Kaleigh +Kaley +Kali +Kallie +Kalyn +Kam +Kamala +Kami +Kamilah +Kandace +Kandi +Kandice +Kandis +Kandra +Kandy +Kanesha +Kanisha +Kara +Karan +Kareem +Kareen +Karen +Karena +Karey +Kari +Karie +Karima +Karin +Karina +Karine +Karisa +Karissa +Karl +Karla +Karleen +Karlene +Karly +Karlyn +Karma +Karmen +Karol +Karole +Karoline +Karolyn +Karon +Karren +Karri +Karrie +Karry +Kary +Karyl +Karyn +Kasandra +Kasey +Kasha +Kasi +Kasie +Kassandra +Kassie +Kate +Katelin +Katelyn +Katelynn +Katerine +Kathaleen +Katharina +Katharine +Katharyn +Kathe +Katheleen +Katherin +Katherina +Katherine +Kathern +Katheryn +Kathey +Kathi +Kathie +Kathleen +Kathlene +Kathline +Kathlyn +Kathrin +Kathrine +Kathryn +Kathryne +Kathy +Kathyrn +Kati +Katia +Katie +Katina +Katlyn +Katrice +Katrina +Kattie +Katy +Kay +Kayce +Kaycee +Kaye +Kayla +Kaylee +Kayleen +Kayleigh +Kaylene +Kazuko +Kecia +Keeley +Keely +Keena +Keenan +Keesha +Keiko +Keila +Keira +Keisha +Keith +Keitha +Keli +Kelle +Kellee +Kelley +Kelli +Kellie +Kelly +Kellye +Kelsey +Kelsi +Kelsie +Kelvin +Kemberly +Ken +Kena +Kenda +Kendal +Kendall +Kendra +Kendrick +Keneth +Kenia +Kenisha +Kenna +Kenneth +Kennith +Kenny +Kent +Kenton +Kenya +Kenyatta +Kenyetta +Kera +Keren +Keri +Kermit +Kerri +Kerrie +Kerry +Kerstin +Kesha +Keshia +Keturah +Keva +Keven +Kevin +Khadijah +Khalilah +Kia +Kiana +Kiara +Kiera +Kiersten +Kiesha +Kieth +Kiley +Kim +Kimber +Kimberely +Kimberlee +Kimberley +Kimberli +Kimberlie +Kimberly +Kimbery +Kimbra +Kimi +Kimiko +Kina +Kindra +King +Kip +Kira +Kirby +Kirk +Kirsten +Kirstie +Kirstin +Kisha +Kit +Kittie +Kitty +Kiyoko +Kizzie +Kizzy +Klara +Korey +Kori +Kortney +Kory +Kourtney +Kraig +Kris +Krishna +Krissy +Krista +Kristal +Kristan +Kristeen +Kristel +Kristen +Kristi +Kristian +Kristie +Kristin +Kristina +Kristine +Kristle +Kristofer +Kristopher +Kristy +Kristyn +Krysta +Krystal +Krysten +Krystin +Krystina +Krystle +Krystyna +Kum +Kurt +Kurtis +Kyla +Kyle +Kylee +Kylie +Kym +Kymberly +Kyoko +Kyong +Kyra +Kyung +Lacey +Lachelle +Laci +Lacie +Lacresha +Lacy +Ladawn +Ladonna +Lady +Lael +Lahoma +Lai +Laila +Laine +Lajuana +Lakeesha +Lakeisha +Lakendra +Lakenya +Lakesha +Lakeshia +Lakia +Lakiesha +Lakisha +Lakita +Lala +Lamar +Lamonica +Lamont +Lan +Lana +Lance +Landon +Lane +Lanell +Lanelle +Lanette +Lang +Lani +Lanie +Lanita +Lannie +Lanny +Lanora +Laquanda +Laquita +Lara +Larae +Laraine +Laree +Larhonda +Larisa +Larissa +Larita +Laronda +Larraine +Larry +Larue +Lasandra +Lashanda +Lashandra +Lashaun +Lashaunda +Lashawn +Lashawna +Lashawnda +Lashay +Lashell +Lashon +Lashonda +Lashunda +Lasonya +Latanya +Latarsha +Latasha +Latashia +Latesha +Latia +Laticia +Latina +Latisha +Latonia +Latonya +Latoria +Latosha +Latoya +Latoyia +Latrice +Latricia +Latrina +Latrisha +Launa +Laura +Lauralee +Lauran +Laure +Laureen +Laurel +Lauren +Laurena +Laurence +Laurene +Lauretta +Laurette +Lauri +Laurice +Laurie +Laurinda +Laurine +Lauryn +Lavada +Lavelle +Lavenia +Lavera +Lavern +Laverna +Laverne +Laveta +Lavette +Lavina +Lavinia +Lavon +Lavona +Lavonda +Lavone +Lavonia +Lavonna +Lavonne +Lawana +Lawanda +Lawanna +Lawerence +Lawrence +Layla +Layne +Lazaro +Le +Lea +Leah +Lean +Leana +Leandra +Leandro +Leann +Leanna +Leanne +Leanora +Leatha +Leatrice +Lecia +Leda +Lee +Leeann +Leeanna +Leeanne +Leena +Leesa +Leia +Leida +Leif +Leigh +Leigha +Leighann +Leila +Leilani +Leisa +Leisha +Lekisha +Lela +Lelah +Leland +Lelia +Lemuel +Len +Lena +Lenard +Lenita +Lenna +Lennie +Lenny +Lenora +Lenore +Leo +Leola +Leoma +Leon +Leona +Leonard +Leonarda +Leonardo +Leone +Leonel +Leonia +Leonida +Leonie +Leonila +Leonor +Leonora +Leonore +Leontine +Leopoldo +Leora +Leota +Lera +Leroy +Les +Lesa +Lesha +Lesia +Leslee +Lesley +Lesli +Leslie +Lessie +Lester +Leta +Letha +Leticia +Letisha +Letitia +Lettie +Letty +Levi +Lewis +Lexie +Lezlie +Li +Lia +Liana +Liane +Lianne +Libbie +Libby +Liberty +Librada +Lida +Lidia +Lien +Lieselotte +Ligia +Lila +Lili +Lilia +Lilian +Liliana +Lilla +Lilli +Lillia +Lilliam +Lillian +Lilliana +Lillie +Lilly +Lily +Lin +Lina +Lincoln +Linda +Lindsay +Lindsey +Lindsy +Lindy +Linette +Ling +Linh +Linn +Linnea +Linnie +Lino +Linsey +Linwood +Lionel +Lisa +Lisabeth +Lisandra +Lisbeth +Lise +Lisette +Lisha +Lissa +Lissette +Lita +Livia +Liz +Liza +Lizabeth +Lizbeth +Lizeth +Lizette +Lizzette +Lizzie +Lloyd +Loan +Logan +Loida +Lois +Loise +Lola +Lolita +Loma +Lon +Lona +Londa +Long +Loni +Lonna +Lonnie +Lonny +Lora +Loraine +Loralee +Lore +Lorean +Loree +Loreen +Lorelei +Loren +Lorena +Lorene +Lorenza +Lorenzo +Loreta +Loretta +Lorette +Lori +Loria +Loriann +Lorie +Lorilee +Lorina +Lorinda +Lorine +Loris +Lorita +Lorna +Lorraine +Lorretta +Lorri +Lorriane +Lorrie +Lorrine +Lory +Lottie +Lou +Louann +Louanne +Louella +Louetta +Louie +Louis +Louisa +Louise +Loura +Lourdes +Lourie +Louvenia +Love +Lovella +Lovetta +Lovie +Lowell +Loyce +Loyd +Lu +Luana +Luann +Luanna +Luanne +Luba +Lucas +Luci +Lucia +Luciana +Luciano +Lucie +Lucien +Lucienne +Lucila +Lucile +Lucilla +Lucille +Lucina +Lucinda +Lucio +Lucius +Lucrecia +Lucretia +Lucy +Ludie +Ludivina +Lue +Luella +Luetta +Luigi +Luis +Luisa +Luise +Luke +Lula +Lulu +Luna +Lupe +Lupita +Lura +Lurlene +Lurline +Luther +Luvenia +Luz +Lyda +Lydia +Lyla +Lyle +Lyman +Lyn +Lynda +Lyndia +Lyndon +Lyndsay +Lyndsey +Lynell +Lynelle +Lynetta +Lynette +Lynn +Lynna +Lynne +Lynnette +Lynsey +Lynwood +Ma +Mabel +Mabelle +Mable +Mac +Machelle +Macie +Mack +Mackenzie +Macy +Madalene +Madaline +Madalyn +Maddie +Madelaine +Madeleine +Madelene +Madeline +Madelyn +Madge +Madie +Madison +Madlyn +Madonna +Mae +Maegan +Mafalda +Magali +Magaly +Magan +Magaret +Magda +Magdalen +Magdalena +Magdalene +Magen +Maggie +Magnolia +Mahalia +Mai +Maia +Maida +Maile +Maira +Maire +Maisha +Maisie +Major +Majorie +Makeda +Malcolm +Malcom +Malena +Malia +Malik +Malika +Malinda +Malisa +Malissa +Malka +Mallie +Mallory +Malorie +Malvina +Mamie +Mammie +Man +Mana +Manda +Mandi +Mandie +Mandy +Manie +Manual +Manuel +Manuela +Many +Mao +Maple +Mara +Maragaret +Maragret +Maranda +Marc +Marcel +Marcela +Marcelene +Marcelina +Marceline +Marcelino +Marcell +Marcella +Marcelle +Marcellus +Marcelo +Marcene +Marchelle +Marci +Marcia +Marcie +Marco +Marcos +Marcus +Marcy +Mardell +Maren +Marg +Margaret +Margareta +Margarete +Margarett +Margaretta +Margarette +Margarita +Margarite +Margarito +Margart +Marge +Margene +Margeret +Margert +Margery +Marget +Margherita +Margie +Margit +Margo +Margorie +Margot +Margret +Margrett +Marguerita +Marguerite +Margurite +Margy +Marhta +Mari +Maria +Mariah +Mariam +Marian +Mariana +Marianela +Mariann +Marianna +Marianne +Mariano +Maribel +Maribeth +Marica +Maricela +Maricruz +Marie +Mariel +Mariela +Mariella +Marielle +Marietta +Mariette +Mariko +Marilee +Marilou +Marilu +Marilyn +Marilynn +Marin +Marina +Marinda +Marine +Mario +Marion +Maris +Marisa +Marisela +Marisha +Marisol +Marissa +Marita +Maritza +Marivel +Marjorie +Marjory +Mark +Marketta +Markita +Markus +Marla +Marlana +Marleen +Marlen +Marlena +Marlene +Marlin +Marline +Marlo +Marlon +Marlyn +Marlys +Marna +Marni +Marnie +Marquerite +Marquetta +Marquis +Marquita +Marquitta +Marry +Marsha +Marshall +Marta +Marth +Martha +Marti +Martin +Martina +Martine +Marty +Marva +Marvel +Marvella +Marvin +Marvis +Marx +Mary +Marya +Maryalice +Maryam +Maryann +Maryanna +Maryanne +Marybelle +Marybeth +Maryellen +Maryetta +Maryjane +Maryjo +Maryland +Marylee +Marylin +Maryln +Marylou +Marylouise +Marylyn +Marylynn +Maryrose +Masako +Mason +Matha +Mathew +Mathilda +Mathilde +Matilda +Matilde +Matt +Matthew +Mattie +Maud +Maude +Maudie +Maura +Maureen +Maurice +Mauricio +Maurine +Maurita +Mauro +Mavis +Max +Maxie +Maxima +Maximina +Maximo +Maxine +Maxwell +May +Maya +Maybell +Maybelle +Maye +Mayme +Maynard +Mayola +Mayra +Mazie +Mckenzie +Mckinley +Meagan +Meaghan +Mechelle +Meda +Mee +Meg +Megan +Meggan +Meghan +Meghann +Mei +Mel +Melaine +Melani +Melania +Melanie +Melany +Melba +Melda +Melia +Melida +Melina +Melinda +Melisa +Melissa +Melissia +Melita +Mellie +Mellisa +Mellissa +Melodee +Melodi +Melodie +Melody +Melonie +Melony +Melva +Melvin +Melvina +Melynda +Mendy +Mercedes +Mercedez +Mercy +Meredith +Meri +Merideth +Meridith +Merilyn +Merissa +Merle +Merlene +Merlin +Merlyn +Merna +Merri +Merrie +Merrilee +Merrill +Merry +Mertie +Mervin +Meryl +Meta +Mi +Mia +Mica +Micaela +Micah +Micha +Michael +Michaela +Michaele +Michal +Michale +Micheal +Michel +Michele +Michelina +Micheline +Michell +Michelle +Michiko +Mickey +Micki +Mickie +Miesha +Migdalia +Mignon +Miguel +Miguelina +Mika +Mikaela +Mike +Mikel +Miki +Mikki +Mila +Milagro +Milagros +Milan +Milda +Mildred +Miles +Milford +Milissa +Millard +Millicent +Millie +Milly +Milo +Milton +Mimi +Min +Mina +Minda +Mindi +Mindy +Minerva +Ming +Minh +Minna +Minnie +Minta +Miquel +Mira +Miranda +Mireille +Mirella +Mireya +Miriam +Mirian +Mirna +Mirta +Mirtha +Misha +Miss +Missy +Misti +Mistie +Misty +Mitch +Mitchel +Mitchell +Mitsue +Mitsuko +Mittie +Mitzi +Mitzie +Miyoko +Modesta +Modesto +Mohamed +Mohammad +Mohammed +Moira +Moises +Mollie +Molly +Mona +Monet +Monica +Monika +Monique +Monnie +Monroe +Monserrate +Monte +Monty +Moon +Mora +Morgan +Moriah +Morris +Morton +Mose +Moses +Moshe +Mozell +Mozella +Mozelle +Mui +Muoi +Muriel +Murray +My +Myesha +Myles +Myong +Myra +Myriam +Myrl +Myrle +Myrna +Myron +Myrta +Myrtice +Myrtie +Myrtis +Myrtle +Myung +Na +Nada +Nadene +Nadia +Nadine +Naida +Nakesha +Nakia +Nakisha +Nakita +Nam +Nan +Nana +Nancee +Nancey +Nanci +Nancie +Nancy +Nanette +Nannette +Nannie +Naoma +Naomi +Napoleon +Narcisa +Natacha +Natalia +Natalie +Natalya +Natasha +Natashia +Nathalie +Nathan +Nathanael +Nathanial +Nathaniel +Natisha +Natividad +Natosha +Neal +Necole +Ned +Neda +Nedra +Neely +Neida +Neil +Nelda +Nelia +Nelida +Nell +Nella +Nelle +Nellie +Nelly +Nelson +Nena +Nenita +Neoma +Neomi +Nereida +Nerissa +Nery +Nestor +Neta +Nettie +Neva +Nevada +Neville +Newton +Nga +Ngan +Ngoc +Nguyet +Nia +Nichelle +Nichol +Nicholas +Nichole +Nicholle +Nick +Nicki +Nickie +Nickolas +Nickole +Nicky +Nicol +Nicola +Nicolas +Nicolasa +Nicole +Nicolette +Nicolle +Nida +Nidia +Niesha +Nieves +Nigel +Niki +Nikia +Nikita +Nikki +Nikole +Nila +Nilda +Nilsa +Nina +Ninfa +Nisha +Nita +Noah +Noble +Nobuko +Noe +Noel +Noelia +Noella +Noelle +Noemi +Nohemi +Nola +Nolan +Noma +Nona +Nora +Norah +Norbert +Norberto +Noreen +Norene +Noriko +Norine +Norma +Norman +Normand +Norris +Nova +Novella +Nu +Nubia +Numbers +Nydia +Nyla +Obdulia +Ocie +Octavia +Octavio +Oda +Odelia +Odell +Odessa +Odette +Odilia +Odis +Ofelia +Ok +Ola +Olen +Olene +Oleta +Olevia +Olga +Olimpia +Olin +Olinda +Oliva +Olive +Oliver +Olivia +Ollie +Olympia +Oma +Omar +Omega +Omer +Ona +Oneida +Onie +Onita +Opal +Ophelia +Ora +Oralee +Oralia +Oren +Oretha +Orlando +Orpha +Orval +Orville +Oscar +Ossie +Osvaldo +Oswaldo +Otelia +Otha +Otilia +Otis +Otto +Ouida +Owen +Ozell +Ozella +Ozie +Pa +Pablo +Page +Paige +Palma +Palmer +Palmira +Pam +Pamala +Pamela +Pamelia +Pamella +Pamila +Pamula +Pandora +Pansy +Paola +Paris +Parker +Parthenia +Particia +Pasquale +Pasty +Pat +Patience +Patria +Patrica +Patrice +Patricia +Patrick +Patrina +Patsy +Patti +Pattie +Patty +Paul +Paula +Paulene +Pauletta +Paulette +Paulina +Pauline +Paulita +Paz +Pearl +Pearle +Pearlene +Pearlie +Pearline +Pearly +Pedro +Peg +Peggie +Peggy +Pei +Penelope +Penney +Penni +Pennie +Penny +Percy +Perla +Perry +Pete +Peter +Petra +Petrina +Petronila +Phebe +Phil +Philip +Phillip +Phillis +Philomena +Phoebe +Phung +Phuong +Phylicia +Phylis +Phyliss +Phyllis +Pia +Piedad +Pierre +Pilar +Ping +Pinkie +Piper +Pok +Polly +Porfirio +Porsche +Porsha +Porter +Portia +Precious +Preston +Pricilla +Prince +Princess +Priscila +Priscilla +Providencia +Prudence +Pura +Qiana +Queen +Queenie +Quentin +Quiana +Quincy +Quinn +Quintin +Quinton +Quyen +Rachael +Rachal +Racheal +Rachel +Rachele +Rachell +Rachelle +Racquel +Rae +Raeann +Raelene +Rafael +Rafaela +Raguel +Raina +Raisa +Raleigh +Ralph +Ramiro +Ramon +Ramona +Ramonita +Rana +Ranae +Randa +Randal +Randall +Randee +Randell +Randi +Randolph +Randy +Ranee +Raphael +Raquel +Rashad +Rasheeda +Rashida +Raul +Raven +Ray +Raye +Rayford +Raylene +Raymon +Raymond +Raymonde +Raymundo +Rayna +Rea +Reagan +Reanna +Reatha +Reba +Rebbeca +Rebbecca +Rebeca +Rebecca +Rebecka +Rebekah +Reda +Reed +Reena +Refugia +Refugio +Regan +Regena +Regenia +Reggie +Regina +Reginald +Regine +Reginia +Reid +Reiko +Reina +Reinaldo +Reita +Rema +Remedios +Remona +Rena +Renae +Renaldo +Renata +Renate +Renato +Renay +Renda +Rene +Renea +Renee +Renetta +Renita +Renna +Ressie +Reta +Retha +Retta +Reuben +Reva +Rex +Rey +Reyes +Reyna +Reynalda +Reynaldo +Rhea +Rheba +Rhett +Rhiannon +Rhoda +Rhona +Rhonda +Ria +Ricarda +Ricardo +Rich +Richard +Richelle +Richie +Rick +Rickey +Ricki +Rickie +Ricky +Rico +Rigoberto +Rikki +Riley +Rima +Rina +Risa +Rita +Riva +Rivka +Rob +Robbi +Robbie +Robbin +Robby +Robbyn +Robena +Robert +Roberta +Roberto +Robin +Robt +Robyn +Rocco +Rochel +Rochell +Rochelle +Rocio +Rocky +Rod +Roderick +Rodger +Rodney +Rodolfo +Rodrick +Rodrigo +Rogelio +Roger +Roland +Rolanda +Rolande +Rolando +Rolf +Rolland +Roma +Romaine +Roman +Romana +Romelia +Romeo +Romona +Ron +Rona +Ronald +Ronda +Roni +Ronna +Ronni +Ronnie +Ronny +Roosevelt +Rory +Rosa +Rosalba +Rosalee +Rosalia +Rosalie +Rosalina +Rosalind +Rosalinda +Rosaline +Rosalva +Rosalyn +Rosamaria +Rosamond +Rosana +Rosann +Rosanna +Rosanne +Rosaria +Rosario +Rosaura +Roscoe +Rose +Roseann +Roseanna +Roseanne +Roselee +Roselia +Roseline +Rosella +Roselle +Roselyn +Rosemarie +Rosemary +Rosena +Rosenda +Rosendo +Rosetta +Rosette +Rosia +Rosie +Rosina +Rosio +Rosita +Roslyn +Ross +Rossana +Rossie +Rosy +Rowena +Roxana +Roxane +Roxann +Roxanna +Roxanne +Roxie +Roxy +Roy +Royal +Royce +Rozanne +Rozella +Ruben +Rubi +Rubie +Rubin +Ruby +Rubye +Rudolf +Rudolph +Rudy +Rueben +Rufina +Rufus +Rupert +Russ +Russel +Russell +Rusty +Ruth +Rutha +Ruthann +Ruthanne +Ruthe +Ruthie +Ryan +Ryann +Sabina +Sabine +Sabra +Sabrina +Sacha +Sachiko +Sade +Sadie +Sadye +Sage +Sal +Salena +Salina +Salley +Sallie +Sally +Salome +Salvador +Salvatore +Sam +Samantha +Samara +Samatha +Samella +Samira +Sammie +Sammy +Samual +Samuel +Sana +Sanda +Sandee +Sandi +Sandie +Sandra +Sandy +Sanford +Sang +Sanjuana +Sanjuanita +Sanora +Santa +Santana +Santiago +Santina +Santo +Santos +Sara +Sarah +Sarai +Saran +Sari +Sarina +Sarita +Sasha +Saturnina +Sau +Saul +Saundra +Savanna +Savannah +Scarlet +Scarlett +Scot +Scott +Scottie +Scotty +Sean +Season +Sebastian +Sebrina +See +Seema +Selena +Selene +Selina +Selma +Sena +Senaida +September +Serafina +Serena +Sergio +Serina +Serita +Seth +Setsuko +Seymour +Sha +Shad +Shae +Shaina +Shakia +Shakira +Shakita +Shala +Shalanda +Shalon +Shalonda +Shameka +Shamika +Shan +Shana +Shanae +Shanda +Shandi +Shandra +Shane +Shaneka +Shanel +Shanell +Shanelle +Shani +Shanice +Shanika +Shaniqua +Shanita +Shanna +Shannan +Shannon +Shanon +Shanta +Shantae +Shantay +Shante +Shantel +Shantell +Shantelle +Shanti +Shaquana +Shaquita +Shara +Sharan +Sharda +Sharee +Sharell +Sharen +Shari +Sharice +Sharie +Sharika +Sharilyn +Sharita +Sharla +Sharleen +Sharlene +Sharmaine +Sharolyn +Sharon +Sharonda +Sharri +Sharron +Sharyl +Sharyn +Shasta +Shaun +Shauna +Shaunda +Shaunna +Shaunta +Shaunte +Shavon +Shavonda +Shavonne +Shawana +Shawanda +Shawanna +Shawn +Shawna +Shawnda +Shawnee +Shawnna +Shawnta +Shay +Shayla +Shayna +Shayne +Shea +Sheba +Sheena +Sheila +Sheilah +Shela +Shelba +Shelby +Sheldon +Shelia +Shella +Shelley +Shelli +Shellie +Shelly +Shelton +Shemeka +Shemika +Shena +Shenika +Shenita +Shenna +Shera +Sheree +Sherell +Sheri +Sherice +Sheridan +Sherie +Sherika +Sherill +Sherilyn +Sherise +Sherita +Sherlene +Sherley +Sherly +Sherlyn +Sherman +Sheron +Sherrell +Sherri +Sherrie +Sherril +Sherrill +Sherron +Sherry +Sherryl +Sherwood +Shery +Sheryl +Sheryll +Shiela +Shila +Shiloh +Shin +Shira +Shirely +Shirl +Shirlee +Shirleen +Shirlene +Shirley +Shirly +Shizue +Shizuko +Shon +Shona +Shonda +Shondra +Shonna +Shonta +Shoshana +Shu +Shyla +Sibyl +Sid +Sidney +Sierra +Signe +Sigrid +Silas +Silva +Silvana +Silvia +Sima +Simon +Simona +Simone +Simonne +Sina +Sindy +Siobhan +Sirena +Siu +Sixta +Skye +Slyvia +So +Socorro +Sofia +Soila +Sol +Solange +Soledad +Solomon +Somer +Sommer +Son +Sona +Sondra +Song +Sonia +Sonja +Sonny +Sonya +Soo +Sook +Soon +Sophia +Sophie +Soraya +Sparkle +Spencer +Spring +Stacee +Stacey +Staci +Stacia +Stacie +Stacy +Stan +Stanford +Stanley +Stanton +Star +Starla +Starr +Stasia +Stefan +Stefani +Stefania +Stefanie +Stefany +Steffanie +Stella +Stepanie +Stephaine +Stephan +Stephane +Stephani +Stephania +Stephanie +Stephany +Stephen +Stephenie +Stephine +Stephnie +Sterling +Steve +Steven +Stevie +Stewart +Stormy +Stuart +Su +Suanne +Sudie +Sue +Sueann +Suellen +Suk +Sulema +Sumiko +Summer +Sun +Sunday +Sung +Sunni +Sunny +Sunshine +Susan +Susana +Susann +Susanna +Susannah +Susanne +Susie +Susy +Suzan +Suzann +Suzanna +Suzanne +Suzette +Suzi +Suzie +Suzy +Svetlana +Sybil +Syble +Sydney +Sylvester +Sylvia +Sylvie +Synthia +Syreeta +Ta +Tabatha +Tabetha +Tabitha +Tad +Tai +Taina +Taisha +Tajuana +Takako +Takisha +Talia +Talisha +Talitha +Tam +Tama +Tamala +Tamar +Tamara +Tamatha +Tambra +Tameika +Tameka +Tamekia +Tamela +Tamera +Tamesha +Tami +Tamica +Tamie +Tamika +Tamiko +Tamisha +Tammara +Tammera +Tammi +Tammie +Tammy +Tamra +Tana +Tandra +Tandy +Taneka +Tanesha +Tangela +Tania +Tanika +Tanisha +Tanja +Tanna +Tanner +Tanya +Tara +Tarah +Taren +Tari +Tarra +Tarsha +Taryn +Tasha +Tashia +Tashina +Tasia +Tatiana +Tatum +Tatyana +Taunya +Tawana +Tawanda +Tawanna +Tawna +Tawny +Tawnya +Taylor +Tayna +Ted +Teddy +Teena +Tegan +Teisha +Telma +Temeka +Temika +Tempie +Temple +Tena +Tenesha +Tenisha +Tennie +Tennille +Teodora +Teodoro +Teofila +Tequila +Tera +Tereasa +Terence +Teresa +Terese +Teresia +Teresita +Teressa +Teri +Terica +Terina +Terisa +Terra +Terrance +Terrell +Terrence +Terresa +Terri +Terrie +Terrilyn +Terry +Tesha +Tess +Tessa +Tessie +Thad +Thaddeus +Thalia +Thanh +Thao +Thea +Theda +Thelma +Theo +Theodora +Theodore +Theola +Theresa +Therese +Theresia +Theressa +Theron +Thersa +Thi +Thomas +Thomasena +Thomasina +Thomasine +Thora +Thresa +Thu +Thurman +Thuy +Tia +Tiana +Tianna +Tiara +Tien +Tiera +Tierra +Tiesha +Tifany +Tiffaney +Tiffani +Tiffanie +Tiffany +Tiffiny +Tijuana +Tilda +Tillie +Tim +Timika +Timmy +Timothy +Tina +Tinisha +Tiny +Tisa +Tish +Tisha +Titus +Tobi +Tobias +Tobie +Toby +Toccara +Tod +Todd +Toi +Tom +Tomas +Tomasa +Tomeka +Tomi +Tomika +Tomiko +Tommie +Tommy +Tommye +Tomoko +Tona +Tonda +Tonette +Toney +Toni +Tonia +Tonie +Tonisha +Tonita +Tonja +Tony +Tonya +Tora +Tori +Torie +Torri +Torrie +Tory +Tosha +Toshia +Toshiko +Tova +Towanda +Toya +Tracee +Tracey +Traci +Tracie +Tracy +Tran +Trang +Travis +Treasa +Treena +Trena +Trent +Trenton +Tresa +Tressa +Tressie +Treva +Trevor +Trey +Tricia +Trina +Trinh +Trinidad +Trinity +Trish +Trisha +Trista +Tristan +Troy +Trudi +Trudie +Trudy +Trula +Truman +Tu +Tuan +Tula +Tuyet +Twana +Twanda +Twanna +Twila +Twyla +Ty +Tyesha +Tyisha +Tyler +Tynisha +Tyra +Tyree +Tyrell +Tyron +Tyrone +Tyson +Ula +Ulrike +Ulysses +Un +Una +Ursula +Usha +Ute +Vada +Val +Valarie +Valda +Valencia +Valene +Valentin +Valentina +Valentine +Valeri +Valeria +Valerie +Valery +Vallie +Valorie +Valrie +Van +Vance +Vanda +Vanesa +Vanessa +Vanetta +Vania +Vanita +Vanna +Vannesa +Vannessa +Vashti +Vasiliki +Vaughn +Veda +Velda +Velia +Vella +Velma +Velva +Velvet +Vena +Venessa +Venetta +Venice +Venita +Vennie +Venus +Veola +Vera +Verda +Verdell +Verdie +Verena +Vergie +Verla +Verlene +Verlie +Verline +Vern +Verna +Vernell +Vernetta +Vernia +Vernice +Vernie +Vernita +Vernon +Verona +Veronica +Veronika +Veronique +Versie +Vertie +Vesta +Veta +Vi +Vicenta +Vicente +Vickey +Vicki +Vickie +Vicky +Victor +Victoria +Victorina +Vida +Viki +Vikki +Vilma +Vina +Vince +Vincent +Vincenza +Vincenzo +Vinita +Vinnie +Viola +Violet +Violeta +Violette +Virgen +Virgie +Virgil +Virgilio +Virgina +Virginia +Vita +Vito +Viva +Vivan +Vivian +Viviana +Vivien +Vivienne +Von +Voncile +Vonda +Vonnie +Wade +Wai +Waldo +Walker +Wallace +Wally +Walter +Walton +Waltraud +Wan +Wanda +Waneta +Wanetta +Wanita +Ward +Warner +Warren +Wava +Waylon +Wayne +Wei +Weldon +Wen +Wendell +Wendi +Wendie +Wendolyn +Wendy +Wenona +Werner +Wes +Wesley +Weston +Whitley +Whitney +Wilber +Wilbert +Wilbur +Wilburn +Wilda +Wiley +Wilford +Wilfred +Wilfredo +Wilhelmina +Wilhemina +Will +Willa +Willard +Willena +Willene +Willetta +Willette +Willia +William +Williams +Willian +Willie +Williemae +Willis +Willodean +Willow +Willy +Wilma +Wilmer +Wilson +Wilton +Windy +Winford +Winfred +Winifred +Winnie +Winnifred +Winona +Winston +Winter +Wm +Wonda +Woodrow +Wyatt +Wynell +Wynona +Xavier +Xenia +Xiao +Xiomara +Xochitl +Xuan +Yadira +Yaeko +Yael +Yahaira +Yajaira +Yan +Yang +Yanira +Yasmin +Yasmine +Yasuko +Yee +Yelena +Yen +Yer +Yesenia +Yessenia +Yetta +Yevette +Yi +Ying +Yoko +Yolanda +Yolande +Yolando +Yolonda +Yon +Yong +Yoshie +Yoshiko +Youlanda +Young +Yu +Yuette +Yuk +Yuki +Yukiko +Yuko +Yulanda +Yun +Yung +Yuonne +Yuri +Yuriko +Yvette +Yvone +Yvonne +Zachariah +Zachary +Zachery +Zack +Zackary +Zada +Zaida +Zana +Zandra +Zane +Zelda +Zella +Zelma +Zena +Zenaida +Zenia +Zenobia +Zetta +Zina +Zita +Zoe +Zofia +Zoila +Zola +Zona +Zonia +Zora +Zoraida +Zula +Zulema +Zulma \ No newline at end of file diff --git a/bin/datamasking/firstnames_female.txt b/bin/datamasking/firstnames_female.txt new file mode 100644 index 0000000000..1f633e57dd --- /dev/null +++ b/bin/datamasking/firstnames_female.txt @@ -0,0 +1,4274 @@ +Abbey +Abbie +Abby +Abigail +Ada +Adah +Adaline +Adam +Addie +Adela +Adelaida +Adelaide +Adele +Adelia +Adelina +Adeline +Adell +Adella +Adelle +Adena +Adina +Adria +Adrian +Adriana +Adriane +Adrianna +Adrianne +Adrien +Adriene +Adrienne +Afton +Agatha +Agnes +Agnus +Agripina +Agueda +Agustina +Ai +Aida +Aide +Aiko +Aileen +Ailene +Aimee +Aisha +Aja +Akiko +Akilah +Alaina +Alaine +Alana +Alane +Alanna +Alayna +Alba +Albert +Alberta +Albertha +Albertina +Albertine +Albina +Alda +Alease +Alecia +Aleen +Aleida +Aleisha +Alejandra +Alejandrina +Alena +Alene +Alesha +Aleshia +Alesia +Alessandra +Aleta +Aletha +Alethea +Alethia +Alex +Alexa +Alexander +Alexandra +Alexandria +Alexia +Alexis +Alfreda +Alfredia +Ali +Alia +Alica +Alice +Alicia +Alida +Alina +Aline +Alisa +Alise +Alisha +Alishia +Alisia +Alison +Alissa +Alita +Alix +Aliza +Alla +Alleen +Allegra +Allen +Allena +Allene +Allie +Alline +Allison +Allyn +Allyson +Alma +Almeda +Almeta +Alona +Alpha +Alta +Altagracia +Altha +Althea +Alva +Alvera +Alverta +Alvina +Alyce +Alycia +Alysa +Alyse +Alysha +Alysia +Alyson +Alyssa +Amada +Amal +Amalia +Amanda +Amber +Amberly +Amee +Amelia +America +Ami +Amie +Amiee +Amina +Amira +Ammie +Amparo +Amy +An +Ana +Anabel +Analisa +Anamaria +Anastacia +Anastasia +Andera +Andra +Andre +Andrea +Andree +Andrew +Andria +Anette +Angel +Angela +Angele +Angelena +Angeles +Angelia +Angelic +Angelica +Angelika +Angelina +Angeline +Angelique +Angelita +Angella +Angelo +Angelyn +Angie +Angila +Angla +Angle +Anglea +Anh +Anika +Anisa +Anisha +Anissa +Anita +Anitra +Anja +Anjanette +Anjelica +Ann +Anna +Annabel +Annabell +Annabelle +Annalee +Annalisa +Annamae +Annamaria +Annamarie +Anne +Anneliese +Annelle +Annemarie +Annett +Annetta +Annette +Annice +Annie +Annika +Annis +Annita +Annmarie +Anthony +Antionette +Antoinette +Antonetta +Antonette +Antonia +Antonietta +Antonina +Antonio +Anya +Apolonia +April +Apryl +Ara +Araceli +Aracelis +Aracely +Arcelia +Ardath +Ardelia +Ardell +Ardella +Ardelle +Ardis +Ardith +Aretha +Argelia +Argentina +Ariana +Ariane +Arianna +Arianne +Arica +Arie +Ariel +Arielle +Arla +Arlean +Arleen +Arlena +Arlene +Arletha +Arletta +Arlette +Arlinda +Arline +Arlyne +Armanda +Armandina +Armida +Arminda +Arnetta +Arnette +Arnita +Arthur +Artie +Arvilla +Asha +Ashanti +Ashely +Ashlea +Ashlee +Ashleigh +Ashley +Ashli +Ashlie +Ashly +Ashlyn +Ashton +Asia +Asley +Assunta +Astrid +Asuncion +Athena +Aubrey +Audie +Audra +Audrea +Audrey +Audria +Audrie +Audry +Augusta +Augustina +Augustine +Aundrea +Aura +Aurea +Aurelia +Aurora +Aurore +Austin +Autumn +Ava +Avelina +Avery +Avis +Avril +Awilda +Ayako +Ayana +Ayanna +Ayesha +Azalee +Azucena +Azzie +Babara +Babette +Bailey +Bambi +Bao +Barabara +Barb +Barbar +Barbara +Barbera +Barbie +Barbra +Bari +Barrie +Basilia +Bea +Beata +Beatrice +Beatris +Beatriz +Beaulah +Bebe +Becki +Beckie +Becky +Bee +Belen +Belia +Belinda +Belkis +Bell +Bella +Belle +Belva +Benita +Bennie +Berenice +Berna +Bernadette +Bernadine +Bernarda +Bernardina +Bernardine +Berneice +Bernetta +Bernice +Bernie +Berniece +Bernita +Berry +Berta +Bertha +Bertie +Beryl +Bess +Bessie +Beth +Bethanie +Bethann +Bethany +Bethel +Betsey +Betsy +Bette +Bettie +Bettina +Betty +Bettyann +Bettye +Beula +Beulah +Bev +Beverlee +Beverley +Beverly +Bianca +Bibi +Billi +Billie +Billy +Billye +Birdie +Birgit +Blair +Blake +Blanca +Blanch +Blanche +Blondell +Blossom +Blythe +Bobbi +Bobbie +Bobby +Bobbye +Bobette +Bok +Bong +Bonita +Bonnie +Bonny +Branda +Brande +Brandee +Brandi +Brandie +Brandon +Brandy +Breana +Breann +Breanna +Breanne +Bree +Brenda +Brenna +Brett +Brian +Briana +Brianna +Brianne +Bridget +Bridgett +Bridgette +Brigette +Brigid +Brigida +Brigitte +Brinda +Britany +Britney +Britni +Britt +Britta +Brittaney +Brittani +Brittanie +Brittany +Britteny +Brittney +Brittni +Brittny +Bronwyn +Brook +Brooke +Bruna +Brunilda +Bryanna +Brynn +Buena +Buffy +Bula +Bulah +Bunny +Burma +Caitlin +Caitlyn +Calandra +Calista +Callie +Camelia +Camellia +Cameron +Cami +Camie +Camila +Camilla +Camille +Cammie +Cammy +Candace +Candance +Candelaria +Candi +Candice +Candida +Candie +Candis +Candra +Candy +Candyce +Caprice +Cara +Caren +Carey +Cari +Caridad +Carie +Carin +Carina +Carisa +Carissa +Carita +Carl +Carla +Carlee +Carleen +Carlena +Carlene +Carletta +Carley +Carli +Carlie +Carline +Carlita +Carlos +Carlota +Carlotta +Carly +Carlyn +Carma +Carman +Carmel +Carmela +Carmelia +Carmelina +Carmelita +Carmella +Carmen +Carmina +Carmon +Carol +Carola +Carolann +Carole +Carolee +Carolin +Carolina +Caroline +Caroll +Carolyn +Carolyne +Carolynn +Caron +Caroyln +Carri +Carrie +Carrol +Carroll +Carry +Cary +Caryl +Carylon +Caryn +Casandra +Casey +Casie +Casimira +Cassandra +Cassaundra +Cassey +Cassi +Cassidy +Cassie +Cassondra +Cassy +Catalina +Catarina +Caterina +Catharine +Catherin +Catherina +Catherine +Cathern +Catheryn +Cathey +Cathi +Cathie +Cathleen +Cathrine +Cathryn +Cathy +Catina +Catrice +Catrina +Cayla +Cecelia +Cecil +Cecila +Cecile +Cecilia +Cecille +Cecily +Celena +Celesta +Celeste +Celestina +Celestine +Celia +Celina +Celinda +Celine +Celsa +Ceola +Chae +Chan +Chana +Chanda +Chandra +Chanel +Chanell +Chanelle +Chang +Chantal +Chantay +Chante +Chantel +Chantell +Chantelle +Chara +Charis +Charise +Charissa +Charisse +Charita +Charity +Charla +Charleen +Charlena +Charlene +Charles +Charlesetta +Charlette +Charlie +Charline +Charlott +Charlotte +Charlsie +Charlyn +Charmain +Charmaine +Charolette +Chasidy +Chasity +Chassidy +Chastity +Chau +Chaya +Chelsea +Chelsey +Chelsie +Cher +Chere +Cheree +Cherelle +Cheri +Cherie +Cherilyn +Cherise +Cherish +Cherly +Cherlyn +Cherri +Cherrie +Cherry +Cherryl +Chery +Cheryl +Cheryle +Cheryll +Cheyenne +Chi +Chia +Chieko +Chin +China +Ching +Chiquita +Chloe +Chong +Chris +Chrissy +Christa +Christal +Christeen +Christel +Christen +Christena +Christene +Christi +Christia +Christian +Christiana +Christiane +Christie +Christin +Christina +Christine +Christinia +Christopher +Christy +Chrystal +Chu +Chun +Chung +Ciara +Cicely +Ciera +Cierra +Cinda +Cinderella +Cindi +Cindie +Cindy +Cinthia +Cira +Clair +Claire +Clara +Clare +Clarence +Claretha +Claretta +Claribel +Clarice +Clarinda +Clarine +Claris +Clarisa +Clarissa +Clarita +Classie +Claude +Claudette +Claudia +Claudie +Claudine +Clelia +Clemencia +Clementina +Clementine +Clemmie +Cleo +Cleopatra +Cleora +Cleotilde +Cleta +Clora +Clorinda +Clotilde +Clyde +Codi +Cody +Colby +Coleen +Colene +Coletta +Colette +Colleen +Collen +Collene +Collette +Concepcion +Conception +Concetta +Concha +Conchita +Connie +Constance +Consuela +Consuelo +Contessa +Cora +Coral +Coralee +Coralie +Corazon +Cordelia +Cordia +Cordie +Coreen +Corene +Coretta +Corey +Cori +Corie +Corina +Corine +Corinna +Corinne +Corliss +Cornelia +Corrie +Corrin +Corrina +Corrine +Corrinne +Cortney +Cory +Courtney +Creola +Cris +Criselda +Crissy +Crista +Cristal +Cristen +Cristi +Cristie +Cristin +Cristina +Cristine +Cristy +Cruz +Crysta +Crystal +Crystle +Cuc +Curtis +Cyndi +Cyndy +Cynthia +Cyrstal +Cythia +Dacia +Dagmar +Dagny +Dahlia +Daina +Daine +Daisey +Daisy +Dakota +Dale +Dalene +Dalia +Dalila +Dallas +Damaris +Dan +Dana +Danae +Danelle +Danette +Dani +Dania +Danica +Daniel +Daniela +Daniele +Daniell +Daniella +Danielle +Danika +Danille +Danita +Dann +Danna +Dannette +Dannie +Dannielle +Danuta +Danyel +Danyell +Danyelle +Daphine +Daphne +Dara +Darby +Darcel +Darcey +Darci +Darcie +Darcy +Daria +Darla +Darleen +Darlena +Darlene +Darline +Darnell +Daryl +David +Davida +Davina +Dawn +Dawna +Dawne +Dayle +Dayna +Daysi +Deadra +Dean +Deana +Deandra +Deandrea +Deane +Deann +Deanna +Deanne +Deb +Debbi +Debbie +Debbra +Debby +Debera +Debi +Debora +Deborah +Debra +Debrah +Debroah +Dede +Dedra +Dee +Deeann +Deeanna +Deedee +Deedra +Deena +Deetta +Deidra +Deidre +Deirdre +Deja +Delaine +Delana +Delcie +Delena +Delfina +Delia +Delicia +Delila +Delilah +Delinda +Delisa +Dell +Della +Delma +Delmy +Delois +Deloise +Delora +Deloras +Delores +Deloris +Delorse +Delpha +Delphia +Delphine +Delsie +Delta +Demetra +Demetria +Demetrice +Demetrius +Dena +Denae +Deneen +Denese +Denice +Denise +Denisha +Denisse +Denita +Denna +Dennis +Dennise +Denny +Denyse +Deon +Deonna +Desirae +Desire +Desiree +Despina +Dessie +Destiny +Detra +Devin +Devon +Devona +Devora +Devorah +Dia +Diamond +Dian +Diana +Diane +Diann +Dianna +Dianne +Diedra +Diedre +Dierdre +Digna +Dimple +Dina +Dinah +Dinorah +Dion +Dione +Dionna +Dionne +Divina +Dixie +Dodie +Dollie +Dolly +Dolores +Doloris +Domenica +Dominga +Dominica +Dominique +Dominque +Domitila +Domonique +Dona +Donald +Donella +Donetta +Donette +Dong +Donita +Donna +Donnetta +Donnette +Donnie +Donya +Dora +Dorathy +Dorcas +Doreatha +Doreen +Dorene +Doretha +Dorethea +Doretta +Dori +Doria +Dorian +Dorie +Dorinda +Dorine +Doris +Dorla +Dorotha +Dorothea +Dorothy +Dorris +Dortha +Dorthea +Dorthey +Dorthy +Dot +Dottie +Dotty +Dovie +Dreama +Drema +Drew +Drucilla +Drusilla +Dulce +Dulcie +Dung +Dusti +Dusty +Dwana +Dyan +Earlean +Earleen +Earlene +Earlie +Earline +Earnestine +Eartha +Easter +Eboni +Ebonie +Ebony +Echo +Eda +Edda +Eddie +Edelmira +Eden +Edie +Edith +Edna +Edra +Edris +Edward +Edwina +Edyth +Edythe +Effie +Ehtel +Eileen +Eilene +Ela +Eladia +Elaina +Elaine +Elana +Elane +Elanor +Elayne +Elba +Elda +Eldora +Eleanor +Eleanora +Eleanore +Elease +Elena +Elene +Eleni +Elenor +Elenora +Elenore +Eleonor +Eleonora +Eleonore +Elfreda +Elfrieda +Elfriede +Elia +Eliana +Elicia +Elida +Elidia +Elin +Elina +Elinor +Elinore +Elisa +Elisabeth +Elise +Elisha +Elissa +Eliz +Eliza +Elizabet +Elizabeth +Elizbeth +Elizebeth +Elke +Ella +Ellamae +Ellan +Ellen +Ellena +Elli +Ellie +Ellis +Elly +Ellyn +Elma +Elmer +Elmira +Elna +Elnora +Elodia +Elois +Eloisa +Eloise +Elouise +Elsa +Else +Elsie +Elsy +Elva +Elvera +Elvia +Elvie +Elvina +Elvira +Elwanda +Elyse +Elza +Ema +Emelda +Emelia +Emelina +Emeline +Emely +Emerald +Emerita +Emiko +Emilee +Emilia +Emilie +Emily +Emma +Emmaline +Emmie +Emmy +Emogene +Ena +Enda +Enedina +Eneida +Enid +Enola +Enriqueta +Epifania +Era +Eric +Erica +Ericka +Erika +Erin +Erinn +Erlene +Erlinda +Erline +Erma +Ermelinda +Erminia +Erna +Ernestina +Ernestine +Eryn +Esmeralda +Esperanza +Essie +Esta +Estefana +Estela +Estell +Estella +Estelle +Ester +Esther +Estrella +Etha +Ethel +Ethelene +Ethelyn +Ethyl +Etsuko +Etta +Ettie +Eufemia +Eugena +Eugene +Eugenia +Eugenie +Eula +Eulah +Eulalia +Eun +Euna +Eunice +Eura +Eusebia +Eustolia +Eva +Evalyn +Evan +Evangelina +Evangeline +Eve +Evelia +Evelin +Evelina +Eveline +Evelyn +Evelyne +Evelynn +Evette +Evia +Evie +Evita +Evon +Evonne +Ewa +Exie +Fabiola +Fae +Fairy +Faith +Fallon +Fannie +Fanny +Farah +Farrah +Fatima +Fatimah +Faustina +Faviola +Fawn +Fay +Faye +Fe +Felecia +Felica +Felice +Felicia +Felicidad +Felicita +Felicitas +Felipa +Felisa +Felisha +Fermina +Fern +Fernanda +Fernande +Ferne +Fidela +Fidelia +Filomena +Fiona +Flavia +Fleta +Flo +Flor +Flora +Florance +Florence +Florencia +Florene +Florentina +Floretta +Floria +Florida +Florinda +Florine +Florrie +Flossie +Floy +Fonda +Fran +France +Francene +Frances +Francesca +Franchesca +Francie +Francina +Francine +Francis +Francisca +Francisco +Francoise +Frank +Frankie +Fransisca +Fred +Freda +Fredda +Freddie +Frederica +Fredericka +Fredia +Fredricka +Freeda +Freida +Frida +Frieda +Fumiko +Gabriel +Gabriela +Gabriele +Gabriella +Gabrielle +Gail +Gala +Gale +Galina +Garnet +Garnett +Gary +Gay +Gaye +Gayla +Gayle +Gaylene +Gaynell +Gaynelle +Gearldine +Gema +Gemma +Gena +Gene +Genesis +Geneva +Genevie +Genevieve +Genevive +Genia +Genie +Genna +Gennie +Genny +Genoveva +Georgann +George +Georgeann +Georgeanna +Georgene +Georgetta +Georgette +Georgia +Georgiana +Georgiann +Georgianna +Georgianne +Georgie +Georgina +Georgine +Gerald +Geraldine +Geralyn +Gerda +Geri +Germaine +Gerri +Gerry +Gertha +Gertie +Gertrud +Gertrude +Gertrudis +Gertude +Ghislaine +Gia +Gianna +Gidget +Gigi +Gilberte +Gilda +Gillian +Gilma +Gina +Ginette +Ginger +Ginny +Giovanna +Gisela +Gisele +Giselle +Gita +Giuseppina +Gladis +Glady +Gladys +Glayds +Glenda +Glendora +Glenn +Glenna +Glennie +Glennis +Glinda +Gloria +Glory +Glynda +Glynis +Golda +Golden +Goldie +Grace +Gracia +Gracie +Graciela +Grayce +Grazyna +Gregoria +Gregory +Greta +Gretchen +Gretta +Gricelda +Grisel +Griselda +Guadalupe +Gudrun +Guillermina +Gussie +Gwen +Gwenda +Gwendolyn +Gwenn +Gwyn +Gwyneth +Ha +Hae +Hailey +Haley +Halina +Halley +Hallie +Han +Hana +Hang +Hanh +Hanna +Hannah +Hannelore +Harmony +Harold +Harriet +Harriett +Harriette +Hassie +Hattie +Haydee +Hayley +Hazel +Heather +Hedwig +Hedy +Hee +Heide +Heidi +Heidy +Heike +Helaine +Helen +Helena +Helene +Helga +Hellen +Henrietta +Henriette +Henry +Herlinda +Herma +Hermelinda +Hermila +Hermina +Hermine +Herminia +Herta +Hertha +Hester +Hettie +Hiedi +Hien +Hilaria +Hilary +Hilda +Hilde +Hildegard +Hildegarde +Hildred +Hillary +Hilma +Hiroko +Hisako +Hoa +Holley +Holli +Hollie +Hollis +Holly +Honey +Hong +Hope +Hortencia +Hortense +Hortensia +Hsiu +Hue +Hui +Hulda +Huong +Hwa +Hyacinth +Hye +Hyo +Hyon +Hyun +Ida +Idalia +Idell +Idella +Iesha +Ignacia +Ila +Ilana +Ilda +Ileana +Ileen +Ilene +Iliana +Illa +Ilona +Ilse +Iluminada +Ima +Imelda +Imogene +In +Ina +India +Indira +Inell +Ines +Inez +Inga +Inge +Ingeborg +Inger +Ingrid +Inocencia +Iola +Iona +Ione +Ira +Iraida +Irena +Irene +Irina +Iris +Irish +Irma +Irmgard +Isa +Isabel +Isabell +Isabella +Isabelle +Isadora +Isaura +Isela +Isidra +Isis +Isobel +Iva +Ivana +Ivelisse +Ivette +Ivey +Ivonne +Ivory +Ivy +Izetta +Izola +Ja +Jacalyn +Jacelyn +Jacinda +Jacinta +Jack +Jackeline +Jackelyn +Jacki +Jackie +Jacklyn +Jackqueline +Jaclyn +Jacqualine +Jacque +Jacquelin +Jacqueline +Jacquelyn +Jacquelyne +Jacquelynn +Jacquetta +Jacqui +Jacquie +Jacquiline +Jacquline +Jacqulyn +Jada +Jade +Jadwiga +Jae +Jaime +Jaimee +Jaimie +Jaleesa +Jalisa +Jama +Jame +Jamee +James +Jamey +Jami +Jamie +Jamika +Jamila +Jammie +Jan +Jana +Janae +Janay +Jane +Janean +Janee +Janeen +Janel +Janell +Janella +Janelle +Janene +Janessa +Janet +Janeth +Janett +Janetta +Janette +Janey +Jani +Janice +Janie +Janiece +Janina +Janine +Janis +Janise +Janita +Jann +Janna +Jannet +Jannette +Jannie +January +Janyce +Jaqueline +Jaquelyn +Jasmin +Jasmine +Jason +Jaunita +Jay +Jaye +Jayme +Jaymie +Jayna +Jayne +Jazmin +Jazmine +Jean +Jeana +Jeane +Jeanelle +Jeanene +Jeanett +Jeanetta +Jeanette +Jeanice +Jeanie +Jeanine +Jeanmarie +Jeanna +Jeanne +Jeannetta +Jeannette +Jeannie +Jeannine +Jeffie +Jeffrey +Jen +Jena +Jenae +Jene +Jenee +Jenell +Jenelle +Jenette +Jeneva +Jeni +Jenice +Jenifer +Jeniffer +Jenine +Jenise +Jenna +Jennefer +Jennell +Jennette +Jenni +Jennie +Jennifer +Jenniffer +Jennine +Jenny +Jeraldine +Jeremy +Jeri +Jerica +Jerilyn +Jerlene +Jerri +Jerrica +Jerrie +Jerry +Jesenia +Jesica +Jesse +Jessenia +Jessi +Jessia +Jessica +Jessie +Jessika +Jestine +Jesus +Jesusa +Jesusita +Jetta +Jettie +Jewel +Jewell +Ji +Jill +Jillian +Jimmie +Jimmy +Jin +Jina +Jinny +Jo +Joan +Joana +Joane +Joanie +Joann +Joanna +Joanne +Joannie +Joaquina +Jocelyn +Jodee +Jodi +Jodie +Jody +Joe +Joeann +Joel +Joella +Joelle +Joellen +Joetta +Joette +Joey +Johana +Johanna +Johanne +John +Johna +Johnetta +Johnette +Johnie +Johnna +Johnnie +Johnny +Johnsie +Joi +Joie +Jolanda +Joleen +Jolene +Jolie +Joline +Jolyn +Jolynn +Jon +Jona +Jone +Jonell +Jonelle +Jong +Joni +Jonie +Jonna +Jonnie +Jordan +Jose +Josefa +Josefina +Josefine +Joselyn +Joseph +Josephina +Josephine +Josette +Joshua +Josie +Joslyn +Josphine +Jovan +Jovita +Joy +Joya +Joyce +Joycelyn +Joye +Juan +Juana +Juanita +Jude +Judi +Judie +Judith +Judy +Jule +Julee +Julene +Juli +Julia +Julian +Juliana +Juliane +Juliann +Julianna +Julianne +Julie +Julieann +Julienne +Juliet +Julieta +Julietta +Juliette +Julio +Julissa +June +Jung +Junie +Junita +Junko +Justa +Justin +Justina +Justine +Jutta +Ka +Kacey +Kaci +Kacie +Kacy +Kai +Kaila +Kaitlin +Kaitlyn +Kala +Kaleigh +Kaley +Kali +Kallie +Kalyn +Kam +Kamala +Kami +Kamilah +Kandace +Kandi +Kandice +Kandis +Kandra +Kandy +Kanesha +Kanisha +Kara +Karan +Kareen +Karen +Karena +Karey +Kari +Karie +Karima +Karin +Karina +Karine +Karisa +Karissa +Karl +Karla +Karleen +Karlene +Karly +Karlyn +Karma +Karmen +Karol +Karole +Karoline +Karolyn +Karon +Karren +Karri +Karrie +Karry +Kary +Karyl +Karyn +Kasandra +Kasey +Kasha +Kasi +Kasie +Kassandra +Kassie +Kate +Katelin +Katelyn +Katelynn +Katerine +Kathaleen +Katharina +Katharine +Katharyn +Kathe +Katheleen +Katherin +Katherina +Katherine +Kathern +Katheryn +Kathey +Kathi +Kathie +Kathleen +Kathlene +Kathline +Kathlyn +Kathrin +Kathrine +Kathryn +Kathryne +Kathy +Kathyrn +Kati +Katia +Katie +Katina +Katlyn +Katrice +Katrina +Kattie +Katy +Kay +Kayce +Kaycee +Kaye +Kayla +Kaylee +Kayleen +Kayleigh +Kaylene +Kazuko +Kecia +Keeley +Keely +Keena +Keesha +Keiko +Keila +Keira +Keisha +Keith +Keitha +Keli +Kelle +Kellee +Kelley +Kelli +Kellie +Kelly +Kellye +Kelsey +Kelsi +Kelsie +Kemberly +Kena +Kenda +Kendal +Kendall +Kendra +Kenia +Kenisha +Kenna +Kenneth +Kenya +Kenyatta +Kenyetta +Kera +Keren +Keri +Kerri +Kerrie +Kerry +Kerstin +Kesha +Keshia +Keturah +Keva +Kevin +Khadijah +Khalilah +Kia +Kiana +Kiara +Kiera +Kiersten +Kiesha +Kiley +Kim +Kimber +Kimberely +Kimberlee +Kimberley +Kimberli +Kimberlie +Kimberly +Kimbery +Kimbra +Kimi +Kimiko +Kina +Kindra +Kira +Kirby +Kirsten +Kirstie +Kirstin +Kisha +Kit +Kittie +Kitty +Kiyoko +Kizzie +Kizzy +Klara +Kori +Kortney +Kourtney +Kris +Krishna +Krissy +Krista +Kristal +Kristan +Kristeen +Kristel +Kristen +Kristi +Kristian +Kristie +Kristin +Kristina +Kristine +Kristle +Kristy +Kristyn +Krysta +Krystal +Krysten +Krystin +Krystina +Krystle +Krystyna +Kum +Kyla +Kyle +Kylee +Kylie +Kym +Kymberly +Kyoko +Kyong +Kyra +Kyung +Lacey +Lachelle +Laci +Lacie +Lacresha +Lacy +Ladawn +Ladonna +Lady +Lael +Lahoma +Lai +Laila +Laine +Lajuana +Lakeesha +Lakeisha +Lakendra +Lakenya +Lakesha +Lakeshia +Lakia +Lakiesha +Lakisha +Lakita +Lala +Lamonica +Lan +Lana +Lane +Lanell +Lanelle +Lanette +Lang +Lani +Lanie +Lanita +Lannie +Lanora +Laquanda +Laquita +Lara +Larae +Laraine +Laree +Larhonda +Larisa +Larissa +Larita +Laronda +Larraine +Larry +Larue +Lasandra +Lashanda +Lashandra +Lashaun +Lashaunda +Lashawn +Lashawna +Lashawnda +Lashay +Lashell +Lashon +Lashonda +Lashunda +Lasonya +Latanya +Latarsha +Latasha +Latashia +Latesha +Latia +Laticia +Latina +Latisha +Latonia +Latonya +Latoria +Latosha +Latoya +Latoyia +Latrice +Latricia +Latrina +Latrisha +Launa +Laura +Lauralee +Lauran +Laure +Laureen +Laurel +Lauren +Laurena +Laurence +Laurene +Lauretta +Laurette +Lauri +Laurice +Laurie +Laurinda +Laurine +Lauryn +Lavada +Lavelle +Lavenia +Lavera +Lavern +Laverna +Laverne +Laveta +Lavette +Lavina +Lavinia +Lavon +Lavona +Lavonda +Lavone +Lavonia +Lavonna +Lavonne +Lawana +Lawanda +Lawanna +Lawrence +Layla +Layne +Le +Lea +Leah +Lean +Leana +Leandra +Leann +Leanna +Leanne +Leanora +Leatha +Leatrice +Lecia +Leda +Lee +Leeann +Leeanna +Leeanne +Leena +Leesa +Leia +Leida +Leigh +Leigha +Leighann +Leila +Leilani +Leisa +Leisha +Lekisha +Lela +Lelah +Lelia +Lena +Lenita +Lenna +Lennie +Lenora +Lenore +Leo +Leola +Leoma +Leon +Leona +Leonarda +Leone +Leonia +Leonida +Leonie +Leonila +Leonor +Leonora +Leonore +Leontine +Leora +Leota +Lera +Lesa +Lesha +Lesia +Leslee +Lesley +Lesli +Leslie +Lessie +Lester +Leta +Letha +Leticia +Letisha +Letitia +Lettie +Letty +Lewis +Lexie +Lezlie +Li +Lia +Liana +Liane +Lianne +Libbie +Libby +Liberty +Librada +Lida +Lidia +Lien +Lieselotte +Ligia +Lila +Lili +Lilia +Lilian +Liliana +Lilla +Lilli +Lillia +Lilliam +Lillian +Lilliana +Lillie +Lilly +Lily +Lin +Lina +Linda +Lindsay +Lindsey +Lindsy +Lindy +Linette +Ling +Linh +Linn +Linnea +Linnie +Linsey +Lisa +Lisabeth +Lisandra +Lisbeth +Lise +Lisette +Lisha +Lissa +Lissette +Lita +Livia +Liz +Liza +Lizabeth +Lizbeth +Lizeth +Lizette +Lizzette +Lizzie +Loan +Logan +Loida +Lois +Loise +Lola +Lolita +Loma +Lona +Londa +Loni +Lonna +Lonnie +Lora +Loraine +Loralee +Lore +Lorean +Loree +Loreen +Lorelei +Loren +Lorena +Lorene +Lorenza +Loreta +Loretta +Lorette +Lori +Loria +Loriann +Lorie +Lorilee +Lorina +Lorinda +Lorine +Loris +Lorita +Lorna +Lorraine +Lorretta +Lorri +Lorriane +Lorrie +Lorrine +Lory +Lottie +Lou +Louann +Louanne +Louella +Louetta +Louie +Louis +Louisa +Louise +Loura +Lourdes +Lourie +Louvenia +Love +Lovella +Lovetta +Lovie +Loyce +Lu +Luana +Luann +Luanna +Luanne +Luba +Luci +Lucia +Luciana +Lucie +Lucienne +Lucila +Lucile +Lucilla +Lucille +Lucina +Lucinda +Lucrecia +Lucretia +Lucy +Ludie +Ludivina +Lue +Luella +Luetta +Luis +Luisa +Luise +Lula +Lulu +Luna +Lupe +Lupita +Lura +Lurlene +Lurline +Luvenia +Luz +Lyda +Lydia +Lyla +Lyn +Lynda +Lyndia +Lyndsay +Lyndsey +Lynell +Lynelle +Lynetta +Lynette +Lynn +Lynna +Lynne +Lynnette +Lynsey +Ma +Mabel +Mabelle +Mable +Machelle +Macie +Mackenzie +Macy +Madalene +Madaline +Madalyn +Maddie +Madelaine +Madeleine +Madelene +Madeline +Madelyn +Madge +Madie +Madison +Madlyn +Madonna +Mae +Maegan +Mafalda +Magali +Magaly +Magan +Magaret +Magda +Magdalen +Magdalena +Magdalene +Magen +Maggie +Magnolia +Mahalia +Mai +Maia +Maida +Maile +Maira +Maire +Maisha +Maisie +Majorie +Makeda +Malena +Malia +Malika +Malinda +Malisa +Malissa +Malka +Mallie +Mallory +Malorie +Malvina +Mamie +Mammie +Man +Mana +Manda +Mandi +Mandie +Mandy +Manie +Manuela +Many +Mao +Maple +Mara +Maragaret +Maragret +Maranda +Marcela +Marcelene +Marcelina +Marceline +Marcell +Marcella +Marcelle +Marcene +Marchelle +Marci +Marcia +Marcie +Marcy +Mardell +Maren +Marg +Margaret +Margareta +Margarete +Margarett +Margaretta +Margarette +Margarita +Margarite +Margart +Marge +Margene +Margeret +Margert +Margery +Marget +Margherita +Margie +Margit +Margo +Margorie +Margot +Margret +Margrett +Marguerita +Marguerite +Margurite +Margy +Marhta +Mari +Maria +Mariah +Mariam +Marian +Mariana +Marianela +Mariann +Marianna +Marianne +Maribel +Maribeth +Marica +Maricela +Maricruz +Marie +Mariel +Mariela +Mariella +Marielle +Marietta +Mariette +Mariko +Marilee +Marilou +Marilu +Marilyn +Marilynn +Marin +Marina +Marinda +Marine +Mario +Marion +Maris +Marisa +Marisela +Marisha +Marisol +Marissa +Marita +Maritza +Marivel +Marjorie +Marjory +Mark +Marketta +Markita +Marla +Marlana +Marleen +Marlen +Marlena +Marlene +Marlin +Marline +Marlo +Marlyn +Marlys +Marna +Marni +Marnie +Marquerite +Marquetta +Marquita +Marquitta +Marry +Marsha +Marshall +Marta +Marth +Martha +Marti +Martin +Martina +Martine +Marty +Marva +Marvel +Marvella +Marvis +Marx +Mary +Marya +Maryalice +Maryam +Maryann +Maryanna +Maryanne +Marybelle +Marybeth +Maryellen +Maryetta +Maryjane +Maryjo +Maryland +Marylee +Marylin +Maryln +Marylou +Marylouise +Marylyn +Marylynn +Maryrose +Masako +Matha +Mathilda +Mathilde +Matilda +Matilde +Matthew +Mattie +Maud +Maude +Maudie +Maura +Maureen +Maurice +Maurine +Maurita +Mavis +Maxie +Maxima +Maximina +Maxine +May +Maya +Maybell +Maybelle +Maye +Mayme +Mayola +Mayra +Mazie +Mckenzie +Meagan +Meaghan +Mechelle +Meda +Mee +Meg +Megan +Meggan +Meghan +Meghann +Mei +Melaine +Melani +Melania +Melanie +Melany +Melba +Melda +Melia +Melida +Melina +Melinda +Melisa +Melissa +Melissia +Melita +Mellie +Mellisa +Mellissa +Melodee +Melodi +Melodie +Melody +Melonie +Melony +Melva +Melvin +Melvina +Melynda +Mendy +Mercedes +Mercedez +Mercy +Meredith +Meri +Merideth +Meridith +Merilyn +Merissa +Merle +Merlene +Merlyn +Merna +Merri +Merrie +Merrilee +Merrill +Merry +Mertie +Meryl +Meta +Mi +Mia +Mica +Micaela +Micah +Micha +Michael +Michaela +Michaele +Michal +Micheal +Michel +Michele +Michelina +Micheline +Michell +Michelle +Michiko +Mickey +Micki +Mickie +Miesha +Migdalia +Mignon +Miguelina +Mika +Mikaela +Mike +Miki +Mikki +Mila +Milagro +Milagros +Milda +Mildred +Milissa +Millicent +Millie +Milly +Mimi +Min +Mina +Minda +Mindi +Mindy +Minerva +Ming +Minh +Minna +Minnie +Minta +Mira +Miranda +Mireille +Mirella +Mireya +Miriam +Mirian +Mirna +Mirta +Mirtha +Misha +Miss +Missy +Misti +Mistie +Misty +Mitchell +Mitsue +Mitsuko +Mittie +Mitzi +Mitzie +Miyoko +Modesta +Moira +Mollie +Molly +Mona +Monet +Monica +Monika +Monique +Monnie +Monserrate +Moon +Mora +Morgan +Moriah +Mozell +Mozella +Mozelle +Mui +Muoi +Muriel +My +Myesha +Myong +Myra +Myriam +Myrl +Myrle +Myrna +Myrta +Myrtice +Myrtie +Myrtis +Myrtle +Myung +Na +Nada +Nadene +Nadia +Nadine +Naida +Nakesha +Nakia +Nakisha +Nakita +Nam +Nan +Nana +Nancee +Nancey +Nanci +Nancie +Nancy +Nanette +Nannette +Nannie +Naoma +Naomi +Narcisa +Natacha +Natalia +Natalie +Natalya +Natasha +Natashia +Nathalie +Natisha +Natividad +Natosha +Necole +Neda +Nedra +Neely +Neida +Nelda +Nelia +Nelida +Nell +Nella +Nelle +Nellie +Nelly +Nena +Nenita +Neoma +Neomi +Nereida +Nerissa +Nery +Neta +Nettie +Neva +Nevada +Nga +Ngan +Ngoc +Nguyet +Nia +Nichelle +Nichol +Nichole +Nicholle +Nicki +Nickie +Nickole +Nicky +Nicol +Nicola +Nicolasa +Nicole +Nicolette +Nicolle +Nida +Nidia +Niesha +Nieves +Niki +Nikia +Nikita +Nikki +Nikole +Nila +Nilda +Nilsa +Nina +Ninfa +Nisha +Nita +Nobuko +Noel +Noelia +Noella +Noelle +Noemi +Nohemi +Nola +Noma +Nona +Nora +Norah +Noreen +Norene +Noriko +Norine +Norma +Norman +Nova +Novella +Nu +Nubia +Numbers +Nydia +Nyla +Obdulia +Ocie +Octavia +Oda +Odelia +Odell +Odessa +Odette +Odilia +Ofelia +Ok +Ola +Olene +Oleta +Olevia +Olga +Olimpia +Olinda +Oliva +Olive +Olivia +Ollie +Olympia +Oma +Omega +Ona +Oneida +Onie +Onita +Opal +Ophelia +Ora +Oralee +Oralia +Oretha +Orpha +Oscar +Ossie +Otelia +Otha +Otilia +Ouida +Ozell +Ozella +Ozie +Pa +Page +Paige +Palma +Palmira +Pam +Pamala +Pamela +Pamelia +Pamella +Pamila +Pamula +Pandora +Pansy +Paola +Paris +Parthenia +Particia +Pasty +Pat +Patience +Patria +Patrica +Patrice +Patricia +Patrick +Patrina +Patsy +Patti +Pattie +Patty +Paul +Paula +Paulene +Pauletta +Paulette +Paulina +Pauline +Paulita +Paz +Pearl +Pearle +Pearlene +Pearlie +Pearline +Pearly +Peg +Peggie +Peggy +Pei +Penelope +Penney +Penni +Pennie +Penny +Perla +Perry +Peter +Petra +Petrina +Petronila +Phebe +Phillis +Philomena +Phoebe +Phung +Phuong +Phylicia +Phylis +Phyliss +Phyllis +Pia +Piedad +Pilar +Ping +Pinkie +Piper +Pok +Polly +Porsche +Porsha +Portia +Precious +Pricilla +Princess +Priscila +Priscilla +Providencia +Prudence +Pura +Qiana +Queen +Queenie +Quiana +Quinn +Quyen +Rachael +Rachal +Racheal +Rachel +Rachele +Rachell +Rachelle +Racquel +Rae +Raeann +Raelene +Rafaela +Raguel +Raina +Raisa +Ramona +Ramonita +Rana +Ranae +Randa +Randee +Randi +Randy +Ranee +Raquel +Rasheeda +Rashida +Raven +Ray +Raye +Raylene +Raymond +Raymonde +Rayna +Rea +Reagan +Reanna +Reatha +Reba +Rebbeca +Rebbecca +Rebeca +Rebecca +Rebecka +Rebekah +Reda +Reena +Refugia +Refugio +Regan +Regena +Regenia +Regina +Regine +Reginia +Reiko +Reina +Reita +Rema +Remedios +Remona +Rena +Renae +Renata +Renate +Renay +Renda +Rene +Renea +Renee +Renetta +Renita +Renna +Ressie +Reta +Retha +Retta +Reva +Reyna +Reynalda +Rhea +Rheba +Rhiannon +Rhoda +Rhona +Rhonda +Ria +Ricarda +Richard +Richelle +Ricki +Rickie +Rikki +Rima +Rina +Risa +Rita +Riva +Rivka +Robbi +Robbie +Robbin +Robbyn +Robena +Robert +Roberta +Roberto +Robin +Robyn +Rochel +Rochell +Rochelle +Rocio +Rolanda +Rolande +Roma +Romaine +Romana +Romelia +Romona +Rona +Ronald +Ronda +Roni +Ronna +Ronni +Ronnie +Rory +Rosa +Rosalba +Rosalee +Rosalia +Rosalie +Rosalina +Rosalind +Rosalinda +Rosaline +Rosalva +Rosalyn +Rosamaria +Rosamond +Rosana +Rosann +Rosanna +Rosanne +Rosaria +Rosario +Rosaura +Rose +Roseann +Roseanna +Roseanne +Roselee +Roselia +Roseline +Rosella +Roselle +Roselyn +Rosemarie +Rosemary +Rosena +Rosenda +Rosetta +Rosette +Rosia +Rosie +Rosina +Rosio +Rosita +Roslyn +Rossana +Rossie +Rosy +Rowena +Roxana +Roxane +Roxann +Roxanna +Roxanne +Roxie +Roxy +Roy +Royce +Rozanne +Rozella +Rubi +Rubie +Ruby +Rubye +Rudy +Rufina +Russell +Ruth +Rutha +Ruthann +Ruthanne +Ruthe +Ruthie +Ryan +Ryann +Sabina +Sabine +Sabra +Sabrina +Sacha +Sachiko +Sade +Sadie +Sadye +Sage +Salena +Salina +Salley +Sallie +Sally +Salome +Sam +Samantha +Samara +Samatha +Samella +Samira +Sammie +Sammy +Samuel +Sana +Sanda +Sandee +Sandi +Sandie +Sandra +Sandy +Sang +Sanjuana +Sanjuanita +Sanora +Santa +Santana +Santina +Santos +Sara +Sarah +Sarai +Saran +Sari +Sarina +Sarita +Sasha +Saturnina +Sau +Saundra +Savanna +Savannah +Scarlet +Scarlett +Scott +Scottie +Sean +Season +Sebrina +See +Seema +Selena +Selene +Selina +Selma +Sena +Senaida +September +Serafina +Serena +Serina +Serita +Setsuko +Sha +Shae +Shaina +Shakia +Shakira +Shakita +Shala +Shalanda +Shalon +Shalonda +Shameka +Shamika +Shan +Shana +Shanae +Shanda +Shandi +Shandra +Shane +Shaneka +Shanel +Shanell +Shanelle +Shani +Shanice +Shanika +Shaniqua +Shanita +Shanna +Shannan +Shannon +Shanon +Shanta +Shantae +Shantay +Shante +Shantel +Shantell +Shantelle +Shanti +Shaquana +Shaquita +Shara +Sharan +Sharda +Sharee +Sharell +Sharen +Shari +Sharice +Sharie +Sharika +Sharilyn +Sharita +Sharla +Sharleen +Sharlene +Sharmaine +Sharolyn +Sharon +Sharonda +Sharri +Sharron +Sharyl +Sharyn +Shasta +Shaun +Shauna +Shaunda +Shaunna +Shaunta +Shaunte +Shavon +Shavonda +Shavonne +Shawana +Shawanda +Shawanna +Shawn +Shawna +Shawnda +Shawnee +Shawnna +Shawnta +Shay +Shayla +Shayna +Shayne +Shea +Sheba +Sheena +Sheila +Sheilah +Shela +Shelba +Shelby +Shelia +Shella +Shelley +Shelli +Shellie +Shelly +Shemeka +Shemika +Shena +Shenika +Shenita +Shenna +Shera +Sheree +Sherell +Sheri +Sherice +Sheridan +Sherie +Sherika +Sherill +Sherilyn +Sherise +Sherita +Sherlene +Sherley +Sherly +Sherlyn +Sheron +Sherrell +Sherri +Sherrie +Sherril +Sherrill +Sherron +Sherry +Sherryl +Shery +Sheryl +Sheryll +Shiela +Shila +Shiloh +Shin +Shira +Shirely +Shirl +Shirlee +Shirleen +Shirlene +Shirley +Shirly +Shizue +Shizuko +Shona +Shonda +Shondra +Shonna +Shonta +Shoshana +Shu +Shyla +Sibyl +Sidney +Sierra +Signe +Sigrid +Silva +Silvana +Silvia +Sima +Simona +Simone +Simonne +Sina +Sindy +Siobhan +Sirena +Siu +Sixta +Skye +Slyvia +So +Socorro +Sofia +Soila +Sol +Solange +Soledad +Somer +Sommer +Son +Sona +Sondra +Song +Sonia +Sonja +Sonya +Soo +Sook +Soon +Sophia +Sophie +Soraya +Sparkle +Spring +Stacee +Stacey +Staci +Stacia +Stacie +Stacy +Star +Starla +Starr +Stasia +Stefani +Stefania +Stefanie +Stefany +Steffanie +Stella +Stepanie +Stephaine +Stephane +Stephani +Stephania +Stephanie +Stephany +Stephen +Stephenie +Stephine +Stephnie +Steven +Stevie +Stormy +Su +Suanne +Sudie +Sue +Sueann +Suellen +Suk +Sulema +Sumiko +Summer +Sun +Sunday +Sung +Sunni +Sunny +Sunshine +Susan +Susana +Susann +Susanna +Susannah +Susanne +Susie +Susy +Suzan +Suzann +Suzanna +Suzanne +Suzette +Suzi +Suzie +Suzy +Svetlana +Sybil +Syble +Sydney +Sylvia +Sylvie +Synthia +Syreeta +Ta +Tabatha +Tabetha +Tabitha +Tai +Taina +Taisha +Tajuana +Takako +Takisha +Talia +Talisha +Talitha +Tam +Tama +Tamala +Tamar +Tamara +Tamatha +Tambra +Tameika +Tameka +Tamekia +Tamela +Tamera +Tamesha +Tami +Tamica +Tamie +Tamika +Tamiko +Tamisha +Tammara +Tammera +Tammi +Tammie +Tammy +Tamra +Tana +Tandra +Tandy +Taneka +Tanesha +Tangela +Tania +Tanika +Tanisha +Tanja +Tanna +Tanya +Tara +Tarah +Taren +Tari +Tarra +Tarsha +Taryn +Tasha +Tashia +Tashina +Tasia +Tatiana +Tatum +Tatyana +Taunya +Tawana +Tawanda +Tawanna +Tawna +Tawny +Tawnya +Taylor +Tayna +Teena +Tegan +Teisha +Telma +Temeka +Temika +Tempie +Temple +Tena +Tenesha +Tenisha +Tennie +Tennille +Teodora +Teofila +Tequila +Tera +Tereasa +Teresa +Terese +Teresia +Teresita +Teressa +Teri +Terica +Terina +Terisa +Terra +Terrell +Terresa +Terri +Terrie +Terrilyn +Terry +Tesha +Tess +Tessa +Tessie +Thalia +Thanh +Thao +Thea +Theda +Thelma +Theo +Theodora +Theola +Theresa +Therese +Theresia +Theressa +Thersa +Thi +Thomas +Thomasena +Thomasina +Thomasine +Thora +Thresa +Thu +Thuy +Tia +Tiana +Tianna +Tiara +Tien +Tiera +Tierra +Tiesha +Tifany +Tiffaney +Tiffani +Tiffanie +Tiffany +Tiffiny +Tijuana +Tilda +Tillie +Timika +Timothy +Tina +Tinisha +Tiny +Tisa +Tish +Tisha +Tobi +Tobie +Toby +Toccara +Toi +Tomasa +Tomeka +Tomi +Tomika +Tomiko +Tommie +Tommy +Tommye +Tomoko +Tona +Tonda +Tonette +Toni +Tonia +Tonie +Tonisha +Tonita +Tonja +Tony +Tonya +Tora +Tori +Torie +Torri +Torrie +Tory +Tosha +Toshia +Toshiko +Tova +Towanda +Toya +Tracee +Tracey +Traci +Tracie +Tracy +Tran +Trang +Travis +Treasa +Treena +Trena +Tresa +Tressa +Tressie +Treva +Tricia +Trina +Trinh +Trinidad +Trinity +Trish +Trisha +Trista +Tristan +Troy +Trudi +Trudie +Trudy +Trula +Tu +Tula +Tuyet +Twana +Twanda +Twanna +Twila +Twyla +Tyesha +Tyisha +Tyler +Tynisha +Tyra +Ula +Ulrike +Un +Una +Ursula +Usha +Ute +Vada +Val +Valarie +Valda +Valencia +Valene +Valentina +Valentine +Valeri +Valeria +Valerie +Valery +Vallie +Valorie +Valrie +Van +Vanda +Vanesa +Vanessa +Vanetta +Vania +Vanita +Vanna +Vannesa +Vannessa +Vashti +Vasiliki +Veda +Velda +Velia +Vella +Velma +Velva +Velvet +Vena +Venessa +Venetta +Venice +Venita +Vennie +Venus +Veola +Vera +Verda +Verdell +Verdie +Verena +Vergie +Verla +Verlene +Verlie +Verline +Verna +Vernell +Vernetta +Vernia +Vernice +Vernie +Vernita +Vernon +Verona +Veronica +Veronika +Veronique +Versie +Vertie +Vesta +Veta +Vi +Vicenta +Vickey +Vicki +Vickie +Vicky +Victor +Victoria +Victorina +Vida +Viki +Vikki +Vilma +Vina +Vincenza +Vinita +Vinnie +Viola +Violet +Violeta +Violette +Virgen +Virgie +Virgil +Virgina +Virginia +Vita +Viva +Vivan +Vivian +Viviana +Vivien +Vivienne +Voncile +Vonda +Vonnie +Wai +Walter +Waltraud +Wan +Wanda +Waneta +Wanetta +Wanita +Wava +Wei +Wen +Wendi +Wendie +Wendolyn +Wendy +Wenona +Wesley +Whitley +Whitney +Wilda +Wilhelmina +Wilhemina +Willa +Willena +Willene +Willetta +Willette +Willia +William +Willie +Williemae +Willodean +Willow +Wilma +Windy +Winifred +Winnie +Winnifred +Winona +Winter +Wonda +Wynell +Wynona +Xenia +Xiao +Xiomara +Xochitl +Xuan +Yadira +Yaeko +Yael +Yahaira +Yajaira +Yan +Yang +Yanira +Yasmin +Yasmine +Yasuko +Yee +Yelena +Yen +Yer +Yesenia +Yessenia +Yetta +Yevette +Yi +Ying +Yoko +Yolanda +Yolande +Yolando +Yolonda +Yon +Yong +Yoshie +Yoshiko +Youlanda +Young +Yu +Yuette +Yuk +Yuki +Yukiko +Yuko +Yulanda +Yun +Yung +Yuonne +Yuri +Yuriko +Yvette +Yvone +Yvonne +Zada +Zaida +Zana +Zandra +Zelda +Zella +Zelma +Zena +Zenaida +Zenia +Zenobia +Zetta +Zina +Zita +Zoe +Zofia +Zoila +Zola +Zona +Zonia +Zora +Zoraida +Zula +Zulema +Zulma \ No newline at end of file diff --git a/bin/datamasking/firstnames_male.txt b/bin/datamasking/firstnames_male.txt new file mode 100644 index 0000000000..38709240c1 --- /dev/null +++ b/bin/datamasking/firstnames_male.txt @@ -0,0 +1,1219 @@ +Aaron +Abdul +Abe +Abel +Abraham +Abram +Adalberto +Adam +Adan +Adolfo +Adolph +Adrian +Agustin +Ahmad +Ahmed +Al +Alan +Albert +Alberto +Alden +Aldo +Alec +Alejandro +Alex +Alexander +Alexis +Alfonso +Alfonzo +Alfred +Alfredo +Ali +Allan +Allen +Alonso +Alonzo +Alphonse +Alphonso +Alton +Alva +Alvaro +Alvin +Amado +Ambrose +Amos +Anderson +Andre +Andrea +Andreas +Andres +Andrew +Andy +Angel +Angelo +Anibal +Anthony +Antione +Antoine +Anton +Antone +Antonia +Antonio +Antony +Antwan +Archie +Arden +Ariel +Arlen +Arlie +Armand +Armando +Arnold +Arnoldo +Arnulfo +Aron +Arron +Art +Arthur +Arturo +Asa +Ashley +Aubrey +August +Augustine +Augustus +Aurelio +Austin +Avery +Barney +Barrett +Barry +Bart +Barton +Basil +Beau +Ben +Benedict +Benito +Benjamin +Bennett +Bennie +Benny +Benton +Bernard +Bernardo +Bernie +Berry +Bert +Bertram +Bill +Billie +Billy +Blaine +Blair +Blake +Bo +Bob +Bobbie +Bobby +Booker +Boris +Boyce +Boyd +Brad +Bradford +Bradley +Bradly +Brady +Brain +Branden +Brandon +Brant +Brendan +Brendon +Brent +Brenton +Bret +Brett +Brian +Brice +Britt +Brock +Broderick +Brooks +Bruce +Bruno +Bryan +Bryant +Bryce +Bryon +Buck +Bud +Buddy +Buford +Burl +Burt +Burton +Buster +Byron +Caleb +Calvin +Cameron +Carey +Carl +Carlo +Carlos +Carlton +Carmelo +Carmen +Carmine +Carol +Carrol +Carroll +Carson +Carter +Cary +Casey +Cecil +Cedric +Cedrick +Cesar +Chad +Chadwick +Chance +Chang +Charles +Charley +Charlie +Chas +Chase +Chauncey +Chester +Chet +Chi +Chong +Chris +Christian +Christoper +Christopher +Chuck +Chung +Clair +Clarence +Clark +Claud +Claude +Claudio +Clay +Clayton +Clement +Clemente +Cleo +Cletus +Cleveland +Cliff +Clifford +Clifton +Clint +Clinton +Clyde +Cody +Colby +Cole +Coleman +Colin +Collin +Colton +Columbus +Connie +Conrad +Cordell +Corey +Cornelius +Cornell +Cortez +Cory +Courtney +Coy +Craig +Cristobal +Cristopher +Cruz +Curt +Curtis +Cyril +Cyrus +Dale +Dallas +Dalton +Damian +Damien +Damion +Damon +Dan +Dana +Dane +Danial +Daniel +Danilo +Dannie +Danny +Dante +Darell +Daren +Darin +Dario +Darius +Darnell +Daron +Darrel +Darrell +Darren +Darrick +Darrin +Darron +Darryl +Darwin +Daryl +Dave +David +Davis +Dean +Deandre +Deangelo +Dee +Del +Delbert +Delmar +Delmer +Demarcus +Demetrius +Denis +Dennis +Denny +Denver +Deon +Derek +Derick +Derrick +Deshawn +Desmond +Devin +Devon +Dewayne +Dewey +Dewitt +Dexter +Dick +Diego +Dillon +Dino +Dion +Dirk +Domenic +Domingo +Dominic +Dominick +Dominique +Don +Donald +Dong +Donn +Donnell +Donnie +Donny +Donovan +Donte +Dorian +Dorsey +Doug +Douglas +Douglass +Doyle +Drew +Duane +Dudley +Duncan +Dustin +Dusty +Dwain +Dwayne +Dwight +Dylan +Earl +Earle +Earnest +Ed +Eddie +Eddy +Edgar +Edgardo +Edison +Edmond +Edmund +Edmundo +Eduardo +Edward +Edwardo +Edwin +Efrain +Efren +Elbert +Elden +Eldon +Eldridge +Eli +Elias +Elijah +Eliseo +Elisha +Elliot +Elliott +Ellis +Ellsworth +Elmer +Elmo +Eloy +Elroy +Elton +Elvin +Elvis +Elwood +Emanuel +Emerson +Emery +Emil +Emile +Emilio +Emmanuel +Emmett +Emmitt +Emory +Enoch +Enrique +Erasmo +Eric +Erich +Erick +Erik +Erin +Ernest +Ernesto +Ernie +Errol +Ervin +Erwin +Esteban +Ethan +Eugene +Eugenio +Eusebio +Evan +Everett +Everette +Ezekiel +Ezequiel +Ezra +Fabian +Faustino +Fausto +Federico +Felipe +Felix +Felton +Ferdinand +Fermin +Fernando +Fidel +Filiberto +Fletcher +Florencio +Florentino +Floyd +Forest +Forrest +Foster +Frances +Francesco +Francis +Francisco +Frank +Frankie +Franklin +Franklyn +Fred +Freddie +Freddy +Frederic +Frederick +Fredric +Fredrick +Freeman +Fritz +Gabriel +Gail +Gale +Galen +Garfield +Garland +Garret +Garrett +Garry +Garth +Gary +Gaston +Gavin +Gayle +Gaylord +Genaro +Gene +Geoffrey +George +Gerald +Geraldo +Gerard +Gerardo +German +Gerry +Gil +Gilbert +Gilberto +Gino +Giovanni +Giuseppe +Glen +Glenn +Gonzalo +Gordon +Grady +Graham +Graig +Grant +Granville +Greg +Gregg +Gregorio +Gregory +Grover +Guadalupe +Guillermo +Gus +Gustavo +Guy +Hai +Hal +Hank +Hans +Harlan +Harland +Harley +Harold +Harris +Harrison +Harry +Harvey +Hassan +Hayden +Haywood +Heath +Hector +Henry +Herb +Herbert +Heriberto +Herman +Herschel +Hershel +Hilario +Hilton +Hipolito +Hiram +Hobert +Hollis +Homer +Hong +Horace +Horacio +Hosea +Houston +Howard +Hoyt +Hubert +Huey +Hugh +Hugo +Humberto +Hung +Hunter +Hyman +Ian +Ignacio +Ike +Ira +Irvin +Irving +Irwin +Isaac +Isaiah +Isaias +Isiah +Isidro +Ismael +Israel +Isreal +Issac +Ivan +Ivory +Jacinto +Jack +Jackie +Jackson +Jacob +Jacques +Jae +Jaime +Jake +Jamaal +Jamal +Jamar +Jame +Jamel +James +Jamey +Jamie +Jamison +Jan +Jared +Jarod +Jarred +Jarrett +Jarrod +Jarvis +Jason +Jasper +Javier +Jay +Jayson +Jc +Jean +Jed +Jeff +Jefferey +Jefferson +Jeffery +Jeffrey +Jeffry +Jerald +Jeramy +Jere +Jeremiah +Jeremy +Jermaine +Jerold +Jerome +Jeromy +Jerrell +Jerrod +Jerrold +Jerry +Jess +Jesse +Jessie +Jesus +Jewel +Jewell +Jim +Jimmie +Jimmy +Joan +Joaquin +Jody +Joe +Joel +Joesph +Joey +John +Johnathan +Johnathon +Johnie +Johnnie +Johnny +Johnson +Jon +Jonah +Jonas +Jonathan +Jonathon +Jordan +Jordon +Jorge +Jose +Josef +Joseph +Josh +Joshua +Josiah +Jospeh +Josue +Juan +Jude +Judson +Jules +Julian +Julio +Julius +Junior +Justin +Kareem +Karl +Kasey +Keenan +Keith +Kelley +Kelly +Kelvin +Ken +Kendall +Kendrick +Keneth +Kenneth +Kennith +Kenny +Kent +Kenton +Kermit +Kerry +Keven +Kevin +Kieth +Kim +King +Kip +Kirby +Kirk +Korey +Kory +Kraig +Kris +Kristofer +Kristopher +Kurt +Kurtis +Kyle +Lacy +Lamar +Lamont +Lance +Landon +Lane +Lanny +Larry +Lauren +Laurence +Lavern +Laverne +Lawerence +Lawrence +Lazaro +Leandro +Lee +Leif +Leigh +Leland +Lemuel +Len +Lenard +Lenny +Leo +Leon +Leonard +Leonardo +Leonel +Leopoldo +Leroy +Les +Lesley +Leslie +Lester +Levi +Lewis +Lincoln +Lindsay +Lindsey +Lino +Linwood +Lionel +Lloyd +Logan +Lon +Long +Lonnie +Lonny +Loren +Lorenzo +Lou +Louie +Louis +Lowell +Loyd +Lucas +Luciano +Lucien +Lucio +Lucius +Luigi +Luis +Luke +Lupe +Luther +Lyle +Lyman +Lyndon +Lynn +Lynwood +Mac +Mack +Major +Malcolm +Malcom +Malik +Man +Manual +Manuel +Marc +Marcel +Marcelino +Marcellus +Marcelo +Marco +Marcos +Marcus +Margarito +Maria +Mariano +Mario +Marion +Mark +Markus +Marlin +Marlon +Marquis +Marshall +Martin +Marty +Marvin +Mary +Mason +Mathew +Matt +Matthew +Maurice +Mauricio +Mauro +Max +Maximo +Maxwell +Maynard +Mckinley +Mel +Melvin +Merle +Merlin +Merrill +Mervin +Micah +Michael +Michal +Michale +Micheal +Michel +Mickey +Miguel +Mike +Mikel +Milan +Miles +Milford +Millard +Milo +Milton +Minh +Miquel +Mitch +Mitchel +Mitchell +Modesto +Mohamed +Mohammad +Mohammed +Moises +Monroe +Monte +Monty +Morgan +Morris +Morton +Mose +Moses +Moshe +Murray +Myles +Myron +Napoleon +Nathan +Nathanael +Nathanial +Nathaniel +Neal +Ned +Neil +Nelson +Nestor +Neville +Newton +Nicholas +Nick +Nickolas +Nicky +Nicolas +Nigel +Noah +Noble +Noe +Noel +Nolan +Norbert +Norberto +Norman +Normand +Norris +Numbers +Octavio +Odell +Odis +Olen +Olin +Oliver +Ollie +Omar +Omer +Oren +Orlando +Orval +Orville +Oscar +Osvaldo +Oswaldo +Otha +Otis +Otto +Owen +Pablo +Palmer +Paris +Parker +Pasquale +Pat +Patricia +Patrick +Paul +Pedro +Percy +Perry +Pete +Peter +Phil +Philip +Phillip +Pierre +Porfirio +Porter +Preston +Prince +Quentin +Quincy +Quinn +Quintin +Quinton +Rafael +Raleigh +Ralph +Ramiro +Ramon +Randal +Randall +Randell +Randolph +Randy +Raphael +Rashad +Raul +Ray +Rayford +Raymon +Raymond +Raymundo +Reed +Refugio +Reggie +Reginald +Reid +Reinaldo +Renaldo +Renato +Rene +Reuben +Rex +Rey +Reyes +Reynaldo +Rhett +Ricardo +Rich +Richard +Richie +Rick +Rickey +Rickie +Ricky +Rico +Rigoberto +Riley +Rob +Robbie +Robby +Robert +Roberto +Robin +Robt +Rocco +Rocky +Rod +Roderick +Rodger +Rodney +Rodolfo +Rodrick +Rodrigo +Rogelio +Roger +Roland +Rolando +Rolf +Rolland +Roman +Romeo +Ron +Ronald +Ronnie +Ronny +Roosevelt +Rory +Rosario +Roscoe +Rosendo +Ross +Roy +Royal +Royce +Ruben +Rubin +Rudolf +Rudolph +Rudy +Rueben +Rufus +Rupert +Russ +Russel +Russell +Rusty +Ryan +Sal +Salvador +Salvatore +Sam +Sammie +Sammy +Samual +Samuel +Sandy +Sanford +Sang +Santiago +Santo +Santos +Saul +Scot +Scott +Scottie +Scotty +Sean +Sebastian +Sergio +Seth +Seymour +Shad +Shane +Shannon +Shaun +Shawn +Shayne +Shelby +Sheldon +Shelton +Sherman +Sherwood +Shirley +Shon +Sid +Sidney +Silas +Simon +Sol +Solomon +Son +Sonny +Spencer +Stacey +Stacy +Stan +Stanford +Stanley +Stanton +Stefan +Stephan +Stephen +Sterling +Steve +Steven +Stevie +Stewart +Stuart +Sung +Sydney +Sylvester +Tad +Tanner +Taylor +Ted +Teddy +Teodoro +Terence +Terrance +Terrell +Terrence +Terry +Thad +Thaddeus +Thanh +Theo +Theodore +Theron +Thomas +Thurman +Tim +Timmy +Timothy +Titus +Tobias +Toby +Tod +Todd +Tom +Tomas +Tommie +Tommy +Toney +Tony +Tory +Tracey +Tracy +Travis +Trent +Trenton +Trevor +Trey +Trinidad +Tristan +Troy +Truman +Tuan +Ty +Tyler +Tyree +Tyrell +Tyron +Tyrone +Tyson +Ulysses +Val +Valentin +Valentine +Van +Vance +Vaughn +Vern +Vernon +Vicente +Victor +Vince +Vincent +Vincenzo +Virgil +Virgilio +Vito +Von +Wade +Waldo +Walker +Wallace +Wally +Walter +Walton +Ward +Warner +Warren +Waylon +Wayne +Weldon +Wendell +Werner +Wes +Wesley +Weston +Whitney +Wilber +Wilbert +Wilbur +Wilburn +Wiley +Wilford +Wilfred +Wilfredo +Will +Willard +William +Williams +Willian +Willie +Willis +Willy +Wilmer +Wilson +Wilton +Winford +Winfred +Winston +Wm +Woodrow +Wyatt +Xavier +Yong +Young +Zachariah +Zachary +Zachery +Zack +Zackary +Zane \ No newline at end of file diff --git a/bin/datamasking/lastnames_all.txt b/bin/datamasking/lastnames_all.txt new file mode 100644 index 0000000000..db1bd50c1c --- /dev/null +++ b/bin/datamasking/lastnames_all.txt @@ -0,0 +1,88798 @@ +Aaberg +Aaby +Aadland +Aagaard +Aakre +Aaland +Aalbers +Aalderink +Aalund +Aamodt +Aamot +Aanderud +Aanenson +Aanerud +Aarant +Aardema +Aarestad +Aarhus +Aaron +Aarons +Aaronson +Aarsvold +Aas +Aasby +Aase +Aasen +Aavang +Abad +Abadi +Abadie +Abair +Abaja +Abajian +Abalos +Abaloz +Abar +Abarca +Abare +Abascal +Abasta +Abate +Abati +Abatiell +Abato +Abatti +Abaunza +Abaya +Abbadessa +Abbamonte +Abbas +Abbasi +Abbassi +Abbate +Abbatiello +Abbay +Abbe +Abbed +Abbenante +Abbey +Abbinanti +Abbington +Abbitt +Abbot +Abbott +Abboud +Abbruzzese +Abbs +Abby +Abdalla +Abdallah +Abdel +Abdelal +Abdelaziz +Abdeldayen +Abdelhamid +Abdella +Abdelmuti +Abdelrahman +Abdelwahed +Abdi +Abdin +Abdo +Abdon +Abdool +Abdou +Abdul +Abdula +Abdulaziz +Abdulkarim +Abdulla +Abdullah +Abdullai +Abdulmateen +Abdulmuniem +Abdur +Abe +Abeb +Abed +Abedelah +Abedi +Abee +Abegg +Abeita +Abel +Abela +Abelar +Abelardo +Abele +Abeles +Abell +Abella +Abellera +Abelman +Abeln +Abels +Abelson +Aben +Abend +Abendroth +Aber +Abercombie +Abercrombie +Aberle +Abernatha +Abernathy +Abernethy +Aberson +Abes +Abeta +Abete +Abetrani +Abeyta +Abide +Abigantus +Abila +Abilay +Abild +Abilez +Abina +Abington +Abitong +Abke +Abkemeier +Ablang +Ablao +Able +Ableman +Abler +Ables +Ablin +Abling +Abner +Abnet +Abney +Abo +Abolafia +Abolt +Abood +Aboshihata +Aboud +Aboudi +Aboulahoud +Aboulissan +Abousaleh +Aboytes +Abplanalp +Abrachinsky +Abraham +Abrahamian +Abrahams +Abrahamsen +Abrahamson +Abram +Abramek +Abramian +Abramoff +Abramov +Abramovich +Abramovitz +Abramowitz +Abramowski +Abrams +Abramson +Abrantes +Abreau +Abrecht +Abrego +Abrell +Abreo +Abreu +Abrev +Abrew +Abrey +Abrial +Abril +Abriola +Abrom +Abron +Abruzzese +Abruzzino +Abruzzo +Absalon +Abshear +Absher +Abshier +Abshire +Abson +Abston +Abt +Abts +Abu +Abuaita +Abubakr +Abud +Abuel +Abugn +Abuhl +Abundis +Abundiz +Aburto +Abusufait +Acal +Acampora +Accala +Accardi +Accardo +Accetta +Accetturo +Accola +Accomando +Accornero +Accosta +Accurso +Ace +Acebedo +Acebo +Acedo +Acee +Aceituno +Acencio +Aceret +Acerno +Acero +Acerra +Aceto +Aceuedo +Acevado +Aceveda +Acevedo +Aceves +Acey +Acfalle +Achane +Ache +Acheampong +Achee +Achekian +Achenbach +Acheson +Achille +Achilles +Achin +Achor +Achord +Achorn +Achter +Achterhof +Achzet +Achziger +Acierno +Acimovic +Ack +Ackah +Acken +Acker +Ackerley +Ackerly +Ackerman +Ackermann +Ackers +Ackerson +Ackert +Ackies +Ackins +Ackison +Ackiss +Ackland +Acklen +Ackles +Ackley +Acklin +Ackman +Ackmann +Ackroyd +Acly +Acoba +Acocella +Acock +Acoff +Acor +Acord +Acorda +Acors +Acosta +Acosto +Acothley +Acquaviva +Acquilla +Acre +Acree +Acres +Acrey +Acri +Acron +Actis +Acton +Acuff +Acuna +Acy +Ada +Adachi +Adair +Adalja +Adam +Adamaitis +Adamcik +Adamczak +Adamczyk +Adame +Adamec +Adamek +Adames +Adami +Adamiak +Adamik +Adamis +Adamitis +Adamo +Adamos +Adamowski +Adams +Adamsen +Adamski +Adamsky +Adamson +Adamsonis +Adamyan +Adan +Adank +Adas +Adauto +Adaway +Aday +Adcock +Adcox +Addair +Addams +Addario +Addeo +Adderley +Adderly +Addesso +Addicks +Addie +Addiego +Addington +Addis +Addison +Addleman +Addo +Adduci +Addy +Ade +Adebisi +Adee +Adel +Adelblue +Adelgren +Adelizzi +Adell +Adelman +Adelmann +Adelmund +Adels +Adelsberg +Adelson +Adelsperger +Adelstein +Adema +Aden +Adens +Ader +Aderhold +Aderholdt +Aderholt +Aderman +Aderson +Ades +Adessa +Adesso +Adey +Adeyemo +Adger +Adham +Adhami +Adi +Adib +Adickes +Adie +Adil +Adinolfi +Adjei +Adjutant +Adkerson +Adkin +Adkins +Adkinson +Adkison +Adkisson +Adlam +Adle +Adleman +Adler +Adley +Adling +Adloff +Admas +Admire +Adner +Adney +Adolf +Adolfo +Adolfson +Adolph +Adolphe +Adolphsen +Adolphson +Adolphus +Adomaitis +Adon +Adonis +Adorno +Adragna +Adrian +Adriance +Adriano +Adrid +Adrien +Adrion +Adrovel +Adside +Adsit +Adu +Aduddell +Adule +Adwell +Ady +Adzhabakyan +Aegerter +Aeillo +Aeling +Aemmer +Aerni +Aerts +Aery +Aeschbacher +Aeschliman +Aeschlimann +Afable +Afalava +Afan +Afanador +Affagato +Affeld +Affelt +Affeltranger +Affleck +Afflick +Affolter +Affronti +Aflalo +Afoa +Afonso +Africa +Afshar +Afshari +Afton +Afurong +Afzal +Agamao +Agan +Agans +Agar +Agard +Agarwal +Agbayani +Agbisit +Agcaoili +Age +Ageboi +Agee +Agel +Agemy +Agena +Agent +Ager +Agers +Agerter +Agerton +Aggarwal +Aggas +Aggers +Agib +Agilar +Agin +Agins +Agle +Agler +Agliam +Agne +Agnelli +Agnello +Agner +Agnes +Agnew +Agney +Agni +Agnor +Agoff +Agonoy +Agor +Agoras +Agoro +Agosta +Agosti +Agostinelli +Agostini +Agostino +Agosto +Agpaoa +Agramonte +Agrawal +Agre +Agreda +Agredano +Agrela +Agresta +Agreste +Agresti +Agresto +Agricola +Agriesti +Agrios +Agro +Agron +Agtarap +Aguada +Aguado +Aguallo +Aguas +Aguayo +Agudelo +Agudo +Agueda +Aguele +Aguero +Aguiar +Aguila +Aguilar +Aguiler +Aguilera +Aguillar +Aguillard +Aguillera +Aguillon +Aguinaga +Aguinaldo +Aguiniga +Aguino +Aguire +Aguirre +Agular +Aguliar +Agumga +Agundez +Agunos +Aguon +Agurs +Agustin +Agustine +Agustino +Agyeman +Ahal +Ahalt +Aharon +Aharoni +Aharonof +Ahart +Ahaus +Ahearn +Ahern +Aherns +Ahhee +Ahia +Ahimud +Ahl +Ahlberg +Ahlborn +Ahlbrecht +Ahle +Ahlemeyer +Ahler +Ahlers +Ahles +Ahlf +Ahlfield +Ahlgren +Ahlheim +Ahlin +Ahlm +Ahlman +Ahlo +Ahlquist +Ahlstedt +Ahlstrom +Ahluwalia +Ahmad +Ahmadi +Ahmann +Ahmau +Ahmed +Ahn +Ahne +Ahnell +Ahner +Aho +Aholt +Ahonen +Ahr +Ahrendes +Ahrends +Ahrendt +Ahrenholtz +Ahrenholz +Ahrens +Ahrenstorff +Ahrent +Ahrns +Ahsan +Ahsing +Ahuja +Ahumada +Ahuna +Ahyet +Ahyou +Aiava +Aichele +Aicklen +Aid +Aidt +Aiello +Aievoli +Aigner +Aihara +Aiken +Aikens +Aikey +Aikin +Aikins +Aikman +Ailes +Ailey +Ailiff +Aills +Ailor +Ailshire +Ailstock +Ailsworth +Ailts +Aimbez +Aimone +Aina +Aines +Ainge +Aini +Ainley +Ainscough +Ainsley +Ainslie +Ainsworth +Aiola +Aiona +Aipopo +Aiporlani +Aipperspach +Aird +Airhart +Airington +Airola +Airth +Aispuro +Aita +Aitcheson +Aitchison +Aites +Aitken +Aitkin +Aitkins +Aiton +Aiu +Aiudi +Aiuto +Aivao +Aiyer +Aja +Ajani +Ajasin +Ajayi +Ajello +Ajoku +Ajose +Akahi +Akal +Akamine +Akamiro +Akana +Akande +Akapo +Akard +Akau +Akawanzie +Akbar +Akbari +Ake +Akel +Akemon +Aken +Aker +Akerley +Akerman +Akers +Akerson +Akery +Akes +Akey +Akhand +Akhavan +Akhtar +Aki +Akiereisen +Akim +Akima +Akimseu +Akin +Akinrefon +Akins +Akinyooye +Akiona +Akiyama +Akkerman +Akles +Akley +Akmal +Ako +Akoni +Akpan +Akram +Akre +Akridge +Akright +Aksamit +Aksoy +Akuchie +Akuna +Akwei +Ala +Alacano +Alagna +Alai +Alaibilla +Alaimo +Alalem +Alam +Alambar +Alameda +Alameida +Alamia +Alamilla +Alamillo +Alamin +Alamo +Alamos +Alampi +Alan +Aland +Alanis +Alaniz +Alanko +Alano +Alapai +Alar +Alarcon +Alarcone +Alarid +Alarie +Alario +Alas +Alatorre +Alatosse +Alattar +Alavi +Alawdi +Alaya +Alba +Albach +Albair +Albaladejo +Alban +Albanese +Albanez +Albang +Albani +Albano +Albany +Albarado +Albarazi +Albares +Albarez +Albarracin +Albarran +Albaugh +Albe +Albea +Albee +Albelo +Alben +Alber +Alberda +Alberding +Alberg +Albergotti +Alberico +Albero +Alberro +Alberry +Albers +Alberson +Albert +Alberta +Alberthal +Alberti +Albertine +Albertini +Alberto +Alberts +Albertsen +Albertson +Alberty +Albery +Albin +Albini +Albino +Albiston +Albor +Alborn +Albornoz +Albracht +Albrashi +Albrecht +Albrekht +Albright +Albriton +Albrittain +Albritton +Albro +Albrough +Albu +Albury +Albus +Alby +Alcaide +Alcala +Alcalde +Alcantar +Alcantara +Alcantas +Alcaoa +Alcaraz +Alcazar +Alce +Alcide +Alcina +Alcine +Alcini +Alcivar +Alcocer +Alcock +Alcombright +Alcon +Alconcel +Alcorn +Alcorta +Alcoser +Alcosiba +Alcott +Aldaba +Aldaco +Aldama +Aldana +Aldapa +Aldape +Aldarondo +Aldas +Aldava +Alday +Aldaz +Aldecoa +Alden +Alder +Alderete +Alderfer +Alderink +Alderman +Alderson +Alderton +Aldi +Aldinger +Aldo +Aldonza +Aldous +Aldred +Aldredge +Aldrege +Aldrete +Aldrich +Aldridge +Aldrige +Aldrow +Aldworth +Alea +Alecca +Aleem +Aleff +Alegar +Alegi +Alegre +Alegria +Aleizar +Alejandre +Alejandrez +Alejandro +Alejo +Alejos +Alekna +Aleksey +Aleman +Alemany +Alen +Aleo +Alepin +Alequin +Aler +Alers +Alert +Alerte +Ales +Alesci +Alescio +Aleshire +Alesi +Alesna +Alessandrini +Alessandro +Alessandroni +Alesse +Alessi +Alessio +Alevedo +Alevras +Alewine +Alex +Alexader +Alexaki +Alexakis +Alexander +Alexanders +Alexandra +Alexandre +Alexandria +Alexandropoul +Alexanian +Alexender +Alexidor +Alexion +Alexiou +Alexis +Alexnder +Alexopoulos +Alexy +Alexzander +Aley +Aleyandrez +Alf +Alfandre +Alfano +Alfaro +Alfera +Alferez +Alfero +Alff +Alfieri +Alfiero +Alfisi +Alfonsi +Alfonso +Alfonzo +Alford +Alfred +Alfredo +Alfreds +Alfrey +Alfson +Algarin +Alge +Algee +Algeo +Alger +Alghamdi +Algien +Algier +Algire +Algood +Alguire +Alhaddad +Alhambra +Alhameed +Alhusseini +Ali +Aliaga +Aliano +Alias +Aliberti +Alibozek +Alicandro +Alice +Alicea +Alicer +Alicia +Alicuben +Alie +Alier +Aliff +Alig +Alim +Aliment +Alimento +Alimo +Aline +Alioto +Aliotta +Alipio +Alire +Alires +Alirez +Alisauskas +Alison +Alix +Alizadeh +Aljemal +Alkana +Alkbsh +Alkema +Alken +Alkins +Alkire +All +Allaband +Allabaugh +Allah +Allain +Allaire +Allam +Allaman +Allamon +Allamong +Allan +Allanson +Allara +Allard +Allateef +Allaway +Allbee +Allbert +Allbones +Allbright +Allbritten +Allbritton +Allcock +Allcorn +Allday +Allder +Alldredge +Allebach +Allee +Allegood +Allegra +Allegre +Allegretta +Allegretti +Allegrini +Allegrucci +Alleman +Allemand +Allemond +Allen +Allenbach +Allenbaugh +Allenbrand +Allende +Allender +Allendorf +Allenson +Allensworth +Aller +Allerman +Allers +Allerton +Alleruzzo +Allery +Alles +Alleshouse +Allessi +Allessio +Alleva +Allevato +Allex +Alley +Alleyne +Allford +Allgaeuer +Allgaier +Allgeier +Allgeyer +Allgier +Allgire +Allgood +Allhands +Alli +Alliance +Allie +Alligood +Alliman +Allin +Allinder +Alling +Allinger +Allington +Allio +Allis +Allison +Alliston +Allman +Allmand +Allmon +Allmond +Allnutt +Allocca +Allocco +Allon +Allor +Alloway +Allphin +Allred +Allridge +Alls +Allsbrook +Allsbrooks +Allscheid +Allshouse +Allsop +Allston +Allstott +Allsup +Allton +Alltop +Allum +Allums +Allvin +Allwardt +Allwood +Ally +Allyn +Allyne +Alm +Alma +Almada +Almaguer +Almajhoub +Alman +Almand +Almanza +Almanzar +Almaras +Almaraz +Almarez +Almario +Almarza +Almas +Almasi +Almazan +Alme +Almeda +Almeida +Almen +Almenar +Almendarez +Almengor +Almerico +Almestica +Almeter +Almeyda +Almgren +Almiron +Almodova +Almodovar +Almon +Almond +Almonte +Almos +Almquist +Almstead +Almsteadt +Almy +Alnas +Alnoor +Alnutt +Alo +Aloan +Aloe +Aloi +Aloia +Aloisi +Alonge +Alongi +Alonso +Alonza +Alonzo +Alosa +Alosta +Alouf +Aloy +Alpaugh +Alper +Alperin +Alpern +Alpers +Alpert +Alpha +Alpheaus +Alphin +Alphonse +Alphonso +Alpis +Alpizar +Alquesta +Alquicira +Alquijay +Alquisira +Alrais +Alred +Alrich +Alrod +Alsandor +Alsaqri +Alsberry +Alsbrook +Alsbrooks +Alsbury +Alsdon +Alsheimer +Alshouse +Alsina +Alsing +Alsip +Alsman +Alsobrook +Alsobrooks +Alson +Alsop +Alspach +Alspaugh +Alstad +Alston +Alstott +Alstrom +Alsup +Alt +Altadonna +Altamirano +Altamiruno +Altaras +Altavilla +Altemus +Altenbach +Altenburg +Altenhofen +Alter +Alteri +Alterio +Alterman +Altermatt +Altes +Altew +Althaus +Althauser +Altheimer +Althiser +Althoff +Althouse +Altic +Altice +Altidor +Altier +Altieri +Altiery +Altig +Altimus +Altizer +Altken +Altman +Altmann +Altmark +Altmiller +Altmire +Alto +Altobell +Altobelli +Altobello +Altom +Altomare +Altomari +Altomonte +Alton +Altonen +Altop +Altreche +Altringer +Altro +Altrogge +Altschuler +Altshuler +Altsisi +Altstatt +Altum +Altvater +Altwies +Alty +Alu +Aluarado +Aluarez +Aluise +Alukonis +Alumbaugh +Alummoottil +Aluqdah +Alva +Alvacado +Alvalle +Alvanas +Alvanez +Alvara +Alvarado +Alvardo +Alvarenga +Alvarengo +Alvares +Alvarez +Alvaro +Alvarracin +Alvarran +Alvear +Alvelo +Alven +Alverado +Alveraz +Alverest +Alverez +Alverio +Alvernaz +Alvero +Alverson +Alves +Alvey +Alvez +Alvia +Alviar +Alvidrez +Alvin +Alvine +Alvino +Alvira +Alvirez +Alvis +Alviso +Alvizo +Alvord +Alvorez +Alwan +Alwang +Alward +Alwardt +Alway +Alwazan +Alwin +Alwine +Aly +Alyea +Alzaga +Alzate +Alzugaray +Amabile +Amacher +Amack +Amacker +Amadeo +Amadi +Amadio +Amado +Amadon +Amador +Amailla +Amaker +Amalfitano +Amalong +Aman +Amancio +Amann +Amano +Amante +Amanza +Amar +Amara +Amaral +Amarante +Amargo +Amari +Amarian +Amarillas +Amaro +Amas +Amason +Amass +Amat +Amati +Amato +Amauty +Amavisca +Amaya +Amazan +Ambagis +Ambeau +Amber +Amberg +Ambers +Amberson +Ambert +Amble +Ambler +Amboise +Amboree +Amborn +Ambres +Ambrister +Ambriz +Ambrogi +Ambrose +Ambrosia +Ambrosini +Ambrosino +Ambrosio +Ambrosius +Ambrosone +Ambroz +Ambroziak +Ambuehl +Amburgey +Amburgy +Amburn +Amdahl +Amderson +Amedee +Amedeo +Amedro +Ameduri +Ameen +Ameigh +Amejorado +Amel +Amela +Amelang +Ameling +Amelio +Amell +Amelung +Amemiya +Amen +Amend +Amendola +Ament +Amenta +Amentler +Amento +Amer +America +American +Amerine +Amerio +Amerman +Amero +Amerson +Amert +Ames +Amesbury +Amescua +Amesquieto +Amesquita +Amey +Amezaga +Amezcua +Amezquita +Amici +Amick +Amico +Amicone +Amidei +Amidi +Amidon +Amie +Amigo +Amigon +Amill +Amin +Amini +Aminov +Amiot +Amir +Amirault +Amiri +Amirian +Amis +Amisano +Amison +Amistadi +Amistoso +Amith +Amlin +Ammann +Ammar +Ammer +Ammerman +Ammirata +Ammirati +Ammirato +Ammon +Ammonds +Ammons +Amo +Amoa +Amoah +Amoako +Amodei +Amodeo +Amodio +Amodt +Amoe +Amolsch +Amon +Amonette +Amons +Amor +Amore +Amorello +Amores +Amoriello +Amorim +Amorin +Amormino +Amoros +Amorose +Amorosi +Amoroso +Amoruso +Amory +Amos +Amoss +Amott +Amour +Amous +Amparan +Amparo +Amphy +Ampy +Amr +Amrein +Amrhein +Amrich +Amrine +Amsbaugh +Amsberry +Amsdell +Amsden +Amsili +Amsinger +Amsler +Amsley +Amspaugh +Amspoker +Amstein +Amster +Amsterdam +Amstrong +Amstutz +Amtower +Amundsen +Amundson +Amunrud +Amuso +Amweg +Amy +Amyot +Amyotte +Amys +Amyx +An +Ana +Anable +Anacker +Anadio +Anagnos +Anagnost +Anagnostou +Anakalea +Analla +Anand +Anania +Ananias +Anasagasti +Anast +Anastacio +Anastas +Anastasi +Anastasia +Anastasiades +Anastasio +Anastos +Anauo +Anawalt +Anawaty +Anaya +Ancalade +Ancar +Ancel +Ancelet +Ancell +Ancheta +Anchondo +Anchors +Ancic +Ancira +Anciso +Ancona +Ancrum +Anctil +Ancy +Anda +Andalora +Andary +Andaverde +Andaya +Andebe +Andel +Andelman +Ander +Andera +Anderberg +Andere +Anderegg +Anderholm +Anderl +Anderlik +Anderman +Anderon +Anders +Andersen +Anderson +Andersson +Anderst +Andert +Anderton +Andes +Andeson +Andina +Anding +Andino +Andis +Ando +Andoh +Andon +Andonian +Andra +Andrachak +Andracki +Andrada +Andrade +Andrades +Andradez +Andrado +Andrae +Andrango +Andras +Andre +Andrea +Andreadis +Andreas +Andreasen +Andreason +Andreassen +Andreassi +Andreatta +Andree +Andreen +Andreessen +Andregg +Andren +Andreola +Andreoli +Andreoni +Andreotti +Andreozzi +Andrepont +Andres +Andresen +Andress +Andreu +Andreula +Andrew +Andrews +Andrian +Andrich +Andrick +Andries +Andringa +Andrino +Andrion +Andriopulos +Andris +Andrle +Androde +Androes +Androlewicz +Andronis +Andros +Androsky +Andrson +Andrulis +Andrus +Andruss +Andruszkiewic +Andruzzi +Andry +Andrzejczak +Andrzejczyk +Andrzejewski +Andueza +Andujar +Andujo +Andy +Andzulis +Anecelle +Anelli +Anello +Anene +Anerton +Anes +Aneshansley +Anesi +Anestos +Anetsberger +Anewalt +Aney +Anez +Anfinson +Ang +Angalich +Angarola +Ange +Angel +Angela +Angelbeck +Angeles +Angeletti +Angeli +Angelica +Angelico +Angelilli +Angelillo +Angeline +Angelini +Angelino +Angell +Angelle +Angello +Angellotti +Angelo +Angelocci +Angeloff +Angelone +Angeloni +Angeloro +Angelos +Angelotti +Angelou +Angelovich +Angelozzi +Angelson +Angelucci +Anger +Angerer +Angerman +Angermeier +Angeron +Angers +Angert +Angevine +Angiano +Angier +Angilello +Angileri +Angilletta +Angiolelli +Angiolillo +Angione +Angis +Anglada +Anglade +Angland +Angle +Anglea +Angleberger +Anglebrandt +Anglemyer +Anglen +Angles +Angleton +Angley +Anglin +Anglum +Angocicco +Angold +Angolo +Angon +Angotti +Angove +Angrisano +Angry +Angst +Angstadt +Angton +Anguiano +Angulo +Angus +Angustia +Angviano +Angwin +Anhalt +Anhorn +Anibal +Anichini +Anick +Anidi +Aniello +Animashaun +Aningalan +Aninion +Aniol +Anis +Anitok +Ankenman +Ankeny +Anker +Ankersen +Anklam +Ankney +Ankrapp +Ankrom +Ankrum +Anliker +Ann +Anna +Annabel +Annable +Annal +Annala +Annan +Annand +Annarino +Annarummo +Annarumo +Annas +Anne +Anneler +Annen +Annese +Anness +Annett +Annette +Annibale +Annicchiarico +Annichiarico +Anning +Annino +Annis +Anno +Annon +Annonio +Annunziata +Annuzzi +Ano +Anoe +Anolick +Anon +Anos +Anreozzi +Ansara +Ansari +Ansbacher +Ansbro +Anschutz +Ansel +Ansell +Anselm +Anselmi +Anselmo +Anshutz +Ansley +Anslinger +Ansloan +Anslow +Ansoategui +Anson +Anspach +Anspaugh +Anstead +Anstett +Anstey +Anstine +Antal +Antao +Antaya +Antczak +Anteby +Antee +Antell +Antenor +Antenucci +Anter +Antes +Anthes +Anthis +Anthon +Anthony +Antich +Antignani +Antigua +Antila +Antill +Antilla +Antillon +Antinarelli +Antinore +Antinoro +Antione +Antis +Antista +Antkowiak +Antle +Antley +Antman +Antoine +Antolak +Antolik +Antolin +Antolini +Antolos +Anton +Antona +Antonacci +Antonaccio +Antonakos +Antone +Antonelli +Antonellis +Antonello +Antonetti +Antonetty +Antonia +Antoniak +Antonich +Antoniewicz +Antonini +Antonio +Antoniotti +Antoniou +Antonis +Antoniuk +Antonopoulos +Antonovich +Antonsen +Antonson +Antonucci +Antony +Antos +Antosh +Antrican +Antrikin +Antrim +Antrobus +Antronica +Anttila +Antu +Antuna +Antunes +Antunez +Antwi +Antwine +Anwar +Anway +Anyan +Anzai +Anzaldo +Anzaldua +Anzalone +Anzideo +Anzora +Anzualda +Anzures +Ao +Aoay +Aoki +Aono +Apa +Apadaca +Apadoca +Apaez +Apalategui +Apana +Aparicio +Aparo +Ape +Apel +Apela +Apelian +Aper +Aperges +Apfel +Apgar +Apicella +Apilado +Apker +Apkin +Apking +Apland +Apley +Aplin +Apling +Aplington +Apo +Apodaca +Apodace +Apodoca +Apolinar +Apolito +Apollo +Apolo +Aponta +Aponte +Apostal +Apostol +App +Appana +Appel +Appelbaum +Appelgate +Appelgren +Appeling +Appell +Appello +Appelman +Appelt +Appenzeller +Apperson +Appert +Appia +Appiah +Appl +Apple +Applebaum +Applebee +Appleberry +Applebury +Appleby +Applegarth +Applegate +Appleman +Applen +Appleton +Applewhaite +Applewhite +Appleyard +Applin +Appling +Applonie +Appolonia +Aprea +Apresa +Aprigliano +April +Aprill +Apruzzese +Apsey +Apshire +Apt +Apthorpe +Apuzzi +Apuzzo +Apyuan +Aquas +Aquero +Aquil +Aquilar +Aquilera +Aquilina +Aquilino +Aquino +Aquirre +Ar +Arab +Arabajian +Arabia +Arabian +Arabie +Aracena +Aradanas +Aragaki +Aragan +Aragao +Aragon +Aragones +Aragoni +Aragundi +Aragus +Arai +Araiza +Arakaki +Arakawa +Araki +Araldi +Aramboles +Arambuia +Arambula +Arambulo +Aramini +Aran +Arana +Aranas +Arancibia +Arand +Aranda +Araneo +Arango +Aranjo +Arano +Arant +Araque +Arashiro +Arata +Arato +Arau +Araujo +Arauz +Arave +Aravjo +Araya +Arb +Arballo +Arbaugh +Arbeiter +Arbertha +Arbetman +Arbizo +Arbo +Arbogast +Arbogust +Arboleda +Arbolida +Arbon +Arbour +Arbry +Arbucci +Arbuckle +Arbuthnot +Arca +Arcadipane +Arcand +Arcangel +Arcano +Arcaro +Arcaute +Arce +Arcea +Arcega +Arcement +Arceneaux +Arceo +Arch +Archacki +Archambault +Archambeau +Archambeault +Archangel +Archbell +Archbold +Archdale +Archer +Archey +Archibald +Archibeque +Archibold +Archie +Archila +Archilla +Archiopoli +Archuleta +Archuletta +Archut +Arcia +Arciba +Arcieri +Arciga +Arcila +Arcilla +Arciniega +Arcino +Arciola +Arcizo +Arcoraci +Arcos +Arcudi +Arcuo +Arcuri +Ard +Ardaly +Ardan +Ardd +Ardelean +Arden +Ardeneaux +Ardery +Ardinger +Ardion +Ardis +Ardito +Ardizone +Ardizzone +Ardman +Ardner +Ardoin +Ardolino +Ardon +Ardrey +Ardry +Ards +Arduini +Area +Areas +Arebalo +Arebela +Arechiga +Aredondo +Arehano +Arehart +Areias +Areizaga +Arel +Arellanes +Arellano +Arelleano +Arena +Arenales +Arenas +Arenburg +Arend +Arendale +Arendall +Arendash +Arender +Arends +Arendsee +Arendt +Arendz +Arenivar +Arenivas +Arenos +Arens +Arenson +Arenstam +Arent +Arentz +Arenz +Areola +Ares +Aresco +Arevalo +Arevalos +Arey +Arflack +Arfman +Argabright +Argall +Arganbright +Argandona +Argenal +Argenbright +Argenti +Argentieri +Argento +Argenziano +Argetsinger +Argie +Argiro +Argo +Argote +Argrave +Argro +Argrow +Argubright +Argudin +Argudo +Argue +Arguelles +Arguellez +Arguello +Argueta +Arguijo +Arguilez +Arguillo +Arguin +Argulewicz +Argumedo +Argust +Argyle +Arhart +Arhelger +Ariail +Ariano +Arias +Ariaza +Aricas +Arichabala +Arico +Aridas +Arie +Ariel +Aries +Arietta +Arif +Arigo +Arildsen +Arimas +Arimoto +Aring +Arington +Ariola +Aris +Arisa +Arismendez +Arispe +Arista +Aristide +Aristizabal +Arisumi +Arita +Ariyoshi +Ariza +Arizaga +Arizmendi +Arizola +Arizzi +Arjes +Arjona +Arjune +Arkadie +Arkell +Arkema +Arkenberg +Arkin +Arking +Arkins +Arko +Arkontaky +Arlan +Arledge +Arlen +Arleth +Arlia +Arline +Arlinghaus +Arlington +Arlotta +Arlt +Arm +Armacost +Armada +Armagost +Arman +Armand +Armando +Armant +Armantrout +Armas +Armato +Armbrester +Armbrister +Armbrust +Armbruster +Armel +Armeli +Armelin +Armen +Armendarez +Armendariz +Armengol +Arment +Armenta +Armenteros +Armento +Armentor +Armentrout +Armer +Armes +Armesto +Armfield +Armiger +Armijo +Armijos +Armillei +Armintrout +Armiso +Armistead +Armitage +Armlin +Armocida +Armold +Armon +Armond +Armor +Armour +Armout +Arms +Armson +Armstead +Armster +Armstong +Armstrong +Armwood +Army +Arn +Arnaldo +Arnall +Arnao +Arnau +Arnaud +Arnaudet +Arndell +Arndorfer +Arndt +Arne +Arneberg +Arneecher +Arnell +Arner +Arnerich +Arnesen +Arneson +Arnet +Arnett +Arnette +Arney +Arnhart +Arnhold +Arnholt +Arnholtz +Arning +Arnio +Arniotes +Arnitz +Arnn +Arno +Arnold +Arnoldi +Arnoldy +Arnone +Arnot +Arnott +Arnoux +Arnow +Arns +Arnsberger +Arnspiger +Arnst +Arnstein +Arnsworth +Arnt +Arntson +Arntt +Arntz +Arntzen +Arnwine +Arnzen +Aro +Aroca +Arocha +Aroche +Arocho +Arollo +Aromin +Aron +Arone +Aronhalt +Aronica +Aronoff +Aronov +Aronow +Aronowitz +Arons +Aronson +Aronstein +Arora +Arosemena +Arostegui +Arouri +Aroyo +Arp +Arpin +Arpino +Arps +Arquelles +Arquero +Arqueta +Arquette +Arquitt +Arra +Arraiol +Arrambide +Arrance +Arrand +Arrant +Arrants +Arras +Arrasmith +Arre +Arreaga +Arredla +Arredondo +Arreguin +Arrellano +Arrellin +Arrendell +Arrendondo +Arreola +Arrequin +Arrey +Arrez +Arrezola +Arriaga +Arriano +Arriaza +Arriazola +Arribas +Arrick +Arrieta +Arrigo +Arrigone +Arrindel +Arrington +Arriola +Arris +Arrisola +Arrison +Arritola +Arrizaga +Arrizola +Arrocha +Arrocho +Arrojo +Arroliga +Arrollo +Arron +Arrospide +Arrott +Arrow +Arrowood +Arrowsmith +Arroyano +Arroyd +Arroyo +Arroyos +Arruda +Arsenault +Arseneau +Arseneault +Arsham +Arslan +Arslanian +Art +Artale +Artalejo +Arteaga +Artega +Arter +Arterberry +Arterburn +Arterbury +Arters +Artez +Arthun +Arthur +Arthurs +Artiaga +Artibee +Artice +Arties +Artiga +Artiles +Artinger +Artinian +Artis +Artison +Artist +Artley +Artman +Artmann +Artola +Arton +Artrip +Artry +Arts +Arturo +Artus +Artuso +Artz +Artzer +Aruiso +Aruizu +Arujo +Arunachalam +Arundel +Arva +Arvan +Arvanitis +Arvay +Arvayo +Arvelo +Arvesen +Arvez +Arvidson +Arvie +Arview +Arvin +Arviso +Arvizo +Arvizu +Arwood +Ary +Arya +Arzabala +Arzaga +Arzate +Arzilli +Arzo +Arzola +Arzt +Arzu +Asa +Asad +Asaeli +Asai +Asakura +Asal +Asam +Asamoah +Asano +Asante +Asar +Asaro +Asato +Asay +Asbell +Asberry +Asbill +Asbridge +Asbury +Asby +Ascencio +Ascensio +Ascenzo +Asch +Aschan +Aschbacher +Ascheman +Aschenbach +Aschenbrener +Aschenbrenner +Ascher +Aschim +Aschmann +Aschoff +Ascol +Ascolese +Asebedo +Asel +Aselage +Aseltine +Asen +Asencio +Aseng +Asenjo +Asevedo +Asfour +Ash +Ashaf +Ashalintubbi +Ashauer +Ashbach +Ashbacher +Ashbaugh +Ashbourne +Ashbrook +Ashburn +Ashby +Ashcraft +Ashcroft +Ashdown +Ashe +Ashely +Ashenfelter +Asher +Ashfield +Ashford +Ashing +Ashkettle +Ashland +Ashley +Ashlin +Ashline +Ashlock +Ashly +Ashman +Ashmead +Ashmen +Ashmore +Ashner +Ashpole +Ashraf +Ashton +Ashurst +Ashwell +Ashwood +Ashworth +Asiedu +Asiello +Asif +Ask +Askam +Askari +Aske +Askegren +Asken +Askew +Askey +Askia +Askiew +Askin +Askins +Askland +Askren +Askvig +Askwith +Aslam +Aslanian +Asleson +Aslett +Asley +Aslin +Aslinger +Asma +Asman +Asmar +Asmus +Asmussen +Asner +Asnicar +Asp +Aspacio +Aspden +Aspegren +Aspell +Aspen +Asper +Asperheim +Aspinall +Aspinwall +Aspley +Asplin +Asplund +Aspri +Asquith +Asrari +Assad +Assael +Assaf +Assalone +Assante +Asselin +Asselmeier +Asselta +Assenmacher +Assing +Assis +Assum +Ast +Asta +Astacio +Astafan +Astarita +Aste +Asters +Astillero +Astin +Astle +Astley +Astol +Astolfi +Aston +Astor +Astorga +Astorino +Astrella +Astrologo +Astrup +Astry +Astudillo +Asturias +Astwood +Asuncion +Aswegan +Atala +Atallah +Atamanczyk +Atamian +Atanacio +Atay +Atcher +Atcheson +Atchinson +Atchison +Atchity +Atchley +Atcitty +Aten +Atencio +Atengco +Ater +Ates +Atha +Athalone +Athan +Athanasiou +Athans +Athas +Athay +Athayde +Athearn +Athens +Atherholt +Atherley +Atherton +Athey +Athmann +Athy +Atienza +Atilano +Atiles +Atiyeh +Atkerson +Atkeson +Atkin +Atkins +Atkinson +Atkison +Atkisson +Atlas +Atleh +Atma +Atmore +Atnip +Atoe +Aton +Ator +Atta +Attal +Attanasio +Attard +Attaway +Atteberry +Attebery +Atteburg +Atterberry +Atterbury +Atterson +Atthowe +Attia +Attianese +Attig +Attilio +Attinger +Attkisson +Attles +Attleson +Attridge +Attwell +Attwood +Atwater +Atwell +Atwill +Atwood +Atzhorn +Atzinger +Au +Auala +Aube +Aubel +Auber +Auberry +Aubert +Aubertine +Aubin +Auble +Aubrecht +Aubrey +Aubry +Aubuchon +Aubut +Auces +Auch +Auchmoody +Auck +Auckerman +Auckley +Auclair +Aucoin +Aucter +Aud +Audain +Audas +Audelhuk +Audet +Audette +Audi +Audia +Audibert +Audie +Audirsch +Audrey +Auduong +Aue +Auel +Auer +Auerbach +Auerswald +Aufderheide +Auffrey +Aufiero +Auge +Augello +Augenstein +Auger +Augeri +Aughe +Aughenbaugh +Aughtman +Aughtry +Augle +Augliano +Augsburger +Augspurger +August +Augusta +Augustave +Auguste +Augustin +Augustine +Augusto +Augustson +Augustus +Augustyn +Augustyniak +Auila +Auiles +Aujla +Aukamp +Auker +Aukerman +Aukes +Aul +Aulabaugh +Aulbach +Auld +Aulder +Auldridge +Aulds +Auler +Auletta +Aull +Auls +Ault +Aultman +Aultz +Auman +Aumann +Aumavae +Aumen +Aumend +Aument +Aumich +Aumick +Aumiller +Aun +Auna +Aune +Aungst +Aunkst +Aupperle +Auprey +Aurand +Aurelia +Aurelio +Aures +Aurges +Auricchio +Aurich +Auringer +Aurora +Aurrichio +Aus +Ausbrooks +Ausburn +Ausby +Ausdemore +Ausherman +Ausiello +Auslam +Ausland +Auslander +Ausley +Ausman +Ausmus +Aust +Austad +Austell +Austen +Auster +Austerberry +Austgen +Austill +Austin +Austine +Austino +Auston +Austria +Autaubo +Auten +Auter +Auteri +Autery +Authement +Auther +Authur +Autin +Autio +Autman +Autobee +Auton +Autovino +Autrano +Autrey +Autry +Autullo +Auvil +Auwaerter +Auwarter +Auxier +Auxilien +Auyer +Auyeung +Auyon +Auyong +Auzat +Auzenne +Auzston +Avala +Avallone +Avalos +Avance +Avancena +Avans +Avansino +Avant +Avants +Avanzato +Avarbuch +Avary +Ave +Aveado +Avelar +Aveles +Aveline +Avelino +Avella +Avellaneda +Avellano +Avellar +Avellino +Avello +Avena +Avendano +Aveni +Avenia +Avenoso +Avent +Aver +Avera +Averbach +Averbeck +Averett +Averette +Averhart +Averill +Averitt +Averitte +Avers +Aversa +Aversano +Avery +Averyt +Avetisyan +Avey +Avie +Avila +Avilar +Aviles +Avilez +Avilla +Avina +Avinger +Avino +Avirett +Avis +Avison +Avita +Avitabile +Avitia +Avner +Avola +Avolio +Avon +Avona +Avrett +Avril +Aw +Awad +Awada +Awai +Awalt +Awbrey +Awe +Awender +Awkard +Awkward +Awong +Awtrey +Awtry +Awyie +Ax +Axe +Axel +Axelrad +Axelrod +Axelsen +Axelson +Axford +Axley +Axline +Axman +Axon +Axsom +Axson +Axt +Axtell +Axthelm +Axtman +Axton +Ayaia +Ayala +Ayalla +Ayars +Ayarza +Aybar +Aycock +Aycox +Aydelott +Aydin +Aydlett +Aydt +Aye +Ayele +Ayer +Ayers +Ayersman +Ayhens +Aykroid +Ayles +Aylesworth +Ayling +Aylock +Aylor +Aylsworth +Aylward +Aymar +Aymond +Aynes +Ayo +Ayola +Ayon +Ayoob +Ayotte +Ayoub +Ayre +Ayres +Ayscue +Aysien +Aytes +Ayudan +Ayuso +Ayyad +Azad +Azahar +Azapinto +Azar +Azatyan +Azbell +Azbill +Azcona +Azebedo +Azeem +Azen +Azer +Azevedo +Azhocar +Azim +Azimi +Aziz +Azor +Azore +Azotea +Azoulay +Azua +Azulay +Azuma +Azure +Azzano +Azzara +Azzarella +Azzarito +Azzaro +Azznara +Azzopardi +Ba +Baab +Baack +Baade +Baadsgaard +Baar +Baars +Baarts +Baas +Baatz +Bab +Baba +Babat +Babauta +Babb +Babbel +Babbin +Babbish +Babbit +Babbitt +Babbs +Babcock +Babe +Babecki +Babel +Babena +Baber +Babers +Babeu +Babey +Babiarz +Babic +Babich +Babick +Babicke +Babicz +Babikian +Babilon +Babilonia +Babin +Babine +Babineau +Babineaux +Babington +Babino +Babinski +Babione +Babiracki +Babish +Babitsch +Babjeck +Bablak +Bable +Babonis +Babrow +Babson +Babst +Babu +Babula +Babyak +Baca +Bacak +Bacarella +Bacayo +Bacca +Baccam +Baccari +Bacchi +Bacchus +Bacco +Baccouche +Baccus +Bacerra +Bach +Bacha +Bachan +Bachand +Bachar +Bachas +Bache +Bachelder +Bachelor +Bacher +Bachert +Bachhuber +Bachicha +Bachinski +Bachleda +Bachler +Bachman +Bachmann +Bachmeier +Bachmeyer +Bachner +Bacho +Bachor +Bachorski +Bachrach +Bachrodt +Bachta +Bachtel +Bachtell +Bachtold +Bachus +Bacich +Bacigalupi +Bacigalupo +Bacik +Bacino +Bacio +Back +Backbone +Backe +Backen +Backenstose +Backer +Backers +Backes +Backey +Backfisch +Backhaus +Backhuus +Backlund +Backman +Backmon +Backous +Backstrom +Backues +Backus +Bacman +Bacolor +Bacon +Bacone +Bacorn +Bacot +Bacote +Baculpo +Bacurin +Bacus +Bacy +Baczewski +Bad +Badagliacca +Badal +Badalamenti +Badame +Badami +Badamo +Badanguio +Badasci +Baddeley +Badder +Badders +Baddley +Baddour +Bade +Badeau +Badeaux +Baden +Badena +Badenoch +Bader +Badertscher +Badey +Badger +Badgero +Badget +Badgett +Badgley +Badia +Badie +Badilla +Badillo +Badini +Badlam +Badley +Badman +Bado +Badolato +Badon +Badoni +Badour +Badruddin +Badua +Badura +Bady +Badzinski +Bae +Baehr +Baek +Baell +Baena +Baenziger +Baer +Baerg +Baerga +Baeringer +Baerlocher +Baerman +Baese +Baeskens +Baessler +Baetz +Baez +Baeza +Baff +Baffa +Bafford +Baffuto +Bafia +Bagan +Bagaoisan +Bagby +Bagdasarian +Bagdon +Bagdonas +Bageant +Bagen +Bagent +Bagg +Bagge +Baggenstoss +Bagger +Baggerly +Baggesen +Baggett +Baggette +Baggio +Baggott +Baggs +Baghdasarian +Bagheri +Bagi +Baginski +Bagley +Baglione +Bagnall +Bagnaschi +Bagnato +Bagne +Bagnell +Bagner +Bagni +Bagnoli +Bagoyo +Bagozzi +Bagron +Bagsby +Bagshaw +Bagu +Bagwell +Bagwill +Bah +Bahadue +Baham +Bahamonde +Bahar +Bahde +Bahe +Bahena +Baher +Bahl +Bahler +Bahlmann +Bahls +Bahm +Bahn +Bahner +Bahnsen +Bahoora +Bahr +Bahri +Bahrke +Bahrmasel +Bahrs +Bahun +Bai +Baibak +Baich +Baichan +Baier +Baiera +Baierl +Baig +Baik +Bail +Bailado +Bailard +Baile +Bailer +Bailes +Bailey +Bailie +Bailiff +Bailin +Baillargeon +Baille +Baillet +Bailleu +Baillie +Baillio +Bailly +Bailon +Bailony +Bailor +Baily +Baim +Baima +Bain +Bainard +Bainbridge +Baine +Bainer +Baines +Bainey +Bains +Bainter +Bainum +Baio +Baiotto +Bair +Bairam +Baird +Baires +Bairo +Bairos +Baisch +Baisden +Baise +Baisey +Baish +Baisley +Baison +Baisten +Baites +Baitg +Baitner +Baity +Baiz +Baiza +Baize +Baizer +Baj +Bajaj +Bajdas +Bajek +Bajko +Bajorek +Bajwa +Bak +Baka +Bakalar +Bakalars +Bakaler +Bakanauskas +Bake +Bakeley +Bakemeier +Baken +Baker +Bakerville +Bakes +Bakewell +Bakey +Bakhshian +Bakios +Bakkala +Bakke +Bakken +Bakker +Bakko +Bakkum +Bakley +Baklund +Bakos +Bakowski +Bakr +Baksh +Bakshi +Baksi +Bakst +Bakula +Bal +Bala +Balaam +Balaban +Baladejo +Balado +Balafoutas +Balagtas +Balak +Balancia +Balandran +Balangatan +Balanoff +Balas +Balasa +Balasco +Balash +Balaski +Balasko +Balassi +Balasubramani +Balay +Balaz +Balazs +Balbas +Balbi +Balbin +Balboa +Balboni +Balbontin +Balbuena +Balcazar +Balceiro +Balcer +Balcerzak +Balch +Balchunas +Balcitis +Balck +Balckburn +Balckwell +Balcom +Balcomb +Balcorta +Balcos +Bald +Balda +Baldacchino +Baldacci +Baldasaro +Baldassano +Baldassara +Baldassare +Baldassarre +Baldauf +Balde +Baldearena +Baldelli +Balden +Baldenegro +Balder +Balderama +Balderas +Balderrama +Balderree +Balderson +Balderston +Baldi +Balding +Baldinger +Baldini +Baldino +Baldivia +Baldiviez +Baldo +Baldock +Baldomero +Baldon +Baldonado +Baldor +Baldos +Baldree +Baldrey +Baldridge +Baldrige +Balducci +Balduf +Baldus +Balduzzi +Baldwin +Baldwyn +Baldy +Baldyga +Bale +Balensiefen +Balent +Balentine +Balerio +Bales +Balestra +Balestrieri +Balette +Baley +Balezentis +Balfany +Balfe +Balford +Balfour +Balhorn +Bali +Balian +Balich +Balick +Balicki +Baliga +Baligod +Balin +Balint +Balis +Balish +Balistreri +Balistrieri +Balitas +Balius +Balk +Balkcom +Balke +Balkey +Balkin +Balko +Balkus +Ball +Balla +Balladares +Ballagas +Ballagh +Ballam +Ballan +Ballance +Ballantine +Ballantyne +Ballar +Ballard +Ballas +Ballato +Balle +Ballejos +Ballek +Ballen +Ballena +Ballengee +Ballenger +Ballensky +Ballentine +Baller +Ballerini +Balles +Ballestas +Ballester +Ballestero +Ballesteros +Ballesterous +Balletta +Balletto +Ballew +Balley +Ballez +Balleza +Balli +Balliet +Balliett +Balliew +Ballif +Ballin +Ballina +Balling +Ballinger +Ballintyn +Ballman +Ballmann +Ballmer +Ballog +Ballon +Balloon +Ballou +Ballow +Ballowe +Ballreich +Balls +Balluch +Ballweg +Bally +Balm +Balmaceda +Balmer +Balmes +Balmir +Balmores +Balmos +Balnis +Balo +Balock +Balog +Balogh +Balogun +Balok +Balon +Balonek +Balow +Balowski +Baloy +Balque +Balsam +Balsamo +Balsano +Balser +Balsiger +Balsis +Balsley +Balson +Balster +Baltazar +Baltazor +Balter +Baltes +Balthazar +Balthazor +Balthrop +Baltierra +Baltimore +Baltodano +Balton +Baltrip +Baltruweit +Baltz +Baltzell +Baltzer +Baltzley +Balvanz +Balwin +Balwinski +Balyeat +Balza +Balzano +Balzarine +Balzarini +Balzer +Balzotti +Bamba +Bambace +Bambach +Bambaci +Bambacigno +Bambas +Bambeck +Bambenek +Bamber +Bamberg +Bamberger +Bambhrolia +Bambino +Bambrick +Bamburg +Bame +Bamfield +Bamford +Bamforth +Bammon +Ban +Banaag +Banach +Banahan +Banales +Banana +Banas +Banasiak +Banaszak +Banaszek +Banbury +Bance +Banchero +Bancks +Banco +Bancourt +Bancroft +Band +Banda +Bandanza +Bandarra +Bandasak +Bandel +Bandemer +Banderas +Bandin +Bandle +Bandley +Bandt +Banducci +Bandulin +Bandura +Bandy +Bandyk +Bane +Banecker +Banegas +Banek +Banerjee +Banerji +Banes +Banet +Baney +Banez +Banfield +Banfill +Bang +Bangert +Banghart +Bangle +Bangs +Bangura +Banh +Bania +Baniaga +Banick +Banik +Banis +Banister +Bank +Bankard +Banke +Bankemper +Banker +Bankert +Bankes +Bankey +Bankhead +Banko +Bankos +Bankowski +Banks +Bankson +Bankston +Bann +Bannan +Banner +Bannerman +Bannett +Banning +Bannister +Bannon +Bannowsky +Banome +Banos +Banowetz +Banowski +Bansal +Bansbach +Banse +Bansmer +Banta +Bantay +Banter +Banther +Bantillan +Bantin +Banton +Bantug +Bantz +Banuelos +Banvelos +Banville +Banwarth +Banwell +Banyas +Banzhaf +Baoloy +Bapties +Baptise +Baptist +Baptista +Baptiste +Baque +Baquero +Baquet +Baquiran +Bar +Bara +Baraban +Barabas +Barabin +Baraby +Baracani +Barach +Barad +Baradi +Baragan +Baragar +Barager +Baragona +Barahana +Barahona +Barajas +Barajos +Barak +Barakat +Baral +Baran +Baranga +Baranick +Baranoski +Baranovic +Baranow +Baranowski +Baranski +Baransky +Baras +Barasch +Barash +Baratta +Baratto +Baraw +Baray +Barayuga +Barb +Barba +Barbadillo +Barbagallo +Barbagelata +Barbaglia +Barbalich +Barban +Barbano +Barbar +Barbara +Barbare +Barbaria +Barbarin +Barbarino +Barbarito +Barbaro +Barbati +Barbato +Barbaza +Barbe +Barbeau +Barbee +Barbella +Barben +Barber +Barbera +Barberi +Barberian +Barberio +Barberis +Barbero +Barberr +Barbetta +Barbian +Barbie +Barbier +Barbiere +Barbieri +Barbin +Barbini +Barbish +Barbo +Barbone +Barbor +Barbosa +Barbot +Barbour +Barboza +Barbre +Barbrick +Barbu +Barbur +Barbuto +Barby +Barca +Barcello +Barcellos +Barcelo +Barcelona +Barcena +Barcenas +Barch +Barchacky +Barchick +Barchus +Barcia +Barcik +Barck +Barclay +Barcley +Barcliff +Barclift +Barco +Barcomb +Barcroft +Barcus +Barczak +Bard +Barda +Bardach +Bardales +Barde +Bardeen +Bardell +Barden +Bardes +Bardill +Bardin +Bardis +Bardney +Bardo +Bardon +Bardoner +Bardos +Bardsley +Bardwell +Bare +Barefield +Barefoot +Bareford +Bareilles +Bareis +Barela +Barella +Baremore +Barends +Barentine +Barer +Barera +Bares +Baresi +Barett +Barette +Barff +Barfield +Barfknecht +Barfoot +Barfuss +Barg +Barga +Barganier +Bargar +Bargas +Barge +Bargen +Barger +Bargeron +Bargerstock +Barges +Barginear +Bargmann +Bargo +Bargstadt +Barham +Barhorst +Barhydt +Bari +Baria +Barias +Baribeau +Barich +Barick +Barickman +Baridon +Barie +Barientos +Baril +Barile +Barill +Barillari +Barillaro +Barillas +Barillo +Barimah +Baringer +Barino +Bario +Barios +Baris +Barish +Barjas +Barjenbruch +Bark +Barkalow +Barkan +Barkdoll +Barkdull +Barke +Barkema +Barken +Barkenhagen +Barker +Barkes +Barket +Barkett +Barkhimer +Barkhurst +Barkie +Barkins +Barkle +Barkley +Barklow +Barkman +Barko +Barks +Barksdale +Barkus +Barlage +Barlak +Barlau +Barlett +Barletta +Barlette +Barley +Barlip +Barlock +Barlow +Barlowe +Barlup +Barman +Barmer +Barmes +Barmettler +Barmore +Barn +Barna +Barnaba +Barnaby +Barnacle +Barnak +Barnar +Barnard +Barnas +Barnathan +Barncastle +Barndt +Barne +Barnebey +Barnell +Barner +Barners +Barnes +Barness +Barnet +Barnett +Barnette +Barney +Barnfield +Barnhardt +Barnhart +Barnhill +Barnhouse +Barnhurst +Barnick +Barnicle +Barninger +Barno +Barnoski +Barns +Barnscater +Barnt +Barnthouse +Barnum +Barnwell +Baro +Barocio +Baroldy +Baron +Barona +Barone +Baroni +Baronne +Baroody +Baros +Barquera +Barr +Barra +Barrack +Barraclough +Barraco +Barragan +Barrale +Barran +Barranca +Barranco +Barranger +Barras +Barrasa +Barratt +Barraz +Barraza +Barre +Barreca +Barreda +Barredo +Barree +Barreira +Barreiro +Barrell +Barren +Barrena +Barreneche +Barrentine +Barrer +Barrera +Barreras +Barrero +Barresi +Barret +Barrete +Barreto +Barrett +Barretta +Barrette +Barretto +Barria +Barriault +Barribeau +Barricelli +Barrick +Barrickman +Barrie +Barrieau +Barrientes +Barrientez +Barrientos +Barrier +Barriere +Barries +Barriga +Barrigan +Barriger +Barrile +Barrilleaux +Barrineau +Barriner +Barringer +Barrington +Barrio +Barrios +Barris +Barrish +Barritt +Barro +Barrocas +Barrois +Barrom +Barron +Barros +Barroso +Barrott +Barrow +Barrowman +Barrows +Barrs +Barrus +Barry +Barryman +Bars +Barsalou +Barsamian +Barsanti +Barscewski +Barsch +Barschdoor +Barsegyan +Barsh +Barshaw +Barski +Barsky +Barsness +Barson +Barsotti +Barsoum +Barstad +Barstow +Barsuhn +Barswell +Bart +Barta +Bartamian +Bartash +Bartberger +Bartch +Bartczak +Barte +Bartee +Bartek +Bartel +Bartell +Bartels +Bartelson +Bartelt +Bartenfield +Barter +Barters +Bartgis +Barth +Bartha +Barthe +Barthel +Barthelemy +Barthell +Barthelman +Barthelmes +Barthen +Barthlow +Barthol +Barthold +Bartholemew +Bartholf +Bartholic +Bartholomay +Bartholomeu +Bartholomew +Bartholow +Bartimus +Bartin +Bartkiewicz +Bartko +Bartkowiak +Bartkowski +Bartkus +Bartl +Bartle +Bartlebaugh +Bartles +Bartleson +Bartlet +Bartlett +Bartlette +Bartley +Bartling +Bartlome +Bartlone +Bartlow +Bartman +Bartmes +Bartmess +Bartnett +Bartnick +Bartnik +Barto +Bartol +Bartoldus +Bartolet +Bartoletti +Bartoli +Bartolini +Bartolo +Bartolome +Bartolomei +Bartolomeo +Bartolomucci +Bartolone +Bartolotta +Bartolotto +Barton +Bartone +Bartos +Bartosch +Bartosh +Bartosiak +Bartosiewicz +Bartosik +Bartosz +Bartoszek +Bartow +Bartram +Bartron +Bartrop +Bartrum +Barts +Bartsch +Bartucca +Bartucci +Bartula +Bartunek +Bartus +Bartush +Bartuska +Bartylla +Bartz +Baruch +Barufaldi +Baruffa +Baruffi +Barus +Barut +Baruth +Barvick +Barvosa +Barwell +Barwick +Bary +Barz +Barze +Barzey +Basa +Basaldua +Basanta +Basara +Basbas +Bascas +Bascetta +Basch +Bascle +Basco +Bascom +Bascomb +Bascombe +Basden +Base +Basehore +Basel +Baseler +Baseley +Baselice +Baseman +Basemore +Basey +Basford +Basgall +Bash +Basha +Basham +Bashara +Bashaw +Basher +Bashford +Bashi +Bashinelli +Bashir +Bashline +Bashor +Bashore +Basich +Basil +Basila +Basile +Basiliere +Basilio +Basilone +Basinger +Basini +Basinski +Basista +Baskas +Baskerville +Basket +Baskett +Baskette +Baskin +Baskind +Baskins +Baskow +Basler +Basley +Basner +Basnett +Basnight +Basom +Bason +Basone +Basora +Basore +Basque +Basques +Basquez +Bass +Bassage +Bassali +Bassani +Bassano +Basse +Bassel +Basset +Bassett +Bassette +Bassetti +Bassford +Bassham +Bassi +Bassil +Bassin +Bassiti +Bassler +Basso +Bassolino +Bassuk +Bast +Basta +Bastain +Bastarache +Bastardi +Bastedo +Basten +Baster +Bastian +Bastianelli +Bastic +Bastick +Bastida +Bastidas +Bastidos +Bastien +Bastilla +Bastille +Bastin +Bastine +Baston +Bastone +Bastos +Bastow +Bastress +Bastura +Basu +Basua +Basulto +Basurto +Baswell +Basye +Batala +Batalla +Batalona +Batara +Batarse +Batas +Batch +Batchelder +Batcheller +Batchellor +Batchelor +Batcher +Batdorf +Bate +Batel +Bateman +Bater +Baters +Bates +Batesole +Bateson +Batey +Bath +Bathe +Bathke +Bathrick +Bathurst +Batie +Batimon +Batis +Batista +Batiste +Batistich +Batiz +Batkin +Batko +Batley +Batliner +Batlis +Batlle +Batman +Baton +Bator +Batra +Batres +Batrez +Batrich +Batrum +Batson +Batt +Batta +Battaglia +Battaglini +Battaglino +Battani +Batte +Battee +Batteen +Batteiger +Batten +Battenfield +Battenhouse +Batter +Batterman +Batters +Battersby +Battershell +Batterson +Batterton +Battey +Battiata +Battiato +Battie +Battiest +Battig +Battin +Battino +Battis +Battista +Battiste +Battisti +Battistini +Battisto +Battistone +Battistoni +Battko +Battle +Battles +Batto +Batton +Batts +Battson +Battuello +Batty +Batun +Baty +Batz +Batzer +Batzli +Batzri +Bau +Baublitz +Bauce +Bauch +Baucher +Bauchspies +Baucom +Baucum +Bauder +Baudino +Baudler +Baudoin +Baudry +Bauer +Bauerkemper +Bauerle +Bauerlein +Bauermeister +Bauernfeind +Bauers +Baugatz +Baugess +Baugh +Baugham +Baughan +Baugher +Baughey +Baughman +Baughn +Bauguess +Baugus +Bauknecht +Bauknight +Baul +Baulch +Bault +Baum +Bauman +Baumann +Baumbach +Baumberger +Baumbusch +Baumeister +Baumer +Baumert +Baumfalk +Baumgard +Baumgardner +Baumgardt +Baumgarn +Baumgarner +Baumgart +Baumgartel +Baumgarten +Baumgarter +Baumgartner +Baumhoer +Baumiester +Baumkirchner +Baumler +Baumli +Baumohl +Baun +Baune +Baunleuang +Baur +Baurer +Baures +Baus +Bausch +Bauserman +Bauske +Bausley +Bausman +Bauswell +Bautch +Baute +Bautista +Bautiste +Bautz +Bauza +Bava +Bavard +Bavaro +Bavelas +Baver +Baves +Bavier +Bavzee +Bawa +Bawany +Bawcombe +Bawcum +Bawden +Bawek +Bawer +Bawks +Bawner +Bax +Baxa +Baxendale +Baxi +Baxley +Baxter +Baxtor +Bay +Bayala +Bayani +Bayard +Bayardo +Bayas +Baydal +Bayer +Bayerl +Bayers +Bayes +Bayete +Baygents +Bayhonan +Bayird +Bayle +Bayles +Bayless +Bayley +Bayliff +Baylis +Bayliss +Baylock +Baylon +Baylor +Bayly +Bayman +Baymon +Bayn +Baynard +Bayne +Baynes +Baynham +Bayon +Bayona +Bayot +Bayouth +Bays +Baysden +Baysinger +Baysmore +Bayt +Bayton +Baytos +Bayuk +Bayus +Baza +Bazaldua +Bazan +Bazar +Bazarte +Bazata +Baze +Bazel +Bazelais +Bazemore +Bazer +Bazil +Bazile +Bazin +Bazinet +Bazner +Bazydlo +Bazylewicz +Bazzanella +Bazzano +Bazzel +Bazzell +Bazzi +Bazzle +Be +Bea +Beaber +Beabout +Beach +Beacham +Beachamp +Beachel +Beachell +Beachem +Beacher +Beachler +Beachman +Beachum +Beachy +Beacom +Beadell +Beadle +Beadles +Beadling +Beadnell +Beady +Beagan +Beagle +Beagley +Beahan +Beahm +Beahn +Beaird +Beakley +Beal +Beale +Bealer +Beales +Beall +Bealle +Bealmear +Beals +Beam +Beaman +Beamer +Beames +Beamesderfer +Beamish +Beamon +Beams +Bean +Beanblossom +Beandoin +Beane +Beaner +Beans +Bear +Bearce +Beard +Beardall +Bearded +Bearden +Beardmore +Beardon +Beards +Beardslee +Beardsley +Beare +Bearfield +Bearman +Bears +Bearse +Bearup +Beary +Beas +Beasley +Beasly +Beasmore +Beason +Beaston +Beat +Beath +Beathe +Beatie +Beatley +Beato +Beaton +Beatrice +Beatson +Beattie +Beattle +Beatty +Beaty +Beau +Beaubien +Beaubrun +Beaucage +Beauchaine +Beauchamp +Beauchemin +Beauchesne +Beaudet +Beaudette +Beaudin +Beaudine +Beaudion +Beaudoin +Beaudreau +Beaudreault +Beaudrie +Beaudry +Beaufait +Beauford +Beaufort +Beaugard +Beauharnois +Beaulac +Beaule +Beaulieu +Beauliev +Beauman +Beaumier +Beaumont +Beaumonte +Beauparlant +Beaupre +Beauprez +Beauregard +Beaureguard +Beaushaw +Beausoleil +Beauvais +Beaven +Beaver +Beavers +Beavin +Beavis +Beaz +Beazer +Beazley +Bebber +Bebeau +Bebee +Beberwyk +Bebo +Bebout +Beccaria +Beccue +Becena +Becenti +Becera +Becerra +Becerril +Bech +Bechard +Bechel +Becher +Becherer +Bechler +Bechman +Becht +Bechtel +Bechthold +Bechtol +Bechtold +Beck +Becka +Becke +Beckel +Beckelheimer +Beckelhimer +Beckem +Beckenbach +Beckendorf +Becker +Beckerdite +Beckerle +Beckerman +Beckers +Beckert +Beckes +Becket +Beckett +Beckey +Beckfield +Beckford +Beckham +Beckim +Beckius +Beckler +Beckles +Beckley +Becklin +Becklund +Beckman +Beckmann +Beckmeyer +Becknell +Beckner +Beckom +Beckor +Becks +Beckstead +Beckstrand +Beckstrom +Beckton +Beckum +Beckwith +Beckworth +Becky +Becnel +Becraft +Becton +Becvar +Becwar +Becze +Bedar +Bedard +Bedatsky +Bedaw +Beddard +Beddia +Beddingfield +Beddo +Beddoe +Beddome +Beddow +Beddows +Bede +Bedeau +Bedee +Bedeker +Bedell +Bedenbaugh +Bedenfield +Beder +Bedford +Bedgood +Bedient +Bedillion +Bedingfield +Bedker +Bedlion +Bednar +Bednarczyk +Bednarek +Bednarik +Bednarowicz +Bednarski +Bednarz +Bedner +Bedney +Bednorz +Bedocs +Bedoka +Bedolla +Bedonie +Bedor +Bedore +Bedoya +Bedre +Bedrosian +Bedsaul +Bedsole +Bedson +Bedward +Bedwell +Bee +Beebe +Beebee +Beebout +Beech +Beecham +Beecher +Beeching +Beechler +Beechner +Beechum +Beeck +Beecken +Beeckman +Beecroft +Beed +Beede +Beedham +Beedle +Beedles +Beedoo +Beedy +Beeghly +Beegle +Beehler +Beek +Beeker +Beekman +Beeks +Beel +Beelar +Beelby +Beeler +Beem +Beeman +Beemer +Beemon +Been +Beene +Beenel +Beer +Beerbohm +Beere +Beerer +Beerle +Beerling +Beerly +Beerman +Beermann +Beermudez +Beers +Beery +Bees +Beese +Beesley +Beesmer +Beeson +Beetley +Beets +Beetz +Beevers +Beezley +Befort +Befus +Bega +Began +Begay +Begaye +Begeal +Begeman +Begen +Beger +Begg +Beggs +Beghtol +Begin +Begley +Begnaud +Begnoche +Begolli +Begonia +Begor +Beguelin +Beguhl +Begum +Begun +Behal +Behan +Behanan +Behanna +Behar +Behel +Behen +Beherns +Behimer +Behizadeh +Behl +Behlen +Behler +Behling +Behlke +Behlmer +Behm +Behme +Behmer +Behn +Behne +Behner +Behney +Behning +Behnke +Behnken +Behr +Behran +Behrend +Behrends +Behrendt +Behrens +Behrenwald +Behring +Behringer +Behrle +Behrman +Behrmann +Behrns +Behun +Behunin +Behymer +Beichner +Beidleman +Beidler +Beien +Beier +Beierle +Beierschmitt +Beigert +Beighley +Beightol +Beik +Beil +Beile +Beiler +Beiley +Beilfuss +Beilinson +Beilke +Beilman +Beilstein +Bein +Beine +Beinlich +Beiriger +Beirise +Beirne +Beisch +Beisel +Beiser +Beish +Beisner +Beissel +Beisser +Beiswanger +Beiswenger +Beitel +Beiter +Beith +Beitler +Beitz +Beitzel +Beja +Bejar +Bejaran +Bejarano +Bejcek +Bejerano +Bejger +Bejil +Bejjani +Bek +Bekele +Beker +Bekerman +Bekhit +Bekins +Bekis +Bekius +Bekker +Bel +Bela +Belair +Belak +Belancer +Beland +Belanger +Belangia +Belanich +Belarde +Belardo +Belarmino +Belasco +Belay +Belback +Belcastro +Belch +Belcher +Belchior +Belcourt +Belden +Beldin +Belding +Beldon +Belen +Belew +Beley +Belezos +Belfanti +Belfast +Belfi +Belfield +Belfiglio +Belfiore +Belflower +Belford +Belfort +Belfy +Belgard +Belgarde +Belgrade +Belgrave +Belhumeur +Beliard +Belich +Belidor +Belieu +Belile +Beliles +Belin +Belina +Belinski +Belinsky +Belisle +Belitz +Beliveau +Beliz +Belizaire +Beljan +Belk +Belka +Belke +Belken +Belkin +Belknap +Belko +Belkowski +Bell +Bella +Bellace +Bellafiore +Bellah +Bellair +Bellaire +Bellamy +Bellanca +Belland +Bellanger +Bellantone +Bellantoni +Bellantuono +Bellany +Bellar +Bellard +Bellas +Bellavance +Bellavia +Bellazer +Belle +Belleau +Bellefeuille +Bellefleur +Bellefontaine +Bellehumeur +Bellemare +Bellemy +Bellen +Bellendir +Beller +Bellerdine +Bellerose +Belles +Bellessa +Bellettiere +Belletto +Belleville +Bellew +Bellfleur +Bellflower +Bellflowers +Bellhouse +Belli +Belliard +Bellido +Bellin +Bellina +Bellinder +Belling +Bellinger +Bellingham +Bellinghausen +Bellingtier +Bellini +Bellino +Bellion +Bellipanni +Bellis +Bellisario +Bellish +Bellisle +Belliston +Bellitti +Belliveau +Bellizzi +Bellman +Bellmay +Bellmore +Bello +Bellocchio +Belloma +Bellomo +Bellomy +Bellon +Bellone +Belloso +Bellott +Bellotti +Bellow +Bellows +Bellrichard +Bells +Bellucci +Bellue +Belluomini +Bellus +Bellusci +Belluz +Bellville +Belman +Belmarez +Belmont +Belmonte +Belmore +Belnap +Belnas +Beloate +Beloff +Belon +Belone +Belonger +Belongia +Belongie +Belony +Belote +Belotti +Belous +Belousson +Belovs +Below +Belrose +Belscher +Belschner +Belser +Belsey +Belshaw +Belsheim +Belsito +Belski +Belsky +Belson +Belstad +Belt +Belter +Belton +Beltrain +Beltram +Beltrame +Beltrami +Beltramo +Beltran +Beltre +Beltron +Belts +Beltz +Belue +Belveal +Belvees +Belville +Belvin +Belvins +Belwood +Belyea +Belyoussian +Belz +Belzer +Belzung +Beman +Bemben +Bemberry +Bembi +Bemboom +Bembry +Bembury +Bement +Bemer +Bemiller +Bemis +Bemiss +Bemo +Bemrich +Bemrose +Ben +Bena +Benabides +Benac +Benach +Benack +Benadom +Benafield +Benage +Benak +Benallie +Benally +Benamati +Benanti +Benard +Benari +Benasher +Benassi +Benauides +Benavente +Benavides +Benavidez +Benbenek +Benberry +Benbow +Benbrook +Bence +Bench +Benchoff +Bencivenga +Benck +Benckendorf +Bencomo +Bencosme +Bend +Benda +Bendall +Bendana +Bendas +Bendavid +Bendel +Bendele +Bendell +Bender +Benderman +Benders +Bendetti +Bendick +Bendickson +Bendig +Bending +Bendis +Bendit +Bendix +Bendixen +Bendlage +Bendle +Bendler +Bendolph +Bendorf +Bendt +Bendtsen +Bendu +Bendure +Bendy +Bendzans +Bendzus +Bene +Benear +Benecke +Benedek +Benedetti +Benedetto +Benedick +Benedict +Benedicto +Benedith +Benedix +Beneduce +Benedum +Benefiel +Benefield +Benejan +Benek +Beneke +Beneker +Benell +Benenati +Benes +Benesch +Benesh +Benestad +Benet +Benett +Beneuento +Benevento +Benevides +Beneze +Benezra +Benfer +Benfield +Benford +Benge +Bengel +Bengelsdorf +Bengochia +Bengston +Bengtson +Benhaim +Benham +Benigni +Benigno +Benik +Benike +Benimadho +Beninati +Beninato +Benincasa +Benincase +Bening +Benintendi +Benion +Beniquez +Benischek +Benisek +Benish +Benites +Benitez +Benito +Benitone +Benitz +Benjamen +Benjamin +Benjamine +Benje +Benke +Benken +Benker +Benkert +Benko +Benkosky +Benn +Bennafield +Bennage +Bennard +Benne +Bennefield +Benner +Bennerman +Bennerson +Bennes +Bennet +Benneth +Bennett +Bennette +Bennetts +Benney +Bennice +Bennick +Bennie +Bennight +Bennin +Benning +Benninger +Benningfield +Bennings +Bennington +Bennink +Bennion +Bennis +Bennison +Benno +Benns +Benny +Beno +Benoff +Benoist +Benoit +Benoy +Bens +Bensberg +Bensch +Benscoter +Bense +Bensen +Benser +Benshoof +Bensing +Bensinger +Benskin +Bensley +Bensman +Benson +Benston +Bent +Bentancourt +Bente +Bentele +Benthall +Bentham +Benthin +Benthusen +Bentivegna +Bentle +Bentler +Bentley +Bently +Bento +Benton +Bentrem +Bentrup +Bentsen +Bentson +Benty +Bentz +Bentzen +Bentzinger +Benulis +Benusa +Benvenuti +Benvenuto +Benwarc +Benward +Benware +Benway +Benwell +Benya +Benyamin +Benyard +Benyo +Benz +Benzango +Benzee +Benzel +Benzer +Benzi +Benzie +Benziger +Benzing +Benzinger +Benzschawel +Beougher +Beppu +Bequette +Bequillard +Bera +Beran +Beranek +Berard +Berardi +Berardinelli +Berardino +Berardo +Beras +Beraun +Berber +Berbereia +Berberian +Berberich +Berbes +Berbig +Bercegeay +Berceir +Berch +Bercher +Berchielli +Bercier +Berczel +Berczy +Berdahl +Berdan +Berdar +Berdecia +Berdes +Berdin +Berdine +Berdugo +Berdux +Berdy +Bereda +Beren +Berenbaum +Berends +Berendt +Berendzen +Berenger +Berenguer +Berens +Berenschot +Berenson +Berent +Berentson +Berentz +Beres +Beresford +Beresik +Beresky +Beresnyak +Berey +Berez +Bereznak +Berezny +Berfield +Berg +Berga +Bergami +Bergamine +Bergamini +Bergamo +Bergan +Bergant +Bergantzel +Berganza +Bergara +Bergdoll +Bergdorf +Berge +Bergeaux +Bergem +Bergeman +Bergemann +Bergen +Bergene +Bergener +Bergenstock +Bergenty +Berger +Bergeron +Bergerson +Bergert +Berges +Bergesen +Bergeson +Berget +Bergevin +Bergey +Bergfalk +Bergfeld +Bergfield +Berggren +Bergh +Bergholm +Bergholz +Bergin +Bergland +Berglund +Bergman +Bergmann +Bergmark +Bergmeier +Bergmeyer +Bergner +Bergo +Bergold +Bergouignan +Bergquist +Bergreen +Bergren +Bergseng +Bergsjo +Bergsma +Bergsman +Bergstedt +Bergsten +Bergstresser +Bergstrom +Bergum +Berhalter +Berhe +Berhow +Bering +Beringer +Berisford +Berish +Berisha +Berishaj +Berk +Berka +Berkbigler +Berke +Berkebile +Berkeley +Berken +Berkenbile +Berkery +Berkey +Berkhalter +Berkheimer +Berkhimer +Berkich +Berkley +Berkman +Berkoff +Berkovich +Berkovitch +Berkovitz +Berkowitz +Berks +Berkshire +Berkson +Berkstresser +Berky +Berl +Berlacher +Berland +Berlandy +Berlanga +Berley +Berliew +Berlin +Berliner +Berling +Berlinger +Berlingeri +Berlinghof +Berlingo +Berlinski +Berlo +Berlove +Berman +Bermea +Bermejo +Bermel +Bermeo +Bermers +Bermingham +Bermudes +Bermudez +Bern +Berna +Bernabe +Bernabei +Bernabo +Bernacchi +Bernacki +Bernadette +Bernal +Bernand +Bernard +Bernardez +Bernardi +Bernardin +Bernardini +Bernardino +Bernardo +Bernardon +Bernardoni +Bernarducci +Bernardy +Bernas +Bernasconi +Bernat +Bernatchez +Bernath +Bernatowicz +Bernau +Bernaudo +Bernbeck +Bernd +Berndsen +Berndt +Berne +Bernecker +Bernell +Berner +Berneri +Bernes +Bernet +Bernett +Berney +Bernhagen +Bernhard +Bernhardt +Bernhart +Bernheim +Berni +Berniard +Bernice +Bernick +Bernier +Bernieri +Berning +Berninger +Bernitsky +Bernmen +Berno +Bernon +Bernos +Bernoski +Bernosky +Bernot +Bernotas +Berns +Bernsen +Bernskoetter +Bernson +Bernstein +Bernstock +Bernstrom +Bernt +Berntsen +Berntson +Bernucho +Bero +Berquist +Berra +Berray +Berrell +Berret +Berreth +Berrett +Berretta +Berretti +Berrey +Berri +Berrian +Berridge +Berrie +Berrien +Berrier +Berrigan +Berringer +Berrio +Berrios +Berroa +Berrocal +Berrones +Berrong +Berrospe +Berry +Berryhill +Berryman +Bers +Bersamin +Bersaw +Bersch +Berschauer +Bershadsky +Berson +Berstein +Berstler +Bert +Berta +Bertagna +Bertagnoli +Bertagnolli +Bertaina +Bertalan +Bertao +Bertch +Berte +Berteau +Bertel +Bertella +Bertelle +Bertels +Bertelsen +Bertelson +Berteotti +Berth +Bertha +Berthelette +Berthelot +Berthelsen +Berther +Berthiaume +Berthold +Bertholf +Berti +Bertie +Bertin +Bertinetti +Bertini +Bertino +Bertke +Bertley +Bertling +Bertman +Berto +Bertog +Bertolami +Bertolasio +Bertoldo +Bertoli +Bertolini +Bertolino +Berton +Bertoncini +Bertone +Bertoni +Bertorelli +Bertot +Bertotti +Bertovich +Bertozzi +Bertram +Bertran +Bertrand +Bertrano +Bertrum +Bertsch +Bertsche +Bertschy +Bertucci +Bertus +Bertuzzi +Berube +Berulie +Berum +Berumen +Berver +Bervig +Berwald +Berwick +Bery +Berzas +Berzins +Berzunza +Besa +Besancon +Besanson +Besant +Besares +Besarra +Besaw +Besch +Beschorner +Besco +Beseau +Besecker +Beseke +Besemer +Besen +Besendorfer +Beser +Beserra +Beshara +Beshaw +Beshear +Beshears +Beshero +Besherse +Beshore +Besio +Beska +Beske +Beskom +Besler +Besley +Besner +Besong +Bess +Bessard +Besse +Bessel +Bessellieu +Bessemer +Bessent +Besser +Bessette +Bessey +Bessick +Bessinger +Bessire +Bessix +Bessler +Bessmer +Besso +Besson +Bessone +Best +Beste +Bester +Bestine +Beston +Bestwick +Beswick +Betacourt +Betak +Betance +Betances +Betancourt +Betancourth +Betancur +Betcher +Betenbaugh +Betenson +Betesh +Beteta +Beth +Betha +Bethany +Bethard +Bethay +Bethea +Bethel +Bethell +Bethers +Bethey +Bethke +Bethley +Bethoney +Bethune +Bethurem +Bethurum +Betit +Betita +Betker +Beto +Betran +Betry +Betsch +Betschart +Betschman +Betsill +Betsinger +Betson +Bettcher +Bettencourt +Bettendorf +Bettenhausen +Better +Betteridge +Betterley +Betterman +Betters +Betterton +Bettes +Betthauser +Betti +Betties +Bettin +Bettinger +Bettini +Bettino +Bettinson +Bettis +Bettle +Bettley +Bettman +Bettner +Betton +Bettridge +Betts +Betty +Betz +Betzel +Betzen +Betzer +Betzig +Betzler +Betzner +Betzold +Beu +Beuchat +Beuchler +Beucke +Beucler +Beuerle +Beukelman +Beukema +Beul +Beulah +Beumer +Beurskens +Beus +Beuse +Beute +Beutel +Beuter +Beuth +Beuther +Beuthin +Beutler +Beutnagel +Beuttel +Bevacqua +Bevan +Bevans +Bevard +Bevel +Bevelacqua +Bevell +Bevelle +Bevels +Bevens +Bever +Beverage +Beveridge +Beverley +Beverlin +Beverly +Bevers +Bevevino +Bevier +Bevil +Bevilacqua +Bevilaqua +Bevill +Beville +Bevington +Bevins +Bevis +Bevly +Bew +Bewick +Bewig +Bewley +Bex +Bey +Beyah +Beyal +Beyale +Beyda +Beydler +Beydoun +Beyea +Beyene +Beyer +Beyerl +Beyerlein +Beyers +Beyersdorf +Beyett +Beyke +Beyl +Beylotte +Beynon +Beyrer +Beyser +Beyt +Bez +Beza +Bezak +Bezanson +Bezdicek +Bezenek +Bezio +Bezner +Bezzo +Bhagat +Bhairo +Bhakta +Bhalla +Bhamaraniyama +Bhan +Bhandari +Bhardwaj +Bhaskar +Bhat +Bhatia +Bhatnagar +Bhatt +Bhattacharya +Bhatti +Bhayani +Bhola +Bhullar +Bi +Bia +Biafore +Biagas +Biagi +Biagini +Biagioni +Bialas +Bialaszewski +Bialczyk +Bialecki +Bialek +Bialik +Bialke +Bialy +Biamonte +Bianca +Biancaniello +Biancardi +Bianchi +Bianchin +Bianchini +Bianco +Biancuzzo +Biangone +Biard +Bias +Biase +Biasi +Biasotti +Biastock +Biava +Bibb +Bibber +Bibbins +Bibbs +Bibby +Bibeau +Bibee +Bibel +Biber +Bibian +Bibiano +Bibiloni +Bible +Bibler +Bibles +Bibo +Biby +Bica +Biccum +Bice +Bicek +Bichel +Bichler +Bichoff +Bichoupan +Bichrest +Bichsel +Bick +Bickart +Bickel +Bickelhaupt +Bickell +Bicker +Bickers +Bickerstaff +Bickerton +Bickes +Bicket +Bickett +Bickford +Bickham +Bicking +Bickle +Bicklein +Bickleman +Bickler +Bickley +Bickman +Bickmore +Bicknase +Bicknell +Bicknese +Bicksler +Biddick +Biddie +Bidding +Biddinger +Biddiscombe +Biddix +Biddle +Biddlecome +Biddleman +Biddulph +Biddy +Bideaux +Bidell +Biderman +Bidez +Bidgood +Bidlack +Bidle +Bidner +Bidon +Bidrowski +Bidstrup +Bidwell +Biebel +Bieber +Bieberle +Biedekapp +Biedenbender +Biederman +Biedermann +Biederwolf +Biedrzycki +Biegel +Biegler +Biehl +Biehle +Biehn +Bieker +Biel +Bielak +Bielat +Bielawski +Bielby +Biele +Bielec +Bielecki +Bielefeld +Bielefeldt +Bielefield +Bieler +Bielicki +Bielik +Bielinski +Bielke +Biello +Bielser +Bielski +Biemer +Bien +Bienek +Bienenstock +Biener +Bienfang +Bieniek +Bienkowski +Bienvenu +Bienvenue +Bier +Bierbaum +Bierbower +Bierbrauer +Bierce +Bierer +Bieri +Bierkortte +Bierl +Bierle +Bierlein +Bierley +Bierly +Bierman +Biermann +Biernacki +Biernat +Bierner +Bierod +Biersack +Bierschbach +Biersner +Bierstedt +Bierut +Bierwagen +Bierwirth +Biery +Bies +Bieschke +Biesecker +Biesenthal +Biesheuvel +Biesinger +Bietsch +Bievenue +Biever +Biewald +Biez +Biffar +Biffer +Biffle +Big +Bigalk +Bigas +Bigaud +Bigbee +Bigby +Bigda +Bigelow +Bigford +Bigg +Biggar +Biggard +Biggart +Bigger +Biggers +Biggerstaff +Biggins +Biggio +Biggs +Bigham +Bighorse +Bigio +Bigler +Bigley +Biglin +Biglow +Bignall +Bignell +Bigness +Bigney +Bigony +Bigos +Bigsby +Bigus +Bigusiak +Bigwood +Bihari +Bihl +Bihler +Bihm +Bijan +Bijou +Bila +Bilagody +Bilal +Bilansky +Bilazzo +Bilbao +Bilberry +Bilbo +Bilbrew +Bilbrey +Bilbro +Bilby +Bilchak +Bilcik +Bild +Bilden +Bilder +Bilderback +Bile +Bilecki +Bilek +Bilello +Biler +Biles +Biley +Bilger +Bilich +Bilinski +Bilis +Bilka +Bilkiss +Bill +Billa +Billafuerte +Billard +Bille +Billeaudeau +Billeck +Billegas +Billen +Biller +Billerbeck +Billesbach +Billet +Billeter +Billett +Billey +Billheimer +Billiar +Billick +Billie +Billiel +Billiet +Billig +Billigmeier +Billing +Billinger +Billingham +Billinghurst +Billings +Billingsby +Billingslea +Billingsley +Billingsly +Billington +Billinsley +Billiot +Billiott +Billips +Billiter +Billman +Billo +Billock +Billon +Billops +Billot +Billotte +Billotti +Billow +Bills +Billue +Billups +Billus +Billy +Bilodeau +Bilotta +Bilotti +Bilotto +Bilous +Bilsborough +Bilski +Bilson +Bilton +Biltz +Bilyeu +Bimler +Bina +Binam +Bindas +Bindel +Binder +Binderup +Bindrup +Bineau +Binegar +Bines +Binet +Binette +Binetti +Binford +Bing +Bingaman +Bingamon +Binger +Bingert +Binggeli +Bingham +Bingle +Bingler +Bingley +Bingman +Binienda +Bininger +Binion +Bink +Binker +Binkerd +Binkiewicz +Binkley +Binkowski +Binks +Binn +Binner +Binney +Binnicker +Binnie +Binning +Binns +Binsfeld +Binstock +Bintliff +Bintner +Bintz +Binz +Bio +Bionda +Biondi +Biondo +Biondolillo +Biorkman +Bippus +Bir +Birak +Birch +Birchall +Birchard +Bircher +Birchett +Birchfield +Birchler +Birchwood +Birckbichler +Birckett +Birckhead +Bird +Birden +Birdette +Birdin +Birdine +Birdinground +Birdo +Birdon +Birdow +Birdsall +Birdsell +Birdsey +Birdsong +Birdtail +Birdwell +Birely +Biren +Birenbaum +Bires +Birge +Biringer +Birk +Birkeland +Birkenhagen +Birkenhead +Birkenholz +Birkenmeier +Birkes +Birkett +Birkey +Birkhead +Birkhimer +Birkholz +Birkland +Birklid +Birkline +Birkmaier +Birkner +Birks +Birky +Birley +Birman +Birmingham +Birnbaum +Birnberg +Birnell +Birner +Birney +Birnie +Biro +Biron +Bironas +Biros +Birr +Birrell +Birrittella +Birrueta +Birsner +Birt +Birtcher +Birthwright +Birton +Birts +Birtwell +Bis +Bisaccia +Bisagna +Bisaillon +Bisanz +Bisard +Bisarra +Bisbee +Bisby +Biscahall +Biscardi +Biscari +Biscaro +Bisceglia +Bisch +Bischel +Bischke +Bischof +Bischoff +Biscocho +Biscoe +Bisconer +Bise +Bisel +Biser +Bisesi +Bisges +Bish +Bishard +Bishel +Bisher +Bishoff +Bishop +Bishopp +Bisi +Bisignano +Bisikirski +Bisio +Biskach +Bisker +Bisking +Biskup +Bisogno +Bisom +Bison +Bisonette +Bisono +Bispham +Bisping +Biss +Bissada +Bissegger +Bissel +Bissell +Bissen +Bisset +Bissett +Bissette +Bisso +Bissol +Bisson +Bissonette +Bissonnette +Bister +Bistline +Bistodeau +Bitah +Bitar +Bitetto +Bitler +Bitner +Bitonti +Bitsko +Bitsui +Bitsuie +Bittel +Bittenbender +Bitter +Bitterman +Bitters +Bittick +Bitting +Bittinger +Bittle +Bittman +Bittner +Bitto +Bitton +Bitz +Bitzel +Bitzenhofer +Bitzer +Bivans +Biven +Bivens +Biviano +Bivin +Bivings +Bivins +Bivona +Bixby +Bixel +Bixler +Bizarro +Bizcassa +Bizier +Bizub +Bizzard +Bizzaro +Bizzell +Bizzle +Bjella +Bjelland +Bjerk +Bjerke +Bjerken +Bjerknes +Bjorgen +Bjork +Bjorklund +Bjorkman +Bjorkquist +Bjorlin +Bjorn +Bjornberg +Bjornson +Bjornstad +Bjornstrom +Bjorseth +Blach +Blache +Blacher +Blachly +Blachowski +Blacio +Black +Blackaby +Blackard +Blackbird +Blackbum +Blackburn +Blacker +Blackerby +Blacketer +Blackett +Blackford +Blackgoat +Blackham +Blackhurst +Blackie +Blackington +Blackledge +Blackler +Blackley +Blacklock +Blackman +Blackmar +Blackmer +Blackmon +Blackmond +Blackmoore +Blackmore +Blacknall +Blackner +Blackshear +Blacksher +Blackshire +Blacksmith +Blackson +Blackstad +Blackstar +Blackstock +Blackston +Blackstone +Blackwall +Blackwater +Blackwelder +Blackwell +Blackwood +Blacock +Blad +Blada +Blade +Bladen +Blades +Bladt +Blady +Blaese +Blaeser +Blafield +Blagg +Blagman +Blaha +Blahnik +Blaho +Blaich +Blaida +Blailock +Blain +Blaine +Blair +Blaire +Blais +Blaisdell +Blaise +Blaize +Blake +Blakeborough +Blakeley +Blakelock +Blakely +Blakeman +Blakemore +Blakeney +Blakenship +Blaker +Blakes +Blakeslee +Blakesley +Blakeway +Blakey +Blakley +Blakney +Blakstad +Blalack +Blalock +Blamer +Blan +Blanc +Blanca +Blancarte +Blancas +Blancato +Blancett +Blanch +Blanchard +Blanche +Blanchet +Blanchett +Blanchette +Blanchfield +Blanck +Blanco +Bland +Blanda +Blander +Blandford +Blandin +Blanding +Blandino +Blando +Blandon +Blandy +Blane +Blaney +Blanford +Blanga +Blank +Blanke +Blanken +Blankenbaker +Blankenbeckle +Blankenbecler +Blankenberg +Blankenburg +Blankenship +Blankinship +Blankley +Blanko +Blanks +Blankschan +Blankship +Blankumsee +Blann +Blannon +Blanquart +Blanquet +Blanscet +Blansett +Blanton +Blanzy +Blare +Blas +Blaschke +Blasco +Blase +Blasen +Blasengame +Blasenhauer +Blaser +Blasetti +Blash +Blashak +Blasi +Blasing +Blasingame +Blasingim +Blasini +Blasius +Blaske +Blaski +Blasko +Blaskovich +Blasl +Blass +Blassingame +Blasz +Blaszak +Blaszczyk +Blatchford +Blatchley +Blatherwick +Blatnick +Blatnik +Blatt +Blatteau +Blattel +Blatter +Blatti +Blattler +Blattner +Blatz +Blau +Blauch +Blaum +Blauman +Blauser +Blausey +Blaustein +Blauvelt +Blauw +Blaxland +Blay +Blaydes +Blaydon +Blaylock +Blayney +Blaze +Blazejewski +Blazek +Blazer +Blazich +Blazier +Blazina +Blazing +Blazon +Blazosky +Blea +Bleacher +Bleak +Bleakley +Bleakney +Bleasdale +Bleattler +Bleau +Bleazard +Blecha +Blechinger +Blechman +Bleck +Blecker +Bledsaw +Bledsoe +Blee +Bleeck +Bleecker +Bleeker +Blegen +Bleggi +Blehm +Bleich +Bleicher +Bleichner +Bleier +Bleifus +Bleile +Bleiler +Bleimehl +Bleininger +Bleiweiss +Blem +Blemel +Blend +Blenden +Blender +Blenker +Blenman +Blenner +Bleser +Blesh +Blesofsky +Bless +Blessett +Blessing +Blessinger +Blessman +Blethen +Blette +Blevans +Blevens +Blevins +Blew +Blewett +Blewitt +Blews +Bley +Bleyer +Bleyl +Bleything +Blice +Blick +Blickem +Blickenstaff +Blicker +Blide +Bliek +Blier +Bliese +Bligen +Blight +Blihovde +Bliler +Blimka +Blincoe +Blind +Blindt +Bline +Blinebry +Blinka +Blinks +Blinn +Blinston +Blint +Blish +Bliske +Bliss +Blisset +Blissett +Blitch +Blitz +Bliven +Blixt +Blizard +Blizzard +Bloch +Blochberger +Blocher +Block +Blocker +Blockett +Blocklinger +Blockmon +Bloczynski +Blodgett +Bloebaum +Bloedel +Bloem +Bloemer +Bloemker +Bloes +Bloeser +Blogg +Blohm +Blois +Bloise +Blok +Blom +Blomberg +Blomdahl +Blome +Blomgren +Blomker +Blomme +Blommel +Blommer +Blomquist +Blomstrand +Blomstrom +Blondeau +Blondell +Blonder +Blondin +Blong +Blonigan +Blonsky +Blood +Bloodgood +Bloodough +Bloodsaw +Bloodsworth +Bloodworth +Bloom +Bloomberg +Bloome +Bloomer +Bloomfield +Bloomgren +Bloomingdale +Bloomquist +Bloomsburg +Bloomstrand +Bloomstrom +Bloor +Blore +Bloschichak +Blose +Blosfield +Bloss +Blosser +Blossom +Blossomgame +Blotsky +Blott +Blotter +Blough +Blouin +Blouir +Blount +Blovin +Blow +Blowe +Blower +Blowers +Bloxham +Bloxom +Bloxsom +Bloyd +Bloye +Bloyer +Blubaugh +Bludworth +Blue +Bluel +Bluemel +Bluestein +Bluett +Bluford +Bluhm +Bluitt +Blum +Bluma +Blumberg +Blume +Blumenberg +Blumenfeld +Blumenkrantz +Blumenkranz +Blumenschein +Blumenstein +Blumenstock +Blumenthal +Blumer +Blumhardt +Bluming +Blumkin +Blumstein +Blundell +Blunden +Blundo +Blunk +Blunkall +Blunt +Blurton +Blush +Blust +Blute +Bluth +Bluto +Bly +Blyden +Blye +Blyler +Blystone +Blyth +Blythe +Blyther +Blyze +Blyzes +Bo +Boadway +Boady +Boahn +Boak +Boakye +Boal +Boaldin +Boals +Boamah +Boan +Boane +Board +Boardley +Boardman +Boards +Boardway +Boardwine +Boarman +Boarts +Boas +Boast +Boateng +Boatfield +Boatman +Boatner +Boatright +Boatwright +Boaz +Bob +Boback +Bobadilla +Bobak +Bobb +Bobbett +Bobbit +Bobbitt +Bobbs +Bobby +Bobe +Bobeck +Bobek +Boben +Bober +Boberg +Bobet +Bobian +Bobic +Bobier +Bobino +Bobko +Boblak +Boblett +Boblitt +Bobo +Bobola +Bobowiec +Bobrosky +Bobrow +Bobrowski +Bobseine +Bobsin +Bobson +Bobst +Bobzien +Bocage +Bocanegra +Boccanfuso +Boccard +Boccella +Bocchi +Bocchicchio +Bocchieri +Bocchini +Bocchino +Bocci +Boccia +Boccio +Bocek +Boch +Bochat +Boche +Bochek +Bochenek +Bochenski +Boches +Bochicchio +Bochner +Bock +Bockelman +Bockelmann +Bockemehl +Bockenkamp +Bockenstedt +Bocker +Bockhorn +Bockhorst +Bocklage +Bocklund +Bockman +Bockoven +Bockover +Bockrath +Bockskopf +Boclair +Bocock +Bocook +Bocskor +Boczar +Boda +Bodah +Bodak +Bodamer +Bodary +Boday +Bodda +Boddeker +Bodden +Boddie +Boddorf +Boddy +Bode +Bodell +Bodelson +Bodemann +Boden +Bodenhagen +Bodenhamer +Bodenheimer +Bodenschatz +Bodenstein +Bodensteiner +Boderick +Bodey +Bodfish +Bodford +Bodi +Bodie +Bodiford +Bodily +Bodin +Bodine +Bodiroga +Bodison +Bodkin +Bodkins +Bodle +Bodley +Bodman +Bodnar +Bodner +Bodo +Bodon +Bodor +Bodovsky +Bodreau +Bodrey +Bodrick +Bodway +Bodwell +Bodwin +Body +Bodyfelt +Bodziony +Boe +Boebinger +Boeck +Boecker +Boeckmann +Boeckx +Boedecker +Boedeker +Boeding +Boege +Boegel +Boeger +Boeh +Boehl +Boehlar +Boehle +Boehler +Boehlke +Boehm +Boehman +Boehme +Boehmer +Boehmke +Boehne +Boehner +Boehning +Boehnke +Boehnlein +Boehringer +Boeke +Boekelman +Boeken +Boekhout +Boele +Boelk +Boelke +Boelsche +Boelter +Boemer +Boemig +Boen +Boender +Boeneke +Boenig +Boening +Boenisch +Boensch +Boepple +Boer +Boera +Boerboom +Boerger +Boeri +Boerm +Boerma +Boerner +Boero +Boers +Boersma +Boerst +Boerstler +Boes +Boesch +Boese +Boesel +Boesen +Boesenberg +Boesenhofer +Boeser +Boeshore +Boesiger +Boeson +Boespflug +Boetcher +Boettcher +Boettger +Boettner +Boeve +Boever +Boevers +Boeving +Boey +Boffa +Bofinger +Boga +Bogacki +Bogacz +Bogaert +Bogan +Bogany +Bogar +Bogard +Bogardus +Bogart +Bogatay +Bogatitus +Bogda +Bogdan +Bogdanovich +Bogdanski +Bogden +Bogdon +Boge +Bogel +Bogema +Bogen +Bogenschneide +Bogenschutz +Boger +Bogert +Bogg +Boggan +Boggess +Boggi +Boggiano +Boggio +Boggioni +Boggs +Bogguess +Boggus +Bogh +Boghosian +Boghossian +Bogie +Bogin +Bogle +Boglioli +Bognar +Bogner +Bognuda +Bogosh +Bogren +Bogucki +Bogue +Bogumil +Bogus +Bogust +Bogut +Bohac +Bohall +Boham +Bohan +Bohanan +Bohannan +Bohannon +Bohanon +Bohart +Bohaty +Bohinc +Bohl +Bohland +Bohlander +Bohlen +Bohler +Bohley +Bohlig +Bohling +Bohlinger +Bohlke +Bohlken +Bohlman +Bohlmann +Bohlsen +Bohm +Bohman +Bohmann +Bohmer +Bohmker +Bohn +Bohne +Bohnen +Bohnenblust +Bohnenkamp +Bohner +Bohnert +Bohnet +Bohney +Bohnker +Bohnsack +Boho +Bohol +Bohon +Bohonik +Bohorquez +Bohr +Bohren +Bohrer +Bohringer +Bohrman +Bohrn +Bohs +Boiani +Boice +Boid +Boie +Boies +Boike +Boilard +Boileau +Boiles +Boillot +Boin +Bois +Boisclair +Boise +Boisen +Boiser +Boisjolie +Boislard +Boisse +Boisseau +Boisselle +Boissoneault +Boissonnault +Boissonneault +Boissy +Boisuert +Boisvert +Boitel +Boitnott +Boivin +Bojanowski +Boje +Bojko +Bojorquez +Bok +Bokal +Bokanovich +Boken +Boker +Boklund +Bokman +Bokor +Bolado +Bolan +Boland +Bolander +Bolanos +Bolante +Bolar +Bolay +Bolch +Bold +Bolda +Bolde +Bolden +Boldenow +Bolder +Boldery +Boldin +Bolding +Boldizsar +Boldman +Boldon +Boldosser +Boldrin +Bolds +Boldt +Bolduan +Bolduc +Boldue +Boldul +Boldwyn +Bole +Bolebruch +Bolejack +Bolek +Bolen +Bolenbaugh +Bolender +Boler +Bolerjack +Boles +Bolevice +Boleware +Boley +Boleyn +Bolf +Bolfa +Bolger +Bolian +Bolich +Bolick +Boliek +Bolieu +Bolig +Bolin +Bolinder +Boline +Boling +Bolinger +Bolins +Bolinsky +Bolio +Bolitho +Bolivar +Boliver +Bolk +Bolka +Boll +Bolla +Bollacker +Bollaert +Bolland +Bollard +Bollbach +Bollen +Bollens +Boller +Bolles +Bollettino +Bollich +Bollie +Bollier +Bollig +Bolliger +Bollin +Bolling +Bollinger +Bollis +Bollman +Bollom +Bollozos +Bolls +Bolman +Bolner +Bolnick +Bologna +Bolognese +Bolognia +Bolon +Bolorin +Bolser +Bolstad +Bolster +Bolt +Bolte +Bolten +Bolter +Boltinghouse +Bolton +Boltz +Boluda +Bolus +Bolvin +Bolyard +Bolz +Boman +Bomar +Bomaster +Bomba +Bombaci +Bombard +Bombardier +Bomberger +Bombich +Bombino +Bomer +Bomgardner +Bomia +Bomilla +Bomkamp +Bommarito +Bommer +Bompane +Bompiani +Bomstad +Bomzer +Bon +Bona +Bonacci +Bonaccorsi +Bonaccorso +Bonadio +Bonadona +Bonadonna +Bonadurer +Bonaguidi +Bonagurio +Bonalumi +Bonam +Bonamico +Bonamo +Bonanni +Bonanno +Bonano +Bonapart +Bonaparte +Bonar +Bonardi +Bonas +Bonasera +Bonato +Bonatti +Bonaventura +Bonaventure +Bonavia +Bonavita +Bonawitz +Boncella +Bond +Bonda +Bondanza +Bonde +Bonder +Bondi +Bondoc +Bondre +Bondroff +Bonds +Bondura +Bondurant +Bondy +Bone +Bonebrake +Bonebright +Bonefield +Bonefont +Bonelli +Bonello +Bonenberger +Bonenfant +Bonepart +Boner +Bones +Boness +Bonesteel +Bonet +Boneta +Bonett +Bonetti +Bonetto +Boney +Bonfield +Bonfiglio +Bong +Bonga +Bongard +Bongartz +Bonge +Bongers +Bongiardina +Bongio +Bongiorno +Bongiovanni +Bongivengo +Bongle +Bongo +Bonham +Bonhomme +Boni +Boniello +Bonier +Boniface +Bonifacio +Bonifant +Bonifay +Bonifer +Bonifield +Bonilla +Bonillas +Bonillo +Bonin +Bonina +Bonine +Boning +Bonini +Bonino +Boniol +Bonita +Bonito +Bonjorno +Bonjour +Bonk +Bonker +Bonkowski +Bonn +Bonne +Bonneau +Bonnel +Bonnell +Bonnema +Bonnenfant +Bonner +Bonnes +Bonnet +Bonnett +Bonnette +Bonneville +Bonney +Bonnick +Bonnie +Bonnifield +Bonnin +Bonning +Bonniwell +Bonnlander +Bonno +Bonnoitt +Bonnot +Bonny +Bono +Bonomi +Bonomini +Bonomo +Bonow +Bonsal +Bonsall +Bonsee +Bonsell +Bonser +Bonsey +Bonsignore +Bonson +Bonsu +Bonte +Bontempo +Bontemps +Bonton +Bontrager +Bonucchi +Bonugli +Bonura +Bonus +Bonuz +Bonventre +Bonvillain +Bonwell +Bonyai +Bonzo +Boock +Boocks +Boocock +Boody +Booe +Booher +Book +Bookamer +Bookard +Bookbinder +Booker +Bookhardt +Bookhart +Bookman +Bookmiller +Bookout +Books +Bookter +Bookwalter +Boole +Boom +Boomer +Boomershine +Boomhower +Boon +Boone +Boonstra +Boop +Boor +Booras +Boord +Boore +Boorman +Boorom +Boos +Boosalis +Boose +Booser +Boot +Boote +Booten +Booth +Boothby +Boothe +Boothman +Boothroyd +Booton +Boots +Booty +Booze +Boozer +Bopp +Boppre +Boque +Boquet +Bora +Borah +Boran +Boratko +Borba +Borbon +Borbridge +Borchard +Borchardt +Borchelt +Borcher +Borcherding +Borchers +Borchert +Borcuk +Bord +Borda +Bordas +Borde +Bordeau +Bordeaux +Bordeleau +Bordelon +Borden +Bordenet +Bordenkircher +Border +Borders +Bordes +Bordges +Bordi +Bordin +Bordinger +Bordley +Bordner +Bordon +Bordonaro +Bordoy +Bordwell +Bordwine +Boreen +Borek +Borel +Boreland +Borell +Borella +Borelli +Borello +Boreman +Boren +Borenstein +Borer +Bores +Borey +Borg +Borgatti +Borge +Borgella +Borgelt +Borgen +Borger +Borgerding +Borgers +Borgert +Borges +Borgese +Borgeson +Borghese +Borghi +Borghoff +Borgia +Borglum +Borgman +Borgmann +Borgmeyer +Borgos +Borgstede +Borgstrom +Borguez +Boria +Borich +Boring +Borio +Boris +Borja +Borjas +Borjon +Bork +Borke +Borkenhagen +Borkholder +Borkin +Borkoski +Borkowski +Borla +Borlace +Borland +Borlin +Borling +Borman +Bormann +Bormes +Bormet +Bormuth +Born +Borne +Borneman +Bornemann +Borner +Bornhorst +Bornman +Bornmann +Borns +Bornstein +Borodec +Boroff +Borok +Borom +Boron +Boronat +Boros +Boroski +Boroughs +Borovec +Borovetz +Borowiak +Borowicz +Borowiec +Borowik +Borowski +Borozny +Borquez +Borr +Borra +Borras +Borrayo +Borre +Borreggine +Borrego +Borrell +Borrelli +Borrello +Borremans +Borrero +Borreta +Borriello +Borries +Borrigo +Borris +Borroel +Borrolli +Borromeo +Borror +Borroto +Borrow +Borruso +Bors +Borsa +Borsari +Borsellino +Borseth +Borsh +Borski +Borson +Borsos +Borst +Borstad +Borth +Borthwick +Bortignon +Bortle +Bortner +Borton +Bortz +Borucki +Boruff +Borum +Borunda +Borup +Boruvka +Borwig +Bory +Borycz +Borys +Borysewicz +Boryszewski +Borza +Borzea +Borzillo +Bos +Bosa +Bosack +Bosak +Bosarge +Boscarello +Boscarino +Bosch +Bosche +Boschee +Boschert +Boschult +Boscia +Boscio +Bosco +Bose +Bosefski +Bosell +Boseman +Bosen +Boser +Bosh +Boshard +Boshart +Boshears +Bosheers +Boshell +Boshers +Boshes +Boshnack +Bosio +Bosket +Bosko +Bosler +Boslet +Bosley +Bosma +Bosman +Boso +Bosold +Bosowski +Bosque +Bosques +Bosquet +Bosquez +Boss +Bossard +Bossardet +Bossart +Bosse +Bossen +Bossenbroek +Bosserman +Bossert +Bossey +Bosshardt +Bosshart +Bossi +Bossick +Bossie +Bossier +Bossler +Bossley +Bosson +Bost +Bostain +Bostel +Bostelman +Bostelmann +Bosten +Boster +Bostian +Bostic +Bostick +Bostock +Boston +Bostow +Bostrom +Bostwick +Boswell +Boswink +Bosworth +Botcher +Botdorf +Boteilho +Boteler +Botelho +Botellio +Botello +Botero +Both +Botha +Bothe +Bothman +Bothner +Bothof +Bothwell +Botkin +Botkins +Botner +Botos +Botras +Botros +Botsford +Bott +Botta +Bottalico +Bottari +Bottaro +Bottcher +Bottella +Bottemiller +Botten +Bottenfield +Botterbusch +Bottex +Bottgenbach +Botti +Botticello +Bottiggi +Bottiglieri +Bottin +Botting +Bottini +Bottino +Botto +Bottolene +Bottolfson +Bottom +Bottomley +Bottomly +Bottoms +Botton +Bottone +Bottoni +Bottorf +Bottorff +Bottrell +Botts +Bottum +Botwin +Botwinick +Botz +Bou +Boucaud +Bouch +Bouchaert +Bouchard +Bouche +Boucher +Bouchey +Bouchie +Bouchillon +Bouck +Boucouvalas +Boudewyns +Boudin +Boudinot +Boudjouk +Boudle +Boudoin +Boudreau +Boudreaux +Boudrie +Boudrieau +Bouer +Bouffard +Boufford +Bouges +Bough +Boughamer +Boughan +Boughman +Boughn +Boughner +Boughter +Boughton +Bougie +Bouie +Bouillion +Bouillon +Bouknight +Boulais +Boulanger +Boulay +Boulch +Boulden +Bouldin +Boulding +Boulds +Boule +Bouler +Boulerice +Bouleris +Boulet +Boulette +Bouley +Boulger +Boulier +Bouliouris +Boullion +Boulos +Boulter +Boultinghouse +Boulton +Boulware +Bouma +Bouman +Boumthavee +Bound +Bounds +Boundy +Bounleut +Bounthapanya +Bouquet +Bouquin +Bour +Bouras +Bourassa +Bourbeau +Bourbois +Bourbon +Bourbonnais +Bourdage +Bourdages +Bourdeau +Bourdeaux +Bourdier +Bourdon +Bourek +Bouret +Bourff +Bourg +Bourgault +Bourgeault +Bourgeois +Bourget +Bourgoin +Bourgoine +Bourgois +Bourgon +Bourgoyne +Bourgue +Bourjolly +Bourke +Bourland +Bourlier +Bourn +Bournazian +Bourne +Bournes +Bourns +Bourque +Bourquin +Bourraine +Bourret +Boursaw +Boursiquot +Bouse +Boushie +Bouska +Bousley +Bousman +Bousquet +Bousqute +Bousson +Boustead +Bousum +Boutchyard +Boutelle +Bouten +Boutet +Bouthillette +Bouthot +Boutiette +Boutilier +Boutin +Bouton +Boutot +Boutros +Boutte +Boutwell +Bouvia +Bouvier +Bouwens +Bouwkamp +Bouwman +Bouy +Bouyea +Bouyer +Bouza +Bova +Bovain +Bovard +Bove +Bovee +Boveja +Bovell +Boven +Bovey +Bovia +Bovian +Bovie +Bovio +Bow +Bowan +Bowar +Boward +Bowcock +Bowcutt +Bowden +Bowdich +Bowdish +Bowditch +Bowdle +Bowdler +Bowdoin +Bowdon +Bowdre +Bowdry +Bowe +Bowell +Bowels +Bowen +Bowens +Bower +Bowering +Bowerize +Bowerman +Bowers +Bowersmith +Bowersock +Bowersox +Bowery +Bowes +Bowey +Bowgren +Bowhall +Bowie +Bowin +Bowker +Bowl +Bowlan +Bowland +Bowlby +Bowlds +Bowle +Bowlen +Bowler +Bowles +Bowlet +Bowley +Bowlick +Bowlin +Bowline +Bowling +Bowlus +Bowman +Bowmer +Bown +Bownds +Bowne +Bowren +Bowring +Bowron +Bowser +Bowsher +Bowthorpe +Bowyer +Box +Boxell +Boxer +Boxley +Boxton +Boxwell +Boxx +Boyack +Boyan +Boyance +Boyanton +Boyar +Boyarski +Boyarsky +Boyas +Boyce +Boyd +Boyda +Boyde +Boyden +Boydston +Boydstun +Boye +Boyea +Boyenga +Boyens +Boyer +Boyers +Boyes +Boyett +Boyette +Boyington +Boyken +Boykin +Boykins +Boyko +Boyl +Boylan +Boyland +Boyle +Boylen +Boyles +Boylston +Boyn +Boyne +Boynes +Boynton +Boys +Boysel +Boysen +Boyson +Boyster +Boyt +Boyte +Boyter +Boyton +Boyum +Boza +Bozak +Bozard +Bozarth +Boze +Bozek +Bozell +Bozelle +Bozeman +Bozenski +Bozic +Bozich +Bozinovich +Bozman +Bozovich +Bozwell +Bozych +Bozzell +Bozzi +Bozzo +Bozzone +Braam +Braasch +Braaten +Braatz +Braband +Brabant +Brabazon +Brabble +Brabec +Brabham +Braboy +Brabson +Brabston +Bracaloni +Bracamonte +Bracamontes +Braccia +Bracco +Brace +Bracero +Bracetty +Bracewell +Bracey +Brach +Bracher +Brachle +Brachman +Bracht +Brack +Brackbill +Brackeen +Brackelsberg +Brackemyre +Bracken +Brackenbury +Brackenridge +Brackens +Bracker +Bracket +Brackett +Brackey +Brackin +Brackins +Brackley +Bracklin +Brackman +Brackney +Bracks +Bracy +Brad +Bradac +Bradberry +Bradburn +Bradbury +Bradby +Bradd +Braddock +Braddy +Brade +Bradeen +Braden +Brader +Bradey +Bradfield +Bradford +Bradfute +Bradham +Bradica +Bradicich +Bradick +Bradigan +Brading +Bradish +Bradley +Bradly +Bradmon +Bradner +Bradney +Bradon +Bradrick +Bradshaw +Bradsher +Bradstreet +Bradt +Bradtke +Bradway +Bradwell +Brady +Braegelmann +Braff +Brafford +Brafman +Braga +Bragado +Bragan +Bragas +Bragdon +Brage +Brager +Braget +Bragg +Braggs +Brague +Brah +Braham +Brahler +Brahm +Brahney +Braig +Brailey +Brailford +Brailsford +Braim +Brain +Brainard +Brainerd +Brais +Braisted +Braithwaite +Braitman +Brak +Brake +Brakebill +Brakefield +Brakeman +Braker +Brakhage +Brakke +Brakstad +Braley +Bralley +Brallier +Braly +Bram +Bramall +Braman +Bramante +Bramasco +Brambila +Bramble +Bramblett +Brame +Bramel +Bramer +Bramhall +Bramham +Bramlet +Bramlett +Bramlette +Bramley +Bramlitt +Brammell +Brammer +Bramon +Bramsen +Bramson +Bramucci +Bramuchi +Bramwell +Bran +Brana +Branagan +Branam +Branaman +Branan +Branaugh +Branca +Brancaccio +Brancanto +Brancati +Brancato +Brancazio +Branch +Branchaud +Branche +Brancheau +Branciforte +Branck +Branco +Brand +Brandal +Brandau +Brandauer +Brande +Brandeis +Brandel +Brandeland +Branden +Brandenberg +Brandenberger +Brandenburg +Brandenburger +Brander +Brandes +Brandewie +Brandi +Brandis +Brandl +Brandle +Brandler +Brandley +Brandly +Brandman +Brandner +Brando +Brandolini +Brandolino +Brandom +Brandon +Brandorff +Brandow +Brands +Brandsrud +Brandstetter +Brandstrom +Brandt +Brandwein +Brandy +Branecki +Branen +Braner +Branes +Branford +Brang +Brangan +Brangers +Branham +Branhan +Braniff +Branigan +Branin +Branine +Brank +Branker +Brankovich +Brann +Brannam +Brannan +Brannen +Branner +Brannick +Brannigan +Brannin +Branning +Brannock +Brannon +Brannum +Brano +Branon +Branot +Branscom +Branscomb +Branscombe +Branscome +Branscum +Branseum +Bransfield +Bransford +Branske +Branski +Bransom +Branson +Branstad +Branstetter +Branstrom +Branstutter +Brant +Branter +Branting +Brantingham +Brantley +Brantly +Brantner +Branton +Brantz +Branum +Branyan +Branyon +Branz +Brar +Bras +Brasby +Brasch +Brase +Brasel +Braseth +Brasfield +Brash +Brashaw +Brashear +Brashears +Brasher +Brashers +Brashier +Brasier +Brasil +Brasington +Brasket +Braskett +Braskey +Brass +Brassard +Brasseaux +Brassell +Brasser +Brasseur +Brasseux +Brassfield +Brassil +Brasswell +Brasuell +Brasure +Braswell +Bratcher +Bratchett +Bratek +Brath +Brathwaite +Bratsch +Bratt +Brattain +Bratten +Brattin +Bratton +Bratu +Bratz +Brau +Brauch +Braucher +Brauchla +Braucht +Braucks +Braud +Braue +Brauer +Braught +Braughton +Braukus +Braulio +Brault +Braum +Brauman +Braun +Braunbeck +Braunberger +Braund +Braune +Brauner +Brauning +Braunschweige +Braunsdorf +Braunstein +Braunwarth +Brause +Brautigam +Bravard +Bravata +Brave +Bravender +Braver +Braverman +Bravo +Brawdy +Brawer +Brawley +Brawn +Brawner +Braxton +Bray +Brayboy +Braye +Brayer +Brayley +Braylock +Brayman +Braymer +Braymiller +Brayton +Braz +Brazan +Brazeal +Brazeau +Brazee +Brazel +Brazell +Brazelton +Brazen +Brazie +Braziel +Brazier +Brazil +Brazile +Brazill +Brazille +Brazington +Brazinski +Brazle +Brazler +Brazzel +Brazzell +Brazzi +Brazzle +Brdar +Brea +Breach +Bread +Bready +Breakell +Breaker +Breakey +Breakfield +Bream +Brean +Breard +Brearley +Breashears +Breath +Breau +Breaud +Breault +Breaux +Breaz +Breazeal +Breazeale +Brebes +Breceda +Brech +Brechbiel +Brechbill +Brecheen +Brecheisen +Brechner +Brecht +Brechtel +Breck +Breckel +Breckenridge +Breckenstein +Breckinridge +Breckley +Breda +Bredahl +Brede +Bredehoft +Bredemeier +Breden +Bredernitz +Bredesen +Bredeson +Bredeweg +Bredice +Bredin +Bredlow +Bredow +Bredy +Bree +Breece +Breech +Breed +Breedan +Breeden +Breeding +Breedlove +Breedon +Breehl +Breeland +Breeman +Breen +Breer +Brees +Breese +Breeze +Brefka +Bregantini +Brege +Bregel +Breger +Bregman +Bregon +Brehant +Brehaut +Breheny +Brehm +Brehmer +Brehon +Brehony +Brei +Breidel +Breidenbach +Breidenbaugh +Breidenstein +Breidenthal +Breidigan +Breier +Breighner +Breihan +Breiland +Breiling +Breiner +Breines +Breining +Breisch +Breister +Breit +Breitbach +Breitbart +Breitbarth +Breiten +Breitenbach +Breitenberg +Breitenbucher +Breitenfeldt +Breitenstein +Breiter +Breithaupt +Breitkreutz +Breitling +Breitmeyer +Breitung +Breitweiser +Brekke +Breland +Brelje +Brelsford +Brem +Breman +Bremer +Bremme +Bremmer +Bremner +Brems +Bremseth +Bren +Brenagh +Brenaman +Brence +Brenchley +Brend +Brenda +Brendal +Brendel +Brendeland +Brenden +Brender +Brendle +Brendlinger +Brendon +Brenek +Breneman +Brener +Brenes +Brengettey +Brengle +Brenhaug +Brening +Breniser +Brenna +Brennaman +Brennan +Brennecke +Brenneis +Brenneman +Brennen +Brennenstuhl +Brenner +Brennick +Brenning +Brennon +Brenowitz +Brensel +Brensinger +Brensnan +Brent +Brentano +Brentari +Brentley +Brentlinger +Brentnall +Brenton +Brents +Brentson +Brentz +Breon +Brereton +Brescia +Bresciani +Bresee +Bresemann +Bresett +Bresette +Breshears +Breske +Bresko +Breslauer +Breslawski +Bresler +Breslin +Breslow +Bresnahan +Bresnan +Bresolin +Bresse +Bresser +Bressette +Bressi +Bressler +Bressman +Brest +Brester +Bretado +Bretana +Breth +Brethour +Bretl +Breton +Bretos +Brett +Bretthauer +Brettmann +Bretto +Brettschneide +Bretz +Breu +Breuer +Breunig +Breuning +Breuninger +Breutzman +Breutzmann +Brevard +Brevell +Brevig +Brevik +Brevil +Brevitz +Brevo +Brew +Brewbaker +Brewen +Brewer +Brewington +Brewster +Brewton +Brey +Breyer +Breyers +Breyfogle +Brez +Brezeale +Brezee +Brezenski +Brezina +Brezinka +Brezinski +Breznak +Breznay +Bria +Briagas +Brian +Briand +Briano +Brians +Briant +Briante +Briar +Briare +Bribiesca +Brice +Briceno +Brichetto +Brick +Brickel +Brickell +Bricker +Brickett +Brickey +Brickhouse +Brickle +Brickles +Brickley +Brickman +Bricknell +Brickner +Brickson +Briddell +Briddick +Bride +Brideau +Bridegroom +Briden +Bridenbaker +Bridenbaugh +Bridenbecker +Bridendolph +Bridenstine +Bridge +Bridgeford +Bridgeforth +Bridgeman +Bridgens +Bridger +Bridgers +Bridges +Bridget +Bridgett +Bridgette +Bridgewater +Bridgford +Bridgforth +Bridgham +Bridgman +Bridgmon +Bridjmohan +Bridson +Bridwell +Bried +Briede +Brieger +Briehl +Briel +Brien +Brienen +Brieno +Brient +Brienza +Brier +Briere +Brierley +Brierly +Brierre +Brierton +Bries +Briese +Brigance +Brigante +Briganti +Brigantino +Brigg +Briggeman +Briggerman +Brigges +Briggman +Briggs +Brigham +Brighenti +Brighi +Bright +Brightbill +Brighter +Brightful +Brightharp +Brightly +Brightman +Brighton +Brightwell +Briglia +Brigman +Brigmond +Brignac +Brigner +Brignolo +Brignoni +Briguglio +Brihm +Brihon +Briles +Briley +Brilhante +Brill +Brilla +Brillant +Brillhart +Brilliant +Brillon +Brilowski +Brim +Brimage +Brimer +Brimeyer +Brimfield +Brimhall +Brimley +Brimm +Brimmage +Brimmer +Brin +Brinar +Brincat +Brincefield +Brinck +Brinckerhoff +Brincks +Brinda +Brindamour +Brindel +Brindger +Brindisi +Brindle +Brindley +Brindza +Brine +Brinegar +Briner +Brines +Briney +Bring +Bringantino +Bringard +Bringas +Bringer +Bringham +Bringhurst +Bringle +Bringman +Brinich +Brining +Brininger +Brinius +Brink +Brinker +Brinkerhoff +Brinkhaus +Brinkley +Brinkly +Brinkman +Brinkmann +Brinkmeier +Brinkmeyer +Brinks +Brinlee +Brinley +Brinn +Brinsfield +Brinson +Brint +Brintnall +Brinton +Briola +Brion +Briones +Brisban +Brisbane +Brisbin +Brisbois +Brisbon +Brisbone +Brisby +Brisco +Briscoe +Brisendine +Briseno +Brisentine +Brisk +Brisker +Briskey +Briski +Brisky +Brislan +Brisley +Brislin +Brison +Brissett +Brissette +Brissey +Brisson +Brister +Bristle +Bristo +Bristol +Briston +Bristow +Britain +Britcher +Brite +Britnell +Brito +Brits +Britsch +Britschgi +Britson +Britt +Brittain +Brittan +Britten +Brittenham +Brittian +Brittin +Brittingham +Brittle +Brittman +Britto +Britton +Britts +Brittsan +Britz +Brix +Brixey +Brixius +Brixner +Briz +Brizendine +Brizeno +Brizuela +Brletich +Bro +Broach +Broad +Broadaway +Broadbent +Broaddus +Broaden +Broadfoot +Broadhead +Broadhurst +Broadie +Broadnax +Broadnay +Broadrick +Broadstone +Broadstreet +Broadus +Broadwater +Broadway +Broadwell +Broady +Broas +Brobeck +Broberg +Brobst +Brocato +Broccoli +Broccolo +Broce +Broch +Brochard +Brochet +Brochhausen +Brochu +Brochure +Brociner +Brocious +Brock +Brockberg +Brockel +Brockell +Brockelmeyer +Brockenberry +Brocker +Brockert +Brockett +Brockhaus +Brockhouse +Brockie +Brockington +Brocklebank +Brocklehurst +Brocklesby +Brockman +Brockmann +Brockmeier +Brockmeyer +Brockney +Brocks +Brockus +Brockway +Brockwell +Brod +Broda +Brodbeck +Broddy +Brode +Brodell +Broden +Broder +Broderick +Brodersen +Broderson +Brodes +Brodess +Brodeur +Brodey +Brodfuehrer +Brodhag +Brodhead +Brodhurst +Brodi +Brodie +Brodigan +Brodin +Brodine +Brodis +Brodish +Brodka +Brodmerkel +Brodnax +Brodnex +Brodnicki +Brodowski +Brodrick +Brodsho +Brodsky +Brodt +Brodtmann +Brody +Brodzik +Broe +Broeckel +Broege +Broekemeier +Broeker +Broenneke +Broering +Broerman +Broermann +Broers +Broersma +Brofft +Brofman +Brog +Brogan +Brogden +Brogdon +Brogglin +Brogley +Broglie +Broglio +Brogna +Brogren +Brohawn +Brohl +Brohn +Broich +Broida +Broitzman +Brojakowski +Brokaw +Broker +Broking +Brokins +Brokke +Broks +Brola +Broll +Brom +Bromagen +Broman +Brombach +Bromberek +Bromberg +Brome +Bromfield +Bromley +Brommer +Bromwell +Bron +Bronaugh +Broncheau +Bronchetti +Bronder +Brondyke +Broner +Brong +Bronikowski +Bronk +Bronn +Bronner +Bronsky +Bronson +Bronstad +Bronstein +Bronston +Bronw +Bronzo +Brood +Broody +Brook +Brooke +Brookens +Brooker +Brookes +Brookfield +Brookhart +Brookhouse +Brookie +Brooking +Brookings +Brookins +Brooklyn +Brookman +Brookover +Brooks +Brookshaw +Brookshear +Brooksher +Brookshier +Brookshire +Brookskennedy +Broom +Broome +Broomell +Broomes +Broomfield +Broomhall +Broomhead +Brooms +Brophy +Brosch +Broschinsky +Broscious +Brosco +Brose +Brosey +Brosh +Brosi +Brosig +Brosious +Brosius +Broski +Brosky +Brosman +Brosnahan +Brosnan +Bross +Brossard +Brossart +Brosseau +Brossett +Brossman +Brossmann +Brossoit +Brost +Brostoff +Brostrom +Brotemarkle +Broten +Brothen +Brothern +Brothers +Brotherson +Brotherton +Brotman +Brott +Brotzman +Broudy +Brough +Brougham +Brougher +Brought +Broughton +Brouhard +Brouillard +Brouillet +Brouillette +Brouk +Broumley +Broun +Brounson +Brous +Brousard +Brouse +Broussard +Brousseau +Brouwer +Brouwers +Brow +Broward +Browder +Browe +Browen +Brower +Browers +Browing +Browley +Browm +Browman +Brown +Brownd +Browne +Brownell +Browner +Brownfield +Brownie +Browning +Brownle +Brownlee +Brownley +Brownlie +Brownlow +Brownrigg +Browns +Brownsberger +Brownson +Brownstein +Brownsword +Brownsworth +Brownwood +Browy +Brox +Broxson +Broxterman +Broxton +Broy +Broyhill +Broyle +Broyles +Broz +Brozek +Brozell +Brozena +Brozeski +Brozie +Brozina +Brozovich +Brozowski +Brozyna +Brroks +Brubach +Brubaker +Brubeck +Brucato +Bruccoleri +Brucculeri +Bruce +Bruch +Bruchey +Bruchman +Brucie +Bruck +Brucken +Brucker +Brucki +Bruckman +Bruckmeier +Bruckner +Brucks +Brucz +Bruder +Bruderer +Brudner +Brudnicki +Brue +Bruechert +Brueck +Brueckman +Brueckner +Brueggeman +Brueggemann +Bruegger +Bruegman +Bruemmer +Bruen +Bruender +Bruenderman +Bruening +Bruer +Brueske +Bruess +Bruestle +Bruff +Bruffee +Brug +Brugal +Bruggeman +Brugger +Bruggman +Brugh +Brugler +Brugliera +Brugman +Brugnoli +Bruh +Bruhn +Bruin +Bruington +Bruins +Bruk +Bruker +Brule +Bruley +Brull +Brulotte +Brum +Brumaghim +Brumbach +Brumback +Brumbalow +Brumbaugh +Brumbelow +Brumble +Brumbley +Brumby +Brumer +Brumet +Brumett +Brumfield +Brumit +Brumitt +Brumleve +Brumley +Brumlow +Brumm +Brummel +Brummell +Brummer +Brummet +Brummett +Brummitt +Brummond +Brumsey +Brumwell +Brun +Bruna +Brunback +Brunckhorst +Brund +Brundage +Brunderman +Brundidge +Brundige +Brundin +Brundrett +Brune +Bruneau +Brunecz +Brunell +Brunelle +Brunelli +Bruner +Brunet +Brunett +Brunetta +Brunette +Brunetti +Brunetto +Bruney +Brunfield +Brungard +Brungardt +Bruni +Brunick +Bruning +Brunjes +Brunk +Brunke +Brunken +Brunker +Brunkhardt +Brunkhorst +Brunkow +Brunmeier +Brunn +Brunnemer +Brunner +Brunnett +Bruno +Brunot +Brunow +Bruns +Brunscheen +Brunskill +Brunson +Brunsting +Brunston +Brunsvold +Brunswick +Brunt +Brunton +Bruntz +Brunz +Brunzel +Brus +Bruscato +Bruschi +Bruschke +Bruscino +Brusco +Bruse +Brush +Brushwood +Bruski +Bruso +Bruson +Bruss +Brusseau +Brussel +Brussell +Brusser +Brust +Bruster +Brustkern +Brustmann +Brusuelas +Brutger +Brutlag +Bruton +Brutsch +Brutus +Bruun +Bruyere +Bruyn +Bruzas +Bruzek +Bruzewicz +Bruzewski +Brwon +Bryan +Bryand +Bryans +Bryant +Bryar +Bryars +Bryce +Bryd +Bryden +Brydges +Brydon +Brye +Bryer +Bryington +Bryk +Bryla +Brymer +Bryne +Bryner +Brynestad +Brynga +Bryngelson +Brynteson +Bryon +Brys +Bryson +Bryton +Bryum +Brzenk +Brzezicki +Brzezinski +Brzezowski +Brzoska +Brzostek +Brzostowski +Brzozowski +Brzuchalski +Brzycki +Bua +Bual +Buanno +Bub +Buba +Bubak +Buban +Bubar +Bubash +Bubb +Bubbico +Buben +Bubert +Bubier +Bubis +Bublitz +Buboltz +Bubolz +Bubrig +Bucanan +Bucaram +Bucaro +Buccellato +Buccheri +Bucchin +Bucci +Bucciarelli +Buccieri +Bucciero +Buccino +Bucco +Bucek +Bucey +Buch +Buchal +Buchalter +Buchaman +Buchan +Buchana +Buchanan +Buchann +Buchannan +Buchannon +Buchanon +Buchar +Buchauer +Buchberger +Buchbinder +Bucheli +Buchenau +Bucher +Buchert +Buchetto +Buchheim +Buchheit +Buchholtz +Buchholz +Buchinski +Buchinsky +Buchite +Buchko +Buchler +Buchli +Buchman +Buchmann +Buchmeier +Buchmiller +Buchna +Buchner +Bucholtz +Bucholz +Buchs +Buchsbaum +Buchser +Buchta +Buchtel +Buchwald +Buchwalter +Bucio +Buck +Buckalew +Buckaloo +Buckbee +Bucke +Buckel +Buckelew +Buckendorf +Bucker +Buckett +Buckey +Buckhalter +Buckham +Buckhanan +Buckhannon +Buckhanon +Buckholtz +Buckholz +Buckingham +Buckland +Buckle +Buckler +Buckles +Buckless +Bucklew +Buckley +Bucklin +Buckman +Buckmaster +Buckmeon +Buckmiller +Bucknam +Bucknell +Buckner +Bucknor +Bucko +Buckovitch +Buckreis +Buckridge +Bucks +Buckson +Buckwald +Buckwalter +Buco +Bucolo +Bucy +Buczak +Buczek +Buczko +Buczkowski +Buczynski +Bud +Buda +Budak +Buday +Budd +Budde +Buddemeyer +Budden +Buddenhagen +Buddie +Buddington +Buddle +Budds +Buddy +Buden +Buder +Budesa +Budge +Budhram +Budhu +Budiao +Budin +Budine +Budinich +Budish +Budke +Budlong +Budney +Budnick +Budniewski +Budnik +Budreau +Budrovich +Budrow +Budworth +Budy +Budz +Budzik +Budzinski +Budziszewski +Budzyna +Budzynski +Bue +Bueche +Buechel +Buechele +Buecher +Buechler +Buechner +Bueckers +Buege +Bueggens +Buegler +Buehl +Buehler +Buehlman +Buehner +Buehring +Buehrle +Buel +Bueler +Buell +Buelna +Buelow +Buemi +Buen +Buena +Buenaventura +Buendia +Buenger +Buening +Bueno +Buenrostro +Buentello +Buenviaje +Buer +Buerge +Buergel +Buerger +Buerk +Buerkle +Buerstatte +Bueschel +Buescher +Buesgens +Buesing +Buess +Bueter +Bueti +Buetow +Buetti +Buettner +Buff +Buffa +Buffalo +Buffaloe +Buffett +Buffey +Buffin +Buffington +Buffkin +Buffo +Buffone +Bufford +Buffum +Buffy +Bufkin +Buford +Bufton +Buganski +Bugarewicz +Bugarin +Bugay +Bugayong +Bugbee +Bugenhagen +Bugett +Bugg +Bugge +Buggie +Buggs +Buggy +Bugh +Bugler +Buglione +Buglisi +Bugna +Bugni +Bugos +Bugtong +Buhite +Buhl +Buhler +Buhlig +Buhman +Buhmann +Buhoveckey +Buhr +Buhrke +Buhrman +Bui +Buice +Buie +Buike +Buikema +Builes +Buis +Buissereth +Buisson +Buist +Buitrago +Buitron +Buja +Bujak +Bujarski +Bujnowski +Bujol +Buker +Bukhari +Bukovac +Bukovsky +Bukowiecki +Bukowinski +Bukowski +Bukrim +Bula +Bulacan +Bulan +Buland +Bularz +Bulat +Bulcao +Buley +Bulfer +Bulgarella +Bulger +Bulgin +Bulgrin +Bulick +Bulik +Bulin +Bulinski +Bulisco +Bulkeley +Bulkin +Bulkley +Bull +Bulla +Bulland +Bullara +Bullard +Bullaro +Bulle +Bullen +Buller +Bulleri +Bullers +Bullert +Bullerwell +Bullett +Bullie +Bullin +Bulliner +Bullinger +Bullington +Bullins +Bullion +Bullis +Bullivant +Bullman +Bullmore +Bullo +Bulloch +Bullock +Bullocks +Bulls +Bulluck +Bulman +Bulmer +Bulnes +Bulock +Bulosan +Bulow +Bulson +Bult +Bultema +Bulter +Bultman +Bultron +Bulwinkle +Buman +Bumatay +Bumba +Bumbaca +Bumbalo +Bumbalough +Bumbray +Bumbrey +Bumby +Bumford +Bumgardner +Bumgarner +Bumm +Bump +Bumpas +Bumpass +Bumpaus +Bumpers +Bumps +Bumpus +Bumstead +Bun +Bunal +Bunce +Bunch +Bunche +Bunck +Bunda +Bundage +Bunde +Bundette +Bundi +Bundick +Bundley +Bundren +Bundrick +Bundschuh +Bundy +Bunes +Bunetta +Bungard +Bungart +Bungay +Bunge +Bunger +Bungert +Bungo +Bungy +Bunk +Bunke +Bunker +Bunkers +Bunkley +Bunn +Bunnell +Bunner +Bunning +Bunselmeyer +Bunson +Bunt +Buntain +Bunte +Bunten +Buntenbach +Buntin +Bunting +Buntjer +Bunton +Buntrock +Bunts +Buntyn +Buntz +Bunyan +Bunyard +Bunyea +Bunzey +Buol +Buonadonna +Buonaiuto +Buonamici +Buonanno +Buonassisi +Buono +Buonocore +Buonomo +Buontempo +Buote +Buoy +Bupp +Buquet +Buquo +Bur +Burak +Burakowski +Buran +Burandt +Buras +Buratti +Burau +Burba +Burbach +Burback +Burbage +Burbank +Burbano +Burbidge +Burbine +Burbridge +Burby +Burce +Burch +Burcham +Burchard +Burchell +Burchess +Burchett +Burchette +Burchfiel +Burchfield +Burchill +Burchinal +Burciaga +Burcin +Burck +Burckhard +Burczyk +Burd +Burda +Burde +Burdell +Burden +Burdeshaw +Burdess +Burdett +Burdette +Burdex +Burdg +Burdge +Burdi +Burdick +Burdier +Burdin +Burdine +Burdis +Burditt +Burdman +Burdo +Burdock +Burdon +Burdsall +Burdzel +Bure +Bureau +Burel +Burell +Buren +Bures +Buresh +Buress +Buretta +Burfeind +Burfield +Burford +Burg +Burga +Burgamy +Burgan +Burgard +Burgardt +Burgas +Burgbacher +Burgdorf +Burgdorfer +Burge +Burgees +Burgen +Burgener +Burger +Burgert +Burges +Burgeson +Burgess +Burget +Burgett +Burgette +Burgey +Burggraf +Burgh +Burghard +Burghardt +Burghart +Burgher +Burgie +Burgin +Burgio +Burglin +Burgman +Burgner +Burgo +Burgoa +Burgoon +Burgos +Burgoyne +Burgraff +Burgs +Burgueno +Burgun +Burgy +Burham +Burhans +Burhanuddin +Buri +Burian +Burich +Burick +Burigsay +Burin +Burington +Buris +Burk +Burka +Burkard +Burkart +Burkdoll +Burke +Burkeen +Burkel +Burker +Burkert +Burkes +Burket +Burkett +Burkette +Burkey +Burkhalter +Burkham +Burkhammer +Burkhard +Burkhardt +Burkhart +Burkhead +Burkholder +Burki +Burkin +Burkins +Burkitt +Burkland +Burkle +Burkleo +Burkley +Burklow +Burkly +Burkman +Burkowski +Burks +Burkstrand +Burl +Burlage +Burland +Burlando +Burlaza +Burle +Burleigh +Burleson +Burlett +Burlette +Burlew +Burley +Burlile +Burlin +Burling +Burlingame +Burlingham +Burlington +Burlison +Burlock +Burlson +Burly +Burm +Burman +Burmaster +Burmeister +Burmester +Burmside +Burn +Burnam +Burnaman +Burnap +Burnard +Burnash +Burnaugh +Burneisen +Burnell +Burner +Burnes +Burness +Burnet +Burnett +Burnette +Burney +Burnham +Burnias +Burnie +Burningham +Burnison +Burnley +Burno +Burns +Burnsed +Burnside +Burnstein +Burnsworth +Burnum +Burnworth +Buro +Buroker +Buron +Burow +Burows +Burpee +Burpo +Burr +Burrage +Burrall +Burras +Burrel +Burrell +Burrelli +Burrer +Burres +Burreson +Burress +Burri +Burrichter +Burridge +Burrier +Burries +Burriesci +Burright +Burrill +Burrington +Burris +Burriss +Burritt +Burrola +Burross +Burrough +Burroughs +Burrous +Burrow +Burrowes +Burrows +Burrs +Burruel +Burrup +Burrus +Burruss +Burry +Bursch +Burse +Bursell +Bursey +Bursi +Bursik +Bursley +Burson +Burstein +Burston +Burt +Burtch +Burtchell +Burtell +Burtenshaw +Burth +Burtin +Burtis +Burtle +Burtless +Burtman +Burtner +Burton +Burts +Burtschi +Burtt +Burttram +Burtts +Burum +Burvine +Burwell +Burwick +Burwinkel +Burwood +Bury +Burzlaff +Burzynski +Busa +Busacca +Busack +Busacker +Busalacchi +Busard +Busbee +Busbey +Busbin +Busboom +Busby +Buscaglia +Buscarino +Buscemi +Busch +Busche +Buscher +Buschman +Buschmann +Buschner +Buschur +Buse +Buseck +Buseman +Busenbark +Busenius +Buser +Busey +Bush +Bushard +Bushart +Bushaw +Bushby +Bushee +Bushell +Busher +Bushey +Bushfield +Bushie +Bushlen +Bushmaker +Bushman +Bushnell +Bushner +Bushong +Bushorn +Bushovisky +Bushrod +Bushway +Bushweller +Bushy +Busi +Busic +Busick +Busico +Busie +Busing +Busitzky +Busk +Buske +Busker +Buskey +Buskirk +Buskohl +Busl +Busler +Busman +Busque +Buss +Bussa +Bussani +Bussard +Busscher +Busse +Busselberg +Bussell +Bussen +Busser +Bussert +Bussey +Bussie +Bussiere +Bussing +Bussinger +Bussink +Busskohl +Bussler +Bussman +Bussmann +Bussom +Busson +Bussone +Bussy +Busta +Bustad +Bustamante +Bustamente +Bustard +Buster +Bustillo +Bustillos +Bustin +Bustinza +Bustios +Bustle +Busto +Bustos +Busuttil +Buswell +Buszak +But +Butac +Butala +Butanda +Butaud +Butay +Butch +Butchee +Butcher +Butchko +Bute +Buteau +Buteaux +Butel +Butenhoff +Butera +Buterbaugh +Buteux +Buth +Buther +Butkiewicz +Butkovich +Butkowski +Butkus +Butland +Butler +Butman +Butner +Butor +Butorac +Butremovic +Butrick +Butron +Butsch +Butscher +Butt +Butta +Buttaccio +Buttari +Buttaro +Buttars +Butte +Buttel +Butter +Butterbaugh +Butterfield +Butteris +Buttermore +Butters +Butterworth +Buttery +Buttimer +Buttino +Buttitta +Buttke +Buttler +Buttner +Buttolph +Button +Buttram +Buttray +Buttrey +Buttrick +Buttross +Buttrum +Buttry +Butts +Buttz +Butz +Butzen +Butzer +Butzke +Butzlaff +Buvens +Buvinghausen +Bux +Buxbaum +Buxton +Buyak +Buyck +Buyes +Buys +Buysse +Buza +Buzard +Buzbee +Buzby +Buzek +Buzhardt +Buziak +Buzick +Buzis +Buzo +Buzza +Buzzanca +Buzzard +Buzzell +Buzzelle +Buzzelli +Buzzeo +Buzzi +Buzzo +Bverger +Byal +Byam +Byan +Byant +Byard +Byars +Byas +Byassee +Bybee +Bybel +Byczek +Bye +Byer +Byerley +Byerly +Byers +Byes +Byfield +Byford +Byham +Byington +Byker +Bykowski +Byland +Byler +Byles +Bylsma +Bylund +Byman +Bynam +Bynd +Byndon +Byner +Bynes +Bynoe +Bynon +Bynum +Bynun +Byod +Byon +Byone +Byous +Byra +Byram +Byran +Byrant +Byrd +Byrdsong +Byrer +Byrge +Byrley +Byrn +Byrne +Byrnes +Byrns +Byrnside +Byro +Byrom +Byron +Byrum +Byse +Bystrom +Bystron +Byther +Bytheway +Byun +Byus +Bywater +Bywaters +Bzhyan +Caal +Caamano +Caba +Cabada +Cabading +Cabag +Cabal +Caballero +Caballes +Cabam +Caban +Cabana +Cabanas +Cabanela +Cabanes +Cabanilla +Cabanillas +Cabaniss +Cabarcas +Cabasso +Cabatu +Cabbagestalk +Cabbell +Cabble +Cabe +Cabebe +Cabeceira +Cabell +Cabellero +Cabello +Cabellon +Cabera +Caberto +Cabeza +Cabezas +Cabibbo +Cabido +Cabiles +Cabiltes +Cabiness +Cabiya +Cabla +Cable +Cabler +Cables +Cabon +Caborn +Cabos +Cabot +Cabotage +Cabotaje +Cabral +Cabrales +Cabrar +Cabrara +Cabreja +Cabrena +Cabrera +Cabrero +Cabreros +Cabriales +Cabugos +Cacace +Cacal +Cacatian +Caccamise +Caccamo +Caccavale +Caccia +Cacciatore +Cacciatori +Cacciola +Cacciotti +Caceres +Cachero +Cacho +Cachola +Cachu +Caci +Cacibauda +Cacioppo +Cackett +Cackowski +Cacy +Cada +Cadarette +Cadavid +Cadavieco +Caddel +Caddell +Cadden +Caddick +Caddigan +Caddle +Caddy +Cade +Cadelina +Cademartori +Caden +Cadena +Cadenas +Cadenhead +Cader +Cadet +Cadice +Cadieux +Cadigan +Cadiz +Cadle +Cadlett +Cadman +Cadmen +Cadmus +Cadoff +Cadogan +Cadorette +Cadotte +Cadoy +Cadrette +Cadriel +Cadwallader +Cadwell +Cady +Caesar +Caetano +Caez +Cafagno +Cafarella +Cafarelli +Cafaro +Cafasso +Caffarel +Caffarelli +Caffee +Caffentzis +Cafferky +Cafferty +Caffery +Caffey +Caffie +Caffrey +Caflisch +Cafourek +Cagan +Cage +Cager +Cagey +Caggiano +Cagle +Cagley +Cagliostro +Cagney +Cagno +Cagnon +Caguimbal +Cahal +Cahalan +Cahalane +Cahall +Cahan +Cahee +Cahela +Cahill +Cahillane +Cahn +Caho +Cahoon +Cahue +Cai +Caiafa +Caiazzo +Caicedo +Cail +Cailler +Caillier +Caillouet +Caimi +Cain +Caine +Caines +Cainglit +Cainion +Cainne +Cains +Caiozzo +Caira +Caire +Caires +Cairns +Cairo +Cairone +Caison +Caisse +Caissie +Caito +Caivano +Cajas +Cajero +Cajigas +Cajka +Cajucom +Cajulus +Cajune +Cakanic +Cake +Cakmak +Cal +Calabrese +Calabretta +Calabria +Calabro +Calaf +Calahan +Calais +Calamare +Calamari +Calamarino +Calame +Calamia +Calamity +Calandra +Calarco +Calaway +Calaycay +Calbert +Calcagino +Calcagni +Calcagno +Calcano +Calcao +Calcara +Calcaterra +Calchera +Calciano +Calco +Calcote +Calcutt +Caldarella +Caldarera +Caldarone +Caldas +Caldeira +Calder +Caldera +Calderara +Calderaro +Calderin +Caldero +Calderon +Calderone +Calderson +Calderwood +Caldon +Caldoron +Caldron +Caldwell +Cale +Caleb +Calegari +Calemine +Calender +Calendine +Caler +Calero +Cales +Caley +Calfee +Calger +Calhaun +Calhoon +Calhoun +Cali +Calibuso +Calica +Calico +Calicott +Calicut +Calicutt +Caliendo +Califano +Califf +Caligari +Caligiuri +Caliguire +Calija +Caliman +Calin +Calip +Calise +Calisto +Calix +Calixte +Calixto +Calixtro +Caliz +Calizo +Calk +Calkin +Calkins +Call +Callabrass +Callado +Callaghan +Callagher +Callagy +Callaham +Callahan +Callais +Callam +Callan +Callanan +Callander +Callar +Callari +Callarman +Callaro +Callas +Callaway +Calle +Callegari +Calleja +Callejas +Callejo +Callen +Callendar +Callender +Callens +Calleo +Caller +Calleros +Callery +Calles +Calley +Callez +Callicoat +Callicott +Callicutt +Callier +Callies +Calligan +Calligaro +Calligy +Calliham +Callihan +Callin +Callinan +Callington +Callins +Callis +Callison +Calliste +Callister +Callnan +Callo +Callon +Callow +Calloway +Callsen +Callum +Calmes +Calmese +Calnan +Calnen +Calnick +Calnimptewa +Calo +Caloca +Calogero +Calonne +Calonsag +Calowell +Calpin +Calrk +Calta +Caltabiano +Caltagirone +Calton +Calumag +Caluya +Calvan +Calvani +Calvano +Calvaresi +Calvaruso +Calvary +Calvello +Calvelo +Calvent +Calver +Calverley +Calvert +Calvery +Calvetti +Calvey +Calvi +Calvillo +Calvin +Calvino +Calvo +Calway +Calwell +Calzada +Calzadilla +Calzado +Calzone +Cam +Camacho +Camack +Camaeho +Camaj +Camak +Camancho +Camano +Camara +Camarata +Camarda +Camarena +Camareno +Camarero +Camargo +Camarillo +Camaron +Camastro +Camba +Cambareri +Cambel +Cambell +Cambero +Camberos +Cambi +Cambia +Camble +Cambra +Cambre +Cambria +Cambric +Cambridge +Cambron +Cambronne +Camburn +Camcam +Camden +Camejo +Camel +Cameli +Camelin +Camell +Camelo +Camenisch +Camera +Camerano +Camerena +Camerino +Camero +Cameron +Camey +Camferdam +Camfield +Camic +Camidge +Camille +Camilleri +Camilli +Camillo +Camilo +Caminero +Caminita +Caminiti +Camino +Caminos +Camire +Camisa +Camlin +Camm +Cammack +Cammarano +Cammarata +Cammarn +Cammarota +Cammon +Camon +Camors +Camp +Campa +Campagna +Campagne +Campagnini +Campagnone +Campain +Campainha +Campana +Campanaro +Campanella +Campanelli +Campanile +Campany +Campas +Campau +Campbel +Campbell +Campble +Campean +Campeau +Campell +Campellone +Campen +Camper +Campese +Campfield +Campi +Campillo +Campion +Campione +Campise +Campisi +Campman +Campo +Campobasso +Campoli +Campolo +Campolongo +Campora +Campos +Camposano +Campoverde +Campoy +Camps +Campton +Campus +Campusano +Campuzano +Camren +Camus +Camuso +Can +Cana +Canaan +Canada +Canaday +Canady +Canak +Canal +Canale +Canales +Canalez +Canan +Canant +Canard +Canario +Canarte +Canary +Canas +Canatella +Canavan +Canaway +Canby +Cance +Cancel +Cancelliere +Cancer +Canchola +Cancilla +Cancino +Cancio +Canclini +Cancro +Candanoza +Candee +Candela +Candelaria +Candelario +Candell +Candella +Canders +Candia +Candido +Candill +Candland +Candle +Candler +Candlish +Candon +Candozo +Candy +Cane +Canedo +Canedy +Caneer +Canel +Canela +Caneles +Canella +Canellas +Canelo +Canepa +Canerday +Canes +Canestraro +Canestrini +Canestro +Canete +Canetta +Caneva +Canevari +Canevazzi +Caney +Canez +Caneza +Canfield +Cangas +Cange +Cangelosi +Cangemi +Cangey +Cangialosi +Cangiano +Canham +Canida +Canino +Canion +Canipe +Canizales +Canizares +Canlas +Cann +Cannada +Cannaday +Cannady +Cannan +Cannard +Cannata +Cannatella +Cannavo +Cannedy +Cannell +Cannella +Cannellos +Canner +Canney +Canniff +Canning +Cannington +Cannistraro +Cannizzaro +Cannizzo +Cannon +Cannone +Cannonier +Cannuli +Canny +Cano +Canon +Canonica +Canonico +Canori +Canova +Canoy +Canpos +Canseco +Cansibog +Cansino +Cansler +Canslor +Canson +Canta +Cantabrana +Cantadore +Cantakis +Cantara +Cantarano +Cantarella +Cantatore +Cantave +Cante +Cantell +Cantella +Canter +Canterberry +Canterbury +Cantero +Cantey +Cantfield +Cantillo +Cantin +Cantine +Cantley +Cantlow +Canto +Canton +Cantone +Cantoni +Cantor +Cantoral +Cantoran +Cantore +Cantos +Cantrall +Cantre +Cantrel +Cantrell +Cantrelle +Cantres +Cantu +Cantua +Cantv +Cantwell +Canty +Canu +Canul +Canup +Canupp +Canute +Canwell +Canzio +Canzoneri +Cao +Caoagdan +Caoile +Caoili +Caouette +Cap +Capaccino +Capalbo +Capaldi +Capaldo +Capalongan +Capan +Capanna +Capano +Caparelli +Caparoula +Caparros +Capas +Capasso +Capata +Capati +Capdeville +Cape +Capece +Capehart +Capek +Capel +Capell +Capella +Capellan +Capellas +Capelli +Capello +Capelo +Capels +Capen +Capener +Caper +Caperon +Capers +Caperton +Capes +Capestany +Capestro +Capetillo +Capetl +Capezzuto +Capicotto +Capiga +Capilla +Capinpin +Capistran +Capitani +Capitano +Capito +Capizzi +Caplan +Caple +Caplener +Caples +Caplette +Capley +Caplin +Caplinger +Capo +Capobianco +Capoccia +Capone +Caponera +Caponi +Caponigro +Caporale +Caporali +Caporiccio +Caposole +Capossela +Capote +Capouch +Capozzi +Capozzoli +Capp +Cappa +Cappaert +Capparelli +Cappas +Cappel +Cappellano +Cappelletti +Cappelli +Cappellini +Cappello +Cappelluti +Capper +Cappetta +Cappiello +Cappleman +Cappo +Cappola +Capponi +Capps +Cappucci +Capra +Capracotta +Caprario +Capraro +Capri +Capria +Capriccioso +Caprice +Caprio +Capriola +Capriotti +Capristo +Capron +Capshaw +Capshaws +Captain +Capua +Capuano +Capuchin +Capulong +Capurro +Caputi +Caputo +Capuzzi +Capwell +Caquias +Car +Cara +Carabajal +Caraballo +Carabello +Carabez +Carabine +Caracci +Caracciola +Caracciolo +Caracso +Caradine +Caradonna +Caraher +Caraig +Caraker +Caram +Caramanica +Caramella +Caramelo +Carandang +Carangelo +Carano +Caranza +Caras +Carasco +Carasquillo +Carathers +Carattini +Caravalho +Caravantes +Caravati +Caravella +Caravello +Caraveo +Caravetta +Caraway +Carback +Carbajal +Carbal +Carballo +Carbary +Carbaugh +Carbee +Carberry +Carbery +Carbin +Carbine +Carbo +Carbon +Carbonara +Carbonaro +Carbone +Carboneau +Carbonell +Carbonella +Carboni +Carbonneau +Carby +Carcamo +Carcana +Carcano +Carchi +Carchidi +Carcia +Carcieri +Carco +Card +Carda +Cardamone +Cardani +Cardarelli +Cardazone +Cardeiro +Cardejon +Cardell +Cardella +Cardelli +Cardello +Carden +Cardena +Cardenal +Cardenas +Cardenos +Carder +Cardera +Cardero +Cardi +Cardiel +Cardiff +Cardillo +Cardimino +Cardin +Cardinal +Cardinale +Cardinali +Cardinalli +Cardinas +Cardine +Cardino +Cardish +Cardle +Cardno +Cardo +Cardon +Cardona +Cardone +Cardoni +Cardonia +Cardono +Cardosa +Cardosi +Cardoso +Cardova +Cardoza +Cardozo +Carducci +Cardwell +Cardy +Care +Careaga +Carel +Carela +Carella +Carello +Caren +Carethers +Caretto +Carew +Carey +Carfagno +Carfora +Carfrey +Cargile +Cargill +Cargle +Cargo +Carhart +Cariaga +Carias +Cariaso +Carico +Caricofe +Cariddi +Caride +Carideo +Caridine +Carie +Cariello +Carignan +Cariker +Carilli +Carillion +Carillo +Carin +Carina +Carine +Caringi +Carini +Carinio +Carino +Carioscia +Caris +Caristo +Carithers +Cariveau +Carkhuff +Carknard +Carl +Carlacci +Carlan +Carland +Carlberg +Carle +Carlee +Carlen +Carleo +Carles +Carleton +Carlew +Carley +Carli +Carlile +Carlill +Carlin +Carline +Carlington +Carlini +Carlino +Carlis +Carlise +Carlisle +Carll +Carlo +Carlock +Carlon +Carlone +Carloni +Carlos +Carlough +Carlow +Carlozzi +Carls +Carlsen +Carlsley +Carlson +Carlsson +Carlsten +Carlston +Carlstrom +Carlton +Carlucci +Carlye +Carlyle +Carlyon +Carmack +Carmain +Carman +Carmant +Carmany +Carmean +Carmel +Carmell +Carmella +Carmello +Carmen +Carmena +Carmer +Carmichael +Carmicheal +Carmichel +Carmickel +Carmickle +Carmicle +Carmin +Carmine +Carmley +Carmody +Carmolli +Carmon +Carmona +Carmony +Carmouche +Carn +Carnagey +Carnahan +Carnahiba +Carnall +Carnalla +Carnathan +Carne +Carneal +Carnegia +Carnegie +Carnell +Carner +Carnero +Carnes +Carnett +Carnevale +Carney +Carnicelli +Carnie +Carnighan +Carnillo +Carnine +Carnley +Carnohan +Carnoske +Carnovale +Carnrike +Carns +Caro +Carodine +Carol +Carolan +Carolfi +Caroli +Carolin +Carolina +Caroline +Caroll +Carolla +Carollo +Carolus +Caron +Carone +Caronna +Carosella +Caroselli +Carosiello +Carota +Carotenuto +Carothers +Carouthers +Carovski +Carow +Caroway +Carozza +Carp +Carpanini +Carpen +Carpenito +Carpente +Carpenter +Carpentier +Carpentieri +Carper +Carpinelli +Carpinello +Carpino +Carpinteyro +Carpio +Carr +Carra +Carrabine +Carradine +Carragher +Carrahan +Carraher +Carrales +Carran +Carranco +Carrano +Carransa +Carranza +Carranzo +Carrao +Carrara +Carras +Carrasco +Carrasquillo +Carratala +Carratura +Carraturo +Carrauza +Carraway +Carrazco +Carre +Carrea +Carrecter +Carreira +Carreiro +Carrejo +Carreker +Carrel +Carrell +Carrelli +Carreno +Carreon +Carrera +Carreras +Carrere +Carrero +Carretero +Carrethers +Carretino +Carretta +Carriaga +Carrick +Carrico +Carridine +Carrie +Carriedo +Carrier +Carriere +Carrig +Carrigan +Carriger +Carrigg +Carriker +Carril +Carrillo +Carrilo +Carrin +Carrington +Carrino +Carrio +Carrion +Carris +Carrisalez +Carrison +Carrithers +Carriveau +Carrizal +Carrizales +Carrizo +Carro +Carroca +Carrol +Carroll +Carron +Carros +Carrothers +Carrousal +Carrow +Carroway +Carrozza +Carruba +Carrubba +Carrus +Carruth +Carruthers +Carry +Carscallen +Carse +Carsen +Carsey +Carskadon +Carsno +Carson +Carstarphen +Carsten +Carstens +Carstensen +Carston +Carswell +Cart +Carta +Cartagena +Cartan +Cartaya +Carte +Cartee +Cartegena +Cartelli +Carten +Carter +Cartez +Carthen +Carthens +Carther +Carthew +Carthon +Cartier +Cartin +Cartland +Cartledge +Cartlidge +Cartmell +Cartmill +Cartner +Carton +Cartrette +Cartright +Cartwright +Carty +Carualho +Caruana +Carucci +Carullo +Caruso +Caruth +Caruthers +Carvajal +Carvalho +Carvallo +Carvalno +Carvana +Carvel +Carvell +Carver +Carvett +Carvey +Carvill +Carville +Carvin +Carwell +Carwile +Carwin +Cary +Caryk +Caryl +Carza +Casa +Casabona +Casacchia +Casaceli +Casad +Casada +Casadei +Casado +Casados +Casady +Casagranda +Casagrande +Casal +Casale +Casalenda +Casales +Casali +Casaliggi +Casalman +Casamayor +Casamento +Casana +Casanas +Casano +Casanova +Casar +Casarella +Casareno +Casares +Casarez +Casario +Casarrubias +Casarz +Casas +Casasola +Casassa +Casaus +Casavant +Casavez +Casazza +Casbarro +Casbeer +Casburn +Cascia +Casciano +Casciato +Cascio +Cascioli +Casco +Cascone +Casdorph +Case +Casebeer +Casebier +Casebolt +Caselden +Casella +Caselli +Casello +Caselton +Caseman +Casement +Caseres +Caserta +Casewell +Casey +Casgrove +Cash +Cashatt +Cashaw +Cashdollar +Cashen +Casher +Cashett +Cashin +Cashing +Cashio +Cashion +Cashman +Cashmer +Cashmore +Cashon +Cashour +Cashwell +Casiano +Casias +Casida +Casile +Casilla +Casillas +Casilles +Casillo +Casimir +Casimiro +Casini +Casino +Casio +Casis +Casivant +Caska +Caskey +Casler +Casley +Caslin +Casmore +Casner +Caso +Casola +Casolary +Cason +Casoria +Caspar +Caspari +Casparian +Casparis +Caspary +Casper +Caspers +Caspersen +Casperson +Caspi +Cass +Cassa +Cassada +Cassaday +Cassady +Cassagne +Cassandra +Cassani +Cassano +Cassanova +Cassar +Cassara +Cassard +Cassarino +Cassaro +Cassarubias +Cassase +Cassata +Cassatt +Cassavaugh +Casseday +Cassel +Casselberry +Cassell +Cassella +Cassello +Cassells +Casselman +Cassels +Cassem +Cassens +Casserly +Cassese +Cassetta +Cassette +Cassetty +Casseus +Cassey +Cassi +Cassiano +Cassiday +Cassidy +Cassilano +Cassin +Cassinelli +Cassino +Cassio +Cassion +Cassis +Cassisse +Cassity +Cassius +Cassler +Cassman +Cassmeyer +Casso +Casson +Cassone +Casstevens +Cast +Castagna +Castagnier +Castagnola +Castaldi +Castaldo +Castanada +Castanado +Castaneda +Castanedo +Castaner +Castanio +Castano +Castanon +Casteel +Castejon +Castel +Castelan +Castelhano +Castell +Castellan +Castellana +Castellaneta +Castellani +Castellano +Castellanos +Castellanoz +Castellari +Castellaw +Castelli +Castellion +Castello +Castellon +Castellonese +Castellow +Castells +Castellucci +Castelluccio +Castelo +Castelum +Casten +Castenada +Castenanos +Casteneda +Caster +Castera +Casterline +Castiglia +Castiglione +Castile +Castilla +Castillanos +Castille +Castilleja +Castillejo +Castillero +Castillio +Castillion +Castillo +Castillon +Castilo +Castin +Castine +Castiola +Castle +Castleberry +Castleman +Castlen +Castles +Castleton +Castner +Casto +Castoe +Caston +Castonguay +Castongvay +Castor +Castoral +Castorena +Castoreno +Castrataro +Castrejon +Castrellon +Castrey +Castricone +Castrillo +Castro +Castrogiovann +Castronova +Castronovo +Castros +Castrovinci +Castruita +Casuat +Casumpang +Casuscelli +Casuse +Caswell +Cata +Catacun +Catacutan +Catala +Catalan +Catalanatto +Catalani +Catalano +Catalanotto +Cataldi +Cataldo +Catalfamo +Catalina +Cataline +Catalino +Catalli +Catan +Catanach +Catanese +Catani +Catania +Catano +Catanzano +Catanzarite +Catanzaro +Catapano +Cataquet +Catching +Catchings +Catchpole +Cate +Catella +Catello +Catena +Catenaccio +Cater +Caterina +Caterino +Cates +Cathcart +Cathell +Cather +Catherine +Catherman +Cathers +Catherson +Catherwood +Cathey +Cathie +Catholic +Cathy +Catignani +Catillo +Catinella +Catino +Catledge +Catlett +Catlin +Catlow +Catmull +Cato +Catoe +Catoggio +Catoire +Caton +Catone +Catozzi +Catrambone +Catrett +Catrini +Catron +Catrone +Catt +Cattabriga +Cattanach +Cattaneo +Cattano +Cattell +Catterson +Catterton +Cattladge +Catto +Catton +Cattrell +Catts +Catucci +Catus +Cauazos +Cauble +Cauchon +Caudel +Caudell +Caudill +Caudillo +Caudle +Caudy +Cauffman +Caufield +Caughell +Caughey +Caughlin +Caughman +Caughorn +Caughran +Caughron +Caul +Caulder +Cauley +Caulfield +Caulk +Caulkins +Caulley +Causby +Causey +Causley +Cauterucci +Cauthen +Cauthon +Cauthorne +Cauthron +Cautillo +Cava +Cavaco +Cavagna +Cavagnaro +Cavaiani +Cavalaris +Cavalcante +Cavaleri +Cavalero +Cavalier +Cavaliere +Cavalieri +Cavaliero +Cavallario +Cavallaro +Cavallero +Cavalli +Cavallo +Cavaluzzi +Cavan +Cavanagh +Cavanah +Cavanaugh +Cavaness +Cavaretta +Cavasos +Cavazos +Cave +Cavel +Cavender +Cavendish +Cavener +Caveness +Caveney +Caver +Caverly +Cavers +Caves +Cavett +Cavey +Cavez +Cavezon +Cavicchi +Cavicchia +Caviggia +Cavill +Cavin +Caviness +Cavins +Cavitt +Cavness +Cavrak +Cawein +Cawley +Cawon +Cawood +Cawthon +Cawthorn +Cawthorne +Cawthron +Cay +Caya +Cayabyab +Cayanan +Cayce +Cayea +Cayer +Cayetano +Caylor +Cayne +Cayo +Cayouette +Cayson +Cayton +Caywood +Caza +Cazaree +Cazares +Cazarez +Cazeau +Cazeault +Cazel +Cazenave +Cazier +Cazorla +Cazzell +Cdebaca +Cea +Cearley +Cearlock +Cearns +Ceasar +Cease +Ceaser +Ceasor +Ceballos +Cebula +Cecala +Ceccarelli +Cecchetti +Cecchi +Cecchinato +Cecchini +Cecena +Cecere +Cech +Cechini +Cecil +Cecilia +Cecilio +Ceconi +Cecot +Cedano +Cedar +Cedars +Cedeno +Ceder +Cederberg +Cederstrom +Cedillo +Cedillos +Cedotal +Cedrone +Cefalo +Cefalu +Cefaratti +Cegielski +Cegla +Ceglinski +Ceja +Cejka +Celadon +Celani +Celano +Celaya +Celedon +Celentano +Celenza +Celeste +Celestin +Celestine +Celestino +Celeya +Celi +Celia +Celis +Celius +Cella +Cellar +Celli +Cellini +Cellio +Cellucci +Cellupica +Celmer +Celso +Celuch +Cely +Ceman +Cembura +Cena +Cenat +Cenci +Cendan +Cendana +Cendejas +Ceniceros +Censky +Centanni +Centano +Centeno +Center +Centers +Centi +Centini +Centner +Centola +Centore +Centorino +Centrella +Centrich +Centrone +Ceo +Ceovantes +Ceparano +Cepas +Cepeda +Cepero +Cephas +Cephus +Cepin +Ceppetelli +Cera +Cerami +Ceranski +Cerao +Ceraos +Cerar +Cerasi +Ceraso +Cerasoli +Cerasuolo +Ceravolo +Cerbantes +Cerbone +Cerce +Cerceo +Cerchia +Cercone +Cercy +Cerda +Cerdan +Cerecedes +Cerecer +Cereceres +Cereghino +Cerenzia +Cereo +Ceretti +Cerezo +Cerf +Cerino +Cerio +Cerise +Cermak +Cermeno +Cerminaro +Cerna +Cernansky +Cerney +Cerni +Cerniglia +Cernoch +Cernohous +Cernota +Cernuto +Cerny +Ceron +Cerone +Ceroni +Ceronsky +Cerqueira +Cerra +Cerrano +Cerrato +Cerrello +Cerreta +Cerri +Cerrillo +Cerritelli +Cerrito +Cerritos +Cerrone +Cerroni +Cerros +Cerruti +Cerruto +Cersey +Certain +Certalich +Certosimo +Ceruantes +Cerulli +Cerullo +Cerutti +Cerva +Cervantes +Cervantez +Cervantsz +Cervenak +Cervenka +Cerventez +Cerveny +Cervera +Cerverizzo +Cervetti +Cervin +Cervone +Cervoni +Cerza +Cesa +Cesar +Cesare +Cesari +Cesario +Cesena +Cespedes +Cessna +Cessor +Cestari +Cestero +Cestia +Cestone +Cetta +Cevallos +Cevera +Cezar +Cezil +Cha +Chaban +Chabaud +Chabbez +Chaberek +Chabez +Chabolla +Chabot +Chabotte +Chaboya +Chace +Chachere +Chacko +Chaco +Chacon +Chaconas +Chad +Chadbourn +Chadbourne +Chadburn +Chadd +Chadderton +Chaddick +Chaddlesone +Chaddock +Chadek +Chaderton +Chadez +Chadick +Chadsey +Chadwell +Chadwick +Chae +Chafe +Chafetz +Chaffee +Chaffer +Chaffey +Chaffin +Chaffins +Chafin +Chafins +Chagnon +Chagolla +Chagollan +Chagoya +Chahal +Chai +Chaidez +Chaidy +Chaiken +Chaille +Chaim +Chain +Chainey +Chaires +Chairez +Chais +Chaisson +Chaisty +Chait +Chaix +Chajon +Chakkalakal +Chaknis +Chalaban +Chalcraft +Chalender +Chalepah +Chalet +Chaleun +Chalfant +Chalfin +Chalifour +Chalifoux +Chaligoj +Chalita +Chalk +Chalker +Chalkley +Chall +Challa +Challacombe +Challberg +Challen +Challender +Challenger +Challinor +Challis +Chalmers +Chaloner +Chaloux +Chalow +Chalupa +Chalupsky +Cham +Chamber +Chamberlain +Chamberland +Chamberlian +Chamberlin +Chambers +Chamble +Chamblee +Chambless +Chambley +Chamblin +Chambliss +Chamers +Chamlee +Chamley +Chamnanphony +Chamness +Chamorro +Champ +Champa +Champaco +Champagne +Champany +Champeau +Champey +Champine +Champion +Champlain +Champlin +Champman +Champney +Champoux +Champy +Chamul +Chan +Chanady +Chananie +Chance +Chancellor +Chancer +Chancey +Chanchuan +Chanco +Chancy +Chand +Chander +Chandier +Chandler +Chandley +Chandra +Chandrasekara +Chandrasekhar +Chandronnait +Chandsawangbh +Chanel +Chaney +Chanez +Chang +Chango +Chanin +Chanler +Chanley +Channel +Channell +Channer +Channey +Channing +Chanofsky +Chanoine +Chant +Chantha +Chanthasene +Chanthaumlsa +Chantler +Chantos +Chantry +Chao +Chaobal +Chapa +Chaparro +Chapdelaine +Chapek +Chapel +Chapell +Chapelle +Chapen +Chapin +Chapko +Chaple +Chaplean +Chaplen +Chaples +Chaplik +Chaplin +Chapman +Chapmon +Chapmond +Chapnick +Chapoton +Chapp +Chappa +Chappan +Chapparo +Chappel +Chappelear +Chappell +Chappelle +Chappie +Chapple +Chappo +Chappuis +Chaput +Char +Charan +Charania +Chararria +Charboneau +Charbonneau +Charbonneaux +Charbonnel +Charbonnet +Chard +Charest +Charette +Chareunrath +Chareunsri +Charfauros +Chargois +Chargualaf +Chari +Charif +Charisse +Charity +Charland +Charle +Charlebois +Charles +Charleston +Charlesworth +Charleton +Charlette +Charley +Charlie +Charlot +Charlson +Charlton +Charm +Charney +Charnley +Charnoski +Charo +Charon +Charpentier +Charpia +Charping +Charrier +Charriez +Charron +Charry +Chars +Charsky +Charter +Charters +Chartier +Chartrand +Chartraw +Charvat +Charves +Charvet +Chary +Chase +Chasen +Chasey +Chasin +Chaskey +Chasnoff +Chason +Chass +Chassaniol +Chasse +Chasser +Chasson +Chastain +Chastang +Chastant +Chasteen +Chasten +Chastin +Chastine +Chatagnier +Chatampaya +Chatcho +Chatelain +Chatfield +Chatham +Chatley +Chatlos +Chatman +Chatmon +Chaton +Chatriand +Chatt +Chatten +Chatterjee +Chatters +Chatterson +Chatterton +Chattin +Chau +Chauarria +Chauca +Chaudet +Chaudhry +Chaudhuri +Chaudoin +Chauez +Chauffe +Chauhan +Chauhdrey +Chaulk +Chaulklin +Chaumont +Chauncey +Chausse +Chautin +Chauvaux +Chauvette +Chauvin +Chavana +Chavaria +Chavarin +Chavarria +Chavayda +Chaven +Chavera +Chavers +Chaves +Chavez +Chaviano +Chavies +Chavira +Chavis +Chavous +Chavoustie +Chawla +Chay +Chayka +Che +Chea +Cheadle +Cheairs +Cheak +Cheam +Chean +Cheaney +Chears +Cheas +Cheatam +Cheatem +Cheater +Cheatham +Cheathan +Cheatom +Cheatum +Cheatwood +Chebahtah +Chebret +Checa +Checca +Chech +Check +Checkett +Checketts +Checo +Cheda +Chee +Cheek +Cheeks +Cheely +Cheeney +Cheers +Cheese +Cheeseboro +Cheesebrough +Cheeseman +Cheesman +Cheetham +Cheever +Cheevers +Cheeves +Chefalo +Cheffer +Chegwidden +Chehab +Chehebar +Cheirs +Chelette +Chelf +Cheli +Chell +Chellis +Chelton +Chemell +Chemin +Chen +Chenail +Chenaille +Chenard +Chenauls +Chenault +Chene +Chenet +Chenette +Chenevert +Chenevey +Cheney +Cheng +Chenier +Chennault +Chenot +Chenoweth +Cheon +Cheong +Chepiga +Cheramie +Cheranichit +Cherchio +Cherebin +Cherenfant +Cherep +Cherepy +Cherian +Cherico +Chermak +Chern +Chernak +Chernay +Cherne +Chernesky +Cherney +Chernich +Chernick +Chernoff +Chernosky +Chernow +Cherny +Cheroki +Cherpak +Cherrette +Cherrez +Cherrie +Cherrier +Cherrin +Cherrington +Cherry +Cherubin +Cherubini +Cherubino +Cherven +Chervin +Cherwinski +Chery +Chesanek +Chesbro +Chesbrough +Chesebro +Cheser +Chesher +Cheshier +Cheshire +Chesick +Chesla +Cheslak +Chesler +Chesley +Cheslock +Chesmore +Chesner +Chesney +Chesnut +Chesnutt +Chess +Chesser +Chessher +Chessman +Chesson +Chessor +Chestand +Chestang +Chesteen +Chester +Chesterfield +Chesterman +Chestnut +Chestnutt +Chet +Chetelat +Chetram +Cheu +Cheung +Cheuvront +Chevalier +Chevarie +Chevas +Chevere +Cheverez +Cheverton +Cheves +Chevez +Chevis +Chevres +Chevrette +Chevrier +Chew +Chewning +Chey +Cheyne +Cheyney +Chez +Chhabra +Chham +Chhan +Chheang +Chheng +Chhim +Chhom +Chhon +Chhor +Chhoun +Chhour +Chhum +Chhun +Chhuon +Chi +Chia +Chiado +Chiaminto +Chianese +Chiang +Chiapetti +Chiapetto +Chiappari +Chiappetta +Chiappinelli +Chiappone +Chiara +Chiaramonte +Chiaravalle +Chiarella +Chiarelli +Chiarello +Chiarenza +Chiariello +Chiarini +Chiarito +Chiarmonte +Chiaro +Chiasson +Chiavaroli +Chica +Chicalace +Chicas +Chicca +Chicharello +Chichester +Chick +Chickering +Chicles +Chico +Chicoine +Chicon +Chidester +Chieffo +Chiem +Chien +Chieng +Chier +Chiera +Chiesa +Chieves +Chiffriller +Chihak +Chihuahua +Chikko +Chila +Chilcoat +Chilcote +Chilcott +Chilcutt +Child +Childers +Childes +Childree +Childres +Childress +Childrey +Childs +Chilek +Chilen +Chiles +Chilinskas +Chill +Chillemi +Chillis +Chillo +Chilo +Chilsom +Chilson +Chilton +Chilvers +Chim +Chima +Chimal +Chime +Chimeno +Chimenti +Chimento +Chimera +Chimes +Chimilio +Chin +China +Chinault +Chinchilla +Chindlund +Chinen +Chinetti +Ching +Chinick +Chinn +Chinnery +Chinni +Chinnici +Chinnis +Chino +Chinskey +Chinweze +Chinzi +Chio +Chiodi +Chiodini +Chiodo +Chiola +Chioma +Chionchio +Chiong +Chiotti +Chiou +Chiphe +Chipley +Chipman +Chipp +Chipps +Chiprean +Chiquito +Chirafisi +Chiras +Chirasello +Chirco +Chirdon +Chirico +Chirino +Chirinos +Chisam +Chisari +Chischilly +Chisem +Chisholm +Chisler +Chisley +Chislom +Chism +Chisman +Chisnall +Chisolm +Chisom +Chisum +Chiszar +Chitrik +Chittam +Chittenden +Chittester +Chittick +Chittom +Chittum +Chitty +Chitwood +Chiu +Chiulli +Chiumento +Chiv +Chivalette +Chivers +Chiverton +Chiz +Chizek +Chizmar +Chkouri +Chladek +Chlebek +Chlebus +Chludzinski +Chmela +Chmelicek +Chmelik +Chmiel +Chmielewski +Chmielowiec +Chmura +Cho +Choat +Choate +Choates +Chobot +Chochrek +Chock +Chockley +Chocron +Chodorov +Choe +Choen +Choi +Choice +Choiniere +Choinski +Chojnacki +Chojnowski +Chokshi +Chol +Cholakyan +Cholewa +Cholewinski +Cholico +Chollett +Cholula +Choma +Chomali +Chomicki +Chomka +Chon +Chong +Choo +Chopelas +Chopp +Chopra +Chopton +Choquette +Chor +Chorley +Chorlton +Chorney +Chott +Chou +Choudhary +Choudhury +Chough +Chouinard +Choules +Choulnard +Choun +Choung +Chounlapane +Choute +Chouteau +Chovanec +Chow +Chowanec +Chowansky +Chowdhury +Chowen +Chowenhill +Chowhan +Chown +Chowning +Choy +Chrabasz +Chrabaszcz +Chreene +Chrest +Chrestman +Chretien +Chris +Chrisco +Chriscoe +Chrisjohn +Chrisler +Chrisley +Chrislip +Chrisman +Chrismer +Chrismon +Chrisp +Chrispen +Chrispin +Chriss +Christ +Christain +Christal +Christaldi +Christan +Christe +Christel +Christello +Christen +Christenberry +Christenbury +Christensen +Christenson +Christerson +Christescu +Christesen +Christeson +Christi +Christian +Christiana +Christiani +Christiano +Christians +Christiansen +Christianson +Christie +Christin +Christina +Christinat +Christine +Christinsen +Christion +Christison +Christle +Christler +Christley +Christlieb +Christman +Christmann +Christmas +Christmau +Christner +Christo +Christodoulou +Christoff +Christoffer +Christofferse +Christofferso +Christoforou +Christon +Christoph +Christophe +Christophel +Christopher +Christopherse +Christopherso +Christopoulos +Christou +Christy +Chriswell +Chritton +Chroman +Chrones +Chronis +Chronister +Chrosniak +Chrostowski +Chruch +Chrusciel +Chrysler +Chryst +Chrystal +Chrzan +Chrzanowski +Chu +Chua +Chuang +Chuba +Chubb +Chubbs +Chubbuck +Chubicks +Chuc +Chuck +Chudej +Chudy +Chudzik +Chudzinski +Chueng +Chugg +Chuh +Chui +Chukes +Chukri +Chulla +Chum +Chuma +Chumbler +Chumbley +Chumley +Chun +Chung +Chunn +Chuong +Chupik +Chupka +Chupp +Chuppa +Chura +Churan +Churape +Church +Churches +Churchfield +Churchill +Churchman +Churchville +Churchwell +Churley +Churn +Churner +Chustz +Chuta +Chute +Chuyangher +Chvilicek +Chwalek +Chwieroth +Chy +Chyle +Chynoweth +Ciaburri +Ciaccia +Ciaccio +Ciafardoni +Ciaffone +Ciak +Cialella +Ciallella +Ciampa +Ciampanella +Ciampi +Cianchetti +Cianci +Ciancio +Cianciola +Cianciolo +Cianciotta +Cianciulli +Cianflone +Cianfrani +Cianfrini +Ciani +Ciano +Ciaramitaro +Ciardullo +Ciarlante +Ciarletta +Ciarlo +Ciarrocchi +Ciaschi +Ciavardini +Cibik +Ciborowski +Cibrian +Cibula +Cibulskas +Cicala +Cicale +Cicalese +Cicali +Cicarella +Cicatello +Ciccarelli +Ciccarello +Ciccarone +Cicchetti +Cicciarelli +Cicco +Ciccolini +Ciccone +Cicconi +Cicen +Cicerchia +Cicerelli +Cicero +Cichocki +Cichon +Cichonski +Cichosz +Cichowski +Cichy +Cicio +Cicione +Ciciora +Cicora +Cicoria +Cid +Cidre +Ciejka +Cieloha +Cieloszyk +Cienega +Cienfuegos +Cieri +Cierley +Cierpke +Ciers +Ciersezwski +Ciervo +Ciesco +Ciesielski +Ciesiolka +Ciesla +Cieslak +Cieslik +Cieslinski +Ciesluk +Cieszynski +Cifaldi +Cifelli +Cifuentes +Ciganek +Cihak +Cihon +Cilano +Cilek +Cilenti +Cilento +Cilfone +Ciliberto +Cilibrasi +Ciliento +Cilley +Cillis +Cillo +Cills +Cilva +Cima +Cimaglia +Cimeno +Cimiano +Ciminera +Cimini +Cimino +Cimko +Cimmino +Cimmiyotti +Cimo +Cimorelli +Cina +Cinadr +Cinalli +Cinar +Cinco +Cincotta +Cindrich +Cinelli +Cini +Cink +Cinkan +Cinkosky +Cinnamon +Cinnamond +Cinotti +Cinotto +Cinquanti +Cinque +Cintora +Cintra +Cintron +Ciocca +Cioffi +Ciolek +Ciolli +Cione +Cioni +Cioppa +Ciotta +Ciotti +Cipcic +Cipkowski +Cipolla +Cipollone +Cipolloni +Cipolone +Cippina +Cipponeri +Ciprian +Cipriani +Cipriano +Cipro +Cipullo +Cira +Ciraco +Ciraolo +Ciraulo +Circelli +Circle +Cirella +Cirelli +Ciresi +Ciriaco +Ciriello +Cirigliano +Cirilli +Cirillo +Cirilo +Cirino +Cirioni +Cirocco +Cirone +Cirri +Cirrincione +Cirullo +Cisar +Cisco +Cisewski +Ciskowski +Cislo +Cisnero +Cisneros +Cisneroz +Cisney +Cisowski +Cissel +Cissell +Cistrunk +Citarella +Citino +Citizen +Cito +Citrano +Citrin +Citrino +Citro +Citron +Citrone +Citroni +Cittadini +Cittadino +City +Ciubal +Ciucci +Ciuffreda +Ciufo +Ciulla +Ciullo +Cius +Civale +Civatte +Civcci +Civiello +Civil +Civils +Civitello +Cizek +Claar +Claassen +Clabaugh +Clabo +Claborn +Clabough +Claburn +Clacher +Clack +Claes +Claessens +Claeys +Claffey +Claflin +Clagett +Clagg +Claggett +Claghorn +Clagon +Clague +Claiborne +Clain +Clair +Clairday +Claire +Clairmont +Clakley +Clam +Claman +Clammer +Clamp +Clampett +Clampitt +Clan +Clance +Clancey +Clancy +Clanin +Clankscales +Clanton +Clantz +Clap +Clapham +Clapp +Clapper +Clapsaddle +Clar +Clara +Clarbour +Clardy +Clare +Clarenbach +Clarence +Clarendon +Clarey +Clarida +Claridge +Clarity +Clark +Clarke +Clarkin +Clarks +Clarkson +Clarkston +Clarno +Claro +Claros +Clarson +Clary +Clas +Clasby +Clase +Clasen +Clason +Class +Classen +Classon +Clater +Claton +Clattenburg +Clatterbuck +Claucherty +Claud +Claude +Claudio +Claughton +Claunch +Claus +Clause +Clausel +Clausell +Clausen +Clausi +Clausing +Clauson +Clauss +Claussen +Clavelle +Claverie +Clavette +Clavey +Clavijo +Clavin +Claw +Clawges +Clawson +Claxton +Clay +Claybaugh +Claybon +Clayborn +Clayborne +Claybourn +Claybourne +Claybron +Claybrook +Claybrooks +Clayburg +Clayburn +Claycamp +Claycomb +Clayman +Claypole +Claypool +Claypoole +Clayson +Clayter +Clayton +Claytor +Claywell +Cleal +Cleamons +Clear +Cleare +Cleark +Clearman +Clearo +Clearwater +Cleary +Cleasby +Cleath +Cleaveland +Cleavenger +Cleaver +Cleaves +Cleckler +Cleckley +Cleckner +Cleek +Cleere +Clegg +Cleghorn +Cleland +Clelland +Clem +Clemans +Clemen +Clemence +Clemens +Clemenson +Clement +Clemente +Clementi +Clements +Clemenza +Clemmens +Clemments +Clemmer +Clemmey +Clemmo +Clemmon +Clemmons +Clemo +Clemon +Clemons +Clemson +Clendaniel +Clendenen +Clendenin +Clendening +Clendennen +Clendenon +Clenney +Clennon +Clepper +Cler +Clerc +Clerf +Clerico +Clerk +Clerkley +Clermont +Clery +Clesca +Clesen +Clester +Cleve +Cleveland +Cleven +Clevenger +Clever +Cleverley +Cleverly +Clevette +Clevinger +Clevland +Clewell +Clewes +Clewis +Cliatt +Clibon +Cliburn +Cliche +Click +Clickner +Client +Cliett +Cliff +Cliffe +Clifford +Cliffton +Clift +Clifton +Climer +Climes +Clinard +Clinch +Cline +Clinebell +Clineman +Clines +Clingan +Clingenpeel +Clinger +Clingerman +Clingingsmith +Clingman +Clink +Clinkenbeard +Clinker +Clinkinbeard +Clinkingbeard +Clinkscale +Clinkscales +Clint +Clinton +Clipp +Clippard +Clipper +Clippinger +Clise +Clish +Clisham +Clites +Clive +Clizbe +Clock +Clodfelter +Cloe +Cloepfil +Cloer +Cloffi +Clogston +Cloke +Clokey +Clolinger +Cloman +Clonch +Cloney +Cloninger +Clonts +Clontz +Cloonan +Cloos +Clopp +Clopper +Clopton +Clore +Clos +Close +Closey +Closovschi +Closs +Closser +Clossin +Closson +Closter +Clothey +Clothier +Clouatre +Cloud +Clouden +Clough +Clougher +Clougherty +Cloughly +Clouse +Clouser +Clouston +Clouthier +Cloutier +Cloutman +Clover +Clovis +Clow +Cloward +Clowdus +Clower +Clowerd +Clowers +Clowes +Clowney +Clowser +Cloyd +Clozza +Clubb +Clubbs +Clubs +Clucas +Cluck +Cluckey +Cluesman +Cluff +Clugston +Clukey +Clukies +Clum +Clumpner +Clune +Clunes +Clunie +Clure +Clusky +Cluster +Clute +Clutter +Clutts +Cluver +Cluxton +Cly +Clyatt +Clyburn +Clyde +Clyman +Clymer +Clymore +Clyne +Clynes +Cmiel +Co +Coach +Coache +Coachman +Coachys +Coad +Coady +Coak +Coaker +Coakley +Coale +Coalson +Coalter +Coan +Coant +Coar +Coard +Coarsey +Coast +Coaster +Coate +Coates +Coatie +Coatley +Coatney +Coats +Coatsworth +Coaxum +Cobane +Cobar +Cobarrubias +Cobb +Cobbett +Cobbin +Cobbins +Cobble +Cobbley +Cobbs +Cobden +Cobell +Coberley +Coberly +Cobern +Cobert +Cobetto +Cobey +Cobham +Cobia +Cobian +Cobine +Cobio +Coble +Coblentz +Cobler +Cobo +Cobos +Cobourn +Cobrin +Coburn +Coby +Coca +Cocanougher +Cocca +Coccia +Cocco +Coccoli +Coch +Cochell +Cochenour +Cocherell +Cochis +Cochran +Cochrane +Cochren +Cochron +Cochrum +Cockayne +Cockburn +Cocke +Cocker +Cockerell +Cockerham +Cockerhan +Cockerill +Cockett +Cockey +Cockfield +Cocking +Cockley +Cocklin +Cockman +Cockram +Cockran +Cockreham +Cockrel +Cockrell +Cockriel +Cockrill +Cockrin +Cockroft +Cockrum +Cocks +Coco +Cocola +Cocomazzi +Cocopoti +Cocoran +Cocoros +Cocozza +Cocran +Cocroft +Cocuzza +Cocuzzo +Coda +Coday +Codd +Codde +Codding +Coddington +Code +Codell +Codeluppi +Coder +Codere +Coderre +Codey +Codilla +Codispot +Codispoti +Codling +Codner +Cody +Coe +Coelho +Coello +Coen +Coenen +Coerver +Cofer +Coffee +Coffel +Coffell +Coffelt +Coffen +Coffer +Coffey +Coffie +Coffield +Coffill +Coffin +Coffinberger +Coffland +Coffman +Cofield +Cofone +Cofran +Cofrancesco +Cofresi +Cogan +Cogar +Cogbill +Cogburn +Cogdell +Cogdill +Cogen +Coger +Coggan +Coggeshall +Coggin +Coggins +Coggsdale +Coghill +Coghlan +Cogill +Cogley +Cogliano +Cogswell +Cohagan +Cohan +Cohea +Cohee +Cohen +Cohenour +Cohens +Cohick +Cohill +Cohlmia +Cohn +Coho +Cohoe +Cohoon +Cohran +Cohron +Cohrs +Coia +Coil +Coile +Coin +Coiner +Coins +Coiro +Coit +Coke +Cokel +Cokeley +Cokely +Coker +Cokins +Cokley +Coklow +Cola +Colabella +Colabrese +Colace +Colacone +Coladonato +Colafrancesco +Colagiovanni +Colaiacovo +Colaianni +Colaizzi +Colaizzo +Colaluca +Colamarino +Colan +Colander +Colanero +Colangelo +Colantonio +Colantro +Colantuono +Colao +Colapietro +Colapinto +Colar +Colarossi +Colarusso +Colas +Colasacco +Colasamte +Colasante +Colasanti +Colasuonno +Colasurdo +Colato +Colatruglio +Colavito +Colaw +Colbath +Colbaugh +Colbeck +Colbenson +Colberg +Colbert +Colbeth +Colborn +Colburn +Colby +Colchado +Colcher +Colclasure +Colclough +Colcord +Colden +Colder +Colding +Coldiron +Coldivar +Coldren +Coldsmith +Coldwell +Cole +Colebank +Colebrook +Colecchi +Colee +Colegrove +Colehour +Colella +Colello +Coleman +Colemen +Colemon +Colen +Coler +Coles +Colesar +Coleson +Colestock +Coletta +Coletti +Coley +Colfer +Colflesh +Colford +Colgan +Colgate +Colgin +Colglazier +Colgrove +Colian +Colicchio +Colier +Colin +Colina +Colindres +Colinger +Colins +Colker +Coll +Colla +Collaco +Collado +Collaer +Collamore +Collar +Collard +Collari +Collazo +Colle +Collea +Colledge +Colleen +College +Collella +Collelo +Collen +Coller +Colleran +Collet +Collett +Colletta +Collette +Colletti +Colley +Colli +Collica +Collick +Collicott +Collie +Collier +Colligan +Collin +Colling +Collings +Collingsworth +Collington +Collingwood +Collini +Collins +Collinson +Collinsworth +Collis +Collison +Collister +Colliver +Collman +Collmeyer +Collom +Collon +Collons +Collopy +Collora +Collova +Collozo +Collum +Collums +Collura +Colly +Collyer +Collymore +Colman +Colmenares +Colmenero +Colmer +Coln +Colo +Cologie +Colom +Coloma +Colomb +Colomba +Colombe +Colombini +Colombo +Colomy +Colon +Colona +Colondres +Colone +Colonel +Colonna +Colonnese +Colony +Colop +Colopy +Colorado +Colorina +Colosi +Colosimo +Colp +Colpa +Colpack +Colpaert +Colpetzer +Colpi +Colpitts +Colquitt +Colsch +Colschen +Colson +Colston +Colt +Colten +Colter +Coltey +Coltharp +Coltman +Colton +Coltrain +Coltrane +Coltrin +Colucci +Coluccio +Columbia +Columbo +Columbres +Columbus +Colunga +Colvard +Colver +Colvert +Colville +Colvin +Colwell +Colyar +Colyer +Colyott +Coma +Comacho +Coman +Comans +Comar +Comas +Combass +Combe +Combee +Comber +Combes +Combest +Comboy +Combs +Comden +Come +Comeau +Comeaux +Comeauy +Comee +Comegys +Comella +Comer +Comerford +Comes +Comfort +Comings +Cominotti +Comins +Cominski +Cominsky +Comish +Comiskey +Comisky +Comiso +Comissiong +Comito +Comley +Comly +Commander +Commendatore +Comment +Commer +Commerford +Commes +Commings +Commins +Commiskey +Commodore +Common +Commons +Comnick +Como +Comoletti +Comp +Compagna +Compagno +Companie +Companion +Comparoni +Compau +Compean +Compeau +Compere +Compher +Compiseno +Compo +Compono +Compos +Compres +Compston +Compton +Comrey +Comrie +Comstock +Comtois +Comunale +Conable +Conaghan +Conales +Conant +Conard +Conary +Conatser +Conaty +Conaughty +Conaway +Conboy +Conca +Concannon +Concatelli +Conceicao +Concepcion +Concepion +Conception +Conces +Conch +Concha +Conchado +Conchas +Concho +Concienne +Concilio +Concini +Conda +Conde +Condelario +Condell +Condello +Conder +Condi +Condict +Condie +Condiff +Condina +Condino +Condit +Conditt +Condo +Condon +Condra +Condray +Condreay +Condren +Condrey +Condron +Condroski +Condry +Conduff +Cone +Conedy +Conejo +Conell +Conelli +Conelly +Conely +Coner +Conerly +Conery +Cones +Coneway +Coney +Coneys +Confair +Confalone +Confer +Conforme +Conforti +Conforto +Confrey +Cong +Congdon +Conger +Congleton +Congo +Congress +Congrove +Conigliaro +Coniglio +Conine +Conkel +Conkey +Conkin +Conkle +Conklin +Conkling +Conkright +Conkrite +Conkwright +Conlan +Conlans +Conlee +Conley +Conliffe +Conlin +Conlisk +Conlogue +Conlon +Conly +Conmy +Conn +Connally +Connard +Connarton +Connaughton +Connealy +Conneely +Connel +Connell +Connelley +Connelly +Connely +Conner +Connerat +Connerley +Connerly +Conners +Connerton +Connerty +Connery +Conness +Connet +Connett +Connette +Conney +Connick +Connie +Conniff +Connin +Conninghan +Connington +Connley +Connole +Connolly +Connoly +Connon +Connor +Connors +Connyer +Conole +Conoley +Conolly +Conoly +Conorich +Conour +Conover +Conquest +Conrad +Conradi +Conradt +Conrady +Conran +Conrath +Conrod +Conrow +Conroy +Conry +Cons +Consalvo +Consentino +Conser +Considine +Consigli +Consiglio +Consla +Consolazio +Console +Consoli +Consolini +Consolo +Consolver +Consorti +Constable +Constance +Constancio +Constant +Constante +Constantin +Constantine +Constantineau +Constantini +Constantino +Constanza +Constanzo +Constine +Consuegra +Consuelo +Conte +Contee +Conteh +Contento +Conteras +Conterras +Contes +Conti +Continenza +Contini +Contino +Contofalsky +Contois +Contopoulos +Contorno +Contos +Contraras +Contras +Contratto +Contreas +Contrell +Contrenas +Contrera +Contreras +Contreraz +Contreres +Contreros +Contrerras +Contrino +Conveniencia +Conver +Converse +Convery +Conville +Conway +Conwell +Conwill +Conwright +Conyer +Conyers +Conzales +Conzalez +Conze +Conzemius +Cooch +Coodey +Coody +Cooey +Coogan +Coogen +Cook +Cooke +Cookerly +Cookey +Cookingham +Cookis +Cookman +Cooks +Cooksey +Cooksley +Cookson +Cookus +Cool +Coolahan +Coolbaugh +Coolbeth +Coolbrith +Cooler +Cooley +Coolidge +Coolman +Cools +Coombe +Coomber +Coombes +Coombs +Coomer +Coomes +Coomey +Coon +Coonan +Coonce +Coone +Cooner +Coones +Cooney +Coonfare +Coonfield +Coonley +Coonrad +Coonradt +Coonrod +Coons +Coonse +Coontz +Coop +Coopage +Cooper +Cooperider +Cooperman +Cooperrider +Coopersmith +Cooperstein +Cooperwood +Coopey +Coopper +Coopwood +Coor +Coore +Coote +Cooter +Coots +Coover +Coovert +Copa +Copas +Copass +Cope +Copelan +Copeland +Copelin +Copeman +Copen +Copenhaver +Copening +Copes +Copher +Copier +Coplan +Copland +Coplen +Coples +Copley +Coplin +Coplon +Copney +Coponen +Copp +Coppa +Coppage +Coppedge +Coppenger +Coppens +Copper +Coppernoll +Coppersmith +Coppes +Coppess +Coppin +Copping +Coppinger +Copple +Coppler +Coppock +Coppola +Coppolino +Copps +Copsey +Copstead +Copus +Cora +Coradi +Corado +Coraham +Corak +Coral +Corallo +Coram +Coran +Corathers +Coray +Corazza +Corban +Corbeil +Corbell +Corbelli +Corbet +Corbett +Corbi +Corbin +Corbisiero +Corbit +Corbitt +Corbley +Corbo +Corbridge +Corburn +Corby +Corchado +Corchero +Corcino +Corcoran +Corcuera +Cord +Corda +Cordano +Cordaro +Cordas +Cordasco +Corde +Cordeiro +Cordel +Cordell +Cordenas +Corder +Corderman +Cordero +Cordes +Cordew +Cordia +Cordial +Cordier +Cordiero +Cordill +Cordle +Cordner +Cordoba +Cordon +Cordona +Cordone +Cordonnier +Cordoua +Cordova +Cordovano +Cordovi +Cordoza +Cordray +Cordrey +Cords +Cordts +Cordwell +Cordy +Core +Corea +Coreas +Coreen +Coreil +Corell +Corella +Corelli +Coren +Coressel +Corey +Corf +Corfman +Corgan +Corgiat +Coria +Coriano +Coriaty +Coric +Corid +Coriell +Corigliano +Corin +Corington +Corino +Corio +Corippo +Corish +Coriz +Cork +Corke +Corker +Corkern +Corkery +Corkill +Corkins +Corkran +Corkron +Corkum +Corl +Corle +Corlee +Corless +Corlett +Corlew +Corley +Corliss +Cormack +Corman +Cormany +Cormia +Cormican +Cormier +Corn +Corna +Cornacchio +Corne +Cornea +Corneau +Corneil +Corneille +Cornejo +Cornelia +Cornelio +Cornelious +Cornelison +Cornelius +Cornell +Cornella +Cornelson +Corneluis +Cornely +Corner +Corners +Cornes +Cornet +Cornett +Cornetta +Cornette +Corney +Cornfield +Cornford +Cornforth +Cornick +Corniel +Corning +Cornish +Cornman +Cornmesser +Cornn +Cornog +Corns +Cornutt +Cornwall +Cornwell +Coro +Corolis +Corolla +Coron +Corona +Coronado +Coronel +Coroniti +Corp +Corpe +Corpening +Corpeno +Corping +Corporal +Corporan +Corporon +Corprew +Corpus +Corpuz +Corr +Corra +Corradini +Corradino +Corrado +Corral +Corrales +Corrao +Corraro +Corre +Correa +Correale +Correau +Corredor +Correia +Correira +Correiro +Correl +Correla +Correll +Corren +Corrente +Correo +Correra +Correro +Corrett +Correy +Corrga +Corria +Corrice +Corrick +Corridan +Corridoni +Corrie +Corriere +Corrieri +Corrigan +Corrigeux +Corriher +Corrington +Corrio +Corrion +Corriveau +Corron +Corrow +Corry +Corsa +Corsaro +Corsaut +Corscadden +Corse +Corsello +Corseri +Corsetti +Corsey +Corsi +Corsilles +Corsini +Corsino +Corso +Corson +Corsoro +Cort +Corte +Corter +Cortes +Cortese +Cortesi +Cortez +Corti +Cortijo +Cortina +Cortinas +Cortinez +Cortis +Cortner +Corton +Cortopassi +Cortright +Cortwright +Corujo +Corum +Corvan +Corvelli +Corvera +Corvi +Corvin +Corvino +Corvo +Corwell +Corwin +Cory +Coryea +Coryell +Corza +Corzine +Corzo +Cos +Cosano +Cosby +Cosca +Coscia +Cosden +Cose +Cosen +Cosentino +Cosenza +Cosey +Cosgrave +Cosgray +Cosgriff +Cosgrove +Coshow +Cosico +Cosier +Cosimini +Cosio +Coskey +Coskrey +Coslan +Coslett +Cosley +Coslow +Cosma +Cosman +Cosme +Cosmo +Cosner +Cosper +Coss +Cossa +Cossaboom +Cossaboon +Cossairt +Cossano +Cossel +Cossell +Cosselman +Cossett +Cossette +Cossey +Cossin +Cossio +Cost +Costa +Costabile +Costagliola +Costain +Costales +Costaneda +Costantini +Costantino +Costanza +Costanzi +Costanzo +Costas +Coste +Costeira +Costell +Costella +Costello +Costellowo +Costen +Costenive +Coster +Costigan +Costilla +Costillo +Costilow +Costin +Costine +Costley +Costlow +Costner +Coston +Coswell +Cota +Cotant +Cote +Coteat +Cotelesse +Cotey +Cotham +Cother +Cotheran +Cotherman +Cothern +Cothran +Cothren +Cothron +Cotilla +Cotillo +Cotler +Cotman +Cotner +Cotney +Cotnoir +Coto +Coton +Cotreau +Cotrell +Cotrone +Cotroneo +Cotsis +Cott +Cotta +Cottam +Cotten +Cottengim +Cotter +Cotterell +Cotterman +Cottew +Cotti +Cottier +Cottillion +Cottingham +Cottle +Cottman +Cotto +Cottom +Cotton +Cottone +Cottongim +Cottrell +Cottrill +Cotty +Cotugno +Coty +Couch +Couchenour +Couchman +Couden +Coudriet +Couey +Coufal +Cough +Coughenour +Coughlan +Coughlin +Coughran +Couillard +Coulas +Coulbourne +Couley +Coulibaly +Coull +Coullard +Coulombe +Coulon +Coulson +Coulston +Coult +Coultas +Coulter +Coulthard +Coultrap +Counce +Counceller +Council +Councill +Councilman +Counihan +Counselman +Countee +Counter +Counterman +Countess +Countis +Countryman +Counts +Coup +Coupe +Couper +Coupland +Courcelle +Courchene +Courchesne +Courchine +Courcy +Couret +Courey +Courie +Courier +Courington +Courneya +Cournoyer +Couron +Courrege +Course +Courseault +Courser +Coursey +Courson +Court +Courtad +Courteau +Courtemanche +Courtenay +Courter +Courtnage +Courtney +Courtois +Courton +Courtoy +Courtright +Courts +Courtway +Courtwright +Courville +Coury +Cousain +Cousar +Couse +Cousens +Couser +Cousey +Cousin +Cousineau +Cousino +Cousins +Coutant +Coutch +Coutcher +Coutee +Coutermarsh +Coutinho +Coutino +Couto +Coutre +Couts +Coutts +Coutu +Couture +Couturier +Couty +Couvertier +Couvillier +Couvillion +Couzens +Cova +Coval +Covalt +Covar +Covarrubia +Covarrubias +Covarrubio +Covarruvia +Cove +Covel +Covell +Covelli +Covello +Coven +Coveney +Coventon +Coventry +Cover +Coverdale +Coverdell +Coverstone +Covert +Coverton +Covey +Coviello +Covil +Covill +Coville +Covin +Covington +Covino +Covitt +Covitz +Covone +Covotta +Cowan +Cowans +Coward +Cowart +Cowboy +Cowden +Cowder +Cowdery +Cowdin +Cowdrey +Cowee +Cowell +Cowels +Cowen +Cowens +Cower +Cowett +Cowger +Cowgill +Cowher +Cowherd +Cowick +Cowie +Cowin +Cowing +Cowles +Cowley +Cowlin +Cowling +Cowman +Cowns +Cowper +Cowser +Cowsert +Cox +Coxe +Coxen +Coxey +Coxon +Coxum +Coxwell +Coy +Coyan +Coyazo +Coyco +Coye +Coyer +Coyier +Coykendall +Coyle +Coyne +Coyner +Coyt +Cozad +Cozadd +Cozart +Cozby +Cozier +Cozine +Cozort +Cozza +Cozzens +Cozzi +Cozzolino +Cozzone +Cozzy +Craan +Craawford +Crabb +Crabbe +Crabbs +Crabill +Crable +Crabtree +Cracas +Cracchiolo +Crace +Cracknell +Cracolici +Cracraft +Craddieth +Craddock +Cradduck +Crader +Cradic +Cradle +Cradler +Crady +Craffey +Crafford +Craft +Crafter +Crafton +Crafts +Cragan +Cragar +Crager +Cragg +Craghead +Cragin +Cragle +Crago +Cragun +Craib +Craig +Craige +Craigen +Craiger +Craighead +Craigmiles +Craigmyle +Craigo +Craigue +Craigwell +Crail +Crain +Craine +Craker +Crall +Cram +Cramblet +Cramblit +Cramer +Cramm +Cramp +Crampton +Cran +Crance +Crandal +Crandall +Crandell +Crandle +Crane +Craner +Craney +Cranfield +Cranfill +Cranford +Crank +Cranker +Crankshaw +Cranmer +Cranmore +Crannell +Cranney +Cranor +Crans +Cranshaw +Cranson +Cranston +Crantz +Crapanzano +Crape +Crapo +Crapp +Crapps +Crapse +Crapser +Crary +Crasco +Crase +Crask +Crass +Cratch +Crate +Crater +Crathers +Cratic +Cratin +Cration +Craton +Cratty +Craun +Crauswell +Cravalho +Cravatta +Craveiro +Craven +Cravenho +Cravens +Craver +Cravey +Cravy +Craw +Crawford +Crawhorn +Crawley +Crawmer +Crawn +Crawshaw +Cray +Craycraft +Crayford +Crayne +Crays +Crayton +Craze +Crazier +Crea +Creach +Creacy +Creager +Creagh +Creamer +Crean +Crear +Creary +Crease +Creaser +Creasey +Creasman +Creason +Creasy +Creath +Crebs +Crecco +Crecelius +Credell +Credeur +Credi +Credille +Credit +Credle +Credo +Cree +Creech +Creecy +Creed +Creeden +Creedon +Creegan +Creehan +Creek +Creekbaum +Creekmore +Creekmur +Creeks +Creel +Creeley +Creenan +Creer +Creese +Cregan +Cregar +Cregeen +Creger +Cregger +Creggett +Cregin +Creglow +Crego +Crehan +Creighton +Creitz +Crelia +Crellin +Cremar +Cremeans +Cremeens +Cremer +Cremers +Cremin +Cremins +Cremona +Cremonese +Crenshaw +Crenwelge +Crepeau +Crepps +Creps +Creque +Crescenti +Crescenzo +Cresci +Creselious +Cresencio +Creson +Crespi +Crespin +Crespino +Crespo +Cress +Cressell +Cressey +Cressman +Cresswell +Cressy +Crest +Cresta +Cresto +Creswell +Crete +Cretella +Creten +Cretsinger +Creveling +Crevier +Creviston +Crew +Crewe +Crews +Criado +Cribari +Cribb +Cribbin +Cribbs +Criblez +Crichlow +Crichton +Crick +Crickard +Crickenberger +Crickmore +Criddle +Crider +Cridge +Cridland +Crieghton +Crier +Criger +Crigger +Crighton +Crigler +Criley +Crill +Crilly +Crim +Crimes +Crimi +Crimin +Crimmins +Crincoli +Criner +Cring +Cringle +Crinklaw +Cripe +Crippen +Crippin +Cripps +Criqui +Crisafi +Crisafulli +Crisalli +Crisan +Crisanti +Crisci +Criscillis +Criscione +Crisco +Criscuolo +Crise +Crisler +Crislip +Crisman +Crismon +Crismond +Crisostomo +Crisp +Crispell +Crispen +Crispin +Crispino +Crispo +Criss +Crissey +Crissinger +Crissler +Crissman +Crisson +Crist +Cristal +Cristaldi +Cristales +Criste +Cristelli +Cristello +Cristiano +Cristina +Cristino +Cristo +Cristobal +Cristofaro +Cristofori +Cristy +Criswell +Critchelow +Critcher +Critchfield +Critchley +Critchlow +Critelli +Crites +Criton +Crittenden +Crittendon +Crittle +Critton +Critz +Critzer +Critzman +Crivaro +Crivelli +Crivello +Crnich +Crnkovich +Croak +Croan +Croasmun +Crocco +Croce +Crocetti +Crochet +Crocitto +Crock +Crockarell +Crocker +Crocket +Crockett +Crockette +Crockwell +Croes +Croff +Croffie +Crofford +Crofoot +Croft +Crofton +Crofts +Crofutt +Crogan +Croghan +Crogier +Crognale +Croissant +Croke +Croker +Croley +Croll +Crolley +Crom +Cromack +Croman +Cromartie +Crombie +Crome +Cromeans +Cromedy +Cromeens +Cromer +Cromey +Cromie +Cromley +Crompton +Cromuel +Cromwell +Cron +Cronan +Cronauer +Cronce +Crone +Cronenberg +Croner +Croney +Cronholm +Cronic +Cronin +Cronk +Cronkhite +Cronkite +Cronoble +Cronon +Cronquist +Cronshaw +Cronwell +Crook +Crooke +Crooked +Crooker +Crookes +Crooks +Crookshank +Crookshanks +Crookston +Croom +Crooms +Croon +Cropley +Cropp +Cropper +Cropsey +Crosbie +Crosby +Crosdale +Crose +Croshaw +Crosiar +Crosier +Croskey +Crosland +Croslen +Crosley +Croslin +Crosman +Crosno +Croson +Cross +Crossan +Crossen +Crosser +Crossett +Crossfield +Crossgrove +Crossin +Crossland +Crossley +Crosslin +Crossman +Crossmon +Crossno +Crosson +Crosswell +Crosswhite +Crosten +Crosthwaite +Croston +Croswell +Croteau +Crother +Crothers +Crotteau +Crotts +Crotty +Crotwell +Crotzer +Crouch +Croucher +Crouchet +Crough +Crounse +Crouse +Crouser +Croushorn +Crousore +Crout +Croutch +Crouter +Crouthamel +Crover +Crovo +Crow +Crowden +Crowder +Crowdis +Crowe +Crowell +Crowers +Crowford +Crowin +Crowl +Crowley +Crown +Crowner +Crownover +Crowson +Crowston +Crowther +Crowthers +Croxen +Croxford +Croxton +Croy +Croyle +Crozat +Crozier +Cruce +Cruden +Crudo +Crudup +Cruea +Cruel +Cruell +Cruey +Cruff +Cruice +Cruickshank +Cruikshank +Cruise +Cruiz +Crull +Crum +Crumb +Crumble +Crumbley +Crumbliss +Crumbly +Crumby +Crume +Crumedy +Crumley +Crumlish +Crumly +Crumm +Crummedyo +Crummell +Crummett +Crummey +Crummie +Crummitt +Crump +Crumpacker +Crumpler +Crumpton +Crumrine +Crumwell +Crunk +Crunkilton +Crunkleton +Crupe +Crupi +Crupper +Crusan +Cruse +Cruser +Crusinberry +Crusoe +Cruson +Crutch +Crutcher +Crutchev +Crutchfield +Crutchley +Crute +Cruther +Cruthers +Cruthird +Cruthirds +Crutison +Crutsinger +Cruz +Cruzado +Cruzan +Cruze +Cruzen +Cryan +Cryar +Cryder +Cryderman +Crye +Cryer +Crysler +Crystal +Crytser +Crytzer +Csaszar +Csensich +Cser +Csizmadia +Csubak +Csuhta +Cua +Cuadra +Cuadrado +Cuadras +Cuadro +Cuadros +Cuaresma +Cuartas +Cuascut +Cuba +Cubano +Cubas +Cubbage +Cubbison +Cubero +Cubeta +Cubias +Cubie +Cubillo +Cubine +Cubit +Cubito +Cubr +Cuccaro +Cucchiara +Cucchiaro +Cuccia +Cuccinello +Cucco +Cuch +Cuchares +Cuchiara +Cucinella +Cucino +Cucinotta +Cuckler +Cucufate +Cuculich +Cucuta +Cucuzza +Cucvas +Cuda +Cudan +Cudd +Cuddeback +Cuddihee +Cuddington +Cuddy +Cude +Cudjoe +Cudmore +Cudney +Cudworth +Cue +Cuebas +Cuellar +Cuello +Cuen +Cuenca +Cuervo +Cuesta +Cuestas +Cueto +Cueva +Cuevas +Cuez +Cuff +Cuffari +Cuffe +Cuffee +Cuffia +Cuffie +Cuffman +Cuffy +Cugini +Cuhel +Cui +Cuizon +Cujas +Cukaj +Culajay +Culberson +Culbert +Culberth +Culbertson +Culbreath +Culbreth +Culcasi +Culhane +Culkin +Cull +Cullar +Cullars +Cullen +Cullens +Culler +Cullers +Culleton +Culley +Cullifer +Culligan +Cullin +Cullinan +Cullinane +Cullins +Cullip +Cullison +Culliton +Cullity +Cullivan +Culliver +Cullom +Cullop +Culloton +Cullum +Cully +Culmer +Culnane +Culotta +Culotti +Culp +Culpepper +Culpit +Cultice +Culton +Culver +Culverhouse +Culverson +Culwell +Cumba +Cumbaa +Cumbass +Cumbee +Cumber +Cumberbatch +Cumberland +Cumberlander +Cumberledge +Cumbie +Cumblidge +Cumbo +Cumby +Cumens +Cumings +Cumins +Cumiskey +Cumley +Cummer +Cumming +Cummingham +Cummings +Cummins +Cummiskey +Cummisky +Cumoletti +Cumpston +Cumpton +Cun +Cuna +Cunanan +Cunard +Cunas +Cundick +Cundiff +Cundy +Cuneio +Cuneo +Cung +Cunha +Cunico +Cuningham +Cunio +Cunis +Cunliffe +Cunnane +Cunneen +Cunnick +Cunniff +Cunniffe +Cunnigham +Cunning +Cunningan +Cunningham +Cunninghan +Cunnington +Cuny +Cuoco +Cuomo +Cuozzo +Cupe +Cupelli +Cuperus +Cupit +Cupp +Cuppernell +Cuppett +Cupples +Cupps +Cupstid +Cura +Curameng +Curatolo +Curb +Curbeam +Curbelo +Curbo +Curbow +Curboy +Curby +Curci +Curcio +Curcuru +Curd +Curdy +Cure +Cureau +Curella +Curenton +Curet +Cureton +Curey +Curfman +Curi +Curia +Curie +Curiel +Curimao +Curington +Curio +Curit +Curl +Curle +Curlee +Curles +Curless +Curley +Curleyhair +Curlin +Curling +Curlis +Curll +Curls +Curly +Curney +Curnow +Curnutt +Curnutte +Curo +Curpupoz +Curra +Curran +Currans +Currell +Curren +Currence +Currens +Current +Curreri +Currey +Currie +Currier +Curriere +Currin +Currington +Curro +Curry +Curson +Curt +Curtice +Curtin +Curtis +Curtiss +Curtner +Curto +Curts +Curtsinger +Curvey +Curvin +Curylo +Curz +Curzi +Cusack +Cusanelli +Cusano +Cusatis +Cusenza +Cush +Cushard +Cushen +Cushenberry +Cusher +Cushinberry +Cushing +Cushingberry +Cushman +Cushner +Cushwa +Cushway +Cusic +Cusick +Cusimano +Cusmano +Cussen +Cussins +Cusson +Custa +Custance +Custard +Custeau +Custer +Custis +Custodio +Cusumano +Cusworth +Cutaia +Cutbirth +Cutburth +Cutchall +Cutchember +Cutcher +Cutchin +Cutchins +Cutforth +Cuthbert +Cuthbertson +Cuther +Cuthill +Cuthrell +Cuti +Cutia +Cutillo +Cutler +Cutliff +Cutlip +Cutno +Cutone +Cutrell +Cutrer +Cutrera +Cutri +Cutright +Cutrona +Cutrone +Cutsforth +Cutshall +Cutshaw +Cutsinger +Cutt +Cutten +Cutter +Cutting +Cuttino +Cuttitta +Cuttler +Cutts +Cutty +Cutwright +Cuva +Cuyler +Cuzco +Cuzick +Cuzman +Cuzzi +Cuzzo +Cuzzort +Cvetkovic +Cwalinski +Cwiakala +Cwiek +Cwik +Cwikla +Cwiklinski +Cybart +Cybulski +Cychosz +Cyfers +Cygan +Cyganiewicz +Cygrymus +Cyler +Cylkowski +Cynova +Cynthia +Cypert +Cypher +Cyphers +Cyphert +Cypress +Cypret +Cyprian +Cyr +Cyran +Cyree +Cyrnek +Cyrulik +Cyrus +Cywinski +Czach +Czachor +Czachorowski +Czaja +Czajka +Czajkowski +Czap +Czapiewski +Czapla +Czaplewski +Czaplicki +Czaplinski +Czapor +Czapski +Czar +Czarkowski +Czarnecki +Czarniecki +Czarnik +Czarnota +Czarny +Czartoryski +Czech +Czechowski +Czekaj +Czekanski +Czelusniak +Czepiel +Czerkies +Czerniak +Czernik +Czerno +Czernovski +Czerwinski +Czlapinski +Czolba +Czosek +Czuba +Czubakowski +Czubia +Czupryna +Czwakiel +Czyrnik +Czysz +Czyz +Czyzewski +Dabadie +Dabato +Dabbraccio +Dabbs +Dabdoub +Dabe +Daber +Dabney +Dabrowski +Dacamara +Dacanay +Dace +Dacey +Dach +Dachelet +Dachs +Dack +Dacosta +Dacpano +Dacquel +Dacres +Dacruz +Dacunha +Dacunto +Dacus +Dacy +Daczewitz +Dad +Dada +Dadamo +Dadd +Daddabbo +Daddario +Daddea +Daddio +Daddona +Dadds +Dade +Dadey +Dadisman +Dadlani +Dado +Dadson +Dady +Dae +Daehler +Daehn +Daer +Daffern +Daffin +Daffron +Dafoe +Dafonseca +Dafonte +Daft +Dagan +Dagata +Dagdag +Dage +Dagel +Dagen +Dagenais +Dagenhart +Dager +Dagesse +Dagg +Daggett +Daggs +Daggy +Daghita +Dagis +Dagle +Dagley +Dagnan +Dagner +Dagnese +Dagnon +Dagnone +Dago +Dagon +Dagostino +Dagraca +Dagrella +Dagres +Dague +Daguerre +Daguio +Dahan +Daher +Dahill +Dahl +Dahlberg +Dahle +Dahlem +Dahlen +Dahler +Dahley +Dahlgren +Dahlhauser +Dahlheimer +Dahlin +Dahline +Dahling +Dahlka +Dahlke +Dahlman +Dahlquist +Dahlstedt +Dahlstrom +Dahm +Dahman +Dahme +Dahmen +Dahmer +Dahms +Dahn +Dahnke +Dahood +Dai +Daichendt +Daidone +Daigh +Daigle +Daignault +Daigneault +Daigre +Dail +Dailey +Dailing +Daill +Daily +Daimaru +Dain +Dainack +Daine +Dainels +Daines +Dains +Dair +Daire +Dais +Daise +Daisey +Daisley +Daisy +Daiton +Daivs +Daiz +Dajani +Dajer +Dakan +Dake +Daken +Dakes +Dakin +Daking +Dakins +Daku +Dalal +Dalaq +Dalba +Dalbec +Dalbeck +Dalbey +Dalby +Dalcour +Dale +Dalecki +Dalee +Dalegowski +Dalen +Dalenberg +Dalene +Daleo +Dalere +Dales +Dalesandro +Daleske +Dalessandro +Dalessio +Daleus +Daley +Dalfonso +Dalgleish +Dalhart +Dalhover +Dalin +Dalio +Dalitz +Daliva +Dalka +Dalke +Dall +Dalla +Dallago +Dallaire +Dallam +Dallas +Dallavalle +Dallen +Daller +Dallesandro +Dalleva +Dalley +Dallis +Dallison +Dallman +Dallmann +Dallmeyer +Dallmier +Dalluge +Dally +Dalman +Dalmata +Dalmau +Dalmida +Dalmoro +Dalo +Daloia +Daloisio +Dalomba +Dalonzo +Dalpe +Dalphonse +Dalpiaz +Dalponte +Dalporto +Dalrymple +Dalsanto +Dalton +Daltorio +Daluz +Daly +Dalzell +Dalzen +Dalziel +Dam +Dama +Daman +Damann +Damario +Damas +Damasco +Damato +Dambach +Dambakly +Damberger +Damboise +Dambra +Dambrose +Dambrosi +Dambrosia +Dambrosio +Dambrozio +Dame +Damelio +Damerell +Dameron +Dames +Damewood +Dami +Damian +Damiani +Damiano +Damico +Damien +Damis +Damm +Dammad +Dammann +Damme +Dammen +Dammeyer +Dammrich +Damms +Damon +Damone +Damore +Damoro +Damoth +Damour +Damours +Dampeer +Dampf +Damphousse +Dampier +Damrell +Damron +Damrow +Dan +Dana +Danaher +Danahy +Danas +Danby +Danca +Dancause +Dance +Dancel +Dancer +Dancey +Danchetz +Danco +Dancoes +Dancy +Danczak +Dando +Dandoy +Dandrade +Dandrea +Dandridge +Dandrow +Dandurand +Dandy +Dane +Danehy +Danek +Danekas +Daneker +Danella +Daner +Danes +Danese +Danesh +Danesi +Danfield +Danford +Danforth +Dang +Dangel +Dangelis +Dangelo +Danger +Dangerfield +Dangler +Danh +Dani +Danial +Danials +Daniel +Daniele +Danielian +Daniell +Danielle +Daniello +Danielovich +Daniels +Danielsen +Danielski +Danielson +Daniely +Danis +Danish +Danison +Danker +Dankert +Dankmeyer +Danko +Danks +Danley +Dann +Danna +Dannard +Dannatt +Dannecker +Dannelley +Dannelly +Dannels +Danneman +Dannenberg +Dannenfelser +Danner +Dannhaus +Danni +Danniels +Dannis +Danns +Dannunzio +Danny +Dano +Danoff +Danos +Danoski +Danowski +Dansbury +Dansby +Danser +Dansereau +Dansie +Danson +Dant +Dante +Dantes +Dantin +Danton +Dantoni +Dantonio +Dantos +Dantuono +Dantzler +Danuser +Danyow +Danz +Danza +Danzer +Danziger +Danzy +Dao +Daoud +Daoust +Dapas +Dapice +Dapinto +Dapolito +Daponte +Dapoz +Dapper +Daprile +Dapvaala +Daquila +Daquilante +Daquino +Daquip +Dar +Darakjian +Darakjy +Daramola +Daras +Darbeau +Darbonne +Darbouze +Darbro +Darby +Darbyshire +Darcangelo +Darcey +Darco +Darcus +Darcy +Dardagnac +Dardar +Dardashti +Darden +Dardenne +Dardis +Dardon +Dardy +Dare +Darensbourg +Darey +Darga +Dargan +Dargatz +Dargenio +Dargie +Dargin +Dargis +Dari +Daria +Dariano +Daricek +Darienzo +Daring +Darington +Dario +Daris +Darity +Darius +Darjean +Dark +Darke +Darkis +Darks +Darland +Darley +Darlin +Darling +Darlington +Darm +Darmiento +Darmody +Darnall +Darnel +Darnell +Darner +Darnick +Darnley +Darnold +Darnstaedt +Daro +Darocha +Daron +Daros +Darosa +Darou +Darr +Darracott +Darragh +Darrah +Darras +Darrell +Darrigo +Darrin +Darring +Darrington +Darrisaw +Darroch +Darron +Darrough +Darrow +Darrup +Darsch +Darsey +Darsi +Darsow +Darst +Dart +Darter +Dartez +Darthard +Darting +Dartt +Darty +Darugar +Daruszka +Darveau +Darvile +Darville +Darvin +Darvish +Darwich +Darwin +Darwish +Dary +Daryanl +Das +Dasalia +Dasch +Daschofsky +Dase +Dasen +Dasgupta +Dash +Dashem +Dasher +Dashiell +Dashnaw +Dashne +Dashner +Dashno +Dasilua +Dasilva +Dasinger +Daskal +Daskam +Dasmann +Daso +Dasouza +Dasovich +Dass +Dasso +Dassow +Daste +Dastoli +Dastrup +Datamphay +Datcher +Dates +Dathe +Datil +Datko +Dato +Datri +Datson +Datt +Datta +Datte +Dattilio +Dattilo +Datu +Datwyler +Daty +Datz +Dau +Daub +Daubendiek +Daubenmire +Daubenspeck +Dauber +Dauberman +Daubert +Daubney +Daubs +Daudelin +Daudier +Daudt +Dauenhauer +Dauer +Daufeldt +Daugaard +Dauge +Daugereau +Daughdrill +Daughenbaugh +Daugherty +Daughetee +Daughety +Daughrity +Daughters +Daughterty +Daughtery +Daughton +Daughtrey +Daughtridge +Daughtry +Dauila +Daul +Daulerio +Daulton +Daum +Daunt +Dauphin +Dauphinais +Dauria +Daurizio +Daus +Dausch +Dause +Dauster +Dauterive +Dauterman +Dauteuil +Dautremont +Dautrich +Dauzart +Dauzat +Davalos +Davance +Davanzo +Davari +Davault +Davaz +Davda +Dave +Davel +Daven +Davenport +Davensizer +Davern +Davers +Daversa +Daves +Davey +Davi +Davia +Daviau +Davich +Davick +David +Davide +Davidek +Davidian +Davidoff +Davidowicz +Davids +Davidsen +Davidsmeyer +Davidson +Davie +Davies +Davignon +Davila +Davilla +Davin +Davine +Davino +Davion +Davirro +Davis +Davise +Davison +Davisson +Davito +Davitt +Davney +Davolt +Davoren +Davos +Davtyan +Davy +Davydov +Daw +Dawahoya +Dawber +Dawdy +Dawe +Dawes +Dawkin +Dawkins +Dawley +Dawn +Dawood +Dawoud +Daws +Dawsey +Dawson +Dax +Day +Daya +Dayal +Dayan +Dayao +Daye +Dayem +Dayer +Dayhoff +Dayhuff +Daykin +Dayley +Daylong +Daymude +Dayne +Dayrit +Days +Dayton +Daywalt +Daza +Dazey +Dazi +Dazzi +Dea +Deacetis +Deacon +Deacy +Deaderick +Deadmond +Deadwyler +Deady +Deaguero +Deaguiar +Deahl +Deak +Deakin +Deakins +Deakyne +Deal +Dealba +Deale +Dealmeida +Dealy +Deamer +Dean +Deanda +Deandrade +Deane +Deaner +Deanes +Deang +Deangeles +Deangelis +Deangelo +Deangelus +Deanhardt +Deanne +Deans +Deaquino +Dear +Dearborn +Dearco +Dearcos +Dearden +Deardon +Deardorff +Deardurff +Deare +Dearin +Dearing +Dearinger +Dearman +Dearmas +Dearment +Dearmitt +Dearmon +Dearmond +Dearmore +Dearo +Dearring +Dearruda +Dears +Dearson +Dearstyne +Dearth +Deary +Deas +Dease +Deases +Deasis +Deason +Deasy +Deatherage +Deatley +Deaton +Deats +Deaver +Deavers +Deavila +Deaville +Debaca +Deback +Debacker +Debaecke +Debaets +Debar +Debarba +Debardelaben +Debarge +Debari +Debarr +Debarros +Debartolo +Debbins +Debeaumont +Debeer +Debelak +Debell +Debella +Debellis +Debello +Debem +Debenedetti +Debenedetto +Debenedictis +Debenedittis +Debenham +Deberg +Debernardi +Deberry +Debes +Debettignies +Debey +Debiase +Debiasi +Debiasio +Debien +Debiew +Deblanc +Deblase +Deblasi +Deblasio +Deblauw +Deblieck +Deblois +Debnam +Debnar +Debo +Deboard +Deboe +Deboef +Deboer +Debois +Debold +Debolt +Debona +Debonis +Debord +Deborde +Debore +Debose +Debouse +Debow +Debrae +Debraga +Debray +Debrecht +Debreto +Debrie +Debrita +Debrito +Debro +Debrock +Debrosse +Debrot +Debroux +Debruce +Debruhl +Debruin +Debruler +Debruyn +Debry +Debski +Debuhr +Debus +Debuse +Debusk +Debutiaco +Debutts +Dec +Decaen +Decaire +Decambra +Decamp +Decandia +Decaneo +Decann +Decant +Decapite +Decaprio +Decapua +Decardenas +Decardo +Decarlo +Decarmine +Decaro +Decarolis +Decarr +Decarvalho +Decasanova +Decasas +Decastro +Decato +Decatur +Dececco +Decelle +Decelles +December +Decena +Decent +Decenzo +Decesare +Dech +Dechaine +Dechambeau +Dechamplain +Dechant +Dechart +Dechavez +Dechellis +Dechert +Dechick +Dechico +Decicco +Decillis +Decinti +Decio +Decius +Deck +Deckard +Deckelbaum +Deckelman +Decker +Deckers +Deckert +Deckman +Declark +Declercq +Declerk +Declet +Declouette +Declue +Decock +Decola +Decomo +Deconti +Decook +Decorte +Decos +Decost +Decosta +Decoste +Decoster +Decoteau +Decou +Decoud +Decourcey +Decourley +Decoursey +Decourt +Decoux +Decraene +Decree +Decristofaro +Decristoforo +Decroo +Decrosta +Decuir +Deculus +Decurtis +Dedaj +Dede +Dedeaux +Dedecker +Dedek +Dedeke +Dederich +Dederick +Dedic +Dedicke +Dedier +Dedinas +Dedios +Dedman +Dedmon +Dednam +Dedo +Dedominicis +Dedon +Dedrick +Dedrickson +Dee +Deeb +Deed +Deedrick +Deeds +Deeg +Deegan +Deeken +Deeks +Deel +Deeley +Deely +Deem +Deemer +Deems +Deen +Deener +Deep +Deer +Deerdoff +Deere +Deering +Deerman +Dees +Deese +Deeter +Deeters +Deets +Deetz +Deever +Defaber +Defabio +Defalco +Defaria +Defayette +Defazio +Defee +Defelice +Defenbaugh +Defenderfer +Defeo +Deffenbaugh +Deffibaugh +Defibaugh +Defide +Defiglio +Defiguero +Defilippi +Defilippis +Defilippo +Defina +Defino +Defiore +Defir +Deflorio +Defoe +Defonce +Defont +Defoor +Defoore +Deford +Defore +Deforest +Deforge +Deforrest +Defosse +Defosses +Defosset +Defouw +Defrain +Defrance +Defranceschi +Defrancesco +Defrancis +Defrancisco +Defranco +Defrang +Defrank +Defrates +Defreece +Defreese +Defreitas +Defries +Defusco +Degado +Degaetano +Degagne +Degan +Degarmo +Degasparre +Degasperis +Degaust +Degear +Degeare +Degeest +Degelbeck +Degele +Degen +Degenaro +Degener +Degenfelder +Degenhardt +Degenhart +Degennaro +Degeorge +Degeston +Degeyter +Degiacomo +Degidio +Degiorgio +Degirolamo +Degiulio +Deglandon +Deglanville +Degler +Deglopper +Deglow +Degman +Degnan +Degner +Degnim +Degolier +Degollado +Degolyer +Degon +Degonia +Degooyer +Degori +Degraaf +Degrace +Degracia +Degraff +Degraffenreid +Degraffenried +Degrand +Degrande +Degrandpre +Degrange +Degrass +Degrasse +Degrate +Degrave +Degravelle +Degraw +Degrazia +Degrazio +Degre +Degree +Degreenia +Degregorio +Degrella +Degrenier +Degro +Degroat +Degroff +Degrood +Degroot +Degroote +Degross +Degruy +Deguire +Deguise +Degunya +Deguzman +Dehaan +Dehaas +Dehaemers +Dehan +Dehaney +Deharo +Dehart +Dehass +Dehaven +Dehay +Deherrera +Dehetre +Dehghani +Dehl +Dehler +Dehlinger +Dehm +Dehmer +Dehn +Dehne +Dehner +Dehnert +Dehoff +Dehombre +Dehoyos +Dehrer +Deibel +Deibert +Deible +Deibler +Deichman +Deichmann +Deida +Deidrick +Deierlein +Deigado +Deighan +Deighton +Deignan +Deihl +Deike +Deily +Deimund +Deinert +Deines +Deinhardt +Deininger +Deir +Deis +Deisch +Deischer +Deisher +Deiss +Deist +Deister +Deitch +Deiter +Deiters +Deitrich +Deitrick +Deitsch +Deitz +Deja +Dejackome +Dejaeger +Dejager +Dejarden +Dejardin +Dejarme +Dejarnett +Dejarnette +Dejean +Dejes +Dejesus +Dejohn +Dejoie +Dejong +Dejonge +Dejongh +Dejoode +Dejoseph +Dejulio +Dekalb +Dekany +Dekay +Dekenipp +Dekeyser +Dekeyzer +Dekine +Dekker +Dekle +Deklerk +Dekok +Dekoning +Dekorne +Dekort +Dekorte +Dekrey +Dekruif +Dekuyper +Del +Dela +Delabarre +Delacerda +Delacruz +Delacuesta +Delacueva +Delacy +Delaet +Delafontaine +Delafuente +Delagado +Delagarza +Delage +Delaglio +Delagol +Delagrange +Delaguardia +Delaguila +Delahanty +Delahay +Delahoussaye +Delahoya +Delahoz +Delahunt +Delaine +Delair +Delalla +Delallo +Delaluz +Delamar +Delamare +Delamarter +Delamater +Delamora +Delana +Delancey +Delancy +Deland +Delaney +Delang +Delange +Delangel +Delano +Delanoche +Delanoy +Delanuez +Delany +Delao +Delap +Delapaz +Delapena +Delapenha +Delaplane +Delaporte +Delaportilla +Delapp +Delapuente +Delara +Delaremore +Delarge +Delargy +Delariva +Delarme +Delaroca +Delarosa +Delasancha +Delasbour +Delash +Delashaw +Delashmit +Delashmutt +Delasko +Delatorre +Delatrinidad +Delatte +Delauder +Delaughter +Delaune +Delaura +Delaurentis +Delaurie +Delauter +Delavega +Delavergne +Delavina +Delaware +Delawder +Delawyer +Delay +Delbalso +Delbene +Delbert +Delbo +Delbosque +Delbridge +Delbrocco +Delbrune +Delbusto +Delcambre +Delcamp +Delcampo +Delcarlo +Delcarmen +Delcastillo +Delce +Delcid +Delcine +Delco +Delcolle +Delcour +Delcourt +Delcueto +Deldeo +Deldonno +Delduca +Delea +Delee +Deleeuw +Delegado +Delegeane +Delehanty +Delehoy +Delekta +Delellis +Delemos +Delena +Delenick +Deleo +Deleon +Deleonardis +Deleonardo +Deleone +Deleppo +Delerme +Delessio +Deleston +Delettre +Delevik +Deley +Delfavero +Delfelder +Delfi +Delfierro +Delfin +Delfino +Delfs +Delfuente +Delgadillo +Delgadilo +Delgado +Delgardo +Delgato +Delgatto +Delgenio +Delger +Delgiudice +Delgoda +Delgrande +Delgreco +Delgrosso +Delguercio +Delguidice +Delhierro +Delhomme +Delhoyo +Delia +Deliberato +Delibertis +Deliberto +Delilla +Delille +Delilli +Delillo +Delima +Deline +Delinois +Delio +Delira +Delisa +Delisi +Delisio +Delisle +Deliso +Delisser +Deliz +Delk +Delker +Dell +Della +Dellaca +Dellacioppa +Dellagatta +Dellajacono +Dellamonica +Dellamora +Dellamore +Dellano +Dellapaolera +Dellapenna +Dellapenta +Dellapina +Dellaporta +Dellaratta +Dellaripa +Dellarocco +Dellarose +Dellasanta +Dellasciucca +Dellavalle +Dellbringge +Delle +Dellefave +Dellen +Dellenbaugh +Deller +Delles +Delley +Delli +Dellibovi +Delligatti +Delling +Dellinger +Dellis +Delliveneri +Dellon +Dellos +Dellosso +Dellow +Dellum +Dellwo +Delmage +Delman +Delmar +Delmas +Delmastro +Delmedico +Delmendo +Delmolino +Delmonaco +Delmonico +Delmont +Delmonte +Delmoral +Delmore +Delmoro +Delmundo +Delmuro +Delnegro +Delnero +Delnoce +Delo +Deloach +Deloatch +Deloe +Deloera +Deloff +Deloge +Delois +Delon +Delonais +Delone +Deloney +Delong +Delonge +Delongis +Delorbe +Delore +Delorenzo +Delorey +Delorge +Deloria +Delorme +Delos +Delosa +Delosangeles +Delosanglel +Delosantos +Delosh +Delosier +Delosreyes +Delosrios +Delossanto +Delossantos +Delouise +Deloy +Deloye +Delozier +Delp +Delpaggio +Delpapa +Delperdang +Delph +Delphia +Delpiano +Delpino +Delpit +Delpozo +Delprete +Delprincipe +Delpriore +Delre +Delreal +Delrie +Delrio +Delrosario +Delross +Delrossi +Delrosso +Delsavio +Delsignore +Delsoin +Delsol +Delson +Delsordo +Delton +Deltora +Deltoro +Deltufo +Deluca +Delucas +Delucca +Delucchi +Deluccia +Delucia +Delucian +Deluco +Delude +Deluise +Delullo +Deluna +Deluney +Delung +Delusia +Deluz +Deluzio +Delva +Delval +Delvalle +Delvecchio +Delveechio +Delvillar +Delvin +Delwiche +Delzell +Delzer +Demaggio +Demagistris +Demaine +Demaio +Demaire +Demaline +Demallie +Deman +Demange +Demar +Demara +Demarais +Demaranville +Demaray +Demarc +Demarce +Demarco +Demarcus +Demaree +Demarest +Demaria +Demarini +Demarinis +Demarino +Demario +Demaris +Demark +Demarrais +Demars +Demarse +Demarsico +Demart +Demartini +Demartino +Demary +Demarzio +Demas +Demase +Demasi +Demasters +Demastus +Demateo +Dematos +Dematteis +Dematteo +Demattia +Demattos +Demauri +Demauro +Demay +Demayo +Dembek +Dember +Dembinski +Dembitzer +Dembo +Dembosky +Dembowski +Dembroski +Demby +Demchak +Demchok +Demedeiros +Demeester +Demeglio +Demel +Demelis +Demello +Demelo +Demendonca +Dement +Demeo +Demer +Demerchant +Demere +Demeris +Demeritt +Demeritte +Demers +Demerson +Demery +Demesa +Demeter +Demetrakos +Demetree +Demetriou +Demetris +Demetro +Demeyer +Demeza +Demian +Demianczyk +Demicco +Demich +Demichele +Demichelis +Demichiel +Demick +Demiel +Demien +Demik +Demille +Demilt +Deming +Demint +Demirchyan +Demirjian +Demiter +Demko +Demler +Demling +Demma +Demman +Demme +Demmel +Demmer +Demmert +Demming +Demmon +Demmons +Demmy +Demny +Demo +Demonbreun +Demond +Demonett +Demoney +Demont +Demonte +Demontigny +Demopoulos +Demora +Demoranville +Demore +Demorest +Demorizi +Demorrett +Demory +Demos +Demoss +Demosthenes +Demott +Demotta +Demoura +Demoya +Dempewolf +Demps +Dempsey +Dempster +Dempsy +Demro +Demry +Demsey +Demshar +Demske +Demski +Demsky +Demuizon +Demulling +Demuro +Demus +Demuth +Demuzio +Demyan +Demyers +Dena +Denafo +Denapoli +Denard +Denardi +Denardis +Denardo +Denaro +Denault +Denbo +Denboer +Denbow +Denburger +Denby +Dence +Dench +Dencklau +Dender +Dendy +Dene +Deneal +Deneen +Denegre +Deneke +Denenberg +Denery +Denes +Denet +Denetclaw +Deneui +Denfip +Deng +Dengel +Denger +Dengler +Denham +Denhartog +Denherder +Denholm +Deni +Denice +Denick +Denicola +Denier +Denike +Deniken +Denina +Deninno +Denio +Deniro +Denis +Denisco +Denise +Denison +Deniston +Deniz +Denjen +Denk +Denker +Denkins +Denley +Denlinger +Denman +Denmark +Denmon +Denn +Denna +Dennard +Denne +Dennehy +Dennen +Denner +Dennert +Dennett +Denney +Denni +Dennie +Dennies +Dennig +Dennin +Denning +Dennington +Dennis +Dennison +Denniston +Denno +Denny +Deno +Denoble +Denofrio +Denogean +Denoia +Denomme +Denoncourt +Denoon +Denooyer +Denos +Denoyelles +Denoyer +Dense +Densford +Densieski +Denski +Densley +Denslow +Densmore +Denson +Dent +Dente +Dentel +Denten +Dentino +Dentler +Denton +Dentremont +Denty +Denunzio +Denver +Denwood +Denyer +Denyes +Denzel +Denzer +Denzin +Denzine +Denzler +Deocampo +Deodato +Deojay +Deoliveira +Deon +Deonarian +Deonarine +Deorio +Depa +Depace +Depadua +Depalma +Depalo +Depaola +Depaoli +Depaolo +Depasquale +Depass +Depasse +Depaul +Depaula +Depaulis +Depauw +Depaz +Depedro +Depena +Deperro +Deperte +Depetris +Depetro +Depew +Depeyster +Dephillips +Depierre +Depierro +Depietro +Depina +Depinho +Depinto +Depippo +Depiro +Depner +Depolis +Depolito +Depolo +Depont +Deponte +Deporter +Depottey +Depoyster +Depp +Deppe +Deppen +Depperschmidt +Deppert +Depping +Deppner +Deprato +Depratt +Depree +Deprey +Deprez +Depriest +Deprince +Deprizio +Deprofio +Deprospero +Depsky +Deptula +Depue +Depugh +Depung +Deputy +Depuy +Depuydt +Dequattro +Dequinzio +Der +Deralph +Deramo +Deramus +Deraney +Deranick +Deraps +Deras +Derasmo +Derastel +Deraveniere +Derbacher +Derbes +Derby +Derbyshire +Derck +Dercole +Derden +Derderian +Derego +Deremer +Deremiah +Deren +Derenberger +Derendal +Derensis +Derenthal +Derentis +Derenzi +Derenzis +Derenzo +Derer +Dereu +Dereus +Derezinski +Derfler +Derflinger +Derfus +Derga +Dergance +Dergurahian +Derham +Derhammer +Derian +Derick +Derickson +Derico +Deridder +Derider +Derienzo +Deriggi +Dering +Deringer +Derington +Derion +Derise +Derita +Deritis +Derito +Derivan +Derizzio +Derk +Derkach +Derkas +Derks +Derksen +Dermady +Derman +Dermer +Dermo +Dermody +Dermott +Dern +Dernier +Derobertis +Deroberts +Derobles +Derocco +Deroche +Derocher +Deroeck +Deroest +Derogatis +Deroin +Deroko +Deromer +Deroos +Derosa +Derosby +Derose +Derosia +Derosie +Derosier +Deross +Derosset +Derossett +Derosso +Derouchie +Derouen +Derouin +Derousse +Derousselle +Deroven +Deroy +Derr +Derrah +Derrer +Derrick +Derrickson +Derrico +Derricott +Derrig +Derrigo +Derring +Derringer +Derrington +Derriso +Derrow +Derry +Derryberry +Dersch +Dershem +Derting +Dertinger +Derubeis +Deruiter +Derusha +Deruso +Deruyter +Derwin +Derwitsch +Derx +Dery +Desadier +Desai +Desak +Desalle +Desalvatore +Desalvo +Desamito +Desamparo +Desan +Desanctis +Desando +Desano +Desanti +Desantiago +Desantigo +Desantis +Desanto +Desantos +Desanty +Desatnik +Desaulniers +Desautel +Desautelle +Desautels +Desbiens +Descamps +Desch +Deschaine +Deschambault +Deschambeault +Deschamp +Deschamps +Deschene +Deschenes +Deschepper +Deschino +Deschner +Deschomp +Descombes +Descoteau +Descoteaux +Desena +Deserio +Deserres +Desforges +Desfosses +Desgroseillie +Desha +Deshaies +Desharnais +Deshaw +Deshay +Deshayes +Deshazer +Deshazior +Deshazo +Desher +Deshields +Deshler +Deshner +Deshon +Deshong +Deshotel +Deshotels +Deshpande +Desiato +Desiderio +Desiga +Desilets +Desilva +Desilvio +Desilvo +Desimas +Desimone +Desimoni +Desir +Desisles +Desisto +Desiyatnikov +Desjardin +Desjardins +Desjardiws +Desjarlais +Deskin +Deskins +Desko +Deslandes +Deslatte +Deslaurier +Deslauriers +Desler +Desloge +Desmarais +Desmarias +Desmaris +Desmet +Desmeules +Desmith +Desmond +Desmore +Desnoyers +Deso +Desola +Desolier +Desomma +Desonia +Desorbo +Desorcy +Desormeau +Desormeaux +Desormo +Desort +Desotel +Desoto +Desousa +Desouza +Despain +Despard +Desparrois +Desper +Despino +Desporte +Desposito +Despres +Desquare +Desrevisseau +Desroberts +Desrocher +Desrochers +Desroches +Desrosier +Desrosiers +Desruisseaux +Dess +Dessecker +Desselle +Dessert +Desso +Dest +Destasio +Destefani +Destefanis +Destefano +Destephano +Destephen +Destiche +Destime +Destina +Destine +Destree +Destro +Desue +Desutter +Desvergnes +Detaeye +Detamble +Detamore +Detar +Detchon +Detemple +Deter +Deterding +Detering +Deterline +Determan +Determann +Deters +Deteso +Detherage +Dethlefs +Dethlefsen +Dethomas +Dethomasis +Detienne +Detillier +Detillion +Detjen +Detlefs +Detlefsen +Detmer +Detoma +Detommaso +Detone +Detore +Detorres +Detraglia +Detrich +Detrick +Detro +Detrolio +Detten +Detter +Detterich +Dettinger +Dettling +Dettloff +Dettman +Dettmann +Dettmer +Dettmering +Dettor +Dettore +Dettori +Dettorre +Dettra +Detty +Detullio +Deturenne +Detweiler +Detwiler +Detz +Detzel +Detzler +Deubler +Deubner +Deuel +Deuell +Deuermeyer +Deuink +Deuman +Deupree +Deur +Deus +Deuschel +Deuschle +Deuser +Deutsch +Deutschendorf +Deutscher +Deutschman +Devai +Deval +Devalcourt +Devalk +Devall +Devalle +Devan +Devane +Devaney +Devanski +Devany +Devara +Devargas +Devarona +Devary +Devasier +Devaughan +Devaughn +Devaul +Devault +Devaux +Devazier +Deveau +Deveaux +Deveja +Devel +Develbiss +Develice +Devendorf +Devenecia +Deveney +Devenney +Devenny +Devenport +Devens +Devenuto +Deveny +Dever +Devera +Devere +Devereaux +Devereux +Devericks +Devers +Devery +Devey +Deveyra +Devich +Devick +Devier +Devilbiss +Devilla +Deville +Devillez +Devillier +Devilliers +Devin +Devincent +Devincentis +Devincenzi +Devincenzo +Devine +Deviney +Devinney +Devino +Devins +Devis +Devit +Devita +Devitis +Devito +Devitt +Devitto +Deviva +Devivo +Devlin +Devoe +Devoid +Devol +Devoll +Devon +Devone +Devonish +Devonshire +Devoogd +Devor +Devora +Devore +Devos +Devoss +Devost +Devot +Devoti +Devotie +Devoto +Devoy +Devreese +Devries +Dew +Dewaard +Dewaele +Dewald +Dewall +Dewalt +Dewan +Dewar +Dewaratanawan +Dewater +Dewaters +Dewberry +Dewees +Deweese +Dewer +Dewese +Dewey +Dewhirst +Dewhurst +Dewick +Dewiel +Dewilde +Dewindt +Dewing +Dewinne +Dewinter +Dewire +Dewispelaere +Dewit +Dewitt +Dewitte +Dewitz +Dewolf +Dewolfe +Dewolff +Dewoody +Dews +Dewulf +Dewyer +Dewyse +Dexheimer +Dexter +Dey +Deya +Deyak +Deyarmin +Deyarmond +Deyette +Deyo +Deyoe +Deyon +Deyoung +Dez +Dezalia +Dezan +Dezarn +Dezayas +Dezeeuw +Dezell +Dezenzo +Dezern +Dezzutti +Dhaliwal +Dhamer +Dhar +Dharas +Dheel +Dhein +Dhillon +Dhondt +Dhosane +Dhruva +Diab +Diachenko +Diaco +Diak +Dial +Diallo +Dials +Diamant +Diamante +Diamantopoulo +Diamico +Diamond +Diana +Diangelis +Diangelo +Diani +Diano +Dias +Diaz +Diazdeleon +Dibacco +Dibari +Dibartolo +Dibartolomeo +Dibattista +Dibben +Dibbern +Dibble +Dibblee +Dibbles +Dibella +Dibello +Dibenedetti +Dibenedetto +Dibenedict +Diberardino +Dibernardo +Dibert +Dibiase +Dibiasi +Diblase +Diblasi +Diblasio +Dible +Dibley +Dibona +Dibonaventura +Dibrell +Dibrino +Dibrito +Dicamillo +Dicampli +Dicaprio +Dicapua +Dicara +Dicarlo +Dicaro +Dicastro +Dice +Dicecco +Dicello +Dicerbo +Dicesare +Dicey +Dicharry +Dichiara +Dichiaro +Dichristopher +Diciano +Dicicco +Dicioccio +Dick +Dickason +Dicke +Dickel +Dicken +Dickens +Dickensheets +Dickenson +Dicker +Dickerman +Dickerson +Dickert +Dickes +Dickeson +Dickey +Dickhaus +Dickhaut +Dickhoff +Dickie +Dickins +Dickinson +Dickirson +Dickison +Dickman +Dickmann +Dickow +Dicks +Dickson +Dickstein +Dickun +Dickus +Diclaudio +Dicocco +Dicola +Dicorcia +Dicorpo +Dicosmo +Dicostanzo +Dicus +Didamo +Didato +Diddle +Didier +Didio +Didion +Didlake +Didomenico +Didomizio +Didonatis +Didonato +Didonna +Didriksen +Didway +Didyk +Dieball +Diebol +Diebold +Diec +Dieckman +Dieckmann +Diede +Diederich +Diederichs +Diedrich +Diedrick +Diedricks +Diefenbach +Diefenderfer +Diefendorf +Dieffenbach +Dieffenbacher +Diegel +Diegidio +Diego +Dieguez +Diehl +Diehm +Diekema +Dieken +Diekman +Diekmann +Diekrager +Diel +Dielman +Diem +Diemer +Diemert +Diemoz +Dien +Diener +Dienes +Dieng +Dienhart +Dienst +Diep +Diepenbrock +Dieppa +Dier +Diercks +Dieringer +Dierker +Dierkes +Dierking +Dierks +Dierolf +Diers +Diersen +Dies +Diesel +Diesen +Diesi +Diestel +Diestler +Dietel +Dieteman +Dieter +Dieterich +Dieterle +Dietert +Dietl +Dietlin +Dietrich +Dietrick +Dietsch +Dietsche +Dietterick +Dietz +Dietze +Dietzel +Dietzen +Dietzler +Dietzman +Dieudonne +Diewold +Diez +Difabio +Difalco +Difebbo +Difede +Difelice +Difeo +Diffee +Diffendal +Diffenderfer +Diffey +Diffley +Difilippo +Difillippo +Difiora +Difiore +Diflorio +Difonzo +Difrancesco +Difrancisco +Difranco +Difronzo +Difusco +Diga +Digaetano +Digangi +Digby +Digennaro +Digeorgio +Digerolamo +Digesare +Digges +Diggins +Diggs +Dighton +Digiacinto +Digiacomo +Digiambattist +Digian +Digilio +Digioia +Digiorgi +Digiorgio +Digiouanni +Digiovanni +Digirolamo +Digirolomo +Digiulio +Digiuseppe +Digman +Digmann +Dignan +Digness +Digrande +Digrazia +Digregorio +Digsby +Dihel +Diiorio +Diiulio +Dijulio +Dike +Dikeman +Dikens +Diker +Dikes +Diket +Dikkers +Dilalla +Dilallo +Dilan +Dilaura +Dilauro +Dilbeck +Dilbert +Dilchand +Dilcher +Dilda +Dilday +Dildine +Dildy +Dile +Dilella +Dilello +Dilena +Dileo +Dileonardo +Diles +Diley +Dilg +Dilgard +Dilger +Dilibero +Diliberti +Diliberto +Dilick +Dilillo +Dilisio +Dilks +Dill +Dillabough +Dillahunt +Dillahunty +Dillaman +Dillard +Dillashaw +Dillavou +Dille +Dillehay +Dillen +Dillenbeck +Dillenburg +Diller +Dilleshaw +Dilley +Dilliard +Dillie +Dilligard +Dillin +Dilliner +Dilling +Dillinger +Dillingham +Dillion +Dillis +Dillman +Dillmore +Dillon +Dillow +Dills +Dillworth +Dilly +Dilmore +Dilorenzo +Diloreto +Dilox +Dils +Dilsaver +Dilthey +Dilts +Diltz +Diluca +Dilucca +Dilullo +Diluzio +Dilworth +Dimaggio +Dimaio +Dimalanta +Dimanche +Dimarco +Dimare +Dimaria +Dimariano +Dimarino +Dimario +Dimartino +Dimarzio +Dimarzo +Dimas +Dimascio +Dimassimo +Dimatteo +Dimattia +Dimauro +Dimeglio +Dimeo +Dimery +Dimes +Dimezza +Dimicco +Dimiceli +Dimick +Diminich +Diminno +Dimino +Dimitri +Dimitriadis +Dimitriou +Dimitroff +Dimitrov +Dimitry +Dimitt +Dimler +Dimling +Dimmack +Dimmer +Dimmick +Dimmitt +Dimock +Dimodica +Dimon +Dimond +Dimopoulos +Dimoulakis +Dimperio +Dimpfl +Dimpson +Dimsdale +Dimucci +Dimuccio +Dimuzio +Din +Dina +Dinan +Dinapoli +Dinardi +Dinardo +Dinatale +Dincher +Dinco +Dine +Dineen +Dinehart +Dines +Ding +Dingee +Dingel +Dingeldein +Dingell +Dinger +Dinges +Dingess +Dingfelder +Dingie +Dingillo +Dingivan +Dinglasan +Dingle +Dingler +Dingman +Dingmann +Dings +Dingson +Dingus +Dingwall +Dinh +Dinham +Dinho +Dini +Dinicola +Dininger +Dininno +Dinis +Dinitto +Dinius +Diniz +Dinizio +Dinkel +Dinkens +Dinkin +Dinkins +Dinkle +Dinn +Dinneen +Dinnen +Dinnendahl +Dinning +Dinnocenzo +Dino +Dinola +Dinora +Dinos +Dinovi +Dinovo +Dinsdale +Dinsmoor +Dinsmore +Dintino +Dinucci +Dinunzio +Dinuzzo +Dinwiddie +Dinwoodie +Diodonet +Diogo +Diomede +Dion +Dioneff +Diones +Dionisio +Dionisopoulos +Dionne +Diop +Diorio +Diosdado +Diotte +Dipalma +Dipanfilo +Dipaola +Dipaolo +Dipasquale +Diperna +Dipiano +Dipiazza +Dipiero +Dipierro +Dipietrantoni +Dipietro +Dipilato +Dipinto +Dipippo +Dipirro +Dipolito +Diponio +Dippel +Dippery +Dippolito +Diprima +Dirado +Dirago +Dircks +Dirden +Dire +Direnzo +Dirickson +Dirico +Dirienzo +Dirk +Dirker +Dirks +Dirkse +Dirksen +Dirkson +Dirlam +Dirocco +Dirollo +Dirosa +Dirose +Dirr +Dirth +Dirusso +Diruzzo +Disabato +Disalvatore +Disalvi +Disalvo +Disandro +Disano +Disanti +Disanto +Disarufino +Disbro +Disbrow +Discala +Discenza +Disch +Discher +Dischinger +Dischner +Discipio +Discon +Diserens +Diseth +Disharoon +Dishaw +Disher +Dishian +Dishinger +Dishman +Dishmon +Dishner +Dishon +Dishong +Disilvestro +Disimone +Diskin +Diskind +Disla +Dismang +Dismore +Dismuke +Dismukes +Disney +Dison +Disorbo +Disorda +Disotell +Disparte +Dispenza +Dispirito +Disponette +Disque +Diss +Dissinger +Disspain +Distad +Distaffen +Distance +Distasio +Distefano +Distel +Distilo +Distin +Distler +Ditch +Ditchfield +Ditman +Ditmars +Ditmore +Dito +Ditolla +Ditomasso +Ditommaso +Ditore +Ditsch +Ditta +Dittberner +Dittbrenner +Dittemore +Ditter +Ditti +Dittman +Dittmann +Dittmar +Dittmer +Ditto +Ditton +Dittrich +Dittrick +Dittus +Ditty +Ditucci +Ditullio +Dituri +Ditzel +Ditzler +Diulio +Divalerio +Divan +Divel +Divelbiss +Diveley +Dively +Diven +Divenere +Divens +Divento +Diventura +Diver +Divers +Divin +Divincenzo +Divine +Diviney +Divirgilio +Divis +Divita +Divito +Divlio +Divoll +Diwan +Dix +Dixey +Dixie +Dixion +Dixon +Dixons +Dixson +Diza +Dizadare +Dizer +Dizon +Djuric +Dk +Dlabaj +Dlobik +Dlouhy +Dlugos +Dluhy +Dmitriev +Do +Doak +Doakes +Doan +Doane +Dobb +Dobbe +Dobberfuhl +Dobberstein +Dobbin +Dobbins +Dobbratz +Dobbs +Dobbyn +Dobek +Doberstein +Dobert +Dobes +Dobesh +Dobey +Dobias +Dobie +Dobies +Dobiesz +Dobin +Dobine +Dobis +Dobison +Dobkin +Dobkins +Dobkowski +Doble +Dobler +Dobles +Dobmeier +Dobos +Dobosh +Dobosz +Dobransky +Dobrasz +Dobratz +Dobre +Dobrich +Dobrin +Dobrinin +Dobrinski +Dobrosky +Dobrowolski +Dobrowski +Dobrunz +Dobrushin +Dobry +Dobrynski +Dobrzykowski +Dobson +Doby +Dobyns +Doceti +Docherty +Dochterman +Docimo +Dock +Dockal +Docken +Dockendorf +Docker +Dockerty +Dockery +Dockett +Dockham +Dockins +Dockray +Dockstader +Dockter +Dockum +Dockus +Dockwiller +Doctor +Dodd +Dodds +Doderer +Dodge +Dodgen +Dodgion +Dodgson +Dodich +Dodier +Dodimead +Dodoo +Dodridge +Dodrill +Dodson +Dodsworth +Dodwell +Dody +Doe +Doeberling +Doebler +Doede +Doeden +Doege +Doegg +Doehring +Doelger +Doell +Doelling +Doemelt +Doepke +Doepner +Doerfler +Doerflinger +Doerhoff +Doering +Doerksen +Doerle +Doerner +Doerr +Doerrer +Doersam +Doescher +Doetsch +Doffing +Dogan +Doggett +Doggette +Dohan +Doheny +Doherty +Dohm +Dohman +Dohn +Dohnal +Dohogne +Dohring +Dohrman +Dohrmann +Dohrn +Dohse +Doi +Doidge +Doiel +Doig +Doil +Doiley +Doing +Doino +Doire +Doiron +Dok +Doke +Doker +Dokes +Dokka +Dokken +Dokovic +Dokuchitz +Dolak +Dolan +Doland +Dolbeare +Dolbee +Dolberry +Dolbin +Dolbow +Dolby +Dolce +Dolcetto +Dolch +Dold +Dolder +Doldo +Dole +Doleac +Dolecek +Dolecki +Dolejsi +Doleman +Dolen +Dolence +Doler +Doles +Dolese +Dolezal +Dolfay +Dolfi +Dolgas +Dolhon +Dolhun +Dolin +Dolinar +Dolinger +Dolinski +Dolinsky +Dolio +Doliveira +Doljac +Doll +Dollahite +Dollak +Dollar +Dollard +Dollarhide +Dolle +Dollen +Doller +Dolley +Dollinger +Dollings +Dollins +Dollison +Dolliver +Dolloff +Dolly +Dollyhigh +Dolmajian +Dolman +Dolney +Dolores +Dolph +Dolphin +Dols +Dolsen +Dolson +Dolton +Dolven +Dom +Domagala +Domagall +Domagalski +Doman +Domangue +Domann +Domanski +Domas +Dombeck +Dombek +Dombkowski +Dombroski +Dombrosky +Dombrowski +Dome +Domebo +Domeier +Domek +Domenech +Domenget +Domenice +Domenick +Domenico +Domer +Domhoff +Domiano +Domianus +Domin +Domina +Domine +Dominey +Dominga +Dominges +Domingez +Domingo +Domingos +Domingue +Domingues +Dominguez +Domingus +Dominiak +Dominic +Dominici +Dominick +Dominico +Dominicus +Dominiguez +Dominik +Dominion +Dominique +Dominiquez +Dominis +Domino +Dominowski +Dominque +Dominquez +Dominski +Dominy +Domio +Domitrovich +Domke +Domkowski +Dommel +Dommer +Domnick +Domowicz +Dompe +Don +Dona +Donaby +Donachie +Donadio +Donado +Donaghe +Donaghey +Donaghue +Donaghy +Donah +Donaher +Donahey +Donaho +Donahoe +Donahoo +Donahue +Donald +Donalds +Donaldson +Donalson +Donar +Donart +Donat +Donate +Donatelli +Donatello +Donath +Donathan +Donati +Donatich +Donatien +Donato +Donavan +Donawa +Donaway +Donayre +Doncaster +Donchatz +Donchez +Dondero +Dondlinger +Done +Donegan +Donehoo +Donel +Donelan +Donelly +Donelon +Donelson +Doner +Donerson +Dones +Doney +Donez +Dong +Donges +Dongo +Donham +Donhoe +Donica +Doniel +Donigan +Doniger +Donilon +Donis +Donivan +Donkervoet +Donkin +Donkle +Donkor +Donlan +Donley +Donlin +Donlon +Donlyuk +Donmore +Donmoyer +Donn +Donna +Donnalley +Donnally +Donnan +Donndelinger +Donne +Donnel +Donnell +Donnellan +Donnelley +Donnellon +Donnelly +Donnelson +Donnely +Donner +Donnerberg +Donnick +Donnie +Donning +Dono +Donofrio +Donoghue +Donoho +Donohoe +Donohoo +Donohue +Donohve +Donoso +Donota +Donovan +Donson +Dontas +Donten +Donton +Donze +Doody +Doogan +Dool +Doolan +Doolen +Dooley +Doolin +Dooling +Doolittle +Doom +Dooms +Doonan +Dooner +Dooney +Doop +Door +Doore +Doorley +Doorn +Doornbos +Doose +Dootson +Dopazo +Dopf +Dopico +Dopita +Dople +Dopler +Doporto +Dopp +Dopson +Dora +Dorado +Dorais +Dorame +Doran +Dorantes +Dorat +Dorazio +Dorcas +Dorce +Dorcelus +Dorcent +Dorch +Dorchy +Dorcy +Dore +Doremus +Doren +Dorenfeld +Dorer +Dorey +Dorf +Dorff +Dorfman +Dorgan +Dorge +Doria +Dorian +Dorich +Dorie +Doriean +Dorin +Doring +Dorinirl +Dorio +Dorion +Doris +Dority +Dorka +Dorkin +Dorko +Dorl +Dorland +Dorlando +Dormaier +Dorman +Dormane +Dormanen +Dormer +Dorminey +Dorminy +Dorn +Dornak +Dornan +Dornbos +Dornbrook +Dornbusch +Dorne +Dornellas +Dorner +Dorney +Dornfeld +Dornhelm +Dornier +Dorning +Dornon +Dornseif +Doro +Doroff +Doronio +Dorosan +Dorosh +Doroski +Dorosky +Dorothy +Dorough +Dorow +Dorph +Dorpinghaus +Dorr +Dorrance +Dorrell +Dorrian +Dorries +Dorrill +Dorrington +Dorris +Dorrough +Dorsaint +Dorsainvil +Dorsay +Dorsch +Dorschner +Dorset +Dorsett +Dorsette +Dorsey +Dorshimer +Dorshorst +Dorsinville +Dorso +Dorson +Dorst +Dort +Dorta +Dortch +Dortilla +Dorton +Dorval +Dorvee +Dorvil +Dorvillier +Dorward +Dorweiler +Dory +Dosal +Dosch +Doscher +Dose +Doseck +Doser +Dosh +Dosher +Doshi +Doshier +Dosier +Doskocil +Dosreis +Doss +Dossantos +Dossett +Dossey +Dossie +Dossman +Dossous +Dost +Dostal +Doster +Dostie +Doswell +Doten +Dothard +Dotie +Doto +Dotolo +Dotson +Dotstry +Dottavio +Dotter +Dotterer +Dotterweich +Dottery +Dottin +Dottle +Dotto +Dotts +Doty +Dotzler +Dou +Doub +Doubek +Doubet +Double +Doubleday +Doubrava +Douce +Doucet +Doucett +Doucette +Doud +Doudna +Douds +Douet +Douga +Dougal +Dougall +Dougan +Doughan +Dougharity +Dougharty +Dougher +Dougherty +Doughman +Doughtery +Doughtie +Doughton +Doughtry +Doughty +Douglas +Douglass +Douillet +Douin +Doukas +Doulani +Douma +Doung +Dourado +Dousay +Douse +Doussan +Douthart +Douthett +Douthit +Douthitt +Doutt +Douty +Douvia +Douvier +Douville +Douyette +Douyon +Dovalina +Dove +Dovel +Dovenbarger +Dovenmuehler +Dover +Doverspike +Dovey +Dow +Doward +Dowd +Dowda +Dowdall +Dowdell +Dowden +Dowding +Dowdle +Dowds +Dowdy +Dowe +Dowell +Dowen +Dower +Dowers +Dowery +Dowey +Dowgiallo +Dowhower +Dowis +Dowker +Dowland +Dowlen +Dowler +Dowless +Dowlin +Dowling +Down +Downard +Downen +Downer +Downes +Downey +Downham +Downhour +Downie +Downin +Downing +Downs +Downton +Downum +Downy +Dowse +Dowsett +Dowson +Dowst +Dowtin +Dowty +Doxbeck +Doxey +Doxie +Doxon +Doxtater +Doxtator +Doyal +Doyan +Doyel +Doyen +Doyer +Doyle +Doyne +Doyon +Doyscher +Dozal +Dozar +Dozer +Dozier +Dozois +Draa +Drabant +Drabek +Drabicki +Drach +Drader +Draeger +Drafall +Draffen +Draffin +Draft +Drafton +Drafts +Dragaj +Dragan +Drage +Drager +Dragg +Draggett +Draggoo +Draghi +Dragich +Dragna +Drago +Dragon +Dragone +Dragoo +Dragos +Dragotta +Dragovich +Dragt +Dragula +Dragun +Draheim +Drahos +Drahota +Draime +Drain +Draine +Drainer +Drainville +Drake +Drakeford +Drakes +Drakos +Drakulic +Draleau +Dralle +Dramis +Drane +Draney +Drape +Drapeau +Drapeaux +Draper +Drapkin +Drappo +Dratch +Drath +Draudt +Draughn +Draughon +Draves +Dravland +Drawbaugh +Drawdy +Drawe +Drawec +Drawhorn +Drawy +Draxler +Dray +Drayer +Drayton +Drda +Dreben +Drebes +Drechsler +Dreckman +Dredge +Drees +Dreese +Dreesman +Dreessen +Dreger +Dreggs +Dregrich +Dreher +Drehmer +Drehobl +Drehs +Dreibelbis +Dreier +Dreiling +Dreisbach +Dreiss +Dreith +Dreitzler +Drejka +Dreka +Drelick +Drennan +Drennen +Drenner +Drenning +Drennon +Drenon +Drenth +Drentlaw +Dreps +Dresbach +Dresch +Drescher +Dresel +Dresher +Dresner +Dress +Dressel +Dressen +Dresser +Dressler +Dressman +Dretzka +Dreuitt +Drevs +Drew +Drewel +Drewer +Drewery +Drewes +Drewett +Drewing +Drewniak +Drewry +Drews +Drewski +Drexel +Drexler +Drey +Dreyer +Dreyfus +Dreyfuss +Driedric +Drier +Driere +Dries +Driesbach +Driesel +Driesenga +Driessen +Driever +Driggars +Driggers +Driggins +Driggs +Drilling +Drillock +Drimmer +Drinen +Drinkall +Drinkard +Drinkley +Drinkwater +Drinkwine +Drinnen +Drinnon +Drinski +Dripps +Driscol +Driscoll +Drisdelle +Drish +Driskell +Driskill +Drisko +Drissel +Drivas +Driver +Drivers +Drizin +Drobny +Drobot +Drock +Droege +Droegmiller +Droesch +Droessler +Droggitis +Drohan +Droke +Drolet +Drollinger +Dromgoole +Drone +Droneburg +Dronen +Drones +Dronet +Droney +Drong +Dronick +Dronko +Drook +Drop +Dropinski +Drorbaugh +Drosick +Droski +Dross +Drossman +Drossos +Drost +Droste +Drott +Droubay +Drought +Drouillard +Drouin +Drouse +Drovin +Drow +Drown +Drowne +Droy +Droz +Drozd +Drozda +Drozdenko +Drozdowicz +Drozdowski +Droze +Dru +Drube +Druck +Drucker +Druckhammer +Druckman +Drude +Drue +Druetta +Drugan +Drullard +Drum +Drumbore +Drumgo +Drumgole +Drumgoole +Drumheiser +Drumheller +Drumm +Drummer +Drummey +Drummond +Drummonds +Drumwright +Drungo +Drury +Druschel +Drust +Drutman +Druvenga +Dry +Drybread +Dryden +Drye +Dryer +Drylie +Dryman +Drymon +Drysdale +Drzazgowski +Drzewicki +Drzewiecki +Dsaachs +Dsouza +Dspain +Du +Dua +Duane +Duarte +Duartes +Dub +Duba +Dubach +Dubaldi +Duball +Duban +Dubard +Dubas +Dubay +Dubberly +Dubbert +Dubbin +Dubbs +Dube +Dubeau +Dubeck +Dubej +Dubel +Duber +Duberry +Duberstein +Dubey +Dubiansky +Dubicki +Dubie +Dubiel +Dubill +Dubin +Dubinsky +Dubis +Dubitsky +Duble +Dubler +Dublin +Dubois +Duboise +Dubon +Dubonnet +Dubord +Dubose +Dubourg +Dubovsky +Dubow +Dubray +Dubre +Dubree +Dubreuil +Dubrey +Dubrock +Dubrow +Dubs +Dubson +Dubuc +Dubuisson +Dubuque +Duby +Dubyk +Duca +Ducan +Ducas +Ducasse +Ducat +Ducatelli +Ducay +Ducayne +Ducceschi +Ducci +Duce +Duceman +Ducey +Duch +Duchaine +Duchane +Ducharme +Duchatellier +Duchemin +Duchene +Duchesne +Duchesneau +Duchesney +Duchnowski +Duchon +Duchow +Duchscherer +Duck +Ducker +Duckett +Duckey +Duckhorn +Ducking +Ducklow +Ducksworth +Duckwall +Duckworth +Duclo +Duclos +Ducos +Ducote +Ducotey +Ducrepin +Duda +Dudack +Dudak +Dudas +Dudash +Dudasik +Dudden +Dudding +Duddy +Dudeck +Dudek +Duden +Dudenbostel +Dudenhoeffer +Duderstadt +Dudgeon +Dudik +Dudleson +Dudley +Dudman +Dudney +Dudycha +Dudziak +Dudzic +Dudzik +Dudzinski +Due +Dueber +Dueck +Dueitt +Duel +Duell +Duellman +Duelm +Duemmel +Duenas +Duenes +Duenez +Duenke +Dueno +Duenow +Duensing +Duenwald +Duer +Duerkop +Duerksen +Duerkson +Duerr +Duerson +Duerst +Dues +Duesenberg +Duesing +Duesterback +Duesterhaus +Duet +Duett +Duewall +Duey +Dufauchard +Dufault +Dufek +Dufer +Duff +Duffany +Duffee +Duffek +Duffel +Duffer +Duffett +Duffey +Dufficy +Duffie +Duffield +Duffin +Duffney +Dufford +Duffus +Duffy +Dufilho +Dufner +Duford +Dufort +Dufour +Dufrain +Dufrane +Dufrene +Dufresne +Duft +Dugal +Dugan +Dugar +Dugas +Dugat +Dugay +Dugdale +Duggan +Duggar +Dugger +Duggin +Duggins +Dughi +Dugi +Dugmore +Dugo +Dugre +Duguay +Dugue +Duguette +Duh +Duhaime +Duhamel +Duhan +Duhart +Duhe +Duhl +Duhn +Duhon +Duignan +Duin +Duis +Duitch +Duitscher +Duk +Duka +Dukart +Dukas +Duke +Dukelow +Dukeman +Duker +Dukes +Dukeshier +Dukeshire +Dukett +Dukette +Dukhovny +Dukich +Dul +Dula +Dulac +Dulak +Dulan +Dulaney +Dulany +Dular +Dulatre +Dulay +Dulberg +Duldulao +Dulek +Dulemba +Duley +Duliba +Dulin +Duling +Dulkis +Dull +Dulle +Dullea +Dullen +Dullum +Dulmage +Dulong +Dulude +Duma +Dumag +Dumaine +Dumais +Duman +Dumar +Dumars +Dumas +Dumay +Dumbar +Dumbleton +Dumdei +Dume +Dumeny +Dumes +Dumesnil +Dumez +Dumire +Dumke +Dumlao +Dumler +Dumm +Dummer +Dummermuth +Dummett +Dummitt +Dumond +Dumont +Dumouchel +Dumoulin +Dumpe +Dumpert +Dumphy +Dumpson +Dun +Dunagan +Dunagin +Dunahoe +Dunahoo +Dunakin +Dunavant +Dunaway +Dunay +Dunbar +Duncan +Duncans +Duncanson +Duncil +Dunckel +Duncker +Duncklee +Duncomb +Duncombe +Dundas +Dundee +Dunderman +Dundlow +Dundon +Dunegan +Dunemann +Dunemn +Dunfee +Dunford +Dung +Dungan +Dungee +Dungey +Dungy +Dunham +Dunigan +Dunivan +Dunk +Dunkan +Dunkel +Dunkelberger +Dunken +Dunkentell +Dunker +Dunkerley +Dunkerson +Dunkin +Dunkinson +Dunkle +Dunkleberger +Dunklee +Dunkley +Dunklin +Dunks +Dunlap +Dunlavy +Dunleavy +Dunlevy +Dunlop +Dunlow +Dunman +Dunmead +Dunmire +Dunmore +Dunn +Dunnagan +Dunnahoo +Dunnam +Dunnavant +Dunnaville +Dunnaway +Dunne +Dunneback +Dunnegan +Dunnell +Dunnigan +Dunning +Dunnings +Dunnington +Dunnivan +Dunnum +Dunny +Dunomes +Dunovant +Dunphe +Dunphy +Dunscomb +Dunseith +Dunsford +Dunshee +Dunshie +Dunsing +Dunsmoor +Dunsmore +Dunson +Dunstan +Dunster +Dunston +Dunsworth +Dunt +Dunten +Duntley +Dunton +Duntz +Dunwiddie +Dunwoody +Dunworth +Dunzelman +Duong +Duonola +Duos +Dupar +Dupas +Dupaski +Dupass +Dupaty +Dupay +Dupee +Duperclay +Duperre +Duperry +Dupes +Duplaga +Duplanti +Duplantis +Duplechain +Duplechin +Dupler +Duplesis +Duplessis +Duplessy +Duplin +Dupont +Duponte +Dupoux +Dupouy +Duppstadt +Dupras +Duprat +Dupray +Dupre +Dupree +Duprey +Dupriest +Dupuis +Dupuy +Duquaine +Duque +Duquette +Dura +Duracher +Duraku +Dural +Durall +Duran +Duranceau +Durand +Durando +Durant +Durante +Durate +Durazo +Durbin +Durboraw +Durch +Durda +Durdan +Durden +Durdy +Dure +Duree +Durell +Durelli +Duren +Durepo +Duresky +Durett +Durette +Durfee +Durfey +Durgan +Durgin +Durham +Durhan +Durian +Durick +Durie +Durig +Duriga +During +Durio +Duris +Durisseau +Durk +Durke +Durkee +Durkes +Durkin +Durkins +Durland +Durley +Durling +Durman +Durnan +Durnell +Durney +Durnford +Durnil +Durnin +Durning +Durniok +Durocher +Durol +Duron +Duropan +Duroseau +Duross +Durough +Durousseau +Durpee +Durphey +Durr +Durrah +Durrance +Durrani +Durrant +Durre +Durrell +Durrenberger +Durrett +Durrette +Durrwachter +Dursch +Durso +Durst +Dursteler +Durtsche +Durtschi +Durun +Durupan +Durward +Duryea +Duryee +Dus +Dusablon +Dusak +Dusatko +Dusch +Dusek +Dusel +Dusen +Dusenberry +Dusenbery +Dusenbury +Dusett +Dush +Dushaj +Dushane +Dushkin +Dusi +Dusik +Dusing +Duskey +Duskin +Dusky +Duso +Dussault +Dusseault +Dust +Duster +Dustin +Dustman +Duston +Dusza +Duszynski +Dutch +Dutcher +Dutchess +Dutchover +Dute +Duteau +Dutel +Duthie +Dutil +Dutile +Dutka +Dutkiewicz +Dutko +Dutra +Dutremble +Dutro +Dutrow +Dutschmann +Dutson +Dutt +Dutta +Dutter +Duttinger +Dutton +Duttry +Duttweiler +Duty +Duva +Duval +Duvall +Duve +Duvel +Duverne +Duverney +Duvernois +Duwe +Duwhite +Dux +Duxbury +Duy +Duyer +Duzan +Dvorak +Dvorsky +Dwaileebe +Dwan +Dwane +Dweck +Dwelle +Dwelley +Dwellingham +Dwiggins +Dwight +Dwinell +Dwire +Dworaczyk +Dworak +Dworkin +Dwornik +Dwyar +Dwyer +Dy +Dyal +Dyals +Dyar +Dyas +Dyba +Dybala +Dyce +Dyche +Dyches +Dyck +Dyckman +Dycus +Dyda +Dydell +Dydo +Dye +Dyen +Dyer +Dyers +Dyess +Dyett +Dygert +Dykas +Dyke +Dykema +Dykeman +Dykes +Dykhoff +Dykhouse +Dykhuizen +Dykstra +Dyl +Dyle +Dyll +Dylla +Dymek +Dyment +Dymke +Dymond +Dyner +Dynes +Dyreson +Dyron +Dyrstad +Dys +Dysart +Dyser +Dysinger +Dyson +Dzama +Dziadek +Dziak +Dziduch +Dziedzic +Dziegielewski +Dziekan +Dzierzanowski +Dziewanowski +Dzinski +Dziuba +Dziuban +Dziuk +Dziurawiec +Dzledzic +Dzubak +Dzurilla +Dzurnak +Dzuro +Dzwonkowski +Eaby +Eacho +Eachus +Eacret +Eaddy +Eade +Eadens +Eader +Eades +Eadie +Eads +Eady +Eafford +Eagan +Eagar +Eagen +Eager +Eagin +Eagle +Eagleman +Eaglen +Eagles +Eagleson +Eagleston +Eagleton +Eaglin +Eagon +Eagy +Eaker +Eakes +Eakin +Eakins +Eakle +Eakles +Eaks +Ealand +Ealey +Ealick +Ealley +Ealy +Eames +Eanes +Eanni +Eans +Eapen +Ear +Eardley +Earehart +Earenfight +Eargle +Earhart +Earheart +Earing +Earl +Earle +Earles +Earley +Earleywine +Earlgy +Earll +Earls +Early +Earlywine +Earman +Earnest +Earney +Earnhardt +Earnhart +Earnheart +Earnshaw +Earp +Earps +Earthly +Earthman +Earvin +Earwood +Eary +Easdon +Easey +Eash +Easker +Easler +Easley +Easlick +Easly +Easom +Eason +East +Eastburn +Eastep +Easter +Easterbrook +Easterbrooks +Easterday +Easterlin +Easterling +Easterly +Eastern +Easterwood +Eastes +Eastham +Eastin +Eastland +Eastlick +Eastling +Eastlund +Eastman +Eastmond +Easton +Eastridge +Eastwood +Eatherly +Eatman +Eatmon +Eaton +Eatough +Eavenson +Eaves +Eavey +Eayrs +Ebach +Ebadi +Ebanks +Ebarb +Ebaugh +Ebbers +Ebbert +Ebberts +Ebbesen +Ebbett +Ebbighausen +Ebbing +Ebbs +Ebe +Ebeid +Ebel +Ebeling +Eben +Ebener +Ebenstein +Eber +Eberenz +Eberhard +Eberhardt +Eberhart +Eberheart +Eberl +Eberle +Eberlein +Eberley +Eberlin +Eberline +Eberling +Eberly +Ebershoff +Ebersol +Ebersold +Ebersole +Eberspacher +Eberst +Ebert +Eberth +Eberting +Eberts +Eberwein +Ebesu +Ebesugawa +Ebey +Ebia +Ebilane +Ebinger +Eble +Eblen +Eblin +Ebling +Ebner +Ebo +Ebrahim +Ebrahimi +Ebrani +Ebright +Ebron +Ebsen +Eby +Eccles +Eccleston +Echard +Echaure +Echavarria +Echave +Echavez +Echegoyen +Echelberger +Echemendia +Echenique +Echevaria +Echevarria +Echeverri +Echeverria +Echeverry +Echoles +Echols +Echter +Echternach +Eck +Eckard +Eckardt +Eckart +Eckberg +Eckblad +Eckel +Eckelman +Eckels +Eckenrode +Ecker +Eckerle +Eckerman +Eckersley +Eckerson +Eckert +Eckes +Eckford +Eckhard +Eckhardt +Eckhart +Eckhoff +Eckis +Eckl +Eckland +Ecklar +Eckle +Eckler +Eckles +Eckley +Eckloff +Ecklund +Eckman +Eckmann +Eckmeyer +Eckols +Eckrich +Eckroad +Eckrote +Eckstein +Eckstrom +Eclarinal +Ecoffey +Economides +Economos +Economou +Economus +Economy +Ecord +Ecton +Ector +Edberg +Edd +Edde +Eddens +Eddie +Eddinger +Eddings +Eddington +Eddins +Eddleman +Eddlemon +Edds +Eddy +Ede +Edeker +Edel +Edelblute +Edelbrock +Edelen +Edeline +Edell +Edelman +Edelmann +Edelson +Edelstein +Edem +Edemann +Eden +Edenfield +Edenholm +Edens +Eder +Edes +Edey +Edgar +Edgcomb +Edge +Edgecomb +Edgehill +Edgell +Edgeman +Edgemon +Edgerly +Edgerson +Edgerton +Edgeston +Edgett +Edgeworth +Edghill +Edgin +Edgington +Edgley +Edgman +Edgmon +Edholm +Edick +Edie +Ediger +Edin +Edinger +Edington +Edis +Edison +Edith +Edland +Edlao +Edler +Edleston +Edley +Edlin +Edling +Edlow +Edlund +Edman +Edmeier +Edmerson +Edminster +Edmison +Edmisten +Edmister +Edmiston +Edmond +Edmonds +Edmondson +Edmons +Edmonson +Edmonston +Edmund +Edmunds +Edmundson +Edmunson +Edner +Edney +Ednie +Ednilao +Edouard +Edralin +Edridge +Edrington +Edris +Edsall +Edson +Edster +Edstrom +Edu +Eduardo +Edvalson +Edwads +Edward +Edwards +Edwardson +Edwin +Ee +Eeds +Eekhoff +Eelkema +Eells +Eerkes +Efaw +Effinger +Effland +Effler +Effner +Efford +Effron +Efird +Eflin +Efrati +Efron +Eftekhari +Efthimiou +Efurd +Egan +Egans +Egar +Egbe +Egbert +Ege +Egel +Egeland +Egelhoff +Egelston +Eger +Egerer +Egersdorf +Egert +Egerton +Egertson +Eget +Eggart +Egge +Eggebrecht +Eggeman +Eggen +Eggenberg +Eggenberger +Egger +Eggers +Eggert +Eggett +Eggimann +Eggington +Eggink +Eggins +Eggler +Eggleston +Eggleton +Egidio +Egitto +Egizi +Egland +Egle +Egler +Egleston +Egleton +Egley +Egli +Eglin +Eglinton +Egloff +Egner +Egnew +Egnor +Ego +Egolf +Eguchi +Eguia +Eguizabal +Egure +Egvirre +Egwuohua +Eheler +Ehigiator +Ehiginator +Ehinger +Ehl +Ehle +Ehleiter +Ehlen +Ehler +Ehlers +Ehlert +Ehli +Ehlke +Ehlman +Ehly +Ehman +Ehmann +Ehmen +Ehmer +Ehmke +Ehn +Ehnis +Ehorn +Ehr +Ehrenberg +Ehrenfeld +Ehrenzeller +Ehresman +Ehret +Ehrgott +Ehrhard +Ehrhardt +Ehrhart +Ehrich +Ehrisman +Ehrismann +Ehrke +Ehrle +Ehrler +Ehrlich +Ehrman +Ehrmann +Ehsan +Eibel +Eibell +Eiben +Eich +Eichberg +Eichberger +Eiche +Eichel +Eichelberger +Eichele +Eichelmann +Eichenauer +Eichenberg +Eichenberger +Eichenlaub +Eichenmiller +Eicher +Eichert +Eichholz +Eichhorn +Eichhorst +Eichinger +Eichler +Eichman +Eichmann +Eichner +Eichorn +Eichorst +Eichstadt +Eichstedt +Eick +Eicke +Eickhoff +Eickhorst +Eickman +Eickmeyer +Eid +Eide +Eidem +Eidemiller +Eiden +Eidinger +Eidschun +Eidson +Eidt +Eiesland +Eifert +Eifler +Eighmey +Eighmy +Eigner +Eigo +Eike +Eiken +Eikenberry +Eikleberry +Eikmeier +Eikner +Eiland +Eilbeck +Eilbert +Eilders +Eilderts +Eiler +Eilerman +Eilers +Eilert +Eilertson +Eilts +Eimer +Eimers +Einck +Einfeldt +Einhorn +Einspahr +Einstein +Einwalter +Eirich +Eirls +Eis +Eisaman +Eisbach +Eischeid +Eischen +Eischens +Eisel +Eisele +Eiselein +Eiselman +Eiseman +Eisen +Eisenbarth +Eisenbeis +Eisenbeisz +Eisenberg +Eisenberger +Eisenbrandt +Eisenhardt +Eisenhart +Eisenhauer +Eisenhaver +Eisenhower +Eisenman +Eisenmann +Eisenmenger +Eisensmith +Eisenstadt +Eisenstein +Eisentrout +Eisenzimmer +Eiser +Eisermann +Eisert +Eisiminger +Eisinger +Eisler +Eisley +Eisman +Eismann +Eismont +Eisnaugle +Eisner +Eison +Eissinger +Eitel +Eitniear +Eitnier +Eitzen +Ejide +Ek +Ekas +Ekberg +Ekdahl +Eke +Eken +Ekhoff +Ekholm +Ekin +Ekins +Ekis +Ekker +Eklov +Eklund +Ekman +Ekmark +Ekstein +Ekstrand +Ekstrom +Ekstrum +Ekwall +El +Elahi +Elam +Elamin +Eland +Elawar +Elazegui +Elbahtity +Elbaum +Elbaz +Elbe +Elbers +Elberson +Elbert +Elbertson +Elbie +Elbogen +Elchert +Elcock +Eld +Elden +Elder +Elderidge +Elderkin +Elders +Eldert +Eldib +Eldred +Eldredge +Eldreth +Eldridge +Eldrige +Eldringhoff +Eleam +Eleazer +Eleby +Eledge +Elefritz +Elek +Elem +Elena +Elenbaas +Elerick +Elerson +Elery +Eleveld +Elewa +Eley +Elfenbein +Elfering +Elfers +Elfert +Elford +Elfrink +Elfstrom +Elftman +Elg +Elgar +Elgart +Elgas +Elgen +Elger +Elgert +Elgin +Elguezabal +Elhaddad +Elhadi +Elhaj +Elhard +Elhassan +Elhosni +Eli +Elia +Eliades +Elian +Elias +Eliasen +Eliason +Eliassen +Elick +Elicker +Elie +Elieff +Eliezrie +Elifritz +Eligio +Elijah +Elio +Elion +Eliopoulos +Eliot +Eliott +Elis +Eliseo +Elison +Elisondo +Eliszewski +Elizabeth +Elizalde +Elizando +Elizarraras +Elizondo +Elk +Elkan +Elkayam +Elke +Elkin +Elkind +Elkington +Elkins +Elko +Elks +Ell +Ellamar +Elland +Ellanson +Ellard +Ellars +Ellcessor +Elldrege +Ellebracht +Ellebrecht +Elleby +Elledge +Ellefson +Ellegood +Elleman +Ellen +Ellena +Ellenbecker +Ellenbee +Ellenberg +Ellenberger +Ellenbogen +Ellenburg +Ellender +Ellens +Ellenwood +Eller +Ellerbe +Ellerbeck +Ellerbee +Ellerbrock +Ellerbusch +Ellerby +Ellerd +Ellerkamp +Ellerman +Ellermann +Ellers +Ellerson +Ellert +Ellery +Elles +Ellestad +Elletson +Ellett +Elliam +Ellias +Ellicott +Ellie +Elliem +Ellies +Elliff +Ellifritt +Ellifritz +Elling +Ellingboe +Ellingburg +Ellinger +Ellingham +Ellinghuysen +Ellingsen +Ellingson +Ellingsworth +Ellington +Ellingwood +Ellinwood +Elliot +Elliott +Ellis +Ellison +Ellisor +Elliston +Ellithorpe +Ellman +Ellner +Ello +Ellout +Ellrod +Ells +Ellsbury +Ellsmore +Ellson +Ellstrom +Ellsworth +Ellwanger +Ellwein +Ellwood +Ellworths +Ellyson +Ellzey +Elm +Elmaghrabi +Elman +Elmblad +Elmendorf +Elmer +Elmes +Elmo +Elmore +Elmquist +Elms +Elnicki +Elofson +Eloy +Elpert +Elquist +Elreda +Elrick +Elridge +Elrod +Elroy +Elsa +Elsaesser +Elsass +Elsasser +Elsayed +Elsberry +Elsbree +Elsbury +Else +Elsea +Elsen +Elsensohn +Elser +Elsey +Elshair +Elshant +Elsheimer +Elshere +Elsinger +Elskamp +Elsken +Elsmore +Elsner +Elson +Elstad +Elstner +Elston +Elswick +Elsworth +Elter +Elting +Elton +Eltringham +Eltzroth +Elumbaugh +Elvers +Elvert +Elvey +Elvin +Elvington +Elvira +Elvis +Elvsaas +Elward +Elway +Elwell +Elwer +Elwick +Elwonger +Elwood +Elworthy +Ely +Elza +Elzey +Elzie +Elzinga +Elzy +Em +Emal +Emami +Emano +Emanuel +Emanuele +Emanuelson +Emanus +Emard +Emayo +Embelton +Emberger +Emberley +Emberlin +Emberling +Emberson +Emberton +Embertson +Embery +Embler +Embleton +Embly +Embree +Embrey +Embry +Embs +Embt +Embury +Emch +Emde +Emdee +Emeche +Emel +Emenaha +Emerald +Emerich +Emerick +Emerling +Emerson +Emert +Emerton +Emeru +Emery +Emfield +Emfinger +Emge +Emhoff +Emick +Emig +Emigh +Emigholz +Emile +Emiliano +Emilio +Emily +Emison +Emke +Emlay +Emler +Emley +Emlin +Emling +Emma +Emmanuel +Emme +Emmel +Emmer +Emmerich +Emmerling +Emmerson +Emmert +Emmett +Emmette +Emmi +Emmick +Emmitt +Emmond +Emmons +Emmrich +Emms +Emo +Emond +Emons +Emore +Emory +Emoto +Empasis +Emperor +Empey +Empfield +Empie +Empleo +Empson +Emrich +Emrick +Emry +Emshoff +Emshwiller +Emslander +Emslie +Emswiler +Emuka +Emziah +Enama +Enamorado +Enbody +Encalade +Encallado +Encarnacion +Ence +Encinas +Encinias +Encino +Enciso +Enck +End +Ende +Endecott +Ender +Enderby +Enderle +Enderlin +Enders +Endersbe +Enderson +Endicott +Endito +Endler +Endlich +Endo +Endorf +Endow +Endres +Endresen +Endreson +Endries +Endris +Ends +Endsley +Enerson +Enfield +Enfinger +Enfort +Eng +Engard +Engberg +Engberson +Engblom +Engbretson +Engdahl +Enge +Engebretsen +Engebretson +Engel +Engelbach +Engelberg +Engelbert +Engelbrecht +Engelhard +Engelhardt +Engelhart +Engelhaupt +Engelke +Engelkemier +Engelken +Engelkes +Engelking +Engellant +Engelman +Engelmann +Engelmeyer +Engels +Engelsman +Engelson +Engelstad +Engeman +Engemann +Engen +Enger +Engerman +Engert +Engesser +Engessor +Enget +Engfer +Engh +Engholm +Engl +Englade +England +Englander +Englar +Engle +Engleberg +Englebert +Englebrecht +Engleby +Englehardt +Englehart +Engleking +Engleman +Englemann +Engler +Englert +Englerth +Engles +Engleson +Englett +Engley +Englin +English +Englund +Engman +Engnath +Engquist +Engram +Engroff +Engstrom +Engwall +Engwer +Enick +Enis +Enix +Enke +Enkerud +Enloe +Enlow +Enman +Enmon +Ennaco +Ennals +Ennels +Ennen +Ennenga +Ennes +Ennett +Ennis +Ennist +Enno +Enns +Enny +Eno +Enocencio +Enoch +Enochs +Enock +Enockson +Enomoto +Enos +Enote +Enrico +Enright +Enriguez +Enrique +Enriques +Enriquez +Enrriquez +Ensel +Ensell +Ensey +Ensign +Ensing +Enslen +Ensley +Enslinger +Enslow +Ensminger +Ensor +Enstad +Enstrom +Ensworth +Ensz +Entel +Enter +Enterline +Entin +Entinger +Entler +Entrekin +Entress +Entriken +Entrikin +Entrup +Entsminger +Entwisle +Entwistle +Entz +Entzi +Enwall +Enwright +Enyart +Enyeart +Enz +Enzenauer +Enzor +Eoff +Eon +Eovaldi +Epel +Eperson +Ephraim +Ephriam +Epifano +Epler +Epley +Eplin +Epling +Epolito +Epp +Eppard +Eppenger +Epperheimer +Epperley +Epperly +Epperson +Eppert +Eppes +Eppich +Eppihimer +Eppinette +Epping +Eppinger +Epple +Eppler +Eppley +Eppolito +Epps +Epson +Epstein +Epting +Equia +Equihua +Equils +Equiluz +Eracleo +Erard +Eraso +Erath +Erazmus +Erazo +Erb +Erbach +Erbe +Erben +Erbentraut +Erber +Erbes +Erbst +Erbstein +Erby +Ercanbrack +Erceg +Ercek +Erchul +Erck +Ercolani +Ercolano +Ercole +Erdahl +Erdelt +Erding +Erdley +Erdman +Erdmann +Erdmun +Erdner +Erdos +Ereaux +Erebia +Eredia +Erekson +Erenrich +Ereth +Erfert +Erger +Erhard +Erhardt +Erhart +Erholm +Eric +Erice +Erich +Erichsen +Erichson +Erick +Ericks +Ericksen +Erickson +Ericson +Ericsson +Erie +Eriks +Eriksen +Erikson +Eriksson +Erin +Erion +Eriquez +Erisman +Erixon +Erke +Erkela +Erker +Erkkila +Erlandson +Erlanger +Erlanson +Erle +Erlebach +Erlenbusch +Erler +Erlewine +Erlich +Erling +Erlwein +Erm +Ermatinger +Ermert +Ermita +Ermitanio +Ermitano +Ermogemous +Ernandez +Erne +Erner +Ernest +Ernesto +Erno +Ernsberger +Ernspiker +Ernst +Ernster +Ernstes +Ernstrom +Ernzen +Ero +Eroh +Eroman +Eron +Eros +Erp +Erpelding +Erpenbach +Erps +Errera +Errett +Errico +Errington +Erschen +Ersery +Erskin +Erskine +Erspamer +Erstad +Ertel +Ertelt +Ertl +Ertle +Ertley +Ertman +Ertz +Ertzbischoff +Ervay +Erven +Ervin +Ervine +Erving +Erway +Erwin +Erxleben +Erz +Esannason +Esary +Esau +Esaw +Esbensen +Esbenshade +Esbrandt +Escajeda +Escalante +Escalera +Escalero +Escalet +Escalon +Escalona +Escamilla +Escandon +Escanlar +Escarcega +Escareno +Escarrega +Escarsega +Escatel +Esch +Eschbaugh +Eschberger +Eschborn +Esche +Eschen +Eschenbach +Eschenbacher +Eschenbrenner +Eschenburg +Escher +Eschete +Eschette +Eschief +Eschmann +Eschrich +Esco +Escobar +Escobedo +Escobeo +Escober +Escobio +Escoe +Escorcia +Escort +Escorza +Escoto +Escott +Escovar +Escovedo +Escribano +Escudero +Escue +Escuriex +Escutia +Esenwein +Esera +Esfahani +Esguerra +Esh +Eshbaugh +Eshelman +Eshenbrenner +Eshleman +Eshlerman +Eshmon +Eshom +Eska +Eskaf +Eskaran +Eske +Eskeets +Eskelsen +Eskelson +Eskenazi +Esker +Eskew +Eskin +Eskind +Eskins +Eskola +Eskra +Eskridge +Eskuchen +Eslava +Esler +Eslick +Eslinger +Esmaili +Esmay +Esmiol +Esmon +Esmond +Esmont +Esnard +Esoimeme +Espada +Espadas +Espaillat +Espalin +Espana +Espanol +Esparaza +Esparsen +Esparza +Espe +Espejel +Espejo +Espeland +Espelien +Espenlaub +Espenoza +Espenscheid +Espenschied +Espenshade +Esper +Esperanza +Espericueta +Esperon +Espert +Espey +Espina +Espinal +Espindola +Espinel +Espino +Espinol +Espinola +Espinosa +Espinoza +Espiridion +Espiritu +Espitia +Esplain +Esplin +Esponda +Esposita +Esposito +Esposto +Espree +Espy +Esque +Esquea +Esqueda +Esquer +Esquerra +Esquerre +Esquibel +Esquilin +Esquinaldo +Esquirel +Esquiuel +Esquivel +Esquivez +Esquivias +Essa +Essaff +Essaid +Essary +Esselink +Esselman +Essen +Essency +Essepian +Esser +Essery +Esses +Essex +Esshaki +Essick +Essig +Essinger +Essix +Esskew +Essler +Esslinger +Essman +Essner +Esson +Estaban +Estabillo +Estabrook +Estabrooks +Estacion +Estain +Estala +Estanislau +Esteb +Esteban +Esteen +Estel +Estela +Estell +Estella +Estelle +Esten +Estep +Estepp +Ester +Esterbrook +Estergard +Esterline +Esterling +Esterly +Esters +Esterson +Estes +Estess +Estevane +Esteve +Esteves +Estevez +Estey +Esteybar +Esther +Estill +Estimable +Estis +Estle +Estler +Estock +Estok +Estorga +Estrada +Estrade +Estrado +Estrela +Estrella +Estrello +Estrem +Estremera +Estridge +Estrin +Estronza +Estus +Estwick +Esty +Esworthy +Etchells +Etchinson +Etchison +Etcitty +Eth +Ethel +Ethen +Etheredge +Etheridge +Etherington +Etherton +Ethier +Ethington +Ethridge +Etienne +Etier +Etkin +Etling +Etoll +Etringer +Etsitty +Ettel +Etter +Etters +Ettienne +Ettinger +Ettison +Ettl +Ettman +Etulain +Etzel +Etzkorn +Etzler +Eubank +Eubanks +Euber +Eudy +Euell +Euertz +Eugene +Eugenio +Eugley +Euler +Eull +Eun +Eunice +Eurbin +Eure +Euresti +Eurich +Europe +Eurton +Eury +Eusebio +Euser +Eustace +Eustache +Eustice +Eustis +Euton +Eutsey +Eutsler +Euvrard +Eva +Evan +Evanchalk +Evancho +Evanchyk +Evangelist +Evangelista +Evangelo +Evanich +Evanko +Evanoff +Evanoski +Evanosky +Evans +Evanski +Evansky +Evanson +Evaristo +Evarts +Evartt +Evasco +Evatt +Eve +Eveland +Eveleigh +Eveler +Eveleth +Eveline +Evelo +Evelyn +Even +Evener +Evens +Evensen +Evenson +Evenstad +Everage +Everding +Everest +Everet +Everett +Everette +Everetts +Everhardt +Everhart +Everheart +Everidge +Evering +Everitt +Everleth +Everley +Everline +Everly +Everman +Everroad +Evers +Eversley +Eversman +Eversmann +Eversmeyer +Eversole +Eversoll +Everson +Evert +Everton +Everts +Evertsen +Evertt +Evertz +Every +Eves +Evett +Evetts +Evey +Evick +Evilsizer +Evilsizor +Evinger +Evins +Eviston +Evitt +Evitts +Evjen +Evola +Evon +Evora +Evoy +Ewald +Ewalt +Ewan +Ewards +Ewart +Ewbank +Ewelike +Ewell +Ewen +Ewens +Ewer +Ewers +Ewert +Ewig +Ewin +Ewing +Ewings +Ewoldt +Ewton +Ewy +Exantus +Excell +Exe +Exel +Exford +Exilus +Exler +Exley +Exline +Exner +Exon +Expose +Extine +Exton +Exum +Eychaner +Eye +Eyer +Eyerman +Eyermann +Eyestone +Eyler +Eyles +Eylicio +Eyman +Eynon +Eyre +Eyrich +Eyster +Eytcheson +Eytchison +Eyton +Eyubeh +Ezagui +Ezdebski +Ezechu +Ezekiel +Ezell +Ezelle +Ezer +Ezernack +Ezparza +Ezpeleta +Ezzell +Ezzelle +Ezzo +Faaita +Faas +Fabacher +Fabbozzi +Fabbri +Fabeck +Fabel +Fabela +Fabello +Faber +Fabert +Fabian +Fabiani +Fabiano +Fabin +Fabio +Fabionar +Fabiszewski +Fabozzi +Fabre +Fabrizi +Fabrizio +Fabrizius +Fabro +Fabroquez +Fabros +Fabry +Fabula +Fabus +Faby +Facchine +Face +Facello +Facemire +Facenda +Facer +Facey +Facio +Fack +Fackler +Fackrell +Facteau +Factor +Facundo +Fadale +Fadden +Faddis +Fadei +Fadel +Fadeley +Fadely +Faden +Fader +Fadley +Fadness +Fadri +Faehnle +Faerber +Faes +Faessler +Faeth +Fafard +Fafinski +Fagala +Fagan +Fagen +Fager +Fageraes +Fagerlund +Fagerquist +Fagerstrom +Fagg +Faggard +Faggett +Faggins +Faggs +Fagin +Fagle +Fagley +Faglie +Fagnan +Fagnani +Fagnant +Fagnoni +Fago +Fague +Fagundes +Fagundo +Faherty +Fahey +Fahie +Fahl +Fahlsing +Fahlstedt +Fahner +Fahnestock +Fahning +Fahrenbruck +Fahrendorff +Fahrenkrug +Fahrenthold +Fahrenwald +Fahringer +Fahrlander +Fahrner +Fahrney +Fahrni +Fahs +Fahy +Faichtinger +Faidley +Faiella +Faigin +Faigle +Faigley +Fail +Failde +Failey +Failing +Failla +Faille +Failor +Fails +Fain +Faine +Faines +Faiola +Fair +Fairall +Fairbairn +Fairbank +Fairbanks +Fairbrother +Fairburn +Fairchild +Faircloth +Fairclough +Faire +Faires +Fairey +Fairfax +Fairfield +Fairhurst +Fairleigh +Fairless +Fairley +Fairly +Fairman +Fairrow +Fairweather +Fairy +Faisca +Faison +Faist +Fait +Faith +Faivre +Faix +Fajardo +Fajen +Fake +Fakhouri +Fakhoury +Fala +Falacco +Falack +Falah +Falanga +Falardeau +Falasco +Falb +Falbo +Falce +Falchi +Falci +Falcione +Falcioni +Falck +Falco +Falcon +Falcone +Falconer +Falconeri +Falconi +Falconio +Faldyn +Falencki +Faler +Falero +Fales +Faletti +Faley +Falge +Falgoust +Falgout +Falha +Falick +Falin +Falis +Falk +Falke +Falkenberg +Falkenhagen +Falkenstein +Falkenthal +Falker +Falkiewicz +Falkner +Falknor +Falkowski +Falks +Fall +Falla +Fallago +Fallaw +Falldorf +Fallen +Fallenstein +Faller +Fallert +Falley +Fallick +Fallie +Fallin +Falling +Fallis +Fallo +Fallon +Fallone +Fallow +Fallows +Falls +Falor +Falsetta +Falsetti +Falso +Falson +Falt +Falter +Falterman +Faltin +Falto +Faltus +Faltz +Falu +Falvey +Falvo +Falwell +Falzarano +Falzon +Falzone +Fam +Fama +Famageltto +Fambro +Fambrough +Famiano +Famiglietti +Familia +Famulare +Famy +Fan +Fanara +Fanatia +Fancher +Fandel +Fandino +Fandrich +Fane +Fanelle +Fanelli +Fang +Fangman +Fangmann +Fanguy +Faniel +Fanion +Fanizza +Fanizzi +Fanjoy +Fankhauser +Fann +Fannell +Fanner +Fanney +Fannin +Fanning +Fannings +Fanno +Fannon +Fanny +Fanoele +Fansher +Fansler +Fant +Fantasia +Fantauzzi +Fantauzzo +Fantazia +Fanter +Fanti +Fantin +Fantini +Fanton +Fantozzi +Fantroy +Fantz +Fanucchi +Fanzo +Fara +Farabaugh +Farabee +Farace +Faraci +Faraco +Farag +Faragher +Farago +Faragoza +Farah +Farahkhan +Faraimo +Faraj +Faraldo +Faraone +Farb +Farber +Farbman +Fardo +Fare +Farell +Farella +Faren +Farenbaugh +Farer +Farese +Faretra +Farfaglia +Farfalla +Farfan +Fargnoli +Fargo +Farguharson +Farha +Farhart +Farhat +Faria +Farias +Farid +Fariello +Faries +Farin +Farina +Farinacci +Farinas +Farinella +Farinha +Farino +Faris +Farish +Fariss +Farkas +Farkus +Farland +Farlee +Farler +Farless +Farley +Farlin +Farlow +Farm +Farman +Farmar +Farmer +Farmsworth +Farmwald +Farnam +Farnan +Farnell +Farner +Farnes +Farnese +Farness +Farney +Farnham +Farnsworth +Farnum +Farnworth +Faro +Faron +Farone +Farquer +Farquhar +Farquharson +Farr +Farra +Farrah +Farraj +Farrall +Farran +Farrand +Farrant +Farrar +Farrare +Farrauto +Farrel +Farrell +Farrelly +Farren +Farrens +Farrer +Farrey +Farria +Farrier +Farrill +Farrin +Farrington +Farrior +Farris +Farrish +Farro +Farron +Farrow +Farruggio +Farrugia +Farry +Fars +Farson +Farstvedt +Farthing +Farug +Faruolo +Farve +Farver +Farwell +Farwick +Farzan +Fasano +Fasbender +Fasching +Fasci +Fasciano +Fasel +Fasenmyer +Fash +Fashaw +Fasheh +Fasick +Faske +Faso +Fason +Fasone +Fass +Fassett +Fassinger +Fassino +Fassio +Fassler +Fassnacht +Fast +Faster +Fastic +Fastlaben +Fasula +Fasulo +Fasy +Fat +Fata +Fatchett +Fate +Fath +Fatheree +Fathree +Fathy +Fatica +Fatigate +Fatone +Fatora +Fattig +Fattore +Fatula +Fatzinger +Faubel +Fauber +Faubert +Faubion +Fauble +Faubus +Faucett +Faucette +Faucher +Fauci +Faudree +Fauerbach +Faughn +Faughnan +Faught +Faul +Faulcon +Faulconer +Faulds +Faulhaber +Faulisi +Faulk +Faulkenberry +Faulkenburg +Faulkenbury +Faulker +Faulkes +Faulkingham +Faulknen +Faulkner +Faulks +Faull +Fauls +Faulstich +Faulstick +Faunce +Fauntleroy +Faupel +Faur +Faure +Faurot +Faurote +Faurrieta +Faus +Fauscett +Fausel +Fauset +Fausett +Fausey +Fauske +Fausnaugh +Fausnaught +Fausset +Faust +Faustini +Faustino +Faustman +Fausto +Fauteux +Fauth +Fauver +Faux +Fava +Favalora +Favaloro +Favaro +Favaron +Favazza +Favela +Faver +Favero +Favia +Favian +Favieri +Favila +Favilla +Faville +Favolise +Favor +Favorite +Favorito +Favors +Favre +Favreau +Favro +Favuzza +Favuzzi +Faw +Fawbush +Fawcett +Fawell +Fawler +Fawley +Fawson +Fawver +Faxon +Fay +Fayad +Fayard +Faycurry +Faye +Fayer +Faykosh +Faylor +Fayne +Fayson +Faz +Fazekas +Fazenbaker +Fazio +Fazzari +Fazzi +Fazzina +Fazzinga +Fazzino +Fazzio +Fazzone +Feagan +Feaganes +Feagans +Feagen +Feagin +Feagins +Feagler +Feagley +Fealy +Feamster +Fear +Fearen +Fearheller +Fearing +Fearn +Fearnow +Fearon +Fears +Feary +Feasel +Feast +Feaster +Feather +Featheringham +Featheroff +Feathers +Featherston +Featherstone +Feauto +Feavel +Feazel +Feazell +Feazelle +Febbo +Febbraio +Febles +Febo +Febre +Febres +Febus +Fecat +Fecher +Fechner +Fechtel +Fechter +Fechtig +Fechtner +Feck +Fecko +Fecteau +Fecto +Fedak +Fedalen +Fedd +Fedde +Fedder +Fedderly +Feddersen +Feddes +Fede +Fedel +Fedele +Feder +Federer +Federgreen +Federici +Federick +Federico +Federkeil +Federle +Federowicz +Fedewa +Fedezko +Fedie +Fedigan +Fedler +Fedor +Fedora +Fedorchak +Fedorczyk +Fedorek +Fedoriw +Fedorka +Fedorko +Fedrick +Feduccia +Feduniewicz +Fee +Feeback +Feehan +Feehery +Feehly +Feekes +Feela +Feeler +Feeley +Feeling +Feely +Feemster +Feenan +Feener +Feeney +Feenstra +Feeny +Feerick +Feerst +Feery +Fees +Feeser +Feezell +Feezor +Fefer +Fegan +Fegaro +Feger +Fegett +Fegette +Feggins +Fegles +Fegley +Fego +Fegueroa +Fegurgur +Feher +Fehl +Fehling +Fehlinger +Fehlman +Fehn +Fehnel +Fehr +Fehrenbach +Fehribach +Fehringer +Fehrle +Fehrman +Fehrs +Feibusch +Feichter +Feichtner +Feick +Feickert +Feierman +Feiertag +Feig +Feigel +Feigenbaum +Feigh +Feighan +Feighner +Feight +Feijoo +Feikles +Feil +Feilbach +Feild +Feilds +Feiler +Feimster +Fein +Feinberg +Feinblatt +Feindt +Feinen +Feiner +Feingold +Feinman +Feinstein +Feintuch +Feirer +Feist +Feister +Feisthamel +Feistner +Feit +Feiteira +Feith +Fejes +Fekete +Fekety +Felan +Felarca +Felber +Felberbaum +Felch +Felcher +Felciano +Feld +Felde +Felder +Felderman +Feldhake +Feldhaus +Feldkamp +Feldker +Feldman +Feldmann +Feldmeier +Feldner +Feldpausch +Feldstein +Feldt +Feldtman +Feleppa +Felgenhauer +Felger +Feliberty +Felicano +Felice +Felicetti +Felicia +Feliciano +Felicien +Felicione +Felico +Felila +Felio +Felipa +Felipe +Feliu +Felix +Feliz +Felizardo +Felkel +Felker +Felkins +Felkner +Felks +Fell +Fellars +Felleman +Fellenbaum +Fellenz +Feller +Fellers +Fellezs +Fellhauer +Felli +Fellin +Felling +Fellinger +Fellman +Fellner +Fellon +Fellows +Fells +Felman +Felmet +Felmlee +Felonia +Felps +Fels +Felsenthal +Felsher +Felske +Felson +Felsted +Felt +Felten +Feltenberger +Felter +Feltes +Feltham +Feltman +Feltmann +Feltner +Felton +Felts +Feltus +Felty +Feltz +Felux +Felver +Felzien +Femat +Femi +Femia +Femmer +Femrite +Fenbert +Fenceroy +Fenchel +Fencil +Fencl +Fend +Fender +Fenderson +Fendlason +Fendler +Fendley +Fendrick +Fendt +Fenech +Feneis +Fenelon +Fenelus +Feng +Fenger +Fengler +Fenimore +Fenison +Fenix +Fenk +Fenley +Fenlon +Fenn +Fennel +Fennell +Fennelly +Fennema +Fenner +Fennern +Fennessey +Fennessy +Fennewald +Fenney +Fennig +Fenniman +Fennimore +Fenninger +Fenniwald +Fenny +Feno +Fenoff +Fenoglio +Fenrich +Fensel +Fenske +Fenster +Fenstermacher +Fenstermaker +Fent +Fenti +Fenton +Fentress +Fenty +Fenwick +Feola +Feoli +Fequiere +Fera +Feraco +Feramisco +Ferandez +Ferard +Ferber +Ferbrache +Ferch +Ferderer +Ferdico +Ferdig +Ferdin +Ferdinand +Ferdinandsen +Ferdolage +Ferdon +Ferebee +Fereday +Fereira +Ferell +Ferenc +Ference +Ferencz +Ferentz +Ferenz +Ferer +Feret +Ferg +Fergason +Ferge +Fergen +Fergerson +Fergerstrom +Fergeson +Fergoson +Fergurson +Fergus +Fergusen +Ferguson +Fergusson +Feria +Ferioli +Feris +Ferjerang +Ferkel +Ferko +Ferkovich +Ferland +Ferlenda +Ferlic +Ferm +Ferman +Fermin +Fermo +Fern +Fernades +Fernadez +Fernald +Fernanders +Fernandes +Fernandez +Fernando +Fernandz +Fernatt +Fernberg +Ferndez +Fernelius +Fernendez +Ferner +Fernet +Fernette +Fernholz +Ferniza +Fernow +Ferns +Fernsler +Fernstaedt +Fernstrom +Fero +Feron +Ferone +Ferouz +Feroz +Ferr +Ferra +Ferracioli +Ferraiolo +Ferraiz +Ferrales +Ferrall +Ferran +Ferrand +Ferrandino +Ferrando +Ferrante +Ferranti +Ferranto +Ferrao +Ferrar +Ferrara +Ferraraccio +Ferrari +Ferrarini +Ferrario +Ferraris +Ferraro +Ferrarotti +Ferratella +Ferrato +Ferratt +Ferre +Ferrebee +Ferree +Ferreira +Ferrel +Ferrell +Ferren +Ferrence +Ferrer +Ferrera +Ferreri +Ferrero +Ferrett +Ferretti +Ferreyra +Ferri +Ferrick +Ferrie +Ferrier +Ferriera +Ferries +Ferrigno +Ferrill +Ferriman +Ferrin +Ferringer +Ferringo +Ferrington +Ferrini +Ferrio +Ferriola +Ferriolo +Ferris +Ferrise +Ferriss +Ferriter +Ferro +Ferron +Ferrone +Ferroni +Ferrucci +Ferrufino +Ferrusi +Ferruso +Ferry +Ferryman +Fersner +Ferster +Fertal +Fertig +Fertik +Fertitta +Ferugson +Ferullo +Fesenbek +Fesenmyer +Feser +Fesh +Fesko +Fesler +Fesmire +Fesperman +Fess +Fessel +Fessenden +Fessler +Fest +Festa +Fester +Festerman +Festini +Fesus +Fetch +Fetchko +Feth +Fetherolf +Fetherston +Fetner +Fetrow +Fetsko +Fett +Fette +Fetter +Fetterhoff +Fetterly +Fetterman +Fetterolf +Fetters +Fettes +Fettig +Fetty +Fetui +Fetz +Fetzer +Feucht +Feuer +Feuerberg +Feuerborn +Feuerstein +Feulner +Feurtado +Feusier +Feuss +Feutz +Fevig +Fevold +Few +Fewell +Fewless +Fey +Feyen +Feyereisen +Feyh +Feyler +Fiacco +Fial +Fiala +Fialho +Fialkowski +Fiallo +Fiallos +Fiaschetti +Fiato +Ficarra +Ficchi +Ficek +Ficenec +Ficher +Fichera +Ficht +Fichter +Fichtner +Fick +Fickas +Fickbohm +Ficke +Fickel +Ficken +Ficker +Fickert +Fickes +Fickett +Fickle +Ficklen +Ficklin +Fickling +Ficks +Fico +Ficorilli +Fida +Fiddelke +Fiddler +Fidel +Fidell +Fidler +Fido +Fidsky +Fiducia +Fie +Fiebelkorn +Fiebich +Fiebig +Fiechter +Fieck +Fiecke +Fiedler +Fiedor +Fiedorowicz +Fiedtkou +Fiegel +Field +Fielden +Fielder +Fieldhouse +Fielding +Fieldman +Fields +Fieldson +Fieldstadt +Fiely +Fiene +Fiereck +Fierge +Fierman +Fiermonte +Fiero +Fierra +Fierro +Fierros +Fiers +Fierst +Fies +Fiesel +Fieselman +Fieser +Fiest +Fietek +Fietsam +Fife +Fifer +Fifield +Figaro +Figarsky +Figart +Figary +Figeroa +Figert +Figg +Figge +Figgeurs +Figgins +Figgs +Figiel +Figlar +Figler +Figley +Figliola +Figlioli +Figone +Figueira +Figueiras +Figueiredo +Figuera +Figueras +Figuerda +Figueredo +Figueroa +Figueron +Figura +Figurelli +Figures +Figuroa +Figurski +Fijal +Fijalkowski +Fike +Fikes +Fil +Fila +Filak +Filan +Filarecki +Filary +Filas +Filbert +Filbey +Filbrardt +Filburn +Filby +File +Fileds +Filer +Files +Filgo +Filhiol +Fili +Filiault +Filice +Filicetti +Filimaua +Filion +Filip +Filipek +Filipelli +Filipi +Filipiak +Filipovic +Filipovich +Filippelli +Filippello +Filippi +Filippides +Filippini +Filippo +Filippone +Filipponi +Filipski +Filkey +Filkins +Fill +Filla +Fillare +Filler +Fillers +Fillerup +Filley +Fillhart +Fillinger +Fillingham +Fillingim +Fillion +Fillip +Fillman +Fillmore +Fillo +Fillpot +Fillyaw +Filmer +Filmore +Filo +Filonuk +Filosa +Filoteo +Filpo +Filpus +Fils +Filsaime +Filsinger +Filson +Filteau +Filter +Filthaut +Filyan +Filyaw +Filzen +Fimbres +Fimbrez +Fina +Finamore +Finan +Finau +Finazzo +Fincel +Finch +Fincham +Fincher +Finchman +Finchum +Finck +Finco +Finder +Finders +Findlay +Findlen +Findley +Findling +Fine +Fineberg +Finefrock +Finegan +Finell +Finello +Finely +Fineman +Fineout +Finer +Fineran +Finerty +Fines +Finey +Finfrock +Fingado +Fingal +Fingar +Finger +Fingerhut +Fingerman +Fingerson +Fingleton +Fini +Finical +Finigan +Finister +Finizio +Fink +Finkbeiner +Finke +Finkel +Finkelman +Finkelson +Finkelstein +Finken +Finkenbinder +Finkenbiner +Finkle +Finklea +Finkler +Finklestein +Finkley +Finks +Finland +Finlay +Finlayson +Finley +Finn +Finne +Finnefrock +Finnegan +Finnel +Finnell +Finnemore +Finnen +Finner +Finneran +Finnerty +Finney +Finni +Finnicum +Finnie +Finnigan +Finnila +Finnin +Finnley +Fino +Finocan +Finocchiaro +Finona +Finseth +Finstad +Finster +Finto +Finton +Finucan +Finucane +Finwall +Finzel +Fiora +Fioranelli +Fioravanti +Fiore +Fiorella +Fiorelli +Fiorello +Fiorentini +Fiorentino +Fiorenza +Fiorenzi +Fioretti +Fiori +Fiorica +Fiorilli +Fiorillo +Fiorini +Fiorino +Fiorita +Fiorito +Fioritto +Fioto +Fiotodimitrak +Fipps +Fiqueroa +Fire +Firebaugh +Fireman +Firenze +Firestein +Firestine +Firestone +Firkey +Firkins +Firlik +Firlit +Firman +Firmin +Firoozbakht +Firpi +Firpo +Firsching +First +Firth +Fisanick +Fiscal +Fiscalini +Fiscel +Fiscella +Fisch +Fischang +Fischbach +Fischbein +Fischel +Fischels +Fischer +Fischetti +Fischhaber +Fischl +Fischler +Fischman +Fiscus +Fiser +Fisette +Fisger +Fish +Fishback +Fishbaugh +Fishbeck +Fishbein +Fishburn +Fishburne +Fishel +Fishell +Fisher +Fisherman +Fishman +Fisichella +Fisk +Fiske +Fisler +Fissel +Fissell +Fisser +Fissori +Fister +Fistler +Fitanides +Fitch +Fitcheard +Fitchett +Fitchette +Fitchpatrick +Fite +Fitgerald +Fithen +Fithian +Fitser +Fitsgerald +Fitten +Fitterer +Fitting +Fittje +Fitton +Fitts +Fitz +Fitzen +Fitzer +Fitzerald +Fitzgerald +Fitzgerlad +Fitzgerrel +Fitzgibbon +Fitzgibbons +Fitzhenry +Fitzherbert +Fitzhugh +Fitzke +Fitzloff +Fitzmaurice +Fitzmier +Fitzmorris +Fitzner +Fitzpatrick +Fitzrandolph +Fitzsimmons +Fitzsimons +Fitzwater +Fiumara +Fiume +Fiumefreddo +Fiveash +Fivecoat +Fiwck +Fix +Fixari +Fixico +Fizer +Fjeld +Fjeseth +Fjetland +Flaa +Flach +Flachs +Flack +Flad +Fladger +Fladung +Flagel +Flager +Flagg +Flagge +Flaggs +Flagiello +Flagler +Flagstad +Flaharty +Flahaven +Flaherty +Flahive +Flaig +Flaim +Flair +Flake +Flaker +Flakes +Flakne +Flaks +Flam +Flamand +Flamenco +Flament +Flamer +Flaming +Flaminio +Flamino +Flamio +Flamm +Flammang +Flanagan +Flanagin +Flanary +Fland +Flander +Flanders +Flanegan +Flanery +Flanigan +Flank +Flannagan +Flanner +Flannery +Flannigan +Flansburg +Flash +Flasher +Flatau +Flaten +Flater +Flath +Flathers +Flatley +Flatness +Flato +Flatt +Flatten +Flatter +Flattery +Flauding +Flaugher +Flaum +Flautt +Flavell +Flavin +Flavors +Flax +Flaxman +Fleagle +Fleak +Flebbe +Flecha +Flechas +Flecher +Flechsig +Fleck +Fleckenstein +Fleckles +Flecther +Fleeger +Fleegle +Fleek +Fleeks +Fleeman +Fleener +Fleenor +Fleer +Fleet +Fleeting +Fleetwood +Flegal +Flegel +Flegle +Flegler +Fleharty +Fleig +Fleischacker +Fleischer +Fleischhacker +Fleischman +Fleischmann +Fleischner +Fleisher +Fleishman +Fleisner +Fleitas +Fleites +Fleitman +Flem +Fleming +Flemings +Flemister +Flemm +Flemming +Flemmings +Flemmon +Flemmons +Flemons +Flenard +Flenaugh +Flener +Fleniken +Flenner +Flenniken +Flennoy +Flenord +Flenory +Flens +Flentge +Flentroy +Flesch +Fleschner +Flesher +Fleshman +Fleshner +Flesner +Flessner +Fletchen +Fletcher +Fletes +Flether +Flett +Fleurant +Fleurantin +Fleurent +Fleurilus +Fleurissaint +Fleury +Flever +Flewellen +Flewelling +Flexer +Flicek +Flick +Flicker +Flickinger +Flickner +Flieller +Flierl +Flies +Fliger +Flight +Flin +Flinchbaugh +Flinchum +Flinck +Flinders +Fling +Flink +Flinn +Flinner +Flinspach +Flint +Flinton +Flintroy +Flipp +Flippen +Flippin +Flippo +Flirt +Flis +Fliss +Flister +Flitcroft +Flitsch +Flitt +Flitter +Flitton +Flo +Floan +Flocco +Floch +Flock +Flocke +Flockerzi +Flockhart +Flodin +Flodman +Floe +Floer +Floerchinger +Floerke +Flohr +Flom +Flood +Flook +Floor +Floore +Flor +Flora +Floran +Florance +Floras +Florczak +Flore +Florea +Florek +Floren +Florence +Florencio +Florendo +Florens +Florentine +Florentino +Florenz +Flores +Floresca +Florestal +Florey +Florez +Flori +Floria +Florian +Floriano +Florida +Florido +Florin +Florine +Florio +Floris +Florkowski +Floro +Floros +Flory +Flosi +Floss +Flot +Flota +Floth +Floto +Flotow +Flott +Flournay +Flourney +Flournoy +Flow +Flowe +Flower +Flowers +Floyd +Fluaitt +Flucas +Fluck +Flud +Fludd +Flueck +Fluegel +Fluegge +Fluellen +Fluet +Fluetsch +Fluette +Flug +Flugence +Flugum +Fluharty +Fluhman +Fluitt +Fluke +Fluker +Flum +Flumerfelt +Flummer +Flurry +Flury +Flusche +Fluty +Fly +Flye +Flygare +Flynn +Flynt +Flythe +Flyzik +Foard +Foat +Fobbs +Fobes +Focht +Focke +Fockler +Focks +Foddrell +Foddrill +Fode +Foder +Fodera +Foderaro +Fodge +Fodness +Fodor +Foecke +Foecking +Foell +Foeller +Foerschler +Foerster +Foersterling +Foertsch +Foesch +Fogal +Fogarty +Fogel +Fogelman +Fogelquist +Fogelson +Fogerson +Fogerty +Fogg +Foggie +Foggs +Fogle +Fogleman +Fogler +Foglesong +Foglia +Foglio +Fogo +Fogt +Fogus +Fohl +Fohn +Foil +Foiles +Foister +Foisy +Fok +Foks +Folan +Foland +Folden +Folds +Foley +Folgar +Folger +Folino +Folio +Folk +Folken +Folkens +Folker +Folkers +Folkerts +Folkes +Folkins +Folkman +Folkner +Folks +Folland +Follansbee +Foller +Follett +Follette +Folley +Folliard +Follick +Follie +Follin +Follis +Follman +Follmer +Followell +Folmar +Folmer +Folse +Folsom +Folson +Folta +Folts +Foltz +Folwell +Folz +Fomby +Fon +Fonceca +Fonck +Fonda +Fondaw +Fondell +Fonder +Fondow +Fondren +Fondriest +Fondy +Fones +Fonesca +Foney +Fong +Fongeallaz +Fonger +Fongvongsa +Fonner +Fonnesbeck +Fonohema +Fons +Fonseca +Fonsecn +Font +Fontaine +Fontan +Fontana +Fontane +Fontanella +Fontanetta +Fontanez +Fontanilla +Fontanini +Fonte +Fonteboa +Fontecchio +Fontelroy +Fonteneau +Fontenelle +Fontenette +Fonteno +Fontenot +Fontes +Fontillas +Fontneau +Fontus +Fonua +Fonville +Foo +Foody +Fooks +Foor +Foore +Foos +Foose +Foot +Foote +Footer +Footman +Foots +Foppe +Foppiano +Foradori +Foraker +Foran +Forand +Forbach +Forber +Forberg +Forbes +Forbess +Forbis +Forbish +Forbs +Forbus +Forbush +Forcade +Force +Forcell +Forcello +Forch +Forchione +Forcht +Forcier +Forcino +Forck +Forcum +Ford +Forde +Forden +Fordham +Fordon +Fordyce +Fore +Foreback +Foree +Forehand +Forejt +Foreman +Forero +Foresman +Forest +Foresta +Forester +Foret +Forgach +Forge +Forget +Forgette +Forgey +Forgie +Forgione +Forgrave +Forgue +Forguson +Forgy +Foriest +Forinash +Foringer +Forister +Forkan +Forkell +Forker +Forkey +Forkin +Forkner +Forkosh +Forkum +Forlani +Forline +Forlivio +Form +Formaggioni +Forman +Formanek +Formato +Formby +Formella +Formento +Formey +Formhals +Formica +Formichelli +Formisano +Formosa +Fornaro +Fornataro +Fornea +Fornell +Forner +Fornerod +Fornes +Forness +Forney +Forni +Fornicola +Fornier +Fornili +Fornkohl +Forno +Foronda +Forpahl +Forquer +Forren +Forrer +Forres +Forrest +Forrester +Forrister +Forro +Forry +Fors +Forsberg +Forsch +Forschner +Forsee +Forsell +Forseth +Forsey +Forsgren +Forsha +Forshaw +Forshay +Forshee +Forshey +Forslin +Forslund +Forsman +Forsmann +Forsmark +Forson +Forss +Forst +Forstedt +Forster +Forsthoffer +Forsting +Forstner +Forston +Forsyth +Forsythe +Fort +Fortado +Forte +Fortenberry +Fortes +Fortgang +Forth +Forthman +Forti +Fortier +Fortin +Fortini +Fortino +Fortis +Fortman +Fortmann +Fortna +Fortner +Fortney +Forts +Fortson +Fortun +Fortuna +Fortunato +Fortune +Forward +Forwood +Forys +Fosberg +Fosbrook +Fosburg +Fosburgh +Foscue +Fosdick +Foshay +Foshee +Fosher +Foshie +Foskett +Foskey +Fosler +Foslien +Fosmire +Fosnaugh +Fosnough +Foss +Fossa +Fossati +Fosse +Fosselman +Fossen +Fosser +Fossett +Fossey +Fosso +Fosson +Fossum +Foste +Foster +Fostervold +Foston +Fote +Foth +Fothergill +Fotheringham +Foti +Fotopoulos +Foucault +Fouch +Foucha +Fouche +Foucher +Fougere +Fought +Fougner +Fouhy +Foulcard +Foulds +Foules +Foulger +Foulk +Foulke +Foulkes +Foulks +Found +Founds +Fountain +Fountaine +Fouquet +Fouquette +Fouracre +Fouraker +Fournet +Fournier +Fourre +Fouse +Fousek +Foushee +Foussell +Foust +Fout +Foutain +Foutch +Foute +Fouts +Fouty +Foutz +Foux +Fouyer +Fowble +Fower +Fowkes +Fowlar +Fowle +Fowler +Fowles +Fowley +Fowlie +Fowlkes +Fowlston +Fox +Foxe +Foxhoven +Foxman +Foxwell +Foxworth +Foxworthy +Foxx +Foy +Foye +Foyer +Frabizio +Frabizzio +Frabott +Frabotta +Fracassa +Fracasso +Fracchia +Fraccola +Fracier +Frack +Fraction +Fradette +Fradkin +Frady +Fraga +Fragale +Fragassi +Fragman +Fragmin +Fragnoli +Frago +Fragosa +Fragoso +Fragozo +Fraher +Frahm +Fraile +Frailey +Frain +Fraine +Fraint +Fraioli +Frair +Fraire +Fraise +Fraiser +Fraize +Fraizer +Fraker +Frakes +Fraklin +Fraleigh +Fraley +Fralic +Fralick +Fralin +Fralix +Fram +Frame +Framer +Frames +Frampton +Franc +Franca +France +Frances +Franceschi +Franceschina +Franceschini +Francesco +Francescon +Francescone +Francesconi +Francese +Franceski +Francey +Franch +Francher +Franchette +Franchi +Franchini +Francia +Francies +Francillon +Francione +Francios +Franciosa +Francis +Francisco +Franciscus +Francisque +Franck +Francke +Franckowiak +Franco +Francoeur +Francois +Francoise +Francolino +Francom +Francour +Franculli +Francy +Frandeen +Frandsen +Franeo +Franey +Frangione +Franich +Frank +Frankart +Franke +Frankel +Franken +Frankenberg +Frankenberry +Frankenfeld +Frankenfield +Frankenreiter +Frankenstein +Frankford +Frankforter +Frankhouser +Frankie +Frankiewicz +Frankin +Frankina +Frankl +Frankland +Franklin +Franklyn +Franko +Frankovich +Frankowski +Franks +Frankson +Frankum +Franpton +Franqui +Frans +Fransen +Fransisco +Franson +Franssen +Franta +Frantum +Franty +Frantz +Frantzich +Franz +Franza +Franze +Franzel +Franzen +Franzeo +Franzese +Franzetti +Franzi +Franzini +Franzman +Franzmann +Franzone +Franzoni +Frappier +Frary +Frasca +Frascella +Frasch +Fraschilla +Frasco +Frascone +Frase +Fraser +Frasher +Frashure +Frasier +Frasso +Frasure +Frater +Fratercangelo +Frates +Frati +Fratrick +Fratta +Frattali +Frattini +Fratto +Fratus +Fratzke +Frauenfelder +Frauenkron +Fraughton +Fraunfelter +Frausto +Frautschi +Fravel +Frawkin +Frawley +Fray +Frayer +Frayne +Frayre +Frayser +Fraze +Frazee +Frazell +Frazer +Frazey +Frazier +Frazzano +Frear +Freas +Frease +Freber +Freberg +Frech +Frechette +Frecker +Freckleton +Fred +Freda +Freddrick +Frede +Fredeen +Fredell +Fredenberg +Fredenburg +Frederic +Frederick +Fredericks +Fredericksen +Frederickson +Frederico +Frederiksen +Frederique +Fredette +Frediani +Fredicks +Fredieu +Fredin +Fredley +Fredline +Fredlund +Fredo +Fredregill +Fredric +Fredrick +Fredricks +Fredricksen +Fredrickson +Fredrikson +Free +Freeberg +Freeborn +Freeburg +Freeburger +Freeburn +Freeby +Freed +Freeders +Freedland +Freedlander +Freedle +Freedman +Freeh +Freehan +Freehling +Freehoffer +Freel +Freeland +Freeley +Freelon +Freelove +Freels +Freeman +Freemantle +Freemon +Freemyer +Freeney +Freer +Freerksen +Frees +Freese +Freestone +Freet +Freetage +Freeze +Fregeau +Freggiaro +Fregia +Fregoe +Fregoso +Fregozo +Freguson +Frehse +Frei +Freiberg +Freiberger +Freibert +Freid +Freidel +Freidet +Freidhof +Freidin +Freidkin +Freidman +Freie +Freier +Freiermuth +Freifeld +Freiheit +Freije +Freil +Freiler +Freilich +Freiling +Freilino +Freiman +Freimark +Freimuth +Frein +Freire +Freise +Freiseis +Freiser +Freisner +Freistuhler +Freitag +Freitas +Freker +Freligh +Frelow +Freman +Freme +Fremin +Fremming +Fremon +Fremont +French +Frend +Frenette +Frenger +Freniere +Frenkel +Frenner +Freno +Frens +Frentzel +Frenz +Frenzel +Frere +Frerich +Frerichs +Frericks +Frerking +Frescas +Fresch +Frese +Fresh +Freshley +Freshour +Freshwater +Fresquez +Fresta +Fret +Frett +Fretwell +Fretz +Freud +Freuden +Freudenberg +Freudenberger +Freudenburg +Freudenstein +Freudenthal +Freudiger +Freund +Freundlich +Frever +Frevert +Frew +Frewing +Frey +Freydel +Freyer +Freyermuth +Freyman +Freymuth +Freyre +Freytag +Freytas +Frezza +Frezzo +Friar +Frias +Friberg +Fribley +Fricano +Frichette +Frick +Fricke +Frickel +Fricker +Fricks +Frickson +Frid +Fridal +Friday +Friddell +Friddle +Fridell +Fridge +Fridley +Fridlington +Fridman +Frie +Friebel +Fried +Friedberg +Friede +Friedeck +Friedel +Frieden +Friedenberg +Friedenthal +Friederich +Friedhaber +Friedl +Friedland +Friedlander +Friedle +Friedler +Friedli +Friedline +Friedly +Friedman +Friedmann +Friedrich +Friedrichs +Friedrichsen +Friedrick +Friedstrom +Friedt +Friehauf +Friehe +Friel +Frieler +Frieling +Friels +Frieman +Friemering +Friend +Friendly +Friends +Frier +Frierdich +Frierson +Fries +Friese +Friesen +Friesenhahn +Friesner +Frieson +Friess +Friest +Friesz +Frietas +Frietsch +Frieze +Frigge +Frigo +Frigon +Frihart +Friis +Frija +Frikken +Friley +Friling +Frilling +Frilot +Fringer +Frings +Fringuello +Frink +Frint +Friot +Friou +Fripp +Frisbee +Frisbey +Frisbie +Frisby +Frisch +Frische +Frischkorn +Frischman +Friscia +Frisco +Frisell +Frisella +Frishkorn +Frishman +Frisina +Frisinger +Frisino +Frisk +Friske +Friskney +Frison +Frist +Fristoe +Fritch +Fritcher +Fritchey +Fritchley +Fritchman +Frith +Fritsch +Fritsche +Fritter +Fritts +Frittz +Fritz +Fritze +Fritzgerald +Fritzinger +Fritzler +Fritzman +Fritzpatrick +Frix +Frizell +Frizzell +Frizzle +Froats +Froberg +Frobish +Frock +Frodge +Frodsham +Froebe +Froedge +Froehle +Froehlich +Froehner +Froelich +Froeliger +Froemming +Froeschle +Froese +Frogge +Frohberg +Frohlich +Frohling +Frohman +Frohock +Frohwein +Froid +Froiland +Froio +Frolich +From +Froman +Fromberg +Fromdahl +Frometa +Fromm +Fromme +Frommer +Fromong +Fron +Fronce +Froncek +Froncillo +Fronczak +Frondorf +Fronduti +Froneberger +Fronek +Fronick +Froning +Fronk +Frontera +Frontiero +Frontis +Frontz +Froozy +Frosch +Froschheiser +Fross +Frossard +Frost +Frosto +Frothingham +Froyd +Fruchey +Fruchter +Frueh +Fruehauf +Fruehling +Fruge +Frugoli +Fruhling +Fruin +Fruit +Fruits +Frullate +Frum +Fruman +Frumkin +Frump +Frusci +Frusciante +Frush +Frushour +Frutchey +Fruth +Frutiger +Frutos +Frutoz +Fruusto +Fry +Fryar +Fryberger +Fryday +Frydman +Frye +Fryer +Fryling +Fryman +Frymark +Frymier +Frymire +Frymoyer +Frymyer +Fryou +Fryrear +Fryson +Fu +Fuapau +Fucci +Fuchs +Fuchser +Fucile +Fucillo +Fuda +Fudacz +Fudala +Fude +Fudge +Fuehrer +Fuel +Fuell +Fuelling +Fuemmeler +Fuentas +Fuente +Fuentes +Fuentez +Fuents +Fuerbringer +Fuerman +Fuerst +Fuerstenau +Fuerstenberg +Fuerstenberge +Fuerte +Fuertes +Fuery +Fuess +Fuest +Fuesting +Fugah +Fugate +Fugatt +Fuger +Fugere +Fugett +Fugh +Fugit +Fugitt +Fugle +Fugler +Fuglsang +Fugo +Fugua +Fugueroa +Fuhr +Fuhrer +Fuhri +Fuhriman +Fuhrman +Fuhrmann +Fuhrmeister +Fuhs +Fujihara +Fujii +Fujikake +Fujikawa +Fujimoto +Fujimura +Fujino +Fujioka +Fujisawa +Fujita +Fujiwara +Fukada +Fukano +Fukuda +Fukui +Fukumoto +Fukunaga +Fukuroku +Fukushima +Fulbright +Fulcher +Fulco +Fulda +Fuleki +Fulena +Fulenwider +Fulfer +Fulford +Fulgham +Fulghum +Fulginiti +Fulham +Fulk +Fulker +Fulkerson +Fulks +Fullagar +Fullam +Fullard +Fullbright +Fullem +Fullen +Fullenkamp +Fullenwider +Fuller +Fullerton +Fullford +Fullilove +Fulling +Fullington +Fulliton +Fullman +Fullmer +Fullmore +Fullwiler +Fullwood +Fulmer +Fulmore +Fulop +Fulp +Fuls +Fulsom +Fulson +Fulton +Fults +Fultz +Fulvio +Fulwider +Fulwiler +Fulwood +Fumagalli +Fumero +Funai +Funari +Funaro +Funches +Funchess +Funck +Fundenberger +Funderberg +Funderbunk +Funderburg +Funderburk +Funderburke +Fundis +Fundora +Fune +Funes +Funez +Fung +Funicello +Funk +Funke +Funkhouser +Funn +Funnell +Funnye +Funston +Funt +Fuoco +Fupocyupanqui +Fuqua +Fuquay +Furay +Furbeck +Furbee +Furber +Furbish +Furblur +Furbush +Furby +Furch +Furches +Furci +Furcron +Fure +Furer +Furey +Furfaro +Furfey +Furgason +Furgerson +Furgeson +Furgison +Furguson +Furia +Furino +Furkin +Furl +Furlan +Furler +Furlone +Furlong +Furlotte +Furlough +Furlow +Furman +Furmanik +Furna +Furnace +Furnari +Furnas +Furne +Furner +Furness +Furney +Furnia +Furnish +Furniss +Furno +Furr +Furrer +Furrh +Furrow +Furry +Furse +Furst +Furstenberg +Furtado +Furtak +Furtaw +Furth +Furtick +Furton +Furubotten +Furukawa +Furuta +Furutani +Furuya +Furuyama +Fury +Fus +Fusaro +Fusca +Fuscaldo +Fusch +Fuschetto +Fusco +Fuse +Fuselier +Fusha +Fushimi +Fusi +Fusik +Fusilier +Fusillo +Fusner +Fuson +Fuss +Fussell +Fusselman +Fussner +Fust +Fuster +Fuston +Futch +Futral +Futrell +Futrelle +Futter +Futterman +Fventes +Fyall +Fydenkevez +Fye +Fyfe +Fyffe +Fyke +Fykes +Fyksen +Fyler +Fyles +Fylnn +Fyock +Gaal +Gaar +Gaarder +Gaarsland +Gab +Gaba +Gabak +Gabaldon +Gabard +Gabardi +Gabaree +Gabay +Gabbamonte +Gabbard +Gabbay +Gabbert +Gabbett +Gabbin +Gabby +Gabe +Gabehart +Gabel +Gabeline +Gaber +Gabert +Gabhart +Gabino +Gabisi +Gabl +Gable +Gabler +Gables +Gabor +Gaboriault +Gabossi +Gabouer +Gabourel +Gaboury +Gabrel +Gabrelcik +Gabrenas +Gabri +Gabrial +Gabriel +Gabriele +Gabrielli +Gabrielsen +Gabrielson +Gabrysch +Gaby +Gacad +Gaccione +Gacek +Gach +Gachupin +Gacia +Gack +Gacke +Gackle +Gacusan +Gadapee +Gadbaw +Gadberry +Gadbois +Gadbury +Gadd +Gaddie +Gaddis +Gaddy +Gade +Gaden +Gades +Gadewoltz +Gadison +Gadley +Gadlin +Gadomski +Gadoury +Gadsby +Gadsden +Gadsen +Gadson +Gadue +Gadwah +Gadway +Gady +Gadzinski +Gaebler +Gaeddert +Gaede +Gaekle +Gaer +Gaerlan +Gaertner +Gaestel +Gaeta +Gaetani +Gaetano +Gaete +Gaeth +Gaetke +Gaetz +Gafanha +Gaff +Gaffer +Gaffey +Gaffigan +Gaffke +Gaffney +Gafford +Gagan +Gagarin +Gage +Gagel +Gagen +Gager +Gagg +Gaglia +Gagliano +Gagliardi +Gagliardo +Gagliardotto +Gaglio +Gaglione +Gagne +Gagner +Gagney +Gagnier +Gagnon +Gago +Gagon +Gahagan +Gahan +Gahl +Gahlman +Gahm +Gahn +Gahr +Gahring +Gaibler +Gaier +Gaietto +Gaige +Gail +Gailes +Gailey +Gailis +Gaillard +Gailliard +Gails +Gailun +Gain +Gainer +Gaines +Gainey +Gainforth +Gainor +Gainous +Gains +Gair +Gaiser +Gaisford +Gaitan +Gaiter +Gaiters +Gaither +Gaito +Gaitor +Gajardo +Gajate +Gajda +Gajeski +Gajewski +Gajica +Gal +Gala +Galabeas +Galacio +Galagher +Galam +Galamay +Galan +Galang +Galanga +Galanis +Galano +Galante +Galanti +Galapon +Galardi +Galardo +Galarita +Galarneau +Galarza +Galas +Galashaw +Galaska +Galassi +Galassini +Galasso +Galathe +Galati +Galauiz +Galavis +Galaviz +Galayda +Galaz +Galban +Galbavy +Galbiso +Galbo +Galbraith +Galbreath +Galbreth +Galdames +Galdamez +Galdi +Galdo +Galdon +Gale +Galea +Galeana +Galeano +Galeas +Galeazzi +Galecki +Galella +Galen +Galentine +Galeoto +Galeotti +Galer +Gales +Galetta +Galetti +Galey +Galfayan +Galford +Galgano +Galhardo +Gali +Galiano +Galic +Galicia +Galicinao +Galietti +Galik +Galimba +Galimberti +Galimi +Galimore +Galin +Galindez +Galindo +Galinis +Galinol +Galinoo +Galinski +Galioto +Galipeau +Galipo +Galizia +Galjour +Galka +Galkin +Gall +Galla +Gallacher +Gallaga +Gallager +Gallagher +Gallagos +Gallahan +Gallaher +Gallamore +Galland +Gallander +Gallant +Gallante +Gallardo +Gallarello +Gallargo +Gallaspy +Gallati +Gallatin +Gallaty +Gallaugher +Gallaway +Galle +Gallegas +Gallegher +Gallegly +Gallego +Gallegos +Gallegoz +Galleher +Gallemore +Gallen +Galleno +Gallenstein +Gallentine +Galler +Gallerani +Gallero +Gallery +Galles +Gallese +Gallet +Galleta +Galletta +Galletti +Galley +Galli +Gallian +Gallicchio +Gallichio +Gallien +Gallier +Galligan +Galligher +Galliher +Gallihugh +Gallik +Gallimore +Gallina +Gallinari +Gallinaro +Gallinger +Gallington +Gallion +Gallipeau +Gallipo +Gallishaw +Gallivan +Gallman +Gallmon +Gallo +Gallob +Gallodoro +Gallogly +Gallon +Gallop +Gallosa +Gallow +Galloway +Gallucci +Galluccio +Gallup +Gallups +Gallus +Gallusser +Galluzzi +Galluzzo +Gallwas +Gally +Galm +Galmore +Galo +Galofaro +Galon +Galow +Galper +Galpin +Gals +Galson +Galstad +Galster +Galstian +Galston +Galt +Galuppo +Galusha +Galuska +Galuski +Galustian +Galuszka +Galva +Galvan +Galvani +Galvano +Galven +Galves +Galvez +Galvin +Galvis +Galway +Galyan +Galyean +Galyen +Galyon +Gama +Gamache +Gamage +Gamarra +Gamba +Gambaiani +Gambale +Gambardella +Gambee +Gambel +Gambell +Gamber +Gamberg +Gamberini +Gambill +Gambino +Gamble +Gambler +Gambles +Gamblin +Gamboa +Gambold +Gambone +Gambrel +Gambrell +Gambrill +Gamby +Gamel +Gamela +Gamelin +Gamello +Gamer +Gamero +Gameros +Games +Gamet +Gamewell +Gamez +Gamino +Gamlin +Gamm +Gamma +Gammage +Gammel +Gammell +Gammill +Gammon +Gammond +Gammons +Gamon +Gamons +Gamotan +Gampong +Gampp +Gamrath +Gan +Gana +Ganas +Ganaway +Gancio +Gandara +Gandarilla +Gandarillia +Gandee +Gander +Gandert +Gandeza +Gandhi +Gandhy +Gandia +Gandolfi +Gandolfo +Gandrud +Gandy +Gane +Ganem +Ganer +Ganes +Ganesh +Ganey +Ganfield +Gang +Ganga +Gangadyal +Gange +Gangel +Gangelhoff +Gangell +Gangemi +Ganger +Gangestad +Gangi +Gangl +Gangler +Gangloff +Gangluff +Ganguli +Gangwer +Gangwish +Gani +Ganiban +Ganibe +Ganie +Ganigan +Ganim +Ganin +Ganino +Ganiron +Ganis +Ganison +Ganja +Ganji +Ganley +Gann +Gannaway +Ganner +Gannett +Gannetti +Gannoe +Gannon +Ganns +Gano +Ganoe +Ganong +Ganotisi +Ganoung +Gans +Gansburg +Gansen +Ganser +Gansert +Ganska +Ganske +Gant +Ganter +Gantert +Gantewood +Ganther +Gantner +Gantnier +Gantt +Gantvoort +Gantz +Gantzler +Ganus +Ganz +Ganze +Ganzer +Gao +Gaona +Gapen +Gapinski +Gapp +Gappa +Gara +Garabedian +Garacci +Garacia +Garafalo +Garafano +Garafola +Garahan +Garala +Garan +Garand +Garant +Garasha +Garate +Garavaglia +Garavelli +Garaventa +Garay +Garb +Garbacz +Garbarini +Garbarino +Garbe +Garber +Garbett +Garbin +Garbo +Garbutt +Garcea +Garceau +Garced +Garcelon +Garces +Garcia +Garcias +Garcilazo +Garcon +Garcy +Garczynski +Gard +Garde +Gardea +Gardecki +Gardella +Gardemal +Garden +Gardenas +Gardener +Gardenhire +Garder +Gardin +Gardiner +Garding +Gardinier +Gardino +Gardley +Gardner +Gardocki +Gardon +Gardunio +Garduno +Gardy +Gareau +Garelick +Garelik +Garen +Gares +Garetson +Garett +Garey +Garf +Garff +Garfias +Garfield +Garfinkel +Garfinkle +Garfunkel +Garg +Gargan +Gargani +Gargano +Gargis +Gargiulo +Garguilo +Gargus +Garhart +Gari +Garia +Garib +Garibai +Garibaldi +Garibaldo +Garibay +Garica +Garich +Garick +Gariepy +Gariety +Garigen +Garigliano +Garin +Garing +Garinger +Garis +Gariti +Garito +Garitty +Garity +Garivay +Garkow +Garland +Garlett +Garley +Garlick +Garling +Garlinger +Garlington +Garlits +Garlitz +Garlock +Garlovsky +Garlow +Garman +Garmany +Garmen +Garmire +Garmoe +Garmon +Garms +Garn +Garnache +Garnand +Garnder +Garneau +Garner +Garnes +Garness +Garnet +Garnett +Garnette +Garney +Garnham +Garnica +Garnick +Garnier +Garno +Garnow +Garns +Garnsey +Garnto +Garo +Garofalo +Garofano +Garofolo +Garon +Garone +Garoner +Garoutte +Garr +Garra +Garrabrant +Garraghty +Garrahan +Garramone +Garrand +Garrard +Garratt +Garraway +Garre +Garrean +Garreh +Garrell +Garrels +Garren +Garret +Garretson +Garrett +Garrette +Garrettson +Garrick +Garrido +Garriepy +Garriga +Garrigan +Garrigus +Garringer +Garrington +Garriott +Garris +Garrish +Garrison +Garriss +Garritson +Garrity +Garro +Garrod +Garron +Garrott +Garroutte +Garrow +Garry +Garsee +Garsia +Garside +Garsjo +Garske +Garski +Garson +Garst +Garstka +Garten +Gartenhaus +Gartenmayer +Garter +Garth +Garthee +Garthwaite +Gartin +Gartland +Gartley +Gartman +Gartner +Garton +Gartrell +Gartz +Garufi +Garuti +Garve +Garver +Garverick +Garvey +Garvie +Garvin +Garvis +Garwin +Garwood +Gary +Garza +Garzia +Garzon +Garzone +Gasaway +Gasbarro +Gasca +Gasch +Gaschke +Gascho +Gasco +Gascoigne +Gascon +Gascot +Gase +Gaseoma +Gaser +Gash +Gasienica +Gasiewski +Gasior +Gasiorowski +Gaska +Gaskamp +Gaskell +Gaskey +Gaskill +Gaskin +Gaskins +Gaslin +Gasman +Gasmen +Gasner +Gaspar +Gaspard +Gaspari +Gasparino +Gasper +Gasperi +Gasperini +Gasque +Gasquet +Gass +Gassaway +Gasse +Gassel +Gassen +Gasser +Gassert +Gassett +Gassler +Gassman +Gassner +Gasson +Gassoway +Gast +Gastel +Gastello +Gastellum +Gastelo +Gastelum +Gastelun +Gaster +Gastineau +Gastley +Gaston +Gastonguay +Gata +Gatch +Gatchalian +Gatchel +Gatchell +Gate +Gateley +Gately +Gaters +Gates +Gatesman +Gatesy +Gatewood +Gath +Gather +Gatheright +Gathers +Gathing +Gathings +Gathje +Gathman +Gathright +Gatica +Gatley +Gatliff +Gatlin +Gatling +Gato +Gaton +Gatrell +Gatski +Gatson +Gatta +Gattas +Gatten +Gatti +Gattie +Gattis +Gattison +Gatto +Gatton +Gatts +Gattshall +Gattuso +Gatwood +Gatz +Gatza +Gatzke +Gatzow +Gau +Gauani +Gaub +Gaubert +Gauch +Gaucher +Gauci +Gaucin +Gaud +Gaudenzi +Gaudet +Gaudett +Gaudette +Gaudier +Gaudin +Gaudino +Gaudio +Gaudioso +Gaudreau +Gaudy +Gauer +Gaufin +Gaufusi +Gauger +Gaughan +Gaughran +Gaugler +Gaukel +Gaukroger +Gaul +Gauld +Gaulden +Gauldin +Gaulding +Gaulin +Gaulke +Gault +Gaultney +Gaulzetti +Gaumer +Gaumond +Gaumont +Gauna +Gaunce +Gaunt +Gauntlett +Gauntner +Gauntt +Gauron +Gaus +Gause +Gausman +Gauss +Gaustad +Gaut +Gautam +Gauthier +Gauthreaux +Gautier +Gautney +Gautreau +Gautreaux +Gautsch +Gauvin +Gauwain +Gauze +Gavagan +Gavaldon +Gavalis +Gavan +Gave +Gavel +Gavell +Gavenda +Gaver +Gaves +Gavett +Gavette +Gavia +Gavidia +Gavigan +Gaviglia +Gavilanes +Gavin +Gavina +Gavinski +Gaviria +Gavit +Gavitt +Gavles +Gavula +Gaw +Gawel +Gawith +Gawlak +Gawlas +Gawlik +Gawron +Gawronski +Gawrych +Gawrys +Gawthorp +Gaxiola +Gay +Gayanilo +Gayden +Gaydos +Gaydosh +Gaye +Gayer +Gayfield +Gayhart +Gayheart +Gayle +Gayler +Gayles +Gaylor +Gaylord +Gayman +Gaymes +Gaymon +Gayne +Gayner +Gaynor +Gayo +Gayoso +Gaytan +Gayton +Gazaille +Gazaway +Gazda +Gazdecki +Gazdik +Gazella +Gazitano +Gaznes +Gazo +Gazza +Gazzara +Gazzillo +Gazzo +Gazzola +Gbur +Gdovin +Gdula +Geach +Geagan +Gealy +Gean +Geanopulos +Geans +Geant +Gear +Gearan +Gearhart +Gearheart +Gearin +Gearing +Gearlds +Gearn +Gearon +Gearwar +Geary +Geasley +Geater +Geathers +Gebauer +Gebbia +Gebbie +Gebel +Gebers +Gebert +Geberth +Gebhard +Gebhardt +Gebhart +Gebo +Gebrayel +Gecan +Gechas +Geck +Geckles +Geddes +Geddie +Geddings +Geddis +Gede +Gedeon +Gederman +Gedman +Gedney +Gedo +Gedris +Gedye +Gee +Geeding +Geel +Geelan +Geen +Geer +Geerdes +Geerken +Geers +Geery +Geesaman +Geesey +Geeslin +Geeter +Geeting +Geffers +Geffert +Geffken +Geffrard +Geffre +Gefroh +Gegenheimer +Gehl +Gehlbach +Gehle +Gehler +Gehlert +Gehlhausen +Gehling +Gehm +Gehman +Geho +Gehr +Gehred +Gehrer +Gehret +Gehrett +Gehri +Gehrig +Gehring +Gehringer +Gehris +Gehrke +Gehrki +Gehrking +Gehrlein +Gehrmann +Gehron +Geib +Geibel +Geibig +Geidl +Geidner +Geier +Geigel +Geiger +Geigle +Geiken +Geil +Geils +Geiman +Geimer +Geis +Geise +Geisel +Geiselman +Geisen +Geiser +Geisinger +Geisinsky +Geisler +Geiss +Geissel +Geissler +Geist +Geister +Geiszler +Geitgey +Geitner +Geitz +Gekas +Gelabert +Gelb +Gelbach +Gelbart +Gelber +Gelbowitz +Gelder +Geldmacher +Geldrich +Gelen +Gelerter +Gelfand +Gelfo +Gelfond +Gelger +Gelhar +Gelinas +Gelineau +Gelino +Gell +Gellatly +Gelle +Geller +Gellert +Gelles +Gellespie +Gellinger +Gellings +Gellis +Gellman +Gelman +Gelner +Gelo +Gelormino +Gelrud +Gelsinger +Gelston +Geltz +Gelvin +Gelzer +Gelzinis +Gemaehlich +Gembarowski +Gembe +Gemberling +Gembler +Gemes +Geml +Gemma +Gemme +Gemmel +Gemmell +Gemmen +Gemmer +Gemmill +Gemmiti +Gena +Genao +Genas +Genberg +Gencarelli +Genco +Gendel +Gendernalik +Gendler +Gendreau +Gendron +Gendusa +Gene +Gener +Genera +General +Generalao +Genereux +Generoso +Generous +Geneseo +Genest +Genet +Genett +Genetti +Geney +Geng +Genga +Genge +Gengler +Genia +Genich +Genier +Geniesse +Genin +Genis +Genito +Genna +Gennarelli +Gennaria +Gennaro +Gennett +Gennette +Gennings +Gennock +Gennusa +Geno +Genous +Genova +Genovese +Genovesi +Genre +Genrich +Gens +Gensel +Gensler +Genson +Gent +Genta +Gentelia +Genter +Gentery +Gentes +Gentges +Genther +Genthner +Gentilcore +Gentile +Gentili +Gentille +Gentis +Gentle +Gentleman +Gentles +Gentner +Gentry +Gentsy +Gentz +Gentzler +Genualdi +Genualdo +Genuario +Genung +Genz +Genzel +Genzone +Geoffrey +Geoffrion +Geoffroy +Geoghan +Geoghegan +Geohagan +Geoly +Georgalas +Georgales +George +Georgelis +Georges +Georgeson +Georgevic +Georghiou +Georgi +Georgia +Georgiades +Georgiadis +Georgiana +Georgiou +Georgis +Georgl +Georgopoulos +Gephardt +Gephart +Gepner +Geppert +Gerace +Gerache +Geraci +Geraghty +Gerald +Geraldes +Geraldo +Geralds +Gerard +Gerardi +Gerardo +Gerardot +Gerathy +Gerba +Gerbatz +Gerber +Gerberich +Gerbi +Gerbig +Gerbino +Gerbitz +Gerbs +Gercak +Gerchak +Gerckens +Gerczak +Gerdel +Gerdeman +Gerdes +Gerdiman +Gerding +Gerdis +Gerdsen +Gerdts +Gere +Gerecke +Geremia +Geren +Gerena +Geres +Gerety +Gerfin +Gergel +Gergely +Gergen +Gerguson +Gerhard +Gerhardt +Gerhart +Gerhauser +Gerhold +Gerich +Gerig +Gering +Geringer +Geris +Gerke +Gerken +Gerkin +Gerking +Gerl +Gerla +Gerlach +Gerland +Gerleman +Gerlich +Gerling +Gerlock +Gerloff +Gerlt +Germain +Germaine +German +Germana +Germani +Germann +Germano +Germany +Germer +Germershausen +Germinaro +Germon +Germond +Germundson +Germy +Gernatt +Gerner +Gernert +Gerney +Gero +Gerock +Geroge +Gerold +Gerondale +Geronime +Geronimo +Gerosa +Gerould +Gerow +Gerpheide +Gerrald +Gerrard +Gerraro +Gerrero +Gerringer +Gerrior +Gerrish +Gerrits +Gerritsen +Gerrity +Gerry +Gers +Gersbach +Gersch +Gershen +Gershenson +Gershey +Gershkovich +Gershman +Gershon +Gerson +Gerst +Gerstein +Gersten +Gerstenberger +Gerstenkorn +Gerster +Gerstle +Gerstner +Gerteisen +Gertel +Gertelman +Gerten +Gerth +Gerthung +Gertken +Gertner +Gerton +Gertsch +Gertsema +Gertsen +Gerty +Gertz +Gerula +Gerundo +Gervais +Gervase +Gervasi +Gervasio +Gerveler +Gervin +Gerwe +Gerweck +Gerwig +Gerwin +Gerwitz +Gerych +Geryol +Gerz +Gesamondo +Geschke +Gesell +Gesick +Gesing +Gesinski +Geske +Gesmondi +Gesner +Gess +Gessel +Gesselli +Gessert +Gessford +Gessner +Gest +Gestes +Gestether +Gesualdi +Gesualdo +Getachew +Getchell +Getchius +Getchman +Geter +Gethers +Getler +Getman +Getschman +Getsinger +Getson +Gett +Gettel +Gettelman +Gettenberg +Gettens +Getter +Gettig +Getting +Gettinger +Gettings +Gettis +Gettle +Gettman +Getto +Getts +Getty +Gettys +Getz +Getzlaff +Getzschman +Geuder +Geurin +Geurts +Gevara +Gevedon +Geving +Gevorkian +Gevorkyan +Gewant +Gewinner +Gey +Geyer +Geyette +Geyman +Gezalyan +Gfeller +Gfroerer +Ghaemmaghami +Ghamdi +Ghan +Ghanayem +Ghane +Ghant +Ghantt +Ghaor +Gharing +Ghazal +Ghazi +Ghaziani +Ghazvini +Ghea +Ghebremicael +Ghee +Gheen +Gheewala +Ghekiere +Ghelfi +Ghent +Ghera +Gherardi +Gherardini +Ghere +Gherman +Gheza +Ghia +Ghianni +Ghibaudy +Ghil +Ghiloni +Ghio +Ghiorso +Ghiringhelli +Gholar +Gholson +Gholston +Ghormley +Ghosh +Ghosn +Ghosten +Ghoston +Ghramm +Ghrist +Giacalone +Giacchi +Giacchino +Giaccio +Giaccone +Giachelli +Giacherio +Giachino +Giacobbe +Giacoletti +Giacolone +Giacomazzi +Giacomelli +Giacomini +Giacomo +Giacone +Giacopelli +Giagni +Giaimo +Giallorenzo +Giambalvo +Giambanco +Giambattista +Giambra +Giambrone +Giambruno +Giamichael +Giammarino +Giammona +Giampaolo +Giampapa +Giampietro +Gian +Gianandrea +Giancarlo +Giancaspro +Giancola +Giandelone +Giandomenico +Gianelli +Giang +Giangregorio +Giangrosso +Gianikas +Gianino +Giannakopoulo +Giannattasio +Giannavola +Giannecchini +Giannell +Giannelli +Giannetti +Giannetto +Gianni +Giannini +Giannitti +Giannone +Giannotti +Gianola +Gianopoulos +Gianopulos +Gianotti +Giantonio +Gianunzio +Giaquinta +Giaquinto +Giard +Giardina +Giardini +Giardino +Giarrano +Giarraputo +Giarratano +Giarrusso +Giarusso +Giasson +Gibala +Gibas +Gibb +Gibbard +Gibbens +Gibbings +Gibbins +Gibble +Gibbon +Gibboney +Gibbons +Gibbs +Gibbson +Gibby +Gibeau +Gibeault +Gibeaut +Giberson +Gibert +Gibes +Gibler +Giblin +Gibney +Giboney +Gibson +Gica +Gick +Gicker +Giczewski +Gidaro +Gidcumb +Gidden +Giddens +Giddings +Giddins +Gideon +Gidley +Gidney +Gidwani +Giebel +Gieber +Giebler +Giebner +Gieck +Giedlin +Giefer +Gieger +Giegerich +Giehl +Giel +Gielow +Gielstra +Gienger +Gier +Giera +Giere +Gierhart +Gieringer +Gierisch +Gierke +Gierlach +Gierling +Gierman +Giernoth +Gierut +Gies +Giesbrecht +Giese +Gieseke +Gieseking +Giesel +Gieselman +Gieseman +Giesen +Gieser +Giesing +Giesler +Giessinger +Giessler +Giesy +Gietz +Gietzen +Giff +Giffee +Giffen +Giffin +Giffith +Gifford +Gift +Gigante +Gigantino +Giger +Gigger +Giggey +Giggie +Gigler +Giglio +Gigliotti +Gignac +Gigstad +Giguere +Gihring +Gil +Gilani +Gilarski +Gilb +Gilbar +Gilbeau +Gilberg +Gilbert +Gilberti +Gilbertson +Gilbo +Gilboy +Gilbreath +Gilbreth +Gilbride +Gilcher +Gilchrest +Gilchrist +Gilcoine +Gilcrease +Gilcreast +Gilcrest +Gilcris +Gilday +Gildea +Gildemeister +Gilden +Gilder +Gilderman +Gildersleeve +Gilding +Gildner +Gildon +Gildore +Gildow +Gildroy +Gile +Giles +Gilespie +Gilfillan +Gilford +Gilfoy +Gilgan +Gilger +Gilgore +Gilgour +Gilham +Gilhooley +Gilhooly +Gilhousen +Gilhuly +Giliberto +Gilio +Gilkerson +Gilkes +Gilkey +Gilkison +Gill +Gillam +Gillan +Gilland +Gillard +Gillaspie +Gillcrest +Gille +Gillece +Gilleland +Gillem +Gillen +Gillentine +Gillenwater +Gillenwaters +Giller +Gillerist +Gillert +Gilles +Gillespi +Gillespie +Gillet +Gillett +Gillette +Gilley +Gillham +Gilliam +Gillian +Gilliand +Gillians +Gilliard +Gillice +Gillich +Gillick +Gillie +Gillies +Gillig +Gilligan +Gillihan +Gillikin +Gillilan +Gilliland +Gillim +Gillin +Gilling +Gillingham +Gillings +Gillins +Gilliom +Gillion +Gillis +Gillison +Gillispie +Gilliss +Gillitzer +Gillman +Gillmer +Gillming +Gillmor +Gillmore +Gillock +Gillogly +Gillom +Gillon +Gillooly +Gillotti +Gills +Gillson +Gillstrap +Gillum +Gillund +Gilly +Gillyard +Gilman +Gilmartin +Gilmer +Gilmore +Gilmour +Gilner +Gilomen +Gilpatric +Gilpatrick +Gilpin +Gilreath +Gilroy +Gilruth +Gilsdorf +Gilson +Gilstad +Gilster +Gilstrap +Giltner +Gilton +Gilvin +Gilyard +Gilzow +Gimar +Gimbel +Gimble +Gimenez +Gimlin +Gimm +Gimpel +Gimse +Gin +Ginanni +Ginard +Ginder +Gindhart +Gindi +Gindlesperger +Giner +Gines +Ging +Gingell +Ginger +Gingerich +Gingery +Gingg +Gingles +Gingras +Gingrich +Gingues +Ginkel +Ginn +Ginnery +Ginnetti +Ginnings +Ginnis +Ginns +Ginocchio +Ginolfi +Ginoza +Gins +Ginsberg +Ginsburg +Ginsel +Ginsky +Ginter +Ginther +Ginty +Ginyard +Ginzel +Gioacchini +Gioe +Gioffre +Gioia +Giombetti +Gionest +Gionet +Gionfriddo +Gionson +Gionta +Giordano +Giorgi +Giorgianni +Giorgini +Giorgio +Gioriano +Giorno +Giottonini +Giovanelli +Giovanetti +Giovanini +Giovanni +Giovannini +Giove +Giovinco +Giovino +Gip +Gipe +Gipp +Gipple +Gipson +Gira +Girad +Giraldo +Girand +Girard +Girardeau +Girardi +Girardin +Girardot +Girauard +Giraud +Girbach +Girdler +Girdley +Girdner +Gire +Girellini +Girgenti +Girgis +Girillo +Girling +Girman +Girmazion +Girod +Giroir +Girolami +Girolamo +Giron +Girona +Gironda +Girone +Girote +Girouard +Giroux +Girres +Girsch +Girsh +Girst +Girt +Girten +Girton +Girty +Girvan +Girven +Girvin +Gischer +Giscombe +Gish +Gishal +Gisi +Gisin +Gislason +Gisler +Gismondi +Gisondi +Gisriel +Gissel +Gissler +Gist +Gitchell +Gitelman +Githens +Gitlewski +Gitlin +Gitt +Gittelman +Gittens +Gitter +Gittere +Gitthens +Gitting +Gittinger +Gittings +Gittins +Gittleman +Gittler +Gitto +Gitzen +Gitzlaff +Giudice +Giuffre +Giuffrida +Giulian +Giuliani +Giuliano +Giulioli +Giumarro +Giunta +Gius +Giusti +Giusto +Givan +Givant +Given +Givens +Givhan +Gividen +Givliani +Giza +Gizinski +Gizzi +Gizzo +Gjelaj +Gjeltema +Gjelten +Gjerde +Gjertsen +Gjesdal +Gjokaj +Gjorven +Glaab +Glab +Glacken +Glackin +Glad +Gladden +Gladding +Glade +Gladen +Glader +Gladfelter +Gladhart +Gladhill +Gladin +Gladish +Gladle +Gladney +Gladson +Gladstein +Gladstone +Gladu +Gladue +Gladwell +Gladwin +Glady +Gladys +Gladysiewski +Gladysz +Glaeser +Glahn +Glance +Glancy +Glanden +Glander +Glandon +Glanton +Glantz +Glanville +Glanz +Glanzer +Glanzman +Glapion +Glarson +Glas +Glasbrenner +Glasby +Glasco +Glascock +Glascoe +Glascott +Glaser +Glasford +Glasglow +Glasgow +Glashen +Glasier +Glasner +Glasow +Glasper +Glaspie +Glaspy +Glass +Glassburn +Glassco +Glasscock +Glassel +Glasser +Glassett +Glassey +Glassford +Glassing +Glassman +Glassner +Glasson +Glathar +Glatt +Glatter +Glatz +Glatzel +Glau +Glauberman +Glaubke +Glaude +Glaue +Glauner +Glaus +Glauser +Glausier +Glavan +Glave +Glaves +Glaviano +Glavin +Glawe +Glawson +Glay +Glaza +Glaze +Glazebrook +Glazener +Glazer +Glazewski +Glazier +Glazner +Gleason +Gleaton +Gleave +Gleaves +Gleber +Glebocki +Gleckler +Gledhill +Glee +Gleen +Gleeson +Gleghorn +Gleich +Gleicher +Gleichman +Gleichweit +Gleim +Gleisner +Gleiss +Gleitz +Glembocki +Glen +Glende +Glendening +Glendenning +Glenister +Glenn +Glenna +Glennon +Glenny +Glesener +Glessing +Glessner +Glew +Glicher +Glick +Glicken +Glickman +Glickson +Glidden +Glidewell +Glidwell +Gliem +Glime +Glimp +Glimpse +Glines +Glinka +Glinkerman +Glinski +Glisan +Glise +Glish +Glisson +Glista +Gliues +Gliwski +Glock +Glockner +Glod +Gloden +Glodich +Glodo +Glodowski +Gloe +Gloeckler +Gloeckner +Gloff +Glogowski +Glomb +Glomski +Gloodt +Gloor +Glor +Glordano +Glore +Gloria +Glorioso +Glorius +Glory +Glos +Gloshen +Gloss +Glosser +Glossner +Glosson +Gloster +Gloston +Glotfelty +Glotzbach +Glotzbecker +Glover +Glovier +Glovinsky +Glow +Glowacki +Glowacky +Glowinski +Glowka +Glowski +Gloyd +Gluc +Gluck +Gluckman +Glucksman +Glud +Glueck +Glueckert +Glugla +Glumac +Glunt +Glunz +Gluszek +Gluth +Glymph +Glyn +Glynn +Gmernicki +Gnabah +Gnagey +Gnas +Gnatek +Gnau +Gnegy +Gneiser +Gnerre +Gniewek +Gnoza +Go +Goad +Goade +Goan +Goans +Goar +Goard +Goates +Goatley +Gobbi +Gobble +Gobbo +Gobea +Gobeil +Gobeille +Gobel +Gobeli +Goben +Gober +Gobern +Gobert +Gobeyn +Gobin +Goble +Gobler +Goblirsch +Gobrecht +Gocek +Gocha +Gochal +Gochanour +Gochenour +Gochett +Gochie +Gochnauer +Gochnour +Gocke +Gockel +Gockerell +Gockley +Goda +Godar +Godard +Godbe +Godbee +Godbey +Godbold +Godboldt +Godbolt +Godbout +Godby +Goddard +Godde +Godden +Gode +Godeaux +Godek +Godel +Goderich +Godert +Godette +Godfray +Godfrey +Godin +Godina +Godine +Godines +Godinez +Goding +Godinho +Godino +Godkin +Godleski +Godlewski +Godley +Godlove +Godnick +Godown +Godoy +Godsey +Godshall +Godsman +Godson +Godwin +Godwyn +Godyn +Godzik +Goe +Goebel +Goecke +Goeckel +Goedde +Goede +Goedecke +Goeden +Goedicke +Goedken +Goehl +Goehner +Goehring +Goehringer +Goeing +Goeke +Goeken +Goel +Goeldner +Goeller +Goeltz +Goelz +Goeman +Goen +Goens +Goepel +Goepfarth +Goepfert +Goeppinger +Goeppner +Goerdel +Goerdt +Goergen +Goerges +Goering +Goerke +Goerlich +Goerlitz +Goerner +Goers +Goertz +Goertzen +Goes +Goeser +Goessl +Goethals +Goethe +Goetjen +Goetsch +Goettel +Goetter +Goettig +Goetting +Goettl +Goettle +Goettman +Goettsch +Goettsche +Goetz +Goetze +Goetzinger +Goetzke +Goewey +Goff +Goffe +Goffer +Goffigan +Goffinet +Goffman +Goffney +Goffredo +Gofman +Goforth +Gofton +Goga +Gogan +Gogel +Goger +Gogerty +Goggans +Goggin +Goggins +Gogins +Goglia +Gogocha +Goguen +Goh +Goheen +Gohlke +Gohn +Gohr +Gohring +Goich +Goick +Goicoechea +Goike +Goin +Goines +Going +Goings +Goins +Goist +Gojcaj +Gojmerac +Gokey +Gola +Golab +Golabek +Golackson +Golan +Golanski +Golar +Golas +Golaszewski +Golay +Golba +Golberg +Golbin +Gold +Golda +Goldade +Goldak +Goldammer +Goldbach +Goldbaum +Goldbeck +Goldberg +Goldberger +Goldblatt +Golde +Goldeman +Golden +Goldenberg +Goldenman +Goldenstein +Golder +Golderer +Goldermann +Goldey +Goldfarb +Goldfeder +Goldfeld +Goldfield +Goldfine +Goldfischer +Goldfuss +Goldhaber +Goldhahn +Goldhammer +Goldhirsh +Goldhorn +Goldie +Goldin +Golding +Goldinger +Goldizen +Goldkamp +Goldklang +Goldman +Goldmann +Goldner +Goldrich +Goldrick +Goldrup +Golds +Goldsberry +Goldsboro +Goldsborough +Goldsby +Goldschmidt +Goldsmith +Goldson +Goldstein +Goldstock +Goldston +Goldstone +Goldsworthy +Goldthorpe +Goldthwait +Goldthwaite +Goldtooth +Goldtrap +Goldware +Goldwater +Goldwire +Goldwyn +Goldy +Goldyn +Golebiewski +Golebiowski +Golec +Goleman +Golemba +Golembeski +Golembiewski +Golen +Goletz +Goley +Golia +Golian +Golias +Golick +Golida +Goliday +Golie +Golightley +Golightly +Goligoski +Golik +Golinski +Golish +Golk +Golka +Golkin +Goll +Golla +Golladay +Gollehon +Goller +Gollhofer +Golliday +Gollier +Gollihar +Gollihue +Gollin +Gollman +Gollnick +Gollob +Gollogly +Gollop +Gollwitzer +Golly +Golob +Golojuch +Golom +Golomb +Golombecki +Golombek +Golonka +Golpe +Golphin +Golson +Golston +Golt +Goltra +Goltry +Goltz +Golub +Goluba +Golumski +Golz +Gomaz +Gomberg +Gombert +Gombos +Gome +Gomer +Gomes +Gomey +Gomez +Gomillion +Gomm +Gommer +Gomoll +Gomora +Gomoran +Gompert +Gompf +Gomzales +Gomzalez +Gonales +Gonalez +Gonazlez +Goncalves +Gonce +Gonchoff +Gonda +Gondek +Gonder +Gondola +Gondran +Gone +Gones +Goney +Gonez +Gong +Gongalez +Gongalves +Gongora +Gonnella +Gonnerman +Gonneville +Gonsales +Gonsalez +Gonsalues +Gonsalves +Gonsar +Gonser +Gonseth +Gonsiewski +Gonsior +Gonska +Gonsoulin +Gonterman +Gonthier +Gonya +Gonyea +Gonyer +Gonyo +Gonyou +Gonzaga +Gonzalas +Gonzalaz +Gonzale +Gonzalea +Gonzales +Gonzalez +Gonzalis +Gonzaliz +Gonzalos +Gonzelas +Gonzeles +Gonzelez +Gonzolas +Gonzoles +Gonzolez +Goo +Gooch +Good +Goodacre +Goodaker +Goodale +Goodall +Goodard +Goodchild +Goode +Goodell +Goodemote +Gooden +Goodenberger +Goodenough +Goodenow +Gooder +Goodermote +Goodfellow +Goodfield +Goodfriend +Goodger +Goodgine +Goodgion +Goodhart +Goodheart +Goodhile +Goodhue +Goodie +Goodiel +Goodier +Goodin +Goodine +Gooding +Goodkin +Goodknight +Goodland +Goodlet +Goodlett +Goodley +Goodlin +Goodling +Goodloe +Goodlow +Goodly +Goodman +Goodmanson +Goodmon +Goodner +Goodness +Goodnight +Goodnoe +Goodnough +Goodnow +Goodpaster +Goodpastor +Goodpasture +Goodreau +Goodrich +Goodrick +Goodridge +Goodroe +Goodrow +Goodrum +Goods +Goodsell +Goodsite +Goodson +Goodspeed +Goodstein +Goodvin +Goodwater +Goodwill +Goodwin +Goodwine +Goodwyn +Goody +Goodyear +Googe +Gookin +Goold +Goolden +Goolesby +Gooley +Goolia +Goolman +Goolsbee +Goolsby +Goombi +Goon +Goonan +Goonen +Goonez +Goos +Goosby +Goosen +Goosey +Gooslin +Goossen +Goossens +Gootee +Gootz +Gopen +Gopie +Gopin +Gora +Goracke +Goral +Goralski +Gorans +Goranson +Gorbea +Gorbet +Gorby +Gorczyca +Gorczynski +Gord +Gordan +Gorden +Gorder +Gordey +Gordillo +Gordils +Gordin +Gordineer +Gordinier +Gordis +Gordley +Gordner +Gordo +Gordon +Gordy +Gore +Gorecki +Goreczny +Goree +Gorelick +Gorelik +Gorell +Gorelli +Goren +Gorena +Gorenberg +Gorence +Gorenflo +Gores +Goretti +Gorey +Gorglione +Gorgo +Gorgone +Gorham +Gori +Gorin +Goring +Goris +Gorius +Gorka +Gorley +Gorlich +Gormally +Gorman +Gormanous +Gormley +Gormly +Gormont +Gorn +Gorneault +Gorney +Gornick +Gornie +Gornikiewicz +Gornto +Gorny +Gorovitz +Gorr +Gorrell +Gorri +Gorrill +Gorrindo +Gorringe +Gorski +Gorsky +Gorsline +Gorsuch +Gort +Gorter +Gortman +Gorton +Gorum +Gory +Gorychka +Gorz +Gorzynski +Gosa +Gosch +Gosche +Gosda +Gosden +Gosdin +Gose +Gosewisch +Gosey +Gosha +Goshay +Goshen +Goshi +Goshorn +Goshow +Gosier +Goslee +Goslin +Gosline +Gosling +Gosman +Gosnell +Gosney +Goss +Gossack +Gossage +Gossard +Gosse +Gosselin +Gossen +Gosser +Gosserand +Gosset +Gossett +Gossi +Gossin +Gossling +Gossman +Gosso +Gossom +Gosson +Gossow +Gostlin +Gostomski +Goston +Gostowski +Gosvener +Goswami +Goswick +Gosz +Gotay +Gotch +Gotcher +Gotchy +Goth +Gotham +Gothard +Gothe +Gothier +Gothro +Gotimer +Gotlib +Goto +Gotowka +Gotschall +Gotsche +Gotshall +Gott +Gotta +Gottardo +Gottdenger +Gottemoeller +Gotter +Gottesman +Gottfried +Gotthard +Gotthardt +Gotthelf +Gottke +Gottleber +Gottlieb +Gottlob +Gotto +Gottron +Gotts +Gottsch +Gottschalk +Gottschall +Gottshall +Gottula +Gottwald +Gotwalt +Gou +Goubeaux +Goucher +Gouchie +Goud +Goude +Goudeau +Goudelock +Goudge +Goudie +Goudreau +Goudy +Gouge +Gougeon +Gouger +Gough +Goughnour +Gougis +Gouin +Gouker +Goulart +Goularte +Goulas +Goulbourne +Gould +Goulden +Gouldie +Goulding +Gouldman +Gouldsberry +Goulet +Goulette +Gounder +Goupil +Gour +Gouras +Gourd +Gourdin +Gourdine +Gourlay +Gourley +Gouse +Gouthier +Goutremout +Gouty +Gouveia +Gouzalez +Gouzy +Govan +Gove +Govea +Gover +Govern +Governale +Govero +Govert +Govia +Govin +Govindeisami +Govoni +Govostes +Gow +Gowan +Gowans +Gowda +Gowdy +Gowell +Gowen +Gowens +Gower +Gowers +Gowey +Gowin +Gowing +Gowins +Gowler +Goy +Goya +Goyal +Goyco +Goyda +Goyen +Goyer +Goyette +Goyne +Goynes +Goza +Gozalez +Gozman +Graaf +Graap +Graban +Grabarczyk +Grabau +Grabauskas +Grabe +Grabel +Graben +Grabenstein +Graber +Grabert +Grabhorn +Grabill +Grabinger +Grabinski +Grable +Grabler +Grabner +Grabo +Grabonski +Graboski +Grabow +Grabowiecki +Grabowski +Grabowsky +Grabski +Grace +Graceffo +Gracely +Graces +Gracey +Graci +Gracia +Graciana +Graciani +Graciano +Gracie +Gracy +Graczyk +Grad +Graddy +Grade +Gradel +Graden +Gradert +Gradford +Gradias +Gradilla +Gradillas +Gradle +Gradley +Gradney +Grado +Gradowski +Gradwell +Gradwohl +Grady +Grae +Graeber +Graef +Graefe +Graeff +Graen +Graeser +Graeter +Graetz +Graf +Grafals +Grafe +Grafenstein +Graff +Graffagnino +Graffam +Graffeo +Graffney +Graft +Grafton +Gragas +Grage +Grageda +Gragert +Gragg +Grago +Gragson +Graham +Grahams +Grahan +Grahe +Grahl +Grahm +Grahn +Grahovac +Graichen +Graig +Grain +Grainey +Grainger +Graise +Grajales +Grajeda +Grajek +Grala +Gralak +Graleski +Grall +Gram +Gramacy +Gramajo +Gramberg +Gramble +Grambling +Grambo +Gramby +Gramc +Gramer +Grames +Gramham +Graminski +Gramley +Gramlich +Gramling +Gramm +Grammatica +Grammer +Grammes +Grammont +Gramolini +Grams +Gramza +Gran +Grana +Granada +Granade +Granado +Granados +Granahan +Granai +Granat +Granata +Granath +Granato +Granberg +Granberry +Granbois +Granby +Grand +Granda +Grandberry +Grandbois +Grandchild +Grande +Grandel +Granderson +Grandfield +Grandi +Grandin +Grandinetti +Grandison +Grandjean +Grandmaison +Grandmont +Grandner +Grando +Grandolfo +Grandon +Grandos +Grandstaff +Grandt +Grandusky +Grandy +Granelli +Graner +Granes +Graney +Granfield +Grange +Granger +Granholm +Graniela +Granier +Granieri +Graniero +Granillo +Granizo +Granlund +Grannan +Grannell +Granneman +Grannis +Grannum +Grano +Granquist +Granroth +Gransberry +Gransky +Granstaff +Granstrom +Grant +Grantham +Granthan +Grantier +Grantland +Granto +Grantz +Granucci +Granvil +Granville +Granvold +Granzella +Granzin +Granzow +Grap +Graper +Grapes +Grapp +Grappe +Grappo +Gras +Graser +Grasha +Grashot +Grasman +Grasmick +Grasmuck +Grass +Grassano +Grasse +Grasser +Grassham +Grassi +Grassia +Grassie +Grassl +Grassle +Grassman +Grassmyer +Grasso +Grastorf +Grasty +Grat +Grate +Grater +Grates +Grattan +Grattelo +Gratton +Gratz +Grau +Graubard +Grauberger +Graue +Grauel +Grauer +Graughard +Graul +Grauman +Graus +Grav +Grava +Gravat +Gravatt +Grave +Gravel +Gravelin +Graveline +Gravell +Gravelle +Gravely +Graven +Gravenstein +Graver +Gravert +Graves +Gravett +Gravette +Gravina +Gravino +Gravis +Gravit +Gravito +Gravitt +Gravitz +Gravley +Gravlin +Gravois +Graw +Grawburg +Grawe +Gray +Graybeal +Graybill +Graydon +Grayer +Grayes +Grays +Grayson +Graza +Graziani +Graziano +Grazier +Grazioplene +Graziosi +Grboyan +Grdina +Grealish +Gream +Greaney +Greany +Grear +Greaser +Greason +Greathouse +Greaux +Greaver +Greaves +Greb +Grebe +Grebel +Greber +Grebin +Grebner +Grebs +Grecco +Grech +Greco +Greczkowski +Greder +Greear +Greeb +Greek +Greeley +Greely +Greem +Green +Greenan +Greenawalt +Greenaway +Greenbacker +Greenbaum +Greenberg +Greenberger +Greenblatt +Greenburg +Greenbush +Greene +Greenen +Greener +Greenfeld +Greenfelder +Greenfield +Greengo +Greenhalge +Greenhalgh +Greenham +Greenhaw +Greenhill +Greenhouse +Greenhoward +Greenidge +Greenier +Greening +Greenland +Greenlaw +Greenleaf +Greenlee +Greenlees +Greenler +Greenley +Greenlief +Greenlow +Greenlun +Greenly +Greenman +Greenmyer +Greeno +Greenough +Greenrose +Greensfelder +Greenspan +Greenstein +Greenstreet +Greenup +Greenwade +Greenwald +Greenwaldt +Greenwall +Greenwalt +Greenway +Greenweig +Greenwell +Greenwood +Greep +Greer +Greeson +Greet +Greever +Greeves +Grefe +Greff +Grefrath +Greg +Grega +Gregan +Gregas +Greger +Gregersen +Gregerson +Gregg +Greggory +Greggs +Grego +Gregoire +Gregor +Gregoreski +Gregori +Gregoria +Gregorich +Gregorio +Gregoroff +Gregorski +Gregory +Gregson +Gregston +Gregus +Gregware +Greiber +Greider +Greif +Greife +Greig +Greigo +Greil +Grein +Greiner +Greinke +Greis +Greiser +Greisiger +Greising +Greisser +Greist +Greiwe +Grell +Grella +Gremel +Gremer +Gremillion +Greminger +Gremler +Gremmels +Gremminger +Gremo +Gren +Grenda +Grenet +Grenfell +Grengs +Grenier +Greninger +Grenke +Grenko +Grennan +Grennay +Grennon +Grenon +Grensky +Grenway +Grenz +Gresco +Gresh +Gresham +Gresko +Gresl +Gress +Gressett +Gressler +Gressley +Gressman +Gressmire +Greth +Grether +Greto +Gretsch +Grett +Gretter +Gretz +Gretzinger +Gretzner +Greubel +Greuel +Greulich +Grev +Greve +Grever +Greviston +Grew +Grewal +Grewe +Grewell +Grey +Greydanus +Greynolds +Greyovich +Greytak +Grgurevic +Grham +Gribben +Gribbin +Gribbins +Gribble +Griblin +Grice +Grich +Grider +Gridley +Grieb +Griebel +Griebling +Grieco +Grief +Grieff +Grieger +Griego +Griem +Grieme +Griep +Griepentrog +Grier +Grierson +Gries +Griesbach +Griesbaum +Griese +Grieser +Grieshaber +Grieshop +Griesi +Griesinger +Griesmeyer +Griess +Griest +Grieve +Grieves +Grife +Griffan +Griffard +Griffee +Griffel +Griffen +Griffes +Griffeth +Griffey +Griffie +Griffies +Griffieth +Griffin +Griffing +Griffins +Griffis +Griffith +Griffiths +Griffitt +Griffitts +Griffo +Griffon +Griffth +Griffy +Grifin +Grigaliunas +Grigalonis +Grigas +Grigg +Griggers +Griggs +Griglen +Grignon +Grigoreas +Grigorov +Grigsby +Grijalva +Grill +Grillette +Grilley +Grilli +Grillo +Grillot +Grills +Grim +Grima +Grimaldi +Grimaldo +Grimard +Grimaud +Grime +Grimes +Grimley +Grimlie +Grimm +Grimme +Grimmer +Grimmett +Grimmius +Grims +Grimshaw +Grimsley +Grimstead +Grimwood +Grinage +Grinberg +Grinde +Grindel +Grindeland +Grindell +Grinder +Grindle +Grindstaff +Grine +Griner +Grines +Grinie +Grinkley +Grinman +Grinnan +Grinnell +Grinner +Grinstead +Grinter +Grinvalsky +Grip +Gripp +Grippe +Grippen +Gripper +Grippi +Grippo +Grisanti +Grisby +Grise +Griseta +Grishaber +Grisham +Grishan +Grismer +Grismore +Grisom +Grisostomo +Grissam +Grisset +Grissett +Grissinger +Grisso +Grissom +Grisson +Grist +Gristede +Griswald +Griswell +Griswold +Griswould +Grit +Gritman +Gritsch +Gritten +Gritton +Gritz +Grivas +Grivetti +Grivna +Grivno +Grix +Grizzaffi +Grizzard +Grizzel +Grizzell +Grizzle +Groat +Grob +Grobe +Grober +Groberg +Grobes +Grobmyer +Grobstein +Groby +Groce +Groceman +Groch +Grochmal +Grochow +Grochowski +Grocott +Grode +Grodecki +Groden +Groder +Grodi +Grodin +Grodski +Groeber +Groebner +Groehler +Groen +Groene +Groenendyk +Groeneveld +Groeneweg +Groening +Groenke +Groepper +Groesbeck +Groeschel +Groesser +Groetken +Groetsch +Grof +Groff +Groft +Grogan +Grogg +Groh +Grohman +Grohmann +Groholski +Grohoske +Grohowski +Grohs +Groleau +Groll +Grollimund +Grollman +Grom +Groman +Gromer +Gromley +Gromoll +Gron +Grona +Gronberg +Grondahl +Grondin +Groner +Gronert +Gronewald +Gronitz +Gronlund +Gronosky +Gronowski +Gronquist +Gronstal +Gronvall +Groody +Groom +Groombridge +Groome +Groomes +Grooms +Groos +Groot +Groote +Groover +Gropp +Gropper +Gros +Grosbier +Grosby +Grosch +Grosclaude +Groscost +Grose +Groseclose +Grosenick +Grosh +Groshans +Groshek +Groshong +Grosjean +Groskreutz +Grosky +Grosland +Grosman +Gross +Grossack +Grossberg +Grosse +Grossen +Grossenbacher +Grosser +Grossetete +Grossett +Grosshans +Grossi +Grossklaus +Grosskopf +Grosskreutz +Grossley +Grossman +Grossmann +Grossmeyer +Grossnickle +Grosso +Grosswiler +Grosvenor +Grosz +Groszkiewicz +Grotberg +Grote +Grotelueschen +Groth +Grothaus +Grothe +Grotheer +Grothen +Grothoff +Groton +Grotts +Grotz +Grotzinger +Grotzke +Groulx +Ground +Grounds +Groupe +Grout +Grove +Grover +Groves +Grovier +Grow +Growcock +Growden +Growell +Growney +Groys +Grriffin +Gruba +Grubaugh +Grubb +Grubba +Grubbs +Grube +Grubel +Gruben +Gruber +Grubman +Gruby +Gruca +Gruda +Grudem +Grudt +Grudzien +Grudzinski +Grueber +Gruell +Gruen +Gruenberg +Gruenes +Gruenewald +Gruenhagen +Gruening +Grueninger +Gruenwald +Gruesbeck +Grueser +Gruett +Gruger +Gruhlke +Gruhn +Gruiger +Gruis +Grulke +Grulkey +Grullon +Grum +Gruman +Grumbach +Grumbine +Grumbles +Grumbling +Grumer +Grumet +Grumney +Grun +Grunau +Grunberg +Grund +Grunden +Grunder +Grundhoefer +Grundman +Grundmann +Grundmeier +Grundon +Grundy +Grune +Gruner +Grunert +Grunewald +Grunin +Gruninger +Grunlien +Grunow +Grunst +Gruntz +Grunwald +Grupa +Grupe +Grupp +Gruse +Grusenmeyer +Grush +Gruska +Grussendorf +Grussing +Grustas +Gruters +Gruver +Gruwell +Gruz +Gruzinsky +Grybel +Gryder +Grygiel +Grymes +Gryniuk +Gryszowka +Grzebien +Grzegorek +Grzelak +Grzesiak +Grzesik +Grzyb +Grzybowski +Grzywacz +Grzywinski +Gschwend +Gschwind +Gsell +Gstohl +Gu +Guadagno +Guadagnolo +Guadalajara +Guadalupe +Guadarrama +Guadeloupe +Guadian +Guadiana +Guagenti +Guagliano +Guagliardo +Guajardo +Gualdoni +Gualtieri +Guaman +Guan +Guanche +Guandique +Guanio +Guard +Guardado +Guardarrama +Guardia +Guardian +Guardino +Guardiola +Guardipee +Guareno +Guariglia +Guariglio +Guarin +Guarini +Guarino +Guarisco +Guarnera +Guarneri +Guarnieri +Guarno +Guarracino +Guarriello +Guasp +Guastella +Guay +Guba +Gubala +Gubbins +Guberman +Gubernath +Gubin +Gubitosi +Gubler +Gubser +Gucciardi +Gucciardo +Guccione +Gucker +Guckes +Guckin +Gucman +Gucwa +Gudaitis +Gudat +Gude +Gudenkauf +Guderian +Guderjahn +Gudgel +Gudgell +Gudger +Gudiel +Gudinas +Gudino +Gudis +Gudmundson +Gudmundsson +Gudroe +Gue +Guebara +Guebert +Guecho +Guedea +Guedes +Guedesse +Guedjian +Guedry +Gueits +Guel +Guelespe +Guelff +Guell +Guella +Guelpa +Guemmer +Guempel +Guenette +Guenin +Gueningsman +Guenison +Guenther +Guenthner +Guenthur +Guerard +Guercio +Guereca +Guerena +Guerera +Guerero +Guererro +Gueretta +Guerette +Guerin +Guerini +Guerino +Guerinot +Guernsey +Guerra +Guerrant +Guerrazzi +Guerreiro +Guerrera +Guerrero +Guerrette +Guerrido +Guerrier +Guerrieri +Guerriero +Guerrini +Guerro +Guerrouxo +Guerry +Guers +Guertin +Guesman +Guess +Guest +Guetersloh +Gueth +Guethle +Guetierrez +Guevana +Guevara +Guevarra +Guevera +Guevin +Guffanti +Guffey +Guffin +Guffy +Gugel +Guger +Gugerty +Guggemos +Guggenheim +Gugino +Gugler +Guglielmi +Guglielmina +Guglielmo +Gugliotta +Gugliotti +Gugliuzza +Guhl +Guiab +Guialdo +Guiao +Guiberteau +Guice +Guichard +Guida +Guidaboni +Guiden +Guider +Guidera +Guidetti +Guidi +Guidice +Guido +Guidos +Guidotti +Guidrey +Guidroz +Guidry +Guieb +Guiel +Guier +Guiffre +Guiga +Guiggey +Guignard +Guiher +Guijarro +Guilbault +Guilbe +Guilbeau +Guilbeault +Guilbeaux +Guilbert +Guilboard +Guild +Guildford +Guile +Guiles +Guilfoil +Guilfoos +Guilford +Guilfoyle +Guilianelli +Guiliani +Guiliano +Guill +Guillama +Guillan +Guillary +Guillaume +Guillebeau +Guillemette +Guillen +Guillerault +Guillereault +Guillermo +Guillet +Guillette +Guilliam +Guilliams +Guillory +Guillot +Guillote +Guillotte +Guilmain +Guilmette +Guilstorf +Guiltner +Guimaraes +Guimares +Guimond +Guin +Guinan +Guinane +Guinasso +Guiney +Guinle +Guinn +Guinnip +Guinta +Guintanilla +Guinther +Guinto +Guinyard +Guion +Guirand +Guire +Guirgis +Guisbert +Guise +Guisinger +Guiski +Guisti +Guitano +Guitar +Guitard +Guiterez +Guiterrez +Guith +Guitian +Guitierez +Guitierrez +Guitreau +Guittar +Guittennez +Guitterez +Guity +Guizar +Gula +Gulan +Gularte +Gulati +Gulbraa +Gulbrandsen +Gulbrandson +Gulbransen +Gulbranson +Gulde +Guldemond +Gulden +Guldin +Guler +Guley +Gulick +Gulikers +Gulini +Gulino +Gulinson +Gulisano +Gulizio +Gulke +Gull +Gulla +Gullace +Gullage +Gullatt +Gullatte +Gulledge +Gullett +Gullette +Gulley +Gullick +Gullickson +Gulliksen +Gulling +Gullion +Gulliver +Gullixson +Gullo +Gullotta +Gullung +Gully +Gulnac +Gulnick +Gulotta +Gulston +Gulsvig +Gulyas +Gum +Gumaer +Gumb +Gumbel +Gumbert +Gumbs +Gumina +Gumm +Gummer +Gummersall +Gummersheimer +Gummo +Gump +Gumpert +Gumphrey +Gumprecht +Gums +Gumz +Gun +Gunagan +Gunawan +Gunby +Gundelach +Gunder +Gunderman +Gundersen +Gunderson +Gundert +Gundlach +Gundrum +Gundry +Gundy +Gungor +Gunia +Gunkel +Gunkelman +Gunlock +Gunn +Gunnarson +Gunnell +Gunnells +Gunnels +Gunner +Gunnerson +Gunnett +Gunning +Gunnoe +Gunselman +Gunsolley +Gunsolus +Gunst +Gunstream +Gunter +Gunterman +Guntert +Guntharp +Gunther +Gunthrop +Gunto +Guntrum +Gunyan +Gunyon +Gunzalez +Gunzelman +Gunzenhauser +Guo +Guoan +Guppy +Gupta +Guptill +Gupton +Gura +Gural +Guralnick +Gurecki +Gureczny +Gurevich +Gurganious +Gurganus +Guridi +Gurin +Guritz +Gurka +Gurke +Gurkin +Gurley +Gurne +Gurnee +Gurner +Gurnett +Gurney +Gurnsey +Gurr +Gurrad +Gurrero +Gurrieri +Gurrola +Gurry +Gurske +Gurski +Gursky +Gurtin +Gurtner +Gurule +Gurvine +Gurwell +Gurwitz +Gusa +Gusciora +Guse +Gusewelle +Gushard +Gushee +Gushi +Gushiken +Gushue +Gushwa +Guske +Gusky +Gusler +Gusman +Gusmar +Guss +Gussin +Gussler +Gussman +Gussow +Gust +Gustafson +Gustason +Gustave +Gustaveson +Gustavson +Guster +Gustin +Gustine +Gustis +Gustison +Gustitus +Gustovich +Gustus +Guszak +Gut +Gutches +Gutekunst +Gutenberg +Gutenberger +Gutenson +Guterman +Gutermuth +Guterrez +Guterriez +Gutgesell +Guth +Guthary +Gutherie +Guthmiller +Guthorn +Guthridge +Guthrie +Gutiennez +Gutieres +Gutierez +Gutierre +Gutierres +Gutierrex +Gutierrez +Gutirrez +Gutjahr +Gutkin +Gutknecht +Gutkowski +Gutman +Gutmann +Gutoski +Gutowski +Gutrerrez +Gutreuter +Gutsche +Gutschow +Gutshall +Gutt +Gutta +Guttenberg +Gutter +Gutteridge +Gutterman +Gutterrez +Guttery +Guttierez +Guttierrez +Gutting +Guttirez +Guttman +Guttmann +Guttormson +Gutzler +Gutzman +Gutzmann +Gutzmer +Gutzwiller +Guy +Guye +Guyer +Guyet +Guyett +Guyette +Guyll +Guymon +Guynes +Guynn +Guynup +Guyon +Guyot +Guyott +Guys +Guyton +Guz +Guzalak +Guzek +Guzewicz +Guzi +Guziak +Guziczek +Guziec +Guzik +Guzma +Guzman +Guzmdn +Guzon +Guzowski +Guzy +Guzzardo +Guzzetta +Guzzi +Guzzio +Guzzo +Gverrero +Gwalthney +Gwaltney +Gwartney +Gwathney +Gwenn +Gwillim +Gwilt +Gwin +Gwinn +Gwinner +Gwirtz +Gwozdz +Gwyn +Gwynes +Gwynn +Gyaki +Gyatso +Gyger +Gyles +Gyllenband +Gyllensten +Gysin +Gyurko +Gzym +Ha +Haab +Haaby +Haack +Haacke +Haaf +Haag +Haaga +Haage +Haagensen +Haak +Haake +Haakenson +Haakenstad +Haaker +Haakinson +Haaland +Haan +Haapala +Haar +Haare +Haarstad +Haas +Haasch +Haase +Haass +Haataja +Haaz +Habash +Habben +Habbs +Habbyshaw +Habeck +Habeeb +Habegger +Habel +Habenicht +Haber +Haberer +Haberern +Haberkamp +Haberkorn +Haberle +Haberman +Habermann +Habermehl +Habersham +Haberstroh +Habib +Habibi +Habicht +Habif +Habig +Habina +Habisch +Hable +Haboush +Habowski +Habrock +Haby +Hach +Hacher +Hachette +Hachey +Hachez +Hachigian +Hachting +Hack +Hackathorn +Hackbart +Hackbarth +Hackborn +Hacke +Hackel +Hacken +Hackenberg +Hackenbery +Hackenmiller +Hacker +Hackerd +Hackerott +Hackethal +Hackett +Hackey +Hackford +Hacking +Hackl +Hackle +Hackleman +Hackler +Hackley +Hackman +Hackmann +Hackmeyer +Hackner +Hackney +Hackshaw +Hackwell +Hackworth +Hacopian +Haczynski +Hada +Hadad +Hadaller +Hadaway +Hadcock +Haddad +Haddan +Haddaway +Hadden +Haddenham +Hadder +Haddick +Haddix +Haddock +Haddon +Haddow +Haddox +Hade +Hadef +Hadel +Haden +Hader +Hadesty +Hadfield +Hadges +Hadian +Hadiaris +Hadland +Hadler +Hadley +Hadlock +Hadnot +Hadnott +Hadsall +Hadsell +Hadson +Hadvab +Hadwin +Hady +Haeber +Haeck +Haeckel +Haecker +Haeder +Haefele +Haefner +Haegele +Haeger +Haehn +Haen +Haener +Haer +Haering +Haerr +Haertel +Haerter +Haese +Haessig +Haessler +Haessly +Haeuser +Haeussler +Hafele +Hafeman +Hafemeister +Hafen +Hafenbrack +Hafenstein +Hafer +Haferkamp +Haff +Hafferkamp +Haffey +Haffling +Haffner +Hafford +Haflett +Hafley +Hafner +Haft +Hafter +Haga +Hagadone +Hagadorn +Hagaman +Hagan +Hagans +Hagar +Hagarty +Hagberg +Hage +Hagebusch +Hagedorn +Hagee +Hagel +Hagele +Hagelgans +Hageman +Hagemann +Hagemeier +Hagemeyer +Hagen +Hagenbaugh +Hagenbrok +Hagenbuch +Hagene +Hagenhoff +Hagens +Hagenson +Hageny +Hager +Hagerman +Hagert +Hagerty +Hages +Hagey +Hagg +Haggan +Haggans +Haggar +Haggard +Haggart +Haggarty +Haggberg +Hagge +Haggen +Hagger +Haggermaker +Haggerton +Haggerty +Haggett +Haggin +Haggins +Haggis +Hagglund +Haggstrom +Haghighi +Hagie +Hagin +Hagins +Hagist +Hagle +Hagler +Hagley +Haglund +Hagmaier +Hagman +Hagmann +Hagner +Hagon +Hagood +Hagopian +Hagos +Hagstrom +Hague +Hagwell +Hagwood +Hagy +Hahl +Hahm +Hahn +Hahne +Hahner +Hahnert +Hahs +Hai +Haid +Haider +Haifa +Haifley +Haig +Haigh +Haight +Haigler +Haigwood +Haik +Hail +Haile +Hailes +Hailey +Hails +Hailstock +Hailstone +Haimes +Haims +Hain +Hainds +Haine +Hainer +Haines +Hainesworth +Hainey +Hainley +Hainline +Hains +Hainsey +Hainsworth +Hair +Haire +Hairell +Hairfield +Hairgrove +Hairr +Hairster +Hairston +Haislett +Haisley +Haislip +Haist +Haisten +Hait +Haith +Haithcock +Haitz +Hajdas +Hajduk +Hajdukiewicz +Hajek +Hakala +Hakanson +Hake +Hakeem +Hakel +Haken +Haker +Hakes +Hakey +Hakim +Hakimi +Hakimian +Hakkila +Hal +Halaas +Halaby +Halajian +Halaliky +Halama +Halas +Halasz +Halat +Halbach +Halberg +Halbershtam +Halberstam +Halbert +Halbritter +Halbrook +Halbrooks +Halbur +Halburnt +Halcom +Halcomb +Halcon +Halcott +Hald +Haldane +Haldeman +Halder +Halderman +Haldi +Haldiman +Hale +Haleamau +Halechko +Halek +Halen +Hales +Haley +Half +Halfacre +Halferty +Halfhill +Halfmann +Halford +Halgas +Halgren +Halgrimson +Haliburton +Halick +Halifax +Halik +Halim +Halima +Halk +Halko +Hall +Halla +Hallack +Hallada +Halladay +Hallahan +Hallam +Hallan +Hallas +Hallauer +Hallaway +Hallback +Hallberg +Hallczuk +Halle +Halleck +Hallee +Halleen +Hallemeyer +Hallenbeck +Haller +Hallerman +Hallet +Hallett +Halley +Hallford +Hallgren +Halliburton +Hallick +Halliday +Hallie +Halligan +Hallihan +Halliman +Hallin +Hallinan +Halling +Hallinger +Hallio +Hallisey +Halliwell +Hallman +Hallmark +Hallmon +Hallo +Hallock +Halloran +Halloway +Hallowell +Hallowich +Hallquist +Halls +Hallstead +Hallstrom +Hallum +Hallums +Hally +Halm +Halma +Halman +Halmes +Halmick +Halmstead +Halnon +Halo +Halon +Halonen +Halpain +Halpainy +Halper +Halperin +Halpern +Halpert +Halphen +Halpin +Halprin +Hals +Halsall +Halse +Halsell +Halsema +Halseth +Halsey +Halstead +Halsted +Halston +Halstrom +Halt +Halter +Halterman +Haltiwanger +Haltom +Halton +Haluska +Halverson +Halvorsen +Halvorson +Halward +Halwick +Halwood +Halyk +Ham +Hamacher +Hamad +Hamada +Hamai +Hamaker +Hamalainen +Hamalak +Hamamoto +Haman +Hamann +Hamano +Hamar +Hamara +Hamasaki +Hamb +Hambelton +Hamberg +Hamberger +Hamberlin +Hamberry +Hamblen +Hamblet +Hambleton +Hambley +Hamblin +Hambly +Hamborsky +Hambrecht +Hambric +Hambrick +Hambright +Hamburg +Hamburger +Hamby +Hamdan +Hamden +Hamdn +Hamed +Hameen +Hameister +Hamel +Hamelin +Hamelinck +Hamelton +Hamer +Hamernik +Hamers +Hamersly +Hames +Hamett +Hamff +Hamic +Hamid +Hamidi +Hamiel +Hamil +Hamill +Hamiltan +Hamilton +Hamiss +Hamiter +Hamiton +Hamler +Hamlet +Hamlett +Hamlette +Hamley +Hamlin +Hamling +Hamm +Hammacher +Hammack +Hammaker +Hamman +Hammang +Hammann +Hammans +Hammar +Hammargren +Hammarlund +Hammatt +Hamme +Hammed +Hammel +Hammell +Hammen +Hammer +Hammeren +Hammerle +Hammerlund +Hammerly +Hammerman +Hammers +Hammerschmidt +Hammersley +Hammersmith +Hammerstad +Hammerstein +Hammerstone +Hammerstrom +Hammes +Hammet +Hammett +Hammette +Hammill +Hamming +Hammitt +Hammock +Hammon +Hammond +Hammonds +Hammons +Hammontree +Hammrich +Hamn +Hamner +Hamnon +Hamolik +Hamon +Hamonds +Hamons +Hamontree +Hamor +Hamp +Hamparian +Hampe +Hampel +Hamper +Hample +Hampon +Hampshire +Hampson +Hampton +Hamra +Hamre +Hamric +Hamrick +Hams +Hamsher +Hamsik +Hamson +Hamstra +Hamway +Hamza +Hamzik +Han +Hanacek +Hanafan +Hanafin +Hanagami +Hanagan +Hanahan +Hanan +Hanauer +Hanavan +Hanawalt +Hanaway +Hanback +Hanberg +Hanberry +Hanbury +Hanby +Hance +Hancey +Hancher +Hanchett +Hancin +Hancock +Hancox +Hand +Handal +Handcock +Handel +Handeland +Handelman +Handelsman +Handerson +Handford +Handin +Handing +Handke +Handkins +Handler +Handley +Handlin +Handly +Handon +Handren +Handrick +Hands +Handsaker +Handschumaker +Handshaw +Handshoe +Handsom +Handsome +Handt +Handville +Handwerk +Handwerker +Handy +Handzel +Handzlik +Hane +Hanebutt +Hanegan +Hanek +Hanekamp +Haneke +Hanel +Haneline +Hanemann +Hanenberger +Hanenkrat +Haner +Hanes +Haney +Hanf +Hanford +Hanft +Hang +Hangartner +Hanger +Hanhan +Hanhardt +Hanible +Hanifan +Hanify +Hanigan +Haning +Hanington +Hanis +Hanisch +Hanisco +Hanisko +Hank +Hanke +Hankel +Hanken +Hankerson +Hankey +Hankin +Hankins +Hankinson +Hankison +Hankla +Hanko +Hanks +Hanle +Hanley +Hanlin +Hanline +Hanlon +Hanly +Hanmer +Hanmore +Hann +Hanna +Hannafin +Hannaford +Hannagan +Hannah +Hannahs +Hannam +Hannaman +Hannan +Hannasch +Hannawalt +Hannaway +Hannay +Hannegan +Hanneken +Hannem +Hanneman +Hannemann +Hannen +Hanner +Hanners +Hannes +Hanney +Hanni +Hannibal +Hannifan +Hannig +Hannigan +Hanninen +Hanning +Hanno +Hannold +Hannon +Hanns +Hannula +Hannum +Hano +Hanoa +Hanock +Hanohano +Hanoharo +Hanold +Hanover +Hanrahan +Hanrath +Hanry +Hans +Hansard +Hansberger +Hansberry +Hansbrough +Hansbury +Hansch +Hansche +Hanscom +Hansel +Hansell +Hanselman +Hansen +Hanser +Hanserd +Hanses +Hansford +Hanshaw +Hanshew +Hansil +Hansing +Hansis +Hansley +Hansman +Hansmann +Hansome +Hanson +Hansrote +Hansson +Hansteen +Hanstein +Hanstine +Hant +Hanten +Hanthorn +Hantman +Hanton +Hantula +Hantz +Hantzarides +Hanus +Hanusey +Hanvey +Hanville +Hanway +Hanz +Hanzel +Hanzely +Hanzl +Hanzlik +Hao +Hape +Hapeman +Haper +Hapgood +Hapke +Happ +Happe +Happel +Happenny +Happer +Happney +Haptonstall +Haq +Haque +Har +Hara +Harabedian +Harada +Harader +Haraguchi +Harajli +Harajly +Haraldson +Haralson +Haramoto +Haran +Harang +Harapat +Harari +Harary +Haraway +Harb +Harbach +Harbater +Harbaugh +Harbeck +Harben +Harber +Harbert +Harbeson +Harbick +Harbin +Harbinson +Harbison +Harbold +Harbolt +Harbor +Harborth +Harbottle +Harbough +Harbour +Harbuck +Harbus +Harby +Harcar +Harcey +Harcharik +Harclerode +Harcourt +Harcrow +Harcum +Harcus +Hard +Hardacre +Hardage +Hardaker +Hardaman +Hardan +Hardaway +Hardcastle +Harde +Hardebeck +Hardee +Hardegree +Hardel +Hardell +Hardeman +Hardemon +Harden +Hardenbrook +Hardenburg +Harder +Harderman +Harders +Hardester +Hardesty +Hardey +Hardge +Hardges +Hardgrave +Hardgrove +Hardi +Hardie +Hardigan +Hardigree +Hardiman +Hardimon +Hardin +Hardina +Hardine +Harding +Hardinger +Hardinson +Hardison +Hardister +Hardisty +Hardman +Hardmon +Hardnett +Hardnette +Hardney +Hardon +Hardrick +Hardrict +Hardridge +Hards +Hardsock +Hardt +Hardter +Hardung +Hardway +Hardwick +Hardy +Hardyman +Hare +Harell +Harelson +Haren +Harens +Harer +Harewood +Harfert +Harford +Hargenrader +Hargens +Harger +Hargers +Harges +Hargest +Hargett +Hargis +Hargitt +Hargrave +Hargraves +Hargreaves +Hargroder +Hargrove +Hargrow +Hargus +Harian +Harig +Haring +Harington +Hariri +Haris +Harison +Hariston +Harjo +Harjochee +Harju +Hark +Harkavy +Harkcom +Harke +Harkema +Harken +Harkenreader +Harker +Harkey +Harkin +Harkins +Harkleroad +Harklerode +Harkless +Harkley +Harkness +Harkrader +Harkrider +Harl +Harlan +Harland +Harle +Harlee +Harlem +Harleman +Harles +Harless +Harleston +Harley +Harlin +Harling +Harloff +Harlor +Harlow +Harlowe +Harlston +Harm +Harman +Harmann +Harmen +Harmening +Harmer +Harmeson +Harmeyer +Harmison +Harmon +Harmond +Harms +Harmsen +Harn +Harnack +Harnage +Harnan +Harnar +Harnden +Harne +Harned +Harner +Harnes +Harness +Harnett +Harney +Harnisch +Harnish +Harnist +Harnly +Harnois +Harnos +Harns +Haro +Harold +Haroldsen +Haroldson +Harootunian +Haros +Harouff +Haroun +Haroutunian +Harp +Harpe +Harpel +Harper +Harpham +Harpin +Harpine +Harpold +Harpole +Harpool +Harps +Harpst +Harpster +Harr +Harraden +Harradine +Harradon +Harrah +Harral +Harrald +Harralson +Harre +Harrel +Harrell +Harrellson +Harrelson +Harren +Harrer +Harres +Harrett +Harrey +Harriage +Harrier +Harries +Harriet +Harriett +Harrigan +Harriger +Harrigill +Harrigton +Harrill +Harriman +Harring +Harrington +Harriott +Harris +Harrison +Harrisow +Harriss +Harrist +Harriston +Harritt +Harrod +Harrold +Harrop +Harroun +Harrow +Harrower +Harry +Harryman +Harsch +Harsey +Harsh +Harsha +Harshaw +Harshbarger +Harshberger +Harshfield +Harshman +Harsin +Harstad +Harston +Harsy +Hart +Hartage +Harte +Harteau +Hartel +Harten +Hartenstein +Harter +Hartert +Hartery +Hartfiel +Hartfield +Hartford +Hartgerink +Hartgrave +Hartgraves +Hartgrove +Harth +Harthcock +Harthorne +Harthun +Hartig +Hartigan +Hartill +Hartin +Harting +Hartinger +Hartis +Hartje +Hartjen +Hartke +Hartkopf +Hartl +Hartlage +Hartle +Hartleben +Hartlein +Hartlen +Hartlep +Hartless +Hartley +Hartline +Hartling +Hartly +Hartman +Hartmann +Hartnell +Hartness +Hartnett +Hartney +Hartog +Harton +Hartong +Hartory +Hartpence +Hartquist +Hartranft +Hartrick +Hartrum +Hartry +Harts +Hartsch +Hartse +Hartsell +Hartsfield +Hartshorn +Hartshorne +Hartsock +Hartsoe +Hartson +Hartsook +Hartsough +Hartstein +Hartt +Hartung +Hartup +Hartvigsen +Hartwell +Hartwick +Hartwig +Hartwigsen +Harty +Hartz +Hartzell +Hartzer +Hartzfeld +Hartzheim +Hartzler +Hartzo +Hartzog +Haruta +Harutunian +Harvard +Harvat +Harvath +Harvel +Harvell +Harver +Harvest +Harvey +Harvick +Harvie +Harvilchuck +Harvilicz +Harvill +Harvilla +Harville +Harvin +Harvison +Harviston +Harvley +Harward +Harwell +Harwick +Harwin +Harwood +Has +Hasak +Hasan +Hasas +Hasbell +Hasberry +Hasbni +Hasbrouck +Hascall +Hasch +Haschke +Hascup +Hase +Hasegawa +Hasek +Haselden +Haselhorst +Haselhuhn +Haseloff +Haseltine +Haselton +Haseman +Hasen +Hasenauer +Hasenbeck +Hasenberg +Hasencamp +Hasenfratz +Hasenfuss +Haser +Hasfjord +Hasgill +Hash +Hasha +Hashaway +Hashbarger +Hashem +Hashim +Hashimoto +Hashmi +Haskamp +Haske +Haskel +Haskell +Hasker +Haskett +Haskew +Haskin +Haskins +Hasko +Haskovec +Haslam +Haslem +Hasler +Haslett +Hasley +Haslinger +Haslip +Haspel +Hasper +Hass +Hassan +Hassanein +Hassard +Hasse +Hassel +Hasselbarth +Hasselkus +Hassell +Hasselman +Hasselvander +Hassen +Hassenfritz +Hassenger +Hassenplug +Hassett +Hassey +Hassian +Hassick +Hassig +Hassin +Hassing +Hassinger +Hassler +Hasson +Hasstedt +Haste +Hastedt +Hasten +Hastert +Hastie +Hastin +Hasting +Hastings +Haston +Hasty +Haswell +Hasychak +Hatada +Hatake +Hatala +Hataway +Hatch +Hatchcock +Hatchel +Hatchell +Hatcher +Hatcherson +Hatchet +Hatchett +Hatchette +Hatchitt +Hatfield +Hathaway +Hathcoat +Hathcock +Hathcox +Hatherly +Hatheway +Hathorn +Hathorne +Hathway +Hatke +Hatlee +Hatler +Hatley +Hatmaker +Hatman +Hatori +Hatridge +Hatstat +Hatt +Hatta +Hattabaugh +Hattan +Hattaway +Hatten +Hattenbach +Hatter +Hatteyer +Hattier +Hattley +Hattman +Hatto +Hatton +Hattori +Hattub +Hatzell +Hatzenbihler +Hatzenbuehler +Hatzenbuhler +Hau +Hauan +Haub +Hauben +Hauber +Haubert +Haubner +Haubold +Haubrich +Haubrick +Hauch +Hauck +Hauenstein +Hauer +Hauersperger +Hauf +Hauff +Hauffe +Haufler +Haug +Haugaard +Haugabrook +Hauge +Haugen +Hauger +Haugh +Haughey +Haughn +Haughney +Haught +Haughton +Haugland +Haugrud +Hauk +Haukaas +Hauke +Haulbrook +Hauley +Haulk +Haulter +Hauman +Haumesser +Haun +Haupert +Haupt +Hauptly +Hauptman +Hauptmann +Haurin +Haury +Haus +Hausam +Hausauer +Hauschild +Hauschildt +Hause +Hausen +Hauser +Haushalter +Hausher +Hauskins +Hausladen +Hauslein +Hausler +Hausman +Hausmann +Hausner +Hausrath +Hauss +Hausteen +Haustein +Hauswald +Haut +Hautala +Hautamaki +Hautan +Hauth +Hauxwell +Hauze +Havard +Havas +Havatone +Havekost +Havel +Havelka +Havely +Haveman +Haven +Havener +Havenhill +Havens +Haver +Havercroft +Haverfield +Haverkamp +Haverland +Haverly +Havermale +Havermann +Havers +Haverstick +Haverstock +Haverty +Havey +Havice +Havier +Haviland +Havir +Havis +Havlicek +Havlick +Havlik +Havlin +Havnen +Havner +Haw +Haward +Hawbaker +Hawe +Hawelu +Hawes +Hawf +Hawk +Hawke +Hawken +Hawker +Hawkes +Hawkey +Hawkin +Hawkinberry +Hawking +Hawkings +Hawkins +Hawkinson +Hawks +Hawksley +Hawley +Hawman +Hawn +Haworth +Hawrylak +Haws +Hawse +Hawthorn +Hawthorne +Hawthrone +Hawver +Haxby +Haxton +Hay +Haya +Hayakawa +Hayase +Hayashi +Hayashida +Hayball +Haybarger +Hayburn +Haycock +Haycook +Haycraft +Haydal +Haydel +Hayden +Haydock +Haydon +Haydt +Haydu +Hayduk +Haye +Hayek +Hayenga +Hayer +Hayertz +Hayes +Hayford +Haygood +Hayhoe +Hayhurst +Hayles +Haylett +Haylock +Haymaker +Hayman +Haymans +Haymer +Haymes +Haymon +Haymond +Haymore +Hayn +Haynam +Hayne +Hayner +Haynes +Haynesworth +Haynie +Haynsworth +Hayoz +Hayre +Hays +Haysbert +Hayse +Hayslett +Hayslip +Hayter +Hayth +Hayton +Hayward +Haywood +Hayword +Hayworth +Hayzlett +Haza +Hazan +Hazard +Hazarika +Hazekamp +Hazel +Hazelbaker +Hazelbush +Hazelett +Hazelgrove +Hazelhurst +Hazelip +Hazell +Hazelrig +Hazelrigg +Hazeltine +Hazelton +Hazelwood +Hazen +Hazer +Hazim +Hazinski +Hazle +Hazlegrove +Hazleton +Hazlett +Hazlewood +Hazley +Hazlip +Hazlitt +Hazouri +Hazy +Hazzard +He +Heaberlin +Heacock +Heacox +Head +Headd +Heade +Headen +Heading +Headings +Headington +Headlam +Headland +Headlee +Headley +Headlon +Headly +Headman +Headrick +Heads +Heady +Heafey +Heafner +Heagany +Heagle +Heagney +Heagy +Heaivilin +Heal +Healan +Heald +Healey +Heally +Healy +Heam +Hean +Heaney +Heang +Heany +Heap +Heape +Heaphy +Heaps +Heard +Heare +Hearin +Hearing +Hearl +Hearn +Hearne +Hearnen +Hearns +Hearnsberger +Hearon +Hearron +Hearson +Hearst +Hearston +Heart +Heartley +Heartsill +Heartz +Heaslet +Heasley +Heaslip +Heaston +Heater +Heath +Heathcock +Heathcote +Heather +Heatherington +Heatherly +Heathershaw +Heatherton +Heathman +Heatley +Heatly +Heaton +Heatwole +Heavener +Heaviland +Heavilin +Heavin +Heavner +Heavrin +Hebard +Hebb +Hebblethwaite +Hebda +Hebden +Hebdon +Hebeisen +Hebel +Hebenstreit +Heber +Heberer +Heberle +Heberlein +Heberling +Heberly +Hebert +Hebets +Hebig +Hebner +Hebrank +Hebrard +Hebron +Hebsch +Hechinger +Hechmer +Hecht +Heck +Heckaman +Heckard +Heckart +Heckathorn +Heckathorne +Heckbert +Hecke +Heckel +Heckenberg +Heckendorf +Hecker +Heckerman +Heckers +Heckert +Heckford +Heckle +Heckler +Heckman +Heckmann +Heckstall +Hecox +Hect +Hector +Hedberg +Hedden +Hedding +Heddins +Heddleson +Heddlesten +Hedeen +Hedegaard +Hedegore +Hedeiros +Hedemann +Hedge +Hedgebeth +Hedgecock +Hedgepath +Hedgepeth +Hedger +Hedges +Hedgespeth +Hedglin +Hedgpeth +Hediger +Hedin +Hedinger +Hedler +Hedley +Hedlund +Hedman +Hedon +Hedquist +Hedrich +Hedrick +Hedrington +Hedrix +Hedspeth +Hedstrom +Hedtke +Hee +Heebner +Heebsh +Heefner +Heeg +Heelan +Heemstra +Heenan +Heeney +Heep +Heer +Heeralall +Heerdt +Heeren +Heerkes +Heern +Heers +Heersink +Heery +Heesch +Heese +Heeter +Heeth +Hefel +Heffelbower +Heffelfinger +Hefferan +Hefferman +Heffern +Heffernan +Heffernen +Hefferon +Heffington +Heffler +Heffley +Hefflinger +Heffner +Heffren +Heffron +Hefler +Hefley +Heflin +Hefner +Heft +Hefter +Hefti +Hefty +Hegan +Hegarty +Hegdahl +Hege +Hegedus +Hegel +Hegeman +Hegener +Heger +Hegg +Heggan +Hegge +Heggen +Heggestad +Heggie +Heggins +Heggood +Heggs +Hegland +Heglar +Hegler +Heglin +Heglund +Hegmann +Hegna +Hegner +Hegre +Hegstad +Hegwer +Hegwood +Hegyi +Hehir +Hehl +Hehn +Heholt +Hehr +Heibel +Heiberg +Heiberger +Heibult +Heichel +Heick +Heid +Heidbreder +Heide +Heidebrecht +Heidebrink +Heidecker +Heidel +Heidelberg +Heidelberger +Heidelburg +Heidema +Heideman +Heidemann +Heiden +Heidenescher +Heidenreich +Heider +Heiderman +Heidgerken +Heidi +Heidinger +Heidkamp +Heidler +Heidmann +Heidorn +Heidrich +Heidrick +Heidt +Heidtbrink +Heidtke +Heidtman +Heier +Heiermann +Heifner +Heigh +Height +Heigl +Heiken +Heikes +Heikkila +Heikkinen +Heil +Heilbron +Heilbrun +Heileman +Heiler +Heilig +Heiliger +Heilman +Heilmann +Heim +Heiman +Heimann +Heimark +Heimbach +Heimbaugh +Heimbigner +Heimbuch +Heimburger +Heimer +Heimerdinger +Heimerl +Heimlich +Heimlicher +Heimrich +Heims +Heimsness +Heimsoth +Hein +Heinandez +Heinbach +Heinbaugh +Heindel +Heindl +Heine +Heineck +Heinecke +Heineken +Heineman +Heinemann +Heinemeyer +Heinen +Heiner +Heines +Heiney +Heingartner +Heinicke +Heinig +Heiniger +Heininger +Heinis +Heinitz +Heinke +Heinl +Heinle +Heinlein +Heinlen +Heinly +Heino +Heinold +Heinonen +Heinrich +Heinricher +Heinrichs +Heinritz +Heins +Heinsohn +Heintz +Heintzelman +Heintzman +Heiny +Heinz +Heinze +Heinzelman +Heinzen +Heinzerling +Heinzig +Heinzle +Heinzman +Heinzmann +Heiple +Heir +Heird +Heirendt +Heiro +Heisdorffer +Heise +Heisel +Heiser +Heiserman +Heisey +Heishman +Heising +Heisinger +Heiskell +Heisler +Heisner +Heiss +Heisse +Heisser +Heisserer +Heist +Heistand +Heister +Heit +Heitbrink +Heitger +Heither +Heiting +Heitkamp +Heitland +Heitman +Heitmann +Heitmeyer +Heitmuller +Heitner +Heitschmidt +Heitz +Heitzman +Heitzmann +Heizer +Heizman +Hejl +Hejny +Hekman +Hektner +Helaire +Helander +Helberg +Helbert +Helbig +Helbing +Helble +Helbling +Held +Helde +Heldenbrand +Helder +Helderman +Heldman +Heldreth +Heldt +Hele +Helem +Helems +Helen +Helena +Helf +Helfen +Helfenbein +Helfenstein +Helfer +Helfert +Helferty +Helfgott +Helfin +Helfinstine +Helfrey +Helfrich +Helfrick +Helfritz +Helgaas +Helgager +Helgason +Helger +Helgerman +Helgerson +Helgert +Helgesen +Helgeson +Helget +Helgren +Helie +Helin +Heline +Heling +Helke +Helker +Hellams +Helland +Hellar +Hellard +Hellberg +Helle +Hellen +Hellenbrand +Heller +Hellerman +Helley +Hellgren +Hellickson +Helling +Hellinger +Hellings +Helliwell +Hellman +Hellmann +Hellmich +Hellmuth +Hellner +Hellriegel +Hellstrom +Hellums +Hellweg +Hellwig +Hellyer +Helm +Helman +Helmbrecht +Helmbright +Helmcamp +Helmen +Helmer +Helmers +Helmert +Helmes +Helmich +Helmick +Helmig +Helminiak +Helmink +Helmkamp +Helmke +Helmle +Helmlinger +Helmly +Helms +Helmsing +Helmstetler +Helmstetter +Helmus +Helmuth +Helmy +Helo +Helom +Helowicz +Helper +Helphenstine +Helphinstine +Helquist +Helscher +Helsel +Helser +Helseth +Helsey +Helsing +Helsley +Helson +Helstad +Helstrom +Helt +Helton +Heltsley +Heltzel +Helverson +Helveston +Helvey +Helvie +Helvik +Helvy +Helweg +Helwick +Helwig +Helzer +Hem +Hema +Heman +Hemanes +Hemani +Hemann +Hemans +Hemauer +Hemberger +Hembre +Hembree +Hembrey +Hembrough +Hembry +Hemby +Hemenway +Hemeon +Hemerly +Hemesath +Hemeyer +Heming +Heminger +Hemingway +Heminover +Hemish +Hemken +Hemker +Hemlepp +Hemler +Hemley +Hemm +Hemmann +Hemme +Hemmeke +Hemmelgarn +Hemmen +Hemmer +Hemmerling +Hemmert +Hemmes +Hemmeter +Hemmie +Hemmig +Hemming +Hemminger +Hemmings +Hemmingsen +Hemmingway +Hemon +Hemond +Hemp +Hempe +Hempel +Hemperley +Hempfling +Hemphill +Hemple +Hempstead +Hempton +Hemric +Hemrich +Hemrick +Hemry +Hemsath +Hemsley +Hemstreet +Hemsworth +Henagan +Henaire +Henandez +Henao +Henard +Henault +Henby +Hence +Hench +Hencheck +Henchel +Hencken +Hendee +Hendel +Hender +Hendericks +Henderickson +Henderlight +Henderlite +Henderosn +Hendershot +Hendershott +Henderso +Henderson +Hendeson +Hendler +Hendley +Hendon +Hendren +Hendrick +Hendricks +Hendricksen +Hendrickson +Hendrickx +Hendrics +Hendrie +Hendrik +Hendriks +Hendrikson +Hendrix +Hendrixson +Hendron +Hendry +Hendryx +Hendsbee +Hendson +Hendy +Henebry +Henedia +Henegan +Henegar +Henehan +Henein +Heneisen +Henerson +Henery +Henesey +Heney +Henfling +Heng +Hengel +Hengen +Henges +Henggeler +Hengl +Hengst +Henifin +Henig +Henigan +Heningburg +Heninger +Henington +Henion +Henjes +Henk +Henke +Henkel +Henken +Henkensiefken +Henkes +Henkey +Henkhaus +Henkin +Henkle +Henle +Henley +Henline +Henly +Henman +Henn +Hennagin +Hennagir +Hennard +Henne +Henneberg +Henneberger +Henneberry +Hennecke +Hennegan +Henneke +Henneman +Hennemann +Hennen +Hennes +Henness +Hennessee +Hennessey +Hennessy +Hennesy +Henney +Hennick +Hennies +Hennig +Hennigan +Henniger +Hennigh +Hennighausen +Henning +Henninger +Hennings +Henningsen +Henningson +Hennington +Hennis +Hennon +Henretta +Henrey +Henri +Henrich +Henrichs +Henrichsen +Henrick +Henricks +Henricksen +Henrickson +Henrie +Henriguez +Henriksen +Henrikson +Henriques +Henriquez +Henrity +Henry +Henscheid +Henschel +Henschen +Henschke +Hensdill +Hense +Hensel +Henseler +Hensen +Henshall +Henshaw +Hensle +Henslee +Hensler +Hensley +Henslin +Henson +Henstrom +Henter +Hentges +Henthorn +Henthorne +Henton +Hentrich +Hentschel +Hentz +Hentze +Henwood +Henze +Henzel +Henzler +Heon +Hepa +Hepburn +Hepfer +Hepker +Hepler +Hepner +Hepp +Heppding +Heppe +Heppeard +Heppel +Heppell +Hepper +Hepperly +Heppert +Heppler +Heppner +Heptinstall +Hepworth +Hequembourg +Her +Hera +Heral +Herald +Herandez +Herard +Heras +Heraty +Herauf +Herb +Herbein +Herbel +Herber +Herbers +Herbert +Herbick +Herbig +Herbin +Herbison +Herbold +Herbolsheimer +Herbst +Herbster +Herby +Herceg +Hercher +Hercman +Hercules +Herd +Herda +Herder +Herdes +Herdman +Herdon +Herdt +Hereda +Heredia +Hereford +Herek +Herem +Herena +Herendeen +Herera +Hererra +Hereth +Herford +Herforth +Hergenrader +Hergenreter +Hergenroeder +Hergert +Herget +Heriford +Herimann +Hering +Herington +Heritage +Herke +Herkel +Herkenratt +Herkert +Herklotz +Herkstroeter +Herl +Herley +Herlihy +Herline +Herling +Herlocker +Herlong +Herman +Hermance +Hermandez +Hermann +Hermanns +Hermanowicz +Hermans +Hermansen +Hermanson +Hermanstorfer +Hermenau +Hermenegildo +Hermens +Hermes +Hermez +Hermida +Hermie +Hermon +Hermosilla +Hermosillo +Hermosura +Herms +Hermsen +Hermus +Hern +Hernadez +Hernan +Hernanadez +Hernandaz +Hernande +Hernander +Hernanders +Hernandes +Hernandez +Hernando +Hernandz +Hernanez +Herndon +Herne +Herner +Hernon +Hernton +Herny +Hero +Herod +Herold +Heroman +Heron +Heronemus +Heroth +Herout +Heroux +Herpich +Herpolsheimer +Herr +Herra +Herrada +Herran +Herrand +Herrandez +Herrara +Herrarte +Herrboldt +Herre +Herrea +Herrel +Herrell +Herren +Herrera +Herreras +Herrero +Herres +Herriage +Herrick +Herridge +Herrig +Herriges +Herriman +Herrin +Herring +Herrington +Herrion +Herriot +Herriott +Herritt +Herrlich +Herrling +Herrman +Herrmann +Herrnandez +Herrod +Herrold +Herron +Herrud +Herry +Hersberger +Hersch +Herschaft +Herschel +Herschell +Herschelman +Herscher +Hersey +Hersh +Hersha +Hershaw +Hershberg +Hershberger +Hershelman +Hershenson +Hershey +Hershfield +Hershkop +Hershkowitz +Hershman +Hershnowitz +Herskovic +Herskovits +Hersman +Hersom +Herson +Herstad +Herston +Hert +Herta +Hertel +Hertenstein +Herter +Herth +Herting +Hertle +Hertlein +Hertler +Hertweck +Hertz +Hertzberg +Hertzel +Hertzler +Hertzog +Hervert +Hervey +Hervig +Hervol +Herwehe +Herwig +Herwood +Heryford +Herz +Herzberg +Herzberger +Herzbrun +Herzer +Herzfeld +Herzig +Herzing +Herzog +Hesby +Hesch +Heschke +Hescock +Hesford +Hesketh +Heskett +Heslep +Hesler +Hesley +Heslin +Heslop +Hespe +Hespen +Hess +Hesse +Hessee +Hessel +Hesselbach +Hesselbein +Hesselink +Hessell +Hesselman +Hesselrode +Hesselschward +Hesseltine +Hessenthaler +Hesser +Hessey +Hessian +Hessing +Hession +Hessler +Hessling +Hessman +Hesson +Hessong +Hestand +Hester +Hesterly +Hesterman +Hesters +Heston +Hetcher +Hetchman +Heter +Heth +Hethcote +Hethcox +Hetherington +Hetherman +Hetjonk +Hetland +Hetling +Hetrick +Hetsler +Hett +Hettenhausen +Hettes +Hettich +Hettinga +Hettinger +Hettler +Hettrick +Hettwer +Hetu +Hetz +Hetzel +Hetzer +Hetzler +Heu +Heuangvilay +Heuberger +Heubusch +Heuck +Heuer +Heuett +Heugel +Heuman +Heumann +Heung +Heupel +Heuring +Heuschkel +Heusel +Heuser +Heusinkveld +Heusley +Heusner +Heutmaker +Heuvelmann +Heuwinkel +Heverin +Heverley +Heverly +Hevessy +Hevesy +Hevey +Hevia +Hevner +Hevrin +Hevron +Hew +Heward +Hewatt +Hewell +Hewes +Hewett +Hewey +Hewgley +Hewins +Hewitt +Hewko +Hewlett +Hewlin +Hews +Hewson +Heximer +Hey +Heybrock +Heyd +Heyde +Heydel +Heyden +Heydenreich +Heydt +Heyduck +Heye +Heyen +Heyer +Heyes +Heying +Heykoop +Heyl +Heyliger +Heyman +Heymann +Heyn +Heyne +Heynen +Heys +Heyser +Heyveld +Heyward +Heywood +Heziak +Hiatt +Hibbard +Hibben +Hibberd +Hibbert +Hibbets +Hibbetts +Hibbits +Hibbitt +Hibbitts +Hibble +Hibbler +Hibbs +Hibdon +Hibert +Hibl +Hibler +Hibley +Hibma +Hibner +Hibshman +Hice +Hichens +Hiciano +Hick +Hickam +Hickel +Hicken +Hickenbottom +Hickernell +Hickerson +Hickert +Hickethier +Hickey +Hickie +Hickinbotham +Hickingbotham +Hickingbottom +Hickle +Hickley +Hicklin +Hickling +Hickman +Hickmon +Hickock +Hickok +Hickonbottom +Hickory +Hickox +Hicks +Hickson +Hickton +Hidaka +Hidalgo +Hiday +Hidde +Hidden +Hides +Hidinger +Hidrogo +Hidvegi +Hidy +Hieatt +Hieb +Hieber +Hiebert +Hiedeman +Hiefnar +Hielscher +Hiemer +Hiemstra +Hiens +Hier +Hierholcer +Hierholzer +Hieronymus +Hierro +Hiers +Hiersche +Hieserich +Hiestand +Hiester +Hietala +Hiett +Higa +Higaneda +Higashi +Higashida +Higbee +Higbie +Higby +Higdon +Higgason +Higgenbotham +Higgenbottom +Higgens +Higgin +Higginbotham +Higginbothan +Higginbottom +Higgins +Higginson +Higgons +Higgs +High +Higham +Highbaugh +Highberger +Highers +Highfield +Highfill +Highland +Highley +Highman +Highnote +Highshaw +Highsmith +Hight +Hightower +Hightree +Hightshoe +Higinbotham +Higle +Higley +Higman +Higney +Hignight +Hignite +Higson +Higuchi +Higuera +Higueros +Higy +Hija +Hikel +Hikes +Hila +Hilado +Hilaire +Hiland +Hilario +Hilb +Hilbert +Hilbig +Hilbner +Hilborn +Hilbrand +Hilbun +Hilburn +Hilby +Hilcher +Hilchey +Hild +Hilda +Hildago +Hildahl +Hilde +Hildebrand +Hildebrandt +Hildebrant +Hilden +Hildenbrand +Hilderbrand +Hilderbrandt +Hilderman +Hildesheim +Hilding +Hildinger +Hildman +Hildner +Hildred +Hildreth +Hildring +Hile +Hileman +Hiler +Hiles +Hiley +Hilferty +Hilfiger +Hilfiker +Hilgefort +Hilgeman +Hilgendorf +Hilger +Hilgers +Hilgert +Hilk +Hilke +Hilker +Hilkert +Hill +Hilla +Hillabush +Hillaire +Hillan +Hillanbrand +Hilland +Hillard +Hillary +Hillberry +Hillbrant +Hillburg +Hille +Hilleary +Hillebrand +Hillebrandt +Hillebrano +Hillegas +Hillegass +Hilleman +Hillen +Hillenbrand +Hiller +Hillered +Hillerman +Hillers +Hillerud +Hillery +Hilles +Hillesheim +Hillesland +Hillestad +Hilley +Hillhouse +Hillian +Hilliard +Hillie +Hillier +Hilliker +Hillin +Hilling +Hillis +Hillman +Hillmer +Hillock +Hills +Hillseth +Hillsgrove +Hillsman +Hillstrom +Hillwig +Hillyard +Hillyer +Hilman +Hilmer +Hilmes +Hilo +Hilovsky +Hilpert +Hilsabeck +Hilscher +Hilse +Hilsenbeck +Hilsendager +Hilser +Hilsgen +Hilsinger +Hilson +Hilst +Hilstad +Hilston +Hilt +Hiltbrand +Hiltebeitel +Hiltner +Hilton +Hilts +Hiltunen +Hilty +Hiltz +Hilu +Hilvers +Hilyar +Hilyard +Hilyer +Hilz +Hilzer +Him +Himanga +Himber +Hime +Himebaugh +Himel +Himelfarb +Himelstein +Himenez +Himes +Himmel +Himmelmann +Himmelright +Himmelsbach +Himmelspach +Himmelwright +Himmons +Hin +Hinahon +Hinajosa +Hinaman +Hince +Hinch +Hinchcliff +Hinchcliffe +Hinchee +Hinchey +Hinchliff +Hinchliffe +Hinchman +Hinck +Hinckle +Hinckley +Hincks +Hinckson +Hind +Hindall +Hindbaugh +Hinde +Hinderaker +Hinderberger +Hinderer +Hinderliter +Hinderman +Hinders +Hindes +Hindin +Hindle +Hindley +Hindman +Hindmarsh +Hinds +Hindsman +Hindson +Hine +Hinebaugh +Hinegardner +Hineline +Hinely +Hineman +Hiner +Hinerman +Hines +Hinesley +Hiney +Hing +Hinger +Hingle +Hingst +Hingston +Hinh +Hinish +Hink +Hinke +Hinkel +Hinken +Hinkes +Hinkey +Hinkle +Hinkley +Hinks +Hinkson +Hinkston +Hinley +Hinman +Hinnant +Hinnen +Hinnenkamp +Hinners +Hinojos +Hinojosa +Hinokawa +Hinostroza +Hinote +Hinrichs +Hinrichsen +Hinsch +Hinsey +Hinshaw +Hinsley +Hinson +Hint +Hintergardt +Hintermeister +Hinton +Hintson +Hintz +Hintze +Hintzen +Hinz +Hinze +Hinzman +Hinzmann +Hiott +Hipkins +Hipol +Hipolito +Hipp +Hippe +Hippen +Hippensteel +Hippenstiel +Hippert +Hipple +Hippler +Hippley +Hippo +Hipps +Hipsher +Hipsley +Hipwell +Hirai +Hiraki +Hiraldo +Hirano +Hirao +Hiraoka +Hirata +Hirayama +Hird +Hire +Hires +Hirezi +Hirkaler +Hirko +Hirleman +Hirliman +Hirn +Hirneise +Hironaka +Hirons +Hirose +Hirota +Hirpara +Hirsbrunner +Hirsch +Hirschberg +Hirsche +Hirschfeld +Hirschfield +Hirschhorn +Hirschi +Hirschman +Hirschmann +Hirschy +Hirsh +Hirshberg +Hirst +Hirstein +Hirt +Hirte +Hirth +Hirtz +Hirz +Hisaw +Hiscock +Hiscox +Hise +Hisel +Hiser +Hisey +Hiske +Hiskey +Hisle +Hislip +Hislop +Hislope +Hisman +Hismith +Hisrich +Hiss +Hissam +Hissem +Hisserich +Hissom +Hissong +Histand +Hitch +Hitchcock +Hitchen +Hitchens +Hitchingham +Hitchings +Hitchko +Hitchman +Hite +Hiteman +Hiter +Hites +Hitsman +Hitson +Hitt +Hittle +Hittman +Hittner +Hittson +Hitz +Hitzel +Hitzeman +Hitzfelder +Hitzler +Hively +Hives +Hix +Hixenbaugh +Hixon +Hixson +Hizer +Hizkiya +Hjalmarson +Hjelle +Hjelm +Hjermstad +Hjort +Hlad +Hladek +Hladik +Hlastala +Hlavac +Hlavacek +Hlavaty +Hlavka +Hledik +Hluska +Hlywa +Hnat +Hnatow +Hnot +Hnyda +Ho +Hoa +Hoadley +Hoag +Hoagberg +Hoage +Hoagland +Hoaglin +Hoaglund +Hoague +Hoak +Hoang +Hoar +Hoard +Hoare +Hoback +Hoban +Hobart +Hobaugh +Hobb +Hobbie +Hobbins +Hobbs +Hobby +Hobday +Hobden +Hobdy +Hobel +Hobell +Hoben +Hober +Hoberek +Hoberg +Hobert +Hobgood +Hobin +Hobkirk +Hobler +Hoblit +Hobock +Hobson +Hobstetter +Hocate +Hoch +Hochadel +Hochard +Hochberg +Hochfelder +Hochhalter +Hochhauser +Hochman +Hochmuth +Hochnadel +Hochschild +Hochstatter +Hochstedler +Hochstein +Hochstetler +Hochstetter +Hochstine +Hock +Hockaday +Hocke +Hockema +Hockenberry +Hockenbrock +Hockenbury +Hockensmith +Hocker +Hockersmith +Hockett +Hockey +Hocking +Hockins +Hockley +Hockman +Hocutt +Hoda +Hodak +Hodan +Hodapp +Hodd +Hodde +Hodder +Hodek +Hodel +Hodell +Hoder +Hodermarsky +Hodes +Hodgdon +Hodge +Hodgeman +Hodgen +Hodgens +Hodges +Hodgin +Hodgins +Hodgkin +Hodgkins +Hodgkinson +Hodgkiss +Hodgman +Hodgson +Hodkinson +Hodnefield +Hodnett +Hodnicki +Hodo +Hodor +Hodos +Hodosy +Hodrick +Hodsdon +Hodson +Hodum +Hoe +Hoeck +Hoecker +Hoefel +Hoefer +Hoefert +Hoeffer +Hoeffliger +Hoefflin +Hoeffner +Hoefle +Hoefler +Hoeflich +Hoefling +Hoeft +Hoeg +Hoeger +Hoegerl +Hoegh +Hoehl +Hoehn +Hoehne +Hoek +Hoeke +Hoekman +Hoekstra +Hoel +Hoell +Hoeller +Hoellwarth +Hoelscher +Hoelter +Hoelzel +Hoemann +Hoen +Hoene +Hoener +Hoenig +Hoenstine +Hoeper +Hoepfner +Hoeppner +Hoerauf +Hoerger +Hoerig +Hoerl +Hoernemann +Hoerner +Hoerr +Hoerter +Hoes +Hoeschen +Hoese +Hoeser +Hoesing +Hoesly +Hoetger +Hoevel +Hoey +Hof +Hofacker +Hofbauer +Hofe +Hofer +Hoff +Hoffa +Hoffart +Hoffarth +Hoffeditz +Hoffee +Hoffelmeyer +Hoffelt +Hoffer +Hofferber +Hoffert +Hoffhines +Hoffine +Hoffis +Hoffler +Hoffman +Hoffmann +Hoffmaster +Hoffmeister +Hoffmeyer +Hoffnagle +Hoffner +Hofford +Hoffpauir +Hoffpavir +Hoffschneider +Hoffses +Hoffstatter +Hoffstetter +Hoffstot +Hofheimer +Hofhine +Hofius +Hofland +Hofler +Hofman +Hofmann +Hofmans +Hofmeister +Hofstad +Hofstadter +Hofstetter +Hofstra +Hoftiezer +Hoga +Hogains +Hogan +Hogancamp +Hogans +Hoganson +Hogarth +Hogarty +Hogatt +Hogberg +Hoge +Hogeland +Hogelin +Hogen +Hogenmiller +Hogenson +Hoger +Hogg +Hoggan +Hoggard +Hoggatt +Hogge +Hoggins +Hoggle +Hoglan +Hogland +Hogle +Hoglen +Hoglund +Hogon +Hogrefe +Hogsed +Hogsett +Hogsette +Hogsten +Hogston +Hogstrum +Hogue +Hoguet +Hogy +Hoh +Hohaia +Hoheisel +Hohenberger +Hohenbrink +Hohensee +Hohenstein +Hohiudden +Hohl +Hohler +Hohlfeld +Hohlstein +Hohlt +Hohm +Hohman +Hohmann +Hohmeier +Hohn +Hohner +Hohney +Hohnson +Hohnstein +Hohowski +Hohstadt +Hoilman +Hoinacki +Hoines +Hoiness +Hoiseth +Hoisington +Hoisl +Hoist +Hoistion +Hoit +Hoitt +Hoium +Hoivik +Hojczyk +Hojeij +Hojnacki +Hok +Hokama +Hokanson +Hoke +Hokenson +Hokes +Hokett +Hokkanen +Hokula +Hokutan +Holabaugh +Holaday +Holahan +Holak +Holan +Holaway +Holbach +Holbein +Holben +Holberg +Holbert +Holberton +Holbrook +Holbrooks +Holcey +Holch +Holck +Holcomb +Holcombe +Holcroft +Holda +Holdaway +Holdbrook +Holdcraft +Holdeman +Holden +Holder +Holderbaum +Holderby +Holderfield +Holderman +Holderness +Holdgrafer +Holdiness +Holding +Holdman +Holdness +Holdorf +Holdren +Holdridge +Holdsworth +Holdt +Holdvogt +Holdy +Hole +Holec +Holecek +Holecz +Holeman +Holen +Holes +Holesovsky +Holets +Holey +Holford +Holgate +Holgersen +Holgerson +Holguin +Holian +Holibaugh +Holiday +Holien +Holifeild +Holifield +Holihan +Holiman +Holizna +Holje +Holk +Holka +Holl +Holla +Hollabaugh +Hollack +Holladay +Hollamon +Hollan +Holland +Hollander +Hollands +Hollandsworth +Hollar +Hollard +Hollarn +Hollars +Hollaway +Hollberg +Holle +Holleman +Hollembaek +Hollemon +Hollen +Hollenbach +Hollenback +Hollenbaugh +Hollenbeck +Hollenberg +Hollender +Hollendonner +Hollenshead +Holler +Holleran +Hollering +Hollerman +Hollerud +Hollett +Holley +Holleyman +Hollibaugh +Holliday +Hollidge +Hollie +Hollier +Hollifield +Holliman +Hollimon +Hollin +Holling +Hollinger +Hollinghead +Hollinghurst +Hollings +Hollingshead +Hollingshed +Hollingsworth +Hollington +Hollingworth +Hollinrake +Hollins +Hollinshead +Hollinshed +Hollinsworth +Hollis +Hollister +Holliway +Hollman +Hollmann +Hollner +Hollo +Hollobaugh +Holloman +Hollomon +Hollon +Hollopeter +Holloran +Hollow +Holloway +Hollowell +Hollway +Holly +Hollyday +Hollyfield +Hollywood +Holm +Holman +Holmberg +Holme +Holmen +Holmer +Holmers +Holmes +Holmgren +Holmlund +Holmon +Holmquest +Holmquist +Holms +Holmstead +Holmstrom +Holness +Holohan +Holom +Holoman +Holoway +Holowell +Holpp +Holquin +Holquist +Holroyd +Holsapple +Holscher +Holsclaw +Holsey +Holshouser +Holshovser +Holshue +Holsing +Holsinger +Holsman +Holsomback +Holsonback +Holsopple +Holst +Holstad +Holste +Holstege +Holstein +Holsten +Holster +Holstine +Holston +Holstrom +Holsworth +Holt +Holtan +Holtberg +Holte +Holten +Holter +Holterman +Holtgrefe +Holtgrewe +Holtham +Holthaus +Holthoff +Holthouse +Holthus +Holtkamp +Holtman +Holtmann +Holtmeier +Holton +Holtorf +Holtrop +Holtry +Holts +Holtsclaw +Holtsoi +Holtz +Holtzberg +Holtzclaw +Holtzen +Holtzer +Holtzlander +Holtzman +Holub +Holubar +Holverson +Holvey +Holway +Holweger +Holy +Holycross +Holyfield +Holyoak +Holyoke +Holz +Holzboog +Holze +Holzem +Holzer +Holzerland +Holzhauer +Holzheimer +Holzhueter +Holzinger +Holzman +Holzmeister +Holzmiller +Holznecht +Holzner +Holzwart +Holzwarth +Holzworth +Hom +Homa +Homan +Homann +Homans +Homburg +Homby +Homchick +Home +Homen +Homer +Homerding +Homes +Homesley +Homestead +Homewood +Homeyer +Homiak +Homles +Homma +Homme +Hommel +Hommell +Hommer +Hommerding +Homola +Homrich +Homrighaus +Homs +Homsey +Homsher +Homyak +Homza +Hon +Honahni +Honahnie +Honaker +Honan +Honanie +Honas +Honberger +Honch +Honchell +Honchul +Honda +Hondel +Hondorp +Hondros +Hone +Honea +Honeck +Honegger +Honer +Honerkamp +Hones +Honey +Honeycott +Honeycut +Honeycutt +Honeyestewa +Honeyman +Honeysucker +Honeywell +Hong +Honga +Hongach +Hongerholt +Hongeva +Hongisto +Hongo +Honhart +Honie +Honig +Honigsberg +Honkanen +Honma +Honn +Honnen +Honnerlaw +Honnette +Honnold +Honohan +Honokaupu +Honold +Honor +Honore +Honour +Hons +Honsberger +Honse +Honsinger +Honts +Hontz +Honus +Honyumptewa +Honza +Honzel +Honzell +Hoo +Hoobler +Hoock +Hood +Hooe +Hooey +Hoof +Hoofard +Hoogendoorn +Hoogheem +Hooghkirk +Hoogland +Hook +Hookano +Hooke +Hooker +Hookfin +Hooks +Hool +Hooley +Hoolihan +Hoomana +Hoon +Hoop +Hoopengardner +Hooper +Hoopes +Hoopii +Hoopingarner +Hoople +Hoops +Hoos +Hoose +Hooser +Hoosier +Hoosock +Hoot +Hooten +Hootman +Hooton +Hoots +Hootsell +Hoover +Hoovler +Hope +Hopes +Hopewell +Hopf +Hopfauf +Hopfensperger +Hopfer +Hopgood +Hopke +Hopkin +Hopkins +Hopkinson +Hopko +Hopman +Hopp +Hoppa +Hoppe +Hoppel +Hoppenrath +Hoppenstedt +Hopper +Hopperstad +Hoppes +Hoppesch +Hoppin +Hopping +Hoppins +Hopple +Hoppman +Hopps +Hopskins +Hopson +Hopton +Hopwood +Hoque +Hor +Hora +Horabik +Horace +Horack +Horak +Horal +Horan +Horaney +Horbert +Horchler +Hord +Horde +Hordge +Hordyk +Hore +Horelick +Horen +Horenstein +Hores +Horesco +Horeth +Horey +Horgan +Horgen +Horger +Hori +Horigan +Horii +Horikoshi +Horimoto +Horine +Horio +Horita +Horiuchi +Horka +Horkey +Horkley +Horky +Horman +Hormander +Hormann +Hormell +Hormuth +Horn +Hornack +Hornaday +Hornak +Hornandez +Hornbacher +Hornback +Hornbaker +Hornbarger +Hornbeak +Hornbeck +Hornberg +Hornberger +Hornbrook +Hornbuckle +Hornby +Horne +Horneff +Horner +Hornes +Horney +Horniak +Hornick +Hornig +Hornik +Horning +Hornish +Hornlein +Hornoff +Hornor +Horns +Hornsby +Hornshaw +Hornstein +Hornstrom +Hornung +Hornyak +Horodyski +Horoschak +Horovitz +Horowitz +Horr +Horras +Horrell +Horridge +Horrigan +Horris +Horrocks +Horry +Horsburgh +Horsch +Horse +Horseford +Horsely +Horseman +Horsey +Horsfall +Horsfield +Horsford +Horsley +Horsman +Horst +Horstead +Horstman +Horstmann +Hort +Horta +Hortein +Horten +Horth +Hortillosa +Hortin +Hortman +Horton +Horuath +Horvat +Horvath +Horvers +Horvitz +Horwath +Horwich +Horwitz +Horwood +Hosack +Hosaka +Hosang +Hosch +Hoschander +Hoscheid +Hoscheit +Hoschek +Hoschouer +Hose +Hosea +Hoseck +Hosein +Hosek +Hoseman +Hosendove +Hosey +Hosfeld +Hosfield +Hosford +Hoshall +Hoshaw +Hoshino +Hosick +Hosie +Hosier +Hoskey +Hoskie +Hoskin +Hosking +Hoskins +Hoskinson +Hoskyns +Hosle +Hosler +Hosley +Hosman +Hosmer +Hosner +Hosoi +Hospelhorn +Hospkins +Hoss +Hossack +Hossain +Hosse +Hosseini +Hossfeld +Hossler +Host +Hoste +Hosteller +Hosten +Hoster +Hosterman +Hostert +Hostetler +Hostetter +Hostettler +Hostin +Hostler +Hostoffer +Hoston +Hotaki +Hotalen +Hotaling +Hotard +Hotchkin +Hotchkiss +Hotek +Hotelling +Hoth +Hothan +Hotovec +Hotrum +Hott +Hottel +Hottell +Hotten +Hotter +Hottes +Hottinger +Hottle +Hottman +Hotton +Hotz +Hotze +Hou +Houben +Houch +Houchard +Houchen +Houchens +Houchin +Houchins +Houck +Houde +Houdek +Houey +Houf +Houff +Hougas +Houge +Hougen +Hough +Hougham +Houghland +Houghtaling +Houghtelling +Houghtling +Houghton +Hougland +Houglum +Houis +Houk +Houlahan +Houlberg +Houle +Houlihan +Houltberg +Houlton +Houman +Hounchell +Hounshell +Houp +Houpe +Houpt +Hourani +Hourigan +Hourihan +Housand +Housden +House +Houseal +Householder +Housekeeper +Houseknecht +Housel +Houseman +Housemate +Housen +Houser +Houseworth +Housewright +Housey +Housh +Housholder +Houska +Houskeeper +Housler +Housley +Housman +Housner +Housten +Houston +Hout +Houtchens +Houten +Houtkooper +Houtman +Houts +Houtz +Houy +Houzah +Houze +Hovanec +Hovanes +Hovanesian +Hovantzi +Hovard +Hovarter +Hovatter +Hovda +Hovde +Hovden +Hove +Hovell +Hovelson +Hoven +Hovenga +Hover +Hovermale +Hoverson +Hoversten +Hovey +Hovi +Hovick +Hoving +Hovis +Hovland +Hovnanian +Hovorka +Hovsepian +How +Howard +Howarter +Howarth +Howat +Howatt +Howden +Howdeshell +Howdyshell +Howe +Howell +Howells +Howen +Howenstine +Hower +Howerter +Howerton +Howery +Howes +Howeth +Howett +Howey +Howick +Howie +Howieson +Howington +Howison +Howitt +Howk +Howkins +Howland +Howle +Howles +Howlett +Howley +Howlin +Howlingwolf +Howman +Howorth +Howry +Howryla +Howsare +Howse +Howser +Howson +Howton +Howze +Howzell +Hoxie +Hoxit +Hoxsie +Hoxworth +Hoy +Hoyal +Hoye +Hoyer +Hoying +Hoyland +Hoyle +Hoyles +Hoylton +Hoyman +Hoyne +Hoyos +Hoysock +Hoysradt +Hoyt +Hoyte +Hozempa +Hoznour +Hrabal +Hrabovsky +Hradecky +Hranchak +Hrapski +Hrbacek +Hrbek +Hrcka +Hrdlicka +Hreha +Hren +Hribal +Hribar +Hric +Hricko +Hritz +Hrivnak +Hrna +Hrobsky +Hromek +Hronek +Hronick +Hrovat +Hruby +Hruska +Hrycenko +Hrycko +Hryniewich +Hsi +Hsia +Hsiang +Hsiao +Hsieh +Hsing +Hsu +Hsueh +Hsun +Hsy +Htwe +Hu +Hua +Huaman +Huang +Huante +Huard +Huba +Hubach +Huban +Hubbard +Hubbartt +Hubbel +Hubbell +Hubbert +Hubble +Hubbs +Hubby +Hubel +Hubenthal +Huber +Huberman +Hubert +Hubertus +Huberty +Hubertz +Hubiak +Hubin +Hubka +Hubl +Hubler +Hubley +Hubner +Hubric +Hubright +Hubsch +Hubschmitt +Huch +Huck +Huckabaa +Huckabay +Huckabee +Huckabey +Huckabone +Huckaby +Huckeba +Huckeby +Huckfeldt +Huckins +Huckle +Huckleberry +Hucks +Huckstadt +Huckstep +Hudach +Hudack +Hudak +Hudalla +Hudas +Huddelston +Huddle +Huddleson +Huddleston +Huddy +Hudec +Hudecek +Hudek +Hudelson +Hudes +Hudgens +Hudgeons +Hudgins +Hudkins +Hudler +Hudley +Hudlin +Hudlow +Hudman +Hudmon +Hudnall +Hudnell +Hudnut +Hudock +Hudok +Hudon +Hudrick +Hudson +Hudspeth +Hudy +Hue +Huebert +Huebner +Huebsch +Huebschman +Hueckman +Hueftle +Huegel +Huehn +Huell +Huelle +Huels +Huelse +Huelskamp +Huelsman +Huemmer +Huenergardt +Huenink +Huereca +Huerta +Huertas +Huertes +Huerto +Hueser +Huesing +Huesman +Hueso +Huesso +Huestis +Hueston +Huether +Huett +Huettman +Huewe +Huey +Huezo +Huf +Hufana +Huff +Huffaker +Huffer +Huffine +Huffines +Huffman +Huffmaster +Huffner +Hufford +Huffstetler +Huffstickler +Huffstutler +Huffstutter +Hufft +Hufnagel +Hufstedler +Hufstetler +Huft +Hufton +Hufty +Hug +Hugar +Huge +Hugee +Hugel +Huger +Huges +Hugg +Huggard +Hugger +Huggett +Hugghins +Hugghis +Huggins +Huggler +Hugh +Hughart +Hughe +Hughen +Hughes +Hughett +Hughey +Hughlett +Hughley +Hughs +Hughson +Hughston +Hugi +Hugill +Hugle +Hugley +Hugo +Hugron +Hugueley +Huguenin +Huguet +Huguley +Hugus +Huh +Huhammad +Huhman +Huhn +Huhta +Huhtala +Huhtasaari +Hui +Huie +Huirgs +Huisenga +Huish +Huisinga +Huisman +Huit +Huiting +Huitink +Huitron +Huitt +Huitzacua +Huizar +Huizenga +Huizinga +Hujer +Hukill +Hukle +Hulan +Huland +Hulbert +Hulburt +Hulcy +Hulen +Hules +Hulet +Hulett +Hulette +Hulick +Hulin +Huling +Hulings +Hulitt +Hull +Hullender +Hullett +Hullihen +Hullinger +Hullings +Hullum +Hulm +Hulme +Hulmes +Hulon +Huls +Hulse +Hulsey +Hulshoff +Hulsizer +Hulslander +Hulsman +Hulst +Hulstine +Hulstrand +Hult +Hultberg +Hultgren +Hultman +Hulton +Hultquist +Hults +Hultz +Hulvey +Hulzing +Hum +Human +Humann +Humason +Humbard +Humbarger +Humbel +Humber +Humberson +Humbert +Humbertson +Humbird +Humble +Humbles +Humburg +Hume +Humenik +Humeniuk +Humerick +Humerickhouse +Humes +Humetewa +Humfeld +Huminski +Humiston +Humm +Hummel +Hummell +Hummer +Hummert +Hummingbird +Hummons +Humpal +Humpert +Humphers +Humphery +Humpherys +Humphrey +Humphreys +Humphries +Humphry +Humphrys +Humprey +Humpries +Humston +Hun +Hunckler +Hund +Hundemer +Hunderlach +Hundertmark +Hundley +Hundt +Huneke +Huner +Huneycutt +Hung +Hungate +Hunger +Hungerford +Hunke +Hunkele +Hunker +Hunkin +Hunking +Hunkins +Hunley +Hunn +Hunnell +Hunnewell +Hunneyman +Hunnicut +Hunnicutt +Hunnings +Hunsaker +Hunsberger +Hunsicker +Hunsinger +Hunsley +Hunson +Hunsperger +Hunstad +Hunstiger +Hunsucker +Hunt +Hunte +Hunten +Hunter +Hunting +Huntington +Huntley +Hunton +Huntoon +Huntress +Huntsberger +Huntsberry +Huntsinger +Huntsman +Huntzinger +Hunyadi +Hunze +Hunzeker +Hunzelman +Hunziker +Huor +Huot +Huotari +Hupe +Hupf +Hupka +Hupman +Hupp +Huppe +Huppenbauer +Hupper +Huppert +Huprich +Hupy +Hur +Hurban +Hurd +Hurde +Hurdle +Huret +Hurford +Hurl +Hurla +Hurlbert +Hurlburt +Hurlbut +Hurlbutt +Hurlebaus +Hurles +Hurless +Hurley +Hurlock +Hurlston +Hurm +Hurme +Hurn +Hurndon +Hurne +Hurney +Hurni +Hurns +Huro +Huron +Hurrell +Hurren +Hurrigan +Hurrington +Hurrle +Hurry +Hurse +Hursey +Hursh +Hurst +Hurston +Hurt +Hurta +Hurtado +Hurter +Hurtgen +Hurtig +Hurtis +Hurtt +Hurtubise +Hurtz +Hurwitz +Husain +Husaini +Husak +Husanini +Husar +Husayko +Husband +Husbands +Husby +Husch +Huscher +Huschle +Huse +Huseby +Husein +Huseman +Husenaj +Huser +Huseth +Husfelt +Hush +Hushon +Husk +Huska +Huskey +Huski +Huskin +Huskins +Huskinson +Husky +Huslander +Husman +Husmann +Husni +Huso +Huson +Huss +Hussain +Hussaini +Hussar +Hussein +Husseini +Husselbee +Husser +Hussey +Hussian +Hussien +Hussman +Husson +Hussong +Hussy +Hust +Hustace +Hustead +Husted +Hustedt +Huston +Hustus +Husul +Huszar +Hutch +Hutchcraft +Hutchcroft +Hutchen +Hutchens +Hutchenson +Hutcherson +Hutcheson +Hutchin +Hutching +Hutchings +Hutchingson +Hutchins +Hutchinson +Hutchison +Hutchkiss +Huter +Huth +Hutley +Hutmacher +Hutnak +Hutsell +Hutsler +Hutson +Hutt +Huttar +Hutten +Hutter +Hutti +Huttle +Huttman +Hutto +Hutton +Hutts +Hutyra +Hutzel +Hutzler +Huus +Huval +Huver +Huwe +Hux +Huxford +Huxhold +Huxley +Huxman +Huxtable +Huy +Huyard +Huyck +Huyett +Huyghe +Huyler +Huyna +Huynh +Huyser +Huysman +Huzzard +Hvizdos +Hwang +Hwee +Hy +Hyacinthe +Hyams +Hyatt +Hyatte +Hybarger +Hyberger +Hych +Hyche +Hyde +Hyden +Hyder +Hydrick +Hydzik +Hyer +Hyers +Hyett +Hykes +Hylan +Hyland +Hylands +Hyldahl +Hyle +Hyler +Hyles +Hylinski +Hylle +Hylton +Hyman +Hymas +Hymel +Hymen +Hymer +Hymes +Hymon +Hymowitz +Hynd +Hyndman +Hynds +Hynek +Hyneman +Hynes +Hynson +Hynum +Hyon +Hypes +Hypolite +Hyppolite +Hyre +Hyrkas +Hysell +Hyser +Hysinger +Hyske +Hyslop +Hysmith +Hysom +Hyson +Hysong +Hysquierdo +Hyten +Hyter +Hytros +Hyun +Hyzer +Iachetta +Iacobelli +Iacobellis +Iacobucci +Iacono +Iacopino +Iacovelli +Iacovetto +Iacovino +Iacovissi +Iacovone +Iacuzio +Iadarola +Iafrate +Ialongo +Iamiceli +Iams +Ianacone +Iannaccone +Iannacone +Iannalo +Iannelli +Ianni +Ianniello +Iannone +Iannotti +Iannucci +Iannuzzi +Ianuzzi +Iara +Iarocci +Iarossi +Iarussi +Iatarola +Iavarone +Iba +Ibach +Ibale +Ibanez +Ibara +Ibarra +Ibasitas +Ibbetson +Ibbotson +Ibdah +Iberg +Iberra +Ibey +Ible +Iborra +Ibraham +Ibrahim +Ibric +Ibsen +Iburg +Icard +Icardo +Ice +Icenhour +Icenogle +Ichikawa +Ichinose +Ichinotsubo +Ickert +Ickes +Ida +Iddings +Ide +Idell +Idema +Idemoto +Iden +Ideue +Idiart +Idleburg +Idler +Idol +Idris +Idriss +Idrovo +Ienco +Ieng +Iennaco +Iese +Iezzi +Ifantides +Ifeanyi +Iffert +Iffland +Ifft +Ifie +Ifill +Ifversen +Igartua +Igbal +Igbinosun +Igel +Iglehart +Igler +Igles +Iglesia +Iglesias +Ignacio +Ignasiak +Igneri +Ignoria +Ignowski +Igo +Igoe +Igou +Igtanloc +Iguina +Igus +Igwe +Iha +Ihde +Iheme +Ihenyen +Ihle +Ihlenfeld +Ihm +Ihnat +Ihnen +Ihrig +Ihrke +Iiams +Iida +Iino +Ijames +Ijams +Ikard +Ike +Ikeard +Ikeda +Ikehara +Ikemire +Ikemoto +Ikenberry +Iker +Ikerd +Ikkela +Ikner +Ikuta +Ikzda +Ilacqua +Ilagan +Ilalio +Ilardi +Ilaria +Ilarraza +Ilasin +Ildefonso +Iler +Iles +Ilg +Ilic +Iliff +Iliffe +Ill +Illa +Illar +Illas +Ille +Iller +Illes +Illescas +Illian +Illiano +Illich +Illies +Illig +Illingworth +Illovsky +Illsley +Illuzzi +Ilse +Iltzsch +Im +Imada +Imai +Imaino +Imaizumi +Imam +Imamura +Iman +Imbach +Imber +Imberg +Imbert +Imbesi +Imbier +Imbimbo +Imboden +Imbrenda +Imbriale +Imbrock +Imbrogno +Imbruglia +Imburgia +Imdieke +Imel +Imes +Imeson +Imfeld +Imgrund +Imhof +Imhoff +Imholte +Imig +Imlay +Imler +Imm +Imme +Immediato +Immel +Immen +Immerman +Imming +Immordino +Imondi +Imoto +Imparato +Imperato +Imperatore +Imperial +Impson +Imrie +Imus +In +Ina +Inaba +Inabinet +Inabinett +Inabnit +Inacio +Inafuku +Inagaki +Inbody +Incarnato +Ince +Incera +Inch +Inches +Inciong +Inclan +Incle +Incomstanti +Incorvaia +Inda +Indal +Indeck +Indelicato +Indermuehle +Indest +Indovina +Induddi +Iner +Ines +Ineson +Inestroza +Infante +Infantino +Infantolino +Inferrera +Infield +Infinger +Ing +Inga +Ingala +Ingalls +Ingalsbe +Ingargiola +Ingargiolo +Ingber +Inge +Ingebretsen +Ingegneri +Ingels +Ingemi +Ingenito +Ingersol +Ingersoll +Ingerson +Ingham +Inghem +Inghram +Ingle +Ingles +Inglese +Ingleton +Inglin +Inglis +Inglish +Ingmire +Ingold +Ingole +Ingraffea +Ingraham +Ingrahm +Ingram +Ingran +Ingrassia +Ingrim +Ingrum +Inguardsen +Ingvolostad +Ingwell +Ingwersen +Ingwerson +Inhulsen +Iniestra +Iniguez +Iniquez +Ink +Inkavesvanitc +Inklebarger +Inks +Inloes +Inlow +Inman +Inmon +Innamorato +Innarelli +Innella +Innerst +Innes +Innis +Inniss +Innocent +Innocenti +Inoa +Inocencio +Inocente +Inostraza +Inoue +Inouye +Insalaco +Insana +Inscho +Insco +Inscoe +Inscore +Inserra +Inskeep +Insko +Insley +Insogna +Insognia +Instasi +Interdonato +Interiano +Intermill +Interrante +Intihar +Intrabartolo +Intriago +Intrieri +Introini +Intveld +Inverso +Inyart +Inzana +Inzano +Inzer +Inzerillo +Inzunza +Ioannidis +Iodice +Ioele +Ioli +Ion +Ionescu +Iopa +Iorio +Iossa +Iott +Iovino +Iozzi +Iozzo +Ip +Ipock +Ippolito +Ipsen +Ipson +Iqbal +Iracheta +Iraheta +Irani +Irby +Iredale +Irelan +Ireland +Irene +Ireson +Irestone +Ireton +Irey +Iriarte +Irias +Iribarren +Irick +Irie +Irigoyen +Irimata +Irineo +Irion +Irish +Irizarri +Irizarry +Irizary +Irizzary +Irland +Irle +Irmeger +Iron +Ironhorse +Irons +Irr +Irsik +Iruegas +Irvan +Irvin +Irvine +Irving +Irwin +Irzyk +Isa +Isaac +Isaack +Isaacks +Isaacs +Isaacsen +Isaacson +Isaak +Isabel +Isabell +Isabella +Isabelle +Isachsen +Isackson +Isacs +Isacson +Isadore +Isagawa +Isagba +Isaiah +Isais +Isaksen +Isakson +Isales +Isam +Isaman +Isassi +Isaza +Isbell +Isbill +Isbister +Isbrecht +Isby +Isch +Isebrand +Iseley +Iseli +Iseman +Isenbarger +Isenberg +Isenberger +Isenhart +Isenhour +Isenhower +Iser +Iseri +Iserman +Isett +Isgrigg +Isgro +Isgur +Ishak +Isham +Ishee +Isherwood +Ishibashi +Ishida +Ishihara +Ishii +Ishikawa +Ishizu +Ishmael +Ishman +Ishmon +Isidore +Isidoro +Isidro +Isiminger +Ising +Isiordia +Isip +Isita +Iskra +Isla +Islam +Island +Islar +Islas +Isle +Isleib +Isler +Isles +Isley +Ismael +Ismail +Ismay +Isner +Isola +Isom +Isome +Ison +Israel +Israels +Israelsen +Israelson +Isreal +Issa +Issac +Issacs +Issler +Istorico +Istre +Italia +Italiano +Itani +Ith +Itkin +Itnyre +Ito +Itri +Itson +Ittner +Iturbe +Iturbide +Iturralde +Itzkowitz +Iuchs +Iulianetti +Iuliano +Iuliucci +Iulo +Iurato +Ivan +Ivancevic +Ivancic +Ivancich +Ivanoff +Ivanov +Ivans +Ivaska +Iveans +Ivel +Ivener +Ivens +Ivers +Iversen +Iverslie +Iverson +Ivery +Ives +Iveson +Ivester +Ivey +Ivie +Ivins +Ivon +Ivory +Ivrin +Ivy +Iwami +Iwamoto +Iwanejko +Iwanicki +Iwanowski +Iwanski +Iwanyszyn +Iwaoka +Iwasa +Iwasaki +Iwashita +Iwasko +Iwata +Iyengar +Iyer +Iyo +Izaguine +Izaguirre +Izak +Izaquirre +Izard +Izarraras +Izatt +Izquierdo +Izsak +Izumi +Izzard +Izzi +Izzo +Jaap +Jaarda +Jabaay +Jabali +Jabaut +Jabbie +Jabbour +Jaber +Jabiro +Jablon +Jablonowski +Jablonski +Jablonsky +Jabour +Jabs +Jacaruso +Jacckson +Jacek +Jach +Jacinthe +Jacinto +Jack +Jacka +Jackel +Jackels +Jackett +Jackiewicz +Jackley +Jacklin +Jackman +Jacko +Jackola +Jackon +Jackosn +Jackovitz +Jackowiak +Jackowski +Jacks +Jacksits +Jackso +Jackson +Jackstadt +Jaco +Jacob +Jacobellis +Jacobi +Jacobitz +Jacobo +Jacobos +Jacobovits +Jacobowitz +Jacobs +Jacobsen +Jacobsma +Jacobsohn +Jacobson +Jacobus +Jacoby +Jacocks +Jacome +Jaconski +Jacot +Jacoway +Jacox +Jacquay +Jacque +Jacquelin +Jacquem +Jacquemin +Jacques +Jacquet +Jacquez +Jacquier +Jacquin +Jacquot +Jaculina +Jadin +Jadlowiec +Jadoo +Jae +Jaecks +Jaeger +Jaegers +Jaekel +Jaenicke +Jaenke +Jaeschke +Jafari +Jafek +Jaffe +Jaffee +Jaffray +Jaffy +Jageman +Jager +Jagers +Jagger +Jaggers +Jaggie +Jagher +Jagiello +Jagielski +Jagla +Jagneaux +Jago +Jagoda +Jagodzinski +Jagoe +Jagow +Jahaly +Jahde +Jahn +Jahncke +Jahnel +Jahnke +Jahns +Jahnsen +Jahoda +Jahosky +Jahr +Jaillet +Jaime +Jaimes +Jain +Jainlett +Jaiyesimi +Jaji +Jakab +Jakeman +Jakes +Jakiela +Jakob +Jakobsen +Jakobson +Jakovac +Jakowich +Jaksch +Jaksic +Jakubczak +Jakubek +Jakubiak +Jakubik +Jakuboski +Jakubov +Jakubowski +Jakupcak +Jalbert +Jalkut +Jalomo +Jalonen +Jalovel +Jamaica +Jamal +Jamar +Jamason +Jame +Jameel +Jamel +Jamer +Jamerson +James +Jameson +Jamesson +Jamgochian +Jami +Jamie +Jamieson +Jamili +Jamin +Jaminet +Jamir +Jamison +Jammer +Jamon +Jamwant +Jan +Jana +Janacek +Janack +Janak +Janas +Jancik +Janco +Janczak +Janczewski +Janczunski +Janda +Jandl +Jandreau +Jandres +Jandrey +Jandrin +Jandris +Jandron +Jane +Janecek +Janecka +Janeczek +Janeczko +Janeiro +Janek +Janelle +Janes +Janeway +Janey +Jang +Jangula +Janhunen +Janiak +Janice +Janick +Janicke +Janicki +Janik +Janikowski +Janis +Janisch +Janise +Janish +Janiszewski +Janitz +Jank +Janka +Jankauskas +Janke +Jankins +Jankoff +Jankoski +Jankowiak +Jankowski +Jann +Jannell +Janner +Jannett +Jannetti +Janney +Janning +Jannise +Jannsen +Jannusch +Janocha +Janoff +Janofsky +Janos +Janosek +Janosik +Janoski +Janosko +Janousek +Janovich +Janovsek +Janow +Janower +Janowiak +Janowicz +Janowiec +Janowski +Janrhett +Jans +Jansen +Jansing +Janski +Jansky +Jansma +Janson +Jansons +Janssen +Jansson +Janszen +Jantz +Jantzen +January +Janulewicz +Janus +Janusz +Januszewski +Janvier +Janway +Janysek +Janz +Janzen +Japak +Japp +Jappa +Jaqua +Jaquay +Jaques +Jaquess +Jaquet +Jaquez +Jaquins +Jaquish +Jaquith +Jara +Jarad +Jaradat +Jaramillo +Jarboe +Jarchow +Jardel +Jardell +Jardin +Jardine +Jarding +Jardon +Jardot +Jarecke +Jarecki +Jared +Jarell +Jarels +Jarema +Jaremka +Jarencio +Jares +Jaret +Jarett +Jargas +Jarman +Jarmin +Jarmon +Jarnagin +Jarnesky +Jarnigan +Jarnutowski +Jarocki +Jaros +Jaroscak +Jarosh +Jaroski +Jaross +Jarosz +Jarquin +Jarrar +Jarrard +Jarratt +Jarreau +Jarred +Jarrel +Jarrell +Jarrells +Jarret +Jarrett +Jarrette +Jarriett +Jarry +Jaruis +Jarva +Jarver +Jarvi +Jarvie +Jarvinen +Jarvis +Jarzembowski +Jarzombek +Jarzynka +Jasch +Jasica +Jasik +Jasin +Jasinski +Jasionowski +Jaskiewicz +Jasko +Jaskolka +Jaskolski +Jaskot +Jasmann +Jasmer +Jasmin +Jasmine +Jaso +Jason +Jasper +Jaspers +Jasperse +Jass +Jasso +Jaster +Jastrebski +Jastremski +Jastrzebski +Jatho +Jaubert +Jauch +Jaudon +Jauhar +Jaure +Jauregui +Jaureguy +Jaurequi +Jaurez +Jaurigue +Jaurigui +Jauron +Jaus +Jauss +Jaussen +Jaussi +Javarone +Javaux +Jave +Javed +Javellana +Javens +Javers +Javery +Javier +Javis +Javor +Jawad +Jaworowicz +Jaworowski +Jaworski +Jaworsky +Jax +Jay +Jaycox +Jaye +Jayes +Jayme +Jayne +Jaynes +Jayo +Jayroe +Jayson +Jaysura +Jazwa +Jean +Jeanbaptise +Jeanbaptiste +Jeanbart +Jeancharles +Jeanclaude +Jeancy +Jeane +Jeanes +Jeanette +Jeanfrancois +Jeangilles +Jeanjacques +Jeanlouis +Jeanmard +Jeanneret +Jeannette +Jeannoel +Jeannotte +Jeanpaul +Jeanphilippe +Jeanpierre +Jeanquart +Jeans +Jeansonne +Jeantet +Jeanty +Jeavons +Jebb +Jebbett +Jech +Jeck +Jecklin +Jecmenek +Jedan +Jedele +Jedik +Jedlicka +Jedrey +Jedziniak +Jee +Jefcoat +Jeff +Jeffcoat +Jefferds +Jefferies +Jefferis +Jeffers +Jefferson +Jeffery +Jefferys +Jeffirs +Jefford +Jeffords +Jeffress +Jeffrey +Jeffreys +Jeffrie +Jeffries +Jeffris +Jeffry +Jeffryes +Jeffs +Jeffus +Jegede +Jehl +Jehle +Jehlicka +Jekel +Jekot +Jelarde +Jelden +Jelen +Jeleniewski +Jelinek +Jelinski +Jelks +Jelle +Jellerson +Jelley +Jellinek +Jellings +Jellis +Jellison +Jelome +Jelovich +Jelsma +Jeltema +Jemenez +Jemerson +Jeminez +Jemison +Jemmett +Jemmings +Jemmott +Jempty +Jen +Jenab +Jenaye +Jenck +Jencks +Jenderer +Jendras +Jendrick +Jendro +Jeng +Jenifer +Jenious +Jenison +Jenista +Jenkens +Jenkerson +Jenkin +Jenkins +Jenkinson +Jenks +Jenne +Jennelle +Jenner +Jenness +Jennett +Jennette +Jenney +Jennie +Jennifer +Jenniges +Jenning +Jennings +Jennins +Jennison +Jennkie +Jennrich +Jenny +Jenovese +Jenquin +Jenrette +Jens +Jenschke +Jensen +Jenson +Jensrud +Jensvold +Jent +Jentry +Jentsch +Jentzen +Jentzsch +Jeoffroy +Jeon +Jeong +Jephson +Jepko +Jepperson +Jeppesen +Jeppsen +Jeppson +Jepsen +Jepson +Jerabek +Jerald +Jerauld +Jerde +Jerdee +Jerden +Jerding +Jerdon +Jereb +Jeremiah +Jerez +Jergen +Jergens +Jergenson +Jerger +Jerich +Jericho +Jerido +Jerkin +Jerkins +Jerko +Jerman +Jermeland +Jernberg +Jernejcic +Jernigan +Jernstad +Jernstrom +Jerome +Jerone +Jeronimo +Jerowski +Jerrel +Jerrell +Jerrett +Jerry +Jersey +Jervey +Jervis +Jes +Jeschke +Jeschon +Jesenovec +Jesiolowski +Jeska +Jeske +Jeskie +Jesko +Jesmer +Jespersen +Jesperson +Jess +Jessamy +Jesse +Jessee +Jessel +Jesseman +Jessen +Jessica +Jessick +Jessie +Jessop +Jessup +Jest +Jester +Jestes +Jestis +Jesus +Jeswald +Jeter +Jethro +Jethva +Jett +Jette +Jetter +Jetton +Jetty +Jeudy +Jeune +Jevnikar +Jevtic +Jew +Jewel +Jewell +Jewels +Jewett +Jewkes +Jews +Jex +Jez +Jezek +Jezewski +Jezierski +Jeziorski +Jhanson +Jhingree +Jhonson +Jhonston +Ji +Jiang +Jiau +Jiggetts +Jilek +Jiles +Jilk +Jill +Jillson +Jim +Jimbo +Jimenes +Jimenez +Jimeno +Jimenz +Jimerez +Jimerson +Jimeson +Jiminez +Jiminian +Jimison +Jimmerson +Jimmison +Jin +Jindra +Jinenez +Jines +Jing +Jingst +Jinkens +Jinkerson +Jinkins +Jinks +Jinright +Jinwright +Jipson +Jira +Jirak +Jiran +Jirasek +Jirik +Jirjis +Jiron +Jirsa +Jitchaku +Jividen +Jn +Jo +Joa +Joachim +Joachin +Joanette +Joanis +Joans +Joaquin +Joas +Job +Jobe +Jobes +Jobin +Jobs +Jobson +Jobst +Jochems +Jochim +Jochum +Jochumsen +Jock +Jockers +Jocoy +Jodha +Jodoin +Jodon +Jodway +Jody +Joe +Joeckel +Joecks +Joehnck +Joel +Joelson +Joens +Joerg +Joerger +Joerling +Joern +Joesph +Joffe +Joffrion +Joganic +Joh +Johal +Johanek +Johann +Johannes +Johannesen +Johannessen +Johanning +Johanningmeie +Johanns +Johannsen +Johansen +Johansing +Johanson +Johansson +Johar +Johe +Johengen +Johll +John +Johndrow +Johngrass +Johnico +Johnigan +Johniken +Johnikins +Johnke +Johnny +Johnosn +Johns +Johnsen +Johnsey +Johnshoy +Johnso +Johnson +Johnsrud +Johnstad +Johnston +Johnstonbaugh +Johnstone +Johnting +Johson +Joice +Joiner +Joines +Jointer +Jojola +Jokela +Joki +Jokinen +Joler +Joles +Jolicoeur +Jolie +Joliet +Jolin +Jolina +Joline +Jolissaint +Jolivette +Jolla +Jolley +Jollie +Jolliff +Jolliffe +Jollimore +Jolls +Jolly +Joly +Joma +Jome +Jomes +Jonah +Jonak +Jonas +Jonason +Jonassen +Jonathan +Joncas +Jondahl +Jondle +Jondrow +Jone +Jones +Joneson +Jong +Jongebloed +Jongeling +Jongsma +Jonhson +Jonke +Jonker +Jonnson +Jons +Jonson +Jonsson +Jonte +Joo +Joor +Joos +Joosten +Joplin +Jopling +Jorda +Jordahl +Jordan +Jorde +Jorden +Jording +Jordison +Jordon +Jordt +Jore +Jorge +Jorgensen +Jorgenson +Jorinscay +Joris +Jorn +Jorres +Jorrisch +Jorski +Jorstad +Jory +Jose +Josef +Josefy +Joseph +Josephpauline +Josephs +Josephsen +Josephson +Josey +Joshi +Joshlin +Joshua +Josiah +Josias +Josic +Josich +Josilowsky +Joslin +Joslyn +Joss +Josselyn +Jossund +Jost +Josten +Jostes +Josue +Joswick +Jotblad +Joto +Jou +Joubert +Joulwan +Joun +Joung +Jourdain +Jourdan +Journeay +Journell +Journey +Journot +Jovanovic +Jovanovich +Jove +Jovel +Jover +Jovich +Jowell +Jowers +Jowett +Joy +Joya +Joyal +Joyce +Joye +Joyne +Joyner +Joynes +Joynson +Joynt +Jozsa +Jozwiak +Jozwick +Ju +Juaire +Juan +Juanico +Juarbe +Juares +Juarez +Juariqui +Juart +Juba +Juback +Jubb +Jubeh +Jubert +Jubic +Jubie +Jubilee +Jubinville +Jubran +Jubyna +Jucean +Juckett +Juda +Judah +Judd +Jude +Judge +Judice +Judie +Judkins +Judon +Judson +Judy +Jue +Juedes +Juel +Juelfs +Juelich +Juell +Juen +Juenemann +Juenger +Juengling +Juergens +Juett +Jufer +Jugan +Jugo +Juhas +Juhasz +Juhl +Juhnke +Jui +Juilfs +Jukes +Jukich +Julander +Julca +Julen +Jules +Julia +Julian +Juliana +Juliano +Juliar +Julias +Julien +Juliet +Julio +Julitz +Julius +Juliusson +Julock +Julson +Julsrud +Juluke +July +Julye +Jumalon +Jumbo +Jumonville +Jump +Jumper +Jun +Juncaj +Juncker +Jund +Jundt +June +Juneau +Juneja +Junes +Jung +Jungbluth +Jungck +Junge +Jungels +Jungen +Jungers +Junghans +Jungling +Jungman +Jungquist +Jungwirth +Junick +Juniel +Junior +Junious +Juniper +Junius +Junk +Junke +Junker +Junkersfeld +Junkin +Junkins +Junod +Junor +Juntunen +Jupin +Jupiter +Jura +Jurado +Juran +Juras +Jurasek +Jurasin +Juray +Jurcik +Jurczak +Jurczyk +Jurden +Jure +Jurek +Jurewicz +Jurez +Jurgen +Jurgens +Jurgensen +Jurgensmeier +Jurgensmeyer +Jurgenson +Jurica +Jurich +Juriga +Jurik +Jurin +Jurina +Juris +Jurisch +Jurist +Jurkiewicz +Jurkovich +Jurkowski +Jurney +Jurries +Jurs +Jury +Jusino +Jusko +Just +Justak +Justason +Juste +Justen +Justesen +Justian +Justice +Justin +Justine +Justinger +Justiniano +Justino +Justis +Justiss +Justman +Justo +Justus +Jutras +Jutte +Juul +Juve +Juvenal +Juvera +Juza +Ka +Kaai +Kaaihue +Kaak +Kaan +Kaanana +Kaarlela +Kaas +Kaase +Kaatz +Kaaua +Kaauamo +Kaawa +Kaaz +Kaba +Kababik +Kabacinski +Kabala +Kabanuck +Kabat +Kabba +Kabel +Kaber +Kabigting +Kabina +Kabir +Kabler +Kaboos +Kabrick +Kabus +Kabzinski +Kacerski +Kach +Kachel +Kachelmeyer +Kacher +Kachermeyer +Kachikian +Kachiroubas +Kachmar +Kachmarsky +Kacic +Kacik +Kackley +Kacprowski +Kacvinsky +Kacynski +Kaczka +Kaczmarczyk +Kaczmarek +Kaczmarski +Kaczor +Kaczorowski +Kaczynski +Kadakia +Kadar +Kade +Kadel +Kadelak +Kader +Kaderlik +Kadi +Kading +Kadis +Kadish +Kadle +Kadlec +Kadlubowski +Kadner +Kadow +Kadri +Kaduk +Kady +Kaea +Kaeding +Kaehler +Kaelin +Kaelker +Kaemingk +Kaemmerer +Kaemmerling +Kaempfer +Kaeo +Kaer +Kaercher +Kaesemeyer +Kaeser +Kaestner +Kaetzel +Kaewprasert +Kafel +Kafer +Kaffka +Kafka +Kafton +Kagan +Kagarise +Kagawa +Kagay +Kagel +Kager +Kagey +Kagimoto +Kagle +Kagy +Kah +Kahae +Kahahane +Kahal +Kahalehoe +Kahaleua +Kahan +Kahana +Kahanaoi +Kahanek +Kahao +Kahawai +Kahele +Kahen +Kahill +Kahl +Kahle +Kahler +Kahley +Kahn +Kahola +Kahoohalphala +Kahookele +Kahoun +Kahre +Kahrer +Kahrs +Kahuhu +Kai +Kaiama +Kaib +Kaid +Kaighn +Kaigle +Kaigler +Kaiktsian +Kail +Kailey +Kaili +Kailiponi +Kain +Kaina +Kaines +Kaing +Kainoa +Kainz +Kais +Kaiser +Kaiserman +Kaitz +Kaiwi +Kaizer +Kaja +Kajder +Kakacek +Kakani +Kakar +Kakaviatos +Kakeh +Kakimoto +Kakos +Kakowski +Kaku +Kakudji +Kala +Kalaf +Kalafarski +Kalafatis +Kalafut +Kalahiki +Kalal +Kalama +Kalamaras +Kalan +Kalandek +Kalani +Kalar +Kalas +Kalata +Kalathas +Kalauli +Kalawe +Kalb +Kalbach +Kalbaugh +Kalberer +Kalberg +Kalbfleisch +Kalchik +Kalchthaler +Kaldahl +Kaldas +Kale +Kaleel +Kalehuawehe +Kaleiwahea +Kalen +Kalenak +Kalenkoski +Kaleohano +Kaler +Kalert +Kales +Kaleta +Kaley +Kalfa +Kalfas +Kalfayan +Kalfus +Kalgren +Kalhorn +Kali +Kalich +Kalichman +Kaliher +Kalil +Kalima +Kalin +Kalina +Kalinger +Kalinoski +Kalinowski +Kalinski +Kalis +Kalisch +Kalisek +Kalish +Kalista +Kaliszewski +Kaliszuk +Kalk +Kalka +Kalkbrenner +Kalkman +Kalkwarf +Kall +Kalla +Kallaher +Kallal +Kallam +Kalland +Kallas +Kallberg +Kallbrier +Kallen +Kallenbach +Kallenberg +Kallenberger +Kaller +Kallestad +Kallevig +Kalley +Kallfelz +Kallhoff +Kallin +Kallio +Kallman +Kallmeyer +Kalloch +Kallstrom +Kallus +Kalman +Kalmar +Kalmbach +Kalmen +Kalmer +Kalmus +Kaloi +Kaloudis +Kaloustian +Kalp +Kalpakoff +Kalscheuer +Kalsow +Kalt +Kaltefleiter +Kaltenbach +Kaltenhauser +Kalter +Kalthoff +Kaltved +Kaltz +Kalua +Kaluna +Kalupa +Kaluzny +Kalvaitis +Kalvig +Kam +Kama +Kamada +Kamai +Kamaka +Kamakea +Kamal +Kamalii +Kaman +Kamansky +Kamara +Kamat +Kamaunu +Kamb +Kamber +Kame +Kamealoha +Kamel +Kamelamela +Kamemoto +Kamen +Kamens +Kamensky +Kamer +Kamerad +Kamerer +Kamerling +Kamienski +Kamimura +Kamin +Kaminaka +Kaminer +Kaminetzky +Kaminska +Kaminski +Kaminsky +Kamirez +Kamiya +Kamke +Kamler +Kamm +Kamman +Kammann +Kammel +Kammer +Kammerdiener +Kammerer +Kammerzell +Kammes +Kammler +Kamna +Kamnik +Kamp +Kampa +Kampe +Kampen +Kamper +Kampf +Kampfer +Kamph +Kamphoefner +Kampman +Kampmann +Kampner +Kamps +Kamradt +Kamrath +Kamrowski +Kamstra +Kamuda +Kan +Kana +Kanaan +Kanable +Kanady +Kanae +Kanagy +Kanahele +Kanai +Kanakares +Kanan +Kanarek +Kanaris +Kanas +Kanatzar +Kand +Kanda +Kandarian +Kandel +Kander +Kandoll +Kandra +Kandt +Kanduth +Kane +Kaneakua +Kanealii +Kaneholani +Kaneko +Kanekuni +Kanelos +Kanemoto +Kaner +Kaneshiro +Kaneta +Kanevsky +Kang +Kangas +Kangleon +Kania +Kaniecki +Kaniewski +Kanipe +Kanis +Kanish +Kanjirathinga +Kann +Kannady +Kannan +Kannard +Kannas +Kanne +Kannel +Kannenberg +Kanner +Kanney +Kanniard +Kanno +Kano +Kanoa +Kanode +Kanoff +Kanoon +Kanosh +Kanoy +Kanoza +Kansas +Kansky +Kant +Kanta +Kantah +Kantarian +Kanter +Kanthak +Kantis +Kantner +Kantola +Kantor +Kantrowitz +Kantz +Kanwar +Kanz +Kanzenbach +Kanzler +Kao +Kaopua +Kap +Kapa +Kapadia +Kapahu +Kapanke +Kapaun +Kapelke +Kaper +Kaperonis +Kapetanos +Kapfer +Kapichok +Kapiloff +Kapinos +Kapitula +Kapke +Kaplan +Kapler +Kaplin +Kaplowitz +Kaplun +Kapnick +Kapoi +Kapoor +Kapp +Kappa +Kappe +Kappel +Kappeler +Kappelmann +Kappen +Kapper +Kapperman +Kappes +Kapphahn +Kappler +Kapps +Kapral +Kapraun +Kaps +Kapsalis +Kapsner +Kapsos +Kapur +Kapuscinski +Kapusniak +Kar +Kara +Karabin +Karadimas +Karaffa +Karageorge +Karagiannes +Karagiannis +Karakas +Karalis +Karam +Karamchandani +Karangelen +Karapetian +Karapetyan +Karas +Karasek +Karasti +Karathanasis +Karatz +Karau +Karayan +Karban +Karbowski +Karch +Karcher +Karcich +Karcz +Karczewski +Kardas +Kardashian +Kardell +Kardos +Kardux +Kareem +Karel +Karell +Karella +Karels +Karen +Karg +Karge +Karger +Karhoff +Kari +Kariger +Karim +Karimi +Karin +Karins +Karjala +Karkut +Karl +Karle +Karlen +Karley +Karlgaard +Karlin +Karlinsky +Karlovich +Karls +Karlsen +Karlson +Karlsson +Karlstad +Karma +Karman +Karmann +Karmazyn +Karmel +Karmely +Karmo +Karn +Karnas +Karnath +Karner +Karnes +Karney +Karnish +Karnofski +Karnopp +Karns +Karo +Karol +Karoly +Karow +Karp +Karpe +Karpel +Karpen +Karper +Karpf +Karpiak +Karpin +Karpinen +Karpinski +Karpinsky +Karpowich +Karpowicz +Karpstein +Karr +Karraker +Karras +Karratti +Karrels +Karren +Karrenberg +Karro +Karroach +Karry +Karsh +Karshner +Karsnak +Karst +Karsten +Karstens +Karstensen +Karstetter +Kartchner +Karter +Kartes +Karth +Kartman +Karty +Kartye +Karvis +Karvonen +Karwoski +Karwowski +Kary +Karz +Kasa +Kasack +Kasahara +Kasal +Kascak +Kasch +Kaschak +Kaschel +Kaschmitter +Kasdon +Kase +Kasee +Kasel +Kasemeier +Kasen +Kaser +Kasey +Kash +Kashan +Kashani +Kashner +Kashuba +Kasica +Kasik +Kasimis +Kasinger +Kaska +Kaskey +Kasky +Kasmarek +Kasmir +Kasowski +Kaspar +Kasparek +Kaspari +Kasparian +Kasper +Kasperek +Kasperski +Kasprak +Kasprowicz +Kasprzak +Kasprzyk +Kass +Kassa +Kassab +Kassabaum +Kassabian +Kassam +Kassay +Kassebaum +Kassel +Kassell +Kassem +Kasserman +Kassim +Kassin +Kassing +Kassis +Kassler +Kassman +Kassner +Kasson +Kassouf +Kassulke +Kast +Kastanes +Kastein +Kastel +Kasten +Kastendieck +Kastens +Kaster +Kasting +Kastl +Kastler +Kastman +Kastner +Kastning +Kastor +Kasuba +Kasuboski +Kasula +Kasun +Kaszinski +Kaszton +Kaszuba +Kaszynski +Kata +Katan +Kataoka +Katayama +Katcher +Katcsmorak +Kate +Katechis +Kately +Katen +Kater +Kates +Kath +Kathan +Katheder +Kathel +Kathleen +Kathman +Katie +Katin +Katis +Katke +Katnik +Kato +Katoa +Katoh +Katon +Katona +Katos +Katowicz +Katra +Kats +Katsaounis +Katsbulas +Katsch +Katsuda +Katt +Kattan +Kattaura +Katten +Katterjohn +Kattner +Katula +Katynski +Katz +Katzaman +Katzberg +Katzen +Katzenbach +Katzenberg +Katzenberger +Katzer +Katzman +Katzmann +Katzmark +Katzner +Kaua +Kauahi +Kaub +Kauble +Kaucher +Kauder +Kauer +Kauffeld +Kauffman +Kauffmann +Kaufhold +Kaufman +Kaufmann +Kaufusi +Kaui +Kauk +Kaukola +Kaul +Kaull +Kaumans +Kaumo +Kaune +Kaunisto +Kauo +Kaup +Kauphusman +Kaupp +Kauppi +Kaupu +Kaur +Kaus +Kausch +Kaushal +Kaushiva +Kaut +Kautz +Kautzer +Kautzman +Kauzlarich +Kava +Kavadias +Kavanagh +Kavanah +Kavanaugh +Kavaney +Kave +Kaveney +Kaveny +Kavin +Kawa +Kawaa +Kawachi +Kawaguchi +Kawahara +Kawai +Kawaiaea +Kawakami +Kawamoto +Kawamura +Kawano +Kawasaki +Kawashima +Kawata +Kawczynski +Kawell +Kawelo +Kawski +Kawulok +Kay +Kaya +Kayastha +Kayat +Kaye +Kayes +Kayler +Kaylo +Kaylor +Kayrouz +Kays +Kayser +Kaywood +Kaz +Kaza +Kazabi +Kazakos +Kazan +Kazanjian +Kazanowski +Kazar +Kazarian +Kazda +Kazeck +Kazee +Kazemi +Kazi +Kazimi +Kazin +Kazmer +Kazmi +Kazmierczak +Kazmierski +Kazmorck +Kazunas +Ke +Kea +Keach +Keadle +Keady +Keaffaber +Keagle +Keagy +Keahey +Keal +Keala +Kealey +Kealoha +Kealohanui +Kealy +Keamo +Keams +Kean +Keane +Keaney +Keanu +Keanum +Keany +Kear +Kearbey +Kearby +Kearin +Kearl +Kearley +Kearn +Kearney +Kearns +Kearny +Kears +Kearse +Kearsey +Kearsley +Keas +Keaser +Keasey +Keasler +Keasley +Keast +Keat +Keate +Keaten +Keath +Keathley +Keating +Keatley +Keaton +Keator +Keats +Keatts +Keaty +Keaveney +Keaveny +Keavney +Keawe +Keay +Keba +Kebalka +Kebe +Kebede +Kebert +Keblish +Kebort +Keck +Kecker +Keckler +Kecskes +Keddy +Kedia +Keding +Kedley +Kedra +Kedzierski +Kee +Keeble +Keebler +Keech +Keedah +Keedy +Keef +Keefauver +Keefe +Keefer +Keefner +Keegan +Keehan +Keehn +Keehne +Keehner +Keel +Keelan +Keele +Keeler +Keeley +Keelin +Keeling +Keels +Keely +Keeman +Keemer +Keen +Keena +Keenan +Keene +Keener +Keeneth +Keeney +Keenom +Keens +Keenum +Keeny +Keep +Keepers +Keer +Keeran +Keery +Kees +Keese +Keesecker +Keesee +Keeser +Keesey +Keesler +Keesling +Keet +Keetan +Keetch +Keeter +Keeth +Keeton +Keets +Keever +Keezer +Kefauver +Keffer +Kegel +Kegerries +Kegg +Kegler +Kegley +Keglovic +Keh +Kehew +Kehl +Kehler +Kehm +Kehn +Kehoe +Kehr +Kehrer +Kehres +Kehs +Keib +Keicher +Keidong +Keifer +Keiffer +Keiger +Keigley +Keihl +Keil +Keilen +Keilholtz +Keilholz +Keilty +Keim +Keimig +Keinonen +Keipe +Keiper +Keir +Keirn +Keirnan +Keirns +Keirstead +Keis +Keisacker +Keisel +Keiser +Keisker +Keisler +Keisling +Keiss +Keister +Keiswetter +Keitel +Keiter +Keith +Keithan +Keithley +Keithly +Keitsock +Keitt +Keitzer +Keizer +Kekahuna +Kekiwi +Keks +Kekua +Kela +Kelash +Kelau +Kelch +Kelchner +Kelcourse +Kelder +Kelderman +Keledjian +Keleher +Keleman +Kelemen +Kelii +Keliiholokai +Keliihoomalu +Keliikoa +Keliipaakaua +Keliipio +Kelk +Kelker +Kell +Kellam +Kellams +Kellan +Kellar +Kellaway +Kellebrew +Kelleher +Kellem +Kellems +Kellen +Kellenberger +Keller +Kellerhouse +Kellerman +Kellermann +Kellett +Kelley +Kellie +Kelliher +Kellin +Kelling +Kellis +Kellish +Kellison +Kellman +Kelln +Kellner +Kello +Kellog +Kellogg +Kellom +Kellon +Kellough +Kellow +Kells +Kellstrom +Kellum +Kelly +Kellywood +Kelm +Kelman +Kelnhofer +Kelp +Kelsay +Kelsch +Kelsey +Kelsheimer +Kelso +Kelsoe +Kelson +Kelstrom +Kelter +Keltner +Kelton +Keltt +Kelty +Keltz +Kelzer +Kem +Kemble +Kemerer +Kemerling +Kemerly +Kemery +Kemfort +Kemick +Kemler +Kemme +Kemmer +Kemmerer +Kemmeries +Kemmerlin +Kemmerling +Kemmis +Kemmler +Kemna +Kemner +Kemnitz +Kemp +Kempa +Kempe +Kempel +Kempen +Kemper +Kempf +Kempfer +Kemph +Kempinski +Kempisty +Kempkens +Kempker +Kemple +Kempler +Kemplin +Kempner +Kempon +Kemppainen +Kemps +Kempson +Kempster +Kempt +Kempter +Kempton +Ken +Kenaan +Kenady +Kenaga +Kenagy +Kenan +Kendal +Kendall +Kendell +Kenderdine +Kendi +Kendig +Kendle +Kendra +Kendrew +Kendrick +Kendricks +Kendrix +Kendzierski +Kendzior +Kendziora +Keneally +Kenealy +Kenebrew +Kenefick +Keneipp +Kenekham +Kenely +Keney +Kenfield +Kenik +Kenimer +Keniry +Kenison +Keniston +Kenkel +Kenley +Kenmore +Kenna +Kennady +Kennamer +Kennamore +Kennan +Kennard +Kennaugh +Kenndey +Kenndy +Kenne +Kenneally +Kennealy +Kennebeck +Kennebrew +Kennedy +Kennel +Kennell +Kennelley +Kennelly +Kennelty +Kennemer +Kennemore +Kennemur +Kennemuth +Kenner +Kennerly +Kennerson +Kennet +Kenneth +Kennett +Kenney +Kenngott +Kennie +Kennin +Kenning +Kennington +Kennis +Kennison +Kenniston +Kennon +Kenny +Keno +Kenon +Kenouo +Kenoyer +Kenrick +Kensey +Kensinger +Kenson +Kent +Kenter +Kentner +Kenton +Kenwood +Kenworthy +Kenyon +Kenzie +Keo +Keobaunleuang +Keodalah +Keogan +Keogh +Keoghan +Keohane +Keomanivong +Keomany +Keomuangtai +Keough +Keovongxay +Keown +Kepani +Kephart +Kepke +Kepler +Kepley +Keplin +Keplinger +Kepner +Kepp +Keppel +Keppers +Kepple +Keppler +Keppner +Ker +Keranen +Kerans +Kerbel +Kerber +Kerbo +Kerbow +Kerbs +Kerby +Kercado +Kerce +Kerchal +Kercheff +Kercher +Kercheval +Kerchner +Kercy +Kerechanko +Kerekes +Kereluk +Kerens +Kerestes +Kerfien +Kerfoot +Kerger +Keri +Kerin +Kerins +Kerk +Kerkel +Kerker +Kerkhoff +Kerkman +Kerksiek +Kerkvliet +Kerl +Kerley +Kerlin +Kerman +Kermes +Kern +Kernagis +Kernan +Kerne +Kernell +Kernen +Kerner +Kernes +Kerney +Kernighan +Kernodle +Kerns +Kerntke +Kero +Keros +Kerper +Kerr +Kerrick +Kerrigan +Kerry +Kersch +Kerscher +Kerschner +Kersey +Kersh +Kershaw +Kershbaumer +Kershner +Kerska +Kerslake +Kerson +Kerss +Kerst +Kerstein +Kersten +Kerstetter +Kersting +Kertels +Kertesz +Kerth +Kertis +Kertz +Kertzman +Kervin +Kerwin +Kerwood +Kerzer +Kerzman +Kesby +Kesek +Keser +Kesey +Keshishian +Keshishyan +Kesich +Kesinger +Keske +Keslar +Kesler +Kesley +Kesling +Kesner +Kess +Kessans +Kessel +Kessell +Kesselman +Kesselring +Kessenich +Kessinger +Kessler +Kessner +Kesson +Kesten +Kester +Kesterson +Kestle +Kestler +Kestner +Keszler +Ket +Ketay +Ketch +Ketcham +Ketchem +Ketchen +Ketcher +Ketchersid +Ketcherside +Ketcheside +Ketchie +Ketchum +Ketelaar +Ketelhut +Ketelsen +Kethcart +Ketler +Ketner +Keto +Ketola +Ketring +Ketron +Kett +Kettel +Kettell +Kettelle +Kettenring +Ketter +Ketterer +Kettering +Ketteringham +Ketterl +Ketterling +Ketterman +Kettinger +Kettl +Kettle +Kettler +Kettlewell +Kettman +Kettmann +Kettner +Ketzler +Keuler +Keup +Keuper +Kevan +Kevelin +Kever +Kevern +Keveth +Keville +Kevin +Kevorkian +Kevwitch +Kew +Kewal +Kewanwytewa +Kewish +Kexel +Key +Keye +Keyes +Keyl +Keylon +Keylor +Keyna +Keyon +Keys +Keyser +Keyt +Keyton +Keywan +Keyworth +Kezar +Kezele +Keziah +Kha +Khachatoorian +Khairallah +Khalaf +Khaleck +Khaleel +Khalid +Khalifah +Khalife +Khalil +Khalili +Khalsa +Kham +Khammixay +Khamo +Khamsyuorauon +Khamvongsa +Khan +Khang +Khanna +Khano +Khanponaphan +Khansari +Khare +Khat +Khatak +Khatcherian +Khatib +Khatri +Khauv +Khay +Khazaleh +Khazdozian +Khela +Khemmanivong +Khensamphanh +Khensovan +Kher +Khiev +Khilling +Khim +Khlok +Khn +Kho +Khokher +Kholodivker +Khong +Khoo +Khora +Khosravi +Khou +Khoun +Khounborine +Khounthavong +Khouri +Khoury +Khov +Khu +Khubba +Khum +Khuu +Kiah +Kiang +Kiani +Kibbe +Kibbee +Kibbey +Kibble +Kibbler +Kibby +Kibe +Kibel +Kibler +Kibodeaux +Kichline +Kick +Kickel +Kicker +Kicklighter +Kicks +Kid +Kida +Kidane +Kidd +Kidder +Kiddle +Kiddy +Kidner +Kidney +Kidwell +Kie +Kiebala +Kiebler +Kieck +Kiecker +Kiedrowski +Kief +Kiefel +Kiefer +Kiefert +Kieff +Kieffer +Kieft +Kieger +Kiehl +Kiehm +Kiehn +Kiehne +Kiekbusch +Kieke +Kiel +Kielar +Kielbasa +Kieler +Kielich +Kielman +Kielty +Kiely +Kienast +Kienbaum +Kiener +Kiening +Kienitz +Kienle +Kienow +Kientz +Kientzy +Kienzle +Kiepert +Kier +Kierce +Kiernan +Kierstead +Kierzewski +Kies +Kiesel +Kieser +Kiesewetter +Kiesling +Kiesow +Kiesser +Kiessling +Kiest +Kiester +Kiesz +Kietzer +Kietzman +Kiever +Kievit +Kiewiet +Kifer +Kiffe +Kiffer +Kiflezghie +Kiger +Kiggins +Kight +Kightlinger +Kihlstrom +Kihn +Kiili +Kijak +Kijek +Kijowski +Kiker +Kikkert +Kiko +Kikuchi +Kil +Kilarjian +Kilb +Kilbane +Kilberg +Kilbert +Kilborn +Kilborne +Kilbourn +Kilbourne +Kilbride +Kilburn +Kilbury +Kilby +Kilcher +Kilcoyne +Kilcrease +Kilcrest +Kilcullen +Kildare +Kilday +Kildoo +Kildow +Kilduff +Kile +Kiles +Kiley +Kilfoyle +Kilgallon +Kilger +Kilgo +Kilgor +Kilgore +Kilgour +Kilian +Kilichowski +Kilimnik +Kilkenny +Kilker +Kilkus +Kill +Killam +Killary +Killay +Kille +Killeagle +Killean +Killebrew +Killeen +Killelea +Killen +Killer +Killette +Killgore +Killian +Killiany +Killibrew +Killick +Killilea +Killin +Killingbeck +Killinger +Killings +Killingsworth +Killingworth +Killins +Killion +Killius +Killman +Killmer +Killmeyer +Killmon +Killoran +Killoren +Killough +Killoy +Killpack +Kilman +Kilmartin +Kilmer +Kilmister +Kilmon +Kilner +Kilness +Kilogan +Kilpatrick +Kilroy +Kilson +Kilstofte +Kiltie +Kilton +Kilts +Kilty +Kiltz +Kilver +Kilzer +Kim +Kimak +Kimbal +Kimball +Kimbel +Kimbell +Kimber +Kimberl +Kimberley +Kimberlin +Kimberling +Kimberly +Kimble +Kimbler +Kimbley +Kimbral +Kimbrel +Kimbrell +Kimbriel +Kimbril +Kimbro +Kimbrough +Kimbrow +Kime +Kimel +Kimery +Kimes +Kimler +Kimm +Kimme +Kimmel +Kimmell +Kimmer +Kimmerle +Kimmes +Kimmet +Kimmey +Kimminau +Kimmins +Kimmons +Kimoto +Kimpel +Kimple +Kimpton +Kimrey +Kimsey +Kimura +Kimzey +Kin +Kina +Kinabrew +Kinahan +Kinaj +Kinan +Kinard +Kinart +Kinas +Kinatyan +Kincade +Kincaid +Kincaide +Kincannon +Kincer +Kincey +Kinch +Kincheloe +Kinchen +Kincy +Kind +Kindall +Kindberg +Kinde +Kindel +Kindell +Kinder +Kinderknecht +Kinderman +Kindermann +Kindig +Kindl +Kindla +Kindle +Kindler +Kindley +Kindlimann +Kindred +Kindregan +Kindrick +Kinds +Kindschuh +Kindt +Kine +Kiner +Kinerson +Kines +King +Kingcade +Kingdom +Kingdon +Kingen +Kingery +Kingfisher +Kingham +Kinghorn +Kingma +Kingman +Kingore +Kingrey +Kingry +Kings +Kingsberry +Kingsbury +Kingsford +Kingshott +Kingsland +Kingsley +Kingsolver +Kingson +Kingston +Kington +Kingwood +Kini +Kinikini +Kinion +Kiniry +Kinkade +Kinkaid +Kinkead +Kinkel +Kinkelaar +Kinkella +Kinker +Kinkin +Kinkle +Kinlaw +Kinlecheeny +Kinley +Kinlin +Kinloch +Kinlock +Kinman +Kinn +Kinna +Kinnaird +Kinnaman +Kinnamon +Kinnan +Kinnard +Kinnare +Kinne +Kinnear +Kinnebrew +Kinneman +Kinner +Kinnett +Kinney +Kinniburgh +Kinnick +Kinnie +Kinnier +Kinning +Kinningham +Kinnion +Kinnison +Kinnon +Kinnunen +Kinoshita +Kinroth +Kins +Kinsel +Kinsella +Kinser +Kinseth +Kinsey +Kinsinger +Kinsky +Kinsland +Kinsler +Kinsley +Kinslow +Kinsman +Kinsolving +Kinson +Kinstle +Kinstler +Kint +Kinter +Kintigh +Kintner +Kinton +Kintop +Kintopp +Kintsel +Kintz +Kintzel +Kintzer +Kinville +Kinyon +Kinzel +Kinzer +Kinzie +Kinzig +Kinzinger +Kinzle +Kio +Kious +Kip +Kiper +Kipfer +Kiphart +Kipka +Kipling +Kipp +Kippel +Kipper +Kippes +Kipping +Kipple +Kippley +Kipps +Kiracofe +Kirakosyan +Kiral +Kiraly +Kirberger +Kirbie +Kirbo +Kirby +Kirch +Kirchausen +Kirchbaum +Kirchberg +Kirchen +Kircher +Kirchgesler +Kirchgessner +Kirchherr +Kirchhofer +Kirchhoff +Kirchman +Kirchmann +Kirchmeier +Kirchner +Kirchoff +Kirckof +Kirgan +Kiritsy +Kirk +Kirkbride +Kirkby +Kirkconnell +Kirkeby +Kirkegaard +Kirkendall +Kirkendoll +Kirker +Kirkey +Kirkham +Kirkhart +Kirkland +Kirklen +Kirkley +Kirklin +Kirkling +Kirkman +Kirkner +Kirkness +Kirkpatric +Kirkpatrick +Kirks +Kirksey +Kirkwood +Kirley +Kirlin +Kirmer +Kirn +Kirner +Kirnon +Kirouac +Kirovac +Kirsch +Kirschbaum +Kirschenbaum +Kirschenman +Kirschenmann +Kirschke +Kirschman +Kirschner +Kirscht +Kirsh +Kirshman +Kirshner +Kirson +Kirsopp +Kirst +Kirstein +Kirsten +Kirt +Kirtdoll +Kirtland +Kirtley +Kirtner +Kirton +Kirts +Kirven +Kirvin +Kirwan +Kirwin +Kiryakoza +Kirylo +Kisak +Kisamore +Kisch +Kise +Kiser +Kish +Kishaba +Kishbaugh +Kishel +Kishi +Kishimoto +Kisicki +Kisiel +Kisielewski +Kisinger +Kisker +Kisler +Kisling +Kisner +Kisor +Kisro +Kiss +Kissack +Kissam +Kissane +Kissee +Kissel +Kisselburg +Kissell +Kisser +Kissi +Kissick +Kissik +Kissinger +Kissler +Kissling +Kissner +Kist +Kistenmacher +Kister +Kistle +Kistler +Kistner +Kisto +Kiszka +Kita +Kitagawa +Kitamura +Kitanik +Kitch +Kitchel +Kitchell +Kitchen +Kitchenman +Kitchens +Kitcher +Kitchin +Kitching +Kite +Kitelinger +Kithcart +Kitka +Kitner +Kitsmiller +Kitson +Kitt +Kittel +Kittelberger +Kittell +Kittelman +Kittelson +Kitten +Kitterman +Kitthikoune +Kittinger +Kittle +Kittler +Kittles +Kittleson +Kittner +Kitto +Kittredge +Kittrell +Kitts +Kitty +Kitz +Kitzerow +Kitzman +Kitzmiller +Kitzrow +Kivel +Kivela +Kivett +Kivi +Kivioja +Kivisto +Kiyabu +Kiyuna +Kizer +Kizewski +Kizior +Kizzee +Kizzia +Kizziar +Kizzie +Kjar +Kjeldgaard +Kjelland +Kjellberg +Kjellman +Kjellsen +Kjergaard +Kjetland +Kjolseth +Kjos +Klaameyer +Klaas +Klaass +Klaassen +Klabunde +Klacic +Klaers +Klafehn +Klaft +Klages +Klahn +Klahr +Klaiber +Klaich +Klaja +Klakowicz +Klaman +Klamert +Klamet +Klamm +Klammer +Klamn +Klan +Klancnik +Klande +Klang +Klann +Klapec +Klaphake +Klapp +Klapper +Klapperich +Klappholz +Klar +Klarberg +Klare +Klaren +Klarich +Klarin +Klarman +Klarr +Klas +Klase +Klasen +Klasing +Klasinski +Klass +Klassen +Klatt +Klatte +Klauer +Klaus +Klauser +Klausner +Klave +Klaver +Klavetter +Klavon +Klavuhn +Klawinski +Klawiter +Klawitter +Klawuhn +Klay +Klayman +Klear +Kleban +Klebanoff +Klebanow +Klebe +Kleber +Klebes +Klecha +Kleck +Klecker +Kleckley +Kleckner +Klee +Kleeb +Kleefisch +Kleekamp +Kleeman +Kleen +Klees +Kleese +Kleespies +Kleffman +Kleffner +Kleftogiannis +Klegin +Klehn +Klei +Kleiber +Kleiboeker +Kleid +Kleidon +Kleier +Kleifgen +Kleiman +Kleimola +Klein +Kleinberg +Kleinberger +Kleindienst +Kleine +Kleiner +Kleinert +Kleinfeld +Kleinfelder +Kleinhans +Kleinhenz +Kleinke +Kleinknecht +Kleinkopf +Kleinman +Kleinmann +Kleinpeter +Kleinsasser +Kleinschmidt +Kleinsmith +Kleinsorge +Kleintop +Kleinwolterin +Kleis +Kleist +Klem +Kleman +Klemanski +Klemash +Klemen +Klemenc +Klemencic +Klemens +Klement +Klemetson +Klemisch +Klemish +Klemke +Klemm +Klemme +Klemp +Klempa +Klena +Klenk +Klenke +Klenovich +Klepac +Klepacki +Klepacz +Kleparek +Klepchick +Klepfer +Kleppe +Kleppen +Klepper +Kleppinger +Kless +Kletschka +Klett +Klette +Kleve +Kleven +Klevene +Klever +Klevjer +Kley +Kleyman +Kleypas +Klez +Klice +Klich +Klick +Klicka +Klicker +Klickman +Kliebert +Kliem +Klien +Klier +Kliethermes +Kliever +Kliewer +Kliger +Klima +Klimas +Klimaszewski +Klimavicius +Klimczyk +Klimek +Kliment +Klimes +Klimesh +Klimko +Klimkowicz +Klimo +Klinck +Klindt +Kline +Klinedinst +Klinefelter +Klinekole +Klines +Klinetob +Kling +Klingaman +Klingbeil +Klingberg +Klinge +Klingel +Klingelhoefer +Klingelhoets +Klingen +Klingenberg +Klingenberger +Klingensmith +Klinger +Klingerman +Klingler +Klinglesmith +Klingman +Klingner +Klingshirn +Klinich +Klink +Klinkenberg +Klinker +Klinkhammer +Klinko +Klinner +Klinnert +Klinski +Klint +Klintworth +Klipfel +Klipp +Klippel +Klis +Klish +Kliskey +Klitsch +Klitz +Klitzing +Klitzner +Kljucaric +Kloberdanz +Klobucar +Kloc +Klocek +Klock +Klockars +Klocke +Kloeck +Kloefkorn +Kloeker +Kloeppel +Kloepper +Kloer +Klohe +Klohr +Klohs +Kloiber +Kloke +Klomp +Klonoski +Klonowski +Kloock +Kloos +Klopf +Klopfenstein +Klopfer +Klopp +Kloppenburg +Klos +Klose +Klosinski +Kloska +Klosky +Klosner +Klosowski +Kloss +Klossner +Kloster +Klosterman +Klostermann +Kloth +Klotz +Klotzbach +Klouda +Kluber +Kluck +Kludt +Kluemper +Kluender +Kluesner +Kluever +Klug +Kluge +Klugh +Klugman +Kluka +Klukan +Klukas +Klukken +Klump +Klumph +Klumpp +Klun +Klund +Klunder +Klunk +Klus +Kluse +Klusman +Klusmeyer +Kluss +Klussmann +Klute +Kluth +Klutts +Kluttz +Klutz +Kluver +Kluz +Klyce +Klym +Klyn +Kman +Kmatz +Kment +Kmet +Kmetz +Kmiec +Kmiecik +Kmiotek +Knaack +Knaak +Knab +Knabb +Knabe +Knabjian +Knable +Knack +Knackstedt +Knaebel +Knaff +Knaggs +Knake +Knall +Knap +Knapchuck +Knape +Knaphus +Knapick +Knapik +Knapke +Knapko +Knapp +Knappe +Knappenberger +Knapper +Knappert +Knarr +Knatt +Knaub +Knauer +Knauf +Knauff +Knaus +Knauss +Knaust +Knavel +Knazs +Knebel +Knecht +Knedler +Knee +Kneedler +Kneefe +Kneeland +Kneeskern +Knehans +Kneifel +Kneifl +Kneip +Kneisel +Kneisler +Kneisley +Knell +Kneller +Knellinger +Knepel +Knepp +Knepper +Knepshield +Knerien +Knerr +Knesek +Knesel +Kneser +Knestrick +Knetsch +Kneuper +Knewtson +Knezevic +Knezevich +Knezovich +Kniceley +Knicely +Knick +Knickelbein +Knickerbocker +Knickman +Knickrehm +Knie +Kniefel +Knieper +Knier +Knieriem +Knierim +Knies +Kniesel +Kniess +Knife +Kniffen +Kniffin +Knigge +Knight +Knighten +Knighter +Knightly +Knighton +Knights +Knightstep +Knilands +Knill +Kniola +Knipe +Knipfel +Kniphfer +Knipp +Knippel +Knippenberg +Knipper +Knippers +Knipping +Knipple +Knisely +Knisley +Knispel +Kniss +Knittel +Knittle +Knizley +Knknown +Knobbe +Knobel +Knoblauch +Knoble +Knobler +Knobloch +Knoblock +Knoch +Knoche +Knochel +Knock +Knockaert +Knocke +Knodel +Knoebel +Knoechel +Knoedler +Knoell +Knoepfler +Knoepke +Knoeppel +Knoerzer +Knoff +Knoflicek +Knoke +Knole +Knoles +Knoll +Knollenberg +Knollman +Knolton +Knoop +Knop +Knopf +Knopinski +Knopp +Knore +Knori +Knorp +Knorr +Knost +Knotek +Knoten +Knoth +Knotowicz +Knott +Knotts +Knouff +Knous +Knouse +Knowell +Knower +Knowiton +Knowles +Knowling +Knowlton +Knows +Knox +Knoy +Knuckles +Knudsen +Knudson +Knudsuig +Knudsvig +Knudtson +Knueppel +Knupke +Knupp +Knust +Knuteson +Knuth +Knutsen +Knutson +Knutt +Knutzen +Knyzewski +Ko +Koba +Koback +Kobak +Kobara +Kobashigawa +Kobayashi +Kobbe +Kobel +Kober +Koberg +Kobernick +Kobialka +Kobie +Kobis +Koble +Kobler +Koblick +Kobold +Kobrin +Kobryn +Kobs +Kobus +Kobylarczyk +Kobylarz +Kobylinski +Kobylski +Kobza +Koc +Kocab +Kocaj +Koch +Kochan +Kochanek +Kochanski +Kochel +Kochen +Kocher +Kochert +Kochevar +Kochheiser +Kochis +Kochkodin +Kochler +Kochmanski +Koci +Kocian +Kocieda +Kocik +Kociolek +Kock +Kocka +Kockler +Kocon +Kocourek +Kocsis +Kocur +Kocurek +Koczela +Koczera +Koczur +Koczwara +Koda +Kodadek +Kodama +Kodani +Kodera +Kodish +Kody +Koe +Koebel +Koebley +Koeck +Koegel +Koegler +Koehl +Koehler +Koehly +Koehn +Koehne +Koehnen +Koehring +Koeing +Koelbel +Koelewyn +Koelle +Koeller +Koelling +Koellmann +Koellner +Koelsch +Koelzer +Koen +Koenecke +Koeneman +Koenemund +Koenen +Koener +Koenig +Koenigs +Koenigsberg +Koenigsfeld +Koenigsman +Koenigstein +Koening +Koeninger +Koenitzer +Koenning +Koep +Koepf +Koepke +Koepnick +Koepp +Koeppe +Koeppel +Koeppen +Koepper +Koeppl +Koepsel +Koepsell +Koerber +Koerner +Koerper +Koers +Koerwitz +Koes +Koester +Koestler +Koestner +Koetje +Koets +Koetter +Koetting +Koetz +Koewler +Kofa +Kofahl +Koff +Koffler +Koffman +Kofford +Kofler +Kofman +Kofoed +Kofoid +Kofoot +Kofron +Kofutua +Koga +Kogan +Kogel +Kogen +Koger +Kogler +Koguchi +Kogut +Koh +Kohan +Kohara +Kohatsu +Kohel +Kohen +Kohl +Kohler +Kohles +Kohlhepp +Kohlhoff +Kohli +Kohlman +Kohlmeier +Kohlmeyer +Kohlmyer +Kohls +Kohm +Kohn +Kohnen +Kohner +Kohnert +Kohnke +Kohnz +Kohout +Kohr +Kohrman +Kohrs +Kohrt +Kohs +Kohus +Kohut +Koiner +Koinzan +Koistinen +Koitzsch +Koizumi +Kojima +Kok +Kokaly +Kokenge +Kokesh +Kokko +Koko +Kokocinski +Kokoska +Kokoszka +Kokubun +Kol +Kolacki +Kolaga +Kolakowski +Kolander +Kolar +Kolarik +Kolasa +Kolash +Kolasinski +Kolassa +Kolat +Kolata +Kolb +Kolbe +Kolbeck +Kolber +Kolberg +Kolbo +Kolbusz +Kolby +Kolda +Kolden +Kolding +Kole +Kolehmainen +Kolek +Kolen +Kolenda +Koles +Kolesar +Kolesnik +Kolias +Kolic +Kolich +Kolikas +Kolin +Kolinski +Kolinsky +Kolis +Kolk +Kolkemeyer +Kolker +Kolkhorst +Kolkman +Kolkmann +Kolkowski +Koll +Kollar +Kollasch +Kolle +Kollen +Koller +Kolling +Kollman +Kollmeyer +Kollmorgen +Kollos +Kollross +Kolm +Kolman +Kolmer +Kolmetz +Kolnik +Kolo +Koloc +Kolodziej +Kolodzieski +Kolodzik +Kology +Kolopajlo +Koloski +Kolosky +Kolp +Kolppa +Kolsrud +Kolstad +Kolter +Kolthoff +Kolts +Koltz +Kolupke +Kolwyck +Koma +Komada +Koman +Komar +Komara +Komarek +Komatsu +Komatz +Kombe +Komer +Kominek +Kominski +Komis +Komlos +Komm +Kommer +Komo +Komorowski +Komosinski +Komp +Komsthoeft +Komula +Kon +Konakowitz +Konarik +Konarski +Konat +Koncan +Konczak +Konczewski +Kondel +Konderla +Kondo +Kondos +Kondracki +Kondratowicz +Kone +Konecni +Konecny +Konefal +Konek +Konen +Konetchy +Koneval +Kong +Konger +Konicek +Konick +Konicki +Konieczka +Konieczko +Konieczny +Konig +Konigsberg +Konik +Koning +Konishi +Konkel +Konkle +Konkol +Konma +Konn +Konno +Kono +Konon +Konopacki +Konopacky +Konopka +Konopnicki +Konopski +Konow +Konowal +Konrad +Konruff +Konstantinidi +Kontogianis +Kontogiannis +Kontos +Konty +Konwinski +Konye +Konyn +Konz +Konzal +Konzen +Koo +Koob +Kooch +Koogle +Koogler +Kooistra +Kook +Kooken +Kooker +Kool +Koolman +Koon +Koonce +Koone +Koong +Koons +Koontz +Koonz +Koop +Koopman +Koopmann +Koopmans +Koor +Koors +Koos +Kooser +Koosman +Kooy +Kooyman +Kopacz +Kopald +Kopan +Kopas +Kopatz +Kopay +Kopchick +Kopczyk +Kopczynski +Kopec +Kopecky +Kopel +Kopelman +Koper +Kopera +Koperski +Kopet +Kopf +Kopfer +Kopiak +Kopiasz +Kopicko +Kopin +Kopinski +Kopis +Kopischke +Kopka +Kopke +Kopko +Koplin +Kopp +Koppa +Koppang +Koppel +Koppelman +Koppelmann +Koppen +Koppenhaver +Kopper +Kopperman +Kopperud +Koppes +Koppinger +Kopple +Kopplin +Kopps +Koppy +Kopriva +Koprowski +Kops +Kopsho +Kor +Korab +Koral +Koralewski +Koran +Korando +Korb +Korba +Korbal +Korbar +Korbel +Korber +Korbin +Korby +Korchnak +Korczynski +Kordas +Kordiak +Kordish +Kordowski +Kordsmeier +Kordus +Kordys +Koren +Korenek +Korenic +Kores +Koretsky +Korewdit +Korey +Korf +Korff +Korfhage +Korgie +Korhonen +Koria +Korineck +Korinek +Korinta +Koritko +Korkmas +Korman +Kormann +Kormos +Korn +Kornbau +Kornblatt +Kornblum +Kornbluth +Kornegay +Korner +Kornfeld +Kornfield +Kornhauser +Kornman +Kornn +Kornprobst +Kornreich +Kornrumpf +Korns +Koroch +Korol +Koroma +Korona +Korpal +Korpela +Korpi +Korsak +Korsen +Korshak +Korslund +Korsmeyer +Korst +Kort +Korte +Kortemeier +Kortge +Korth +Korthauer +Kortkamp +Kortright +Kortum +Kortz +Korus +Korvin +Korwatch +Korwin +Kory +Korynta +Korzenski +Korzep +Korzybski +Korzyniowski +Kos +Kosa +Kosack +Kosak +Kosakowski +Kosanke +Kosanovic +Kosar +Kosareff +Kosbab +Kosch +Koschnitzki +Koscho +Koscielak +Koscielniak +Koscinski +Kosco +Kosek +Kosel +Kosen +Koser +Kosh +Koshar +Koshi +Koshiol +Koshy +Kosiba +Kosicki +Kosier +Kosik +Kosin +Kosinar +Kosinski +Kosiorek +Kosir +Kositzke +Koska +Koskela +Koski +Koskie +Koskinen +Kosky +Koslan +Kosloski +Koslosky +Koslow +Koslowski +Kosmala +Kosman +Kosmatka +Kosmicki +Kosmowski +Koso +Kosoff +Kosofsky +Kosorog +Kososky +Kosowski +Koss +Kossack +Kossak +Kossakowski +Kosse +Kossen +Kossey +Kossin +Kossman +Kossmann +Kossow +Kost +Kostal +Kostecki +Kostek +Kostel +Kostelecky +Kostelnick +Kostelnik +Kosten +Kostenko +Koster +Kosters +Kostic +Kostich +Kostick +Kostis +Kostiuk +Kostiv +Kostka +Kostohryz +Kostrzewa +Kostura +Kosty +Kostyk +Kostyla +Kosuta +Koszyk +Kot +Kotaki +Kotara +Kotarski +Kotas +Kotch +Kotcher +Kotecki +Kotek +Koteles +Kotera +Koteras +Koterba +Kotey +Koth +Kothakota +Kothari +Kothe +Kotheimer +Kothenbeutel +Kotlar +Kotler +Kotlowski +Kotnik +Kotonski +Kotow +Kotowski +Kotrba +Kotrys +Kotschevar +Kotson +Kott +Kotte +Kottenstette +Kotter +Kotterna +Kottke +Kottler +Kottlowski +Kottman +Kottraba +Kottre +Kotts +Kottsick +Kottwitz +Kotula +Kotur +Kotyk +Kotz +Kotzen +Kotzur +Kou +Koualeski +Kouba +Koudelka +Kough +Koulabout +Koulalis +Koulavongsa +Kounce +Kounick +Kounkel +Kounlavong +Kounovsky +Kouns +Kounter +Kounthapanya +Kounthong +Kountz +Kouri +Kourkoumellis +Kourt +Koury +Kousonsavath +Koussa +Koutras +Koutz +Kouyate +Kovac +Kovacevic +Kovach +Kovacic +Kovacich +Kovacik +Kovack +Kovacs +Koval +Kovalaske +Kovalcheck +Kovalchik +Kovalcik +Kovalcin +Kovaleski +Kovalik +Kovalovsky +Kovalsky +Kovar +Kovarik +Kovarovic +Kovatch +Kovats +Kover +Koverman +Koves +Kovich +Kowal +Kowalchick +Kowalchuk +Kowalcyk +Kowalczyk +Kowald +Kowalec +Kowaleski +Kowalewski +Kowalik +Kowalke +Kowalkowski +Kowall +Kowallis +Kowalowski +Kowalske +Kowalski +Kowalsky +Kowing +Kowis +Kowitz +Kown +Kownacki +Koy +Koyama +Koyanagi +Koza +Kozak +Kozakiewicz +Kozan +Kozar +Kozatek +Kozee +Kozel +Kozeliski +Kozera +Kozeyah +Koziak +Kozicki +Koziel +Kozielski +Kozik +Kozikowski +Kozinski +Koziol +Kozisek +Kozlak +Kozlik +Kozloff +Kozloski +Kozlovsky +Kozlow +Kozlowski +Kozma +Kozola +Kozub +Kozubal +Kozuch +Kozusko +Kozyra +Kraack +Kraasch +Kraatz +Krabbe +Krabbenhoft +Krabel +Krabill +Krach +Kracht +Krack +Kracke +Kracker +Kradel +Kraebel +Kraeger +Kraemer +Kraetsch +Krafft +Kraft +Krag +Krage +Krager +Kragh +Kragt +Krah +Kraham +Krahe +Krahenbuhl +Krahn +Krahulec +Kraichely +Kraig +Krail +Krain +Krainbucher +Krajcer +Krajcik +Krajewski +Krajnik +Krajnovich +Krakauer +Krake +Kraker +Krakowiak +Krakowski +Krakowsky +Kral +Kralicek +Kralik +Kraling +Krall +Krallis +Krallman +Kram +Kramarczyk +Kramb +Kramer +Kramm +Krammer +Krammes +Kramp +Krampe +Kramper +Krampitz +Kranawetter +Krance +Krane +Kranendonk +Kraner +Kranich +Kranock +Krans +Krantz +Kranwinkle +Kranz +Kranze +Kranzler +Krapf +Krapfl +Krapp +Kras +Krase +Krasinski +Kraska +Kraskouskas +Krasley +Krasnansky +Krasnecky +Krasner +Krasnici +Krasnow +Krason +Krasovec +Krass +Krassow +Kraszewski +Kratchman +Kratky +Kratochvil +Kratochwil +Kratofil +Kratowicz +Kratt +Kratz +Kratzer +Kratzke +Krauel +Kraus +Krause +Krauser +Kraushaar +Krauskopf +Krausmann +Krauss +Krausse +Krausz +Kraut +Krauth +Kravec +Kravets +Kravetsky +Kravetz +Kravitz +Kravs +Krawchuk +Krawczyk +Krawetz +Krawiec +Krawiecz +Krawitz +Kray +Kraynak +Kreager +Kreamalmeyer +Kreamer +Kreatsoulas +Kreb +Krebbs +Krebel +Krebs +Krebsbach +Krech +Kreck +Kreeger +Kreese +Krefft +Kreft +Kreger +Kregger +Kreh +Krehbiel +Krehel +Kreidel +Kreider +Kreidler +Kreig +Kreiger +Kreighbaum +Kreiman +Kreimer +Krein +Kreinbring +Kreiner +Kreines +Kreinhagen +Kreis +Kreisberg +Kreischer +Kreisel +Kreiser +Kreisher +Kreisler +Kreisman +Kreiss +Kreissler +Kreiter +Kreitler +Kreitlow +Kreitner +Kreitz +Kreitzbender +Kreitzer +Krejci +Krejcik +Krejsa +Kreke +Krell +Kremen +Kremer +Kremers +Kremmel +Kremple +Krenek +Krenik +Krenke +Krenn +Krenning +Krentz +Krenz +Krenzer +Krenzke +Krepp +Krepps +Kreps +Kresal +Kresge +Kresha +Kresky +Kress +Kresse +Kressierer +Kressin +Kressler +Kretchmar +Kretlow +Kretschman +Kretschmann +Kretschmer +Kretsinger +Kretz +Kretzer +Kretzinger +Kretzschmar +Kreul +Kreusch +Kreuter +Kreutzbender +Kreutzer +Kreuzer +Kreuziger +Krewer +Krewson +Krey +Kribbs +Kribs +Krichbaum +Krick +Kridel +Krider +Kridler +Kriebel +Krieg +Kriege +Kriegel +Krieger +Kriegh +Kriegshauser +Kriek +Kriener +Krienke +Krier +Kriese +Kriesel +Krieser +Kriete +Krigbaum +Kriger +Krigger +Krikorian +Krill +Krimple +Kriner +Kring +Kringas +Kringel +Krings +Krinke +Krinov +Krinsky +Krips +Krise +Kriser +Krisher +Krishman +Krishna +Krishnamurthy +Krishnan +Krishun +Kriske +Kriskovich +Krisman +Kriss +Krissie +Krist +Kristan +Kristek +Kristen +Kristensen +Kristiansen +Kristianson +Kristin +Kristof +Kristoff +Kristofferson +Kriston +Kristy +Krites +Kriticos +Kritikos +Kritter +Kritz +Kritzer +Krivak +Krivanec +Krivanek +Kriz +Krizan +Krizek +Krnach +Krob +Krobath +Kroc +Krochmal +Krock +Kroeger +Kroeker +Kroell +Kroells +Kroemer +Kroencke +Kroener +Kroening +Kroenke +Kroes +Kroese +Kroesing +Kroetch +Kroetz +Kroeze +Krofft +Kroft +Krofta +Krog +Kroger +Krogh +Krogman +Krogmann +Krogstad +Kroh +Krohn +Krois +Krok +Krokos +Krokus +Krol +Krolak +Krolczyk +Krolick +Krolikowski +Kroll +Krom +Krome +Kromer +Kromka +Kromm +Krommes +Krompel +Kromrey +Kron +Kronau +Kronberg +Kronberger +Krone +Kronemeyer +Kronenberg +Kroner +Kroninger +Kronk +Kronstedt +Kroon +Kropf +Kropfelder +Kropff +Kropidlowski +Kropp +Kroschel +Kross +Krossen +Krostag +Krotine +Krotz +Krotzer +Krough +Kroupa +Krous +Krouse +Krout +Krovious +Krows +Krstic +Kruchten +Krucke +Kruckeberg +Kruckenberg +Krucker +Kruczek +Krudop +Kruebbe +Kruegel +Krueger +Kruel +Kruer +Krueth +Krug +Kruger +Krugh +Krugman +Kruiboesch +Kruis +Kruizenga +Kruk +Krukiel +Krukowski +Krul +Krulicki +Krulik +Krulish +Krull +Krum +Krumbach +Krumbein +Krumbholz +Krumenauer +Krumholz +Krumins +Kruml +Krumm +Krumme +Krummel +Krumrine +Krumroy +Krumsiek +Krumvieda +Krumwiede +Krupa +Krupansky +Krupiak +Krupicka +Krupinski +Krupinsky +Krupka +Krupke +Krupp +Kruppa +Kruppenbacher +Krupski +Krus +Kruschke +Kruse +Krusemark +Krusen +Krush +Krushansky +Kruskie +Krusor +Kruss +Kruszewski +Krutsch +Krutz +Kruyt +Kruzan +Kruzel +Kruzewski +Kry +Kryder +Krygier +Krylo +Krynicki +Krys +Krysh +Krysiak +Krysinski +Krysl +Kryst +Krystal +Krystek +Krystofiak +Kryston +Kryzak +Krzak +Krzal +Krzan +Krzeczkowski +Krzemien +Krzeminski +Krzesinski +Krzewinski +Krzykowski +Krzyminski +Krzynowek +Krzyston +Krzywicki +Krzyzanowski +Kshywonis +Ksiazek +Kszaszcz +Ku +Kua +Kuakini +Kualii +Kuamoo +Kuan +Kuang +Kuanoni +Kuarez +Kub +Kuba +Kubacki +Kubal +Kubala +Kuban +Kubas +Kubasch +Kubasik +Kubaska +Kubat +Kube +Kubeck +Kubecka +Kubeika +Kubera +Kuberski +Kubert +Kubes +Kubesh +Kubiak +Kubic +Kubica +Kubicek +Kubick +Kubicki +Kubicz +Kubie +Kubik +Kubilus +Kubin +Kubinski +Kubis +Kubish +Kubishta +Kubisiak +Kubiszewski +Kubitz +Kubler +Kubley +Kubly +Kubo +Kubota +Kuboushek +Kubsch +Kubu +Kuc +Kuca +Kucan +Kucek +Kucel +Kucera +Kuch +Kucha +Kuchan +Kuchar +Kucharik +Kucharski +Kuchel +Kuchem +Kuchenbecker +Kuchenmeister +Kuchera +Kuchinski +Kuchle +Kuchler +Kuchta +Kuchto +Kuciemba +Kucinskas +Kucinski +Kuck +Kuckens +Kuczenski +Kuczkowski +Kuczma +Kuczynski +Kudasik +Kudej +Kudelka +Kuder +Kudla +Kudlacik +Kudley +Kudo +Kudrick +Kudrle +Kudrna +Kudro +Kudron +Kudzma +Kue +Kuebler +Kuechle +Kuechler +Kuehl +Kuehler +Kuehn +Kuehne +Kuehnel +Kuehneman +Kuehner +Kuehnert +Kuehnhold +Kuehnle +Kueker +Kuemmerle +Kuen +Kuennen +Kuenstler +Kueny +Kuenzi +Kuepfer +Kuerbitz +Kues +Kuester +Kueter +Kuether +Kufalk +Kufel +Kufeldt +Kuffa +Kuffel +Kufner +Kugel +Kugler +Kuh +Kuhar +Kuharik +Kuhens +Kuhl +Kuhle +Kuhlenschmidt +Kuhlman +Kuhlmann +Kuhlmey +Kuhlo +Kuhls +Kuhn +Kuhne +Kuhnel +Kuhnemund +Kuhnen +Kuhner +Kuhnert +Kuhnke +Kuhnle +Kuhns +Kuhr +Kuhre +Kuhry +Kuhs +Kuhse +Kuhta +Kuhtz +Kuick +Kuilan +Kuiper +Kuipers +Kuitu +Kuiz +Kuizinas +Kuja +Kujak +Kujala +Kujat +Kujath +Kujawa +Kujawski +Kuk +Kuka +Kukahiko +Kukauskas +Kukene +Kuker +Kukielka +Kukla +Kuklenski +Kukler +Kuklinski +Kuklis +Kukowski +Kuks +Kukucka +Kukura +Kula +Kulacz +Kulaga +Kulak +Kulakowski +Kulas +Kulback +Kulbacki +Kulbeth +Kulbida +Kulcona +Kules +Kulesa +Kulesza +Kulhanek +Kulick +Kulig +Kuliga +Kuligowski +Kulik +Kulikowski +Kulinski +Kulis +Kulish +Kulju +Kulka +Kulkarni +Kull +Kulla +Kullas +Kulling +Kullman +Kullmann +Kully +Kulon +Kulow +Kulp +Kulpa +Kulseth +Kulwicki +Kulzer +Kum +Kumalaa +Kuman +Kumar +Kumfer +Kumlander +Kumm +Kummer +Kummerow +Kump +Kumpf +Kumro +Kun +Kuna +Kunau +Kunc +Kunda +Kundanani +Kunde +Kundert +Kundinger +Kundla +Kundrick +Kundtz +Kunert +Kunesh +Kuney +Kung +Kuni +Kunich +Kunicki +Kunimitsu +Kunin +Kuning +Kunis +Kunishige +Kuniyoshi +Kunka +Kunkel +Kunkle +Kunkleman +Kunkler +Kuns +Kunsch +Kunselman +Kunshier +Kunsman +Kunst +Kunstlinger +Kunter +Kuntz +Kuntzman +Kunz +Kunze +Kunzel +Kunzelman +Kunzie +Kunzler +Kunzman +Kuo +Kuokkanen +Kupchinsky +Kupcho +Kupec +Kuper +Kuperman +Kupersmith +Kupetz +Kupfer +Kupferberg +Kupferer +Kupiec +Kupihea +Kupka +Kupper +Kupres +Kuprewicz +Kupstas +Kur +Kura +Kuralt +Kuramoto +Kurant +Kuras +Kurasz +Kurban +Kurcaba +Kurdyla +Kurdziel +Kurek +Kurelko +Kuretich +Kurgan +Kurian +Kuriger +Kurihara +Kurisu +Kuritz +Kurk +Kurka +Kurkeyerian +Kurkjian +Kurkowski +Kurland +Kurnik +Kurns +Kuroda +Kurohara +Kurokawa +Kurowski +Kurpiel +Kurpinski +Kurr +Kurrie +Kurschner +Kurshuk +Kurt +Kurtenbach +Kurter +Kurth +Kurtich +Kurtin +Kurtis +Kurtti +Kurtulus +Kurtyka +Kurtz +Kurtzeborn +Kurtzer +Kurtzman +Kurutz +Kuruvilla +Kury +Kurylo +Kurz +Kurzinski +Kurzyniec +Kus +Kusak +Kusch +Kuschel +Kuse +Kusek +Kusel +Kuser +Kush +Kushaney +Kushi +Kushin +Kushiner +Kushlan +Kushner +Kushnir +Kusiak +Kusick +Kusinski +Kuske +Kusko +Kusky +Kusner +Kusnic +Kuss +Kussel +Kussman +Kussmaul +Kuster +Kusterer +Kustes +Kustra +Kusuma +Kusumoto +Kuszlyk +Kuszynski +Kut +Kuta +Kutch +Kutchar +Kutcher +Kutchera +Kutchie +Kutchin +Kutella +Kuter +Kuthe +Kuti +Kutil +Kutlu +Kutner +Kutsch +Kutscher +Kutt +Kuttler +Kuttner +Kuty +Kutz +Kutzer +Kutzner +Kuwada +Kuwahara +Kuwana +Kuy +Kuykendall +Kuykendoll +Kuyper +Kuypers +Kuza +Kuzara +Kuzel +Kuzemchak +Kuzia +Kuziel +Kuzio +Kuzma +Kuzmanic +Kuzmin +Kuzminski +Kuzmish +Kuzniar +Kuznicki +Kuzyk +Kvam +Kvamme +Kvaternik +Kveen +Kvek +Kveton +Kvilhaug +Kvoeschen +Kvzian +Kwack +Kwak +Kwan +Kwang +Kwapniewski +Kwasnicki +Kwasniewski +Kwasnik +Kwasny +Kwaterski +Kwek +Kwiat +Kwiatkowski +Kwiecien +Kwiecinski +Kwilosz +Kwit +Kwok +Kwon +Kwong +Ky +Kye +Kyer +Kyger +Kyhn +Kyker +Kyle +Kyler +Kyles +Kylish +Kyllonen +Kym +Kynard +Kynaston +Kyner +Kyper +Kypuros +Kysar +Kyser +Kyseth +Kyte +Kytle +Kyung +Kyzar +Kyzer +La +Laa +Laabs +Laack +Laake +Laaker +Laakso +Laasaga +Laatsch +Lab +Laba +Lababit +Labadie +Labady +Laban +Labar +Labarba +Labarbara +Labarbera +Labarge +Labaro +Labarr +Labarre +Labarriere +Labat +Labate +Labatt +Labauve +Labay +Labbadia +Labbe +Labbee +Labbie +Labean +Labeau +Labella +Labelle +Labeots +Laber +Laberge +Laberpool +Labianca +Labier +Labine +Labita +Labitan +Labkovsky +Lablanc +Lablue +Labo +Laboe +Labog +Laboissonnier +Labombar +Labombard +Labonne +Labonte +Labonville +Labor +Laborde +Labore +Laborin +Laborn +Labossiere +Labounta +Labounty +Labove +Labovitch +Laboy +Labrada +Labrador +Labrake +Labranche +Labre +Labrec +Labreche +Labreck +Labrecque +Labree +Labreque +Labrie +Labriola +Labrode +Labrum +Labrune +Labruyere +Labruzzo +Labs +Labuda +Labuff +Lacaille +Lacasa +Lacassagne +Lacasse +Lacatena +Lacau +Lacava +Lacayo +Lacaze +Lace +Lacefield +Lacek +Lacer +Lacerda +Lacerenza +Lacerte +Lacewell +Lacey +Lach +Lachance +Lachapelle +Lachappelle +Lacharite +Lachat +Lachenauer +Lacher +Lachermeier +Lachiatto +Lachino +Lachley +Lachner +Lachney +Lachowicz +Lachowski +Lachowsky +Lachut +Lacina +Lacinski +Lacio +Lack +Lackage +Lackett +Lackey +Lacki +Lackie +Lackland +Lackman +Lackner +Lacko +Lacks +Laclair +Laclaire +Lacock +Lacognata +Lacomb +Lacombe +Laconte +Lacorte +Lacoss +Lacosse +Lacosta +Lacoste +Lacouette +Lacount +Lacour +Lacourse +Lacovara +Lacoy +Lacroix +Lacrone +Lacross +Lacrosse +Lacrue +Lacsamana +Lacson +Lacuesta +Lacusky +Lacy +Lacz +Lada +Ladabouche +Ladage +Ladakakos +Ladas +Laday +Ladd +Ladden +Lade +Ladeau +Ladebauche +Ladell +Lader +Laderer +Laderman +Ladesma +Ladewig +Ladick +Ladieu +Ladika +Laditka +Ladner +Ladnier +Lado +Ladonne +Ladouce +Ladouceur +Ladson +Ladt +Ladtkow +Laduc +Laducer +Ladue +Laduke +Ladwig +Lady +Ladyman +Laeger +Laehn +Laesser +Laessig +Laface +Lafantano +Lafarga +Lafarge +Lafaso +Lafata +Lafauci +Lafave +Lafaver +Lafavor +Lafay +Lafayette +Lafemina +Lafera +Laferney +Laferriere +Laferte +Laferty +Lafever +Lafevers +Lafevre +Laffer +Lafferty +Laffey +Laffin +Laffitte +Laffoon +Laffredo +Lafield +Lafkas +Laflam +Laflame +Laflamme +Lafleche +Laflen +Lafler +Lafleur +Laflin +Laflore +Lafluer +Lafoe +Lafollette +Lafon +Lafond +Lafone +Lafont +Lafontain +Lafontaine +Lafontant +Lafoon +Laforce +Laford +Laforest +Laforey +Laforge +Laforrest +Laforte +Lafortune +Lafosse +Lafountain +Lafountaine +Lafoy +Laframboise +Lafranca +Lafrance +Lafrancois +Lafrate +Lafratta +Lafrazia +Lafreniere +Lafromboise +Lafuente +Lafuze +Lagace +Lagadinos +Lagamba +Lagan +Lagana +Laganga +Lagant +Lagard +Lagarde +Lagares +Lagasca +Lagasse +Lagassie +Lagatella +Lagatta +Lagazo +Lage +Lageman +Lager +Lagerberg +Lagergren +Lagerman +Lagerquist +Lagerstedt +Lagerstrom +Lagesse +Laggan +Lagge +Laginess +Lagle +Laglie +Lagman +Lagnese +Lago +Lagoa +Lagomarsino +Lagoni +Lagonia +Lagoo +Lagore +Lagorio +Lagory +Lagos +Lagraize +Lagrand +Lagrange +Lagrant +Lagrasse +Lagrave +Lagreca +Lagrenade +Lagrimas +Lagrone +Lagroon +Lagrotta +Lagrow +Laguardia +Lague +Laguer +Laguerre +Lagueux +Laguire +Laguna +Lagunas +Lah +Lahaie +Laham +Lahar +Lahay +Lahaye +Laher +Lahey +Lahip +Lahm +Lahman +Lahmann +Lahmers +Lahn +Lahne +Lahr +Lahren +Lahrman +Lahti +Lahtinen +Lahue +Lai +Laib +Laiben +Laible +Laich +Laiche +Laidlaw +Laidler +Laigle +Laigo +Lail +Lain +Laine +Lainez +Laing +Lainhart +Laino +Lainson +Laios +Laipple +Lair +Laird +Lairmore +Lairsey +Lairson +Lairy +Lais +Laisure +Laite +Laitila +Laitinen +Laity +Laizure +Lajara +Lajaunie +Lajeunesse +Lajoie +Lajoy +Lajoye +Lajza +Lakatos +Lake +Lakeman +Laker +Lakes +Lakey +Lakhan +Lakhani +Lakin +Lakins +Lakner +Lakowski +Laky +Lal +Lala +Laland +Lalande +Lalanne +Lalata +Lale +Laliberte +Laliberty +Lalich +Lalim +Lalin +Lalinde +Laliotis +Lalk +Lalka +Lall +Lalla +Lallave +Lallemand +Lalley +Lalli +Lallier +Lallo +Lally +Lalonde +Lalone +Lalor +Lalumiere +Lam +Lama +Lamaack +Lamacchia +Lamadrid +Lamagna +Lamaitre +Laman +Lamana +Lamance +Lamango +Lamanna +Lamantagne +Lamantia +Lamar +Lamarca +Lamarch +Lamarche +Lamark +Lamarque +Lamarr +Lamarra +Lamarre +Lamarsh +Lamarta +Lamartina +Lamas +Lamascolo +Lamaster +Lamastus +Lamattina +Lamax +Lamay +Lamb +Lambdin +Lambe +Lambeck +Lamber +Lambermont +Lamberson +Lambert +Lamberth +Lamberti +Lamberto +Lamberton +Lambertson +Lambertus +Lamberty +Lambes +Lambeth +Lambey +Lambiase +Lambie +Lambing +Lambino +Lambka +Lamblin +Lamborn +Lamborne +Lambourne +Lamboy +Lambrakis +Lambrecht +Lambright +Lambros +Lambrukos +Lambson +Lambuth +Lame +Lameda +Lamela +Lamendola +Lamens +Lamer +Lamere +Lamers +Lamery +Lamey +Lamfers +Lamia +Lamica +Lamie +Lamielle +Laminack +Laming +Lamirand +Lamirande +Lamison +Lamke +Lamkin +Lamkins +Lamm +Lamme +Lammel +Lammers +Lammert +Lammey +Lammi +Lammie +Lammon +Lammy +Lamoine +Lamon +Lamond +Lamonda +Lamonica +Lamons +Lamont +Lamontagna +Lamontagne +Lamonte +Lamoore +Lamora +Lamore +Lamoreau +Lamoreaux +Lamoree +Lamorella +Lamoreux +Lamorgese +Lamorte +Lamos +Lamothe +Lamott +Lamotte +Lamountain +Lamour +Lamoureaux +Lamoureux +Lamp +Lamparski +Lampe +Lampel +Lamper +Lampert +Lampey +Lamphear +Lamphere +Lamphiear +Lamphier +Lampi +Lampiasi +Lampinen +Lamping +Lampitt +Lampke +Lampkin +Lampkins +Lampl +Lampley +Lampman +Lampo +Lamport +Lampp +Lamprecht +Lamprey +Lampron +Lampros +Lampsas +Lampshire +Lampson +Lampton +Lamson +Lamudio +Lamunyon +Lamus +Lamy +Lan +Lana +Lanagan +Lanahan +Lanasa +Lancaster +Lance +Lancey +Lancia +Lanciotti +Lanclos +Lancon +Lancour +Lanctot +Lancz +Land +Landa +Landacre +Landaker +Landan +Landau +Landauer +Landavazo +Landaverde +Landazuri +Landberg +Landborg +Lande +Landefeld +Landen +Landenberger +Lander +Landerman +Landero +Landeros +Landers +Landes +Landesberg +Landess +Landevos +Landey +Landfair +Landford +Landfried +Landgraf +Landgrebe +Landgren +Landham +Landherr +Landi +Landin +Landing +Landingham +Landini +Landis +Landkamer +Landman +Landmann +Landmark +Landmesser +Lando +Landolf +Landolfi +Landolfo +Landolt +Landon +Landoni +Landor +Landowski +Landquist +Landram +Landreneau +Landres +Landress +Landreth +Landreville +Landrey +Landrian +Landrie +Landrigan +Landrith +Landro +Landron +Landrum +Landrus +Landruth +Landry +Lands +Landsaw +Landsberg +Landsberry +Landsman +Landstrom +Landt +Landu +Landucci +Landvatter +Landwehr +Landy +Lane +Laneaux +Lanehart +Lanen +Lanes +Lanese +Laneve +Laney +Lanfair +Lanfear +Lanfor +Lanford +Lanfranco +Lang +Langager +Langan +Langanke +Langarica +Langbehn +Langbein +Langdale +Langdon +Lange +Langefels +Langehennig +Langel +Langeland +Langelier +Langella +Langen +Langenbach +Langendorf +Langeness +Langenfeld +Langenheim +Langer +Langerman +Langeveld +Langevin +Langfeldt +Langfield +Langfitt +Langford +Langgood +Langham +Langhans +Langhart +Langholdt +Langholz +Langhorn +Langhorne +Langhorst +Langhout +Langi +Langill +Langille +Langin +Langkabel +Langlais +Langland +Langlands +Langley +Langlinais +Langlitz +Langlo +Langlois +Langloss +Langmaid +Langman +Langmo +Langmyer +Langner +Langness +Lango +Langolf +Langon +Langone +Langoni +Langowski +Langreck +Langridge +Langrum +Langsam +Langsdale +Langseth +Langshaw +Langstaff +Langston +Langstraat +Langton +Langtry +Languell +Languirand +Langwell +Langwith +Langworthy +Lanham +Lani +Laniado +Lanie +Lanier +Lanigan +Laning +Laninga +Laningham +Lanini +Lanius +Lank +Lanka +Lankard +Lankford +Lankster +Lanman +Lann +Lanna +Lannan +Lannen +Lanners +Lanni +Lannier +Lannigan +Lanning +Lanno +Lannom +Lannon +Lano +Lanoie +Lanois +Lanosa +Lanosga +Lanoue +Lanouette +Lanphear +Lanpher +Lanphere +Lanphier +Lanquist +Lansang +Lansberg +Lansberry +Lansdale +Lansdell +Lansden +Lansdowne +Lanser +Lansey +Lansford +Lansing +Lanski +Lanson +Lant +Lantaff +Lantagne +Lanteigne +Lantelme +Lanter +Lanterman +Lantey +Lantgen +Lanthier +Lantier +Lantieri +Lantigua +Lanting +Lantis +Lanton +Lantrip +Lantry +Lantto +Lantz +Lantzy +Lanum +Lanuza +Lanz +Lanza +Lanzafame +Lanzalotti +Lanzarin +Lanzarotta +Lanze +Lanzer +Lanzetta +Lanzi +Lanzillo +Lanzillotti +Lanzilotta +Lanzo +Lanzoni +Lao +Laorange +Laos +Lapa +Lapadula +Lapage +Lapaglia +Lapalme +Lapan +Lapar +Lapari +Lapatra +Lape +Lapek +Lapenta +Laper +Lapere +Laperle +Laperouse +Laperriere +Laperuta +Lapete +Lapeyrolerie +Lapeyrouse +Lapham +Lapiana +Lapid +Lapidus +Lapier +Lapierre +Lapila +Lapilio +Lapin +Lapine +Lapinski +Lapinsky +Lapinta +Lapitan +Laplaca +Laplace +Laplant +Laplante +Laplaunt +Laplume +Lapoint +Lapointe +Lapolla +Lapora +Lapore +Laport +Laporta +Laporte +Lapp +Lappa +Lappas +Lappe +Lappi +Lappin +Lapping +Lappinga +Lapradd +Laprade +Laprairie +Laprarie +Lapre +Laprete +Laprise +Lapsley +Lapuerta +Lapusnak +Lapuz +Laquay +Laquerre +Lara +Larabee +Larabel +Larabell +Laraby +Laracuente +Laragy +Laraia +Laramee +Laramie +Laramore +Larance +Laranjo +Larason +Larate +Laravie +Laraway +Larbi +Larbie +Larcade +Larch +Larche +Larcher +Larcom +Lard +Larde +Lardieri +Lardin +Lardizabal +Lardner +Lardone +Lardydell +Lare +Lareau +Laredo +Laregina +Laremont +Larence +Lares +Larew +Larey +Larez +Largay +Large +Largen +Largena +Largent +Larger +Largin +Largo +Lariccia +Larick +Larimer +Larimore +Larin +Larios +Lariosa +Laris +Larish +Larison +Larita +Larive +Lariviere +Larizza +Lark +Larkan +Larke +Larkey +Larkin +Larkins +Larko +Larman +Larmer +Larmett +Larmon +Larmore +Larner +Larney +Laro +Larocca +Larocco +Laroche +Larochelle +Larock +Larocque +Laroe +Laroia +Laronda +Laroque +Larosa +Larose +Larotta +Larouche +Larousse +Laroux +Larowe +Larr +Larrabee +Larralde +Larranaga +Larrea +Larreta +Larribeau +Larrick +Larrier +Larrieu +Larrimore +Larrison +Larriuz +Larriva +Larrivee +Larriviere +Larroque +Larrosa +Larrow +Larry +Lars +Larsen +Larsh +Larson +Larsson +Lartey +Lartigue +Larubbio +Larue +Laruffa +Larusch +Larusso +Larve +Lary +Larzazs +Larzelere +Lasage +Lasagna +Lasaint +Lasala +Lasalle +Lasane +Lasanta +Lasasso +Lasater +Lascala +Lascano +Lascaro +Lasch +Laschinger +Lascody +Lascola +Lascurain +Lasecki +Lasell +Laselle +Lasenby +Laser +Laserna +Laseter +Lash +Lashbaugh +Lashbrook +Lasher +Lashier +Lashlee +Lashley +Lashmet +Lashomb +Lashua +Lashure +Lashute +Lashutva +Lashway +Lasik +Lasin +Lasiter +Lask +Laska +Laske +Lasker +Laskey +Laski +Laskin +Lasko +Laskoski +Laskoskie +Laskosky +Laskowitz +Laskowski +Lasky +Lasley +Laslie +Laslo +Laso +Lason +Lasorsa +Lasota +Laspina +Lass +Lassa +Lassalle +Lassan +Lasseigne +Lasselle +Lassen +Lasser +Lassere +Lasserre +Lasseson +Lasseter +Lassetter +Lassiter +Lassley +Lasso +Lassonde +Lasswell +Last +Lastella +Laster +Lastinger +Lastiri +Lastovica +Lastra +Lastrape +Lastrapes +Lastufka +Lasure +Laswell +Lasyone +Laszlo +Lat +Lataille +Latam +Lataquin +Latassa +Latch +Latchaw +Late +Latella +Latendresse +Later +Laterza +Latessa +Latham +Lathan +Lathe +Lathem +Lathen +Lather +Lathern +Lathim +Lathon +Lathrop +Lathrum +Latif +Latigo +Latiker +Latimer +Latimore +Latin +Latina +Latini +Latino +Latiolais +Latko +Latner +Latney +Lato +Laton +Latona +Latorre +Latortue +Latos +Latouche +Latouf +Latour +Latourette +Latourrette +Latronica +Latsha +Latshaw +Latsko +Latson +Latta +Lattanzi +Lattanzio +Lattari +Lattea +Latten +Latterell +Lattig +Lattimer +Lattimore +Lattin +Latting +Lattner +Lattrell +Lattus +Latty +Latu +Latulas +Latulipe +Latulippe +Latunski +Latus +Latz +Latzig +Latzka +Latzke +Lau +Laub +Laubach +Laubacher +Laube +Lauber +Laubersheimer +Laubhan +Laubscher +Lauby +Lauchaire +Lauck +Lauckner +Laud +Laudadio +Laudat +Laudato +Laude +Laudeman +Lauden +Laudenslager +Lauder +Lauderback +Lauderbaugh +Lauderdale +Lauderman +Laudermilk +Laue +Lauenroth +Lauer +Lauerman +Laufenberg +Laufer +Lauffer +Laugen +Laughary +Laughbaum +Laughead +Laughery +Laughinghouse +Laughlin +Laughman +Laughner +Laughon +Laughridge +Laughter +Laughton +Lauigne +Lauinger +Laukitis +Laulu +Laumann +Laumbach +Laumea +Laumeyer +Laun +Launderville +Laundree +Laundry +Launelez +Launer +Launey +Launiere +Launius +Launt +Laur +Laura +Laurance +Laurange +Laureano +Laurel +Laureles +Laurelli +Lauren +Laurence +Laurenceau +Laurendeau +Laurenitis +Laureno +Laurens +Laurent +Laurente +Laurenti +Laurenza +Laurenzano +Lauretta +Laurey +Lauri +Lauria +Lauriano +Lauricella +Laurich +Lauridsen +Laurie +Laurila +Laurimore +Laurin +Laurino +Laurion +Laurita +Laurito +Lauritsen +Lauritzen +Lauro +Laurole +Laursen +Laury +Lauschus +Lausell +Lausen +Lauseng +Lauser +Lausier +Lauster +Laut +Lautaret +Lautenbach +Lautenschlage +Lauter +Lauterbach +Lauterborn +Lauters +Lauth +Lauthern +Lautieri +Lautman +Lautner +Lautt +Lauture +Lautz +Lautzenheiser +Lauver +Lauw +Lauwers +Laux +Lauze +Lauzier +Lauzon +Lav +Lava +Lavadera +Lavadie +Lavagnino +Lavala +Lavalais +Lavalette +Lavalla +Lavalle +Lavallee +Lavalley +Lavallie +Lavan +Lavancha +Lavanchy +Lavander +Lavani +Lavant +Lavanway +Lavatch +Lave +Lavear +Lavecchia +Lavee +Lavelett +Lavell +Lavelle +Lavelli +Laven +Lavender +Lavene +Laventure +Laver +Laverde +Laverdiere +Laverdure +Lavere +Laverette +Lavergne +Lavern +Laverne +Laverriere +Lavertu +Lavertue +Laverty +Lavery +Lavesque +Lavette +Lavey +Lavezzo +Lavgle +Lavi +Laviero +Lavigna +Lavigne +Lavin +Lavina +Lavinder +Lavine +Laviola +Laviolette +Lavis +Lavista +Lavoie +Lavole +Lavon +Lavongsar +Lavorini +Lavoy +Lavy +Lavzon +Law +Lawal +Lawalin +Lawall +Laware +Lawary +Lawbaugh +Lawcewicz +Lawe +Lawer +Lawerance +Lawerence +Lawernce +Lawery +Lawes +Lawford +Lawhead +Lawhon +Lawhorn +Lawhorne +Lawin +Lawing +Lawis +Lawler +Lawless +Lawley +Lawlis +Lawlor +Lawman +Lawn +Lawnicki +Lawrance +Lawrence +Lawrentz +Lawrenz +Lawrey +Lawrie +Lawry +Laws +Lawshe +Lawsky +Lawson +Lawter +Lawther +Lawton +Lawver +Lawwill +Lawyer +Lax +Laxen +Laxson +Laxton +Lay +Laychock +Laycock +Laycox +Layden +Laye +Layel +Layell +Layer +Layfield +Layher +Layhew +Layland +Layman +Laymon +Layne +Layng +Layo +Layous +Layson +Layssard +Layton +Layva +Laza +Lazaga +Lazalde +Lazano +Lazar +Lazarczyk +Lazard +Lazare +Lazares +Lazarine +Lazarini +Lazaro +Lazaroff +Lazarski +Lazarte +Lazarus +Lazarz +Lazcano +Lazenberry +Lazenby +Lazenson +Lazer +Lazewski +Lazich +Lazier +Lazio +Lazo +Lazor +Lazos +Lazott +Lazurek +Lazusky +Lazzar +Lazzara +Lazzari +Lazzaro +Lazzell +Lazzeri +Le +Lea +Leab +Leabow +Leach +Leachman +Leacock +Leadbeater +Leadbetter +Leader +Leadford +Leadingham +Leadley +Leadman +Leady +Leaf +Leafe +Leagjeld +League +Leah +Leahey +Leahman +Leahy +Leaird +Leak +Leake +Leakes +Leaks +Leal +Leaman +Leamer +Leaming +Leamon +Leamy +Lean +Leanard +Leander +Leandro +Leandry +Leanen +Leanos +Leanza +Leap +Leaper +Leaphart +Leapheart +Lear +Leard +Leardi +Learman +Learn +Learned +Leary +Leas +Lease +Leaser +Leash +Leasher +Leask +Leason +Leasor +Leasure +Leasy +Leath +Leatham +Leather +Leatherberry +Leatherman +Leathers +Leatherwood +Leaton +Leavell +Leavelle +Leaven +Leavengood +Leavens +Leavenworth +Leaver +Leaverton +Leavigne +Leavins +Leavitt +Leavy +Leazer +Lebahn +Leban +Lebarge +Lebario +Lebaron +Lebarron +Lebaugh +Lebby +Lebeau +Lebeaux +Lebeck +Lebeda +Lebedeff +Lebel +Leben +Lebeouf +Leber +Leberman +Lebert +Leberte +Lebish +Lebitski +Leblanc +Leblane +Lebleu +Leblond +Lebo +Leboeuf +Lebold +Lebon +Lebouef +Lebouf +Lebourgeois +Lebovic +Lebow +Lebowitz +Lebrane +Lebrecht +Lebrecque +Lebroke +Lebron +Lebrun +Lebsack +Lebsock +Lecain +Lecaros +Lecates +Lecato +Lecea +Lech +Lechel +Lechelt +Lecher +Lechlak +Lechleidner +Lechler +Lechliter +Lechman +Lechner +Lechuga +Leck +Leckband +Leckbee +Leckie +Leckington +Leckman +Lecky +Leclair +Leclaire +Leclare +Leclear +Lecleir +Leclerc +Leclere +Lecocq +Lecompte +Lecomte +Leconey +Leconte +Lecorchick +Lecoultre +Lecount +Lecourt +Lecrone +Lecroy +Lecuyer +Lecy +Lecznar +Led +Ledain +Leday +Ledbetter +Ledden +Leddon +Leddy +Ledebuhr +Ledec +Ledee +Ledenbach +Leder +Lederer +Lederhos +Lederman +Ledermann +Ledesma +Ledet +Ledezma +Ledford +Ledger +Ledgerwood +Ledin +Ledingham +Ledl +Ledley +Ledlie +Ledlow +Ledo +Ledon +Ledonne +Ledoux +Ledsinger +Ledsome +Leduc +Ledue +Leduke +Ledwell +Ledwig +Ledwith +Ledy +Ledyard +Lee +Leeber +Leebrick +Leech +Leed +Leeder +Leedom +Leeds +Leedy +Leef +Leehan +Leehy +Leek +Leeker +Leeks +Leeman +Leemans +Leemaster +Leeming +Leemow +Leen +Leep +Leeper +Leer +Leerar +Lees +Leese +Leesman +Leesmann +Leeson +Leet +Leetch +Leete +Leeth +Leetham +Leever +Leewright +Leezer +Lefave +Lefaver +Lefchik +Lefeber +Lefebre +Lefebure +Lefebvre +Lefeld +Lefever +Lefevers +Lefevre +Lefew +Leff +Leffel +Leffelman +Leffers +Leffert +Leffew +Leffingwell +Leffler +Lefkowitz +Leflar +Lefler +Lefleur +Leflore +Leflores +Lefore +Leforge +Lefort +Lefrancois +Left +Lefthand +Lefton +Leftridge +Leftwich +Lefurgy +Legaard +Legace +Legacy +Legall +Legalley +Legallo +Legan +Legard +Legare +Legarreta +Legaspi +Legassie +Legat +Legate +Legath +Legato +Legault +Lege +Legel +Legendre +Leger +Legere +Legerski +Legette +Legeyt +Legg +Leggans +Leggat +Legge +Legget +Leggett +Leggette +Leggins +Leggio +Leggitt +Leggs +Leghorn +Legier +Legions +Legleiter +Legler +Legleu +Legner +Legnon +Lego +Legoff +Legore +Legorreta +Legoullon +Legra +Legrand +Legrande +Legrant +Legree +Legro +Legrone +Legros +Legrotte +Legrow +Legum +Leh +Lehan +Lehane +Lehar +Lehberger +Lehenbauer +Leheny +Lehew +Lehigh +Lehman +Lehmann +Lehmberg +Lehmer +Lehmkuhl +Lehn +Lehne +Lehneis +Lehnen +Lehner +Lehnert +Lehnertz +Lehnherr +Lehnhoff +Lehning +Lehnortt +Leho +Lehoullier +Lehoux +Lehr +Lehrer +Lehrfeld +Lehrian +Lehrke +Lehrman +Lehtinen +Lehto +Lehtomaki +Lehtonen +Lei +Leialoha +Leib +Leiba +Leibe +Leibee +Leibel +Leibenstein +Leiber +Leibert +Leiberton +Leibfried +Leibman +Leibold +Leibowitz +Leiby +Leich +Leicher +Leichner +Leicht +Leichtenberge +Leichtman +Leichty +Leick +Leid +Leidall +Leidecker +Leidel +Leider +Leidholt +Leidich +Leidig +Leiding +Leidy +Leiendecker +Leier +Leif +Leifer +Leiferman +Leigers +Leigh +Leight +Leighton +Leighty +Leigland +Leija +Leikam +Leiker +Leilich +Leimbach +Leimberger +Leimer +Leimkuehler +Leimkuhler +Lein +Leinbach +Leinberger +Leinen +Leinenbach +Leiner +Leingang +Leinhart +Leininger +Leino +Leinonen +Leins +Leinwand +Leinweber +Leiper +Leipert +Leipheimer +Leipold +Leis +Leisch +Leischner +Leise +Leisenring +Leiser +Leisey +Leisher +Leishman +Leising +Leisinger +Leisner +Leiss +Leist +Leisten +Leister +Leistiko +Leistner +Leisure +Leisy +Leitao +Leitch +Leite +Leitem +Leiter +Leith +Leithauser +Leitheiser +Leithiser +Leithoff +Leitman +Leitner +Leitten +Leitz +Leitze +Leitzel +Leitzinger +Leitzke +Leiva +Leja +Lejenne +Lejeune +Lejman +Lejune +Lek +Lekan +Lekas +Lekberg +Lekey +Leko +Lekwa +Lelacheur +Lelah +Leland +Lele +Leleux +Lelis +Lella +Lelle +Lelli +Lellig +Lelonek +Lem +Lema +Lemaire +Lemaitre +Leman +Lemans +Lemanski +Lemansky +Lemar +Lemarie +Lemarr +Lemaster +Lemasters +Lemay +Lembcke +Lembke +Lembo +Lembrick +Lemcke +Lemear +Lemelin +Lemelle +Lemen +Lemere +Lemert +Lemery +Lemich +Lemick +Lemieux +Lemin +Leming +Lemings +Lemire +Lemish +Lemkau +Lemke +Lemle +Lemler +Lemley +Lemm +Lemma +Lemme +Lemmen +Lemmer +Lemmert +Lemming +Lemmings +Lemmo +Lemmon +Lemmond +Lemmonds +Lemmons +Lemoine +Lemon +Lemond +Lemonds +Lemone +Lemonier +Lemons +Lemont +Lemos +Lemoyne +Lemp +Lempe +Lempicki +Lempka +Lempke +Lemucchi +Lemus +Len +Lena +Lenahan +Lenard +Lenart +Lenarz +Lenberg +Lench +Lenci +Lencioni +Lenczyk +Lenderman +Lendo +Lendon +Lendor +Lendrum +Lendt +Lene +Leneau +Leneave +Lenehan +Lener +Leners +Lenertz +Lenfest +Leng +Lengacher +Lengel +Lenger +Lengerich +Lengle +Lengyel +Lenhard +Lenhardt +Lenharr +Lenhart +Lenherr +Lenhoff +Lenig +Lenigan +Lenihan +Lening +Lenior +Lenis +Lenius +Lenix +Lenk +Lenke +Lenker +Lenkiewicz +Lenling +Lenn +Lennan +Lennard +Lennart +Lennert +Lennertz +Lennihan +Lenning +Lennington +Lennis +Lennon +Lennox +Lenny +Leno +Lenoch +Lenoci +Lenoir +Lenon +Lenord +Lenort +Lenorud +Lenoue +Lenox +Lenser +Lensing +Lenske +Lenski +Lent +Lente +Lenters +Lentine +Lentini +Lento +Lenton +Lents +Lentsch +Lentz +Leny +Lenyard +Lenz +Lenza +Lenze +Lenzen +Lenzi +Lenzini +Lenzo +Leo +Leofsky +Leomiti +Leon +Leona +Leonaggeo +Leonard +Leonardi +Leonardis +Leonardo +Leonberger +Leone +Leonelli +Leonello +Leones +Leonesio +Leonette +Leonetti +Leong +Leonhard +Leonhardt +Leonhart +Leoni +Leonick +Leonides +Leonor +Leonpacher +Leonti +Leopard +Leopardi +Leopold +Leopoldo +Leos +Leota +Lepage +Lepak +Lepard +Lepe +Lepera +Lepere +Lepetich +Lepez +Lepine +Lepinski +Lepisto +Lepke +Lepkowski +Lepley +Lepo +Lepore +Lepp +Leppanen +Lepper +Leppert +Lepping +Leppink +Leppke +Leppla +Lepre +Lepretre +Lepri +Leps +Lequire +Leray +Lerch +Lerer +Lerew +Leri +Leriche +Lerma +Lerman +Lermon +Lermond +Lerner +Lerno +Lero +Leroux +Lerow +Leroy +Lerper +Lerra +Lertora +Lerud +Lerwick +Lerwill +Lesa +Lesage +Lesane +Lescano +Lescarbeau +Lescavage +Lesch +Lesches +Lesco +Lese +Leser +Lesesne +Lesh +Leshem +Lesher +Leshinsky +Leshko +Leshure +Lesiak +Lesieur +Lesinski +Leske +Leski +Lesko +Leskovac +Leskovar +Leskovec +Lesky +Lesley +Leslie +Lesly +Lesmeister +Lesmerises +Lesneski +Lesney +Lesniak +Lesnick +Lesniewski +Leso +Lespedes +Lesperance +Lespier +Less +Lessa +Lessard +Lessen +Lessenberry +Lesser +Lessey +Lessig +Lessin +Lessley +Lesslie +Lessly +Lessman +Lessmann +Lessner +Lesso +Lessor +Lestage +Lestelle +Lester +Leston +Lestor +Lestourgeon +Lestrange +Lestronge +Lesuer +Lesueur +Lesure +Leszczynski +Leta +Letalien +Letang +Letarte +Letbetter +Letchaw +Letcher +Letchworth +Letellier +Letender +Letendre +Letersky +Leth +Lethco +Letizia +Letko +Letlow +Letman +Leto +Letofsky +Letourneau +Letourneaux +Letran +Letrent +Letsche +Letscher +Letsinger +Letson +Lett +Letteer +Letteney +Letterlough +Letterman +Letters +Lettiere +Lettieri +Lettinga +Lettman +Lettre +Letts +Lettsome +Letze +Leu +Leuasseur +Leubner +Leuchs +Leuck +Leuckel +Leuenberger +Leuenthal +Leuga +Leuhring +Leukhardt +Leukuma +Leung +Leupold +Leusink +Leuters +Leuthauser +Leuthe +Leuthold +Leutwiler +Leuty +Leuy +Leuze +Lev +Leva +Leval +Levalley +Levan +Levander +Levandofsky +Levandoski +Levandowski +Levanger +Levangie +Levans +Levar +Levario +Levasseur +Levatino +Levay +Leve +Levecke +Levee +Leveille +Leveillee +Level +Levell +Levels +Leven +Levendoski +Levendosky +Levene +Levengood +Levenhagen +Levens +Levenson +Levenstein +Leventer +Leventhal +Leveque +Lever +Leverance +Levere +Leverentz +Leverenz +Leverett +Leverette +Leverich +Levering +Leverone +Levers +Leversee +Leverson +Levert +Leverton +Levesgue +Levesque +Leveston +Leveto +Levett +Levey +Levi +Levian +Levick +Levie +Levielle +Levien +Levier +Levin +Levine +Leviner +Levings +Levingston +Levins +Levinsky +Levinson +Levinthal +Levis +Levison +Levister +Leviston +Levitan +Levitas +Levitch +Levites +Levitin +Leviton +Levitre +Levitsky +Levitt +Levitz +Levo +Levoci +Levoy +Levra +Levreau +Levreault +Levron +Levy +Lew +Lewallen +Lewan +Lewand +Lewandoski +Lewandowski +Lewandowsky +Lewark +Lewars +Lewczyk +Lewellen +Lewelling +Lewellyn +Lewerke +Lewey +Lewi +Lewicki +Lewin +Lewinski +Lewis +Lewison +Lewitt +Lewman +Lewry +Lewter +Lewton +Lewy +Lex +Lexer +Ley +Leya +Leyba +Leyda +Leydecker +Leyden +Leyendecker +Leyh +Leyland +Leymeister +Leynes +Leyra +Leyrer +Leys +Leysath +Leyson +Leyton +Leyua +Leyva +Leyvas +Leza +Lezak +Lezama +Lezcano +Lezer +Lezo +Lezon +Lheureux +Lhommedieu +Lhuillier +Li +Lia +Liakos +Lian +Lianes +Liang +Liano +Liao +Liapis +Lias +Liaw +Libbee +Libberton +Libbey +Libby +Libel +Libengood +Libera +Liberati +Liberato +Liberatore +Liberman +Libert +Liberti +Libertini +Liberto +Liberty +Libke +Libman +Liborio +Libra +Librandi +Libre +Librizzi +Liburd +Libutti +Licalzi +Licano +Licari +Licata +Licause +Licausi +Licavoli +Licciardi +Liccione +Liccketto +Licea +Liceaga +Licerio +Lich +Lichak +Lichenstein +Lichliter +Lichlyter +Lichorat +Lichota +Lichstein +Licht +Lichte +Lichtenberg +Lichtenberger +Lichtenfeld +Lichtenstein +Lichtenwalner +Lichtenwalter +Lichter +Lichtig +Lichtman +Lichty +Lick +Lickert +Lickey +Lickfelt +Lickiss +Lickley +Licklider +Lickliter +Lickness +Lickteig +Lico +Licon +Licor +Licudine +Licursi +Lidbom +Liddell +Lidder +Liddiard +Liddick +Liddicoat +Liddie +Liddle +Liddy +Lide +Lidey +Lidge +Lidie +Lidke +Lidster +Lidstone +Lidstrom +Lidtke +Lie +Lieb +Liebau +Liebe +Liebeck +Liebel +Liebelt +Liebenow +Liebenthal +Lieber +Lieberg +Lieberman +Liebermann +Liebert +Liebhardt +Liebherr +Liebig +Liebl +Liebler +Lieblong +Liebman +Liebold +Liebowitz +Liebrecht +Liebross +Liebsch +Liebskind +Liechti +Liechty +Lied +Liedberg +Lieder +Liederbach +Liedke +Liedtke +Liedy +Liefer +Liegler +Liehr +Liekhus +Liem +Lien +Liendo +Lienemann +Lieng +Lienhard +Lienke +Liepins +Lierle +Lierman +Lierz +Lies +Liesch +Lieser +Lieske +Liesman +Liesmann +Liess +Liest +Liestman +Liesveld +Lieto +Lietz +Lietzke +Lietzow +Lieu +Lieuallen +Lieurance +Lievano +Lievens +Lievsay +Liew +Liewald +Life +Lifer +Liff +Liffick +Lifford +Lifland +Liford +Lifschitz +Lifsey +Lifshitz +Liftin +Lifton +Ligas +Lige +Liggans +Ligget +Liggett +Liggin +Liggins +Liggons +Light +Lightbody +Lightbourne +Lightcap +Lighter +Lightfoot +Lightford +Lighthall +Lighthart +Lighthill +Lightle +Lightner +Lightning +Lights +Lightsey +Lighty +Ligler +Ligman +Ligon +Ligonis +Ligons +Liguori +Liiv +Lijewski +Likar +Like +Likens +Likes +Likins +Likio +Likos +Lilburn +Lile +Liles +Liley +Lilien +Lilienthal +Lilja +Liljeberg +Liljedahl +Liljenquist +Lill +Lilla +Lillard +Lilleberg +Lillehaug +Liller +Lilley +Lillian +Lillibridge +Lillich +Lillick +Lillie +Lillig +Lillis +Lillo +Lillpop +Lilly +Lillywhite +Liloia +Lily +Lilyblade +Lilyquist +Lim +Lima +Limage +Limardi +Limardo +Limas +Limauro +Limb +Limbach +Limbaugh +Limber +Limberg +Limbert +Limbo +Limbrick +Limburg +Lime +Limehouse +Limerick +Limes +Limesand +Liming +Limke +Limle +Limmel +Limmer +Limoges +Limoli +Limon +Limones +Limthong +Lin +Lina +Linahan +Linak +Linamen +Linan +Linander +Linard +Linardi +Linares +Linarez +Linberg +Linburg +Linch +Lincicome +Lincicum +Linck +Lincks +Lincoln +Lincourt +Lind +Linda +Lindabury +Lindahl +Lindall +Lindaman +Lindamood +Lindau +Lindauer +Lindbeck +Lindberg +Lindblad +Lindblom +Lindbloom +Lindbo +Lindboe +Lindburg +Linde +Lindeen +Lindel +Lindeland +Lindell +Lindelof +Lindeman +Lindemann +Lindemuth +Linden +Lindenbaum +Lindenberg +Lindenberger +Lindenfelser +Lindenmuth +Lindenpitz +Linder +Linderholm +Linderleaf +Linderman +Linders +Lindersmith +Lindert +Lindesmith +Lindfors +Lindgren +Lindholm +Lindhorst +Lindie +Lindig +Lindinha +Lindler +Lindley +Lindline +Lindloff +Lindman +Lindmeyer +Lindner +Lindo +Lindon +Lindorf +Lindow +Lindquist +Lindroth +Lindsay +Lindsey +Lindskog +Lindsley +Lindstedt +Lindstrom +Lindwall +Lindy +Lindzy +Line +Linea +Linear +Lineback +Linebarger +Linebaugh +Lineberger +Lineberry +Linebrink +Linegar +Linehan +Lineman +Linen +Linenberger +Liner +Linero +Lines +Linet +Lineweaver +Linford +Ling +Lingad +Lingafelt +Lingafelter +Lingao +Lingard +Lingardo +Lingbeck +Lingbeek +Lingberg +Lingefelt +Lingel +Lingelbach +Lingenfelter +Linger +Lingerfelt +Lingerfelter +Lingg +Linginfelter +Lingle +Lingley +Lingner +Lingo +Lingren +Linhardt +Linhares +Linhart +Lininger +Linington +Link +Linke +Linker +Linkert +Linkhart +Linkkila +Linklater +Linko +Linkon +Linkous +Linkovich +Linkowski +Links +Linley +Linman +Linn +Linnan +Linnane +Linne +Linnear +Linnecke +Linnell +Linneman +Linnemann +Linnen +Linnert +Linnertz +Linney +Lino +Linquist +Lins +Linsay +Linscomb +Linscott +Linsdau +Linsday +Linsenmayer +Linsey +Linsin +Linsky +Linsley +Linsner +Linson +Linssen +Linstrom +Lint +Linthicum +Lintner +Linton +Lints +Lintz +Linville +Linwood +Linz +Linza +Linzan +Linzey +Linzie +Linzy +Lio +Lion +Lionberger +Lionello +Lionetti +Lions +Liontos +Liotta +Liou +Lipa +Lipan +Lipani +Lipari +Lipe +Lipford +Lipham +Lipinski +Lipinsky +Lipira +Lipitz +Lipka +Lipke +Lipkin +Lipkind +Lipkovitch +Lipman +Lipner +Lipoma +Lipovsky +Lipp +Lippa +Lippard +Lippe +Lippeatt +Lipper +Lippert +Lipphardt +Lippi +Lippincott +Lippitt +Lippman +Lippold +Lippoldt +Lipps +Lippy +Lips +Lipschutz +Lipscomb +Lipscombe +Lipsett +Lipsey +Lipsie +Lipsitz +Lipskar +Lipski +Lipsky +Lipson +Lipstone +Lipszyc +Liptak +Liptok +Lipton +Liptow +Liptrap +Liptrot +Liquet +Liquori +Lira +Lirag +Liranzo +Lirette +Liriano +Lis +Lisa +Lisanti +Lisbey +Lisboa +Lisby +Liscano +Lischak +Liscio +Liscomb +Lisee +Lisena +Lisenbee +Lisenby +Lish +Lisherness +Lishman +Lisi +Lisiecki +Lisitano +Lisius +Lisk +Liska +Liskai +Liske +Lisker +Liskey +Liskiewicz +Lisko +Liskovec +Lisle +Lisman +Lisonbee +Lisowe +Lisowski +Liss +Lissard +Lisser +Lissy +List +Lista +Listen +Lister +Listi +Liston +Lisy +Liszewski +Litaker +Litalien +Litano +Litchard +Litchfield +Litchford +Litchmore +Litecky +Litehiser +Liter +Lites +Litherland +Litka +Litke +Litle +Litman +Litmanowicz +Litner +Litrenta +Litscher +Litsey +Litster +Litt +Littau +Litteer +Littell +Litten +Litter +Litteral +Litterer +Littfin +Littich +Little +Littledave +Littlefield +Littlehale +Littlejohn +Littlepage +Littler +Littles +Littleton +Littlewood +Littman +Littmann +Litton +Littrel +Littrell +Litts +Litty +Litvak +Litvin +Litwiler +Litwin +Litz +Litza +Litzau +Litzenberg +Litzenberger +Litzinger +Litzsinger +Liu +Liukko +Liukkonen +Liuzza +Liuzzi +Liv +Livas +Livasy +Livecchi +Lively +Livengood +Liveoak +Liverance +Liverani +Liverman +Livermon +Livermore +Livernash +Livernoche +Livernois +Liverpool +Livers +Liversedge +Livesay +Livesey +Livezey +Livi +Livigni +Living +Livingood +Livings +Livingston +Livingstone +Livington +Livinton +Livley +Livoti +Livsey +Livshits +Liwanag +Liz +Lizak +Lizama +Lizana +Lizaola +Lizarda +Lizardi +Lizardo +Lizarraga +Lizarrago +Lizer +Lizotte +Ljungquist +Llamas +Llams +Llanas +Llanes +Llanet +Llanez +Llaneza +Llano +Llanos +Llarena +Llarenas +Llera +Lleras +Llerena +Llewellyn +Llewlyn +Lloid +Llopis +Llorca +Llorens +Lloyd +Llyod +Lo +Loa +Loach +Loader +Loadholt +Loaiza +Loan +Loar +Loarca +Loatman +Loats +Lob +Lobach +Lobalbo +Loban +Lobasso +Lobato +Lobaton +Lobaugh +Lobb +Lobban +Lobbins +Lobdell +Lobe +Lobel +Lobell +Lobello +Lobendahn +Lober +Loberg +Lobianco +Lobingier +Lobley +Lobner +Lobo +Lobos +Lobosco +Lobregat +Lobstein +Lobue +Lobur +Locante +Locantore +Locascio +Locastro +Locatelli +Locey +Loch +Lochan +Loche +Lochen +Locher +Lochner +Lochotzki +Lochrico +Lochridge +Lochte +Locicero +Lock +Lockaby +Lockamy +Lockard +Lockart +Lockbaum +Locke +Lockemer +Locken +Locker +Lockerby +Lockerman +Lockery +Locket +Lockett +Lockette +Lockey +Lockhart +Lockheart +Lockie +Lockington +Locklar +Locklear +Lockley +Locklier +Locklin +Lockman +Lockmiller +Locknane +Lockner +Lockrem +Lockridge +Locks +Lockshaw +Lockwood +Lockyer +Lococo +Loconte +Locorriere +Locsin +Locus +Locust +Locy +Lodato +Lodeiro +Loden +Lodense +Loder +Lodge +Lodholz +Lodi +Lodrigue +Loduca +Lodwick +Loe +Loeb +Loeber +Loeblein +Loebs +Loecken +Loeckle +Loeffel +Loeffelholz +Loeffler +Loegering +Loehlein +Loehner +Loehr +Loehrer +Loehrs +Loendorf +Loeper +Loepp +Loeppke +Loeppky +Loera +Loertscher +Loerwald +Loerzel +Loesch +Loesche +Loescher +Loeschner +Loeser +Loessberg +Loethen +Loetz +Loeurm +Loeven +Loew +Loewe +Loewen +Loewenstein +Loewenthal +Loewer +Loeza +Lofaro +Lofaso +Loffelbein +Loffier +Loffler +Loffredo +Lofft +Lofgreen +Lofgren +Lofguist +Lofing +Lofink +Lofland +Loflen +Loflin +Lofman +Loforte +Lofquist +Lofredo +Lofstead +Lofstrom +Loft +Lofte +Loften +Lofthouse +Lofthus +Lofties +Loftin +Loftis +Loftman +Lofton +Lofts +Loftus +Lofty +Lofwall +Logalbo +Logan +Logarbo +Loge +Logel +Logemann +Logero +Loges +Loggains +Loggens +Logghe +Loggin +Loggins +Loghry +Logie +Logins +Logiudice +Logoleo +Logosso +Lograsso +Logrono +Logsdon +Logston +Logue +Loguidice +Logwood +Loh +Lohan +Lohden +Lohman +Lohmann +Lohmeier +Lohmeyer +Lohmiller +Lohn +Lohnes +Lohoff +Lohr +Lohre +Lohrenz +Lohrey +Lohrke +Lohrman +Lohrmann +Lohry +Lohse +Loht +Lohwasser +Loi +Loia +Loiacona +Loiacono +Loiko +Loil +Lois +Loiseau +Loisel +Loiselle +Lojek +Lok +Lokan +Lokaphone +Loken +Loker +Lokey +Lokhmator +Lokhmatov +Lokietek +Lokke +Lokken +Lokker +Lokuta +Lola +Lolagne +Lolar +Loli +Loll +Lollar +Lolley +Lolli +Lollie +Lolling +Lollis +Loma +Lomack +Lomago +Loman +Lomanto +Lomartire +Lomas +Lomascolo +Lomasney +Lomax +Lomay +Lomba +Lombard +Lombardi +Lombardino +Lombardo +Lombel +Lombera +Lomboy +Lombrana +Lomedico +Lomeli +Lomen +Lomg +Lominack +Lomino +Lominy +Lommel +Lomonaco +Lomonte +Lompa +Lomu +Lomuscio +Lona +Lonabaugh +Lonas +Loncar +Loncaric +Londagin +Londner +Londo +London +Londono +Londre +Lone +Loner +Lonergan +Lonero +Lones +Loney +Long +Longabaugh +Longacre +Longaker +Longan +Longanecker +Longbine +Longbotham +Longbottom +Longbrake +Longchamps +Longcor +Longden +Longe +Longenberger +Longendyke +Longenecker +Longerbeam +Longest +Longfellow +Longfield +Longford +Longhenry +Longhi +Longhini +Longhofer +Longhurst +Longie +Longin +Longino +Longinotti +Longiotti +Longknife +Longley +Longman +Longmire +Longmore +Longnecker +Longo +Longobardi +Longoria +Longpre +Longs +Longsdorf +Longshore +Longstaff +Longstreet +Longstreth +Longsworth +Longtin +Longton +Longueville +Longway +Longwell +Longwith +Longworth +Lonie +Lonn +Lonneman +Lonon +Lons +Lonsdale +Lonsinger +Lonsway +Lontz +Lonzo +Loo +Looby +Loock +Loofbourrow +Looft +Looi +Look +Lookabaugh +Lookadoo +Looker +Looman +Loomer +Loomis +Looney +Loop +Looper +Loos +Loose +Loosen +Loosey +Loosier +Loosle +Loosli +Lootens +Loots +Loparco +Lopardo +Loparo +Lopas +Lopata +Lopau +Lopaz +Lope +Lopeman +Loper +Lopera +Loperena +Loperfido +Lopes +Lopey +Lopez +Lopiccalo +Lopiccolo +Lopilato +Lopinto +Lopp +Lopresti +Lopresto +Lopriore +Lopus +Lopuzzo +Lopze +Loque +Lor +Lora +Lorah +Loraine +Loran +Lorance +Lorandeau +Lorange +Loranger +Loras +Lorber +Lorch +Lord +Lorden +Lordi +Lords +Lore +Loreaux +Loredo +Loree +Loreg +Lorelli +Lorello +Loreman +Loren +Lorenc +Lorence +Lorens +Lorensen +Lorenson +Lorent +Lorente +Lorentine +Lorentz +Lorentzen +Lorenz +Lorenzana +Lorenzano +Lorenzen +Lorenzetti +Lorenzi +Lorenzini +Lorenzo +Loreto +Lorett +Lorette +Loretto +Loretz +Lorey +Lorge +Lori +Loria +Lorick +Lorimer +Lorimor +Lorin +Lorincz +Loring +Lorino +Lorio +Lorion +Lorkowski +Lorman +Lormand +Lorna +Loron +Lorona +Lorquet +Lorr +Lorraine +Lorson +Lorsung +Lortie +Lorton +Lorts +Lortz +Lorusso +Lory +Lorz +Los +Losa +Losacco +Losada +Losado +Losano +Losardo +Losavio +Loscalzo +Losch +Loschiavo +Losco +Lose +Losecco +Losee +Loseke +Loser +Loseth +Losey +Losh +Loshbaugh +Loshe +Loshek +Losier +Losiewski +Losinger +Losinski +Losito +Loske +Loskill +Loskot +Losneck +Loso +Losolla +Loson +Losoya +Loss +Lossa +Losser +Lossett +Lossing +Lossius +Lossman +Lostetter +Loston +Lostracco +Lostroh +Loszynski +Lot +Lota +Lotan +Lotempio +Loter +Loterbauer +Loth +Lothamer +Lother +Lothian +Lothridge +Lothringer +Lothrop +Lothspeich +Lotridge +Lotshaw +Lotson +Lotspeich +Lott +Lotta +Lotter +Lotthammer +Lotti +Lottie +Lotto +Lotton +Lotts +Lotz +Lotze +Lotzer +Lou +Louato +Loubier +Louch +Louchen +Louck +Loucks +Loud +Louden +Loudenslager +Louder +Louderback +Loudermelt +Loudermilk +Loudermill +Loudin +Loudon +Loudy +Louer +Louge +Lougee +Lough +Loughary +Loughborough +Lougheed +Loughery +Loughlin +Loughman +Loughmiller +Loughnan +Loughnane +Loughner +Loughney +Loughran +Loughrey +Loughridge +Loughry +Louie +Louil +Louis +Louise +Louissaint +Louissant +Louk +Louka +Loukanis +Loukas +Loukidis +Loukota +Louks +Lounder +Lounds +Loung +Lounsberry +Lounsbery +Lounsbury +Loup +Loupe +Louque +Loura +Louras +Lourdes +Loureiro +Lourence +Lourenco +Lourens +Lourentzos +Louria +Louris +Lournes +Louro +Loury +Louser +Lousteau +Lout +Louth +Louthan +Louthen +Louvier +Louviere +Louwagie +Loux +Lovaas +Lovaglio +Lovallo +Lovan +Lovas +Lovasz +Lovato +Love +Loveall +Loveberry +Lovec +Lovecchio +Loveday +Loveh +Lovejoy +Lovelace +Lovelady +Loveland +Loveless +Lovell +Lovellette +Lovelock +Lovely +Loveman +Loven +Lovenbury +Lovenduski +Lovensheimer +Lover +Lovera +Loverde +Loverdi +Loverich +Loveridge +Lovering +Loverink +Lovern +Lovero +Lovet +Lovetinsky +Lovett +Lovette +Lovfald +Lovgren +Lovich +Lovick +Lovie +Lovier +Lovig +Lovin +Loving +Lovinggood +Lovingood +Lovings +Lovins +Loviska +Lovisone +Lovitt +Lovitz +Lovorn +Lovstad +Lovvorn +Low +Lowa +Lowber +Lowcks +Lowd +Lowden +Lowder +Lowdermilk +Lowe +Lowek +Lowell +Lowen +Lowenstein +Lowenthal +Lower +Lowers +Lowery +Lowes +Lowhorn +Lowin +Lowing +Lowis +Lowitz +Lowler +Lowman +Lown +Lowndes +Lowney +Lownsbery +Lowrance +Lowrey +Lowrie +Lowrimore +Lowry +Lowther +Lowthert +Lowthorp +Lowy +Loxley +Loxtercamp +Loxton +Loy +Loya +Loyack +Loyal +Loyborg +Loyd +Loyed +Loyer +Loynd +Loynes +Loyola +Loyst +Loza +Lozada +Lozado +Lozano +Lozaro +Lozaya +Loze +Lozeau +Lozey +Lozier +Lozinski +Lozito +Lozo +Lozon +Lozowski +Lozoya +Lozzi +Lu +Lua +Luaces +Luague +Luallen +Luangamath +Luangrath +Luangsingotha +Luangxay +Luarca +Lubahn +Lubawy +Lubben +Lubbers +Lubbert +Lubbock +Lubbs +Lube +Lubeck +Lubell +Lubelski +Luben +Luber +Luberger +Lubic +Lubin +Lubinski +Lubinsky +Lubke +Lubman +Lubow +Lubrano +Luby +Luc +Luca +Lucarell +Lucarelli +Lucario +Lucas +Lucash +Lucatero +Lucca +Lucchese +Lucchesi +Lucchetti +Lucchini +Lucci +Luccous +Luce +Lucear +Lucek +Lucena +Lucente +Lucero +Lucey +Luchenbill +Lucherini +Luchesi +Luchessa +Luchetti +Luchini +Luchsinger +Lucht +Luchterhand +Luci +Lucia +Lucian +Luciani +Luciano +Lucic +Lucich +Lucidi +Lucido +Lucie +Lucien +Lucier +Lucik +Lucio +Lucion +Lucious +Lucis +Lucius +Luck +Luckado +Luckadoo +Lucke +Lucken +Luckenbach +Luckenbaugh +Luckenbill +Lucker +Luckett +Luckey +Luckhardt +Luckie +Luckinbill +Luckman +Luckner +Luckow +Luckritz +Lucks +Lucksinger +Lucksom +Lucky +Luco +Lucore +Lucus +Lucy +Luczak +Luczki +Luczkowiak +Luczynski +Ludd +Ludden +Luddy +Ludecke +Ludeke +Ludeker +Ludeman +Ludemann +Ludera +Luderman +Ludewig +Ludgate +Ludgood +Ludington +Ludke +Ludkowski +Ludlam +Ludlow +Ludlum +Ludolph +Ludovici +Ludovico +Ludtke +Ludvigsen +Ludvigson +Ludvik +Ludwick +Ludwig +Ludy +Lue +Luebano +Luebbe +Luebbering +Luebbers +Luebbert +Luebke +Luecht +Luechtefeld +Lueck +Luecke +Lueckenbach +Lueckenhoff +Lueckenotte +Luecking +Luedecke +Luedeman +Lueder +Lueders +Luedi +Luedke +Luedtke +Luehring +Luehrs +Lueker +Lueking +Luelf +Luellen +Luening +Luensmann +Luepke +Luer +Luera +Lueras +Luers +Luersen +Lueschen +Luescher +Lueth +Luetkemeyer +Luetmer +Luette +Luevand +Luevano +Luevanos +Lufborough +Luff +Luffman +Luffy +Lufkin +Lufsey +Luft +Luga +Lugabihl +Lugar +Lugardo +Luger +Lugg +Luginbill +Lugo +Lugones +Luhman +Luhmann +Luhn +Luhnow +Luhr +Luhring +Luhrs +Lui +Luick +Luikart +Luing +Luinstra +Luis +Luisi +Luiso +Luitjens +Luiz +Lujan +Lujano +Luk +Luka +Lukach +Lukacs +Lukan +Lukander +Lukas +Lukasiewicz +Lukasik +Lukaskiewicz +Lukaszewicz +Lukaszewski +Lukavsky +Luke +Lukehart +Luken +Lukens +Luker +Lukes +Lukesh +Lukianov +Lukin +Lukins +Lukman +Lukow +Lukowski +Luksa +Lulas +Lule +Lulewicz +Lulic +Lull +Luloff +Lulow +Lum +Luma +Lumadue +Luman +Lumantas +Lumas +Lumb +Lumba +Lumbard +Lumbert +Lumbley +Lumbra +Lumbreras +Luminati +Lumley +Lumm +Lummis +Lummus +Lumpkin +Lumpkins +Lumpp +Lumsden +Lumukanda +Luna +Lunan +Lunceford +Lunch +Luncsford +Lund +Lundahl +Lunday +Lundberg +Lundblad +Lundborg +Lundburg +Lundby +Lunde +Lundeby +Lundeen +Lundell +Lundemo +Lunden +Lunderman +Lunderville +Lundgreen +Lundgren +Lundholm +Lundi +Lundie +Lundin +Lundman +Lundmark +Lundquist +Lundrigan +Lundsford +Lundsten +Lundstrom +Lundvall +Lundy +Luneau +Lunemann +Lunetta +Lunford +Lung +Lunger +Lunghofer +Lungren +Lungsford +Lungstrom +Lungwitz +Lunn +Lunney +Lunning +Lunnon +Lunsford +Lunstrum +Lunt +Lunter +Lunz +Luo +Luoma +Luong +Luongo +Luoto +Lupacchino +Lupardus +Luper +Lupercio +Lupez +Lupfer +Lupi +Lupiani +Lupien +Lupinacci +Lupino +Lupkes +Lupkin +Lupo +Lupoe +Lupold +Luppino +Luptak +Lupton +Lupu +Lupul +Luque +Luquette +Luquin +Lura +Lurey +Luria +Lurie +Lurry +Lurtz +Lurvey +Lury +Lurye +Lurz +Lusane +Lusardi +Lusby +Luscavage +Lusco +Luscombe +Luse +Lush +Lushbaugh +Lusher +Lusignan +Lusk +Luskey +Luskin +Luss +Lussier +Lust +Lustberg +Luster +Lustig +Lusty +Lutao +Lutchman +Lute +Luten +Luter +Lutes +Lutfy +Lutgen +Luth +Luthe +Luther +Luthi +Luthy +Lutjen +Lutke +Lutkins +Lutkus +Lutman +Luton +Lutrell +Lutrick +Lutsky +Luttenegger +Lutter +Lutterman +Luttman +Luttmer +Lutton +Luttrell +Luttrull +Lutts +Lutwin +Lutz +Lutze +Lutzi +Luu +Luvene +Luvera +Luvert +Luvian +Luvianos +Lux +Luxenberg +Luxmore +Luxon +Luxton +Luy +Luyando +Luz +Luzader +Luzania +Luzar +Luzell +Luzi +Luzier +Luzinski +Luzuriaga +Luzzi +Lweis +Ly +Lyall +Lyalls +Lyas +Lyau +Lybarger +Lybbert +Lybecker +Lyberger +Lybert +Lybrand +Lycan +Lychwala +Lyda +Lyday +Lyde +Lydecker +Lyden +Lydia +Lydic +Lydick +Lydon +Lye +Lyell +Lyerla +Lyerly +Lyew +Lyford +Lykam +Lyke +Lyken +Lykens +Lykes +Lykins +Lykke +Lykken +Lyle +Lyles +Lym +Lyman +Lymaster +Lyme +Lymon +Lyn +Lynady +Lynah +Lynam +Lynaugh +Lynch +Lynchard +Lynchj +Lynd +Lyndaker +Lynde +Lyndon +Lynds +Lyne +Lynema +Lynes +Lyness +Lyng +Lynge +Lyngholm +Lynk +Lynn +Lynne +Lynott +Lynskey +Lynum +Lyon +Lyons +Lysaght +Lysak +Lysen +Lyseski +Lysher +Lysiak +Lysne +Lyson +Lyssy +Lyster +Lytal +Lytch +Lytell +Lyter +Lytle +Lyttle +Lytton +Lyvers +Ma +Maack +Maag +Maahs +Maalouf +Maarx +Maas +Maasch +Maasen +Maaske +Maass +Maassen +Maatta +Mabane +Mabary +Mabb +Mabbott +Mabe +Mabee +Mabel +Maben +Maberry +Mabery +Mabey +Mabie +Mabin +Mabins +Mable +Mabon +Mabone +Mabra +Mabray +Mabrey +Mabry +Mabus +Mac +Macabeo +Macadam +Macadamia +Macadangdang +Macafee +Macahilas +Macall +Macallister +Macalma +Macaluso +Macanas +Macandog +Macapagal +Macaraeg +Macaraig +Macareno +Macari +Macarthur +Macartney +Macaskill +Macaulay +Macauley +Macayan +Macbean +Macbeth +Macbride +Maccabe +Maccallum +Maccarini +Maccarino +Maccarone +Maccarter +Maccarthy +Maccartney +Maccauley +Maccheyne +Macchi +Macchia +Macchiarella +Macchiaroli +Macchio +Macchione +Maccini +Macclairty +Macclellan +Maccoll +Macconaghy +Macconnell +Maccord +Maccormack +Macculloch +Maccutcheon +Macdaniel +Macdermott +Macdiarmid +Macdonald +Macdonell +Macdonnell +Macdougal +Macdougald +Macdougall +Macdowell +Macduff +Macduffee +Mace +Maceachern +Maceda +Macedo +Macedonio +Macek +Macentee +Macer +Macera +Macewen +Macey +Maceyak +Macfarland +Macfarlane +Macgillivray +Macgowan +Macgregor +Macguire +Mach +Macha +Machacek +Machado +Machain +Machak +Machala +Machalek +Machamer +Machan +Machel +Machen +Machenry +Machens +Machesky +Machey +Machi +Machia +Machida +Machin +Machinsky +Machkovich +Machle +Machlin +Machnik +Macho +Machol +Machold +Machon +Machover +Machowski +Macht +Machtley +Machuca +Machuga +Macia +Maciag +Maciak +Maciarello +Macias +Maciasz +Macie +Maciej +Maciejczyk +Maciejewski +Maciejko +Maciel +Macina +Macinnes +Macinnis +Macintosh +Macintyre +Macioce +Maciolek +Macione +Macisaac +Maciver +Macivor +Mack +Mackall +Mackaman +Mackay +Macke +Mackechnie +Mackedanz +Mackeen +Mackel +Mackell +Mackellar +Macken +Mackenthun +Mackenzie +Macker +Mackerl +Mackert +Mackessy +Mackesy +Mackey +Macki +Mackie +Mackiewicz +Mackillop +Mackimmie +Mackin +Mackinaw +Mackinder +Mackinlay +Mackinnon +Mackins +Mackintosh +Mackle +Macklem +Mackler +Mackley +Macklin +Macknair +Mackney +Macknight +Macko +Mackowiak +Mackowski +Macks +Macksey +Mackson +Macksoud +Mackstutis +Macky +Mackynen +Maclachlan +Maclain +Maclaren +Maclauchlan +Maclaughlin +Maclaurin +Maclay +Maclead +Maclean +Maclellan +Maclennan +Macleod +Maclin +Macmahon +Macmanus +Macmaster +Macmillan +Macmillen +Macmullan +Macmullen +Macmurray +Macnab +Macnair +Macnamara +Macnamee +Macnaught +Macnaughton +Macneal +Macneil +Macneill +Macnevin +Macnutt +Maco +Macola +Macomb +Macomber +Macon +Macoreno +Macpartland +Macphail +Macphee +Macpherson +Macquarrie +Macqueen +Macrae +Macreno +Macri +Macrina +Macrostie +Macrowski +Macrum +Macugay +Macumber +Macura +Macurdy +Macvane +Macvean +Macvicar +Macwilliams +Macy +Maczko +Mad +Mada +Madaffari +Madagan +Madalinski +Madamba +Madan +Madara +Madarang +Madaras +Madariaga +Madaris +Maday +Madayag +Maddalena +Maddaleno +Maddaloni +Madden +Maddern +Maddin +Madding +Maddison +Maddix +Maddock +Maddocks +Maddox +Maddoy +Maddrey +Maddron +Maddry +Maddux +Maddy +Madeau +Madeira +Madeiros +Madeja +Maden +Madena +Madenford +Mader +Madera +Maderas +Madere +Maderios +Madero +Mades +Madewell +Madge +Madhavan +Madho +Madi +Madia +Madigan +Madill +Madin +Madina +Madine +Madinger +Madise +Madison +Maditz +Madkin +Madkins +Madlem +Madler +Madlock +Madlung +Madnick +Madock +Madole +Madon +Madonia +Madonna +Mador +Madore +Madrano +Madras +Madray +Madrazo +Madre +Madren +Madrid +Madrigal +Madril +Madriz +Madron +Madrueno +Madruga +Madry +Madsen +Madson +Madu +Maduena +Madueno +Madura +Maduro +Mady +Madyun +Madziar +Mae +Maeda +Maedche +Maeder +Maedke +Maenaga +Maendel +Maenhout +Maenius +Maenner +Maeno +Maenpaa +Maertens +Maertz +Maerz +Maes +Maese +Maestas +Maestos +Maestre +Maestri +Maeweather +Maez +Maffei +Maffeo +Maffett +Maffey +Maffia +Maffit +Maffitt +Maffucci +Mafnas +Mafua +Maga +Magadan +Magaddino +Magaha +Magaldi +Magallan +Magallanes +Magallanez +Magallon +Magalong +Magalski +Magan +Magana +Magano +Magar +Magarelli +Magario +Magat +Magathan +Magaw +Magaziner +Magbitang +Magby +Magda +Magdalena +Magdaleno +Magdefrau +Mage +Maged +Magedanz +Magee +Magel +Magelssen +Mager +Magera +Magers +Mages +Magett +Magette +Magg +Maggard +Maggart +Maggert +Maggi +Maggie +Maggini +Magginson +Maggio +Maggiore +Maggit +Maggs +Magic +Magid +Magierski +Magil +Magill +Magin +Maginn +Maginnis +Magistrale +Magitt +Maglaras +Maglaughlin +Maglaya +Magleby +Magley +Magliacane +Magliano +Maglio +Magliocca +Magliocco +Maglioli +Magliolo +Maglione +Magliulo +Maglori +Maglott +Magnall +Magnan +Magnani +Magnano +Magnant +Magnanti +Magner +Magness +Magnett +Magnetti +Magni +Magnia +Magnie +Magnifico +Magnini +Magno +Magnone +Magnotta +Magnotti +Magnus +Magnuson +Magnusson +Mago +Magobet +Magone +Magoon +Magorina +Magos +Magouirk +Magouliotis +Magoun +Magouyrk +Magowan +Magpali +Magpuri +Magpusao +Magrann +Magrath +Magraw +Magri +Magro +Magrone +Magruder +Magsamen +Magsayo +Magsby +Maguet +Maguire +Magwire +Magwood +Magyar +Mah +Maha +Mahabir +Mahaffey +Mahaffy +Mahajan +Mahal +Mahala +Mahaley +Mahalko +Mahall +Maham +Mahan +Mahana +Mahaney +Mahanna +Mahany +Mahapatra +Mahar +Maharaj +Maharg +Maharrey +Mahaxay +Mahdi +Mahe +Maheia +Maher +Maheras +Maheu +Maheux +Mahfouz +Mahi +Mahin +Mahl +Mahle +Mahler +Mahley +Mahli +Mahlke +Mahlman +Mahlum +Mahmood +Mahmoud +Mahmud +Mahn +Mahnke +Mahnken +Mahoe +Maholmes +Mahomes +Mahomly +Mahon +Mahone +Mahoney +Mahony +Mahood +Mahowald +Mahr +Mahran +Mahraun +Mahrenholz +Mahrer +Mahula +Mahuna +Mahung +Mahunik +Mahurin +Mahusay +Mai +Maia +Maiava +Maicus +Maid +Maida +Maiden +Maidens +Maidonado +Maiello +Maier +Maiers +Maietta +Maifeld +Maignan +Maigret +Maikoksoong +Mail +Mailander +Maile +Mailes +Mailey +Mailhiot +Mailhot +Maillard +Maille +Maillet +Mailliard +Mailloux +Mailman +Mailo +Maimone +Main +Mainard +Maine +Mainella +Mainello +Mainer +Mainero +Maines +Mainetti +Mainey +Mainguy +Mainiero +Mainland +Maino +Mainolfi +Mainor +Mainord +Mains +Mainville +Mainwaring +Mainz +Maio +Maiocco +Maiolo +Maione +Maiorano +Mair +Maire +Mairot +Mairs +Mais +Maisano +Maisch +Maise +Maisel +Maisenbacher +Maisey +Maish +Maison +Maisonave +Maisonet +Maisto +Maita +Maiten +Maitland +Maixner +Maize +Maizes +Maj +Majamay +Majano +Majcher +Majchrzak +Majeau +Majeed +Majer +Majera +Majercik +Majercin +Majerowski +Majersky +Majerus +Majeske +Majeski +Majestic +Majette +Majewski +Majic +Majica +Majid +Majied +Majka +Majkowski +Majkut +Majmundar +Majocka +Major +Majorga +Majors +Majure +Majuste +Mak +Maka +Makanani +Makar +Makara +Makarem +Makarewicz +Makekau +Makel +Makela +Makepeace +Maker +Makey +Makhija +Maki +Makin +Makinen +Makino +Makins +Makinson +Makinster +Makler +Makley +Mako +Makofsky +Makos +Makovec +Makowski +Makowsky +Makris +Maks +Makua +Makuch +Malabanan +Malabe +Malabey +Malacara +Malach +Malachi +Malachowski +Malady +Malafronte +Malagarie +Malagisi +Malagon +Malahan +Malak +Malakai +Malakan +Malakowsky +Malama +Malamud +Malan +Malanado +Malanaphy +Maland +Malander +Malandra +Malandrino +Malandruccolo +Malaney +Malanga +Malango +Malara +Malarkey +Malas +Malasky +Malaspina +Malaterre +Malatesta +Malave +Malaver +Malavet +Malawy +Malay +Malbaurn +Malboeuf +Malbon +Malbrough +Malchow +Malcik +Malcolm +Malcom +Malcomb +Malcome +Malcomson +Maldanado +Malden +Maldenado +Maldomado +Maldonado +Maldonaldo +Malec +Malech +Malecha +Maleck +Malecki +Maleh +Malehorn +Malek +Malekan +Malekzadeh +Malen +Malena +Malenfant +Malenke +Malensek +Maleonado +Maler +Males +Maleski +Malesky +Maleszka +Malet +Malett +Maletta +Malette +Maletz +Malewski +Maley +Malfatti +Malgieri +Malhi +Malhotra +Malia +Malicdem +Malich +Malichi +Malick +Malicoat +Malicote +Malik +Malikowski +Malin +Malina +Malinak +Malinchalk +Malinconico +Maline +Malinky +Malinoski +Malinovsky +Malinowski +Malinski +Malinsky +Malis +Maliska +Maliszewski +Malit +Malito +Malizia +Malkani +Malkasian +Malkiewicz +Malkin +Malkoski +Malkowski +Mall +Malla +Mallacara +Mallach +Mallahan +Mallak +Mallalieu +Mallar +Mallard +Mallari +Mallary +Mallas +Mallat +Malle +Malleck +Mallegni +Mallek +Mallen +Maller +Mallernee +Mallery +Mallet +Mallett +Mallette +Malley +Mallia +Mallick +Mallicoat +Mallie +Mallin +Mallinak +Malling +Mallinger +Mallinson +Mallis +Mallo +Malloch +Mallon +Mallone +Mallonee +Mallory +Mallow +Malloy +Mallozzi +Mally +Malm +Malmanger +Malmberg +Malmgren +Malmin +Malmquist +Malnar +Malo +Maloch +Malocha +Maloff +Malone +Maloney +Maloof +Malool +Maloon +Malory +Malott +Malotte +Malouf +Malouff +Malovich +Maloy +Malpass +Malphurs +Malpica +Malsam +Malsch +Malsom +Malson +Malstrom +Malta +Maltais +Maltas +Maltba +Maltbia +Maltbie +Maltby +Malter +Maltese +Maltez +Maltie +Malton +Maltos +Maltsberger +Maltz +Malueg +Malusky +Malvaez +Malveaux +Malvern +Malvin +Maly +Malys +Malzahn +Malzhan +Mam +Mamaclay +Mamaril +Mamer +Mammano +Mammen +Mammenga +Mammo +Mammoccio +Mammucari +Mamo +Mamon +Mamone +Mamoran +Mamros +Mamudoski +Mamula +Man +Mana +Manago +Manahan +Manaker +Manalang +Manalili +Manalo +Manansala +Manaois +Manard +Manary +Manas +Manasares +Manasco +Manassa +Manasse +Manatt +Manaugh +Manbeck +Manby +Manca +Mance +Mancell +Mancera +Mancha +Manche +Manchel +Mancher +Mancherian +Manchester +Manchini +Mancia +Mancias +Manciel +Mancil +Mancill +Mancilla +Mancillas +Mancina +Mancine +Mancinelli +Mancini +Mancino +Manco +Mancos +Mancusi +Mancuso +Mand +Manda +Mandahl +Mandala +Mandaloniz +Mandap +Mandarino +Mandato +Mandel +Mandelbaum +Mandelberg +Mandelik +Mandell +Mandella +Mander +Manders +Manderscheid +Manderson +Mandes +Mandeville +Mandez +Mandi +Mandia +Mandich +Mandigo +Mandino +Mandiola +Mandler +Mandley +Mandolfo +Mandolini +Mandonado +Mandoza +Mandrell +Mandril +Mandry +Mandt +Mandujano +Mandy +Mane +Maneafaiga +Manecke +Manely +Manemann +Maner +Manera +Manero +Manery +Manes +Maness +Manetta +Maney +Manford +Manfra +Manfre +Manfred +Manfredi +Manfredini +Manfredonia +Mang +Mangan +Manganaro +Manganelli +Manganello +Manganiello +Mangano +Mangaoang +Mangas +Mangat +Mangel +Mangels +Mangen +Manger +Manges +Mangham +Manghane +Mangiafico +Mangiamele +Mangiapane +Mangiaracina +Mangicavallo +Mangieri +Mangina +Mangine +Manginelli +Mangini +Mangino +Mangione +Mangis +Mangle +Manglona +Mango +Mangold +Mangon +Mangone +Mangram +Mangrich +Mangrum +Mangual +Mangubat +Mangum +Mangus +Manha +Manhardt +Manhart +Manheim +Mani +Mania +Maniace +Maniaci +Maniar +Maniatis +Manicchio +Maniccia +Manier +Manieri +Manifold +Manigault +Manigo +Manigold +Manikas +Manikowski +Manila +Manin +Manino +Manion +Manire +Manis +Maniscalco +Manista +Manivong +Manjarres +Manjarrez +Mank +Manka +Manke +Mankel +Manker +Mankey +Mankiewicz +Mankin +Mankins +Manko +Mankoski +Mankowski +Mankus +Manlangit +Manley +Manliguis +Manlito +Manlove +Manly +Mann +Manna +Mannan +Mannarino +Mannchen +Manne +Mannebach +Mannella +Mannello +Manner +Manners +Mannes +Manney +Mannheim +Mannheimer +Manni +Mannick +Mannie +Mannina +Mannine +Manning +Mannings +Mannino +Mannion +Mannis +Mannix +Manno +Mannon +Manns +Mannschreck +Manny +Mano +Manocchia +Manocchio +Manoi +Manokey +Manolakis +Manolis +Manon +Manoni +Manoogian +Manor +Manora +Manos +Manoso +Manous +Manozca +Manquero +Manring +Manrique +Manriquez +Manross +Manrriquez +Manry +Mans +Mansanares +Mansbach +Mansbridge +Manseau +Mansel +Mansell +Manser +Mansfield +Manship +Mansi +Mansir +Manske +Mansker +Mansmann +Mansmith +Manso +Manson +Mansour +Mansouri +Manspeaker +Mansukhani +Mansur +Mantano +Mantanona +Mante +Manteca +Mantegna +Mantel +Mantele +Mantell +Mantella +Mantelli +Manter +Manternach +Manteuffel +Mantey +Manthe +Manthei +Manthey +Mantia +Mantifel +Mantik +Mantilia +Mantilla +Mantini +Mantione +Mantis +Mantle +Manto +Manton +Mantooth +Mantsch +Mantuano +Mantyla +Mantz +Manual +Manuel +Manuele +Manuelito +Manuell +Manues +Manuia +Manus +Manusyants +Manvel +Manvelito +Manvelyan +Manville +Manwaring +Manwarren +Manweiler +Manwill +Many +Manygoats +Manylath +Manz +Manza +Manzanares +Manzanarez +Manzanero +Manzanilla +Manzano +Manzay +Manzella +Manzer +Manzi +Manzie +Manzione +Manzo +Manzone +Manzueta +Manzur +Mao +Maobi +Maohu +Maontesano +Mapa +Mapalo +Mapel +Mapes +Maphis +Maple +Maples +Mapp +Mapps +Mapston +Mapstone +Mapua +Maquis +Mar +Mara +Marabella +Marable +Maracle +Marade +Maradiaga +Marafioti +Maragh +Maragni +Maragno +Maraia +Marak +Maraldo +Marales +Marallo +Maran +Marana +Maranan +Maranda +Marander +Marandi +Marando +Marandola +Marangoni +Marani +Marano +Marante +Maranto +Marantz +Maranville +Maras +Marascalco +Marasciulo +Marasco +Marash +Marashi +Marashio +Marasigan +Maratos +Maratre +Maravilla +Marazas +Marazzi +Marbach +Marban +Marberry +Marble +Marbley +Marbray +Marbry +Marburger +Marbury +Marbus +Marbut +Marc +Marca +Marcaida +Marcano +Marcantel +Marcantonio +Marceau +Marceaux +Marcel +Marcelin +Marcelino +Marcell +Marcella +Marcelle +Marcelli +Marcellino +Marcello +Marcellus +Marcelynas +Marcet +Marcey +March +Marchak +Marchal +Marchaland +Marchall +Marchan +Marchand +Marchant +Marchbanks +Marchel +Marchell +Marchello +Marchena +Marchesano +Marchese +Marchesi +Marcheski +Marchessault +Marchesseault +Marchetta +Marchetti +Marchi +Marchiano +Marchio +Marchione +Marchionese +Marchionni +Marchiony +Marchiori +Marchitto +Marchizano +Marchman +Marchuk +Marci +Marcia +Marcial +Marciano +Marciante +Marciel +Marcil +Marcille +Marcin +Marcinek +Marciniak +Marcinka +Marcinkiewicz +Marcinko +Marcinkowski +Marcisak +Marcks +Marco +Marcoguisepp +Marcolina +Marcoline +Marcom +Marcon +Marcone +Marconi +Marconis +Marcos +Marcotrigiano +Marcott +Marcotte +Marcou +Marcoux +Marcrum +Marcucci +Marcum +Marcus +Marcusen +Marcussen +Marcy +Marczak +Marden +Marder +Mardesich +Mardini +Mardirosian +Mardirossian +Mardis +Mare +Maready +Marean +Marecki +Maree +Marek +Marello +Maren +Marenco +Marengo +Mareno +Marentes +Marentez +Marentis +Marer +Marero +Mares +Maresca +Maresco +Maresh +Maret +Marett +Maretti +Marevka +Marez +Marfil +Marflak +Margaitis +Margan +Margaret +Margaris +Margarita +Margaryan +Margason +Margel +Margerum +Margeson +Margheim +Margiotta +Margis +Margison +Margo +Margolies +Margolin +Margolis +Margosian +Margot +Margotta +Margraf +Margreiter +Marguardt +Marguez +Margulies +Margulis +Marhefka +Marhoefer +Mari +Maria +Mariacher +Marian +Mariani +Mariano +Marich +Marichalar +Maricich +Maricle +Marie +Mariello +Marien +Marier +Marietta +Maril +Marin +Marina +Marinacci +Marinaccio +Marinaro +Marinas +Marine +Marineau +Marinella +Marinelli +Marinello +Mariner +Marinero +Marines +Marinese +Marinez +Maring +Marini +Marinko +Marinkovic +Marino +Marinoni +Marinos +Marinucci +Mario +Marion +Marioni +Marionneaux +Mariotti +Maris +Mariscal +Mariska +Maritato +Maritn +Maritnez +Maritt +Marius +Marjan +Marjenhoff +Mark +Markakis +Markarian +Marke +Markee +Markegard +Markel +Markell +Marken +Marker +Markert +Markes +Market +Markette +Markevich +Markewich +Markey +Markgraf +Markham +Marki +Markie +Markiewicz +Markin +Marking +Markins +Markis +Markland +Markle +Markley +Marklund +Markman +Marko +Markoff +Markos +Markou +Markovich +Markovitz +Markow +Markowitz +Markowski +Markrof +Marks +Marksberry +Marksbury +Markson +Markstrom +Markt +Markum +Markunas +Markus +Markuson +Markve +Markwardt +Markway +Markwell +Markwood +Markworth +Marland +Marlar +Marlatt +Marlborough +Marlene +Marler +Marlett +Marlette +Marley +Marlin +Marling +Marlo +Marlor +Marlow +Marlowe +Marmas +Marmerchant +Marmie +Marmion +Marmo +Marmol +Marmolejo +Marmolejos +Marmon +Marn +Marnell +Marner +Marnett +Marney +Maro +Marocco +Marohl +Marohnic +Marois +Marola +Marold +Marolda +Marolf +Marolt +Maron +Marona +Marone +Maroney +Maronge +Maroni +Maroon +Marose +Marotta +Marotte +Marotti +Marotto +Marotz +Maroudas +Maroun +Marousek +Marovic +Marovich +Marozzi +Marple +Marples +Marquard +Marquardt +Marquart +Marque +Marquena +Marques +Marquess +Marquette +Marquez +Marquina +Marquis +Marquitz +Marr +Marra +Marrable +Marrano +Marrapese +Marrapodi +Marrara +Marrazzo +Marreel +Marrello +Marren +Marreo +Marrero +Marrett +Marrier +Marrietta +Marrin +Marrinan +Marriner +Marrington +Marrion +Marriot +Marriott +Marris +Marrison +Marro +Marroguin +Marron +Marrone +Marroquin +Marrotte +Marrow +Marrs +Marruffo +Marrufo +Marrujo +Marry +Mars +Marsac +Marsack +Marsala +Marsalis +Marsaw +Marsch +Marschall +Marschel +Marschke +Marsden +Marse +Marsee +Marseglia +Marseille +Marseilles +Marsek +Marsell +Marsella +Marsette +Marsh +Marsha +Marshak +Marshal +Marshalek +Marshall +Marshalsea +Marshbanks +Marshburn +Marshell +Marshman +Marsicek +Marsico +Marsiglia +Marsili +Marsingill +Marske +Marsland +Marso +Marsolais +Marsolek +Marson +Marstaller +Marsteller +Marsters +Marston +Marszalek +Mart +Marta +Martabano +Martain +Marte +Martel +Martell +Martella +Martellaro +Martelle +Martelles +Martelli +Martello +Marten +Marteney +Martenez +Martens +Martensen +Martenson +Marter +Martes +Martey +Marth +Martha +Marthaler +Marthe +Marti +Martian +Martiarena +Martich +Martie +Martiez +Martig +Martignago +Martillo +Martin +Martina +Martinas +Martinat +Martincic +Martindale +Martindelcamp +Martine +Martinea +Martineau +Martinek +Martinel +Martinell +Martinelli +Martines +Martinet +Martinetti +Martinetto +Martinex +Martinez +Martineze +Martini +Martinie +Martinis +Martiniz +Martinkus +Martino +Martinolli +Martinon +Martinov +Martins +Martinsen +Martinson +Martinsons +Martiny +Martinz +Martir +Martirano +Martire +Martis +Martischnig +Martling +Martnez +Marton +Martone +Martorana +Martorano +Martorell +Martorella +Martorelli +Martorello +Martos +Martowski +Marts +Martsolf +Martt +Martucci +Marturano +Marty +Martyn +Martyr +Martz +Maruca +Marucci +Maruco +Maruffo +Marugg +Marullo +Marum +Marumoto +Marungo +Marus +Marusak +Marusarz +Maruscak +Maruschak +Marushia +Marusiak +Maruska +Maruyama +Marvel +Marvier +Marville +Marvin +Marvray +Marwick +Marx +Marxen +Marxsen +Mary +Marye +Maryland +Maryott +Marz +Marzan +Marzano +Marze +Marzec +Marzella +Marzett +Marzette +Marzigliano +Marzili +Marzinske +Marzocchi +Marzolf +Marzullo +Mas +Masaitis +Masak +Masaki +Masar +Masaracchia +Masaya +Mascagni +Mascall +Mascarena +Mascarenas +Mascari +Mascaro +Mascetti +Masch +Maschak +Mascheck +Maschino +Maschio +Maschke +Maschmeyer +Masci +Mascia +Masciantonio +Mascio +Mascioli +Mascola +Mascolo +Mascorro +Mascot +Mascroft +Masden +Mase +Masek +Masell +Masella +Maselli +Masello +Masenten +Maser +Masero +Masey +Masgalas +Mash +Mashack +Mashak +Mashall +Mashaw +Mashburn +Mashek +Masher +Mashiah +Mashni +Mashore +Masi +Masias +Masiclat +Masiejczyk +Masiello +Masilko +Masin +Masincup +Masingale +Masini +Masino +Mask +Maskaly +Maske +Maskell +Masker +Maski +Maslak +Maslakowski +Maslanka +Maslen +Masley +Maslin +Maslonka +Masloski +Maslow +Maslowski +Maslowsky +Maslyn +Maso +Masom +Mason +Masone +Masoner +Masood +Masotti +Masoud +Masri +Mass +Massa +Massaglia +Massanelli +Massanet +Massaquoi +Massar +Massard +Massare +Massarelli +Massari +Massaro +Massart +Massay +Masse +Massed +Massee +Massei +Massella +Massena +Massenberg +Massenburg +Massengale +Massengill +Masser +Masseria +Massett +Massetti +Massey +Massi +Massiah +Massicotte +Massie +Massimino +Massimo +Massing +Massingale +Massingill +Massini +Massman +Massmann +Masso +Masson +Massoni +Massoud +Massucci +Massy +Mast +Mastalski +Mastel +Mastella +Masteller +Masten +Mastenbrook +Master +Mastera +Masterman +Masters +Masterson +Masterton +Mastin +Mastine +Maston +Mastoris +Mastrangelo +Mastrelli +Mastrianna +Mastrianni +Mastriano +Mastro +Mastrobuono +Mastrocola +Mastrocovi +Mastrogiovann +Mastroianni +Mastrolia +Mastromarino +Mastronardi +Mastropaolo +Mastropietro +Masturzo +Masucci +Masuda +Masudi +Masullo +Masunaga +Masupha +Masur +Masure +Masuyama +Masztal +Mata +Mataalii +Matacale +Mataka +Matakonis +Matalavage +Matalka +Matamoros +Matanane +Matar +Matarazzo +Matarese +Matarrita +Matas +Matava +Matayoshi +Matchen +Matchett +Matchette +Matczak +Mate +Mateen +Mateer +Mateiro +Mateja +Matejek +Matejka +Matelic +Matelich +Matelski +Maten +Mateo +Mateos +Mater +Matera +Matern +Materna +Matero +Mates +Matesic +Mateus +Matey +Math +Mathai +Mathal +Mathe +Matheis +Mathelier +Mathen +Mathena +Matheney +Mathenia +Matheny +Mather +Matherly +Mathern +Matherne +Mathers +Matherson +Mathery +Mathes +Matheson +Matheu +Matheus +Mathew +Mathewes +Mathews +Mathewson +Mathey +Mathia +Mathias +Mathiasen +Mathiason +Mathie +Mathies +Mathiesen +Mathieson +Mathieu +Mathiew +Mathis +Mathisen +Mathison +Mathony +Mathre +Mathson +Mathur +Mathurin +Mathus +Mathwich +Mathys +Matias +Matice +Matier +Matin +Matinez +Matis +Matise +Matison +Matkin +Matkins +Matko +Matkovic +Matkowski +Matkowsky +Matlack +Matley +Matlick +Matlin +Matlock +Matlow +Matney +Mato +Matonak +Matone +Matos +Matot +Matott +Matousek +Matranga +Matras +Matrejek +Matrey +Matrisciano +Matro +Matrone +Matros +Matsen +Matskin +Matsko +Matson +Matsoukas +Matsu +Matsubara +Matsuda +Matsuhara +Matsui +Matsuki +Matsumoto +Matsumura +Matsunaga +Matsuno +Matsuo +Matsuoka +Matsushima +Matsushita +Matsuura +Matsuzaki +Matt +Matta +Mattan +Mattas +Matte +Mattei +Matteis +Matten +Matteo +Matter +Mattera +Mattern +Matters +Matterson +Mattes +Matteson +Matteucci +Mattews +Mattey +Matthai +Matthees +Mattheis +Matthes +Matthew +Matthews +Matthewson +Matthey +Matthias +Matthies +Matthiesen +Matthis +Matthys +Mattia +Mattiace +Mattias +Mattice +Mattick +Mattie +Mattiello +Mattier +Mattila +Mattimoe +Mattina +Mattingley +Mattingly +Mattinson +Mattioli +Mattione +Mattis +Mattison +Mattix +Mattke +Mattler +Mattlin +Matto +Mattock +Mattocks +Matton +Mattoon +Mattos +Mattox +Matts +Mattsen +Mattsey +Mattson +Mattsson +Mattu +Matturro +Matty +Mattys +Matuck +Matuke +Matula +Matulewicz +Maturi +Matus +Matusek +Matuseski +Matushevsky +Matusiak +Matusiewicz +Matusik +Matuska +Matusz +Matuszak +Matuszek +Matuszeski +Matuszewski +Matute +Matya +Matyas +Matye +Matyi +Matysiak +Matz +Matza +Matzek +Matzen +Matzinger +Matzke +Mau +Mauceli +Mauceri +Mauch +Mauck +Maud +Maudlin +Mauer +Mauffray +Mauger +Maugeri +Maughan +Maughn +Mauk +Maul +Maulden +Mauldin +Maulding +Maule +Mauleon +Maulin +Maull +Mauller +Maulsby +Maultasch +Maultsby +Maun +Maune +Mauney +Maung +Maupin +Maupins +Maupredi +Maura +Mauracher +Maurais +Mauras +Maurer +Maurey +Maurice +Mauricio +Mauriello +Maurin +Mauritz +Maurizio +Mauro +Maurus +Maury +Maus +Mausbach +Mauser +Mauseth +Mausey +Maushardt +Mauson +Mauss +Mausser +Maust +Maute +Mauter +Mautino +Mautner +Mautone +Mautte +Mautz +Mauzey +Mauzy +Mavai +Maver +Maves +Mavins +Mavis +Mavity +Mavle +Mavraganis +Mavris +Mavro +Mavromatis +Mavropoulos +Maw +Mawhinney +Mawhorter +Mawk +Mawson +Mawyer +Max +Maxam +Maxberry +Maxcy +Maxedon +Maxell +Maxey +Maxfield +Maxham +Maxi +Maxie +Maxim +Maximo +Maxin +Maxon +Maxson +Maxton +Maxwell +May +Maya +Mayala +Mayall +Mayans +Mayard +Maybee +Mayben +Mayberry +Maybin +Maybrier +Maybury +Maycock +Maycumber +Mayden +Maydew +Maye +Mayeaux +Mayeda +Mayen +Mayenschein +Mayer +Mayerle +Mayers +Mayes +Mayeshiba +Mayeski +Mayette +Mayeux +Mayfield +Mayhall +Mayhan +Mayher +Mayhew +Mayhood +Mayhorn +Mayhue +Mayhugh +Mayland +Mayle +Maylone +Maymi +Maymon +Maynard +Mayne +Mayner +Maynerich +Maynes +Maynez +Maynor +Mayo +Mayoka +Mayol +Mayon +Mayone +Mayor +Mayoral +Mayoras +Mayorca +Mayorga +Mayotte +Mayou +Mayr +Mayrant +Mayrose +Mays +Mayse +Mayshack +Mayson +Maysonet +Mayton +Maytorena +Maytubby +Mayville +Maywalt +Mayweather +Maywood +Mayze +Mayzes +Maza +Mazanec +Mazar +Mazariego +Mazariegos +Maze +Mazell +Mazella +Mazer +Mazey +Maziarz +Mazierski +Mazikowski +Mazin +Mazingo +Mazion +Mazique +Mazo +Mazon +Mazor +Mazowieski +Mazuc +Mazuera +Mazuo +Mazur +Mazurek +Mazurk +Mazurkiewicz +Mazurowski +Mazy +Mazyck +Mazza +Mazzacano +Mazzaferro +Mazzanti +Mazzara +Mazzarella +Mazzariello +Mazzarino +Mazzawi +Mazze +Mazzei +Mazzella +Mazzeo +Mazzera +Mazzetti +Mazzie +Mazzillo +Mazzini +Mazzo +Mazzocco +Mazzola +Mazzone +Mazzoni +Mazzotta +Mazzuca +Mazzucco +Mazzurco +Mbamalu +Mbonu +Mc +Mcabee +Mcabier +Mcaboy +Mcadam +Mcadams +Mcadoo +Mcadory +Mcafee +Mcaferty +Mcaffee +Mcalarney +Mcalary +Mcaleer +Mcaleese +Mcalevy +Mcalexander +Mcalhaney +Mcalister +Mcall +Mcallen +Mcallister +Mcalmond +Mcaloon +Mcalphin +Mcalpin +Mcalpine +Mcalvain +Mcamis +Mcanallen +Mcanally +Mcanany +Mcanaw +Mcandrew +Mcandrews +Mcanelly +Mcaneny +Mcaninch +Mcannally +Mcanulty +Mcardell +Mcardle +Mcaree +Mcarthun +Mcarthur +Mcarthy +Mcartor +Mcaskill +Mcatee +Mcateer +Mcaulay +Mcauley +Mcauliffe +Mcauly +Mcausland +Mcaveney +Mcavoy +Mcbain +Mcbane +Mcbath +Mcbay +Mcbean +Mcbeath +Mcbee +Mcbeth +Mcbrady +Mcbratney +Mcbrayer +Mcbrearty +Mcbreen +Mcbride +Mcbrien +Mcbroom +Mcbroome +Mcbrown +Mcbryar +Mcbryde +Mcburnett +Mcburney +Mcburnie +Mcburrough +Mcburrows +Mccaa +Mccabe +Mccadams +Mccadden +Mccaddon +Mccade +Mccafferty +Mccaffery +Mccaffity +Mccaffree +Mccaffrey +Mccage +Mccaghren +Mccague +Mccahan +Mccahill +Mccaie +Mccaig +Mccain +Mccaine +Mccalanahan +Mccaleb +Mccalebb +Mccalister +Mccall +Mccalla +Mccallen +Mccalley +Mccallie +Mccallion +Mccallister +Mccallon +Mccallough +Mccallum +Mccallun +Mccally +Mccalman +Mccalment +Mccalmont +Mccalop +Mccalpane +Mccalpin +Mccalvin +Mccaman +Mccamant +Mccambridge +Mccament +Mccamey +Mccamish +Mccammack +Mccammon +Mccampbell +Mccamy +Mccan +Mccance +Mccandles +Mccandless +Mccandlish +Mccandliss +Mccandrew +Mccane +Mccanless +Mccann +Mccanna +Mccannon +Mccanse +Mccant +Mccants +Mccard +Mccardell +Mccardle +Mccarey +Mccargar +Mccargo +Mccarl +Mccarley +Mccarn +Mccarney +Mccarns +Mccarr +Mccarraher +Mccarrel +Mccarrell +Mccarren +Mccarrick +Mccarrol +Mccarroll +Mccarron +Mccarry +Mccarson +Mccart +Mccartan +Mccarte +Mccarter +Mccartha +Mccarther +Mccarthey +Mccarthy +Mccartin +Mccartney +Mccartt +Mccarty +Mccarver +Mccarvill +Mccarville +Mccarvy +Mccary +Mccash +Mccaskell +Mccaskey +Mccaskill +Mccaskin +Mccasland +Mccaslin +Mccaster +Mccastle +Mccathern +Mccathran +Mccatty +Mccaughan +Mccaughey +Mccaul +Mccauley +Mccaulley +Mccausland +Mccaw +Mccawley +Mccay +Mccelland +Mcchain +Mcchesney +Mcchristian +Mcchristion +Mcchriston +Mccier +Mcclafferty +Mcclaflin +Mcclaim +Mcclain +Mcclaine +Mcclair +Mcclallen +Mcclam +Mcclamma +Mcclammy +Mcclamroch +Mcclamy +Mcclanahan +Mcclanan +Mcclane +Mcclaney +Mcclaran +Mcclard +Mcclaren +Mcclarin +Mcclarnon +Mcclarty +Mcclary +Mcclaskey +Mcclatcher +Mcclatchey +Mcclaugherty +Mcclaughry +Mcclave +Mcclay +Mccleaf +Mcclean +Mcclearen +Mccleary +Mccleave +Mcclee +Mccleer +Mccleery +Mcclees +Mccleese +Mcclellan +Mcclelland +Mcclellon +Mcclement +Mcclenaghan +Mcclenahan +Mcclendon +Mcclenic +Mcclennan +Mcclenningham +Mcclennon +Mcclenny +Mcclenon +Mcclenton +Mcclenty +Mccleod +Mcclerkin +Mccleskey +Mcclester +Mccleve +Mccleveland +Mcclimans +Mcclimens +Mcclimon +Mccline +Mcclinsey +Mcclintic +Mcclintick +Mcclintock +Mcclinton +Mcclish +Mcclod +Mcclodden +Mccloe +Mcclory +Mccloskey +Mcclosky +Mccloud +Mccloude +Mccloudy +Mccloughan +Mcclour +Mccloy +Mcclucas +Mccluer +Mcclune +Mccluney +Mcclung +Mcclure +Mcclurg +Mcclurkan +Mcclurken +Mcclurkin +Mccluskey +Mcclusky +Mcclymonds +Mccoach +Mccoard +Mccoggle +Mccoid +Mccoil +Mccoin +Mccole +Mccolgan +Mccoll +Mccollam +Mccollester +Mccolley +Mccollin +Mccollins +Mccollister +Mccolloch +Mccollom +Mccollough +Mccollum +Mccolm +Mccolpin +Mccomack +Mccomas +Mccomb +Mccomber +Mccombie +Mccombs +Mccomis +Mccomish +Mccommon +Mccommons +Mccomsey +Mcconaghy +Mcconahay +Mcconahy +Mcconathy +Mcconaughy +Mcconchie +Mcconico +Mcconkey +Mcconn +Mcconnal +Mcconnaughey +Mcconnaughhay +Mcconnaughy +Mcconnel +Mcconnell +Mcconney +Mcconnico +Mcconomy +Mcconville +Mccoo +Mccooey +Mccook +Mccool +Mccoon +Mccoppin +Mccord +Mccorey +Mccorison +Mccorkell +Mccorkindale +Mccorkle +Mccormack +Mccormic +Mccormick +Mccormik +Mccornack +Mccorrison +Mccorry +Mccort +Mccorvey +Mccory +Mccosh +Mccosker +Mccoskey +Mccotter +Mccoubrey +Mccoulskey +Mccoun +Mccourt +Mccourtney +Mccovery +Mccowan +Mccowen +Mccowin +Mccown +Mccoy +Mccoyle +Mccra +Mccrabb +Mccracken +Mccracker +Mccrackin +Mccrady +Mccrae +Mccraig +Mccraight +Mccrain +Mccraken +Mccrane +Mccraney +Mccranie +Mccrary +Mccrate +Mccraven +Mccravy +Mccraw +Mccray +Mccrea +Mccreadie +Mccready +Mccreary +Mccredie +Mccree +Mccreedy +Mccreery +Mccreight +Mccreless +Mccright +Mccrimmon +Mccrimon +Mccrobie +Mccrohan +Mccrone +Mccrorey +Mccrory +Mccroskey +Mccrosky +Mccrossen +Mccrossin +Mccroy +Mccrudden +Mccrum +Mccrumb +Mccrystal +Mccuaig +Mccuan +Mccubbin +Mccubbins +Mccubrey +Mccue +Mccuen +Mccuien +Mccuin +Mccuistion +Mccuiston +Mcculla +Mccullagh +Mccullah +Mccullan +Mccullar +Mccullars +Mccullen +Mcculler +Mccullers +Mcculley +Mccullick +Mccullin +Mcculloch +Mccullock +Mccullogh +Mcculloh +Mccullom +Mccullon +Mccullors +Mccullough +Mccullum +Mccully +Mcculough +Mccumbee +Mccumber +Mccumbers +Mccumiskey +Mccune +Mccunn +Mccurdy +Mccure +Mccurine +Mccurley +Mccurren +Mccurry +Mccurtain +Mccurtis +Mccurty +Mccusker +Mccutchan +Mccutchen +Mccutcheon +Mcdade +Mcdaid +Mcdale +Mcdanel +Mcdaneld +Mcdanial +Mcdaniel +Mcdaniels +Mcdannald +Mcdannell +Mcdannold +Mcdargh +Mcdaries +Mcdaris +Mcdavid +Mcdavis +Mcdavitt +Mcday +Mcdearman +Mcdearmon +Mcdearmont +Mcdeavitt +Mcdermett +Mcdermid +Mcdermitt +Mcdermond +Mcdermott +Mcdevitt +Mcdewitt +Mcdiarmid +Mcdilda +Mcdill +Mcdivitt +Mcdoe +Mcdole +Mcdonagh +Mcdonal +Mcdonald +Mcdonalds +Mcdonel +Mcdonell +Mcdoniel +Mcdonnall +Mcdonnel +Mcdonnell +Mcdonough +Mcdorman +Mcdougal +Mcdougald +Mcdougall +Mcdougle +Mcdoulett +Mcdow +Mcdowall +Mcdowell +Mcduff +Mcduffee +Mcduffey +Mcduffie +Mcduffy +Mcdugle +Mcdunn +Mceachern +Mceachin +Mceachran +Mceachron +Mceaddy +Mceady +Mceathron +Mceirath +Mcelderry +Mceldowney +Mcelduff +Mcelfresh +Mcelhaney +Mcelhannon +Mcelhany +Mcelhattan +Mcelhenney +Mcelheny +Mcelhiney +Mcelhinney +Mcelhinny +Mcelhone +Mcelligott +Mcelmarry +Mcelmeel +Mcelmurry +Mcelmury +Mcelpraug +Mcelrath +Mcelravy +Mcelreath +Mcelreavy +Mcelroy +Mcelvain +Mcelvaine +Mcelvany +Mcelveen +Mcelvy +Mcelwain +Mcelwaine +Mcelwee +Mcelwine +Mcelyea +Mcenaney +Mcenany +Mcendarfer +Mceneny +Mcenery +Mceniry +Mcennis +Mcenroe +Mcentee +Mcentegart +Mcentire +Mcentyre +Mcerlean +Mceuen +Mcever +Mcevers +Mcevoy +Mcewan +Mcewen +Mcewin +Mcfadden +Mcfaddin +Mcfadin +Mcfadyen +Mcfall +Mcfalls +Mcfan +Mcfann +Mcfarlain +Mcfarlan +Mcfarland +Mcfarlane +Mcfarlen +Mcfarlin +Mcfarling +Mcfarren +Mcfate +Mcfatridge +Mcfatten +Mcfatter +Mcfaul +Mcfee +Mcfeeley +Mcfeely +Mcfeeters +Mcferran +Mcferren +Mcferrin +Mcferron +Mcfetridge +Mcfield +Mcfolley +Mcgaffee +Mcgafferty +Mcgaffey +Mcgaha +Mcgahan +Mcgahee +Mcgahen +Mcgahey +Mcgalliard +Mcgann +Mcgannon +Mcgarey +Mcgarity +Mcgarr +Mcgarrah +Mcgarraugh +Mcgarrell +Mcgarrigle +Mcgarrity +Mcgarry +Mcgartland +Mcgarvey +Mcgarvie +Mcgary +Mcgath +Mcgathy +Mcgaugh +Mcgaughan +Mcgaughey +Mcgaughy +Mcgauley +Mcgavin +Mcgavisk +Mcgavock +Mcgaw +Mcgeachy +Mcgeady +Mcgeary +Mcgee +Mcgeehan +Mcgeeney +Mcgeever +Mcgehee +Mcgeorge +Mcgeough +Mcgettigan +Mcghan +Mcghaney +Mcghay +Mcghee +Mcghehey +Mcghie +Mcghin +Mcghinnis +Mcgibbon +Mcgibboney +Mcgibney +Mcgiboney +Mcgilberry +Mcgill +Mcgillen +Mcgillicuddy +Mcgillis +Mcgillivray +Mcgilton +Mcgilvery +Mcgilvray +Mcginister +Mcginity +Mcginley +Mcginn +Mcginnes +Mcginness +Mcginnis +Mcginnity +Mcginty +Mcgirr +Mcgirt +Mcgivern +Mcgiveron +Mcgivney +Mcglade +Mcglamery +Mcglasson +Mcglathery +Mcglauflin +Mcglaughlin +Mcglaun +Mcglawn +Mcglew +Mcglinchey +Mcglinn +Mcglocklin +Mcglockton +Mcglohon +Mcgloin +Mcglon +Mcglone +Mcglory +Mcgloster +Mcglothen +Mcglothern +Mcglothian +Mcglothin +Mcglothlen +Mcglothlin +Mcglown +Mcglumphy +Mcglynn +Mcgoey +Mcgoff +Mcgohan +Mcgoldrick +Mcgonagle +Mcgonigal +Mcgonigle +Mcgonnell +Mcgoogan +Mcgoon +Mcgorry +Mcgory +Mcgougan +Mcgough +Mcgovern +Mcgowan +Mcgowen +Mcgowin +Mcgown +Mcgrade +Mcgrady +Mcgraff +Mcgrail +Mcgrain +Mcgranahan +Mcgrane +Mcgrann +Mcgranor +Mcgrant +Mcgraph +Mcgrapth +Mcgrath +Mcgraw +Mcgray +Mcgready +Mcgreal +Mcgreen +Mcgreevy +Mcgregor +Mcgregory +Mcgrevey +Mcgrew +Mcgriff +Mcgroarty +Mcgrogan +Mcgrone +Mcgrory +Mcgrotha +Mcgrotty +Mcgruder +Mcgrue +Mcguckin +Mcgue +Mcguff +Mcguffee +Mcguffey +Mcguffie +Mcguffin +Mcgugin +Mcguigan +Mcguin +Mcguiness +Mcguinn +Mcguinnes +Mcguinness +Mcguire +Mcguirk +Mcguirl +Mcguirt +Mcgunagle +Mcgunnigle +Mcgunnis +Mcgurie +Mcgurk +Mcgurl +Mcgurn +Mcgurr +Mcgurren +Mcguyer +Mcgwier +Mcgwin +Mchaffie +Mchale +Mchalffey +Mchan +Mchaney +Mchardy +Mchargue +Mchattie +Mchendry +Mchenry +Mchone +Mchorse +Mchugh +Mchughes +Mcie +Mciff +Mcilhinney +Mcillwain +Mcilrath +Mcilroy +Mciltrot +Mcilvain +Mcilvaine +Mcilvenny +Mcilwain +Mcilwaine +Mcilwraith +Mcinally +Mcindoe +Mcinerney +Mcinerny +Mcinnes +Mcinnis +Mcinnish +Mcinroy +Mcintee +Mcintire +Mcintosh +Mcintrye +Mcinture +Mcinturf +Mcinturff +Mcintyde +Mcintyre +Mcinvale +Mcirvin +Mcisaac +Mciver +Mcivor +Mciwraith +Mcjunkin +Mcjunkins +Mckague +Mckahan +Mckaig +Mckain +Mckale +Mckamey +Mckamie +Mckane +Mckanic +Mckaskle +Mckasson +Mckaughan +Mckay +Mckeag +Mckeague +Mckean +Mckeand +Mckeane +Mckearin +Mckearney +Mckechnie +Mckee +Mckeegan +Mckeehan +Mckeel +Mckeeman +Mckeen +Mckeever +Mckeighan +Mckeirnan +Mckeithan +Mckeithen +Mckell +Mckellan +Mckellar +Mckeller +Mckellip +Mckellips +Mckellop +Mckelphin +Mckelvey +Mckelvie +Mckelvin +Mckelvy +Mckemie +Mcken +Mckendall +Mckendree +Mckendrick +Mckendry +Mckenize +Mckenley +Mckenna +Mckennan +Mckenney +Mckennie +Mckennon +Mckenny +Mckennzie +Mckenrick +Mckensie +Mckentie +Mckenty +Mckenzie +Mckenzy +Mckeon +Mckeone +Mckeown +Mckercher +Mckerchie +Mckerley +Mckerlie +Mckern +Mckernan +Mckernin +Mckerrow +Mckesson +Mckethan +Mckever +Mckevitt +Mckew +Mckewen +Mckey +Mckibben +Mckibbens +Mckibbin +Mckibbon +Mckiddy +Mckie +Mckiernan +Mckillip +Mckillips +Mckillop +Mckim +Mckimley +Mckimmy +Mckin +Mckindra +Mckines +Mckiney +Mckinlay +Mckinley +Mckinna +Mckinnell +Mckinney +Mckinnie +Mckinnies +Mckinnis +Mckinnon +Mckinny +Mckinsey +Mckinstry +Mckinzey +Mckinzie +Mckinzy +Mckirgan +Mckirryher +Mckissack +Mckissic +Mckissick +Mckisson +Mckitrick +Mckittrick +Mckiver +Mcklveen +Mckneely +Mcknight +Mckoan +Mckone +Mckoon +Mckosky +Mckouen +Mckowen +Mckown +Mckoy +Mckray +Mckune +Mckusick +Mckusker +Mclachlan +Mclaen +Mclafferty +Mclagan +Mclain +Mclaine +Mclaird +Mclamb +Mclamore +Mclanahan +Mclane +Mclaney +Mclaren +Mclarney +Mclarty +Mclatchy +Mclauchlen +Mclauchlin +Mclaughin +Mclaughlan +Mclaughlin +Mclauglin +Mclauren +Mclaurin +Mclaurine +Mclavrin +Mclawhorn +Mclaws +Mclay +Mclead +Mclean +Mclear +Mclearan +Mcleary +Mclee +Mclees +Mcleese +Mcleish +Mcleland +Mclellan +Mclelland +Mclemore +Mclendon +Mclennan +Mclennon +Mcleod +Mcleon +Mcleoud +Mclernon +Mcleroy +Mclerran +Mcleskey +Mclester +Mclilly +Mclin +Mcloone +Mcloud +Mcloughlin +Mclouth +Mcloy +Mclucas +Mcluckie +Mcluen +Mclure +Mclyman +Mcmackin +Mcmahan +Mcmahen +Mcmahill +Mcmahon +Mcmain +Mcmains +Mcmaken +Mcmakin +Mcmanamon +Mcmanamy +Mcmanaway +Mcmanemy +Mcmanigal +Mcmanis +Mcmann +Mcmannus +Mcmanuis +Mcmanus +Mcmarlin +Mcmartin +Mcmaster +Mcmasters +Mcmath +Mcmeans +Mcmeekin +Mcmeel +Mcmeen +Mcmellen +Mcmenamin +Mcmenamy +Mcmenimen +Mcmenomy +Mcmichael +Mcmicheal +Mcmickell +Mcmickle +Mcmikle +Mcmillan +Mcmillen +Mcmilleon +Mcmiller +Mcmilliam +Mcmillian +Mcmillin +Mcmillion +Mcmillon +Mcmina +Mcmindes +Mcminn +Mcmonagle +Mcmonigle +Mcmorran +Mcmorries +Mcmorris +Mcmorrow +Mcmulen +Mcmullan +Mcmullen +Mcmullin +Mcmullins +Mcmunn +Mcmurdie +Mcmurdo +Mcmurphy +Mcmurray +Mcmurrey +Mcmurrin +Mcmurry +Mcmurtrey +Mcmurtrie +Mcmurtry +Mcmutry +Mcnab +Mcnabb +Mcnail +Mcnair +Mcnairy +Mcnally +Mcnamar +Mcnamara +Mcnamee +Mcnamer +Mcnaney +Mcnany +Mcnary +Mcnatt +Mcnaught +Mcnaughton +Mcnay +Mcnayr +Mcneal +Mcnealey +Mcnealy +Mcnear +Mcneary +Mcnease +Mcnee +Mcneece +Mcneel +Mcneeley +Mcneely +Mcneer +Mcnees +Mcneese +Mcneff +Mcneil +Mcneill +Mcneilly +Mcneish +Mcnelis +Mcnell +Mcnelley +Mcnellie +Mcnellis +Mcnelly +Mcnemar +Mcneme +Mcnerney +Mcnertney +Mcnespey +Mcnett +Mcnevin +Mcnew +Mcnichol +Mcnicholas +Mcnichols +Mcnickle +Mcnicol +Mcnicoll +Mcniel +Mcniell +Mcniff +Mcnight +Mcninch +Mcnish +Mcnitt +Mcnolty +Mcnorton +Mcnuh +Mcnulty +Mcnurlen +Mcnutt +Mcnutty +Mcomber +Mconnell +Mcowen +Mcoy +Mcpadden +Mcparland +Mcpartland +Mcpartlin +Mcpeak +Mcpeake +Mcpeck +Mcpeek +Mcpeters +Mcphail +Mcphan +Mcpharlane +Mcphatter +Mcphaul +Mcphearson +Mcphee +Mcpheeters +Mcpheron +Mcpherren +Mcpherson +Mcphetridge +Mcphie +Mcphillips +Mcpike +Mcquade +Mcquage +Mcquaid +Mcquaide +Mcquaig +Mcquain +Mcquarrie +Mcquary +Mcquay +Mcqueary +Mcqueen +Mcqueeney +Mcqueeny +Mcquerry +Mcquesten +Mcquiddy +Mcquigg +Mcquiggan +Mcquilkin +Mcquillan +Mcquillen +Mcquiller +Mcquilliams +Mcquinn +Mcquire +Mcquirk +Mcquirter +Mcquistion +Mcquiston +Mcquitty +Mcquown +Mcrae +Mcraney +Mcrary +Mcratt +Mcraven +Mcravin +Mcray +Mcrea +Mcreath +Mcredmond +Mcree +Mcrenolds +Mcreynolds +Mcright +Mcrill +Mcritchie +Mcrobbie +Mcroberts +Mcrorie +Mcroy +Mcroyal +Mcshan +Mcshane +Mcsharry +Mcshaw +Mcshea +Mcsherry +Mcsorley +Mcspadden +Mcsparin +Mcsparren +Mcspedon +Mcspirit +Mcstay +Mcswain +Mcsween +Mcsweeney +Mcsweeny +Mcswiggan +Mctaggart +Mctague +Mctarnaghan +Mctee +Mcteer +Mcthay +Mcthige +Mcthune +Mctier +Mctiernan +Mctighe +Mctigue +Mctush +Mcumber +Mcvaigh +Mcvay +Mcvea +Mcvean +Mcveigh +Mcvenes +Mcvey +Mcvicar +Mcvicker +Mcvinney +Mcvoy +Mcwade +Mcwain +Mcwalters +Mcward +Mcwaters +Mcwatters +Mcwayne +Mcweeney +Mcwells +Mcwethy +Mcwherter +Mcwhinney +Mcwhinnie +Mcwhirt +Mcwhirter +Mcwhite +Mcwhorter +Mcwilliam +Mcwilliams +Mcwilson +Mcwright +Mczeal +Me +Meabon +Meach +Meacham +Meachem +Meachen +Meachum +Mead +Meade +Meaden +Meader +Meaders +Meador +Meadors +Meadow +Meadowcroft +Meadows +Meads +Meadville +Meager +Meagher +Meahl +Meaker +Meakin +Mealer +Mealey +Mealing +Mealor +Meals +Mealy +Mean +Meaney +Meanor +Means +Meany +Meara +Meardon +Meares +Mearing +Mearns +Mears +Mearse +Meas +Mease +Measeck +Measheaw +Measom +Meason +Meath +Meaux +Meazell +Mebane +Mebus +Mecannic +Mecardo +Mecca +Meccia +Mech +Mecham +Mechanic +Meche +Mechem +Mechler +Mechling +Mecias +Meck +Meckel +Meckes +Meckler +Meckley +Meconi +Mecum +Meczywor +Medak +Medal +Medalion +Medanich +Medaries +Medas +Medawar +Medbery +Medcalf +Meddaugh +Medders +Meddock +Mede +Medearis +Medeiras +Medeiros +Medel +Medell +Medellin +Medema +Meder +Mederios +Medero +Mederos +Medez +Medford +Medhus +Medi +Media +Median +Mediano +Mediate +Medich +Medici +Medicine +Medick +Medico +Medicus +Medieros +Medill +Medin +Medina +Medine +Medinger +Medino +Medious +Meditz +Medland +Medlar +Medlen +Medler +Medley +Medlin +Medling +Medlock +Mednick +Mednis +Medoff +Medora +Medosch +Medovich +Medows +Medoza +Medrano +Medsker +Meduna +Medure +Medus +Medvec +Medved +Mee +Meece +Meech +Meecham +Meeder +Meeds +Meegan +Meehan +Meehl +Meehleder +Meek +Meeker +Meekins +Meeks +Meeler +Meemken +Meenach +Meenan +Meer +Meerdink +Meeroff +Meers +Mees +Meese +Meeske +Meester +Meeter +Meetze +Meeuwsen +Mefferd +Meffert +Mefford +Mega +Megahan +Megan +Megeath +Megee +Meger +Meggers +Meggerson +Meggett +Megginson +Meggison +Meggitt +Meggs +Megia +Megill +Meginnes +Meginnis +Megivern +Meglio +Megna +Mego +Megown +Megrabyan +Megraw +Mehaffey +Mehaffy +Mehalic +Mehalko +Mehall +Mehan +Meharg +Meharry +Mehdi +Mehdizadeh +Mehelich +Mehis +Mehl +Mehle +Mehler +Mehlhaff +Mehlig +Mehling +Mehlman +Mehner +Mehok +Meholick +Mehr +Mehrens +Mehrer +Mehrhoff +Mehring +Mehringer +Mehrotra +Mehrtens +Mehserle +Mehta +Mehtala +Mehtani +Mei +Meidinger +Meidl +Meidlinger +Meier +Meierhofer +Meierotto +Meiers +Meigel +Meiggs +Meighan +Meighen +Meigs +Meihofer +Meikle +Meil +Meile +Meiler +Meilleur +Mein +Meinberg +Meinders +Meinecke +Meineke +Meinel +Meinen +Meinerding +Meiners +Meinershagen +Meinert +Meinhard +Meinhardt +Meinhart +Meininger +Meinke +Meinsen +Meints +Meinzer +Meir +Meireles +Meirick +Meis +Meisch +Meise +Meisel +Meisels +Meisenburg +Meisenheimer +Meiser +Meisinger +Meisler +Meisner +Meiss +Meissner +Meiste +Meister +Meitner +Meitz +Meitzler +Meixelberger +Meixner +Meja +Mejia +Mejias +Mejorado +Mekee +Mekeel +Mekonis +Mekus +Melady +Melahn +Melamed +Melancon +Meland +Melander +Melandez +Melanson +Melara +Melaro +Melaun +Melber +Melberg +Melbert +Melbourne +Melby +Melbye +Melcer +Melcher +Melchert +Melchin +Melching +Melchior +Melchiori +Melchiorre +Melchor +Meldahl +Melder +Meldrum +Mele +Melear +Melecio +Meleen +Melen +Melena +Melencamp +Melendes +Melendez +Melendres +Melendrez +Melendy +Meleo +Meler +Melero +Meleski +Meley +Melfi +Melford +Melgaard +Melgar +Melgarejo +Melgoza +Melhorn +Meli +Melia +Melian +Melich +Melichar +Melick +Melikian +Melikyan +Melillo +Melin +Meline +Meling +Melino +Melis +Melish +Melito +Melius +Melkonian +Mell +Mella +Mellado +Mellady +Mellage +Melland +Mellard +Mellas +Mellberg +Melle +Mellecker +Mellekas +Mellema +Mellen +Mellencamp +Mellendorf +Mellenthin +Meller +Mellerson +Mellett +Melley +Mellgren +Mellick +Mellie +Melliere +Mellin +Melling +Mellinger +Mellis +Mellish +Mellison +Mello +Mellom +Mellon +Mellor +Mellors +Mellos +Mellott +Mellow +Melloy +Mells +Melman +Melnick +Melnik +Melnyk +Melo +Meloan +Meloche +Melochick +Melodia +Melody +Melone +Melonson +Melot +Melott +Meloy +Melquist +Melrose +Melroy +Melser +Melsheimer +Melso +Melson +Melstrom +Melter +Melton +Meltz +Meltzer +Meltzner +Melugin +Melusky +Meluso +Melve +Melville +Melvin +Melzer +Members +Membreno +Memmer +Memmo +Memmott +Memo +Memolo +Memory +Memos +Mems +Men +Mena +Menaker +Menapace +Menard +Menas +Menasco +Mencer +Mench +Menchaca +Menchavez +Menchen +Menches +Menchu +Mencia +Menck +Mencke +Mencl +Mency +Mend +Mende +Mendel +Mendell +Mendelowitz +Mendelsohn +Mendelson +Menden +Mendenhall +Mender +Mendes +Mendesa +Mendez +Mendia +Mendias +Mendiaz +Mendibles +Mendicino +Mendieta +Mendillo +Mendiola +Mendivel +Mendivil +Mendizabal +Mendler +Mendoca +Mendola +Mendolia +Mendonca +Mendonsa +Mendosa +Mendoza +Mendrala +Mendrin +Mends +Mendyk +Meneal +Menear +Menedez +Meneely +Menees +Menefee +Menefield +Meneley +Menendez +Menes +Meneses +Menesez +Menette +Meneus +Menez +Menezes +Meng +Mengarelli +Menge +Mengel +Menger +Menges +Menghini +Mengle +Mengsteab +Mengwasser +Menhennett +Menier +Menietto +Menifee +Menino +Menist +Menitz +Menjares +Menjes +Menjiva +Menjivar +Menk +Menke +Menken +Menkin +Menlove +Menn +Menna +Menne +Mennecke +Mennella +Mennen +Mennenga +Menner +Mennie +Mennig +Menning +Menninger +Meno +Menon +Menoni +Menor +Menotti +Menousek +Mensah +Mensalvas +Mensch +Mense +Mensen +Menser +Mensi +Mensick +Mensik +Mensing +Mensinger +Menso +Menson +Mente +Mentel +Menter +Mentgen +Mention +Mentis +Mentkowski +Mentnech +Mento +Menton +Mentz +Mentzel +Mentzer +Menucci +Menuey +Menz +Menze +Menzel +Menzella +Menzer +Menzie +Menzies +Meo +Meola +Mera +Merales +Merana +Merancio +Meranda +Merando +Merante +Meranto +Meras +Merati +Meray +Meraz +Merbaum +Mercadante +Mercado +Mercando +Mercante +Mercardo +Merced +Mercedes +Merceir +Mercer +Merchant +Merchen +Mercier +Mercik +Merck +Merckling +Mercure +Mercuri +Mercurio +Mercury +Mercy +Merdian +Meredith +Merel +Merenda +Merendino +Mereno +Meres +Merette +Merfeld +Merganthaler +Mergel +Mergen +Mergenthaler +Mergist +Merhar +Merica +Merical +Merickel +Mericle +Merida +Merideth +Meridieth +Meridith +Merila +Merilos +Merine +Mering +Meringolo +Merino +Merisier +Merithew +Meritt +Meriweather +Meriwether +Merk +Merkel +Merker +Merkerson +Merkey +Merkl +Merkle +Merklein +Merkley +Merklin +Merkling +Merkowitz +Merksamer +Merkt +Merkwan +Merl +Merlain +Merlan +Merle +Merles +Merlette +Merli +Merlin +Merling +Merlini +Merlino +Merlo +Merlos +Mermelstein +Mermis +Merna +Merner +Mernin +Mero +Merola +Merone +Meroney +Merow +Merrbach +Merrell +Merren +Merrett +Merriam +Merrick +Merrifield +Merrigan +Merrih +Merrihew +Merril +Merrill +Merrills +Merriman +Merring +Merrion +Merriott +Merrit +Merrithew +Merritt +Merritts +Merriweather +Merriwether +Merrow +Merry +Merryman +Merryweather +Mersch +Merschman +Merseal +Mersereau +Mershon +Mersinger +Mersman +Merson +Merta +Mertel +Merten +Mertens +Mertes +Merthie +Mertine +Mertins +Merton +Mertz +Mervin +Mervine +Mervis +Mervyn +Merwin +Mery +Meryman +Merz +Merzig +Merzlak +Mesa +Mesaros +Mesch +Mescher +Meschino +Meschke +Mesdaq +Mesecar +Mesecher +Mesenbring +Mesenbrink +Meserole +Meserve +Meservey +Meservy +Meshanko +Meshell +Meshew +Meshyock +Mesi +Mesia +Mesias +Mesich +Mesick +Mesidor +Mesina +Mesiona +Mesiti +Meske +Mesker +Meskill +Mesko +Mesler +Mesmer +Mesoloras +Mespelt +Mesplay +Mesquita +Mesrobian +Mess +Messa +Messamore +Messan +Messana +Messano +Messel +Messenger +Messer +Messerli +Messerly +Messerschmidt +Messersmith +Messervy +Messey +Messick +Messier +Messina +Messineo +Messing +Messinger +Messler +Messman +Messmer +Messmore +Messner +Messore +Mesta +Mestad +Mestanza +Mestas +Mestayer +Mestemacher +Mester +Mesteth +Mestler +Mestre +Mestrovich +Meszaros +Metallo +Metaxas +Metayer +Metcalf +Metcalfe +Metchikoff +Meteer +Metelko +Metellus +Metelus +Metenosky +Meter +Metevelis +Metevia +Metevier +Metge +Meth +Methe +Metheney +Metheny +Metherell +Methot +Methven +Methvin +Metia +Metier +Metil +Metivier +Metler +Metos +Metott +Metoxen +Metoyer +Metrick +Metro +Metroka +Metropoulos +Metsker +Metta +Mette +Mettee +Mettenburg +Metter +Metters +Mettert +Mettig +Mettille +Metting +Mettle +Mettlen +Mettler +Mettling +Metts +Metty +Metz +Metzel +Metzer +Metzga +Metzgar +Metzger +Metzinger +Metzker +Metzler +Metzner +Meua +Meucci +Meulemans +Meuler +Meuller +Meullion +Meunier +Meurer +Meurin +Meury +Meusa +Meuse +Meusel +Meuser +Mevers +Mevis +Mew +Mewborn +Mewbourn +Mewes +Mews +Mexicano +Mey +Meydid +Meyer +Meyerhoefer +Meyerhofer +Meyerhoff +Meyerhoffer +Meyering +Meyerman +Meyerott +Meyerowitz +Meyers +Meyerson +Meyette +Meylor +Meyn +Meynard +Meysembourg +Meza +Mezera +Mezey +Mezick +Mezo +Mezquita +Mezydlo +Mezza +Mezzanotte +Mezzatesta +Mezzenga +Mezzina +Mezzinni +Mguyen +Mhoon +Miah +Miano +Miao +Mias +Miazga +Micale +Micali +Micalizzi +Micallef +Micari +Micciche +Miccio +Micco +Micek +Miceli +Micha +Michael +Michaeli +Michaelis +Michaels +Michaelsen +Michaelson +Michal +Michalak +Michalczik +Michalec +Michalek +Michalenko +Michales +Michalicek +Michalik +Michalke +Michalowski +Michals +Michalski +Michand +Michard +Michaud +Michaux +Michavd +Micheal +Micheals +Michealson +Micheau +Michel +Michela +Michele +Michelena +Michelet +Micheletti +Michelfelder +Micheli +Michelin +Michelini +Michell +Michelle +Michelli +Michello +Michelman +Michelotti +Michels +Michelsen +Michelson +Michelstein +Michener +Michetti +Michie +Michieli +Michienzi +Michioka +Michitsch +Michl +Michlich +Michlin +Michna +Michniak +Michno +Michocki +Michon +Michonski +Mick +Mickel +Mickelberry +Mickell +Mickels +Mickelsen +Mickelson +Mickenheim +Mickens +Mickey +Mickiewicz +Mickle +Mickleberry +Mickler +Mickles +Mickley +Micklos +Mickolick +Mickonis +Micks +Mickulskis +Mickus +Miclette +Microni +Micthell +Micucci +Midcap +Middaugh +Midden +Middendorf +Middents +Middlebrook +Middlebrooks +Middlekauff +Middlemiss +Middlesworth +Middleton +Middough +Midget +Midgett +Midgette +Midgley +Midkiff +Midthun +Midura +Midy +Midyett +Miears +Mieczkowski +Miecznikowski +Miedema +Miehe +Mielcarek +Mielcarz +Mielczarek +Miele +Mieles +Mielke +Mielkie +Mielnicki +Mieloszyk +Mielsch +Miene +Mientka +Mier +Miera +Mieras +Mierau +Mierez +Miernicki +Miernik +Mierow +Miers +Mierzejewski +Mierzwa +Mierzwiak +Mierzwinski +Miesch +Miesen +Miesner +Miesse +Miessler +Miessner +Mieszala +Mieth +Mietus +Mifflin +Mifsud +Miga +Migdal +Miggins +Miggo +Mighty +Migl +Migliaccio +Migliore +Migliori +Migliorisi +Miglorie +Mignano +Migneault +Mignogna +Mignone +Mignot +Miguel +Migues +Miguez +Mihaila +Mihal +Mihalak +Mihalchik +Mihalco +Mihalek +Mihaliak +Mihalick +Mihalik +Mihalios +Mihalko +Mihalkovic +Mihaly +Mihara +Mihatsch +Mihelcic +Mihelic +Mihelich +Mihlfeld +Mihm +Mihok +Mihor +Mihovk +Mijangos +Mijares +Mika +Mikami +Mikasa +Mike +Mikel +Mikell +Mikels +Mikelsen +Mikelson +Miker +Mikes +Mikesell +Mikeska +Mikez +Mikhaiel +Mikhail +Mikita +Mikkelsen +Mikkelson +Mikko +Mikkola +Miklas +Mikler +Mikles +Miklitz +Miklos +Miko +Mikola +Mikolajczak +Mikolajczyk +Mikolon +Mikos +Mikota +Mikovec +Mikowski +Mikrot +Mikrut +Mikula +Mikulak +Mikulec +Mikulecky +Mikulich +Mikulski +Mikus +Mikuszewski +Mila +Milak +Milam +Milan +Miland +Milanes +Milanese +Milanesi +Milani +Milano +Milanowski +Milar +Milardo +Milare +Milas +Milazzo +Milbauer +Milberger +Milbert +Milbourn +Milbourne +Milbradt +Milbrandt +Milbrath +Milbrett +Milbrodt +Milburn +Milbury +Milby +Milch +Milcher +Mildenberger +Mildenhall +Mildenstein +Milder +Milderberger +Mildon +Mildred +Mildren +Mildrum +Mile +Mileham +Milek +Milelr +Miler +Milera +Miles +Mileski +Mileti +Milette +Milewski +Miley +Milfeld +Milford +Milfort +Milham +Milhoan +Milholland +Milhorn +Milhous +Milhouse +Milian +Milich +Milici +Milillo +Milin +Milinazzo +Milionis +Militano +Militante +Milite +Militello +Milito +Milius +Milke +Milkent +Milkey +Milkovich +Milkowski +Milks +Mill +Milla +Millage +Millam +Millan +Milland +Millar +Millard +Millare +Millay +Millberg +Millbern +Millbrand +Mille +Millea +Milledge +Millen +Millender +Millener +Miller +Millerbernd +Millerd +Millerr +Millers +Milles +Milleson +Millet +Millett +Millette +Milley +Millhiser +Millholland +Millhouse +Millian +Milliard +Millican +Millich +Millick +Millie +Millien +Millier +Milligan +Millikan +Milliken +Millikin +Millimaki +Milliman +Millin +Milliner +Milling +Millings +Millington +Millinor +Million +Milliren +Milliron +Millis +Millison +Millisor +Millman +Millner +Millon +Millonzi +Millora +Millot +Millott +Milloway +Milloy +Millraney +Mills +Millsap +Millsaps +Millson +Millspaugh +Millstead +Millstein +Millward +Millwee +Millwood +Milly +Milman +Milne +Milner +Milnes +Milnik +Milnor +Milo +Milon +Milonas +Milone +Milord +Milos +Milosch +Milosevic +Milosevich +Milot +Milota +Milovich +Milroy +Milsap +Milsaps +Milson +Milstead +Milstein +Milster +Milteer +Miltenberger +Miltner +Milton +Miltz +Milum +Milush +Milward +Milwee +Milz +Mimaki +Mimbs +Mimes +Mimis +Mimms +Mimnaugh +Mimozo +Mims +Min +Mina +Minaai +Minacci +Minahan +Minalga +Minar +Minarcik +Minarcin +Minard +Minardi +Minardo +Minari +Minarik +Minas +Minasian +Minassian +Minato +Minatra +Minaya +Mince +Mincer +Mincey +Minch +Minchella +Mincher +Minchew +Minchey +Minchow +Minckler +Mincks +Mincy +Mindell +Minden +Minder +Minderman +Mindingall +Mineah +Minear +Mineau +Minecci +Mineconzo +Minehan +Minehart +Minella +Minelli +Mineo +Miner +Minerd +Minerich +Minero +Miners +Minert +Minerva +Minervini +Minery +Mines +Minette +Minford +Ming +Minge +Mingee +Minger +Minges +Mingione +Mingioni +Mingle +Mingledorff +Mingo +Mingrone +Mings +Mingus +Minhas +Mini +Miniard +Minic +Minich +Minichiello +Minick +Minicozzi +Minicucci +Minier +Minifield +Minihan +Minihane +Mininger +Minion +Minish +Minissale +Minister +Miniuk +Minium +Minix +Minjares +Minjarez +Mink +Minkel +Minkin +Minkins +Minkler +Minkoff +Minkowitz +Minks +Minn +Minnaert +Minnatee +Minnehan +Minnema +Minner +Minnerly +Minneweather +Minney +Minnich +Minnick +Minnie +Minniear +Minniefield +Minnier +Minnifield +Minning +Minnis +Minniti +Minnix +Minns +Mino +Minock +Minogue +Minon +Minor +Minors +Minot +Minott +Minotti +Minozzi +Minrod +Mins +Minshall +Minshew +Minskey +Minson +Minster +Minteer +Minten +Minter +Mintey +Mintken +Minto +Minton +Mintor +Mintos +Mintreas +Minturn +Minty +Mintz +Mintzer +Minucci +Minugh +Minus +Minutillo +Minvielle +Minyard +Minzel +Minzenberger +Minzenmayer +Minzy +Mio +Mioduszewski +Miolen +Mione +Miosek +Miosky +Miotke +Miquel +Miquelon +Mir +Mira +Mirabal +Mirabella +Mirabelli +Mirabile +Mirabito +Miracle +Miraflores +Mirafuentes +Miraglia +Miralles +Miramon +Miramontes +Miramontez +Miran +Miranda +Mirando +Mirante +Mirao +Mirarchi +Miras +Miravalle +Mirbaha +Mirchandani +Mire +Mireles +Mirelez +Mires +Mirich +Mirick +Miricle +Miriello +Mirisola +Mirjah +Mirkovich +Mirles +Mirman +Mirmow +Miro +Miron +Mirr +Mirra +Mirsch +Mirsky +Mirto +Mirza +Mirzadeh +Mis +Misasi +Miscavage +Misch +Mischel +Mischke +Mischler +Mischnick +Mischo +Miscione +Miscoe +Miscovich +Misek +Misemer +Misener +Misenheimer +Misenhimer +Misenti +Miser +Misercola +Miserendino +Misfeldt +Mish +Mishar +Mishaw +Mishkin +Mishler +Mishoe +Mishou +Mishra +Mishulouin +Mishulovin +Misiak +Misiaszek +Misiewicz +Misik +Miska +Miske +Miskell +Miskelly +Miskiewicz +Miskin +Miskinis +Misko +Miskovich +Misluk +Mismit +Misner +Misnick +Misove +Misra +Misrahi +Miss +Missel +Missey +Missildine +Missler +Mister +Mistler +Mistretta +Mistrot +Mistry +Misty +Misumi +Misura +Misuraca +Mita +Mital +Mitani +Mitch +Mitcham +Mitchan +Mitchel +Mitchell +Mitchelle +Mitcheltree +Mitchem +Mitchen +Mitchener +Mitchiner +Mitchler +Mitchum +Mitchusson +Mith +Mithani +Mithcell +Mithell +Mitkowski +Mitman +Mitnick +Mitra +Mitrani +Mitri +Mitro +Mitsakos +Mitsch +Mitschelen +Mitschke +Mitsdarffer +Mitsuda +Mittag +Mittan +Mittchell +Mittelman +Mittelstadt +Mittelstaedt +Mittelsteadt +Mittelstedt +Mitten +Mittendorf +Mitter +Mittiga +Mittleman +Mittler +Mittlestadt +Mittman +Mitton +Mitts +Mitzel +Mitzner +Miu +Miura +Miville +Mivshek +Mix +Mixdorf +Mixer +Mixon +Mixson +Miya +Miyagawa +Miyagi +Miyagishima +Miyahara +Miyahira +Miyake +Miyamoto +Miyamura +Miyanaga +Miyao +Miyares +Miyasaka +Miyasaki +Miyasato +Miyashiro +Miyashita +Miyata +Miyataki +Miyazaki +Miyose +Miyoshi +Mize +Mizee +Mizell +Mizelle +Mizenko +Mizer +Mizia +Mizner +Mizrahi +Mizukami +Mizuno +Mizutani +Mizwicki +Mizzell +Mizzelle +Mizzi +Mleczko +Mleczynski +Mlenar +Mlinar +Mlodzianowski +Mlynek +Mo +Moad +Moag +Moak +Moake +Moala +Moallankamp +Moan +Moat +Moates +Moats +Moatz +Moayyad +Mobbs +Moberg +Moberley +Moberly +Mobilia +Mobilio +Mobley +Mobus +Moc +Mocarski +Moccasin +Moccia +Moccio +Mocco +Moceri +Moch +Mocha +Mochel +Mocher +Mochizuki +Mock +Mockbee +Mockler +Mockus +Moctezuma +Moczo +Moczulski +Moczygemba +Modafferi +Moddejonge +Mode +Model +Modena +Moder +Modero +Moderski +Modert +Modesitt +Modest +Modeste +Modesto +Modglin +Modgling +Modha +Modi +Modic +Modica +Modin +Modine +Modique +Modisett +Modisette +Modlin +Modrak +Modugno +Mody +Modzeleski +Modzelewski +Moe +Moeck +Moeckel +Moede +Moeder +Moehle +Moehlman +Moehn +Moehr +Moehring +Moehrle +Moel +Moeller +Moellers +Moellman +Moelter +Moen +Moench +Moening +Moenius +Moerbe +Moerke +Moerman +Moers +Moes +Moesch +Moeser +Moessner +Moeuy +Moevao +Moffa +Moffat +Moffatt +Moffet +Moffett +Moffit +Moffitt +Mofford +Mofield +Mofle +Moga +Mogan +Mogannam +Mogavero +Mogel +Mogensen +Moger +Mogg +Moghadam +Mogle +Moglia +Mogollon +Mogren +Mogro +Mogus +Mogush +Moh +Mohabeer +Mohabir +Mohair +Mohamad +Mohamed +Mohammad +Mohammed +Mohan +Mohar +Mohaupt +Mohd +Mohead +Moher +Mohinani +Mohl +Mohler +Mohlke +Mohmand +Mohmed +Mohn +Mohney +Mohomed +Mohorovich +Mohr +Mohrbacher +Mohre +Mohring +Mohrlock +Mohrman +Mohrmann +Mohs +Mohseni +Mohsin +Moilanen +Moilien +Moine +Moir +Moisa +Moisan +Moisant +Moise +Moises +Moisey +Moistner +Moitoso +Moitoza +Mojardin +Mojarro +Mojica +Mojzisik +Mok +Mokbel +Mokiao +Mokler +Mokriski +Mokry +Mola +Molacek +Molaison +Moland +Molander +Molands +Molano +Molash +Molavi +Molchan +Moldan +Molden +Moldenhauer +Molder +Moldonado +Moldovan +Moldrem +Mole +Molek +Molen +Molenda +Moler +Moles +Moleski +Molesworth +Molett +Molette +Molfetta +Molgard +Molima +Molin +Molina +Molinar +Molinari +Molinaro +Molinary +Molinas +Moline +Molineaux +Molinelli +Molinere +Moling +Molinini +Molino +Molinski +Moliterno +Molitor +Molitoris +Moll +Molla +Mollberg +Molle +Molleda +Molleker +Mollema +Mollenhauer +Mollenkopf +Moller +Mollere +Molles +Mollet +Mollett +Mollette +Molleur +Mollica +Mollicone +Molliere +Mollins +Mollison +Mollo +Mollohan +Molloy +Mollura +Molly +Molnar +Molnau +Molner +Molock +Molon +Molone +Moloney +Molony +Molpus +Molsan +Molski +Molstad +Molt +Molter +Molton +Moltrie +Moltz +Molyneaux +Molyneux +Molz +Molzahn +Mom +Moma +Moman +Momaya +Momeni +Moment +Momin +Mominee +Momon +Momper +Momphard +Momplaisir +Mompoint +Momsen +Mon +Mona +Monachino +Monaco +Monagan +Monagas +Monaghan +Monagle +Monaham +Monahan +Monaldi +Monarca +Monarch +Monard +Monares +Monarez +Monarque +Monarrez +Monas +Monasterio +Monat +Monath +Moncada +Moncayo +Monce +Monceaux +Moncher +Moncier +Moncion +Moncivais +Monckton +Monclova +Moncrief +Moncrieff +Moncrieffe +Moncur +Moncure +Moncus +Monda +Mondaine +Mondale +Monday +Mondejar +Mondell +Mondella +Mondelli +Mondello +Monden +Mondesir +Mondier +Mondino +Mondloch +Mondo +Mondok +Mondone +Mondor +Mondoux +Mondoza +Mondragon +Mondry +Monds +Mondt +Mondy +Mone +Moneaux +Monegro +Monell +Mones +Monestime +Monestine +Monet +Monette +Monetti +Money +Moneyhun +Moneymaker +Moneypenny +Monfils +Monford +Monfore +Monfort +Monforte +Mong +Mongan +Mongar +Monge +Mongeau +Mongelli +Mongeon +Monger +Monges +Mongiello +Mongillo +Mongiovi +Mongold +Mongolo +Mongomery +Mongon +Mongrain +Mongue +Monholland +Monhollen +Moniak +Monica +Monico +Monie +Monier +Monigold +Monington +Monios +Moniot +Moniz +Monjaras +Monje +Monjure +Monk +Monka +Monkhouse +Monkowski +Monks +Monn +Monnerjahn +Monnet +Monnett +Monnier +Monnin +Monninger +Monnot +Monohan +Monopoli +Monot +Monoz +Monreal +Monro +Monroe +Monroig +Monrow +Monroy +Monrreal +Monrroy +Mons +Monsalve +Monsanto +Monsay +Monsees +Monsegur +Monsen +Monserrat +Monserrate +Monsivais +Monske +Monsky +Monsma +Monson +Monsour +Monsrud +Mont +Montag +Montagna +Montagne +Montague +Montaivo +Montalban +Montalbano +Montalbo +Montalgo +Montalto +Montaluo +Montalvan +Montalvo +Montan +Montana +Montanari +Montanaro +Montandon +Montane +Montanez +Montano +Montante +Montanye +Montaque +Montas +Montavon +Montaya +Montayes +Montazami +Montbriand +Montcalm +Monte +Monteagudo +Montealegre +Montecalvo +Montecillo +Montee +Monteforte +Montefusco +Montegut +Monteiro +Monteith +Montejano +Montejo +Monteleone +Montell +Montella +Montellano +Montelle +Montello +Montelongo +Montemarano +Montemayor +Montembeau +Montemurro +Montenegro +Monter +Montera +Monterio +Montero +Monteros +Monterrano +Monterrosa +Monterroso +Monterroza +Monterrubio +Montes +Montesa +Montesano +Montesdeoca +Montesi +Montesino +Montesinos +Monteverde +Montey +Montez +Montezuma +Montford +Montfort +Montgomery +Montgonery +Monti +Monticello +Montie +Montiel +Montier +Montiero +Montierth +Montieth +Montijano +Montijo +Montilla +Montis +Montjoy +Montminy +Montney +Montogomery +Monton +Montondo +Montone +Montoney +Montonez +Montono +Montooth +Montore +Montori +Montoro +Montoto +Montour +Montoure +Montoya +Montpas +Montpetit +Montrella +Montreuil +Montrose +Montross +Montroy +Monts +Montufar +Montuori +Montuoro +Montville +Monty +Montz +Monville +Monz +Monzingo +Monzo +Monzon +Mooberry +Moochler +Moock +Mood +Moodie +Moodispaugh +Moody +Mooe +Mooers +Moog +Mook +Moomaw +Moomey +Moon +Moone +Moonen +Mooney +Mooneyham +Mooneyhan +Moons +Moonshower +Moonsommy +Moor +Mooradian +Moorcroft +Moore +Moorefield +Moorehead +Moorehouse +Mooreland +Moorer +Moores +Moorhead +Moorhouse +Mooring +Moorman +Moors +Moos +Moosa +Moosbrugger +Moose +Mooser +Moosman +Moote +Moothart +Mootispaw +Mootry +Moots +Mooty +Mootz +Moppin +Moquin +Mor +Mora +Morabito +Morace +Morad +Morada +Moradel +Moradian +Morado +Moraga +Morago +Morain +Morais +Moraites +Moraitis +Morak +Moralas +Morale +Morales +Moralez +Moralis +Moran +Morand +Moranda +Morandi +Morando +Morang +Morano +Morant +Morante +Moranville +Morar +Morario +Morarity +Moras +Morasca +Morasch +Morasco +Morataya +Morath +Moratto +Moravec +Moravek +Moravick +Morawa +Morawski +Morber +Morch +Morck +Morcos +Morda +Mordan +Mordarski +Mordaunt +Mordecai +Mordeci +Mordehay +Morden +Mordhorst +Mordini +Mordino +Mordue +More +Morea +Moreau +Moreb +Moreci +Moredock +Moree +Morefield +Morehead +Morehouse +Moreida +Morein +Moreira +Morejon +Morel +Moreland +Morelen +Moreles +Morell +Morella +Morelle +Morelli +Morello +Morelock +Morelos +Morely +Moreman +Moren +Morena +Morence +Morenco +Morency +Moreno +Morentin +Morenz +Morera +Moreschi +Moresco +Moreshead +Moresi +Moret +Moreta +Moreton +Moretta +Moretti +Moretto +Moretz +Morey +Morfee +Morfin +Morford +Morga +Morgado +Morgan +Morgana +Morgandi +Morganfield +Morgano +Morgans +Morganson +Morgante +Morganti +Morgas +Morge +Morgen +Morgenroth +Morgensen +Morgenstein +Morgenstern +Morgenthaler +Morger +Morgia +Morgner +Morgon +Morgret +Morguson +Mori +Moriarity +Moriarty +Moribayed +Moricca +Morice +Morici +Moricle +Morie +Moriera +Morikawa +Morillo +Morimoto +Morin +Morine +Moring +Morini +Morino +Morinville +Morioka +Moris +Morise +Morisey +Morishita +Morishito +Morisky +Morison +Morisseau +Morissette +Morita +Moritz +Moriwaki +Mork +Morken +Morkert +Morkve +Morla +Morlan +Morland +Morlas +Morledge +Morles +Morley +Morlino +Morlock +Morman +Mormann +Mormile +Mormino +Mormon +Morn +Morna +Morneau +Morneault +Morning +Morningstar +Moro +Morocco +Morock +Moroles +Moron +Morones +Moroney +Moroni +Morono +Moronta +Moros +Morosco +Morosow +Morowski +Moroz +Morphew +Morphis +Morphy +Morquecho +Morr +Morra +Morral +Morrales +Morrall +Morre +Morreale +Morreau +Morrell +Morren +Morrero +Morrey +Morrical +Morrill +Morrin +Morring +Morris +Morrisette +Morrisey +Morrish +Morrison +Morrisroe +Morriss +Morrisseau +Morrissette +Morrissey +Morro +Morron +Morrone +Morrow +Morsbach +Morsberger +Morse +Morsell +Morsey +Morson +Morss +Mort +Morta +Mortel +Mortell +Mortellaro +Morten +Mortensen +Mortenson +Morter +Morthland +Mortier +Mortimer +Mortimore +Mortin +Mortinez +Mortis +Mortland +Morton +Morua +Morva +Morvant +Morvay +Morvillo +Morway +Mory +Moryl +Mosakowski +Mosbarger +Mosbey +Mosbrucker +Mosburg +Mosby +Mosca +Moscardelli +Moscariello +Moscaritolo +Moscato +Moschella +Moschetti +Moschetto +Moscicki +Mosco +Moscoffian +Moscone +Mosconi +Moscoso +Moscovic +Moscowitz +Moscrip +Mose +Mosebach +Moseby +Moseley +Moselle +Mosely +Moseman +Mosen +Mosena +Moser +Moses +Mosey +Mosgrove +Mosha +Mosher +Moshier +Mosho +Mosholder +Moshos +Mosier +Mosiman +Mosimann +Mosinski +Moskal +Moskau +Mosko +Moskop +Moskos +Moskovitz +Moskowitz +Moskwa +Mosler +Mosley +Mosman +Mosmeyer +Mosqueda +Mosquera +Moss +Mossa +Mossbarger +Mossberg +Mossel +Mosser +Mosseri +Mosses +Mossey +Mossien +Mossing +Mossman +Mosson +Mossor +Most +Mostad +Mostafavi +Mostella +Mosteller +Moster +Mostero +Mostert +Mostiller +Mostoller +Mostowy +Mostrom +Mosty +Mostyn +Mosure +Mosz +Mota +Motamed +Motamedi +Motayen +Motayne +Mote +Moten +Motes +Mothershead +Mothershed +Motil +Motl +Motley +Motola +Moton +Motonaga +Motsinger +Mott +Motta +Mottai +Motte +Motten +Motter +Mottern +Mottershead +Motteshard +Mottet +Mottillo +Mottinger +Mottley +Motto +Mottola +Motton +Mottram +Motts +Motyka +Motz +Motzer +Mou +Moua +Moudry +Moudy +Moul +Mould +Moulden +Moulder +Mouldin +Moulding +Moulds +Moulhem +Moulin +Moulinos +Moulthrop +Moulton +Moultrie +Moultry +Moun +Mounce +Mound +Mounger +Mounkes +Mounsey +Mount +Mountain +Mountcastle +Mountford +Mountjoy +Mounts +Moura +Mourad +Moure +Mourer +Mouret +Mourino +Mouritsen +Mourning +Moury +Mousa +Mouse +Mousel +Mouser +Mousley +Moussa +Mousseau +Mousser +Moussette +Moustafa +Mouton +Moutoux +Moutray +Mouw +Mouzas +Mouzon +Mova +Movius +Movlin +Mow +Mowan +Mowat +Mowatt +Mowbray +Mowder +Mowdy +Mowell +Mowen +Mower +Mowers +Mowery +Mowles +Mowrer +Mowrey +Mowris +Mowry +Moxey +Moxham +Moxley +Moxness +Moy +Moya +Moyd +Moye +Moyer +Moyerman +Moyers +Moyes +Moyet +Moylan +Moyle +Moyler +Moynahan +Moynihan +Moyse +Mozak +Mozdzierz +Mozee +Mozelak +Mozell +Mozena +Mozer +Mozga +Mozgala +Mozick +Mozie +Mozier +Mozingo +Mozley +Moznett +Mozo +Mozzone +Mracek +Mraw +Mraz +Mrazek +Mrazik +Mrkvicka +Mrnak +Mrochek +Mroczkowski +Mrotek +Mrotz +Mrowka +Mroz +Mrozek +Mrozinski +Mrozoski +Mruczek +Mruk +Mrvan +Mt +Mthimunye +Mu +Mucci +Muccia +Muccigrosso +Muccio +Mucciolo +Mucerino +Much +Mucha +Mucher +Muchler +Muchmore +Muchortow +Muchow +Muck +Muckel +Muckelroy +Muckelvaney +Muckenfuss +Muckenthaler +Muckerman +Muckey +Muckle +Muckleroy +Muckley +Mucklow +Muczynski +Mudd +Muddaththir +Muddiman +Mudge +Mudger +Mudget +Mudgett +Mudie +Mudra +Mudrick +Muecke +Muegge +Muehl +Muehlbach +Muehlberger +Muehleisen +Muehlman +Muell +Mueller +Muellerleile +Muellner +Muench +Muenchow +Muenkel +Muenzenberger +Mueske +Muessig +Muether +Muetzel +Muff +Muffett +Muffley +Muffoletto +Mugford +Mugg +Mugge +Muggeo +Muggley +Mugica +Mugleston +Mugnolo +Mugrage +Muha +Muhammad +Muhammed +Muhl +Muhlbach +Muhlbauer +Muhlenkamp +Muhlestein +Muhlhauser +Muhlstein +Muhn +Muhr +Muhs +Muhtaseb +Mui +Muilenburg +Muina +Muinos +Muir +Muirhead +Muise +Mujalli +Mujica +Mukai +Mukherjee +Mukhtar +Mula +Mulac +Mulanax +Mulaney +Mulato +Mulberry +Mulcahey +Mulcahy +Mulch +Mulchrone +Mulder +Mulderig +Mulders +Muldoon +Muldowney +Muldrew +Muldrow +Mule +Mulero +Mulford +Mulgrew +Mulhall +Mulhearn +Mulherin +Mulhern +Mulholland +Mulhollen +Mulich +Mulik +Mulinix +Mulkerin +Mulkern +Mulkey +Mulkhey +Mulkin +Mulkins +Mull +Mullahey +Mullahy +Mullally +Mullaly +Mullan +Mullane +Mullaney +Mullany +Mullarkey +Mullee +Mullen +Mullenaux +Mullenax +Mullenbach +Mullendore +Mullenix +Mullennex +Mullennix +Mullens +Muller +Mullet +Mullett +Mullican +Mullice +Mullick +Mulligan +Mullikin +Mullin +Mullinax +Mullineaux +Mulliner +Mullinex +Mulling +Mullings +Mulliniks +Mullinix +Mullins +Mullis +Mullison +Mullner +Mullowney +Mulloy +Mulneix +Mulnix +Mulqueen +Mulrain +Mulready +Mulrenin +Mulroney +Mulrooney +Mulroy +Mulry +Mulryan +Mulvahill +Mulvaney +Mulvehill +Mulverhill +Mulvey +Mulvihill +Mulville +Mulzer +Muma +Mumaugh +Mumaw +Mumbower +Mumby +Mumford +Mumm +Mumma +Mumme +Mummert +Mummey +Mumper +Mumpower +Mun +Muna +Munafo +Munar +Munari +Munaz +Munce +Muncey +Munch +Muncher +Munchmeyer +Muncie +Muncil +Muncrief +Muncy +Mund +Munda +Mundahl +Munday +Mundel +Mundell +Munden +Munder +Munderville +Mundhenk +Mundie +Mundine +Munding +Mundinger +Mundo +Mundorf +Mundschau +Mundschenk +Mundt +Mundwiller +Mundy +Mundz +Mundziak +Munerlyn +Munet +Muney +Munez +Munford +Munger +Mungia +Mungin +Mungle +Mungo +Munguia +Munhall +Muni +Munier +Muninger +Munion +Munir +Munis +Munise +Munivez +Muniz +Munk +Munkberg +Munks +Munl +Munley +Munlin +Munn +Munnell +Munnelly +Munnerlyn +Munning +Munnis +Munno +Munns +Muno +Munos +Munoz +Munro +Munroe +Muns +Munsch +Munsell +Munselle +Munsen +Munsey +Munshi +Munshower +Munsinger +Munson +Munster +Munsterman +Munstermann +Munt +Muntean +Munteanu +Munter +Muntz +Munuz +Munyer +Munyon +Munz +Munzell +Munzer +Muoio +Muphy +Mura +Murach +Muraco +Murad +Murai +Murak +Murakami +Murakawa +Muralles +Murallies +Muramoto +Muran +Muranaka +Murano +Murany +Muraoka +Muraro +Muraski +Murasso +Murat +Murata +Muratalla +Muratore +Murawski +Muray +Murayama +Murch +Murchie +Murchinson +Murchison +Murcia +Murcko +Murdaugh +Murden +Murders +Murdick +Murdoch +Murdock +Murdough +Murdy +Mure +Murel +Murelli +Murello +Muresan +Murff +Murfin +Murga +Murgia +Murguia +Muri +Murie +Muriel +Murilla +Murillo +Murin +Murley +Murnan +Murnane +Murnock +Muro +Muros +Murph +Murphey +Murphree +Murphrey +Murphy +Murr +Murra +Murrah +Murrain +Murray +Murrell +Murrey +Murri +Murrie +Murriel +Murrieta +Murrietta +Murril +Murrill +Murrillo +Murrin +Murrish +Murrock +Murrow +Murrufo +Murry +Mursch +Mursko +Murtagh +Murtaugh +Murtha +Murthy +Murton +Murty +Murwin +Murzycki +Murzyn +Murzynski +Musa +Musacchia +Musacchio +Musante +Musca +Muscara +Muscarella +Muscarello +Muscaro +Muscat +Muscatello +Muscato +Muscente +Musch +Muschamp +Muschaweck +Muschett +Muschick +Muschik +Musco +Muscolino +Muscott +Muse +Musel +Musemeche +Musetti +Musgrave +Musgraves +Musgrove +Musguire +Mushero +Mushett +Mushrush +Mushtaq +Musi +Musial +Music +Musich +Musick +Musielak +Musigdilok +Musil +Musilli +Musinski +Musitano +Muska +Muske +Muskelly +Muskett +Muskopf +Muskrat +Muskthel +Muskus +Muslim +Musni +Musolf +Musolino +Musquiz +Muss +Mussa +Musse +Mussel +Mussell +Musselman +Musselwhite +Mussen +Mussenden +Musser +Musshorn +Musslewhite +Mussman +Mussmann +Musso +Musson +Must +Mustache +Mustafa +Mustafaa +Mustain +Mustard +Mustaro +Muster +Mustian +Mustin +Musto +Mustoe +Muston +Musty +Musulin +Musumeci +Muszar +Muszynski +Muta +Mutana +Mutart +Mutch +Mutchler +Muterspaw +Muth +Muthana +Muthart +Muther +Mutherspaw +Muthig +Muthler +Mutner +Muto +Mutolo +Mutone +Mutschelknaus +Mutschler +Mutter +Mutters +Mutton +Mutty +Mutz +Muwwakkil +Muyres +Muysenberg +Muyskens +Muzacz +Muzii +Muzio +Muzquiz +Muzyka +Muzzarelli +Muzzey +Muzzillo +Muzzy +Mwakitwile +Mway +Myall +Myart +Myatt +Mycroft +Myer +Myers +Myerscough +Myerson +Myes +Myhand +Myhr +Myhre +Myint +Myking +Mykins +Myklebust +Mylar +Myler +Myles +Mylott +Mynatt +Mynear +Mynhier +Mynnerlyn +Myntti +Myott +Myra +Myracle +Myrck +Myre +Myree +Myren +Myres +Myrick +Myricks +Myrie +Myrlie +Myrman +Myron +Myrtle +Myrum +Mysak +Mysinger +Myslim +Myslin +Myslinski +Mysliwiec +Mytych +Myung +Na +Naab +Naas +Naasz +Nab +Nabarowsky +Nabarrete +Nabarro +Nabavian +Nabb +Naber +Nabers +Nabhan +Nabity +Nabor +Naborg +Nabors +Nabours +Nabozny +Nabritt +Nabzdyk +Nacar +Naccarato +Naccari +Nacci +Nace +Nachazel +Nachbar +Nachman +Nachmias +Nachor +Nachtrieb +Nacion +Nacisse +Nack +Nacke +Naclerio +Nacol +Nacy +Nadal +Naddeo +Nadeau +Nadel +Nadelbach +Nadell +Nadelson +Nader +Naderi +Naderman +Nadile +Nadine +Nading +Nadler +Nadoff +Nadolny +Nadolski +Naecker +Naef +Naegele +Naegeli +Naegle +Naeher +Naes +Naeve +Naff +Naffziger +Naftali +Naftel +Naftzger +Naftzinger +Nafziger +Nagai +Nagamine +Nagano +Nagao +Nagarajan +Nagasawa +Nagase +Nagata +Nagel +Nagele +Nagelhout +Nagelkirk +Nagelschmidt +Nagengast +Nageotte +Nager +Nagg +Nagindas +Nagle +Nagler +Nagode +Nagorski +Nagtalon +Naguin +Nagura +Nagy +Nahari +Nahas +Nahass +Nahhas +Nahl +Nahm +Nahmias +Nahrstedt +Nahrwold +Naidoo +Naidu +Naifeh +Naik +Nail +Nailer +Naill +Naillon +Nailor +Nails +Naiman +Naimoli +Nair +Nairn +Naish +Naito +Najar +Najarian +Najarro +Najera +Naji +Najjar +Nakaahiki +Nakada +Nakagawa +Nakahara +Nakai +Nakajima +Nakama +Nakamatsu +Nakamori +Nakamoto +Nakamura +Nakanishi +Nakano +Nakao +Nakaoka +Nakashima +Nakasone +Nakata +Nakatsu +Nakayama +Nakhle +Naki +Nakken +Nakonechny +Nalbach +Nalbandian +Nalbone +Nalder +Nale +Nalepa +Nalepka +Nalevanko +Nall +Nalley +Nallie +Nalls +Nally +Nalty +Nam +Namaka +Naman +Namanny +Namanworth +Namauu +Namdar +Namer +Namey +Namihira +Namisnak +Namm +Nampel +Namsaly +Namur +Nan +Nanas +Nanasy +Nance +Nancy +Nanda +Nanes +Nanez +Nanfito +Nang +Nangle +Nani +Nania +Nanik +Nanka +Nanke +Nanna +Nannen +Nanney +Nanni +Nannie +Nannini +Nanny +Nansteel +Nantanapibul +Nanthanong +Nanton +Nantwi +Nantz +Nanz +Nao +Naomi +Naone +Nap +Napenas +Napier +Napierala +Napieralski +Napihaa +Naples +Napoleon +Napoles +Napoletano +Napoli +Napolitano +Napp +Napper +Nappi +Nappier +Nappo +Napps +Napue +Naputi +Naquin +Naqvi +Naragon +Narain +Naraine +Naramore +Naranjo +Narasimhan +Narayan +Narayanan +Narciso +Narcisse +Nard +Nardecchia +Nardella +Nardelli +Nardi +Nardini +Nardino +Nardo +Nardone +Nardozzi +Narducci +Nardy +Nares +Naret +Narez +Nargi +Narimatsu +Narine +Narkevicius +Narkier +Narlock +Naro +Naron +Narr +Narramore +Narro +Narron +Narrow +Naruaez +Narum +Narvaez +Narvaiz +Nary +Nasaire +Nasalroad +Nasby +Nasca +Naschke +Nascimento +Nase +Naselli +Naser +Nasers +Nases +Nash +Nashe +Nasif +Nasir +Naslund +Naso +Nason +Nasr +Nass +Nassar +Nassef +Nasser +Nasseri +Nassie +Nassif +Nassimi +Nasso +Nasson +Nassr +Nast +Nasta +Nastase +Nastasi +Nastasia +Nasti +Nastri +Nasuti +Nasworthy +Natal +Natale +Natalello +Natali +Natalia +Natalie +Natalizio +Natani +Natcher +Nate +Nater +Natera +Natewa +Nath +Nathan +Nathaniel +Nathans +Nathanson +Nathe +Natho +Nathoo +Nati +Natiello +Nation +Nations +Natividad +Natoli +Natonabah +Natsis +Natt +Natter +Nattiah +Nattress +Natvig +Natwick +Nau +Nauarro +Naud +Nauer +Naufzinger +Naugher +Naughton +Naugle +Naugler +Nault +Nauman +Naumann +Naumes +Naumoff +Nauss +Nauyen +Nava +Naval +Navalta +Navan +Navanjo +Navappo +Navar +Navarete +Navaretta +Navarette +Navarez +Navaro +Navarra +Navarrate +Navarre +Navarrete +Navarrette +Navarro +Navas +Nave +Navedo +Naveed +Naveja +Navejar +Navejas +Naves +Navia +Navin +Navo +Navone +Navor +Navorro +Navratil +Navy +Nawda +Nawfel +Nawn +Nawrocki +Nawwar +Nay +Nayar +Nayee +Nayes +Naylor +Nayman +Naysmith +Naz +Nazaire +Nazar +Nazareno +Nazari +Nazarian +Nazario +Nazaroff +Naze +Nazelrod +Nazir +Nazzal +Nazzaro +Nazzise +Ncneal +Neace +Nead +Neagle +Neahr +Neal +Neale +Nealeigh +Nealen +Nealer +Nealey +Nealious +Nealis +Neall +Nealley +Neally +Nealon +Nealy +Neang +Near +Nearing +Neary +Neas +Nease +Neason +Neat +Neathery +Neault +Neave +Neaves +Nebarez +Nebeker +Nebel +Nebergall +Nebesnik +Nebesny +Nebgen +Neblett +Neblock +Neborak +Nebred +Necaise +Necessary +Nech +Necochea +Ned +Nedbalek +Nedd +Neddenriep +Neddo +Nedeau +Nedelman +Nederostek +Nedina +Nedley +Nedman +Nedrow +Nedry +Nedved +Nee +Neeb +Neece +Needam +Needels +Needham +Needle +Needleman +Needler +Needles +Needs +Needy +Neef +Neehouse +Neel +Neeld +Neeley +Neelly +Neelon +Neely +Neemann +Neenan +Neeper +Neer +Neering +Nees +Neese +Neeser +Neesmith +Neeson +Neff +Nefzger +Negbenebor +Negley +Neglia +Neglio +Negrana +Negreta +Negrete +Negrette +Negri +Negrin +Negrisor +Negro +Negron +Negroni +Negus +Neher +Nehls +Nehlsen +Nehme +Nehmer +Nehring +Nehrt +Neibert +Neice +Neid +Neidecker +Neidenbach +Neider +Neiderhiser +Neidert +Neidhardt +Neidich +Neidig +Neidiger +Neidlinger +Neifer +Neifert +Neiffer +Neiford +Neigenfind +Neiger +Neigh +Neighbor +Neighbors +Neighbours +Neihart +Neihoff +Neikirk +Neil +Neilan +Neild +Neiling +Neill +Neilly +Neils +Neilsen +Neilson +Neiman +Neimeyer +Nein +Neiner +Neiper +Neira +Neis +Neisen +Neish +Neisius +Neisler +Neiss +Neiswander +Neiswender +Neiswoger +Neiswonger +Neita +Neither +Neithercutt +Neitz +Neitzel +Neitzke +Neives +Neizer +Neja +Nejaime +Nejman +Nekola +Nelder +Neldon +Nelisse +Nelke +Nell +Nellem +Nellenback +Neller +Nelles +Nelli +Nelligan +Nellis +Nellon +Nellum +Nellums +Nelmark +Nelmes +Nelms +Neloms +Nelon +Nelsen +Nelson +Nelton +Neman +Nemani +Nemard +Nembhard +Nemec +Nemecek +Nemer +Nemerofsky +Nemes +Nemet +Nemeth +Nemets +Nemetz +Nemith +Nemitz +Nemoede +Nemunaitis +Nemzek +Nemzin +Nenez +Nenni +Nenninger +Nenno +Neonakis +Nepa +Nephew +Nepomuceno +Neptune +Nerad +Nerbonne +Nerby +Neren +Nerenberg +Neri +Neria +Nerio +Neris +Nerlich +Nern +Nerney +Nero +Nerpio +Nerren +Nersesian +Nervis +Nery +Nesbeth +Nesbit +Nesbitt +Nesby +Nesheim +Neshem +Nesin +Neske +Nesland +Nesler +Nesline +Neslusan +Nesmith +Ness +Nessel +Nesselrodt +Nessen +Nesser +Nesset +Nesseth +Nesslein +Nessler +Nessmith +Nessner +Nesspor +Nest +Nestel +Nester +Nesti +Nestico +Nestingen +Nestle +Nestler +Nestor +Nesvig +Net +Neth +Nethercutt +Netherland +Netherton +Nethery +Nethken +Nethkin +Netkowicz +Netland +Netley +Neto +Netolicky +Netrosio +Nett +Nette +Netter +Netters +Netterville +Netti +Nettik +Nettle +Nettleingham +Nettles +Nettleton +Netto +Netz +Netzel +Netzer +Netzley +Neu +Neubacher +Neubauer +Neubaum +Neubecker +Neuberger +Neubert +Neubig +Neuburger +Neuby +Neudeck +Neuendorf +Neuenfeldt +Neuenschwande +Neuenswander +Neufeld +Neufer +Neufville +Neugebauer +Neugent +Neugin +Neuhart +Neuhaus +Neuhauser +Neuhoff +Neujahr +Neumaier +Neuman +Neumann +Neumayer +Neumeier +Neumeister +Neumeyer +Neumiller +Neun +Neundorfer +Neuner +Neurohr +Neusch +Neuschwander +Neuse +Neuser +Neuweg +Neuwirth +Neuzil +Nev +Nevala +Nevares +Nevarez +Nevarrez +Neve +Nevel +Nevels +Nevens +Never +Neverman +Nevers +Neverson +Neves +Neveu +Neveux +Nevil +Nevill +Neville +Nevilles +Nevills +Nevils +Nevin +Nevinger +Nevins +Nevis +Nevison +Nevitt +Nevius +Nevland +Nevue +Nevwirth +New +Newall +Newand +Newark +Newball +Newbauer +Newbell +Newberg +Newberger +Newbern +Newberry +Newbert +Newbery +Newbill +Newbold +Newborn +Newbound +Newbraugh +Newbrough +Newburg +Newburn +Newbury +Newby +Newcom +Newcomb +Newcombe +Newcome +Newcomer +Newell +Newenle +Newens +Newer +Newes +Newey +Newfield +Newgard +Newgent +Newhall +Newham +Newhard +Newhart +Newhook +Newhouse +Newill +Newingham +Newitt +Newkirk +Newlan +Newland +Newlin +Newlon +Newman +Newmann +Newmark +Newmeyer +Newmon +Newmyer +Newnam +Newness +Newnham +Newnum +Newport +Newquist +Newsam +Newsham +Newsom +Newsome +Newson +Newstead +Newsted +Newstrom +Newsum +Newton +Newtown +Newville +Newyear +Ney +Neyaci +Neyer +Neyhart +Neyland +Neylon +Neyman +Neymeyer +Neyra +Nez +Nezat +Nezich +Ng +Nghe +Nghiem +Ngin +Ngo +Ngoun +Ngov +Nguen +Ngueyn +Nguy +Nguyan +Nguyen +Nguyn +Ngvyen +Ngyun +Nham +Nhatsavang +Nhek +Nhep +Ni +Nian +Niang +Niau +Nibbe +Nibbs +Nibert +Niblack +Nibler +Niblett +Niblock +Nicar +Nicarry +Nicastro +Niccoli +Niccum +Nice +Nicely +Niceswander +Nicewander +Nicewarner +Nicewonger +Nichalson +Nichell +Nichelson +Nichlos +Nichois +Nichol +Nicholas +Nicholason +Nichole +Nicholes +Nicholl +Nicholls +Nichols +Nicholsen +Nicholson +Nichter +Nici +Nick +Nicka +Nickas +Nickel +Nickell +Nickels +Nickelson +Nickelston +Nickenberry +Nickens +Nickerson +Nickeson +Nickey +Nickisch +Nickl +Nicklas +Nicklaus +Nicklaw +Nickle +Nickleberry +Nickles +Nickleson +Nickless +Nicklien +Nicklin +Nicklos +Nicklous +Nicklow +Nickodem +Nickol +Nickolas +Nickoley +Nickolich +Nickolls +Nickols +Nickolson +Nicks +Nickson +Nicley +Nico +Nicodemus +Nicol +Nicola +Nicolai +Nicolaides +Nicolais +Nicolaisen +Nicolas +Nicolau +Nicolaus +Nicolay +Nicolaysen +Nicole +Nicolella +Nicoles +Nicolet +Nicoletta +Nicolette +Nicoletti +Nicoli +Nicolia +Nicolini +Nicoll +Nicolls +Nicolo +Nicolosi +Nicolozakes +Nicols +Nicolson +Nicome +Nicometo +Nicosia +Nicoson +Nicotera +Nicoulin +Nida +Niday +Nidiffer +Nido +Nie +Niebaum +Niebel +Niebergall +Niebla +Niebuhr +Niebyl +Niece +Nied +Niedbala +Niedbalec +Niedbalski +Niedecken +Niedens +Nieder +Niederberger +Niederer +Niederhaus +Niederhauser +Niederkorn +Niedermaier +Niedermayer +Niedermeier +Niedermeyer +Niedringhaus +Niedzielski +Niedzwiecki +Niedzwiedz +Niedzwiedzki +Niehaus +Niehoff +Niehus +Niel +Nieland +Nield +Nielsen +Nielson +Nieman +Niemann +Niemants +Niemczyk +Niemeier +Niemela +Niemeyer +Niemi +Niemie +Niemiec +Niemiel +Niemietz +Nieminen +Niemitzio +Nienaber +Nieng +Nienhaus +Nienhuis +Nienow +Nier +Nieratko +Nierenberg +Nierer +Nierman +Niermann +Nies +Niesborella +Niese +Niesen +Niesent +Niesman +Niesporek +Niess +Nietfeldt +Niethamer +Nieto +Nietupski +Nietzer +Nieva +Nievas +Nieves +Niewiadomski +Niewieroski +Niez +Niezgoda +Niffenegger +Nifong +Niforos +Nigg +Niggemann +Nigh +Nighbert +Nighbor +Nighman +Nighswander +Night +Nightengale +Nightingale +Nightlinger +Nightwine +Nigl +Niglio +Nigon +Nigro +Nihart +Nihei +Niheu +Nii +Niimi +Nik +Nikach +Nikaido +Nikas +Nikirk +Nikkel +Nikocevic +Nikodem +Nikolai +Nikolas +Nikolic +Niksich +Nikula +Nila +Nilan +Niland +Niles +Nilges +Nill +Nilles +Nilmeier +Nilsby +Nilsen +Nilson +Nilsson +Nim +Nimick +Nimmer +Nimmo +Nimmons +Nimocks +Nimon +Nimox +Nimrod +Nims +Nimtz +Nimura +Nimz +Nin +Nina +Nincehelsor +Nindorf +Nine +Niner +Ninh +Nini +Ninke +Ninneman +Ninnemann +Ninness +Nino +Ninos +Nip +Nipp +Nippe +Nipper +Nippert +Nipple +Nipps +Niquette +Nirenberg +Nirmaier +Niro +Nirschl +Nisbet +Nisbett +Nisbit +Nish +Nishi +Nishida +Nishiguchi +Nishihara +Nishikawa +Nishimori +Nishimoto +Nishimura +Nishina +Nishio +Nishioka +Nishitani +Nishiyama +Niskala +Niskanen +Nisley +Nisly +Nisonger +Niss +Nissalke +Nissan +Nissen +Nissila +Nissley +Nist +Nistendirk +Nistler +Niswander +Niswender +Niswonger +Nita +Nitchals +Nitcher +Nitchman +Niten +Nitka +Nitkowski +Nitsche +Nitschke +Nitta +Nitterhouse +Nitti +Nittinger +Nittler +Nitz +Nitzel +Nitzkowski +Nitzsche +Nitzschke +Niu +Nivala +Nivar +Niven +Nivens +Niver +Niverson +Nives +Nivison +Niwa +Nix +Nixa +Nixion +Nixon +Nixson +Niziol +Niziolek +Niznik +Nizo +Njango +Njie +Njoku +Nkomo +Nkuku +No +Noa +Noack +Noah +Noakes +Noaks +Nobbe +Nobel +Nobile +Nobis +Noble +Nobles +Noblet +Noblett +Noblin +Noblitt +Noboa +Nobrega +Nobregas +Nobriga +Nocar +Nocek +Nocella +Nocera +Nocito +Nock +Nockai +Nockels +Nocket +Nocks +Nocon +Nocum +Noda +Nodal +Nodarse +Nodd +Nodine +Nodland +Nodurft +Noe +Noecker +Noegel +Noel +Noeldner +Noell +Noens +Noerenberg +Noerr +Noethiger +Noey +Noffsinger +Nofsinger +Noftsger +Noftsier +Nofziger +Noga +Nogales +Noggle +Noggler +Noggles +Nogle +Nogoda +Nogosek +Nogowski +Noguchi +Nogueda +Nogueira +Noguera +Nogueras +Noh +Nohe +Nohel +Noia +Noice +Noiseux +Nojiri +Noke +Nokes +Nokken +Nokleby +Nol +Nola +Nolan +Noland +Nolasco +Nolau +Nolazco +Nold +Nolda +Nolde +Nolden +Nolder +Nole +Nolen +Noles +Nolet +Nolette +Nolf +Nolfe +Noli +Nolie +Nolin +Noll +Nolle +Noller +Nollet +Nollette +Nolley +Nollman +Nollora +Nolt +Nolte +Noltensmeier +Nolting +Nolton +Noman +Nommay +Nomura +Nonaka +Nonamaker +Nondorf +Nonemaker +Noneman +Nones +Nonnemacher +Nono +Nonroe +Nonu +Nooe +Nooman +Noon +Noonan +Noone +Nooner +Nooney +Noonkester +Noonon +Noor +Noorani +Noorda +Noordam +Noori +Noorigian +Nop +Nopachai +Nopper +Nora +Norales +Norals +Norat +Norbeck +Norberg +Norbo +Norbury +Norby +Norcia +Norcott +Norcross +Nord +Nordahl +Nordan +Nordberg +Nordby +Nordeen +Nordell +Norden +Nordenson +Nordenstrom +Norder +Nordes +Nordgren +Nordhoff +Nordick +Nordin +Nordine +Nordlie +Nordling +Nordlinger +Nordlund +Nordman +Nordmann +Nordmark +Nordmeyer +Nordon +Nordquist +Nordsiek +Nordstrand +Nordstrom +Nordwall +Nordyke +Nore +Nored +Noreen +Noreiga +Norem +Noren +Norena +Norenberg +Norfleet +Norfolk +Norg +Norgaard +Norgard +Nori +Noriega +Noriego +Noris +Norise +Nork +Norkaitis +Norkin +Norko +Norkus +Norland +Norlander +Norley +Norlien +Norlin +Norling +Norlund +Norma +Norman +Normand +Normandeau +Normandin +Normann +Norment +Normington +Normoyle +Norn +Norquest +Norquist +Norr +Norred +Norrell +Norrick +Norrid +Norrie +Norrington +Norris +Norrix +Norrod +Norsaganay +Norse +Norsen +Norseth +Norseworthy +Norsingle +Norskog +Norstrand +Norstrom +Norstrud +Norsworthy +Nortesano +North +Northam +Northan +Northcote +Northcott +Northcraft +Northcross +Northcut +Northcutt +Northern +Northey +Northington +Northouse +Northover +Northrop +Northrup +Northum +Northup +Northway +Northwood +Norton +Nortz +Norum +Norvell +Norviel +Norville +Norway +Norwell +Norwood +Norzagaray +Nosacka +Nosal +Nosbisch +Nose +Noseff +Nosek +Nosel +Noser +Nosis +Noss +Nossett +Nost +Nostrand +Nostro +Nosworthy +Notah +Notari +Notarnicola +Notaro +Notch +Noteboom +Notestine +Noth +Nothacker +Nothem +Nothnagel +Nothstein +Nothstine +Nothum +Notice +Notik +Notis +Notley +Noto +Notoma +Notowich +Notowitz +Nott +Nottage +Notte +Notter +Notti +Nottingham +Notto +Notwick +Noud +Noujaim +Noullet +Noun +Nouri +Nourse +Noury +Nouth +Nova +Novacek +Novack +Novad +Novak +Novakovich +Novara +Novas +Novel +Novell +Novelli +Novellino +Novello +Novelly +November +Novembre +Novencido +Novetsky +Novi +Novick +Novicki +Novickis +Novida +Novielli +Noviello +Novik +Novikoff +Novinger +Novitske +Novitski +Novitsky +Novo +Novoa +Novosel +Novotny +Novy +Nowack +Nowacki +Nowaczyk +Nowak +Nowakowski +Nowden +Nowell +Nowick +Nowicki +Nowinski +Nowitzke +Nowlan +Nowland +Nowlen +Nowley +Nowlin +Nowling +Nowosadko +Nowosielski +Nowzari +Noxon +Noy +Noya +Noyd +Noye +Noyer +Noyes +Noyola +Nozick +Nozicka +Nozum +Nquyen +Nuanes +Nuara +Nuber +Nucci +Nuccio +Nuccitelli +Nuce +Nuchols +Nuckels +Nuckles +Nucklos +Nuckoles +Nuckolls +Nuckols +Nudelman +Nuding +Nuesca +Nuessen +Nuessle +Nuetzman +Nuffer +Nugal +Nugen +Nugent +Nuhfer +Nuhn +Nulisch +Null +Nulle +Nulph +Nulty +Numan +Number +Numbers +Numkena +Nunamaker +Nuncio +Nunemaker +Nuner +Nunery +Nunes +Nunev +Nunez +Nungesser +Nuniz +Nunlee +Nunley +Nunmaker +Nunn +Nunnally +Nunnelee +Nunnelley +Nunnenkamp +Nunnery +Nunno +Nuno +Nunoz +Nuntaray +Nunz +Nunziata +Nunziato +Nuon +Nuque +Nuriddin +Nurmi +Nurnberger +Nurre +Nurse +Nurthen +Nusbaum +Nuse +Nush +Nusom +Nuss +Nussbaum +Nussbaumer +Nusser +Nussey +Nusz +Nutall +Nute +Nuth +Nutile +Nutley +Nutt +Nuttall +Nutter +Nutting +Nutzmann +Nuuanu +Nuvallie +Nuxoll +Nuzback +Nuzenski +Nuzum +Nuzzi +Nuzzo +Nwabeke +Nwachukwu +Nwadiora +Nwagbara +Nwakanma +Nwankwo +Ny +Nyahay +Nyberg +Nybo +Nyce +Nycum +Nydam +Nydegger +Nydick +Nye +Nyenhuis +Nygaard +Nygard +Nygaro +Nygren +Nyhan +Nyholm +Nyhus +Nykiel +Nyland +Nylander +Nylen +Nylin +Nylund +Nyman +Nypaver +Nyquist +Nyreen +Nyseth +Nysether +Nystrom +Nyswonger +Nyulassy +Oachs +Oajaca +Oak +Oakden +Oakes +Oakeson +Oakey +Oakland +Oakleaf +Oakley +Oakman +Oaks +Oar +Oard +Oare +Oas +Oates +Oatfield +Oathout +Oatis +Oatley +Oatman +Oatney +Oatridge +Oats +Oaxaca +Oba +Obaker +Oballe +Obando +Obanion +Obanner +Obannion +Obannon +Obar +Obarr +Obas +Obbink +Obeid +Obeirne +Obenauer +Obenchain +Obeng +Obenshain +Ober +Oberbeck +Oberdick +Oberdier +Oberdorf +Oberer +Oberfell +Oberg +Obergfell +Oberhaus +Oberhausen +Oberhelman +Oberholtzer +Oberholzer +Oberlander +Oberle +Oberley +Oberlies +Oberlin +Oberloh +Oberly +Oberman +Obermann +Obermeier +Obermeyer +Obermier +Obermiller +Obermoeller +Obermuller +Oberpriller +Oberry +Oberski +Oberson +Oberst +Obert +Obery +Obeso +Obey +Obhof +Obholz +Obi +Obiano +Obie +Obierne +Obiesie +Obin +Oblak +Oblander +Obleness +Obleton +Oblinger +Oblinski +Oblow +Obnegon +Oborne +Oborny +Oboyle +Obradovich +Obray +Obrecht +Obregon +Obrein +Obremski +Obrian +Obriant +Obrien +Obringer +Obrion +Obrist +Obryan +Obryant +Obryon +Obrzut +Obst +Obstfeld +Oby +Obyrne +Ocacio +Ocain +Ocallaghan +Ocallahan +Ocamb +Ocampo +Ocana +Ocanas +Ocanaz +Ocano +Ocarroll +Ocasio +Occhino +Occhiogrosso +Occhipinti +Occhuizzo +Ocean +Ocegueda +Oceguera +Ocejo +Ocenasek +Och +Ocha +Ochakovsky +Ochal +Ochalek +Ocheltree +Ochiai +Ochiltree +Ochinang +Ochoa +Ochocki +Ochotorena +Ochs +Ochsenbein +Ochsner +Ochwat +Ocken +Ockenfels +Ocker +Ockerman +Ockey +Ockimey +Ockleberry +Ockman +Ockmond +Oclair +Ocon +Oconnel +Oconnell +Oconner +Oconnor +Oconor +Ocran +Octave +Ocus +Oczon +Oda +Odair +Odam +Odaniel +Oday +Odden +Oddi +Oddo +Ode +Odea +Odear +Odebralski +Odegaard +Odegard +Odeh +Odekirk +Odell +Odem +Odems +Oden +Odenheimer +Odens +Odenwald +Oder +Oderkirk +Odermott +Odess +Odette +Odgen +Odgers +Odham +Odhner +Odiase +Odien +Odil +Odin +Odiorne +Odle +Odmark +Odneal +Odo +Odoherty +Odom +Odome +Odomes +Odoms +Odon +Odonahue +Odonal +Odonald +Odonell +Odonnel +Odonnell +Odonoghue +Odonovan +Odor +Odore +Odorizzi +Odougherty +Odowd +Odriscoll +Odum +Odums +Odwyer +Oechsle +Oedekerk +Oeder +Oeftger +Oehl +Oehlenschlage +Oehler +Oehlert +Oehlschlager +Oehm +Oehmig +Oehmke +Oehrle +Oehrlein +Oeler +Oelke +Oelschlaeger +Oelschlager +Oeltjen +Oelze +Oen +Oertel +Oerther +Oertle +Oesch +Oest +Oesterle +Oesterling +Oesterreich +Oestmann +Oestreich +Oestreicher +Oetken +Oetting +Oetzel +Ofallon +Ofarrell +Ofer +Off +Offen +Offenbacker +Offenberger +Offer +Offerdahl +Offerman +Offermann +Officer +Offield +Offill +Offley +Offner +Offord +Offret +Offutt +Oflaherty +Oflahrity +Oflynn +Ofsak +Oftedahl +Ogaldez +Ogami +Ogan +Ogando +Oganesian +Ogans +Oganyan +Ogara +Ogarro +Ogas +Ogasawara +Ogata +Ogawa +Ogaz +Ogbonnaya +Ogborn +Ogburn +Ogden +Oge +Ogeen +Ogen +Oger +Ogg +Ogiamien +Ogiba +Ogier +Ogilive +Ogilvie +Oginski +Ogle +Ogles +Oglesbee +Oglesby +Ogletree +Ogley +Ogorman +Ogrady +Ogram +Ogren +Ogrodowicz +Ogston +Oguendo +Oguin +Oguinn +Ogunyemi +Ogutu +Ogwin +Ogwynn +Ogzewalla +Oh +Ohagan +Ohair +Ohaire +Ohalloran +Ohan +Ohanesian +Ohanian +Ohanley +Ohanlon +Ohara +Ohare +Oharra +Oharroll +Ohashi +Ohaver +Ohayon +Ohearn +Ohern +Oheron +Oherron +Ohl +Ohland +Ohle +Ohlemacher +Ohlen +Ohlenbusch +Ohlendorf +Ohlensehlen +Ohler +Ohlhauser +Ohlinger +Ohlmacher +Ohlmann +Ohlrich +Ohlsen +Ohlson +Ohlsson +Ohlund +Ohm +Ohman +Ohmann +Ohme +Ohmen +Ohmer +Ohmie +Ohmit +Ohms +Ohno +Ohnstad +Ohora +Ohotnicky +Ohotto +Ohr +Ohren +Ohrenich +Ohrnstein +Ohrt +Ohs +Ohta +Ohyama +Oieda +Oien +Oiler +Oilvares +Oines +Oinonen +Oishi +Oja +Ojala +Ojanen +Ojano +Ojard +Ojeda +Ojima +Ojito +Ok +Oka +Okada +Okafor +Okajima +Okamoto +Okamura +Okane +Okano +Okazaki +Okeefe +Okeeffe +Okeke +Okel +Okelberry +Okelley +Okelly +Oken +Okerblom +Okerlund +Okerson +Okeson +Okey +Oki +Okie +Okihara +Okimoto +Okin +Okinaka +Okino +Okins +Okitsu +Okken +Okojie +Okoli +Okolo +Okon +Okonek +Okoniewski +Okonski +Okoren +Okoro +Okoronkwo +Okorududu +Okoye +Okray +Okrent +Oksen +Oktavec +Okubo +Okuda +Okuhara +Okula +Okuley +Okumoto +Okumura +Okun +Okuna +Okuniewski +Okuno +Okura +Okutsu +Okwuona +Olaes +Olafson +Olague +Olah +Olalde +Olan +Oland +Olander +Olano +Olarte +Olaughlin +Olausen +Olavarria +Olay +Olaya +Olazabal +Olberding +Olbrish +Olckhart +Olcott +Olcus +Old +Oldaker +Oldakowski +Oldani +Olde +Olden +Oldenburg +Oldenburger +Oldenkamp +Older +Oldershaw +Oldfather +Oldfield +Oldham +Olding +Oldow +Oldridge +Oldroyd +Olds +Olea +Oleary +Olecki +Olejarski +Olejarz +Olejniczak +Oleksa +Oleksiak +Oleksy +Olen +Olenick +Olenius +Olenski +Oler +Olerud +Oles +Olesen +Oleskiewicz +Olesky +Olesnevich +Oleson +Oleveda +Olevera +Olewine +Olewinski +Olexa +Olexy +Oley +Olfers +Olgin +Olguin +Olgvin +Olheiser +Olide +Olien +Oliff +Oligee +Oliger +Oligschlaeger +Olin +Oline +Olinger +Olinghouse +Olinick +Olinsky +Oliphant +Olis +Oliva +Olivar +Olivares +Olivarez +Olivarra +Olivarres +Olivarri +Olivarria +Olivas +Olive +Oliveira +Oliven +Olivencia +Oliver +Olivera +Oliveras +Oliveres +Oliveri +Oliveria +Oliverio +Olivero +Oliveros +Olivers +Oliverson +Olives +Olivia +Olivid +Olivier +Oliviera +Olivieri +Olivio +Olivo +Olivos +Olk +Olkowski +Ollar +Ollech +Ollendick +Oller +Ollhoff +Olli +Ollie +Olliff +Ollig +Ollila +Ollis +Ollison +Olliver +Ollivier +Ollivierre +Ollmann +Ollom +Olloqui +Olm +Olma +Olmeda +Olmedo +Olmo +Olmos +Olmscheid +Olmstead +Olmsted +Olnes +Olney +Olnick +Olofson +Olona +Olores +Oloughlin +Olowe +Olp +Olpin +Olquin +Olrich +Olsby +Olsen +Olshan +Olshefski +Olsin +Olson +Olsson +Olstad +Olsten +Olszewski +Olszowka +Olten +Olthoff +Oltman +Oltmanns +Olton +Oltremari +Oltrogge +Oltz +Olubunmi +Olufson +Olup +Olveda +Olvedo +Olveira +Olvera +Olverson +Olvey +Olwin +Olynger +Omahony +Omalley +Oman +Omar +Omara +Omarah +Omary +Omdahl +Omeara +Omelia +Omer +Omernik +Omersa +Ominelli +Omland +Omli +Omlin +Ommen +Omo +Omohundro +Omoto +Omoyosi +Oms +Omtiveros +Omullan +Omundson +Omura +On +Ona +Onaga +Onan +Oncale +Ondeck +Ondersma +Ondic +Ondik +Ondo +Ondrey +Ondrick +Ondrusek +Oneal +Oneale +Oneel +Oneil +Oneill +Onell +Oney +Onezne +Ong +Oniel +Oniell +Onifade +Onishea +Onishi +Onisick +Onitsuka +Onken +Onks +Onkst +Onley +Onnen +Ono +Onofre +Onofrio +Onorata +Onorati +Onorato +Onsgard +Onstad +Onstead +Onstott +Onsurez +Ontiveros +Ontiveroz +Ontko +Onukogu +Onusko +Onwunli +Onyeagu +Onyeanus +Ooley +Oommen +Oosterhof +Ooten +Ooton +Opaka +Opal +Opalicki +Opalka +Opara +Opatrny +Opatz +Opdahl +Opdyke +Opeka +Opel +Opela +Opell +Openshaw +Opet +Opfer +Opheim +Opher +Ophus +Opichka +Opie +Opiela +Opielski +Opiola +Opitz +Opland +Oplinger +Opoien +Opoka +Opp +Oppegard +Oppel +Oppelt +Oppenheim +Oppenheimer +Oppenlander +Opper +Opperman +Oppliger +Oppy +Opray +Opsahl +Opstein +Opteyndt +Opula +Opunui +Opyd +Oquenda +Oquendo +Oquin +Oquinn +Or +Ora +Orabone +Orabuena +Orahood +Oram +Orama +Oran +Orandello +Orange +Oransky +Orantes +Oras +Oravec +Oravetz +Orazine +Orbaker +Orban +Orbeck +Orbin +Orbison +Orce +Orchard +Orcholski +Orcutt +Ord +Ordahl +Ordal +Ordas +Ordaz +Ordazzo +Ordeneaux +Ording +Ordiway +Ordman +Ordner +Ordon +Ordona +Ordones +Ordonez +Ordorica +Ordoyne +Orduna +Orduno +Ordway +Ore +Orea +Orear +Oreb +Orebaugh +Oree +Orefice +Oregan +Oregel +Oregon +Orehek +Oreilly +Oreily +Orejel +Orejuela +Orellama +Orellana +Orellano +Orem +Oren +Orendain +Orender +Orendorff +Orengo +Orenstein +Ores +Oreskovich +Orewiler +Orey +Orf +Orff +Orford +Orgain +Organ +Organek +Organista +Orgeron +Orgill +Orgovan +Orhenkowski +Ori +Orick +Orie +Orielley +Orielly +Origer +Orihuela +Oriley +Orillion +Orines +Orio +Oriol +Orion +Oriordan +Oris +Orison +Oriti +Oritz +Orizabal +Orizetti +Orji +Ork +Orkin +Orkwis +Orland +Orlander +Orlandi +Orlando +Orleans +Orlich +Orlikowski +Orlin +Orlinski +Orlinsky +Orlof +Orloff +Orloski +Orlosky +Orlove +Orlow +Orlowski +Orlowsky +Orm +Orman +Ormand +Orme +Ormerod +Ormes +Ormiston +Ormond +Ormonde +Orms +Ormsbee +Ormsby +Orn +Orndoff +Orndorf +Orndorff +Orne +Ornedo +Ornelas +Ornelaz +Ornellas +Ornelos +Orner +Ornstein +Oroak +Oroark +Orobona +Orochena +Orofino +Orona +Orone +Oropesa +Oropeza +Ororke +Oros +Orosco +Orosz +Orouke +Orourke +Oroz +Orozco +Orozeo +Orpen +Orphey +Orpin +Orr +Orrala +Orrantia +Orrego +Orrell +Orren +Orrick +Orrico +Orrill +Orris +Orrison +Orrock +Orsak +Orsborn +Orsburn +Orscheln +Orser +Orsi +Orsini +Orsino +Orso +Orson +Orsten +Orszulak +Ort +Orta +Ortaga +Orte +Ortea +Ortega +Ortego +Ortegon +Ortell +Ortelli +Ortelt +Ortenzio +Ortez +Ortga +Orth +Ortic +Ortis +Ortiz +Ortlieb +Ortman +Ortmann +Ortmeier +Ortmeyer +Ortner +Orto +Ortolano +Ortolf +Orton +Orts +Orttenburger +Ortuno +Ortwein +Ortwine +Ortz +Orum +Orvin +Orvis +Orwick +Orwig +Orwin +Ory +Orzalli +Orzech +Orzechowski +Orzel +Orzell +Osaile +Osaki +Osako +Osario +Osawa +Osayande +Osazuwa +Osbeck +Osberg +Osbey +Osbment +Osbon +Osborn +Osborne +Osbourn +Osbourne +Osburn +Osburne +Osby +Oscar +Oscarson +Osche +Oschmann +Osden +Osdoba +Osegueda +Oseguera +Osei +Osen +Osendorf +Osenkowski +Osentowski +Osequera +Oser +Osgood +Oshaughnessy +Oshea +Oshell +Osher +Oshey +Oshields +Oshima +Oshinsky +Oshiro +Oshita +Oshman +Osias +Osick +Osiecki +Osier +Osika +Osinski +Osisek +Oskins +Oslan +Osland +Osle +Osler +Osley +Oslin +Oslund +Osman +Osmanski +Osment +Osmer +Osmera +Osmers +Osmon +Osmond +Osmun +Osmundson +Osmus +Osnoe +Osofsky +Osol +Osollo +Osoria +Osorio +Osornio +Osorno +Ososki +Ososkie +Osowicz +Osowski +Ospina +Ospital +Ossenfort +Ossman +Osso +Ossola +Ossowski +Osswald +Ost +Ostaba +Ostasiewicz +Ostberg +Ostby +Osteen +Osten +Ostenberg +Ostendorf +Ostendorff +Ostenson +Oster +Osterberg +Osterberger +Osterdyk +Osterfeld +Ostergard +Ostergren +Osterhaut +Osterholt +Osterhoudt +Osterhouse +Osterhout +Osterland +Osterloh +Osterlund +Osterman +Ostermann +Ostermeyer +Ostermiller +Osterstuck +Ostertag +Ostheimer +Osthoff +Ostiguy +Osting +Ostler +Ostlie +Ostling +Ostlund +Ostolaza +Ostorga +Ostrander +Ostrem +Ostroff +Ostrom +Ostroot +Ostroski +Ostrosky +Ostrov +Ostrow +Ostrowski +Ostrum +Ostrye +Ostrzyeki +Ostwald +Ostwinkle +Osuch +Osucha +Osullivan +Osumi +Osuna +Osvaldo +Oswald +Oswalt +Oszust +Ota +Otake +Otani +Otanicar +Otano +Otar +Otega +Otero +Otex +Otey +Other +Othman +Othon +Othoudt +Otinger +Otis +Otiz +Otley +Oto +Otomo +Otool +Otoole +Otremba +Otsman +Otsu +Otsuka +Ott +Otta +Ottalagano +Ottaway +Otte +Ottem +Otteman +Otten +Ottenwess +Otter +Otterbein +Otterbine +Otterholt +Otterson +Ottesen +Otteson +Ottey +Ottilige +Otting +Ottinger +Ottino +Ottis +Ottley +Ottman +Otto +Ottogary +Ottomaniello +Ottosen +Ottoson +Ottrix +Otts +Ottum +Otuafi +Otukolo +Otutaha +Otwell +Ou +Oubre +Ouch +Ouchi +Oudekerk +Ouderkirk +Oudker +Ouelette +Ouellet +Ouellete +Ouellette +Ouillette +Ouimet +Ouimette +Ouinones +Ouk +Oulette +Oullette +Oum +Oun +Ounsy +Ourada +Ouren +Ours +Oursler +Ourso +Ourth +Oury +Ousdahl +Ousley +Outcalt +Outen +Outhier +Outhouse +Outland +Outlaw +Outler +Outley +Outman +Outram +Outten +Outwater +Outzen +Ouye +Ouzts +Ovadilla +Ovall +Ovalle +Ovalles +Ovando +Ovard +Ovdenk +Ovellette +Oven +Ovens +Over +Overall +Overbaugh +Overbay +Overbeck +Overbee +Overbeek +Overbey +Overbo +Overbough +Overby +Overcash +Overcast +Overdick +Overdorf +Overfelt +Overfield +Overgaard +Overholser +Overholt +Overholtzer +Overhulser +Overkamp +Overland +Overlee +Overley +Overlie +Overlock +Overly +Overman +Overmann +Overmeyer +Overmire +Overmyer +Overocker +Overpeck +Overshiner +Overshown +Overson +Overstreet +Overstrom +Overton +Overturf +Overweg +Overy +Ovesen +Oveson +Oviatt +Oviedo +Ovington +Ovit +Ovitt +Ovitz +Ovsanik +Ow +Owca +Owczarzak +Owen +Owenby +Owens +Owensby +Owers +Owings +Ownbey +Ownby +Ownes +Owney +Owoc +Owolabi +Owsley +Owston +Owusu +Oxborough +Oxborrow +Oxendine +Oxenrider +Oxford +Oxley +Oxman +Oxnam +Oxner +Oxton +Oya +Oyabu +Oyama +Oyellette +Oyen +Oyer +Oyervides +Oyler +Oyola +Oyster +Oyston +Oyuela +Oz +Oza +Ozaeta +Ozaine +Ozaki +Ozane +Ozawa +Ozbun +Ozburn +Ozenne +Ozer +Ozga +Ozier +Ozimek +Ozley +Ozment +Ozminkowski +Ozog +Ozolins +Ozols +Ozuna +Ozzella +Pa +Paa +Paalan +Paap +Paar +Paarmann +Paasch +Paaske +Paavola +Pabelick +Paben +Pabey +Pabich +Pablo +Pabon +Pabst +Pac +Pacana +Pacapac +Pacas +Pacchiana +Paccione +Pace +Pacek +Pacella +Pacelli +Pacenta +Pacer +Pacetti +Pacewicz +Pacey +Pach +Pachar +Pacheco +Pachelo +Pacheo +Pachero +Pachew +Pachla +Pachlin +Pacho +Pacholec +Pacholski +Pachter +Pachucki +Paci +Pacific +Pacifico +Pacilio +Pacini +Paciolla +Pacior +Paciorek +Pacitti +Pacitto +Pacius +Pack +Packard +Packebush +Packen +Packer +Packett +Packham +Packineau +Packingham +Packwood +Pacleb +Paco +Pacol +Pacquette +Pacquin +Pacubas +Paczkowski +Padalecki +Padamadan +Padarebones +Padavano +Padavich +Padberg +Paddack +Padden +Paddick +Paddilla +Paddio +Paddison +Paddock +Paddy +Padeken +Padel +Paden +Padfield +Padget +Padgett +Padgette +Padilla +Padillia +Padillo +Padin +Padinha +Padiong +Padley +Padlo +Padmanabhan +Padmore +Padol +Padon +Padovani +Padovano +Padro +Padron +Padua +Paduano +Padula +Pae +Paek +Paet +Paeth +Paetz +Paetzold +Paez +Pafel +Paff +Pafford +Paffrath +Pafundi +Paga +Pagaduan +Pagan +Paganelli +Pagani +Paganico +Paganini +Pagano +Pagdanganan +Page +Pageau +Pagel +Pagels +Pagenkopf +Pages +Paget +Pagett +Pagley +Paglia +Paglialunga +Pagliari +Pagliarini +Pagliaro +Paglinawan +Paglio +Paglione +Pagliuca +Pagnello +Pagni +Pagnozzi +Pago +Pagoda +Pagon +Pagonis +Paguin +Paguirigan +Pahk +Pahl +Pahler +Pahls +Pahmeier +Pahnke +Pahulu +Pai +Paider +Paige +Paik +Pailet +Paillant +Paille +Paillet +Pailthorpe +Pain +Paine +Paino +Painter +Painton +Pair +Paire +Pais +Paisley +Pait +Paith +Paiva +Paiz +Pajak +Pajerski +Pajtas +Pak +Pake +Pakele +Paker +Pakonen +Pal +Pala +Palacio +Palacios +Palacious +Palacois +Paladin +Paladini +Paladino +Palafox +Palagi +Palaia +Palakiko +Palamara +Palamino +Palange +Palanza +Palardy +Palas +Palasik +Palaspas +Palau +Palay +Palazola +Palazzi +Palazzo +Palazzola +Palazzolo +Palchetti +Palczewski +Palczynski +Pale +Paleaae +Palecek +Palek +Palen +Palencia +Palenik +Palenzuela +Paleo +Palermo +Palesano +Palese +Paletta +Palevic +Paley +Palfreyman +Palhegyi +Pali +Palifka +Palilla +Palin +Paling +Palinkas +Palino +Palinski +Paliotta +Palis +Palisano +Palisbo +Palischak +Palisi +Palitti +Palk +Palka +Palko +Pall +Palla +Palladino +Pallafor +Pallan +Pallanes +Pallansch +Pallant +Pallante +Pallares +Pallas +Pallazzo +Pallerino +Palleschi +Pallesen +Pallet +Pallett +Palley +Pallino +Pallone +Pallotta +Pallotto +Palm +Palma +Palmateer +Palmatier +Palmberg +Palme +Palmer +Palmeri +Palmerin +Palmerino +Palmero +Palmerton +Palmertree +Palmese +Palmeter +Palmieri +Palmiero +Palmino +Palmios +Palmiotto +Palmisano +Palmisciano +Palmiter +Palmitessa +Palmo +Palmore +Palmour +Palmquist +Palmrose +Palms +Palmucci +Palo +Paloma +Palomaki +Palomar +Palomares +Palomarez +Palomba +Palombit +Palombo +Palomin +Palomino +Palomo +Palone +Palos +Paloukos +Palovick +Palowoda +Pals +Palsgrove +Palso +Paltanavage +Palu +Palubiak +Paluch +Paluck +Paluk +Palumbo +Paluso +Paluszynski +Paluzzi +Palys +Pam +Pama +Pamer +Pamintuan +Pamperin +Pamphile +Pamplin +Pampusch +Pan +Pana +Panagakos +Panagiotopoul +Panagis +Panagos +Panagoulias +Panah +Panahon +Panak +Panakos +Panameno +Panarella +Panarello +Panaro +Panas +Panasci +Pancake +Panchak +Panchal +Panchana +Pancheri +Panchik +Pancho +Pancholi +Panciera +Pancoast +Panda +Pander +Pandey +Pandiani +Pandit +Pando +Pandola +Pandolfi +Pandolfo +Panduro +Pandy +Pandya +Pane +Panebianco +Paneczko +Panek +Panela +Panell +Panella +Panelli +Panepinto +Paneque +Panessa +Paneto +Panetta +Panfil +Panfilov +Pang +Pangallo +Pangan +Panganiban +Pangborn +Pangburn +Pangelina +Pangelinan +Pangilinan +Pangle +Pangrazio +Paniagua +Panias +Paniccia +Panich +Panico +Panik +Panila +Panis +Panitz +Pankake +Pankau +Panke +Pankey +Pankhurst +Pankiewicz +Pankiw +Panko +Pankow +Pankowski +Pankratz +Pannebaker +Pannell +Pannenbacker +Pannhoff +Panning +Pannone +Pannunzio +Panny +Pano +Panone +Panora +Panos +Panowicz +Panozzo +Panrell +Pansini +Pansullo +Pantaleo +Pantaleon +Pantalone +Pantano +Pante +Pantelakis +Panter +Pantera +Panther +Pantle +Panto +Pantoja +Pantojz +Pantoliano +Panton +Pantone +Pantoni +Pantosa +Pantuso +Panuccio +Panyik +Panyko +Panza +Panzarella +Panzarino +Panzella +Panzer +Panzica +Pao +Paola +Paolello +Paoletta +Paoletti +Paoletto +Paoli +Paolicelli +Paolini +Paolino +Paolucci +Paone +Paonessa +Paongo +Pap +Papa +Papadakis +Papadopoulos +Papageorge +Papagni +Papai +Papaioannou +Papakostas +Papale +Papaleo +Papalia +Papallo +Papan +Papandrea +Papania +Papanikolas +Papantonio +Paparella +Paparelli +Paparello +Paparo +Papas +Papasergi +Papay +Papazian +Papciak +Pape +Papelian +Papen +Papenfuss +Papetti +Papi +Papich +Papiernik +Papik +Papike +Papillion +Papin +Papineau +Papitto +Papka +Papke +Paplow +Paponetti +Papp +Pappa +Pappajohn +Pappalardo +Pappan +Pappas +Pappenheim +Papps +Pappy +Papranec +Paprocki +Papson +Papstein +Paquet +Paquette +Paquin +Para +Parada +Paradee +Paradis +Paradise +Paradiso +Parado +Paradowski +Parady +Paragas +Parah +Parajon +Paramo +Paramore +Paranada +Parara +Paras +Parat +Paratore +Paravano +Paravati +Paray +Parayno +Parayuelos +Paraz +Parbo +Parbol +Parbs +Parcel +Parcell +Parcells +Parchman +Parchment +Parco +Parda +Pardall +Parde +Pardee +Parden +Pardew +Pardey +Pardi +Pardieck +Pardini +Pardo +Pardoe +Pardon +Pardue +Parduhn +Pardun +Pardy +Pare +Paredes +Paredez +Paree +Pareja +Parekh +Parent +Parente +Parenteau +Parenti +Parents +Pares +Paretti +Parez +Parfait +Parfitt +Parga +Pargman +Pargo +Parham +Parhan +Parido +Pariente +Parihar +Parikh +Parilla +Parillo +Parinas +Paripovich +Paris +Parise +Pariseau +Pariser +Parish +Parisi +Parisian +Parisien +Parisio +Parizek +Parizo +Park +Parke +Parker +Parkers +Parkerson +Parkes +Parkey +Parkhill +Parkhouse +Parkhurst +Parkin +Parkins +Parkinson +Parkison +Parkman +Parkos +Parks +Parlato +Parlavecchio +Parle +Parlee +Parler +Parlet +Parlett +Parlier +Parliman +Parlin +Parlor +Parlow +Parm +Parma +Parmalee +Parman +Parmann +Parmantier +Parmar +Parmele +Parmelee +Parmely +Parmenter +Parmentier +Parmer +Parmeter +Parmley +Parms +Parnell +Parnes +Parness +Parnin +Paro +Parobek +Paroda +Parodi +Parody +Parolari +Parolini +Parone +Paronto +Parpan +Parquette +Parr +Parra +Parrack +Parraga +Parral +Parrales +Parramore +Parran +Parras +Parraz +Parreira +Parrella +Parreno +Parrent +Parrett +Parriera +Parrigan +Parrill +Parrilla +Parrillo +Parrin +Parrinello +Parrington +Parrino +Parriott +Parris +Parrish +Parron +Parrot +Parrott +Parrotta +Parrotte +Parrow +Parry +Parsa +Parsell +Parsells +Parsens +Parsh +Parshall +Parshotam +Parsi +Parsley +Parslow +Parson +Parsons +Parsygnat +Part +Partain +Partch +Partee +Partelow +Parten +Partenope +Parter +Parthemer +Parthemore +Partible +Partida +Partido +Partin +Partington +Partipilo +Partis +Partlow +Partman +Partmann +Parton +Partridge +Party +Partyka +Paruta +Parviainen +Parvin +Parvis +Parziale +Parzych +Pasana +Pasanen +Pasaya +Pasaye +Pascal +Pascale +Pascall +Pascanik +Pascarella +Pascarelli +Pascascio +Pasceri +Pasch +Paschal +Paschall +Pasche +Paschel +Pascher +Paschke +Pasco +Pascoal +Pascocello +Pascoe +Pascorell +Pascua +Pascual +Pascucci +Pasculli +Pascuzzi +Pase +Pasek +Paseur +Pasey +Pash +Pasha +Pashal +Pashea +Pashel +Pashia +Pashley +Pasho +Pasierb +Pasillas +Pasinski +Pasion +Paske +Paskel +Paskell +Paskert +Pasket +Paskett +Paskey +Paskiewicz +Paskin +Pasko +Paskoff +Paskow +Pasley +Pason +Pasqua +Pasqual +Pasquale +Pasqualetti +Pasqualino +Pasquarella +Pasquarelli +Pasquarello +Pasquariello +Pasquel +Pasquin +Pasquini +Pasquino +Pass +Passalacqua +Passantino +Passarella +Passarelli +Passaretti +Passaro +Passe +Passer +Passeri +Passerino +Passero +Passey +Passi +Passineau +Passini +Passino +Passley +Passman +Passmore +Passon +Passow +Passwater +Passy +Pastano +Pastel +Paster +Pasternack +Pasternak +Pastian +Pastick +Pastiva +Pasto +Pastor +Pastora +Pastore +Pastorin +Pastorino +Pastorius +Pastrana +Pastrano +Pastuch +Pastula +Pastures +Pasvizaca +Paswaters +Paszek +Paszkiewicz +Pat +Pata +Patadia +Patague +Patajo +Patak +Pataki +Patalano +Patane +Patanella +Patao +Patch +Patchell +Patchen +Patcher +Patches +Patchett +Patchin +Pate +Patee +Patek +Patel +Patella +Patellis +Paten +Patenaude +Pater +Patera +Paterniti +Paterno +Paterson +Pates +Patete +Pathak +Patience +Patient +Patierno +Patik +Patil +Patillo +Patin +Patino +Patka +Patlan +Patman +Patmon +Patmore +Patnaude +Patneaude +Patnode +Patock +Patocka +Patoine +Patolot +Paton +Patout +Patras +Patraw +Patria +Patriarco +Patrias +Patrice +Patrich +Patricia +Patricio +Patrick +Patridge +Patrie +Patrin +Patriquin +Patriss +Patron +Patrone +Patronella +Patrum +Patruno +Patry +Patrylak +Patsy +Patt +Pattee +Patten +Pattengale +Patter +Patterson +Patteson +Patti +Pattie +Pattillo +Pattinson +Pattison +Patton +Patts +Pattum +Patty +Pattyre +Patuel +Patuto +Patwell +Patz +Patzer +Patzke +Patzner +Pauda +Paugh +Paugsch +Pauk +Pauker +Paukert +Paukstis +Paul +Paula +Paulas +Paulauskas +Paulauskis +Paulding +Pauldo +Paule +Paules +Paulette +Pauley +Paulhus +Pauli +Paulic +Paulick +Paulik +Paulin +Paulina +Pauline +Pauling +Paulino +Paulis +Paulk +Paull +Paullin +Paullus +Paulman +Paulmino +Paulo +Paulos +Pauls +Paulsell +Paulsen +Paulseth +Paulshock +Paulson +Paulus +Pauly +Paup +Pausch +Paustian +Pautler +Pautz +Pauza +Pav +Pavan +Pavao +Paveglio +Pavek +Pavel +Pavelec +Pavelich +Pavelka +Pavelko +Pavella +Pavelski +Pavese +Pavey +Pavia +Pavich +Pavick +Paviol +Paviolitis +Pavis +Pavish +Pavlak +Pavlas +Pavlat +Pavletic +Pavlica +Pavlicek +Pavlich +Pavlick +Pavlides +Pavlik +Pavlikowski +Pavliska +Pavlo +Pavlock +Pavloski +Pavlosky +Pavlov +Pavlovic +Pavlovich +Pavolini +Pavon +Pavone +Pavoni +Pavy +Pawelczyk +Pawelek +Pawelk +Pawell +Pawlak +Pawley +Pawlicki +Pawlik +Pawlikowski +Pawlitschek +Pawloski +Pawlosky +Pawlowicz +Pawlowski +Pawluch +Pawluk +Pawlusiak +Pax +Paxman +Paxson +Paxton +Pay +Paya +Payamps +Payan +Payano +Payant +Payden +Paye +Payen +Payenda +Payer +Payes +Payette +Payeur +Paylor +Payment +Payn +Payna +Payne +Paynes +Payno +Paynter +Payor +Paysen +Payseur +Paysinger +Payson +Paysour +Paytes +Payton +Paywa +Paz +Pazan +Pazderski +Pazik +Pazmino +Pazo +Pazos +Pea +Peabody +Peace +Peacemaker +Peach +Peachay +Peacher +Peaches +Peachey +Peacock +Peacy +Pead +Peaden +Peagler +Peairs +Peak +Peake +Peaker +Peakes +Peaks +Peal +Peale +Pealer +Peals +Pean +Pear +Pearce +Pearcey +Pearcy +Peard +Peare +Pearl +Pearle +Pearlman +Pearlstein +Pearman +Pears +Pearsall +Pearse +Pearson +Peart +Peary +Pearyer +Peasant +Pease +Peasel +Peaslee +Peasley +Peasnall +Peat +Peatman +Peatross +Peatry +Peavey +Peavler +Peavy +Peay +Pebbles +Pebley +Pebsworth +Pebworth +Peca +Pecanty +Pecararo +Pecarina +Pecatoste +Pecci +Peccia +Pech +Pecha +Pechacek +Pechaira +Pechal +Pechar +Pechart +Peche +Pecher +Pechin +Pechon +Pecht +Pecina +Pecinousky +Pecinovsky +Peck +Pecka +Peckenpaugh +Peckens +Peckham +Peckinpaugh +Peckler +Peckman +Peco +Pecor +Pecora +Pecoraino +Pecoraro +Pecore +Pecorelli +Pecos +Pecot +Pectol +Pecue +Pecukonis +Ped +Pedaci +Pedde +Pedder +Peddicord +Peddie +Peddy +Pede +Pedeare +Pedelty +Peden +Pedersen +Pederson +Pederzani +Pedez +Pedigo +Pedlar +Pedley +Pedlow +Pedone +Pedraja +Pedralba +Pedraza +Pedregon +Pedretti +Pedri +Pedrick +Pedrin +Pedro +Pedrogo +Pedroncelli +Pedroni +Pedrosa +Pedroso +Pedrotti +Pedroza +Pedrozo +Pedulla +Peduto +Peduzzi +Pee +Peebles +Peecha +Peed +Peeden +Peedin +Peek +Peeks +Peel +Peele +Peeler +Peeling +Peelle +Peelman +Peels +Peeples +Peer +Peerbolt +Peers +Peery +Peerzada +Peet +Peete +Peeters +Peetoom +Peets +Peetz +Peevey +Peevy +Pefanis +Peffer +Pefferkorn +Pefferman +Peffers +Peffley +Peffly +Pegelow +Pegeron +Pegg +Peggs +Pegler +Pegoda +Pegram +Peguero +Pegues +Peguese +Peha +Pehl +Pehler +Pehowic +Pehowich +Pehrson +Peick +Peifer +Peiffer +Peight +Peightal +Peightell +Peil +Pein +Peinado +Peine +Peiper +Peirce +Peirson +Peitz +Peixoto +Pekala +Pekar +Pekara +Pekarek +Pekas +Pekrul +Pel +Pela +Pelaez +Pelak +Pelayo +Pelc +Pelch +Pelchat +Pelcher +Pelczar +Pele +Pelech +Peleg +Peles +Pelfrey +Pelham +Peli +Pelikan +Pelini +Pelino +Pelis +Pelissier +Pelkey +Pelkowski +Pell +Pella +Pellam +Pelland +Pellant +Pelle +Pellecchia +Pellegren +Pellegrin +Pellegrini +Pellegrino +Peller +Pellerin +Pellerito +Pellet +Pelletier +Pelletiu +Pellett +Pelley +Pellham +Pelliccia +Pellicone +Pellietier +Pelligra +Pelligrini +Pelligrino +Pellin +Pellish +Pellissier +Pellitier +Pellitteri +Pellman +Pellom +Pellon +Pellot +Pellow +Pellowski +Pellum +Pelman +Pelnar +Pelo +Peloquin +Pelosi +Peloso +Pelot +Pelote +Pelotte +Pelow +Pelphrey +Pelt +Pelter +Peltier +Pelto +Pelton +Peltz +Peltzer +Peluse +Peluso +Pelyo +Pelz +Pelzel +Pelzer +Pember +Pemberton +Pemble +Pembleton +Pembroke +Pembrook +Pemelton +Pen +Pena +Penado +Penaflor +Penagos +Penaherrera +Penale +Penalosa +Penaloza +Penalver +Penanegra +Penas +Penasa +Penatac +Penate +Penaz +Penberthy +Pencak +Pence +Penceal +Pencek +Pencil +Pendarvis +Pendegraft +Pendelton +Pender +Penderel +Pendergast +Pendergraft +Pendergraph +Pendergrass +Pendergrast +Penders +Pendexter +Pendill +Pendl +Pendleton +Pendley +Pendola +Pendon +Pendrak +Pendry +Penegar +Penepent +Penez +Penfield +Penfold +Peng +Pengelly +Pengra +Penha +Penhall +Penhallurick +Penhollow +Penick +Penigar +Peninger +Penington +Penird +Penisson +Penister +Peniston +Penix +Penkalski +Penkins +Penland +Penley +Penman +Penn +Penna +Pennacchio +Pennachio +Pennant +Pennebaker +Pennel +Pennell +Pennella +Pennelle +Pennello +Penner +Pennewell +Penney +Pennick +Pennie +Pennig +Pennigton +Penniman +Pennimpede +Penning +Penninger +Pennington +Pennino +Pennisi +Pennison +Penniston +Pennix +Pennock +Penny +Pennycuff +Pennypacker +Pennywell +Peno +Penovich +Penoyer +Penquite +Penrice +Penrod +Penrose +Pensa +Pense +Pensick +Pensiero +Pensinger +Pensis +Penski +Pensky +Penso +Penson +Pent +Penta +Pentaris +Pentecost +Pentek +Pentico +Penticoff +Pentland +Penton +Penttila +Pentz +Penuel +Penunuri +Penwarden +Penwell +Penya +Penz +Penza +Penzel +Penzero +Penzien +Peon +People +Peoples +Pepe +Peper +Pepez +Pepin +Pepion +Pepito +Pepitone +Pepka +Peplau +Peplinski +Peppard +Peppas +Peppe +Peppel +Pepper +Pepperman +Peppers +Peppin +Pepple +Peppler +Pequeno +Peques +Pera +Peragine +Peraha +Peral +Perales +Peralez +Peralta +Peralto +Peranio +Peraro +Perault +Peraza +Perazzo +Perce +Percell +Percey +Perch +Perches +Perchinski +Perciballi +Percifield +Perciful +Percival +Percle +Percontino +Percy +Perdew +Perdomo +Perdue +Perdzock +Pere +Perea +Pereda +Peredo +Peredz +Perego +Peregoy +Peregrino +Pereida +Pereira +Pereiro +Perella +Perelman +Perencevich +Perera +Pereria +Peres +Peressini +Peret +Peretti +Peretz +Perey +Pereyda +Pereyra +Perez +Perfater +Perfect +Perfecto +Perfetti +Pergande +Pergerson +Pergola +Pergram +Perham +Peri +Peria +Perich +Perico +Perie +Periera +Perigo +Perilli +Perillo +Perilloux +Perin +Perina +Perine +Perini +Perino +Perish +Perisho +Perkerson +Perkes +Perkey +Perkin +Perking +Perkins +Perkinson +Perkiss +Perko +Perkoski +Perkowski +Perks +Perl +Perla +Perlas +Perler +Perley +Perlich +Perlin +Perlman +Perlmutter +Perloff +Perlow +Perlson +Perlstein +Perman +Permann +Permenter +Perna +Pernell +Pernesky +Perney +Perng +Pernice +Perniciaro +Pernin +Perno +Pernod +Pero +Perocho +Peroddy +Peroff +Perolta +Peron +Perona +Perone +Peroni +Peros +Perot +Perotta +Perotti +Peroutka +Perow +Perozo +Perpall +Perper +Perque +Perr +Perra +Perras +Perrault +Perre +Perreault +Perreira +Perrell +Perrella +Perrelli +Perrenoud +Perrera +Perret +Perrett +Perretta +Perrette +Perretti +Perrez +Perri +Perricone +Perriello +Perrien +Perrier +Perrigan +Perrigo +Perrill +Perrilloux +Perrin +Perrine +Perring +Perrington +Perrino +Perrins +Perriott +Perris +Perrish +Perritt +Perro +Perrodin +Perron +Perrone +Perrot +Perrota +Perrott +Perrotta +Perrotti +Perrow +Perrucci +Perruzza +Perruzzi +Perry +Perryman +Pers +Persad +Persall +Persampieri +Persaud +Persch +Perschall +Perschbacher +Persechino +Pershall +Pershing +Persia +Persichetti +Persico +Persing +Persinger +Persky +Persley +Person +Personette +Personius +Persons +Persson +Persten +Persyn +Pert +Pertea +Pertee +Perteet +Pertsovsky +Pertubal +Pertuit +Peru +Perugini +Perun +Perusse +Peruzzi +Pervine +Pervis +Pery +Perz +Perza +Perzanowski +Perze +Pesa +Pesante +Pesantes +Pesarchick +Pesavento +Pescador +Pescatore +Pesce +Pesch +Peschel +Peschong +Pesek +Pesenti +Pesh +Peshek +Peshlakai +Pesick +Pesicka +Pesin +Pesina +Pesiri +Peskin +Peskind +Pesnell +Pesner +Pesola +Pesqueira +Pesses +Pessin +Pesso +Pessoa +Pessolano +Pesta +Pestana +Pestano +Pester +Pesterfield +Pestka +Pesto +Pestone +Pestoni +Pestronk +Peszynski +Petaccio +Petalcu +Petanick +Petaway +Petch +Petchulis +Pete +Peteet +Petek +Petela +Petell +Peter +Peterka +Peterkin +Peterman +Petermann +Petermeier +Peters +Peterschick +Petersdorf +Petersen +Petersheim +Petersik +Peterson +Petersson +Petesic +Petet +Peteuil +Petges +Petgrave +Peth +Pethtel +Petiet +Petigny +Petillo +Petit +Petite +Petitjean +Petito +Petitt +Petitte +Petitti +Petitto +Petix +Petka +Petko +Petkoff +Petkus +Peto +Petosa +Petr +Petraglia +Petrain +Petrak +Petrakis +Petralba +Petralia +Petramale +Petrarca +Petras +Petrash +Petrauskas +Petre +Petrea +Petrecca +Petree +Petrella +Petrelli +Petrello +Petretti +Petrey +Petri +Petric +Petriccione +Petrich +Petrick +Petricka +Petricone +Petrides +Petrie +Petriello +Petrik +Petrilla +Petrilli +Petrillo +Petrillose +Petrin +Petrina +Petrini +Petrino +Petris +Petrizzo +Petro +Petrocco +Petrocelli +Petrochello +Petroff +Petron +Petrone +Petronella +Petronio +Petronis +Petronzio +Petropoulos +Petropulos +Petros +Petrosino +Petroske +Petroski +Petrosky +Petross +Petrossian +Petrosyan +Petrouits +Petrov +Petrovic +Petrovich +Petrovits +Petrowski +Petrson +Petru +Petruccelli +Petrucci +Petrucco +Petrucelli +Petrulis +Petrullo +Petrunger +Petrus +Petruska +Petrusky +Petruso +Petruzzelli +Petruzzi +Petry +Petsch +Petsche +Pett +Petta +Pettas +Pettaway +Pettay +Pettengill +Petter +Petters +Pettersen +Petterson +Pettersson +Pettes +Pettet +Pettett +Petteway +Pettey +Petti +Pettibon +Pettibone +Petticrew +Pettie +Petties +Pettiford +Pettigrew +Pettigrove +Pettijohn +Pettinato +Pettine +Pettinella +Pettinelli +Pettinger +Pettingill +Pettipas +Pettis +Pettit +Pettitt +Pettiway +Pettner +Petton +Pettrey +Pettry +Petts +Pettus +Pettway +Petty +Pettyjohn +Petula +Petway +Petz +Petzel +Petzold +Petzoldt +Peugh +Pevahouse +Pevehouse +Peveler +Peverini +Peveto +Pevey +Pevez +Pevsner +Pevy +Pew +Pewitt +Pewo +Pexsa +Pexton +Peyatt +Peyer +Peyre +Peyser +Peyton +Pezez +Pezina +Pezley +Pezzano +Pezzetti +Pezzica +Pezzimenti +Pezzullo +Pezzulo +Pezzuti +Pezzuto +Pfaff +Pfaffinger +Pfahl +Pfahler +Pfahlert +Pfalmer +Pfalzgraf +Pfander +Pfannenstein +Pfannenstiel +Pfanstiel +Pfarr +Pfau +Pfautz +Pfeffer +Pfefferkorn +Pfefferle +Pfeifer +Pfeiff +Pfeiffenberge +Pfeiffer +Pfeifle +Pfeil +Pfeister +Pfendler +Pfenning +Pfeuffer +Pfieffer +Pfifer +Pfingsten +Pfirsch +Pfister +Pfisterer +Pflanz +Pfleger +Pfleider +Pfleiderer +Pfleuger +Pflieger +Pfliger +Pflueger +Pflug +Pfluger +Pflugh +Pflughoeft +Pflugrad +Pflugradt +Pflum +Pfnister +Pfohl +Pforr +Pfost +Pfotenhauer +Pfoutz +Pfrogner +Pfrommer +Pfuhl +Pfund +Pfundt +Phagan +Phair +Phalen +Pham +Phan +Phanco +Phaneuf +Phang +Phann +Phanor +Phanord +Phanthanouvon +Phanthauong +Phanthavongsa +Pharao +Phare +Pharel +Phares +Pharis +Phariss +Pharmer +Pharmes +Pharo +Pharr +Pharris +Phatdouang +Phaup +Phay +Phaymany +Phearsdorf +Pheasant +Phebus +Phegley +Phelan +Phelka +Phelp +Phelps +Phelts +Phenes +Phenix +Pheonix +Pherguson +Pherigo +Phernetton +Pherson +Phetphongsy +Phetsanghane +Phetteplace +Phi +Phibbs +Phifer +Philabaum +Philavanh +Philavong +Philbeck +Philben +Philbert +Philbin +Philbrick +Philbrook +Phildor +Philen +Philhower +Philibert +Philio +Philip +Philipose +Philipp +Philippe +Philippi +Philippon +Philipps +Philips +Philipson +Philley +Phillians +Philliber +Phillies +Phillip +Phillipi +Phillippe +Phillippi +Phillippy +Phillips +Phillipson +Phillis +Phillps +Philman +Philmon +Philmore +Philo +Philogene +Philp +Philpot +Philpott +Philpotts +Philps +Philson +Philyaw +Phimpradapsy +Phimsoutham +Phinazee +Phinisee +Phinney +Phippard +Phippen +Phippin +Phipps +Phlegm +Phlieger +Pho +Phoenix +Phoeuk +Phom +Phommajack +Phommaseng +Phommatheth +Phomphithak +Phomsoukha +Phong +Phonharath +Phorng +Phothirath +Phou +Phoubandith +Phoun +Phramany +Phu +Phuaphes +Phuma +Phung +Phuong +Phurrough +Phy +Phyfe +Phyfiher +Pi +Pia +Piacente +Piacenza +Piacitelli +Piacquadio +Pian +Pianalto +Pianka +Piano +Piantanida +Piao +Piascik +Piasecki +Piatak +Piatek +Piatkowski +Piatt +Piatz +Piazza +Pica +Picado +Picard +Picardi +Picardo +Picarello +Picariello +Picaro +Picart +Picasso +Picazo +Piccard +Picchetti +Picchi +Picciano +Piccillo +Piccinich +Piccinini +Piccinone +Piccione +Piccioni +Piccirilli +Piccirillo +Picciuto +Picco +Piccola +Piccoli +Piccolo +Piccolomini +Piccone +Piccuillo +Piceno +Picerni +Picerno +Picetti +Pich +Picha +Pichard +Pichardo +Piche +Picher +Pichette +Pichler +Pichoff +Pichon +Picht +Picini +Pick +Pickar +Pickard +Pickel +Pickell +Pickelsimer +Picken +Pickenpaugh +Pickens +Picker +Pickerel +Pickerell +Pickerill +Pickering +Pickersgill +Pickert +Picket +Picketpin +Pickett +Pickette +Picketts +Pickford +Pickhardt +Picking +Pickings +Pickl +Pickle +Pickler +Pickles +Picklesimer +Pickman +Picknell +Pickney +Pickrel +Pickrell +Pickren +Pickron +Pickup +Pico +Picolet +Picon +Picone +Picot +Picotte +Picou +Picozzi +Picquet +Picton +Picucci +Pidcock +Pidgeon +Pidro +Piearcy +Piech +Piechocki +Piechoski +Piechota +Piechowski +Piecuch +Pieczynski +Piede +Piedigrossi +Piedmont +Piedra +Piedrahita +Piefer +Pieffer +Piegaro +Piehl +Piehler +Piek +Piekarski +Piekos +Piel +Piela +Pieloch +Pielow +Piening +Pienta +Pientka +Piepenbrink +Piepenburg +Pieper +Piepho +Pier +Pierannunzio +Pieratt +Pierce +Pierceall +Piercefield +Piercey +Piercy +Pierdon +Piere +Pieretti +Pierfax +Pieri +Pierini +Piermarini +Piermatteo +Piermont +Pieroni +Pierotti +Pierpoint +Pierpont +Pierre +Pierri +Pierrie +Pierro +Pierron +Pierrot +Pierrott +Piersall +Piersaul +Piersiak +Piersol +Pierson +Piertraccini +Pierzchala +Pies +Piesco +Pieters +Pietig +Pietila +Pietrafesa +Pietras +Pietrini +Pietrok +Pietropaolo +Pietrowicz +Pietrowski +Pietryga +Pietrzak +Pietrzyk +Pietrzykowski +Pietsch +Pietschman +Piette +Piety +Pietz +Pietzsch +Pifer +Piganelli +Pigao +Pigat +Pigeon +Pigford +Pigg +Piggee +Piggie +Piggott +Piggs +Pigler +Pigman +Pigna +Pignataro +Pignatelli +Pignatello +Pignone +Pignotti +Pigott +Pigram +Pigue +Piguet +Pih +Pihl +Pihlaja +Piirto +Pijanowski +Pike +Piker +Pikes +Pikey +Pikkarainen +Pikul +Pikula +Pikus +Pila +Pilakowski +Piland +Pilant +Pilapil +Pilar +Pilarski +Pilarz +Pilat +Pilati +Pilato +Pilbin +Pilch +Pilcher +Pilchowski +Pile +Pileggi +Piles +Pilette +Pilger +Pilgreen +Pilgrim +Pili +Piliero +Pilkenton +Pilkerton +Pilkey +Pilkington +Pilkins +Pilkinton +Pill +Pilla +Pillado +Pillai +Pillar +Pillard +Pillarella +Pille +Piller +Pillers +Pillette +Pilley +Pilling +Pillion +Pillips +Pillitteri +Pillo +Pillon +Pillot +Pilloud +Pillow +Pillsbury +Pilon +Pilot +Pilotte +Pilotti +Pilsner +Pilson +Piltz +Piluso +Pilz +Pim +Pimenta +Pimental +Pimentel +Pimpare +Pimple +Pin +Pina +Pinal +Pinales +Pinard +Pinault +Pinc +Pince +Pinch +Pinchback +Pinchbeck +Pinchock +Pinchon +Pinciaro +Pincince +Pinckard +Pinckley +Pinckney +Pincock +Pincus +Pindell +Pinder +Pine +Pineau +Pineault +Pineda +Pinedo +Pinegar +Pineiro +Pinela +Pinell +Pinelli +Pinello +Pinelo +Pinena +Pineo +Piner +Pinera +Pinero +Pines +Pinet +Pinette +Ping +Pingel +Pinger +Pingitore +Pingleton +Pingree +Pingrey +Pinheiro +Pini +Pinick +Pinilla +Pinion +Pink +Pinkard +Pinke +Pinkelton +Pinkenburg +Pinkerman +Pinkert +Pinkerton +Pinkett +Pinkey +Pinkham +Pinkins +Pinkleton +Pinkley +Pinkney +Pinkos +Pinkowski +Pinks +Pinkstaff +Pinkston +Pinkton +Pinley +Pinn +Pinna +Pinnell +Pinneo +Pinner +Pinnette +Pinney +Pinnick +Pinnix +Pinnock +Pinnow +Pinnt +Pino +Pinon +Pinski +Pinsky +Pinson +Pinsoneault +Pinsonnault +Pinsonneault +Pinta +Pintado +Pintar +Pintea +Pintello +Pinter +Pinto +Pintor +Pintos +Pinuelas +Pinyan +Pinzino +Pinzon +Pinzone +Pio +Pioche +Pioli +Piombino +Pion +Piontek +Piontkowski +Piorkowski +Pioske +Piotrowski +Pipe +Piper +Pipes +Pipher +Pipho +Pipia +Pipilas +Pipkin +Pipkins +Pippen +Pippenger +Pippens +Pipper +Pippert +Pippin +Pippins +Pippitt +Pique +Piquette +Piraino +Pirc +Pires +Pirie +Pirieda +Pirillo +Pirkey +Pirkl +Pirkle +Pirman +Pirner +Pirnie +Piro +Pirog +Pirolli +Pirollo +Pirone +Piros +Piroso +Pirozhkov +Pirre +Pirrello +Pirro +Pirrone +Pirrotta +Pirtle +Pisani +Pisano +Pisarski +Pischke +Pisciotta +Pisciotti +Piscitelli +Piscitello +Pisco +Piscopo +Pisegna +Piselli +Piserchio +Pisha +Pishko +Pishner +Pisicchio +Piske +Piskel +Piskura +Pistelli +Pistilli +Pistole +Pistone +Pistoresi +Pistorius +Pistulka +Pisula +Piszczatowski +Piszczek +Pita +Pitaniello +Pitarresi +Pitassi +Pitcairn +Pitcak +Pitcavage +Pitch +Pitcher +Pitcherello +Pitchford +Pitcock +Pitek +Pitel +Pitfield +Pithan +Pitka +Pitkin +Pitman +Pitmon +Pitner +Pitney +Pitocco +Pitonyak +Pitorak +Pitpitan +Pitre +Pitruzzello +Pitsch +Pitsenbarger +Pitstick +Pitt +Pitta +Pittard +Pittari +Pittelkow +Pittenger +Pitter +Pittillo +Pittinger +Pittman +Pittmann +Pittmon +Pittner +Pitts +Pittsenbarger +Pittsinger +Pittsley +Pituch +Pitz +Pitzen +Pitzer +Piurkowski +Pius +Pivec +Pivin +Piwetz +Piwowar +Pixler +Pixley +Pizana +Pizani +Pizano +Pizarro +Pizer +Pizira +Pizur +Pizza +Pizzano +Pizzaro +Pizzella +Pizzi +Pizzico +Pizzini +Pizzino +Pizzitola +Pizzo +Pizzola +Pizzolato +Pizzulo +Pizzuti +Pizzuto +Pjetrovic +Plaas +Place +Placek +Placencia +Placencio +Placeres +Placha +Plachecki +Placide +Placido +Placino +Plack +Placke +Placker +Plackett +Placko +Placzek +Pladson +Plageman +Plagens +Plagge +Plagman +Plagmann +Plahs +Plain +Plainy +Plair +Plaisance +Plaisted +Plake +Plakke +Plambeck +Plamer +Plamondin +Plamondon +Plan +Plana +Planagan +Planas +Plancarte +Plance +Planck +Plane +Planer +Plank +Plankey +Plansinis +Plant +Plante +Plantenberg +Plantenga +Plantier +Plants +Planty +Plantz +Plascencia +Plasencia +Plaskett +Plasky +Plass +Plasse +Plassman +Plassmann +Plassmeyer +Plaster +Plastow +Plata +Platania +Platas +Plate +Platek +Platenburg +Plater +Platero +Plateros +Plateroti +Plath +Plathe +Platko +Platner +Plato +Platt +Platte +Platten +Platter +Plattner +Platts +Plattsmier +Platz +Platzer +Plauche +Plaugher +Plaut +Plautz +Plavnik +Plaxco +Plaxico +Player +Playford +Playl +Playle +Plaza +Plazza +Pleas +Pleasant +Pleasanton +Pleasants +Pleasent +Pleasure +Pleau +Plecker +Pledger +Pleet +Plegge +Pleil +Pleiman +Pleiss +Pleitez +Plemel +Plemmons +Plemons +Plenskofski +Plenty +Pleppo +Plesant +Plescia +Plese +Plesha +Pleshe +Pleskac +Plesnarski +Pless +Plessinger +Plessis +Plessner +Pletcher +Pletsch +Plett +Pletz +Pleva +Plevin +Plew +Plewa +Plewinski +Plexico +Pliego +Plienis +Plikerd +Pliler +Pliml +Plimpton +Pline +Pliner +Pliska +Plitt +Plocek +Ploch +Plocher +Plocica +Plock +Ploeger +Ploennigs +Ploense +Ploetz +Plohr +Plomma +Plona +Plonka +Ploof +Plosker +Ploskunak +Ploss +Ploszaj +Plotkin +Plotner +Plotnik +Plotrowski +Plott +Plotts +Plotz +Plotzker +Ploude +Plouffe +Plough +Plourd +Plourde +Plover +Plowden +Plowe +Plowman +Pluck +Plude +Plue +Plueger +Pluemer +Plues +Pluff +Pluhar +Pluid +Plum +Pluma +Plumadore +Plumb +Plumbar +Plumber +Plume +Plumer +Plumlee +Plumley +Plummer +Plump +Plumpton +Plungy +Plunk +Plunket +Plunkett +Plush +Pluta +Plutt +Pluviose +Pluvoise +Pluym +Ply +Plyer +Plyler +Plymale +Plymel +Plymire +Plympton +Plys +Pniewski +Po +Poag +Poage +Poague +Poaipuni +Poalino +Poarch +Poat +Pobanz +Poblete +Pobre +Pocai +Pocasangre +Pocchia +Pocekay +Poch +Pochatko +Poche +Pochiba +Pochintesta +Pociask +Pociengel +Pocius +Pock +Pockette +Pocklington +Pockrus +Pocock +Poczobut +Pod +Podany +Podaras +Podbielski +Pode +Podell +Podesta +Podeszwa +Podewils +Podgurski +Podkowka +Podlas +Podmore +Podolak +Podolsky +Podrasky +Podratz +Podraza +Podsiad +Poduska +Podvin +Podwoski +Pody +Poe +Poehlein +Poehler +Poehlman +Poeling +Poellinetz +Poellnitz +Poellot +Poelman +Poeppel +Poeppelman +Poepping +Poepplein +Poer +Poertner +Poeschel +Poeschl +Poet +Poetker +Poette +Poetter +Poetzsch +Pofahl +Poff +Poffenberger +Poffenroth +Pogar +Poggi +Poggio +Pogorelc +Pogozelski +Pogue +Pohl +Pohler +Pohlman +Pohlmann +Pohlson +Pohorilla +Poindexter +Poinelli +Poinsett +Poinsette +Poinson +Point +Pointdexter +Pointe +Pointer +Pointon +Points +Poire +Poirer +Poirier +Poirot +Poirrier +Poisel +Poissant +Poisso +Poisson +Poissonnier +Poister +Poiter +Poitevin +Poitevint +Poitier +Poitra +Poitras +Pok +Pokallas +Poke +Pokoj +Pokora +Pokorney +Pokorny +Pokorski +Pokrzywa +Pokswinski +Pol +Pola +Polacco +Polacek +Polachek +Polack +Polaco +Poladian +Polak +Polakis +Polakoff +Polakowski +Polan +Polanco +Poland +Polanski +Polansky +Polasek +Polashek +Polaski +Polasky +Polchinski +Polcovich +Polcyn +Polczynski +Poldrack +Pole +Poledore +Polee +Polek +Polemeni +Polen +Polera +Poles +Poletski +Poletti +Poley +Poleyestewa +Polfer +Polhamus +Polhemus +Polhill +Poli +Polian +Policar +Policare +Policastri +Policastro +Police +Polich +Policicchio +Policz +Polidore +Polidori +Polidoro +Polikoff +Poliks +Polimeni +Polin +Poling +Polino +Polinski +Polinsky +Polintan +Polio +Poliquin +Polisky +Polisoto +Polit +Politano +Polite +Politi +Politis +Polito +Politowski +Politte +Politz +Polivick +Polivka +Polizio +Polizzi +Poljak +Polk +Polka +Polkinghorn +Poll +Pollacco +Pollack +Pollak +Pollan +Polland +Pollara +Pollard +Pollaro +Pollart +Polle +Pollen +Pollet +Pollett +Polley +Pollica +Pollick +Pollina +Pollinger +Pollins +Pollio +Pollitt +Pollman +Pollmann +Pollnow +Pollo +Pollock +Pollok +Pollom +Pollot +Pollutro +Polly +Polnau +Polo +Poloskey +Polosky +Polovoy +Polowy +Polselli +Polsgrove +Polski +Polsky +Polson +Polster +Polston +Polter +Polton +Poltorak +Poltrock +Polucha +Polumbo +Polverari +Polvino +Polyak +Polycarpe +Polynice +Polzer +Polzin +Poma +Pomainville +Pomales +Pomar +Pomares +Pomarico +Pomberg +Pombo +Pomella +Pomerance +Pomerantz +Pomeranz +Pomerleau +Pomeroy +Pomfret +Pomiecko +Pomilla +Pommer +Pommier +Pomo +Pompa +Pompei +Pompey +Pompi +Pompilio +Pomplun +Pomponi +Pomponio +Pomposo +Pomrenke +Pomroy +Pomykala +Pon +Ponce +Poncedeleon +Poncho +Ponciano +Poncio +Pond +Ponder +Pondexter +Ponds +Pone +Ponessa +Pong +Pongkhamsing +Poniatoski +Poniatowski +Pono +Pons +Ponsler +Pont +Pontarelli +Pontbriand +Ponte +Ponter +Pontes +Ponti +Pontiff +Pontillo +Pontin +Ponting +Pontious +Pontius +Ponto +Ponton +Pontonio +Pontoriero +Pontremoli +Ponyah +Ponzi +Ponzio +Ponzo +Poock +Pool +Poole +Pooler +Pooley +Poolheco +Poon +Pooni +Poor +Poore +Poorman +Poormon +Poort +Poorte +Poortinga +Pooschke +Pooser +Poot +Poovey +Pooyouma +Pop +Popa +Popadiuk +Popat +Pope +Popec +Popejoy +Popek +Popelka +Poper +Popescu +Popham +Popi +Popichak +Popick +Popiel +Popielarczyk +Popik +Popiolek +Popke +Popken +Popkin +Poplar +Poplaski +Poplawski +Poplin +Popoca +Popoff +Popovec +Popovic +Popovich +Popovitch +Popowski +Popp +Poppe +Poppel +Poppell +Poppema +Poppen +Poppenhagen +Popper +Poppert +Popple +Poppleton +Popplewell +Poppo +Popularis +Popwell +Poque +Poquette +Pora +Porada +Porat +Porath +Porcaro +Porcelli +Porcello +Porch +Porche +Porcher +Porchia +Porco +Pore +Poreda +Poree +Porell +Poremba +Poremski +Porep +Porietis +Poro +Porowski +Porras +Porraz +Porrazzo +Porreca +Porrello +Porres +Porrini +Porris +Porritt +Porro +Porst +Port +Porta +Portal +Portalatin +Portales +Portaro +Porte +Portee +Portela +Portell +Portello +Porten +Porteous +Porter +Portera +Porterfield +Portes +Porteus +Porth +Portie +Portier +Portilla +Portillo +Portis +Portland +Portley +Portlock +Portman +Portner +Portney +Portnoff +Portnoy +Porto +Portolese +Portor +Portrum +Ports +Portsche +Portugal +Portune +Portuondo +Portwine +Portwood +Portz +Porzio +Posa +Posada +Posadas +Posas +Posch +Posen +Poser +Posey +Posik +Posis +Poska +Poskey +Poskitt +Poskus +Posley +Posner +Posnick +Pospicil +Pospishil +Pospisil +Poss +Posse +Possehl +Possick +Possinger +Posso +Posson +Post +Postal +Postel +Postell +Postema +Postemski +Posten +Poster +Postert +Posthuma +Posthumus +Postier +Postiglione +Postin +Postle +Postles +Postlethwait +Postlethwaite +Postlewait +Postlewaite +Postley +Postma +Posto +Poston +Postuci +Posusta +Potaczala +Potanovic +Potash +Pote +Poteat +Poteet +Poteete +Potempa +Potenza +Poter +Potes +Potestio +Poth +Pothier +Pothoven +Poths +Potier +Poties +Poto +Potocki +Potocnik +Potolsky +Potra +Potratz +Potsander +Pott +Pottebaum +Potteiger +Pottenger +Potter +Potters +Potterson +Potthast +Potthoff +Pottichen +Pottier +Pottinger +Pottkotter +Pottle +Pottorf +Pottorff +Potts +Potucek +Potulski +Potvin +Pou +Pouch +Pouche +Poucher +Poudrier +Pouge +Pough +Pouk +Poulet +Poulin +Pouliot +Pouliotte +Poulisse +Poullard +Poullion +Poulos +Poulsen +Poulson +Poulter +Poulton +Pouncey +Pouncil +Pouncy +Pound +Pounder +Pounders +Pounds +Poundstone +Poupard +Pour +Pourchot +Pourier +Pourner +Pourvase +Pousson +Poutre +Poux +Pov +Povey +Powal +Powanda +Powderly +Powe +Powel +Powell +Powells +Powelson +Power +Powers +Powis +Powledge +Powlen +Powles +Powless +Powley +Pownall +Pownell +Powroznik +Powsey +Powskey +Poxon +Poydras +Poyer +Poyneer +Poyner +Poynor +Poynter +Poynton +Poyser +Poythress +Pozar +Pozniak +Pozo +Pozos +Pozzi +Pozzo +Pozzobon +Pozzuoli +Prabel +Prabhakar +Prabhakaran +Prach +Pracht +Prada +Pradel +Prader +Pradhan +Pradier +Prado +Prag +Prager +Prahl +Prahm +Praino +Prairie +Prak +Prakash +Prakoth +Praley +Prall +Pralle +Praml +Pramuk +Prang +Prange +Pranger +Prante +Prasad +Prasek +Prashad +Praska +Prasomsack +Prass +Prasser +Prast +Prat +Prata +Pratcher +Prately +Prater +Prather +Prati +Pratico +Pratillo +Pratka +Pratley +Prato +Prator +Prats +Pratt +Pratte +Prattella +Pratten +Prattis +Pratts +Prauner +Prause +Pravata +Prawdzik +Prawl +Pray +Prayer +Praylow +Praytor +Prazak +Prazenica +Prazeres +Prazma +Prchal +Prchlik +Preas +Preast +Preato +Prebish +Preble +Precella +Precht +Prechtel +Prechtl +Preciado +Precise +Precissi +Precourt +Precythe +Preda +Preddy +Predmore +Predom +Predovich +Pree +Preece +Preedom +Preer +Prefontaine +Pregeant +Pregler +Preheim +Prehm +Prehn +Prehoda +Preis +Preisach +Preisel +Preisendorf +Preisinger +Preisler +Preisner +Preiss +Preisser +Preissler +Preissner +Preist +Preister +Preite +Prejean +Prejsnar +Prekker +Preli +Prell +Prellwitz +Prem +Premeaux +Premer +Premo +Prenatt +Prence +Prendergast +Prendes +Prenger +Prentice +Prentis +Prentiss +Prepotente +Presa +Presas +Presby +Prescod +Prescott +Preseren +Presgraves +Presha +Presho +Presiado +President +Preskar +Preskitt +Preslar +Presler +Presley +Preslipsky +Presnal +Presnall +Presnar +Presnell +Press +Pressel +Presser +Pressey +Pressimone +Pressler +Pressley +Pressly +Pressman +Pressnell +Presson +Presswood +Prest +Presta +Prestage +Prester +Presti +Prestia +Prestidge +Prestino +Prestipino +Prestley +Presto +Preston +Prestridge +Prestwich +Prestwood +Presume +Presutti +Prete +Preti +Pretlow +Pretti +Prettner +Pretty +Prettyman +Prety +Pretzel +Pretzer +Preuett +Preuitt +Preus +Preuss +Preusser +Prevatt +Prevatte +Prevento +Prevet +Prevett +Prevette +Previte +Prevo +Prevost +Prevot +Prewer +Prewett +Prewitt +Prey +Preyer +Preyor +Prez +Preza +Preziosi +Prezioso +Prezzia +Prial +Pribbeno +Pribbenow +Pribble +Pribish +Prible +Pribnow +Pribyl +Price +Pricer +Prich +Prichard +Prichett +Prickett +Priddy +Pride +Prideaux +Pridemore +Pridgen +Pridgeon +Pridgett +Pridham +Pridmore +Priebe +Priefert +Priegnitz +Priego +Priem +Prier +Pries +Priesmeyer +Priess +Priest +Priester +Priestley +Priestly +Prieto +Prieur +Priewe +Prigg +Prigge +Prigmore +Prill +Prillaman +Prim +Prima +Primack +Primas +Primavera +Prime +Primeau +Primeaux +Primer +Primes +Primiano +Primm +Primmer +Primo +Primos +Primozich +Primrose +Primus +Prince +Princevalle +Princiotta +Principato +Principe +Prindall +Prindiville +Prindle +Prine +Pring +Pringle +Prinkey +Prinkleton +Prinn +Prins +Printers +Printup +Printy +Printz +Prinz +Prinzi +Prinzing +Prinzivalli +Priode +Priolean +Prioleau +Prioletti +Priolo +Prior +Priore +Prisbrey +Prisco +Prisk +Prisoc +Prisock +Pritchard +Pritchell +Pritcher +Pritchet +Pritchett +Pritt +Pritts +Pritz +Pritzel +Pritzker +Privado +Privalsky +Privateer +Privatsky +Prive +Privett +Privette +Privitera +Privott +Prizio +Prizzi +Pro +Proa +Proano +Probasco +Probert +Probst +Probus +Proby +Procaccini +Procaccino +Procell +Proch +Prochak +Prochaska +Prochazka +Prochnow +Prociuk +Prock +Procknow +Proco +Procopio +Procsal +Procter +Proctor +Prodan +Prodoehl +Proehl +Proenza +Proescher +Profancik +Profera +Profeta +Proffer +Proffit +Proffitt +Profit +Profitt +Progacz +Progl +Prohaska +Prohonic +Proia +Proietto +Prok +Prokes +Prokop +Prokos +Proksch +Prokup +Prom +Promer +Promisco +Promise +Prondzinski +Pronk +Pronovost +Pronto +Proo +Proper +Propes +Prophet +Prophete +Propheter +Prophett +Prophit +Propp +Propper +Propps +Propst +Prosak +Prosch +Proscia +Prose +Prosenick +Prosienski +Prosise +Prosonic +Prospal +Prosper +Prosperi +Prosperie +Prospero +Pross +Prosser +Prost +Protain +Protano +Protas +Protasewich +Prothero +Prothro +Protich +Protin +Proto +Protsman +Prottsman +Protz +Protzman +Proud +Proudfoot +Proue +Proulx +Prouse +Prout +Prouty +Provance +Provazek +Proveaux +Provencal +Provence +Provencher +Provencio +Provent +Provenza +Provenzano +Provenzo +Providence +Province +Provine +Provines +Provino +Provins +Provis +Provitt +Provo +Provorse +Provost +Provosty +Provow +Prow +Prowant +Prowell +Prows +Prowse +Prucha +Pruchnik +Prucnal +Prudden +Prude +Pruden +Prudencio +Prudent +Prudente +Prudhomme +Prudom +Prue +Pruess +Pruessner +Prueter +Pruett +Pruette +Prugh +Pruiett +Pruit +Pruitt +Prukop +Prum +Pruna +Pruneau +Pruneda +Pruner +Prunier +Prunty +Prus +Prusak +Pruse +Prusha +Prusinski +Pruskowski +Pruss +Prust +Pruter +Prutt +Prutzman +Pruyn +Pruyne +Pruzansky +Prvitt +Pry +Prybylski +Pryce +Pryde +Prye +Pryer +Pryor +Prys +Prysock +Pryzgoda +Przedwiecki +Przekop +Przeniczny +Przepiora +Przewozman +Przybycien +Przybyl +Przybyla +Przybylski +Przybysz +Przybyszewski +Przygocki +Psencik +Psilovikos +Psomiades +Psuik +Psuty +Ptacek +Ptak +Ptaschinski +Ptaszynski +Ptomey +Pu +Pua +Public +Puc +Puca +Puccetti +Pucci +Puccia +Pucciarelli +Puccinelli +Puccini +Puccio +Pucella +Puchalla +Puchalski +Pucillo +Pucio +Pucker +Pucket +Puckett +Puckhaber +Puddephatt +Puddy +Pudenz +Pudlinski +Puebla +Puehler +Puello +Puelo +Puent +Puente +Puentes +Puerta +Puertas +Puerto +Puesey +Puett +Puetz +Puff +Puffenbarger +Puffenberger +Puffer +Puffett +Puffinberger +Puffinburger +Puga +Pugeda +Pugel +Pugh +Puglia +Pugliares +Pugliese +Puglisi +Pugmire +Pugsley +Puhala +Puhl +Puhr +Puhrman +Puhuyaoma +Puiatti +Puidokas +Puig +Puita +Pujals +Pujia +Pujol +Pujols +Pulanco +Pulaski +Pulcher +Puleio +Puleo +Pulera +Puletasi +Pulfer +Pulford +Pulfrey +Pulgarin +Pulham +Puliafico +Pulice +Pulido +Pulis +Pulizzi +Pulk +Pulkkinen +Pulkrabek +Pullam +Pullan +Pullano +Pullar +Pullara +Pullem +Pullen +Pullens +Puller +Pulley +Pulliam +Pullian +Pullie +Pullin +Pulling +Pullings +Pullins +Pullis +Pullman +Pullom +Pullon +Pullum +Pullus +Pully +Pulos +Puls +Pulse +Pulsifer +Pulte +Pultorak +Pults +Pultz +Pulver +Pulvermacher +Pulwer +Puma +Pumarejo +Pummel +Pummell +Pummill +Pump +Pumper +Pumphery +Pumphrey +Pun +Puna +Punch +Punches +Pundsack +Pundt +Pung +Punihaole +Punja +Punt +Punter +Puntillo +Punzo +Puorto +Puotinen +Pupa +Pupo +Puppe +Puppo +Puraty +Purce +Purcell +Purcella +Purchase +Purdie +Purdin +Purdom +Purdon +Purdue +Purdum +Purdy +Purfeerst +Purgason +Puri +Purifoy +Purington +Purinton +Purkerson +Purkett +Purkey +Purkhiser +Purkiss +Purl +Purnell +Purol +Purple +Purpora +Purpura +Purrington +Pursel +Pursell +Purser +Pursifull +Pursley +Purslow +Purswell +Purtee +Purtell +Purter +Purtill +Purtle +Purtlebaugh +Purugganan +Purves +Purviance +Purvines +Purvis +Purwin +Puryear +Purzycki +Pusateri +Pusch +Pusey +Push +Pushard +Pushaw +Pushcar +Puskar +Puskarich +Puskas +Pusser +Pust +Putalavage +Putaski +Putcha +Puterbaugh +Puthiyamadam +Puthoff +Putman +Putnal +Putnam +Putney +Putt +Putton +Putty +Putz +Putzel +Putzer +Putzier +Puulei +Puyear +Puz +Puzinski +Puzio +Puzo +Puzon +Py +Pyanowski +Pyatt +Pyburn +Pybus +Pych +Pychardo +Pye +Pyeatt +Pyer +Pyette +Pyfer +Pyfrom +Pyke +Pyland +Pylant +Pyle +Pyles +Pylvainen +Pyne +Pynes +Pyo +Pyon +Pyper +Pyrdum +Pyron +Pyros +Pyscher +Pysher +Pytel +Pytko +Pytlewski +Pytlovany +Pyun +Pywell +Qadeer +Qadir +Qare +Qasba +Qazi +Qian +Qin +Qiu +Qua +Quaas +Quach +Quackenbush +Quade +Quader +Quadnau +Quagliano +Quagliato +Quaglieri +Quaid +Quaife +Quail +Quaile +Quails +Quain +Quaintance +Quakenbush +Quaker +Quale +Qualey +Qualheim +Qualia +Quall +Qualle +Qualls +Quam +Quamme +Quammen +Quan +Quance +Quandel +Quander +Quandt +Quang +Quann +Quanstrum +Quant +Quante +Quaranta +Quaranto +Quaresma +Quarles +Quarnstrom +Quarrell +Quarry +Quartararo +Quartaro +Quarterman +Quartieri +Quartiero +Quarto +Quartucci +Quartuccio +Quasdorf +Quashie +Quashnock +Quast +Quastad +Quates +Quatraro +Quatrevingt +Quattlebaum +Quattrini +Quattro +Quattrocchi +Quattrone +Quave +Quay +Quaye +Quayle +Queal +Quealy +Quear +Quebedeaux +Quebral +Queeley +Queen +Queenan +Queener +Queja +Quelch +Quelette +Quella +Queller +Quellette +Quencer +Quenneville +Quent +Quenzel +Quenzer +Quercia +Quercioli +Quereto +Querido +Querio +Quero +Queros +Querry +Querta +Quertermous +Query +Quesada +Quesenberry +Quesinberry +Quesnel +Quesnell +Quest +Quettant +Quevedo +Quezad +Quezada +Quezaire +Quezergue +Quiambao +Quibodeaux +Quicho +Quick +Quickel +Quickle +Quicksall +Quicksey +Quidas +Quider +Quidley +Quiel +Quiet +Quiett +Quigg +Quiggle +Quigley +Quihuiz +Quijada +Quijano +Quijas +Quilantang +Quiles +Quilici +Quilimaco +Quilindrino +Quill +Quillan +Quillen +Quillens +Quiller +Quilliam +Quilliams +Quillian +Quillin +Quilling +Quillman +Quilter +Quilty +Quimby +Quimet +Quin +Quinalty +Quinby +Quince +Quincel +Quincey +Quinchia +Quinci +Quincy +Quine +Quinerly +Quink +Quinlan +Quinley +Quinlin +Quinlisk +Quinlivan +Quinn +Quinnan +Quinnett +Quinney +Quinnie +Quinoes +Quinones +Quinonez +Quint +Quintal +Quintana +Quintanar +Quintania +Quintanilla +Quintano +Quintard +Quintas +Quintel +Quintela +Quinter +Quintero +Quinteros +Quintin +Quinto +Quinton +Quintona +Quintyne +Quinzi +Quiralte +Quiram +Quirarte +Quire +Quirin +Quirindongo +Quiring +Quirino +Quirion +Quirk +Quirke +Quiroga +Quiros +Quiroz +Quisenberry +Quispe +Quist +Quitedo +Quiterio +Quitero +Quito +Quitter +Quittner +Quitugua +Quituqua +Quiver +Quivers +Quivoz +Quizon +Qunnarath +Quon +Quoss +Quraishi +Qureshi +Ra +Raab +Raabe +Raad +Raap +Raasch +Raatz +Rabadan +Rabago +Rabal +Rabalais +Rabara +Rabasca +Rabassa +Rabb +Rabbe +Rabbitt +Rabe +Rabeck +Rabehl +Rabel +Rabell +Rabello +Rabelo +Rabena +Rabeneck +Rabenhorst +Rabenold +Rabenstein +Raber +Rabern +Rabey +Rabideau +Rabidoux +Rabil +Rabin +Rabine +Rabinovich +Rabinowitz +Rabito +Rabjohn +Rabkin +Rabner +Raboin +Rabold +Rabon +Raborn +Rabren +Rabsatt +Rabuck +Rabun +Raburn +Rabuse +Raby +Racanelli +Racanello +Racano +Racca +Race +Racedo +Racer +Racette +Racey +Rach +Rachal +Rachar +Rachel +Rachell +Rachels +Rachi +Rachlin +Racicot +Racilis +Racina +Racine +Racioppi +Racioppo +Racitano +Raciti +Rack +Rackers +Rackett +Rackham +Racki +Rackley +Rackliffe +Racko +Rackow +Raco +Racz +Raczak +Raczka +Raczkowski +Raczynski +Rad +Rada +Radabaugh +Radaker +Radakovich +Radar +Radatz +Radcliff +Radcliffe +Raddatz +Radde +Radden +Radder +Raddle +Rade +Radebaugh +Radecki +Radej +Radeke +Radel +Radell +Rademacher +Rademaker +Rademan +Raden +Rader +Raderstorf +Radford +Radican +Radice +Radich +Radick +Radics +Radie +Radigan +Radilla +Radin +Radish +Radisovich +Radke +Radle +Radler +Radley +Radlinski +Radloff +Radmacher +Radmall +Radman +Radney +Rado +Radom +Radomski +Radon +Radona +Rados +Radosevich +Radoslovich +Radovich +Radsek +Radsky +Radtke +Raducha +Radue +Raduenz +Radulescu +Radune +Radunz +Radvany +Radwan +Radwanski +Radway +Radwick +Rady +Radzavich +Radziewicz +Radziwon +Rae +Raebel +Raeder +Raef +Raehl +Rael +Raelson +Raemer +Raes +Raeside +Raether +Raethke +Raetz +Rafael +Rafail +Rafala +Rafalko +Rafalski +Rafanan +Rafaniello +Rafel +Rafey +Raff +Raffa +Raffaele +Rafferty +Raffety +Raffield +Raffo +Raffone +Rafi +Rafidi +Rafiq +Rafla +Rafter +Raftery +Rafus +Rafuse +Ragain +Ragains +Ragan +Ragans +Ragar +Ragas +Ragasa +Ragazzo +Ragel +Rager +Raggio +Raggs +Raghunandan +Ragin +Ragins +Ragland +Ragle +Raglin +Raglow +Ragno +Rago +Ragon +Ragone +Ragonese +Ragsdale +Raguay +Ragula +Ragus +Ragusa +Ragusano +Raguso +Rahaim +Rahal +Rahall +Rahama +Rahaman +Rahe +Raheem +Raheja +Rahib +Rahim +Rahimi +Rahl +Rahm +Rahman +Rahmani +Rahmes +Rahming +Rahn +Rahoche +Rahr +Raia +Raible +Raiche +Raid +Raiden +Raider +Raif +Raiford +Raigosa +Raigoza +Raike +Raikes +Rail +Railes +Railey +Railing +Railsback +Raimann +Raimer +Raimo +Raimondi +Raimondo +Raimundo +Rain +Raina +Rainbolt +Rainbott +Rainbow +Raine +Rainer +Raines +Rainey +Rainford +Rainforth +Rainge +Rainha +Rainie +Rainier +Rainone +Rains +Rainville +Rainwater +Rainwaters +Raio +Raiola +Rairdon +Rais +Raisbeck +Raisch +Raisin +Raisler +Raisley +Raisor +Raith +Raithel +Raitt +Raitz +Raj +Raja +Rajala +Rajan +Rajaniemi +Rajaphoumy +Rajaratnam +Rajas +Rajewski +Rajk +Rajtar +Raju +Rajwani +Rak +Rake +Rakel +Raker +Rakers +Rakes +Rakestraw +Rakestrow +Rakich +Rakoci +Rakoczy +Rakoski +Rakow +Rakowski +Rakus +Rakyta +Ralat +Ralbovsky +Raleigh +Raley +Ralko +Rall +Rallis +Rallison +Ralls +Ralon +Ralph +Ralphs +Ralston +Ram +Rama +Ramach +Ramadan +Ramadanovic +Ramagano +Ramage +Ramagos +Ramaker +Ramal +Ramales +Raman +Ramano +Ramariz +Ramaswamy +Ramaudar +Rambeau +Ramberg +Rambert +Rambin +Rambo +Rambousek +Rambus +Ramcharan +Ramcharran +Ramdas +Ramdeo +Rameau +Ramelb +Ramelize +Ramella +Ramelli +Ramento +Ramer +Rameres +Ramerez +Rameriez +Rameriz +Ramero +Rames +Ramesar +Ramesh +Rametta +Ramey +Ramez +Ramgel +Ramie +Ramiez +Ramil +Ramin +Raminez +Ramire +Ramirec +Ramirel +Ramires +Ramirez +Ramiriz +Ramiro +Ramis +Ramiscal +Ramjan +Ramjhon +Ramkissoon +Ramlakhan +Ramlall +Ramler +Ramm +Rammer +Ramming +Ramnarase +Ramnarine +Ramnauth +Ramo +Ramon +Ramone +Ramones +Ramonez +Ramos +Ramotar +Ramoutar +Ramp +Rampa +Rampadarat +Rampersad +Rampey +Ramphal +Rampley +Rampton +Rampulla +Rampy +Ramrez +Ramrirez +Ramroop +Rams +Ramsahai +Ramsaroop +Ramsay +Ramsbottom +Ramsburg +Ramsby +Ramsdale +Ramsdell +Ramsden +Ramser +Ramseur +Ramsey +Ramseyer +Ramsfield +Ramshur +Ramsier +Ramson +Ramsour +Ramstad +Ramsuer +Ramsy +Ramthun +Ramu +Ramundo +Ramus +Ramy +Ran +Rana +Ranah +Ranalli +Ranallo +Ranaudo +Rancatti +Rance +Rances +Ranch +Rancher +Rancifer +Ranck +Rancourt +Rand +Randa +Randahl +Randal +Randall +Randazzo +Randel +Randell +Randgaard +Randhawa +Randklev +Randle +Randleman +Randles +Randlett +Rando +Randol +Randolf +Randoll +Randolph +Randon +Randrup +Rands +Randt +Randy +Randzin +Rane +Raner +Ranes +Raneses +Raney +Ranford +Ranft +Rang +Rangasammy +Range +Rangel +Ranger +Rangitsch +Rangnow +Ranieri +Raniero +Ranildi +Ranjel +Rank +Ranke +Rankhorn +Rankin +Rankins +Ranks +Ranmar +Rann +Rannalli +Rannells +Rannels +Ranney +Ranni +Ranno +Ranos +Ransberger +Ransbottom +Ransburg +Ransdell +Ransford +Ransick +Ransier +Ransler +Ransom +Ransome +Ranson +Ransone +Ransonet +Ranta +Rantanen +Rantz +Ranum +Ranweiler +Rao +Raoof +Rapa +Rapacki +Rapalo +Rapanot +Rapaport +Rape +Rapelyea +Raper +Raphael +Rapier +Rapin +Rapisura +Rapkin +Rapko +Rapkowicz +Rapley +Rapone +Raponi +Rapoport +Raposa +Rapose +Raposo +Rapoza +Rapozo +Rapp +Rappa +Rappaport +Rappe +Rappenecker +Rappl +Rappley +Rappleye +Rappleyea +Rappold +Rapson +Raptis +Rapuano +Raque +Raquel +Rarang +Rarden +Rardin +Rardon +Rarey +Rarick +Raridon +Raring +Rarogal +Rary +Ras +Rasanen +Rasavong +Rasband +Rasberry +Rasbery +Rasbury +Rasch +Rasche +Raschilla +Raschke +Raschko +Rasco +Rascoe +Rascon +Rase +Rasely +Raser +Rasey +Rash +Rashad +Rashada +Rashdi +Rashed +Rasheed +Rasher +Rashid +Rasico +Rasinski +Rask +Raska +Raske +Raskey +Raskin +Rasley +Rasmus +Rasmuson +Rasmussen +Rasmusson +Rasnake +Rasnic +Rasnick +Raso +Rasole +Rasool +Rasor +Rasp +Raspa +Raspberry +Raspotnik +Rassel +Rasset +Rassman +Rassmussen +Rast +Rastegar +Rastelli +Rastetter +Rastogi +Rastorfer +Rasual +Rasul +Rasulo +Rataczak +Rataj +Ratajczak +Ratana +Ratchford +Ratcliff +Ratcliffe +Ratel +Ratelle +Rater +Ratering +Raterman +Ratermann +Rath +Rathai +Rathbone +Rathbum +Rathbun +Rathburn +Rathe +Rathel +Rather +Rathert +Rathfon +Rathgeb +Rathgeber +Rathje +Rathjen +Rathke +Rathman +Rathmann +Rathmanner +Rathmell +Rathrock +Ratigan +Ratkovich +Ratkowski +Ratledge +Ratleff +Ratley +Ratliff +Ratner +Ratsep +Rattan +Rattana +Rattanachane +Rattanasinh +Rattay +Ratte +Rattee +Rattell +Ratterman +Ratterree +Ratti +Rattigan +Rattler +Rattley +Rattliff +Rattner +Rattray +Rattu +Ratulowski +Ratz +Ratzlaff +Ratzloff +Rau +Raub +Raucci +Rauch +Rauchwerger +Rauco +Rauda +Raudales +Raudebaugh +Raudenbush +Rauelo +Rauen +Rauer +Rauf +Raught +Raugust +Rauh +Rauhe +Rauhecker +Rauhuff +Raul +Raulerson +Raulino +Rauls +Raulston +Raum +Rauner +Raup +Raupach +Raupp +Raus +Rausch +Rauschenbach +Rauschenberg +Rauscher +Rause +Rauser +Rausin +Rautenberg +Rautenstrauch +Rauth +Rautio +Rauzman +Rav +Rava +Ravago +Raval +Rave +Ravel +Raveling +Ravelo +Raven +Ravencraft +Ravenel +Ravenell +Ravenelle +Ravenhorst +Ravens +Ravenscraft +Ravenscroft +Raver +Ravert +Ravetti +Ravetto +Ravi +Raviele +Raviscioni +Ravitz +Ravizee +Ravo +Ravotta +Raw +Rawat +Rawding +Rawdon +Rawe +Rawhoof +Rawhouser +Rawi +Rawicki +Rawl +Rawle +Rawles +Rawley +Rawling +Rawlings +Rawlins +Rawlinson +Rawls +Rawson +Rax +Raxter +Ray +Raya +Rayam +Rayas +Raybon +Rayborn +Raybould +Raybourn +Raybuck +Rayburn +Raychard +Raycraft +Raycroft +Raye +Rayer +Rayes +Rayfield +Rayford +Raygosa +Raygoza +Rayhel +Rayl +Rayman +Raymer +Raymo +Raymond +Raymore +Raymos +Raymundo +Rayna +Rayne +Rayner +Raynes +Rayno +Raynolds +Raynor +Raynoso +Rayo +Rayome +Rayos +Rayow +Rayshell +Rayside +Rayson +Raysor +Rayyan +Raz +Raza +Razavi +Razer +Razey +Raziano +Razinger +Razo +Razon +Razor +Razzano +Razze +Re +Rea +Reach +Read +Readdy +Reade +Readenour +Reader +Reading +Readinger +Readnour +Reado +Readus +Ready +Reagan +Reagans +Reagen +Reager +Reagey +Reagh +Reagin +Reagle +Reagon +Reagor +Reaid +Real +Realbuto +Reale +Reali +Realmuto +Ream +Reamer +Reames +Reams +Reamy +Reando +Reaney +Reano +Reaollano +Reap +Reaper +Rear +Rearden +Reardon +Rearick +Reary +Reas +Rease +Reaser +Reash +Reasinger +Reasner +Reason +Reasoner +Reasonover +Reasons +Reasor +Reategui +Reath +Reatherford +Reau +Reauish +Reaume +Reaux +Reavely +Reaver +Reaves +Reavis +Reavish +Reavley +Reay +Reazer +Rebar +Rebeck +Rebeiro +Rebel +Rebeles +Rebell +Rebello +Rebelo +Reber +Rebera +Rebert +Rebholz +Rebich +Rebick +Rebik +Rebillard +Rebman +Rebold +Rebollar +Rebolledo +Rebolloso +Rebuck +Rebuldela +Reburn +Rebusi +Recalde +Recar +Recchia +Recek +Recendez +Rech +Rechel +Recher +Rechichi +Rechkemmer +Recht +Rechtzigel +Recidivi +Recine +Recinos +Recio +Reck +Reckard +Reckart +Recker +Reckers +Reckleben +Reckley +Reckling +Reckner +Recksiek +Recla +Recor +Record +Records +Recore +Rectenwald +Rector +Recuparo +Recupero +Reczek +Red +Reda +Redal +Redbird +Redburn +Redcay +Redcross +Redd +Reddekopp +Reddell +Redden +Redder +Reddic +Reddick +Reddicks +Reddig +Reddin +Redding +Reddinger +Reddington +Reddish +Redditt +Reddix +Reddoch +Reddout +Reddrick +Reddy +Rede +Redeker +Redel +Redell +Redemer +Redenbaugh +Redenius +Redenz +Redepenning +Reder +Redfear +Redfearn +Redfern +Redfield +Redford +Redfox +Redgate +Redhage +Redhead +Redhouse +Redic +Redican +Redick +Redifer +Redig +Rediger +Rediker +Redinbo +Reding +Redinger +Redington +Redish +Rediske +Redkey +Redle +Redler +Redlin +Redline +Redlinger +Redlon +Redman +Redmann +Redmer +Redmon +Redmond +Redner +Rednour +Redo +Redondo +Redpath +Redrick +Redshaw +Redstone +Redus +Redway +Redwine +Redwood +Ree +Reeb +Reeber +Reece +Reech +Reeck +Reed +Reeder +Reedholm +Reeds +Reedus +Reedy +Reef +Reefer +Reeger +Reeh +Reeher +Reek +Reekers +Reekie +Reeks +Reel +Reels +Reem +Reemer +Reen +Reenders +Reents +Reep +Rees +Reese +Reeser +Reesor +Reeter +Reetz +Reeve +Reever +Reevers +Reeves +Refazo +Reff +Reffett +Reffitt +Reffner +Refsal +Refsell +Rega +Regal +Regalado +Regalbuto +Regan +Regans +Regar +Regas +Regehr +Regel +Regelman +Regen +Regener +Regensburg +Reger +Reges +Regester +Reggio +Regier +Regina +Reginal +Reginaldo +Regine +Regino +Regis +Register +Regler +Reglin +Regn +Regner +Regnier +Rego +Regos +Regueira +Regula +Regulski +Regulus +Regusters +Reh +Reha +Rehagen +Rehak +Rehart +Rehbein +Rehberg +Rehberger +Rehbock +Rehder +Reher +Rehfeld +Rehfeldt +Rehfield +Rehkop +Rehl +Rehlander +Rehler +Rehling +Rehm +Rehman +Rehmann +Rehmeier +Rehmer +Rehmert +Rehn +Rehnberg +Rehnborg +Rehnert +Rehnquist +Reho +Rehor +Rehrer +Rehrig +Rehse +Rei +Reial +Reiber +Reibert +Reibman +Reibsome +Reich +Reichard +Reichardt +Reichart +Reiche +Reichel +Reichelderfer +Reichelt +Reichenbach +Reichenback +Reichenberg +Reichert +Reichhardt +Reichle +Reichler +Reichling +Reichman +Reichmann +Reichow +Reick +Reicks +Reid +Reidel +Reidenbach +Reider +Reidhaar +Reidhead +Reidherd +Reidinger +Reidler +Reidling +Reidy +Reier +Reierson +Reif +Reifel +Reifer +Reiff +Reifler +Reifman +Reifschneider +Reifsnider +Reifsnyder +Reifsteck +Reigel +Reiger +Reigh +Reighard +Reighley +Reigle +Reigleman +Reigner +Reigstad +Reihe +Reiher +Reihing +Reihl +Reik +Reikowsky +Reil +Reiland +Reiley +Reiling +Reill +Reilley +Reilly +Reily +Reim +Reiman +Reimann +Reimel +Reimer +Reimers +Reimmer +Reimnitz +Reimold +Reimund +Rein +Reina +Reinard +Reinart +Reinartz +Reinbold +Reinbolt +Reindeau +Reindel +Reinders +Reindl +Reine +Reineccius +Reineck +Reinecke +Reineke +Reineking +Reineman +Reinen +Reiner +Reiners +Reinert +Reines +Reinfeld +Reing +Reinhard +Reinhardt +Reinhart +Reinheimer +Reinhold +Reinholdt +Reinholt +Reinholtz +Reinicke +Reinier +Reiniger +Reining +Reininger +Reinitz +Reinke +Reinkemeyer +Reinken +Reinking +Reinmann +Reinmiller +Reino +Reinoehl +Reinoso +Reinowski +Reins +Reinsch +Reinschmidt +Reinsfelder +Reinsmith +Reinstein +Reinsvold +Reints +Reinwald +Reio +Reis +Reisch +Reischl +Reisdorf +Reise +Reisen +Reisenauer +Reiser +Reisert +Reisher +Reishus +Reisig +Reisin +Reising +Reisinger +Reisling +Reisman +Reisner +Reiss +Reisser +Reissig +Reist +Reistad +Reister +Reistetter +Reiswig +Reisz +Reitan +Reitano +Reitema +Reiten +Reiter +Reiterman +Reith +Reither +Reitler +Reitman +Reitmeier +Reitmeyer +Reitsma +Reitter +Reitz +Reitzel +Reitzes +Reives +Rekas +Rekemeyer +Reker +Reksten +Rekuc +Rekus +Relacion +Relaford +Releford +Relf +Relford +Relic +Reliford +Relihan +Relkin +Rell +Rella +Rellama +Reller +Relles +Rellihan +Relph +Relyea +Remak +Remaklus +Remaley +Remaly +Rembert +Rembold +Remeder +Remedies +Remele +Remenaric +Rementer +Remer +Remerez +Remey +Remfert +Remian +Remiasz +Remick +Remigio +Remillard +Remily +Remington +Remis +Remiszewski +Remke +Remkus +Remley +Remlin +Remlinger +Remme +Remmel +Remmele +Remmen +Remmers +Remmick +Remmie +Remo +Remondet +Remondini +Remos +Rempe +Rempel +Remsberg +Remsburg +Remsen +Remson +Remund +Remus +Remy +Ren +Rena +Renaker +Renard +Renart +Renaud +Renault +Renburg +Rench +Rencher +Rend +Renda +Rendall +Rende +Rendel +Rendell +Render +Renderos +Rendina +Rendino +Rendle +Rendleman +Rendler +Rendon +Rene +Reneau +Renee +Renegar +Renell +Rener +Renert +Renfer +Renfrew +Renfro +Renfroe +Renfrow +Rengel +Rengers +Rengifo +Renick +Renicker +Renier +Renigar +Reninger +Renison +Renk +Renken +Renker +Renkes +Renko +Renn +Renna +Rennaker +Renne +Renneker +Rennell +Rennels +Rennemeyer +Renner +Renney +Rennick +Rennie +Renning +Renninger +Rennix +Renno +Reno +Renolds +Renollet +Renosky +Renouf +Renova +Rens +Rensberger +Rensch +Renschler +Rensen +Renshaw +Rensing +Rentar +Rentas +Renter +Renteria +Rentfro +Rentfrow +Rentie +Renton +Rentoulis +Rentschler +Rentz +Renuart +Renwick +Reny +Renyer +Renz +Renze +Renzelman +Renzi +Renzo +Renzoni +Renzulli +Renzullo +Reola +Reome +Reon +Reopell +Reos +Repaci +Repasky +Repass +Repenning +Reper +Repetowski +Reph +Repine +Repinski +Repka +Repke +Repko +Replenski +Replin +Replogle +Repoff +Reposa +Repp +Reppe +Reppell +Reppert +Reppond +Reppucci +Repress +Reprogle +Repsher +Requa +Requarth +Requena +Rerko +Rerucha +Res +Resch +Reschke +Resecker +Reseigh +Resek +Resendes +Resendez +Resendiz +Resenz +Reser +Resetar +Resh +Reshard +Reshid +Resides +Resler +Resner +Resnick +Resnik +Resnikoff +Resos +Respass +Resper +Respers +Respes +Respess +Respicio +Respress +Ress +Resse +Resseguie +Ressel +Ressler +Rester +Restifo +Restivo +Resto +Restrepo +Restuccia +Resue +Resureccion +Reta +Retamar +Retana +Retchless +Retek +Retersdorf +Reth +Retherford +Rethman +Rethmeier +Retka +Retort +Retta +Rettele +Retter +Retterath +Retterbush +Rettig +Rettinger +Rettke +Rettkowski +Retz +Retzer +Retzlaff +Retzler +Retzloff +Reuben +Reuber +Reudink +Reuer +Reuhl +Reul +Reuland +Reulet +Reus +Reusch +Reuschel +Reusing +Reuss +Reusser +Reusswig +Reust +Reuteler +Reuter +Reuther +Reutlinger +Reutter +Reutzel +Reuven +Revak +Revalee +Revard +Revay +Reveal +Revel +Reveles +Revelez +Revell +Revelle +Revelli +Revello +Revells +Revelo +Revels +Reven +Revera +Revere +Revering +Revermann +Reveron +Reves +Revette +Revier +Revilla +Reville +Revils +Revira +Revis +Revoir +Revolorio +Revord +Rew +Rewakowski +Rewenko +Rewerts +Rewis +Rewitzer +Rex +Rexach +Rexford +Rexroad +Rexroat +Rexrode +Rexwinkle +Rey +Reyburn +Reye +Reyelts +Reyer +Reyers +Reyes +Reyez +Reyman +Reyna +Reynaga +Reynaldo +Reynalds +Reynard +Reynaud +Reyne +Reyner +Reynero +Reynold +Reynolds +Reynoldson +Reynosa +Reynoso +Reynoza +Reynvaan +Reyolds +Reyome +Reys +Reza +Rezac +Rezai +Rezak +Rezek +Rezendes +Rezentes +Reznicek +Reznick +Reznik +Rhame +Rhames +Rhatigan +Rhea +Rhead +Rheault +Rheaume +Rheaves +Rhed +Rhee +Rhees +Rhein +Rheingans +Rheingold +Rheinhardt +Rheinschmidt +Rhem +Rhen +Rheome +Rhett +Rhew +Rhim +Rhine +Rhinebolt +Rhinehardt +Rhinehart +Rhinerson +Rhines +Rho +Rhoad +Rhoades +Rhoads +Rhoan +Rhoda +Rhodarmer +Rhodd +Rhode +Rhodehamel +Rhoden +Rhoderick +Rhodes +Rhodie +Rhodus +Rhody +Rhoe +Rhome +Rhondes +Rhone +Rhoney +Rhorer +Rhoten +Rhoton +Rhude +Rhudy +Rhue +Rhule +Rhum +Rhump +Rhyan +Rhym +Rhyme +Rhymer +Rhymes +Rhynard +Rhyne +Rhyner +Rhynes +Rial +Rials +Rian +Rias +Riase +Riback +Ribao +Ribar +Ribas +Ribaudo +Ribb +Ribbink +Ribble +Ribeiro +Ribera +Riberdy +Ribero +Ribiero +Riblet +Riblett +Ribot +Ribron +Ribsamen +Ricard +Ricardez +Ricardi +Ricardo +Ricardson +Ricaud +Ricca +Riccardi +Riccardo +Riccelli +Ricci +Ricciardelli +Ricciardi +Ricciardone +Riccio +Riccitelli +Ricciuti +Ricco +Rice +Ricenberg +Rich +Richan +Richard +Richards +Richardson +Richardt +Richardville +Richarson +Richart +Richberg +Richbourg +Richburg +Richcreek +Riche +Richel +Richelieu +Richemond +Richens +Richer +Richerds +Richerson +Richert +Riches +Richesin +Richeson +Richey +Richie +Richins +Richison +Richiusa +Richlin +Richman +Richmann +Richmeier +Richmon +Richmond +Richner +Richoux +Richrdson +Richter +Richters +Richwine +Rick +Rickabaugh +Rickard +Rickards +Ricke +Rickel +Rickels +Ricken +Rickenbach +Rickenbacker +Rickenbaker +Rickenbaugh +Ricker +Rickerl +Rickers +Rickerson +Rickert +Ricketson +Rickett +Ricketts +Rickey +Rickford +Rickie +Ricklefs +Rickles +Rickley +Rickman +Rickmon +Rickner +Rickon +Ricks +Rickson +Ricley +Rico +Ricord +Ricotta +Ricucci +Riculfy +Ridall +Riddel +Riddell +Ridder +Ridderhoff +Ridders +Riddick +Riddle +Riddlebarger +Riddleberger +Riddles +Riddley +Riddock +Rideau +Rideaux +Ridel +Ridell +Riden +Ridener +Ridenhour +Ridenour +Ridens +Rideout +Ridep +Rider +Rides +Ridge +Ridgebear +Ridgel +Ridgell +Ridges +Ridgeway +Ridgill +Ridgle +Ridgley +Ridgnal +Ridgway +Riding +Ridinger +Ridings +Ridlen +Ridler +Ridley +Ridling +Ridlon +Ridner +Ridolfi +Ridout +Ridpath +Rieb +Riebau +Riebe +Riebel +Riebeling +Rieben +Rieber +Riebow +Riech +Riechers +Riechman +Rieck +Riecke +Ried +Riede +Riedel +Riedell +Rieder +Riederer +Riedesel +Riedinger +Riedl +Riedle +Riedlinger +Riedman +Riedmayer +Riedy +Rief +Riefer +Rieff +Rieffenberger +Rieffer +Rieg +Riegel +Rieger +Riegle +Riegler +Riehl +Riehle +Riehm +Riek +Rieke +Rieken +Riekena +Rieker +Riekert +Rieks +Riel +Rieland +Rieley +Rielly +Rieman +Riemann +Riemenschneid +Riemer +Riemersma +Riendeau +Rienstra +Rients +Rienzo +Rieper +Riera +Rierson +Ries +Riese +Riesen +Riesenberg +Riesenweber +Rieser +Riesgo +Riesgraf +Riesinger +Rieske +Riesland +Riesner +Riess +Riessen +Riester +Rietdorf +Rieth +Rietschlin +Rietz +Rieu +Rieve +Rieves +Rievley +Riexinger +Rifai +Rife +Rifenbark +Rifenbery +Rifenburg +Riff +Riffe +Riffee +Riffel +Riffle +Riffon +Rifkin +Rigali +Rigano +Rigas +Rigatti +Rigaud +Rigazio +Rigby +Rigdon +Rigel +Rigerman +Rigg +Riggan +Riggans +Riggen +Riggenbach +Riggens +Rigger +Riggers +Riggert +Riggi +Riggie +Riggin +Riggings +Riggins +Riggio +Riggle +Riggleman +Riggles +Riggott +Riggs +Riggsbee +Riggsby +Righetti +Righi +Right +Righter +Righthouse +Rightley +Rightmire +Rightmyer +Rightnour +Rigler +Rigley +Riglos +Rigney +Rigo +Rigoni +Rigotti +Rigsbee +Rigsby +Riha +Rihanek +Riherd +Rihn +Rihner +Riihimaki +Riina +Riippi +Riis +Riise +Rijo +Rijos +Rikard +Rike +Riker +Rile +Riles +Riley +Riliford +Riling +Rill +Riller +Rillera +Rilley +Rillie +Rilling +Rily +Rim +Rima +Rimando +Rimar +Rimbach +Rimbey +Rimel +Rimer +Rimes +Rimi +Rimkus +Rimm +Rimmer +Rimple +Rimson +Rina +Rinaldi +Rinaldis +Rinaldo +Rinard +Rinaudo +Rinauro +Rincan +Rinck +Rincon +Rincones +Rindal +Rinde +Rindels +Rinderer +Rinderknecht +Rinderle +Rindfleisch +Rindler +Rindone +Rine +Rinebarger +Rinebold +Rineer +Rinehardt +Rinehart +Rineheart +Rinehimer +Rinella +Riner +Rines +Riney +Rinfret +Ring +Ringbloom +Ringdahl +Ringeisen +Ringel +Ringelheim +Ringelspaugh +Ringen +Ringenberg +Ringer +Ringering +Ringgenberg +Ringgold +Ringham +Ringhand +Ringhouse +Ringland +Ringle +Ringlein +Ringler +Ringley +Ringman +Ringo +Ringold +Ringquist +Ringrose +Rings +Ringstaff +Ringuette +Ringus +Ringwald +Ringwood +Rini +Riniker +Rininger +Rink +Rinke +Rinkel +Rinkenberger +Rinker +Rinks +Rinkus +Rinn +Rinne +Rinner +Rinnert +Rintharamy +Rio +Riobe +Riofrio +Riogas +Riojas +Riola +Riolo +Rion +Riopel +Riopelle +Riordan +Rios +Rioseco +Rioux +Rioz +Ripa +Ripka +Ripke +Ripley +Ripoll +Ripp +Rippe +Rippee +Rippel +Rippelmeyer +Rippentrop +Rippeon +Ripper +Ripperger +Rippetoe +Rippey +Rippin +Ripple +Ripplinger +Rippon +Rippstein +Rippy +Ripson +Riquelme +Risatti +Risbeck +Risberg +Risby +Riscen +Risch +Rische +Risden +Rise +Riseden +Risen +Risenhoover +Riser +Risewick +Rish +Risha +Rishe +Rishel +Rishell +Risher +Rishor +Rishty +Risi +Risien +Rising +Risinger +Risius +Risk +Riska +Riskalla +Riske +Riskin +Risko +Risler +Risley +Risner +Riso +Rison +Risper +Rispoli +Riss +Rissanen +Risse +Rissell +Risser +Rissler +Rissman +Risso +Rist +Ristaino +Ristau +Rister +Ristig +Risto +Riston +Ristow +Rita +Ritacco +Ritari +Ritch +Ritcher +Ritcheson +Ritchey +Ritchhart +Ritchie +Ritchko +Ritchlin +Ritchotte +Ritell +Ritenour +Riter +Ritmiller +Ritrovato +Ritschard +Ritson +Ritt +Rittenberry +Rittenhouse +Rittenour +Ritter +Ritterbush +Ritthaler +Rittichier +Rittie +Rittinger +Rittle +Ritts +Ritums +Ritz +Ritzel +Ritzer +Ritzert +Ritzie +Ritzke +Ritzman +Rius +Riva +Rivadeneira +Rivadulla +Rival +Rivali +Rivara +Rivard +Rivas +Riveiro +Rivel +Rivelli +Rivello +Rivena +Rivenbark +Rivenberg +Rivenburg +Rivenburgh +River +Rivera +Riveras +Riveria +Riverman +Rivero +Riveroll +Riveron +Riveros +Rivers +Rives +Rivest +Rivet +Rivett +Rivette +Rivie +Riviera +Riviere +Riviezzo +Rivinius +Rivira +Rivkin +Rivlin +Rivord +Rix +Rixie +Rizal +Rizas +Rizer +Rizk +Rizo +Rizor +Rizvi +Rizza +Rizzardi +Rizzardo +Rizzi +Rizzio +Rizzo +Rizzolo +Rizzotto +Rizzuti +Rizzuto +Rm +Ro +Roa +Roach +Roache +Roacho +Roadarmel +Roadcap +Roaden +Roades +Roadruck +Roads +Roady +Roaf +Roal +Roam +Roan +Roane +Roanhorse +Roaoo +Roark +Roarty +Roarx +Roary +Roat +Roatch +Roath +Roats +Rob +Roback +Robaina +Robair +Robak +Robante +Robar +Robards +Robare +Robarge +Robasciotti +Robateau +Robayo +Robb +Robben +Robberson +Robbert +Robbie +Robbin +Robbins +Robbinson +Robblee +Robbs +Robe +Robeck +Robel +Robella +Robello +Robenson +Rober +Roberds +Roberg +Roberge +Roberie +Roberrtson +Robers +Roberson +Roberston +Robert +Roberta +Robertello +Roberti +Roberto +Roberton +Robertos +Roberts +Robertshaw +Robertson +Robes +Robeson +Robey +Robeza +Robichard +Robichau +Robichaud +Robichaux +Robicheau +Robicheaux +Robida +Robideau +Robidoux +Robie +Robillard +Robilotto +Robin +Robinault +Robinett +Robinette +Robins +Robinso +Robinson +Robinsons +Robinzine +Robirds +Robishaw +Robison +Robitaille +Roble +Robledo +Roblee +Robles +Robleto +Robley +Roblez +Roblin +Roblodowski +Roblow +Robnett +Robotham +Robson +Robuck +Robusto +Roby +Robyn +Roca +Rocamora +Rocasah +Rocca +Rocchi +Rocchio +Roccia +Roccio +Rocco +Rocconi +Roch +Rocha +Rochat +Roche +Rocheford +Rochefort +Rochel +Rocheleau +Rochell +Rochelle +Rochenstire +Rocher +Roches +Rochester +Rochez +Rochford +Rochholz +Rochin +Rochkes +Rochlin +Rochlitz +Rocho +Rochon +Rochow +Rock +Rockafellow +Rocke +Rockefeller +Rockelman +Rockenbach +Rockenbaugh +Rocker +Rockers +Rockett +Rockey +Rockford +Rockhill +Rockhold +Rockholt +Rockingham +Rockman +Rockmore +Rockovich +Rocks +Rockstad +Rockwell +Rockwood +Rockymore +Rocle +Rocque +Rocquemore +Rocray +Rod +Roda +Rodabaugh +Rodak +Rodal +Rodamis +Rodan +Rodar +Rodarmel +Rodarta +Rodarte +Rodas +Rodberg +Rodd +Rodda +Roddam +Rodde +Rodden +Roddenberry +Roddey +Roddick +Roddy +Rode +Rodea +Rodebaugh +Rodebush +Rodeen +Rodefer +Rodeheaver +Rodeigues +Rodeiguez +Rodela +Rodell +Rodeman +Rodemeyer +Rodemoyer +Roden +Rodenbaugh +Rodenbeck +Rodenberg +Rodenberger +Rodenbough +Rodenburg +Rodenizer +Roder +Roderick +Roderiques +Roderiquez +Roderman +Rodero +Rodes +Rodewald +Rodger +Rodgers +Rodgerson +Rodges +Rodi +Rodia +Rodibaugh +Rodick +Rodiguez +Rodillas +Rodin +Rodina +Rodine +Rodino +Rodinson +Rodiquez +Rodis +Rodkey +Rodkin +Rodman +Rodney +Rodnguez +Rodocker +Rodolph +Rodregez +Rodregues +Rodreguez +Rodrequez +Rodrguez +Rodrick +Rodricks +Rodriges +Rodrigeuz +Rodrigez +Rodrigo +Rodrigres +Rodrigue +Rodriguel +Rodrigues +Rodriguez +Rodriguiz +Rodrigus +Rodriguz +Rodrique +Rodriques +Rodriquez +Rodriquz +Rodriuez +Rodvold +Rodwell +Rody +Roe +Roeber +Roebke +Roebuck +Roecker +Roede +Roedel +Roeder +Roediger +Roedl +Roefaro +Roeger +Roegge +Roegner +Roehl +Roehler +Roehling +Roehm +Roehr +Roehrenbeck +Roehrich +Roehrick +Roehrig +Roehrman +Roehrs +Roeker +Roekle +Roel +Roelfs +Roell +Roelle +Roelofs +Roemen +Roemer +Roemhild +Roemmich +Roen +Roenigk +Roepke +Roerig +Roering +Roerish +Roers +Roes +Roesch +Roeschley +Roese +Roeser +Roesing +Roeske +Roesler +Roesner +Roesser +Roessing +Roesslein +Roessler +Roessner +Roetcisoender +Roeth +Roethel +Roethle +Roethler +Roets +Roettgen +Roettger +Roetzler +Roever +Roewe +Roff +Roffe +Roffman +Rofkahr +Rog +Rogacion +Rogacki +Rogado +Rogal +Rogala +Rogalski +Rogan +Rogas +Rogel +Rogens +Roger +Rogers +Rogerson +Rogg +Rogge +Roggeman +Roggenbaum +Roggensack +Roggero +Roghair +Rogian +Rogillio +Roginson +Rogish +Rogne +Rogness +Rognstad +Rogoff +Rogol +Rogosky +Rogowicz +Rogowski +Rogriguez +Rogstad +Rogue +Roguemore +Rogugbakaa +Roh +Rohal +Rohaley +Rohan +Rohanna +Rohde +Rohdenburg +Rohe +Rohen +Roher +Rohl +Rohla +Rohlack +Rohland +Rohleder +Rohlf +Rohlfing +Rohlfs +Rohling +Rohlman +Rohloff +Rohm +Rohman +Rohn +Rohner +Rohowetz +Rohr +Rohrbach +Rohrbacher +Rohrback +Rohrbaugh +Rohrdanz +Rohrer +Rohrich +Rohrig +Rohrs +Rohrscheib +Rohs +Rohweder +Rohwer +Roider +Roig +Roiger +Roik +Rois +Roitman +Roja +Rojas +Rojek +Rojero +Rojo +Rojos +Roker +Rokicki +Rokisky +Rokos +Rokosz +Rokus +Rokusek +Rola +Rolack +Rolan +Roland +Rolando +Rolark +Rold +Roldan +Rolek +Rolen +Rolens +Roles +Roley +Rolf +Rolfe +Rolfes +Rolff +Rolfs +Rolfsen +Rolfson +Rolin +Roling +Rolins +Rolison +Roll +Rolla +Rollag +Rolland +Rollans +Rolle +Rollefson +Rollend +Roller +Rollerson +Rolley +Rollf +Rollheiser +Rollie +Rollin +Rollind +Rolling +Rollinger +Rollings +Rollins +Rollinson +Rollison +Rollman +Rollo +Rollock +Rollow +Rolls +Rollyson +Roloff +Rolon +Roloson +Rolph +Rolseth +Rolson +Rolstad +Rolston +Rom +Roma +Romack +Romag +Romagnoli +Romain +Romaine +Roman +Romance +Romanchuk +Romandia +Romane +Romanek +Romanelli +Romanello +Romani +Romaniak +Romanick +Romaniello +Romanik +Romanini +Romaniszyn +Romano +Romanoff +Romanoski +Romanov +Romanowicz +Romanowski +Romans +Romanski +Romansky +Romanson +Romar +Romaro +Romas +Romasanta +Romash +Romay +Rombach +Rombardo +Romberg +Romberger +Rombough +Rombs +Rombult +Rome +Romeiro +Romelus +Romenesko +Romeno +Romeo +Romer +Romera +Romero +Romesburg +Romey +Romie +Romig +Romine +Romines +Rominger +Romiro +Romito +Romjue +Romkema +Romm +Rommel +Rommelfanger +Romness +Romney +Romo +Romon +Romos +Romp +Rompf +Romprey +Romrell +Romriell +Romulus +Ron +Rona +Ronald +Ronan +Ronayne +Ronca +Ronchetti +Ronchetto +Ronco +Roncskevitz +Ronda +Ronde +Rondeau +Rondell +Rondinelli +Rondo +Rondon +Rondy +Rone +Roner +Ronero +Rones +Roney +Ronfeldt +Rong +Rongo +Rongstad +Ronhaar +Ronin +Ronk +Ronn +Ronne +Ronnfeldt +Ronnie +Ronning +Ronquillo +Rons +Ronsani +Ronsini +Ronson +Ronzoni +Rood +Roode +Roof +Roofe +Roofner +Rook +Rookard +Rooke +Rooker +Rooks +Rookstool +Rookwood +Room +Roome +Roon +Rooney +Roop +Roope +Roorda +Roos +Roosa +Roose +Roosevelt +Root +Rooth +Roots +Ropac +Roper +Ropers +Roperto +Ropes +Ropiski +Ropka +Ropp +Roppolo +Roque +Roquemore +Roques +Rorabacher +Rorabaugh +Rorer +Rorex +Rorick +Rorie +Rork +Rorrer +Ros +Rosa +Rosacker +Rosada +Rosado +Rosal +Rosales +Rosalez +Rosamond +Rosan +Rosander +Rosane +Rosano +Rosario +Rosaro +Rosas +Rosasco +Rosati +Rosato +Rosavio +Rosazza +Rosberg +Rosboril +Rosborough +Rosbough +Rosbozom +Rosca +Rosch +Roscigno +Roscioli +Roscoe +Roscorla +Roscow +Roscup +Rose +Rosebaugh +Roseberry +Roseboom +Roseboro +Roseborough +Rosebrock +Rosebrook +Rosebrough +Rosebur +Rosebure +Rosebush +Rosecrans +Rosek +Rosekrans +Rosel +Roseland +Roselius +Rosell +Rosella +Roselle +Roselli +Rosello +Roseman +Rosemond +Rosemore +Rosen +Rosenau +Rosenbalm +Rosenbarger +Rosenbaum +Rosenbeck +Rosenberg +Rosenberger +Rosenberry +Rosenblatt +Rosenbloom +Rosenblum +Rosenbluth +Rosenbrook +Rosenburg +Rosenbush +Rosencrans +Rosencrantz +Rosencranz +Rosendahl +Rosendale +Rosendo +Rosendorf +Rosene +Rosener +Rosenfeld +Rosenfeldt +Rosenfield +Rosengarten +Rosengren +Rosenhagen +Rosenheim +Rosenholm +Rosenkoetter +Rosenkrans +Rosenkranz +Rosenlof +Rosenow +Rosenquist +Rosensteel +Rosenstein +Rosenstock +Rosenthal +Rosenthall +Rosentrance +Rosentrater +Rosenwald +Rosenwinkel +Rosenzweig +Roser +Rosero +Roses +Rosete +Roseth +Rosetta +Rosette +Rosetti +Rosettie +Roseum +Rosewall +Rosewell +Rosh +Roshak +Roshannon +Rosher +Roshia +Rosi +Rosiak +Rosian +Rosica +Rosich +Rosie +Rosiek +Rosier +Rosiles +Rosillo +Rosin +Rosine +Rosing +Rosinski +Rositano +Roskam +Roske +Roskelley +Rosko +Roskop +Roskopf +Roskos +Roskovensky +Roskowinski +Rosky +Rosman +Rosmarin +Rosner +Roso +Rosoff +Rosol +Ross +Rossa +Rossano +Rossbach +Rosse +Rossean +Rosseau +Rosseel +Rossel +Rossell +Rosselle +Rosselli +Rossen +Rosser +Rosseter +Rossetti +Rossetto +Rossey +Rossi +Rossie +Rossignol +Rossin +Rossing +Rossingnol +Rossini +Rossiter +Rossler +Rossman +Rossmann +Rossmiller +Rossnagel +Rosso +Rosson +Rossotto +Rossow +Rossum +Rost +Rostad +Rostek +Rosten +Roston +Rosu +Rosul +Roswell +Roswick +Roszales +Roszel +Roszell +Rota +Rotan +Rotando +Rotanelli +Rotch +Rotchford +Rote +Rotella +Rotelli +Roten +Rotenberg +Rotenberry +Rotering +Rotermund +Rotert +Roth +Rothacher +Rothbart +Rothbauer +Rothberg +Rothchild +Rothe +Rothell +Rothenbach +Rothenberg +Rothenberger +Rothenburger +Rother +Rotherham +Rothermel +Rothermich +Rothery +Rothfeld +Rothfus +Rothfuss +Rothgaber +Rothgeb +Rothgery +Rothhaupt +Rothlisberger +Rothman +Rothmann +Rothmiller +Rothove +Rothrock +Rothschild +Rothstein +Rothweiler +Rothwell +Rotkovecz +Rotkowski +Rotman +Rotner +Rotolo +Roton +Rotondi +Rotondo +Rotramel +Rotruck +Rotstein +Rott +Rottenberg +Rotter +Rottier +Rottinghaus +Rottinghous +Rottman +Rottner +Rotton +Rotty +Rotunda +Rotundo +Rotunno +Rotz +Roubekas +Rouch +Roucoulet +Roudabush +Roudebush +Roudybush +Rouff +Roufs +Rouge +Rougeau +Rougeaux +Rougeot +Rough +Roughen +Rought +Roughton +Rougier +Rouhoff +Rouillard +Rouillier +Rouisse +Roule +Rouleau +Roulette +Roulhac +Roulston +Rouly +Roumeliotis +Round +Roundabush +Rounds +Roundtree +Roundy +Rounkles +Rounsaville +Rounsville +Rountree +Roup +Roupe +Roura +Rourk +Rourke +Rous +Rousch +Rouse +Rousell +Rouselle +Rouser +Rousey +Roush +Rousse +Rousseau +Roussel +Roussell +Rousselle +Roussin +Rousso +Roussos +Rousu +Rout +Route +Routh +Routhier +Routledge +Routon +Routson +Routt +Routte +Routzahn +Routzen +Rouw +Roux +Rouzer +Rouzzo +Rovack +Rovell +Rovella +Rovelto +Rover +Rovere +Rovero +Rovinsky +Rovira +Rovner +Row +Rowald +Rowan +Rowand +Rowback +Rowbotham +Rowbottom +Rowcliffe +Rowden +Rowe +Rowell +Rowels +Rowen +Rower +Rowett +Rowey +Rowland +Rowlands +Rowlee +Rowles +Rowlett +Rowlette +Rowley +Rowling +Rowlins +Rowlison +Rowls +Rowman +Rownd +Rowntree +Rowold +Rowray +Rowse +Rowsell +Rowser +Rowsey +Rowson +Rowton +Rowzee +Rox +Roxas +Roxberry +Roxburgh +Roxbury +Roy +Roya +Royal +Royall +Royals +Royalty +Roybal +Royce +Roye +Royea +Royer +Roylance +Royle +Roys +Roysden +Royse +Royster +Royston +Roytek +Roza +Rozance +Rozanski +Rozar +Rozas +Rozeboom +Rozek +Rozell +Rozelle +Rozema +Rozenberg +Rozga +Rozgonyi +Rozier +Rozman +Rozmus +Roznowski +Rozo +Rozon +Rozycki +Rozzell +Rozzelle +Rozzi +Rua +Ruacho +Ruan +Ruane +Ruano +Ruark +Rubal +Rubalcaba +Rubalcava +Rubalcave +Ruballos +Rubano +Rubarts +Rubash +Rubbo +Rubeck +Rubel +Ruben +Rubenacker +Rubendall +Rubenfeld +Rubenfield +Rubens +Rubenstein +Rubenzer +Rubeo +Rubero +Rubert +Ruberte +Ruberti +Ruberto +Rubi +Rubiano +Rubick +Rubidoux +Rubie +Rubin +Rubinich +Rubino +Rubinoff +Rubinow +Rubins +Rubinson +Rubinstein +Rubio +Rubison +Ruble +Rublee +Rubloff +Rubner +Rubottom +Rubow +Rubright +Rubsam +Rubulcaba +Ruby +Rubyor +Rucci +Ruch +Ruchti +Rucinski +Ruck +Ruckdaschel +Ruckdeschel +Ruckel +Rucker +Ruckey +Rucki +Ruckle +Ruckman +Rucks +Rucky +Rud +Ruda +Rudack +Rudasill +Rudat +Rudd +Ruddell +Rudden +Rudder +Ruddick +Ruddle +Ruddock +Rudduck +Ruddy +Rude +Rudeen +Rudel +Rudell +Ruden +Ruder +Ruderman +Rudes +Rudesill +Rudge +Rudgers +Rudh +Rudi +Rudicil +Rudick +Rudie +Rudig +Rudiger +Rudin +Rudio +Rudis +Rudisail +Rudisell +Rudish +Rudisill +Rudkin +Rudloff +Rudlong +Rudman +Rudney +Rudnick +Rudnicki +Rudnicky +Rudnitski +Rudo +Rudolf +Rudolph +Rudoy +Rudy +Rudzik +Rudzinski +Rue +Rueb +Ruebush +Rueck +Rueckert +Rued +Rueda +Ruedas +Ruediger +Ruedy +Ruef +Rueger +Ruegg +Ruegger +Ruegsegger +Ruehl +Ruehle +Ruehlen +Ruehling +Ruehter +Ruel +Ruelar +Ruelas +Ruell +Ruelle +Rueluas +Ruesch +Ruescher +Ruesga +Ruesink +Ruess +Ruesswick +Ruest +Rueter +Ruether +Ruetz +Ruezga +Ruf +Rufe +Rufenacht +Rufener +Rufer +Ruff +Ruffalo +Ruffaner +Ruffcorn +Ruffel +Ruffell +Ruffer +Ruffin +Ruffing +Ruffini +Ruffino +Ruffins +Ruffner +Ruffo +Ruffolo +Rufi +Rufino +Rufo +Rufus +Rugama +Ruge +Ruger +Rugg +Rugga +Ruggeri +Ruggerio +Ruggero +Ruggiano +Ruggiere +Ruggieri +Ruggiero +Ruggirello +Ruggle +Ruggles +Ruggs +Rugh +Ruh +Ruhenkamp +Ruhl +Ruhland +Ruhle +Ruhlin +Ruhling +Ruhlman +Ruhman +Ruhmann +Ruhn +Ruhnke +Ruhoff +Ruhstorfer +Ruhter +Ruic +Ruiloba +Ruis +Ruise +Ruisi +Ruiter +Ruivo +Ruiz +Rujawitz +Ruka +Rukavina +Ruland +Rulapaugh +Rule +Ruleman +Ruley +Ruliffson +Rulison +Rull +Rullan +Ruller +Rulli +Rullman +Rullo +Rulnick +Rulon +Ruman +Rumbach +Rumbaugh +Rumberger +Rumble +Rumbley +Rumbo +Rumbold +Rumbolt +Rumburd +Rumer +Rumery +Rumfelt +Rumfola +Rumford +Ruminski +Rumler +Rumley +Rummage +Rummans +Rummel +Rummell +Rummer +Rummerfield +Rummler +Rumney +Rumore +Rump +Rumpca +Rumpel +Rumpf +Rumph +Rumphol +Rumple +Rumps +Rumrill +Rumschlag +Rumsey +Runck +Runco +Rund +Rundahl +Rundall +Runde +Rundell +Rundle +Rundlett +Rundquist +Rundstrom +Runels +Runfola +Rung +Runge +Runion +Runions +Runk +Runkel +Runkle +Runnells +Runnels +Runner +Running +Runnion +Runquist +Runswick +Runyan +Runyon +Runyons +Runzler +Ruocco +Ruoff +Ruoho +Ruopoli +Ruopp +Ruot +Ruotolo +Ruozzo +Rupar +Rupard +Rupe +Rupel +Ruper +Rupert +Rupertus +Rupinski +Rupke +Ruple +Rupley +Rupnick +Rupp +Ruppe +Ruppel +Ruppenthal +Ruppert +Rupprecht +Ruprecht +Rupright +Rurup +Rury +Rusak +Rusaw +Rusboldt +Ruscetti +Rusch +Ruschak +Rusche +Ruschel +Ruscher +Ruschmann +Ruschmeyer +Ruscio +Ruscitti +Rusconi +Ruse +Rusek +Rusell +Rusen +Rusert +Rush +Rushanan +Rushdan +Rushe +Rushen +Rushenberg +Rusher +Rushford +Rushforth +Rushia +Rushin +Rushing +Rushiti +Rushlow +Rushman +Rushmore +Rushton +Rushworth +Rusi +Rusich +Rusiecki +Rusin +Rusinko +Rusinski +Rusk +Ruskin +Rusko +Rusley +Rusnak +Russ +Russak +Russaw +Russe +Russek +Russel +Russell +Russello +Russer +Russett +Russey +Russi +Russian +Russin +Russler +Russman +Russnak +Russo +Russom +Russomanno +Russomano +Russon +Russotti +Russotto +Russow +Russum +Russwurm +Rust +Rustad +Rusteberg +Rusteika +Rusten +Rustin +Ruston +Rustrian +Rusu +Ruszala +Ruszkowski +Ruta +Rutan +Rutana +Rutar +Rutecki +Rutenbar +Rutenberg +Ruter +Rutgers +Ruth +Rutheford +Ruthenberg +Ruther +Rutherford +Ruthers +Ruthledge +Ruthman +Ruths +Ruthstrom +Ruthven +Rutiaga +Rutigliano +Rutkin +Rutko +Rutkowski +Rutland +Rutledge +Rutley +Rutman +Ruts +Rutske +Rutski +Rutt +Ruttan +Rutten +Rutter +Ruttinger +Ruttman +Rutty +Rutz +Ruud +Ruuska +Ruvalcaba +Ruvalcava +Ruvo +Ruvolo +Ruwe +Ruwet +Rux +Ruybal +Ruyes +Ruyle +Ruys +Ruyter +Ruyz +Ruz +Ruzbasan +Ruzich +Ruzicka +Ruzicki +Ruzycki +Ruzzo +Rviz +Ryal +Ryals +Ryan +Ryans +Ryant +Ryba +Ryback +Rybacki +Rybak +Rybarczyk +Rybczyk +Ryberg +Rybicki +Rybij +Rybinski +Rybka +Rybolt +Rybowiak +Ryburn +Ryce +Rychlicki +Ryckman +Rycroft +Rydalch +Rydberg +Rydeen +Rydel +Rydelek +Rydell +Ryden +Ryder +Rydin +Rydman +Rydolph +Rydzewski +Rye +Ryea +Ryen +Ryer +Ryerson +Rygalski +Rygg +Rygiel +Rygiewicz +Ryhal +Ryherd +Rykaczewski +Rykard +Ryken +Ryker +Rykert +Rykiel +Rykowski +Ryks +Rylaarsdam +Ryland +Rylander +Rylands +Rylant +Ryle +Rylee +Ryles +Ryley +Ryll +Rylowicz +Ryman +Rymasz +Rymer +Rymes +Rymut +Rynders +Rynearson +Ryneer +Ryner +Rynerson +Rynes +Rynkowski +Rynn +Rynne +Ryon +Rys +Rysanek +Rysavy +Ryser +Rysz +Ryther +Rytuba +Ryu +Ryun +Ryzinski +Rzasa +Rzeczycki +Rzepecki +Rzepka +Rzeszutko +Rzucidlo +Sa +Saa +Saab +Saabatmand +Saad +Saadat +Saadd +Saade +Saadeh +Saager +Saal +Saale +Saalfrank +Saam +Saar +Saarela +Saari +Saas +Saathoff +Saavedra +Saba +Sabad +Sabado +Sabados +Sabagh +Sabaj +Sabal +Sabala +Saballos +Saban +Sabastian +Sabat +Sabata +Sabataso +Sabatelli +Sabater +Sabates +Sabatini +Sabatino +Sabb +Sabbagh +Sabbah +Sabbatini +Sabe +Sabean +Sabedra +Sabeiha +Sabel +Sabella +Sabellico +Saber +Saberi +Sabet +Sabha +Sabi +Sabia +Sabin +Sabina +Sabine +Sabini +Sabino +Sabins +Sabio +Sabir +Sabiston +Sablan +Sable +Sablea +Sables +Sablock +Sablone +Sabo +Sabol +Sabori +Saborido +Saborio +Sabot +Sabota +Sabourin +Sacane +Sacarello +Sacavage +Sacayanan +Sacca +Saccardi +Sacchetti +Sacchi +Sacco +Saccone +Saccucci +Sachar +Sache +Sacher +Saches +Sachetti +Sachez +Sachleben +Sachs +Sachse +Sachtleben +Sack +Sackal +Sackett +Sackey +Sackman +Sackos +Sackrider +Sacks +Sacramed +Sacramento +Sacre +Sada +Sadahiro +Sadak +Sadan +Sadar +Sadat +Sadberry +Sadbury +Saddat +Saddler +Sade +Sadee +Sadeghi +Saden +Sader +Sadger +Sadhra +Sadhu +Sadik +Sadin +Sadiq +Sadler +Sadlier +Sadlon +Sadlow +Sadolsky +Sadorra +Sadoski +Sadow +Sadowski +Sadowsky +Sadri +Sadusky +Sadvary +Sae +Saechao +Saeed +Saefong +Saeger +Saelee +Saelens +Saeler +Saeli +Saemenes +Saenger +Saenphimmacha +Saens +Saenz +Saephan +Saetern +Saeteun +Saether +Saetteurn +Saeturn +Saez +Safa +Safar +Safdeye +Safe +Safer +Saffel +Saffell +Saffer +Saffo +Saffold +Safford +Safi +Safier +Safko +Safley +Safran +Safranek +Safrit +Safron +Saft +Sagal +Sagan +Sagar +Sagaser +Sagastegui +Sagastume +Sagayaga +Sage +Sagedahl +Sagehorn +Sagel +Sagen +Sagendorf +Sager +Sagers +Sages +Saggese +Saggio +Saggione +Sagi +Saglibene +Saglimben +Saglimbeni +Sago +Sagoes +Sagon +Sagona +Sagraves +Sagredo +Sagrera +Sagucio +Saguil +Sagun +Saha +Sahady +Sahagian +Sahagun +Sahara +Sahe +Sahl +Sahlberg +Sahler +Sahli +Sahm +Sahni +Sahota +Sahr +Sahsman +Sahu +Saia +Saice +Saicedo +Said +Saide +Saidi +Saieva +Saik +Saiki +Saile +Sailer +Sailor +Sailors +Sails +Sain +Sainato +Saindon +Saine +Saines +Saini +Sainliere +Saint +Saintamand +Sainte +Saintfleur +Saintignon +Saintlouis +Sainz +Sais +Saisa +Saison +Saito +Saitta +Saiz +Sajdak +Sajor +Sajorda +Sajous +Sajovic +Sak +Saka +Sakaguchi +Sakai +Sakakeeny +Sakal +Sakamaki +Sakamoto +Sakasegawa +Sakash +Sakata +Sake +Sakelaris +Sakic +Sakiestewa +Sakihara +Sakkas +Sakkinen +Sako +Sakoda +Sakon +Sakovitch +Sakowski +Sakry +Saks +Sakshaug +Sakuma +Sakumoto +Sakurai +Sala +Salaam +Salabarria +Salach +Salada +Saladin +Saladino +Salado +Salafia +Salahubdin +Salais +Salaiz +Salak +Salam +Salama +Salamacha +Salamanca +Salameh +Salamon +Salamone +Salamy +Salandy +Salano +Salas +Salasar +Salassi +Salata +Salatino +Salato +Salay +Salaz +Salaza +Salazak +Salazan +Salazar +Salazer +Salb +Salberg +Salce +Salceda +Salcedo +Salcido +Saldana +Saldano +Saldeen +Saldi +Saldibar +Saldivar +Saldvir +Sale +Saleado +Salee +Saleeby +Saleem +Saleh +Saleha +Salehi +Salek +Salem +Saleme +Salemi +Salemo +Salen +Saler +Salera +Salerno +Sales +Salesky +Salesses +Saletta +Salfelder +Salgado +Salge +Salgero +Salguero +Saliba +Salido +Salierno +Salim +Salimas +Salimi +Salin +Salina +Salinas +Salines +Saling +Salis +Salisberry +Salisbury +Saliva +Salizar +Salizzoni +Salk +Salkeld +Sall +Sallach +Sallade +Sallah +Sallas +Sallaz +Salle +Sallee +Saller +Salles +Salley +Sallie +Sallies +Salling +Sallings +Sallis +Sallmen +Salloum +Salls +Sally +Salm +Salman +Salmans +Salmela +Salmen +Salmeron +Salmi +Salminen +Salmon +Salmond +Salmons +Salmonsen +Salmonson +Salo +Salois +Salome +Salomon +Salomone +Salon +Salone +Salonek +Salonia +Saloom +Salos +Salotti +Saloum +Salowitz +Salquero +Salsa +Salsberg +Salsberry +Salsbury +Salsedo +Salser +Salsgiver +Salsman +Salstrom +Salt +Salta +Saltarelli +Salte +Salter +Saltern +Salters +Saltis +Saltman +Saltmarsh +Saltness +Salton +Saltonstall +Saltourides +Salts +Saltsman +Saltus +Saltz +Saltzberg +Saltzgaber +Saltzman +Saluan +Saluja +Salum +Salus +Saluto +Salva +Salvadge +Salvador +Salvadore +Salvage +Salvaggio +Salvant +Salvas +Salvati +Salvatierra +Salvato +Salvatore +Salvatori +Salvature +Salvemini +Salverson +Salvesen +Salveson +Salvetti +Salvey +Salvi +Salvia +Salviejo +Salvietti +Salvino +Salvio +Salvitti +Salvo +Salvucci +Salwasser +Salway +Salyards +Salyer +Salyers +Salz +Salzano +Salzar +Salzberg +Salzer +Salzl +Salzman +Salzmann +Salzwedel +Sam +Sama +Samaan +Samad +Samaha +Samain +Samaniego +Samanlego +Samano +Samantha +Samara +Samaroo +Samas +Samay +Samayoa +Samber +Samberg +Sambor +Samborski +Sambrano +Sambrook +Sambucetti +Samec +Samek +Samela +Samele +Sames +Samet +Samford +Samia +Samick +Samide +Samiec +Samiento +Samii +Samit +Samlal +Samland +Sammarco +Sammartano +Sammartino +Sammer +Sammet +Sammis +Sammon +Sammons +Samms +Sammut +Samo +Samok +Samona +Samons +Samora +Samorano +Samowitz +Samoyoa +Sampaga +Sampaia +Sampair +Sampang +Sampayan +Sampedro +Sampere +Samperi +Sampey +Sampica +Sampieri +Sampilo +Sample +Samples +Sampley +Sampogna +Sampsel +Sampsell +Sampselle +Sampson +Samra +Samrah +Samrov +Sams +Samsel +Samson +Samu +Samudio +Samuel +Samuell +Samuels +Samuelsen +Samuelson +Samul +Samway +Samy +Samyn +San +Sanabria +Sanacore +Sanagustin +Sanantonio +Sanasith +Sanberg +Sanborn +Sanburg +Sance +Sancedo +Sancen +Sances +Sanchec +Sancher +Sanches +Sanchez +Sanchious +Sanchirico +Sancho +Sanchz +Sancken +Sancrant +Sand +Sanda +Sandage +Sandager +Sandahl +Sandall +Sandate +Sandau +Sandavol +Sanday +Sandberg +Sandblom +Sandborg +Sandburg +Sande +Sandeen +Sandefer +Sandefur +Sandel +Sandelin +Sandelius +Sandell +Sandella +Sanden +Sander +Sandercock +Sanderfer +Sanderford +Sanderfur +Sanderlin +Sanderman +Sanders +Sandersen +Sanderson +Sandez +Sandford +Sandgren +Sandhaus +Sandhoff +Sandholm +Sandhop +Sandhu +Sandi +Sandidge +Sandifer +Sandiford +Sandigo +Sandin +Sandine +Sandino +Sandison +Sandlan +Sandland +Sandler +Sandles +Sandlian +Sandlin +Sandling +Sandman +Sandmann +Sandmeier +Sandness +Sando +Sandobal +Sandoe +Sandona +Sandone +Sandor +Sandora +Sandoral +Sandos +Sandoual +Sandoval +Sandovar +Sandow +Sandoz +Sandquist +Sandra +Sandri +Sandridge +Sandrock +Sandrowicz +Sandry +Sands +Sandstede +Sandstedt +Sandstrom +Sandt +Sandus +Sandusky +Sandven +Sandvig +Sandvik +Sandvill +Sandy +Sane +Saneaux +Saner +Sanes +Sanez +Sanfelix +Sanfilippo +Sanfiorenzo +Sanflippo +Sanford +Sanfratello +Sanft +Sang +Sangalli +Sangasy +Sanger +Sanges +Sangh +Sangha +Sanghani +Sanghez +Sanghvi +Sangi +Sangiacomo +Sangren +Sangrey +Sangster +Saniatan +Saniger +Sanipasi +Sanislo +Sanjabi +Sanjose +Sanjuan +Sanjurjo +Sankar +Sankaran +Sankary +Sanke +Sanker +Sankey +Sanko +Sankoff +Sankoh +Sankovich +Sankowski +Sanks +Sanlatte +Sanlucas +Sanluis +Sanmarco +Sanmartin +Sanmiguel +Sann +Sanna +Sannella +Sanner +Sannes +Sannicolas +Sannon +Sannutti +Sano +Sanocki +Sanon +Sanor +Sanos +Sanosyan +Sanots +Sanpaolo +Sanpedro +Sanpson +Sanquenetti +Sanroman +Sans +Sansalone +Sansburn +Sansbury +Sanschagrin +Sanseda +Sanseverino +Sansing +Sansom +Sanson +Sansone +Sansotta +Sansouci +Sansoucie +Sansoucy +Sant +Santa +Santaana +Santacroce +Santacruce +Santacruz +Santaella +Santagata +Santago +Santai +Santaloci +Santalucia +Santamaria +Santamarina +Santana +Santander +Santangelo +Santaniello +Santanna +Santano +Santarelli +Santarpia +Santarsiero +Santee +Santell +Santella +Santellan +Santellana +Santelli +Santeramo +Santerre +Santheson +Santhuff +Santi +Santiago +Santibanez +Santiesteban +Santigo +Santillan +Santillana +Santillanes +Santillanez +Santilli +Santillo +Santilukka +Santin +Santini +Santino +Santio +Santis +Santisteban +Santistevan +Santizo +Santmier +Santmyer +Santo +Santoli +Santolucito +Santomassimo +Santomauro +Santone +Santoni +Santopietro +Santopolo +Santor +Santora +Santore +Santorella +Santorelli +Santoriella +Santoro +Santory +Santos +Santoscoy +Santoy +Santoya +Santoyo +Santrizos +Santrmire +Santti +Santucci +Santulli +Santwire +Santy +Sanville +Sanyaro +Sanz +Sanzenbacher +Sanzo +Sanzone +Sanzotta +Sao +Saous +Sapara +Sapardanis +Saperstein +Sapia +Sapien +Sapienza +Sapinski +Sapko +Sapnu +Saporita +Saporito +Sapp +Sappah +Sappenfield +Sapper +Sappington +Saputo +Sar +Sara +Sarabando +Sarabia +Sarac +Saracco +Saraceno +Saracino +Saraf +Sarafian +Sarafin +Saragosa +Saragusa +Sarah +Saraiva +Saralegui +Saran +Sarani +Saraniti +Sarantakis +Saranzak +Sarao +Saras +Sarate +Sarault +Saravia +Sarazin +Sarbacher +Sarber +Sarchet +Sarchett +Sarcia +Sarcinella +Sarcinelli +Sarcone +Sarconi +Sardella +Sarden +Sardi +Sardin +Sardina +Sardinas +Sardinha +Sardo +Sare +Sarelas +Sarellano +Sarensen +Sarette +Saretto +Sarff +Sargeant +Sargent +Sargetakis +Sargis +Saric +Sarin +Sarinana +Sarinsky +Sario +Saris +Sarisky +Sarjeant +Sarjent +Sark +Sarka +Sarkar +Sarkin +Sarkis +Sarkisian +Sarkissian +Sarkodie +Sarks +Sarles +Sarley +Sarli +Sarlinas +Sarlo +Sarmento +Sarmiento +Sarna +Sarnacki +Sarne +Sarnes +Sarni +Sarnicola +Sarno +Sarnoff +Sarnosky +Sarnowski +Saro +Saroop +Saroukos +Sarp +Sarpy +Sarr +Sarra +Sarracino +Sarraga +Sarratt +Sarrell +Sarrett +Sarria +Sarris +Sarro +Sarsfield +Sarson +Sarsour +Sartain +Sartell +Sarti +Sartin +Sartor +Sartore +Sartorelli +Sartori +Sartorio +Sartoris +Sartorius +Sartwell +Sarullo +Sarvas +Sarver +Sarvey +Sarvis +Sarwar +Sarwary +Sarwinski +Sary +Sarzynski +Sas +Sasahara +Sasaki +Sasala +Sasao +Sasengbong +Sashington +Saska +Sasnett +Sasportas +Sass +Sassaman +Sassano +Sasse +Sasseen +Sasser +Sasseville +Sassman +Sasso +Sasson +Sassone +Sastre +Sasuille +Sat +Satar +Satava +Satawa +Satchel +Satchell +Satcher +Satchwell +Sater +Saterfiel +Saterfield +Sather +Sathiraboot +Sathre +Satiago +Satmary +Sato +Satoe +Satomba +Satow +Satre +Satsky +Sattazahn +Sattel +Satter +Satterfield +Satterlee +Satterley +Satterlund +Satterly +Satterthwaite +Satterwhite +Sattlefield +Sattler +Sattley +Satunas +Saturnio +Satz +Sau +Sauage +Sauber +Sauberan +Sauby +Sauce +Sauceda +Saucedo +Sauceman +Saucer +Sauchez +Saucier +Sauder +Sauders +Sauer +Sauerbry +Sauerhage +Sauers +Sauerwein +Sauger +Saugis +Saul +Sauler +Saulino +Saulnier +Saulo +Saulpaugh +Sauls +Saulsberry +Saulsbery +Saulsbury +Sault +Saulter +Saulters +Saults +Saum +Saumier +Saunas +Saunder +Saunders +Saunier +Saupe +Saur +Sauredo +Saurel +Saurer +Sauret +Saurey +Saurez +Sauriol +Sauro +Sause +Sauseda +Sausedo +Sauser +Sausser +Sauter +Sautner +Sautter +Sauvage +Sauvageau +Sauve +Sauveur +Sava +Savage +Savageau +Savaglio +Savakis +Savala +Savannah +Savant +Savard +Savarese +Savaria +Savarino +Savary +Savas +Savasta +Savastano +Savcedo +Save +Savedra +Savel +Savela +Savell +Savelli +Savells +Savely +Saven +Saver +Saverchenko +Savers +Savery +Savi +Saviano +Savic +Savich +Savickas +Savidge +Savilla +Saville +Savin +Savina +Savinar +Savine +Savini +Savino +Savinon +Savio +Saviola +Savitch +Savitsky +Savitts +Savitz +Savka +Savko +Savo +Savoca +Savocchia +Savoie +Savory +Savoy +Sawada +Sawaia +Sawallich +Sawatzke +Sawatzki +Sawatzky +Sawaya +Sawchuk +Sawczyszyn +Sawdey +Sawdo +Sawer +Sawhill +Sawicki +Sawin +Sawina +Sawinski +Sawka +Sawlivich +Sawney +Sawransky +Sawrey +Sawtell +Sawtelle +Sawyer +Sawyers +Sax +Saxbury +Saxby +Saxe +Saxena +Saxfield +Saxinger +Saxman +Saxon +Saxton +Say +Sayaphon +Sayas +Sayasane +Sayavong +Sayco +Saye +Sayed +Sayegh +Sayer +Sayers +Sayko +Sayle +Saylee +Sayler +Sayles +Sayloe +Saylor +Saylors +Sayman +Sayne +Sayre +Sayres +Saysana +Saysithideth +Saysongkham +Sayward +Sayyed +Sazama +Sbano +Sbarra +Sberna +Sboro +Scaccia +Scacco +Scace +Scachette +Scadden +Scadlock +Scafe +Scaff +Scaffe +Scaffidi +Scafuri +Scafuto +Scaggs +Scaglione +Scagliotti +Scahill +Scaia +Scaiano +Scaife +Scala +Scale +Scales +Scalese +Scalet +Scalf +Scali +Scalia +Scalice +Scalise +Scalisi +Scallan +Scalley +Scallion +Scallon +Scallorn +Scally +Scalzi +Scalzo +Scaman +Scamardo +Scamehorn +Scammahorn +Scammon +Scampoli +Scancarello +Scandalios +Scandalis +Scandrett +Scandura +Scandurra +Scanio +Scanlan +Scanlin +Scanlon +Scannapieco +Scannell +Scanneu +Scantlebury +Scantlen +Scantlin +Scantling +Scappaticci +Scarano +Scarber +Scarberry +Scarboro +Scarborough +Scarbro +Scarbrough +Scarce +Scarcia +Scardina +Scardino +Scarduzio +Scarff +Scarfi +Scarfo +Scarfone +Scargall +Scariano +Scaringe +Scaringi +Scarlata +Scarlato +Scarles +Scarlet +Scarlett +Scarnati +Scarnato +Scarola +Scarp +Scarpa +Scarpaci +Scarpati +Scarpato +Scarpelli +Scarpello +Scarpino +Scarpitta +Scarpitto +Scarpone +Scarr +Scarritt +Scarrow +Scarsdale +Scarsella +Scarset +Scarth +Scarver +Scatenato +Scates +Scattergood +Scatton +Scaturro +Scavetta +Scavo +Scavona +Scavone +Scavotto +Scavuzzo +Scearce +Scee +Scelba +Scelfo +Scelsi +Scelzo +Scerbo +Scercy +Scerra +Schaab +Schaack +Schaad +Schaadt +Schaaf +Schaal +Schaalma +Schaap +Schaar +Schaarschmidt +Schab +Schabacker +Schabbing +Schabel +Schaber +Schaberg +Schabert +Schabes +Schabot +Schabowski +Schacher +Schacherer +Schachsieck +Schacht +Schachter +Schachterle +Schack +Schackow +Schacter +Schad +Schade +Schadegg +Schadel +Schader +Schadle +Schadler +Schadt +Schaecher +Schaedler +Schaefer +Schaefers +Schaeffer +Schaeffler +Schaen +Schaer +Schaetzle +Schaf +Schafer +Schafersman +Schaff +Schaffel +Schaffeld +Schaffer +Schaffert +Schaffhauser +Schaffner +Schaffter +Schaible +Schaich +Schain +Schak +Schakel +Schalk +Schall +Schaller +Schallhorn +Schallig +Schalow +Schamber +Schamberger +Schamburek +Schamel +Schaming +Schammel +Schamp +Schams +Schan +Schanbacher +Schanck +Schandel +Schanding +Schane +Schaneman +Schaner +Schange +Schank +Schanno +Schantini +Schantz +Schanz +Schanzenbach +Schap +Schaper +Schapiro +Schapp +Schappach +Schappell +Schappert +Scharbach +Scharber +Scharbor +Scharbrough +Schardein +Schardt +Scharer +Schares +Scharf +Scharfenberg +Scharff +Scharich +Scharler +Scharmann +Scharmer +Scharnberg +Scharp +Scharpf +Scharping +Scharpman +Scharr +Scharrer +Scharte +Schartz +Scharwath +Schatt +Schattner +Schattschneid +Schatz +Schatzberg +Schatzel +Schatzle +Schatzman +Schau +Schaub +Schaubert +Schaubhut +Schauble +Schaudel +Schauer +Schauf +Schaufelberge +Schaul +Schauland +Schauman +Schaumann +Schaumberg +Schaumburg +Schaunaman +Schaunt +Schaupp +Schaus +Schauwecker +Schavone +Schayer +Scheaffer +Schear +Schearer +Schebel +Schebler +Schech +Schechinger +Schechter +Schechtman +Scheck +Schecter +Schedler +Schee +Scheel +Scheele +Scheeler +Scheer +Scheerer +Scheets +Scheetz +Schefers +Scheff +Scheffel +Scheffer +Scheffert +Scheffler +Scheffrahn +Schegetz +Schehl +Schehr +Schei +Scheib +Scheibe +Scheibelhut +Scheiber +Scheible +Scheiblich +Scheibner +Scheid +Scheide +Scheidecker +Scheidegger +Scheidel +Scheider +Scheiderer +Scheidler +Scheidt +Scheiern +Schein +Scheiner +Scheinost +Scheirman +Scheitlin +Schelb +Schell +Schelle +Schellenberg +Schellenberge +Schellenger +Scheller +Schellermann +Schellhammer +Schellhase +Schellhorn +Schellin +Schelling +Schellman +Schells +Schelp +Scheman +Schember +Schembra +Schembri +Schemm +Schemmel +Schemmer +Schemonia +Schempp +Schenck +Schendel +Schenewerk +Schenfeld +Schenk +Schenkel +Schenkelberg +Schenker +Scheno +Schenz +Schepens +Scheperle +Schepers +Schepis +Schepker +Schepp +Scheppe +Schepper +Scheppke +Scher +Scherb +Scherbarth +Scherbel +Scherbring +Scherer +Scherf +Scherff +Scherich +Scherler +Scherma +Scherman +Schermann +Schermer +Schermerhorn +Scherping +Scherr +Scherrer +Scherrman +Scherschligt +Schertz +Scherz +Scherzer +Schessler +Schetrompf +Schettig +Schettler +Scheu +Scheuer +Scheuerman +Scheuermann +Scheuers +Scheule +Scheulen +Scheumann +Scheunemann +Scheuren +Scheurer +Scheuring +Scheuvront +Scheve +Schewe +Schexnayder +Schey +Scheyer +Schiaffino +Schiano +Schiappa +Schiavi +Schiavo +Schiavone +Schiavoni +Schibi +Schick +Schickedanz +Schickel +Schickler +Schie +Schiebel +Schieber +Schied +Schiedler +Schiefelbein +Schiefen +Schiefer +Schieferstein +Schieffer +Schiel +Schield +Schiele +Schieler +Schielke +Schier +Schierbrock +Schierenbeck +Schiermeier +Schiesher +Schiess +Schiesser +Schiff +Schiffelbein +Schiffer +Schiffert +Schiffler +Schiffman +Schiffmann +Schiffner +Schifko +Schifo +Schikora +Schilawski +Schild +Schilder +Schildgen +Schildknecht +Schildt +Schilk +Schilke +Schill +Schillaci +Schille +Schiller +Schilling +Schillinger +Schillings +Schilmoeller +Schilsky +Schiltz +Schilz +Schimandle +Schimanski +Schimek +Schimel +Schimizzi +Schimke +Schimler +Schimmel +Schimming +Schimpf +Schindel +Schindeldecke +Schindele +Schindewolf +Schindler +Schingeck +Schink +Schinke +Schinkel +Schinker +Schinnell +Schipper +Schippers +Schiraldi +Schiralli +Schirm +Schirmer +Schiro +Schirpke +Schirrmacher +Schirtzinger +Schisler +Schissel +Schissler +Schiveley +Schiver +Schkade +Schlaack +Schlabach +Schlabaugh +Schlabs +Schlachter +Schladweiler +Schlaefer +Schlaefli +Schlaffer +Schlag +Schlagel +Schlager +Schlageter +Schlaht +Schlangen +Schlanger +Schlappi +Schlarb +Schlarbaum +Schlater +Schlather +Schlatter +Schlau +Schlauch +Schlecht +Schlechten +Schleck +Schlecter +Schlee +Schlegel +Schleh +Schlehuber +Schleibaum +Schleich +Schleicher +Schleider +Schleifer +Schleiff +Schleig +Schleimer +Schlein +Schleining +Schleis +Schleisman +Schleker +Schlembach +Schlemmer +Schlender +Schlenger +Schlenker +Schlensker +Schlenz +Schlepp +Schleppenbach +Schlepphorst +Schleppy +Schlereth +Schlesener +Schlesier +Schlesinger +Schlesner +Schlesselman +Schlesser +Schlessman +Schlett +Schlette +Schleuder +Schleusner +Schley +Schlichenmaye +Schlicher +Schlicht +Schlichter +Schlichting +Schlick +Schlicker +Schliep +Schlieper +Schliesser +Schlieter +Schlimmer +Schlindwein +Schlinger +Schlink +Schlinker +Schlipf +Schlipp +Schlissel +Schlitt +Schlitz +Schlitzer +Schlobohm +Schloemann +Schloemer +Schloop +Schlosberg +Schloss +Schlossberg +Schlosser +Schlossman +Schlote +Schlotfeldt +Schlott +Schlotte +Schlotter +Schlotterbeck +Schlotthauer +Schlottman +Schlottmann +Schlotzhauer +Schlueter +Schlumaker +Schlund +Schluneger +Schlup +Schlussel +Schluter +Schmader +Schmahl +Schmal +Schmale +Schmaling +Schmaltz +Schmalz +Schmalzried +Schmand +Schmandt +Schmatz +Schmauder +Schmaus +Schmautz +Schmeckpeper +Schmeeckle +Schmeer +Schmeichel +Schmeider +Schmeidler +Schmeiser +Schmeisser +Schmeling +Schmelmer +Schmelter +Schmeltzer +Schmelz +Schmelzer +Schmelzle +Schmerer +Schmerge +Schmertz +Schmick +Schmid +Schmidbauer +Schmider +Schmidgall +Schmidlin +Schmidt +Schmidtka +Schmidtke +Schmied +Schmieder +Schmiedeskamp +Schmiege +Schmiel +Schmier +Schmierer +Schmiesing +Schmig +Schmille +Schmiot +Schmit +Schmith +Schmitke +Schmitmeyer +Schmits +Schmitt +Schmittou +Schmitz +Schmitzer +Schmoak +Schmoldt +Schmoll +Schmollinger +Schmoyer +Schmuck +Schmucker +Schmuff +Schmuhl +Schmunk +Schmutz +Schmutzler +Schnabel +Schnabl +Schnack +Schnackel +Schnackenberg +Schnader +Schnaible +Schnair +Schnake +Schnakenberg +Schnall +Schnapp +Schnarr +Schnarrs +Schnathorst +Schnautz +Schnebly +Schneck +Schneckloth +Schnee +Schneeberger +Schneekloth +Schneeman +Schneider +Schneiderman +Schneidermann +Schneiders +Schneidman +Schneidmiller +Schneidtmille +Schneiter +Schnelder +Schnell +Schnelle +Schneller +Schnelzer +Schnepel +Schnepf +Schnetter +Schnettler +Schnetzer +Schnibbe +Schnick +Schnicke +Schnickel +Schnider +Schnieder +Schnieders +Schnipper +Schnitker +Schnitman +Schnittker +Schnitz +Schnitzer +Schnitzler +Schnobrich +Schnoke +Schnoor +Schnopp +Schnorbus +Schnorr +Schnuerer +Schnur +Schnurbusch +Schnure +Schnurr +Schnyer +Schober +Schoberg +Schobert +Schoborg +Schoch +Schock +Schockley +Schoderbek +Schoeb +Schoebel +Schoeben +Schoeck +Schoeder +Schoeffler +Schoefield +Schoel +Schoell +Schoeller +Schoellkopf +Schoelman +Schoemaker +Schoeman +Schoemer +Schoen +Schoenbeck +Schoenberg +Schoenberger +Schoenborn +Schoene +Schoeneck +Schoenecker +Schoenegge +Schoeneman +Schoenemann +Schoener +Schoenfeld +Schoenfelder +Schoenfeldt +Schoenhals +Schoenhard +Schoenherr +Schoenhut +Schoenig +Schoening +Schoeninger +Schoenle +Schoenleber +Schoenmaker +Schoenrock +Schoenstein +Schoenthal +Schoenwetter +Schoepf +Schoepfer +Schoepflin +Schoepp +Schoeppner +Schoessow +Schoettle +Schoettmer +Schoewe +Schofell +Schoff +Schoffstall +Schofield +Schofill +Schoggen +Schol +Scholer +Scholes +Scholfield +Scholin +Scholl +Scholle +Scholler +Schollmeier +Schollmeyer +Scholnick +Scholten +Scholtens +Scholtes +Scholtz +Scholz +Scholze +Scholzen +Schomacker +Schomaker +Schomas +Schomberg +Schomburg +Schomer +Schomin +Schommer +Schon +Schonack +Schonaerts +Schonberg +Schonberger +Schone +Schoneck +Schoneman +Schonert +Schones +Schonfeld +Schonhardt +Schoninger +Schons +Schontz +Schoo +Schoof +Schook +School +Schoolcraft +Schooler +Schooley +Schoolfield +Schooling +Schoolman +Schools +Schoon +Schooner +Schoonhoven +Schoonmaker +Schoonover +Schop +Schopflin +Schopmeyer +Schopp +Schoppe +Schopper +Schoppert +Schor +Schorder +Schoreplum +Schorn +Schornick +Schorr +Schorsch +Schorzman +Schossow +Schott +Schou +Schoultz +Schouten +Schouviller +Schouweiler +Schoville +Schow +Schowalter +Schowengerdt +Schrab +Schrack +Schrader +Schradle +Schraeder +Schraff +Schrag +Schrage +Schrager +Schram +Schrameck +Schramek +Schramel +Schramm +Schrandt +Schrank +Schrantz +Schranz +Schraub +Schrauder +Schrauger +Schrawder +Schrayter +Schreacke +Schreader +Schrecengost +Schreck +Schreckengost +Schrecker +Schreckhise +Schrecongost +Schreder +Schreffler +Schreiber +Schreier +Schreifels +Schreimann +Schreiner +Schremp +Schrenk +Schreuder +Schreur +Schreurs +Schreyer +Schriber +Schrick +Schrieber +Schriefer +Schrier +Schriever +Schrimpf +Schrimsher +Schriner +Schriver +Schroader +Schrock +Schroder +Schrodt +Schroedel +Schroeden +Schroeder +Schroedter +Schroen +Schroepfer +Schroeppel +Schroer +Schroeter +Schroff +Schroll +Schrom +Schromen +Schronce +Schroot +Schrope +Schrotenboer +Schroth +Schrott +Schroy +Schroyer +Schrubbe +Schrull +Schrum +Schrumpf +Schrunk +Schrupp +Schryer +Schryver +Schub +Schubach +Schubbe +Schuber +Schubert +Schuble +Schuch +Schuchard +Schuchardt +Schuchart +Schuchat +Schuchman +Schuchmann +Schuck +Schucker +Schuckers +Schuckert +Schuckman +Schudel +Schue +Schuele +Schueler +Schuelke +Schueller +Schuemann +Schueneman +Schuenemann +Schuepfer +Schueren +Schuerholz +Schuering +Schuerman +Schuermann +Schuessler +Schueth +Schuett +Schuette +Schuetz +Schuetze +Schuff +Schuffert +Schug +Schuh +Schuhmacher +Schuhmann +Schuiling +Schuit +Schul +Schuld +Schulder +Schuldt +Schulenberg +Schulenburg +Schuler +Schulist +Schulke +Schulkin +Schull +Schulle +Schuller +Schulman +Schult +Schulte +Schulteis +Schultens +Schulter +Schultes +Schultheis +Schultheiss +Schulthess +Schultz +Schultze +Schulweis +Schulz +Schulze +Schum +Schumacher +Schumachor +Schumacker +Schumaker +Schuman +Schumann +Schumans +Schumer +Schumm +Schummer +Schumpert +Schumucker +Schuneman +Schunemann +Schuner +Schunk +Schunter +Schupbach +Schupp +Schuppenhauer +Schuppert +Schur +Schure +Schurer +Schurg +Schuring +Schurk +Schurkamp +Schurman +Schurr +Schurz +Schussler +Schusted +Schuster +Schusterman +Schustrich +Schut +Schute +Schutjer +Schutt +Schutte +Schutter +Schuttler +Schutz +Schutze +Schutzenhofer +Schutzman +Schuur +Schuyleman +Schuyler +Schwab +Schwabauer +Schwabe +Schwabenbauer +Schwaderer +Schwadron +Schwager +Schwalb +Schwalbe +Schwald +Schwalen +Schwalenberg +Schwall +Schwaller +Schwallie +Schwalm +Schwamberger +Schwan +Schwanbeck +Schwander +Schwandt +Schwanebeck +Schwaner +Schwanke +Schwantd +Schwantes +Schwanz +Schwarcz +Schwark +Schwarm +Schwart +Schwarten +Schwarting +Schwarts +Schwartz +Schwartzbach +Schwartzberg +Schwartze +Schwartzenbur +Schwartzer +Schwartzkopf +Schwartzman +Schwartzwalde +Schwarz +Schwarze +Schwarzenbach +Schwarzenberg +Schwarzer +Schwarzkopf +Schwarzlose +Schwass +Schwebach +Schwebel +Schwebke +Schweda +Schwede +Schweder +Schweer +Schweers +Schwegel +Schweickert +Schweigart +Schweiger +Schweigert +Schweiker +Schweikert +Schweim +Schwein +Schweinberg +Schweiner +Schweinert +Schweinfurth +Schweinsberg +Schweiss +Schweitz +Schweitzer +Schweizer +Schwemm +Schwemmer +Schwenck +Schwend +Schwendeman +Schwendemann +Schwendinger +Schwenk +Schwenke +Schwenneker +Schwent +Schwentker +Schwenzer +Schweppe +Schwer +Schwerd +Schwerdt +Schwerdtfeger +Schwerin +Schwering +Schwertfager +Schwertfeger +Schwertner +Schwery +Schwetz +Schweyen +Schwichtenber +Schwiebert +Schwieger +Schwien +Schwier +Schwieson +Schwiesow +Schwieterman +Schwimmer +Schwind +Schwindt +Schwing +Schwingel +Schwinghammer +Schwingler +Schwinn +Schwipps +Schwisow +Schwister +Schwizer +Schwoerer +Schworm +Schwoyer +Schwuchow +Schwulst +Schy +Sciabica +Sciacca +Sciacchitano +Scialdone +Sciallo +Scialpi +Sciancalepore +Sciandra +Scianna +Sciara +Sciarini +Sciarra +Sciarretta +Sciascia +Sciavillo +Scibetta +Scibilia +Scicchitano +Scicutella +Sciera +Scierka +Scieszka +Scifres +Scigliano +Scimeca +Scinto +Sciola +Scioneaux +Sciortino +Sciotti +Scipio +Scipione +Scipioni +Scircle +Scire +Scisco +Scism +Scites +Sciulli +Sciullo +Sciuto +Scivally +Sclafani +Sclavi +Scobee +Scobey +Scobie +Scoble +Scoby +Scocca +Scofield +Scoggan +Scoggin +Scoggins +Scogin +Scoh +Scola +Scolaro +Scoleri +Scoles +Scolieri +Scollan +Scollard +Scolnik +Scoma +Sconce +Sconiers +Scontras +Sconyers +Scopa +Scopel +Scorca +Scordato +Scordino +Scordo +Score +Scoresby +Scorgie +Scorsone +Scorzelli +Scot +Scothorn +Scotland +Scott +Scotten +Scotti +Scotting +Scotto +Scotton +Scotts +Scotty +Scouller +Scouten +Scovel +Scovell +Scovil +Scovill +Scoville +Scow +Scowden +Scozzafava +Scozzari +Scrabeck +Scranton +Scrape +Screen +Screnci +Screws +Scribellito +Scriber +Scribner +Scrichfield +Scrim +Scrimpsher +Scrimsher +Scripps +Scripter +Scripture +Scritchfield +Scriuner +Scriven +Scrivener +Scrivens +Scriver +Scrivner +Scro +Scrobola +Scroger +Scroggie +Scroggin +Scroggins +Scroggs +Scroggy +Scrogham +Scronce +Scrudato +Scruggs +Scruton +Scsarpisnato +Scucchi +Scudder +Scuderi +Scudero +Scudieri +Scuito +Scull +Scullark +Scullawl +Scullen +Sculley +Scullin +Scullion +Scully +Scungio +Scurci +Scurlock +Scurry +Scurti +Scutt +Scyoc +Sczbecki +Sczygiel +Sdoia +Se +Sea +Seabaugh +Seaberg +Seaberry +Seabert +Seabold +Seabolt +Seaborn +Seabreeze +Seabright +Seabron +Seabrook +Seabrooke +Seabrooks +Seaburg +Seaburn +Seabury +Seacat +Seace +Seachord +Seacord +Seacrest +Seacrist +Seaford +Seaforth +Seager +Seagers +Seagle +Seago +Seagrave +Seagraves +Seagren +Seagroves +Seaholm +Seaholtz +Seahorn +Seajack +Seal +Sealander +Seale +Seales +Sealey +Sealock +Seals +Sealy +Seaman +Seamans +Seamen +Seamon +Seamons +Seamster +Sean +Seaney +Seanez +Seang +Seanger +Seanor +Seaquist +Sear +Seara +Searby +Searcey +Search +Searchfield +Searchwell +Searcy +Seard +Searer +Searfoss +Seargent +Searight +Searing +Searl +Searle +Searles +Searls +Sears +Searson +Seary +Sease +Seashore +Seastrand +Seat +Seate +Seaton +Seats +Seaver +Seavers +Seavey +Seavy +Seaward +Seawell +Seawood +Seawright +Seay +Seba +Sebald +Sebasovich +Sebastian +Sebastiano +Sebastien +Sebastion +Sebben +Sebek +Sebeniecher +Seber +Sebero +Sebers +Sebert +Sebesta +Sebestyen +Sebion +Sebo +Sebold +Sebourn +Sebranek +Sebree +Sebren +Sebring +Sebron +Seburg +Sechang +Sechler +Sechrest +Sechrist +Secker +Seckinger +Seckington +Seckler +Seckletstewa +Seckman +Secky +Second +Secondo +Secor +Secora +Secord +Secore +Secrease +Secrest +Secreto +Secrist +Section +Secunda +Secundo +Seda +Sedam +Sedano +Sedanos +Sedar +Sedberry +Sedbrook +Seddon +Sedenko +Seder +Sedgwick +Sedillo +Sedita +Sedivy +Sedlacek +Sedlachek +Sedlack +Sedlak +Sedlay +Sedler +Sedlock +Sedman +Sedor +Sedore +Sedotal +Sedrakyan +Sedtal +Sedwick +Sedy +See +Seebach +Seebaum +Seeber +Seeberger +Seebold +Seecharan +Seecharran +Seed +Seedborg +Seedorf +Seedorff +Seeds +Seefeld +Seefeldt +Seefried +Seegar +Seegars +Seeger +Seegers +Seegert +Seegmiller +Seegobin +Seehafer +Seeholzer +Seehusen +Seek +Seekamp +Seekell +Seekford +Seekins +Seel +Seelbach +Seelbinder +Seeley +Seelig +Seeliger +Seely +Seelye +Seeman +Seemann +Seemer +Seen +Seeney +Seepersaud +Seering +Seery +Sees +Seese +Seesholtz +Seeton +Seever +Seevers +Seewald +Sefcheck +Sefcik +Sefcovic +Seferovic +Seftick +Sefton +Segal +Segala +Segall +Segalla +Segar +Segarra +Segars +Segawa +Segee +Segel +Segelhorst +Seger +Segerman +Segers +Segerson +Seggerman +Segler +Segner +Sego +Segobia +Segonia +Segota +Segouia +Segovia +Segoviano +Segrave +Segraves +Segrest +Segreto +Segroves +Segui +Seguin +Segundo +Segur +Segura +Seher +Sehgal +Sehl +Sehnert +Sehorn +Sehr +Sehrt +Seiavitch +Seib +Seibel +Seiber +Seiberlich +Seiberling +Seibers +Seibert +Seibold +Seibt +Seid +Seide +Seidel +Seidell +Seiden +Seidenbecker +Seidensticker +Seider +Seiders +Seidita +Seidl +Seidle +Seidler +Seidling +Seidlitz +Seidman +Seidner +Seidt +Seielstad +Seier +Seiersen +Seif +Seifarth +Seifer +Seifert +Seiffert +Seifried +Seifts +Seigart +Seigel +Seiger +Seigfried +Seigle +Seigler +Seigworth +Seikaly +Seikel +Seil +Seiler +Seiley +Seilhamer +Seilheimer +Seilhymer +Seils +Seim +Sein +Seiner +Seip +Seipel +Seiple +Seipp +Seirer +Seise +Seiser +Seisler +Seit +Seiter +Seiters +Seith +Seitz +Seitzinger +Seiver +Seivert +Seiwell +Seiz +Sejkora +Sek +Sekel +Sekerak +Seki +Sekula +Sekulski +Sekuterski +Selakovic +Selan +Selander +Selbe +Selbert +Selbig +Selbo +Selby +Selca +Selden +Selders +Seldin +Seldomridge +Seldon +Sele +Seledon +Seleg +Selem +Selesnick +Selestewa +Seley +Self +Selfe +Selfridge +Selgrade +Selia +Seliba +Selic +Selig +Seliga +Seligman +Seligmann +Seligson +Selim +Selin +Seling +Selinger +Selis +Seliski +Selissen +Selitto +Selk +Selke +Selkey +Selking +Selkirk +Sell +Sella +Sellai +Sellar +Sellards +Sellars +Sellberg +Selle +Selleck +Sellek +Sellen +Seller +Sellers +Selley +Sellick +Sellin +Sellinger +Sellman +Sellmeyer +Sellner +Sells +Selma +Selman +Selmer +Selmon +Selnes +Selover +Selph +Selser +Selsor +Seltrecht +Seltz +Seltzen +Seltzer +Selusi +Selva +Selvage +Selvaggi +Selvaggio +Selvera +Selvester +Selvey +Selvidge +Selvig +Selvy +Selway +Selz +Selzer +Selzler +Semaan +Seman +Semans +Semas +Semasko +Sember +Sembler +Sembrat +Semel +Semen +Semenec +Semenick +Sementilli +Semenza +Semetara +Semidey +Semien +Seminario +Seminole +Semke +Semler +Semmel +Semmens +Semmes +Semmler +Semo +Semon +Semone +Semones +Semonick +Semonis +Semons +Sempek +Semper +Sempertegui +Semple +Semprini +Semrad +Semrau +Semsem +Sen +Sena +Senate +Senato +Senatore +Senavanh +Senay +Sencabaugh +Sendejo +Sender +Senderling +Sendra +Sendro +Seneca +Senecal +Senechal +Senegal +Seneker +Senemounnarat +Senerchia +Senese +Senesenes +Senethavilouk +Seney +Senf +Senff +Senft +Seng +Sengbusch +Senger +Sengstock +Sengun +Sengupta +Sengvilay +Senich +Seniff +Senion +Senior +Senk +Senko +Senn +Senna +Senne +Senneker +Senner +Sennett +Senno +Sennott +Senosk +Sens +Sensabaugh +Sensel +Senseman +Sensenbach +Sensenbrenner +Senseney +Sensenig +Sensibaugh +Sensing +Senske +Sensmeier +Sensor +Senst +Senta +Sentell +Senteno +Senter +Senters +Senti +Sentinella +Sentz +Senz +Seo +Sep +Sepe +Sepeda +Seper +Sephton +Sephus +Sepich +Seppa +Seppala +Seppanen +Seppelt +Seppi +Sept +Septelka +Septer +Septon +Sepulbeda +Sepulueda +Sepulvado +Sepulveda +Sepvlieda +Sequeira +Sequin +Sequra +Ser +Sera +Serabia +Serafin +Serafine +Serafini +Serafino +Seraille +Seraiva +Serandos +Serano +Serapio +Serapion +Serasio +Seratt +Seratti +Serb +Serban +Serbus +Sercovich +Serda +Serdula +Sereda +Seremet +Serena +Serene +Serenil +Sereno +Serens +Seres +Serey +Serfass +Serfling +Serfoss +Serge +Sergeant +Sergent +Sergi +Sergio +Sergovia +Serianni +Serice +Serie +Seright +Sering +Serini +Serino +Serio +Serisky +Serl +Serles +Sermania +Sermeno +Sermersheim +Sermon +Sermons +Serna +Sernas +Sero +Seroka +Serpa +Serpas +Serpe +Serpico +Serr +Serra +Serramo +Serrand +Serrano +Serrant +Serrao +Serrata +Serrato +Serratore +Serratos +Serravalli +Serre +Serrell +Serres +Serret +Serrett +Serrin +Serro +Sers +Sersen +Sert +Sertuche +Serum +Serva +Servais +Servan +Servano +Servant +Servantes +Servantez +Servatius +Serve +Servedio +Servello +Serven +Server +Servey +Servi +Service +Servidio +Serville +Servin +Servino +Servis +Serviss +Servoss +Seryak +Sesareo +Sesay +Sesco +Sesko +Sesler +Sesley +Sesma +Sespinosa +Sessa +Sesser +Sessin +Session +Sessions +Sessler +Sesso +Sessom +Sessoms +Sessum +Sessums +Sester +Sestoso +Seta +Setaro +Setchell +Setera +Seth +Sether +Sethi +Seti +Setias +Setlak +Setler +Setliff +Setlock +Seto +Seton +Setser +Sette +Settecase +Setter +Setterberg +Setterland +Setters +Settimo +Setting +Settino +Settle +Settlemire +Settlemires +Settlemyre +Settler +Settles +Setton +Setty +Setzer +Setzler +Seu +Seubert +Seuell +Seufer +Seufert +Seumanu +Seung +Seurer +Seuss +Seutter +Sevaaetasi +Sevadjian +Sevcik +Sevedge +Sevenbergen +Seveney +Sever +Severa +Severance +Severe +Severi +Severin +Severino +Severn +Severns +Severo +Severs +Severson +Severt +Severtson +Severy +Severyn +Sevey +Sevick +Sevier +Sevigny +Sevilla +Sevillano +Seville +Sevin +Sevy +Sewade +Sewald +Sewall +Seward +Seweall +Sewell +Sewer +Sewester +Sewyerd +Sexauer +Sexson +Sexton +Sey +Seyal +Seyb +Seybert +Seybold +Seydel +Seyer +Seyfarth +Seyfert +Seyfried +Seykora +Seykoski +Seyler +Seyller +Seymer +Seymor +Seymore +Seymour +Seymoure +Seys +Sfatcu +Sfera +Sferra +Sferrazza +Sforza +Sgambati +Sgammato +Sgrignoli +Sgro +Sgroi +Sgueglia +Sha +Shaak +Shabala +Shaban +Shabazz +Shabel +Shaben +Shabot +Shack +Shackelford +Shackelton +Shackett +Shackford +Shackle +Shackleford +Shackleton +Shacklett +Shackley +Shad +Shadazz +Shadburn +Shadd +Shadden +Shadding +Shaddix +Shaddock +Shaddox +Shadduck +Shade +Shader +Shadfar +Shadiack +Shadid +Shadix +Shadle +Shadler +Shadley +Shadoan +Shadow +Shadowens +Shadrick +Shadwell +Shadwick +Shady +Shae +Shaefer +Shaeffer +Shaer +Shafe +Shafer +Shaff +Shaffen +Shaffer +Shaffner +Shaffren +Shaffstall +Shafi +Shafran +Shaftic +Shafto +Shaggy +Shaginaw +Shah +Shahan +Shahbaz +Shaheed +Shaheen +Shahid +Shahim +Shahin +Shahinfar +Shahinian +Shaikh +Shain +Shake +Shaker +Shakespear +Shakespeare +Shakin +Shakir +Shaklee +Shakoor +Shala +Shalam +Shalash +Shalhoub +Shalhoup +Shaline +Shall +Shalla +Shallcross +Shallenberger +Shallow +Shalwani +Sham +Shamapande +Shamas +Shambaugh +Shambley +Shamblin +Shambo +Shambrook +Shamburg +Shamburger +Shamel +Shames +Shami +Shamily +Shamir +Shamlin +Shammaa +Shammah +Shammo +Shamonsky +Shamp +Shampine +Shams +Shamsi +Shamsiddeen +Shan +Shanaa +Shanafelt +Shanahan +Shanberg +Shand +Shandley +Shandro +Shands +Shandy +Shane +Shaner +Shaneyfelt +Shangraw +Shanholtz +Shanholtzer +Shani +Shank +Shanker +Shankin +Shankland +Shankle +Shankles +Shanklin +Shankman +Shanks +Shanley +Shanna +Shanno +Shannon +Shannonhouse +Shanon +Shanor +Shansky +Shantz +Shao +Shapard +Shape +Shaper +Shapero +Shapin +Shapino +Shapiro +Shapleigh +Shapley +Shapouri +Shappard +Shappell +Shappen +Shappy +Shapskinsky +Sharabi +Sharar +Sharber +Sharbono +Share +Shareef +Sharer +Sharf +Shariat +Sharick +Sharif +Shariff +Sharifi +Sharits +Shark +Sharkey +Sharko +Sharley +Sharlin +Sharlow +Sharma +Sharman +Sharon +Sharp +Sharpe +Sharper +Sharperson +Sharpes +Sharpey +Sharples +Sharpless +Sharpley +Sharplin +Sharpnack +Sharps +Sharpsteen +Sharpton +Sharr +Sharrai +Sharrar +Sharrard +Sharratt +Sharrer +Sharrett +Sharrieff +Sharrock +Sharron +Sharrow +Shartle +Shartrand +Sharum +Shary +Shaske +Shasky +Shasteen +Shastri +Shatek +Shatley +Shatrau +Shatswell +Shatt +Shattles +Shatto +Shattuck +Shatz +Shatzer +Shau +Shaub +Shaud +Shauer +Shauf +Shauger +Shaughnessy +Shaul +Shaulis +Shaull +Shave +Shaver +Shavers +Shaw +Shawaiki +Shawber +Shawcroft +Shawe +Shawgo +Shawhan +Shawl +Shawler +Shawley +Shawn +Shawnee +Shawver +Shay +Shayne +Shazier +Shbi +Shea +Shead +Sheaff +Sheaffer +Sheahan +Sheakley +Sheaks +Shealey +Shealy +Sheaman +Shean +Shear +Sheard +Shearer +Sheares +Shearhart +Shearier +Shearin +Shearing +Shearman +Shearn +Shearon +Shears +Sheasby +Sheats +Shebby +Shebchuk +Sheck +Sheckler +Sheckles +Shed +Shedd +Shedden +Shedlock +Shedrick +Sheeder +Sheedy +Sheehan +Sheehy +Sheekey +Sheeks +Sheeler +Sheeley +Sheely +Sheen +Sheer +Sheeran +Sheerer +Sheerin +Sheesley +Sheets +Sheetz +Sheff +Sheffel +Sheffer +Sheffey +Sheffield +Sheffler +Sheffo +Sheftall +Shefte +Shehab +Shehan +Shehane +Shehata +Shehee +Shehorn +Sheidler +Sheikh +Sheil +Sheild +Sheilds +Shein +Sheinbein +Sheinberg +Sheingold +Sheirich +Sheive +Shekarchi +Shekels +Shekey +Sheladia +Shelburn +Shelburne +Shelby +Shelden +Sheldon +Sheldrick +Sheldrup +Shelenberger +Sheler +Sheley +Shelhamer +Shelhorse +Sheline +Shelite +Shelko +Shelkoff +Shell +Shellabarger +Shellenbarger +Shellenberger +Sheller +Shelley +Shellgren +Shellhaas +Shellhamer +Shellhammer +Shellhorn +Shelling +Shellito +Shellman +Shellnut +Shells +Shellum +Shelly +Shelman +Shelmon +Shelnutt +Shelor +Shelp +Shelpman +Shelquist +Shelstad +Shelsy +Shelter +Shelton +Sheltra +Sheltrown +Shelvey +Shelvin +Shelvy +Shely +Sheman +Shemanski +Shemper +Shempert +Shemwell +Shen +Shenassa +Shenberger +Shene +Shenefield +Sheneman +Sheng +Shenk +Shenkel +Shenker +Shenkle +Shenkman +Shenton +Shepard +Shepardson +Shepeard +Sheperd +Shephard +Shepheard +Shepherd +Shepler +Shepley +Shepp +Sheppard +Shepperd +Shepperdson +Shepperson +Shepps +Sher +Sherard +Sherbert +Sherbo +Sherbon +Sherbondy +Sherburn +Sherburne +Sherdon +Shere +Sherer +Sherfey +Sherfield +Sherfy +Sherick +Sheridan +Sheridon +Sherief +Sherif +Sheriff +Sherill +Sherk +Sherle +Sherles +Sherley +Sherlin +Sherling +Sherlock +Sherman +Shermer +Shern +Sheroan +Sherod +Sherow +Sherr +Sherraden +Sherrange +Sherrard +Sherratt +Sherrell +Sherren +Sherrer +Sherretts +Sherrick +Sherril +Sherrill +Sherrin +Sherrock +Sherrod +Sherron +Sherrow +Sherry +Shers +Shertzer +Sherville +Sherwin +Sherwood +Sheskey +Sheston +Sheth +Shetlar +Shetler +Shetley +Shetrawski +Shetrone +Shetter +Shetterly +Shettle +Shettleroe +Shettsline +Shetz +Sheu +Sheumaker +Shevenell +Shevitz +Shevlin +Shew +Sheward +Shewbridge +Shewchuk +Shewmake +Shewmaker +Shey +Shi +Shiba +Shibahara +Shibata +Shibi +Shibles +Shibley +Shibuya +Shick +Shidel +Shideler +Shidemantle +Shider +Shidler +Shido +Shieh +Shiel +Shield +Shields +Shiels +Shier +Shierling +Shiers +Shiever +Shiffer +Shifferd +Shiffler +Shifflet +Shifflett +Shifflette +Shiflet +Shiflett +Shifley +Shifman +Shifrin +Shigematsu +Shigemi +Shigemitsu +Shigeta +Shigley +Shigo +Shih +Shihadeh +Shiiba +Shiigi +Shike +Shikles +Shikuma +Shildneck +Shiley +Shiliata +Shilkuski +Shill +Shilleh +Shiller +Shilling +Shillingburg +Shillinger +Shillingford +Shillings +Shillingsford +Shillito +Shilo +Shiloh +Shilt +Shilts +Shim +Shima +Shimabukuro +Shimada +Shimanuki +Shimaoka +Shimasaki +Shimek +Shimer +Shiminski +Shimizu +Shimko +Shimkus +Shimmel +Shimmin +Shimo +Shimomura +Shimon +Shimonishi +Shimp +Shimshak +Shimsky +Shimura +Shin +Shina +Shinabarger +Shinaberry +Shinabery +Shinall +Shinault +Shindel +Shindle +Shindledecker +Shindler +Shindo +Shindorf +Shine +Shiner +Shines +Shingledecker +Shingler +Shingles +Shingleton +Shingleur +Shinholster +Shininger +Shinkel +Shinkle +Shinko +Shinn +Shinners +Shinney +Shinnick +Shinoda +Shinsel +Shinsky +Shintaku +Shintani +Ship +Shipe +Shipes +Shipler +Shiplet +Shiplett +Shipley +Shipman +Shipmen +Shipp +Shippee +Shippen +Shipper +Shippey +Shipps +Shippy +Shipton +Shipwash +Shira +Shirah +Shirai +Shiraishi +Shirakawa +Shiraki +Shirar +Shird +Shire +Shireman +Shirer +Shires +Shirey +Shirilla +Shiring +Shirk +Shirkey +Shirley +Shiro +Shiroma +Shirota +Shirts +Shirvanian +Shishido +Shisila +Shisler +Shiu +Shive +Shivel +Shively +Shiver +Shiverdecker +Shivers +Shives +Shivley +Shivy +Shiyou +Shkreli +Shmidt +Shoaf +Shoaff +Shoals +Shoat +Shoats +Shobe +Shober +Shock +Shockency +Shockey +Shockley +Shoddie +Shodunke +Shoe +Shoemake +Shoemaker +Shoeman +Shoemate +Shoen +Shoenberger +Shoener +Shofestall +Shoff +Shoffner +Shoffstall +Shofner +Shoger +Shogren +Shoji +Sholar +Sholders +Sholes +Sholette +Sholl +Shollenbarger +Shollenberger +Sholler +Sholtis +Sholty +Shomaker +Shoman +Shomer +Shomin +Shomo +Shon +Shone +Shonerd +Shones +Shongo +Shonk +Shonka +Shonkwiler +Shont +Shonts +Shontz +Shoobridge +Shook +Shoop +Shoopman +Shopbell +Shope +Shopen +Shopp +Shoptaw +Shor +Shorb +Shore +Shores +Shorette +Shorey +Shorkey +Shorr +Shorrock +Short +Shortell +Shorten +Shorter +Shortes +Shortey +Shorthair +Shortino +Shortle +Shortnacy +Shortridge +Shorts +Shortsleeve +Shortt +Shorty +Shost +Shostak +Shotkoski +Shoto +Shott +Shotton +Shotts +Shotwell +Shough +Shoulars +Shoulder +Shoulders +Shouldice +Shoulta +Shoults +Shoultz +Shoumaker +Shoun +Shoup +Shoupe +Shouse +Shouts +Shove +Shover +Shovlin +Show +Showalter +Showden +Showe +Showell +Showen +Showers +Showes +Showman +Shown +Shows +Shoyer +Shrader +Shrake +Shramek +Shrawder +Shreck +Shreckengost +Shreeve +Shreeves +Shreffler +Shrefler +Shreiner +Shren +Shreve +Shreves +Shrewsberry +Shrewsbury +Shrider +Shrier +Shrieves +Shrigley +Shrimplin +Shriner +Shriver +Shrock +Shrode +Shroeder +Shroff +Shroll +Shropshire +Shrout +Shroyer +Shrum +Shry +Shryack +Shryer +Shryock +Shu +Shuart +Shub +Shubeck +Shubert +Shubin +Shubov +Shubrick +Shubrooks +Shuck +Shuckhart +Shue +Shuecraft +Shuemaker +Shuey +Shufelt +Shuff +Shuffield +Shufflebarger +Shuffleburg +Shuffler +Shufford +Shuffstall +Shuford +Shuga +Shugars +Shugart +Shugrue +Shuhi +Shuker +Shukert +Shukla +Shula +Shular +Shulda +Shulenberger +Shuler +Shulick +Shull +Shullick +Shulman +Shulse +Shult +Shulte +Shulthess +Shultis +Shults +Shultz +Shulund +Shulz +Shum +Shumake +Shumaker +Shuman +Shumard +Shumate +Shumay +Shumiloff +Shummon +Shumock +Shumpert +Shumski +Shumsky +Shumway +Shunk +Shunnarah +Shupe +Shupert +Shuping +Shupp +Shuptrine +Shur +Shurak +Shure +Shurgot +Shurkus +Shurley +Shurman +Shurr +Shurtleff +Shurtliff +Shurts +Shurtz +Shuskey +Shusta +Shuster +Shusterman +Shute +Shuter +Shutes +Shutler +Shutt +Shutte +Shutter +Shutters +Shuttlesworth +Shuttleworth +Shutts +Shutty +Shvey +Shwab +Shy +Shybut +Shymske +Shyne +Shyu +Si +Sia +Siad +Sialana +Siami +Sianez +Siangco +Siano +Siaperas +Siar +Sias +Sibal +Sibayan +Sibbald +Sibbett +Sibble +Sibel +Sibell +Sibert +Sibeto +Sibgert +Sibilia +Sibilio +Sibille +Sible +Sibley +Sibounma +Sibrel +Sibrian +Siburt +Sic +Sica +Sicard +Sicari +Sichel +Sicheneder +Sichler +Sichta +Sichting +Sicilia +Sicilian +Siciliano +Sicinski +Sick +Sickafoose +Sickel +Sickels +Sickendick +Sickinger +Sickle +Sickler +Sickles +Sickman +Sickmeir +Sicks +Sicola +Sicotte +Sicurella +Sida +Sidberry +Sidbury +Siddall +Siddell +Siddens +Siddiq +Siddiqi +Siddique +Siddiqui +Siddle +Siddon +Siddons +Siddoway +Side +Sidebottom +Sidelinger +Sidell +Sideman +Sidener +Sider +Siderine +Sideris +Siderman +Siders +Sides +Sidhom +Sidhu +Sidi +Sidle +Sidler +Sidles +Sidley +Sidman +Sidney +Sidor +Sidorowicz +Sidoti +Sidur +Sidwell +Siebe +Siebel +Sieben +Siebenaler +Siebenberg +Siebeneck +Siebens +Siebenthal +Sieber +Sieberg +Siebers +Siebert +Siebold +Sieck +Sieczka +Sieczkowski +Siedel +Siedlecki +Siedlik +Siedner +Siefert +Siefferman +Siefke +Siefken +Siefker +Siefkes +Sieg +Siegal +Siegel +Sieger +Siegers +Siegert +Siegfreid +Siegfried +Siegle +Siegler +Siegmund +Siegrist +Siegwarth +Sieja +Sieker +Sielaff +Sieler +Sieligowski +Sieloff +Sielski +Siem +Siembida +Siemek +Siemens +Siemer +Siemering +Siemers +Sieminski +Siemon +Siemonsma +Siems +Siemsen +Sien +Siena +Sienicki +Sienkiewicz +Sienko +Siepker +Sier +Sieracki +Sieradski +Sieren +Sierer +Siering +Sierra +Sierras +Siers +Siert +Sierzenga +Sietsema +Sietsma +Sietz +Sieve +Sievel +Siever +Sieverding +Sievers +Sieverson +Sievert +Sievertsen +Sieving +Siew +Siewers +Siewert +Sifers +Siffert +Sifford +Sifontes +Siford +Sifre +Sifuentes +Sigafoos +Sigafus +Sigala +Sigars +Sigel +Sigers +Sigg +Siggers +Siggins +Siglar +Sigler +Sigley +Siglin +Siglow +Sigman +Sigmon +Sigmond +Sigmund +Signaigo +Signor +Signore +Signorelli +Signorile +Signorino +Signs +Sigona +Sigrist +Siguenza +Sigurdson +Sigwart +Sigworth +Sikander +Sikarskie +Sikat +Sikel +Siker +Sikes +Siket +Sikkema +Sikkila +Sikkink +Sikora +Sikorra +Sikorski +Sikula +Sil +Silacci +Silago +Silagy +Silano +Silao +Silas +Silbaugh +Silber +Silberberg +Silberg +Silberhorn +Silberman +Silbernagel +Silberstein +Silbert +Silbiger +Silcott +Silcox +Silence +Sileo +Siler +Silerio +Siles +Silevinac +Silfies +Silguero +Silha +Siliado +Siliezar +Silis +Silk +Silkenson +Silker +Silkwood +Sill +Silla +Sillas +Sillavan +Silleman +Siller +Sillery +Silletto +Silliman +Sillitoe +Sillitti +Sillman +Silloway +Sills +Silman +Silmon +Silos +Silovich +Silquero +Silsbee +Silsby +Siltman +Silton +Siluis +Silva +Silvaggio +Silvan +Silvano +Silvas +Silveira +Silver +Silvera +Silverberg +Silverhorn +Silveri +Silveria +Silverio +Silverman +Silvernail +Silvernale +Silverness +Silvers +Silversmith +Silverstein +Silverstone +Silverthorn +Silverthorne +Silvertooth +Silverwood +Silvester +Silvestre +Silvestri +Silvestrini +Silvestro +Silvey +Silvi +Silvia +Silvio +Silvis +Silvius +Sim +Sima +Simank +Simao +Simar +Simard +Simas +Simbeck +Simcheck +Simcic +Simco +Simcock +Simcoe +Simcox +Sime +Simek +Simelton +Simenez +Simens +Simensky +Simenson +Simental +Simeon +Simeona +Simeone +Simer +Simerly +Simers +Simerson +Simes +Simi +Simich +Simien +Simila +Similien +Similton +Simington +Simino +Siminski +Simiskey +Simison +Simister +Simitian +Simkin +Simkins +Simko +Simkowitz +Simkulet +Simler +Simley +Simlick +Simm +Simmelink +Simmens +Simmer +Simmering +Simmerman +Simmers +Simmes +Simmions +Simmoms +Simmon +Simmond +Simmonds +Simmoneau +Simmons +Simms +Simo +Simoens +Simoes +Simokat +Simon +Simoncini +Simonds +Simone +Simoneau +Simoneaux +Simoneavd +Simonelli +Simonet +Simonett +Simonetta +Simonetti +Simonetty +Simoni +Simonian +Simoniello +Simonin +Simonis +Simons +Simonsen +Simonson +Simonton +Simor +Simoson +Simpelo +Simper +Simpers +Simpkin +Simpkins +Simple +Simpler +Simpliciano +Simplot +Simpon +Simpson +Simpton +Simril +Sims +Simser +Simson +Simuel +Simunek +Simunovich +Simzer +Sin +Sina +Sinagra +Sinarath +Sinard +Sinatra +Sincebaugh +Sincell +Sinclair +Sinclaire +Sincock +Sindel +Sindelar +Sinden +Sindlinger +Sindoni +Sindorf +Sindt +Sine +Sineath +Sinegal +Siner +Sines +Sing +Singco +Singeltary +Singelton +Singer +Singerman +Singewald +Singh +Singharath +Singhisen +Single +Singler +Singletary +Singleterry +Singleton +Singley +Singlton +Singo +Sings +Singson +Sington +Singuefield +Sinha +Siniard +Sinibaldi +Sinicki +Sininger +Siniscalchi +Sinisi +Sinistore +Sinitiere +Sink +Sinka +Sinkey +Sinkfield +Sinkiewicz +Sinkler +Sinko +Sinkovich +Sinks +Sinn +Sinner +Sinnett +Sinning +Sinnott +Sinon +Sinopoli +Sinor +Sinotte +Sinquefield +Sinrich +Sins +Sinsabaugh +Sinstack +Sinton +Sinyard +Siok +Sioma +Siona +Sionesini +Siordia +Sipe +Sipes +Siphan +Sipho +Sipkema +Sipla +Siple +Sipler +Sipos +Sipp +Sippel +Sipper +Sippial +Sipple +Sippy +Siprasoeuth +Sipriano +Siptak +Siqueiros +Siracusa +Siracuse +Siragusa +Sirak +Siravo +Sirbaugh +Sircy +Siregar +Sirek +Siren +Sires +Sirhan +Siriani +Sirianni +Siriano +Sirico +Sirignano +Sirin +Sirk +Sirko +Sirkoch +Sirles +Sirls +Sirman +Sirmans +Sirmon +Sirmons +Sirna +Sirnio +Sirois +Siroka +Siroky +Sirolli +Siron +Sirosky +Sirpilla +Sirrine +Sirucek +Siruta +Sirwet +Sis +Sisavath +Sisca +Sischo +Sisco +Sise +Sisemore +Sisk +Siska +Siske +Siskey +Siskin +Siskind +Sisko +Sisler +Sisley +Sisneros +Sisneroz +Sisney +Sisofo +Sisomphou +Sison +Sissac +Sissel +Sissell +Sission +Sissman +Sissom +Sisson +Sista +Sistek +Sisti +Sisto +Sistrunk +Sit +Sita +Sitaca +Sitar +Siter +Sites +Sith +Sither +Sitkiewicz +Sitko +Sitler +Sito +Sitosky +Sitra +Sitsler +Sitt +Sitter +Sitterding +Sitterly +Sitterson +Sitterud +Sittig +Sittloh +Sittman +Sittner +Sitto +Sitton +Sittre +Sitts +Situ +Sitz +Sitze +Sitzes +Sitzler +Sitzman +Siu +Siuda +Siurek +Siva +Sivak +Sival +Sivalia +Sivan +Sivay +Sivels +Siver +Siverd +Siverling +Siverly +Sivers +Siverson +Sivert +Sivertsen +Sivertson +Sivia +Sivic +Sivick +Sivie +Sivik +Sivilay +Sivills +Sivils +Sivley +Sivret +Sivyer +Siwek +Siwicki +Siwiec +Siwik +Siwinski +Six +Sixkiller +Sixon +Sixsmith +Sixt +Sixtos +Sizar +Sizelove +Sizemore +Sizer +Sjaarda +Sjerven +Sjoberg +Sjodin +Sjogren +Sjolander +Sjolund +Sjoquist +Sjostrand +Sjostrom +Sjulstad +Skaar +Skaare +Skabo +Skaer +Skafec +Skaff +Skafidas +Skaflen +Skagen +Skagerberg +Skaggs +Skahan +Skains +Skala +Skalak +Skalecki +Skalicky +Skalka +Skalla +Skalski +Skalsky +Skane +Skanes +Skapura +Skar +Skarda +Skare +Skarke +Skarphol +Skartvedt +Skarupa +Skarzynski +Skates +Skattebo +Skay +Skea +Skeans +Skeele +Skeels +Skeem +Skeen +Skeens +Skees +Skeesick +Skeet +Skeete +Skeeter +Skeeters +Skeets +Skeffington +Skehan +Skeldon +Skelley +Skelly +Skelton +Skemp +Skenandore +Skender +Skene +Skepple +Skerl +Skerrett +Skevofilakas +Skewis +Skiba +Skibbe +Skibicki +Skibinski +Skibisky +Skibo +Skibosh +Skibski +Skidgel +Skidmore +Skiff +Skiffington +Skildum +Skiles +Skill +Skillan +Skillen +Skillern +Skillett +Skillicorn +Skilling +Skillings +Skillington +Skillman +Skillom +Skillpa +Skilton +Skimehorn +Skinkle +Skinnen +Skinner +Skinsacos +Skipper +Skipworth +Skirvin +Skiver +Skjei +Sklar +Sklenar +Sknerski +Skobiak +Skocilich +Skoczen +Skoczylas +Skoff +Skog +Skogen +Skoglund +Skogstad +Skoien +Skok +Skokan +Skokowski +Skold +Skolfield +Skolnick +Skolnik +Skomo +Skomsky +Skonczewski +Skone +Skoog +Skora +Skorcz +Skordahl +Skorepa +Skornia +Skornik +Skorski +Skorupa +Skorupski +Skotnicki +Skousen +Skov +Skovira +Skovlund +Skow +Skowron +Skowronek +Skowronski +Skowyra +Skrabanek +Skradski +Skrebes +Skreen +Skretowicz +Skrine +Skrip +Skripko +Skrobacki +Skroch +Skrocki +Skrzypek +Skrzypinski +Skubik +Skubis +Skufca +Skulski +Skultety +Skupski +Skura +Skurski +Skursky +Skuse +Skutnik +Skutt +Skwara +Skwarek +Skweres +Skyberg +Skye +Skyers +Skyes +Skyles +Slabaugh +Slaboda +Slaby +Slack +Slackman +Slacum +Slade +Sladek +Slader +Sladick +Sladky +Slaff +Slagel +Slager +Slaght +Slagle +Slagowski +Slagter +Slaight +Slain +Slama +Slane +Slaney +Slanina +Slankard +Slanker +Slape +Slappey +Slappy +Slark +Slate +Slaten +Slater +Slates +Slatin +Slatkin +Slaton +Slatten +Slatter +Slattery +Slatton +Slaubaugh +Slaugenhaupt +Slaugh +Slaughenhoupt +Slaughter +Slaughterbeck +Slauson +Slaven +Slavens +Slavick +Slavik +Slavin +Slavinski +Slavis +Slawski +Slawson +Slawter +Slay +Slaybaugh +Slayden +Slaydon +Slaymaker +Slayman +Slayter +Slayton +Sleaford +Slechta +Sledd +Sledge +Sledz +Slee +Sleek +Sleeman +Sleeper +Sleet +Sleeter +Sleeth +Sleger +Sleigh +Sleight +Sleighter +Sleiman +Slemmer +Slemmons +Slemp +Slenker +Slentz +Sleper +Sleppy +Slepski +Slessman +Sletten +Sleva +Slevin +Slezak +Slice +Slicer +Slick +Slicker +Slider +Slife +Slifer +Sliffe +Slifko +Sligar +Sliger +Sligh +Slight +Slightam +Sliker +Slim +Slimak +Sliman +Slimko +Slimmer +Sliney +Slinger +Slingerland +Slingland +Slingluff +Slinkard +Slinker +Slinsky +Slipp +Slipper +Slisz +Sliter +Sliva +Slivka +Sliwa +Sliwinski +Sliz +Sloan +Sloane +Sloanes +Sloas +Sloat +Slobodnik +Slockbower +Slocomb +Slocombe +Slocum +Slocumb +Slodysko +Slogeris +Sloma +Sloman +Slomba +Slomer +Slominski +Slomka +Slomkowski +Slomski +Slonaker +Slone +Slonecker +Slonski +Sloon +Sloop +Slosek +Sloss +Slosser +Slostad +Slot +Slota +Slotemaker +Sloter +Slothower +Slotkin +Slotnick +Slough +Sloup +Slovacek +Slovak +Slover +Slovick +Slovinski +Slovinsky +Slowe +Slowey +Slowik +Slowinski +Slown +Sluder +Sluis +Sluka +Slunaker +Slupe +Slusar +Slusarski +Slusher +Sluski +Sluss +Slusser +Sluter +Slutsky +Slutzky +Sluyter +Sly +Slye +Slyter +Slyton +Smack +Smades +Smail +Smalarz +Smaldone +Smale +Small +Smallen +Smaller +Smalley +Smallidge +Smallin +Smalling +Smallman +Smallmon +Smalls +Smallwood +Smalt +Smaniotto +Smar +Smarr +Smarra +Smarsh +Smart +Smartt +Smathers +Smaw +Smay +Smayda +Smead +Smeal +Smeathers +Smeby +Smeck +Smedes +Smedick +Smedley +Smedsrud +Smee +Smeenk +Smeja +Smejkal +Smelcer +Smelko +Smelley +Smelser +Smeltz +Smeltzer +Smerdon +Smerkar +Smestad +Smetak +Smetana +Smethers +Smialek +Smialowski +Smid +Smida +Smiddy +Smidt +Smiechowski +Smietana +Smigaj +Smigel +Smigiel +Smiglewski +Smiht +Smiler +Smiles +Smiley +Smiling +Smillie +Smily +Smink +Smisek +Smit +Smith +Smithberger +Smithe +Smithee +Smithen +Smither +Smitherman +Smithers +Smithey +Smithhart +Smithheart +Smithhisler +Smithingell +Smithj +Smithmyer +Smithson +Smithwick +Smitley +Smitreski +Smits +Smittle +Smitty +Smitz +Smoak +Smock +Smoke +Smoker +Smola +Smolder +Smoldt +Smolen +Smolenski +Smolensky +Smoley +Smolic +Smolik +Smolinski +Smolinsky +Smolka +Smolko +Smolnicky +Smolski +Smoot +Smoots +Smotherman +Smothers +Smouse +Smrekar +Smsith +Smtih +Smuck +Smucker +Smudrick +Smugala +Smuin +Smulik +Smull +Smullen +Smurthwaite +Smutnick +Smutny +Smutz +Smutzler +Smyer +Smyers +Smykowski +Smylie +Smyly +Smyntek +Smyre +Smyrl +Smyrski +Smyser +Smyth +Smythe +Snachez +Snaders +Snaer +Snair +Snape +Snaples +Snapp +Snare +Snarr +Snater +Snavely +Snay +Snaza +Snead +Snearly +Sneary +Sneath +Sneathen +Snedden +Sneddon +Snedegar +Snedeger +Snedeker +Snee +Sneed +Sneeden +Sneider +Snelgrove +Snell +Snellbaker +Snellen +Snellenberger +Sneller +Snellgrove +Snelling +Snellings +Snellman +Snelson +Snerling +Snethen +Snetsinger +Snetting +Snide +Snider +Sniezek +Sniff +Sniffen +Sniffin +Snipe +Snipes +Snith +Snitker +Snively +Snobeck +Snock +Snodderly +Snoddy +Snode +Snoderly +Snodgrass +Snoke +Snook +Snooks +Snoots +Snoozy +Snopek +Snorden +Snorton +Snover +Snow +Snowball +Snowberger +Snowdeal +Snowden +Snowder +Snowdon +Snowdy +Snowman +Snuffer +Snuggs +Snyder +Snyders +So +Soans +Soape +Soapes +Soard +Soares +Sobania +Sobanski +Sobba +Sobczak +Sobczyk +Sobczynski +Sobe +Sobeck +Sobel +Sobenes +Sober +Soberanes +Soberanis +Soberano +Sobers +Sobery +Sobeski +Sobey +Sobie +Sobiech +Sobieraj +Sobieski +Sobilo +Sobin +Sobina +Soble +Sobol +Soboleski +Sobolewski +Sobolik +Sobon +Sobota +Sobotka +Sobotta +Sobran +Sobrino +Sobrio +Sobrowski +Sobus +Socci +Socha +Sochan +Sochocki +Sochor +Socia +Sockalosky +Sockey +Socks +Sockwell +Socorro +Soda +Sodachanh +Sodano +Sodaro +Sodawasser +Sode +Sodek +Sodeman +Soden +Soder +Soderberg +Soderblom +Sodergren +Soderholm +Soderling +Soderlund +Soderman +Soderquist +Soders +Soderstrom +Sodervick +Sodhi +Sodini +Sodomka +Soechting +Soeder +Soehl +Soellner +Soenksen +Soens +Soesbe +Sofer +Soffa +Soffel +Soffer +Sofia +Sofka +Sofranko +Softich +Softleigh +Soga +Sogge +Sogol +Sohl +Sohm +Sohn +Sohns +Soho +Sohr +Sohrabi +Sohre +Soibelman +Soifer +Soileau +Soiro +Soisson +Soito +Soja +Sojda +Sojka +Sojo +Sojourner +Sok +Sokal +Sokol +Sokolik +Sokoloff +Sokoloski +Sokolowich +Sokolowski +Sokolski +Sokolsky +Sokorai +Sokotowski +Sokul +Sol +Sola +Soladine +Solages +Solaita +Solak +Solan +Solana +Soland +Solanki +Solano +Solar +Solares +Solari +Solarski +Solarz +Solarzano +Solas +Solazar +Solberg +Soldan +Soldano +Soldavini +Soldeo +Solders +Soldner +Soldo +Soldow +Sole +Solecki +Soledad +Solem +Soleman +Soler +Solera +Soles +Solesbee +Soley +Solgovic +Solheim +Solhjem +Solian +Soliani +Solich +Solid +Soliday +Solie +Soliece +Solien +Solies +Solima +Soliman +Solimeno +Solimini +Solina +Solinas +Solinger +Solinski +Solis +Solito +Solivan +Soliz +Solkowitz +Soll +Solla +Sollars +Sollberger +Solle +Sollenberger +Soller +Sollers +Solley +Solliday +Sollie +Sollis +Sollitto +Sollman +Sollock +Sollors +Solly +Solman +Solmonson +Solo +Soloman +Solomen +Solomon +Solomons +Solon +Solonar +Solonika +Solorio +Solorsano +Solorzano +Soloveichik +Solow +Soloway +Solt +Soltani +Soltau +Soltero +Soltes +Soltis +Soltmann +Solton +Soltow +Soltren +Soltys +Solum +Soluri +Solverson +Solverud +Solwold +Solymani +Som +Somalski +Soman +Somani +Somayor +Somdah +Somer +Somera +Somerfield +Somero +Somers +Somerset +Somerville +Somes +Somilleda +Somji +Somma +Sommar +Sommella +Sommer +Sommerdorf +Sommerfeld +Sommerfeldt +Sommerfield +Sommers +Sommerville +Sommese +Sommons +Somo +Somodi +Somogye +Somogyi +Somoza +Somrak +Somsana +Somsy +Somvang +Son +Sondag +Sonday +Sondelski +Sonderegger +Sondergaard +Sonderman +Sonders +Sonderup +Sondheimer +Sondles +Sondrini +Sondrol +Sondrup +Sones +Song +Songco +Songer +Songster +Songy +Soni +Sonia +Sonier +Sonka +Sonkens +Sonkin +Sonnabend +Sonne +Sonneborn +Sonnee +Sonnefeld +Sonnek +Sonnen +Sonnenberg +Sonnenburg +Sonnenfeld +Sonner +Sonnier +Sonntag +Sonny +Sonoda +Sonoski +Sons +Sonsino +Sonsteng +Sonstroem +Sontag +Sonterre +Sontheimer +Sonza +Soo +Sood +Soohoo +Sookoo +Sookram +Soolua +Soomaroo +Soong +Soop +Soorus +Soos +Soose +Sooter +Sooy +Sopata +Sopczak +Soper +Sopha +Sopher +Sophy +Sopko +Soplop +Sopp +Soppe +Soppeland +Soprych +Soptick +Soqui +Sor +Sora +Sorace +Soran +Soratos +Soravilla +Sorbello +Sorber +Sorbera +Sorbo +Sorce +Sordahl +Sordia +Sorel +Sorell +Sorells +Soren +Sorensen +Sorenson +Sorey +Sorg +Sorgatz +Sorge +Sorgente +Sorgi +Sorhaindo +Soria +Soriano +Sorice +Soricelli +Sorin +Sorkin +Sorley +Sorlie +Sorman +Sorn +Sornsen +Soro +Soroa +Soroka +Sorokata +Sorokin +Sorola +Soron +Soros +Sorotzkin +Sorrel +Sorrell +Sorrells +Sorrels +Sorrentino +Sorrick +Sorrow +Sorsby +Sortino +Sortland +Sorto +Sortor +Sortore +Sorum +Sorvig +Sorvillo +Sorzano +Sos +Sosa +Sosaya +Sosbe +Sosbee +Sosby +Soscia +Sosebee +Sosh +Soshnik +Sosinski +Sosinsky +Sosna +Sosnowski +Sossaman +Sossamon +Sosso +Sossong +Sostre +Sota +Sotak +Sotello +Sotelo +Soter +Sotero +Soteros +Sothen +Sothman +Sotiriou +Sotlar +Soto +Sotolo +Sotolongo +Sotomayer +Sotomayor +Sotos +Sottile +Sotto +Sottosanti +Sou +Soucek +Souchet +Soucie +Soucier +Soucy +Souder +Souders +Souers +Souffrant +Souffront +Souhrada +Soukkhavong +Soukup +Soula +Soulard +Soulasinh +Soule +Soulek +Soules +Soulia +Soulier +Souliere +Soulliere +Soult +Soun +Soundara +Souphom +Sour +Sourlis +Sours +Sourwine +Sous +Sousa +Souser +Souter +South +Southall +Southam +Southand +Southard +Southcott +Souther +Southerland +Southerly +Southern +Southers +Southgate +Southmayd +Southward +Southwell +Southwick +Southwood +Southworth +Souto +Souvannakhily +Souvannakhiry +Souvannarith +Souvannasap +Souvannavong +Souza +Sova +Sovak +Sovel +Sovereign +Sovern +Soverns +Sovey +Sovich +Sovie +Sovocool +Sow +Sowa +Sowada +Soward +Sowards +Sowash +Sowden +Sowder +Sowders +Sowell +Sowells +Sowels +Sower +Sowerby +Sowers +Sowinski +Sowl +Sowle +Sox +Soyars +Soyke +Soza +Sozio +Sozzi +Spaar +Spacagna +Space +Spacek +Spach +Spacht +Spachtholz +Spackman +Spada +Spadaccini +Spadafino +Spadafora +Spadafore +Spadard +Spadaro +Spade +Spadea +Spader +Spadlin +Spadoni +Spady +Spaeth +Spafford +Spagna +Spagnola +Spagnoli +Spagnolia +Spagnolo +Spagnuolo +Spahn +Spahr +Spaid +Spaide +Spain +Spainhour +Spainhower +Spake +Spakes +Spalding +Spalinger +Spall +Spalla +Spallina +Spallone +Spalter +Spaman +Span +Spana +Spanbauer +Spancake +Spane +Spanfellner +Spang +Spangenberg +Spanger +Spangle +Spangler +Spanicek +Spaniel +Spanier +Spanish +Spann +Spannaus +Spannbauer +Spanner +Spannuth +Spano +Spanos +Spanski +Spanswick +Spanton +Spar +Spara +Sparacina +Sparacino +Sparacio +Sparaco +Sparano +Spare +Sparger +Spargo +Spargur +Sparhawk +Spark +Sparkes +Sparkman +Sparks +Sparlin +Sparling +Sparr +Sparrow +Spart +Spartichino +Spartin +Spartz +Spasiano +Spatafora +Spatafore +Spataro +Spates +Spath +Spatz +Spaugh +Spaulding +Spaun +Spaur +Spaw +Spayd +Spayer +Spaziani +Spaziano +Speach +Spead +Speagle +Speak +Speake +Speaker +Speakes +Speakman +Speaks +Spear +Speares +Spearin +Spearing +Spearman +Spearmon +Spearow +Spears +Speas +Spease +Specchio +Spece +Specht +Speciale +Speck +Specken +Specking +Speckman +Specter +Spector +Spee +Speece +Speed +Speedy +Speegle +Speelman +Speer +Speers +Spees +Speese +Spegal +Speh +Spehar +Speice +Speich +Speicher +Speidel +Speidell +Speiden +Speier +Speigel +Speight +Speights +Speilman +Speir +Speirs +Speis +Speiser +Speith +Spell +Spella +Spellacy +Spellane +Speller +Spellman +Spells +Spelman +Spelts +Speltz +Spena +Spenard +Spence +Spencer +Spender +Spendlove +Spene +Spengler +Spenner +Spennicchia +Speno +Spenser +Spenst +Spera +Sperandeo +Sperandio +Speranza +Speraw +Sperazza +Sperbeck +Sperber +Sperberg +Sperdute +Sperduti +Sperger +Sperier +Sperka +Sperl +Sperle +Sperlich +Sperling +Spero +Speroni +Speros +Sperow +Sperrey +Sperry +Spessard +Speth +Spettel +Spetter +Spevacek +Spevak +Speyer +Speyrer +Speziale +Spezio +Sphon +Spice +Spicer +Spicher +Spickard +Spicker +Spickerman +Spickler +Spicknall +Spicuzza +Spidel +Spidell +Spidle +Spiece +Spiegel +Spiegelman +Spiegle +Spiegler +Spieker +Spielberg +Spieler +Spielmaker +Spielman +Spielmann +Spielvogel +Spier +Spiering +Spierling +Spiers +Spies +Spiess +Spieth +Spiewak +Spigelman +Spigelmyer +Spight +Spigner +Spigutz +Spika +Spike +Spiker +Spikes +Spilde +Spiliakos +Spilis +Spilker +Spillane +Spille +Spiller +Spillers +Spillett +Spillman +Spilman +Spilski +Spina +Spinale +Spinar +Spinas +Spincic +Spindel +Spindle +Spindler +Spindola +Spine +Spinella +Spinelli +Spinello +Spinetti +Spiney +Spingler +Spingola +Spink +Spinka +Spinks +Spinn +Spinner +Spinney +Spino +Spinola +Spinosa +Spinoso +Spinoza +Spinuzzi +Spiotta +Spira +Spire +Spirek +Spirer +Spires +Spirito +Spirk +Spirko +Spiro +Spiroff +Spirounias +Spiry +Spisak +Spitale +Spiter +Spitler +Spitsberg +Spittle +Spittler +Spitz +Spitzer +Spitznogle +Spiva +Spivack +Spivak +Spivery +Spivey +Spiwak +Spizer +Spizzirri +Splain +Splane +Splatt +Splawn +Splett +Spletzer +Splinter +Splitt +Splonskowski +Spoden +Spoelstra +Spoerer +Spoerl +Spofford +Spohn +Spohnholz +Spohr +Spolar +Spoleti +Spomer +Sponaugle +Spong +Sponholz +Sponseller +Sponsler +Spontak +Spoon +Spoonamore +Spoonemore +Spooner +Spoor +Sporcic +Spore +Sporer +Sporich +Sporle +Sporleder +Sporman +Sporn +Sport +Sports +Sportsman +Sporysz +Sposato +Sposito +Spoth +Spoto +Spotorno +Spotted +Spotts +Spotwood +Spraberry +Spracklen +Spracklin +Spradley +Spradlin +Spradling +Sprafka +Spragg +Spraggins +Spraggs +Spragins +Spragley +Spraglin +Sprague +Sprain +Sprake +Spraker +Sprandel +Sprang +Spranger +Sprankle +Spraque +Spratlen +Spratley +Spratlin +Spratling +Spratt +Spratte +Sprau +Sprauve +Sprawls +Spray +Sprayberry +Sprecher +Spreen +Sprehe +Spreitzer +Spreng +Sprengeler +Sprengelmeyer +Sprenger +Sprenkel +Sprenkle +Sprewell +Sprigg +Spriggins +Spriggle +Spriggs +Spring +Springate +Springe +Springer +Springfield +Springle +Springman +Springmeyer +Springs +Springstead +Springsteen +Springston +Sprinkel +Sprinkle +Sprinkles +Sprinzl +Spritzer +Sproat +Sprock +Sprole +Sproles +Sprong +Sprosty +Sprott +Sprouffske +Sproul +Sproule +Sproull +Sprouls +Sprouse +Sprout +Sprow +Sprowl +Sprowls +Spruance +Spruce +Spruel +Spruell +Spruiell +Spruill +Spruit +Sprung +Sprunger +Sprunk +Sprvill +Spry +Sprygada +Spuck +Spudis +Spueler +Spuhler +Spuler +Spulick +Spunt +Spurbeck +Spurgeon +Spurger +Spurgers +Spurgin +Spurlin +Spurling +Spurlock +Spurr +Spurrier +Spurzem +Spycher +Spyies +Spyrakos +Spyres +Squadrito +Squair +Squarciafico +Square +Squeo +Squibb +Squier +Squiers +Squillace +Squillante +Squines +Squire +Squires +Squitieri +Squyres +Srader +Sramek +Sreaves +Srey +Srinivasan +Srinvasan +Srivastava +Srnsky +Srock +Sroczynski +Sroka +Sroufe +Srour +Srsen +Srsic +Srygley +Staab +Staack +Staadt +Staal +Staats +Staback +Stabb +Stabel +Stabell +Staber +Staberg +Stabile +Stable +Stableford +Stablein +Stabler +Stabley +Stabs +Stace +Stacer +Stacey +Stach +Stachecki +Stachnik +Stachniw +Stachowiak +Stachowicz +Stachowski +Stachura +Stachurski +Stack +Stacken +Stacker +Stackhouse +Stackpole +Stacks +Stacy +Stadden +Stade +Stadel +Stadelman +Stader +Stadheim +Stadick +Stadler +Stadnik +Stadt +Stadther +Stadtlander +Stadtler +Stadtmiller +Stady +Staebell +Staebler +Staehle +Staehler +Staelens +Staenglen +Staff +Staffeld +Staffen +Staffieri +Staffon +Stafford +Stafiej +Stage +Stageman +Stager +Stagers +Stagg +Stagger +Staggers +Staggs +Stagles +Stagliano +Stagman +Stagnaro +Stagner +Stagnitta +Stagnitto +Stagno +Stagowski +Staheli +Stahl +Stahlberg +Stahle +Stahlecker +Stahler +Stahley +Stahlhut +Stahlman +Stahlnecker +Stahly +Stahmer +Stahnke +Stahoski +Stahr +Stai +Staiano +Staib +Staie +Staiger +Stailey +Stain +Stainbach +Stainback +Stainbrook +Staine +Staines +Staino +Stains +Stair +Staires +Stairs +Stake +Stakelin +Stakem +Stakemann +Staker +Stakes +Stakkeland +Stakley +Stakoe +Stalberger +Stalcup +Stalder +Staley +Stalford +Stalker +Stall +Stallard +Stallbaumer +Stallcup +Staller +Stalley +Stalling +Stallings +Stallins +Stallion +Stallman +Stallone +Stallones +Stallons +Stalls +Stallsmith +Stallsworth +Stallworth +Stalma +Stalnaker +Stalter +Stalvey +Stalworth +Stalzer +Stam +Stamand +Stamant +Stamas +Stamatopoulos +Stambach +Stambaugh +Stambough +Stamdifer +Stamenov +Stamer +Stamey +Stamison +Stamm +Stammel +Stammer +Stammler +Stamnos +Stamos +Stamour +Stamp +Stampe +Stamper +Stampka +Stample +Stampley +Stamps +Stan +Stana +Stanage +Stanaland +Stanard +Stanaway +Stanback +Stanbaugh +Stanberry +Stanbery +Stanbrough +Stancato +Stancer +Stancey +Stanchfield +Stanciel +Stancil +Stancill +Stancle +Stancliff +Stanclift +Stanco +Stancombe +Stancoven +Stanczak +Stanczyk +Standaert +Standafer +Standage +Standahl +Standard +Standback +Standberry +Standefer +Standen +Stander +Standerfer +Standerwick +Standeven +Standfield +Standford +Standifer +Standiford +Standifur +Standing +Standish +Standke +Standlee +Standley +Standors +Standre +Standrew +Standridge +Standring +Standrod +Stands +Staneart +Stanek +Stanely +Staner +Stanert +Stanesic +Stanfa +Stanfield +Stanfill +Stanford +Stanforth +Stang +Stanganelli +Stangarone +Stange +Stangel +Stanger +Stangl +Stangle +Stango +Stangroom +Stanhope +Stania +Stanick +Staniec +Stanier +Stanifer +Staniford +Staniforth +Stanis +Stanish +Stanislaw +Stanislawski +Staniszewski +Stank +Stankaitis +Stanke +Stankey +Stankiewicz +Stanko +Stankovic +Stankovich +Stankowitz +Stankus +Stanley +Stanly +Stannard +Stano +Stanojevic +Stanovich +Stanowski +Stanphill +Stansberry +Stansbery +Stansbury +Stansel +Stansell +Stansfield +Stansifer +Stant +Stanton +Stanuszek +Stanway +Stanwick +Stanwood +Stanzak +Stanzione +Stapel +Stapelman +Stapels +Stapelton +Stapf +Staple +Stapleford +Stapler +Staples +Stapleton +Stapley +Staplins +Stapp +Star +Starace +Starbird +Starbuck +Starcevic +Starcevich +Starch +Starcher +Starchman +Starcic +Starck +Stare +Starek +Stargel +Stargell +Starghill +Starich +Starin +Stark +Starke +Starken +Starkes +Starkey +Starkie +Starkman +Starks +Starkson +Starkweather +Starley +Starlin +Starling +Starliper +Starmer +Starn +Starnaud +Starnauld +Starner +Starnes +Starnold +Starns +Starowicz +Starowitz +Starr +Starratt +Starrett +Starrick +Starring +Starritt +Starrs +Starry +Stars +Start +Startin +Startt +Startup +Startz +Starwalt +Starweather +Stary +Starzyk +Starzynski +Stas +Stasa +Staschke +Staser +Stash +Stasiak +Stasik +Stasinos +Stasio +Stasiuk +Stasko +Stasny +Stassen +Stasser +Stassi +Stassinos +Stastny +Stasulis +Staszak +State +Staten +Stater +States +Statham +Stathas +Stathes +Stathis +Stathopoulos +Stathos +Station +Statires +Statler +Staton +Stattelman +Statton +Statum +Statz +Statzer +Staub +Stauber +Staubin +Stauble +Staubs +Stauch +Staude +Staudenmeier +Stauder +Staudinger +Staudt +Staufenberger +Stauffacher +Stauffer +Staum +Staunton +Staup +Stauss +Stautz +Stave +Stavely +Staver +Staves +Stavinoha +Stavis +Stavish +Stavnes +Stavrides +Stavropoulos +Stavros +Stavrositu +Stavrou +Stavsvick +Stawarz +Stawasz +Stawicki +Stay +Stayer +Stayner +Stayrook +Stayter +Stayton +Stazenski +Stcharles +Stchur +Stclair +Stclaire +Stcroix +Stcyr +Stdenis +Stdenny +Stea +Steach +Stead +Steadham +Steadings +Steadman +Steady +Steagall +Steagell +Steakley +Stealey +Stealy +Steans +Stear +Stearman +Stearn +Stearne +Stearnes +Stearns +Stears +Stebbins +Stebe +Steber +Stebner +Stec +Stech +Stecher +Stechlinski +Stechuchak +Steck +Steckel +Steckelberg +Stecker +Stecklair +Stecklein +Steckler +Steckley +Steckline +Steckman +Steczo +Stedman +Stedronsky +Steeb +Steeber +Steeby +Steed +Steedley +Steedman +Steeg +Steege +Steel +Steele +Steeley +Steelman +Steelmon +Steely +Steen +Steenberg +Steenbergen +Steenburg +Steenburgh +Steeneck +Steenhard +Steenhoven +Steenhuis +Steenken +Steenland +Steeno +Steenrod +Steensland +Steenwyk +Steep +Steeples +Steer +Steere +Steerman +Steese +Steever +Steeves +Stefan +Stefanatos +Stefanelli +Stefani +Stefaniak +Stefanich +Stefanick +Stefanik +Stefano +Stefanovich +Stefanow +Stefanowicz +Stefanski +Stefansky +Steff +Steffa +Steffan +Steffani +Steffee +Steffel +Steffen +Steffenhagen +Steffens +Steffensen +Steffensmeier +Steffenson +Steffes +Steffey +Steffler +Stefford +Steffy +Stefka +Stefl +Stegall +Stegeman +Stegemann +Stegent +Steger +Steggeman +Stegmaier +Stegman +Stegmann +Stegner +Stehle +Stehlik +Stehlin +Stehly +Stehney +Stehno +Stehr +Steib +Steibel +Steiber +Steich +Steichen +Steidel +Steider +Steidinger +Steidl +Steidley +Steier +Steiert +Steifle +Steiger +Steigerwald +Steigerwalt +Steighner +Steigman +Steik +Steil +Steiling +Steimer +Steimle +Stein +Steinacker +Steinau +Steinauer +Steinbach +Steinbacher +Steinback +Steinbauer +Steinbaugh +Steinbeck +Steinberg +Steinberger +Steinbock +Steinborn +Steinbrecher +Steinbrenner +Steinbrink +Steinbrook +Steinbruckner +Steinburg +Steindorf +Steine +Steiner +Steinerkert +Steinert +Steines +Steinfeld +Steinfeldt +Steinger +Steinhagen +Steinhardt +Steinhart +Steinharter +Steinhauer +Steinhaus +Steinhauser +Steinhoff +Steinhorst +Steinhour +Steinhouse +Steiniger +Steininger +Steinkamp +Steinke +Steinkellner +Steinkirchner +Steinkraus +Steinkuehler +Steinle +Steinlicht +Steinmacher +Steinman +Steinmann +Steinmeiz +Steinmetz +Steinmeyer +Steinmiller +Steinmuller +Steinour +Steinruck +Steins +Steinway +Steinworth +Steir +Steiskal +Steitz +Steitzer +Stejskal +Steketee +Stelb +Stele +Stelk +Stell +Stella +Stellato +Stelle +Steller +Stellfox +Stellhorn +Stelling +Stellings +Stellmacher +Stellman +Stello +Stellpflug +Stelluti +Stelly +Stelmach +Stelmack +Stelman +Steltenpohl +Stelter +Stelting +Steltzer +Stelzer +Stelzl +Stem +Steman +Stemarie +Stembridge +Stemen +Stemler +Stemm +Stemme +Stemmer +Stemmerman +Stemmler +Stemp +Stempel +Stemper +Stempert +Stempien +Stemple +Sten +Stenback +Stenbeck +Stenberg +Stencel +Stencil +Stendal +Stendeback +Stender +Stene +Stenehjem +Stenerson +Stengel +Stengele +Stenger +Stengle +Stenkamp +Stenman +Stenn +Stenner +Stennett +Stennis +Stenquist +Stenseth +Stensland +Stenslie +Stenslien +Stenson +Stensrud +Stenstrom +Stent +Stentzel +Stenz +Stenzel +Step +Stepan +Stepanek +Stepaniak +Stepanian +Stepanik +Stepanski +Stepchinski +Stephan +Stephanie +Stephano +Stephans +Stephanski +Stephany +Stephco +Stephen +Stephens +Stephensen +Stephenson +Stephson +Stepien +Stepler +Stepleton +Stepney +Stepnoski +Stepnowski +Stepovich +Stepp +Steppe +Steppello +Steppig +Stepps +Stepro +Stepter +Steptoe +Steptore +Ster +Sterba +Sterback +Sterbenz +Sterett +Sterger +Stergios +Sterk +Sterkel +Sterkenburg +Sterker +Sterlace +Sterle +Sterley +Sterlin +Sterling +Sterman +Stermer +Stern +Sternal +Sternberg +Sternberger +Sterner +Sternisha +Sternod +Sterns +Sterpka +Sterr +Sterrett +Sterry +Stetke +Stetler +Stetson +Stettler +Stettner +Stetz +Stetzel +Stetzenbach +Steuart +Steube +Steuber +Steuck +Steudeman +Steuer +Steurer +Steury +Steve +Steven +Stevener +Stevens +Stevenson +Stever +Steverson +Steves +Steveson +Stevey +Stevick +Stevinson +Stevison +Steward +Stewardson +Stewart +Stewarts +Stewert +Steyer +Stezzi +Stfleur +Stflorant +Stford +Stfort +Stgelais +Stgeorge +Stgerard +Stgermain +Stgermaine +Sthilaire +Sthill +Sthole +Stibb +Stibbins +Stice +Stich +Sticher +Sticht +Stichter +Stick +Stickel +Stickels +Sticker +Stickford +Stickfort +Stickland +Stickle +Sticklen +Stickler +Stickles +Stickley +Sticklin +Stickman +Stickney +Stickrath +Stickrod +Stidam +Stidd +Stidham +Stidman +Stidstone +Stieb +Stiebel +Stieber +Stief +Stiefel +Stieff +Stieg +Stiegemeier +Stieger +Stiegler +Stieglitz +Stiegman +Stiehl +Stiehm +Stiel +Stielau +Stiely +Stien +Stiens +Stier +Stierle +Stiern +Stiers +Stierwalt +Stifel +Stiff +Stifflemire +Stiffler +Stifter +Stigall +Stiger +Stigers +Stigger +Stiggers +Stigler +Stigsell +Stika +Stike +Stikeleather +Stile +Stiles +Stilgenbauer +Stiliner +Still +Stillabower +Stille +Stiller +Stilley +Stillie +Stillinger +Stillings +Stillion +Stillions +Stillman +Stills +Stillson +Stillwagon +Stillwell +Stilner +Stilphen +Stilson +Stiltner +Stilts +Stiltz +Stilwagen +Stilwell +Stimac +Stimage +Stiman +Stimer +Stimits +Stimler +Stimmel +Stimmell +Stimpert +Stimple +Stimpson +Stimson +Stimus +Stinar +Stinchcomb +Stinchfield +Stinde +Stindt +Stine +Stinebaugh +Stinebuck +Stinehelfer +Stinehour +Stinemetz +Stiner +Stines +Stinespring +Stinett +Stingel +Stinger +Stingle +Stingley +Stinner +Stinnett +Stinnette +Stinser +Stinson +Stinton +Stipanuk +Stipe +Stipek +Stipes +Stipetich +Stipp +Stippich +Stire +Stires +Stirewalt +Stirgus +Stirk +Stirling +Stirman +Stirn +Stirna +Stirrup +Stitch +Stiteler +Stitely +Stites +Stith +Stitt +Stittgen +Stittsworth +Stitz +Stitzel +Stitzer +Stivanson +Stivason +Stiver +Stivers +Stiverson +Stives +Stjacques +Stjames +Stjean +Stjohn +Stjohns +Stjulian +Stjulien +Stjuste +Stlaurent +Stlawrence +Stlouis +Stlouise +Stlucien +Stmarie +Stmartin +Stmary +Stmichel +Stoa +Stoakley +Stobaugh +Stobb +Stobbe +Stobbs +Stober +Stobie +Stobierski +Stocco +Stock +Stockard +Stockbridge +Stockburger +Stockdale +Stockdill +Stocke +Stockebrand +Stockel +Stocker +Stockert +Stockett +Stockfisch +Stockham +Stockhausen +Stockhoff +Stockholm +Stocki +Stocking +Stockinger +Stockley +Stockman +Stockmaster +Stockner +Stockon +Stocks +Stockstill +Stockton +Stockwell +Stockwin +Stoddard +Stoddart +Stodden +Stodder +Stodgell +Stodghill +Stodola +Stodolski +Stodomingo +Stoeber +Stoeberl +Stoebner +Stoeckel +Stoecker +Stoeckert +Stoecklin +Stoeffler +Stoeger +Stoehr +Stoeke +Stoel +Stoeltzing +Stoen +Stoermer +Stoessel +Stoesser +Stoesz +Stoett +Stoetzel +Stoey +Stofer +Stoff +Stoffa +Stoffel +Stoffels +Stoffer +Stofferahn +Stofferan +Stoffey +Stoffle +Stofflet +Stoffregen +Stofko +Stofsky +Stogden +Stoglin +Stogner +Stogsdill +Stohl +Stohler +Stohlton +Stohr +Stohrer +Stohs +Stoia +Stoiber +Stoica +Stojanovic +Stokan +Stoke +Stokel +Stokely +Stoker +Stokes +Stokey +Stokke +Stoklasa +Stokley +Stolar +Stolarik +Stolarski +Stolarz +Stolberg +Stolcals +Stoldt +Stole +Stolebarger +Stolecki +Stoler +Stolfi +Stoliker +Stolinski +Stoll +Stollar +Stolle +Stoller +Stolley +Stollings +Stollsteimer +Stolly +Stolp +Stolpe +Stolsig +Stolt +Stolte +Stoltenberg +Stoltenburg +Stolts +Stoltz +Stoltzfus +Stoltzman +Stolz +Stolze +Stolzenberg +Stolzenburg +Stombaugh +Stomberg +Stommes +Stone +Stoneback +Stonebarger +Stoneberg +Stoneberger +Stonebraker +Stonebreaker +Stonebrook +Stoneburner +Stonecipher +Stonecypher +Stonefield +Stoneham +Stonehouse +Stoneking +Stonelake +Stoneman +Stoner +Stonerock +Stones +Stonesifer +Stonestreet +Stonewall +Stoney +Stong +Stonge +Stonich +Stonier +Stonis +Stonum +Stoodley +Stookey +Stooks +Stooksbury +Stoop +Stoops +Stoor +Stoos +Stoot +Stoots +Stopa +Stopher +Stopka +Stopp +Stoppel +Stoppenbach +Stoppkotte +Stops +Stopyra +Storage +Storbeck +Storch +Storck +Stordahl +Store +Storer +Stores +Storey +Storie +Storino +Storjohann +Stork +Storks +Storlie +Storm +Storman +Storment +Stormer +Stormes +Stormo +Stormont +Storms +Storniolo +Storozuk +Storr +Storrer +Storrs +Storti +Storto +Storton +Storts +Stortz +Story +Storz +Stoskopf +Stoss +Stotelmyer +Stotesberry +Stotesbury +Stothard +Stothart +Stotko +Stotler +Stotsky +Stott +Stottlar +Stottlemyer +Stotts +Stotz +Stouall +Stouch +Stoud +Stoudamire +Stoudemire +Stoudenmire +Stouder +Stoudmire +Stoudt +Stoudymire +Stouer +Stouffer +Stough +Stoughton +Stours +Stout +Stoutamire +Stoutamyer +Stoute +Stouten +Stoutenburg +Stoutenger +Stoutner +Stoutt +Stoval +Stovall +Stove +Stovel +Stovell +Stover +Stoviak +Stow +Stowbridge +Stowe +Stowell +Stower +Stowers +Stowman +Stoy +Stoyanoff +Stoyanov +Stoyer +Stoyle +Stpaul +Stpeter +Stpeters +Stpierre +Stpierrie +Straathof +Straatmann +Stracener +Strachan +Strachman +Strachn +Strack +Strackbein +Stracke +Stracquatanio +Strada +Strader +Stradford +Stradley +Stradling +Stradtner +Straface +Strahan +Strahin +Strahl +Strahle +Strahm +Straight +Strain +Strait +Straiton +Straka +Strakbein +Straker +Straley +Stram +Strama +Stramel +Stramiello +Stranahan +Stranak +Strand +Strandberg +Strandburg +Strande +Straney +Stranford +Strang +Strange +Stranger +Strangstalien +Strano +Stransky +Strapp +Strasburg +Strasburger +Straseskie +Strassberg +Strassburg +Strassel +Strassell +Strasser +Strassner +Strasters +Stratakos +Strate +Strater +Stratford +Strathman +Strathmann +Strathy +Stratis +Stratman +Straton +Stratos +Stratter +Strattman +Stratton +Stratz +Straub +Straube +Strauch +Strauf +Straugh +Straughan +Straughn +Straughter +Straugter +Strauhal +Straus +Strausbaugh +Strausberg +Strause +Strauser +Strausner +Strauss +Strausser +Strausz +Stravinski +Straw +Strawberry +Strawbridge +Strawder +Strawderman +Strawhorn +Strawn +Straws +Strawser +Strawther +Stray +Strayer +Strayham +Strayhand +Strayhorn +Strazi +Strazisar +Strazza +Strazzullo +Stream +Streams +Streat +Streater +Streb +Strebe +Strebeck +Strebel +Strech +Streck +Strecker +Streczywilk +Stred +Strede +Stredny +Streeby +Streed +Streeper +Street +Streeter +Streetman +Streeton +Streets +Streett +Strefeler +Streff +Strege +Strehl +Strehle +Strehlow +Strei +Streib +Streich +Streicher +Streif +Streifel +Streiff +Streight +Streit +Streitenberge +Streitmatter +Streitnatter +Streitz +Strejan +Strejcek +Strek +Strekas +Strelecki +Streller +Strelow +Strem +Stremcha +Stremel +Stremi +Stremlow +Stremmel +Stremming +Streng +Strenge +Strength +Strenke +Stretch +Stretz +Streu +Streva +Strevel +Strevell +Strevels +Strey +Stribble +Stribley +Stribling +Strick +Stricker +Strickert +Stricklan +Strickland +Stricklen +Strickler +Stricklin +Stricklind +Strickling +Strictland +Strid +Stride +Strider +Stridiron +Strief +Striegel +Strieker +Strieter +Strife +Striffler +Stright +Strike +Striker +Strimback +Strimel +Strimling +Strimple +Strine +String +Stringari +Stringer +Stringfellow +Stringfield +Stringham +Strini +Striplin +Stripling +Strissel +Strite +Stritmater +Strittmater +Strittmatter +Stritzinger +Stritzke +Strizich +Strnad +Strobeck +Strobel +Strobl +Stroble +Strobridge +Strock +Strode +Stroder +Stroebel +Stroede +Stroer +Stroffolino +Strogen +Stroh +Strohbehn +Strohecker +Strohl +Strohm +Strohman +Strohmayer +Strohmeier +Strohmeyer +Strohschein +Stroik +Stroinski +Strojny +Stroker +Strole +Stroll +Strollo +Strom +Stromain +Stroman +Strombeck +Stromberg +Strome +Stromer +Stromme +Stromquist +Stromski +Stromyer +Stronach +Strong +Stroop +Stroope +Stroot +Strop +Strope +Stropes +Stropko +Strople +Stropus +Strose +Strosnider +Stroth +Strother +Strothers +Strothman +Strothmann +Strotman +Strotz +Stroub +Stroud +Strough +Stroup +Stroupe +Strous +Strouse +Strout +Strouth +Strow +Strowbridge +Strowd +Strowder +Strowe +Stroy +Strozewski +Strozier +Strozzi +Strub +Strubbe +Strube +Strubel +Struber +Struble +Struchen +Struck +Struckhoff +Struckman +Struckmann +Strudwick +Struebing +Struggs +Struiksma +Strum +Strumpf +Strunk +Strupp +Struss +Struthers +Strutton +Strutynski +Strutz +Struve +Struyk +Struzik +Struzzi +Strycker +Stryjewski +Stryker +Strysko +Strzalkowski +Strzelczyk +Strzelecki +Strzyzewski +Stsauveur +Stthomas +Stuard +Stuart +Stubbe +Stubbendeck +Stubbert +Stubbins +Stubblefield +Stubbolo +Stubbs +Stubby +Stubenrauch +Stuber +Stubits +Stublaski +Stuble +Stubler +Stubson +Stuchlik +Stuck +Stucke +Stuckel +Stuckemeyer +Stucker +Stuckert +Stuckett +Stuckey +Stucki +Stuckman +Stuckmeyer +Stucky +Stuczynski +Studdard +Studdiford +Studebaker +Student +Studeny +Studer +Studier +Studivant +Studler +Studley +Studmire +Studniarz +Studnicki +Studstill +Studt +Studwell +Study +Studyvance +Studyvin +Studzinski +Stuebe +Stueber +Stueck +Stueckrath +Stuedemann +Stuekerjuerge +Stuemke +Stuenkel +Stuer +Stuermer +Stuesse +Stuessy +Stueve +Stuever +Stuffle +Stufflebeam +Stufflebean +Stuhlsatz +Stuhr +Stukel +Stukenborg +Stukes +Stukowski +Stulce +Stulick +Stull +Stuller +Stults +Stultz +Stum +Stumb +Stumbaugh +Stumbo +Stumer +Stumfoll +Stumm +Stumme +Stump +Stumpe +Stumpf +Stumpff +Stumph +Stumpo +Stumpp +Stunkard +Stupak +Stupar +Stupka +Stupke +Stupp +Sturch +Sturchio +Sturdevant +Sturdivant +Sturdnant +Sturdy +Sturgell +Sturgeon +Sturges +Sturgess +Sturghill +Sturgill +Sturgis +Sturgul +Sturiale +Sturino +Sturk +Sturkey +Sturkie +Sturm +Sturman +Sturmer +Sturms +Sturn +Sturner +Sturrock +Sturrup +Sturtevant +Sturtz +Sturwold +Sturz +Stusse +Stutes +Stutesman +Stuteville +Stutheit +Stutler +Stutsman +Stuttgen +Stutts +Stutz +Stutzman +Stuve +Stuzman +Stvictor +Stvil +Stvrestil +Stwart +Stweart +Styborski +Stych +Styer +Styers +Style +Styler +Styles +Stymiest +Styons +Styron +Stys +Su +Suaava +Sualevai +Suares +Suarez +Suazo +Sub +Subasic +Suben +Suber +Subera +Subert +Subia +Subich +Subido +Subijano +Subler +Sublett +Sublette +Subramanian +Suby +Succar +Succop +Sucgang +Such +Suchan +Suchanek +Sucharski +Sucharzewski +Suchecki +Sucher +Suchla +Suchocki +Suchy +Suckow +Sucre +Sud +Suda +Sudak +Sudan +Sudar +Sudbeck +Sudberry +Sudbrock +Sudbury +Suddarth +Suddath +Sudderth +Suddeth +Suddith +Suddoth +Suddreth +Sudduth +Sudekum +Suder +Suderman +Suders +Sudler +Sudlow +Sudo +Sudol +Sudweeks +Sue +Sueda +Suehs +Suell +Suellentrop +Sueltenfuss +Suen +Suennen +Suentenfuss +Suermann +Suero +Suess +Suet +Sueyoshi +Suffern +Suffield +Suffridge +Suga +Sugabo +Sugahara +Sugai +Sugalski +Suganuma +Sugar +Sugarman +Sugden +Sugerak +Sugerman +Sugg +Suggett +Suggitt +Suggs +Sughroue +Sughrue +Sugiki +Sugimoto +Sugiyama +Suglia +Sugrue +Suh +Suhar +Suhoski +Suhr +Suihkonen +Suing +Suire +Suit +Suite +Suiter +Suitor +Suits +Suitt +Suk +Sukeforth +Sukhram +Sukhu +Sukovaty +Sukovich +Sukup +Sukut +Sul +Sulc +Sulcer +Sule +Sulecki +Suleiman +Sulejmanovski +Sulek +Sulentic +Suleski +Sulfridge +Sulieman +Sulik +Sulikowski +Sulima +Sulin +Sulipizio +Sulit +Sulivan +Sulkowski +Sulla +Sullen +Sullenberger +Sullenger +Sullens +Sulley +Sullinger +Sullins +Sullivan +Sullivant +Sulloway +Sully +Sulouff +Sulser +Sult +Sultaire +Sultan +Sultana +Sultani +Sultemeier +Sulton +Sultzer +Sulyma +Sulzbach +Sulzen +Sulzer +Sulzman +Sum +Suma +Sumabat +Suman +Sumaran +Sumas +Sumatzkuku +Sumaya +Sumbera +Sumbler +Sumbry +Sumera +Sumerall +Sumeriski +Sumerix +Sumerlin +Sumers +Sumey +Sumi +Sumida +Suminski +Sumlar +Sumler +Sumlin +Summa +Summar +Summarell +Summars +Summer +Summerall +Summerfield +Summerford +Summerhays +Summerhill +Summerill +Summerlin +Summerlot +Summerour +Summers +Summerset +Summerson +Summerton +Summerville +Summey +Summitt +Summons +Summy +Sumner +Sumners +Sumney +Sump +Sumpter +Sumption +Sumrall +Sumrell +Sumrow +Sumruld +Sumsion +Sumstad +Sumter +Sun +Sund +Sundahl +Sunday +Sundberg +Sundblad +Sundborg +Sundby +Sunde +Sundeen +Sundell +Sunder +Sunderland +Sunderlin +Sunderman +Sundermeyer +Sundet +Sundholm +Sundin +Sundling +Sundman +Sundquist +Sundseth +Sundstrom +Sundt +Suneson +Sunford +Sung +Sunga +Sunier +Suniga +Sunkel +Sunn +Sunniga +Suns +Sunseri +Sunshine +Sunstrom +Sunyich +Suoboda +Suomela +Suominen +Suon +Suozzi +Suozzo +Super +Supernault +Supernaw +Supino +Supnet +Suppa +Supple +Supplee +Supplice +Suprenant +Supry +Sur +Sura +Surace +Suran +Surano +Surbaugh +Surbella +Surber +Surdam +Suren +Sures +Surette +Surface +Surgeon +Surgoine +Surguy +Suri +Suriano +Suriel +Surina +Surita +Surkamer +Surles +Surls +Surma +Surman +Surminec +Suro +Surowka +Surprenant +Surpris +Surprise +Surra +Surran +Surratt +Surrell +Surrency +Surrett +Surrette +Surrey +Surridge +Survant +Survis +Surwillo +Suryan +Suryanarayana +Susa +Susan +Susana +Susanin +Susany +Susi +Susich +Suskay +Suski +Suskin +Susko +Susla +Susman +Susmilch +Susoev +Susong +Susor +Suss +Sussex +Sussman +Susswein +Sustaire +Sustaita +Sustar +Suszynski +Sutch +Sutcliff +Sutcliffe +Suter +Sutera +Sutfin +Suthar +Suther +Sutherburg +Sutherland +Sutherlin +Suthers +Suthoff +Sutic +Sutkus +Sutler +Sutley +Sutliff +Suto +Sutor +Sutphen +Sutphin +Sutt +Suttee +Suttell +Sutten +Sutter +Sutterfield +Suttie +Suttin +Suttle +Suttles +Sutton +Sutulovich +Sutyak +Suvada +Suwannakintho +Suyama +Suydam +Suydan +Suzuki +Svancara +Svare +Svatek +Svatos +Svay +Svec +Svedin +Svedine +Sveen +Svehla +Svendsen +Svenningsen +Svennungsen +Svensen +Svenson +Sverchek +Svetlak +Svetlik +Svetz +Sveum +Svinth +Svob +Svoboda +Svobodny +Svrcek +Swab +Swabb +Swabe +Swaby +Swackhammer +Swade +Swader +Swadling +Swafford +Swager +Swagerty +Swaggart +Swagger +Swaggert +Swaggerty +Swailes +Swails +Swaim +Swain +Swaine +Swainey +Swainston +Swaisgood +Swait +Swales +Swalley +Swallow +Swallows +Swam +Swamm +Swamp +Swamy +Swan +Swanagan +Swanay +Swanberg +Swancey +Swancutt +Swanda +Swander +Swaner +Swaney +Swanger +Swango +Swanhart +Swanick +Swanigan +Swank +Swanke +Swann +Swanner +Swansbrough +Swansen +Swanson +Swanston +Swanstrom +Swant +Swantak +Swanteck +Swantek +Swantko +Swantner +Swanton +Swanzy +Swapp +Swarat +Swarb +Sward +Swarey +Swaringen +Swarm +Swarn +Swarner +Swarr +Swart +Swarthout +Swartley +Swartout +Swarts +Swartwood +Swartwout +Swartz +Swartzbaugh +Swartzbeck +Swartzel +Swartzell +Swartzendrube +Swartzentrube +Swartzfager +Swartzlander +Swartzman +Swartzmiller +Swartzwelder +Swary +Swasey +Swatek +Swatloski +Swatman +Swatski +Swatsworth +Swatt +Swatzell +Swauger +Swavely +Swayne +Swaynos +Swayze +Swayzer +Sweadner +Sweaney +Sweany +Swearegene +Swearengen +Swearengin +Swearingen +Swearinger +Swearingin +Swearngen +Swearngin +Sweat +Sweatfield +Sweatman +Sweatmon +Sweatt +Sweazey +Sweazy +Swecker +Swed +Sweda +Swedberg +Swede +Swedeen +Swedenburg +Swedlund +Swee +Sweed +Sweeden +Sweeley +Sweely +Sweem +Sween +Sweene +Sweeney +Sweeny +Sweep +Sweere +Sweers +Sweesy +Sweet +Sweeten +Sweetin +Sweeting +Sweetland +Sweetman +Sweeton +Sweets +Sweetser +Sweetwood +Sweezer +Sweezey +Sweezy +Swefford +Sweger +Swehla +Sweigard +Sweigart +Sweigert +Sweis +Sweitzer +Sweley +Swelgart +Swell +Swelt +Swem +Swenceski +Swendsen +Sweney +Swenk +Swenor +Swensen +Swenson +Swensson +Swenton +Swentzel +Swepson +Swerdloff +Swerdlow +Swestka +Swetland +Swetnam +Swets +Swett +Swezey +Swiat +Swiatek +Swiatkowski +Swicegood +Swick +Swickard +Swickheimer +Swicord +Swida +Swider +Swiderski +Swieca +Swiech +Swierczek +Swierczynski +Swierenga +Swierk +Swietoniowski +Swift +Swigart +Swiger +Swigert +Swiggett +Swiggum +Swihart +Swiler +Swille +Swiller +Swilley +Swilling +Swim +Swimm +Swimmer +Swims +Swindall +Swindell +Swinderman +Swindle +Swindler +Swindoll +Swinea +Swineford +Swinehart +Swinerton +Swiney +Swinford +Swing +Swingen +Swinger +Swingle +Swingler +Swink +Swinney +Swinny +Swinson +Swint +Swinton +Swirczek +Swire +Swires +Swirsky +Swisher +Swiss +Swisshelm +Swist +Swistak +Switalski +Switcher +Swithenbank +Switzer +Swoager +Swoap +Swoboda +Swoffer +Swofford +Swogger +Swolley +Swonger +Swonke +Swoope +Swoopes +Swope +Swopes +Swopshire +Swor +Sword +Swords +Swoyer +Swyers +Swygert +Swymer +Sy +Syal +Syas +Sybert +Sybounheuan +Syck +Syddall +Sydner +Sydnes +Sydney +Sydnor +Sydow +Syed +Syer +Syers +Sykes +Sykora +Syktich +Syler +Sylla +Sylney +Sylva +Sylvain +Sylvan +Sylve +Sylver +Sylvest +Sylvester +Sylvestre +Sylvia +Sylvian +Sylvis +Symanski +Symeon +Symes +Symkowick +Symmes +Symmonds +Symon +Symonds +Symons +Symore +Sympson +Synakowski +Synan +Synder +Syndergaard +Syner +Synnott +Synovic +Synowiec +Syon +Syphard +Sypher +Syphers +Sypniewski +Sypolt +Sypult +Syracuse +Syrek +Syrett +Syria +Syring +Syrop +Syrrakos +Syrstad +Sysak +Sysyn +Syta +Sytsma +Syversen +Syverson +Syvertsen +Syzdek +Szabat +Szablewski +Szabo +Szachewicz +Szady +Szaflarski +Szafran +Szafraniec +Szafranski +Szafryk +Szal +Szala +Szalai +Szalankiewicz +Szalay +Szanto +Szarek +Szatkowski +Szczeblewski +Szczepanek +Szczepaniak +Szczepanik +Szczepanski +Szczepkowski +Szczesniak +Szczesny +Szczurek +Szczygiel +Sze +Szekely +Szekula +Szenasi +Szerbin +Szeredy +Szerlong +Szermer +Szerszen +Szesterniak +Szeto +Szewc +Szewczak +Szewczyk +Szigethy +Szilagyi +Szitar +Szklarski +Szlosek +Szmalc +Szmidt +Sznejkowski +Szoc +Szocki +Szoka +Szoke +Szollosi +Szopinski +Szostak +Szot +Szpak +Szuba +Szubinski +Szuch +Szufat +Szulimowski +Szumiesz +Szumigala +Szumilas +Szumny +Szumski +Szuszkiewicz +Szwaja +Szwarc +Szwed +Szweda +Szwede +Szwejbka +Szychowski +Szydlowski +Szymanowski +Szymanski +Szymansky +Szymczak +Szymczyk +Szymkowski +Szymonik +Szymula +Szynkowicz +Szypowski +Szysh +Szyszka +Ta +Taaffe +Taake +Taal +Taback +Tabag +Tabak +Tabar +Tabares +Tabarez +Tabatabai +Tabatt +Tabb +Tabbaa +Tabbert +Tabeling +Taber +Taberski +Tabet +Tabian +Tabicas +Tabin +Tabion +Tabios +Tabisola +Tabisula +Tablada +Tablang +Tabler +Tables +Taboada +Tabolt +Tabon +Tabone +Tabor +Tabora +Taborda +Taborn +Tabron +Tabuena +Tacadina +Tacason +Tacata +Taccariello +Taccetta +Taccone +Tacconi +Tacderan +Tacderen +Tacdol +Tacey +Tachauer +Tacheny +Tack +Tacke +Tacker +Tackes +Tacket +Tackett +Tackette +Tackitt +Tacneau +Tacopino +Tacy +Tada +Tadd +Taddei +Taddeo +Taddio +Taddonio +Tade +Tademy +Tadena +Tadeo +Tadesse +Tadgerson +Tadiello +Tadlock +Tadman +Tadt +Tadych +Taecker +Taegel +Taetzsch +Tafel +Tafelski +Taff +Taffe +Taffer +Tafiti +Taflinger +Tafolla +Tafoya +Tafreshi +Taft +Tafuri +Tag +Tagaban +Tagaca +Tagala +Tagaloe +Tagalog +Tagami +Tagata +Tagg +Taggart +Tagge +Taggert +Taghon +Taglauer +Tagle +Taglialatela +Tagliarini +Tagliavia +Tagliente +Taglieri +Tags +Taguchi +Tague +Tagupa +Taha +Taheri +Tahir +Tahon +Tahu +Tai +Taibi +Taibl +Tail +Taillefer +Taillon +Tailor +Taing +Tainter +Taintor +Taira +Tait +Taitague +Taite +Taitt +Taiwo +Taj +Tajima +Tajiri +Tajudeen +Tak +Takach +Takacs +Takagi +Takahashi +Takai +Takaki +Takala +Takaoka +Takara +Takashima +Takata +Takayama +Takeda +Takehara +Takemoto +Takemura +Takenaka +Taker +Takes +Takeshita +Taketa +Takeuchi +Taki +Takiguchi +Tako +Talaga +Talahytewa +Talamante +Talamantes +Talamantez +Talamas +Talamentez +Talamo +Talarico +Talaro +Talas +Talaska +Talat +Talavera +Talayumptewa +Talbert +Talbot +Talboti +Talbott +Talburt +Talcott +Talent +Talentino +Talerico +Talford +Talhelm +Taliaferro +Talib +Talicska +Taliferro +Taliman +Taliulu +Talk +Talkington +Tall +Tallacksen +Tallada +Talladino +Tallant +Tallarico +Tallas +Tallent +Tallerico +Talleut +Talley +Tallie +Tallis +Tallmadge +Tallman +Tallon +Talluto +Tally +Talmadge +Talmage +Talman +Talone +Talor +Talsky +Talsma +Talton +Talty +Talvy +Talyor +Tam +Tamai +Tamanaha +Tamargo +Tamaro +Tamas +Tamashiro +Tamayo +Tambasco +Tambe +Tamblyn +Tamborlane +Tambunga +Tamburello +Tamburino +Tamburo +Tamburrelli +Tamburri +Tamburrino +Tamburro +Tamer +Tameron +Tames +Tamez +Tami +Tamimi +Tamiya +Tamkin +Tamlin +Tamm +Tammaro +Tammen +Tamminen +Tammo +Tamondong +Tamplin +Tamporello +Tams +Tamulis +Tamura +Tan +Tanabe +Tanaka +Tanberg +Tancer +Tancredi +Tande +Tandetzke +Tandon +Tandus +Tandy +Taneja +Tanen +Tanenbaum +Tanequodle +Taney +Tang +Tangabekyan +Tangari +Tangaro +Tangeman +Tangen +Tangerman +Tangert +Tangney +Tango +Tangredi +Tangren +Tangri +Tanguay +Tanguma +Tanh +Tani +Tanigawa +Taniguchi +Tanikella +Tanimoto +Tanious +Tanis +Tank +Tankard +Tanke +Tanker +Tankersley +Tankersly +Tankesly +Tanks +Tanksley +Tankson +Tankxley +Tann +Tanna +Tannahill +Tannazzo +Tannehill +Tannen +Tannenbaum +Tanner +Tannery +Tanney +Tanniehill +Tannous +Tanon +Tanori +Tanoue +Tanous +Tanouye +Tansey +Tansil +Tanski +Tansley +Tant +Tantillo +Tanton +Tantum +Tanweer +Tanzer +Tanzi +Tanzman +Tanzosch +Tao +Taomoto +Taormina +Tapaha +Tapales +Tapanes +Tapaoan +Tapat +Tape +Taper +Taphous +Tapia +Tapian +Tapija +Tapio +Tapley +Taplin +Tapp +Tappa +Tappan +Tappe +Tappeiner +Tappen +Tappendorf +Tapper +Tappin +Tappis +Taps +Tapscott +Taque +Tara +Tarabokija +Taraborelli +Tarallo +Taran +Tarangelo +Tarango +Tarantino +Taranto +Taras +Taraschke +Tarascio +Tarasuik +Taray +Tarazon +Tarbell +Tarbert +Tarbet +Tarbor +Tarboro +Tarbox +Tarbutton +Tardie +Tardif +Tardiff +Tardio +Tardugno +Tarduno +Tardy +Tarella +Targett +Tarin +Tariq +Tarka +Tarkenton +Tarkey +Tarkington +Tarkowski +Tarleton +Tarley +Tarling +Tarlow +Tarlton +Tarman +Tarmey +Tarner +Tarnoff +Tarnowski +Tarone +Tarpey +Tarpley +Tarpy +Tarquinio +Tarr +Tarran +Tarrance +Tarrant +Tarrants +Tarras +Tarrats +Tarrence +Tarrenis +Tarricone +Tarrien +Tarring +Tarris +Tarro +Tarry +Tarshis +Tarsis +Tarski +Tart +Tartaglia +Tartaglino +Tartaglione +Tartamella +Tartar +Tarte +Tarter +Tartsah +Tartt +Taruc +Taruer +Tarufelli +Tarver +Tarvin +Tarvis +Tarwater +Tarzia +Tasby +Tasch +Taschereau +Taschler +Taschner +Tash +Tashima +Tashiro +Tashjian +Tashman +Tasker +Taskey +Tasler +Tasma +Tassa +Tasse +Tassey +Tassie +Tassin +Tassinari +Tasso +Tasson +Tassone +Tassoni +Tastet +Tasto +Tat +Tata +Tatar +Tataris +Tate +Tatel +Tatem +Tates +Tatevosian +Tatge +Tatham +Tatis +Tatlock +Tatman +Tatnall +Tatom +Taton +Tator +Tatro +Tatsak +Tatsapaugh +Tatsch +Tatsuhara +Tatsuno +Tatsuta +Tatters +Tattersall +Tattershall +Tatton +Tattrie +Tatu +Tatum +Taualii +Tauares +Tauarez +Taub +Taube +Tauber +Taubert +Taublee +Taubman +Taucher +Tauer +Taul +Taula +Taulbee +Taulman +Taunton +Tauras +Taurino +Taus +Tausch +Tauscher +Taussig +Tauteoli +Tautolo +Tautuiaki +Tauzin +Tavakoli +Tavana +Tavano +Tavares +Tavarez +Tavaris +Tave +Tavella +Tavenner +Tavera +Taverab +Taveras +Taverna +Taverner +Tavernia +Tavernier +Taves +Tavira +Tavis +Tavolacci +Tavolario +Tavolieri +Tavorn +Tawil +Tawney +Tawwab +Tawwater +Tay +Tayag +Tayan +Taybron +Taydus +Taylan +Taylar +Tayler +Tayloe +Taylor +Taymon +Tayo +Tayor +Tays +Tayse +Tazelaar +Tazewell +Tazzara +Tchakian +Te +Tea +Teabo +Teach +Teachey +Teachman +Teachout +Teaff +Teaford +Teagarden +Teager +Teagle +Teague +Teagues +Teahan +Teakell +Teal +Tealer +Teall +Teamer +Teano +Teaque +Tear +Teare +Teas +Teasdale +Tease +Teasley +Teaster +Teat +Teater +Teator +Teats +Tebar +Tebay +Tebbe +Tebbetts +Tebbs +Tebeau +Tebo +Tebow +Tecchio +Techaira +Techau +Tecklenburg +Tecson +Tecuanhuey +Tedder +Teddick +Teddy +Teder +Tederous +Tedeschi +Tedesco +Tedesko +Tedford +Tedrick +Tedrow +Tee +Teece +Teed +Teegarden +Teehan +Teehee +Teekasingh +Teel +Teele +Teem +Teemer +Teems +Teepe +Teeple +Teeples +Teer +Tees +Teesdale +Teet +Teeter +Teeters +Teets +Teetz +Tefera +Tefertiller +Teffeteller +Tefft +Tegan +Tegarden +Tegeler +Tegenkamp +Tegethoff +Tegner +Tegtmeier +Tegtmeyer +Tehan +Tehney +Tehrani +Tei +Teich +Teicher +Teichert +Teichman +Teichmann +Teichmiller +Teichrow +Teig +Teigen +Teisberg +Teissedre +Teitel +Teitelbaum +Teitenberg +Teitsort +Teitsworth +Teixeira +Teixeria +Tejada +Tejadilla +Tejeda +Tejedor +Tejeiro +Tejera +Tekautz +Tekell +Tekippe +Teklu +Tekulve +Tela +Telander +Telch +Telchik +Telecky +Telega +Telep +Teles +Telesco +Telfair +Telfer +Telford +Telgen +Telkamp +Tell +Tellado +Telle +Tellefsen +Tellefson +Teller +Telleria +Tellers +Telles +Tellez +Tellier +Tellinghuisen +Tellio +Tellis +Tellman +Tello +Telly +Telman +Telschow +Teltschik +Teman +Temblador +Temby +Temkin +Temme +Temoney +Temores +Temoshenka +Temp +Tempe +Tempel +Tempelton +Tempest +Tempesta +Temple +Templeman +Templer +Temples +Templet +Templeton +Templin +Ten +Tena +Tenaglia +Tenamore +Tenant +Tenario +Tenbrink +Tenbusch +Tencer +Tench +Tencza +Tenda +Tendick +Tenebruso +Tenen +Tenenbaum +Tener +Tenerovich +Tenerowicz +Tenery +Teneyck +Teng +Tengan +Tengben +Tengwall +Tenhaeff +Tenharmsel +Tenhoff +Tenholder +Tenley +Tenn +Tennant +Tennent +Tenner +Tenneson +Tennessee +Tennett +Tenney +Tennies +Tennill +Tennille +Tennis +Tennison +Tennon +Tenny +Tennyson +Teno +Tenofsky +Tenor +Tenore +Tenorio +Tenpas +Tenpenny +Tensley +Tent +Tention +Tentler +Tenuta +Tenzer +Teo +Teodoro +Teoh +Tep +Tepe +Teper +Tepezano +Tepfer +Tepler +Tepley +Teplica +Tepp +Tepper +Tepperberg +Teppo +Teque +Terada +Teramoto +Teran +Terando +Teranishi +Terault +Teravainen +Terazes +Terboss +Terbush +Tercero +Terell +Terepka +Teresa +Teresi +Tereska +Terhaar +Terhar +Terhark +Terheggen +Terherst +Terhorst +Terhune +Teri +Terinoni +Terkelsen +Terlecki +Terlizzi +Terman +Termeer +Termilus +Termini +Ternasky +Ternes +Terney +Ternullo +Tero +Teroganesyan +Terp +Terpening +Terpstra +Terr +Terra +Terracciano +Terrace +Terracina +Terrall +Terrance +Terrano +Terranova +Terrasas +Terrasi +Terrazas +Terre +Terrebonne +Terrel +Terrell +Terrence +Terrero +Terres +Terrett +Terrey +Terrezza +Terri +Terrian +Terrible +Terrien +Terrill +Terrio +Terris +Territo +Terron +Terrone +Terrones +Terronez +Terry +Tersigni +Terstage +Tersteeg +Tertinek +Teruel +Tervo +Tervort +Terwey +Terwillegar +Terwilliger +Terzian +Terzo +Tes +Tesar +Tesauro +Tesch +Teschler +Teschner +Tesh +Teska +Teske +Teskey +Tesler +Teslow +Tesmar +Tesmer +Tesnow +Tesoriero +Tesoro +Tesreau +Tess +Tessendorf +Tesseneer +Tesseyman +Tessier +Tessitore +Tessler +Tessman +Tessmer +Tessner +Test +Testa +Testani +Testen +Tester +Testerman +Testman +Testolin +Teston +Teteak +Teter +Teters +Teti +Tetley +Tetlow +Teto +Tetrault +Tetreau +Tetreault +Tetrick +Tetro +Tetteh +Tetter +Tetterton +Tetu +Tetz +Tetzlaff +Tetzloff +Teufel +Teuscher +Teuteberg +Tevada +Tevebaugh +Teverbaugh +Teves +Tevis +Tevlin +Tew +Tewa +Tewani +Tewari +Tewell +Tewes +Tewksbury +Tewmey +Tewolde +Tews +Texada +Texeira +Texidor +Texiera +Texter +Textor +Teyler +Tezak +Tezeno +Thach +Thacher +Thackaberry +Thacker +Thackeray +Thackery +Thackrey +Thackston +Thackxton +Thaden +Thadison +Thady +Thaemert +Thagard +Thaggard +Thai +Thain +Thake +Thaker +Thakkar +Thakur +Thal +Thalacker +Thaler +Thalheimer +Thall +Thaller +Thalls +Thalman +Thalmann +Tham +Thaman +Thamann +Thames +Thammavong +Thammavongsa +Thammorongsa +Thamphia +Than +Thanas +Thanasouk +Thane +Thanem +Thang +Thangavelu +Thaniel +Thanos +Thanpaeng +Thansamai +Thao +Tharaldson +Tharnish +Tharp +Tharpe +Tharrington +Thatch +Thatcher +Thate +Thau +Thaut +Thavichith +Thaxton +Thay +Thayer +Thayn +Thayne +Theaker +Theall +Theam +Theard +Theaux +Thebeau +Theberge +Thebo +Thede +Theden +Thedford +Thee +Theel +Theeman +Theesfeld +Theil +Theilen +Theiler +Theiling +Theim +Theimer +Thein +Theinert +Theis +Theisen +Theiss +Thelemaque +Thelen +Thelin +Thell +Thelmon +Them +Themot +Then +Thenhaus +Theo +Theobald +Theodoratos +Theodore +Theodoropoulo +Theodorov +Theophilus +Theos +Thepbanthao +Theresa +Theriault +Therien +Theriot +Thero +Theroux +Therrell +Therres +Therriault +Therrien +Therurer +Thesing +Thessing +Thetford +Theuenin +Theule +Theuner +Theunissen +Theurer +Theuret +Theus +Thevenin +Thew +Thews +Thi +Thiara +Thibadeau +Thibaudeau +Thibault +Thibaut +Thibeau +Thibeault +Thibeaux +Thibedeau +Thibert +Thibideau +Thibodaux +Thibodeau +Thibodeaux +Thiboutot +Thicke +Thidphy +Thie +Thiebeault +Thiede +Thieklin +Thiel +Thielbar +Thiele +Thielemann +Thielemier +Thielen +Thielges +Thielman +Thiem +Thieman +Thiemann +Thieme +Thiengtham +Thier +Thierauf +Thierman +Thierry +Thiery +Thies +Thiesfeld +Thiesse +Thiessen +Thigpen +Thigpin +Thilges +Thilking +Thill +Thillet +Thilmony +Thim +Thimmes +Thimmesch +Thingvold +Thiry +Thissen +Thistle +Thistlethwait +Thivener +Thivierge +Thixton +Thoams +Thobbs +Thoben +Thoburn +Thoby +Thode +Thody +Thoe +Thoele +Thoen +Thoene +Thoennes +Thoeny +Thole +Tholen +Thom +Thoma +Thomae +Thoman +Thomann +Thomas +Thomases +Thomason +Thomassen +Thomasson +Thomaston +Thombs +Thome +Thomeczek +Thomen +Thomer +Thomes +Thometz +Thomison +Thomley +Thomlinson +Thomlison +Thommarson +Thompkins +Thompon +Thompsom +Thompson +Thoms +Thomsen +Thomson +Thomspon +Thomure +Thon +Thone +Thonen +Thong +Thongchanh +Thongdy +Thonney +Thor +Thorade +Thoran +Thorburn +Thorell +Thoren +Thoresen +Thoreson +Thorin +Thorington +Thorley +Thormaehlen +Thormahlen +Thorman +Thormer +Thormina +Thorn +Thornberg +Thornberry +Thornborough +Thornborrow +Thornbrough +Thornbrugh +Thornburg +Thornburgh +Thornbury +Thorndike +Thorndyke +Thorne +Thornell +Thorner +Thornes +Thorngren +Thornhill +Thornley +Thornock +Thornquist +Thorns +Thornsberry +Thornsbury +Thornton +Thornwell +Thoroughgood +Thoroughman +Thorp +Thorpe +Thorsen +Thorsness +Thorson +Thorstad +Thorsted +Thorsten +Thorstenson +Thorton +Thouvenel +Thraen +Thrailkill +Thrall +Thramer +Thrams +Thran +Thrapp +Thrash +Thrasher +Threadgill +Threat +Threats +Threatt +Threet +Threets +Threlfall +Threlkeld +Thresher +Thress +Thrift +Thrill +Thro +Throckmorton +Throgmorton +Throndson +Throne +Throneberry +Throneburg +Thronson +Thronton +Throop +Thrope +Throssell +Thrower +Thruman +Thrun +Thrune +Thrush +Thruston +Thruthley +Thu +Thuesen +Thul +Thulin +Thull +Thum +Thuma +Thuman +Thumm +Thunberg +Thundercloud +Thune +Thuney +Thuotte +Thur +Thurau +Thurber +Thurby +Thurgood +Thuringer +Thurlby +Thurlow +Thurm +Thurman +Thurmer +Thurmon +Thurmond +Thurn +Thurner +Thurness +Thurrell +Thursby +Thurston +Thurstonson +Thurton +Thury +Thuss +Thwaites +Thweatt +Thy +Thyberg +Thyfault +Thygerson +Thyne +Thyng +Tian +Tiangco +Tiano +Tibbals +Tibbert +Tibbets +Tibbetts +Tibbit +Tibbits +Tibbitts +Tibbles +Tibbs +Tiberi +Tiberio +Tiblier +Tibolla +Tiboni +Tibor +Tiburcio +Tibwell +Tica +Ticas +Tice +Ticer +Tichacek +Tichenor +Tichi +Tichnell +Tichy +Tick +Tickle +Tickner +Ticknor +Tidball +Tidd +Tidey +Tidmore +Tidrick +Tidrington +Tidwell +Tiede +Tiedeman +Tiedemann +Tiedt +Tiefenauer +Tiefenbrun +Tieger +Tiegs +Tiehen +Tieken +Tielking +Tiell +Tieman +Tiemann +Tiemens +Tiemeyer +Tien +Tienda +Tieng +Tienken +Tier +Tierce +Tierman +Tiernan +Tierney +Tierno +Tieszen +Tiet +Tietge +Tietje +Tietjen +Tietjens +Tietz +Tietze +Tieu +Tiff +Tiffany +Tiffee +Tiffin +Tiffner +Tifft +Tift +Tigano +Tigar +Tiger +Tigerino +Tigert +Tigg +Tigges +Tiggs +Tighe +Tigner +Tigney +Tignor +Tigue +Tijerina +Tijerino +Tijernia +Tijing +Tikkanen +Tilbury +Tilden +Tiley +Tilford +Tilghman +Tilgner +Till +Tillberg +Tillberry +Tille +Tillema +Tilleman +Tiller +Tillery +Tillett +Tilley +Tillie +Tillinghast +Tillis +Tillison +Tillman +Tillmon +Tillotson +Tillou +Tillson +Tilly +Tilman +Tilmon +Tilotta +Tilow +Tilson +Tilt +Tilton +Tilus +Tilzer +Tim +Timar +Timas +Timber +Timberlake +Timberman +Timbers +Timblin +Timbrell +Timbrook +Timbs +Timchak +Timchula +Timenez +Times +Timi +Timinsky +Timko +Timlin +Timm +Timme +Timmel +Timmer +Timmerberg +Timmerman +Timmermann +Timmermans +Timmers +Timmins +Timmis +Timmons +Timmreck +Timms +Timon +Timone +Timonere +Timons +Timoteo +Timothe +Timothy +Timpe +Timper +Timperman +Timpone +Timpson +Tims +Timson +Timus +Tin +Tina +Tinajero +Tinch +Tincher +Tindal +Tindall +Tindel +Tindell +Tinder +Tindle +Tindol +Tine +Tinelli +Tineo +Tiner +Tines +Ting +Tingen +Tinger +Tingey +Tingle +Tingler +Tingley +Tingstrom +Tingwald +Tinin +Tinius +Tinker +Tinkey +Tinkham +Tinkle +Tinklenberg +Tinkler +Tinley +Tinlin +Tinn +Tinnea +Tinneberg +Tinnel +Tinnell +Tinner +Tinnerello +Tinnes +Tinney +Tinnin +Tinnon +Tino +Tinoco +Tinsley +Tinsman +Tinson +Tinstman +Tintinger +Tintle +Tinucci +Tio +Tiogangco +Tiotuico +Tipka +Tipler +Tipold +Tippen +Tippens +Tippery +Tippet +Tippets +Tippett +Tippetts +Tippey +Tippie +Tippin +Tipping +Tippins +Tippit +Tipple +Tipps +Tippy +Tipre +Tipsword +Tipton +Tirabassi +Tirado +Tircuit +Tirey +Tirino +Tirk +Tiro +Tirona +Tirone +Tirpak +Tirrell +Tirri +Tiry +Tisa +Tisby +Tiscareno +Tisch +Tischer +Tischler +Tischner +Tisdal +Tisdale +Tisdel +Tisdell +Tise +Tish +Tisher +Tishler +Tisi +Tisinger +Tiso +Tison +Tisor +Tissot +Tisue +Titch +Titchener +Titcomb +Tith +Titler +Titlow +Titman +Titmus +Tito +Titone +Titsworth +Titterington +Titterness +Tittl +Tittle +Titus +Titze +Titzer +Tiu +Tivar +Tivis +Tiwald +Tix +Tixier +Tiznado +Tizon +Tjaden +Tjandra +Tjarks +Tjelmeland +Tjepkema +Tkach +Tkacik +Tkacz +Tlamka +Tlatelpa +Tlatenchi +Tllo +Tlucek +Tlumacki +To +Toa +Toadvine +Toal +Toala +Toalson +Toan +Toaston +Tobacco +Toback +Toban +Tobar +Tobe +Tobeck +Tober +Tobert +Tobery +Tobey +Tobia +Tobias +Tobiason +Tobiassen +Tobiasson +Tobiasz +Tobin +Tobler +Tobola +Tobolski +Tobon +Toborg +Tobosa +Toboz +Toby +Toca +Tocchio +Tocci +Tocco +Toce +Tocher +Tochterman +Tock +Tockey +Toczek +Tod +Toda +Todahl +Todaro +Todd +Toddy +Todeschi +Todesco +Todhunter +Todisco +Todman +Todor +Todora +Todoroff +Todorovich +Todt +Tody +Toedebusch +Toefield +Toelke +Toelkes +Toelle +Toeller +Toenges +Toenjes +Toepel +Toepfer +Toepke +Toepperwein +Toevs +Toews +Tofanelli +Tofani +Tofflemire +Toffton +Tofil +Tofolla +Toft +Tofte +Togashi +Tognazzini +Tognetti +Togni +Toguchi +Toh +Tohen +Toher +Tohill +Tohonnie +Tointon +Tojo +Tok +Tokar +Tokarski +Tokarz +Tokay +Toki +Tokich +Tokihiro +Tokita +Tokkesdal +Tokley +Tokunaga +Tokuoka +Tola +Tolan +Toland +Tolar +Tolayo +Tolbent +Tolbert +Tolchin +Tolden +Toldness +Tole +Toledano +Toledo +Tolefree +Tolen +Tolentino +Toler +Toles +Toleston +Tolfree +Tolhurst +Tolin +Toline +Toliongco +Toliver +Toll +Tolle +Tollefsen +Tollefson +Tollefsrud +Toller +Tollerson +Tollerud +Tolles +Tolleson +Tollett +Tolley +Tollin +Tollinchi +Tollison +Tolliver +Tollman +Tollner +Tolly +Tolman +Tolmich +Tolmie +Tolomeo +Tolontino +Tolosa +Tolosky +Tolson +Tolston +Tolve +Tolzmann +Tom +Toma +Tomaino +Tomala +Toman +Tomanek +Tomaro +Tomas +Tomasek +Tomaselli +Tomasello +Tomasetti +Tomash +Tomasi +Tomasic +Tomasini +Tomasino +Tomaski +Tomasko +Tomassi +Tomasso +Tomasson +Tomasulo +Tomaszewski +Tomaszycki +Tomb +Tomberlin +Tombleson +Tomblin +Tomblinson +Tombrello +Tombs +Tomczak +Tome +Tomehak +Tomei +Tomek +Tomeldan +Tomer +Tomerlin +Tomes +Tomey +Tomich +Tomichek +Tomidy +Tomilson +Tomisin +Tomita +Tomjack +Tomka +Tomkiewicz +Tomkins +Tomko +Tomkowicz +Tomkus +Tomlin +Tomlinson +Tomlison +Tommasino +Tomme +Tommie +Tommolino +Tomopoulos +Tomory +Tompkin +Tompkins +Tompsett +Tompson +Toms +Tomsche +Tomshack +Tomsic +Tomsich +Tomsick +Tomski +Tomson +Tomspon +Ton +Tonai +Tonas +Tonche +Toncrey +Tonder +Tondre +Tondreau +Tone +Tonelli +Tonelson +Toner +Tones +Tonetti +Toney +Tong +Tongate +Tonge +Tongren +Tongue +Toni +Toniatti +Tonic +Tonini +Tonkin +Tonks +Tonn +Tonnar +Tonne +Tonner +Tonnesen +Tonneson +Tonnessen +Tonozzi +Tonrey +Tonsall +Tonschock +Tonsil +Tontarski +Tonti +Tony +Tonzi +Too +Toodle +Toof +Toohey +Tooke +Tooker +Tookes +Tookmanian +Tooks +Toolan +Toole +Tooles +Tooley +Tools +Toolsiram +Toolson +Tooman +Toombs +Toomer +Toomes +Toomey +Tooms +Toomsen +Toon +Toone +Toop +Toor +Toot +Toothacre +Toothaker +Toothill +Toothman +Tootle +Tooze +Top +Topacio +Topal +Topalian +Tope +Topel +Toper +Topete +Topez +Topham +Topi +Topia +Topick +Topinka +Topliffe +Toplin +Topliss +Toplistky +Toplk +Topness +Topoian +Topolansky +Topolewski +Topolinski +Topolosky +Topolski +Topor +Toporek +Topp +Toppa +Toppah +Toppen +Topper +Toppi +Toppin +Topping +Toppings +Toppins +Topps +Toquinto +Torain +Toran +Torbeck +Torbert +Torbett +Torbit +Torborg +Torbus +Torchia +Torchio +Torda +Tordsen +Torell +Torelli +Torello +Toren +Tores +Torey +Torez +Torgersen +Torgerson +Torgeson +Torgrimson +Torguson +Torian +Toribio +Toriello +Torigian +Torina +Torino +Torivio +Tork +Torkelson +Torkildsen +Torma +Tormey +Torn +Tornabene +Tornatore +Torner +Tornes +Tornese +Torngren +Tornincasa +Torno +Tornow +Tornquist +Toro +Torok +Toromanides +Torongeau +Torp +Torpey +Torra +Torrado +Torrain +Torralba +Torralva +Torrance +Torrano +Torre +Torreblanca +Torrecillas +Torred +Torregrosa +Torregrossa +Torrell +Torrella +Torrence +Torrens +Torrent +Torreon +Torres +Torreson +Torress +Torrey +Torrez +Torri +Torrico +Torrie +Torrijos +Torrillo +Torrion +Torris +Torrisi +Torros +Torruellas +Torry +Torset +Torsiello +Torstrick +Tortelli +Torti +Tortolano +Tortora +Tortorella +Tortorelli +Tortorice +Tortorici +Tortoriello +Tortu +Toruno +Tory +Tosado +Toscani +Toscano +Tosch +Tosches +Tosco +Tosh +Tosi +Tosic +Toso +Tossie +Tosta +Tostado +Tostanoski +Toste +Tosten +Tosti +Tosto +Tota +Totaro +Tote +Toten +Toth +Totherow +Toti +Totin +Toting +Totino +Totman +Toto +Totosz +Tototzintle +Tott +Totten +Totter +Tottingham +Totty +Totzke +Touar +Touart +Touby +Touch +Touchard +Touchet +Touchette +Touchstone +Touchton +Toudle +Tougas +Touhey +Touhy +Toulmin +Toulouse +Toulson +Touma +Touney +Toupe +Toupin +Toups +Toure +Tourigny +Tourikis +Tourtellotte +Tourtelotte +Tourtillott +Tourville +Tousant +Tousey +Tousignant +Tousley +Tousom +Toussaint +Toussand +Toussant +Toussiant +Tout +Touton +Touvell +Tovar +Toves +Tovey +Tovias +Tovmasyan +Tovrea +Tow +Towber +Towe +Towell +Towels +Tower +Towers +Towery +Towey +Towle +Towler +Towlerton +Towles +Towley +Towlson +Town +Towne +Towner +Townes +Townley +Towns +Townsand +Townsel +Townsell +Townsend +Townsley +Townson +Townzen +Towry +Towse +Towsend +Towsley +Towson +Toxey +Toy +Toya +Toyama +Toye +Toyn +Toyne +Toyoshima +Toyota +Tozer +Tozier +Tozloski +Tozzi +Trabazo +Traber +Trabert +Trabold +Trabucco +Trabue +Trac +Trace +Tracewell +Tracey +Trachsel +Trachte +Trachtenberg +Tracy +Traczyk +Trad +Trader +Tradup +Traeger +Traff +Traffanstedt +Trafford +Traficante +Trafton +Trager +Trageser +Tragesser +Trahan +Traher +Trahern +Trahin +Traicoff +Trail +Traill +Trailor +Train +Traina +Trainer +Trainham +Traino +Trainor +Trainum +Traister +Trajillo +Tram +Tramble +Trame +Tramel +Tramell +Tramm +Trammel +Trammell +Trammer +Tramontano +Tramonte +Tramonti +Tramp +Trampe +Tran +Trana +Tranbarger +Trancoso +Trane +Tranel +Traner +Trang +Trani +Trank +Tranmer +Transou +Transue +Trant +Tranter +Trantham +Tranum +Trapalis +Trapanese +Trapani +Trapasso +Trapeni +Traphagen +Trapp +Trapper +Trappey +Trasher +Trask +Trasport +Trass +Traster +Tratar +Trattner +Traub +Traube +Trauernicht +Traugh +Traughber +Traugott +Traum +Traunfeld +Trausch +Trauscht +Traut +Trauth +Trautman +Trautmann +Trautner +Trautwein +Trautz +Traux +Travaglio +Travali +Travelstead +Traver +Travers +Traversa +Traverse +Traverso +Traves +Travieso +Travillian +Travillion +Travino +Travis +Traviss +Traw +Traweek +Trawick +Trax +Traxler +Traxson +Traycheff +Trayer +Trayler +Traylor +Traynham +Traynor +Traywick +Trbovich +Treacy +Treadaway +Treadway +Treadwell +Treakle +Treamer +Treanor +Trear +Trease +Treaster +Treasure +Treat +Trebbe +Trebesch +Trebil +Trebilcock +Trebon +Trecarichi +Trecroci +Tredennick +Treder +Tredinnick +Tredo +Tredway +Tredwell +Treece +Treen +Trees +Treese +Trefethen +Treff +Treffert +Trefry +Treftz +Trefz +Tregan +Treger +Treglia +Trego +Tregoning +Tregre +Treharne +Treherne +Treib +Treiber +Treible +Treichel +Treichler +Treider +Treine +Treinen +Treisch +Treister +Trejo +Trejos +Trela +Treleven +Trell +Trelles +Treloar +Tremain +Tremaine +Tremayne +Trembath +Trembinski +Tremblay +Tremble +Trembley +Trembly +Tremel +Tremelling +Tremillo +Treml +Tremmel +Tremont +Tremore +Tremper +Trenary +Trenbeath +Trench +Trenchard +Trend +Trendell +Trenh +Trenholm +Trenholme +Trenkle +Trennell +Trenor +Trent +Trentacoste +Trentham +Trentinella +Trentini +Trentman +Trento +Trenton +Trentz +Treola +Treon +Trepagnier +Trepanier +Treptow +Tresca +Tresch +Trescott +Tresler +Treso +Tress +Tressel +Tresselt +Tressler +Trest +Trester +Treston +Tresvant +Tretera +Tretheway +Trethewey +Tretina +Treto +Tretola +Trett +Tretter +Trettin +Treusdell +Treutel +Treuter +Trevarthen +Trevathan +Treves +Trevethan +Trevett +Trevey +Trevigne +Trevillian +Trevillion +Trevino +Trevis +Trevisan +Trevisone +Trevithick +Trevizo +Trevor +Trevorrow +Trew +Trewhitt +Trewin +Treworgy +Trexel +Trexler +Trezise +Trezza +Tri +Trial +Triana +Triano +Triarsi +Trias +Tribbett +Tribbey +Tribble +Tribby +Tribe +Trible +Triblett +Tribley +Tribou +Tribue +Tricamo +Tricarico +Trice +Triche +Trichel +Trichell +Trick +Trickel +Trickett +Trickey +Tricoche +Tricoli +Tricomi +Tridenti +Trider +Tridle +Triece +Trieger +Trier +Trieu +Trifero +Triffo +Trifiletti +Trifone +Trigg +Triggs +Trigillo +Trigleth +Triglia +Trigo +Trigueiro +Trigueros +Triguro +Trill +Trillana +Trillas +Triller +Trilli +Trilling +Trillo +Trilt +Trim +Trimarchi +Trimarco +Trimbach +Trimble +Trimboli +Trimino +Trimis +Trimm +Trimmell +Trimmer +Trimnal +Trimnell +Trimpe +Trinca +Trindle +Trine +Tringali +Tringham +Trinh +Trinidad +Trinka +Trinkl +Trinkle +Trinklein +Trinkley +Trinks +Trio +Triola +Triolo +Tripi +Triplet +Triplett +Triplette +Tripodi +Tripoli +Tripp +Trippany +Trippe +Trippel +Trippensee +Trippet +Trippett +Trippi +Tripplett +Trisch +Trischitta +Trisdale +Trish +Triska +Trisler +Tristan +Tritch +Trites +Tritle +Tritsch +Tritt +Tritten +Tritto +Tritz +Trivane +Trivedi +Triveno +Trivett +Trivette +Trivino +Trivisonno +Trivitt +Trizarry +Trnka +Trnong +Trobaugh +Trobough +Trobridge +Trocchio +Troccoli +Troche +Trochesset +Trocinski +Trodden +Troe +Troendle +Troesch +Troester +Troff +Trofholz +Trogdon +Troge +Troglen +Troglin +Trogstad +Troha +Trohanov +Troia +Troiani +Troiano +Troidl +Troike +Troilo +Troise +Troisi +Trojacek +Trojahn +Trojak +Trojan +Trojanovich +Trojanowski +Trojecki +Trojillo +Troke +Trokey +Trolinger +Trolio +Troll +Troller +Trollinger +Trollope +Tromba +Trombetta +Trombino +Tromblay +Tromble +Trombley +Trombly +Tromburg +Trometter +Tromley +Tromp +Trompeter +Tron +Tronaas +Troncoso +Trone +Trongone +Tronnes +Tronstad +Tront +Tronzo +Troop +Troost +Tropea +Tropiano +Tropp +Trosclair +Trosen +Trosien +Trosper +Trossbach +Trost +Trostel +Trostle +Troth +Trotman +Trotochaud +Trott +Trotta +Trotter +Trotti +Trottier +Trotto +Trotty +Trotz +Troublefield +Troung +Troup +Troupe +Trousdale +Trouser +Trout +Troutman +Troutner +Troutt +Trovato +Trover +Trovillion +Trovinger +Trowbridge +Trowel +Trowell +Trower +Trowers +Trowery +Troxel +Troxell +Troxil +Troxler +Troy +Troyan +Troyani +Troyano +Troyer +Truan +Truax +Trube +Trubey +Truby +Trucchi +Trucchio +Trucco +Truchan +Truchon +Trucker +Trucks +Trude +Trudeau +Trudel +Trudell +Trudelle +Truden +Trudgeon +Trudics +Trudillo +Trudnowski +Trudo +Trueax +Trueba +Trueblood +Truehart +Trueheart +Truell +Truelove +Trueluck +Trueman +Truesdale +Truesdell +Truett +Truex +Trufin +Truglia +Truglio +Truhe +Truiolo +Truitt +Trujillo +Truka +Trull +Trulli +Trullinger +Trulock +Trulove +Trulson +Truluck +Truly +Truman +Trumball +Trumbauer +Trumble +Trumbley +Trumbo +Trumbore +Trumbull +Trumm +Trump +Trumper +Trumpower +Trumpp +Trumps +Truncellito +Trundle +Trundy +Truner +Trunk +Trunnell +Trunzo +Truocchio +Truog +Truong +Truont +Trupia +Trupiano +Trupp +Truscott +Trusello +Trush +Trusillo +Truskowski +Trusler +Truslow +Truss +Trussel +Trussell +Trussler +Trusso +Trusty +Truver +Truxell +Truxillo +Truxler +Truxon +Try +Tryba +Trybala +Trybus +Trygg +Tryner +Tryninewski +Trynowski +Tryon +Trypaluk +Trythall +Trytten +Trzaska +Tsai +Tsakonas +Tsan +Tsang +Tsantakis +Tsao +Tsasie +Tsau +Tschache +Tschannen +Tschanz +Tschetter +Tschida +Tschirhart +Tschoepe +Tschumperlin +Tscrious +Tse +Tselee +Tsemetzis +Tseng +Tshudy +Tsiatsos +Tsing +Tsinnie +Tsironis +Tsistinas +Tso +Tsosie +Tsou +Tsu +Tsuboi +Tsuchida +Tsuchiura +Tsuchiya +Tsuda +Tsuha +Tsui +Tsuji +Tsukamoto +Tsukiyama +Tsunoda +Tsuruda +Tsutsui +Tsutsumi +Tsuzuki +Tu +Tua +Tuai +Tuamoheloa +Tuason +Tuazon +Tubaugh +Tubb +Tubbs +Tubby +Tubergen +Tuberman +Tubertini +Tuberville +Tubeszewski +Tubman +Tubolino +Tubville +Tucay +Tucci +Tucciarone +Tuccillo +Tuccio +Tucek +Tuch +Tuchman +Tucholski +Tuchy +Tuck +Tucke +Tucker +Tuckerman +Tuckerson +Tuckett +Tuckey +Tucknott +Tuczynski +Tudela +Tuder +Tudisco +Tudman +Tudor +Tudruj +Tuel +Tuell +Tueller +Tuenge +Tuer +Tuerk +Tuesburg +Tuey +Tufano +Tuff +Tuffey +Tuffin +Tufnell +Tufo +Tuft +Tufte +Tufts +Tugade +Tuggerson +Tuggie +Tuggle +Tuggles +Tugman +Tugwell +Tuholski +Tuia +Tuinstra +Tuite +Tuitt +Tujague +Tukes +Tukis +Tukuafa +Tuley +Tuliau +Tulino +Tulip +Tulis +Tulk +Tull +Tullar +Tuller +Tulley +Tullier +Tullio +Tullis +Tullison +Tullius +Tulloch +Tullock +Tullos +Tully +Tuma +Tuman +Tumaneng +Tumbaga +Tumbleson +Tumbleston +Tumblin +Tumey +Tuminello +Tumlin +Tumlinson +Tumlison +Tumminello +Tumminia +Tummons +Tumolillo +Tumolo +Tumpkin +Tumulty +Tun +Tunby +Tune +Tuner +Tung +Tungate +Tunget +Tunick +Tuning +Tunis +Tunison +Tunks +Tunnell +Tunney +Tunnicliff +Tunon +Tunson +Tunstall +Tuohey +Tuohy +Tuomala +Tuomi +Tuong +Tuorto +Tupa +Tupacyupanqui +Tupaj +Tupick +Tupin +Tuplano +Tuppen +Tupper +Tupy +Tur +Turano +Turansky +Turay +Turbacuski +Turbe +Turben +Turber +Turberville +Turbes +Turbeville +Turbide +Turbin +Turbiner +Turbyfill +Turchetta +Turchi +Turcio +Turcios +Turck +Turco +Turcott +Turcotte +Turdo +Turek +Turell +Turello +Tures +Tureson +Turgeon +Turi +Turiano +Turick +Turinetti +Turja +Turk +Turkasz +Turke +Turkel +Turkin +Turkington +Turkmay +Turko +Turkowski +Turks +Turkus +Turla +Turley +Turli +Turlich +Turlington +Turman +Turmel +Turmelle +Turnage +Turnball +Turnbaugh +Turnbill +Turnblom +Turnbo +Turnbough +Turnbow +Turnbull +Turne +Turneer +Turnell +Turner +Turnes +Turney +Turnham +Turnier +Turnipseed +Turnley +Turnmire +Turnmyre +Turnner +Turnow +Turnpaugh +Turnquist +Turns +Turntine +Turocy +Turomsha +Turowski +Turpen +Turpiano +Turpin +Turrell +Turrentine +Turrey +Turri +Turrie +Turrietta +Turrigiano +Turrill +Turro +Turrubiartes +Turrubiates +Tursi +Turso +Turtle +Turton +Turtura +Turturo +Turturro +Turvaville +Turvey +Turybury +Turzak +Turziano +Tusa +Tuschhoff +Tushoski +Tusing +Tusler +Tussey +Tussing +Tustin +Tustison +Tutaj +Tutas +Tutela +Tuten +Tuter +Tuthill +Tutino +Tutko +Tutoky +Tuton +Tutoni +Tutor +Tutson +Tutt +Tutterow +Tutterrow +Tuttle +Tutton +Tutuska +Tutwiler +Tuukanen +Tuxbury +Tuxhorn +Tuy +Tuzzio +Tuzzo +Tuzzolo +Tvedt +Twaddle +Twait +Twardy +Tweddell +Tweddle +Twedell +Tweden +Twedt +Tweed +Tweedie +Tweedle +Tweedy +Tweet +Twehous +Twellman +Twelves +Twersky +Tweten +Twichell +Twiddy +Twidwell +Twiest +Twiet +Twiford +Twigg +Twiggs +Twilley +Twillie +Twilligear +Twinam +Twine +Twiner +Twining +Twisdale +Twiss +Twisselman +Twist +Twitchell +Twito +Twitt +Twitty +Twogood +Twohatchet +Twohey +Twohig +Twombley +Twombly +Twomey +Tworek +Twyford +Twyman +Twymon +Ty +Tyacke +Tyberg +Tyburski +Tyce +Tycer +Tydeman +Tydings +Tye +Tyer +Tyeryar +Tygart +Tyger +Tyksinski +Tyl +Tyler +Tylman +Tylor +Tylwalk +Tyma +Tymeson +Tyminski +Tymon +Tyms +Tynan +Tyndal +Tyndall +Tyner +Tynes +Tynio +Tynon +Tyo +Tyon +Typhair +Tyra +Tyrance +Tyre +Tyree +Tyrell +Tyrer +Tyrie +Tyrol +Tyron +Tyrone +Tyrrell +Tyrus +Tysarczyk +Tysdal +Tysinger +Tyska +Tyson +Tysor +Tysseling +Tyssens +Tyszko +Tytler +Tyus +Tzeng +Tzeremes +Ubaldo +Uballe +Ubence +Uber +Ubertini +Ubiles +Ubl +Uboldi +Ubry +Uc +Uccellini +Uccello +Ucci +Uccio +Ucha +Uchida +Uchimura +Uchiyama +Uchytil +Udani +Uddin +Ude +Udell +Udicious +Udinsky +Udley +Udo +Udoh +Udy +Uebersax +Uecker +Ueckert +Ueda +Uehara +Ueki +Uelmen +Uemura +Ueno +Uerkwitz +Uffelman +Ufford +Ugaitafa +Ugalde +Ugarte +Ugaz +Ugland +Uglow +Uglum +Ugolini +Uhas +Uhde +Uher +Uhl +Uhlenhopp +Uhlenkott +Uhler +Uhles +Uhlich +Uhlig +Uhlir +Uhlman +Uhm +Uhrhammer +Uhri +Uhrich +Uhrig +Uhrin +Uhrmacher +Uhyrek +Uihlein +Uimari +Uitz +Ujano +Uk +Uken +Ukena +Ukich +Uknown +Ukosata +Ulabarro +Ulanski +Ulatowski +Ulberg +Ulbrich +Ulbricht +Ulcena +Ulch +Uldrich +Uleman +Ulerio +Ulery +Uliano +Ulibarri +Ulich +Ulicki +Ulicnik +Ulisch +Uljevic +Ullah +Ulland +Ullery +Ullman +Ullmann +Ullo +Ulloa +Ullom +Ullrich +Ullum +Ulm +Ulman +Ulmen +Ulmer +Ulrey +Ulrich +Ulrick +Ulsamer +Ulses +Ulseth +Ulsh +Ulshafer +Ulstad +Ultreras +Ultsch +Ultseh +Ulvan +Ulven +Ulwelling +Ulysse +Um +Umali +Umana +Umanzor +Umbach +Umbarger +Umbaugh +Umbdenstock +Umbel +Umbenhauer +Umberger +Umbrell +Umbright +Umeh +Umezawa +Umfleet +Umholtz +Umin +Umland +Umlauf +Umnus +Umphenour +Umphlett +Umphress +Umphrey +Umscheid +Umstead +Unangst +Unavailable +Uncapher +Unch +Unck +Underberg +Undercoffler +Underdahl +Underdown +Underdue +Underhill +Underkoffler +Underkofler +Underland +Underwood +Ung +Unga +Ungar +Ungaro +Unger +Ungerecht +Ungerland +Ungerleider +Ungerman +Unglaub +Unglesbee +Ungvarsky +Uniacke +Unick +Unikel +Union +Unkn +Unknow +Unland +Unnasch +Unnewehr +Unnold +Uno +Unrath +Unrau +Unrein +Unrue +Unruh +Unsell +Unser +Unsicker +Unsworth +Untalan +Unterburger +Unterkofler +Unterman +Unterreiner +Unterseher +Unterzuber +Unthank +Untiedt +Unvarsky +Unverzagt +Unzicker +Unzueta +Uong +Uoy +Upadhyaya +Upchurch +Updegraff +Updegrove +Updike +Updyke +Upham +Uphaus +Uphoff +Uphold +Uplinger +Upmeyer +Upole +Upp +Uppencamp +Uppinghouse +Upright +Upshaw +Upshur +Upson +Uptain +Uptegraft +Uptegrove +Uptgraft +Upthegrove +Uptmor +Upton +Upwall +Ur +Ura +Urabe +Uram +Uran +Uranga +Urankar +Urata +Urbach +Urbaez +Urbain +Urban +Urbancic +Urbanek +Urbani +Urbaniak +Urbanic +Urbanik +Urbano +Urbanski +Urbany +Urbas +Urben +Urbieta +Urbina +Urbine +Urbino +Urby +Urch +Urda +Urdiano +Ure +Uren +Urena +Urenda +Urenio +Ureno +Ureste +Uresti +Ureta +Urey +Urfer +Urguhart +Urhahn +Uriarte +Urias +Uribazo +Uribe +Urich +Urick +Urie +Uriegas +Urik +Urion +Urioste +Uriostegui +Uriostejue +Urive +Urizar +Urlanza +Urlaub +Urman +Urmeneta +Urmos +Urmston +Urness +Urps +Urquhart +Urquides +Urquidez +Urquidi +Urquijo +Urquilla +Urquiza +Urrabazo +Urraca +Urrea +Urreta +Urrey +Urrutia +Urry +Urse +Ursery +Ursiak +Ursini +Ursino +Urso +Ursprung +Ursua +Urtado +Urteaga +Urtiaga +Urtiz +Urton +Urtz +Urueta +Urwin +Urzua +Us +Usack +Uscio +Uselman +Uselton +Usery +Useted +Usher +Ushijima +Ushioda +Usie +Usilton +Usina +Usman +Uson +Usrey +Usry +Ussery +Ustico +Utecht +Uthe +Utley +Utsey +Utsler +Utt +Uttech +Utter +Utterback +Uttley +Utvik +Utz +Utzig +Utzinger +Uutela +Uva +Uvalle +Uvalles +Uxa +Uy +Uyeda +Uyehara +Uyematsu +Uyemura +Uyeno +Uyetake +Uzdygan +Uzee +Uzelac +Uziel +Uzun +Uzzell +Uzzle +Uzzo +Va +Vaca +Vacante +Vacanti +Vacarro +Vacca +Vaccarella +Vaccarello +Vaccarezza +Vaccarino +Vaccaro +Vacchiano +Vacek +Vacha +Vache +Vacher +Vacheresse +Vachon +Vachula +Vaci +Vacio +Vaclavik +Vactor +Vadala +Vadasy +Vaden +Vadenais +Vadlamudi +Vadnais +Vadner +Vaeth +Vaeza +Vafiades +Vafiadis +Vagas +Vaghn +Vaghy +Vagle +Vagliardo +Vaglienty +Vagnier +Vagott +Vagt +Vahena +Vahey +Vahle +Vaid +Vaidya +Vaiko +Vail +Vaile +Vailes +Vaill +Vaillancourt +Vaillencourt +Vails +Vaine +Vainio +Vair +Vais +Vaisman +Vaissiere +Vajda +Vajgrt +Vajnar +Vaka +Vakas +Vakil +Vaksman +Val +Vala +Valadao +Valade +Valadez +Valado +Valaitis +Valakas +Valant +Valasco +Valasek +Valasquez +Valazquez +Valcarcel +Valcho +Valcin +Valcourt +Valderamo +Valderas +Valderrama +Valdes +Valdespino +Valdez +Valdivia +Valdivieso +Valdiviezo +Valdo +Valdovino +Valdovinos +Vale +Valek +Valela +Valen +Valencia +Valenciana +Valenstein +Valensuela +Valent +Valenta +Valente +Valenti +Valentia +Valentin +Valentine +Valentini +Valentino +Valentyn +Valenza +Valenzano +Valenziano +Valenzuela +Valenzula +Valenzvela +Valer +Valera +Valeri +Valeriani +Valeriano +Valerie +Valerino +Valerio +Valerius +Valero +Valery +Vales +Valesquez +Valez +Valgren +Valido +Valiente +Valin +Valine +Valintine +Valiquette +Valis +Valiton +Valk +Valko +Vall +Valla +Valladao +Valladares +Valladolid +Valladores +Vallance +Vallandingham +Vallangeon +Vallar +Vallario +Vallarta +Vallas +Valle +Vallecillo +Vallee +Vallegos +Vallejo +Vallejos +Vallelonga +Vallely +Vallentine +Vallerand +Vallero +Vallery +Valles +Valletta +Vallette +Valley +Vallez +Valli +Vallian +Valliant +Vallie +Vallien +Vallier +Valliere +Vallieres +Vallimont +Vallin +Vallo +Vallon +Vallone +Vallot +Vallotton +Vallow +Valls +Valme +Valois +Valone +Valorie +Valot +Valotta +Valree +Valrey +Valrie +Valseca +Valsin +Valtas +Valtierra +Valvano +Valverde +Valvo +Vampa +Van +Vanabel +Vanacker +Vanacore +Vanaken +Vanakin +Vanallen +Vanaller +Vanalphen +Vanalst +Vanalstin +Vanalstine +Vanalstyne +Vanaman +Vanamburg +Vanamburgh +Vanamerongen +Vanandel +Vanantwerp +Vanaprasert +Vanaria +Vanarsdale +Vanarsdall +Vanartsdalen +Vanasse +Vanasselt +Vanasten +Vanatta +Vanauken +Vanauker +Vanausdal +Vanbebber +Vanbecelaere +Vanbeck +Vanbeek +Vanbelle +Vanbenthuyse +Vanbergen +Vanbeveren +Vanbibber +Vanblarcom +Vanblaricum +Vanboerum +Vanbogelen +Vanboven +Vanbramer +Vanbrocklin +Vanbruggen +Vanbrunt +Vanburen +Vanbuskirk +Vancamp +Vancampen +Vance +Vancheri +Vancil +Vancise +Vancleaf +Vancleave +Vancleve +Vanclief +Vanconant +Vanconey +Vancooten +Vancott +Vancura +Vancuren +Vandaele +Vandagriff +Vandal +Vandale +Vandall +Vandalsen +Vandam +Vandamme +Vandawalker +Vandeberg +Vandebogart +Vandebrake +Vandebrink +Vandee +Vandegraaff +Vandegriff +Vandegrift +Vandehei +Vandehey +Vandekamp +Vandekieft +Vandel +Vandelaare +Vandell +Vandellen +Vandeman +Vandemark +Vandemortel +Vandenacre +Vandenberg +Vandenberge +Vandenbergh +Vandenberghe +Vandenboom +Vandenbos +Vandenbosch +Vandenbrink +Vandenburg +Vandenburgh +Vandenheuvel +Vandeputte +Vanderark +Vanderau +Vanderbeck +Vanderbeek +Vanderberg +Vanderbie +Vanderbilt +Vanderboom +Vanderburg +Vandercook +Vanderen +Vanderford +Vandergiessen +Vandergraph +Vandergriend +Vandergriff +Vandergrift +Vanderheide +Vanderheiden +Vanderheyden +Vanderhoef +Vanderhoff +Vanderhoof +Vanderhoot +Vanderhorst +Vanderhurst +Vanderhyde +Vanderiet +Vanderjagt +Vanderkaaden +Vanderkam +Vanderkar +Vanderkooi +Vanderlaan +Vanderlee +Vanderlinde +Vanderlinden +Vanderlip +Vanderloo +Vandermark +Vandermay +Vandermeer +Vandermeulen +Vandermolen +Vandermoon +Vandernoot +Vanderploeg +Vanderpoel +Vanderpol +Vanderpool +Vanderroest +Vanderschaege +Vanderschel +Vanderschoot +Vanderslice +Vandersloot +Vanderstappen +Vandersteen +Vanderstelt +Vandertuig +Vanderveen +Vanderveer +Vandervelden +Vandervoort +Vandervort +Vanderwal +Vanderwall +Vanderweel +Vanderweerd +Vanderwege +Vanderweide +Vanderwerf +Vanderwerff +Vanderwilt +Vanderwood +Vanderwoude +Vanderwyk +Vanderzanden +Vanderzee +Vanderzwaag +Vandesande +Vandesteeg +Vandesteene +Vandestreek +Vandeusen +Vandevander +Vandevanter +Vandeveble +Vandeveer +Vandevelde +Vandevender +Vandeventer +Vandever +Vandevere +Vandevoorde +Vandevort +Vandevsen +Vandewalker +Vandewalle +Vandewater +Vandeweert +Vandewege +Vandewerker +Vandeyacht +Vandezande +Vandiest +Vandiford +Vandine +Vandinter +Vandis +Vandiver +Vandivier +Vandivort +Vandixon +Vandon +Vandonsel +Vandoren +Vandorien +Vandorn +Vandorp +Vandover +Vandre +Vandresar +Vandriel +Vandrunen +Vandunk +Vandusen +Vanduser +Vanduyn +Vanduyne +Vanduynhoven +Vanduzer +Vandy +Vandyck +Vandygriff +Vandyk +Vandyke +Vandyne +Vane +Vaneaton +Vanecek +Vaneck +Vaneekelen +Vaneffen +Vanegas +Vanegdom +Vanek +Vanelderen +Vanella +Vanelli +Vanepps +Vaneps +Vanert +Vanes +Vaness +Vanetta +Vanetten +Vanevery +Vaneyck +Vanez +Vanfleet +Vanfossan +Vanfossen +Vang +Vangalder +Vangelder +Vangelos +Vangemert +Vangerbig +Vangieson +Vangilder +Vangoff +Vangompel +Vangorden +Vangorder +Vangordon +Vangorp +Vangrouw +Vanguilder +Vangundy +Vangyi +Vanhaitsma +Vanham +Vanhamersveld +Vanhamlin +Vanhamme +Vanhampler +Vanhandel +Vanharlingen +Vanhauen +Vanhecke +Vanhee +Vanheel +Vanhekken +Vanhese +Vanheukelem +Vanheusen +Vanhevel +Vanhise +Vanhoecke +Vanhoesen +Vanhoff +Vanhofwegen +Vanholland +Vanhook +Vanhoose +Vanhooser +Vanhoozer +Vanhoozier +Vanhorn +Vanhorne +Vanhout +Vanhouten +Vanhoutte +Vanhove +Vanhowe +Vanhoy +Vanhulle +Vanhuss +Vanhyning +Vanicek +Vanier +Vaninetti +Vanis +Vanish +Vanisouvong +Vankammen +Vankampen +Vankeuren +Vankilsdonk +Vankirk +Vankleeck +Vankomen +Vankoten +Vanlaar +Vanlaere +Vanlandingham +Vanlaningham +Vanleer +Vanleeuwen +Vanlent +Vanleuvan +Vanleuven +Vanlew +Vanlier +Vanliere +Vanliew +Vanlinden +Vanlith +Vanloan +Vanloh +Vanloo +Vanloon +Vanlue +Vanluven +Vanmaanen +Vanmarter +Vanmatre +Vanmeter +Vanmetre +Vanmiddleswor +Vann +Vannah +Vannaman +Vannatta +Vannatten +Vannatter +Vannelli +Vanner +Vanness +Vannest +Vannette +Vanni +Vannice +Vanniello +Vannorden +Vannorman +Vannorsdell +Vannortwick +Vannostrand +Vannote +Vannover +Vannoy +Vannuck +Vannuland +Vanochten +Vanoflen +Vanoli +Vanolinda +Vanoni +Vanoort +Vanoosten +Vanord +Vanorden +Vanorder +Vanorsdale +Vanorsdol +Vanorsouw +Vanos +Vanosdel +Vanosdol +Vanostberg +Vanostrand +Vanous +Vanoven +Vanover +Vanoy +Vanpatten +Vanpatton +Vanpelt +Vanpoppelen +Vanpoucke +Vanproosdy +Vanputten +Vanriper +Vanroekel +Vanrossum +Vanruiten +Vanruler +Vanry +Vansant +Vanschaick +Vanschoiack +Vanschoick +Vanschoor +Vanschoyck +Vanschuyver +Vansciver +Vanscoik +Vanscoit +Vanscooter +Vanscoter +Vanscoy +Vanscyoc +Vansice +Vansickle +Vansicklin +Vansise +Vanskike +Vanskiver +Vanslander +Vanslooten +Vanslyke +Vansoest +Vanson +Vanstee +Vansteenberg +Vansteenburg +Vansteenhuyse +Vansteenwyk +Vanstone +Vanstrander +Vanstraten +Vanstrom +Vansumeren +Vansyckle +Vant +Vanta +Vantassel +Vantassell +Vanterpool +Vantil +Vantine +Vantol +Vantrease +Vantreese +Vantrump +Vantull +Vantuyl +Vantuyle +Vanuden +Vanvalen +Vanvalkenbur +Vanvalkenburg +Vanveen +Vanveldhuize +Vanvickle +Vanvleck +Vanvleet +Vanvliet +Vanvolkenburg +Vanvolkinburg +Vanvoorhees +Vanvoorhis +Vanvorst +Vanvranken +Vanvuren +Vanwagenen +Vanwagner +Vanwagoner +Vanwart +Vanwassenhove +Vanwechel +Vanweelden +Vanweerd +Vanwert +Vanwey +Vanwhy +Vanwie +Vanwieren +Vanwingerden +Vanwinkle +Vanwoert +Vanwormer +Vanwright +Vanwyck +Vanwye +Vanwyhe +Vanwyk +Vanwyngaarden +Vanyo +Vanzandt +Vanzant +Vanzante +Vanzanten +Vanzee +Vanzie +Vanzile +Vanzyl +Vaquera +Vaquerano +Vaquero +Vaquez +Vara +Varady +Varagona +Varajas +Varakuta +Varanda +Varanese +Varano +Varas +Varaza +Varble +Varcoe +Varda +Vardaman +Vardaro +Vardeman +Varden +Vardy +Varel +Varela +Varella +Varenhorst +Vares +Vareschi +Varesko +Varga +Vargas +Vargason +Varghese +Vargis +Vargo +Vargus +Vari +Varian +Varieur +Varillas +Varin +Vario +Varisco +Varkey +Varland +Varlas +Varley +Varma +Varn +Varnado +Varnadoe +Varnadore +Varnedoe +Varnedore +Varnell +Varner +Varnes +Varney +Varno +Varnon +Varnum +Varon +Varona +Varone +Varos +Varoz +Varquera +Varquez +Varrato +Varrelman +Varriale +Varriano +Varro +Varron +Varrone +Vars +Vartanian +Vartanyan +Varty +Varughese +Varuzzo +Varvel +Varvil +Vas +Vasallo +Vasaure +Vasbinder +Vascocu +Vasconcellos +Vasconcelos +Vascones +Vasconez +Vasek +Vasey +Vasguez +Vashaw +Vasher +Vashon +Vasi +Vasil +Vasilauskas +Vasile +Vasiliou +Vasiloff +Vasilopoulos +Vaske +Vasko +Vasmadjides +Vasos +Vasque +Vasques +Vasquez +Vasquiz +Vass +Vassall +Vassallo +Vassar +Vassel +Vassell +Vassen +Vasser +Vasseur +Vassey +Vassie +Vassil +Vasso +Vassure +Vasta +Vastakis +Vastano +Vastardis +Vastine +Vastola +Vasudevan +Vaszily +Vatalaro +Vatch +Vates +Vath +Vathroder +Vatter +Vatterott +Vattes +Vattikuti +Vaubel +Vaudrain +Vaudreuil +Vaugh +Vaughan +Vaughen +Vaughn +Vaughner +Vaughns +Vaught +Vaulet +Vaulx +Vaupel +Vause +Vauter +Vauters +Vautier +Vautour +Vautrin +Vaux +Vavra +Vavricek +Vavricka +Vavro +Vawter +Vay +Vayda +Vayner +Vayon +Vaz +Vazguez +Vazques +Vazquez +Vazzana +Vbiles +Ve +Vea +Veach +Veader +Veal +Veale +Veals +Vear +Veasey +Veasley +Veasman +Veatch +Veater +Veazey +Veazie +Vebel +Vecchi +Vecchia +Vecchiarelli +Vecchio +Vecchione +Vecellio +Vecino +Vecker +Vedder +Vedia +Vedovelli +Vee +Veeder +Veen +Veeneman +Veenstra +Veer +Veerkamp +Veeser +Vega +Vegar +Vegas +Vegerano +Vegetabile +Vegh +Vegher +Vegter +Vehrenkamp +Vehrs +Veiga +Veigel +Veil +Veile +Veillette +Veilleux +Veillon +Vein +Veino +Veit +Veitch +Veitenheimer +Veith +Veitinger +Veitz +Vejar +Vejarano +Veksler +Vela +Velandia +Velaquez +Velarde +Velardes +Velardi +Velardo +Velasco +Velasques +Velasquez +Velastegui +Velazco +Velazguez +Velazques +Velazquez +Veld +Veldhuizen +Veldkamp +Vele +Velega +Veles +Veleta +Veley +Velez +Velie +Velilla +Velis +Veliz +Velk +Velky +Vella +Vellekamp +Veller +Vellone +Vellucci +Vellutini +Velmontes +Velo +Veloso +Velotta +Velovic +Veloz +Velten +Velthuis +Veltin +Veltkamp +Veltman +Veltre +Veltri +Veltz +Velunza +Velverton +Velzeboer +Velzy +Vemura +Ven +Vena +Venable +Venancio +Venanzi +Venard +Vence +Vences +Vencill +Vendela +Vendelin +Vendetti +Vendig +Venditti +Venditto +Vendrick +Veneable +Venecia +Venegas +Venema +Veneman +Vener +Venerable +Venere +Veneri +Veness +Venetos +Veney +Venezia +Veneziano +Venghaus +Venhorst +Venible +Venice +Venier +Veninga +Venkus +Venn +Vennari +Venne +Venneman +Venner +Venneri +Vennes +Venning +Veno +Venosh +Vensel +Venske +Venskoske +Venson +Vent +Venter +Venters +Venth +Ventimiglia +Vento +Ventola +Venton +Ventors +Ventre +Ventrella +Ventresca +Ventress +Ventrice +Ventris +Ventrone +Ventry +Ventur +Ventura +Venture +Venturella +Venturelli +Venturi +Venturini +Venturino +Venus +Venuti +Venuto +Venzeio +Venzke +Venzon +Venzor +Ver +Vera +Verano +Verant +Veras +Verastequi +Verba +Verbasco +Verbeck +Verbeke +Verbilla +Verbit +Verble +Verbridge +Verburg +Verch +Vercher +Verd +Verde +Verdejo +Verdell +Verderame +Verderber +Verderosa +Verdi +Verdier +Verdiguel +Verdin +Verdine +Verdino +Verdon +Verdone +Verducci +Verdugo +Verdun +Verdusco +Verduzco +Vere +Vereb +Vereen +Verela +Veren +Veres +Verfaille +Verfaillie +Verga +Vergamini +Vergara +Vergari +Verge +Vergeer +Verges +Verghese +Vergin +Vergo +Verhaag +Verhaeghe +Verhagen +Verhague +Verhey +Verheyen +Verhines +Verhoeven +Verhoff +Verhulst +Veriato +Verigan +Verissimo +Verity +Verjan +Verkamp +Verkler +Verkuilen +Verlato +Verley +Verlin +Verlinden +Verling +Verlotte +Verma +Vermeer +Vermeesch +Vermette +Vermeulen +Vermillion +Vermilya +Vermilyea +Vermont +Verna +Vernaglia +Vernazza +Verne +Verner +Vernet +Vernetti +Verni +Vernia +Vernier +Vernola +Vernon +Vernoy +Vero +Veroba +Veroeven +Veron +Verona +Verone +Veronesi +Verplanck +Verra +Verrastro +Verrecchia +Verrell +Verrelli +Verret +Verrett +Verrier +Verrill +Verrilli +Verrone +Verros +Verrue +Verry +Versace +Versage +Versaw +Versele +Verser +Versluis +Verso +Versoza +Versteeg +Versteegh +Verstraete +Vert +Vertiz +Vertrees +Vertucci +Vertz +Verucchi +Verunza +Verville +Verwers +Verzi +Vescio +Vesco +Vescovi +Veselic +Veselka +Vesely +Vesey +Veshedsky +Vesley +Vespa +Vesper +Vesperas +Vesperman +Vespia +Vess +Vessar +Vessel +Vessell +Vessella +Vessels +Vessey +Vest +Vestal +Vester +Vestering +Vetere +Veteto +Veth +Veto +Vetrano +Vetri +Vetsch +Vettel +Vetter +Vetterick +Vetterkind +Veve +Vevea +Veverka +Vey +Veyna +Veys +Veysey +Vezina +Vezza +Via +Viafara +Vial +Viale +Viall +Vialpando +Vian +Viana +Viands +Viano +Viapiano +Viar +Viard +Viars +Vias +Viator +Viau +Vibbard +Vibbert +Vibert +Vicari +Vicario +Vicars +Viccica +Vice +Vicencio +Vicens +Vicent +Vicente +Vicenteno +Vichi +Vichidvongsa +Vicic +Vicini +Vicioso +Vick +Vicker +Vickerman +Vickers +Vickerson +Vickery +Vickey +Vicknair +Vickrey +Vickroy +Vicks +Vicory +Vicoy +Vicsik +Victor +Victorero +Victoria +Victorian +Victorica +Victorin +Victorine +Victorino +Victory +Vicueroa +Vicuna +Vida +Vidaca +Vidal +Vidales +Vidalez +Vidals +Vidana +Vidas +Vidaurri +Videen +Vides +Videtto +Vidinha +Vidler +Vidmar +Vidot +Vidovich +Vidra +Vidrine +Vidrio +Vidro +Vidulich +Vieau +Viebrock +Viegas +Viehman +Vieira +Viejo +Viel +Viele +Vielhauer +Vielle +Vielma +Vielman +Vielmas +Vien +Viener +Viengxay +Vienneau +Viens +Vient +Vientos +Vier +Viera +Viereck +Vierk +Vierling +Viernes +Vierps +Vierra +Viers +Vierthaler +Viesca +Viesselman +Viessman +Vieth +Vieths +Vietor +Viets +Vietti +Vietzke +Vieu +Vieux +View +Vieweg +Vieyra +Vig +Vigario +Vigen +Viger +Viggiani +Viggiano +Vigiano +Vigier +Vigil +Vigilante +Vigilo +Vigliotti +Vigna +Vignarath +Vignaux +Vigne +Vigneau +Vigneault +Vignola +Vignovich +Vigo +Vigor +Vigoren +Vigorito +Vigue +Vigueras +Viguerie +Vigus +Vijayan +Vijil +Vik +Viken +Viker +Vil +Vila +Vilain +Vilandre +Vilanova +Vilar +Vilardi +Vilardo +Vilaro +Vilca +Vilcan +Vilcheck +Vilches +Vilchis +Vildosola +Vile +Vilegas +Vilello +Viles +Vilhauer +Vilkama +Vilkoski +Villa +Villacana +Villacis +Villacorta +Villacrusis +Villada +Villaescusa +Villafana +Villafane +Villaflor +Villafranca +Villafuerte +Villagomez +Villagran +Villagrana +Villaire +Villalba +Villalobas +Villalobos +Villalon +Villalona +Villalouos +Villalovos +Villalpando +Villalta +Villaluazo +Villaluz +Villalva +Villalvazo +Villaman +Villamar +Villamarin +Villamayor +Villamil +Villandry +Villane +Villaneda +Villaneuva +Villaneva +Villani +Villano +Villanova +Villante +Villanueva +Villanvera +Villanveua +Villanveva +Villao +Villapando +Villaplana +Villaquiran +Villar +Villard +Villareal +Villari +Villarin +Villarreal +Villarruel +Villarrvel +Villarta +Villas +Villasana +Villasenor +Villasis +Villata +Villatora +Villatoro +Villaverde +Villavicencio +Ville +Villecus +Villeda +Villega +Villegas +Villela +Villella +Villemarette +Villena +Villenas +Villeneuve +Villerreal +Villescas +Villescaz +Villetas +Villiard +Villicana +Villifana +Villines +Villnave +Villot +Villwock +Vilmont +Viloria +Vilt +Viltz +Vilven +Vimont +Vina +Vinagre +Vinal +Vinall +Vinas +Vince +Vincelette +Vincent +Vincente +Vincenzo +Vinci +Vinciguerra +Vincik +Vinck +Vind +Vindiola +Vine +Vinegar +Viner +Vines +Vinet +Viney +Vineyard +Vinger +Viniard +Viniegra +Vining +Vinion +Vink +Vinke +Vinning +Vinroe +Vinsant +Vinsel +Vinson +Vint +Vinti +Vintila +Vintimilla +Vintinner +Vinton +Vinup +Vinyard +Vinz +Vinzant +Viola +Violante +Violet +Violett +Violetta +Violette +Viorel +Viox +Vipond +Vipperman +Virag +Viramontas +Viramontes +Virani +Virant +Viray +Virden +Virdin +Vire +Virella +Virelli +Viren +Vires +Virga +Virgadamo +Virgel +Virgen +Virgie +Virgil +Virgile +Virgili +Virgilio +Virgin +Virginia +Virgo +Virkler +Virock +Virola +Virostko +Virrey +Virrueta +Virts +Virtue +Viruet +Virula +Virzi +Vis +Visage +Visalli +Visaya +Viscardi +Viscarra +Viscarro +Viscera +Viscia +Visco +Viscome +Visconti +Viscosi +Vise +Visel +Viser +Visher +Visick +Visitacion +Visker +Visnic +Visnocky +Visnosky +Visocsky +Visor +Visosky +Visounnaraj +Visovsky +Visser +Vissering +Vissman +Viste +Visvardis +Vita +Vitagliano +Vital +Vitale +Vitali +Vitalo +Vitaniemi +Vitantonio +Vitanza +Vitatoe +Viteaux +Vitek +Vitela +Vitellaro +Vitelli +Vitello +Viteo +Vitera +Viteri +Vitez +Viti +Vitiello +Vititoe +Vititow +Vitko +Vitkus +Vito +Vitolas +Vitolo +Vitorino +Vitrano +Vitro +Vitt +Vittek +Vittetoe +Vitti +Vittitoe +Vittitow +Vittone +Vittorini +Vittorio +Vittum +Vitucci +Vitullo +Vivanco +Vivar +Vivas +Viveiros +Vivenzio +Viverette +Viveros +Vives +Vivian +Viviani +Viviano +Vivier +Vivino +Vivion +Vivo +Vivolo +Vivona +Vivyan +Vix +Vixay +Vixayack +Vizard +Vizarro +Vizcaino +Vizcarra +Vizcarrondo +Vizena +Vizuete +Vizza +Vizzi +Vizzini +Vlach +Vlahos +Vlahovich +Vlasak +Vlasaty +Vlashi +Vlcek +Vlchek +Vleming +Vliem +Vliet +Vljeric +Vlk +Vlloa +Vo +Voccia +Voce +Vocelka +Voci +Vock +Vocu +Vodder +Vodicka +Vodopich +Voedisch +Voegele +Voegeli +Voeks +Voelkel +Voelker +Voelkerding +Voeller +Voeltner +Voeltz +Voelz +Voetberg +Voetmann +Voetsch +Vogan +Vogds +Voge +Vogel +Vogeler +Vogelgesang +Vogelpohl +Vogelsang +Vogelsberg +Vogelzang +Vogenthaler +Voges +Vogl +Vogland +Vogle +Vogler +Voglund +Vogt +Vogtlin +Vogtman +Vogts +Vogus +Vohs +Voice +Voight +Voights +Voigt +Voigtlander +Voiles +Voisard +Voisin +Voisine +Voisinet +Voit +Voita +Voitier +Vojna +Vojta +Vojtko +Vokes +Volante +Volbert +Volbrecht +Volckmann +Volcko +Vold +Volden +Volek +Volentine +Volesky +Volin +Volino +Volinsky +Voliva +Volk +Volkens +Volker +Volkers +Volkert +Volking +Volkman +Volkmann +Volkmer +Voll +Volland +Vollbrecht +Volle +Vollenweider +Voller +Vollette +Vollick +Vollman +Vollmar +Vollmer +Vollmering +Vollmers +Vollrath +Vollstedt +Vollucci +Volmar +Volmer +Volmink +Volner +Volo +Volpa +Volpe +Volper +Volpert +Volpi +Volpicelli +Volpone +Volstad +Voltaire +Voltin +Voltz +Volz +Vona +Vonallmen +Vonarx +Vonasek +Vonbank +Vonbargen +Vonbraunsberg +Voncannon +Vonderahe +Vonderhaar +Vonderheide +Vonderkell +Vondielingen +Vondohlen +Vondoloski +Vondra +Vondracek +Vondrak +Vondran +Vondrasek +Voner +Vonfelden +Vonfeldt +Vong +Vongal +Vongkhamchanh +Vongkhamphanh +Vongphakdy +Vongsakda +Vongsamphanh +Vongunten +Vongvivath +Vongxay +Vonhagen +Vonholt +Vonk +Vonkrosigk +Vonner +Vonniederhaus +Vonruden +Vonschriltz +Vonseeger +Vonseggern +Vonsoosten +Vonstaden +Vonstein +Vontungeln +Vonwagoner +Voogd +Voong +Voorhees +Voorheis +Voorhes +Voorhies +Voorhis +Vopava +Vora +Voracek +Vorachek +Voran +Vorce +Vore +Vorel +Vorgas +Vorhees +Vorhies +Vorholt +Vories +Voris +Vorkink +Vormelker +Vormwald +Vornes +Voros +Vorpahl +Vorsburgh +Vorse +Vorwald +Vorwaller +Vorwerk +Vos +Vosberg +Vosburg +Vosburgh +Vose +Voshell +Vosika +Voskamp +Voskowsky +Vosmus +Vosper +Vosquez +Voss +Vossen +Vossler +Vost +Vostal +Votaua +Votaw +Vote +Voter +Voth +Voto +Votolato +Votraw +Votsmier +Votta +Vought +Vounas +Vovak +Voves +Vowell +Vowels +Vowles +Voyer +Voyles +Voytek +Vrabel +Vrable +Vrablic +Vradenburg +Vrana +Vranek +Vranes +Vranicar +Vranich +Vrazel +Vrba +Vrbas +Vrbka +Vredenburg +Vredenburgh +Vredeveld +Vreeken +Vreeland +Vreeman +Vreugdenhil +Vrias +Vriens +Vrieze +Vroman +Vroom +Vrooman +Vu +Vuckovich +Vue +Vugteveen +Vuillemot +Vukcevic +Vukelich +Vukelj +Vukich +Vukovich +Vulgamore +Vulgamott +Vulich +Vullo +Vuncannon +Vuolo +Vuong +Vuono +Vuoso +Vuturo +Vuyovich +Vy +Vyas +Vyhnal +Waack +Waag +Waaga +Waage +Waananen +Waas +Wabasha +Wable +Wacaster +Wach +Wachal +Wachob +Wachowiak +Wachowski +Wachs +Wachsman +Wachsmuth +Wacht +Wachtel +Wachter +Wachtler +Wack +Wackenheim +Wackenhut +Wacker +Wackerbarth +Wackerly +Wackman +Waclawski +Wactor +Wacyk +Wada +Wadas +Waddel +Waddell +Wadden +Waddick +Waddill +Wadding +Waddington +Waddle +Waddles +Waddouds +Waddoups +Waddups +Waddy +Wade +Wadel +Wadell +Wademan +Wadford +Wadhams +Wadkins +Wadle +Wadleigh +Wadley +Wadlinger +Wadlington +Wadlow +Wadman +Wadsworth +Wadusky +Wadzinski +Waechter +Waeckerlin +Waegner +Waelti +Waetzig +Waeyaert +Wafer +Waffenschmidt +Waffle +Wafford +Wafula +Wagaman +Waganer +Wagar +Wagatsuma +Wage +Wageman +Wagemann +Wagenaar +Wagenblast +Wagener +Wagenheim +Wagenknecht +Wager +Wagers +Wages +Wagg +Waggaman +Wagganer +Waggener +Waggett +Waggner +Waggoner +Waggy +Wagle +Wagler +Wagley +Wagman +Wagner +Wagnon +Wagnor +Wagon +Wagoner +Wagstaff +Wagster +Waguespack +Wagy +Wah +Wahba +Wahdan +Wahid +Wahington +Wahl +Wahlberg +Wahlen +Wahlenmaier +Wahler +Wahlers +Wahlert +Wahlgren +Wahlman +Wahlquist +Wahlstrom +Wahlund +Wahn +Wahner +Wahoske +Wahpekeche +Wahr +Wahs +Wai +Waiau +Waibel +Waid +Waide +Waidelich +Waiden +Waight +Waiki +Wailes +Wain +Wainer +Wainio +Wainkrantz +Wainman +Wainright +Wainscott +Wainwright +Wair +Wais +Waisanen +Waisath +Waisman +Waisner +Waiss +Wait +Waite +Waiters +Waites +Waithe +Waitkus +Waitman +Waits +Waitz +Wajda +Waka +Wakabayashi +Wakayama +Wake +Wakefield +Wakeford +Wakeham +Wakeland +Wakeley +Wakeling +Wakely +Wakeman +Wakenight +Waker +Wakham +Wakin +Wakins +Wakita +Wakley +Wakula +Wal +Wala +Walat +Walawender +Walberg +Walbert +Walborn +Walbrecht +Walbridge +Walbright +Walburn +Walby +Walch +Walchak +Walchli +Walck +Walcott +Walcutt +Walczak +Walczyk +Walczynski +Wald +Waldal +Waldall +Waldbauer +Walde +Waldeck +Waldecker +Walden +Waldenberg +Waldenmyer +Walder +Walderon +Waldhauser +Waldhoff +Waldie +Walding +Waldman +Waldmann +Waldner +Waldo +Waldoch +Waldock +Waldon +Waldorf +Waldow +Waldram +Waldren +Waldrep +Waldridge +Waldrip +Waldroff +Waldron +Waldroop +Waldrop +Waldrope +Waldroup +Waldrup +Waldschmidt +Waldvogel +Wale +Walega +Walema +Walen +Walenta +Walentoski +Waler +Wales +Waletzko +Waley +Walezak +Walford +Walgren +Walicki +Waligora +Walin +Walinski +Walizer +Walk +Walka +Walke +Walken +Walkenhorst +Walker +Walkers +Walkes +Walking +Walkingstick +Walkington +Walkins +Walkinshaw +Walkley +Walkling +Walkner +Walko +Walkowiak +Walkowski +Walks +Walkup +Wall +Walla +Wallace +Wallach +Wallack +Wallaert +Wallaker +Walland +Wallander +Wallau +Wallbank +Wallberg +Wallbrown +Walle +Walleck +Wallen +Wallenbrock +Wallenda +Wallenstein +Wallentine +Waller +Wallerich +Walles +Wallet +Wallett +Walley +Wallgren +Wallick +Wallie +Wallin +Walling +Wallinga +Wallinger +Wallingford +Wallington +Wallis +Walliser +Walljasper +Wallman +Wallner +Wallo +Walloch +Wallor +Wallravin +Walls +Wallschlaeger +Wallwork +Wally +Walman +Walmer +Walmsley +Waln +Walner +Waloven +Walp +Walper +Walpole +Walquist +Walrath +Walraven +Walrod +Walrond +Walser +Walseth +Walsh +Walshe +Walsingham +Walson +Walstad +Walston +Walstrom +Walstrum +Walsworth +Walt +Waltemath +Waltemeyer +Waltenbaugh +Walter +Walterman +Waltermire +Walters +Walterscheid +Waltersdorf +Waltersheid +Walterson +Walth +Walthall +Walther +Walthers +Waltho +Walthour +Waltjen +Waltman +Waltmann +Waltmon +Waltner +Walto +Walton +Waltos +Waltrip +Walts +Waltz +Waltzer +Walund +Walvatne +Walvoord +Walworth +Walwyn +Walz +Walzer +Walzier +Wamack +Wambach +Wamble +Wamboldt +Wamhoff +Wammack +Wampler +Wampol +Wampole +Wamser +Wamsley +Wan +Wanamaker +Wanat +Wanberg +Wanca +Wanczyk +Wand +Wanda +Wandel +Wandell +Wander +Wanders +Wandersee +Wandler +Wandless +Wandrei +Wandrie +Wands +Wanek +Waneka +Waner +Wang +Wangberg +Wanger +Wangerin +Wangler +Wangstad +Waninger +Wank +Wanke +Wankel +Wanker +Wanko +Wankum +Wanland +Wanlass +Wanless +Wann +Wannamaker +Wannarka +Wanner +Wannlund +Wanous +Wanschek +Wanser +Wansing +Wansitler +Wansley +Want +Wanta +Wantland +Wantuck +Wanty +Wantz +Wanvig +Wanzek +Wanzer +Waples +Wapp +Wappel +War +Warbington +Warboys +Warbritton +Warburg +Warburton +Warchal +Warchol +Ward +Wardall +Warde +Wardell +Warden +Warder +Wardhaugh +Wardian +Wardinsky +Wardlaw +Wardle +Wardlow +Wardman +Wardon +Wardrip +Wardrop +Wardrup +Wardsworth +Wardwell +Ware +Wareham +Wareheim +Warehime +Wareing +Waren +Warens +Wares +Warf +Warfel +Warfield +Warford +Warga +Wargo +Warhol +Warhola +Warholic +Warhurst +Warick +Warila +Wariner +Waring +Wark +Warkentin +Warley +Warlick +Warling +Warlock +Warlow +Warm +Warmack +Warman +Warmath +Warmbier +Warmbrod +Warmbrodt +Warmington +Warmka +Warmoth +Warmuth +Warn +Warnack +Warnasch +Warnberg +Warncke +Warne +Warnecke +Warneka +Warneke +Warnell +Warner +Warnes +Warney +Warnick +Warning +Warnix +Warnke +Warnken +Warnock +Warns +Warnstaff +Warntz +Waroway +Warp +Warpool +Warr +Warran +Warrell +Warren +Warrender +Warrenfeltz +Warrick +Warrilow +Warriner +Warring +Warrington +Warrior +Warrix +Warsager +Warsaw +Warschaw +Warsham +Warshauer +Warshaw +Warsing +Warsme +Warson +Warstler +Wartchow +Wartenberg +Warters +Warth +Warthen +Wartman +Warton +Warwick +Wary +Warzecha +Warzybok +Wascher +Wasco +Wascom +Wasden +Wasem +Waser +Wash +Washabaugh +Washam +Washburn +Washell +Washer +Washing +Washington +Washinski +Washinton +Washko +Washler +Washman +Washmuth +Washnock +Washor +Washpun +Washuk +Washum +Washup +Washurn +Wasicek +Wasielewski +Wasik +Wasilewski +Wasilko +Wasinger +Wasiuta +Waska +Waskey +Waskiewicz +Waskin +Wasko +Waskom +Waskow +Wasmer +Wasmund +Wasmus +Wasmuth +Wasner +Wason +Wasowski +Wasp +Wass +Wassam +Wassel +Wassell +Wassenaar +Wassenberg +Wasser +Wasserman +Wassermann +Wassil +Wassinger +Wassink +Wassman +Wassmann +Wasson +Wassum +Waston +Wasurick +Wasyliszyn +Wasylow +Waszak +Waszkiewicz +Waszmer +Watah +Watahomigie +Watanabe +Watcher +Watchman +Watchorn +Water +Waterbury +Waterer +Waterfall +Waterfield +Waterford +Waterhouse +Waterman +Waters +Waterson +Waterston +Waterworth +Wates +Watford +Wathen +Watkin +Watkins +Watkinson +Watland +Watler +Watley +Watling +Watlington +Watne +Watral +Watring +Watrous +Watrs +Watry +Watsky +Watson +Watt +Watte +Wattenbarger +Wattenberg +Watters +Watterson +Wattigny +Wattles +Wattley +Watton +Watts +Wattson +Watwood +Watzka +Watzke +Wauch +Waud +Wauer +Wauford +Waugaman +Waugh +Waughtal +Waughtel +Wauneka +Wauson +Wauters +Wave +Waver +Waverly +Wavra +Wawers +Wawrzyniak +Wax +Waxler +Waxman +Way +Waybill +Waybright +Waycaster +Waychoff +Waychowsky +Waycott +Wayde +Waye +Wayford +Waygood +Wayland +Wayman +Wayment +Waymer +Waymire +Waymon +Wayne +Wayner +Waynick +Wayns +Ways +Wayson +Wayt +Wayts +Waz +Wdowiak +Weaber +Wead +Weader +Weadon +Weafer +Weagel +Weagle +Weagraff +Weakland +Weaklend +Weakley +Weakly +Weaks +Weal +Wealer +Weant +Wear +Weare +Wearing +Wearly +Wearrien +Wears +Weary +Wease +Weasel +Weast +Weather +Weatherall +Weatherbee +Weatherby +Weatherford +Weatherhead +Weatherholt +Weatherholtz +Weatherill +Weatherington +Weatherley +Weatherly +Weatherman +Weathers +Weathersbee +Weathersby +Weatherspoon +Weatherwax +Weathington +Weaver +Weavers +Weavil +Weaving +Webb +Webber +Webbink +Webbs +Weber +Weberg +Webley +Webre +Webster +Wechselblatt +Wechsler +Wechter +Weck +Weckenborg +Wecker +Weckerly +Weckhorst +Weckman +Weckwerth +Wedd +Weddel +Weddell +Wedderburn +Wedderspoon +Wedding +Weddington +Weddle +Wede +Wedekind +Wedeking +Wedel +Wedell +Wedemeyer +Weder +Wedge +Wedgewood +Wedgeworth +Wedgworth +Wedi +Wedige +Wedin +Wedlock +Wedlow +Wedman +Wedner +Wedo +Wedwick +Wee +Weeber +Weech +Weed +Weeda +Weeden +Weedman +Weedon +Weegar +Weege +Weekes +Weekey +Weekley +Weekly +Weeks +Weelborg +Weeler +Weeman +Weemes +Weemhoff +Weems +Weenum +Weers +Weerts +Weese +Weesner +Weeter +Weeth +Weflen +Wege +Wegener +Weger +Wegge +Weghorst +Wegiel +Weglage +Weglarz +Wegleitner +Wegley +Weglin +Wegman +Wegmann +Wegner +Wegrzyn +Wegweiser +Wehausen +Wehbe +Wehby +Wehe +Wehking +Wehling +Wehmann +Wehmeier +Wehmeyer +Wehn +Wehner +Wehnes +Wehr +Wehrenberg +Wehrheim +Wehring +Wehrle +Wehrley +Wehrli +Wehrly +Wehrman +Wehrmann +Wehrs +Wehrsig +Wehrwein +Wehunt +Wei +Weiand +Weibe +Weibel +Weible +Weich +Weichbrodt +Weichel +Weichman +Weicht +Weick +Weickum +Weida +Weide +Weideman +Weidemann +Weiden +Weidenbach +Weidenheimer +Weider +Weiderhold +Weidert +Weidig +Weidler +Weidman +Weidmann +Weidner +Weidower +Weier +Weig +Weigand +Weigart +Weigel +Weigelt +Weigert +Weight +Weightman +Weigl +Weigle +Weigleb +Weiglein +Weigman +Weigner +Weigold +Weihe +Weiher +Weihl +Weik +Weikal +Weikel +Weiker +Weikert +Weikle +Weil +Weiland +Weilbacher +Weiler +Weill +Weiman +Weimann +Weimar +Weimer +Wein +Weinand +Weinbach +Weinbauer +Weinberg +Weinberger +Weinburg +Weiner +Weinert +Weinfeld +Weinfurter +Weingard +Weingart +Weingarten +Weingartner +Weinger +Weinheimer +Weinhold +Weininger +Weinkauf +Weinland +Weinman +Weinmann +Weinraub +Weinreb +Weinreich +Weinrib +Weinrich +Weins +Weinstein +Weinstock +Weintraub +Weintz +Weinzetl +Weinzierl +Weinzimer +Weinzinger +Weipert +Weir +Weirather +Weirauch +Weirich +Weirick +Weis +Weisbaum +Weisbecker +Weisberg +Weisberger +Weisbrod +Weisdorfer +Weise +Weisel +Weisenberg +Weisenberger +Weisenborn +Weisenburger +Weisend +Weisenfels +Weisenfluh +Weisenhorn +Weisenstein +Weiser +Weisfeld +Weisgarber +Weisgerber +Weishaar +Weishar +Weishaupt +Weisheit +Weisholz +Weisiger +Weisinger +Weiskopf +Weisman +Weismantle +Weismiller +Weisner +Weispfenning +Weiss +Weissberg +Weissbrodt +Weisse +Weissenbach +Weissenborn +Weisser +Weissert +Weissgerber +Weissinger +Weissler +Weissman +Weissmann +Weist +Weisz +Weiszbrod +Weit +Weiter +Weith +Weitkamp +Weitman +Weitnauer +Weitz +Weitze +Weitzel +Weitzman +Weitzner +Wekenborg +Wekenmann +Wela +Welander +Welborn +Welburn +Welby +Welch +Welchel +Welcher +Welchman +Welcome +Weld +Welde +Welden +Welder +Weldin +Welding +Weldon +Weldy +Welfel +Welford +Welk +Welke +Welker +Well +Welland +Wellard +Wellborn +Wellbrock +Welle +Wellen +Wellendorf +Wellenstein +Weller +Welles +Welling +Wellinghoff +Wellings +Wellington +Welliver +Wellman +Wellmann +Wellner +Wellnitz +Wellons +Wells +Wellspeak +Welman +Welms +Welner +Welp +Welsch +Welschmeyer +Welsh +Welshans +Welson +Weltch +Welte +Welter +Welters +Weltha +Welti +Weltmer +Welton +Welty +Weltz +Weltzin +Welz +Welzel +Wemark +Wember +Wemhoff +Wemmer +Wempa +Wempe +Wemple +Wen +Wence +Wenciker +Wenck +Wencl +Wenclawiak +Wend +Wende +Wendel +Wendelberger +Wendelboe +Wendelin +Wendelken +Wendell +Wendeln +Wender +Wenderoth +Wendland +Wendlandt +Wendler +Wendling +Wendolski +Wendorf +Wendorff +Wendroth +Wendt +Wendte +Wendy +Wendzel +Wene +Weneck +Wener +Weng +Wengel +Wenger +Wengerd +Wengert +Wengler +Wengreen +Wengren +Wenig +Weniger +Weninger +Wenk +Wenke +Wenker +Wenman +Wenner +Wennersten +Wenning +Wenninger +Wenrich +Wenrick +Wensel +Wenske +Wenskoski +Wensky +Wensman +Wenstrand +Wenstrom +Went +Wentcell +Wente +Wenthold +Wentland +Wentling +Wentworth +Wentz +Wentzel +Wentzell +Wentzlaff +Wentzloff +Wenz +Wenzel +Wenzell +Wenzinger +Wenzl +Weppler +Werbelow +Werber +Werblow +Werderman +Werdlow +Werger +Wergin +Werk +Werkheiser +Werkhoven +Werking +Werkmeister +Werksman +Werle +Werley +Werline +Werling +Werlinger +Werma +Werme +Wermers +Wermter +Wern +Wernecke +Werner +Wernert +Wernett +Wernex +Wernick +Wernicki +Wernimont +Werning +Wernli +Wernsman +Werntz +Wernz +Wero +Werra +Werre +Werremeyer +Werries +Werring +Werry +Wersal +Wershey +Werst +Werstein +Wert +Wertenberger +Werth +Wertheim +Wertheimer +Werthman +Wertman +Werts +Wertz +Wery +Wesberry +Wesby +Wesch +Wesche +Wescom +Wescott +Wescovich +Wesely +Wesemann +Weser +Weske +Wesler +Wesley +Wesloh +Weslow +Weslowski +Wesly +Wesner +Wesolick +Wesolowski +Wess +Wessel +Wesselhoft +Wesselink +Wessell +Wessells +Wesselman +Wessels +Wessendorf +Wessinger +Wessler +Wessling +Wessman +Wessner +Wesson +West +Westaby +Westad +Westall +Westaway +Westberg +Westberry +Westbrook +Westbrooke +Westbrooks +Westbury +Westby +Westcoat +Westcote +Westcott +Westen +Westenbarger +Westenberger +Westendorf +Westenhaver +Wester +Westerbeck +Westerberg +Westerfeld +Westerfield +Westergaard +Westergard +Westerheide +Westerhof +Westerhoff +Westerhold +Westerholm +Westerling +Westerlund +Westerman +Westermann +Westermark +Westermeier +Western +Westervelt +Westervoorde +Westfahl +Westfall +Westfield +Westgaard +Westgate +Westhoff +Westhouse +Westin +Westlake +Westland +Westler +Westley +Westlie +Westling +Westlund +Westly +Westman +Westmark +Westmeyer +Westmoreland +Westmorland +Weston +Westover +Westpfahl +Westphal +Westphalen +Westra +Westray +Westre +Westrich +Westrick +Westrom +Westrope +Westrum +Westrup +Westry +Westveer +Westwater +Westwood +Wetenkamp +Weter +Wetherald +Wetherbee +Wetherby +Wetherell +Wetherill +Wetherington +Wethern +Wethington +Wethje +Wetklow +Wetmore +Wetsel +Wetselline +Wettach +Wetter +Wetterauer +Wetterer +Wettlaufer +Wettstein +Wetz +Wetzel +Wetzell +Wetzler +Wetzstein +Weuve +Wever +Wewerka +Wexell +Wexler +Wey +Weyand +Weyandt +Weyant +Weydert +Weyer +Weyers +Weygandt +Weyhrauch +Weyker +Weyland +Weyler +Weyman +Weymouth +Weynand +Weyrauch +Weyrick +Whack +Whaite +Whal +Whalan +Whalen +Whaler +Whaley +Whalley +Whaltey +Whan +Whang +Whapham +Wharff +Wharry +Wharton +Whary +Whatcott +Whatley +Whatoname +Wheadon +Wheary +Wheat +Wheatcroft +Wheater +Wheatley +Wheatly +Wheaton +Whedbee +Whedon +Wheeington +Wheelan +Wheeland +Wheeldon +Wheelen +Wheeler +Wheeles +Wheeless +Wheeley +Wheeling +Wheelis +Wheelock +Wheelus +Wheelwright +Wheetley +Whelan +Whelchel +Wheldon +Whelehan +Wheler +Wheless +Whelihan +Wheller +Whelpley +Whelton +Wherley +Wherry +Whetham +Whetsel +Whetsell +Whetstine +Whetstone +Whetten +Whetzel +Whetzell +Whiby +Whichard +Whicker +Whidbee +Whidby +Whidden +Whiddon +Whigham +Whigum +Whilby +Whilden +Whildin +While +Whiles +Whiley +Whillock +Whinery +Whinnery +Whipkey +Whipp +Whippie +Whipple +Whippo +Whipps +Whirley +Whirlow +Whirry +Whisby +Whisenand +Whisenant +Whisenhunt +Whisenton +Whish +Whisker +Whisler +Whisman +Whisnant +Whisner +Whisonant +Whispell +Whisted +Whistle +Whistlehunt +Whistler +Whiston +Whit +Whitacker +Whitacre +Whitaker +Whitbeck +Whitbread +Whitby +Whitcher +Whitchurch +Whitcomb +Whitcome +Whitcraft +White +Whiteaker +Whitebear +Whitebird +Whitebread +Whitecloud +Whitecotton +Whited +Whitefield +Whiteford +Whitegoat +Whitehair +Whitehall +Whitehead +Whitehill +Whitehorn +Whitehorse +Whitehouse +Whitehurst +Whiteis +Whitelaw +Whiteleather +Whiteley +Whitelightnin +Whitelock +Whitelow +Whitely +Whiteman +Whitemarsh +Whitemore +Whiten +Whitenack +Whitener +Whitenton +Whiter +Whiters +Whites +Whitescarver +Whitesel +Whitesell +Whiteside +Whitesides +Whitesinger +Whitewater +Whitey +Whitfield +Whitfill +Whitford +Whitham +Whitheld +Whitherspoon +Whitiker +Whiting +Whitinger +Whitis +Whitker +Whitlach +Whitlatch +Whitledge +Whitler +Whitley +Whitling +Whitlinger +Whitlingum +Whitlock +Whitlow +Whitman +Whitmarsh +Whitmer +Whitmeyer +Whitmire +Whitmore +Whitmoyer +Whitmyre +Whitner +Whitney +Whiton +Whitrock +Whitsel +Whitsell +Whitset +Whitsett +Whitsey +Whitsitt +Whitson +Whitt +Whittaker +Whittall +Whitted +Whitteker +Whittemore +Whitten +Whittenbeck +Whittenberg +Whittenburg +Whittenton +Whitter +Whittet +Whittie +Whittier +Whittiker +Whitting +Whittingham +Whittinghill +Whittington +Whittle +Whittler +Whittlesey +Whittley +Whittman +Whittmore +Whitton +Whittum +Whitty +Whitver +Whitwell +Whitworth +Whobrey +Wholey +Wholly +Whooley +Whooper +Whorley +Whorton +Whtie +Why +Whyard +Whybrew +Whyel +Whyman +Whyms +Whyne +Whysong +Whyte +Wiacek +Wiand +Wiant +Wiater +Wiatr +Wiatrak +Wiatrek +Wiatrowski +Wibbenmeyer +Wibbens +Wibberley +Wiberg +Wibeto +Wible +Wiborg +Wical +Wice +Wicher +Wichern +Wichert +Wichland +Wichman +Wichmann +Wichrowski +Wichterman +Wicinsky +Wick +Wicka +Wickard +Wicke +Wickell +Wickemeyer +Wickenhauser +Wickens +Wicker +Wickers +Wickersham +Wickersheim +Wickert +Wickes +Wickett +Wicketts +Wickey +Wickham +Wickings +Wickizer +Wickkiser +Wickland +Wickliff +Wickliffe +Wicklin +Wickline +Wicklund +Wickman +Wicks +Wickson +Wickstrom +Wickus +Wickware +Wickwire +Wida +Widby +Widder +Widdison +Widdoes +Widdop +Widdows +Widdowson +Wide +Widell +Wideman +Widen +Widener +Wider +Widera +Widerski +Widgeon +Widger +Widhalm +Widick +Widjaja +Widlak +Widmaier +Widman +Widmann +Widmar +Widmark +Widmayer +Widmer +Widner +Widney +Widowski +Widrick +Widrig +Wieand +Wiebe +Wieben +Wieber +Wieberg +Wiebers +Wiebold +Wieboldt +Wiebusch +Wiece +Wiechec +Wiechert +Wiechman +Wiechmann +Wieciech +Wieck +Wieckowski +Wieczorek +Wied +Wiede +Wiedeman +Wiedemann +Wiedenheft +Wieder +Wiederhold +Wiederholt +Wiederin +Wiederstein +Wiederwax +Wiedmaier +Wiedman +Wiedmann +Wiedrich +Wiedyk +Wiegand +Wiegard +Wiegel +Wieger +Wiegert +Wiegman +Wiegmann +Wiehe +Wieland +Wielgasz +Wielgosz +Wielgus +Wieloch +Wielock +Wieman +Wiemann +Wiemer +Wien +Wienandt +Wienberg +Wienecke +Wieneke +Wiener +Wienert +Wienhoff +Wienke +Wiens +Wier +Wierenga +Wierman +Wiers +Wierschem +Wierschen +Wiersema +Wiersma +Wierson +Wiersteiner +Wierzba +Wierzbicki +Wies +Wiese +Wiesehan +Wiesel +Wieseler +Wieseman +Wiesemann +Wiesen +Wieser +Wiesler +Wiesman +Wiesner +Wiesneski +Wiess +Wiest +Wietbrock +Wieting +Wieto +Wietzel +Wiewel +Wiford +Wig +Wigand +Wigboldy +Wigdor +Wigelsworth +Wigen +Wiget +Wigfall +Wigfield +Wigg +Wiggains +Wiggan +Wiggen +Wiggens +Wigger +Wiggers +Wiggett +Wiggin +Wiggington +Wiggins +Wigginton +Wigglesworth +Wiggs +Wigham +Wight +Wightman +Wigington +Wiginton +Wigle +Wiglesworth +Wigley +Wigman +Wignall +Wigner +Wigren +Wigton +Wiinikainen +Wik +Wike +Wikel +Wiker +Wikert +Wikholm +Wikins +Wikle +Wiklund +Wikoff +Wikstrom +Wiktor +Wilabay +Wiland +Wilansky +Wilbanks +Wilber +Wilbers +Wilbert +Wilbon +Wilborn +Wilbourn +Wilbourne +Wilbur +Wilburn +Wilby +Wilch +Wilchek +Wilcher +Wilcinski +Wilcock +Wilcox +Wilcoxen +Wilcoxon +Wilcoxson +Wilcut +Wilcutt +Wilczak +Wilczewski +Wilczynski +Wild +Wilda +Wildauer +Wilday +Wildberger +Wilde +Wildeboer +Wildeisen +Wildeman +Wilden +Wildenberg +Wildenthaler +Wilder +Wilderman +Wildermuth +Wilderson +Wildes +Wildey +Wildfong +Wildhaber +Wildin +Wilding +Wildman +Wildner +Wildoner +Wildrick +Wildridge +Wilds +Wildsmith +Wildt +Wile +Wilebski +Wileczek +Wileman +Wilemon +Wilen +Wilenkin +Wilensky +Wiler +Wiles +Wiley +Wilfahrt +Wilfinger +Wilfong +Wilford +Wilfred +Wilging +Wilgocki +Wilgus +Wilham +Wilhelm +Wilhelmi +Wilhelms +Wilhelmsen +Wilhelmy +Wilhide +Wilhite +Wilhoit +Wilhoite +Wiliams +Wilis +Wilison +Wilk +Wilke +Wilken +Wilkening +Wilkens +Wilkenson +Wilker +Wilkers +Wilkerson +Wilkes +Wilkey +Wilkie +Wilkin +Wilkins +Wilkinson +Wilkison +Wilkoff +Wilkos +Wilkosz +Wilkowitz +Wilks +Wilkson +Wilkus +Will +Willaby +Willadsen +Willaert +Willaims +Willaimson +Willame +Willams +Willamson +Willand +Willard +Willardson +Willars +Willbanks +Willborn +Willcott +Willcox +Willcoxon +Willcutt +Wille +Willeford +Willegal +Willems +Willemsen +Willen +Willenborg +Willenbring +Willenbrink +Willenbrock +Willens +Willer +Willers +Willert +Willes +Willet +Willeto +Willets +Willett +Willette +Willetts +Willey +Willford +Willging +Willhelm +Willhite +Willhoite +Willi +Willia +William +Williama +Williamis +Williamon +Williams +Williamsen +Williamson +Williamston +Willian +Willians +Williar +Williard +Willibrand +Williby +Willick +Willie +Williemae +Willier +Willies +Williford +Willig +Willigar +Willilams +Willimas +Willimon +Willims +Willing +Willinger +Willingham +Willinghurst +Willington +Willinsky +Willis +Willison +Williston +Willits +Willitzer +Williver +Willman +Willmann +Willmarth +Willmert +Willmes +Willmon +Willmore +Willmott +Willms +Willmschen +Willner +Willoby +Willock +Willougby +Willoughby +Willour +Willow +Willrett +Willrich +Wills +Willsey +Willson +Willwerth +Willy +Willyard +Wilm +Wilmarth +Wilmer +Wilmes +Wilmeth +Wilmont +Wilmore +Wilmot +Wilmoth +Wilmott +Wilmouth +Wilner +Wilridge +Wilsen +Wilsey +Wilshire +Wilshusen +Wilson +Wilt +Wiltbank +Wiltberger +Wilterdink +Wiltfong +Wiltgen +Wiltjer +Wilton +Wiltrout +Wilts +Wiltse +Wiltsey +Wiltshire +Wiltsie +Wiltz +Wilund +Wilusz +Wiman +Wimber +Wimberley +Wimberly +Wimbish +Wimble +Wimbley +Wimbrow +Wimbs +Wimbush +Wimer +Wimes +Wimett +Wimmer +Wimpee +Wimpey +Wimpy +Wims +Wimsatt +Win +Winans +Winarski +Winberg +Winberry +Winborn +Winborne +Winburn +Winbush +Wincapaw +Wince +Winch +Winchel +Winchell +Winchenbach +Winchester +Winckler +Wind +Windam +Windauer +Windell +Winder +Winders +Windes +Windfield +Windham +Windholz +Windhorst +Windhurst +Windisch +Windish +Windland +Windle +Windler +Windley +Windly +Windmeyer +Windom +Windon +Windover +Windrow +Windschitl +Windsheimer +Windsor +Windus +Wine +Winebarger +Winebaugh +Wineberg +Winebrenner +Winegar +Winegard +Winegarden +Winegardner +Wineinger +Winek +Wineland +Wineman +Winemiller +Winer +Wines +Winesberry +Winesett +Winesickle +Winett +Winfield +Winford +Winfough +Winfred +Winfree +Winfrey +Wing +Wingard +Wingate +Winge +Wingeier +Wingenter +Winger +Wingerd +Wingerson +Wingert +Wingerter +Winget +Wingett +Wingfield +Wingham +Wingler +Wingo +Wingrove +Wings +Wingstrom +Winham +Winiarski +Winick +Winiecki +Winik +Winikoff +Winingear +Wininger +Wink +Winkel +Winkelbauer +Winkeljohn +Winkelman +Winkelmann +Winkelpleck +Winkels +Winkenwerder +Winker +Winkey +Winkfield +Winkle +Winkleblack +Winkleman +Winklepleck +Winkler +Winkles +Winkley +Winkowski +Winks +Winland +Winley +Winlock +Winn +Winne +Winnegan +Winnen +Winner +Winners +Winnett +Winnewisser +Winney +Winnicki +Winnie +Winnike +Winning +Winninger +Winningham +Winograd +Winokur +Winrich +Winrow +Wins +Winscott +Winsett +Winship +Winski +Winsky +Winslett +Winslette +Winsley +Winslow +Winsman +Winson +Winsor +Winstanley +Winstead +Winsted +Winston +Wint +Winter +Winterberg +Winterbottom +Winterfeld +Winterfeldt +Winterhalter +Winterholler +Winterling +Wintermantel +Wintermute +Winterroth +Winterrowd +Winters +Wintersmith +Wintersteen +Winterstein +Winterton +Winther +Winthrop +Wintjen +Wintle +Winton +Wintringham +Wintz +Winward +Winzelberg +Winzenried +Winzer +Winzler +Wion +Wipf +Wipfli +Wipperfurth +Wippert +Wipprecht +Wirch +Wire +Wirebaugh +Wireman +Wiren +Wires +Wirf +Wirfs +Wirght +Wirick +Wirkkala +Wironen +Wirsing +Wirt +Wirta +Wirtanen +Wirth +Wirtjes +Wirtz +Wirtzfeld +Wisbey +Wisch +Wischman +Wischmann +Wischmeier +Wischmeyer +Wischner +Wiscombe +Wiscount +Wisdom +Wise +Wisecarver +Wisecup +Wisehart +Wiseley +Wisell +Wisely +Wiseman +Wisenbaker +Wisener +Wisenor +Wiser +Wish +Wisham +Wishard +Wishart +Wisher +Wishman +Wishon +Wishum +Wisinger +Wisinski +Wisk +Wiskowski +Wisler +Wisley +Wislocki +Wisman +Wismer +Wisner +Wisneski +Wisnewski +Wisnieski +Wisniewski +Wisniowski +Wisnoski +Wisnosky +Wisnowski +Wison +Wisor +Wisotzkey +Wiss +Wisse +Wisseh +Wissel +Wisseman +Wisser +Wissing +Wissinger +Wissink +Wissler +Wissman +Wissmann +Wist +Wiste +Wisterman +Wiswall +Wiswell +Wisz +Wiszynski +Witaker +Witaszek +Witbeck +Witchard +Witcher +Witchey +Witcraft +Witczak +Witek +Witfield +Witham +Withee +Withem +Withenshaw +Witherbee +Witherell +Witherington +Witherite +Witherow +Withers +Witherspoon +Withey +Withfield +Withiam +Withington +Withrow +Withy +Witkop +Witkowski +Witkowsky +Witkus +Witman +Witmer +Witosky +Witry +Witschi +Witsell +Witt +Wittbrodt +Witte +Wittekind +Wittel +Wittels +Witten +Wittenberg +Wittenborn +Wittenbrink +Wittenburg +Wittenmyer +Witter +Witters +Witterstauter +Witthoeft +Witthoft +Witthuhn +Wittich +Wittie +Wittig +Witting +Wittke +Wittkop +Wittkopp +Wittler +Wittliff +Wittlin +Wittlinger +Wittman +Wittmann +Wittmer +Wittmeyer +Wittnebel +Wittner +Wittrock +Wittrup +Wittry +Witts +Wittstock +Wittstruck +Wittwer +Witty +Witucki +Witvoet +Witwer +Witz +Witzel +Witzke +Wiuff +Wix +Wixom +Wixon +Wixson +Wixted +Wiza +Wizar +Wizwer +Wlach +Wlazlowski +Wloch +Wlodarczyk +Wlodarek +Wlodyka +Wlosinski +Wmith +Wms +Wnek +Wnorowski +Wnuk +Wnukowski +Wobbe +Wobbleton +Wobig +Wobser +Wodarski +Wodicka +Wodskow +Woehl +Woehr +Woehrle +Woelfel +Woelfl +Woelfle +Woelk +Woelke +Woelzlein +Woeppel +Woerner +Woernle +Woessner +Woeste +Woester +Woetzel +Wofford +Wogan +Woge +Wohl +Wohld +Wohlenhaus +Wohler +Wohlers +Wohlert +Wohletz +Wohlfahrt +Wohlfarth +Wohlfeil +Wohlford +Wohlgemuth +Wohlrab +Wohlschlegel +Wohlwend +Wohlwendi +Wohner +Woitowitz +Woiwode +Wojciak +Wojcicki +Wojciechowski +Wojcik +Wojdak +Wojeik +Wojenski +Wojewoda +Wojick +Wojnar +Wojnaroski +Wojner +Wojnicki +Wojnowski +Wojtak +Wojtanik +Wojtanowski +Wojtas +Wojtaszek +Wojtczak +Wojtecki +Wojtkowski +Wojtowich +Wojtowicz +Wokwicz +Wolak +Wolanin +Wolanski +Wolansky +Wolaver +Wolbeck +Wolbert +Wolbrecht +Wolchesky +Wolcott +Wold +Wolden +Woldridge +Woldt +Wolery +Woleslagle +Wolever +Wolf +Wolfard +Wolfe +Wolfenbarger +Wolfenden +Wolfensperger +Wolfer +Wolfert +Wolfertz +Wolff +Wolffe +Wolfgang +Wolfgram +Wolfgramm +Wolfinbarger +Wolfing +Wolfinger +Wolfley +Wolfman +Wolford +Wolfram +Wolfred +Wolfrom +Wolfrum +Wolfsberger +Wolfson +Wolgamot +Wolgast +Wolhok +Wolin +Woline +Wolinski +Woliver +Wolk +Wolke +Wolken +Wolkow +Wolkowiecki +Wolkowski +Woll +Wollam +Wollan +Wollard +Wolle +Wollen +Wollenberg +Wollenburg +Woller +Wollert +Wolley +Wollin +Wollman +Wollmer +Wollmuth +Wollner +Wollschlager +Wollyung +Wolma +Wolman +Wolner +Wolnik +Wolny +Woloszczak +Woloszyn +Wolpe +Wolper +Wolpert +Wolsdorf +Wolsey +Wolske +Wolski +Wolsky +Wolslegel +Wolsted +Wolstenholme +Woltemath +Wolter +Wolters +Wolthuis +Woltjer +Woltman +Woltmann +Woltz +Wolven +Wolverton +Wolvin +Wolz +Wolzen +Womac +Womack +Wombacher +Womble +Wombles +Wombolt +Womeldorf +Womeldorff +Women +Womer +Wommack +Won +Wonder +Wonderling +Wonderly +Wonders +Wondoloski +Wondra +Wong +Wongus +Wonnacott +Wonser +Wonsik +Wontor +Woo +Woock +Wood +Woodal +Woodall +Woodand +Woodard +Woodbeck +Woodberry +Woodbridge +Woodburg +Woodburn +Woodbury +Woodby +Woodcock +Woodcox +Wooddell +Woode +Woodell +Wooden +Woodend +Wooderson +Woodert +Woodfield +Woodfin +Woodfolk +Woodford +Woodfork +Woodgate +Woodham +Woodhams +Woodhead +Woodhouse +Woodhull +Woodie +Woodin +Wooding +Woodington +Woodis +Woodka +Woodke +Woodland +Woodle +Woodlee +Woodley +Woodliff +Woodlin +Woodling +Woodlock +Woodly +Woodman +Woodmancy +Woodmansee +Woodmore +Woodrich +Woodridge +Woodring +Woodrome +Woodroof +Woodrow +Woodruff +Woodrum +Woods +Woodside +Woodsmall +Woodson +Woodward +Woodworth +Woody +Woodyard +Woofter +Wool +Woolard +Woolbright +Woolcock +Woolcott +Wooldridge +Woolem +Woolems +Woolen +Woolery +Woolever +Wooley +Wooleyhan +Woolf +Woolfolk +Woolford +Woolfrey +Woolhiser +Woolhouse +Woollard +Woollen +Woolley +Woolman +Woolridge +Wools +Woolsey +Woolson +Woolstenhulme +Woolston +Woolum +Woolums +Woolverton +Woolwine +Woolworth +Woomer +Woon +Woosley +Wooster +Wootan +Wooten +Wooters +Wooton +Wootten +Wootton +Wooward +Worbington +Worcester +Worchester +Word +Wordell +Worden +Wordlaw +Wordlow +Wordsworth +Worek +Worell +Worf +Worford +Work +Worker +Workinger +Workings +Workman +Workowski +Works +Worland +World +Worlds +Worley +Worlie +Worlow +Worm +Wormack +Worman +Wormely +Wormington +Wormley +Wormuth +Wormwood +Worn +Worner +Worobel +Worosz +Worrall +Worrel +Worrell +Worsell +Worsfold +Worsham +Worsley +Worst +Worstel +Worstell +Worster +Worth +Wortham +Worthan +Worthen +Worthey +Worthing +Worthington +Worthley +Worthy +Wortinger +Wortley +Wortman +Worton +Wortz +Wosher +Wosick +Woskobojnik +Woten +Wotring +Wotton +Woudenberg +Woulard +Woullard +Wouters +Wowk +Woy +Woyahn +Woytek +Woytowich +Woytowicz +Wozney +Wozniak +Woznick +Woznicki +Wozny +Wragg +Wragge +Wraggs +Wraight +Wrape +Wraspir +Wratchford +Wray +Wreath +Wrede +Wreede +Wren +Wrench +Wrenn +Wrenne +Wreyford +Wrich +Wride +Wriedt +Wright +Wrighten +Wrightington +Wrighton +Wrights +Wrightsel +Wrightsman +Wrigley +Wrinkle +Wrinkles +Wrinn +Wrisley +Wriston +Writer +Wrobbel +Wrobel +Wrobleski +Wroblewski +Wrobliski +Wroe +Wrona +Wronski +Wroten +Wrotten +Wrubel +Wruck +Wry +Wryals +Wrye +Wrynn +Wrzesien +Wrzesinski +Wu +Wubbel +Wubben +Wubbena +Wublin +Wubnig +Wucherer +Wuebker +Wuellenweber +Wuensch +Wuensche +Wuerth +Wuertz +Wuerz +Wuest +Wueste +Wuestenberg +Wuitschick +Wujcik +Wulf +Wulff +Wulffraat +Wulfing +Wulkan +Wun +Wunder +Wunderle +Wunderlich +Wunderlin +Wunderly +Wung +Wunner +Wunsch +Wuolle +Wuori +Wurdeman +Wurgler +Wurl +Wurm +Wurst +Wurster +Wurth +Wurts +Wurtz +Wurtzel +Wurz +Wurzbacher +Wurzer +Wussow +Wutzke +Wyand +Wyandt +Wyant +Wyatt +Wybenga +Wyble +Wyborny +Wyche +Wyckoff +Wycoff +Wycuff +Wydeven +Wydler +Wydner +Wydo +Wydra +Wydryck +Wyer +Wyers +Wyett +Wygal +Wygand +Wygant +Wygle +Wyke +Wyker +Wykes +Wykle +Wykoff +Wylam +Wyland +Wylde +Wyler +Wyles +Wylie +Wyllie +Wyly +Wyman +Wymer +Wymore +Wyms +Wynans +Wynder +Wyndham +Wyne +Wyner +Wynes +Wynia +Wynkoop +Wynn +Wynne +Wynott +Wynter +Wyont +Wyre +Wyrich +Wyrick +Wyrosdick +Wyrostek +Wyse +Wysinger +Wysock +Wysocki +Wysong +Wyss +Wytch +Wythe +Wyzard +Wyze +Wzorek +Xaimoungkhoun +Xander +Xang +Xavier +Xayasith +Xayavong +Xia +Xiang +Xiao +Xie +Ximenez +Ximines +Xiong +Xu +Xue +Xyong +Ya +Yablonski +Yablonsky +Yacano +Yacavone +Yaccarino +Yach +Yackel +Yackeren +Yackley +Yacko +Yacono +Yacoub +Yacovone +Yacullo +Yadao +Yaden +Yadon +Yaeger +Yaegle +Yaekel +Yafai +Yafaie +Yafei +Yaffe +Yaftali +Yafuso +Yagecic +Yager +Yaggi +Yagi +Yagin +Yagle +Yago +Yagoda +Yagoudaef +Yagues +Yahl +Yahn +Yahna +Yahne +Yahraus +Yaish +Yaiva +Yake +Yakel +Yaker +Yaklich +Yaklin +Yakow +Yakulis +Yale +Yalon +Yam +Yamada +Yamagata +Yamaguchi +Yamakawa +Yamaki +Yamamoto +Yamanaka +Yamane +Yamanoha +Yamaoka +Yamasaki +Yamashiro +Yamashita +Yamat +Yamauchi +Yamazaki +Yambao +Yambo +Yamin +Yamkosumpa +Yammine +Yamnitz +Yampolsky +Yan +Yanacek +Yanagawa +Yanagi +Yanagida +Yanagihara +Yanai +Yanan +Yance +Yancey +Yanchik +Yancik +Yancy +Yanda +Yandell +Yandle +Yandow +Yandura +Yanek +Yanes +Yanetta +Yaney +Yanez +Yang +Yanik +Yanish +Yanity +Yanke +Yankee +Yankey +Yanko +Yankovich +Yankovitch +Yankovitz +Yankovski +Yann +Yannantuono +Yannayon +Yanni +Yannone +Yannotti +Yannucci +Yannuzzi +Yanoff +Yanofsky +Yanos +Yanosky +Yant +Yantis +Yantz +Yantzer +Yantzi +Yanuaria +Yao +Yap +Yaple +Yapp +Yara +Yarber +Yarberry +Yarboro +Yarborough +Yarbough +Yarbro +Yarbrough +Yard +Yarde +Yardley +Yarger +Yarish +Yark +Yarman +Yarmitsky +Yarn +Yarnall +Yarnell +Yaroch +Yarosh +Yarrell +Yarrington +Yarris +Yarrito +Yarrow +Yarwood +Yarzabal +Yashinski +Yasika +Yasin +Yasinski +Yaskiewicz +Yasso +Yasuda +Yasui +Yasurek +Yasutake +Yasutomi +Yater +Yates +Yatsko +Yattaw +Yau +Yauch +Yauck +Yauger +Yaun +Yavorsky +Yaw +Yawn +Yaws +Yax +Yazdani +Yazzi +Yazzie +Yazzle +Yballe +Ybanez +Ybarbo +Ybarra +Ybarro +Ybos +Ydara +Ye +Yeadon +Yeager +Yeagley +Yeah +Yeakel +Yeakle +Yeakley +Yeaman +Yeamans +Yeaney +Yearby +Yearego +Yeargain +Yeargan +Yeargin +Yearick +Yearicks +Yearling +Yearous +Yearout +Yearsley +Yearta +Yearwood +Yeary +Yeast +Yeasted +Yeater +Yeates +Yeatman +Yeaton +Yeats +Yeatts +Yeboah +Yeck +Yeddo +Yedid +Yedinak +Yee +Yeeloy +Yeend +Yegge +Yeh +Yehl +Yehle +Yeilding +Yeiser +Yeisley +Yekel +Yeldell +Yelder +Yeldon +Yeley +Yelin +Yell +Yelle +Yellen +Yellock +Yellow +Yellowhair +Yelton +Yelverton +Yelvington +Yem +Yemchuk +Yen +Yendell +Yengich +Yenglin +Yengo +Yennard +Yenner +Yenney +Yenor +Yentsch +Yentzer +Yenz +Yeo +Yeoman +Yeomans +Yepes +Yepez +Yepiz +Yepsen +Yerbic +Yerbich +Yerby +Yerdon +Yerena +Yerger +Yergin +Yerhot +Yerian +Yerico +Yerigan +Yerka +Yerke +Yerkes +Yerkey +Yerkovich +Yerly +Yero +Yeropoli +Yerry +Yerton +Yerty +Yeske +Yeskey +Yessios +Yestramski +Yetman +Yetsko +Yett +Yetter +Yetto +Yetzer +Yeubanks +Yeung +Yewell +Yezek +Yglesias +Yi +Yidiaris +Yielding +Yilma +Yim +Yin +Ying +Yingling +Yingst +Yip +Yiu +Ylonen +Yngsdal +Yniguez +Ynocencio +Yo +Yoakum +Yoast +Yobst +Yocham +Yochem +Yochim +Yochum +Yocius +Yock +Yockers +Yockey +Yocom +Yocum +Yoder +Yoders +Yodis +Yoeckel +Yoes +Yoest +Yoh +Yohannes +Yohe +Yohn +Yoho +Yoke +Yokel +Yokely +Yokiel +Yokley +Yokota +Yokoyama +Yokum +Yomes +Yon +Yonamine +Yonan +Yonashiro +Yonce +Yoneda +Yonek +Yonemori +Yonemura +Yoneoka +Yoney +Yoneyama +Yong +Yonge +Yongue +Yonke +Yonker +Yonkers +Yonkoske +Yono +Yonts +Yontz +Yoo +Yoon +Yopp +Yoquelet +Yorck +Yordy +Yore +Yorgey +Yori +Yorio +York +Yorke +Yorker +Yorkey +Yorkman +Yorks +Yorn +Yorton +Yorty +Yoseph +Yoshi +Yoshida +Yoshihara +Yoshikawa +Yoshimori +Yoshimoto +Yoshimura +Yoshina +Yoshino +Yoshioka +Yoshiyama +Yoshizawa +Yoshizumi +Yosko +Yoss +Yost +Yosten +Yother +Yott +Yotter +You +Youd +Youell +Youkanaa +Youker +Youkers +Youket +Youkhana +Youla +Youmans +Youmon +Youn +Younan +Younce +Younes +Young +Youngberg +Youngblood +Youngblut +Youngdahl +Younge +Younger +Youngerman +Youngers +Younghans +Youngkin +Younglas +Younglove +Youngman +Youngquist +Youngren +Youngs +Youngstrom +Younie +Younis +Younker +Younkers +Younkin +Younkins +Youns +Yount +Younts +Youree +Yournet +Yourshaw +Youse +Yousef +Yousif +Yousko +Youssef +Youssefi +Youst +Youtsey +Yovan +Yovanovich +Yovino +Yow +Yowell +Yoxall +Yozamp +Yozzo +Ypina +Yragui +Yray +Yrigollen +Ysaguirre +Ysbrand +Yslas +Yslava +Ysquierdo +Ytuarte +Yu +Yuan +Yuasa +Yucha +Yudell +Yue +Yueh +Yuen +Yuenger +Yuengling +Yuhas +Yuhasz +Yuill +Yuk +Yuki +Yule +Yum +Yumas +Yun +Yunan +Yundt +Yunes +Yung +Yungbluth +Yungclas +Yunk +Yunker +Yunt +Yupe +Yurchak +Yurchiak +Yurek +Yurich +Yuricic +Yurick +Yurkanin +Yurko +Yurkovich +Yurman +Yuro +Yurovic +Yuscak +Yusef +Yusi +Yuska +Yusko +Yust +Yuste +Yusuf +Yutzy +Yuzn +Yvon +Yzaguirre +Yzaquirre +Yzquierdo +Zabala +Zabaneh +Zabarkes +Zabawa +Zabbo +Zabek +Zabel +Zabenko +Zabielski +Zabik +Zabinski +Zabka +Zable +Zablocki +Zablonski +Zabloudil +Zaborac +Zaborowski +Zaborski +Zabriskie +Zabrocki +Zacarias +Zacate +Zaccagnini +Zaccagnino +Zaccaria +Zaccaro +Zacchini +Zacek +Zach +Zachar +Zacharewicz +Zacharia +Zachariades +Zachariah +Zacharias +Zachary +Zacher +Zacherl +Zachery +Zachman +Zachmann +Zachry +Zachter +Zack +Zackery +Zaczek +Zadd +Zade +Zadeh +Zader +Zadina +Zador +Zadora +Zadorozny +Zadow +Zadra +Zadroga +Zadrozny +Zaeske +Zafar +Zaffalon +Zaffina +Zaffino +Zaffuto +Zagacki +Zagami +Zagar +Zagara +Zagel +Zagen +Zager +Zagorac +Zagorski +Zagroba +Zagrodnik +Zagulski +Zahar +Zaharchuk +Zaharek +Zaharis +Zahl +Zahler +Zahm +Zahn +Zahnen +Zahner +Zahniser +Zahnke +Zahnow +Zahorchak +Zahourek +Zahra +Zahradka +Zahradnik +Zahran +Zahri +Zaibel +Zaic +Zaidel +Zaidi +Zaino +Zais +Zaiser +Zaiss +Zaitlin +Zaituna +Zajac +Zajc +Zajdel +Zajicek +Zak +Zakar +Zakarian +Zaker +Zakes +Zaki +Zakowski +Zakrajsek +Zakrzewski +Zakutney +Zalamea +Zalar +Zalazar +Zaldana +Zaldivar +Zale +Zalenski +Zaleski +Zalesky +Zalewski +Zalk +Zall +Zaller +Zaloudek +Zaltz +Zalusky +Zalwsky +Zam +Zamacona +Zaman +Zamarripa +Zamarron +Zambarano +Zambelli +Zambito +Zambo +Zamborano +Zamborsky +Zambotti +Zambrana +Zambrano +Zammetti +Zammiello +Zamor +Zamora +Zamorano +Zamoro +Zamostny +Zampaglione +Zamparini +Zampedri +Zampella +Zamperini +Zampieri +Zamudio +Zamzam +Zamzow +Zan +Zana +Zanardi +Zanayed +Zancanella +Zanchez +Zanchi +Zanco +Zand +Zander +Zanderigo +Zanders +Zane +Zanella +Zaner +Zanes +Zaneski +Zanetti +Zanfardino +Zang +Zangara +Zangari +Zange +Zangger +Zanghi +Zangl +Zani +Zaniboni +Zanin +Zanini +Zanis +Zank +Zanni +Zannini +Zannino +Zanola +Zanotti +Zant +Zanter +Zantow +Zanueta +Zapalac +Zapanta +Zapata +Zapatas +Zapatero +Zapato +Zapel +Zapf +Zapico +Zapien +Zapoticky +Zapp +Zappa +Zappala +Zappavigna +Zappia +Zappile +Zappolo +Zappone +Zappulla +Zar +Zaragosa +Zaragoza +Zarate +Zarazua +Zarco +Zarcone +Zarebski +Zarek +Zarella +Zaremba +Zaremski +Zaren +Zaretsky +Zari +Zarilla +Zarillo +Zarin +Zaring +Zaritsky +Zarkin +Zarlenga +Zarlengo +Zarling +Zarlingo +Zarn +Zarnick +Zaro +Zarozinski +Zarr +Zarrabi +Zarraluqui +Zarrella +Zarriello +Zarrillo +Zarrineh +Zarro +Zart +Zartman +Zaruba +Zarucki +Zarycki +Zarzuela +Zarzycki +Zaspel +Zasso +Zastawny +Zastrow +Zatarain +Zatko +Zatorski +Zauala +Zaucha +Zaugg +Zaunbrecher +Zauner +Zausch +Zavacky +Zavadoski +Zavala +Zavaleta +Zavalza +Zavasky +Zavatson +Zavattieri +Zavcedo +Zaverl +Zavesky +Zavitz +Zavodny +Zawacki +Zawadzki +Zawasky +Zawislak +Zawistowski +Zaxas +Zaya +Zayac +Zayas +Zayicek +Zaza +Zazozdor +Zazueta +Zazula +Zbell +Zbierski +Zbikowski +Zbinden +Zboral +Zbranek +Zdanowicz +Zdenek +Zdon +Zdrojkowski +Zea +Zeagler +Zeals +Zeanah +Zearfoss +Zeavala +Zebel +Zebell +Zebley +Zebracki +Zebrowski +Zecca +Zeccardi +Zecchini +Zech +Zecher +Zeches +Zechiel +Zechman +Zeck +Zeckzer +Zedaker +Zedian +Zediker +Zee +Zeeb +Zeegers +Zeek +Zeeman +Zeff +Zega +Zegar +Zegarelli +Zegarra +Zeger +Zeh +Zehe +Zehender +Zeherquist +Zehnder +Zehner +Zehnpfennig +Zehr +Zehrbach +Zehrer +Zehring +Zeidan +Zeiders +Zeidler +Zeidman +Zeier +Zeiger +Zeigler +Zeiler +Zeilinger +Zeilman +Zeimantz +Zeimet +Zeimetz +Zeiner +Zeinert +Zeis +Zeise +Zeiser +Zeisler +Zeiss +Zeitler +Zeitlin +Zeitz +Zekria +Zelada +Zelasco +Zelasko +Zelaya +Zelazo +Zeldin +Zele +Zelechowski +Zeledon +Zelek +Zelenka +Zelenko +Zelenski +Zeleny +Zeleznik +Zeliff +Zelinka +Zelinski +Zelinsky +Zelkin +Zelkind +Zelko +Zell +Zella +Zellars +Zelle +Zellefrow +Zeller +Zellers +Zellinger +Zellman +Zellmann +Zellmer +Zellner +Zellous +Zelman +Zelmar +Zelnick +Zelonis +Zeltmann +Zeltner +Zema +Zemaitis +Zeman +Zematis +Zembower +Zeme +Zemel +Zeminski +Zemjanis +Zemke +Zemlicka +Zemon +Zempel +Zena +Zenbaver +Zendejas +Zender +Zener +Zeng +Zenger +Zeni +Zenisek +Zenk +Zenke +Zenker +Zenner +Zeno +Zenon +Zenor +Zens +Zent +Zenteno +Zentgraf +Zentner +Zents +Zentz +Zenz +Zenzen +Zeoli +Zeolla +Zepeda +Zepf +Zephier +Zephyr +Zepka +Zepp +Zera +Zeran +Zerangue +Zerba +Zerbe +Zerbel +Zerby +Zercher +Zerck +Zerger +Zerhusen +Zeringue +Zerkle +Zerko +Zermeno +Zerom +Zerphey +Zerr +Zerring +Zertuche +Zervas +Zervos +Zerzan +Zesati +Zeschke +Zetes +Zetina +Zetino +Zeto +Zets +Zettel +Zettlemoyer +Zettler +Zetzer +Zeuner +Zevallos +Zevenbergen +Zeyadeh +Zeyer +Zezima +Zgoda +Zhanel +Zhang +Zhao +Zhen +Zheng +Zhong +Zhou +Zhu +Zhuang +Zia +Ziad +Ziada +Ziadie +Ziak +Zibell +Zibelli +Zibert +Zic +Zicafoose +Zicari +Ziccardi +Zich +Zicherman +Zick +Zickefoose +Zicker +Zickler +Zickuhr +Zide +Zidek +Zidzik +Zieba +Ziebart +Ziebarth +Ziebell +Zieber +Ziebert +Ziebol +Ziebold +Ziech +Ziedan +Zieg +Ziegel +Ziegelbauer +Ziegenbein +Ziegenfuss +Ziegenhagen +Zieger +Zieglen +Ziegler +Ziego +Ziehm +Ziek +Ziel +Zieler +Zielesch +Zielinski +Zielke +Zielonka +Zielonko +Zieman +Ziemann +Ziemba +Ziemer +Ziemke +Ziems +Ziemski +Zien +Ziencina +Zientara +Zientek +Zier +Zierden +Zierdt +Zierenberg +Zierer +Zierk +Zierke +Ziernicki +Zieschang +Ziesemer +Zieser +Zieske +Ziesman +Ziesmer +Zietlow +Zietz +Ziff +Zigich +Ziglar +Zigler +Zigmond +Zigomalas +Zihal +Zike +Ziko +Zilahi +Ziler +Zilk +Zilka +Zill +Zilla +Ziller +Zilliox +Zillman +Zillmer +Zills +Zilnicki +Zima +Ziman +Zimba +Zimbelman +Zimerman +Zimick +Ziminski +Zimit +Zimlich +Zimm +Zimmel +Zimmer +Zimmerebner +Zimmerer +Zimmerle +Zimmerli +Zimmerly +Zimmerman +Zimmermann +Zin +Zinck +Zincke +Zinda +Zindel +Zindell +Zingale +Zingarelli +Zingaro +Zinger +Zingg +Zingler +Zingone +Ziniewicz +Zink +Zinke +Zinkievich +Zinkl +Zinn +Zinner +Zinni +Zinno +Zins +Zinser +Zinsli +Zinsmeister +Zinter +Zinz +Zinzow +Ziobro +Ziola +Ziolkowski +Zion +Zipay +Zipf +Zipfel +Zipkin +Zipp +Zippe +Zipperer +Zipse +Ziraldo +Zirbel +Zircher +Zirin +Zirk +Zirker +Zirkind +Zirkle +Zirkles +Zisk +Ziska +Zisser +Zissler +Zita +Ziter +Zito +Zittel +Zitzelberger +Zitzloff +Zitzmann +Zitzow +Ziv +Ziyad +Zizza +Zizzo +Zlaten +Zlatkin +Zlotnick +Zlotnik +Zmek +Zmich +Zmiejko +Zmijewski +Zmolek +Zmuda +Znidarsic +Zobel +Zobell +Zoch +Zocklein +Zoda +Zodrow +Zody +Zoebisch +Zoelle +Zoeller +Zoellick +Zoellner +Zogby +Zogg +Zoglmann +Zogopoulos +Zohn +Zola +Zoldak +Zoldesy +Zolezzi +Zolinas +Zolinski +Zoll +Zolla +Zollar +Zollars +Zoller +Zollicoffer +Zollinger +Zollman +Zollner +Zollo +Zolman +Zolnoske +Zolocsik +Zolondek +Zoltek +Zolty +Zomberg +Zombo +Zombory +Zombro +Zomer +Zomora +Zomorodi +Zona +Zondlo +Zone +Zonia +Zonker +Zook +Zoquier +Zorc +Zordan +Zorens +Zorich +Zorilla +Zorko +Zorman +Zorn +Zornes +Zorns +Zoroiwchak +Zorra +Zorrilla +Zortman +Zorzi +Zosel +Zoss +Zotos +Zotti +Zottola +Zou +Zoucha +Zoulek +Zoumis +Zourkos +Zoutte +Zozaya +Zrake +Zrimsek +Zsadanyi +Zschoche +Zsohar +Zuanich +Zuazo +Zubek +Zuber +Zuberbuhler +Zubia +Zubiate +Zubik +Zubizarreta +Zubke +Zubris +Zubrowski +Zubrzycki +Zucca +Zuccarelli +Zuccaro +Zucchetto +Zucco +Zucconi +Zuch +Zuchara +Zuchelkowski +Zuchowski +Zuck +Zucker +Zuckerberg +Zuckerman +Zuckerwar +Zuclich +Zuehl +Zuehlke +Zuehls +Zuehlsdorff +Zuelke +Zuercher +Zuerlein +Zufall +Zufelt +Zugg +Zuhlke +Zuidema +Zuk +Zukas +Zukerman +Zukof +Zukor +Zukoski +Zukowski +Zukowsky +Zulauf +Zuleger +Zulfer +Zulkowski +Zullig +Zullinger +Zullo +Zuluaga +Zumalt +Zumaya +Zumba +Zumbach +Zumbo +Zumbrennen +Zumbrunnen +Zummo +Zumot +Zumpano +Zumpfe +Zumsteg +Zumstein +Zumwalt +Zundel +Zunich +Zuniega +Zuniga +Zunino +Zunker +Zuno +Zupan +Zupancic +Zupfer +Zupp +Zuppa +Zurasky +Zurawik +Zurawski +Zurcher +Zurek +Zurheide +Zurich +Zurin +Zurita +Zurkuhlen +Zurkus +Zurmiller +Zurn +Zuro +Zurovec +Zurowski +Zusman +Zutell +Zutter +Zuver +Zuvich +Zuwkowski +Zuziak +Zvorsky +Zwack +Zwagerman +Zwahlen +Zwanzig +Zwart +Zweier +Zweifel +Zweig +Zwerschke +Zwick +Zwicker +Zwickl +Zwiebel +Zwiefel +Zwiefelhofer +Zwiener +Zwigart +Zwilling +Zwinger +Zwingman +Zwolak +Zwolensky +Zwolinski +Zwolski +Zybia +Zych +Zygmont +Zyla +Zylka +Zylstra +Zymowski +Zynda +Zysett +Zysk +Zyskowski +Zywiec \ No newline at end of file diff --git a/bin/dbatools-buildref-index.json b/bin/dbatools-buildref-index.json index 8092617573..72cb5c0065 100644 --- a/bin/dbatools-buildref-index.json +++ b/bin/dbatools-buildref-index.json @@ -1,3981 +1,4016 @@ { - "LastUpdated": "2018-11-14T00:00:00", + "LastUpdated": "2019-02-20T00:00:00", "Data": [ - { - "Version": "8.0.47", - "Name": "2000" - }, - { - "Version": "8.0.78" - }, - { - "Version": "8.0.100" - }, - { - "Version": "8.0.190" - }, - { - "SP": "RTM", - "Version": "8.0.194", - "SupportedUntil": "2000-11-30T00:00:00" - }, - { - "Version": "8.0.204", - "KBList": "274329" - }, - { - "Version": "8.0.205", - "KBList": "274330" - }, - { - "Version": "8.0.210", - "KBList": "275900" - }, - { - "Version": "8.0.211", - "KBList": "276329" - }, - { - "Version": "8.0.217", - "KBList": "279293" - }, - { - "Version": "8.0.218", - "KBList": "279183" - }, - { - "Version": "8.0.222", - "KBList": "281769" - }, - { - "Version": "8.0.223", - "KBList": "280380" - }, - { - "Version": "8.0.225", - "KBList": "281663" - }, - { - "Version": "8.0.226", - "KBList": "278239" - }, - { - "Version": "8.0.231", - "KBList": "282279" - }, - { - "Version": "8.0.233", - "KBList": "282416" - }, - { - "Version": "8.0.239", - "KBList": "285290" - }, - { - "Version": "8.0.249", - "KBList": "288122" - }, - { - "Version": "8.0.250", - "KBList": "291683" - }, - { - "Version": "8.0.251", - "KBList": "300194" - }, - { - "Version": "8.0.287", - "KBList": "297209" - }, - { - "Version": "8.0.296", - "KBList": "299717" - }, - { - "SP": "SP1", - "Version": "8.0.384", - "SupportedUntil": "2002-02-28T00:00:00", - "KBList": "306908" - }, - { - "Version": "8.0.428", - "KBList": "304850" - }, - { - "Version": "8.0.443", - "KBList": "307538" - }, - { - "Version": "8.0.444", - "KBList": [ - "307655", - "30754" - ] - }, - { - "Version": "8.0.452", - "KBList": "308547" - }, - { - "Version": "8.0.469", - "KBList": "313005" - }, - { - "Version": "8.0.471", - "KBList": "313302" - }, - { - "Version": "8.0.473", - "KBList": "314003" - }, - { - "Version": "8.0.474", - "KBList": "315395" - }, - { - "Version": "8.0.475" - }, - { - "SP": "SP2", - "Version": "8.0.532", - "SupportedUntil": "2003-04-07T00:00:00", - "KBList": "306908" - }, - { - "Version": "8.0.534", - "KBList": "306908" - }, - { - "Version": "8.0.552", - "KBList": [ - "313002", - "313005" - ] - }, - { - "Version": "8.0.558", - "KBList": [ - "314003", - "315395" - ] - }, - { - "Version": "8.0.561" - }, - { - "Version": "8.0.568", - "KBList": "317748" - }, - { - "Version": "8.0.578", - "KBList": [ - "318405", - "317979" - ] - }, - { - "Version": "8.0.584", - "KBList": "318530" - }, - { - "Version": "8.0.594", - "KBList": [ - "356774", - "319477" - ] - }, - { - "Version": "8.0.599", - "KBList": "319869" - }, - { - "Version": "8.0.604" - }, - { - "Version": "8.0.608", - "KBList": "319507" - }, - { - "Version": "8.0.644", - "KBList": "324186" - }, - { - "Version": "8.0.650", - "KBList": "322853" - }, - { - "Version": "8.0.652", - "KBList": "810010" - }, - { - "Version": "8.0.655" - }, - { - "Version": "8.0.661", - "KBList": "326999" - }, - { - "Version": "8.0.665" - }, - { - "Version": "8.0.667" - }, - { - "Version": "8.0.678", - "KBList": "328354" - }, - { - "Version": "8.0.679", - "KBList": "316333" - }, - { - "Version": "8.0.682", - "KBList": "319851" - }, - { - "Version": "8.0.686", - "KBList": "316333" - }, - { - "Version": "8.0.688", - "KBList": "329487" - }, - { - "Version": "8.0.689", - "KBList": "329499" - }, - { - "Version": "8.0.690", - "KBList": "311104" - }, - { - "Version": "8.0.693", - "KBList": "330212" - }, - { - "Version": "8.0.695", - "KBList": [ - "331965", - "331855" - ] - }, - { - "Version": "8.0.696", - "KBList": [ - "810052", - "810072" - ] - }, - { - "Version": "8.0.700", - "KBList": "810072" - }, - { - "Version": "8.0.701", - "KBList": [ - "810163", - "810026" - ] - }, - { - "Version": "8.0.702", - "KBList": "328551" - }, - { - "Version": "8.0.703", - "KBList": "810526" - }, - { - "Version": "8.0.705", - "KBList": "810920" - }, - { - "Version": "8.0.710", - "KBList": "811052" - }, - { - "Version": "8.0.713", - "KBList": "811205" - }, - { - "Version": "8.0.714", - "KBList": "811478" - }, - { - "Version": "8.0.715", - "KBList": [ - "810688", - "811611" - ] - }, - { - "Version": "8.0.718", - "KBList": "811703" - }, - { - "Version": "8.0.721", - "KBList": [ - "812393", - "81225" - ] - }, - { - "Version": "8.0.723", - "KBList": "812798" - }, - { - "Version": "8.0.725", - "KBList": [ - "813494", - "812995" - ] - }, - { - "Version": "8.0.728", - "KBList": "814460" - }, - { - "Version": "8.0.730", - "KBList": "813769" - }, - { - "Version": "8.0.733", - "KBList": "813759" - }, - { - "Version": "8.0.735", - "KBList": "814889" - }, - { - "Version": "8.0.736", - "KBList": "816937" - }, - { - "Version": "8.0.741", - "KBList": "818096" - }, - { - "Version": "8.0.743", - "KBList": [ - "818406", - "818763" - ] - }, - { - "SP": "SP3", - "Version": "8.0.760", - "SupportedUntil": "2007-07-10T00:00:00", - "KBList": "306908" - }, - { - "Version": "8.0.762", - "KBList": "814032" - }, - { - "Version": "8.0.763", - "KBList": "814113" - }, - { - "Version": "8.0.765", - "KBList": [ - "811611", - "810688", - "810163", - "813769" - ] - }, - { - "Version": "8.0.769", - "KBList": [ - "814892", - "814889" - ] - }, - { - "Version": "8.0.775", - "KBList": "815115" - }, - { - "Version": "8.0.779", - "KBList": "814035" - }, - { - "Version": "8.0.780", - "KBList": [ - "816084", - "816039", - "801185" - ] - }, - { - "Version": "8.0.781", - "KBList": "815057" - }, - { - "Version": "8.0.788", - "KBList": "816985" - }, - { - "Version": "8.0.789", - "KBList": "816840" - }, - { - "Version": "8.0.790", - "KBList": "817081" - }, - { - "Version": "8.0.791", - "KBList": "815249" - }, - { - "Version": "8.0.794", - "KBList": [ - "817709", - "816440", - "813524", - "817464" - ] - }, - { - "Version": "8.0.798", - "KBList": "817464" - }, - { - "Version": "8.0.800", - "KBList": [ - "818188", - "818097" - ] - }, - { - "Version": "8.0.801", - "KBList": "181540" - }, - { - "Version": "8.0.804", - "KBList": "818729" - }, - { - "Version": "8.0.807", - "KBList": "818899" - }, - { - "Version": "8.0.811", - "KBList": [ - "891662", - "819248", - "818897" - ] - }, - { - "Version": "8.0.814", - "KBList": "819662" - }, - { - "Version": "8.0.816", - "KBList": "818766" - }, - { - "Version": "8.0.818", - "KBList": [ - "821280", - "826161", - "821277" - ] - }, - { - "Version": "8.0.819", - "KBList": "826161" - }, - { - "Version": "8.0.837", - "KBList": [ - "823514", - "821740", - "821548", - "821741", - "820788" - ] - }, - { - "Version": "8.0.839", - "KBList": [ - "824027", - "823877" - ] - }, - { - "Version": "8.0.840", - "KBList": "319477" - }, - { - "Version": "8.0.841", - "KBList": "825225" - }, - { - "Version": "8.0.842", - "KBList": "825043" - }, - { - "Version": "8.0.844", - "KBList": "826080" - }, - { - "Version": "8.0.845", - "KBList": [ - "825854", - "826364" - ] - }, - { - "Version": "8.0.847", - "KBList": "826433" - }, - { - "Version": "8.0.848", - "KBList": "826822" - }, - { - "Version": "8.0.850", - "KBList": [ - "826906", - "826815", - "826860" - ] - }, - { - "Version": "8.0.851", - "KBList": "826754" - }, - { - "Version": "8.0.852", - "KBList": [ - "827954", - "830466" - ] - }, - { - "Version": "8.0.854", - "KBList": "828699" - }, - { - "Version": "8.0.856", - "KBList": "828096" - }, - { - "Version": "8.0.857", - "KBList": [ - "828308", - "827714", - "828017" - ] - }, - { - "Version": "8.0.858", - "KBList": "828637" - }, - { - "Version": "8.0.859", - "KBList": "821334" - }, - { - "Version": "8.0.863", - "KBList": [ - "829444", - "829205" - ] - }, - { - "Version": "8.0.865", - "KBList": [ - "828945", - "830395" - ] - }, - { - "Version": "8.0.866", - "KBList": "830366" - }, - { - "Version": "8.0.869", - "KBList": "830588" - }, - { - "Version": "8.0.870", - "KBList": "830262" - }, - { - "Version": "8.0.871", - "KBList": [ - "830860", - "830767" - ] - }, - { - "Version": "8.0.873", - "KBList": "830887" - }, - { - "Version": "8.0.876", - "KBList": [ - "831997", - "830912" - ] - }, - { - "Version": "8.0.878", - "KBList": "831950" - }, - { - "Version": "8.0.879", - "KBList": "832977" - }, - { - "Version": "8.0.891", - "KBList": "836141" - }, - { - "Version": "8.0.892", - "KBList": "833710" - }, - { - "Version": "8.0.904", - "KBList": "834453" - }, - { - "Version": "8.0.908", - "KBList": "834290" - }, - { - "Version": "8.0.910", - "KBList": "834798" - }, - { - "Version": "8.0.911", - "KBList": "837957" - }, - { - "Version": "8.0.913", - "KBList": "836651" - }, - { - "Version": "8.0.915", - "KBList": "837401" - }, - { - "Version": "8.0.916", - "KBList": "317989" - }, - { - "Version": "8.0.919", - "KBList": "837957" - }, - { - "Version": "8.0.922", - "KBList": "837970" - }, - { - "Version": "8.0.923", - "KBList": "838460" - }, - { - "Version": "8.0.926", - "KBList": "839523" - }, - { - "Version": "8.0.927", - "KBList": "839688" - }, - { - "Version": "8.0.928", - "KBList": "839589" - }, - { - "Version": "8.0.929", - "KBList": "839529" - }, - { - "Version": "8.0.933", - "KBList": "840856" - }, - { - "Version": "8.0.934", - "KBList": "841404" - }, - { - "Version": "8.0.935", - "KBList": "841404" - }, - { - "Version": "8.0.936", - "KBList": "841627" - }, - { - "Version": "8.0.937", - "KBList": "841776" - }, - { - "Version": "8.0.944", - "KBList": "839280" - }, - { - "Version": "8.0.948", - "KBList": "843263" - }, - { - "Version": "8.0.949", - "KBList": "843266" - }, - { - "Version": "8.0.952", - "KBList": [ - "867880", - "867879", - "867878" - ] - }, - { - "Version": "8.0.954", - "KBList": "843282" - }, - { - "Version": "8.0.955", - "KBList": "867798" - }, - { - "Version": "8.0.957", - "KBList": "870994" - }, - { - "Version": "8.0.959", - "KBList": "878500" - }, - { - "Version": "8.0.961", - "KBList": "873446" - }, - { - "Version": "8.0.962", - "KBList": "883415" - }, - { - "Version": "8.0.967", - "KBList": "878501" - }, - { - "Version": "8.0.970", - "KBList": "872842" - }, - { - "Version": "8.0.972", - "KBList": "885290" - }, - { - "Version": "8.0.973", - "KBList": "884554" - }, - { - "Version": "8.0.977", - "KBList": "888007" - }, - { - "Version": "8.0.980", - "KBList": "887974" - }, - { - "Version": "8.0.985", - "KBList": "889239" - }, - { - "Version": "8.0.988", - "KBList": "889166" - }, - { - "Version": "8.0.990", - "KBList": "890200" - }, - { - "Version": "8.0.991", - "KBList": "889314" - }, - { - "Version": "8.0.993", - "KBList": [ - "890742", - "888444", - "890925" - ] - }, - { - "Version": "8.0.994", - "KBList": [ - "890767", - "890768", - "890942" - ] - }, - { - "Version": "8.0.996", - "KBList": [ - "891268", - "891017" - ] - }, - { - "Version": "8.0.997", - "KBList": "891311" - }, - { - "Version": "8.0.1000", - "KBList": "891585" - }, - { - "Version": "8.0.1001", - "KBList": "892205" - }, - { - "Version": "8.0.1003", - "KBList": "892923" - }, - { - "Version": "8.0.1007", - "KBList": "893312" - }, - { - "Version": "8.0.1009", - "KBList": "894257" - }, - { - "Version": "8.0.1013", - "KBList": "891866" - }, - { - "Version": "8.0.1014", - "KBList": [ - "895187", - "895123" - ] - }, - { - "Version": "8.0.1017", - "KBList": "896425" - }, - { - "Version": "8.0.1019", - "KBList": "897572" - }, - { - "Version": "8.0.1020", - "KBList": "896985" - }, - { - "Version": "8.0.1021", - "KBList": "887700" - }, - { - "Version": "8.0.1024", - "KBList": "898709" - }, - { - "Version": "8.0.1025", - "KBList": [ - "899430", - "899428" - ] - }, - { - "Version": "8.0.1027", - "KBList": "900416" - }, - { - "Version": "8.0.1029", - "KBList": "902852" - }, - { - "Version": "8.0.1034", - "KBList": "915328" - }, - { - "Version": "8.0.1035", - "KBList": "917593" - }, - { - "Version": "8.0.1036", - "KBList": "929410" - }, - { - "Version": "8.0.1037", - "KBList": "930484" - }, - { - "Version": "8.0.1077", - "KBList": "983814" - }, - { - "Version": "8.0.1547", - "KBList": "899410" - }, - { - "Version": "8.0.2026" - }, - { - "SP": [ - "SP4", - "LATEST" - ], - "Version": "8.0.2039", - "SupportedUntil": "2013-04-09T00:00:00", - "KBList": "306908" - }, - { - "Version": "8.0.2040", - "KBList": "899761" - }, - { - "Version": "8.0.2050", - "KBList": [ - "941203", - "94811" - ] - }, - { - "Version": "8.0.2055", - "KBList": "959240" - }, - { - "Version": "8.0.2145", - "KBList": [ - "826906", - "836651" - ] - }, - { - "Version": "8.0.2147", - "KBList": "899410" - }, - { - "Version": "8.0.2148", - "KBList": [ - "899430", - "899431", - "900390", - "900404", - "901212", - "902150", - "902955" - ] - }, - { - "Version": "8.0.2151", - "KBList": [ - "903742", - "904244" - ] - }, - { - "Version": "8.0.2156" - }, - { - "Version": "8.0.2159", - "KBList": "907250" - }, - { - "Version": "8.0.2162", - "KBList": "904660" - }, - { - "Version": "8.0.2166", - "KBList": "909734" - }, - { - "Version": "8.0.2168", - "KBList": "907813" - }, - { - "Version": "8.0.2171", - "KBList": "909369" - }, - { - "Version": "8.0.2172", - "KBList": "910707" - }, - { - "Version": "8.0.2175", - "KBList": "911678" - }, - { - "Version": "8.0.2180", - "KBList": [ - "913684", - "913789" - ] - }, - { - "Version": "8.0.2187", - "KBList": [ - "916287", - "914384", - "898709", - "915065", - "915340" - ] - }, - { - "Version": "8.0.2189", - "KBList": [ - "916652", - "913438" - ] - }, - { - "Version": "8.0.2191", - "KBList": [ - "826906", - "836651" - ] - }, - { - "Version": "8.0.2192", - "KBList": "917606" - }, - { - "Version": "8.0.2194", - "KBList": [ - "917972", - "917565" - ] - }, - { - "Version": "8.0.2196", - "KBList": "919165" - }, - { - "Version": "8.0.2197", - "KBList": [ - "919133", - "919068", - "919399" - ] - }, - { - "Version": "8.0.2199", - "KBList": "919221" - }, - { - "Version": "8.0.2201", - "KBList": "920930" - }, - { - "Version": "8.0.2207", - "KBList": "923344" - }, - { - "Version": "8.0.2209", - "KBList": "923797" - }, - { - "Version": "8.0.2215", - "KBList": [ - "924662", - "923563", - "923796" - ] - }, - { - "Version": "8.0.2217", - "KBList": "924664" - }, - { - "Version": "8.0.2218", - "KBList": "925297" - }, - { - "Version": "8.0.2223", - "KBList": [ - "925678", - "925419" - ] - }, - { - "Version": "8.0.2226", - "KBList": [ - "925684", - "925732" - ] - }, - { - "Version": "8.0.2229", - "KBList": "927186" - }, - { - "Version": "8.0.2231", - "KBList": "928079" - }, - { - "Version": "8.0.2232", - "KBList": "928568" - }, - { - "Version": "8.0.2234", - "KBList": [ - "929440", - "929131" - ] - }, - { - "Version": "8.0.2236", - "KBList": "930484" - }, - { - "Version": "8.0.2238", - "KBList": "931932" - }, - { - "Version": "8.0.2242", - "KBList": "929131" - }, - { - "Version": "8.0.2244", - "KBList": "934203" - }, - { - "Version": "8.0.2245", - "KBList": "933573" - }, - { - "Version": "8.0.2246", - "KBList": "935465" - }, - { - "Version": "8.0.2248", - "KBList": "935950" - }, - { - "Version": "8.0.2249", - "KBList": "936232" - }, - { - "Version": "8.0.2253", - "KBList": "939317" - }, - { - "Version": "8.0.2265", - "KBList": "944985" - }, - { - "Version": "8.0.2271", - "KBList": "946584" - }, - { - "Version": "8.0.2273", - "KBList": [ - "941203", - "948111" - ] - }, - { - "Version": "8.0.2279", - "KBList": "959678" - }, - { - "Version": "8.0.2282", - "KBList": "960083" - }, - { - "Version": "8.0.2283", - "KBList": "971524" - }, - { - "Version": "8.0.2301", - "KBList": "983809" - }, - { - "Version": "8.0.2305", - "KBList": "983811" - }, - { - "Version": "9.0.0", - "Name": "2005" - }, - { - "SP": "RTM", - "Version": "9.0.1399", - "SupportedUntil": "2007-07-10T00:00:00" - }, - { - "Version": "9.0.1406", - "KBList": "932557" - }, - { - "Version": "9.0.1500", - "KBList": "910416" - }, - { - "Version": "9.0.1502", - "KBList": "915793" - }, - { - "Version": "9.0.1503", - "KBList": "911662" - }, - { - "Version": "9.0.1514", - "KBList": "912471" - }, - { - "Version": "9.0.1518", - "KBList": [ - "913371", - "912472", - "913941" - ] - }, - { - "Version": "9.0.1519", - "KBList": "913494" - }, - { - "Version": "9.0.1528", - "KBList": [ - "915122", - "915306", - "915307", - "915308", - "915309" - ] - }, - { - "Version": "9.0.1531", - "KBList": "915918" - }, - { - "Version": "9.0.1532", - "KBList": "916046" - }, - { - "Version": "9.0.1533", - "KBList": "916086" - }, - { - "Version": "9.0.1534", - "KBList": "916706" - }, - { - "Version": "9.0.1536", - "KBList": "917016" - }, - { - "Version": "9.0.1538", - "KBList": "917824" - }, - { - "Version": "9.0.1539", - "KBList": "917738" - }, - { - "Version": "9.0.1541", - "KBList": [ - "917971", - "917888" - ] - }, - { - "Version": "9.0.1545", - "KBList": "917905" - }, - { - "Version": "9.0.1547", - "KBList": "918276" - }, - { - "Version": "9.0.1550", - "KBList": [ - "921106", - "917887" - ] - }, - { - "Version": "9.0.1551", - "KBList": [ - "922804", - "922527" - ] - }, - { - "Version": "9.0.1554", - "KBList": "926292" - }, - { - "Version": "9.0.1558", - "KBList": "926493" - }, - { - "Version": "9.0.1561", - "KBList": "932556" - }, - { - "Version": "9.0.2029" - }, - { - "Version": "9.0.2040" - }, - { - "SP": "SP1", - "Version": "9.0.2047", - "SupportedUntil": "2008-04-08T00:00:00", - "KBList": "913090" - }, - { - "Version": "9.0.2050", - "KBList": "932555" - }, - { - "Version": "9.0.2153", - "KBList": [ - "919224", - "918222" - ] - }, - { - "Version": "9.0.2156", - "KBList": "919611" - }, - { - "Version": "9.0.2164", - "KBList": [ - "919775", - "919636", - "918882", - "920206", - "921003", - "919929", - "920347", - "920346", - "919243" - ] - }, - { - "Version": "9.0.2167", - "KBList": "920974" - }, - { - "Version": "9.0.2174", - "KBList": "922063" - }, - { - "Version": "9.0.2175", - "KBList": [ - "921536", - "922438", - "922578", - "917905", - "921395" - ] - }, - { - "Version": "9.0.2176", - "KBList": [ - "923296", - "922594" - ] - }, - { - "Version": "9.0.2181", - "KBList": [ - "923634", - "923605" - ] - }, - { - "Version": "9.0.2187", - "KBList": "923849" - }, - { - "Version": "9.0.2189", - "KBList": "925153" - }, - { - "Version": "9.0.2190", - "KBList": "925227" - }, - { - "Version": "9.0.2191", - "KBList": "925135" - }, - { - "Version": "9.0.2192", - "KBList": [ - "925335", - "924954" - ] - }, - { - "Version": "9.0.2194", - "KBList": "925744" - }, - { - "Version": "9.0.2195", - "KBList": "926240" - }, - { - "Version": "9.0.2196", - "KBList": [ - "926335", - "926285" - ] - }, - { - "Version": "9.0.2198", - "KBList": [ - "925277", - "924808", - "926611", - "926773", - "926612", - "924624", - "924807", - "926106", - "926613" - ] - }, - { - "Version": "9.0.2201", - "KBList": "927289" - }, - { - "Version": "9.0.2202", - "KBList": "927643" - }, - { - "Version": "9.0.2206", - "KBList": [ - "928529", - "926493", - "928537", - "928083" - ] - }, - { - "Version": "9.0.2207", - "KBList": [ - "928789", - "928732", - "928394" - ] - }, - { - "Version": "9.0.2208", - "KBList": "929179" - }, - { - "Version": "9.0.2209", - "KBList": "929278" - }, - { - "Version": "9.0.2211", - "KBList": [ - "930283", - "930284" - ] - }, - { - "Version": "9.0.2214", - "KBList": [ - "929240", - "930505" - ] - }, - { - "Version": "9.0.2216", - "KBList": "931821" - }, - { - "Version": "9.0.2218", - "KBList": "931843" - }, - { - "Version": "9.0.2219", - "KBList": "932115" - }, - { - "Version": "9.0.2221", - "KBList": "931593" - }, - { - "Version": "9.0.2223", - "KBList": "932393" - }, - { - "Version": "9.0.2226", - "KBList": [ - "933762", - "934065" - ] - }, - { - "Version": "9.0.2227", - "KBList": "933265" - }, - { - "Version": "9.0.2229", - "KBList": "935446" - }, - { - "Version": "9.0.2230", - "KBList": "936179" - }, - { - "Version": "9.0.2231", - "KBList": "934812" - }, - { - "Version": "9.0.2232", - "KBList": "937277" - }, - { - "Version": "9.0.2233", - "KBList": [ - "937544", - "933499", - "937545" - ] - }, - { - "Version": "9.0.2234", - "KBList": "937343" - }, - { - "Version": "9.0.2236", - "KBList": [ - "940286", - "940287" - ] - }, - { - "Version": "9.0.2237", - "KBList": "940719" - }, - { - "Version": "9.0.2239", - "KBList": "940961" - }, - { - "Version": "9.0.2242", - "KBList": [ - "943888", - "943389" - ] - }, - { - "Version": "9.0.2243", - "KBList": "944968" - }, - { - "Version": "9.0.2245", - "KBList": "933573" - }, - { - "Version": "9.0.2249", - "KBList": "948344" - }, - { - "Version": "9.0.3026", - "KBList": "929376" - }, - { - "Version": "9.0.3027" - }, - { - "Version": "9.0.3033" - }, - { - "SP": "SP2", - "Version": "9.0.3042", - "SupportedUntil": "2010-01-12T00:00:00", - "KBList": "921896" - }, - { - "Version": "9.0.3043", - "KBList": "933508" - }, - { - "Version": "9.0.3050", - "KBList": "933508" - }, - { - "Version": "9.0.3054", - "KBList": "934458" - }, - { - "Version": "9.0.3068", - "KBList": "948109" - }, - { - "Version": "9.0.3073", - "KBList": "954606" - }, - { - "Version": "9.0.3077", - "KBList": "959420" - }, - { - "Version": "9.0.3080", - "KBList": "970895" - }, - { - "Version": "9.0.3152" - }, - { - "Version": "9.0.3153", - "KBList": "937137" - }, - { - "Version": "9.0.3154", - "KBList": "937137" - }, - { - "Version": "9.0.3155", - "KBList": "937137" - }, - { - "Version": "9.0.3156" - }, - { - "Version": "9.0.3159" - }, - { - "Version": "9.0.3161", - "CU": "CU1" - }, - { - "Version": "9.0.3162", - "KBList": "937137" - }, - { - "Version": "9.0.3166", - "KBList": "937137" - }, - { - "Version": "9.0.3169", - "KBList": "937137" - }, - { - "Version": "9.0.3171", - "KBList": "937745" - }, - { - "Version": "9.0.3175", - "CU": "CU2" - }, - { - "Version": "9.0.3177", - "KBList": "937137" - }, - { - "Version": "9.0.3178", - "KBList": "937137" - }, - { - "Version": "9.0.3179", - "KBList": "937137" - }, - { - "Version": "9.0.3180", - "KBList": "939942" - }, - { - "Version": "9.0.3182", - "KBList": "937137" - }, - { - "Version": "9.0.3186", - "CU": "CU3" - }, - { - "Version": "9.0.3194", - "KBList": "937137" - }, - { - "Version": "9.0.3195" - }, - { - "Version": "9.0.3200", - "CU": "CU4" - }, - { - "Version": "9.0.3203", - "KBList": "937137" - }, - { - "Version": "9.0.3205", - "KBList": "937137" - }, - { - "Version": "9.0.3206" - }, - { - "Version": "9.0.3208" - }, - { - "Version": "9.0.3209" - }, - { - "Version": "9.0.3215", - "CU": "CU5" - }, - { - "Version": "9.0.3221", - "KBList": [ - "942908", - "945442", - "945443", - "945916" - ] - }, - { - "Version": "9.0.3222", - "KBList": [ - "945640", - "945641", - "947196", - "947197" - ] - }, - { - "Version": "9.0.3224", - "KBList": "947463" - }, - { - "Version": "9.0.3228", - "CU": "CU6" - }, - { - "Version": "9.0.3230", - "KBList": "949199" - }, - { - "Version": "9.0.3231", - "KBList": [ - "949595", - "949687" - ] - }, - { - "Version": "9.0.3232", - "KBList": "949959" - }, - { - "Version": "9.0.3233", - "KBList": "948108" - }, - { - "Version": "9.0.3235", - "KBList": "950189" - }, - { - "Version": "9.0.3239", - "CU": "CU7" - }, - { - "Version": "9.0.3240", - "KBList": "951204" - }, - { - "Version": "9.0.3242", - "KBList": "951190" - }, - { - "Version": "9.0.3244", - "KBList": "952330" - }, - { - "Version": "9.0.3246", - "KBList": "952233" - }, - { - "CU": "CU8", - "Version": "9.0.3257", - "KBList": "951217" - }, - { - "Version": "9.0.3259", - "KBList": [ - "954669", - "954831" - ] - }, - { - "Version": "9.0.3260", - "KBList": "954950" - }, - { - "Version": "9.0.3282", - "CU": "CU9" - }, - { - "Version": "9.0.3294", - "CU": "CU10" - }, - { - "CU": "CU11", - "Version": "9.0.3301", - "KBList": "958735" - }, - { - "Version": "9.0.3302", - "KBList": [ - "961479", - "961648" - ] - }, - { - "Version": "9.0.3303", - "KBList": "962290" - }, - { - "Version": "9.0.3310", - "KBList": "960090" - }, - { - "CU": "CU12", - "Version": "9.0.3315", - "KBList": "962970" - }, - { - "Version": "9.0.3318", - "KBList": "967199" - }, - { - "Version": "9.0.3320", - "KBList": "969142" - }, - { - "CU": "CU13", - "Version": "9.0.3325", - "KBList": "967908" - }, - { - "Version": "9.0.3327", - "CU": "CU14" - }, - { - "CU": "CU15", - "Version": "9.0.3328", - "KBList": "970278" - }, - { - "Version": "9.0.3353", - "KBList": "970896" - }, - { - "CU": "CU16", - "Version": "9.0.3355", - "KBList": "974647" - }, - { - "CU": "CU17", - "Version": "9.0.3356", - "KBList": "976952" - }, - { - "Version": "9.0.4028" - }, - { - "SP": "SP3", - "Version": "9.0.4035", - "SupportedUntil": "2012-01-10T00:00:00" - }, - { - "Version": "9.0.4053", - "KBList": "970892" - }, - { - "Version": "9.0.4060", - "KBList": "2494113" - }, - { - "Version": "9.0.4207", - "CU": "CU1" - }, - { - "Version": "9.0.4211", - "CU": "CU2" - }, - { - "Version": "9.0.4216", - "KBList": "967101" - }, - { - "CU": "CU3", - "Version": "9.0.4220", - "KBList": "967909" - }, - { - "Version": "9.0.4224", - "KBList": "917606" - }, - { - "Version": "9.0.4226", - "CU": "CU4" - }, - { - "CU": "CU5", - "Version": "9.0.4230", - "KBList": "972511" - }, - { - "Version": "9.0.4262", - "KBList": "970894" - }, - { - "CU": "CU6", - "Version": "9.0.4266", - "KBList": "974648" - }, - { - "Version": "9.0.4268", - "KBList": "977151" - }, - { - "CU": "CU7", - "Version": "9.0.4273", - "KBList": "976951" - }, - { - "CU": "CU8", - "Version": "9.0.4285", - "KBList": "978915" - }, - { - "CU": "CU9", - "Version": "9.0.4294", - "KBList": "980176" - }, - { - "CU": "CU10", - "Version": "9.0.4305", - "KBList": "983329" - }, - { - "CU": "CU11", - "Version": "9.0.4309", - "KBList": "2258854" - }, - { - "CU": "CU12", - "Version": "9.0.4311", - "KBList": "2345449" - }, - { - "CU": "CU13", - "Version": "9.0.4315", - "KBList": "2438344" - }, - { - "CU": "CU14", - "Version": "9.0.4317", - "KBList": "2489375" - }, - { - "CU": "CU15", - "Version": "9.0.4325", - "KBList": "2507766" - }, - { - "Version": "9.0.4340", - "KBList": "2494112" - }, - { - "Version": "9.0.4912" - }, - { - "SP": [ - "SP4", - "LATEST" - ], - "Version": "9.0.5000", - "SupportedUntil": "2016-04-12T00:00:00", - "KBList": "2463332" - }, - { - "Version": "9.0.5057", - "KBList": "2494120" - }, - { - "Version": "9.0.5069", - "KBList": "2716429" - }, - { - "CU": "CU1", - "Version": "9.0.5254", - "KBList": "2464079" - }, - { - "CU": "CU2", - "Version": "9.0.5259", - "KBList": "2489409" - }, - { - "CU": "CU3", - "Version": "9.0.5266", - "KBList": "2507769" - }, - { - "Version": "9.0.5292", - "KBList": "2494123" - }, - { - "Version": "9.0.5294", - "KBList": "2572407" - }, - { - "Version": "9.0.5295", - "KBList": "2598903" - }, - { - "Version": "9.0.5296", - "KBList": "2615425" - }, - { - "Version": "9.0.5324", - "KBList": "2716427" - }, - { - "Version": "10.0.0", - "Name": "2008" - }, - { - "Version": "10.0.1019" - }, - { - "Version": "10.0.1049" - }, - { - "Version": "10.0.1075" - }, - { - "Version": "10.0.1300" - }, - { - "Version": "10.0.1442" - }, - { - "SP": "RTM", - "Version": "10.0.1600", - "SupportedUntil": "2010-04-13T00:00:00" - }, - { - "Version": "10.0.1750", - "KBList": "956718" - }, - { - "Version": "10.0.1755", - "KBList": "957387" - }, - { - "CU": "CU1", - "Version": "10.0.1763", - "KBList": "956717" - }, - { - "Version": "10.0.1767", - "KBList": "958208" - }, - { - "Version": "10.0.1771", - "KBList": "958611" - }, - { - "CU": "CU2", - "Version": "10.0.1779", - "KBList": "958186" - }, - { - "CU": "CU3", - "Version": "10.0.1787", - "KBList": "960484" - }, - { - "CU": "CU4", - "Version": "10.0.1798", - "KBList": "963036" - }, - { - "CU": "CU5", - "Version": "10.0.1806", - "KBList": "969531" - }, - { - "CU": "CU6", - "Version": "10.0.1812", - "KBList": "971490" - }, - { - "CU": "CU7", - "Version": "10.0.1818", - "KBList": "973601" - }, - { - "CU": "CU8", - "Version": "10.0.1823", - "KBList": "975976" - }, - { - "CU": "CU9", - "Version": "10.0.1828", - "KBList": "977444" - }, - { - "CU": "CU10", - "Version": "10.0.1835", - "KBList": "979064" - }, - { - "Version": "10.0.2520", - "KBList": "968369" - }, - { - "SP": "SP1", - "Version": "10.0.2531", - "SupportedUntil": "2011-10-11T00:00:00", - "KBList": "968369" - }, - { - "Version": "10.0.2573", - "KBList": "2494096" - }, - { - "CU": "CU1", - "Version": "10.0.2710", - "KBList": "969099" - }, - { - "Version": "10.0.2712", - "KBList": "970507" - }, - { - "CU": "CU2", - "Version": "10.0.2714", - "KBList": "970315" - }, - { - "CU": "CU3", - "Version": "10.0.2723", - "KBList": "971491" - }, - { - "CU": "CU4", - "Version": "10.0.2734", - "KBList": "973602" - }, - { - "Version": "10.0.2740", - "KBList": "976761" - }, - { - "CU": "CU5", - "Version": "10.0.2746", - "KBList": "975977" - }, - { - "CU": "CU6", - "Version": "10.0.2757", - "KBList": "977443" - }, - { - "CU": "CU7", - "Version": "10.0.2766", - "KBList": "979065" - }, - { - "CU": "CU8", - "Version": "10.0.2775", - "KBList": "981702" - }, - { - "Version": "10.0.2787", - "KBList": "2231277" - }, - { - "CU": "CU9", - "Version": "10.0.2789", - "KBList": "2083921" - }, - { - "CU": "CU10", - "Version": "10.0.2799", - "KBList": "2279604" - }, - { - "CU": "CU11", - "Version": "10.0.2804", - "KBList": "2413738" - }, - { - "CU": "CU12", - "Version": "10.0.2808", - "KBList": "2467236" - }, - { - "CU": "CU13", - "Version": "10.0.2816", - "KBList": "2497673" - }, - { - "CU": "CU14", - "Version": "10.0.2821", - "KBList": "2527187" - }, - { - "Version": "10.0.2841" - }, - { - "CU": "CU15", - "Version": "10.0.2847", - "KBList": "2555406" - }, - { - "CU": "CU16", - "Version": "10.0.2850", - "KBList": "2582282" - }, - { - "Version": "10.0.3798", - "KBList": "979450" - }, - { - "SP": "SP2", - "Version": "10.0.4000", - "SupportedUntil": "2012-10-09T00:00:00", - "KBList": "979450" - }, - { - "Version": "10.0.4064", - "KBList": "2494088" - }, - { - "Version": "10.0.4067", - "KBList": "2716434" - }, - { - "CU": "CU1", - "Version": "10.0.4266", - "KBList": "2289254" - }, - { - "CU": "CU2", - "Version": "10.0.4272", - "KBList": "2467239" - }, - { - "CU": "CU3", - "Version": "10.0.4279", - "KBList": "2498535" - }, - { - "CU": "CU4", - "Version": "10.0.4285", - "KBList": "2527180" - }, - { - "CU": "CU5", - "Version": "10.0.4316", - "KBList": "2555408" - }, - { - "CU": "CU6", - "Version": "10.0.4321", - "KBList": "2582285" - }, - { - "CU": "CU7", - "Version": "10.0.4323", - "KBList": "2617148" - }, - { - "CU": "CU8", - "Version": "10.0.4326", - "KBList": "2648096" - }, - { - "CU": "CU9", - "Version": "10.0.4330", - "KBList": "2402659" - }, - { - "CU": "CU10", - "Version": "10.0.4332", - "KBList": "2696625" - }, - { - "CU": "CU11", - "Version": "10.0.4333", - "KBList": "2715951" - }, - { - "Version": "10.0.4371", - "KBList": "2716433" - }, - { - "Version": "10.0.5416", - "KBList": "2546945" - }, - { - "SP": "SP3", - "Version": "10.0.5500", - "SupportedUntil": "2015-10-13T00:00:00", - "KBList": "2546951" - }, - { - "Version": "10.0.5512", - "KBList": "2716436" - }, - { - "Version": "10.0.5520", - "KBList": "2977321" - }, - { - "Version": "10.0.5538", - "KBList": "3045305" - }, - { - "Version": "10.0.5544", - "KBList": "3135244" - }, - { - "CU": "CU1", - "Version": "10.0.5766", - "KBList": "2617146" - }, - { - "CU": "CU2", - "Version": "10.0.5768", - "KBList": "2633143" - }, - { - "CU": "CU3", - "Version": "10.0.5770", - "KBList": "2648098" - }, - { - "CU": "CU4", - "Version": "10.0.5775", - "KBList": "2673383" - }, - { - "CU": "CU5", - "Version": "10.0.5785", - "KBList": "2696626" - }, - { - "CU": "CU6", - "Version": "10.0.5788", - "KBList": "271953" - }, - { - "CU": "CU7", - "Version": "10.0.5794", - "KBList": "2738350" - }, - { - "Version": "10.0.5826", - "KBList": "2716435" - }, - { - "CU": "CU8", - "Version": "10.0.5828", - "KBList": "2771833" - }, - { - "CU": "CU9", - "Version": "10.0.5829", - "KBList": "2799883" - }, - { - "Version": "10.0.5835", - "KBList": "2814783" - }, - { - "CU": "CU10", - "Version": "10.0.5840", - "KBList": "2834048" - }, - { - "CU": "CU11", - "Version": "10.0.5841", - "KBList": "2834048" - }, - { - "CU": "CU12", - "Version": "10.0.5844", - "KBList": "2863205" - }, - { - "CU": "CU13", - "Version": "10.0.5846", - "KBList": "2880350" - }, - { - "CU": "CU14", - "Version": "10.0.5848", - "KBList": "2893410" - }, - { - "CU": "CU15", - "Version": "10.0.5850", - "KBList": "2923520" - }, - { - "CU": "CU16", - "Version": "10.0.5852", - "KBList": "2936421" - }, - { - "CU": "CU17", - "Version": "10.0.5861", - "KBList": "2958696" - }, - { - "Version": "10.0.5867", - "KBList": "2877204" - }, - { - "Version": "10.0.5869", - "KBList": "2977322" - }, - { - "Version": "10.0.5890", - "KBList": "3045303" - }, - { - "Version": "10.0.5894", - "KBList": "3135244" - }, - { - "SP": [ - "SP4", - "LATEST" - ], - "Version": "10.0.6000", - "SupportedUntil": "2019-07-09T00:00:00", - "KBList": "2979596" - }, - { - "Version": "10.0.6241", - "KBList": "3045311" - }, - { - "Version": "10.0.6526", - "KBList": "3034373" - }, - { - "Version": "10.0.6535", - "KBList": "3045308" - }, - { - "Version": "10.0.6543", - "KBList": "3135244" - }, - { - "Version": "10.0.6547", - "KBList": "3146034" - }, - { - "Version": "10.0.6556", - "KBList": "4057114" - }, - { - "Version": "10.50.1092", - "Name": "2008R2" - }, - { - "Version": "10.50.1352" - }, - { - "SP": "RTM", - "Version": "10.50.1600", - "SupportedUntil": "2012-07-10T00:00:00" - }, - { - "Version": "10.50.1617", - "KBList": "2494088" - }, - { - "CU": "CU1", - "Version": "10.50.1702", - "KBList": "981355" - }, - { - "CU": "CU2", - "Version": "10.50.1720", - "KBList": "2072493" - }, - { - "CU": "CU3", - "Version": "10.50.1734", - "KBList": "2261464" - }, - { - "CU": "CU4", - "Version": "10.50.1746", - "KBList": "2345451" - }, - { - "CU": "CU5", - "Version": "10.50.1753", - "KBList": "2438347" - }, - { - "CU": "CU6", - "Version": "10.50.1765", - "KBList": "2489376" - }, - { - "Version": "10.50.1769", - "KBList": "2520808" - }, - { - "CU": "CU7", - "Version": "10.50.1777", - "KBList": "2507770" - }, - { - "Version": "10.50.1790", - "KBList": "2494086" - }, - { - "CU": "CU8", - "Version": "10.50.1797", - "KBList": "2534352" - }, - { - "Version": "10.50.1804", - "KBList": "2567713" - }, - { - "CU": "CU9", - "Version": "10.50.1807", - "KBList": "2591746" - }, - { - "CU": "CU10", - "Version": "10.50.1809", - "KBList": "2633145" - }, - { - "CU": "CU11", - "Version": "10.50.1810", - "KBList": "2659692" - }, - { - "CU": "CU12", - "Version": "10.50.1815", - "KBList": "2679366" - }, - { - "CU": "CU13", - "Version": "10.50.1817", - "KBList": "2703280" - }, - { - "CU": "CU14", - "Version": "10.50.2425", - "KBList": "2463333" - }, - { - "SP": "SP1", - "Version": "10.50.2500", - "SupportedUntil": "2013-10-08T00:00:00", - "KBList": "2528583" - }, - { - "Version": "10.50.2550", - "KBList": "27116440" - }, - { - "CU": "CU1", - "Version": "10.50.2769", - "KBList": "2544793" - }, - { - "CU": "CU2", - "Version": "10.50.2772", - "KBList": "2567714" - }, - { - "Version": "10.50.2776" - }, - { - "CU": "CU3", - "Version": "10.50.2789", - "KBList": "2591748" - }, - { - "CU": "CU4", - "Version": "10.50.2796", - "KBList": "2633146" - }, - { - "Version": "10.50.2799" - }, - { - "CU": "CU5", - "Version": "10.50.2806", - "KBList": "2659694" - }, - { - "Version": "10.50.2807" - }, - { - "CU": "CU6", - "Version": "10.50.2811", - "KBList": "2679367" - }, - { - "CU": "CU7", - "Version": "10.50.2817", - "KBList": "2703282" - }, - { - "CU": "CU8", - "Version": "10.50.2822", - "KBList": "2723743" - }, - { - "Version": "10.50.2861", - "KBList": "2716439" - }, - { - "CU": "CU9", - "Version": "10.50.2866", - "KBList": "2756574" - }, - { - "CU": "CU10", - "Version": "10.50.2868", - "KBList": "2783135" - }, - { - "CU": "CU11", - "Version": "10.50.2869", - "KBList": "2812683" - }, - { - "CU": "CU12", - "Version": "10.50.2874", - "KBList": "2828727" - }, - { - "CU": "CU13", - "Version": "10.50.2876", - "KBList": "2855792" - }, - { - "Version": "10.50.2881", - "KBList": "2868244" - }, - { - "Version": "10.50.3720", - "KBList": "2630455" - }, - { - "SP": "SP2", - "Version": "10.50.4000", - "SupportedUntil": "2015-10-13T00:00:00", - "KBList": "2630458" - }, - { - "Version": "10.50.4033", - "KBList": "2977320" - }, - { - "Version": "10.50.4042", - "KBList": "3045313" - }, - { - "CU": "CU1", - "Version": "10.50.4260", - "KBList": "2720425" - }, - { - "CU": "CU2", - "Version": "10.50.4263", - "KBList": "2740411" - }, - { - "CU": "CU3", - "Version": "10.50.4266", - "KBList": "2754552" - }, - { - "CU": "CU4", - "Version": "10.50.4270", - "KBList": "2777358" - }, - { - "CU": "CU5", - "Version": "10.50.4276", - "KBList": "2797460" - }, - { - "Version": "10.50.4279", - "KBList": "2830140" - }, - { - "CU": "CU6", - "Version": "10.50.4285", - "KBList": "2830140" - }, - { - "CU": "CU7", - "Version": "10.50.4286", - "KBList": "2844090" - }, - { - "CU": "CU8", - "Version": "10.50.4290", - "KBList": "2871401" - }, - { - "CU": "CU9", - "Version": "10.50.4295", - "KBList": "2887606" - }, - { - "CU": "CU10", - "Version": "10.50.4297", - "KBList": "2908087" - }, - { - "CU": "CU11", - "Version": "10.50.4302", - "KBList": "2926028" - }, - { - "CU": "CU12", - "Version": "10.50.4305", - "KBList": "2938478" - }, - { - "CU": "CU13", - "Version": "10.50.4319", - "KBList": "2967540" - }, - { - "Version": "10.50.4339", - "KBList": "3045312" - }, - { - "Version": "10.50.4343", - "KBList": "3135244" - }, - { - "SP": [ - "SP3", - "LATEST" - ], - "Version": "10.50.6000", - "SupportedUntil": "2019-07-09T00:00:00", - "KBList": "2979597" - }, - { - "Version": "10.50.6220", - "KBList": "3045316" - }, - { - "Version": "10.50.6525", - "KBList": "3033860" - }, - { - "Version": "10.50.6529", - "KBList": "3045314" - }, - { - "Version": "10.50.6537", - "KBList": "3135244" - }, - { - "Version": "10.50.6542", - "KBList": "3146034" - }, - { - "Version": "10.50.6560", - "KBList": "4057113" - }, - { - "Version": "11.0.1103", - "Name": "2012" - }, - { - "Version": "11.0.1440" - }, - { - "Version": "11.0.1750" - }, - { - "Version": "11.0.1913" - }, - { - "SP": "RTM", - "Version": "11.0.2100", - "SupportedUntil": "2014-01-14T00:00:00" - }, - { - "Version": "11.0.2214", - "KBList": "2685308" - }, - { - "Version": "11.0.2218", - "KBList": "2716442" - }, - { - "CU": "CU1", - "Version": "11.0.2316", - "KBList": "2679368" - }, - { - "CU": "CU2", - "Version": "11.0.2325", - "KBList": "2703275" - }, - { - "CU": "CU3", - "Version": "11.0.2332", - "KBList": "2723749" - }, - { - "Version": "11.0.2376", - "KBList": "2716441" - }, - { - "CU": "CU4", - "Version": "11.0.2383", - "KBList": "2758687" - }, - { - "CU": "CU5", - "Version": "11.0.2395", - "KBList": "2777772" - }, - { - "CU": "CU6", - "Version": "11.0.2401", - "KBList": "2728897" - }, - { - "CU": "CU7", - "Version": "11.0.2405", - "KBList": "2823247" - }, - { - "CU": "CU8", - "Version": "11.0.2410", - "KBList": "2844205" - }, - { - "CU": "CU9", - "Version": "11.0.2419", - "KBList": "2867319" - }, - { - "CU": "CU10", - "Version": "11.0.2420", - "KBList": "2891666" - }, - { - "CU": "CU11", - "Version": "11.0.2424", - "KBList": "2908007" - }, - { - "Version": "11.0.2809" - }, - { - "Version": "11.0.2845" - }, - { - "SP": "SP1", - "Version": "11.0.3000", - "SupportedUntil": "2015-07-14T00:00:00", - "KBList": "2674319" - }, - { - "Version": "11.0.3128", - "KBList": "2793634" - }, - { - "Version": "11.0.3153", - "KBList": "2977326" - }, - { - "Version": "11.0.3156", - "KBList": "3045318" - }, - { - "CU": "CU1", - "Version": "11.0.3321", - "KBList": "2765331" - }, - { - "Version": "11.0.3335", - "KBList": "2800050" - }, - { - "CU": "CU2", - "Version": "11.0.3339", - "KBList": "2790947" - }, - { - "CU": "CU3", - "Version": "11.0.3349", - "KBList": "2812412" - }, - { - "Version": "11.0.3350", - "KBList": "2832017" - }, - { - "CU": "CU4", - "Version": "11.0.3368", - "KBList": "2833645" - }, - { - "CU": "CU5", - "Version": "11.0.3373", - "KBList": "2861107" - }, - { - "CU": "CU6", - "Version": "11.0.3381", - "KBList": "2874879" - }, - { - "CU": "CU7", - "Version": "11.0.3393", - "KBList": "2894115" - }, - { - "CU": "CU8", - "Version": "11.0.3401", - "KBList": "2917531" - }, - { - "CU": "CU9", - "Version": "11.0.3412", - "KBList": "2931078" - }, - { - "CU": "CU10", - "Version": "11.0.3431", - "KBList": "2954099" - }, - { - "Version": "11.0.3437", - "KBList": "2969896" - }, - { - "CU": "CU11", - "Version": "11.0.3449", - "KBList": "2975396" - }, - { - "CU": "CU12", - "Version": "11.0.3460", - "KBList": "2977325" - }, - { - "CU": "CU13", - "Version": "11.0.3470", - "KBList": "2991533" - }, - { - "Version": "11.0.3482", - "KBList": "3002044" - }, - { - "CU": "CU14", - "Version": "11.0.3486", - "KBList": "3023636" - }, - { - "CU": "CU15", - "Version": "11.0.3487", - "KBList": "3038001" - }, - { - "CU": "CU16", - "Version": "11.0.3492", - "KBList": "3052476" - }, - { - "Version": "11.0.3513", - "KBList": "3045317" - }, - { - "SP": "SP2", - "Version": "11.0.5058", - "SupportedUntil": "2017-01-10T00:00:00", - "KBList": "2958429" - }, - { - "Version": "11.0.5343", - "KBList": "3045321" - }, - { - "Version": "11.0.5352", - "KBList": "3135244" - }, - { - "Version": "11.0.5388", - "KBList": "3194719" - }, - { - "Version": "11.0.5522", - "KBList": "2969896" - }, - { - "CU": "CU1", - "Version": "11.0.5532", - "KBList": "2976982" - }, - { - "CU": "CU2", - "Version": "11.0.5548", - "KBList": "2983175" - }, - { - "CU": "CU3", - "Version": "11.0.5556", - "KBList": "3002049" - }, - { - "CU": "CU4", - "Version": "11.0.5569", - "KBList": "3007556" - }, - { - "Version": "11.0.5571", - "KBList": "3034679" - }, - { - "CU": "CU5", - "Version": "11.0.5582", - "KBList": "3037255" - }, - { - "CU": "CU6", - "Version": "11.0.5592", - "KBList": "3052468" - }, - { - "Version": "11.0.5613", - "KBList": "3045319" - }, - { - "CU": "CU7", - "Version": "11.0.5623", - "KBList": "3072100" - }, - { - "Version": "11.0.5629", - "KBList": "3087872" - }, - { - "CU": "CU8", - "Version": "11.0.5634", - "KBList": "3082561" - }, - { - "Version": "11.0.5636", - "KBList": "3097636" - }, - { - "CU": "CU9", - "Version": "11.0.5641", - "KBList": "3098512" - }, - { - "CU": "CU10", - "Version": "11.0.5644", - "KBList": "3120313" - }, - { - "CU": "CU11", - "Version": "11.0.5646", - "KBList": "3137745" - }, - { - "CU": "CU12", - "Version": "11.0.5649", - "KBList": "3152637" - }, - { - "CU": "CU13", - "Version": "11.0.5655", - "KBList": "3165266" - }, - { - "CU": "CU14", - "Version": "11.0.5657", - "KBList": "3180914" - }, - { - "CU": "CU15", - "Version": "11.0.5676", - "KBList": [ - "3205416", - "3194725" - ] - }, - { - "CU": "CU16", - "Version": "11.0.5678", - "KBList": "3205054" - }, - { - "SP": "SP3", - "Version": "11.0.6020", - "SupportedUntil": "2018-10-09T00:00:00", - "KBList": "3072779" - }, - { - "Version": "11.0.6216", - "KBList": "3135244" - }, - { - "Version": "11.0.6248", - "KBList": "3194721" - }, - { - "Version": "11.0.6251", - "KBList": "4019092" - }, - { - "Version": "11.0.6260", - "KBList": "4057115" - }, - { - "CU": "CU1", - "Version": "11.0.6518", - "KBList": "3123299" - }, - { - "CU": "CU2", - "Version": "11.0.6523", - "KBList": "3137746" - }, - { - "CU": "CU3", - "Version": "11.0.6537", - "KBList": "3152635" - }, - { - "CU": "CU4", - "Version": "11.0.6540", - "KBList": "3165264" - }, - { - "CU": "CU5", - "Version": "11.0.6544", - "KBList": "3180915" - }, - { - "CU": "CU6", - "Version": "11.0.6567", - "KBList": [ - "3194992", - "3194724" - ] - }, - { - "CU": "CU7", - "Version": "11.0.6579", - "KBList": "3205051" - }, - { - "CU": "CU8", - "Version": "11.0.6594", - "KBList": "4013104" - }, - { - "CU": "CU9", - "Version": "11.0.6598", - "KBList": "4016762" - }, - { - "CU": "CU10", - "Version": "11.0.6607", - "KBList": [ - "4025925", - "4019090" - ] - }, - { - "Version": "11.0.6615", - "KBList": "4057121" - }, - { - "SP": [ - "SP4", - "LATEST" - ], - "SupportedUntil": "2022-07-12T00:00:00", - "Version": "11.0.7001", - "KBList": "4018073" - }, - { - "Version": "11.0.7462", - "KBList": "4057116" - }, - { - "Version": "11.0.7469", - "KBList": "4091266" - }, - { - "Version": "12.0.1524", - "Name": "2014" - }, - { - "SP": "RTM", - "Version": "12.0.2000", - "SupportedUntil": "2016-07-12T00:00:00" - }, - { - "Version": "12.0.2254", - "KBList": "2977315" - }, - { - "Version": "12.0.2269", - "KBList": "3045324" - }, - { - "Version": "12.0.2271" - }, - { - "CU": "CU1", - "Version": "12.0.2342", - "KBList": "2931693" - }, - { - "CU": "CU2", - "Version": "12.0.2370", - "KBList": "2967546" - }, - { - "Version": "12.0.2381", - "KBList": "2977316" - }, - { - "CU": "CU3", - "Version": "12.0.2402", - "KBList": "2984923" - }, - { - "Version": "12.0.2405", - "KBList": "2999809" - }, - { - "Version": "12.0.2423", - "KBList": "3007050" - }, - { - "CU": "CU4", - "Version": "12.0.2430", - "KBList": "2999197" - }, - { - "Version": "12.0.2436", - "KBList": "3014867" - }, - { - "CU": "CU5", - "Version": "12.0.2456", - "KBList": "3011055" - }, - { - "Version": "12.0.2464", - "KBList": "3024815" - }, - { - "Version": "12.0.2472", - "KBList": "3032087" - }, - { - "Version": "12.0.2474", - "KBList": "3034679" - }, - { - "CU": "CU6", - "Version": "12.0.2480", - "KBList": "3031047" - }, - { - "Version": "12.0.2485", - "KBList": "3043788" - }, - { - "Version": "12.0.2488", - "KBList": "3048751" - }, - { - "CU": "CU7", - "Version": "12.0.2495", - "KBList": "3046038" - }, - { - "Version": "12.0.2504", - "KBList": [ - "3058512", - "2999809" - ] - }, - { - "Version": "12.0.2505", - "KBList": "3052167" - }, - { - "Version": "12.0.2506", - "KBList": "3063054" - }, - { - "CU": "CU8", - "Version": "12.0.2546", - "KBList": "3067836" - }, - { - "Version": "12.0.2548", - "KBList": "3045323" - }, - { - "CU": "CU9", - "Version": "12.0.2553", - "KBList": "3075949" - }, - { - "CU": "CU10", - "Version": "12.0.2556", - "KBList": "3094220" - }, - { - "CU": "CU11", - "Version": "12.0.2560", - "KBList": "3106659" - }, - { - "CU": "CU12", - "Version": "12.0.2564", - "KBList": "3130923" - }, - { - "CU": "CU13", - "Version": "12.0.2568", - "KBList": "3144517" - }, - { - "CU": "CU14", - "Version": "12.0.2569", - "KBList": "3158271" - }, - { - "SP": "SP1", - "Version": "12.0.4100", - "SupportedUntil": "2017-10-10T00:00:00", - "KBList": "3058865" - }, - { - "Version": "12.0.4213", - "KBList": "3070446" - }, - { - "Version": "12.0.4219" - }, - { - "Version": "12.0.4232", - "KBList": "3194720" - }, - { - "Version": "12.0.4237", - "KBList": "4019091" - }, - { - "CU": "CU1", - "Version": "12.0.4416", - "KBList": "3067839" - }, - { - "Version": "12.0.4419", - "KBList": "3078973" - }, - { - "CU": "CU2", - "Version": "12.0.4422", - "KBList": "3075950" - }, - { - "CU": "CU3", - "Version": "12.0.4427", - "KBList": "3094221" - }, - { - "Version": "12.0.4432", - "KBList": [ - "3097972", - "319472" - ] - }, - { - "Version": "12.0.4433", - "KBList": "3119148" - }, - { - "CU": "CU4", - "Version": "12.0.4436", - "KBList": "3106660" - }, - { - "Version": "12.0.4437", - "KBList": "3130999" - }, - { - "CU": "CU5", - "Version": "12.0.4439", - "KBList": "3130926" - }, - { - "Version": "12.0.4449", - "KBList": "3144524" - }, - { - "CU": "CU6", - "Version": "12.0.4457", - "KBList": "3167392" - }, - { - "CU": "CU7", - "Version": "12.0.4459", - "KBList": "3162659" - }, - { - "Version": "12.0.4463", - "KBList": "3174370" - }, - { - "CU": "CU8", - "Version": "12.0.4468", - "KBList": "917606" - }, - { - "CU": "CU9", - "Version": "12.0.4474", - "KBList": "3186964" - }, - { - "Version": "12.0.4487", - "KBList": "3194722" - }, - { - "CU": "CU10", - "Version": "12.0.4491", - "KBList": "3204399" - }, - { - "Version": "12.0.4502", - "CU": "CU11", - "KBList": "4010392" - }, - { - "Version": "12.0.4511", - "CU": "CU12", - "KBList": "4017793" - }, - { - "Version": "12.0.4522", - "CU": "CU13", - "KBList": [ - "4019099", - "4032542" - ] - }, - { - "SP": "SP2", - "Version": "12.0.5000", - "SupportedUntil": "2024-07-09T00:00:00", - "KBList": "3171021" - }, - { - "Version": "12.0.5203", - "KBList": "3194714" - }, - { - "Version": "12.0.5207", - "KBList": "4019093" - }, - { - "Version": "12.0.5214", - "KBList": "4057120" - }, - { - "CU": "CU1", - "Version": "12.0.5511", - "KBList": "3178925" - }, - { - "CU": "CU2", - "Version": "12.0.5522", - "KBList": "3188778" - }, - { - "Version": "12.0.5532", - "KBList": "3194718" - }, - { - "CU": "CU3", - "Version": "12.0.5538", - "KBList": "3204388" - }, - { - "CU": "CU4", - "Version": "12.0.5540", - "KBList": "4010394" - }, - { - "CU": "CU5", - "Version": "12.0.5546", - "KBList": "4013098" - }, - { - "Version": "12.0.5553", - "CU": "CU6", - "KBList": [ - "4019094", - "4036996" - ] - }, - { - "CU": "CU7", - "Version": "12.0.5556", - "KBList": "4032541" - }, - { - "CU": "CU8", - "Version": "12.0.5557", - "KBList": "4037356" - }, - { - "CU": "CU9", - "Version": "12.0.5563", - "KBList": "4055557" - }, - { - "CU": "CU10", - "Version": "12.0.5571", - "KBList": "4052725" - }, - { - "CU": "CU11", - "Version": "12.0.5579", - "KBList": "4077063" - }, - { - "CU": "CU12", - "Version": "12.0.5589", - "KBList": "4130489" - }, - { - "CU": "CU13", - "Version": "12.0.5590", - "KBList": "4456287" - }, - { - "CU": "CU14", - "Version": "12.0.5600", - "KBList": "4459860" - }, - { - "SP": [ - "SP3", - "LATEST" - ], - "Version": "12.0.6024", - "SupportedUntil": "2019-09-07T00:00:00", - "KBList": "4022619" - }, - { - "Version": "13.0.200", - "Name": "2016" - }, - { - "Version": "13.0.300" - }, - { - "Version": "13.0.407" - }, - { - "Version": "13.0.500" - }, - { - "Version": "13.0.600" - }, - { - "Version": "13.0.700" - }, - { - "Version": "13.0.800" - }, - { - "Version": "13.0.900" - }, - { - "Version": "13.0.1000" - }, - { - "Version": "13.0.1100" - }, - { - "Version": "13.0.1200" - }, - { - "Version": "13.0.1250" - }, - { - "Version": "13.0.1300" - }, - { - "Version": "13.0.1400" - }, - { - "SP": "RTM", - "Version": "13.0.1601", - "SupportedUntil": "2018-01-09T00:00:00" - }, - { - "Version": "13.0.1708", - "KBList": "3164398" - }, - { - "Version": "13.0.1722", - "KBList": "3194716" - }, - { - "Version": "13.0.1728", - "KBList": "3210111" - }, - { - "Version": "13.0.1742", - "KBList": "4019088" - }, - { - "Version": "13.0.1745", - "KBList": "4058560" - }, - { - "CU": "CU1", - "Version": "13.0.2149", - "KBList": "3164674" - }, - { - "CU": "CU2", - "Version": "13.0.2164", - "KBList": "3182270" - }, - { - "Version": "13.0.2169", - "KBList": "3195813" - }, - { - "Version": "13.0.2170", - "KBList": "3199171" - }, - { - "CU": "CU3", - "Version": "13.0.2186", - "KBList": [ - "3205413", - "3194717" - ] - }, - { - "Version": "13.0.2190", - "KBList": "3210110" - }, - { - "CU": "CU4", - "Version": "13.0.2193", - "KBList": "3205052" - }, - { - "CU": "CU5", - "Version": "13.0.2197", - "KBList": "4013105" - }, - { - "CU": "CU6", - "Version": "13.0.2204", - "KBList": "4019914" - }, - { - "Version": "13.0.2210", - "CU": "CU7", - "KBList": [ - "4024304", - "4019086" - ] - }, - { - "CU": "CU8", - "Version": "13.0.2213", - "KBList": "4040713" - }, - { - "CU": "CU9", - "Version": "13.0.2216", - "KBList": "4037357" - }, - { - "Version": "13.0.2218", - "KBList": "4058559" - }, - { - "SP": "SP1", - "Version": "13.0.4001", - "SupportedUntil": "2019-09-07T00:00:00", - "KBList": "3182545" - }, - { - "Version": "13.0.4199", - "KBList": "3207512" - }, - { - "Version": "13.0.4202", - "KBList": "3210089" - }, - { - "Version": "13.0.4206", - "KBList": "4019089" - }, - { - "Version": "13.0.4210", - "KBList": "4057118" - }, - { - "Version": "13.0.4224", - "KBList": "4458842" - }, - { - "CU": "CU1", - "Version": "13.0.4411", - "KBList": "3208177" - }, - { - "CU": "CU2", - "Version": "13.0.4422", - "KBList": "4013106" - }, - { - "CU": "CU3", - "Version": "13.0.4435", - "KBList": "4019916" - }, - { - "Version": "13.0.4446", - "CU": "CU4", - "KBList": [ - "4024305", - "4019095" - ] - }, - { - "CU": "CU5", - "Version": "13.0.4451", - "KBList": "4040714" - }, - { - "CU": "CU6", - "Version": "13.0.4457", - "KBList": "4037354" - }, - { - "CU": "CU7", - "Version": "13.0.4466", - "KBList": "4057119" - }, - { - "CU": "CU8", - "Version": "13.0.4474", - "KBList": "4077064" - }, - { - "CU": "CU9", - "Version": "13.0.4502", - "KBList": "4100997" - }, - { - "CU": "CU10", - "Version": "13.0.4514", - "KBList": "4341569" - }, - { - "Version": "13.0.4522", - "KBList": "4293808" - }, - { - "CU": "CU11", - "Version": "13.0.4528", - "KBList": "4459676" - }, - { - "CU": "CU12", - "Version": "13.0.4541", - "KBList": "4464343" - }, - { - "SP": [ - "SP2", - "LATEST" - ], - "Version": "13.0.5026", - "SupportedUntil": "2026-07-14T00:00:00", - "KBList": "4052908" - }, - { - "Version": "13.0.5081", - "KBList": "4293802" - }, - { - "CU": "CU1", - "Version": "13.0.5149", - "KBList": "4135048" - }, - { - "CU": "CU2", - "Version": "13.0.5153", - "KBList": "4340355" - }, - { - "Version": "13.0.5161", - "KBList": "4293807" - }, - { - "Version": "13.0.5201", - "KBList": "4458621" - }, - { - "CU": "CU3", - "Version": "13.0.5216", - "KBList": "4458871" - }, - { - "CU": "CU4", - "Version": "13.0.5233", - "KBList": "4464106" - }, - { - "Version": "14.0.1", - "Name": "2017" - }, - { - "Version": "14.0.100" - }, - { - "Version": "14.0.200" - }, - { - "Version": "14.0.304" - }, - { - "Version": "14.0.405" - }, - { - "Version": "14.0.500" - }, - { - "Version": "14.0.600" - }, - { - "Version": "14.0.800" - }, - { - "Version": "14.0.900" - }, - { - "SP": [ - "RTM", - "LATEST" - ], - "Version": "14.0.1000", - "SupportedUntil": "2027-10-12T00:00:00" - }, - { - "Version": "14.0.2000", - "KBList": "4057122" - }, - { - "Version": "14.0.2002", - "KBList": "4293803" - }, - { - "CU": "CU1", - "Version": "14.0.3006", - "KBList": "4038634" - }, - { - "CU": "CU2", - "Version": "14.0.3008", - "KBList": "4052574" - }, - { - "CU": "CU3", - "Version": "14.0.3015", - "KBList": "4052987" - }, - { - "CU": "CU4", - "Version": "14.0.3022", - "KBList": "4056498" - }, - { - "CU": "CU5", - "Version": "14.0.3023", - "KBList": "4092643" - }, - { - "CU": "CU6", - "Version": "14.0.3025", - "KBList": "4101464" - }, - { - "CU": "CU7", - "Version": "14.0.3026", - "KBList": "4229789" - }, - { - "CU": "CU8", - "Version": "14.0.3029", - "KBList": "4338363" - }, - { - "CU": "CU9", - "Version": "14.0.3030", - "KBList": "4341265" - }, - { - "Version": "14.0.3035", - "KBList": "4293805" - }, - { - "CU": "CU10", - "Version": "14.0.3037", - "KBList": "4293805" - }, - { - "CU": "CU11", - "Version": "14.0.3038", - "KBList": "4462262" - }, - { - "CU": "CU12", - "Version": "14.0.3045", - "KBList": "4464082" - } + { + "Version": "8.0.47", + "Name": "2000" + }, + { + "Version": "8.0.78" + }, + { + "Version": "8.0.100" + }, + { + "Version": "8.0.190" + }, + { + "SP": "RTM", + "Version": "8.0.194", + "SupportedUntil": "2000-11-30T00:00:00" + }, + { + "Version": "8.0.204", + "KBList": "274329" + }, + { + "Version": "8.0.205", + "KBList": "274330" + }, + { + "Version": "8.0.210", + "KBList": "275900" + }, + { + "Version": "8.0.211", + "KBList": "276329" + }, + { + "Version": "8.0.217", + "KBList": "279293" + }, + { + "Version": "8.0.218", + "KBList": "279183" + }, + { + "Version": "8.0.222", + "KBList": "281769" + }, + { + "Version": "8.0.223", + "KBList": "280380" + }, + { + "Version": "8.0.225", + "KBList": "281663" + }, + { + "Version": "8.0.226", + "KBList": "278239" + }, + { + "Version": "8.0.231", + "KBList": "282279" + }, + { + "Version": "8.0.233", + "KBList": "282416" + }, + { + "Version": "8.0.239", + "KBList": "285290" + }, + { + "Version": "8.0.249", + "KBList": "288122" + }, + { + "Version": "8.0.250", + "KBList": "291683" + }, + { + "Version": "8.0.251", + "KBList": "300194" + }, + { + "Version": "8.0.287", + "KBList": "297209" + }, + { + "Version": "8.0.296", + "KBList": "299717" + }, + { + "SP": "SP1", + "Version": "8.0.384", + "SupportedUntil": "2002-02-28T00:00:00", + "KBList": "306908" + }, + { + "Version": "8.0.428", + "KBList": "304850" + }, + { + "Version": "8.0.443", + "KBList": "307538" + }, + { + "Version": "8.0.444", + "KBList": [ + "307655", + "30754" + ] + }, + { + "Version": "8.0.452", + "KBList": "308547" + }, + { + "Version": "8.0.469", + "KBList": "313005" + }, + { + "Version": "8.0.471", + "KBList": "313302" + }, + { + "Version": "8.0.473", + "KBList": "314003" + }, + { + "Version": "8.0.474", + "KBList": "315395" + }, + { + "Version": "8.0.475" + }, + { + "SP": "SP2", + "Version": "8.0.532", + "SupportedUntil": "2003-04-07T00:00:00", + "KBList": "306908" + }, + { + "Version": "8.0.534", + "KBList": "306908" + }, + { + "Version": "8.0.552", + "KBList": [ + "313002", + "313005" + ] + }, + { + "Version": "8.0.558", + "KBList": [ + "314003", + "315395" + ] + }, + { + "Version": "8.0.561" + }, + { + "Version": "8.0.568", + "KBList": "317748" + }, + { + "Version": "8.0.578", + "KBList": [ + "318405", + "317979" + ] + }, + { + "Version": "8.0.584", + "KBList": "318530" + }, + { + "Version": "8.0.594", + "KBList": [ + "356774", + "319477" + ] + }, + { + "Version": "8.0.599", + "KBList": "319869" + }, + { + "Version": "8.0.604" + }, + { + "Version": "8.0.608", + "KBList": "319507" + }, + { + "Version": "8.0.644", + "KBList": "324186" + }, + { + "Version": "8.0.650", + "KBList": "322853" + }, + { + "Version": "8.0.652", + "KBList": "810010" + }, + { + "Version": "8.0.655" + }, + { + "Version": "8.0.661", + "KBList": "326999" + }, + { + "Version": "8.0.665" + }, + { + "Version": "8.0.667" + }, + { + "Version": "8.0.678", + "KBList": "328354" + }, + { + "Version": "8.0.679", + "KBList": "316333" + }, + { + "Version": "8.0.682", + "KBList": "319851" + }, + { + "Version": "8.0.686", + "KBList": "316333" + }, + { + "Version": "8.0.688", + "KBList": "329487" + }, + { + "Version": "8.0.689", + "KBList": "329499" + }, + { + "Version": "8.0.690", + "KBList": "311104" + }, + { + "Version": "8.0.693", + "KBList": "330212" + }, + { + "Version": "8.0.695", + "KBList": [ + "331965", + "331855" + ] + }, + { + "Version": "8.0.696", + "KBList": [ + "810052", + "810072" + ] + }, + { + "Version": "8.0.700", + "KBList": "810072" + }, + { + "Version": "8.0.701", + "KBList": [ + "810163", + "810026" + ] + }, + { + "Version": "8.0.702", + "KBList": "328551" + }, + { + "Version": "8.0.703", + "KBList": "810526" + }, + { + "Version": "8.0.705", + "KBList": "810920" + }, + { + "Version": "8.0.710", + "KBList": "811052" + }, + { + "Version": "8.0.713", + "KBList": "811205" + }, + { + "Version": "8.0.714", + "KBList": "811478" + }, + { + "Version": "8.0.715", + "KBList": [ + "810688", + "811611" + ] + }, + { + "Version": "8.0.718", + "KBList": "811703" + }, + { + "Version": "8.0.721", + "KBList": [ + "812393", + "81225" + ] + }, + { + "Version": "8.0.723", + "KBList": "812798" + }, + { + "Version": "8.0.725", + "KBList": [ + "813494", + "812995" + ] + }, + { + "Version": "8.0.728", + "KBList": "814460" + }, + { + "Version": "8.0.730", + "KBList": "813769" + }, + { + "Version": "8.0.733", + "KBList": "813759" + }, + { + "Version": "8.0.735", + "KBList": "814889" + }, + { + "Version": "8.0.736", + "KBList": "816937" + }, + { + "Version": "8.0.741", + "KBList": "818096" + }, + { + "Version": "8.0.743", + "KBList": [ + "818406", + "818763" + ] + }, + { + "SP": "SP3", + "Version": "8.0.760", + "SupportedUntil": "2007-07-10T00:00:00", + "KBList": "306908" + }, + { + "Version": "8.0.762", + "KBList": "814032" + }, + { + "Version": "8.0.763", + "KBList": "814113" + }, + { + "Version": "8.0.765", + "KBList": [ + "811611", + "810688", + "810163", + "813769" + ] + }, + { + "Version": "8.0.769", + "KBList": [ + "814892", + "814889" + ] + }, + { + "Version": "8.0.775", + "KBList": "815115" + }, + { + "Version": "8.0.779", + "KBList": "814035" + }, + { + "Version": "8.0.780", + "KBList": [ + "816084", + "816039", + "801185" + ] + }, + { + "Version": "8.0.781", + "KBList": "815057" + }, + { + "Version": "8.0.788", + "KBList": "816985" + }, + { + "Version": "8.0.789", + "KBList": "816840" + }, + { + "Version": "8.0.790", + "KBList": "817081" + }, + { + "Version": "8.0.791", + "KBList": "815249" + }, + { + "Version": "8.0.794", + "KBList": [ + "817709", + "816440", + "813524", + "817464" + ] + }, + { + "Version": "8.0.798", + "KBList": "817464" + }, + { + "Version": "8.0.800", + "KBList": [ + "818188", + "818097" + ] + }, + { + "Version": "8.0.801", + "KBList": "181540" + }, + { + "Version": "8.0.804", + "KBList": "818729" + }, + { + "Version": "8.0.807", + "KBList": "818899" + }, + { + "Version": "8.0.811", + "KBList": [ + "891662", + "819248", + "818897" + ] + }, + { + "Version": "8.0.814", + "KBList": "819662" + }, + { + "Version": "8.0.816", + "KBList": "818766" + }, + { + "Version": "8.0.818", + "KBList": [ + "821280", + "826161", + "821277" + ] + }, + { + "Version": "8.0.819", + "KBList": "826161" + }, + { + "Version": "8.0.837", + "KBList": [ + "823514", + "821740", + "821548", + "821741", + "820788" + ] + }, + { + "Version": "8.0.839", + "KBList": [ + "824027", + "823877" + ] + }, + { + "Version": "8.0.840", + "KBList": "319477" + }, + { + "Version": "8.0.841", + "KBList": "825225" + }, + { + "Version": "8.0.842", + "KBList": "825043" + }, + { + "Version": "8.0.844", + "KBList": "826080" + }, + { + "Version": "8.0.845", + "KBList": [ + "825854", + "826364" + ] + }, + { + "Version": "8.0.847", + "KBList": "826433" + }, + { + "Version": "8.0.848", + "KBList": "826822" + }, + { + "Version": "8.0.850", + "KBList": [ + "826906", + "826815", + "826860" + ] + }, + { + "Version": "8.0.851", + "KBList": "826754" + }, + { + "Version": "8.0.852", + "KBList": [ + "827954", + "830466" + ] + }, + { + "Version": "8.0.854", + "KBList": "828699" + }, + { + "Version": "8.0.856", + "KBList": "828096" + }, + { + "Version": "8.0.857", + "KBList": [ + "828308", + "827714", + "828017" + ] + }, + { + "Version": "8.0.858", + "KBList": "828637" + }, + { + "Version": "8.0.859", + "KBList": "821334" + }, + { + "Version": "8.0.863", + "KBList": [ + "829444", + "829205" + ] + }, + { + "Version": "8.0.865", + "KBList": [ + "828945", + "830395" + ] + }, + { + "Version": "8.0.866", + "KBList": "830366" + }, + { + "Version": "8.0.869", + "KBList": "830588" + }, + { + "Version": "8.0.870", + "KBList": "830262" + }, + { + "Version": "8.0.871", + "KBList": [ + "830860", + "830767" + ] + }, + { + "Version": "8.0.873", + "KBList": "830887" + }, + { + "Version": "8.0.876", + "KBList": [ + "831997", + "830912" + ] + }, + { + "Version": "8.0.878", + "KBList": "831950" + }, + { + "Version": "8.0.879", + "KBList": "832977" + }, + { + "Version": "8.0.891", + "KBList": "836141" + }, + { + "Version": "8.0.892", + "KBList": "833710" + }, + { + "Version": "8.0.904", + "KBList": "834453" + }, + { + "Version": "8.0.908", + "KBList": "834290" + }, + { + "Version": "8.0.910", + "KBList": "834798" + }, + { + "Version": "8.0.911", + "KBList": "837957" + }, + { + "Version": "8.0.913", + "KBList": "836651" + }, + { + "Version": "8.0.915", + "KBList": "837401" + }, + { + "Version": "8.0.916", + "KBList": "317989" + }, + { + "Version": "8.0.919", + "KBList": "837957" + }, + { + "Version": "8.0.922", + "KBList": "837970" + }, + { + "Version": "8.0.923", + "KBList": "838460" + }, + { + "Version": "8.0.926", + "KBList": "839523" + }, + { + "Version": "8.0.927", + "KBList": "839688" + }, + { + "Version": "8.0.928", + "KBList": "839589" + }, + { + "Version": "8.0.929", + "KBList": "839529" + }, + { + "Version": "8.0.933", + "KBList": "840856" + }, + { + "Version": "8.0.934", + "KBList": "841404" + }, + { + "Version": "8.0.935", + "KBList": "841404" + }, + { + "Version": "8.0.936", + "KBList": "841627" + }, + { + "Version": "8.0.937", + "KBList": "841776" + }, + { + "Version": "8.0.944", + "KBList": "839280" + }, + { + "Version": "8.0.948", + "KBList": "843263" + }, + { + "Version": "8.0.949", + "KBList": "843266" + }, + { + "Version": "8.0.952", + "KBList": [ + "867880", + "867879", + "867878" + ] + }, + { + "Version": "8.0.954", + "KBList": "843282" + }, + { + "Version": "8.0.955", + "KBList": "867798" + }, + { + "Version": "8.0.957", + "KBList": "870994" + }, + { + "Version": "8.0.959", + "KBList": "878500" + }, + { + "Version": "8.0.961", + "KBList": "873446" + }, + { + "Version": "8.0.962", + "KBList": "883415" + }, + { + "Version": "8.0.967", + "KBList": "878501" + }, + { + "Version": "8.0.970", + "KBList": "872842" + }, + { + "Version": "8.0.972", + "KBList": "885290" + }, + { + "Version": "8.0.973", + "KBList": "884554" + }, + { + "Version": "8.0.977", + "KBList": "888007" + }, + { + "Version": "8.0.980", + "KBList": "887974" + }, + { + "Version": "8.0.985", + "KBList": "889239" + }, + { + "Version": "8.0.988", + "KBList": "889166" + }, + { + "Version": "8.0.990", + "KBList": "890200" + }, + { + "Version": "8.0.991", + "KBList": "889314" + }, + { + "Version": "8.0.993", + "KBList": [ + "890742", + "888444", + "890925" + ] + }, + { + "Version": "8.0.994", + "KBList": [ + "890767", + "890768", + "890942" + ] + }, + { + "Version": "8.0.996", + "KBList": [ + "891268", + "891017" + ] + }, + { + "Version": "8.0.997", + "KBList": "891311" + }, + { + "Version": "8.0.1000", + "KBList": "891585" + }, + { + "Version": "8.0.1001", + "KBList": "892205" + }, + { + "Version": "8.0.1003", + "KBList": "892923" + }, + { + "Version": "8.0.1007", + "KBList": "893312" + }, + { + "Version": "8.0.1009", + "KBList": "894257" + }, + { + "Version": "8.0.1013", + "KBList": "891866" + }, + { + "Version": "8.0.1014", + "KBList": [ + "895187", + "895123" + ] + }, + { + "Version": "8.0.1017", + "KBList": "896425" + }, + { + "Version": "8.0.1019", + "KBList": "897572" + }, + { + "Version": "8.0.1020", + "KBList": "896985" + }, + { + "Version": "8.0.1021", + "KBList": "887700" + }, + { + "Version": "8.0.1024", + "KBList": "898709" + }, + { + "Version": "8.0.1025", + "KBList": [ + "899430", + "899428" + ] + }, + { + "Version": "8.0.1027", + "KBList": "900416" + }, + { + "Version": "8.0.1029", + "KBList": "902852" + }, + { + "Version": "8.0.1034", + "KBList": "915328" + }, + { + "Version": "8.0.1035", + "KBList": "917593" + }, + { + "Version": "8.0.1036", + "KBList": "929410" + }, + { + "Version": "8.0.1037", + "KBList": "930484" + }, + { + "Version": "8.0.1077", + "KBList": "983814" + }, + { + "Version": "8.0.1547", + "KBList": "899410" + }, + { + "Version": "8.0.2026" + }, + { + "SP": [ + "SP4", + "LATEST" + ], + "Version": "8.0.2039", + "SupportedUntil": "2013-04-09T00:00:00", + "KBList": "306908" + }, + { + "Version": "8.0.2040", + "KBList": "899761" + }, + { + "Version": "8.0.2050", + "KBList": [ + "941203", + "94811" + ] + }, + { + "Version": "8.0.2055", + "KBList": "959240" + }, + { + "Version": "8.0.2145", + "KBList": [ + "826906", + "836651" + ] + }, + { + "Version": "8.0.2147", + "KBList": "899410" + }, + { + "Version": "8.0.2148", + "KBList": [ + "899430", + "899431", + "900390", + "900404", + "901212", + "902150", + "902955" + ] + }, + { + "Version": "8.0.2151", + "KBList": [ + "903742", + "904244" + ] + }, + { + "Version": "8.0.2156" + }, + { + "Version": "8.0.2159", + "KBList": "907250" + }, + { + "Version": "8.0.2162", + "KBList": "904660" + }, + { + "Version": "8.0.2166", + "KBList": "909734" + }, + { + "Version": "8.0.2168", + "KBList": "907813" + }, + { + "Version": "8.0.2171", + "KBList": "909369" + }, + { + "Version": "8.0.2172", + "KBList": "910707" + }, + { + "Version": "8.0.2175", + "KBList": "911678" + }, + { + "Version": "8.0.2180", + "KBList": [ + "913684", + "913789" + ] + }, + { + "Version": "8.0.2187", + "KBList": [ + "916287", + "914384", + "898709", + "915065", + "915340" + ] + }, + { + "Version": "8.0.2189", + "KBList": [ + "916652", + "913438" + ] + }, + { + "Version": "8.0.2191", + "KBList": [ + "826906", + "836651" + ] + }, + { + "Version": "8.0.2192", + "KBList": "917606" + }, + { + "Version": "8.0.2194", + "KBList": [ + "917972", + "917565" + ] + }, + { + "Version": "8.0.2196", + "KBList": "919165" + }, + { + "Version": "8.0.2197", + "KBList": [ + "919133", + "919068", + "919399" + ] + }, + { + "Version": "8.0.2199", + "KBList": "919221" + }, + { + "Version": "8.0.2201", + "KBList": "920930" + }, + { + "Version": "8.0.2207", + "KBList": "923344" + }, + { + "Version": "8.0.2209", + "KBList": "923797" + }, + { + "Version": "8.0.2215", + "KBList": [ + "924662", + "923563", + "923796" + ] + }, + { + "Version": "8.0.2217", + "KBList": "924664" + }, + { + "Version": "8.0.2218", + "KBList": "925297" + }, + { + "Version": "8.0.2223", + "KBList": [ + "925678", + "925419" + ] + }, + { + "Version": "8.0.2226", + "KBList": [ + "925684", + "925732" + ] + }, + { + "Version": "8.0.2229", + "KBList": "927186" + }, + { + "Version": "8.0.2231", + "KBList": "928079" + }, + { + "Version": "8.0.2232", + "KBList": "928568" + }, + { + "Version": "8.0.2234", + "KBList": [ + "929440", + "929131" + ] + }, + { + "Version": "8.0.2236", + "KBList": "930484" + }, + { + "Version": "8.0.2238", + "KBList": "931932" + }, + { + "Version": "8.0.2242", + "KBList": "929131" + }, + { + "Version": "8.0.2244", + "KBList": "934203" + }, + { + "Version": "8.0.2245", + "KBList": "933573" + }, + { + "Version": "8.0.2246", + "KBList": "935465" + }, + { + "Version": "8.0.2248", + "KBList": "935950" + }, + { + "Version": "8.0.2249", + "KBList": "936232" + }, + { + "Version": "8.0.2253", + "KBList": "939317" + }, + { + "Version": "8.0.2265", + "KBList": "944985" + }, + { + "Version": "8.0.2271", + "KBList": "946584" + }, + { + "Version": "8.0.2273", + "KBList": [ + "941203", + "948111" + ] + }, + { + "Version": "8.0.2279", + "KBList": "959678" + }, + { + "Version": "8.0.2282", + "KBList": "960083" + }, + { + "Version": "8.0.2283", + "KBList": "971524" + }, + { + "Version": "8.0.2301", + "KBList": "983809" + }, + { + "Version": "8.0.2305", + "KBList": "983811" + }, + { + "Version": "9.0.0", + "Name": "2005" + }, + { + "SP": "RTM", + "Version": "9.0.1399", + "SupportedUntil": "2007-07-10T00:00:00" + }, + { + "Version": "9.0.1406", + "KBList": "932557" + }, + { + "Version": "9.0.1500", + "KBList": "910416" + }, + { + "Version": "9.0.1502", + "KBList": "915793" + }, + { + "Version": "9.0.1503", + "KBList": "911662" + }, + { + "Version": "9.0.1514", + "KBList": "912471" + }, + { + "Version": "9.0.1518", + "KBList": [ + "913371", + "912472", + "913941" + ] + }, + { + "Version": "9.0.1519", + "KBList": "913494" + }, + { + "Version": "9.0.1528", + "KBList": [ + "915122", + "915306", + "915307", + "915308", + "915309" + ] + }, + { + "Version": "9.0.1531", + "KBList": "915918" + }, + { + "Version": "9.0.1532", + "KBList": "916046" + }, + { + "Version": "9.0.1533", + "KBList": "916086" + }, + { + "Version": "9.0.1534", + "KBList": "916706" + }, + { + "Version": "9.0.1536", + "KBList": "917016" + }, + { + "Version": "9.0.1538", + "KBList": "917824" + }, + { + "Version": "9.0.1539", + "KBList": "917738" + }, + { + "Version": "9.0.1541", + "KBList": [ + "917971", + "917888" + ] + }, + { + "Version": "9.0.1545", + "KBList": "917905" + }, + { + "Version": "9.0.1547", + "KBList": "918276" + }, + { + "Version": "9.0.1550", + "KBList": [ + "921106", + "917887" + ] + }, + { + "Version": "9.0.1551", + "KBList": [ + "922804", + "922527" + ] + }, + { + "Version": "9.0.1554", + "KBList": "926292" + }, + { + "Version": "9.0.1558", + "KBList": "926493" + }, + { + "Version": "9.0.1561", + "KBList": "932556" + }, + { + "Version": "9.0.2029" + }, + { + "Version": "9.0.2040" + }, + { + "SP": "SP1", + "Version": "9.0.2047", + "SupportedUntil": "2008-04-08T00:00:00", + "KBList": "913090" + }, + { + "Version": "9.0.2050", + "KBList": "932555" + }, + { + "Version": "9.0.2153", + "KBList": [ + "919224", + "918222" + ] + }, + { + "Version": "9.0.2156", + "KBList": "919611" + }, + { + "Version": "9.0.2164", + "KBList": [ + "919775", + "919636", + "918882", + "920206", + "921003", + "919929", + "920347", + "920346", + "919243" + ] + }, + { + "Version": "9.0.2167", + "KBList": "920974" + }, + { + "Version": "9.0.2174", + "KBList": "922063" + }, + { + "Version": "9.0.2175", + "KBList": [ + "921536", + "922438", + "922578", + "917905", + "921395" + ] + }, + { + "Version": "9.0.2176", + "KBList": [ + "923296", + "922594" + ] + }, + { + "Version": "9.0.2181", + "KBList": [ + "923634", + "923605" + ] + }, + { + "Version": "9.0.2187", + "KBList": "923849" + }, + { + "Version": "9.0.2189", + "KBList": "925153" + }, + { + "Version": "9.0.2190", + "KBList": "925227" + }, + { + "Version": "9.0.2191", + "KBList": "925135" + }, + { + "Version": "9.0.2192", + "KBList": [ + "925335", + "924954" + ] + }, + { + "Version": "9.0.2194", + "KBList": "925744" + }, + { + "Version": "9.0.2195", + "KBList": "926240" + }, + { + "Version": "9.0.2196", + "KBList": [ + "926335", + "926285" + ] + }, + { + "Version": "9.0.2198", + "KBList": [ + "925277", + "924808", + "926611", + "926773", + "926612", + "924624", + "924807", + "926106", + "926613" + ] + }, + { + "Version": "9.0.2201", + "KBList": "927289" + }, + { + "Version": "9.0.2202", + "KBList": "927643" + }, + { + "Version": "9.0.2206", + "KBList": [ + "928529", + "926493", + "928537", + "928083" + ] + }, + { + "Version": "9.0.2207", + "KBList": [ + "928789", + "928732", + "928394" + ] + }, + { + "Version": "9.0.2208", + "KBList": "929179" + }, + { + "Version": "9.0.2209", + "KBList": "929278" + }, + { + "Version": "9.0.2211", + "KBList": [ + "930283", + "930284" + ] + }, + { + "Version": "9.0.2214", + "KBList": [ + "929240", + "930505" + ] + }, + { + "Version": "9.0.2216", + "KBList": "931821" + }, + { + "Version": "9.0.2218", + "KBList": "931843" + }, + { + "Version": "9.0.2219", + "KBList": "932115" + }, + { + "Version": "9.0.2221", + "KBList": "931593" + }, + { + "Version": "9.0.2223", + "KBList": "932393" + }, + { + "Version": "9.0.2226", + "KBList": [ + "933762", + "934065" + ] + }, + { + "Version": "9.0.2227", + "KBList": "933265" + }, + { + "Version": "9.0.2229", + "KBList": "935446" + }, + { + "Version": "9.0.2230", + "KBList": "936179" + }, + { + "Version": "9.0.2231", + "KBList": "934812" + }, + { + "Version": "9.0.2232", + "KBList": "937277" + }, + { + "Version": "9.0.2233", + "KBList": [ + "937544", + "933499", + "937545" + ] + }, + { + "Version": "9.0.2234", + "KBList": "937343" + }, + { + "Version": "9.0.2236", + "KBList": [ + "940286", + "940287" + ] + }, + { + "Version": "9.0.2237", + "KBList": "940719" + }, + { + "Version": "9.0.2239", + "KBList": "940961" + }, + { + "Version": "9.0.2242", + "KBList": [ + "943888", + "943389" + ] + }, + { + "Version": "9.0.2243", + "KBList": "944968" + }, + { + "Version": "9.0.2245", + "KBList": "933573" + }, + { + "Version": "9.0.2249", + "KBList": "948344" + }, + { + "Version": "9.0.3026", + "KBList": "929376" + }, + { + "Version": "9.0.3027" + }, + { + "Version": "9.0.3033" + }, + { + "SP": "SP2", + "Version": "9.0.3042", + "SupportedUntil": "2010-01-12T00:00:00", + "KBList": "921896" + }, + { + "Version": "9.0.3043", + "KBList": "933508" + }, + { + "Version": "9.0.3050", + "KBList": "933508" + }, + { + "Version": "9.0.3054", + "KBList": "934458" + }, + { + "Version": "9.0.3068", + "KBList": "948109" + }, + { + "Version": "9.0.3073", + "KBList": "954606" + }, + { + "Version": "9.0.3077", + "KBList": "959420" + }, + { + "Version": "9.0.3080", + "KBList": "970895" + }, + { + "Version": "9.0.3152" + }, + { + "Version": "9.0.3153", + "KBList": "937137" + }, + { + "Version": "9.0.3154", + "KBList": "937137" + }, + { + "Version": "9.0.3155", + "KBList": "937137" + }, + { + "Version": "9.0.3156" + }, + { + "Version": "9.0.3159" + }, + { + "Version": "9.0.3161", + "CU": "CU1" + }, + { + "Version": "9.0.3162", + "KBList": "937137" + }, + { + "Version": "9.0.3166", + "KBList": "937137" + }, + { + "Version": "9.0.3169", + "KBList": "937137" + }, + { + "Version": "9.0.3171", + "KBList": "937745" + }, + { + "Version": "9.0.3175", + "CU": "CU2" + }, + { + "Version": "9.0.3177", + "KBList": "937137" + }, + { + "Version": "9.0.3178", + "KBList": "937137" + }, + { + "Version": "9.0.3179", + "KBList": "937137" + }, + { + "Version": "9.0.3180", + "KBList": "939942" + }, + { + "Version": "9.0.3182", + "KBList": "937137" + }, + { + "Version": "9.0.3186", + "CU": "CU3" + }, + { + "Version": "9.0.3194", + "KBList": "937137" + }, + { + "Version": "9.0.3195" + }, + { + "Version": "9.0.3200", + "CU": "CU4" + }, + { + "Version": "9.0.3203", + "KBList": "937137" + }, + { + "Version": "9.0.3205", + "KBList": "937137" + }, + { + "Version": "9.0.3206" + }, + { + "Version": "9.0.3208" + }, + { + "Version": "9.0.3209" + }, + { + "Version": "9.0.3215", + "CU": "CU5" + }, + { + "Version": "9.0.3221", + "KBList": [ + "942908", + "945442", + "945443", + "945916" + ] + }, + { + "Version": "9.0.3222", + "KBList": [ + "945640", + "945641", + "947196", + "947197" + ] + }, + { + "Version": "9.0.3224", + "KBList": "947463" + }, + { + "Version": "9.0.3228", + "CU": "CU6" + }, + { + "Version": "9.0.3230", + "KBList": "949199" + }, + { + "Version": "9.0.3231", + "KBList": [ + "949595", + "949687" + ] + }, + { + "Version": "9.0.3232", + "KBList": "949959" + }, + { + "Version": "9.0.3233", + "KBList": "948108" + }, + { + "Version": "9.0.3235", + "KBList": "950189" + }, + { + "Version": "9.0.3239", + "CU": "CU7" + }, + { + "Version": "9.0.3240", + "KBList": "951204" + }, + { + "Version": "9.0.3242", + "KBList": "951190" + }, + { + "Version": "9.0.3244", + "KBList": "952330" + }, + { + "Version": "9.0.3246", + "KBList": "952233" + }, + { + "CU": "CU8", + "Version": "9.0.3257", + "KBList": "951217" + }, + { + "Version": "9.0.3259", + "KBList": [ + "954669", + "954831" + ] + }, + { + "Version": "9.0.3260", + "KBList": "954950" + }, + { + "Version": "9.0.3282", + "CU": "CU9" + }, + { + "Version": "9.0.3294", + "CU": "CU10" + }, + { + "CU": "CU11", + "Version": "9.0.3301", + "KBList": "958735" + }, + { + "Version": "9.0.3302", + "KBList": [ + "961479", + "961648" + ] + }, + { + "Version": "9.0.3303", + "KBList": "962290" + }, + { + "Version": "9.0.3310", + "KBList": "960090" + }, + { + "CU": "CU12", + "Version": "9.0.3315", + "KBList": "962970" + }, + { + "Version": "9.0.3318", + "KBList": "967199" + }, + { + "Version": "9.0.3320", + "KBList": "969142" + }, + { + "CU": "CU13", + "Version": "9.0.3325", + "KBList": "967908" + }, + { + "Version": "9.0.3327", + "CU": "CU14" + }, + { + "CU": "CU15", + "Version": "9.0.3328", + "KBList": "970278" + }, + { + "Version": "9.0.3353", + "KBList": "970896" + }, + { + "CU": "CU16", + "Version": "9.0.3355", + "KBList": "974647" + }, + { + "CU": "CU17", + "Version": "9.0.3356", + "KBList": "976952" + }, + { + "Version": "9.0.4028" + }, + { + "SP": "SP3", + "Version": "9.0.4035", + "SupportedUntil": "2012-01-10T00:00:00" + }, + { + "Version": "9.0.4053", + "KBList": "970892" + }, + { + "Version": "9.0.4060", + "KBList": "2494113" + }, + { + "Version": "9.0.4207", + "CU": "CU1" + }, + { + "Version": "9.0.4211", + "CU": "CU2" + }, + { + "Version": "9.0.4216", + "KBList": "967101" + }, + { + "CU": "CU3", + "Version": "9.0.4220", + "KBList": "967909" + }, + { + "Version": "9.0.4224", + "KBList": "917606" + }, + { + "Version": "9.0.4226", + "CU": "CU4" + }, + { + "CU": "CU5", + "Version": "9.0.4230", + "KBList": "972511" + }, + { + "Version": "9.0.4262", + "KBList": "970894" + }, + { + "CU": "CU6", + "Version": "9.0.4266", + "KBList": "974648" + }, + { + "Version": "9.0.4268", + "KBList": "977151" + }, + { + "CU": "CU7", + "Version": "9.0.4273", + "KBList": "976951" + }, + { + "CU": "CU8", + "Version": "9.0.4285", + "KBList": "978915" + }, + { + "CU": "CU9", + "Version": "9.0.4294", + "KBList": "980176" + }, + { + "CU": "CU10", + "Version": "9.0.4305", + "KBList": "983329" + }, + { + "CU": "CU11", + "Version": "9.0.4309", + "KBList": "2258854" + }, + { + "CU": "CU12", + "Version": "9.0.4311", + "KBList": "2345449" + }, + { + "CU": "CU13", + "Version": "9.0.4315", + "KBList": "2438344" + }, + { + "CU": "CU14", + "Version": "9.0.4317", + "KBList": "2489375" + }, + { + "CU": "CU15", + "Version": "9.0.4325", + "KBList": "2507766" + }, + { + "Version": "9.0.4340", + "KBList": "2494112" + }, + { + "Version": "9.0.4912" + }, + { + "SP": [ + "SP4", + "LATEST" + ], + "Version": "9.0.5000", + "SupportedUntil": "2016-04-12T00:00:00", + "KBList": "2463332" + }, + { + "Version": "9.0.5057", + "KBList": "2494120" + }, + { + "Version": "9.0.5069", + "KBList": "2716429" + }, + { + "CU": "CU1", + "Version": "9.0.5254", + "KBList": "2464079" + }, + { + "CU": "CU2", + "Version": "9.0.5259", + "KBList": "2489409" + }, + { + "CU": "CU3", + "Version": "9.0.5266", + "KBList": "2507769" + }, + { + "Version": "9.0.5292", + "KBList": "2494123" + }, + { + "Version": "9.0.5294", + "KBList": "2572407" + }, + { + "Version": "9.0.5295", + "KBList": "2598903" + }, + { + "Version": "9.0.5296", + "KBList": "2615425" + }, + { + "Version": "9.0.5324", + "KBList": "2716427" + }, + { + "Version": "10.0.0", + "Name": "2008" + }, + { + "Version": "10.0.1019" + }, + { + "Version": "10.0.1049" + }, + { + "Version": "10.0.1075" + }, + { + "Version": "10.0.1300" + }, + { + "Version": "10.0.1442" + }, + { + "SP": "RTM", + "Version": "10.0.1600", + "SupportedUntil": "2010-04-13T00:00:00" + }, + { + "Version": "10.0.1750", + "KBList": "956718" + }, + { + "Version": "10.0.1755", + "KBList": "957387" + }, + { + "CU": "CU1", + "Version": "10.0.1763", + "KBList": "956717" + }, + { + "Version": "10.0.1767", + "KBList": "958208" + }, + { + "Version": "10.0.1771", + "KBList": "958611" + }, + { + "CU": "CU2", + "Version": "10.0.1779", + "KBList": "958186" + }, + { + "CU": "CU3", + "Version": "10.0.1787", + "KBList": "960484" + }, + { + "CU": "CU4", + "Version": "10.0.1798", + "KBList": "963036" + }, + { + "CU": "CU5", + "Version": "10.0.1806", + "KBList": "969531" + }, + { + "CU": "CU6", + "Version": "10.0.1812", + "KBList": "971490" + }, + { + "CU": "CU7", + "Version": "10.0.1818", + "KBList": "973601" + }, + { + "CU": "CU8", + "Version": "10.0.1823", + "KBList": "975976" + }, + { + "CU": "CU9", + "Version": "10.0.1828", + "KBList": "977444" + }, + { + "CU": "CU10", + "Version": "10.0.1835", + "KBList": "979064" + }, + { + "Version": "10.0.2520", + "KBList": "968369" + }, + { + "SP": "SP1", + "Version": "10.0.2531", + "SupportedUntil": "2011-10-11T00:00:00", + "KBList": "968369" + }, + { + "Version": "10.0.2573", + "KBList": "2494096" + }, + { + "CU": "CU1", + "Version": "10.0.2710", + "KBList": "969099" + }, + { + "Version": "10.0.2712", + "KBList": "970507" + }, + { + "CU": "CU2", + "Version": "10.0.2714", + "KBList": "970315" + }, + { + "CU": "CU3", + "Version": "10.0.2723", + "KBList": "971491" + }, + { + "CU": "CU4", + "Version": "10.0.2734", + "KBList": "973602" + }, + { + "Version": "10.0.2740", + "KBList": "976761" + }, + { + "CU": "CU5", + "Version": "10.0.2746", + "KBList": "975977" + }, + { + "CU": "CU6", + "Version": "10.0.2757", + "KBList": "977443" + }, + { + "CU": "CU7", + "Version": "10.0.2766", + "KBList": "979065" + }, + { + "CU": "CU8", + "Version": "10.0.2775", + "KBList": "981702" + }, + { + "Version": "10.0.2787", + "KBList": "2231277" + }, + { + "CU": "CU9", + "Version": "10.0.2789", + "KBList": "2083921" + }, + { + "CU": "CU10", + "Version": "10.0.2799", + "KBList": "2279604" + }, + { + "CU": "CU11", + "Version": "10.0.2804", + "KBList": "2413738" + }, + { + "CU": "CU12", + "Version": "10.0.2808", + "KBList": "2467236" + }, + { + "CU": "CU13", + "Version": "10.0.2816", + "KBList": "2497673" + }, + { + "CU": "CU14", + "Version": "10.0.2821", + "KBList": "2527187" + }, + { + "Version": "10.0.2841" + }, + { + "CU": "CU15", + "Version": "10.0.2847", + "KBList": "2555406" + }, + { + "CU": "CU16", + "Version": "10.0.2850", + "KBList": "2582282" + }, + { + "Version": "10.0.3798", + "KBList": "979450" + }, + { + "SP": "SP2", + "Version": "10.0.4000", + "SupportedUntil": "2012-10-09T00:00:00", + "KBList": "979450" + }, + { + "Version": "10.0.4064", + "KBList": "2494088" + }, + { + "Version": "10.0.4067", + "KBList": "2716434" + }, + { + "CU": "CU1", + "Version": "10.0.4266", + "KBList": "2289254" + }, + { + "CU": "CU2", + "Version": "10.0.4272", + "KBList": "2467239" + }, + { + "CU": "CU3", + "Version": "10.0.4279", + "KBList": "2498535" + }, + { + "CU": "CU4", + "Version": "10.0.4285", + "KBList": "2527180" + }, + { + "CU": "CU5", + "Version": "10.0.4316", + "KBList": "2555408" + }, + { + "CU": "CU6", + "Version": "10.0.4321", + "KBList": "2582285" + }, + { + "CU": "CU7", + "Version": "10.0.4323", + "KBList": "2617148" + }, + { + "CU": "CU8", + "Version": "10.0.4326", + "KBList": "2648096" + }, + { + "CU": "CU9", + "Version": "10.0.4330", + "KBList": "2402659" + }, + { + "CU": "CU10", + "Version": "10.0.4332", + "KBList": "2696625" + }, + { + "CU": "CU11", + "Version": "10.0.4333", + "KBList": "2715951" + }, + { + "Version": "10.0.4371", + "KBList": "2716433" + }, + { + "Version": "10.0.5416", + "KBList": "2546945" + }, + { + "SP": "SP3", + "Version": "10.0.5500", + "SupportedUntil": "2015-10-13T00:00:00", + "KBList": "2546951" + }, + { + "Version": "10.0.5512", + "KBList": "2716436" + }, + { + "Version": "10.0.5520", + "KBList": "2977321" + }, + { + "Version": "10.0.5538", + "KBList": "3045305" + }, + { + "Version": "10.0.5544", + "KBList": "3135244" + }, + { + "CU": "CU1", + "Version": "10.0.5766", + "KBList": "2617146" + }, + { + "CU": "CU2", + "Version": "10.0.5768", + "KBList": "2633143" + }, + { + "CU": "CU3", + "Version": "10.0.5770", + "KBList": "2648098" + }, + { + "CU": "CU4", + "Version": "10.0.5775", + "KBList": "2673383" + }, + { + "CU": "CU5", + "Version": "10.0.5785", + "KBList": "2696626" + }, + { + "CU": "CU6", + "Version": "10.0.5788", + "KBList": "271953" + }, + { + "CU": "CU7", + "Version": "10.0.5794", + "KBList": "2738350" + }, + { + "Version": "10.0.5826", + "KBList": "2716435" + }, + { + "CU": "CU8", + "Version": "10.0.5828", + "KBList": "2771833" + }, + { + "CU": "CU9", + "Version": "10.0.5829", + "KBList": "2799883" + }, + { + "Version": "10.0.5835", + "KBList": "2814783" + }, + { + "CU": "CU10", + "Version": "10.0.5840", + "KBList": "2834048" + }, + { + "CU": "CU11", + "Version": "10.0.5841", + "KBList": "2834048" + }, + { + "CU": "CU12", + "Version": "10.0.5844", + "KBList": "2863205" + }, + { + "CU": "CU13", + "Version": "10.0.5846", + "KBList": "2880350" + }, + { + "CU": "CU14", + "Version": "10.0.5848", + "KBList": "2893410" + }, + { + "CU": "CU15", + "Version": "10.0.5850", + "KBList": "2923520" + }, + { + "CU": "CU16", + "Version": "10.0.5852", + "KBList": "2936421" + }, + { + "CU": "CU17", + "Version": "10.0.5861", + "KBList": "2958696" + }, + { + "Version": "10.0.5867", + "KBList": "2877204" + }, + { + "Version": "10.0.5869", + "KBList": "2977322" + }, + { + "Version": "10.0.5890", + "KBList": "3045303" + }, + { + "Version": "10.0.5894", + "KBList": "3135244" + }, + { + "SP": [ + "SP4", + "LATEST" + ], + "Version": "10.0.6000", + "SupportedUntil": "2019-07-09T00:00:00", + "KBList": "2979596" + }, + { + "Version": "10.0.6241", + "KBList": "3045311" + }, + { + "Version": "10.0.6526", + "KBList": "3034373" + }, + { + "Version": "10.0.6535", + "KBList": "3045308" + }, + { + "Version": "10.0.6543", + "KBList": "3135244" + }, + { + "Version": "10.0.6547", + "KBList": "3146034" + }, + { + "Version": "10.0.6556", + "KBList": "4057114" + }, + { + "Version": "10.50.1092", + "Name": "2008R2" + }, + { + "Version": "10.50.1352" + }, + { + "SP": "RTM", + "Version": "10.50.1600", + "SupportedUntil": "2012-07-10T00:00:00" + }, + { + "Version": "10.50.1617", + "KBList": "2494088" + }, + { + "CU": "CU1", + "Version": "10.50.1702", + "KBList": "981355" + }, + { + "CU": "CU2", + "Version": "10.50.1720", + "KBList": "2072493" + }, + { + "CU": "CU3", + "Version": "10.50.1734", + "KBList": "2261464" + }, + { + "CU": "CU4", + "Version": "10.50.1746", + "KBList": "2345451" + }, + { + "CU": "CU5", + "Version": "10.50.1753", + "KBList": "2438347" + }, + { + "CU": "CU6", + "Version": "10.50.1765", + "KBList": "2489376" + }, + { + "Version": "10.50.1769", + "KBList": "2520808" + }, + { + "CU": "CU7", + "Version": "10.50.1777", + "KBList": "2507770" + }, + { + "Version": "10.50.1790", + "KBList": "2494086" + }, + { + "CU": "CU8", + "Version": "10.50.1797", + "KBList": "2534352" + }, + { + "Version": "10.50.1804", + "KBList": "2567713" + }, + { + "CU": "CU9", + "Version": "10.50.1807", + "KBList": "2591746" + }, + { + "CU": "CU10", + "Version": "10.50.1809", + "KBList": "2633145" + }, + { + "CU": "CU11", + "Version": "10.50.1810", + "KBList": "2659692" + }, + { + "CU": "CU12", + "Version": "10.50.1815", + "KBList": "2679366" + }, + { + "CU": "CU13", + "Version": "10.50.1817", + "KBList": "2703280" + }, + { + "CU": "CU14", + "Version": "10.50.2425", + "KBList": "2463333" + }, + { + "SP": "SP1", + "Version": "10.50.2500", + "SupportedUntil": "2013-10-08T00:00:00", + "KBList": "2528583" + }, + { + "Version": "10.50.2550", + "KBList": "27116440" + }, + { + "CU": "CU1", + "Version": "10.50.2769", + "KBList": "2544793" + }, + { + "CU": "CU2", + "Version": "10.50.2772", + "KBList": "2567714" + }, + { + "Version": "10.50.2776" + }, + { + "CU": "CU3", + "Version": "10.50.2789", + "KBList": "2591748" + }, + { + "CU": "CU4", + "Version": "10.50.2796", + "KBList": "2633146" + }, + { + "Version": "10.50.2799" + }, + { + "CU": "CU5", + "Version": "10.50.2806", + "KBList": "2659694" + }, + { + "Version": "10.50.2807" + }, + { + "CU": "CU6", + "Version": "10.50.2811", + "KBList": "2679367" + }, + { + "CU": "CU7", + "Version": "10.50.2817", + "KBList": "2703282" + }, + { + "CU": "CU8", + "Version": "10.50.2822", + "KBList": "2723743" + }, + { + "Version": "10.50.2861", + "KBList": "2716439" + }, + { + "CU": "CU9", + "Version": "10.50.2866", + "KBList": "2756574" + }, + { + "CU": "CU10", + "Version": "10.50.2868", + "KBList": "2783135" + }, + { + "CU": "CU11", + "Version": "10.50.2869", + "KBList": "2812683" + }, + { + "CU": "CU12", + "Version": "10.50.2874", + "KBList": "2828727" + }, + { + "CU": "CU13", + "Version": "10.50.2876", + "KBList": "2855792" + }, + { + "Version": "10.50.2881", + "KBList": "2868244" + }, + { + "Version": "10.50.3720", + "KBList": "2630455" + }, + { + "SP": "SP2", + "Version": "10.50.4000", + "SupportedUntil": "2015-10-13T00:00:00", + "KBList": "2630458" + }, + { + "Version": "10.50.4033", + "KBList": "2977320" + }, + { + "Version": "10.50.4042", + "KBList": "3045313" + }, + { + "CU": "CU1", + "Version": "10.50.4260", + "KBList": "2720425" + }, + { + "CU": "CU2", + "Version": "10.50.4263", + "KBList": "2740411" + }, + { + "CU": "CU3", + "Version": "10.50.4266", + "KBList": "2754552" + }, + { + "CU": "CU4", + "Version": "10.50.4270", + "KBList": "2777358" + }, + { + "CU": "CU5", + "Version": "10.50.4276", + "KBList": "2797460" + }, + { + "Version": "10.50.4279", + "KBList": "2830140" + }, + { + "CU": "CU6", + "Version": "10.50.4285", + "KBList": "2830140" + }, + { + "CU": "CU7", + "Version": "10.50.4286", + "KBList": "2844090" + }, + { + "CU": "CU8", + "Version": "10.50.4290", + "KBList": "2871401" + }, + { + "CU": "CU9", + "Version": "10.50.4295", + "KBList": "2887606" + }, + { + "CU": "CU10", + "Version": "10.50.4297", + "KBList": "2908087" + }, + { + "CU": "CU11", + "Version": "10.50.4302", + "KBList": "2926028" + }, + { + "CU": "CU12", + "Version": "10.50.4305", + "KBList": "2938478" + }, + { + "CU": "CU13", + "Version": "10.50.4319", + "KBList": "2967540" + }, + { + "Version": "10.50.4339", + "KBList": "3045312" + }, + { + "Version": "10.50.4343", + "KBList": "3135244" + }, + { + "SP": [ + "SP3", + "LATEST" + ], + "Version": "10.50.6000", + "SupportedUntil": "2019-07-09T00:00:00", + "KBList": "2979597" + }, + { + "Version": "10.50.6220", + "KBList": "3045316" + }, + { + "Version": "10.50.6525", + "KBList": "3033860" + }, + { + "Version": "10.50.6529", + "KBList": "3045314" + }, + { + "Version": "10.50.6537", + "KBList": "3135244" + }, + { + "Version": "10.50.6542", + "KBList": "3146034" + }, + { + "Version": "10.50.6560", + "KBList": "4057113" + }, + { + "Version": "11.0.1103", + "Name": "2012" + }, + { + "Version": "11.0.1440" + }, + { + "Version": "11.0.1750" + }, + { + "Version": "11.0.1913" + }, + { + "SP": "RTM", + "Version": "11.0.2100", + "SupportedUntil": "2014-01-14T00:00:00" + }, + { + "Version": "11.0.2214", + "KBList": "2685308" + }, + { + "Version": "11.0.2218", + "KBList": "2716442" + }, + { + "CU": "CU1", + "Version": "11.0.2316", + "KBList": "2679368" + }, + { + "CU": "CU2", + "Version": "11.0.2325", + "KBList": "2703275" + }, + { + "CU": "CU3", + "Version": "11.0.2332", + "KBList": "2723749" + }, + { + "Version": "11.0.2376", + "KBList": "2716441" + }, + { + "CU": "CU4", + "Version": "11.0.2383", + "KBList": "2758687" + }, + { + "CU": "CU5", + "Version": "11.0.2395", + "KBList": "2777772" + }, + { + "CU": "CU6", + "Version": "11.0.2401", + "KBList": "2728897" + }, + { + "CU": "CU7", + "Version": "11.0.2405", + "KBList": "2823247" + }, + { + "CU": "CU8", + "Version": "11.0.2410", + "KBList": "2844205" + }, + { + "CU": "CU9", + "Version": "11.0.2419", + "KBList": "2867319" + }, + { + "CU": "CU10", + "Version": "11.0.2420", + "KBList": "2891666" + }, + { + "CU": "CU11", + "Version": "11.0.2424", + "KBList": "2908007" + }, + { + "Version": "11.0.2809" + }, + { + "Version": "11.0.2845" + }, + { + "SP": "SP1", + "Version": "11.0.3000", + "SupportedUntil": "2015-07-14T00:00:00", + "KBList": "2674319" + }, + { + "Version": "11.0.3128", + "KBList": "2793634" + }, + { + "Version": "11.0.3153", + "KBList": "2977326" + }, + { + "Version": "11.0.3156", + "KBList": "3045318" + }, + { + "CU": "CU1", + "Version": "11.0.3321", + "KBList": "2765331" + }, + { + "Version": "11.0.3335", + "KBList": "2800050" + }, + { + "CU": "CU2", + "Version": "11.0.3339", + "KBList": "2790947" + }, + { + "CU": "CU3", + "Version": "11.0.3349", + "KBList": "2812412" + }, + { + "Version": "11.0.3350", + "KBList": "2832017" + }, + { + "CU": "CU4", + "Version": "11.0.3368", + "KBList": "2833645" + }, + { + "CU": "CU5", + "Version": "11.0.3373", + "KBList": "2861107" + }, + { + "CU": "CU6", + "Version": "11.0.3381", + "KBList": "2874879" + }, + { + "CU": "CU7", + "Version": "11.0.3393", + "KBList": "2894115" + }, + { + "CU": "CU8", + "Version": "11.0.3401", + "KBList": "2917531" + }, + { + "CU": "CU9", + "Version": "11.0.3412", + "KBList": "2931078" + }, + { + "CU": "CU10", + "Version": "11.0.3431", + "KBList": "2954099" + }, + { + "Version": "11.0.3437", + "KBList": "2969896" + }, + { + "CU": "CU11", + "Version": "11.0.3449", + "KBList": "2975396" + }, + { + "CU": "CU12", + "Version": "11.0.3460", + "KBList": "2977325" + }, + { + "CU": "CU13", + "Version": "11.0.3470", + "KBList": "2991533" + }, + { + "Version": "11.0.3482", + "KBList": "3002044" + }, + { + "CU": "CU14", + "Version": "11.0.3486", + "KBList": "3023636" + }, + { + "CU": "CU15", + "Version": "11.0.3487", + "KBList": "3038001" + }, + { + "CU": "CU16", + "Version": "11.0.3492", + "KBList": "3052476" + }, + { + "Version": "11.0.3513", + "KBList": "3045317" + }, + { + "SP": "SP2", + "Version": "11.0.5058", + "SupportedUntil": "2017-01-10T00:00:00", + "KBList": "2958429" + }, + { + "Version": "11.0.5343", + "KBList": "3045321" + }, + { + "Version": "11.0.5352", + "KBList": "3135244" + }, + { + "Version": "11.0.5388", + "KBList": "3194719" + }, + { + "Version": "11.0.5522", + "KBList": "2969896" + }, + { + "CU": "CU1", + "Version": "11.0.5532", + "KBList": "2976982" + }, + { + "CU": "CU2", + "Version": "11.0.5548", + "KBList": "2983175" + }, + { + "CU": "CU3", + "Version": "11.0.5556", + "KBList": "3002049" + }, + { + "CU": "CU4", + "Version": "11.0.5569", + "KBList": "3007556" + }, + { + "Version": "11.0.5571", + "KBList": "3034679" + }, + { + "CU": "CU5", + "Version": "11.0.5582", + "KBList": "3037255" + }, + { + "CU": "CU6", + "Version": "11.0.5592", + "KBList": "3052468" + }, + { + "Version": "11.0.5613", + "KBList": "3045319" + }, + { + "CU": "CU7", + "Version": "11.0.5623", + "KBList": "3072100" + }, + { + "Version": "11.0.5629", + "KBList": "3087872" + }, + { + "CU": "CU8", + "Version": "11.0.5634", + "KBList": "3082561" + }, + { + "Version": "11.0.5636", + "KBList": "3097636" + }, + { + "CU": "CU9", + "Version": "11.0.5641", + "KBList": "3098512" + }, + { + "CU": "CU10", + "Version": "11.0.5644", + "KBList": "3120313" + }, + { + "CU": "CU11", + "Version": "11.0.5646", + "KBList": "3137745" + }, + { + "CU": "CU12", + "Version": "11.0.5649", + "KBList": "3152637" + }, + { + "CU": "CU13", + "Version": "11.0.5655", + "KBList": "3165266" + }, + { + "CU": "CU14", + "Version": "11.0.5657", + "KBList": "3180914" + }, + { + "CU": "CU15", + "Version": "11.0.5676", + "KBList": [ + "3205416", + "3194725" + ] + }, + { + "CU": "CU16", + "Version": "11.0.5678", + "KBList": "3205054" + }, + { + "SP": "SP3", + "Version": "11.0.6020", + "SupportedUntil": "2018-10-09T00:00:00", + "KBList": "3072779" + }, + { + "Version": "11.0.6216", + "KBList": "3135244" + }, + { + "Version": "11.0.6248", + "KBList": "3194721" + }, + { + "Version": "11.0.6251", + "KBList": "4019092" + }, + { + "Version": "11.0.6260", + "KBList": "4057115" + }, + { + "CU": "CU1", + "Version": "11.0.6518", + "KBList": "3123299" + }, + { + "CU": "CU2", + "Version": "11.0.6523", + "KBList": "3137746" + }, + { + "CU": "CU3", + "Version": "11.0.6537", + "KBList": "3152635" + }, + { + "CU": "CU4", + "Version": "11.0.6540", + "KBList": "3165264" + }, + { + "CU": "CU5", + "Version": "11.0.6544", + "KBList": "3180915" + }, + { + "CU": "CU6", + "Version": "11.0.6567", + "KBList": [ + "3194992", + "3194724" + ] + }, + { + "CU": "CU7", + "Version": "11.0.6579", + "KBList": "3205051" + }, + { + "CU": "CU8", + "Version": "11.0.6594", + "KBList": "4013104" + }, + { + "CU": "CU9", + "Version": "11.0.6598", + "KBList": "4016762" + }, + { + "CU": "CU10", + "Version": "11.0.6607", + "KBList": [ + "4025925", + "4019090" + ] + }, + { + "Version": "11.0.6615", + "KBList": "4057121" + }, + { + "SP": [ + "SP4", + "LATEST" + ], + "SupportedUntil": "2022-07-12T00:00:00", + "Version": "11.0.7001", + "KBList": "4018073" + }, + { + "Version": "11.0.7462", + "KBList": "4057116" + }, + { + "Version": "11.0.7469", + "KBList": "4091266" + }, + { + "Version": "12.0.1524", + "Name": "2014" + }, + { + "SP": "RTM", + "Version": "12.0.2000", + "SupportedUntil": "2016-07-12T00:00:00" + }, + { + "Version": "12.0.2254", + "KBList": "2977315" + }, + { + "Version": "12.0.2269", + "KBList": "3045324" + }, + { + "Version": "12.0.2271" + }, + { + "CU": "CU1", + "Version": "12.0.2342", + "KBList": "2931693" + }, + { + "CU": "CU2", + "Version": "12.0.2370", + "KBList": "2967546" + }, + { + "Version": "12.0.2381", + "KBList": "2977316" + }, + { + "CU": "CU3", + "Version": "12.0.2402", + "KBList": "2984923" + }, + { + "Version": "12.0.2405", + "KBList": "2999809" + }, + { + "Version": "12.0.2423", + "KBList": "3007050" + }, + { + "CU": "CU4", + "Version": "12.0.2430", + "KBList": "2999197" + }, + { + "Version": "12.0.2436", + "KBList": "3014867" + }, + { + "CU": "CU5", + "Version": "12.0.2456", + "KBList": "3011055" + }, + { + "Version": "12.0.2464", + "KBList": "3024815" + }, + { + "Version": "12.0.2472", + "KBList": "3032087" + }, + { + "Version": "12.0.2474", + "KBList": "3034679" + }, + { + "CU": "CU6", + "Version": "12.0.2480", + "KBList": "3031047" + }, + { + "Version": "12.0.2485", + "KBList": "3043788" + }, + { + "Version": "12.0.2488", + "KBList": "3048751" + }, + { + "CU": "CU7", + "Version": "12.0.2495", + "KBList": "3046038" + }, + { + "Version": "12.0.2504", + "KBList": [ + "3058512", + "2999809" + ] + }, + { + "Version": "12.0.2505", + "KBList": "3052167" + }, + { + "Version": "12.0.2506", + "KBList": "3063054" + }, + { + "CU": "CU8", + "Version": "12.0.2546", + "KBList": "3067836" + }, + { + "Version": "12.0.2548", + "KBList": "3045323" + }, + { + "CU": "CU9", + "Version": "12.0.2553", + "KBList": "3075949" + }, + { + "CU": "CU10", + "Version": "12.0.2556", + "KBList": "3094220" + }, + { + "CU": "CU11", + "Version": "12.0.2560", + "KBList": "3106659" + }, + { + "CU": "CU12", + "Version": "12.0.2564", + "KBList": "3130923" + }, + { + "CU": "CU13", + "Version": "12.0.2568", + "KBList": "3144517" + }, + { + "CU": "CU14", + "Version": "12.0.2569", + "KBList": "3158271" + }, + { + "SP": "SP1", + "Version": "12.0.4100", + "SupportedUntil": "2017-10-10T00:00:00", + "KBList": "3058865" + }, + { + "Version": "12.0.4213", + "KBList": "3070446" + }, + { + "Version": "12.0.4219" + }, + { + "Version": "12.0.4232", + "KBList": "3194720" + }, + { + "Version": "12.0.4237", + "KBList": "4019091" + }, + { + "CU": "CU1", + "Version": "12.0.4416", + "KBList": "3067839" + }, + { + "Version": "12.0.4419", + "KBList": "3078973" + }, + { + "CU": "CU2", + "Version": "12.0.4422", + "KBList": "3075950" + }, + { + "CU": "CU3", + "Version": "12.0.4427", + "KBList": "3094221" + }, + { + "Version": "12.0.4432", + "KBList": [ + "3097972", + "319472" + ] + }, + { + "Version": "12.0.4433", + "KBList": "3119148" + }, + { + "CU": "CU4", + "Version": "12.0.4436", + "KBList": "3106660" + }, + { + "Version": "12.0.4437", + "KBList": "3130999" + }, + { + "CU": "CU5", + "Version": "12.0.4439", + "KBList": "3130926" + }, + { + "Version": "12.0.4449", + "KBList": "3144524" + }, + { + "CU": "CU6", + "Version": "12.0.4457", + "KBList": "3167392" + }, + { + "CU": "CU7", + "Version": "12.0.4459", + "KBList": "3162659" + }, + { + "Version": "12.0.4463", + "KBList": "3174370" + }, + { + "CU": "CU8", + "Version": "12.0.4468", + "KBList": "917606" + }, + { + "CU": "CU9", + "Version": "12.0.4474", + "KBList": "3186964" + }, + { + "Version": "12.0.4487", + "KBList": "3194722" + }, + { + "CU": "CU10", + "Version": "12.0.4491", + "KBList": "3204399" + }, + { + "Version": "12.0.4502", + "CU": "CU11", + "KBList": "4010392" + }, + { + "Version": "12.0.4511", + "CU": "CU12", + "KBList": "4017793" + }, + { + "Version": "12.0.4522", + "CU": "CU13", + "KBList": [ + "4019099", + "4032542" + ] + }, + { + "SP": "SP2", + "Version": "12.0.5000", + "SupportedUntil": "2020-01-14T00:00:00", + "KBList": "3171021" + }, + { + "Version": "12.0.5203", + "KBList": "3194714" + }, + { + "Version": "12.0.5207", + "KBList": "4019093" + }, + { + "Version": "12.0.5214", + "KBList": "4057120" + }, + { + "CU": "CU1", + "Version": "12.0.5511", + "KBList": "3178925" + }, + { + "CU": "CU2", + "Version": "12.0.5522", + "KBList": "3188778" + }, + { + "Version": "12.0.5532", + "KBList": "3194718" + }, + { + "CU": "CU3", + "Version": "12.0.5538", + "KBList": "3204388" + }, + { + "CU": "CU4", + "Version": "12.0.5540", + "KBList": "4010394" + }, + { + "CU": "CU5", + "Version": "12.0.5546", + "KBList": "4013098" + }, + { + "Version": "12.0.5553", + "CU": "CU6", + "KBList": [ + "4019094", + "4036996" + ] + }, + { + "CU": "CU7", + "Version": "12.0.5556", + "KBList": "4032541" + }, + { + "CU": "CU8", + "Version": "12.0.5557", + "KBList": "4037356" + }, + { + "CU": "CU9", + "Version": "12.0.5563", + "KBList": "4055557" + }, + { + "CU": "CU10", + "Version": "12.0.5571", + "KBList": "4052725" + }, + { + "CU": "CU11", + "Version": "12.0.5579", + "KBList": "4077063" + }, + { + "CU": "CU12", + "Version": "12.0.5589", + "KBList": "4130489" + }, + { + "CU": "CU13", + "Version": "12.0.5590", + "KBList": "4456287" + }, + { + "CU": "CU14", + "Version": "12.0.5600", + "KBList": "4459860" + }, + { + "CU": "CU15", + "Version": "12.0.5605", + "KBList": "4469137" + }, + { + "CU": "CU16", + "Version": "12.0.5626", + "KBList": "4482967" + }, + { + "SP": [ + "SP3", + "LATEST" + ], + "Version": "12.0.6024", + "SupportedUntil": "2019-09-07T00:00:00", + "KBList": "4022619" + }, + { + "CU": "CU1", + "Version": "12.0.6205", + "KBList": "4470220" + }, + { + "CU": "CU2", + "Version": "12.0.6214", + "KBList": "4482960" + }, + { + "Version": "13.0.200", + "Name": "2016" + }, + { + "Version": "13.0.300" + }, + { + "Version": "13.0.407" + }, + { + "Version": "13.0.500" + }, + { + "Version": "13.0.600" + }, + { + "Version": "13.0.700" + }, + { + "Version": "13.0.800" + }, + { + "Version": "13.0.900" + }, + { + "Version": "13.0.1000" + }, + { + "Version": "13.0.1100" + }, + { + "Version": "13.0.1200" + }, + { + "Version": "13.0.1250" + }, + { + "Version": "13.0.1300" + }, + { + "Version": "13.0.1400" + }, + { + "SP": "RTM", + "Version": "13.0.1601", + "SupportedUntil": "2018-01-09T00:00:00" + }, + { + "Version": "13.0.1708", + "KBList": "3164398" + }, + { + "Version": "13.0.1722", + "KBList": "3194716" + }, + { + "Version": "13.0.1728", + "KBList": "3210111" + }, + { + "Version": "13.0.1742", + "KBList": "4019088" + }, + { + "Version": "13.0.1745", + "KBList": "4058560" + }, + { + "CU": "CU1", + "Version": "13.0.2149", + "KBList": "3164674" + }, + { + "CU": "CU2", + "Version": "13.0.2164", + "KBList": "3182270" + }, + { + "Version": "13.0.2169", + "KBList": "3195813" + }, + { + "Version": "13.0.2170", + "KBList": "3199171" + }, + { + "CU": "CU3", + "Version": "13.0.2186", + "KBList": [ + "3205413", + "3194717" + ] + }, + { + "Version": "13.0.2190", + "KBList": "3210110" + }, + { + "CU": "CU4", + "Version": "13.0.2193", + "KBList": "3205052" + }, + { + "CU": "CU5", + "Version": "13.0.2197", + "KBList": "4013105" + }, + { + "CU": "CU6", + "Version": "13.0.2204", + "KBList": "4019914" + }, + { + "Version": "13.0.2210", + "CU": "CU7", + "KBList": [ + "4024304", + "4019086" + ] + }, + { + "CU": "CU8", + "Version": "13.0.2213", + "KBList": "4040713" + }, + { + "CU": "CU9", + "Version": "13.0.2216", + "KBList": "4037357" + }, + { + "Version": "13.0.2218", + "KBList": "4058559" + }, + { + "SP": "SP1", + "Version": "13.0.4001", + "SupportedUntil": "2019-09-07T00:00:00", + "KBList": "3182545" + }, + { + "Version": "13.0.4199", + "KBList": "3207512" + }, + { + "Version": "13.0.4202", + "KBList": "3210089" + }, + { + "Version": "13.0.4206", + "KBList": "4019089" + }, + { + "Version": "13.0.4210", + "KBList": "4057118" + }, + { + "Version": "13.0.4224", + "KBList": "4458842" + }, + { + "CU": "CU1", + "Version": "13.0.4411", + "KBList": "3208177" + }, + { + "CU": "CU2", + "Version": "13.0.4422", + "KBList": "4013106" + }, + { + "CU": "CU3", + "Version": "13.0.4435", + "KBList": "4019916" + }, + { + "Version": "13.0.4446", + "CU": "CU4", + "KBList": [ + "4024305", + "4019095" + ] + }, + { + "CU": "CU5", + "Version": "13.0.4451", + "KBList": "4040714" + }, + { + "CU": "CU6", + "Version": "13.0.4457", + "KBList": "4037354" + }, + { + "CU": "CU7", + "Version": "13.0.4466", + "KBList": "4057119" + }, + { + "CU": "CU8", + "Version": "13.0.4474", + "KBList": "4077064" + }, + { + "CU": "CU9", + "Version": "13.0.4502", + "KBList": "4100997" + }, + { + "CU": "CU10", + "Version": "13.0.4514", + "KBList": "4341569" + }, + { + "Version": "13.0.4522", + "KBList": "4293808" + }, + { + "CU": "CU11", + "Version": "13.0.4528", + "KBList": "4459676" + }, + { + "CU": "CU12", + "Version": "13.0.4541", + "KBList": "4464343" + }, + { + "CU": "CU13", + "Version": "13.0.4550", + "KBList": "4475775" + }, + { + "SP": [ + "SP2", + "LATEST" + ], + "Version": "13.0.5026", + "SupportedUntil": "2026-07-14T00:00:00", + "KBList": "4052908" + }, + { + "Version": "13.0.5081", + "KBList": "4293802" + }, + { + "CU": "CU1", + "Version": "13.0.5149", + "KBList": "4135048" + }, + { + "CU": "CU2", + "Version": "13.0.5153", + "KBList": "4340355" + }, + { + "Version": "13.0.5161", + "KBList": "4293807" + }, + { + "Version": "13.0.5201", + "KBList": "4458621" + }, + { + "CU": "CU3", + "Version": "13.0.5216", + "KBList": "4458871" + }, + { + "CU": "CU4", + "Version": "13.0.5233", + "KBList": "4464106" + }, + { + "CU": "CU5", + "Version": "13.0.5264", + "KBList": "4475776" + }, + { + "Version": "14.0.1", + "Name": "2017" + }, + { + "Version": "14.0.100" + }, + { + "Version": "14.0.200" + }, + { + "Version": "14.0.304" + }, + { + "Version": "14.0.405" + }, + { + "Version": "14.0.500" + }, + { + "Version": "14.0.600" + }, + { + "Version": "14.0.800" + }, + { + "Version": "14.0.900" + }, + { + "SP": [ + "RTM", + "LATEST" + ], + "Version": "14.0.1000", + "SupportedUntil": "2027-10-12T00:00:00" + }, + { + "Version": "14.0.2000", + "KBList": "4057122" + }, + { + "Version": "14.0.2002", + "KBList": "4293803" + }, + { + "CU": "CU1", + "Version": "14.0.3006", + "KBList": "4038634" + }, + { + "CU": "CU2", + "Version": "14.0.3008", + "KBList": "4052574" + }, + { + "CU": "CU3", + "Version": "14.0.3015", + "KBList": "4052987" + }, + { + "CU": "CU4", + "Version": "14.0.3022", + "KBList": "4056498" + }, + { + "CU": "CU5", + "Version": "14.0.3023", + "KBList": "4092643" + }, + { + "CU": "CU6", + "Version": "14.0.3025", + "KBList": "4101464" + }, + { + "CU": "CU7", + "Version": "14.0.3026", + "KBList": "4229789" + }, + { + "CU": "CU8", + "Version": "14.0.3029", + "KBList": "4338363" + }, + { + "CU": "CU9", + "Version": "14.0.3030", + "KBList": "4341265" + }, + { + "Version": "14.0.3035", + "KBList": "4293805" + }, + { + "CU": "CU10", + "Version": "14.0.3037", + "KBList": "4293805" + }, + { + "CU": "CU11", + "Version": "14.0.3038", + "KBList": "4462262" + }, + { + "CU": "CU12", + "Version": "14.0.3045", + "KBList": "4464082" + }, + { + "CU": "CU13", + "Version": "14.0.3048", + "KBList": "4466404" + } ] -} +} \ No newline at end of file diff --git a/bin/dbatools-index.json b/bin/dbatools-index.json index 235c49d5a1..0e44708d7b 100644 --- a/bin/dbatools-index.json +++ b/bin/dbatools-index.json @@ -1,12 +1,19 @@ [ { - "CommandName": "Add-DbaAgDatabase", + "Name": "Add-DbaAgDatabase", "Description": "Adds a database to an availability group on a SQL Server instance.\n\nBefore joining the replica databases to the availablity group, the databases will be initialized with automatic seeding or full/log backup.", "Tags": [ "AvailabilityGroup", "HA", "AG" ], + "Synopsis": "Adds a database to an availability group on a SQL Server instance.", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Add-DbaAgDatabase", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Add-DbaAgDatabase", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eAdd-DbaAgDatabase -SqlInstance sql2017a -AvailabilityGroup ag1 -Database db1, db2 -Confirm\nAdds db1 and db2 to ag1 on sql2017a. Prompts for confirmation.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaDatabase -SqlInstance sql2017a | Out-GridView -Passthru | Add-DbaAgDatabase -AvailabilityGroup ag1\nAdds selected databases from sql2017a to ag1\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaDbSharePoint -SqlInstance sqlcluster | Add-DbaAgDatabase -AvailabilityGroup SharePoint\nAdds SharePoint databases as found in SharePoint_Config on sqlcluster to ag1 on sqlcluster\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaDbSharePoint -SqlInstance sqlcluster -ConfigDatabase SharePoint_Config_2019 | Add-DbaAgDatabase -AvailabilityGroup SharePoint\nAdds SharePoint databases as found in SharePoint_Config_2019 on sqlcluster to ag1 on sqlcluster", "Params": [ [ "SqlInstance", @@ -113,22 +120,23 @@ "" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Adds a database to an availability group on a SQL Server instance.", - "Name": "Add-DbaAgDatabase", - "Links": "https://dbatools.io/Add-DbaAgDatabase", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eAdd-DbaAgDatabase -SqlInstance sql2017a -AvailabilityGroup ag1 -Database db1, db2 -Confirm\nAdds db1 and db2 to ag1 on sql2017a. Prompts for confirmation.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaDatabase -SqlInstance sql2017a | Out-GridView -Passthru | Add-DbaAgDatabase -AvailabilityGroup ag1\nAdds selected databases from sql2017a to ag1\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaDbSharePoint -SqlInstance sqlcluster | Add-DbaAgDatabase -AvailabilityGroup SharePoint\nAdds SharePoint databases as found in SharePoint_Config on sqlcluster to ag1 on sqlcluster\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaDbSharePoint -SqlInstance sqlcluster -ConfigDatabase SharePoint_Config_2019 | Add-DbaAgDatabase -AvailabilityGroup SharePoint\nAdds SharePoint databases as found in SharePoint_Config_2019 on sqlcluster to ag1 on sqlcluster", "Syntax": "Add-DbaAgDatabase [[-SqlInstance] \u003cDbaInstanceParameter[]\u003e] [[-SqlCredential] \u003cPSCredential\u003e] [-AvailabilityGroup] \u003cString\u003e [[-Database] \u003cString[]\u003e] [[-Secondary] \u003cDbaInstanceParameter[]\u003e] [[-SecondarySqlCredential] \u003cPSCredential\u003e] [[-InputObject] \u003cDatabase[]\u003e] [[-SeedingMode] \u003cString\u003e] [[-SharedPath] \u003cString\u003e] [-UseLastBackup] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Add-DbaAgListener", + "Name": "Add-DbaAgListener", "Description": "Adds a listener to an availability group on a SQL Server instance.", "Tags": [ "AvailabilityGroup", "HA", "AG" ], + "Synopsis": "Adds a listener to an availability group on a SQL Server instance.", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Add-DbaAgListener", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Add-DbaAgListener", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eAdd-DbaAgListener -SqlInstance sql2017 -AvailabilityGroup SharePoint -IPAddress 10.0.20.20\nCreates a listener on 10.0.20.20 port 1433 for the SharePoint availability group on sql2017.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaAvailabilityGroup -SqlInstance sql2017 -AvailabilityGroup availabilitygroup1 | Add-DbaAgListener -Dhcp\nCreates a listener on port 1433 with a dynamic IP for the group1 availability group on sql2017.", "Params": [ [ "SqlInstance", @@ -227,22 +235,23 @@ "" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Adds a listener to an availability group on a SQL Server instance.", - "Name": "Add-DbaAgListener", - "Links": "https://dbatools.io/Add-DbaAgListener", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eAdd-DbaAgListener -SqlInstance sql2017 -AvailabilityGroup SharePoint -IPAddress 10.0.20.20\nCreates a listener on 10.0.20.20 port 1433 for the SharePoint availability group on sql2017.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaAvailabilityGroup -SqlInstance sql2017 -AvailabilityGroup availabilitygroup1 | Add-DbaAgListener -Dhcp\nCreates a listener on port 1433 with a dynamic IP for the group1 availability group on sql2017.", "Syntax": "Add-DbaAgListener [[-SqlInstance] \u003cDbaInstanceParameter[]\u003e] [[-SqlCredential] \u003cPSCredential\u003e] [[-AvailabilityGroup] \u003cString[]\u003e] [[-IPAddress] \u003cIPAddress\u003e] [[-SubnetMask] \u003cIPAddress\u003e] [[-Port] \u003cInt32\u003e] [-Dhcp] [-Passthru] [[-InputObject] \u003cAvailabilityGroup[]\u003e] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Add-DbaAgReplica", + "Name": "Add-DbaAgReplica", "Description": "Adds a replica to an availability group on a SQL Server instance.\n\nAutomatically creates a database mirroring endpoint if required.", "Tags": [ "AvailabilityGroup", "HA", "AG" ], + "Synopsis": "Adds a replica to an availability group on a SQL Server instance.", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Add-DbaAgReplica", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Add-DbaAgReplica", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaAvailabilityGroup -SqlInstance sql2017a -AvailabilityGroup SharePoint | Add-DbaAgReplica -SqlInstance sql2017b\nAdds sql2017b to the SharePoint availability group on sql2017a\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaAvailabilityGroup -SqlInstance sql2017a -AvailabilityGroup SharePoint | Add-DbaAgReplica -SqlInstance sql2017b -FailoverMode Manual\nAdds sql2017b to the SharePoint availability group on sql2017a with a manual failover mode.", "Params": [ [ "SqlInstance", @@ -260,14 +269,6 @@ "false", "" ], - [ - "AvailabilityGroup", - "The Availability Group to which a replica will be bestowed upon.", - "", - false, - "false", - "" - ], [ "Name", "The name of the replica. Defaults to the SQL Server instance name.", @@ -360,7 +361,7 @@ "InputObject", "Enables piping from Get-DbaAvailabilityGroup.", "", - false, + true, "true (ByValue)", "" ], @@ -389,21 +390,22 @@ "" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Adds a replica to an availability group on a SQL Server instance.", - "Name": "Add-DbaAgReplica", - "Links": "https://dbatools.io/Add-DbaAgReplica", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaAvailabilityGroup -SqlInstance sql2017a -AvailabilityGroup SharePoint | Add-DbaAgReplica -SqlInstance sql2017b\nAdds sql2017b to the SharePoint availability group on sql2017a\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaAvailabilityGroup -SqlInstance sql2017a -AvailabilityGroup SharePoint | Add-DbaAgReplica -SqlInstance sql2017b -FailoverMode Manual\nAdds sql2017b to the SharePoint availability group on sql2017a with a manual failover mode.", - "Syntax": "Add-DbaAgReplica [[-SqlInstance] \u003cDbaInstanceParameter[]\u003e] [[-SqlCredential] \u003cPSCredential\u003e] [[-AvailabilityGroup] \u003cString\u003e] [[-Name] \u003cString\u003e] [[-AvailabilityMode] \u003cString\u003e] [[-FailoverMode] \u003cString\u003e] [[-BackupPriority] \u003cInt32\u003e] [[-ConnectionModeInPrimaryRole] \u003cString\u003e] [[-ConnectionModeInSecondaryRole] \u003cString\u003e] [[-SeedingMode] \u003cString\u003e] [[-Endpoint] \u003cString\u003e] [-Passthru] [[-ReadonlyRoutingConnectionUrl] \u003cString\u003e] [[-Certificate] \u003cString\u003e] [[-InputObject] \u003cAvailabilityGroup\u003e] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" + "Syntax": "Add-DbaAgReplica [[-SqlInstance] \u003cDbaInstanceParameter[]\u003e] [[-SqlCredential] \u003cPSCredential\u003e] [[-Name] \u003cString\u003e] [[-AvailabilityMode] \u003cString\u003e] [[-FailoverMode] \u003cString\u003e] [[-BackupPriority] \u003cInt32\u003e] [[-ConnectionModeInPrimaryRole] \u003cString\u003e] [[-ConnectionModeInSecondaryRole] \u003cString\u003e] [[-SeedingMode] \u003cString\u003e] [[-Endpoint] \u003cString\u003e] [-Passthru] [[-ReadonlyRoutingConnectionUrl] \u003cString\u003e] [[-Certificate] \u003cString\u003e] [-InputObject] \u003cAvailabilityGroup\u003e [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Add-DbaCmsRegServer", + "Name": "Add-DbaCmsRegServer", "Description": "Adds registered servers to SQL Server Central Management Server (CMS). If you need more flexiblity, look into Import-DbaCmsRegServer which\naccepts multiple kinds of input and allows you to add reg servers from different CMSes.", "Tags": [ "RegisteredServer", "CMS" ], + "Synopsis": "Adds registered servers to SQL Server Central Management Server (CMS)", + "Alias": "Add-DbaRegisteredServer", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Add-DbaCmsRegServer", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Add-DbaCmsRegServer", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eAdd-DbaCmsRegServer -SqlInstance sql2008 -ServerName sql01\nCreates a registered server on sql2008\u0027s CMS which points to the SQL Server, sql01. When scrolling in CMS, the name \"sql01\" will be visible.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eAdd-DbaCmsRegServer -SqlInstance sql2008 -ServerName sql01 -Name \"The 2008 Clustered Instance\" -Description \"HR\u0027s Dedicated SharePoint instance\"\nCreates a registered server on sql2008\u0027s CMS which points to the SQL Server, sql01. When scrolling in CMS, \"The 2008 Clustered Instance\" will be visible.\r\nClearly this is hard to explain ;)\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eAdd-DbaCmsRegServer -SqlInstance sql2008 -ServerName sql01 -Group hr\\Seattle\nCreates a registered server on sql2008\u0027s CMS which points to the SQL Server, sql01. When scrolling in CMS, the name \"sql01\" will be visible within the Seattle group which is in the hr group.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaCmsRegServerGroup -SqlInstance sql2008 -Group hr\\Seattle | Add-DbaCmsRegServer -ServerName sql01111\nCreates a registered server on sql2008\u0027s CMS which points to the SQL Server, sql01. When scrolling in CMS, the name \"sql01\" will be visible within the Seattle group which is in the hr group.", "Params": [ [ "SqlInstance", @@ -486,21 +488,22 @@ "" ] ], - "Alias": "Add-DbaRegisteredServer", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Adds registered servers to SQL Server Central Management Server (CMS)", - "Name": "Add-DbaCmsRegServer", - "Links": "https://dbatools.io/Add-DbaCmsRegServer", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eAdd-DbaCmsRegServer -SqlInstance sql2008 -ServerName sql01\nCreates a registered server on sql2008\u0027s CMS which points to the SQL Server, sql01. When scrolling in CMS, the name \"sql01\" will be visible.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eAdd-DbaCmsRegServer -SqlInstance sql2008 -ServerName sql01 -Name \"The 2008 Clustered Instance\" -Description \"HR\u0027s Dedicated SharePoint instance\"\nCreates a registered server on sql2008\u0027s CMS which points to the SQL Server, sql01. When scrolling in CMS, \"The 2008 Clustered Instance\" will be visible.\r\nClearly this is hard to explain ;)\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eAdd-DbaCmsRegServer -SqlInstance sql2008 -ServerName sql01 -Group hr\\Seattle\nCreates a registered server on sql2008\u0027s CMS which points to the SQL Server, sql01. When scrolling in CMS, the name \"sql01\" will be visible within the Seattle group which is in the hr group.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaCmsRegServerGroup -SqlInstance sql2008 -Group hr\\Seattle | Add-DbaCmsRegServer -ServerName sql01111\nCreates a registered server on sql2008\u0027s CMS which points to the SQL Server, sql01. When scrolling in CMS, the name \"sql01\" will be visible within the Seattle group which is in the hr group.", "Syntax": "Add-DbaCmsRegServer [[-SqlInstance] \u003cDbaInstanceParameter[]\u003e] [[-SqlCredential] \u003cPSCredential\u003e] [-ServerName] \u003cString\u003e [[-Name] \u003cString\u003e] [[-Description] \u003cString\u003e] [[-Group] \u003cObject\u003e] [[-InputObject] \u003cServerGroup[]\u003e] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Add-DbaCmsRegServerGroup", + "Name": "Add-DbaCmsRegServerGroup", "Description": "Adds registered server groups to SQL Server Central Management Server (CMS). If you need more flexibility, look into Import-DbaCmsRegServer which accepts multiple kinds of input and allows you to add reg servers and groups from different CMS.", "Tags": [ "RegisteredServer", "CMS" ], + "Synopsis": "Adds registered server groups to SQL Server Central Management Server (CMS)", + "Alias": "Add-DbaRegisteredServerGroup", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Add-DbaCmsRegServerGroup", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Add-DbaCmsRegServerGroup", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eAdd-DbaCmsRegServerGroup -SqlInstance sql2012 -Name HR\nCreates a registered server group called HR, in the root of sql2012\u0027s CMS\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eAdd-DbaCmsRegServerGroup -SqlInstance sql2012, sql2014 -Name sub-folder -Group HR\nCreates a registered server group on sql2012 and sql2014 called sub-folder within the HR group\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaCmsRegServerGroup -SqlInstance sql2012, sql2014 -Group HR | Add-DbaCmsRegServerGroup -Name sub-folder\nCreates a registered server group on sql2012 and sql2014 called sub-folder within the HR group of each server", "Params": [ [ "SqlInstance", @@ -575,18 +578,19 @@ "" ] ], - "Alias": "Add-DbaRegisteredServerGroup", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Adds registered server groups to SQL Server Central Management Server (CMS)", - "Name": "Add-DbaCmsRegServerGroup", - "Links": "https://dbatools.io/Add-DbaCmsRegServerGroup", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eAdd-DbaCmsRegServerGroup -SqlInstance sql2012 -Name HR\nCreates a registered server group called HR, in the root of sql2012\u0027s CMS\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eAdd-DbaCmsRegServerGroup -SqlInstance sql2012, sql2014 -Name sub-folder -Group HR\nCreates a registered server group on sql2012 and sql2014 called sub-folder within the HR group\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaCmsRegServerGroup -SqlInstance sql2012, sql2014 -Group HR | Add-DbaCmsRegServerGroup -Name sub-folder\nCreates a registered server group on sql2012 and sql2014 called sub-folder within the HR group of each server", "Syntax": "Add-DbaCmsRegServerGroup [[-SqlInstance] \u003cDbaInstanceParameter[]\u003e] [[-SqlCredential] \u003cPSCredential\u003e] [-Name] \u003cString\u003e [[-Description] \u003cString\u003e] [[-Group] \u003cString\u003e] [[-InputObject] \u003cServerGroup[]\u003e] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Add-DbaComputerCertificate", + "Name": "Add-DbaComputerCertificate", "Description": "Adds a computer certificate from a local or remote computer.", "Tags": "Certificate", + "Synopsis": "Adds a computer certificate - useful for older systems.", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Add-DbaComputerCertificate", + "Availability": "Windows only", + "Links": null, + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eAdd-DbaComputerCertificate -ComputerName Server1 -Path C:\\temp\\cert.cer\nAdds the local C:\\temp\\cert.cer to the remote server Server1 in LocalMachine\\My (Personal).\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eAdd-DbaComputerCertificate -Path C:\\temp\\cert.cer\nAdds the local C:\\temp\\cert.cer to the local computer\u0027s LocalMachine\\My (Personal) certificate store.", "Params": [ [ "ComputerName", @@ -669,21 +673,22 @@ "" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Adds a computer certificate - useful for older systems.", - "Name": "Add-DbaComputerCertificate", - "Links": null, - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eAdd-DbaComputerCertificate -ComputerName Server1 -Path C:\\temp\\cert.cer\nAdds the local C:\\temp\\cert.cer to the remote server Server1 in LocalMachine\\My (Personal).\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eAdd-DbaComputerCertificate -Path C:\\temp\\cert.cer\nAdds the local C:\\temp\\cert.cer to the local computer\u0027s LocalMachine\\My (Personal) certificate store.", "Syntax": "Add-DbaComputerCertificate [[-ComputerName] \u003cDbaInstanceParameter[]\u003e] [[-Credential] \u003cPSCredential\u003e] [[-SecurePassword] \u003cSecureString\u003e] [[-Certificate] \u003cX509Certificate2[]\u003e] [[-Path] \u003cString\u003e] [[-Store] \u003cString\u003e] [[-Folder] \u003cString\u003e] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Add-DbaDbMirrorMonitor", + "Name": "Add-DbaDbMirrorMonitor", "Description": "Creates a database mirroring monitor job that periodically updates the mirroring status for every mirrored database on the server instance.\n\nBasically executes sp_dbmmonitoraddmonitoring.", "Tags": [ "Mirror", "HA" ], + "Synopsis": "Creates a database mirroring monitor job that periodically updates the mirroring status for every mirrored database on the server instance.", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Add-DbaDbMirrorMonitor", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Add-DbaDbMirrorMonitor", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eAdd-DbaDbMirrorMonitor -SqlInstance sql2008, sql2012\nCreates a database mirroring monitor job that periodically updates the mirroring status for every mirrored database on sql2008 and sql2012.", "Params": [ [ "SqlInstance", @@ -726,18 +731,19 @@ "" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Creates a database mirroring monitor job that periodically updates the mirroring status for every mirrored database on the server instance.", - "Name": "Add-DbaDbMirrorMonitor", - "Links": "https://dbatools.io/Add-DbaDbMirrorMonitor", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eAdd-DbaDbMirrorMonitor -SqlInstance sql2008, sql2012\nCreates a database mirroring monitor job that periodically updates the mirroring status for every mirrored database on sql2008 and sql2012.", "Syntax": "Add-DbaDbMirrorMonitor [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Add-DbaPfDataCollectorCounter", + "Name": "Add-DbaPfDataCollectorCounter", "Description": "Adds a Performance Data Collector Counter.", "Tags": "PerfMon", + "Synopsis": "Adds a Performance Data Collector Counter.", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Add-DbaPfDataCollectorCounter", + "Availability": "Windows only", + "Links": "https://dbatools.io/Add-DbaPfDataCollectorCounter", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eAdd-DbaPfDataCollectorCounter -ComputerName sql2017 -CollectorSet \u0027System Correlation\u0027 -Collector DataCollector01 -Counter \u0027\\LogicalDisk(*)\\Avg. Disk Queue Length\u0027\nAdds the \u0027\\LogicalDisk(*)\\Avg. Disk Queue Length\u0027 counter within the DataCollector01 collector within the System Correlation collector set on sql2017.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaPfDataCollector | Out-GridView -PassThru | Add-DbaPfDataCollectorCounter -Counter \u0027\\LogicalDisk(*)\\Avg. Disk Queue Length\u0027 -Confirm\nAllows you to select which Data Collector you\u0027d like to add the counter \u0027\\LogicalDisk(*)\\Avg. Disk Queue Length\u0027 on localhost and prompts for confirmation.", "Params": [ [ "ComputerName", @@ -812,22 +818,23 @@ "" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Adds a Performance Data Collector Counter.", - "Name": "Add-DbaPfDataCollectorCounter", - "Links": "https://dbatools.io/Add-DbaPfDataCollectorCounter", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eAdd-DbaPfDataCollectorCounter -ComputerName sql2017 -CollectorSet \u0027System Correlation\u0027 -Collector DataCollector01 -Counter \u0027\\LogicalDisk(*)\\Avg. Disk Queue Length\u0027\nAdds the \u0027\\LogicalDisk(*)\\Avg. Disk Queue Length\u0027 counter within the DataCollector01 collector within the System Correlation collector set on sql2017.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaPfDataCollector | Out-GridView -PassThru | Add-DbaPfDataCollectorCounter -Counter \u0027\\LogicalDisk(*)\\Avg. Disk Queue Length\u0027 -Confirm\nAllows you to select which Data Collector you\u0027d like to add the counter \u0027\\LogicalDisk(*)\\Avg. Disk Queue Length\u0027 on localhost and prompts for confirmation.", "Syntax": "Add-DbaPfDataCollectorCounter [[-ComputerName] \u003cDbaInstanceParameter[]\u003e] [[-Credential] \u003cPSCredential\u003e] [[-CollectorSet] \u003cString[]\u003e] [[-Collector] \u003cString[]\u003e] [-Counter] \u003cObject[]\u003e [[-InputObject] \u003cObject[]\u003e] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Backup-DbaDatabase", + "Name": "Backup-DbaDatabase", "Description": "Performs a backup of a specified type of 1 or more databases on a single SQL Server Instance. These backups may be Full, Differential or Transaction log backups.", "Tags": [ "DisasterRecovery", "Backup", "Restore" ], + "Synopsis": "Backup one or more SQL Sever databases from a single SQL Server SqlInstance.", + "Alias": "", + "Author": "Stuart Moore (@napalmgram), stuart-moore.com", + "CommandName": "Backup-DbaDatabase", + "Availability": "Windows, Linux, macOS", + "Links": null, + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eBackup-DbaDatabase -SqlInstance Server1 -Database HR, Finance\nThis will perform a full database backup on the databases HR and Finance on SQL Server Instance Server1 to Server1 default backup directory.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eBackup-DbaDatabase -SqlInstance sql2016 -BackupDirectory C:\\temp -Database AdventureWorks2014 -Type Full\nBacks up AdventureWorks2014 to sql2016 C:\\temp folder.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eBackup-DbaDatabase -SqlInstance sql2016 -AzureBaseUrl https://dbatoolsaz.blob.core.windows.net/azbackups/ -AzureCredential dbatoolscred -Type Full -CreateFolder\nPerforms a full backup of all databases on the sql2016 instance to their own containers under the https://dbatoolsaz.blob.core.windows.net/azbackups/ container on Azure blog storage using the sql \r\ncredential \"dbatoolscred\" registered on the sql2016 instance.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eBackup-DbaDatabase -SqlInstance sql2016 -AzureBaseUrl https://dbatoolsaz.blob.core.windows.net/azbackups/ -Type Full\nPerforms a full backup of all databases on the sql2016 instance to the https://dbatoolsaz.blob.core.windows.net/azbackups/ container on Azure blog storage using the Shared Access Signature sql \r\ncredential \"https://dbatoolsaz.blob.core.windows.net/azbackups\" registered on the sql2016 instance.\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eBackup-Dbadatabase -SqlInstance Server1\\Prod -Database db1 -BackupDirectory \\\\filestore\\backups\\servername\\instancename\\dbname\\backuptype -Type Full -ReplaceInName\nPerforms a full backup of db1 into the folder \\\\filestore\\backups\\server1\\prod\\db1\n-------------------------- EXAMPLE 6 --------------------------\nPS C:\\\u003eBackup-Dbadatabase -SqlInstance Server1\\Prod -BackupDirectory \\\\filestore\\backups\\servername\\instancename\\dbname\\backuptype -BackupFileName dbname-backuptype-timestamp.trn -Type Log \r\n-ReplaceInName\nPerforms a log backup for every database. For the database db1 this would results in backup files in \\\\filestore\\backups\\server1\\prod\\db1\\Log\\db1-log-31102018.trn\n-------------------------- EXAMPLE 7 --------------------------\nPS C:\\\u003eBackup-DbaDatabase -SqlInstance Sql2017 -Database master -BackupFileName NUL\nPerforms a backup of master, but sends the output to the NUL device (ie; throws it away)", "Params": [ [ "SqlInstance", @@ -975,7 +982,7 @@ ], [ "AzureBaseUrl", - "The URL to the base container of an Azure Storage account to write backups to.\nIf specified, the only other parameters than can be used are \"NoCopyOnly\", \"Type\", \"CompressBackup\", \"Checksum\", \"Verify\", \"AzureCredential\", \"CreateFolder\".", + "The URL to the base container of an Azure Storage account to write backups to.\nIf specified, the only other parameters than can be used are \"CopyOnly\", \"Type\", \"CompressBackup\", \"Checksum\", \"Verify\", \"AzureCredential\", \"CreateFolder\".", "", false, "false", @@ -1078,21 +1085,22 @@ "" ] ], - "Alias": "", - "Author": "Stuart Moore (@napalmgram), stuart-moore.com", - "Synopsis": "Backup one or more SQL Sever databases from a single SQL Server SqlInstance.", - "Name": "Backup-DbaDatabase", - "Links": null, - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eBackup-DbaDatabase -SqlInstance Server1 -Database HR, Finance\nThis will perform a full database backup on the databases HR and Finance on SQL Server Instance Server1 to Server1 default backup directory.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eBackup-DbaDatabase -SqlInstance sql2016 -BackupDirectory C:\\temp -Database AdventureWorks2014 -Type Full\nBacks up AdventureWorks2014 to sql2016 C:\\temp folder.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eBackup-DbaDatabase -SqlInstance sql2016 -AzureBaseUrl https://dbatoolsaz.blob.core.windows.net/azbackups/ -AzureCredential dbatoolscred -Type Full -CreateFolder\nPerforms a full backup of all databases on the sql2016 instance to their own containers under the https://dbatoolsaz.blob.core.windows.net/azbackups/ container on Azure blog storage using the sql \r\ncredential \"dbatoolscred\" registered on the sql2016 instance.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eBackup-DbaDatabase -SqlInstance sql2016 -AzureBaseUrl https://dbatoolsaz.blob.core.windows.net/azbackups/ -Type Full\nPerforms a full backup of all databases on the sql2016 instance to the https://dbatoolsaz.blob.core.windows.net/azbackups/ container on Azure blog storage using the Shared Access Signature sql \r\ncredential \"https://dbatoolsaz.blob.core.windows.net/azbackups\" registered on the sql2016 instance.\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eBackup-Dbadatabase -SqlInstance Server1\\Prod -Database db1 -BackupDirectory \\\\filestore\\backups\\servername\\instancename\\dbname\\backuptype -Type Full -ReplaceInName\nPerforms a full backup of db1 into the folder \\\\filestore\\backups\\server1\\prod\\db1\n-------------------------- EXAMPLE 6 --------------------------\nPS C:\\\u003eBackup-Dbadatabase -SqlInstance Server1\\Prod -BackupDirectory \\\\filestore\\backups\\servername\\instancename\\dbname\\backuptype -BackupFileName dbname-backuptype-timestamp.trn -Type Log \r\n-ReplaceInName\nPerforms a log backup for every database. For the database db1 this would results in backup files in \\\\filestore\\backups\\server1\\prod\\db1\\Log\\db1-log-31102018.trn\n-------------------------- EXAMPLE 7 --------------------------\nPS C:\\\u003eBackup-DbaDatabase -SqlInstance Sql2017 -Database master -BackupFileName NUL\nPerforms a backup of master, but sends the output to the NUL device (ie; throws it away)", "Syntax": "Backup-DbaDatabase [-SqlCredential \u003cPSCredential\u003e] [-Database \u003cObject[]\u003e] [-ExcludeDatabase \u003cObject[]\u003e] [-BackupDirectory \u003cString[]\u003e] [-BackupFileName \u003cString\u003e] [-ReplaceInName] [-CopyOnly] [-Type \u003cString\u003e] [-CreateFolder] [-FileCount \u003cInt32\u003e] [-CompressBackup] [-Checksum] [-Verify] [-MaxTransferSize \u003cInt32\u003e] [-BlockSize \u003cInt32\u003e] [-BufferCount \u003cInt32\u003e] [-AzureBaseUrl \u003cString\u003e] [-AzureCredential \u003cString\u003e] [-NoRecovery] [-BuildPath] [-WithFormat] [-Initialize] [-SkipTapeHeader] [-TimeStampFormat \u003cString\u003e] [-IgnoreFileChecks] [-OutputScriptOnly] [-EnableException] [-WhatIf] [-Confirm] \r\n[\u003cCommonParameters\u003e]\nBackup-DbaDatabase -SqlInstance \u003cDbaInstanceParameter\u003e [-SqlCredential \u003cPSCredential\u003e] [-Database \u003cObject[]\u003e] [-ExcludeDatabase \u003cObject[]\u003e] [-BackupDirectory \u003cString[]\u003e] [-BackupFileName \u003cString\u003e] [-ReplaceInName] [-CopyOnly] [-Type \u003cString\u003e] [-CreateFolder] [-FileCount \u003cInt32\u003e] [-CompressBackup] [-Checksum] [-Verify] [-MaxTransferSize \u003cInt32\u003e] [-BlockSize \u003cInt32\u003e] [-BufferCount \u003cInt32\u003e] [-AzureBaseUrl \u003cString\u003e] [-AzureCredential \u003cString\u003e] [-NoRecovery] [-BuildPath] [-WithFormat] [-Initialize] [-SkipTapeHeader] [-TimeStampFormat \u003cString\u003e] [-IgnoreFileChecks] [-OutputScriptOnly] \r\n[-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]\nBackup-DbaDatabase [-SqlCredential \u003cPSCredential\u003e] [-Database \u003cObject[]\u003e] [-ExcludeDatabase \u003cObject[]\u003e] [-BackupDirectory \u003cString[]\u003e] [-BackupFileName \u003cString\u003e] [-ReplaceInName] [-CopyOnly] [-Type \u003cString\u003e] -InputObject \u003cObject[]\u003e [-CreateFolder] [-FileCount \u003cInt32\u003e] [-CompressBackup] [-Checksum] [-Verify] [-MaxTransferSize \u003cInt32\u003e] [-BlockSize \u003cInt32\u003e] [-BufferCount \u003cInt32\u003e] [-AzureBaseUrl \u003cString\u003e] [-AzureCredential \u003cString\u003e] [-NoRecovery] [-BuildPath] [-WithFormat] [-Initialize] [-SkipTapeHeader] [-TimeStampFormat \u003cString\u003e] [-IgnoreFileChecks] [-OutputScriptOnly] [-EnableException] \r\n[-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Backup-DbaDbCertificate", + "Name": "Backup-DbaDbCertificate", "Description": "Exports database certificates from SQL Server using SMO and outputs the .cer and .pvk files.", "Tags": [ "Migration", "Certificate" ], + "Synopsis": "Exports database certificates from SQL Server using SMO.", + "Alias": "Backup-DbaDatabaseCertificate", + "Author": "Jess Pomfret (@jpomfret)", + "CommandName": "Backup-DbaDbCertificate", + "Availability": "Windows, Linux, macOS", + "Links": null, + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eBackup-DbaDbCertificate -SqlInstance Server1\nExports all the certificates on the specified SQL Server to the default data path for the instance.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003e$cred = Get-Credential sqladmin\nPS C:\\\u003e Backup-DbaDbCertificate -SqlInstance Server1 -SqlCredential $cred\nConnects using sqladmin credential and exports all the certificates on the specified SQL Server to the default data path for the instance.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eBackup-DbaDbCertificate -SqlInstance Server1 -Certificate Certificate1\nExports only the certificate named Certificate1 on the specified SQL Server to the default data path for the instance.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eBackup-DbaDbCertificate -SqlInstance Server1 -Database AdventureWorks\nExports only the certificates for AdventureWorks on the specified SQL Server to the default data path for the instance.\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eBackup-DbaDbCertificate -SqlInstance Server1 -ExcludeDatabase AdventureWorks\nExports all certificates except those for AdventureWorks on the specified SQL Server to the default data path for the instance.\n-------------------------- EXAMPLE 6 --------------------------\nPS C:\\\u003eBackup-DbaDbCertificate -SqlInstance Server1 -Path \\\\Server1\\Certificates -EncryptionPassword (ConvertTo-SecureString -force -AsPlainText GoodPass1234!!)\nExports all the certificates and private keys on the specified SQL Server.\n-------------------------- EXAMPLE 7 --------------------------\nPS C:\\\u003e$EncryptionPassword = ConvertTo-SecureString -AsPlainText \"GoodPass1234!!\" -force\nPS C:\\\u003e $DecryptionPassword = ConvertTo-SecureString -AsPlainText \"Password4567!!\" -force\r\nPS C:\\\u003e Backup-DbaDbCertificate -SqlInstance Server1 -EncryptionPassword $EncryptionPassword -DecryptionPassword $DecryptionPassword\nExports all the certificates on the specified SQL Server using the supplied DecryptionPassword, since an EncryptionPassword is specified private keys are also exported.\n-------------------------- EXAMPLE 8 --------------------------\nPS C:\\\u003eBackup-DbaDbCertificate -SqlInstance Server1 -Path \\\\Server1\\Certificates\nExports all certificates on the specified SQL Server to the specified path.\n-------------------------- EXAMPLE 9 --------------------------\nPS C:\\\u003eBackup-DbaDbCertificate -SqlInstance Server1 -Suffix DbaTools\nExports all certificates on the specified SQL Server to the specified path, appends DbaTools to the end of the filenames.\n-------------------------- EXAMPLE 10 --------------------------\nPS C:\\\u003eGet-DbaDbCertificate -SqlInstance sql2016 | Backup-DbaDbCertificate\nExports all certificates found on sql2016 to the default data directory.", "Params": [ [ "SqlInstance", @@ -1199,21 +1207,22 @@ "" ] ], - "Alias": "Backup-DbaDatabaseCertificate", - "Author": "Jess Pomfret (@jpomfret)", - "Synopsis": "Exports database certificates from SQL Server using SMO.", - "Name": "Backup-DbaDbCertificate", - "Links": null, - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eBackup-DbaDbCertificate -SqlInstance Server1\nExports all the certificates on the specified SQL Server to the default data path for the instance.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003e$cred = Get-Credential sqladmin\nPS C:\\\u003e Backup-DbaDbCertificate -SqlInstance Server1 -SqlCredential $cred\nConnects using sqladmin credential and exports all the certificates on the specified SQL Server to the default data path for the instance.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eBackup-DbaDbCertificate -SqlInstance Server1 -Certificate Certificate1\nExports only the certificate named Certificate1 on the specified SQL Server to the default data path for the instance.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eBackup-DbaDbCertificate -SqlInstance Server1 -Database AdventureWorks\nExports only the certificates for AdventureWorks on the specified SQL Server to the default data path for the instance.\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eBackup-DbaDbCertificate -SqlInstance Server1 -ExcludeDatabase AdventureWorks\nExports all certificates except those for AdventureWorks on the specified SQL Server to the default data path for the instance.\n-------------------------- EXAMPLE 6 --------------------------\nPS C:\\\u003eBackup-DbaDbCertificate -SqlInstance Server1 -Path \\\\Server1\\Certificates -EncryptionPassword (ConvertTo-SecureString -force -AsPlainText GoodPass1234!!)\nExports all the certificates and private keys on the specified SQL Server.\n-------------------------- EXAMPLE 7 --------------------------\nPS C:\\\u003e$EncryptionPassword = ConvertTo-SecureString -AsPlainText \"GoodPass1234!!\" -force\nPS C:\\\u003e $DecryptionPassword = ConvertTo-SecureString -AsPlainText \"Password4567!!\" -force\r\nPS C:\\\u003e Backup-DbaDbCertificate -SqlInstance Server1 -EncryptionPassword $EncryptionPassword -DecryptionPassword $DecryptionPassword\nExports all the certificates on the specified SQL Server using the supplied DecryptionPassword, since an EncryptionPassword is specified private keys are also exported.\n-------------------------- EXAMPLE 8 --------------------------\nPS C:\\\u003eBackup-DbaDbCertificate -SqlInstance Server1 -Path \\\\Server1\\Certificates\nExports all certificates on the specified SQL Server to the specified path.\n-------------------------- EXAMPLE 9 --------------------------\nPS C:\\\u003eBackup-DbaDbCertificate -SqlInstance Server1 -Suffix DbaTools\nExports all certificates on the specified SQL Server to the specified path, appends DbaTools to the end of the filenames.\n-------------------------- EXAMPLE 10 --------------------------\nPS C:\\\u003eGet-DbaDbCertificate -SqlInstance sql2016 | Backup-DbaDbCertificate\nExports all certificates found on sql2016 to the default data directory.", "Syntax": "Backup-DbaDbCertificate [-SqlCredential \u003cPSCredential\u003e] [-EncryptionPassword \u003cSecureString\u003e] [-DecryptionPassword \u003cSecureString\u003e] [-Path \u003cFileInfo\u003e] [-Suffix \u003cString\u003e] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]\nBackup-DbaDbCertificate -SqlInstance \u003cDbaInstanceParameter[]\u003e [-SqlCredential \u003cPSCredential\u003e] [-Certificate \u003cObject[]\u003e] [-Database \u003cObject[]\u003e] [-ExcludeDatabase \u003cObject[]\u003e] [-EncryptionPassword \u003cSecureString\u003e] [-DecryptionPassword \u003cSecureString\u003e] [-Path \u003cFileInfo\u003e] [-Suffix \u003cString\u003e] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]\nBackup-DbaDbCertificate [-SqlCredential \u003cPSCredential\u003e] [-EncryptionPassword \u003cSecureString\u003e] [-DecryptionPassword \u003cSecureString\u003e] [-Path \u003cFileInfo\u003e] [-Suffix \u003cString\u003e] [-InputObject \u003cCertificate[]\u003e] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Backup-DbaDbMasterKey", + "Name": "Backup-DbaDbMasterKey", "Description": "Backs up specified database master key.", "Tags": [ "Certificate", "Database" ], + "Synopsis": "Backs up specified database master key.", + "Alias": "Backup-DbaDatabaseMasterKey", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Backup-DbaDbMasterKey", + "Availability": "Windows, Linux, macOS", + "Links": null, + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eBackup-DbaDbMasterKey -SqlInstance server1\\sql2016\n```\r\nComputerName : SERVER1\r\nInstanceName : SQL2016\r\nSqlInstance : SERVER1\\SQL2016\r\nDatabase : master\r\nFilename : E:\\MSSQL13.SQL2016\\MSSQL\\Backup\\server1$sql2016-master-20170614162311.key\r\nStatus : Success\r\n```\nPrompts for export password, then logs into server1\\sql2016 with Windows credentials then backs up all database keys to the default backup directory.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eBackup-DbaDbMasterKey -SqlInstance Server1 -Database db1 -Path \\\\nas\\sqlbackups\\keys\nLogs into sql2016 with Windows credentials then backs up db1\u0027s keys to the \\\\nas\\sqlbackups\\keys directory.", "Params": [ [ "SqlInstance", @@ -1304,18 +1313,19 @@ "" ] ], - "Alias": "Backup-DbaDatabaseMasterKey", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Backs up specified database master key.", - "Name": "Backup-DbaDbMasterKey", - "Links": null, - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eBackup-DbaDbMasterKey -SqlInstance server1\\sql2016\n```\r\nComputerName : SERVER1\r\nInstanceName : SQL2016\r\nSqlInstance : SERVER1\\SQL2016\r\nDatabase : master\r\nFilename : E:\\MSSQL13.SQL2016\\MSSQL\\Backup\\server1$sql2016-master-20170614162311.key\r\nStatus : Success\r\n```\nPrompts for export password, then logs into server1\\sql2016 with Windows credentials then backs up all database keys to the default backup directory.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eBackup-DbaDbMasterKey -SqlInstance Server1 -Database db1 -Path \\\\nas\\sqlbackups\\keys\nLogs into sql2016 with Windows credentials then backs up db1\u0027s keys to the \\\\nas\\sqlbackups\\keys directory.", "Syntax": "Backup-DbaDbMasterKey [[-SqlInstance] \u003cDbaInstanceParameter[]\u003e] [[-SqlCredential] \u003cPSCredential\u003e] [[-Credential] \u003cPSCredential\u003e] [[-Database] \u003cString[]\u003e] [[-ExcludeDatabase] \u003cString[]\u003e] [[-SecurePassword] \u003cSecureString\u003e] [[-Path] \u003cString\u003e] [[-InputObject] \u003cDatabase[]\u003e] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Clear-DbaConnectionPool", + "Name": "Clear-DbaConnectionPool", "Description": "This command resets (or empties) the connection pool.\n\nIf there are connections in use at the time of the call, they are marked appropriately and will be discarded (instead of being returned to the pool) when Close() is called on them.\n\nRef: https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.clearallpools(v=vs.110).aspx", "Tags": "Connection", + "Synopsis": "Resets (or empties) the connection pool.", + "Alias": "Clear-DbaSqlConnectionPool", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Clear-DbaConnectionPool", + "Availability": "Windows only", + "Links": "https://dbatools.io/Clear-DbaConnectionPool", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eClear-DbaConnectionPool\nClears all local connection pools.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eClear-DbaConnectionPool -ComputerName workstation27\nClears all connection pools on workstation27.", "Params": [ [ "ComputerName", @@ -1342,21 +1352,22 @@ "False" ] ], - "Alias": "Clear-DbaSqlConnectionPool", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Resets (or empties) the connection pool.", - "Name": "Clear-DbaConnectionPool", - "Links": "https://dbatools.io/Clear-DbaConnectionPool", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eClear-DbaConnectionPool\nClears all local connection pools.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eClear-DbaConnectionPool -ComputerName workstation27\nClears all connection pools on workstation27.", "Syntax": "Clear-DbaConnectionPool [[-ComputerName] \u003cDbaInstanceParameter[]\u003e] [[-Credential] \u003cPSCredential\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Clear-DbaLatchStatistics", + "Name": "Clear-DbaLatchStatistics", "Description": "Reset the aggregated statistics - basically just executes DBCC SQLPERF (N\u0027sys.dm_os_latch_stats\u0027, CLEAR)", "Tags": [ "LatchStatistic", "Waits" ], + "Synopsis": "Clears Latch Statistics", + "Alias": "", + "Author": "Patrick Flynn (@sqllensman)", + "CommandName": "Clear-DbaLatchStatistics", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Clear-DbaLatchStatistics", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eClear-DbaLatchStatistics -SqlInstance sql2008, sqlserver2012\nAfter confirmation, clears latch statistics on servers sql2008 and sqlserver2012\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eClear-DbaLatchStatistics -SqlInstance sql2008, sqlserver2012 -Confirm:$false\nClears latch statistics on servers sql2008 and sqlserver2012, without prompting\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003e\u0027sql2008\u0027,\u0027sqlserver2012\u0027 | Clear-DbaLatchStatistics\nAfter confirmation, clears latch statistics on servers sql2008 and sqlserver2012\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003e$cred = Get-Credential sqladmin\nPS C:\\\u003e Clear-DbaLatchStatistics -SqlInstance sql2008 -SqlCredential $cred\nConnects using sqladmin credential and clears latch statistics on servers sql2008 and sqlserver2012", "Params": [ [ "SqlInstance", @@ -1399,18 +1410,19 @@ "" ] ], - "Alias": "", - "Author": "Patrick Flynn (@sqllensman)", - "Synopsis": "Clears Latch Statistics", - "Name": "Clear-DbaLatchStatistics", - "Links": "https://dbatools.io/Clear-DbaLatchStatistics", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eClear-DbaLatchStatistics -SqlInstance sql2008, sqlserver2012\nAfter confirmation, clears latch statistics on servers sql2008 and sqlserver2012\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eClear-DbaLatchStatistics -SqlInstance sql2008, sqlserver2012 -Confirm:$false\nClears latch statistics on servers sql2008 and sqlserver2012, without prompting\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003e\u0027sql2008\u0027,\u0027sqlserver2012\u0027 | Clear-DbaLatchStatistics\nAfter confirmation, clears latch statistics on servers sql2008 and sqlserver2012\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003e$cred = Get-Credential sqladmin\nPS C:\\\u003e Clear-DbaLatchStatistics -SqlInstance sql2008 -SqlCredential $cred\nConnects using sqladmin credential and clears latch statistics on servers sql2008 and sqlserver2012", "Syntax": "Clear-DbaLatchStatistics [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Clear-DbaPlanCache", + "Name": "Clear-DbaPlanCache", "Description": "Checks ad-hoc and prepared plan cache for each database, if over 100 MBs removes from the cache.\n\nThis command automates that process.\n\nReferences: https://www.sqlskills.com/blogs/kimberly/plan-cache-adhoc-workloads-and-clearing-the-single-use-plan-cache-bloat/", "Tags": "Memory", + "Synopsis": "Removes ad-hoc and prepared plan caches is single use plans are over defined threshold.", + "Alias": "", + "Author": "Tracy Boggiano, databasesuperhero.com", + "CommandName": "Clear-DbaPlanCache", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Clear-DbaPlanCache", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eClear-DbaPlanCache -SqlInstance sql2017 -Threshold 200\nLogs into the SQL Server instance \"sql2017\" and removes plan caches if over 200 MB.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eClear-DbaPlanCache -SqlInstance sql2017 -SqlCredential sqladmin\nLogs into the SQL instance using the SQL Login \u0027sqladmin\u0027 and then Windows instance as \u0027ad\\sqldba\u0027\r\nand removes if Threshold over 100 MB.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eFind-DbaInstance -ComputerName localhost | Get-DbaPlanCache | Clear-DbaPlanCache -Threshold 200\nScans localhost for instances using the browser service, traverses all instances and gets the plan cache for each, clears them out if they are above 200 MB.", "Params": [ [ "SqlInstance", @@ -1469,21 +1481,22 @@ "" ] ], - "Alias": "", - "Author": "Tracy Boggiano, databasesuperhero.com", - "Synopsis": "Removes ad-hoc and prepared plan caches is single use plans are over defined threshold.", - "Name": "Clear-DbaPlanCache", - "Links": "https://dbatools.io/Clear-DbaPlanCache", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eClear-DbaPlanCache -SqlInstance sql2017 -Threshold 200\nLogs into the SQL Server instance \"sql2017\" and removes plan caches if over 200 MB.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eClear-DbaPlanCache -SqlInstance sql2017 -SqlCredential sqladmin\nLogs into the SQL instance using the SQL Login \u0027sqladmin\u0027 and then Windows instance as \u0027ad\\sqldba\u0027\r\nand removes if Threshold over 100 MB.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eFind-DbaInstance -ComputerName localhost | Get-DbaPlanCache | Clear-DbaPlanCache -Threshold 200\nScans localhost for instances using the browser service, traverses all instances and gets the plan cache for each, clears them out if they are above 200 MB.", "Syntax": "Clear-DbaPlanCache [[-SqlInstance] \u003cDbaInstanceParameter[]\u003e] [[-SqlCredential] \u003cPSCredential\u003e] [[-Threshold] \u003cInt32\u003e] [[-InputObject] \u003cObject[]\u003e] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Clear-DbaWaitStatistics", + "Name": "Clear-DbaWaitStatistics", "Description": "Reset the aggregated statistics - basically just executes DBCC SQLPERF (N\u0027sys.dm_os_wait_stats\u0027, CLEAR)", "Tags": [ "WaitStatistic", "Waits" ], + "Synopsis": "Clears wait statistics", + "Alias": "", + "Author": "Chrissy LeMaire (@cl)", + "CommandName": "Clear-DbaWaitStatistics", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Clear-DbaWaitStatistics", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eClear-DbaWaitStatistics -SqlInstance sql2008, sqlserver2012\nAfter confirmation, clears wait stats on servers sql2008 and sqlserver2012\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eClear-DbaWaitStatistics -SqlInstance sql2008, sqlserver2012 -Confirm:$false\nClears wait stats on servers sql2008 and sqlserver2012, without prompting", "Params": [ [ "SqlInstance", @@ -1526,21 +1539,22 @@ "" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl)", - "Synopsis": "Clears wait statistics", - "Name": "Clear-DbaWaitStatistics", - "Links": "https://dbatools.io/Clear-DbaWaitStatistics", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eClear-DbaWaitStatistics -SqlInstance sql2008, sqlserver2012\nAfter confirmation, clears wait stats on servers sql2008 and sqlserver2012\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eClear-DbaWaitStatistics -SqlInstance sql2008, sqlserver2012 -Confirm:$false\nClears wait stats on servers sql2008 and sqlserver2012, without prompting", "Syntax": "Clear-DbaWaitStatistics [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Connect-DbaInstance", + "Name": "Connect-DbaInstance", "Description": "This command is robust because it initializes properties that do not cause enumeration by default. It also supports both Windows and SQL Server authentication methods, and detects which to use based upon the provided credentials.\n\nBy default, this command also sets the connection\u0027s ApplicationName property to \"dbatools PowerShell module - dbatools.io - custom connection\". If you\u0027re doing anything that requires profiling, you can look for this client name.\n\nAlternatively, you can pass in whichever client name you\u0027d like using the -ClientName parameter. There are a ton of other parameters for you to explore as well.\n\nSee https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.connectionstring.aspx\nand https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnectionstringbuilder.aspx,\nand https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.aspx\n\nTo execute SQL commands, you can use $server.ConnectionContext.ExecuteReader($sql) or $server.Databases[\u0027master\u0027].ExecuteNonQuery($sql)", "Tags": [ "Connect", "Connection" ], + "Synopsis": "Creates a robust SMO SQL Server object.", + "Alias": "Connect-DbaServer,Get-DbaInstance", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Connect-DbaInstance", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Connect-DbaInstance", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eConnect-DbaInstance -SqlInstance sql2014\nCreates an SMO Server object that connects using Windows Authentication\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003e$wincred = Get-Credential ad\\sqladmin\nPS C:\\\u003e Connect-DbaInstance -SqlInstance sql2014 -SqlCredential $wincred\nCreates an SMO Server object that connects using alternative Windows credentials\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003e$sqlcred = Get-Credential sqladmin\nPS C:\\\u003e $server = Connect-DbaInstance -SqlInstance sql2014 -SqlCredential $sqlcred\nLogin to sql2014 as SQL login sqladmin.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003e$server = Connect-DbaInstance -SqlInstance sql2014 -ClientName \"my connection\"\nCreates an SMO Server object that connects using Windows Authentication and uses the client name \"my connection\". So when you open up profiler or use extended events, you can search for \"my \r\nconnection\".\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003e$server = Connect-DbaInstance -SqlInstance sql2014 -AppendConnectionString \"Packet Size=4096;AttachDbFilename=C:\\MyFolder\\MyDataFile.mdf;User Instance=true;\"\nCreates an SMO Server object that connects to sql2014 using Windows Authentication, then it sets the packet size (this can also be done via -PacketSize) and other connection attributes.\n-------------------------- EXAMPLE 6 --------------------------\nPS C:\\\u003e$server = Connect-DbaInstance -SqlInstance sql2014 -NetworkProtocol TcpIp -MultiSubnetFailover\nCreates an SMO Server object that connects using Windows Authentication that uses TCP/IP and has MultiSubnetFailover enabled.\n-------------------------- EXAMPLE 7 --------------------------\nPS C:\\\u003e$server = Connect-DbaInstance sql2016 -ApplicationIntent ReadOnly\nConnects with ReadOnly ApplicationIntent.", "Params": [ [ "SqlInstance", @@ -1582,6 +1596,14 @@ "false", "" ], + [ + "AzureUnsupported", + "Terminate if Azure is detected but not supported", + "", + false, + "false", + "False" + ], [ "BatchSeparator", "A string to separate groups of SQL statements being executed. By default, this is \"GO\".", @@ -1646,6 +1668,14 @@ "false", "0" ], + [ + "MinimumVersion", + "Terminate if the target SQL Server instance version does not meet version requirements", + "", + false, + "false", + "0" + ], [ "MultipleActiveResultSets", "If this switch is enabled, an application can maintain multiple active result sets (MARS).\nIf this switch is not enabled, an application must process or cancel all result sets from one batch before it can execute any other batch on that connection.", @@ -1751,22 +1781,23 @@ "False" ] ], - "Alias": "Connect-DbaServer,Get-DbaInstance", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Creates a robust SMO SQL Server object.", - "Name": "Connect-DbaInstance", - "Links": "https://dbatools.io/Connect-DbaInstance", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eConnect-DbaInstance -SqlInstance sql2014\nCreates an SMO Server object that connects using Windows Authentication\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003e$wincred = Get-Credential ad\\sqladmin\nPS C:\\\u003e Connect-DbaInstance -SqlInstance sql2014 -SqlCredential $wincred\nCreates an SMO Server object that connects using alternative Windows credentials\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003e$sqlcred = Get-Credential sqladmin\nPS C:\\\u003e $server = Connect-DbaInstance -SqlInstance sql2014 -SqlCredential $sqlcred\nLogin to sql2014 as SQL login sqladmin.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003e$server = Connect-DbaInstance -SqlInstance sql2014 -ClientName \"my connection\"\nCreates an SMO Server object that connects using Windows Authentication and uses the client name \"my connection\". So when you open up profiler or use extended events, you can search for \"my \r\nconnection\".\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003e$server = Connect-DbaInstance -SqlInstance sql2014 -AppendConnectionString \"Packet Size=4096;AttachDbFilename=C:\\MyFolder\\MyDataFile.mdf;User Instance=true;\"\nCreates an SMO Server object that connects to sql2014 using Windows Authentication, then it sets the packet size (this can also be done via -PacketSize) and other connection attributes.\n-------------------------- EXAMPLE 6 --------------------------\nPS C:\\\u003e$server = Connect-DbaInstance -SqlInstance sql2014 -NetworkProtocol TcpIp -MultiSubnetFailover\nCreates an SMO Server object that connects using Windows Authentication that uses TCP/IP and has MultiSubnetFailover enabled.\n-------------------------- EXAMPLE 7 --------------------------\nPS C:\\\u003e$server = Connect-DbaInstance sql2016 -ApplicationIntent ReadOnly\nConnects with ReadOnly ApplicationIntent.", - "Syntax": "Connect-DbaInstance [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [[-Database] \u003cObject[]\u003e] [[-AccessToken] \u003cString\u003e] [[-ApplicationIntent] \u003cString\u003e] [[-BatchSeparator] \u003cString\u003e] [[-ClientName] \u003cString\u003e] [[-ConnectTimeout] \u003cInt32\u003e] [-EncryptConnection] [[-FailoverPartner] \u003cString\u003e] [[-LockTimeout] \u003cInt32\u003e] [[-MaxPoolSize] \u003cInt32\u003e] [[-MinPoolSize] \u003cInt32\u003e] [-MultipleActiveResultSets] [-MultiSubnetFailover] [[-NetworkProtocol] \u003cString\u003e] [-NonPooledConnection] [[-PacketSize] \u003cInt32\u003e] [[-PooledConnectionLifetime] \u003cInt32\u003e] [[-SqlExecutionModes] \u003cString\u003e] \r\n[[-StatementTimeout] \u003cInt32\u003e] [-TrustServerCertificate] [[-WorkstationId] \u003cString\u003e] [[-AppendConnectionString] \u003cString\u003e] [-SqlConnectionOnly] [-DisableException] [\u003cCommonParameters\u003e]" + "Syntax": "Connect-DbaInstance [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [[-Database] \u003cString\u003e] [[-AccessToken] \u003cString\u003e] [[-ApplicationIntent] \u003cString\u003e] [-AzureUnsupported] [[-BatchSeparator] \u003cString\u003e] [[-ClientName] \u003cString\u003e] [[-ConnectTimeout] \u003cInt32\u003e] [-EncryptConnection] [[-FailoverPartner] \u003cString\u003e] [[-LockTimeout] \u003cInt32\u003e] [[-MaxPoolSize] \u003cInt32\u003e] [[-MinPoolSize] \u003cInt32\u003e] [[-MinimumVersion] \u003cInt32\u003e] [-MultipleActiveResultSets] [-MultiSubnetFailover] [[-NetworkProtocol] \u003cString\u003e] [-NonPooledConnection] [[-PacketSize] \u003cInt32\u003e] [[-PooledConnectionLifetime] \u003cInt32\u003e] \r\n[[-SqlExecutionModes] \u003cString\u003e] [[-StatementTimeout] \u003cInt32\u003e] [-TrustServerCertificate] [[-WorkstationId] \u003cString\u003e] [[-AppendConnectionString] \u003cString\u003e] [-SqlConnectionOnly] [-DisableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "ConvertTo-DbaDataTable", + "Name": "ConvertTo-DbaDataTable", "Description": "Creates a DataTable based on an object\u0027s properties. This allows you to easily write to SQL Server tables.\n\nThanks to Chad Miller, this is based on his script. https://gallery.technet.microsoft.com/scriptcenter/4208a159-a52e-4b99-83d4-8048468d29dd\n\nIf the attempt to convert to data table fails, try the -Raw parameter for less accurate datatype detection.", "Tags": [ "DataTable", "Table", "Data" ], + "Synopsis": "Creates a DataTable for an object.", + "Alias": "Out-DbaDataTable", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "ConvertTo-DbaDataTable", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/ConvertTo-DbaDataTable", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-Service | ConvertTo-DbaDataTable\nCreates a DataTable from the output of Get-Service.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eConvertTo-DbaDataTable -InputObject $csv.cheesetypes\nCreates a DataTable from the CSV object $csv.cheesetypes.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003e$dblist | ConvertTo-DbaDataTable\nCreates a DataTable from the $dblist object passed in via pipeline.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-Process | ConvertTo-DbaDataTable -TimeSpanType TotalSeconds\nCreates a DataTable with the running processes and converts any TimeSpan property to TotalSeconds.", "Params": [ [ "InputObject", @@ -1817,18 +1848,19 @@ "False" ] ], - "Alias": "Out-DbaDataTable", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Creates a DataTable for an object.", - "Name": "ConvertTo-DbaDataTable", - "Links": "https://dbatools.io/ConvertTo-DbaDataTable", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-Service | ConvertTo-DbaDataTable\nCreates a DataTable from the output of Get-Service.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eConvertTo-DbaDataTable -InputObject $csv.cheesetypes\nCreates a DataTable from the CSV object $csv.cheesetypes.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003e$dblist | ConvertTo-DbaDataTable\nCreates a DataTable from the $dblist object passed in via pipeline.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-Process | ConvertTo-DbaDataTable -TimeSpanType TotalSeconds\nCreates a DataTable with the running processes and converts any TimeSpan property to TotalSeconds.", "Syntax": "ConvertTo-DbaDataTable [-InputObject] \u003cPSObject[]\u003e [[-TimeSpanType] \u003cString\u003e] [-SizeType \u003cString\u003e] [-IgnoreNull] [-Raw] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "ConvertTo-DbaTimeline", + "Name": "ConvertTo-DbaTimeline", "Description": "This function accepts input as pipeline from the following dbatools functions:\nGet-DbaAgentJobHistory\nGet-DbaBackupHistory\n(more to come...)\nAnd generates Bootstrap based, HTML file with Google Chart Timeline", "Tags": "Chart", + "Synopsis": "Converts InputObject to a html timeline using Google Chart", + "Alias": "", + "Author": "Marcin Gminski (@marcingminski)", + "CommandName": "ConvertTo-DbaTimeline", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/ConvertTo-DbaTimeline", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaAgentJobHistory -SqlInstance sql-1 -StartDate \u00272018-08-13 00:00\u0027 -EndDate \u00272018-08-13 23:59\u0027 -ExcludeJobSteps | ConvertTo-DbaTimeline | Out-File C:\\temp\\DbaAgentJobHistory.html \r\n-Encoding ASCII\nCreates an output file containing a pretty timeline for all of the agent job history results for sql-1 the whole day of 2018-08-13\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaCmsRegServer -SqlInstance sqlcm | Get-DbaBackupHistory -Since \u00272018-08-13 00:00\u0027 | ConvertTo-DbaTimeline | Out-File C:\\temp\\DbaBackupHistory.html -Encoding ASCII\nCreates an output file containing a pretty timeline for the agent job history since 2018-08-13 for all of the registered servers on sqlcm\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003e$messageParameters = @{\n\u003e\u003e Subject = \"Backup history for sql2017 and sql2016\"\r\n\u003e\u003e Body = Get-DbaBackupHistory -SqlInstance sql2017, sql2016 -Since \u00272018-08-13 00:00\u0027 | ConvertTo-DbaTimeline | Out-String\r\n\u003e\u003e From = \"dba@ad.local\"\r\n\u003e\u003e To = \"dba@ad.local\"\r\n\u003e\u003e SmtpServer = \"smtp.ad.local\"\r\n\u003e\u003e }\r\n\u003e\u003e\r\nPS C:\\\u003e Send-MailMessage @messageParameters -BodyAsHtml\nSends an email to dba@ad.local with the results of Get-DbaBackupHistory. Note that viewing these reports may not be supported in all email clients.", "Params": [ [ "InputObject", @@ -1847,21 +1879,22 @@ "False" ] ], - "Alias": "", - "Author": "Marcin Gminski (@marcingminski)", - "Synopsis": "Converts InputObject to a html timeline using Google Chart", - "Name": "ConvertTo-DbaTimeline", - "Links": "https://dbatools.io/ConvertTo-DbaTimeline", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaAgentJobHistory -SqlInstance sql-1 -StartDate \u00272018-08-13 00:00\u0027 -EndDate \u00272018-08-13 23:59\u0027 -ExcludeJobSteps | ConvertTo-DbaTimeline | Out-File C:\\temp\\DbaAgentJobHistory.html \r\n-Encoding ASCII\nCreates an output file containing a pretty timeline for all of the agent job history results for sql-1 the whole day of 2018-08-13\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaCmsRegServer -SqlInstance sqlcm | Get-DbaBackupHistory -Since \u00272018-08-13 00:00\u0027 | ConvertTo-DbaTimeline | Out-File C:\\temp\\DbaBackupHistory.html -Encoding ASCII\nCreates an output file containing a pretty timeline for the agent job history since 2018-08-13 for all of the registered servers on sqlcm\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003e$messageParameters = @{\n\u003e\u003e Subject = \"Backup history for sql2017 and sql2016\"\r\n\u003e\u003e Body = Get-DbaBackupHistory -SqlInstance sql2017, sql2016 -Since \u00272018-08-13 00:00\u0027 | ConvertTo-DbaTimeline\r\n\u003e\u003e From = \"dba@ad.local\"\r\n\u003e\u003e To = \"dba@ad.local\"\r\n\u003e\u003e SmtpServer = \"smtp.ad.local\"\r\n\u003e\u003e }\r\n\u003e\u003e\r\nPS C:\\\u003e Send-MailMessage @messageParameters -BodyAsHtml\nSends an email to dba@ad.local with the results of Get-DbaBackupHistory. Note that viewing these reports may not be supported in all email clients.", "Syntax": "ConvertTo-DbaTimeline [-InputObject] \u003cObject[]\u003e [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "ConvertTo-DbaXESession", + "Name": "ConvertTo-DbaXESession", "Description": "Uses a slightly modified version of sp_SQLskills_ConvertTraceToExtendedEvents.sql to convert Traces to Extended Events.\n\nT-SQL code by: Jonathan M. Kehayias, SQLskills.com. T-SQL can be found in this module directory and at\nhttps://www.sqlskills.com/blogs/jonathan/converting-sql-trace-to-extended-events-in-sql-server-2012/", "Tags": [ "Trace", "ExtendedEvent" ], + "Synopsis": "Uses a slightly modified version of sp_SQLskills_ConvertTraceToExtendedEvents.sql to convert Traces to Extended Events.", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "ConvertTo-DbaXESession", + "Availability": "Windows, Linux, macOS", + "Links": null, + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaTrace -SqlInstance sql2017, sql2012 | Where Id -eq 2 | ConvertTo-DbaXESession -Name \u0027Test\u0027\nConverts Trace with ID 2 to a Session named Test on SQL Server instances named sql2017 and sql2012 and creates the Session on each respective server.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaTrace -SqlInstance sql2014 | Out-GridView -PassThru | ConvertTo-DbaXESession -Name \u0027Test\u0027 | Start-DbaXESession\nConverts selected traces on sql2014 to sessions, creates the session, and starts it.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaTrace -SqlInstance sql2014 | Where Id -eq 1 | ConvertTo-DbaXESession -Name \u0027Test\u0027 -OutputScriptOnly\nConverts trace ID 1 on sql2014 to an Extended Event and outputs the resulting T-SQL.", "Params": [ [ "InputObject", @@ -1896,21 +1929,22 @@ "False" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Uses a slightly modified version of sp_SQLskills_ConvertTraceToExtendedEvents.sql to convert Traces to Extended Events.", - "Name": "ConvertTo-DbaXESession", - "Links": null, - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaTrace -SqlInstance sql2017, sql2012 | Where Id -eq 2 | ConvertTo-DbaXESession -Name \u0027Test\u0027\nConverts Trace with ID 2 to a Session named Test on SQL Server instances named sql2017 and sql2012 and creates the Session on each respective server.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaTrace -SqlInstance sql2014 | Out-GridView -PassThru | ConvertTo-DbaXESession -Name \u0027Test\u0027 | Start-DbaXESession\nConverts selected traces on sql2014 to sessions, creates the session, and starts it.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaTrace -SqlInstance sql2014 | Where Id -eq 1 | ConvertTo-DbaXESession -Name \u0027Test\u0027 -OutputScriptOnly\nConverts trace ID 1 on sql2014 to an Extended Event and outputs the resulting T-SQL.", "Syntax": "ConvertTo-DbaXESession [-InputObject] \u003cObject[]\u003e [-Name] \u003cString\u003e [-OutputScriptOnly] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Copy-DbaAgentAlert", + "Name": "Copy-DbaAgentAlert", "Description": "By default, all alerts are copied. The -Alert parameter is auto-populated for command-line completion and can be used to copy only specific alerts.\n\nIf the alert already exists on the destination, it will be skipped unless -Force is used.", "Tags": [ "Migration", "Agent" ], + "Synopsis": "Copy-DbaAgentAlert migrates alerts from one SQL Server to another.", + "Alias": "Copy-SqlAlert", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Copy-DbaAgentAlert", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Copy-DbaAgentAlert", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eCopy-DbaAgentAlert -Source sqlserver2014a -Destination sqlcluster\nCopies all alerts from sqlserver2014a to sqlcluster using Windows credentials. If alerts with the same name exist on sqlcluster, they will be skipped.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eCopy-DbaAgentAlert -Source sqlserver2014a -Destination sqlcluster -Alert PSAlert -SourceSqlCredential $cred -Force\nCopies a only the alert named PSAlert from sqlserver2014a to sqlcluster using SQL credentials for sqlserver2014a and Windows credentials for sqlcluster. If an alert with the same name exists on \r\nsqlcluster, it will be dropped and recreated because -Force was used.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eCopy-DbaAgentAlert -Source sqlserver2014a -Destination sqlcluster -WhatIf -Force\nShows what would happen if the command were executed using force.", "Params": [ [ "Source", @@ -2001,22 +2035,23 @@ "" ] ], - "Alias": "Copy-SqlAlert", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Copy-DbaAgentAlert migrates alerts from one SQL Server to another.", - "Name": "Copy-DbaAgentAlert", - "Links": "https://dbatools.io/Copy-DbaAgentAlert", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eCopy-DbaAgentAlert -Source sqlserver2014a -Destination sqlcluster\nCopies all alerts from sqlserver2014a to sqlcluster using Windows credentials. If alerts with the same name exist on sqlcluster, they will be skipped.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eCopy-DbaAgentAlert -Source sqlserver2014a -Destination sqlcluster -Alert PSAlert -SourceSqlCredential $cred -Force\nCopies a only the alert named PSAlert from sqlserver2014a to sqlcluster using SQL credentials for sqlserver2014a and Windows credentials for sqlcluster. If an alert with the same name exists on \r\nsqlcluster, it will be dropped and recreated because -Force was used.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eCopy-DbaAgentAlert -Source sqlserver2014a -Destination sqlcluster -WhatIf -Force\nShows what would happen if the command were executed using force.", "Syntax": "Copy-DbaAgentAlert [-Source] \u003cDbaInstanceParameter\u003e [[-SourceSqlCredential] \u003cPSCredential\u003e] [-Destination] \u003cDbaInstanceParameter[]\u003e [[-DestinationSqlCredential] \u003cPSCredential\u003e] [[-Alert] \u003cObject[]\u003e] [[-ExcludeAlert] \u003cObject[]\u003e] [-IncludeDefaults] [-Force] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Copy-DbaAgentJob", + "Name": "Copy-DbaAgentJob", "Description": "By default, all jobs are copied. The -Job parameter is auto-populated for command-line completion and can be used to copy only specific jobs.\n\nIf the job already exists on the destination, it will be skipped unless -Force is used.", "Tags": [ "Migration", "Agent", "Job" ], + "Synopsis": "Copy-DbaAgentJob migrates jobs from one SQL Server to another.", + "Alias": "Copy-SqlJob", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Copy-DbaAgentJob", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Copy-DbaAgentJob", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eCopy-DbaAgentJob -Source sqlserver2014a -Destination sqlcluster\nCopies all jobs from sqlserver2014a to sqlcluster, using Windows credentials. If jobs with the same name exist on sqlcluster, they will be skipped.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eCopy-DbaAgentJob -Source sqlserver2014a -Destination sqlcluster -Job PSJob -SourceSqlCredential $cred -Force\nCopies a single job, the PSJob job from sqlserver2014a to sqlcluster, using SQL credentials for sqlserver2014a and Windows credentials for sqlcluster. If a job with the same name exists on \r\nsqlcluster, it will be dropped and recreated because -Force was used.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eCopy-DbaAgentJob -Source sqlserver2014a -Destination sqlcluster -WhatIf -Force\nShows what would happen if the command were executed using force.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaAgentJob -SqlInstance sqlserver2014a | Where-Object Category -eq \"Report Server\" | ForEach-Object {Copy-DbaAgentJob -Source $_.SqlInstance -Job $_.Name -Destination sqlserver2014b}\nCopies all SSRS jobs (subscriptions) from AlwaysOn Primary SQL instance sqlserver2014a to AlwaysOn Secondary SQL instance sqlserver2014b", "Params": [ [ "Source", @@ -2115,21 +2150,22 @@ "" ] ], - "Alias": "Copy-SqlJob", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Copy-DbaAgentJob migrates jobs from one SQL Server to another.", - "Name": "Copy-DbaAgentJob", - "Links": "https://dbatools.io/Copy-DbaAgentJob", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eCopy-DbaAgentJob -Source sqlserver2014a -Destination sqlcluster\nCopies all jobs from sqlserver2014a to sqlcluster, using Windows credentials. If jobs with the same name exist on sqlcluster, they will be skipped.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eCopy-DbaAgentJob -Source sqlserver2014a -Destination sqlcluster -Job PSJob -SourceSqlCredential $cred -Force\nCopies a single job, the PSJob job from sqlserver2014a to sqlcluster, using SQL credentials for sqlserver2014a and Windows credentials for sqlcluster. If a job with the same name exists on \r\nsqlcluster, it will be dropped and recreated because -Force was used.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eCopy-DbaAgentJob -Source sqlserver2014a -Destination sqlcluster -WhatIf -Force\nShows what would happen if the command were executed using force.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaAgentJob -SqlInstance sqlserver2014a | Where-Object Category -eq \"Report Server\" | ForEach-Object {Copy-DbaAgentJob -Source $_.SqlInstance -Job $_.Name -Destination sqlserver2014b}\nCopies all SSRS jobs (subscriptions) from AlwaysOn Primary SQL instance sqlserver2014a to AlwaysOn Secondary SQL instance sqlserver2014b", "Syntax": "Copy-DbaAgentJob [-Source] \u003cDbaInstanceParameter\u003e [[-SourceSqlCredential] \u003cPSCredential\u003e] [-Destination] \u003cDbaInstanceParameter[]\u003e [[-DestinationSqlCredential] \u003cPSCredential\u003e] [[-Job] \u003cObject[]\u003e] [[-ExcludeJob] \u003cObject[]\u003e] [-DisableOnSource] [-DisableOnDestination] [-Force] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Copy-DbaAgentJobCategory", + "Name": "Copy-DbaAgentJobCategory", "Description": "By default, all SQL Agent categories for Jobs, Operators and Alerts are copied.\n\nThe -OperatorCategories parameter is auto-populated for command-line completion and can be used to copy only specific operator categories.\nThe -AgentCategories parameter is auto-populated for command-line completion and can be used to copy only specific agent categories.\nThe -JobCategories parameter is auto-populated for command-line completion and can be used to copy only specific job categories.\n\nIf the category already exists on the destination, it will be skipped unless -Force is used.", "Tags": [ "Migration", "Agent" ], + "Synopsis": "Copy-DbaAgentJobCategory migrates SQL Agent categories from one SQL Server to another. This is similar to sp_add_category.\n\nhttps://msdn.microsoft.com/en-us/library/ms181597.aspx", + "Alias": "Copy-DbaAgentCategory,Copy-SqlAgentCategory", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Copy-DbaAgentJobCategory", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Copy-DbaAgentJobCategory", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eCopy-DbaAgentJobCategory -Source sqlserver2014a -Destination sqlcluster\nCopies all operator categories from sqlserver2014a to sqlcluster using Windows authentication. If operator categories with the same name exist on sqlcluster, they will be skipped.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eCopy-DbaAgentJobCategory -Source sqlserver2014a -Destination sqlcluster -OperatorCategory PSOperator -SourceSqlCredential $cred -Force\nCopies a single operator category, the PSOperator operator category from sqlserver2014a to sqlcluster using SQL credentials to authenticate to sqlserver2014a and Windows credentials for sqlcluster. \r\nIf an operator category with the same name exists on sqlcluster, it will be dropped and recreated because -Force was used.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eCopy-DbaAgentJobCategory -Source sqlserver2014a -Destination sqlcluster -WhatIf -Force\nShows what would happen if the command were executed using force.", "Params": [ [ "Source", @@ -2228,22 +2264,23 @@ "" ] ], - "Alias": "Copy-DbaAgentCategory,Copy-SqlAgentCategory", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Copy-DbaAgentJobCategory migrates SQL Agent categories from one SQL Server to another. This is similar to sp_add_category.\n\nhttps://msdn.microsoft.com/en-us/library/ms181597.aspx", - "Name": "Copy-DbaAgentJobCategory", - "Links": "https://dbatools.io/Copy-DbaAgentJobCategory", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eCopy-DbaAgentJobCategory -Source sqlserver2014a -Destination sqlcluster\nCopies all operator categories from sqlserver2014a to sqlcluster using Windows authentication. If operator categories with the same name exist on sqlcluster, they will be skipped.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eCopy-DbaAgentJobCategory -Source sqlserver2014a -Destination sqlcluster -OperatorCategory PSOperator -SourceSqlCredential $cred -Force\nCopies a single operator category, the PSOperator operator category from sqlserver2014a to sqlcluster using SQL credentials to authenticate to sqlserver2014a and Windows credentials for sqlcluster. \r\nIf an operator category with the same name exists on sqlcluster, it will be dropped and recreated because -Force was used.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eCopy-DbaAgentJobCategory -Source sqlserver2014a -Destination sqlcluster -WhatIf -Force\nShows what would happen if the command were executed using force.", "Syntax": "Copy-DbaAgentJobCategory -Source \u003cDbaInstanceParameter\u003e [-SourceSqlCredential \u003cPSCredential\u003e] -Destination \u003cDbaInstanceParameter[]\u003e [-DestinationSqlCredential \u003cPSCredential\u003e] [-JobCategory \u003cString[]\u003e] [-AgentCategory \u003cString[]\u003e] [-OperatorCategory \u003cString[]\u003e] [-Force] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]\nCopy-DbaAgentJobCategory -Source \u003cDbaInstanceParameter\u003e [-SourceSqlCredential \u003cPSCredential\u003e] -Destination \u003cDbaInstanceParameter[]\u003e [-DestinationSqlCredential \u003cPSCredential\u003e] [-CategoryType \u003cString[]\u003e] [-JobCategory \u003cString[]\u003e] [-AgentCategory \u003cString[]\u003e] [-OperatorCategory \u003cString[]\u003e] [-Force] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Copy-DbaAgentOperator", + "Name": "Copy-DbaAgentOperator", "Description": "By default, all operators are copied. The -Operators parameter is auto-populated for command-line completion and can be used to copy only specific operators.\n\nIf the associated credentials for the operator do not exist on the destination, it will be skipped. If the operator already exists on the destination, it will be skipped unless -Force is used.", "Tags": [ "Migration", "Agent", "Operator" ], + "Synopsis": "Copy-DbaAgentOperator migrates operators from one SQL Server to another.", + "Alias": "Copy-SqlOperator", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Copy-DbaAgentOperator", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Copy-DbaAgentOperator", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eCopy-DbaAgentOperator -Source sqlserver2014a -Destination sqlcluster\nCopies all operators from sqlserver2014a to sqlcluster using Windows credentials. If operators with the same name exist on sqlcluster, they will be skipped.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eCopy-DbaAgentOperator -Source sqlserver2014a -Destination sqlcluster -Operator PSOperator -SourceSqlCredential $cred -Force\nCopies only the PSOperator operator from sqlserver2014a to sqlcluster using SQL credentials for sqlserver2014a and Windows credentials for sqlcluster. If an operator with the same name exists on \r\nsqlcluster, it will be dropped and recreated because -Force was used.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eCopy-DbaAgentOperator -Source sqlserver2014a -Destination sqlcluster -WhatIf -Force\nShows what would happen if the command were executed using force.", "Params": [ [ "Source", @@ -2326,21 +2363,22 @@ "" ] ], - "Alias": "Copy-SqlOperator", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Copy-DbaAgentOperator migrates operators from one SQL Server to another.", - "Name": "Copy-DbaAgentOperator", - "Links": "https://dbatools.io/Copy-DbaAgentOperator", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eCopy-DbaAgentOperator -Source sqlserver2014a -Destination sqlcluster\nCopies all operators from sqlserver2014a to sqlcluster using Windows credentials. If operators with the same name exist on sqlcluster, they will be skipped.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eCopy-DbaAgentOperator -Source sqlserver2014a -Destination sqlcluster -Operator PSOperator -SourceSqlCredential $cred -Force\nCopies only the PSOperator operator from sqlserver2014a to sqlcluster using SQL credentials for sqlserver2014a and Windows credentials for sqlcluster. If an operator with the same name exists on \r\nsqlcluster, it will be dropped and recreated because -Force was used.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eCopy-DbaAgentOperator -Source sqlserver2014a -Destination sqlcluster -WhatIf -Force\nShows what would happen if the command were executed using force.", "Syntax": "Copy-DbaAgentOperator [-Source] \u003cDbaInstanceParameter\u003e [[-SourceSqlCredential] \u003cPSCredential\u003e] [-Destination] \u003cDbaInstanceParameter[]\u003e [[-DestinationSqlCredential] \u003cPSCredential\u003e] [[-Operator] \u003cObject[]\u003e] [[-ExcludeOperator] \u003cObject[]\u003e] [-Force] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Copy-DbaAgentProxy", + "Name": "Copy-DbaAgentProxy", "Description": "By default, all proxy accounts are copied. The -ProxyAccounts parameter is auto-populated for command-line completion and can be used to copy only specific proxy accounts.\n\nIf the associated credential for the account does not exist on the destination, it will be skipped. If the proxy account already exists on the destination, it will be skipped unless -Force is used.", "Tags": [ "Migration", "Agent" ], + "Synopsis": "Copy-DbaAgentProxy migrates proxy accounts from one SQL Server to another.", + "Alias": "Copy-DbaAgentProxyAccount,Copy-SqlProxyAccount", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Copy-DbaAgentProxy", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Copy-DbaAgentProxy", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eCopy-DbaAgentProxy -Source sqlserver2014a -Destination sqlcluster\nCopies all proxy accounts from sqlserver2014a to sqlcluster using Windows credentials. If proxy accounts with the same name exist on sqlcluster, they will be skipped.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eCopy-DbaAgentProxy -Source sqlserver2014a -Destination sqlcluster -ProxyAccount PSProxy -SourceSqlCredential $cred -Force\nCopies only the PSProxy proxy account from sqlserver2014a to sqlcluster using SQL credentials for sqlserver2014a and Windows credentials for sqlcluster. If a proxy account with the same name exists \r\non sqlcluster, it will be dropped and recreated because -Force was used.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eCopy-DbaAgentProxy -Source sqlserver2014a -Destination sqlcluster -WhatIf -Force\nShows what would happen if the command were executed using force.", "Params": [ [ "Source", @@ -2423,21 +2461,22 @@ "" ] ], - "Alias": "Copy-DbaAgentProxyAccount,Copy-SqlProxyAccount", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Copy-DbaAgentProxy migrates proxy accounts from one SQL Server to another.", - "Name": "Copy-DbaAgentProxy", - "Links": "https://dbatools.io/Copy-DbaAgentProxy", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eCopy-DbaAgentProxy -Source sqlserver2014a -Destination sqlcluster\nCopies all proxy accounts from sqlserver2014a to sqlcluster using Windows credentials. If proxy accounts with the same name exist on sqlcluster, they will be skipped.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eCopy-DbaAgentProxy -Source sqlserver2014a -Destination sqlcluster -ProxyAccount PSProxy -SourceSqlCredential $cred -Force\nCopies only the PSProxy proxy account from sqlserver2014a to sqlcluster using SQL credentials for sqlserver2014a and Windows credentials for sqlcluster. If a proxy account with the same name exists \r\non sqlcluster, it will be dropped and recreated because -Force was used.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eCopy-DbaAgentProxy -Source sqlserver2014a -Destination sqlcluster -WhatIf -Force\nShows what would happen if the command were executed using force.", "Syntax": "Copy-DbaAgentProxy [-Source] \u003cDbaInstanceParameter\u003e [[-SourceSqlCredential] \u003cPSCredential\u003e] [-Destination] \u003cDbaInstanceParameter[]\u003e [[-DestinationSqlCredential] \u003cPSCredential\u003e] [[-ProxyAccount] \u003cString[]\u003e] [[-ExcludeProxyAccount] \u003cString[]\u003e] [-Force] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Copy-DbaAgentSchedule", + "Name": "Copy-DbaAgentSchedule", "Description": "All shared job schedules are copied.\n\nIf the associated credential for the account does not exist on the destination, it will be skipped. If the shared job schedule already exists on the destination, it will be skipped unless -Force is used.", "Tags": [ "Migration", "Agent" ], + "Synopsis": "Copy-DbaAgentSchedule migrates shared job schedules from one SQL Server to another.", + "Alias": "Copy-DbaAgentSharedSchedule,Copy-SqlSharedSchedule", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Copy-DbaAgentSchedule", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Copy-DbaAgentSchedule", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eCopy-DbaAgentSchedule -Source sqlserver2014a -Destination sqlcluster\nCopies all shared job schedules from sqlserver2014a to sqlcluster using Windows credentials. If shared job schedules with the same name exist on sqlcluster, they will be skipped.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eCopy-DbaAgentSchedule -Source sqlserver2014a -Destination sqlcluster -WhatIf -Force\nShows what would happen if the command were executed using force.", "Params": [ [ "Source", @@ -2504,22 +2543,23 @@ "" ] ], - "Alias": "Copy-DbaAgentSharedSchedule,Copy-SqlSharedSchedule", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Copy-DbaAgentSchedule migrates shared job schedules from one SQL Server to another.", - "Name": "Copy-DbaAgentSchedule", - "Links": "https://dbatools.io/Copy-DbaAgentSchedule", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eCopy-DbaAgentSchedule -Source sqlserver2014a -Destination sqlcluster\nCopies all shared job schedules from sqlserver2014a to sqlcluster using Windows credentials. If shared job schedules with the same name exist on sqlcluster, they will be skipped.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eCopy-DbaAgentSchedule -Source sqlserver2014a -Destination sqlcluster -WhatIf -Force\nShows what would happen if the command were executed using force.", "Syntax": "Copy-DbaAgentSchedule [-Source] \u003cDbaInstanceParameter\u003e [[-SourceSqlCredential] \u003cPSCredential\u003e] [-Destination] \u003cDbaInstanceParameter[]\u003e [[-DestinationSqlCredential] \u003cPSCredential\u003e] [-Force] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Copy-DbaAgentServer", + "Name": "Copy-DbaAgentServer", "Description": "A wrapper function that calls the associated Copy command for each of the object types seen in SSMS under SQL Server Agent. This also copies all of the the SQL Agent properties (job history max rows, DBMail profile name, etc.).\n\nYou must have sysadmin access and server version must be SQL Server version 2000 or greater.", "Tags": [ "Migration", "SqlServerAgent", "SqlAgent" ], + "Synopsis": "Copy SQL Server Agent from one server to another.", + "Alias": "Copy-DbaSqlServerAgent,Copy-SqlServerAgent", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Copy-DbaAgentServer", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Copy-DbaAgentServer", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eCopy-DbaAgentServer -Source sqlserver2014a -Destination sqlcluster\nCopies all job server objects from sqlserver2014a to sqlcluster using Windows credentials for authentication. If job objects with the same name exist on sqlcluster, they will be skipped.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eCopy-DbaAgentServer -Source sqlserver2014a -Destination sqlcluster -SourceSqlCredential $cred\nCopies all job objects from sqlserver2014a to sqlcluster using SQL credentials to authentication to sqlserver2014a and Windows credentials to authenticate to sqlcluster.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eCopy-DbaAgentServer -Source sqlserver2014a -Destination sqlcluster -WhatIf\nShows what would happen if the command were executed.", "Params": [ [ "Source", @@ -2602,21 +2642,22 @@ "" ] ], - "Alias": "Copy-DbaSqlServerAgent,Copy-SqlServerAgent", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Copy SQL Server Agent from one server to another.", - "Name": "Copy-DbaAgentServer", - "Links": "https://dbatools.io/Copy-DbaAgentServer", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eCopy-DbaAgentServer -Source sqlserver2014a -Destination sqlcluster\nCopies all job server objects from sqlserver2014a to sqlcluster using Windows credentials for authentication. If job objects with the same name exist on sqlcluster, they will be skipped.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eCopy-DbaAgentServer -Source sqlserver2014a -Destination sqlcluster -SourceSqlCredential $cred\nCopies all job objects from sqlserver2014a to sqlcluster using SQL credentials to authentication to sqlserver2014a and Windows credentials to authenticate to sqlcluster.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eCopy-DbaAgentServer -Source sqlserver2014a -Destination sqlcluster -WhatIf\nShows what would happen if the command were executed.", "Syntax": "Copy-DbaAgentServer [-Source] \u003cDbaInstanceParameter\u003e [[-SourceSqlCredential] \u003cPSCredential\u003e] [-Destination] \u003cDbaInstanceParameter[]\u003e [[-DestinationSqlCredential] \u003cPSCredential\u003e] [-DisableJobsOnDestination] [-DisableJobsOnSource] [-Force] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Copy-DbaBackupDevice", + "Name": "Copy-DbaBackupDevice", "Description": "Backups are migrated using Admin shares. If the destination directory does not exist, SQL Server\u0027s default backup directory will be used.\n\nIf a backup device with same name exists on destination, it will not be dropped and recreated unless -Force is used.", "Tags": [ "Migration", "Backup" ], + "Synopsis": "Copies backup devices one by one. Copies both SQL code and the backup file itself.", + "Alias": "Copy-SqlBackupDevice", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Copy-DbaBackupDevice", + "Availability": "Windows only", + "Links": "https://dbatools.io/Copy-DbaBackupDevice", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eCopy-DbaBackupDevice -Source sqlserver2014a -Destination sqlcluster\nCopies all server backup devices from sqlserver2014a to sqlcluster using Windows credentials. If backup devices with the same name exist on sqlcluster, they will be skipped.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eCopy-DbaBackupDevice -Source sqlserver2014a -Destination sqlcluster -BackupDevice backup01 -SourceSqlCredential $cred -Force\nCopies only the backup device named backup01 from sqlserver2014a to sqlcluster using SQL credentials for sqlserver2014a and Windows credentials for sqlcluster. If a backup device with the same \r\nname exists on sqlcluster, it will be dropped and recreated because -Force was used.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eCopy-DbaBackupDevice -Source sqlserver2014a -Destination sqlcluster -WhatIf -Force\nShows what would happen if the command were executed using force.", "Params": [ [ "Source", @@ -2691,18 +2732,19 @@ "" ] ], - "Alias": "Copy-SqlBackupDevice", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Copies backup devices one by one. Copies both SQL code and the backup file itself.", - "Name": "Copy-DbaBackupDevice", - "Links": "https://dbatools.io/Copy-DbaBackupDevice", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eCopy-DbaBackupDevice -Source sqlserver2014a -Destination sqlcluster\nCopies all server backup devices from sqlserver2014a to sqlcluster using Windows credentials. If backup devices with the same name exist on sqlcluster, they will be skipped.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eCopy-DbaBackupDevice -Source sqlserver2014a -Destination sqlcluster -BackupDevice backup01 -SourceSqlCredential $cred -Force\nCopies only the backup device named backup01 from sqlserver2014a to sqlcluster using SQL credentials for sqlserver2014a and Windows credentials for sqlcluster. If a backup device with the same \r\nname exists on sqlcluster, it will be dropped and recreated because -Force was used.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eCopy-DbaBackupDevice -Source sqlserver2014a -Destination sqlcluster -WhatIf -Force\nShows what would happen if the command were executed using force.", "Syntax": "Copy-DbaBackupDevice [-Source] \u003cDbaInstanceParameter\u003e [[-SourceSqlCredential] \u003cPSCredential\u003e] [-Destination] \u003cDbaInstanceParameter[]\u003e [[-DestinationSqlCredential] \u003cPSCredential\u003e] [[-BackupDevice] \u003cObject[]\u003e] [-Force] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Copy-DbaCmsRegServer", + "Name": "Copy-DbaCmsRegServer", "Description": "Copy-DbaCmsRegServer copies all groups, subgroups, and server instances from one SQL Server to another.", "Tags": "Migration", + "Synopsis": "Migrates SQL Server Central Management groups and server instances from one SQL Server to another.", + "Alias": "Copy-DbaCentralManagementServer,Copy-SqlCentralManagementServer", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Copy-DbaCmsRegServer", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Copy-DbaCmsRegServer", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eCopy-DbaCmsRegServer -Source sqlserver2014a -Destination sqlcluster\nAll groups, subgroups, and server instances are copied from sqlserver2014a CMS to sqlcluster CMS.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eCopy-DbaCmsRegServer -Source sqlserver2014a -Destination sqlcluster -Group Group1,Group3\nTop-level groups Group1 and Group3 along with their subgroups and server instances are copied from sqlserver to sqlcluster.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eCopy-DbaCmsRegServer -Source sqlserver2014a -Destination sqlcluster -Group Group1,Group3 -SwitchServerName -SourceSqlCredential $SourceSqlCredential -DestinationSqlCredential \r\n$DestinationSqlCredential\nTop-level groups Group1 and Group3 along with their subgroups and server instances are copied from sqlserver to sqlcluster. When adding sql instances to sqlcluster, if the server name of the \r\nmigrating instance is \"sqlcluster\", it will be switched to \"sqlserver\".\nIf SwitchServerName is not specified, \"sqlcluster\" will be skipped.", "Params": [ [ "Source", @@ -2785,21 +2827,22 @@ "" ] ], - "Alias": "Copy-DbaCentralManagementServer,Copy-SqlCentralManagementServer", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Migrates SQL Server Central Management groups and server instances from one SQL Server to another.", - "Name": "Copy-DbaCmsRegServer", - "Links": "https://dbatools.io/Copy-DbaCmsRegServer", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eCopy-DbaCmsRegServer -Source sqlserver2014a -Destination sqlcluster\nAll groups, subgroups, and server instances are copied from sqlserver2014a CMS to sqlcluster CMS.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eCopy-DbaCmsRegServer -Source sqlserver2014a -Destination sqlcluster -Group Group1,Group3\nTop-level groups Group1 and Group3 along with their subgroups and server instances are copied from sqlserver to sqlcluster.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eCopy-DbaCmsRegServer -Source sqlserver2014a -Destination sqlcluster -Group Group1,Group3 -SwitchServerName -SourceSqlCredential $SourceSqlCredential -DestinationSqlCredential \r\n$DestinationSqlCredential\nTop-level groups Group1 and Group3 along with their subgroups and server instances are copied from sqlserver to sqlcluster. When adding sql instances to sqlcluster, if the server name of the \r\nmigrating instance is \"sqlcluster\", it will be switched to \"sqlserver\".\nIf SwitchServerName is not specified, \"sqlcluster\" will be skipped.", "Syntax": "Copy-DbaCmsRegServer [-Source] \u003cDbaInstanceParameter\u003e [[-SourceSqlCredential] \u003cPSCredential\u003e] [-Destination] \u003cDbaInstanceParameter[]\u003e [[-DestinationSqlCredential] \u003cPSCredential\u003e] [[-Group] \u003cString[]\u003e] [-SwitchServerName] [-Force] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Copy-DbaCredential", + "Name": "Copy-DbaCredential", "Description": "By using password decryption techniques provided by Antti Rantasaari (NetSPI, 2014), this script migrates SQL Server Credentials from one server to another while maintaining username and password.\n\nCredit: https://blog.netspi.com/decrypting-mssql-database-link-server-passwords/", "Tags": [ "WSMan", "Migration" ], + "Synopsis": "Copy-DbaCredential migrates SQL Server Credentials from one SQL Server to another while maintaining Credential passwords.", + "Alias": "Copy-SqlCredential", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Copy-DbaCredential", + "Availability": "Windows only", + "Links": "https://dbatools.io/Copy-DbaCredential", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eCopy-DbaCredential -Source sqlserver2014a -Destination sqlcluster\nCopies all SQL Server Credentials on sqlserver2014a to sqlcluster. If Credentials exist on destination, they will be skipped.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eCopy-DbaCredential -Source sqlserver2014a -Destination sqlcluster -Name \"PowerShell Proxy Account\" -Force\nCopies over one SQL Server Credential (PowerShell Proxy Account) from sqlserver to sqlcluster. If the Credential already exists on the destination, it will be dropped and recreated.", "Params": [ [ "Source", @@ -2906,21 +2949,22 @@ "" ] ], - "Alias": "Copy-SqlCredential", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Copy-DbaCredential migrates SQL Server Credentials from one SQL Server to another while maintaining Credential passwords.", - "Name": "Copy-DbaCredential", - "Links": "https://dbatools.io/Copy-DbaCredential", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eCopy-DbaCredential -Source sqlserver2014a -Destination sqlcluster\nCopies all SQL Server Credentials on sqlserver2014a to sqlcluster. If Credentials exist on destination, they will be skipped.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eCopy-DbaCredential -Source sqlserver2014a -Destination sqlcluster -Name \"PowerShell Proxy Account\" -Force\nCopies over one SQL Server Credential (PowerShell Proxy Account) from sqlserver to sqlcluster. If the Credential already exists on the destination, it will be dropped and recreated.", "Syntax": "Copy-DbaCredential [-Source] \u003cDbaInstanceParameter\u003e [[-SourceSqlCredential] \u003cPSCredential\u003e] [[-Credential] \u003cPSCredential\u003e] [-Destination] \u003cDbaInstanceParameter[]\u003e [[-DestinationSqlCredential] \u003cPSCredential\u003e] [[-Name] \u003cString[]\u003e] [[-ExcludeName] \u003cString[]\u003e] [[-Identity] \u003cString[]\u003e] [[-ExcludeIdentity] \u003cString[]\u003e] [-Force] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Copy-DbaCustomError", + "Name": "Copy-DbaCustomError", "Description": "By default, all custom errors are copied. The -CustomError parameter is auto-populated for command-line completion and can be used to copy only specific custom errors.\n\nIf the custom error already exists on the destination, it will be skipped unless -Force is used. The us_english version must be created first. If you drop the us_english version, all the other languages will be dropped for that specific ID as well.", "Tags": [ "Migration", "CustomError" ], + "Synopsis": "Copy-DbaCustomError migrates custom errors (user defined messages), by the custom error ID, from one SQL Server to another.", + "Alias": "Copy-SqlCustomError", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Copy-DbaCustomError", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Copy-DbaCustomError", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eCopy-DbaCustomError -Source sqlserver2014a -Destination sqlcluster\nCopies all server custom errors from sqlserver2014a to sqlcluster using Windows credentials. If custom errors with the same name exist on sqlcluster, they will be skipped.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eCopy-DbaCustomError -Source sqlserver2014a -SourceSqlCredential $scred -Destination sqlcluster -DestinationSqlCredential $dcred -CustomError 60000 -Force\nCopies only the custom error with ID number 60000 from sqlserver2014a to sqlcluster using SQL credentials for sqlserver2014a and Windows credentials for sqlcluster. If a custom error with the same \r\nname exists on sqlcluster, it will be updated because -Force was used.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eCopy-DbaCustomError -Source sqlserver2014a -Destination sqlcluster -ExcludeCustomError 60000 -Force\nCopies all the custom errors found on sqlserver2014a except the custom error with ID number 60000 to sqlcluster. If a custom error with the same name exists on sqlcluster, it will be updated because \r\n-Force was used.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eCopy-DbaCustomError -Source sqlserver2014a -Destination sqlcluster -WhatIf -Force\nShows what would happen if the command were executed using force.", "Params": [ [ "Source", @@ -3003,22 +3047,23 @@ "" ] ], - "Alias": "Copy-SqlCustomError", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Copy-DbaCustomError migrates custom errors (user defined messages), by the custom error ID, from one SQL Server to another.", - "Name": "Copy-DbaCustomError", - "Links": "https://dbatools.io/Copy-DbaCustomError", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eCopy-DbaCustomError -Source sqlserver2014a -Destination sqlcluster\nCopies all server custom errors from sqlserver2014a to sqlcluster using Windows credentials. If custom errors with the same name exist on sqlcluster, they will be skipped.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eCopy-DbaCustomError -Source sqlserver2014a -SourceSqlCredential $scred -Destination sqlcluster -DestinationSqlCredential $dcred -CustomError 60000 -Force\nCopies only the custom error with ID number 60000 from sqlserver2014a to sqlcluster using SQL credentials for sqlserver2014a and Windows credentials for sqlcluster. If a custom error with the same \r\nname exists on sqlcluster, it will be updated because -Force was used.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eCopy-DbaCustomError -Source sqlserver2014a -Destination sqlcluster -ExcludeCustomError 60000 -Force\nCopies all the custom errors found on sqlserver2014a except the custom error with ID number 60000 to sqlcluster. If a custom error with the same name exists on sqlcluster, it will be updated because \r\n-Force was used.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eCopy-DbaCustomError -Source sqlserver2014a -Destination sqlcluster -WhatIf -Force\nShows what would happen if the command were executed using force.", "Syntax": "Copy-DbaCustomError [-Source] \u003cDbaInstanceParameter\u003e [[-SourceSqlCredential] \u003cPSCredential\u003e] [-Destination] \u003cDbaInstanceParameter[]\u003e [[-DestinationSqlCredential] \u003cPSCredential\u003e] [[-CustomError] \u003cObject[]\u003e] [[-ExcludeCustomError] \u003cObject[]\u003e] [-Force] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Copy-DbaDatabase", - "Description": "This script provides the ability to migrate databases using detach/copy/attach or backup/restore. This script works with named instances, clusters and SQL Server Express Edition.\n\nBy default, databases will be migrated to the destination SQL Server\u0027s default data and log directories. You can override this by specifying -ReuseSourceFolderStructure. Filestreams and filegroups are also migrated. Safety is emphasized.", + "Name": "Copy-DbaDatabase", + "Description": "This script provides the ability to migrate databases using detach/copy/attach or backup/restore. This script works with named instances, clusters and SQL Server Express Edition.\n\nBy default, databases will be migrated to the destination SQL Server\u0027s default data and log directories. You can override this by specifying -ReuseSourceFolderStructure. Filestreams and filegroups are also migrated. Safety is emphasized.\n\nIf you are experiencing issues with Copy-DbaDatabase, please use Backup-DbaDatabase | Restore-DbaDatabase instead.", "Tags": [ "Migration", "Backup", "Restore" ], + "Synopsis": "Migrates SQL Server databases from one SQL Server to another.", + "Alias": "Copy-SqlDatabase", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Copy-DbaDatabase", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Copy-DbaDatabase", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eCopy-DbaDatabase -Source sql2014a -Destination sql2014b -Database TestDB -BackupRestore -SharedPath \\\\fileshare\\sql\\migration\nMigrates a single user database TestDB using Backup and restore from instance sql2014a to sql2014b. Backup files are stored in \\\\fileshare\\sql\\migration.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eCopy-DbaDatabase -Source sql2012 -Destination sql2014, sql2016 -DetachAttach -Reattach\nDatabases will be migrated from sql2012 to both sql2014 and sql2016 using the detach/copy files/attach method.The following will be performed: kick all users out of the database, detach all data/log \r\nfiles, move files across the network over an admin share (\\\\SqlSERVER\\M$\\MSSql...), attach file on destination server, reattach at source. If the database files (*.mdf, *.ndf, *.ldf) on *destination* \r\nexist and aren\u0027t in use, they will be overwritten.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eCopy-DbaDatabase -Source sql2014a -Destination sqlcluster, sql2016 -BackupRestore -UseLastBackup -Force\nMigrates all user databases to sqlcluster and sql2016 using the last Full, Diff and Log backups from sql204a. If the databases exists on the destinations, they will be dropped prior to attach.\nNote that the backups must exist in a location accessible by all destination servers, such a network share.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eCopy-DbaDatabase -Source sql2014a -Destination sqlcluster -ExcludeDatabase Northwind, pubs -IncludeSupportDbs -Force -BackupRestore -SharedPath \\\\fileshare\\sql\\migration\nMigrates all user databases except for Northwind and pubs by using backup/restore (copy-only). Backup files are stored in \\\\fileshare\\sql\\migration. If the database exists on the destination, it will \r\nbe dropped prior to attach.\nIt also includes the support databases (ReportServer, ReportServerTempDb, distribution).", "Params": [ [ "Source", @@ -3222,7 +3267,7 @@ ], [ "Force", - "If this switch is enabled, existing databases on Destination with matching names from Source will be dropped. If using -DetachReattach, mirrors will be broken and the database(s) dropped from \r\nAvailability Groups.", + "If this switch is enabled, existing databases on Destination with matching names from Source will be dropped.\r\nIf using -DetachReattach, mirrors will be broken and the database(s) dropped from Availability Groups.\r\nIf using -SetSourceReadonly, this will instantly roll back any open transactions that may be stopping the process.", "", false, "false", @@ -3253,21 +3298,22 @@ "" ] ], - "Alias": "Copy-SqlDatabase", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Migrates SQL Server databases from one SQL Server to another.", - "Name": "Copy-DbaDatabase", - "Links": "https://dbatools.io/Copy-DbaDatabase", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eCopy-DbaDatabase -Source sql2014a -Destination sql2014b -Database TestDB -BackupRestore -SharedPath \\\\fileshare\\sql\\migration\nMigrates a single user database TestDB using Backup and restore from instance sql2014a to sql2014b. Backup files are stored in \\\\fileshare\\sql\\migration.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eCopy-DbaDatabase -Source sql2012 -Destination sql2014, sql2016 -DetachAttach -Reattach\nDatabases will be migrated from sql2012 to both sql2014 and sql2016 using the detach/copy files/attach method.The following will be performed: kick all users out of the database, detach all data/log \r\nfiles, move files across the network over an admin share (\\\\SqlSERVER\\M$\\MSSql...), attach file on destination server, reattach at source. If the database files (*.mdf, *.ndf, *.ldf) on *destination* \r\nexist and aren\u0027t in use, they will be overwritten.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eCopy-DbaDatabase -Source sql2014a -Destination sqlcluster, sql2016 -BackupRestore -UseLastBackup -Force\nMigrates all user databases to sqlcluster and sql2016 using the last Full, Diff and Log backups from sql204a. If the databases exists on the destinations, they will be dropped prior to attach.\nNote that the backups must exist in a location accessible by all destination servers, such a network share.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eCopy-DbaDatabase -Source sql2014a -Destination sqlcluster -ExcludeDatabase Northwind, pubs -IncludeSupportDbs -Force -BackupRestore -SharedPath \\\\fileshare\\sql\\migration\nMigrates all user databases except for Northwind and pubs by using backup/restore (copy-only). Backup files are stored in \\\\fileshare\\sql\\migration. If the database exists on the destination, it will \r\nbe dropped prior to attach.\nIt also includes the support databases (ReportServer, ReportServerTempDb, distribution).", "Syntax": "Copy-DbaDatabase [-Source \u003cDbaInstanceParameter\u003e] [-SourceSqlCredential \u003cPSCredential\u003e] -Destination \u003cDbaInstanceParameter[]\u003e [-DestinationSqlCredential \u003cPSCredential\u003e] [-Database \u003cObject[]\u003e] [-ExcludeDatabase \u003cObject[]\u003e] [-AllDatabases] -BackupRestore [-SharedPath \u003cString\u003e] [-WithReplace] [-NoRecovery] [-NoBackupCleanup] [-NumberFiles \u003cInt32\u003e] [-SetSourceReadOnly] [-ReuseSourceFolderStructure] [-IncludeSupportDbs] [-UseLastBackup] [-Continue] [-InputObject \u003cDatabase[]\u003e] [-NoCopyOnly] [-SetSourceOffline] [-NewName \u003cString\u003e] [-Prefix \u003cString\u003e] [-Force] [-EnableException] [-WhatIf] [-Confirm] \r\n[\u003cCommonParameters\u003e]\nCopy-DbaDatabase [-Source \u003cDbaInstanceParameter\u003e] [-SourceSqlCredential \u003cPSCredential\u003e] -Destination \u003cDbaInstanceParameter[]\u003e [-DestinationSqlCredential \u003cPSCredential\u003e] [-Database \u003cObject[]\u003e] [-ExcludeDatabase \u003cObject[]\u003e] [-AllDatabases] -DetachAttach [-Reattach] [-SetSourceReadOnly] [-ReuseSourceFolderStructure] [-IncludeSupportDbs] [-InputObject \u003cDatabase[]\u003e] [-NoCopyOnly] [-SetSourceOffline] [-NewName \u003cString\u003e] [-Prefix \u003cString\u003e] [-Force] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Copy-DbaDataCollector", + "Name": "Copy-DbaDataCollector", "Description": "By default, all data collector objects are migrated. If the object already exists on the destination, it will be skipped unless -Force is used.\n\nThe -CollectionSet parameter is auto-populated for command-line completion and can be used to copy only specific objects.", "Tags": [ "Migration", "DataCollection" ], + "Synopsis": "Migrates user SQL Data Collector collection sets. SQL Data Collector configuration is on the agenda, but it\u0027s hard.", + "Alias": "Copy-DbaSqlDataCollector,Copy-SqlDataCollector", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Copy-DbaDataCollector", + "Availability": "Windows only", + "Links": "https://dbatools.io/Copy-DbaDataCollector", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eCopy-DbaDataCollector -Source sqlserver2014a -Destination sqlcluster\nCopies all Data Collector Objects and Configurations from sqlserver2014a to sqlcluster, using Windows credentials.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eCopy-DbaDataCollector -Source sqlserver2014a -Destination sqlcluster -SourceSqlCredential $cred\nCopies all Data Collector Objects and Configurations from sqlserver2014a to sqlcluster, using SQL credentials for sqlserver2014a and Windows credentials for sqlcluster.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eCopy-DbaDataCollector -Source sqlserver2014a -Destination sqlcluster -WhatIf\nShows what would happen if the command were executed.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eCopy-DbaDataCollector -Source sqlserver2014a -Destination sqlcluster -CollectionSet \u0027Server Activity\u0027, \u0027Table Usage Analysis\u0027\nCopies two Collection Sets, Server Activity and Table Usage Analysis, from sqlserver2014a to sqlcluster.", "Params": [ [ "Source", @@ -3358,21 +3404,22 @@ "" ] ], - "Alias": "Copy-DbaSqlDataCollector,Copy-SqlDataCollector", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Migrates user SQL Data Collector collection sets. SQL Data Collector configuration is on the agenda, but it\u0027s hard.", - "Name": "Copy-DbaDataCollector", - "Links": "https://dbatools.io/Copy-DbaDataCollector", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eCopy-DbaDataCollector -Source sqlserver2014a -Destination sqlcluster\nCopies all Data Collector Objects and Configurations from sqlserver2014a to sqlcluster, using Windows credentials.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eCopy-DbaDataCollector -Source sqlserver2014a -Destination sqlcluster -SourceSqlCredential $cred\nCopies all Data Collector Objects and Configurations from sqlserver2014a to sqlcluster, using SQL credentials for sqlserver2014a and Windows credentials for sqlcluster.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eCopy-DbaDataCollector -Source sqlserver2014a -Destination sqlcluster -WhatIf\nShows what would happen if the command were executed.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eCopy-DbaDataCollector -Source sqlserver2014a -Destination sqlcluster -CollectionSet \u0027Server Activity\u0027, \u0027Table Usage Analysis\u0027\nCopies two Collection Sets, Server Activity and Table Usage Analysis, from sqlserver2014a to sqlcluster.", "Syntax": "Copy-DbaDataCollector [-Source] \u003cDbaInstanceParameter\u003e [[-SourceSqlCredential] \u003cPSCredential\u003e] [-Destination] \u003cDbaInstanceParameter[]\u003e [[-DestinationSqlCredential] \u003cPSCredential\u003e] [[-CollectionSet] \u003cObject[]\u003e] [[-ExcludeCollectionSet] \u003cObject[]\u003e] [-NoServerReconfig] [-Force] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Copy-DbaDbAssembly", + "Name": "Copy-DbaDbAssembly", "Description": "By default, all assemblies are copied.\n\nIf the assembly already exists on the destination, it will be skipped unless -Force is used.\n\nThis script does not yet copy dependencies or dependent objects.", "Tags": [ "Migration", "Assembly" ], + "Synopsis": "Copy-DbaDbAssembly migrates assemblies from one SQL Server to another.", + "Alias": "Copy-DbaDatabaseAssembly,Copy-SqlDatabaseAssembly", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Copy-DbaDbAssembly", + "Availability": "Windows, Linux, macOS", + "Links": "http://dbatools.io/Get-SqlDatabaseAssembly", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eCopy-DbaDbAssembly -Source sqlserver2014a -Destination sqlcluster\nCopies all assemblies from sqlserver2014a to sqlcluster using Windows credentials. If assemblies with the same name exist on sqlcluster, they will be skipped.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eCopy-DbaDbAssembly -Source sqlserver2014a -Destination sqlcluster -Assembly dbname.assemblyname, dbname3.anotherassembly -SourceSqlCredential $cred -Force\nCopies two assemblies, the dbname.assemblyname and dbname3.anotherassembly from sqlserver2014a to sqlcluster using SQL credentials for sqlserver2014a and Windows credentials for sqlcluster. If an \r\nassembly with the same name exists on sqlcluster, it will be dropped and recreated because -Force was used.\nIn this example, anotherassembly will be copied to the dbname3 database on the server sqlcluster.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eCopy-DbaDbAssembly -Source sqlserver2014a -Destination sqlcluster -WhatIf -Force\nShows what would happen if the command were executed using force.", "Params": [ [ "Source", @@ -3455,21 +3502,22 @@ "" ] ], - "Alias": "Copy-DbaDatabaseAssembly,Copy-SqlDatabaseAssembly", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Copy-DbaDbAssembly migrates assemblies from one SQL Server to another.", - "Name": "Copy-DbaDbAssembly", - "Links": "http://dbatools.io/Get-SqlDatabaseAssembly", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eCopy-DbaDbAssembly -Source sqlserver2014a -Destination sqlcluster\nCopies all assemblies from sqlserver2014a to sqlcluster using Windows credentials. If assemblies with the same name exist on sqlcluster, they will be skipped.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eCopy-DbaDbAssembly -Source sqlserver2014a -Destination sqlcluster -Assembly dbname.assemblyname, dbname3.anotherassembly -SourceSqlCredential $cred -Force\nCopies two assemblies, the dbname.assemblyname and dbname3.anotherassembly from sqlserver2014a to sqlcluster using SQL credentials for sqlserver2014a and Windows credentials for sqlcluster. If an \r\nassembly with the same name exists on sqlcluster, it will be dropped and recreated because -Force was used.\nIn this example, anotherassembly will be copied to the dbname3 database on the server sqlcluster.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eCopy-DbaDbAssembly -Source sqlserver2014a -Destination sqlcluster -WhatIf -Force\nShows what would happen if the command were executed using force.", "Syntax": "Copy-DbaDbAssembly [-Source] \u003cDbaInstanceParameter\u003e [[-SourceSqlCredential] \u003cPSCredential\u003e] [-Destination] \u003cDbaInstanceParameter[]\u003e [[-DestinationSqlCredential] \u003cPSCredential\u003e] [[-Assembly] \u003cObject[]\u003e] [[-ExcludeAssembly] \u003cObject[]\u003e] [-Force] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Copy-DbaDbMail", + "Name": "Copy-DbaDbMail", "Description": "By default, all mail configurations for Profiles, Accounts, Mail Servers and Configs are copied.", "Tags": [ "Migration", "Mail" ], + "Synopsis": "Migrates Mail Profiles, Accounts, Mail Servers and Mail Server Configs from one SQL Server to another.", + "Alias": "Copy-DbaDatabaseMail,Copy-SqlDatabaseMail", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Copy-DbaDbMail", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Copy-DbaDbMail", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eCopy-DbaDbMail -Source sqlserver2014a -Destination sqlcluster\nCopies all database mail objects from sqlserver2014a to sqlcluster using Windows credentials. If database mail objects with the same name exist on sqlcluster, they will be skipped.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eCopy-DbaDbMail -Source sqlserver2014a -Destination sqlcluster -SourceSqlCredential $cred\nCopies all database mail objects from sqlserver2014a to sqlcluster using SQL credentials for sqlserver2014a and Windows credentials for sqlcluster.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eCopy-DbaDbMail -Source sqlserver2014a -Destination sqlcluster -WhatIf\nShows what would happen if the command were executed.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eCopy-DbaDbMail -Source sqlserver2014a -Destination sqlcluster -EnableException\nPerforms execution of function, and will throw a terminating exception if something breaks", "Params": [ [ "Source", @@ -3544,18 +3592,19 @@ "" ] ], - "Alias": "Copy-DbaDatabaseMail,Copy-SqlDatabaseMail", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Migrates Mail Profiles, Accounts, Mail Servers and Mail Server Configs from one SQL Server to another.", - "Name": "Copy-DbaDbMail", - "Links": "https://dbatools.io/Copy-DbaDbMail", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eCopy-DbaDbMail -Source sqlserver2014a -Destination sqlcluster\nCopies all database mail objects from sqlserver2014a to sqlcluster using Windows credentials. If database mail objects with the same name exist on sqlcluster, they will be skipped.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eCopy-DbaDbMail -Source sqlserver2014a -Destination sqlcluster -SourceSqlCredential $cred\nCopies all database mail objects from sqlserver2014a to sqlcluster using SQL credentials for sqlserver2014a and Windows credentials for sqlcluster.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eCopy-DbaDbMail -Source sqlserver2014a -Destination sqlcluster -WhatIf\nShows what would happen if the command were executed.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eCopy-DbaDbMail -Source sqlserver2014a -Destination sqlcluster -EnableException\nPerforms execution of function, and will throw a terminating exception if something breaks", "Syntax": "Copy-DbaDbMail -Source \u003cDbaInstanceParameter\u003e -Destination \u003cDbaInstanceParameter[]\u003e [-SourceSqlCredential \u003cPSCredential\u003e] [-DestinationSqlCredential \u003cPSCredential\u003e] [-Force] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]\nCopy-DbaDbMail -Source \u003cDbaInstanceParameter\u003e -Destination \u003cDbaInstanceParameter[]\u003e [-Type \u003cString[]\u003e] [-SourceSqlCredential \u003cPSCredential\u003e] [-DestinationSqlCredential \u003cPSCredential\u003e] [-Force] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Copy-DbaDbQueryStoreOption", + "Name": "Copy-DbaDbQueryStoreOption", "Description": "Copies the configuration of a Query Store enabled database and sets the copied configuration on other databases.", "Tags": "QueryStore", + "Synopsis": "Copies the configuration of a Query Store enabled database and sets the copied configuration on other databases.", + "Alias": "Copy-DbaQueryStoreConfig", + "Author": "Enrico van de Laar (@evdlaar)", + "CommandName": "Copy-DbaDbQueryStoreOption", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Copy-QueryStoreConfig", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eCopy-DbaDbQueryStoreOption -Source ServerA\\SQL -SourceDatabase AdventureWorks -Destination ServerB\\SQL -AllDatabases\nCopy the Query Store configuration of the AdventureWorks database in the ServerA\\SQL instance and apply it on all user databases in the ServerB\\SQL Instance.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eCopy-DbaDbQueryStoreOption -Source ServerA\\SQL -SourceDatabase AdventureWorks -Destination ServerB\\SQL -DestinationDatabase WorldWideTraders\nCopy the Query Store configuration of the AdventureWorks database in the ServerA\\SQL instance and apply it to the WorldWideTraders database in the ServerB\\SQL Instance.", "Params": [ [ "Source", @@ -3646,18 +3695,19 @@ "" ] ], - "Alias": "Copy-DbaQueryStoreConfig", - "Author": "Enrico van de Laar (@evdlaar)", - "Synopsis": "Copies the configuration of a Query Store enabled database and sets the copied configuration on other databases.", - "Name": "Copy-DbaDbQueryStoreOption", - "Links": "https://dbatools.io/Copy-QueryStoreConfig", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eCopy-DbaDbQueryStoreOption -Source ServerA\\SQL -SourceDatabase AdventureWorks -Destination ServerB\\SQL -AllDatabases\nCopy the Query Store configuration of the AdventureWorks database in the ServerA\\SQL instance and apply it on all user databases in the ServerB\\SQL Instance.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eCopy-DbaDbQueryStoreOption -Source ServerA\\SQL -SourceDatabase AdventureWorks -Destination ServerB\\SQL -DestinationDatabase WorldWideTraders\nCopy the Query Store configuration of the AdventureWorks database in the ServerA\\SQL instance and apply it to the WorldWideTraders database in the ServerB\\SQL Instance.", "Syntax": "Copy-DbaDbQueryStoreOption [-Source] \u003cDbaInstanceParameter\u003e [[-SourceSqlCredential] \u003cPSCredential\u003e] [-SourceDatabase] \u003cObject\u003e [-Destination] \u003cDbaInstanceParameter[]\u003e [[-DestinationSqlCredential] \u003cPSCredential\u003e] [[-DestinationDatabase] \u003cObject[]\u003e] [[-Exclude] \u003cObject[]\u003e] [-AllDatabases] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Copy-DbaDbTableData", + "Name": "Copy-DbaDbTableData", "Description": "Copies data between SQL Server tables using SQL Bulk Copy.\nThe same can be achieved also doing\n$sourcetable = Invoke-DbaQuery -SqlInstance instance1 ... -As DataTable\nWrite-DbaDataTable -SqlInstance ... -InputObject $sourcetable\nbut it will force buffering the contents on the table in memory (high RAM usage for large tables).\nWith this function, a streaming copy will be done in the most speedy and least resource-intensive way.", "Tags": "Migration", + "Synopsis": "Copies data between SQL Server tables.", + "Alias": "Copy-DbaTableData", + "Author": "Simone Bizzotto (@niphlod)", + "CommandName": "Copy-DbaDbTableData", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Copy-DbaDbTableData", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eCopy-DbaDbTableData -SqlInstance sql1 -Destination sql2 -Database dbatools_from -Table dbo.test_table\nCopies all the data from table dbo.test_table in database dbatools_from on sql1 to table test_table in database dbatools_from on sql2.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eCopy-DbaDbTableData -SqlInstance sql1 -Destination sql2 -Database dbatools_from -DestinationDatabase dbatools_dest -Table [Schema].[test table]\nCopies all the data from table [Schema].[test table] in database dbatools_from on sql1 to table [Schema].[test table] in database dbatools_dest on sql2\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaDbTable -SqlInstance sql1 -Database tempdb -Table tb1, tb2 | Copy-DbaDbTableData -DestinationTable tb3\nCopies all data from tables tb1 and tb2 in tempdb on sql1 to tb3 in tempdb on sql1\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaDbTable -SqlInstance sql1 -Database tempdb -Table tb1, tb2 | Copy-DbaDbTableData -Destination sql2\nCopies data from tbl1 in tempdb on sql1 to tbl1 in tempdb on sql2\r\nthen\r\nCopies data from tbl2 in tempdb on sql1 to tbl2 in tempdb on sql2\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eCopy-DbaDbTableData -SqlInstance sql1 -Destination sql2 -Database dbatools_from -Table test_table -KeepIdentity -Truncate\nCopies all the data in table test_table from sql1 to sql2, using the database dbatools_from, keeping identity columns and truncating the destination\n-------------------------- EXAMPLE 6 --------------------------\nPS C:\\\u003e$params = @{\n\u003e\u003e SourceSqlInstance = \u0027sql1\u0027\r\n\u003e\u003e DestinationSqlInstance = \u0027sql2\u0027\r\n\u003e\u003e Database = \u0027dbatools_from\u0027\r\n\u003e\u003e DestinationDatabase = \u0027dbatools_dest\u0027\r\n\u003e\u003e Table = \u0027[Schema].[Table]\u0027\r\n\u003e\u003e DestinationTable = \u0027[dbo].[Table.Copy]\u0027\r\n\u003e\u003e KeepIdentity = $true\r\n\u003e\u003e KeepNulls = $true\r\n\u003e\u003e Truncate = $true\r\n\u003e\u003e BatchSize = 10000\r\n\u003e\u003e }\r\n\u003e\u003e\r\nPS C:\\\u003e Copy-DbaDbTableData @params\nCopies all the data from table [Schema].[Table] in database dbatools_from on sql1 to table [dbo].[Table.Copy] in database dbatools_dest on sql2\r\nKeeps identity columns and Nulls, truncates the destination and processes in BatchSize of 10000.", "Params": [ [ "SqlInstance", @@ -3844,21 +3894,22 @@ "" ] ], - "Alias": "Copy-DbaTableData", - "Author": "Simone Bizzotto (@niphlod)", - "Synopsis": "Copies data between SQL Server tables.", - "Name": "Copy-DbaDbTableData", - "Links": "https://dbatools.io/Copy-DbaDbTableData", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eCopy-DbaDbTableData -SqlInstance sql1 -Destination sql2 -Database dbatools_from -Table dbo.test_table\nCopies all the data from table dbo.test_table in database dbatools_from on sql1 to table test_table in database dbatools_from on sql2.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eCopy-DbaDbTableData -SqlInstance sql1 -Destination sql2 -Database dbatools_from -DestinationDatabase dbatools_dest -Table [Schema].[test table]\nCopies all the data from table [Schema].[test table] in database dbatools_from on sql1 to table [Schema].[test table] in database dbatools_dest on sql2\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaDbTable -SqlInstance sql1 -Database tempdb -Table tb1, tb2 | Copy-DbaDbTableData -DestinationTable tb3\nCopies all data from tables tb1 and tb2 in tempdb on sql1 to tb3 in tempdb on sql1\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaDbTable -SqlInstance sql1 -Database tempdb -Table tb1, tb2 | Copy-DbaDbTableData -Destination sql2\nCopies data from tbl1 in tempdb on sql1 to tbl1 in tempdb on sql2\r\nthen\r\nCopies data from tbl2 in tempdb on sql1 to tbl2 in tempdb on sql2\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eCopy-DbaDbTableData -SqlInstance sql1 -Destination sql2 -Database dbatools_from -Table test_table -KeepIdentity -Truncate\nCopies all the data in table test_table from sql1 to sql2, using the database dbatools_from, keeping identity columns and truncating the destination\n-------------------------- EXAMPLE 6 --------------------------\nPS C:\\\u003e$params = @{\n\u003e\u003e SourceSqlInstance = \u0027sql1\u0027\r\n\u003e\u003e DestinationSqlInstance = \u0027sql2\u0027\r\n\u003e\u003e Database = \u0027dbatools_from\u0027\r\n\u003e\u003e DestinationDatabase = \u0027dbatools_dest\u0027\r\n\u003e\u003e Table = \u0027[Schema].[Table]\u0027\r\n\u003e\u003e DestinationTable = \u0027[dbo].[Table.Copy]\u0027\r\n\u003e\u003e KeepIdentity = $true\r\n\u003e\u003e KeepNulls = $true\r\n\u003e\u003e Truncate = $true\r\n\u003e\u003e BatchSize = 10000\r\n\u003e\u003e }\r\n\u003e\u003e\r\nPS C:\\\u003e Copy-DbaDbTableData @params\nCopies all the data from table [Schema].[Table] in database dbatools_from on sql1 to table [dbo].[Table.Copy] in database dbatools_dest on sql2\r\nKeeps identity columns and Nulls, truncates the destination and processes in BatchSize of 10000.", "Syntax": "Copy-DbaDbTableData [[-SqlInstance] \u003cDbaInstanceParameter\u003e] [[-SqlCredential] \u003cPSCredential\u003e] [[-Destination] \u003cDbaInstanceParameter[]\u003e] [[-DestinationSqlCredential] \u003cPSCredential\u003e] [[-Database] \u003cString\u003e] [[-DestinationDatabase] \u003cString\u003e] [[-Table] \u003cString[]\u003e] [[-Query] \u003cString\u003e] [-AutoCreateTable] [[-BatchSize] \u003cInt32\u003e] [[-NotifyAfter] \u003cInt32\u003e] [[-DestinationTable] \u003cString\u003e] [-NoTableLock] [-CheckConstraints] [-FireTriggers] [-KeepIdentity] [-KeepNulls] [-Truncate] [[-bulkCopyTimeOut] \u003cInt32\u003e] [[-InputObject] \u003cTable[]\u003e] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Copy-DbaEndpoint", + "Name": "Copy-DbaEndpoint", "Description": "By default, all endpoints are copied.\n\nIf the endpoint already exists on the destination, it will be skipped unless -Force is used.", "Tags": [ "Migration", "Endpoint" ], + "Synopsis": "Copy-DbaEndpoint migrates server endpoints from one SQL Server to another.", + "Alias": "Copy-SqlEndpoint", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Copy-DbaEndpoint", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Copy-DbaEndpoint", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eCopy-DbaEndpoint -Source sqlserver2014a -Destination sqlcluster\nCopies all server endpoints from sqlserver2014a to sqlcluster, using Windows credentials. If endpoints with the same name exist on sqlcluster, they will be skipped.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eCopy-DbaEndpoint -Source sqlserver2014a -SourceSqlCredential $cred -Destination sqlcluster -Endpoint tg_noDbDrop -Force\nCopies only the tg_noDbDrop endpoint from sqlserver2014a to sqlcluster using SQL credentials for sqlserver2014a and Windows credentials for sqlcluster. If an endpoint with the same name exists on \r\nsqlcluster, it will be dropped and recreated because -Force was used.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eCopy-DbaEndpoint -Source sqlserver2014a -Destination sqlcluster -WhatIf -Force\nShows what would happen if the command were executed using force.", "Params": [ [ "Source", @@ -3941,22 +3992,23 @@ "" ] ], - "Alias": "Copy-SqlEndpoint", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Copy-DbaEndpoint migrates server endpoints from one SQL Server to another.", - "Name": "Copy-DbaEndpoint", - "Links": "https://dbatools.io/Copy-DbaEndpoint", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eCopy-DbaEndpoint -Source sqlserver2014a -Destination sqlcluster\nCopies all server endpoints from sqlserver2014a to sqlcluster, using Windows credentials. If endpoints with the same name exist on sqlcluster, they will be skipped.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eCopy-DbaEndpoint -Source sqlserver2014a -SourceSqlCredential $cred -Destination sqlcluster -Endpoint tg_noDbDrop -Force\nCopies only the tg_noDbDrop endpoint from sqlserver2014a to sqlcluster using SQL credentials for sqlserver2014a and Windows credentials for sqlcluster. If an endpoint with the same name exists on \r\nsqlcluster, it will be dropped and recreated because -Force was used.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eCopy-DbaEndpoint -Source sqlserver2014a -Destination sqlcluster -WhatIf -Force\nShows what would happen if the command were executed using force.", "Syntax": "Copy-DbaEndpoint [-Source] \u003cDbaInstanceParameter\u003e [[-SourceSqlCredential] \u003cPSCredential\u003e] [-Destination] \u003cDbaInstanceParameter[]\u003e [[-DestinationSqlCredential] \u003cPSCredential\u003e] [[-Endpoint] \u003cObject[]\u003e] [[-ExcludeEndpoint] \u003cObject[]\u003e] [-Force] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Copy-DbaLinkedServer", + "Name": "Copy-DbaLinkedServer", "Description": "By using password decryption techniques provided by Antti Rantasaari (NetSPI, 2014), this script migrates SQL Server Linked Servers from one server to another, while maintaining username and password.\n\nCredit: https://blog.netspi.com/decrypting-mssql-database-link-server-passwords/", "Tags": [ "WSMan", "Migration", "LinkedServer" ], + "Synopsis": "Copy-DbaLinkedServer migrates Linked Servers from one SQL Server to another. Linked Server logins and passwords are migrated as well.", + "Alias": "Copy-SqlLinkedServer", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Copy-DbaLinkedServer", + "Availability": "Windows only", + "Links": "https://dbatools.io/Copy-DbaLinkedServer", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eCopy-DbaLinkedServer -Source sqlserver2014a -Destination sqlcluster\nCopies all SQL Server Linked Servers on sqlserver2014a to sqlcluster. If Linked Server exists on destination, it will be skipped.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eCopy-DbaLinkedServer -Source sqlserver2014a -Destination sqlcluster -LinkedServer SQL2K5,SQL2k -Force\nCopies over two SQL Server Linked Servers (SQL2K and SQL2K2) from sqlserver to sqlcluster. If the credential already exists on the destination, it will be dropped.", "Params": [ [ "Source", @@ -4047,21 +4099,22 @@ "" ] ], - "Alias": "Copy-SqlLinkedServer", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Copy-DbaLinkedServer migrates Linked Servers from one SQL Server to another. Linked Server logins and passwords are migrated as well.", - "Name": "Copy-DbaLinkedServer", - "Links": "https://dbatools.io/Copy-DbaLinkedServer", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eCopy-DbaLinkedServer -Source sqlserver2014a -Destination sqlcluster\nCopies all SQL Server Linked Servers on sqlserver2014a to sqlcluster. If Linked Server exists on destination, it will be skipped.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eCopy-DbaLinkedServer -Source sqlserver2014a -Destination sqlcluster -LinkedServer SQL2K5,SQL2k -Force\nCopies over two SQL Server Linked Servers (SQL2K and SQL2K2) from sqlserver to sqlcluster. If the credential already exists on the destination, it will be dropped.", "Syntax": "Copy-DbaLinkedServer [-Source] \u003cDbaInstanceParameter\u003e [[-SourceSqlCredential] \u003cPSCredential\u003e] [-Destination] \u003cDbaInstanceParameter[]\u003e [[-DestinationSqlCredential] \u003cPSCredential\u003e] [[-LinkedServer] \u003cObject[]\u003e] [[-ExcludeLinkedServer] \u003cObject[]\u003e] [-UpgradeSqlClient] [-Force] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Copy-DbaLogin", + "Name": "Copy-DbaLogin", "Description": "SQL Server 2000: Migrates logins with SIDs, passwords, server roles and database roles.\n\nSQL Server 2005 \u0026 newer: Migrates logins with SIDs, passwords, defaultdb, server roles \u0026 securables, database permissions \u0026 securables, login attributes (enforce password policy, expiration, etc.)\n\nThe login hash algorithm changed in SQL Server 2012, and is not backwards compatible with previous SQL Server versions. This means that while SQL Server 2000 logins can be migrated to SQL Server 2012, logins created in SQL Server 2012 can only be migrated to SQL Server 2012 and above.", "Tags": [ "Migration", "Login" ], + "Synopsis": "Migrates logins from source to destination SQL Servers. Supports SQL Server versions 2000 and newer.", + "Alias": "Copy-SqlLogin", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Copy-DbaLogin", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Copy-DbaLogin", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eCopy-DbaLogin -Source sqlserver2014a -Destination sqlcluster -Force\nCopies all logins from Source Destination. If a SQL Login on Source exists on the Destination, the Login on Destination will be dropped and recreated.\nIf active connections are found for a login, the copy of that Login will fail as it cannot be dropped.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eCopy-DbaLogin -Source sqlserver2014a -Destination sqlcluster -Force -KillActiveConnection\nCopies all logins from Source Destination. If a SQL Login on Source exists on the Destination, the Login on Destination will be dropped and recreated.\nIf any active connections are found they will be killed.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eCopy-DbaLogin -Source sqlserver2014a -Destination sqlcluster -ExcludeLogin realcajun -SourceSqlCredential $scred -DestinationSqlCredential $dcred\nCopies all Logins from Source to Destination except for realcajun using SQL Authentication to connect to both instances.\nIf a Login already exists on the destination, it will not be migrated.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eCopy-DbaLogin -Source sqlserver2014a -Destination sqlcluster -Login realcajun, netnerds -force\nCopies ONLY Logins netnerds and realcajun. If Login realcajun or netnerds exists on Destination, the existing Login(s) will be dropped and recreated.\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eCopy-DbaLogin -Source sqlserver2014a -Destination sqlcluster -SyncOnly\nSyncs only SQL Server login permissions, roles, etc. Does not add or drop logins or users.\nIf a matching Login does not exist on Destination, the Login will be skipped.\n-------------------------- EXAMPLE 6 --------------------------\nPS C:\\\u003eCopy-DbaLogin -LoginRenameHashtable @{ \"PreviousUser\" = \"newlogin\" } -Source $Sql01 -Destination Localhost -SourceSqlCredential $sqlcred\nCopies PreviousUser and then renames it to newlogin.\n-------------------------- EXAMPLE 7 --------------------------\nPS C:\\\u003eGet-DbaLogin -SqlInstance sql2016 | Out-GridView -Passthru | Copy-DbaLogin -Destination sql2017\nDisplays all available logins on sql2016 in a grid view, then copies all selected logins to sql2017.", "Params": [ [ "Source", @@ -4208,18 +4261,19 @@ "" ] ], - "Alias": "Copy-SqlLogin", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Migrates logins from source to destination SQL Servers. Supports SQL Server versions 2000 and newer.", - "Name": "Copy-DbaLogin", - "Links": "https://dbatools.io/Copy-DbaLogin", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eCopy-DbaLogin -Source sqlserver2014a -Destination sqlcluster -Force\nCopies all logins from Source Destination. If a SQL Login on Source exists on the Destination, the Login on Destination will be dropped and recreated.\nIf active connections are found for a login, the copy of that Login will fail as it cannot be dropped.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eCopy-DbaLogin -Source sqlserver2014a -Destination sqlcluster -Force -KillActiveConnection\nCopies all logins from Source Destination. If a SQL Login on Source exists on the Destination, the Login on Destination will be dropped and recreated.\nIf any active connections are found they will be killed.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eCopy-DbaLogin -Source sqlserver2014a -Destination sqlcluster -ExcludeLogin realcajun -SourceSqlCredential $scred -DestinationSqlCredential $dcred\nCopies all Logins from Source to Destination except for realcajun using SQL Authentication to connect to both instances.\nIf a Login already exists on the destination, it will not be migrated.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eCopy-DbaLogin -Source sqlserver2014a -Destination sqlcluster -Login realcajun, netnerds -force\nCopies ONLY Logins netnerds and realcajun. If Login realcajun or netnerds exists on Destination, the existing Login(s) will be dropped and recreated.\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eCopy-DbaLogin -Source sqlserver2014a -Destination sqlcluster -SyncOnly\nSyncs only SQL Server login permissions, roles, etc. Does not add or drop logins or users.\nIf a matching Login does not exist on Destination, the Login will be skipped.\n-------------------------- EXAMPLE 6 --------------------------\nPS C:\\\u003eCopy-DbaLogin -LoginRenameHashtable @{ \"PreviousUser\" = \"newlogin\" } -Source $Sql01 -Destination Localhost -SourceSqlCredential $sqlcred\nCopies PreviousUser and then renames it to newlogin.\n-------------------------- EXAMPLE 7 --------------------------\nPS C:\\\u003eGet-DbaLogin -SqlInstance sql2016 | Out-GridView -Passthru | Copy-DbaLogin -Destination sql2017\nDisplays all available logins on sql2016 in a grid view, then copies all selected logins to sql2017.", "Syntax": "Copy-DbaLogin [-SourceSqlCredential \u003cPSCredential\u003e] -Destination \u003cDbaInstanceParameter[]\u003e [-DestinationSqlCredential \u003cPSCredential\u003e] [-Login \u003cObject[]\u003e] [-ExcludeLogin \u003cObject[]\u003e] [-ExcludeSystemLogins] [-SyncOnly] [-LoginRenameHashtable \u003cHashtable\u003e] [-KillActiveConnection] [-Force] [-ExcludePermissionSync] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]\nCopy-DbaLogin -Source \u003cDbaInstanceParameter\u003e [-SourceSqlCredential \u003cPSCredential\u003e] -Destination \u003cDbaInstanceParameter[]\u003e [-DestinationSqlCredential \u003cPSCredential\u003e] [-Login \u003cObject[]\u003e] [-ExcludeLogin \u003cObject[]\u003e] [-ExcludeSystemLogins] [-SyncOnly] [-SyncSaName] [-LoginRenameHashtable \u003cHashtable\u003e] [-KillActiveConnection] [-Force] [-ExcludePermissionSync] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]\nCopy-DbaLogin [-SourceSqlCredential \u003cPSCredential\u003e] -Destination \u003cDbaInstanceParameter[]\u003e [-DestinationSqlCredential \u003cPSCredential\u003e] [-Login \u003cObject[]\u003e] [-ExcludeLogin \u003cObject[]\u003e] [-ExcludeSystemLogins] [-SyncOnly] [-SyncSaName] [-LoginRenameHashtable \u003cHashtable\u003e] [-KillActiveConnection] [-Force] [-ExcludePermissionSync] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]\nCopy-DbaLogin [-SourceSqlCredential \u003cPSCredential\u003e] -Destination \u003cDbaInstanceParameter[]\u003e [-DestinationSqlCredential \u003cPSCredential\u003e] [-Login \u003cObject[]\u003e] [-ExcludeLogin \u003cObject[]\u003e] [-ExcludeSystemLogins] [-SyncOnly] -OutFile \u003cString\u003e [-LoginRenameHashtable \u003cHashtable\u003e] [-KillActiveConnection] [-Force] [-ExcludePermissionSync] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]\nCopy-DbaLogin [-SourceSqlCredential \u003cPSCredential\u003e] -Destination \u003cDbaInstanceParameter[]\u003e [-DestinationSqlCredential \u003cPSCredential\u003e] [-Login \u003cObject[]\u003e] [-ExcludeLogin \u003cObject[]\u003e] [-ExcludeSystemLogins] [-SyncOnly] [-InputObject \u003cObject\u003e] [-LoginRenameHashtable \u003cHashtable\u003e] [-KillActiveConnection] [-Force] [-ExcludePermissionSync] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Copy-DbaPolicyManagement", + "Name": "Copy-DbaPolicyManagement", "Description": "By default, all policies and conditions are copied. If an object already exist on the destination, it will be skipped unless -Force is used.\n\nThe -Policy and -Condition parameters are auto-populated for command-line completion and can be used to copy only specific objects.", "Tags": "Migration", + "Synopsis": "Migrates SQL Policy Based Management Objects, including both policies and conditions.", + "Alias": "Copy-DbaSqlPolicyManagement,Copy-SqlPolicyManagement", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Copy-DbaPolicyManagement", + "Availability": "Windows only", + "Links": "https://dbatools.io/Copy-DbaPolicyManagement", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eCopy-DbaPolicyManagement -Source sqlserver2014a -Destination sqlcluster\nCopies all policies and conditions from sqlserver2014a to sqlcluster, using Windows credentials.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eCopy-DbaPolicyManagement -Source sqlserver2014a -Destination sqlcluster -SourceSqlCredential $cred\nCopies all policies and conditions from sqlserver2014a to sqlcluster, using SQL credentials for sqlserver2014a and Windows credentials for sqlcluster.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eCopy-DbaPolicyManagement -Source sqlserver2014a -Destination sqlcluster -WhatIf\nShows what would happen if the command were executed.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eCopy-DbaPolicyManagement -Source sqlserver2014a -Destination sqlcluster -Policy \u0027xp_cmdshell must be disabled\u0027\nCopies only one policy, \u0027xp_cmdshell must be disabled\u0027 from sqlserver2014a to sqlcluster. No conditions are migrated.", "Params": [ [ "Source", @@ -4318,21 +4372,22 @@ "" ] ], - "Alias": "Copy-DbaSqlPolicyManagement,Copy-SqlPolicyManagement", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Migrates SQL Policy Based Management Objects, including both policies and conditions.", - "Name": "Copy-DbaPolicyManagement", - "Links": "https://dbatools.io/Copy-DbaPolicyManagement", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eCopy-DbaPolicyManagement -Source sqlserver2014a -Destination sqlcluster\nCopies all policies and conditions from sqlserver2014a to sqlcluster, using Windows credentials.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eCopy-DbaPolicyManagement -Source sqlserver2014a -Destination sqlcluster -SourceSqlCredential $cred\nCopies all policies and conditions from sqlserver2014a to sqlcluster, using SQL credentials for sqlserver2014a and Windows credentials for sqlcluster.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eCopy-DbaPolicyManagement -Source sqlserver2014a -Destination sqlcluster -WhatIf\nShows what would happen if the command were executed.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eCopy-DbaPolicyManagement -Source sqlserver2014a -Destination sqlcluster -Policy \u0027xp_cmdshell must be disabled\u0027\nCopies only one policy, \u0027xp_cmdshell must be disabled\u0027 from sqlserver2014a to sqlcluster. No conditions are migrated.", "Syntax": "Copy-DbaPolicyManagement [-Source] \u003cDbaInstanceParameter\u003e [[-SourceSqlCredential] \u003cPSCredential\u003e] [-Destination] \u003cDbaInstanceParameter[]\u003e [[-DestinationSqlCredential] \u003cPSCredential\u003e] [[-Policy] \u003cObject[]\u003e] [[-ExcludePolicy] \u003cObject[]\u003e] [[-Condition] \u003cObject[]\u003e] [[-ExcludeCondition] \u003cObject[]\u003e] [-Force] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Copy-DbaResourceGovernor", + "Name": "Copy-DbaResourceGovernor", "Description": "By default, all non-system resource pools are migrated. If the pool already exists on the destination, it will be skipped unless -Force is used.\n\nThe -ResourcePool parameter is auto-populated for command-line completion and can be used to copy only specific objects.", "Tags": [ "Migration", "ResourceGovernor" ], + "Synopsis": "Migrates Resource Pools", + "Alias": "Copy-SqlResourceGovernor", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Copy-DbaResourceGovernor", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Copy-DbaResourceGovernor", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eCopy-DbaResourceGovernor -Source sqlserver2014a -Destination sqlcluster\nCopies all all non-system resource pools from sqlserver2014a to sqlcluster using Windows credentials to connect to the SQL Server instances..\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eCopy-DbaResourceGovernor -Source sqlserver2014a -Destination sqlcluster -SourceSqlCredential $cred\nCopies all all non-system resource pools from sqlserver2014a to sqlcluster using SQL credentials to connect to sqlserver2014a and Windows credentials to connect to sqlcluster.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eCopy-DbaResourceGovernor -Source sqlserver2014a -Destination sqlcluster -WhatIf\nShows what would happen if the command were executed.", "Params": [ [ "Source", @@ -4415,18 +4470,19 @@ "" ] ], - "Alias": "Copy-SqlResourceGovernor", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Migrates Resource Pools", - "Name": "Copy-DbaResourceGovernor", - "Links": "https://dbatools.io/Copy-DbaResourceGovernor", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eCopy-DbaResourceGovernor -Source sqlserver2014a -Destination sqlcluster\nCopies all all non-system resource pools from sqlserver2014a to sqlcluster using Windows credentials to connect to the SQL Server instances..\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eCopy-DbaResourceGovernor -Source sqlserver2014a -Destination sqlcluster -SourceSqlCredential $cred\nCopies all all non-system resource pools from sqlserver2014a to sqlcluster using SQL credentials to connect to sqlserver2014a and Windows credentials to connect to sqlcluster.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eCopy-DbaResourceGovernor -Source sqlserver2014a -Destination sqlcluster -WhatIf\nShows what would happen if the command were executed.", "Syntax": "Copy-DbaResourceGovernor [-Source] \u003cDbaInstanceParameter\u003e [[-SourceSqlCredential] \u003cPSCredential\u003e] [-Destination] \u003cDbaInstanceParameter[]\u003e [[-DestinationSqlCredential] \u003cPSCredential\u003e] [[-ResourcePool] \u003cObject[]\u003e] [[-ExcludeResourcePool] \u003cObject[]\u003e] [-Force] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Copy-DbaServerAudit", + "Name": "Copy-DbaServerAudit", "Description": "By default, all audits are copied. The -Audit parameter is auto-populated for command-line completion and can be used to copy only specific audits.\n\nIf the audit already exists on the destination, it will be skipped unless -Force is used.", "Tags": "Migration", + "Synopsis": "Copy-DbaServerAudit migrates server audits from one SQL Server to another.", + "Alias": "Copy-SqlAudit", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Copy-DbaServerAudit", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Copy-DbaServerAudit", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eCopy-DbaServerAudit -Source sqlserver2014a -Destination sqlcluster\nCopies all server audits from sqlserver2014a to sqlcluster, using Windows credentials. If audits with the same name exist on sqlcluster, they will be skipped.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eCopy-DbaServerAudit -Source sqlserver2014a -Destination sqlcluster -Audit tg_noDbDrop -SourceSqlCredential $cred -Force\nCopies a single audit, the tg_noDbDrop audit from sqlserver2014a to sqlcluster, using SQL credentials for sqlserver2014a and Windows credentials for sqlcluster. If an audit with the same name exists \r\non sqlcluster, it will be dropped and recreated because -Force was used.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eCopy-DbaServerAudit -Source sqlserver2014a -Destination sqlcluster -WhatIf -Force\nShows what would happen if the command were executed using force.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eCopy-DbaServerAudit -Source sqlserver-0 -Destination sqlserver-1 -Audit audit1 -Path \u0027C:\\audit1\u0027\nCopies audit audit1 from sqlserver-0 to sqlserver-1. The file path on sqlserver-1 will be set to \u0027C:\\audit1\u0027.", "Params": [ [ "Source", @@ -4517,22 +4573,23 @@ "" ] ], - "Alias": "Copy-SqlAudit", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Copy-DbaServerAudit migrates server audits from one SQL Server to another.", - "Name": "Copy-DbaServerAudit", - "Links": "https://dbatools.io/Copy-DbaServerAudit", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eCopy-DbaServerAudit -Source sqlserver2014a -Destination sqlcluster\nCopies all server audits from sqlserver2014a to sqlcluster, using Windows credentials. If audits with the same name exist on sqlcluster, they will be skipped.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eCopy-DbaServerAudit -Source sqlserver2014a -Destination sqlcluster -Audit tg_noDbDrop -SourceSqlCredential $cred -Force\nCopies a single audit, the tg_noDbDrop audit from sqlserver2014a to sqlcluster, using SQL credentials for sqlserver2014a and Windows credentials for sqlcluster. If an audit with the same name exists \r\non sqlcluster, it will be dropped and recreated because -Force was used.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eCopy-DbaServerAudit -Source sqlserver2014a -Destination sqlcluster -WhatIf -Force\nShows what would happen if the command were executed using force.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eCopy-DbaServerAudit -Source sqlserver-0 -Destination sqlserver-1 -Audit audit1 -Path \u0027C:\\audit1\u0027\nCopies audit audit1 from sqlserver-0 to sqlserver-1. The file path on sqlserver-1 will be set to \u0027C:\\audit1\u0027.", "Syntax": "Copy-DbaServerAudit [-Source] \u003cDbaInstanceParameter\u003e [[-SourceSqlCredential] \u003cPSCredential\u003e] [-Destination] \u003cDbaInstanceParameter[]\u003e [[-DestinationSqlCredential] \u003cPSCredential\u003e] [[-Audit] \u003cObject[]\u003e] [[-ExcludeAudit] \u003cObject[]\u003e] [[-Path] \u003cString\u003e] [-Force] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Copy-DbaServerAuditSpecification", + "Name": "Copy-DbaServerAuditSpecification", "Description": "By default, all audits are copied. The -AuditSpecification parameter is auto-populated for command-line completion and can be used to copy only specific audits.\n\nIf the audit specification already exists on the destination, it will be skipped unless -Force is used.", "Tags": [ "Migration", "ServerAudit", "AuditSpecification" ], + "Synopsis": "Copy-DbaServerAuditSpecification migrates server audit specifications from one SQL Server to another.", + "Alias": "Copy-SqlAuditSpecification", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Copy-DbaServerAuditSpecification", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Copy-DbaServerAuditSpecification", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eCopy-DbaServerAuditSpecification -Source sqlserver2014a -Destination sqlcluster\nCopies all server audits from sqlserver2014a to sqlcluster using Windows credentials to connect. If audits with the same name exist on sqlcluster, they will be skipped.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eCopy-DbaServerAuditSpecification -Source sqlserver2014a -Destination sqlcluster -AuditSpecification tg_noDbDrop -SourceSqlCredential $cred -Force\nCopies a single audit, the tg_noDbDrop audit from sqlserver2014a to sqlcluster using SQL credentials to connect to sqlserver2014a and Windows credentials to connect to sqlcluster. If an audit \r\nspecification with the same name exists on sqlcluster, it will be dropped and recreated because -Force was used.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eCopy-DbaServerAuditSpecification -Source sqlserver2014a -Destination sqlcluster -WhatIf -Force\nShows what would happen if the command were executed using force.", "Params": [ [ "Source", @@ -4615,18 +4672,19 @@ "" ] ], - "Alias": "Copy-SqlAuditSpecification", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Copy-DbaServerAuditSpecification migrates server audit specifications from one SQL Server to another.", - "Name": "Copy-DbaServerAuditSpecification", - "Links": "https://dbatools.io/Copy-DbaServerAuditSpecification", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eCopy-DbaServerAuditSpecification -Source sqlserver2014a -Destination sqlcluster\nCopies all server audits from sqlserver2014a to sqlcluster using Windows credentials to connect. If audits with the same name exist on sqlcluster, they will be skipped.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eCopy-DbaServerAuditSpecification -Source sqlserver2014a -Destination sqlcluster -AuditSpecification tg_noDbDrop -SourceSqlCredential $cred -Force\nCopies a single audit, the tg_noDbDrop audit from sqlserver2014a to sqlcluster using SQL credentials to connect to sqlserver2014a and Windows credentials to connect to sqlcluster. If an audit \r\nspecification with the same name exists on sqlcluster, it will be dropped and recreated because -Force was used.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eCopy-DbaServerAuditSpecification -Source sqlserver2014a -Destination sqlcluster -WhatIf -Force\nShows what would happen if the command were executed using force.", "Syntax": "Copy-DbaServerAuditSpecification [-Source] \u003cDbaInstanceParameter\u003e [[-SourceSqlCredential] \u003cPSCredential\u003e] [-Destination] \u003cDbaInstanceParameter[]\u003e [[-DestinationSqlCredential] \u003cPSCredential\u003e] [[-AuditSpecification] \u003cObject[]\u003e] [[-ExcludeAuditSpecification] \u003cObject[]\u003e] [-Force] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Copy-DbaServerTrigger", + "Name": "Copy-DbaServerTrigger", "Description": "By default, all triggers are copied. The -ServerTrigger parameter is auto-populated for command-line completion and can be used to copy only specific triggers.\n\nIf the trigger already exists on the destination, it will be skipped unless -Force is used.", "Tags": "Migration", + "Synopsis": "Copy-DbaServerTrigger migrates server triggers from one SQL Server to another.", + "Alias": "Copy-SqlServerTrigger", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Copy-DbaServerTrigger", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Copy-DbaServerTrigger", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eCopy-DbaServerTrigger -Source sqlserver2014a -Destination sqlcluster\nCopies all server triggers from sqlserver2014a to sqlcluster, using Windows credentials. If triggers with the same name exist on sqlcluster, they will be skipped.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eCopy-DbaServerTrigger -Source sqlserver2014a -Destination sqlcluster -ServerTrigger tg_noDbDrop -SourceSqlCredential $cred -Force\nCopies a single trigger, the tg_noDbDrop trigger from sqlserver2014a to sqlcluster, using SQL credentials for sqlserver2014a and Windows credentials for sqlcluster. If a trigger with the same name \r\nexists on sqlcluster, it will be dropped and recreated because -Force was used.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eCopy-DbaServerTrigger -Source sqlserver2014a -Destination sqlcluster -WhatIf -Force\nShows what would happen if the command were executed using force.", "Params": [ [ "Source", @@ -4709,22 +4767,23 @@ "" ] ], - "Alias": "Copy-SqlServerTrigger", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Copy-DbaServerTrigger migrates server triggers from one SQL Server to another.", - "Name": "Copy-DbaServerTrigger", - "Links": "https://dbatools.io/Copy-DbaServerTrigger", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eCopy-DbaServerTrigger -Source sqlserver2014a -Destination sqlcluster\nCopies all server triggers from sqlserver2014a to sqlcluster, using Windows credentials. If triggers with the same name exist on sqlcluster, they will be skipped.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eCopy-DbaServerTrigger -Source sqlserver2014a -Destination sqlcluster -ServerTrigger tg_noDbDrop -SourceSqlCredential $cred -Force\nCopies a single trigger, the tg_noDbDrop trigger from sqlserver2014a to sqlcluster, using SQL credentials for sqlserver2014a and Windows credentials for sqlcluster. If a trigger with the same name \r\nexists on sqlcluster, it will be dropped and recreated because -Force was used.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eCopy-DbaServerTrigger -Source sqlserver2014a -Destination sqlcluster -WhatIf -Force\nShows what would happen if the command were executed using force.", "Syntax": "Copy-DbaServerTrigger [-Source] \u003cDbaInstanceParameter\u003e [[-SourceSqlCredential] \u003cPSCredential\u003e] [-Destination] \u003cDbaInstanceParameter[]\u003e [[-DestinationSqlCredential] \u003cPSCredential\u003e] [[-ServerTrigger] \u003cObject[]\u003e] [[-ExcludeServerTrigger] \u003cObject[]\u003e] [-Force] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Copy-DbaSpConfigure", + "Name": "Copy-DbaSpConfigure", "Description": "By default, all configuration values are copied. The -ConfigName parameter is auto-populated for command-line completion and can be used to copy only specific configs.", "Tags": [ "Migration", "Configure", "SpConfigure" ], + "Synopsis": "Copy-DbaSpConfigure migrates configuration values from one SQL Server to another.", + "Alias": "Copy-SqlSpConfigure", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Copy-DbaSpConfigure", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Copy-DbaSpConfigure", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eCopy-DbaSpConfigure -Source sqlserver2014a -Destination sqlcluster\nCopies all sp_configure settings from sqlserver2014a to sqlcluster\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eCopy-DbaSpConfigure -Source sqlserver2014a -Destination sqlcluster -ConfigName DefaultBackupCompression, IsSqlClrEnabled -SourceSqlCredential $cred\nCopies the values for IsSqlClrEnabled and DefaultBackupCompression from sqlserver2014a to sqlcluster using SQL credentials to authenticate to sqlserver2014a and Windows credentials to authenticate to \r\nsqlcluster.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eCopy-DbaSpConfigure -Source sqlserver2014a -Destination sqlcluster -ExcludeConfigName DefaultBackupCompression, IsSqlClrEnabled\nCopies all configs except for IsSqlClrEnabled and DefaultBackupCompression, from sqlserver2014a to sqlcluster.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eCopy-DbaSpConfigure -Source sqlserver2014a -Destination sqlcluster -WhatIf\nShows what would happen if the command were executed.", "Params": [ [ "Source", @@ -4799,21 +4858,22 @@ "" ] ], - "Alias": "Copy-SqlSpConfigure", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Copy-DbaSpConfigure migrates configuration values from one SQL Server to another.", - "Name": "Copy-DbaSpConfigure", - "Links": "https://dbatools.io/Copy-DbaSpConfigure", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eCopy-DbaSpConfigure -Source sqlserver2014a -Destination sqlcluster\nCopies all sp_configure settings from sqlserver2014a to sqlcluster\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eCopy-DbaSpConfigure -Source sqlserver2014a -Destination sqlcluster -ConfigName DefaultBackupCompression, IsSqlClrEnabled -SourceSqlCredential $cred\nCopies the values for IsSqlClrEnabled and DefaultBackupCompression from sqlserver2014a to sqlcluster using SQL credentials to authenticate to sqlserver2014a and Windows credentials to authenticate to \r\nsqlcluster.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eCopy-DbaSpConfigure -Source sqlserver2014a -Destination sqlcluster -ExcludeConfigName DefaultBackupCompression, IsSqlClrEnabled\nCopies all configs except for IsSqlClrEnabled and DefaultBackupCompression, from sqlserver2014a to sqlcluster.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eCopy-DbaSpConfigure -Source sqlserver2014a -Destination sqlcluster -WhatIf\nShows what would happen if the command were executed.", "Syntax": "Copy-DbaSpConfigure [-Source] \u003cDbaInstanceParameter\u003e [[-SourceSqlCredential] \u003cPSCredential\u003e] [-Destination] \u003cDbaInstanceParameter[]\u003e [[-DestinationSqlCredential] \u003cPSCredential\u003e] [[-ConfigName] \u003cObject[]\u003e] [[-ExcludeConfigName] \u003cObject[]\u003e] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Copy-DbaSsisCatalog", + "Name": "Copy-DbaSsisCatalog", "Description": "By default, all folders, projects, and environments are copied. The -Project parameter can be specified to copy only one project, if desired.\n\nThe parameters get more granular from the Folder level. For example, specifying -Folder will only deploy projects/environments from within that folder.", "Tags": [ "Migration", "SSIS" ], + "Synopsis": "Copy-DbaSsisCatalog migrates Folders, SSIS projects, and environments from one SQL Server to another.", + "Alias": "Copy-SqlSsisCatalog", + "Author": "Phil Schwartz (philschwartz.me, @pschwartzzz)", + "CommandName": "Copy-DbaSsisCatalog", + "Availability": "Windows only", + "Links": "https://dbatools.io/Copy-DbaSsisCatalog", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eCopy-DbaSsisCatalog -Source sqlserver2014a -Destination sqlcluster\nCopies all folders, environments and SSIS Projects from sqlserver2014a to sqlcluster, using Windows credentials to authenticate to both instances. If folders with the same name exist on the \r\ndestination they will be skipped, but projects will be redeployed.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eCopy-DbaSsisCatalog -Source sqlserver2014a -Destination sqlcluster -Project Archive_Tables -SourceSqlCredential $cred -Force\nCopies a single Project, the Archive_Tables Project, from sqlserver2014a to sqlcluster using SQL credentials to authenticate to sqlserver2014a and Windows credentials to authenticate to sqlcluster. \r\nIf a Project with the same name exists on sqlcluster, it will be deleted and recreated because -Force was used.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eCopy-DbaSsisCatalog -Source sqlserver2014a -Destination sqlcluster -WhatIf -Force\nShows what would happen if the command were executed using force.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003e$SecurePW = Read-Host \"Enter password\" -AsSecureString\nPS C:\\\u003e Copy-DbaSsisCatalog -Source sqlserver2014a -Destination sqlcluster -CreateCatalogPassword $SecurePW\nDeploy entire SSIS catalog to an instance without a destination catalog. User prompts for creating the catalog on Destination will be bypassed.", "Params": [ [ "Source", @@ -4920,22 +4980,23 @@ "" ] ], - "Alias": "Copy-SqlSsisCatalog", - "Author": "Phil Schwartz (philschwartz.me, @pschwartzzz)", - "Synopsis": "Copy-DbaSsisCatalog migrates Folders, SSIS projects, and environments from one SQL Server to another.", - "Name": "Copy-DbaSsisCatalog", - "Links": "https://dbatools.io/Copy-DbaSsisCatalog", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eCopy-DbaSsisCatalog -Source sqlserver2014a -Destination sqlcluster\nCopies all folders, environments and SSIS Projects from sqlserver2014a to sqlcluster, using Windows credentials to authenticate to both instances. If folders with the same name exist on the \r\ndestination they will be skipped, but projects will be redeployed.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eCopy-DbaSsisCatalog -Source sqlserver2014a -Destination sqlcluster -Project Archive_Tables -SourceSqlCredential $cred -Force\nCopies a single Project, the Archive_Tables Project, from sqlserver2014a to sqlcluster using SQL credentials to authenticate to sqlserver2014a and Windows credentials to authenticate to sqlcluster. \r\nIf a Project with the same name exists on sqlcluster, it will be deleted and recreated because -Force was used.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eCopy-DbaSsisCatalog -Source sqlserver2014a -Destination sqlcluster -WhatIf -Force\nShows what would happen if the command were executed using force.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003e$SecurePW = Read-Host \"Enter password\" -AsSecureString\nPS C:\\\u003e Copy-DbaSsisCatalog -Source sqlserver2014a -Destination sqlcluster -CreateCatalogPassword $SecurePW\nDeploy entire SSIS catalog to an instance without a destination catalog. User prompts for creating the catalog on Destination will be bypassed.", "Syntax": "Copy-DbaSsisCatalog [-Source] \u003cDbaInstanceParameter\u003e [-Destination] \u003cDbaInstanceParameter[]\u003e [[-SourceSqlCredential] \u003cPSCredential\u003e] [[-DestinationSqlCredential] \u003cPSCredential\u003e] [[-Project] \u003cString\u003e] [[-Folder] \u003cString\u003e] [[-Environment] \u003cString\u003e] [[-CreateCatalogPassword] \u003cSecureString\u003e] [-EnableSqlClr] [-Force] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Copy-DbaSysDbUserObject", + "Name": "Copy-DbaSysDbUserObject", "Description": "Imports all user objects found in source SQL Server\u0027s master, msdb and model databases to the destination. This is useful because many DBAs store backup/maintenance procs/tables/triggers/etc (among other things) in master or msdb.\n\nIt is also useful for migrating objects within the model database.", "Tags": [ "Migration", "SystemDatabase", "UserObject" ], + "Synopsis": "Imports all user objects found in source SQL Server\u0027s master, msdb and model databases to the destination.", + "Alias": "Copy-SqlSysDbUserObjects", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Copy-DbaSysDbUserObject", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Copy-DbaSysDbUserObject", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eCopy-DbaSysDbUserObject -Source $sourceServer -Destination $destserver\nCopies user objects from source to destination", "Params": [ [ "Source", @@ -5010,22 +5071,23 @@ "" ] ], - "Alias": "Copy-SqlSysDbUserObjects", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Imports all user objects found in source SQL Server\u0027s master, msdb and model databases to the destination.", - "Name": "Copy-DbaSysDbUserObject", - "Links": "https://dbatools.io/Copy-DbaSysDbUserObject", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eCopy-DbaSysDbUserObject -Source $sourceServer -Destination $destserver\nCopies user objects from source to destination", "Syntax": "Copy-DbaSysDbUserObject [-Source] \u003cDbaInstanceParameter\u003e [[-SourceSqlCredential] \u003cPSCredential\u003e] [-Destination] \u003cDbaInstanceParameter[]\u003e [[-DestinationSqlCredential] \u003cPSCredential\u003e] [-Force] [-Classic] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Copy-DbaXESession", + "Name": "Copy-DbaXESession", "Description": "Migrates SQL Extended Event Sessions except the two default sessions, AlwaysOn_health and system_health.\n\nBy default, all non-system Extended Events are migrated.", "Tags": [ "Migration", "ExtendedEvent", "XEvent" ], + "Synopsis": "Migrates SQL Extended Event Sessions except the two default sessions, AlwaysOn_health and system_health.", + "Alias": "Copy-DbaExtendedEvent,Copy-SqlExtendedEvent", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Copy-DbaXESession", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Copy-DbaXESession", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eCopy-DbaXESession -Source sqlserver2014a -Destination sqlcluster\nCopies all Extended Event sessions from sqlserver2014a to sqlcluster using Windows credentials.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eCopy-DbaXESession -Source sqlserver2014a -Destination sqlcluster -SourceSqlCredential $cred\nCopies all Extended Event sessions from sqlserver2014a to sqlcluster using SQL credentials for sqlserver2014a and Windows credentials for sqlcluster.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eCopy-DbaXESession -Source sqlserver2014a -Destination sqlcluster -WhatIf\nShows what would happen if the command were executed.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eCopy-DbaXESession -Source sqlserver2014a -Destination sqlcluster -XeSession CheckQueries, MonitorUserDefinedException\nCopies only the Extended Events named CheckQueries and MonitorUserDefinedException from sqlserver2014a to sqlcluster.", "Params": [ [ "Source", @@ -5108,22 +5170,23 @@ "" ] ], - "Alias": "Copy-DbaExtendedEvent,Copy-SqlExtendedEvent", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Migrates SQL Extended Event Sessions except the two default sessions, AlwaysOn_health and system_health.", - "Name": "Copy-DbaXESession", - "Links": "https://dbatools.io/Copy-DbaXESession", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eCopy-DbaXESession -Source sqlserver2014a -Destination sqlcluster\nCopies all Extended Event sessions from sqlserver2014a to sqlcluster using Windows credentials.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eCopy-DbaXESession -Source sqlserver2014a -Destination sqlcluster -SourceSqlCredential $cred\nCopies all Extended Event sessions from sqlserver2014a to sqlcluster using SQL credentials for sqlserver2014a and Windows credentials for sqlcluster.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eCopy-DbaXESession -Source sqlserver2014a -Destination sqlcluster -WhatIf\nShows what would happen if the command were executed.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eCopy-DbaXESession -Source sqlserver2014a -Destination sqlcluster -XeSession CheckQueries, MonitorUserDefinedException\nCopies only the Extended Events named CheckQueries and MonitorUserDefinedException from sqlserver2014a to sqlcluster.", "Syntax": "Copy-DbaXESession [-Source] \u003cDbaInstanceParameter\u003e [-Destination] \u003cDbaInstanceParameter[]\u003e [[-SourceSqlCredential] \u003cPSCredential\u003e] [[-DestinationSqlCredential] \u003cPSCredential\u003e] [[-XeSession] \u003cObject[]\u003e] [[-ExcludeXeSession] \u003cObject[]\u003e] [-Force] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Copy-DbaXESessionTemplate", + "Name": "Copy-DbaXESessionTemplate", "Description": "Copies non-Microsoft templates from the dbatools template repository (\\bin\\xetemplates\\) to $home\\Documents\\SQL Server Management Studio\\Templates\\XEventTemplates.\n\nUseful for when you want to use the SSMS GUI.", "Tags": [ "ExtendedEvent", "XE", "XEvent" ], + "Synopsis": "Copies non-Microsoft templates from the dbatools template repository (\\bin\\xetemplates\\) to $home\\Documents\\SQL Server Management Studio\\Templates\\XEventTemplates.", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Copy-DbaXESessionTemplate", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Copy-DbaXESessionTemplate", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eCopy-DbaXESessionTemplate\nCopies non-Microsoft templates from the dbatools template repository (\\bin\\xetemplates\\) to $home\\Documents\\SQL Server Management Studio\\Templates\\XEventTemplates.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eCopy-DbaXESessionTemplate -Path C:\\temp\\xetemplates\nCopies your templates from C:\\temp\\xetemplates to $home\\Documents\\SQL Server Management Studio\\Templates\\XEventTemplates.", "Params": [ [ "Path", @@ -5150,22 +5213,23 @@ "False" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Copies non-Microsoft templates from the dbatools template repository (\\bin\\xetemplates\\) to $home\\Documents\\SQL Server Management Studio\\Templates\\XEventTemplates.", - "Name": "Copy-DbaXESessionTemplate", - "Links": "https://dbatools.io/Copy-DbaXESessionTemplate", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eCopy-DbaXESessionTemplate\nCopies non-Microsoft templates from the dbatools template repository (\\bin\\xetemplates\\) to $home\\Documents\\SQL Server Management Studio\\Templates\\XEventTemplates.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eCopy-DbaXESessionTemplate -Path C:\\temp\\xetemplates\nCopies your templates from C:\\temp\\xetemplates to $home\\Documents\\SQL Server Management Studio\\Templates\\XEventTemplates.", "Syntax": "Copy-DbaXESessionTemplate [[-Path] \u003cString[]\u003e] [[-Destination] \u003cString\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Disable-DbaAgHadr", + "Name": "Disable-DbaAgHadr", "Description": "In order to build an AG a cluster has to be built and then the Hadr enabled for the SQL Server\nservice. This function disables that feature for the SQL Server service.", "Tags": [ "Hadr", "AG", "AvailabilityGroup" ], + "Synopsis": "Disables the Hadr service setting on the specified SQL Server.", + "Alias": "", + "Author": "Shawn Melton (@wsmelton), http://wsmelton.github.io", + "CommandName": "Disable-DbaAgHadr", + "Availability": "Windows only", + "Links": "https://dbatools.io/Disable-DbaAgHadr", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eDisable-DbaAgHadr -SqlInstance sql2016\nSets Hadr service to disabled for the instance sql2016 but changes will not be applied until the next time the server restarts.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eDisable-DbaAgHadr -SqlInstance sql2016 -Force\nSets Hadr service to disabled for the instance sql2016, and restart the service to apply the change.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eDisable-DbaAgHadr -SqlInstance sql2012\\dev1 -Force\nSets Hadr service to disabled for the instance dev1 on sq2012, and restart the service to apply the change.", "Params": [ [ "SqlInstance", @@ -5216,18 +5280,19 @@ "" ] ], - "Alias": "", - "Author": "Shawn Melton (@wsmelton), http://wsmelton.github.io", - "Synopsis": "Disables the Hadr service setting on the specified SQL Server.", - "Name": "Disable-DbaAgHadr", - "Links": "https://dbatools.io/Disable-DbaAgHadr", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eDisable-DbaAgHadr -SqlInstance sql2016\nSets Hadr service to disabled for the instance sql2016 but changes will not be applied until the next time the server restarts.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eDisable-DbaAgHadr -SqlInstance sql2016 -Force\nSets Hadr service to disabled for the instance sql2016, and restart the service to apply the change.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eDisable-DbaAgHadr -SqlInstance sql2012\\dev1 -Force\nSets Hadr service to disabled for the instance dev1 on sq2012, and restart the service to apply the change.", "Syntax": "Disable-DbaAgHadr [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-Credential] \u003cPSCredential\u003e] [-Force] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Disable-DbaFilestream", + "Name": "Disable-DbaFilestream", "Description": "Connects to the specified SQL Server instances, and sets the status of the FileStream feature to the required value\n\nTo perform the action, the SQL Server instance must be restarted. By default we will prompt for confirmation for this action, this can be overridden with the -Force switch", "Tags": "Filestream", + "Synopsis": "Sets the status of FileStream on specified SQL Server instances both at the server level and the instance level", + "Alias": "", + "Author": "Stuart Moore ( @napalmgram ) | Chrissy LeMaire ( @cl )", + "CommandName": "Disable-DbaFilestream", + "Availability": "Windows only", + "Links": null, + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eDisable-DbaFilestream -SqlInstance server1\\instance2\nPrompts for confirmation. Disables filestream on the service and instance levels.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eDisable-DbaFilestream -SqlInstance server1\\instance2 -Confirm:$false\nDoes not prompt for confirmation. Disables filestream on the service and instance levels.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaFilestream -SqlInstance server1\\instance2, server5\\instance5, prod\\hr | Where-Object InstanceAccessLevel -gt 0 | Disable-DbaFilestream -Force\nUsing this pipeline you can scan a range of SQL instances and disable filestream on only those on which it\u0027s enabled.", "Params": [ [ "SqlInstance", @@ -5286,18 +5351,19 @@ "" ] ], - "Alias": "", - "Author": "Stuart Moore ( @napalmgram ) | Chrissy LeMaire ( @cl )", - "Synopsis": "Sets the status of FileStream on specified SQL Server instances both at the server level and the instance level", - "Name": "Disable-DbaFilestream", - "Links": null, - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eDisable-DbaFilestream -SqlInstance server1\\instance2\nPrompts for confirmation. Disables filestream on the service and instance levels.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eDisable-DbaFilestream -SqlInstance server1\\instance2 -Confirm:$false\nDoes not prompt for confirmation. Disables filestream on the service and instance levels.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaFilestream -SqlInstance server1\\instance2, server5\\instance5, prod\\hr | Where-Object InstanceAccessLevel -gt 0 | Disable-DbaFilestream -Force\nUsing this pipeline you can scan a range of SQL instances and disable filestream on only those on which it\u0027s enabled.", "Syntax": "Disable-DbaFilestream [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [[-Credential] \u003cPSCredential\u003e] [-Force] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Disable-DbaForceNetworkEncryption", + "Name": "Disable-DbaForceNetworkEncryption", "Description": "Disables Force Encryption for a SQL Server instance. Note that this requires access to the Windows Server, not the SQL instance itself.\n\nThis setting is found in Configuration Manager.", "Tags": "Certificate", + "Synopsis": "Disables Force Encryption for a SQL Server instance", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Disable-DbaForceNetworkEncryption", + "Availability": "Windows only", + "Links": null, + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eDisable-DbaForceNetworkEncryption\nDisables Force Encryption on the default (MSSQLSERVER) instance on localhost - requires (and checks for) RunAs admin.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eDisable-DbaForceNetworkEncryption -SqlInstance sql01\\SQL2008R2SP2\nDisables Force Network Encryption for the SQL2008R2SP2 on sql01. Uses Windows Credentials to both login and modify the registry.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eDisable-DbaForceNetworkEncryption -SqlInstance sql01\\SQL2008R2SP2 -WhatIf\nShows what would happen if the command were executed.", "Params": [ [ "SqlInstance", @@ -5340,18 +5406,22 @@ "" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Disables Force Encryption for a SQL Server instance", - "Name": "Disable-DbaForceNetworkEncryption", - "Links": null, - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eDisable-DbaForceNetworkEncryption\nDisables Force Encryption on the default (MSSQLSERVER) instance on localhost - requires (and checks for) RunAs admin.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eDisable-DbaForceNetworkEncryption -SqlInstance sql01\\SQL2008R2SP2\nDisables Force Network Encryption for the SQL2008R2SP2 on sql01. Uses Windows Credentials to both login and modify the registry.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eDisable-DbaForceNetworkEncryption -SqlInstance sql01\\SQL2008R2SP2 -WhatIf\nShows what would happen if the command were executed.", "Syntax": "Disable-DbaForceNetworkEncryption [[-SqlInstance] \u003cDbaInstanceParameter[]\u003e] [[-Credential] \u003cPSCredential\u003e] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Disable-DbaTraceFlag", + "Name": "Disable-DbaTraceFlag", "Description": "The function will disable a Trace Flag that is currently running globally on the SQL Server instance(s) listed", - "Tags": "TraceFlag", + "Tags": [ + "TraceFlag", + "DBCC" + ], + "Synopsis": "Disable a Global Trace Flag that is currently running", + "Alias": "", + "Author": "Garry Bargsley (@gbargsley), http://blog.garrybargsley.com", + "CommandName": "Disable-DbaTraceFlag", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Disable-DbaTraceFlag", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eDisable-DbaTraceFlag -SqlInstance sql2016 -TraceFlag 3226\nDisable the globally running trace flag 3226 on SQL Server instance sql2016", "Params": [ [ "SqlInstance", @@ -5386,18 +5456,19 @@ "False" ] ], - "Alias": "", - "Author": "Garry Bargsley (@gbargsley), http://blog.garrybargsley.com", - "Synopsis": "Disable a Global Trace Flag that is currently running", - "Name": "Disable-DbaTraceFlag", - "Links": "https://dbatools.io/Disable-DbaTraceFlag", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eDisable-DbaTraceFlag -SqlInstance sql2016 -TraceFlag 3226\nDisable the globally running trace flag 3226 on SQL Server instance sql2016", "Syntax": "Disable-DbaTraceFlag [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [-SqlCredential \u003cPSCredential\u003e] -TraceFlag \u003cInt32[]\u003e [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Dismount-DbaDatabase", + "Name": "Dismount-DbaDatabase", "Description": "This command detaches one or more SQL Server databases. If necessary, -Force can be used to break mirrors and remove databases from availability groups prior to detaching.", "Tags": "Database", + "Synopsis": "Detach a SQL Server Database.", + "Alias": "Detach-DbaDatabase", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Dismount-DbaDatabase", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Dismount-DbaDatabase", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eDetach-DbaDatabase -SqlInstance sql2016b -Database SharePoint_Config, WSS_Logging\nDetaches SharePoint_Config and WSS_Logging from sql2016b\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaDatabase -SqlInstance sql2016b -Database \u0027PerformancePoint Service Application_10032db0fa0041df8f913f558a5dc0d4\u0027 | Detach-DbaDatabase -Force\nDetaches \u0027PerformancePoint Service Application_10032db0fa0041df8f913f558a5dc0d4\u0027 from sql2016b. Since Force was specified, if the database is part of mirror, the mirror will be broken prior to \r\ndetaching.\nIf the database is part of an Availability Group, it will first be dropped prior to detachment.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaDatabase -SqlInstance sql2016b -Database WSS_Logging | Detach-DbaDatabase -Force -WhatIf\nShows what would happen if the command were to execute (without actually executing the detach/break/remove commands).", "Params": [ [ "SqlInstance", @@ -5472,16 +5543,10 @@ "" ] ], - "Alias": "Detach-DbaDatabase", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Detach a SQL Server Database.", - "Name": "Dismount-DbaDatabase", - "Links": "https://dbatools.io/Dismount-DbaDatabase", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eDetach-DbaDatabase -SqlInstance sql2016b -Database SharePoint_Config, WSS_Logging\nDetaches SharePoint_Config and WSS_Logging from sql2016b\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaDatabase -SqlInstance sql2016b -Database \u0027PerformancePoint Service Application_10032db0fa0041df8f913f558a5dc0d4\u0027 | Detach-DbaDatabase -Force\nDetaches \u0027PerformancePoint Service Application_10032db0fa0041df8f913f558a5dc0d4\u0027 from sql2016b. Since Force was specified, if the database is part of mirror, the mirror will be broken prior to \r\ndetaching.\nIf the database is part of an Availability Group, it will first be dropped prior to detachment.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaDatabase -SqlInstance sql2016b -Database WSS_Logging | Detach-DbaDatabase -Force -WhatIf\nShows what would happen if the command were to execute (without actually executing the detach/break/remove commands).", "Syntax": "Dismount-DbaDatabase [-SqlCredential \u003cPSCredential\u003e] [-UpdateStatistics] [-Force] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]\nDismount-DbaDatabase -SqlInstance \u003cDbaInstanceParameter[]\u003e [-SqlCredential \u003cPSCredential\u003e] -Database \u003cString[]\u003e [-UpdateStatistics] [-Force] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]\nDismount-DbaDatabase [-SqlCredential \u003cPSCredential\u003e] -InputObject \u003cDatabase[]\u003e [-UpdateStatistics] [-Force] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Enable-DbaAgHadr", + "Name": "Enable-DbaAgHadr", "Description": "In order to build an AG a cluster has to be built and then the Hadr enabled for the SQL Server\nservice. This function enables that feature for the SQL Server service.", "Tags": [ "Hadr", @@ -5489,6 +5554,13 @@ "AG", "AvailabilityGroup" ], + "Synopsis": "Enables the Hadr service setting on the specified SQL Server.", + "Alias": "", + "Author": "Shawn Melton (@wsmelton), http://wsmelton.github.io", + "CommandName": "Enable-DbaAgHadr", + "Availability": "Windows only", + "Links": "https://dbatools.io/Enable-DbaAgHadr", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eEnable-DbaAgHadr -SqlInstance sql2016\nSets Hadr service to enabled for the instance sql2016 but changes will not be applied until the next time the server restarts.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eEnable-DbaAgHadr -SqlInstance sql2016 -Force\nSets Hadr service to enabled for the instance sql2016, and restart the service to apply the change.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eEnable-DbaAgHadr -SqlInstance sql2012\\dev1 -Force\nSets Hadr service to disabled for the instance dev1 on sq2012, and restart the service to apply the change.", "Params": [ [ "SqlInstance", @@ -5539,18 +5611,19 @@ "" ] ], - "Alias": "", - "Author": "Shawn Melton (@wsmelton), http://wsmelton.github.io", - "Synopsis": "Enables the Hadr service setting on the specified SQL Server.", - "Name": "Enable-DbaAgHadr", - "Links": "https://dbatools.io/Enable-DbaAgHadr", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eEnable-DbaAgHadr -SqlInstance sql2016\nSets Hadr service to enabled for the instance sql2016 but changes will not be applied until the next time the server restarts.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eEnable-DbaAgHadr -SqlInstance sql2016 -Force\nSets Hadr service to enabled for the instance sql2016, and restart the service to apply the change.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eEnable-DbaAgHadr -SqlInstance sql2012\\dev1 -Force\nSets Hadr service to disabled for the instance dev1 on sq2012, and restart the service to apply the change.", "Syntax": "Enable-DbaAgHadr [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-Credential] \u003cPSCredential\u003e] [-Force] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Enable-DbaFilestream", + "Name": "Enable-DbaFilestream", "Description": "Connects to the specified SQL Server instances, and Enables the FileStream feature to the required value\n\nTo perform the action, the SQL Server instance must be restarted. By default we will prompt for confirmation for this action, this can be overridden with the -Force switch", "Tags": "Filestream", + "Synopsis": "Enables FileStream on specified SQL Server instances", + "Alias": "", + "Author": "Stuart Moore ( @napalmgram ) | Chrissy LeMaire ( @cl )", + "CommandName": "Enable-DbaFilestream", + "Availability": "Windows only", + "Links": null, + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eEnable-DbaFilestream -SqlInstance server1\\instance2 -FileStreamLevel TSql\nPS C:\\\u003e Enable-DbaFilestream -SqlInstance server1\\instance2 -FileStreamLevel 1\nThese commands are functionally equivalent, both will set Filestream level on server1\\instance2 to T-Sql Only\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaFilestream -SqlInstance server1\\instance2, server5\\instance5, prod\\hr | Where-Object InstanceAccessLevel -eq 0 | Enable-DbaFilestream -FileStreamLevel TSqlIoStreamingRemoteClient -Force\nUsing this pipeline you can scan a range of SQL instances and enable filestream on only those on which it\u0027s disabled.", "Params": [ [ "SqlInstance", @@ -5625,21 +5698,22 @@ "" ] ], - "Alias": "", - "Author": "Stuart Moore ( @napalmgram ) | Chrissy LeMaire ( @cl )", - "Synopsis": "Enables FileStream on specified SQL Server instances", - "Name": "Enable-DbaFilestream", - "Links": null, - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eEnable-DbaFilestream -SqlInstance server1\\instance2 -FileStreamLevel TSql\nPS C:\\\u003e Enable-DbaFilestream -SqlInstance server1\\instance2 -FileStreamLevel 1\nThese commands are functionally equivalent, both will set Filestream level on server1\\instance2 to T-Sql Only\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaFilestream -SqlInstance server1\\instance2, server5\\instance5, prod\\hr | Where-Object InstanceAccessLevel -eq 0 | Enable-DbaFilestream -FileStreamLevel TSqlIoStreamingRemoteClient -Force\nUsing this pipeline you can scan a range of SQL instances and enable filestream on only those on which it\u0027s disabled.", "Syntax": "Enable-DbaFilestream [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [[-Credential] \u003cPSCredential\u003e] [[-FileStreamLevel] \u003cString\u003e] [[-ShareName] \u003cString\u003e] [-Force] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Enable-DbaForceNetworkEncryption", + "Name": "Enable-DbaForceNetworkEncryption", "Description": "Enables Force Encryption for a SQL Server instance. Note that this requires access to the Windows Server, not the SQL instance itself.\n\nThis setting is found in Configuration Manager.", "Tags": [ "Certificate", "Encryption" ], + "Synopsis": "Enables Force Encryption for a SQL Server instance.", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Enable-DbaForceNetworkEncryption", + "Availability": "Windows only", + "Links": null, + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eEnable-DbaForceNetworkEncryption\nEnables Force Encryption on the default (MSSQLSERVER) instance on localhost. Requires (and checks for) RunAs admin.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eEnable-DbaForceNetworkEncryption -SqlInstance sql01\\SQL2008R2SP2\nEnables Force Network Encryption for the SQL2008R2SP2 on sql01. Uses Windows Credentials to both connect and modify the registry.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eEnable-DbaForceNetworkEncryption -SqlInstance sql01\\SQL2008R2SP2 -WhatIf\nShows what would happen if the command were executed.", "Params": [ [ "SqlInstance", @@ -5682,18 +5756,22 @@ "" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Enables Force Encryption for a SQL Server instance.", - "Name": "Enable-DbaForceNetworkEncryption", - "Links": null, - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eEnable-DbaForceNetworkEncryption\nEnables Force Encryption on the default (MSSQLSERVER) instance on localhost. Requires (and checks for) RunAs admin.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eEnable-DbaForceNetworkEncryption -SqlInstance sql01\\SQL2008R2SP2\nEnables Force Network Encryption for the SQL2008R2SP2 on sql01. Uses Windows Credentials to both connect and modify the registry.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eEnable-DbaForceNetworkEncryption -SqlInstance sql01\\SQL2008R2SP2 -WhatIf\nShows what would happen if the command were executed.", "Syntax": "Enable-DbaForceNetworkEncryption [[-SqlInstance] \u003cDbaInstanceParameter[]\u003e] [[-Credential] \u003cPSCredential\u003e] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Enable-DbaTraceFlag", + "Name": "Enable-DbaTraceFlag", "Description": "The function will set one or multiple trace flags on the SQL Server instance(s) listed", - "Tags": "TraceFlag", + "Tags": [ + "TraceFlag", + "DBCC" + ], + "Synopsis": "Enable Global Trace Flag(s)", + "Alias": "", + "Author": "Garry Bargsley (@gbargsley), http://blog.garrybargsley.com", + "CommandName": "Enable-DbaTraceFlag", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Enable-DbaTraceFlag", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eEnable-DbaTraceFlag -SqlInstance sql2016 -TraceFlag 3226\nEnable the trace flag 3226 on SQL Server instance sql2016\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eEnable-DbaTraceFlag -SqlInstance sql2016 -TraceFlag 1117, 1118\nEnable multiple trace flags on SQL Server instance sql2016", "Params": [ [ "SqlInstance", @@ -5728,21 +5806,22 @@ "False" ] ], - "Alias": "", - "Author": "Garry Bargsley (@gbargsley), http://blog.garrybargsley.com", - "Synopsis": "Enable Global Trace Flag(s)", - "Name": "Enable-DbaTraceFlag", - "Links": "https://dbatools.io/Enable-DbaTraceFlag", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eEnable-DbaTraceFlag -SqlInstance sql2016 -TraceFlag 3226\nEnable the trace flag 3226 on SQL Server instance sql2016\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eEnable-DbaTraceFlag -SqlInstance sql2016 -TraceFlag 1117, 1118\nEnable multiple trace flags on SQL Server instance sql2016", "Syntax": "Enable-DbaTraceFlag [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [-SqlCredential \u003cPSCredential\u003e] -TraceFlag \u003cInt32[]\u003e [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Expand-DbaDbLogFile", + "Name": "Expand-DbaDbLogFile", "Description": "As you may already know, having a transaction log file with too many Virtual Log Files (VLFs) can hurt your database performance in many ways.\n\nExample:\nToo many VLFs can cause transaction log backups to slow down and can also slow down database recovery and, in extreme cases, even impact insert/update/delete performance.\n\nReferences:\nhttp://www.sqlskills.com/blogs/kimberly/transaction-log-vlfs-too-many-or-too-few/\nhttp://blogs.msdn.com/b/saponsqlserver/archive/2012/02/22/too-many-virtual-log-files-vlfs-can-cause-slow-database-recovery.aspx\nhttp://www.brentozar.com/blitz/high-virtual-log-file-vlf-count/\n\nIn order to get rid of this fragmentation we need to grow the file taking the following into consideration:\n- How many VLFs are created when we perform a grow operation or when an auto-grow is invoked?\n\nNote: In SQL Server 2014 this algorithm has changed (http://www.sqlskills.com/blogs/paul/important-change-vlf-creation-algorithm-sql-server-2014/)\n\nAttention:\nWe are growing in MB instead of GB because of known issue prior to SQL 2012:\nMore detail here:\nhttp://www.sqlskills.com/BLOGS/PAUL/post/Bug-log-file-growth-broken-for-multiples-of-4GB.aspx\nand\nhttp://connect.microsoft.com/SqlInstance/feedback/details/481594/log-growth-not-working-properly-with-specific-growth-sizes-vlfs-also-not-created-appropriately\nor\nhttps://connect.microsoft.com/SqlInstance/feedback/details/357502/transaction-log-file-size-will-not-grow-exactly-4gb-when-filegrowth-4gb\n\nUnderstanding related problems:\nhttp://www.sqlskills.com/blogs/kimberly/transaction-log-vlfs-too-many-or-too-few/\nhttp://blogs.msdn.com/b/saponsqlserver/archive/2012/02/22/too-many-virtual-log-files-vlfs-can-cause-slow-database-recovery.aspx\nhttp://www.brentozar.com/blitz/high-virtual-log-file-vlf-count/\n\nKnown bug before SQL Server 2012\nhttp://www.sqlskills.com/BLOGS/PAUL/post/Bug-log-file-growth-broken-for-multiples-of-4GB.aspx\nhttp://connect.microsoft.com/SqlInstance/feedback/details/481594/log-growth-not-working-properly-with-specific-growth-sizes-vlfs-also-not-created-appropriately\nhttps://connect.microsoft.com/SqlInstance/feedback/details/357502/transaction-log-file-size-will-not-grow-exactly-4gb-when-filegrowth-4gb\n\nHow it works?\nThe transaction log will grow in chunks until it reaches the desired size.\nExample: If you have a log file with 8192MB and you say that the target size is 81920MB (80GB) it will grow in chunks of 8192MB until it reaches 81920MB. 8192 -\u003e 16384 -\u003e 24576 ... 73728 -\u003e 81920", "Tags": [ "Storage", "Backup" ], + "Synopsis": "This command will help you to automatically grow your transaction log file in a responsible way (preventing the generation of too many VLFs).", + "Alias": "Expand-DbaTLogResponsibly,Expand-SqlTLogResponsibly", + "Author": "Claudio Silva (@ClaudioESSilva)", + "CommandName": "Expand-DbaDbLogFile", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Expand-DbaDbLogFile", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eExpand-DbaDbLogFile -SqlInstance sqlcluster -Database db1 -TargetLogSize 50000\nGrows the transaction log for database db1 on sqlcluster to 50000 MB and calculates the increment size.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eExpand-DbaDbLogFile -SqlInstance sqlcluster -Database db1, db2 -TargetLogSize 10000 -IncrementSize 200\nGrows the transaction logs for databases db1 and db2 on sqlcluster to 1000MB and sets the growth increment to 200MB.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eExpand-DbaDbLogFile -SqlInstance sqlcluster -Database db1 -TargetLogSize 10000 -LogFileId 9\nGrows the transaction log file with FileId 9 of the db1 database on sqlcluster instance to 10000MB.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eExpand-DbaDbLogFile -SqlInstance sqlcluster -Database (Get-Content D:\\DBs.txt) -TargetLogSize 50000\nGrows the transaction log of the databases specified in the file \u0027D:\\DBs.txt\u0027 on sqlcluster instance to 50000MB.\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eExpand-DbaDbLogFile -SqlInstance SqlInstance -Database db1,db2 -TargetLogSize 100 -IncrementSize 10 -ShrinkLogFile -ShrinkSize 10 -BackupDirectory R:\\MSSQL\\Backup\nGrows the transaction logs for databases db1 and db2 on SQL server SQLInstance to 100MB, sets the incremental growth to 10MB, shrinks the transaction log to 10MB and uses the directory \r\nR:\\MSSQL\\Backup for the required backups.", "Params": [ [ "SqlInstance", @@ -5857,16 +5936,10 @@ "" ] ], - "Alias": "Expand-DbaTLogResponsibly,Expand-SqlTLogResponsibly", - "Author": "Claudio Silva (@ClaudioESSilva)", - "Synopsis": "This command will help you to automatically grow your transaction log file in a responsible way (preventing the generation of too many VLFs).", - "Name": "Expand-DbaDbLogFile", - "Links": "https://dbatools.io/Expand-DbaDbLogFile", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eExpand-DbaDbLogFile -SqlInstance sqlcluster -Database db1 -TargetLogSize 50000\nGrows the transaction log for database db1 on sqlcluster to 50000 MB and calculates the increment size.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eExpand-DbaDbLogFile -SqlInstance sqlcluster -Database db1, db2 -TargetLogSize 10000 -IncrementSize 200\nGrows the transaction logs for databases db1 and db2 on sqlcluster to 1000MB and sets the growth increment to 200MB.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eExpand-DbaDbLogFile -SqlInstance sqlcluster -Database db1 -TargetLogSize 10000 -LogFileId 9\nGrows the transaction log file with FileId 9 of the db1 database on sqlcluster instance to 10000MB.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eExpand-DbaDbLogFile -SqlInstance sqlcluster -Database (Get-Content D:\\DBs.txt) -TargetLogSize 50000\nGrows the transaction log of the databases specified in the file \u0027D:\\DBs.txt\u0027 on sqlcluster instance to 50000MB.\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eExpand-DbaDbLogFile -SqlInstance SqlInstance -Database db1,db2 -TargetLogSize 100 -IncrementSize 10 -ShrinkLogFile -ShrinkSize 10 -BackupDirectory R:\\MSSQL\\Backup\nGrows the transaction logs for databases db1 and db2 on SQL server SQLInstance to 100MB, sets the incremental growth to 10MB, shrinks the transaction log to 10MB and uses the directory \r\nR:\\MSSQL\\Backup for the required backups.", "Syntax": "Expand-DbaDbLogFile [-SqlInstance] \u003cDbaInstanceParameter\u003e [[-SqlCredential] \u003cPSCredential\u003e] [-Database \u003cObject[]\u003e] [[-ExcludeDatabase] \u003cObject[]\u003e] [-TargetLogSize] \u003cInt32\u003e [[-IncrementSize] \u003cInt32\u003e] [[-LogFileId] \u003cInt32\u003e] [-ExcludeDiskSpaceValidation] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]\nExpand-DbaDbLogFile [-SqlInstance] \u003cDbaInstanceParameter\u003e [[-SqlCredential] \u003cPSCredential\u003e] [-Database \u003cObject[]\u003e] [[-ExcludeDatabase] \u003cObject[]\u003e] [-TargetLogSize] \u003cInt32\u003e [[-IncrementSize] \u003cInt32\u003e] [[-LogFileId] \u003cInt32\u003e] [-ShrinkLogFile] [-ShrinkSize] \u003cInt32\u003e [[-BackupDirectory] \u003cString\u003e] [-ExcludeDiskSpaceValidation] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Export-DbaAvailabilityGroup", + "Name": "Export-DbaAvailabilityGroup", "Description": "Exports SQL Server Availability Groups creation scripts to a T-SQL file. This is a function that is not available in SSMS.", "Tags": [ "Hadr", @@ -5874,6 +5947,13 @@ "AG", "AvailabilityGroup" ], + "Synopsis": "Exports SQL Server Availability Groups to a T-SQL file.", + "Alias": "", + "Author": "Chris Sommer (@cjsommer), cjsommer.com", + "CommandName": "Export-DbaAvailabilityGroup", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Export-DbaAvailabilityGroup", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eExport-DbaAvailabilityGroup -SqlInstance sql2012\nExports all Availability Groups from SQL server \"sql2012\". Output scripts are written to the Documents\\SqlAgExports directory by default.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eExport-DbaAvailabilityGroup -SqlInstance sql2012 -Path C:\\temp\\availability_group_exports\nExports all Availability Groups from SQL server \"sql2012\". Output scripts are written to the C:\\temp\\availability_group_exports directory.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eExport-DbaAvailabilityGroup -SqlInstance sql2012 -Path \u0027C:\\dir with spaces\\availability_group_exports\u0027 -AvailabilityGroup AG1,AG2\nExports Availability Groups AG1 and AG2 from SQL server \"sql2012\". Output scripts are written to the C:\\dir with spaces\\availability_group_exports directory.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eExport-DbaAvailabilityGroup -SqlInstance sql2014 -Path C:\\temp\\availability_group_exports -NoClobber\nExports all Availability Groups from SQL server \"sql2014\". Output scripts are written to the C:\\temp\\availability_group_exports directory. If the export file already exists it will not be overwritten.", "Params": [ [ "SqlInstance", @@ -5948,21 +6028,22 @@ "" ] ], - "Alias": "", - "Author": "Chris Sommer (@cjsommer), cjsommer.com", - "Synopsis": "Exports SQL Server Availability Groups to a T-SQL file.", - "Name": "Export-DbaAvailabilityGroup", - "Links": "https://dbatools.io/Export-DbaAvailabilityGroup", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eExport-DbaAvailabilityGroup -SqlInstance sql2012\nExports all Availability Groups from SQL server \"sql2012\". Output scripts are written to the Documents\\SqlAgExports directory by default.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eExport-DbaAvailabilityGroup -SqlInstance sql2012 -Path C:\\temp\\availability_group_exports\nExports all Availability Groups from SQL server \"sql2012\". Output scripts are written to the C:\\temp\\availability_group_exports directory.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eExport-DbaAvailabilityGroup -SqlInstance sql2012 -Path \u0027C:\\dir with spaces\\availability_group_exports\u0027 -AvailabilityGroup AG1,AG2\nExports Availability Groups AG1 and AG2 from SQL server \"sql2012\". Output scripts are written to the C:\\dir with spaces\\availability_group_exports directory.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eExport-DbaAvailabilityGroup -SqlInstance sql2014 -Path C:\\temp\\availability_group_exports -NoClobber\nExports all Availability Groups from SQL server \"sql2014\". Output scripts are written to the C:\\temp\\availability_group_exports directory. If the export file already exists it will not be overwritten.", "Syntax": "Export-DbaAvailabilityGroup [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [[-AvailabilityGroup] \u003cObject[]\u003e] [[-ExcludeAvailabilityGroup] \u003cObject[]\u003e] [[-Path] \u003cString\u003e] [-NoClobber] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Export-DbaCmsRegServer", + "Name": "Export-DbaCmsRegServer", "Description": "Exports registered servers and registered server groups to file", "Tags": [ "RegisteredServer", "CMS" ], + "Synopsis": "Exports registered servers and registered server groups to file", + "Alias": "Export-DbaRegisteredServer", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Export-DbaCmsRegServer", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Export-DbaCmsRegServer", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eExport-DbaCmsRegServer -SqlInstance sql2008\nExports all Registered Server and Registered Server Groups on sql2008 to an automatically generated file name in the current directory\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaCmsRegServer -SqlInstance sql2008, sql2012 | Export-DbaCmsRegServer\nExports all registered servers on sql2008 and sql2012. Warning - each one will have its own individual file. Consider piping groups.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaCmsRegServerGroup -SqlInstance sql2008, sql2012 | Export-DbaCmsRegServer\nExports all registered servers on sql2008 and sql2012, organized by group.", "Params": [ [ "SqlInstance", @@ -6013,18 +6094,19 @@ "False" ] ], - "Alias": "Export-DbaRegisteredServer", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Exports registered servers and registered server groups to file", - "Name": "Export-DbaCmsRegServer", - "Links": "https://dbatools.io/Export-DbaCmsRegServer", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eExport-DbaCmsRegServer -SqlInstance sql2008\nExports all Registered Server and Registered Server Groups on sql2008 to an automatically generated file name in the current directory\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaCmsRegServer -SqlInstance sql2008, sql2012 | Export-DbaCmsRegServer\nExports all registered servers on sql2008 and sql2012. Warning - each one will have its own individual file. Consider piping groups.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaCmsRegServerGroup -SqlInstance sql2008, sql2012 | Export-DbaCmsRegServer\nExports all registered servers on sql2008 and sql2012, organized by group.", "Syntax": "Export-DbaCmsRegServer [[-SqlInstance] \u003cDbaInstanceParameter[]\u003e] [[-SqlCredential] \u003cPSCredential\u003e] [[-InputObject] \u003cObject[]\u003e] [[-Path] \u003cString\u003e] [[-CredentialPersistenceType] \u003cString\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Export-DbaCredential", + "Name": "Export-DbaCredential", "Description": "Exports credentials INCLUDING PASSWORDS, unless specified otherwise, to sql file.\n\nRequires remote Windows access if exporting the password.", "Tags": "Credential", + "Synopsis": "Exports credentials INCLUDING PASSWORDS, unless specified otherwise, to sql file.", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Export-DbaCredential", + "Availability": "Windows only", + "Links": null, + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eExport-DbaCredential -SqlInstance sql2017 -Path C:\\temp\\cred.sql\nExports credentials, including passwords, from sql2017 to the file C:\\temp\\cred.sql", "Params": [ [ "SqlInstance", @@ -6099,22 +6181,23 @@ "False" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Exports credentials INCLUDING PASSWORDS, unless specified otherwise, to sql file.", - "Name": "Export-DbaCredential", - "Links": null, - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eExport-DbaCredential -SqlInstance sql2017 -Path C:\\temp\\cred.sql\nExports credentials, including passwords, from sql2017 to the file C:\\temp\\cred.sql", "Syntax": "Export-DbaCredential [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-Identity] \u003cString[]\u003e] [[-SqlCredential] \u003cPSCredential\u003e] [[-Credential] \u003cPSCredential\u003e] [[-Path] \u003cString\u003e] [-ExcludePassword] [-Append] [[-InputObject] \u003cCredential[]\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Export-DbaDacPackage", + "Name": "Export-DbaDacPackage", "Description": "Using SQLPackage, export a dacpac from an instance of SQL Server.\n\nNote - Extract from SQL Server is notoriously flaky - for example if you have three part references to external databases it will not work.\n\nFor help with the extract action parameters and properties, refer to https://msdn.microsoft.com/en-us/library/hh550080(v=vs.103).aspx", "Tags": [ "Migration", "Database", "Dacpac" ], + "Synopsis": "Exports a dacpac from a server.", + "Alias": "Export-DbaDacpac", + "Author": "Richie lee (@richiebzzzt)", + "CommandName": "Export-DbaDacPackage", + "Availability": "Windows only", + "Links": "https://dbatools.io/Export-DbaDacPackage", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eExport-DbaDacPackage -SqlInstance sql2016 -Database SharePoint_Config\nExports the dacpac for SharePoint_Config on sql2016 to $home\\Documents\\SharePoint_Config.dacpac\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003e$options = New-DbaDacOption -Type Dacpac -Action Export\nPS C:\\\u003e $options.ExtractAllTableData = $true\r\nPS C:\\\u003e $options.CommandTimeout = 0\r\nPS C:\\\u003e Export-DbaDacPackage -SqlInstance sql2016 -Database DB1 -Options $options\nUses DacOption object to set the CommandTimeout to 0 then extracts the dacpac for DB1 on sql2016 to $home\\Documents\\DB1.dacpac including all table data.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eExport-DbaDacPackage -SqlInstance sql2016 -AllUserDatabases -ExcludeDatabase \"DBMaintenance\",\"DBMonitoring\" -Path \"C:\\temp\"\nExports dacpac packages for all USER databases, excluding \"DBMaintenance\" \u0026 \"DBMonitoring\", on sql2016 and saves them to C:\\temp\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003e$moreparams = \"/OverwriteFiles:$true /Quiet:$true\"\nPS C:\\\u003e Export-DbaDacPackage -SqlInstance sql2016 -Database SharePoint_Config -Path C:\\temp -ExtendedParameters $moreparams\nUsing extended parameters to over-write the files and performs the extraction in quiet mode. Uses command line instead of SMO behind the scenes.", "Params": [ [ "SqlInstance", @@ -6213,18 +6296,19 @@ "False" ] ], - "Alias": "Export-DbaDacpac", - "Author": "Richie lee (@richiebzzzt)", - "Synopsis": "Exports a dacpac from a server.", - "Name": "Export-DbaDacPackage", - "Links": "https://dbatools.io/Export-DbaDacPackage", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eExport-DbaDacPackage -SqlInstance sql2016 -Database SharePoint_Config\nExports the dacpac for SharePoint_Config on sql2016 to $home\\Documents\\SharePoint_Config.dacpac\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003e$options = New-DbaDacOption -Type Dacpac -Action Export\nPS C:\\\u003e $options.ExtractAllTableData = $true\r\nPS C:\\\u003e $options.CommandTimeout = 0\r\nPS C:\\\u003e Export-DbaDacPackage -SqlInstance sql2016 -Database DB1 -Options $options\nUses DacOption object to set the CommandTimeout to 0 then extracts the dacpac for DB1 on sql2016 to $home\\Documents\\DB1.dacpac including all table data.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eExport-DbaDacPackage -SqlInstance sql2016 -AllUserDatabases -ExcludeDatabase \"DBMaintenance\",\"DBMonitoring\" C:\\temp\nExports dacpac packages for all USER databases, excluding \"DBMaintenance\" \u0026 \"DBMonitoring\", on sql2016 and saves them to C:\\temp\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003e$moreparams = \"/OverwriteFiles:$true /Quiet:$true\"\nPS C:\\\u003e Export-DbaDacPackage -SqlInstance sql2016 -Database SharePoint_Config -Path C:\\temp -ExtendedParameters $moreparams\nUsing extended parameters to over-write the files and performs the extraction in quiet mode. Uses command line instead of SMO behind the scenes.", "Syntax": "Export-DbaDacPackage -SqlInstance \u003cDbaInstanceParameter[]\u003e [-SqlCredential \u003cPSCredential\u003e] [-Database \u003cObject[]\u003e] [-ExcludeDatabase \u003cObject[]\u003e] [-AllUserDatabases] [-Path \u003cString\u003e] [-DacOption \u003cObject\u003e] [-Type \u003cString\u003e] [-Table \u003cString[]\u003e] [-EnableException] [\u003cCommonParameters\u003e]\nExport-DbaDacPackage -SqlInstance \u003cDbaInstanceParameter[]\u003e [-SqlCredential \u003cPSCredential\u003e] [-Database \u003cObject[]\u003e] [-ExcludeDatabase \u003cObject[]\u003e] [-AllUserDatabases] [-Path \u003cString\u003e] [-ExtendedParameters \u003cString\u003e] [-ExtendedProperties \u003cString\u003e] [-Type \u003cString\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Export-DbaDiagnosticQuery", + "Name": "Export-DbaDiagnosticQuery", "Description": "The default output format of Invoke-DbaDiagnosticQuery is a custom object. It can also output to CSV and Excel.\nHowever, CSV output can generate a lot of files and Excel output depends on the ImportExcel module by Doug Finke (https://github.com/dfinke/ImportExcel)\nExport-DbaDiagnosticQuery can be used to convert from the default export type to the other available export types.", "Tags": "Query", + "Synopsis": "Export-DbaDiagnosticQuery can convert output generated by Invoke-DbaDiagnosticQuery to CSV or Excel", + "Alias": "", + "Author": "Andre Kamman (@AndreKamman), http://clouddba.io", + "CommandName": "Export-DbaDiagnosticQuery", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Export-DbaDiagnosticQuery", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eInvoke-DbaDiagnosticQuery -SqlInstance sql2016 | Export-DbaDiagnosticQuery -Path c:\\temp\nConverts output from Invoke-DbaDiagnosticQuery to multiple CSV files\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003e$output = Invoke-DbaDiagnosticQuery -SqlInstance sql2016\nPS C:\\\u003e Export-DbaDiagnosticQuery -InputObject $output -ConvertTo Excel\nConverts output from Invoke-DbaDiagnosticQuery to Excel worksheet(s) in the Documents folder", "Params": [ [ "InputObject", @@ -6283,21 +6367,22 @@ "False" ] ], - "Alias": "", - "Author": "Andre Kamman (@AndreKamman), http://clouddba.io", - "Synopsis": "Export-DbaDiagnosticQuery can convert output generated by Invoke-DbaDiagnosticQuery to CSV or Excel", - "Name": "Export-DbaDiagnosticQuery", - "Links": "https://dbatools.io/Export-DbaDiagnosticQuery", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eInvoke-DbaDiagnosticQuery -SqlInstance sql2016 | Export-DbaDiagnosticQuery -Path c:\\temp\nConverts output from Invoke-DbaDiagnosticQuery to multiple CSV files\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003e$output = Invoke-DbaDiagnosticQuery -SqlInstance sql2016\nPS C:\\\u003e Export-DbaDiagnosticQuery -InputObject $output -ConvertTo Excel\nConverts output from Invoke-DbaDiagnosticQuery to Excel worksheet(s) in the Documents folder", "Syntax": "Export-DbaDiagnosticQuery [-InputObject] \u003cObject[]\u003e [[-ConvertTo] \u003cString\u003e] [[-Path] \u003cFileInfo\u003e] [[-Suffix] \u003cString\u003e] [-NoPlanExport] [-NoQueryExport] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Export-DbaExecutionPlan", + "Name": "Export-DbaExecutionPlan", "Description": "Exports execution plans to disk. Can pipe from Get-DbaExecutionPlan\n\nThanks to\nhttps://www.simple-talk.com/sql/t-sql-programming/dmvs-for-query-plan-metadata/\nand\nhttp://www.scarydba.com/2017/02/13/export-plans-cache-sqlplan-file/\nfor the idea and query.", "Tags": [ "Performance", "ExecutionPlan" ], + "Synopsis": "Exports execution plans to disk.", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Export-DbaExecutionPlan", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Export-DbaExecutionPlan", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eExport-DbaExecutionPlan -SqlInstance sqlserver2014a -Path C:\\Temp\nExports all execution plans for sqlserver2014a. Files saved in to C:\\Temp\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eExport-DbaExecutionPlan -SqlInstance sqlserver2014a -Database db1, db2 -SinceLastExecution \u00272016-07-01 10:47:00\u0027 -Path C:\\Temp\nExports all execution plans for databases db1 and db2 on sqlserver2014a since July 1, 2016 at 10:47 AM. Files saved in to C:\\Temp\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaExecutionPlan -SqlInstance sqlserver2014a | Export-DbaExecutionPlan -Path C:\\Temp\nGets all execution plans for sqlserver2014a. Using Pipeline exports them all to C:\\Temp\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaExecutionPlan -SqlInstance sqlserver2014a | Export-DbaExecutionPlan -Path C:\\Temp -WhatIf\nGets all execution plans for sqlserver2014a. Then shows what would happen if the results where piped to Export-DbaExecutionPlan", "Params": [ [ "SqlInstance", @@ -6388,18 +6473,19 @@ "" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Exports execution plans to disk.", - "Name": "Export-DbaExecutionPlan", - "Links": "https://dbatools.io/Export-DbaExecutionPlan", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eExport-DbaExecutionPlan -SqlInstance sqlserver2014a -Path C:\\Temp\nExports all execution plans for sqlserver2014a. Files saved in to C:\\Temp\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eExport-DbaExecutionPlan -SqlInstance sqlserver2014a -Database db1, db2 -SinceLastExecution \u00272016-07-01 10:47:00\u0027 -Path C:\\Temp\nExports all execution plans for databases db1 and db2 on sqlserver2014a since July 1, 2016 at 10:47 AM. Files saved in to C:\\Temp\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaExecutionPlan -SqlInstance sqlserver2014a | Export-DbaExecutionPlan -Path C:\\Temp\nGets all execution plans for sqlserver2014a. Using Pipeline exports them all to C:\\Temp\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaExecutionPlan -SqlInstance sqlserver2014a | Export-DbaExecutionPlan -Path C:\\Temp -WhatIf\nGets all execution plans for sqlserver2014a. Then shows what would happen if the results where piped to Export-DbaExecutionPlan", "Syntax": "Export-DbaExecutionPlan [-Database \u003cObject[]\u003e] [-ExcludeDatabase \u003cObject[]\u003e] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]\nExport-DbaExecutionPlan -SqlInstance \u003cDbaInstanceParameter[]\u003e [-SqlCredential \u003cPSCredential\u003e] [-Database \u003cObject[]\u003e] [-ExcludeDatabase \u003cObject[]\u003e] -Path \u003cString\u003e [-SinceCreation \u003cDateTime\u003e] [-SinceLastExecution \u003cDateTime\u003e] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]\nExport-DbaExecutionPlan [-Database \u003cObject[]\u003e] [-ExcludeDatabase \u003cObject[]\u003e] -Path \u003cString\u003e -PipedObject \u003cObject[]\u003e [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Export-DbaInstance", + "Name": "Export-DbaInstance", "Description": "Export-DbaInstance consolidates most of the export scripts in dbatools into one command.\n\nThis is useful when you\u0027re looking to Export entire instances. It less flexible than using the underlying functions.\nThink of it as an easy button. Unless an -Exclude is specified, it exports:\n\nAll database restore scripts.\nAll logins.\nAll database mail objects.\nAll credentials.\nAll objects within the Job Server (SQL Agent).\nAll linked servers.\nAll groups and servers within Central Management Server.\nAll SQL Server configuration objects (everything in sp_configure).\nAll user objects in system databases.\nAll system triggers.\nAll system backup devices.\nAll Audits.\nAll Endpoints.\nAll Extended Events.\nAll Policy Management objects.\nAll Resource Governor objects.\nAll Server Audit Specifications.\nAll Custom Errors (User Defined Messages).\nAll Server Roles.\nAll Availability Groups.", "Tags": "Export", + "Synopsis": "Exports SQL Server *ALL* database restore scripts, logins, database mail profiles/accounts, credentials, SQL Agent objects, linked servers,\nCentral Management Server objects, server configuration settings (sp_configure), user objects in systems databases,\nsystem triggers and backup devices from one SQL Server to another.\n\nFor more granular control, please use one of the -Exclude parameters and use the other functions available within the dbatools module.", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Export-DbaInstance", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Export-DbaInstance", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eExport-DbaInstance -SqlInstance sqlserver\\instance\nAll databases, logins, job objects and sp_configure options will be exported from\r\nsqlserver\\instance to an automatically generated folder name in Documents.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eExport-DbaInstance -SqlInstance sqlcluster -Exclude Databases, Logins -Path C:\\dr\\sqlcluster\nExports everything but logins and database restore scripts to C:\\dr\\sqlcluster", "Params": [ [ "SqlInstance", @@ -6482,18 +6568,19 @@ "False" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Exports SQL Server *ALL* database restore scripts, logins, database mail profiles/accounts, credentials, SQL Agent objects, linked servers,\nCentral Management Server objects, server configuration settings (sp_configure), user objects in systems databases,\nsystem triggers and backup devices from one SQL Server to another.\n\nFor more granular control, please use one of the -Exclude parameters and use the other functions available within the dbatools module.", - "Name": "Export-DbaInstance", - "Links": "https://dbatools.io/Export-DbaInstance", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eExport-DbaInstance -SqlInstance sqlserver\\instance\nAll databases, logins, job objects and sp_configure options will be exported from\r\nsqlserver\\instance to an automatically generated folder name in Documents.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eExport-DbaInstance -SqlInstance sqlcluster -Exclude Databases, Logins -Path C:\\dr\\sqlcluster\nExports everything but logins and database restore scripts to C:\\dr\\sqlcluster", "Syntax": "Export-DbaInstance [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [[-Credential] \u003cPSCredential\u003e] [[-Path] \u003cString\u003e] [-NoRecovery] [-IncludeDbMasterKey] [[-Exclude] \u003cString[]\u003e] [[-BatchSeparator] \u003cString\u003e] [[-ScriptingOption] \u003cScriptingOptions\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Export-DbaLinkedServer", + "Name": "Export-DbaLinkedServer", "Description": "Exports linked servers INCLUDING PASSWORDS, unless specified otherwise, to sql file.\n\nRequires remote Windows access if exporting the password.", "Tags": "LinkedServer", + "Synopsis": "Exports linked servers INCLUDING PASSWORDS, unless specified otherwise, to sql file.", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Export-DbaLinkedServer", + "Availability": "Windows only", + "Links": null, + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eExport-DbaLinkedServer -SqlInstance sql2017 -Path C:\\temp\\ls.sql\nExports the linked servers, including passwords, from sql2017 to the file C:\\temp\\ls.sql\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eExport-DbaLinkedServer -SqlInstance sql2017 -Path C:\\temp\\ls.sql -ExcludePassword\nExports the linked servers, without passwords, from sql2017 to the file C:\\temp\\ls.sql", "Params": [ [ "SqlInstance", @@ -6568,21 +6655,22 @@ "False" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Exports linked servers INCLUDING PASSWORDS, unless specified otherwise, to sql file.", - "Name": "Export-DbaLinkedServer", - "Links": null, - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eExport-DbaLinkedServer -SqlInstance sql2017 -Path C:\\temp\\ls.sql\nExports the linked servers, including passwords, from sql2017 to the file C:\\temp\\ls.sql\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eExport-DbaLinkedServer -SqlInstance sql2017 -Path C:\\temp\\ls.sql -ExcludePassword\nExports the linked servers, without passwords, from sql2017 to the file C:\\temp\\ls.sql", "Syntax": "Export-DbaLinkedServer [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-LinkedServer] \u003cString[]\u003e] [[-SqlCredential] \u003cPSCredential\u003e] [[-Credential] \u003cPSCredential\u003e] [[-Path] \u003cString\u003e] [-ExcludePassword] [-Append] [[-InputObject] \u003cLinkedServer[]\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Export-DbaLogin", + "Name": "Export-DbaLogin", "Description": "Exports Windows and SQL Logins to a T-SQL file. Export includes login, SID, password, default database, default language, server permissions, server roles, db permissions, db roles.", "Tags": [ "Export", "Login" ], + "Synopsis": "Exports Windows and SQL Logins to a T-SQL file. Export includes login, SID, password, default database, default language, server permissions, server roles, db permissions, db roles.", + "Alias": "Export-SqlLogin", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Export-DbaLogin", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Export-DbaLogin", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eExport-DbaLogin -SqlInstance sql2005 -Path C:\\temp\\sql2005-logins.sql\nExports the logins for SQL Server \"sql2005\" and writes them to the file \"C:\\temp\\sql2005-logins.sql\"\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eExport-DbaLogin -SqlInstance sqlserver2014a -ExcludeLogin realcajun -SqlCredential $scred -Path C:\\temp\\logins.sql -Append\nAuthenticates to sqlserver2014a using SQL Authentication. Exports all logins except for realcajun to C:\\temp\\logins.sql, and appends to the file if it exists. If not, the file will be created.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eExport-DbaLogin -SqlInstance sqlserver2014a -Login realcajun, netnerds -Path C:\\temp\\logins.sql\nExports ONLY logins netnerds and realcajun FROM sqlserver2014a to the file C:\\temp\\logins.sql\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eExport-DbaLogin -SqlInstance sqlserver2014a -Login realcajun, netnerds -Database HR, Accounting\nExports ONLY logins netnerds and realcajun FROM sqlserver2014a with the permissions on databases HR and Accounting\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eExport-DbaLogin -SqlInstance sqlserver2008 -Login realcajun, netnerds -Path C:\\temp\\login.sql -ExcludeGoBatchSeparator\nExports ONLY logins netnerds and realcajun FROM sqlserver2008 server, to the C:\\temp\\login.sql file without the \u0027GO\u0027 batch separator.\n-------------------------- EXAMPLE 6 --------------------------\nPS C:\\\u003eExport-DbaLogin -SqlInstance sqlserver2008 -Login realcajun -Path C:\\temp\\users.sql -DestinationVersion SQLServer2016\nExports login realcajun from sqlserver2008 to the file C:\\temp\\users.sql with syntax to run on SQL Server 2016", "Params": [ [ "SqlInstance", @@ -6705,21 +6793,22 @@ "" ] ], - "Alias": "Export-SqlLogin", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Exports Windows and SQL Logins to a T-SQL file. Export includes login, SID, password, default database, default language, server permissions, server roles, db permissions, db roles.", - "Name": "Export-DbaLogin", - "Links": "https://dbatools.io/Export-DbaLogin", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eExport-DbaLogin -SqlInstance sql2005 -Path C:\\temp\\sql2005-logins.sql\nExports the logins for SQL Server \"sql2005\" and writes them to the file \"C:\\temp\\sql2005-logins.sql\"\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eExport-DbaLogin -SqlInstance sqlserver2014a -ExcludeLogin realcajun -SqlCredential $scred -Path C:\\temp\\logins.sql -Append\nAuthenticates to sqlserver2014a using SQL Authentication. Exports all logins except for realcajun to C:\\temp\\logins.sql, and appends to the file if it exists. If not, the file will be created.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eExport-DbaLogin -SqlInstance sqlserver2014a -Login realcajun, netnerds -Path C:\\temp\\logins.sql\nExports ONLY logins netnerds and realcajun FROM sqlserver2014a to the file C:\\temp\\logins.sql\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eExport-DbaLogin -SqlInstance sqlserver2014a -Login realcajun, netnerds -Database HR, Accounting\nExports ONLY logins netnerds and realcajun FROM sqlserver2014a with the permissions on databases HR and Accounting\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eExport-DbaLogin -SqlInstance sqlserver2008 -Login realcajun, netnerds -Path C:\\temp\\login.sql -ExcludeGoBatchSeparator\nExports ONLY logins netnerds and realcajun FROM sqlserver2008 server, to the C:\\temp\\login.sql file without the \u0027GO\u0027 batch separator.\n-------------------------- EXAMPLE 6 --------------------------\nPS C:\\\u003eExport-DbaLogin -SqlInstance sqlserver2008 -Login realcajun -Path C:\\temp\\users.sql -DestinationVersion SQLServer2016\nExports login realcajun from sqlserver2008 to the file C:\\temp\\users.sql with syntax to run on SQL Server 2016", "Syntax": "Export-DbaLogin [-SqlInstance] \u003cDbaInstanceParameter\u003e [[-SqlCredential] \u003cPSCredential\u003e] [[-Login] \u003cObject[]\u003e] [[-ExcludeLogin] \u003cObject[]\u003e] [[-Database] \u003cObject[]\u003e] [[-Path] \u003cString\u003e] [-NoClobber] [-Append] [-ExcludeDatabases] [-ExcludeJobs] [-EnableException] [-ExcludeGoBatchSeparator] [[-DestinationVersion] \u003cString\u003e] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Export-DbaPfDataCollectorSetTemplate", + "Name": "Export-DbaPfDataCollectorSetTemplate", "Description": "Exports a Data Collector Set XML Template from Get-DbaPfDataCollectorSet. Exports to \"$home\\Documents\\Performance Monitor Templates\" by default.", "Tags": [ "Performance", "DataCollector" ], + "Synopsis": "Exports a new Data Collector Set XML Template.", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Export-DbaPfDataCollectorSetTemplate", + "Availability": "Windows only", + "Links": "https://dbatools.io/Export-DbaPfDataCollectorSetTemplate", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eExport-DbaPfDataCollectorSetTemplate -ComputerName sql2017 -Path C:\\temp\\pf\nExports all data collector sets from to the C:\\temp\\pf folder.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaPfDataCollectorSet ComputerName sql2017 -CollectorSet \u0027System Correlation\u0027 | Export-DbaPfDataCollectorSetTemplate -Path C:\\temp\nExports the \u0027System Correlation\u0027 data collector set from sql2017 to C:\\temp.", "Params": [ [ "ComputerName", @@ -6770,18 +6859,19 @@ "False" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Exports a new Data Collector Set XML Template.", - "Name": "Export-DbaPfDataCollectorSetTemplate", - "Links": "https://dbatools.io/Export-DbaPfDataCollectorSetTemplate", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eExport-DbaPfDataCollectorSetTemplate -ComputerName sql2017 -Path C:\\temp\\pf\nExports all data collector sets from to the C:\\temp\\pf folder.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaPfDataCollectorSet ComputerName sql2017 -CollectorSet \u0027System Correlation\u0027 | Export-DbaPfDataCollectorSetTemplate -Path C:\\temp\nExports the \u0027System Correlation\u0027 data collector set from sql2017 to C:\\temp.", "Syntax": "Export-DbaPfDataCollectorSetTemplate [[-ComputerName] \u003cDbaInstanceParameter[]\u003e] [[-Credential] \u003cPSCredential\u003e] [[-CollectorSet] \u003cString[]\u003e] [[-Path] \u003cString\u003e] [[-InputObject] \u003cObject[]\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Export-DbaRepServerSetting", + "Name": "Export-DbaRepServerSetting", "Description": "Exports replication server settings to file.", "Tags": "Replication", + "Synopsis": "Exports replication server settings to file.", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Export-DbaRepServerSetting", + "Availability": "Windows only", + "Links": null, + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eExport-DbaRepServerSetting -SqlInstance sql2017 -Path C:\\temp\\replication.sql\nExports the replication settings on sql2017 to the file C:\\temp\\replication.sql\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaRepServer -SqlInstance sql2017 | Export-DbaRepServerSettings -Path C:\\temp\\replication.sql\nExports the replication settings on sql2017 to the file C:\\temp\\replication.sql", "Params": [ [ "SqlInstance", @@ -6864,22 +6954,23 @@ "False" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Exports replication server settings to file.", - "Name": "Export-DbaRepServerSetting", - "Links": null, - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eExport-DbaRepServerSetting -SqlInstance sql2017 -Path C:\\temp\\replication.sql\nExports the replication settings on sql2017 to the file C:\\temp\\replication.sql\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaRepServer -SqlInstance sql2017 | Export-DbaRepServerSettings -Path C:\\temp\\replication.sql\nExports the replication settings on sql2017 to the file C:\\temp\\replication.sql", "Syntax": "Export-DbaRepServerSetting [[-SqlInstance] \u003cDbaInstanceParameter[]\u003e] [[-SqlCredential] \u003cPSCredential\u003e] [[-Path] \u003cString\u003e] [[-ScriptOption] \u003cObject[]\u003e] [[-InputObject] \u003cReplicationServer[]\u003e] [[-Encoding] \u003cString\u003e] [-Passthru] [-NoClobber] [-Append] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Export-DbaScript", + "Name": "Export-DbaScript", "Description": "Exports scripts from SQL Management Objects", "Tags": [ "Migration", "Backup", "Export" ], + "Synopsis": "Exports scripts from SQL Management Objects (SMO)", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Export-DbaScript", + "Availability": "Windows only", + "Links": "https://dbatools.io/Export-DbaScript", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaAgentJob -SqlInstance sql2016 | Export-DbaScript\nExports all jobs on the SQL Server sql2016 instance using a trusted connection - automatically determines filename as .\\sql2016-Job-Export-date.sql\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaAgentJob -SqlInstance sql2016 | Export-DbaScript -Path C:\\temp\\export.sql -Append\nExports all jobs on the SQL Server sql2016 instance using a trusted connection - Will append the output to the file C:\\temp\\export.sql if it already exists\r\nScript does not include Batch Separator and will not compile\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaDbTable -SqlInstance sql2016 -Database MyDatabase -Table \u0027dbo.Table1\u0027, \u0027dbo.Table2\u0027 -SqlCredential sqladmin | Export-DbaScript -Path C:\\temp\\export.sql\nExports only script for \u0027dbo.Table1\u0027 and \u0027dbo.Table2\u0027 in MyDatabase to C:temp\\export.sql and uses the SQL login \"sqladmin\" to login to sql2016\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaAgentJob -SqlInstance sql2016 -Job syspolicy_purge_history, \u0027Hourly Log Backups\u0027 -SqlCredential sqladmin | Export-DbaScript -Path C:\\temp\\export.sql -NoPrefix\nExports only syspolicy_purge_history and \u0027Hourly Log Backups\u0027 to C:temp\\export.sql and uses the SQL login \"sqladmin\" to login to sql2016\r\nSuppress the output of a Prefix\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003e$options = New-DbaScriptingOption\nPS C:\\\u003e $options.ScriptSchema = $true\r\nPS C:\\\u003e $options.IncludeDatabaseContext = $true\r\nPS C:\\\u003e $options.IncludeHeaders = $false\r\nPS C:\\\u003e $Options.NoCommandTerminator = $false\r\nPS C:\\\u003e $Options.ScriptBatchTerminator = $true\r\nPS C:\\\u003e $Options.AnsiFile = $true\r\nPS C:\\\u003e Get-DbaAgentJob -SqlInstance sql2016 -Job syspolicy_purge_history, \u0027Hourly Log Backups\u0027 -SqlCredential sqladmin | Export-DbaScript -Path C:\\temp\\export.sql -ScriptingOptionsObject $options\nExports only syspolicy_purge_history and \u0027Hourly Log Backups\u0027 to C:temp\\export.sql and uses the SQL login \"sqladmin\" to login to sql2016\r\nAppends a batch separator at end of each script.\n-------------------------- EXAMPLE 6 --------------------------\nPS C:\\\u003eGet-DbaAgentJob -SqlInstance sql2014 | Export-DbaScript -Passthru | ForEach-Object { $_.Replace(\u0027sql2014\u0027,\u0027sql2016\u0027) } | Set-Content -Path C:\\temp\\export.sql\nExports jobs and replaces all instances of the servername \"sql2014\" with \"sql2016\" then writes to C:\\temp\\export.sql\n-------------------------- EXAMPLE 7 --------------------------\nPS C:\\\u003e$options = New-DbaScriptingOption\nPS C:\\\u003e $options.ScriptSchema = $true\r\nPS C:\\\u003e $options.IncludeDatabaseContext = $true\r\nPS C:\\\u003e $options.IncludeHeaders = $false\r\nPS C:\\\u003e $Options.NoCommandTerminator = $false\r\nPS C:\\\u003e $Options.ScriptBatchTerminator = $true\r\nPS C:\\\u003e $Options.AnsiFile = $true\r\nPS C:\\\u003e $Databases = Get-DbaDatabase -SqlInstance sql2016 -ExcludeDatabase master, model, msdb, tempdb\r\nPS C:\\\u003e foreach ($db in $Databases) {\r\n\u003e\u003e Export-DbaScript -InputObject $db -Path C:\\temp\\export.sql -Append -Encoding UTF8 -ScriptingOptionsObject $options -NoPrefix\r\n\u003e\u003e }\nExports Script for each database on sql2016 excluding system databases\r\nUses Scripting options to ensure Batch Terminator is set\r\nWill append the output to the file C:\\temp\\export.sql if it already exists", "Params": [ [ "InputObject", @@ -6978,22 +7069,23 @@ "" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Exports scripts from SQL Management Objects (SMO)", - "Name": "Export-DbaScript", - "Links": "https://dbatools.io/Export-DbaScript", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaAgentJob -SqlInstance sql2016 | Export-DbaScript\nExports all jobs on the SQL Server sql2016 instance using a trusted connection - automatically determines filename as .\\sql2016-Job-Export-date.sql\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaAgentJob -SqlInstance sql2016 | Export-DbaScript -Path C:\\temp\\export.sql -Append\nExports all jobs on the SQL Server sql2016 instance using a trusted connection - Will append the output to the file C:\\temp\\export.sql if it already exists\r\nScript does not include Batch Separator and will not compile\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaDbTable -SqlInstance sql2016 -Database MyDatabase -Table \u0027dbo.Table1\u0027, \u0027dbo.Table2\u0027 -SqlCredential sqladmin | Export-DbaScript -Path C:\\temp\\export.sql\nExports only script for \u0027dbo.Table1\u0027 and \u0027dbo.Table2\u0027 in MyDatabase to C:temp\\export.sql and uses the SQL login \"sqladmin\" to login to sql2016\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaAgentJob -SqlInstance sql2016 -Job syspolicy_purge_history, \u0027Hourly Log Backups\u0027 -SqlCredential sqladmin | Export-DbaScript -Path C:\\temp\\export.sql -NoPrefix\nExports only syspolicy_purge_history and \u0027Hourly Log Backups\u0027 to C:temp\\export.sql and uses the SQL login \"sqladmin\" to login to sql2016\r\nSuppress the output of a Prefix\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003e$options = New-DbaScriptingOption\nPS C:\\\u003e $options.ScriptSchema = $true\r\nPS C:\\\u003e $options.IncludeDatabaseContext = $true\r\nPS C:\\\u003e $options.IncludeHeaders = $false\r\nPS C:\\\u003e $Options.NoCommandTerminator = $false\r\nPS C:\\\u003e $Options.ScriptBatchTerminator = $true\r\nPS C:\\\u003e $Options.AnsiFile = $true\r\nPS C:\\\u003e Get-DbaAgentJob -SqlInstance sql2016 -Job syspolicy_purge_history, \u0027Hourly Log Backups\u0027 -SqlCredential sqladmin | Export-DbaScript -Path C:\\temp\\export.sql -ScriptingOptionsObject $options\nExports only syspolicy_purge_history and \u0027Hourly Log Backups\u0027 to C:temp\\export.sql and uses the SQL login \"sqladmin\" to login to sql2016\r\nAppends a batch separator at end of each script.\n-------------------------- EXAMPLE 6 --------------------------\nPS C:\\\u003eGet-DbaAgentJob -SqlInstance sql2014 | Export-DbaScript -Passthru | ForEach-Object { $_.Replace(\u0027sql2014\u0027,\u0027sql2016\u0027) } | Set-Content -Path C:\\temp\\export.sql\nExports jobs and replaces all instances of the servername \"sql2014\" with \"sql2016\" then writes to C:\\temp\\export.sql\n-------------------------- EXAMPLE 7 --------------------------\nPS C:\\\u003e$options = New-DbaScriptingOption\nPS C:\\\u003e $options.ScriptSchema = $true\r\nPS C:\\\u003e $options.IncludeDatabaseContext = $true\r\nPS C:\\\u003e $options.IncludeHeaders = $false\r\nPS C:\\\u003e $Options.NoCommandTerminator = $false\r\nPS C:\\\u003e $Options.ScriptBatchTerminator = $true\r\nPS C:\\\u003e $Options.AnsiFile = $true\r\nPS C:\\\u003e $Databases = Get-DbaDatabase -SqlInstance sql2016 -ExcludeDatabase master, model, msdb, tempdb\r\nPS C:\\\u003e foreach ($db in $Databases) {\r\n\u003e\u003e Export-DbaScript -InputObject $db -Path C:\\temp\\export.sql -Append -Encoding UTF8 -ScriptingOptionsObject $options -NoPrefix\r\n\u003e\u003e }\nExports Script for each database on sql2016 excluding system databases\r\nUses Scripting options to ensure Batch Terminator is set\r\nWill append the output to the file C:\\temp\\export.sql if it already exists", "Syntax": "Export-DbaScript [-InputObject] \u003cObject[]\u003e [[-ScriptingOptionsObject] \u003cScriptingOptions\u003e] [[-Path] \u003cString\u003e] [[-Encoding] \u003cString\u003e] [[-BatchSeparator] \u003cString\u003e] [-NoPrefix] [-Passthru] [-NoClobber] [-Append] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Export-DbaSpConfigure", + "Name": "Export-DbaSpConfigure", "Description": "Exports advanced sp_configure global configuration options to sql file.", "Tags": [ "SpConfig", "Configure", "Configuration" ], + "Synopsis": "Exports advanced sp_configure global configuration options to sql file.", + "Alias": "Export-SqlSpConfigure", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Export-DbaSpConfigure", + "Availability": "Windows only", + "Links": "https://dbatools.io/Export-DbaSpConfigure", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eExport-DbaSpConfigure -SqlInstance sourceserver\nExports the SPConfigure settings on sourceserver. As no Path was defined outputs to My Documents folder with default name format of Servername-MMDDYYYYhhmmss-sp_configure.sql\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eExport-DbaSpConfigure -SqlInstance sourceserver -Path C:\\temp\nExports the SPConfigure settings on sourceserver to the directory C:\\temp using the default name format\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003e$cred = Get-Credential sqladmin\nPS C:\\\u003e Export-DbaSpConfigure -SqlInstance sourceserver -SqlCredential $cred -Path C:\\temp\\sp_configure.sql\nExports the SPConfigure settings on sourceserver to the file C:\\temp\\sp_configure.sql. Uses SQL Authentication to connect. Will require SysAdmin rights if needs to set \u0027show advanced options\u0027\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003e\u0027Server1\u0027, \u0027Server2\u0027 | Export-DbaSpConfigure -Path C:\\temp\\configure.sql\nExports the SPConfigure settings for Server1 and Server2 using pipeline. As more than 1 Server adds prefix of Servername and date to the file name and saves to file like \r\nC:\\temp\\Servername-MMDDYYYYhhmmss-configure.sql", "Params": [ [ "SqlInstance", @@ -7028,17 +7120,17 @@ "False" ] ], - "Alias": "Export-SqlSpConfigure", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Exports advanced sp_configure global configuration options to sql file.", - "Name": "Export-DbaSpConfigure", - "Links": "https://dbatools.io/Export-DbaSpConfigure", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eExport-DbaSpConfigure -SqlInstance sourceserver\nExports the SPConfigure settings on sourceserver. As no Path was defined outputs to My Documents folder with default name format of Servername-MMDDYYYYhhmmss-sp_configure.sql\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eExport-DbaSpConfigure -SqlInstance sourceserver -Path C:\\temp\nExports the SPConfigure settings on sourceserver to the directory C:\\temp using the default name format\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003e$cred = Get-Credential sqladmin\nPS C:\\\u003e Export-DbaSpConfigure -SqlInstance sourceserver -SqlCredential $cred -Path C:\\temp\\sp_configure.sql\nExports the SPConfigure settings on sourceserver to the file C:\\temp\\sp_configure.sql. Uses SQL Authentication to connect. Will require SysAdmin rights if needs to set \u0027show advanced options\u0027\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003e\u0027Server1\u0027, \u0027Server2\u0027 | Export-DbaSpConfigure -Path C:\\temp\\configure.sql\nExports the SPConfigure settings for Server1 and Server2 using pipeline. As more than 1 Server adds prefix of Servername and date to the file name and saves to file like \r\nC:\\temp\\Servername-MMDDYYYYhhmmss-configure.sql", "Syntax": "Export-DbaSpConfigure [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [[-Path] \u003cString\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Export-DbatoolsConfig", + "Name": "Export-DbatoolsConfig", "Description": "Exports configuration items to a Json file.", + "Synopsis": "Exports configuration items to a Json file.", + "Alias": "", + "CommandName": "Export-DbatoolsConfig", + "Availability": "Windows, Linux, macOS", + "Links": null, + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbatoolsConfig | Export-DbatoolsConfig -OutPath \u0027~/export.json\u0027\nExports all current settings to json.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eExport-DbatoolsConfig -Module message -OutPath \u0027~/export.json\u0027 -SkipUnchanged\nExports all settings of the module \u0027message\u0027 that are no longer the original default values to json.", "Params": [ [ "FullName", @@ -7121,20 +7213,22 @@ "False" ] ], - "Alias": "", - "Synopsis": "Exports configuration items to a Json file.", - "Name": "Export-DbatoolsConfig", - "Links": null, - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbatoolsConfig | Export-DbatoolsConfig -OutPath \u0027~/export.json\u0027\nExports all current settings to json.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eExport-DbatoolsConfig -Module message -OutPath \u0027~/export.json\u0027 -SkipUnchanged\nExports all settings of the module \u0027message\u0027 that are no longer the original default values to json.", "Syntax": "Export-DbatoolsConfig [-FullName] \u003cString\u003e [-OutPath] \u003cString\u003e [-SkipUnchanged] [-EnableException] [\u003cCommonParameters\u003e]\nExport-DbatoolsConfig [-Module] \u003cString\u003e [[-Name] \u003cString\u003e] [-OutPath] \u003cString\u003e [-SkipUnchanged] [-EnableException] [\u003cCommonParameters\u003e]\nExport-DbatoolsConfig [-Config] \u003cConfig[]\u003e [-OutPath] \u003cString\u003e [-SkipUnchanged] [-EnableException] [\u003cCommonParameters\u003e]\nExport-DbatoolsConfig -ModuleName \u003cString\u003e [-ModuleVersion \u003cInt32\u003e] [-Scope {UserDefault | UserMandatory | SystemDefault | SystemMandatory | FileUserLocal | FileUserShared | FileSystem}] [-SkipUnchanged] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Export-DbaUser", + "Name": "Export-DbaUser", "Description": "Exports users creation and its permissions to a T-SQL file or host. Export includes user, create and add to role(s), database level permissions, object level permissions.", "Tags": [ "User", "Export" ], + "Synopsis": "Exports users creation and its permissions to a T-SQL file or host.", + "Alias": "Export-SqlUser", + "Author": "Claudio Silva (@ClaudioESSilva)", + "CommandName": "Export-DbaUser", + "Availability": "Windows only", + "Links": "https://dbatools.io/Export-DbaUser", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eExport-DbaUser -SqlInstance sql2005 -Path C:\\temp\\sql2005-users.sql\nExports SQL for the users in server \"sql2005\" and writes them to the file \"C:\\temp\\sql2005-users.sql\"\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eExport-DbaUser -SqlInstance sqlserver2014a $scred -Path C:\\temp\\users.sql -Append\nAuthenticates to sqlserver2014a using SQL Authentication. Exports all users to C:\\temp\\users.sql, and appends to the file if it exists. If not, the file will be created.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eExport-DbaUser -SqlInstance sqlserver2014a -User User1, User2 -Path C:\\temp\\users.sql\nExports ONLY users User1 and User2 from sqlserver2014a to the file C:\\temp\\users.sql\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eExport-DbaUser -SqlInstance sqlserver2008 -User User1 -Path C:\\temp\\users.sql -DestinationVersion SQLServer2016\nExports user User1 from sqlserver2008 to the file C:\\temp\\users.sql with syntax to run on SQL Server 2016\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eExport-DbaUser -SqlInstance sqlserver2008 -Database db1,db2 -Path C:\\temp\\users.sql\nExports ONLY users from db1 and db2 database on sqlserver2008 server, to the C:\\temp\\users.sql file.\n-------------------------- EXAMPLE 6 --------------------------\nPS C:\\\u003e$options = New-DbaScriptingOption\nPS C:\\\u003e $options.ScriptDrops = $false\r\nPS C:\\\u003e $options.WithDependencies = $true\r\nPS C:\\\u003e Export-DbaUser -SqlInstance sqlserver2008 -Database db1,db2 -Path C:\\temp\\users.sql -ScriptingOptionsObject $options\nExports ONLY users from db1 and db2 database on sqlserver2008 server, to the C:\\temp\\users.sql file.\r\nIt will not script drops but will script dependencies.\n-------------------------- EXAMPLE 7 --------------------------\nPS C:\\\u003eExport-DbaUser -SqlInstance sqlserver2008 -Database db1,db2 -Path C:\\temp\\users.sql -ExcludeGoBatchSeparator\nExports ONLY users from db1 and db2 database on sqlserver2008 server, to the C:\\temp\\users.sql file without the \u0027GO\u0027 batch separator.", "Params": [ [ "SqlInstance", @@ -7233,22 +7327,23 @@ "False" ] ], - "Alias": "Export-SqlUser", - "Author": "Claudio Silva (@ClaudioESSilva)", - "Synopsis": "Exports users creation and its permissions to a T-SQL file or host.", - "Name": "Export-DbaUser", - "Links": "https://dbatools.io/Export-DbaUser", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eExport-DbaUser -SqlInstance sql2005 -Path C:\\temp\\sql2005-users.sql\nExports SQL for the users in server \"sql2005\" and writes them to the file \"C:\\temp\\sql2005-users.sql\"\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eExport-DbaUser -SqlInstance sqlserver2014a $scred -Path C:\\temp\\users.sql -Append\nAuthenticates to sqlserver2014a using SQL Authentication. Exports all users to C:\\temp\\users.sql, and appends to the file if it exists. If not, the file will be created.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eExport-DbaUser -SqlInstance sqlserver2014a -User User1, User2 -Path C:\\temp\\users.sql\nExports ONLY users User1 and User2 from sqlserver2014a to the file C:\\temp\\users.sql\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eExport-DbaUser -SqlInstance sqlserver2008 -User User1 -Path C:\\temp\\users.sql -DestinationVersion SQLServer2016\nExports user User1 from sqlserver2008 to the file C:\\temp\\users.sql with syntax to run on SQL Server 2016\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eExport-DbaUser -SqlInstance sqlserver2008 -Database db1,db2 -Path C:\\temp\\users.sql\nExports ONLY users from db1 and db2 database on sqlserver2008 server, to the C:\\temp\\users.sql file.\n-------------------------- EXAMPLE 6 --------------------------\nPS C:\\\u003e$options = New-DbaScriptingOption\nPS C:\\\u003e $options.ScriptDrops = $false\r\nPS C:\\\u003e $options.WithDependencies = $true\r\nPS C:\\\u003e Export-DbaUser -SqlInstance sqlserver2008 -Database db1,db2 -Path C:\\temp\\users.sql -ScriptingOptionsObject $options\nExports ONLY users from db1 and db2 database on sqlserver2008 server, to the C:\\temp\\users.sql file.\r\nIt will not script drops but will script dependencies.\n-------------------------- EXAMPLE 7 --------------------------\nPS C:\\\u003eExport-DbaUser -SqlInstance sqlserver2008 -Database db1,db2 -Path C:\\temp\\users.sql -ExcludeGoBatchSeparator\nExports ONLY users from db1 and db2 database on sqlserver2008 server, to the C:\\temp\\users.sql file without the \u0027GO\u0027 batch separator.", "Syntax": "Export-DbaUser [-SqlInstance] \u003cDbaInstanceParameter\u003e [[-SqlCredential] \u003cPSCredential\u003e] [[-Database] \u003cObject[]\u003e] [[-ExcludeDatabase] \u003cObject[]\u003e] [[-User] \u003cObject[]\u003e] [[-DestinationVersion] \u003cString\u003e] [[-Path] \u003cString\u003e] [-NoClobber] [-Append] [-EnableException] [[-ScriptingOptionsObject] \u003cScriptingOptions\u003e] [-ExcludeGoBatchSeparator] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Export-DbaXECsv", + "Name": "Export-DbaXECsv", "Description": "Exports Extended Events to a CSV file.", "Tags": [ "ExtendedEvent", "XE", "XEvent" ], + "Synopsis": "Exports Extended Events to a CSV file.", + "Alias": "", + "Author": "Gianluca Sartori (@spaghettidba)", + "CommandName": "Export-DbaXECsv", + "Availability": "Windows only", + "Links": "https://dbatools.io/Export-DbaXECsv", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-ChildItem -Path C:\\temp\\sample.xel | Export-DbaXECsv -Path c:\\temp\\sample.csv\nWrites Extended Events data to the file \"C:\\temp\\events.csv\".\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaXESession -SqlInstance sql2014 -Session deadlocks | Export-DbaXECsv -Path c:\\temp\\events.csv\nWrites Extended Events data to the file \"C:\\temp\\events.csv\".", "Params": [ [ "InputObject", @@ -7275,22 +7370,23 @@ "False" ] ], - "Alias": "", - "Author": "Gianluca Sartori (@spaghettidba)", - "Synopsis": "Exports Extended Events to a CSV file.", - "Name": "Export-DbaXECsv", - "Links": "https://dbatools.io/Export-DbaXECsv", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-ChildItem -Path C:\\temp\\sample.xel | Export-DbaXECsv -Path c:\\temp\\sample.csv\nWrites Extended Events data to the file \"C:\\temp\\events.csv\".\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaXESession -SqlInstance sql2014 -Session deadlocks | Export-DbaXECsv -Path c:\\temp\\events.csv\nWrites Extended Events data to the file \"C:\\temp\\events.csv\".", "Syntax": "Export-DbaXECsv [-InputObject] \u003cObject[]\u003e [-Path] \u003cString\u003e [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Export-DbaXESessionTemplate", + "Name": "Export-DbaXESessionTemplate", "Description": "Exports an XESession XML Template either from the Target SQL Server or XE Session(s) output by Get-DbaXESession. Exports to \"$home\\Documents\\SQL Server Management Studio\\Templates\\XEventTemplates\" by default", "Tags": [ "ExtendedEvent", "XE", "XEvent" ], + "Synopsis": "Exports an XESession XML Template using XE Session(s) output by Get-DbaXESession", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Export-DbaXESessionTemplate", + "Availability": "Windows only", + "Links": "https://dbatools.io/Export-DbaXESessionTemplate", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eExport-DbaXESessionTemplate -SqlInstance sql2017 -Path C:\\temp\\xe\nExports an XESession XML Template for all Extended Event Sessions on sql2017 to the C:\\temp\\xe folder.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaXESession -SqlInstance sql2017 -Session system_health | Export-DbaXESessionTemplate -Path C:\\temp\\xe\nGets the system_health Extended Events Session from sql2017 and then exports as an XESession XML Template to C:\\temp\\xe", "Params": [ [ "SqlInstance", @@ -7341,21 +7437,22 @@ "False" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Exports an XESession XML Template using XE Session(s) output by Get-DbaXESession", - "Name": "Export-DbaXESessionTemplate", - "Links": "https://dbatools.io/Export-DbaXESessionTemplate", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eExport-DbaXESessionTemplate -SqlInstance sql2017 -Path C:\\temp\\xe\nExports an XESession XML Template for all Extended Event Sessions on sql2017 to the C:\\temp\\xe folder.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaXESession -SqlInstance sql2017 -Session system_health | Export-DbaXESessionTemplate -Path C:\\temp\\xe\nGets the system_health Extended Events Session from sql2017 and then exports as an XESession XML Template to C:\\temp\\xe", "Syntax": "Export-DbaXESessionTemplate [[-SqlInstance] \u003cDbaInstanceParameter[]\u003e] [[-SqlCredential] \u003cPSCredential\u003e] [[-Session] \u003cObject[]\u003e] [[-Path] \u003cString\u003e] [[-InputObject] \u003cSession[]\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Find-DbaAgentJob", + "Name": "Find-DbaAgentJob", "Description": "This command filters SQL Agent jobs giving the DBA a list of jobs that may need attention or could possibly be options for removal.", "Tags": [ "Agent", "Job" ], + "Synopsis": "Find-DbaAgentJob finds agent jobs that fit certain search filters.", + "Alias": "", + "Author": "Stephen Bennett (https://sqlnotesfromtheunderground.wordpress.com/)", + "CommandName": "Find-DbaAgentJob", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Find-DbaAgentJob", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eFind-DbaAgentJob -SqlInstance Dev01 -JobName *backup*\nReturns all agent job(s) that have backup in the name\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eFind-DbaAgentJob -SqlInstance Dev01, Dev02 -JobName Mybackup\nReturns all agent job(s) that are named exactly Mybackup\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eFind-DbaAgentJob -SqlInstance Dev01 -LastUsed 10\nReturns all agent job(s) that have not ran in 10 days\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eFind-DbaAgentJob -SqlInstance Dev01 -IsDisabled -IsNoEmailNotification -IsNotScheduled\nReturns all agent job(s) that are either disabled, have no email notification or don\u0027t have a schedule. returned with detail\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003e$servers | Find-DbaAgentJob -IsFailed | Start-DbaAgentJob\nFinds all failed job then starts them. Consider using a -WhatIf at the end of Start-DbaAgentJob to see what it\u0027ll do first\n-------------------------- EXAMPLE 6 --------------------------\nPS C:\\\u003eFind-DbaAgentJob -SqlInstance Dev01 -LastUsed 10 -Exclude \"Yearly - RollUp Workload\", \"SMS - Notification\"\nReturns all agent jobs that have not ran in the last 10 days ignoring jobs \"Yearly - RollUp Workload\" and \"SMS - Notification\"\n-------------------------- EXAMPLE 7 --------------------------\nPS C:\\\u003eFind-DbaAgentJob -SqlInstance Dev01 -Category \"REPL-Distribution\", \"REPL-Snapshot\" | Format-Table -AutoSize -Wrap\nReturns all job/s on Dev01 that are in either category \"REPL-Distribution\" or \"REPL-Snapshot\"\n-------------------------- EXAMPLE 8 --------------------------\nPS C:\\\u003eFind-DbaAgentJob -SqlInstance Dev01, Dev02 -IsFailed -Since \u00272016-07-01 10:47:00\u0027\nReturns all agent job(s) on Dev01 and Dev02 that have failed since July of 2016 (and still have history in msdb)\n-------------------------- EXAMPLE 9 --------------------------\nPS C:\\\u003eGet-DbaCmsRegServer -SqlInstance CMSServer -Group Production | Find-DbaAgentJob -Disabled -IsNotScheduled | Format-Table -AutoSize -Wrap\nQueries CMS server to return all SQL instances in the Production folder and then list out all agent jobs that have either been disabled or have no schedule.", "Params": [ [ "SqlInstance", @@ -7470,18 +7567,19 @@ "False" ] ], - "Alias": "", - "Author": "Stephen Bennett (https://sqlnotesfromtheunderground.wordpress.com/)", - "Synopsis": "Find-DbaAgentJob finds agent jobs that fit certain search filters.", - "Name": "Find-DbaAgentJob", - "Links": "https://dbatools.io/Find-DbaAgentJob", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eFind-DbaAgentJob -SqlInstance Dev01 -JobName *backup*\nReturns all agent job(s) that have backup in the name\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eFind-DbaAgentJob -SqlInstance Dev01, Dev02 -JobName Mybackup\nReturns all agent job(s) that are named exactly Mybackup\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eFind-DbaAgentJob -SqlInstance Dev01 -LastUsed 10\nReturns all agent job(s) that have not ran in 10 days\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eFind-DbaAgentJob -SqlInstance Dev01 -IsDisabled -IsNoEmailNotification -IsNotScheduled\nReturns all agent job(s) that are either disabled, have no email notification or don\u0027t have a schedule. returned with detail\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003e$servers | Find-DbaAgentJob -IsFailed | Start-DbaAgentJob\nFinds all failed job then starts them. Consider using a -WhatIf at the end of Start-DbaAgentJob to see what it\u0027ll do first\n-------------------------- EXAMPLE 6 --------------------------\nPS C:\\\u003eFind-DbaAgentJob -SqlInstance Dev01 -LastUsed 10 -Exclude \"Yearly - RollUp Workload\", \"SMS - Notification\"\nReturns all agent jobs that have not ran in the last 10 days ignoring jobs \"Yearly - RollUp Workload\" and \"SMS - Notification\"\n-------------------------- EXAMPLE 7 --------------------------\nPS C:\\\u003eFind-DbaAgentJob -SqlInstance Dev01 -Category \"REPL-Distribution\", \"REPL-Snapshot\" | Format-Table -AutoSize -Wrap\nReturns all job/s on Dev01 that are in either category \"REPL-Distribution\" or \"REPL-Snapshot\"\n-------------------------- EXAMPLE 8 --------------------------\nPS C:\\\u003eFind-DbaAgentJob -SqlInstance Dev01, Dev02 -IsFailed -Since \u00272016-07-01 10:47:00\u0027\nReturns all agent job(s) on Dev01 and Dev02 that have failed since July of 2016 (and still have history in msdb)\n-------------------------- EXAMPLE 9 --------------------------\nPS C:\\\u003eGet-DbaCmsRegServer -SqlInstance CMSServer -Group Production | Find-DbaAgentJob -Disabled -IsNotScheduled | Format-Table -AutoSize -Wrap\nQueries CMS server to return all SQL instances in the Production folder and then list out all agent jobs that have either been disabled or have no schedule.", "Syntax": "Find-DbaAgentJob [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [-SqlCredential \u003cPSCredential\u003e] [-JobName \u003cString[]\u003e] [-ExcludeJobName \u003cString[]\u003e] [-StepName \u003cString[]\u003e] [-LastUsed \u003cInt32\u003e] [-IsDisabled] [-IsFailed] [-IsNotScheduled] [-IsNoEmailNotification] [-Category \u003cString[]\u003e] [-Owner \u003cString\u003e] [-Since \u003cDateTime\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Find-DbaBackup", + "Name": "Find-DbaBackup", "Description": "Provides all of the same functionality for finding SQL backups to remove from disk as a standard maintenance plan would.\n\nAs an addition you have the ability to check the Archive bit on files before deletion. This will allow you to ensure backups have been archived to your archive location before removal.", "Tags": "Backup", + "Synopsis": "Finds SQL Server backups on disk.", + "Alias": "", + "Author": "Chris Sommer (@cjsommer), www.cjsommer.com", + "CommandName": "Find-DbaBackup", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Find-DbaBackup", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eFind-DbaBackup -Path \u0027C:\\MSSQL\\SQL Backup\\\u0027 -BackupFileExtension trn -RetentionPeriod 48h\nSearches for all trn files in C:\\MSSQL\\SQL Backup\\ and all subdirectories that are more than 48 hours old will be included.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eFind-DbaBackup -Path \u0027C:\\MSSQL\\Backup\\\u0027 -BackupFileExtension bak -RetentionPeriod 7d -CheckArchiveBit\nSearches for all bak files in C:\\MSSQL\\Backup\\ and all subdirectories that are more than 7 days old will be included, but only if the files have been backed up to another location as verified by \r\nchecking the Archive bit.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eFind-DbaBackup -Path \u0027\\\\SQL2014\\Backup\\\u0027 -BackupFileExtension bak -RetentionPeriod 24h | Remove-Item -Verbose\nSearches for all bak files in \\\\SQL2014\\Backup\\ and all subdirectories that are more than 24 hours old and deletes only those files with verbose message.", "Params": [ [ "Path", @@ -7524,22 +7622,23 @@ "False" ] ], - "Alias": "", - "Author": "Chris Sommer (@cjsommer), www.cjsommer.com", - "Synopsis": "Finds SQL Server backups on disk.", - "Name": "Find-DbaBackup", - "Links": "https://dbatools.io/Find-DbaBackup", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eFind-DbaBackup -Path \u0027C:\\MSSQL\\SQL Backup\\\u0027 -BackupFileExtension trn -RetentionPeriod 48h\nSearches for all trn files in C:\\MSSQL\\SQL Backup\\ and all subdirectories that are more than 48 hours old will be included.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eFind-DbaBackup -Path \u0027C:\\MSSQL\\Backup\\\u0027 -BackupFileExtension bak -RetentionPeriod 7d -CheckArchiveBit\nSearches for all bak files in C:\\MSSQL\\Backup\\ and all subdirectories that are more than 7 days old will be included, but only if the files have been backed up to another location as verified by \r\nchecking the Archive bit.", "Syntax": "Find-DbaBackup [-Path] \u003cString\u003e [-BackupFileExtension] \u003cString\u003e [-RetentionPeriod] \u003cString\u003e [-CheckArchiveBit] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Find-DbaCommand", + "Name": "Find-DbaCommand", "Description": "Finds dbatools commands searching through the inline help text, building a consolidated json index and querying it because Get-Help is too slow", "Tags": [ "Find", "Help", "Command" ], + "Synopsis": "Finds dbatools commands searching through the inline help text", + "Alias": "", + "Author": "Simone Bizzotto (@niphlod)", + "CommandName": "Find-DbaCommand", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Find-DbaCommand", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eFind-DbaCommand \"snapshot\"\nFor lazy typers: finds all commands searching the entire help for \"snapshot\"\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eFind-DbaCommand -Pattern \"snapshot\"\nFor rigorous typers: finds all commands searching the entire help for \"snapshot\"\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eFind-DbaCommand -Tag copy\nFinds all commands tagged with \"copy\"\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eFind-DbaCommand -Tag copy,user\nFinds all commands tagged with BOTH \"copy\" and \"user\"\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eFind-DbaCommand -Author chrissy\nFinds every command whose author contains our beloved \"chrissy\"\n-------------------------- EXAMPLE 6 --------------------------\nPS C:\\\u003eFind-DbaCommand -Author chrissy -Tag copy\nFinds every command whose author contains our beloved \"chrissy\" and it tagged as \"copy\"\n-------------------------- EXAMPLE 7 --------------------------\nPS C:\\\u003eFind-DbaCommand -Pattern snapshot -Rebuild\nFinds all commands searching the entire help for \"snapshot\", rebuilding the index (good for developers)", "Params": [ [ "Pattern", @@ -7614,18 +7713,19 @@ "" ] ], - "Alias": "", - "Author": "Simone Bizzotto (@niphold)", - "Synopsis": "Finds dbatools commands searching through the inline help text", - "Name": "Find-DbaCommand", - "Links": "https://dbatools.io/Find-DbaCommand", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eFind-DbaCommand \"snapshot\"\nFor lazy typers: finds all commands searching the entire help for \"snapshot\"\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eFind-DbaCommand -Pattern \"snapshot\"\nFor rigorous typers: finds all commands searching the entire help for \"snapshot\"\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eFind-DbaCommand -Tag copy\nFinds all commands tagged with \"copy\"\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eFind-DbaCommand -Tag copy,user\nFinds all commands tagged with BOTH \"copy\" and \"user\"\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eFind-DbaCommand -Author chrissy\nFinds every command whose author contains our beloved \"chrissy\"\n-------------------------- EXAMPLE 6 --------------------------\nPS C:\\\u003eFind-DbaCommand -Author chrissy -Tag copy\nFinds every command whose author contains our beloved \"chrissy\" and it tagged as \"copy\"\n-------------------------- EXAMPLE 7 --------------------------\nPS C:\\\u003eFind-DbaCommand -Pattern snapshot -Rebuild\nFinds all commands searching the entire help for \"snapshot\", rebuilding the index (good for developers)", "Syntax": "Find-DbaCommand [[-Pattern] \u003cString\u003e] [[-Tag] \u003cString[]\u003e] [[-Author] \u003cString\u003e] [[-MinimumVersion] \u003cString\u003e] [[-MaximumVersion] \u003cString\u003e] [-Rebuild] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Find-DbaDatabase", + "Name": "Find-DbaDatabase", "Description": "Allows you to search SQL Server instances for database that have either the same name, owner or service broker guid.\n\nThere a several reasons for the service broker guid not matching on a restored database primarily using alter database new broker. or turn off broker to return a guid of 0000-0000-0000-0000.", "Tags": "Database", + "Synopsis": "Find database/s on multiple servers that match criteria you input", + "Alias": "", + "Author": "Stephen Bennett, https://sqlnotesfromtheunderground.wordpress.com/", + "CommandName": "Find-DbaDatabase", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Find-DbaDatabase", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eFind-DbaDatabase -SqlInstance \"DEV01\", \"DEV02\", \"UAT01\", \"UAT02\", \"PROD01\", \"PROD02\" -Pattern Report\nReturns all database from the SqlInstances that have a database with Report in the name\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eFind-DbaDatabase -SqlInstance \"DEV01\", \"DEV02\", \"UAT01\", \"UAT02\", \"PROD01\", \"PROD02\" -Pattern TestDB -Exact | Select-Object *\nReturns all database from the SqlInstances that have a database named TestDB with a detailed output.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eFind-DbaDatabase -SqlInstance \"DEV01\", \"DEV02\", \"UAT01\", \"UAT02\", \"PROD01\", \"PROD02\" -Property ServiceBrokerGuid -Pattern \u0027-faeb-495a-9898-f25a782835f5\u0027 | Select-Object *\nReturns all database from the SqlInstances that have the same Service Broker GUID with a detailed output", "Params": [ [ "SqlInstance", @@ -7684,22 +7784,23 @@ "False" ] ], - "Alias": "", - "Author": "Stephen Bennett, https://sqlnotesfromtheunderground.wordpress.com/", - "Synopsis": "Find database/s on multiple servers that match criteria you input", - "Name": "Find-DbaDatabase", - "Links": "https://dbatools.io/Find-DbaDatabase", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eFind-DbaDatabase -SqlInstance \"DEV01\", \"DEV02\", \"UAT01\", \"UAT02\", \"PROD01\", \"PROD02\" -Pattern Report\nReturns all database from the SqlInstances that have a database with Report in the name\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eFind-DbaDatabase -SqlInstance \"DEV01\", \"DEV02\", \"UAT01\", \"UAT02\", \"PROD01\", \"PROD02\" -Pattern TestDB -Exact | Select-Object *\nReturns all database from the SqlInstances that have a database named TestDB with a detailed output.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eFind-DbaDatabase -SqlInstance \"DEV01\", \"DEV02\", \"UAT01\", \"UAT02\", \"PROD01\", \"PROD02\" -Property ServiceBrokerGuid -Pattern \u0027-faeb-495a-9898-f25a782835f5\u0027 | Select-Object *\nReturns all database from the SqlInstances that have the same Service Broker GUID with a detailed output", "Syntax": "Find-DbaDatabase [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [[-Property] \u003cString\u003e] [-Pattern] \u003cString\u003e [-Exact] [-Detailed] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Find-DbaDbGrowthEvent", + "Name": "Find-DbaDbGrowthEvent", "Description": "Finds any database AutoGrow events in the Default Trace.\n\nThe following events are included:\n92 - Data File Auto Grow\n93 - Log File Auto Grow\n94 - Data File Auto Shrink\n95 - Log File Auto Shrink", "Tags": [ "AutoGrow", "Growth", "Database" ], + "Synopsis": "Finds any database AutoGrow events in the Default Trace.", + "Alias": "Find-DbaDatabaseGrowthEvent", + "Author": "Aaron Nelson", + "CommandName": "Find-DbaDbGrowthEvent", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Find-DbaDatabaseGrowthEvent", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eFind-DbaDatabaseGrowthEvent -SqlInstance localhost\nReturns any database AutoGrow events in the Default Trace with UTC time for the instance for every database on the localhost instance.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eFind-DbaDatabaseGrowthEvent -SqlInstance localhost -UseLocalTime\nReturns any database AutoGrow events in the Default Trace with the local time of the instance for every database on the localhost instance.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eFind-DbaDatabaseGrowthEvent -SqlInstance ServerA\\SQL2016, ServerA\\SQL2014\nReturns any database AutoGrow events in the Default Traces for every database on ServerA\\sql2016 \u0026 ServerA\\SQL2014.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eFind-DbaDatabaseGrowthEvent -SqlInstance ServerA\\SQL2016 | Format-Table -AutoSize -Wrap\nReturns any database AutoGrow events in the Default Trace for every database on the ServerA\\SQL2016 instance in a table format.\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eFind-DbaDatabaseGrowthEvent -SqlInstance ServerA\\SQL2016 -EventType Shrink\nReturns any database Auto Shrink events in the Default Trace for every database on the ServerA\\SQL2016 instance.\n-------------------------- EXAMPLE 6 --------------------------\nPS C:\\\u003eFind-DbaDatabaseGrowthEvent -SqlInstance ServerA\\SQL2016 -EventType Growth -FileType Data\nReturns any database Auto Growth events on data files in the Default Trace for every database on the ServerA\\SQL2016 instance.", "Params": [ [ "SqlInstance", @@ -7766,18 +7867,19 @@ "False" ] ], - "Alias": "Find-DbaDatabaseGrowthEvent", - "Author": "Aaron Nelson", - "Synopsis": "Finds any database AutoGrow events in the Default Trace.", - "Name": "Find-DbaDbGrowthEvent", - "Links": "https://dbatools.io/Find-DbaDatabaseGrowthEvent", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eFind-DbaDatabaseGrowthEvent -SqlInstance localhost\nReturns any database AutoGrow events in the Default Trace with UTC time for the instance for every database on the localhost instance.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eFind-DbaDatabaseGrowthEvent -SqlInstance localhost -UseLocalTime\nReturns any database AutoGrow events in the Default Trace with the local time of the instance for every database on the localhost instance.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eFind-DbaDatabaseGrowthEvent -SqlInstance ServerA\\SQL2016, ServerA\\SQL2014\nReturns any database AutoGrow events in the Default Traces for every database on ServerA\\sql2016 \u0026 ServerA\\SQL2014.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eFind-DbaDatabaseGrowthEvent -SqlInstance ServerA\\SQL2016 | Format-Table -AutoSize -Wrap\nReturns any database AutoGrow events in the Default Trace for every database on the ServerA\\SQL2016 instance in a table format.\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eFind-DbaDatabaseGrowthEvent -SqlInstance ServerA\\SQL2016 -EventType Shrink\nReturns any database Auto Shrink events in the Default Trace for every database on the ServerA\\SQL2016 instance.\n-------------------------- EXAMPLE 6 --------------------------\nPS C:\\\u003eFind-DbaDatabaseGrowthEvent -SqlInstance ServerA\\SQL2016 -EventType Growth -FileType Data\nReturns any database Auto Growth events on data files in the Default Trace for every database on the ServerA\\SQL2016 instance.", "Syntax": "Find-DbaDbGrowthEvent [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [[-Database] \u003cObject[]\u003e] [[-ExcludeDatabase] \u003cObject[]\u003e] [[-EventType] \u003cString\u003e] [[-FileType] \u003cString\u003e] [-UseLocalTime] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Find-DbaDbUnusedIndex", + "Name": "Find-DbaDbUnusedIndex", "Description": "This command will help you to find Unused indexes on a database or a list of databases\n\nFor now only supported for CLUSTERED and NONCLUSTERED indexes", "Tags": "Index", + "Synopsis": "Find unused indexes", + "Alias": "Find-SqlUnusedIndex", + "Author": "Aaron Nelson (@SQLvariant), SQLvariant.com", + "CommandName": "Find-DbaDbUnusedIndex", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Find-DbaDbUnusedIndex", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eFind-DbaDbUnusedIndex -SqlInstance sql2016 -Database db1, db2\nFinds unused databases on db1 and db2 on sql2016\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eFind-DbaDbUnusedIndex -SqlInstance sql2016 -SqlCredential $cred\nFinds unused databases on db1 and db2 on sql2016 using SQL Authentication to connect to the server\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaDatabase -SqlInstance sql2016 | Find-DbaDbUnusedIndex\nFinds unused databases on all databases on sql2016", "Params": [ [ "SqlInstance", @@ -7836,18 +7938,19 @@ "False" ] ], - "Alias": "Find-SqlUnusedIndex", - "Author": "Aaron Nelson (@SQLvariant), SQLvariant.com", - "Synopsis": "Find unused indexes", - "Name": "Find-DbaDbUnusedIndex", - "Links": "https://dbatools.io/Find-DbaDbUnusedIndex", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eFind-DbaDbUnusedIndex -SqlInstance sql2016 -Database db1, db2\nFinds unused databases on db1 and db2 on sql2016\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eFind-DbaDbUnusedIndex -SqlInstance sql2016 -SqlCredential $cred\nFinds unused databases on db1 and db2 on sql2016 using SQL Authentication to connect to the server\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaDatabase -SqlInstance sql2016 | Find-DbaDbUnusedIndex\nFinds unused databases on all databases on sql2016", "Syntax": "Find-DbaDbUnusedIndex [[-SqlInstance] \u003cDbaInstanceParameter[]\u003e] [[-SqlCredential] \u003cPSCredential\u003e] [[-Database] \u003cObject[]\u003e] [[-ExcludeDatabase] \u003cObject[]\u003e] [-IgnoreUptime] [[-InputObject] \u003cDatabase[]\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Find-DbaDisabledIndex", + "Name": "Find-DbaDisabledIndex", "Description": "This command will help you to find disabled indexes on a database or a list of databases.", "Tags": "Index", + "Synopsis": "Find Disabled indexes", + "Alias": "", + "Author": "Jason Squires, sqlnotnull.com", + "CommandName": "Find-DbaDisabledIndex", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Find-DbadisabledIndex", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eFind-DbaDisabledIndex -SqlInstance sql2005\nGenerates the SQL statements to drop the selected disabled indexes on server \"sql2005\".\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eFind-DbaDisabledIndex -SqlInstance sqlserver2016 -SqlCredential $cred\nGenerates the SQL statements to drop the selected disabled indexes on server \"sqlserver2016\", using SQL Authentication to connect to the database.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eFind-DbaDisabledIndex -SqlInstance sqlserver2016 -Database db1, db2\nGenerates the SQL Statement to drop selected indexes in databases db1 \u0026 db2 on server \"sqlserver2016\".\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eFind-DbaDisabledIndex -SqlInstance sqlserver2016\nGenerates the SQL statements to drop selected indexes on all user databases.", "Params": [ [ "SqlInstance", @@ -7922,18 +8025,19 @@ "" ] ], - "Alias": "", - "Author": "Jason Squires, sqlnotnull.com", - "Synopsis": "Find Disabled indexes", - "Name": "Find-DbaDisabledIndex", - "Links": "https://dbatools.io/Find-DbadisabledIndex", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eFind-DbaDisabledIndex -SqlInstance sql2005\nGenerates the SQL statements to drop the selected disabled indexes on server \"sql2005\".\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eFind-DbaDisabledIndex -SqlInstance sqlserver2016 -SqlCredential $cred\nGenerates the SQL statements to drop the selected disabled indexes on server \"sqlserver2016\", using SQL Authentication to connect to the database.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eFind-DbaDisabledIndex -SqlInstance sqlserver2016 -Database db1, db2\nGenerates the SQL Statement to drop selected indexes in databases db1 \u0026 db2 on server \"sqlserver2016\".\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eFind-DbaDisabledIndex -SqlInstance sqlserver2016\nGenerates the SQL statements to drop selected indexes on all user databases.", "Syntax": "Find-DbaDisabledIndex [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [[-Database] \u003cObject[]\u003e] [[-ExcludeDatabase] \u003cObject[]\u003e] [-NoClobber] [-Append] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Find-DbaDuplicateIndex", + "Name": "Find-DbaDuplicateIndex", "Description": "This command will help you to find duplicate and overlapping indexes on a database or a list of databases.\n\nOn SQL Server 2008 and higher, the IsFiltered property will also be checked\n\nOnly supports CLUSTERED and NONCLUSTERED indexes.\n\nOutput:\nTableName\nIndexName\nKeyColumns\nIncludedColumns\nIndexSizeMB\nIndexType\nCompressionDescription (When 2008+)\n[RowCount]\nIsDisabled\nIsFiltered (When 2008+)", "Tags": "Index", + "Synopsis": "Find duplicate and overlapping indexes.", + "Alias": "Find-SqlDuplicateIndex", + "Author": "Claudio Silva (@ClaudioESSilva)", + "CommandName": "Find-DbaDuplicateIndex", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Find-DbaDuplicateIndex", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eFind-DbaDuplicateIndex -SqlInstance sql2005\nReturns duplicate indexes found on sql2005\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eFind-DbaDuplicateIndex -SqlInstance sql2017 -SqlCredential sqladmin\nFinds exact duplicate indexes on all user databases present on sql2017, using SQL authentication.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eFind-DbaDuplicateIndex -SqlInstance sql2017 -Database db1, db2\nFinds exact duplicate indexes on the db1 and db2 databases.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eFind-DbaDuplicateIndex -SqlInstance sql2017 -IncludeOverlapping\nFinds both duplicate and overlapping indexes on all user databases.", "Params": [ [ "SqlInstance", @@ -7976,22 +8080,23 @@ "False" ] ], - "Alias": "Find-SqlDuplicateIndex", - "Author": "Claudio Silva (@ClaudioESSilva)", - "Synopsis": "Find duplicate and overlapping indexes.", - "Name": "Find-DbaDuplicateIndex", - "Links": "https://dbatools.io/Find-DbaDuplicateIndex", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eFind-DbaDuplicateIndex -SqlInstance sql2005\nReturns duplicate indexes found on sql2005\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eFind-DbaDuplicateIndex -SqlInstance sql2017 -SqlCredential sqladmin\nFinds exact duplicate indexes on all user databases present on sql2017, using SQL authentication.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eFind-DbaDuplicateIndex -SqlInstance sql2017 -Database db1, db2\nFinds exact duplicate indexes on the db1 and db2 databases.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eFind-DbaDuplicateIndex -SqlInstance sql2017 -IncludeOverlapping\nFinds both duplicate and overlapping indexes on all user databases.", "Syntax": "Find-DbaDuplicateIndex [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [[-Database] \u003cObject[]\u003e] [-IncludeOverlapping] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Find-DbaInstance", + "Name": "Find-DbaInstance", "Description": "This function searches for SQL Server Instances.\n\nIt supports a variety of scans for this purpose which can be separated in two categories:\n- Discovery\n- Scan\n\nDiscovery:\nThis is where it compiles a list of computers / addresses to check.\nIt supports several methods of generating such lists (including Active Directory lookup or IP Ranges), but also supports specifying a list of computers to check.\n- For details on discovery, see the documentation on the \u0027-DiscoveryType\u0027 parameter\n- For details on explicitly providing a list, see the documentation on the \u0027-ComputerName\u0027 parameter\n\nScan:\nOnce a list of computers has been provided, this command will execute a variety of actions to determine any instances present for each of them.\nThis is described in more detail in the documentation on the \u0027-ScanType\u0027 parameter.\nAdditional parameters allow more granular control over individual scans (e.g. Credentials to use).\n\nNote on logging and auditing:\nThe Discovery phase is un-problematic since it is non-intrusive, however during the scan phase, all targeted computers may be accessed repeatedly.\nThis may cause issues with security teams, due to many logon events and possibly failed authentication.\nThis action constitutes a network scan, which may be illegal depending on the nation you are in and whether you own the network you scan.\nIf you are unsure whether you may use this command in your environment, check the detailed description on the \u0027-ScanType\u0027 parameter and contact your IT security team for advice.", "Tags": [ "Instance", "Connect", "SqlServer" ], + "Synopsis": "Search for SQL Server Instances.", + "Alias": "", + "Author": "Scott Sutherland, 2018 NetSPI | Friedrich Weinmann (@FredWeinmann)", + "CommandName": "Find-DbaInstance", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Find-DbaInstance", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eFind-DbaInstance -DiscoveryType Domain, DataSourceEnumeration\nPerforms a network search for SQL Instances by:\r\n- Looking up the Service Principal Names of computers in active directory\r\n- Using the UDP broadcast based auto-discovery of SSMS\r\nAfter that it will extensively scan all hosts thus discovered for instances.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eFind-DbaInstance -DiscoveryType All\nPerforms a network search for SQL Instances, using all discovery protocols:\r\n- Active directory search for Service Principal Names\r\n- SQL Instance Enumeration (same as SSMS does)\r\n- All IPAddresses in the current computer\u0027s subnets of all connected network interfaces\r\nNote: This scan will take a long time, due to including the IP Scan\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-ADComputer -Filter \"*\" | Find-DbaInstance\nScans all computers in the domain for SQL Instances, using a deep probe:\r\n- Tries resolving the name in DNS\r\n- Tries pinging the computer\r\n- Tries listing all SQL Services using CIM/WMI\r\n- Tries discovering all instances via the browser service\r\n- Tries connecting to the default TCP Port (1433)\r\n- Tries connecting to the TCP port of each discovered instance\r\n- Tries to establish a SQL connection to the server using default windows credentials\r\n- Tries looking up the Service Principal Names for each instance\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-Content .\\servers.txt | Find-DbaInstance -SqlCredential $cred -ScanType Browser, SqlConnect\nReads all servers from the servers.txt file (one server per line),\r\nthen scans each of them for instances using the browser service\r\nand finally attempts to connect to each instance found using the specified credentials.\r\nthen scans each of them for instances using the browser service and SqlService\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eFind-DbaInstance -ComputerName localhost | Get-DbaDatabase | Format-Table -Wrap\nScans localhost for instances using the browser service, traverses all instances for all databases and displays all information in a formatted table.\n-------------------------- EXAMPLE 6 --------------------------\nPS C:\\\u003eFind-DbaInstance -ComputerName localhost | Get-DbaDatabase | Select-Object SqlInstance, Name, Status, RecoveryModel, SizeMB, Compatibility, Owner, LastFullBackup, LastDiffBackup, LastLogBackup \r\n| Format-Table -Wrap\nScans localhost for instances using the browser service, traverses all instances for all databases and displays a subset of the important information in a formatted table.\nUsing this method reguarly is not recommended. Use Get-DbaService or Get-DbaCmsRegServer instead.", "Params": [ [ "ComputerName", @@ -8074,22 +8179,23 @@ "False" ] ], - "Alias": "", - "Author": "Scott Sutherland, 2018 NetSPI | Friedrich Weinmann (@FredWeinmann)", - "Synopsis": "Search for SQL Server Instances.", - "Name": "Find-DbaInstance", - "Links": "https://dbatools.io/Find-DbaInstance", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eFind-DbaInstance -DiscoveryType Domain, DataSourceEnumeration\nPerforms a network search for SQL Instances by:\r\n- Looking up the Service Principal Names of computers in active directory\r\n- Using the UDP broadcast based auto-discovery of SSMS\r\nAfter that it will extensively scan all hosts thus discovered for instances.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eFind-DbaInstance -DiscoveryType All\nPerforms a network search for SQL Instances, using all discovery protocols:\r\n- Active directory search for Service Principal Names\r\n- SQL Instance Enumeration (same as SSMS does)\r\n- All IPAddresses in the current computer\u0027s subnets of all connected network interfaces\r\nNote: This scan will take a long time, due to including the IP Scan\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-ADComputer -Filter \"*\" | Find-DbaInstance\nScans all computers in the domain for SQL Instances, using a deep probe:\r\n- Tries resolving the name in DNS\r\n- Tries pinging the computer\r\n- Tries listing all SQL Services using CIM/WMI\r\n- Tries discovering all instances via the browser service\r\n- Tries connecting to the default TCP Port (1433)\r\n- Tries connecting to the TCP port of each discovered instance\r\n- Tries to establish a SQL connection to the server using default windows credentials\r\n- Tries looking up the Service Principal Names for each instance\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-Content .\\servers.txt | Find-DbaInstance -SqlCredential $cred -ScanType Browser, SqlConnect\nReads all servers from the servers.txt file (one server per line),\r\nthen scans each of them for instances using the browser service\r\nand finally attempts to connect to each instance found using the specified credentials.\r\nthen scans each of them for instances using the browser service and SqlService\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eFind-DbaInstance -ComputerName localhost | Get-DbaDatabase | Format-Table -Wrap\nScans localhost for instances using the browser service, traverses all instances for all databases and displays all information in a formatted table.\n-------------------------- EXAMPLE 6 --------------------------\nPS C:\\\u003eFind-DbaInstance -ComputerName localhost | Get-DbaDatabase | Select-Object SqlInstance, Name, Status, RecoveryModel, SizeMB, Compatibility, Owner, LastFullBackup, LastDiffBackup, LastLogBackup \r\n| Format-Table -Wrap\nScans localhost for instances using the browser service, traverses all instances for all databases and displays a subset of the important information in a formatted table.\nUsing this method reguarly is not recommended. Use Get-DbaService or Get-DbaCmsRegServer instead.", "Syntax": "Find-DbaInstance -ComputerName \u003cDbaInstanceParameter[]\u003e [-Credential \u003cPSCredential\u003e] [-SqlCredential \u003cPSCredential\u003e] [-ScanType {TCPPort | SqlConnect | SqlService | DNSResolve | SPN | Browser | Ping | Default | All}] [-DomainController \u003cString\u003e] [-TCPPort \u003cInt32[]\u003e] [-MinimumConfidence {None | Low | Medium | High}] [-EnableException] [\u003cCommonParameters\u003e]\nFind-DbaInstance -DiscoveryType {IPRange | Domain | DataSourceEnumeration | All} [-Credential \u003cPSCredential\u003e] [-SqlCredential \u003cPSCredential\u003e] [-ScanType {TCPPort | SqlConnect | SqlService | DNSResolve | SPN | Browser | Ping | Default | All}] [-IpAddress \u003cString[]\u003e] [-DomainController \u003cString\u003e] [-TCPPort \u003cInt32[]\u003e] [-MinimumConfidence {None | Low | Medium | High}] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Find-DbaLoginInGroup", + "Name": "Find-DbaLoginInGroup", "Description": "Outputs all the active directory groups members for a server, or limits it to find a specific AD user in the groups", "Tags": [ "Login", "Group", "Security" ], + "Synopsis": "Finds Logins in Active Directory groups that have logins on the SQL Instance.", + "Alias": "", + "Author": "Stephen Bennett, https://sqlnotesfromtheunderground.wordpress.com/ | Simone Bizzotto (@niphlod)", + "CommandName": "Find-DbaLoginInGroup", + "Availability": "Windows only", + "Links": "https://dbatools.io/Find-DbaLoginInGroup", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eFind-DbaLoginInGroup -SqlInstance DEV01 -Login \"MyDomain\\Stephen.Bennett\"\nReturns all active directory groups with logins on Sql Instance DEV01 that contain the AD user Stephen.Bennett.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eFind-DbaLoginInGroup -SqlInstance DEV01\nReturns all active directory users within all windows AD groups that have logins on the instance.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eFind-DbaLoginInGroup -SqlInstance DEV01 | Where-Object Login -like \u0027*stephen*\u0027\nReturns all active directory users within all windows AD groups that have logins on the instance whose login contains \"stephen\"", "Params": [ [ "SqlInstance", @@ -8124,22 +8230,23 @@ "False" ] ], - "Alias": "", - "Author": "Stephen Bennett, https://sqlnotesfromtheunderground.wordpress.com/ | Simone Bizzotto (@niphlod)", - "Synopsis": "Finds Logins in Active Directory groups that have logins on the SQL Instance.", - "Name": "Find-DbaLoginInGroup", - "Links": "https://dbatools.io/Find-DbaLoginInGroup", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eFind-DbaLoginInGroup -SqlInstance DEV01 -Login \"MyDomain\\Stephen.Bennett\"\nReturns all active directory groups with logins on Sql Instance DEV01 that contain the AD user Stephen.Bennett.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eFind-DbaLoginInGroup -SqlInstance DEV01\nReturns all active directory users within all windows AD groups that have logins on the instance.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eFind-DbaLoginInGroup -SqlInstance DEV01 | Where-Object Login -like \u0027*stephen*\u0027\nReturns all active directory users within all windows AD groups that have logins on the instance whose login contains \"stephen\"", "Syntax": "Find-DbaLoginInGroup [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [[-Login] \u003cString[]\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Find-DbaOrphanedFile", + "Name": "Find-DbaOrphanedFile", "Description": "This command searches all directories associated with SQL database files for database files that are not currently in use by the SQL Server instance.\n\nBy default, it looks for orphaned .mdf, .ldf and .ndf files in the root\\data directory, the default data path, the default log path, the system paths and any directory in use by any attached directory.\n\nYou can specify additional filetypes using the -FileType parameter, and additional paths to search using the -Path parameter.", "Tags": [ "Orphan", "Database", "DatabaseFile" ], + "Synopsis": "Find-DbaOrphanedFile finds orphaned database files. Orphaned database files are files not associated with any attached database.", + "Alias": "", + "Author": "Sander Stad (@sqlstad), sqlstad.nl", + "CommandName": "Find-DbaOrphanedFile", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Find-DbaOrphanedFile", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eFind-DbaOrphanedFile -SqlInstance sqlserver2014a\nConnects to sqlserver2014a, authenticating with Windows credentials, and searches for orphaned files. Returns server name, local filename, and unc path to file.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eFind-DbaOrphanedFile -SqlInstance sqlserver2014a -SqlCredential $cred\nConnects to sqlserver2014a, authenticating with SQL Server authentication, and searches for orphaned files. Returns server name, local filename, and unc path to file.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eFind-DbaOrphanedFile -SqlInstance sql2014 -Path \u0027E:\\Dir1\u0027, \u0027E:\\Dir2\u0027\nFinds the orphaned files in \"E:\\Dir1\" and \"E:Dir2\" in addition to the default directories.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eFind-DbaOrphanedFile -SqlInstance sql2014 -LocalOnly\nReturns only the local file paths for orphaned files.\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eFind-DbaOrphanedFile -SqlInstance sql2014 -RemoteOnly\nReturns only the remote file path for orphaned files.\n-------------------------- EXAMPLE 6 --------------------------\nPS C:\\\u003eFind-DbaOrphanedFile -SqlInstance sql2014, sql2016 -FileType fsf, mld\nFinds the orphaned ending with \".fsf\" and \".mld\" in addition to the default filetypes \".mdf\", \".ldf\", \".ndf\" for both the servers sql2014 and sql2016.", "Params": [ [ "SqlInstance", @@ -8198,18 +8305,19 @@ "False" ] ], - "Alias": "", - "Author": "Sander Stad (@sqlstad), sqlstad.nl", - "Synopsis": "Find-DbaOrphanedFile finds orphaned database files. Orphaned database files are files not associated with any attached database.", - "Name": "Find-DbaOrphanedFile", - "Links": "https://dbatools.io/Find-DbaOrphanedFile", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eFind-DbaOrphanedFile -SqlInstance sqlserver2014a\nConnects to sqlserver2014a, authenticating with Windows credentials, and searches for orphaned files. Returns server name, local filename, and unc path to file.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eFind-DbaOrphanedFile -SqlInstance sqlserver2014a -SqlCredential $cred\nConnects to sqlserver2014a, authenticating with SQL Server authentication, and searches for orphaned files. Returns server name, local filename, and unc path to file.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eFind-DbaOrphanedFile -SqlInstance sql2014 -Path \u0027E:\\Dir1\u0027, \u0027E:\\Dir2\u0027\nFinds the orphaned files in \"E:\\Dir1\" and \"E:Dir2\" in addition to the default directories.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eFind-DbaOrphanedFile -SqlInstance sql2014 -LocalOnly\nReturns only the local file paths for orphaned files.\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eFind-DbaOrphanedFile -SqlInstance sql2014 -RemoteOnly\nReturns only the remote file path for orphaned files.\n-------------------------- EXAMPLE 6 --------------------------\nPS C:\\\u003eFind-DbaOrphanedFile -SqlInstance sql2014, sql2016 -FileType fsf, mld\nFinds the orphaned ending with \".fsf\" and \".mld\" in addition to the default filetypes \".mdf\", \".ldf\", \".ndf\" for both the servers sql2014 and sql2016.", "Syntax": "Find-DbaOrphanedFile [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [[-Path] \u003cString[]\u003e] [[-FileType] \u003cString[]\u003e] [-LocalOnly] [-RemoteOnly] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Find-DbaSimilarTable", + "Name": "Find-DbaSimilarTable", "Description": "This function can either run against specific databases or all databases searching all/specific tables and views including in system databases.\nTypically one would use this to find for example archive version(s) of a table whose structures are similar.\nThis can also be used to find tables/views that are very similar to a given table/view structure to see where a table/view might be used.\n\nMore information can be found here: https://sqljana.wordpress.com/2017/03/31/sql-server-find-tables-with-similar-table-structure/", "Tags": "Table", + "Synopsis": "Returns all tables/views that are similar in structure by comparing the column names of matching and matched tables/views", + "Alias": "", + "Author": "Jana Sattainathan (@SQLJana), http://sqljana.wordpress.com", + "CommandName": "Find-DbaSimilarTable", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Find-DbaSimilarTable", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eFind-DbaSimilarTable -SqlInstance DEV01\nSearches all user database tables and views for each, returns all tables or views with their matching tables/views and match percent\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eFind-DbaSimilarTable -SqlInstance DEV01 -Database AdventureWorks\nSearches AdventureWorks database and lists tables/views and their corresponding matching tables/views with match percent\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eFind-DbaSimilarTable -SqlInstance DEV01 -Database AdventureWorks -SchemaName HumanResource\nSearches AdventureWorks database and lists tables/views in the HumanResource schema with their corresponding matching tables/views with match percent\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eFind-DbaSimilarTable -SqlInstance DEV01 -Database AdventureWorks -SchemaName HumanResource -Table Employee\nSearches AdventureWorks database and lists tables/views in the HumanResource schema and table Employee with its corresponding matching tables/views with match percent\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eFind-DbaSimilarTable -SqlInstance DEV01 -Database AdventureWorks -MatchPercentThreshold 60\nSearches AdventureWorks database and lists all tables/views with its corresponding matching tables/views with match percent greater than or equal to 60", "Params": [ [ "SqlInstance", @@ -8292,99 +8400,22 @@ "False" ] ], - "Alias": "", - "Author": "Jana Sattainathan (@SQLJana), http://sqljana.wordpress.com", - "Synopsis": "Returns all tables/views that are similar in structure by comparing the column names of matching and matched tables/views", - "Name": "Find-DbaSimilarTable", - "Links": "https://dbatools.io/Find-DbaSimilarTable", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eFind-DbaSimilarTable -SqlInstance DEV01\nSearches all user database tables and views for each, returns all tables or views with their matching tables/views and match percent\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eFind-DbaSimilarTable -SqlInstance DEV01 -Database AdventureWorks\nSearches AdventureWorks database and lists tables/views and their corresponding matching tables/views with match percent\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eFind-DbaSimilarTable -SqlInstance DEV01 -Database AdventureWorks -SchemaName HumanResource\nSearches AdventureWorks database and lists tables/views in the HumanResource schema with their corresponding matching tables/views with match percent\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eFind-DbaSimilarTable -SqlInstance DEV01 -Database AdventureWorks -SchemaName HumanResource -Table Employee\nSearches AdventureWorks database and lists tables/views in the HumanResource schema and table Employee with its corresponding matching tables/views with match percent\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eFind-DbaSimilarTable -SqlInstance DEV01 -Database AdventureWorks -MatchPercentThreshold 60\nSearches AdventureWorks database and lists all tables/views with its corresponding matching tables/views with match percent greater than or equal to 60", "Syntax": "Find-DbaSimilarTable [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [-SqlCredential \u003cPSCredential\u003e] [-Database \u003cObject[]\u003e] [-ExcludeDatabase \u003cObject[]\u003e] [-SchemaName \u003cString\u003e] [-TableName \u003cString\u003e] [-ExcludeViews] [-IncludeSystemDatabases] [-MatchPercentThreshold \u003cInt32\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Find-DbaStoredProcedure", + "Name": "Find-DbaStoredProcedure", "Description": "This function can either run against specific databases or all databases searching all user or user and system stored procedures.", "Tags": [ "StoredProcedure", "Proc" ], - "Params": [ - [ - "SqlInstance", - "The target SQL Server instance or instances. This can be a collection and receive pipeline input", - "ServerInstance,SqlServer,SqlServers", - true, - "true (ByValue)", - "" - ], - [ - "SqlCredential", - "Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential)", - "", - false, - "false", - "" - ], - [ - "Database", - "The database(s) to process - this list is auto-populated from the server. If unspecified, all databases will be processed.", - "Databases", - false, - "false", - "" - ], - [ - "ExcludeDatabase", - "The database(s) to exclude - this list is auto-populated from the server", - "", - false, - "false", - "" - ], - [ - "Pattern", - "String pattern that you want to search for in the stored procedure text body", - "", - true, - "false", - "" - ], - [ - "IncludeSystemObjects", - "By default, system stored procedures are ignored but you can include them within the search using this parameter.\nWarning - this will likely make it super slow if you run it on all databases.", - "", - false, - "false", - "False" - ], - [ - "IncludeSystemDatabases", - "By default system databases are ignored but you can include them within the search using this parameter", - "", - false, - "false", - "False" - ], - [ - "EnableException", - "By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message.\r\nThis avoids overwhelming you with \"sea of red\" exceptions, but is inconvenient because it basically disables advanced scripting.\r\nUsing this switch turns this \"nice by default\" feature off and enables you to catch exceptions with your own try/catch.", - "Silent", - false, - "false", - "False" - ] - ], + "Synopsis": "Returns all stored procedures that contain a specific case-insensitive string or regex pattern.", "Alias": "", "Author": "Stephen Bennett, https://sqlnotesfromtheunderground.wordpress.com/", - "Synopsis": "Returns all stored procedures that contain a specific case-insensitive string or regex pattern.", - "Name": "Find-DbaStoredProcedure", + "CommandName": "Find-DbaStoredProcedure", + "Availability": "Windows, Linux, macOS", "Links": "https://dbatools.io/Find-DbaStoredProcedure", "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eFind-DbaStoredProcedure -SqlInstance DEV01 -Pattern whatever\nSearches all user databases stored procedures for \"whatever\" in the text body\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eFind-DbaStoredProcedure -SqlInstance sql2016 -Pattern \u0027\\w+@\\w+\\.\\w+\u0027\nSearches all databases for all stored procedures that contain a valid email pattern in the text body\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eFind-DbaStoredProcedure -SqlInstance DEV01 -Database MyDB -Pattern \u0027some string\u0027 -Verbose\nSearches in \"mydb\" database stored procedures for \"some string\" in the text body\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eFind-DbaStoredProcedure -SqlInstance sql2016 -Database MyDB -Pattern RUNTIME -IncludeSystemObjects\nSearches in \"mydb\" database stored procedures for \"runtime\" in the text body", - "Syntax": "Find-DbaStoredProcedure [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [-SqlCredential \u003cPSCredential\u003e] [-Database \u003cObject[]\u003e] [-ExcludeDatabase \u003cObject[]\u003e] -Pattern \u003cString\u003e [-IncludeSystemObjects] [-IncludeSystemDatabases] [-EnableException] [\u003cCommonParameters\u003e]" - }, - { - "CommandName": "Find-DbaTrigger", - "Description": "This function search on Instance, Database and Object level.\nIf you specify one or more databases, search on Server level will not be preformed.", - "Tags": "Trigger", "Params": [ [ "SqlInstance", @@ -8420,23 +8451,15 @@ ], [ "Pattern", - "String pattern that you want to search for in the trigger text body", + "String pattern that you want to search for in the stored procedure text body", "", true, "false", "" ], - [ - "TriggerLevel", - "Allows specify the trigger level that you want to search. By default is All (Server, Database, Object).", - "", - false, - "false", - "All" - ], [ "IncludeSystemObjects", - "By default, system triggers are ignored but you can include them within the search using this parameter.\nWarning - this will likely make it super slow if you run it on all databases.", + "By default, system stored procedures are ignored but you can include them within the search using this parameter.\nWarning - this will likely make it super slow if you run it on all databases.", "", false, "false", @@ -8459,18 +8482,106 @@ "False" ] ], + "Syntax": "Find-DbaStoredProcedure [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [-SqlCredential \u003cPSCredential\u003e] [-Database \u003cObject[]\u003e] [-ExcludeDatabase \u003cObject[]\u003e] -Pattern \u003cString\u003e [-IncludeSystemObjects] [-IncludeSystemDatabases] [-EnableException] [\u003cCommonParameters\u003e]" + }, + { + "Name": "Find-DbaTrigger", + "Description": "This function search on Instance, Database and Object level.\nIf you specify one or more databases, search on Server level will not be preformed.", + "Tags": "Trigger", + "Synopsis": "Returns all triggers that contain a specific case-insensitive string or regex pattern.", "Alias": "", "Author": "Claudio Silva (@ClaudioESSilva)", - "Synopsis": "Returns all triggers that contain a specific case-insensitive string or regex pattern.", - "Name": "Find-DbaTrigger", + "CommandName": "Find-DbaTrigger", + "Availability": "Windows, Linux, macOS", "Links": "https://dbatools.io/Find-DbaTrigger", "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eFind-DbaTrigger -SqlInstance DEV01 -Pattern whatever\nSearches all user databases triggers for \"whatever\" in the text body\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eFind-DbaTrigger -SqlInstance sql2016 -Pattern \u0027\\w+@\\w+\\.\\w+\u0027\nSearches all databases for all triggers that contain a valid email pattern in the text body\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eFind-DbaTrigger -SqlInstance DEV01 -Database MyDB -Pattern \u0027some string\u0027 -Verbose\nSearches in \"mydb\" database triggers for \"some string\" in the text body\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eFind-DbaTrigger -SqlInstance sql2016 -Database MyDB -Pattern RUNTIME -IncludeSystemObjects\nSearches in \"mydb\" database triggers for \"runtime\" in the text body", + "Params": [ + [ + "SqlInstance", + "The target SQL Server instance or instances. This can be a collection and receive pipeline input", + "ServerInstance,SqlServer,SqlServers", + true, + "true (ByValue)", + "" + ], + [ + "SqlCredential", + "Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential)", + "", + false, + "false", + "" + ], + [ + "Database", + "The database(s) to process - this list is auto-populated from the server. If unspecified, all databases will be processed.", + "Databases", + false, + "false", + "" + ], + [ + "ExcludeDatabase", + "The database(s) to exclude - this list is auto-populated from the server", + "", + false, + "false", + "" + ], + [ + "Pattern", + "String pattern that you want to search for in the trigger text body", + "", + true, + "false", + "" + ], + [ + "TriggerLevel", + "Allows specify the trigger level that you want to search. By default is All (Server, Database, Object).", + "", + false, + "false", + "All" + ], + [ + "IncludeSystemObjects", + "By default, system triggers are ignored but you can include them within the search using this parameter.\nWarning - this will likely make it super slow if you run it on all databases.", + "", + false, + "false", + "False" + ], + [ + "IncludeSystemDatabases", + "By default system databases are ignored but you can include them within the search using this parameter", + "", + false, + "false", + "False" + ], + [ + "EnableException", + "By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message.\r\nThis avoids overwhelming you with \"sea of red\" exceptions, but is inconvenient because it basically disables advanced scripting.\r\nUsing this switch turns this \"nice by default\" feature off and enables you to catch exceptions with your own try/catch.", + "Silent", + false, + "false", + "False" + ] + ], "Syntax": "Find-DbaTrigger [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [-SqlCredential \u003cPSCredential\u003e] [-Database \u003cObject[]\u003e] [-ExcludeDatabase \u003cObject[]\u003e] -Pattern \u003cString\u003e [-TriggerLevel \u003cString\u003e] [-IncludeSystemObjects] [-IncludeSystemDatabases] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Find-DbaUserObject", + "Name": "Find-DbaUserObject", "Description": "Looks at the below list of objects to see if they are either owned by a user or a specific user (using the parameter -Pattern)\nDatabase Owner\nAgent Job Owner\nUsed in Credential\nUSed in Proxy\nSQL Agent Steps using a Proxy\nEndpoints\nServer Roles\nDatabase Schemas\nDatabase Roles\nDatabase Assembles\nDatabase Synonyms", "Tags": "Object", + "Synopsis": "Searches SQL Server to find user-owned objects (i.e. not dbo or sa) or for any object owned by a specific user specified by the Pattern parameter.", + "Alias": "", + "Author": "Stephen Bennett, https://sqlnotesfromtheunderground.wordpress.com/", + "CommandName": "Find-DbaUserObject", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Find-DbaUserObject", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eFind-DbaUserObject -SqlInstance DEV01 -Pattern ad\\stephen\nSearches user objects for owner ad\\stephen\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eFind-DbaUserObject -SqlInstance DEV01 -Verbose\nShows all user owned (non-sa, non-dbo) objects and verbose output", "Params": [ [ "SqlInstance", @@ -8505,18 +8616,19 @@ "False" ] ], - "Alias": "", - "Author": "Stephen Bennett, https://sqlnotesfromtheunderground.wordpress.com/", - "Synopsis": "Searches SQL Server to find user-owned objects (i.e. not dbo or sa) or for any object owned by a specific user specified by the Pattern parameter.", - "Name": "Find-DbaUserObject", - "Links": "https://dbatools.io/Find-DbaUserObject", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eFind-DbaUserObject -SqlInstance DEV01 -Pattern ad\\stephen\nSearches user objects for owner ad\\stephen\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eFind-DbaUserObject -SqlInstance DEV01 -Verbose\nShows all user owned (non-sa, non-dbo) objects and verbose output", "Syntax": "Find-DbaUserObject [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [-SqlCredential \u003cPSCredential\u003e] [-Pattern \u003cString\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Find-DbaView", + "Name": "Find-DbaView", "Description": "This function can either run against specific databases or all databases searching all user or user and system views.", "Tags": "View", + "Synopsis": "Returns all views that contain a specific case-insensitive string or regex pattern.", + "Alias": "", + "Author": "Claudio Silva (@ClaudioESSilva)", + "CommandName": "Find-DbaView", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Find-DbaView", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eFind-DbaView -SqlInstance DEV01 -Pattern whatever\nSearches all user databases views for \"whatever\" in the text body\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eFind-DbaView -SqlInstance sql2016 -Pattern \u0027\\w+@\\w+\\.\\w+\u0027\nSearches all databases for all views that contain a valid email pattern in the text body\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eFind-DbaView -SqlInstance DEV01 -Database MyDB -Pattern \u0027some string\u0027 -Verbose\nSearches in \"mydb\" database views for \"some string\" in the text body\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eFind-DbaView -SqlInstance sql2016 -Database MyDB -Pattern RUNTIME -IncludeSystemObjects\nSearches in \"mydb\" database views for \"runtime\" in the text body", "Params": [ [ "SqlInstance", @@ -8583,22 +8695,23 @@ "False" ] ], - "Alias": "", - "Author": "Claudio Silva (@ClaudioESSilva)", - "Synopsis": "Returns all views that contain a specific case-insensitive string or regex pattern.", - "Name": "Find-DbaView", - "Links": "https://dbatools.io/Find-DbaView", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eFind-DbaView -SqlInstance DEV01 -Pattern whatever\nSearches all user databases views for \"whatever\" in the text body\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eFind-DbaView -SqlInstance sql2016 -Pattern \u0027\\w+@\\w+\\.\\w+\u0027\nSearches all databases for all views that contain a valid email pattern in the text body\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eFind-DbaView -SqlInstance DEV01 -Database MyDB -Pattern \u0027some string\u0027 -Verbose\nSearches in \"mydb\" database views for \"some string\" in the text body\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eFind-DbaView -SqlInstance sql2016 -Database MyDB -Pattern RUNTIME -IncludeSystemObjects\nSearches in \"mydb\" database views for \"runtime\" in the text body", "Syntax": "Find-DbaView [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [-SqlCredential \u003cPSCredential\u003e] [-Database \u003cObject[]\u003e] [-ExcludeDatabase \u003cObject[]\u003e] -Pattern \u003cString\u003e [-IncludeSystemObjects] [-IncludeSystemDatabases] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Format-DbaBackupInformation", + "Name": "Format-DbaBackupInformation", "Description": "Performs various mapping on Backup History, ready restoring\nOptions include changing restore paths, backup paths, database name and many others", "Tags": [ "DisasterRecovery", "Backup", "Restore" ], + "Synopsis": "Transforms the data in a dbatools BackupHistory object for a restore", + "Alias": "", + "Author": "Stuart Moore (@napalmgram), stuart-moore.com", + "CommandName": "Format-DbaBackupInformation", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Format-DbaBackupInformation", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003e$History | Format-DbaBackupInformation -ReplaceDatabaseName NewDb\nChanges as database name references to NewDb, both in the database name and any restore paths. Note, this will fail if the BackupHistory object contains backups for more than 1 database\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003e$History | Format-DbaBackupInformation -ReplaceDatabaseName @{\u0027OldB\u0027=\u0027NewDb\u0027;\u0027ProdHr\u0027=\u0027DevHr\u0027}\nWill change all occurrences of original database name in the backup history (names and restore paths) using the mapping in the hashtable.\r\nIn this example any occurrence of OldDb will be replaced with NewDb and ProdHr with DevPR\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003e$History | Format-DbaBackupInformation -DataFileDirectory \u0027D:\\DataFiles\\\u0027 -LogFileDirectory \u0027E:\\LogFiles\\\nThis example with change the restore path for all data files (everything that is not a log file) to d:\\datafiles\r\nAnd all Transaction Log files will be restored to E:\\Logfiles\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003e$History | Format-DbaBackupInformation -RebaseBackupFolder f:\\backups\nThis example changes the location that SQL Server will look for the backups. This is useful if you\u0027ve moved the backups to a different location", "Params": [ [ "BackupHistory", @@ -8713,16 +8826,10 @@ "False" ] ], - "Alias": "", - "Author": "Stuart Moore (@napalmgram), stuart-moore.com", - "Synopsis": "Transforms the data in a dbatools BackupHistory object for a restore", - "Name": "Format-DbaBackupInformation", - "Links": "https://dbatools.io/Format-DbaBackupInformation", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003e$History | Format-DbaBackupInformation -ReplaceDatabaseName NewDb\nChanges as database name references to NewDb, both in the database name and any restore paths. Note, this will fail if the BackupHistory object contains backups for more than 1 database\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003e$History | Format-DbaBackupInformation -ReplaceDatabaseName @{\u0027OldB\u0027=\u0027NewDb\u0027;\u0027ProdHr\u0027=\u0027DevHr\u0027}\nWill change all occurrences of original database name in the backup history (names and restore paths) using the mapping in the hashtable.\r\nIn this example any occurrence of OldDb will be replaced with NewDb and ProdHr with DevPR\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003e$History | Format-DbaBackupInformation -DataFileDirectory \u0027D:\\DataFiles\\\u0027 -LogFileDirectory \u0027E:\\LogFiles\\\nThis example with change the restore path for all data files (everything that is not a log file) to d:\\datafiles\r\nAnd all Transaction Log files will be restored to E:\\Logfiles\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003e$History | Format-DbaBackupInformation -RebaseBackupFolder f:\\backups\nThis example changes the location that SQL Server will look for the backups. This is useful if you\u0027ve moved the backups to a different location", "Syntax": "Format-DbaBackupInformation [-BackupHistory] \u003cObject[]\u003e [[-ReplaceDatabaseName] \u003cObject\u003e] [-ReplaceDbNameInFile] [[-DataFileDirectory] \u003cString\u003e] [[-LogFileDirectory] \u003cString\u003e] [[-DestinationFileStreamDirectory] \u003cString\u003e] [[-DatabaseNamePrefix] \u003cString\u003e] [[-DatabaseFilePrefix] \u003cString\u003e] [[-DatabaseFileSuffix] \u003cString\u003e] [[-RebaseBackupFolder] \u003cString\u003e] [-Continue] [[-FileMapping] \u003cHashtable\u003e] [[-PathSep] \u003cString\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaAgDatabase", + "Name": "Get-DbaAgDatabase", "Description": "Gets availability group databases from a SQL Server instance.\n\nDefault view provides most common set of properties for information on the database in an availability group.\n\nInformation returned on the database will be specific to that replica, whether it is primary or a secondary.", "Tags": [ "Hadr", @@ -8731,6 +8838,13 @@ "AvailabilityGroup", "Replica" ], + "Synopsis": "Gets availability group databases from a SQL Server instance.", + "Alias": "", + "Author": "Shawn Melton (@wsmelton), https://wsmelton.github.io", + "CommandName": "Get-DbaAgDatabase", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Get-DbaAgDatabase", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaAgDatabase -SqlInstance sql2017a\nReturns all the databases in each availability group found on sql2017a\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaAgDatabase -SqlInstance sql2017a -AvailabilityGroup AG101\nReturns all the databases in the availability group AG101 on sql2017a\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaAvailabilityGroup -SqlInstance sqlcluster -AvailabilityGroup SharePoint -Database Sharepoint_Config | Get-DbaAgDatabase\nReturns the database Sharepoint_Config found in the availability group SharePoint on server sqlcluster", "Params": [ [ "SqlInstance", @@ -8781,21 +8895,22 @@ "False" ] ], - "Alias": "", - "Author": "Shawn Melton (@wsmelton), https://wsmelton.github.io", - "Synopsis": "Gets availability group databases from a SQL Server instance.", - "Name": "Get-DbaAgDatabase", - "Links": "https://dbatools.io/Get-DbaAgDatabase", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaAgDatabase -SqlInstance sql2017a\nReturns all the databases in each availability group found on sql2017a\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaAgDatabase -SqlInstance sql2017a -AvailabilityGroup AG101\nReturns all the databases in the availability group AG101 on sql2017a\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaAvailabilityGroup -SqlInstance sqlcluster -AvailabilityGroup SharePoint -Database Sharepoint_Config | Get-DbaAgDatabase\nReturns the database Sharepoint_Config found in the availability group SharePoint on server sqlcluster", "Syntax": "Get-DbaAgDatabase [[-SqlInstance] \u003cDbaInstanceParameter[]\u003e] [[-SqlCredential] \u003cPSCredential\u003e] [[-AvailabilityGroup] \u003cString[]\u003e] [[-Database] \u003cString[]\u003e] [[-InputObject] \u003cAvailabilityGroup[]\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaAgentAlert", + "Name": "Get-DbaAgentAlert", "Description": "This function returns SQL Agent alerts.", "Tags": [ "Agent", "SMO" ], + "Synopsis": "Returns all SQL Agent alerts on a SQL Server Agent.", + "Alias": "", + "Author": "Klaas Vandenberghe (@PowerDBAKlaas)", + "CommandName": "Get-DbaAgentAlert", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Get-DbaAgentAlert", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaAgentAlert -SqlInstance ServerA,ServerB\\instanceB\nReturns all SQL Agent alerts on serverA and serverB\\instanceB\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003e\u0027serverA\u0027,\u0027serverB\\instanceB\u0027 | Get-DbaAgentAlert\nReturns all SQL Agent alerts on serverA and serverB\\instanceB", "Params": [ [ "SqlInstance", @@ -8822,21 +8937,22 @@ "False" ] ], - "Alias": "", - "Author": "Klaas Vandenberghe (@PowerDBAKlaas)", - "Synopsis": "Returns all SQL Agent alerts on a SQL Server Agent.", - "Name": "Get-DbaAgentAlert", - "Links": "https://dbatools.io/Get-DbaAgentAlert", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaAgentAlert -SqlInstance ServerA,ServerB\\instanceB\nReturns all SQL Agent alerts on serverA and serverB\\instanceB\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003e\u0027serverA\u0027,\u0027serverB\\instanceB\u0027 | Get-DbaAgentAlert\nReturns all SQL Agent alerts on serverA and serverB\\instanceB", "Syntax": "Get-DbaAgentAlert [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [-SqlCredential \u003cPSCredential\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaAgentJob", + "Name": "Get-DbaAgentJob", "Description": "The Get-DbaAgentJob returns connected SMO object for SQL Agent Job information for each instance(s) of SQL Server.", "Tags": [ "Job", "Agent" ], + "Synopsis": "Gets SQL Agent Job information for each instance(s) of SQL Server.", + "Alias": "", + "Author": "Garry Bargsley (@gbargsley), http://blog.garrybargsley.com", + "CommandName": "Get-DbaAgentJob", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Get-DbaAgentJob", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaAgentJob -SqlInstance localhost\nReturns all SQL Agent Jobs on the local default SQL Server instance\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaAgentJob -SqlInstance localhost, sql2016\nReturns all SQl Agent Jobs for the local and sql2016 SQL Server instances\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaAgentJob -SqlInstance localhost -Job BackupData, BackupDiff\nReturns all SQL Agent Jobs named BackupData and BackupDiff from the local SQL Server instance.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaAgentJob -SqlInstance localhost -ExcludeJob BackupDiff\nReturns all SQl Agent Jobs for the local SQL Server instances, except the BackupDiff Job.\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eGet-DbaAgentJob -SqlInstance localhost -ExcludeDisabledJobs\nReturns all SQl Agent Jobs for the local SQL Server instances, excluding the disabled jobs.\n-------------------------- EXAMPLE 6 --------------------------\nPS C:\\\u003e$servers | Get-DbaAgentJob | Out-GridView -PassThru | Start-DbaAgentJob -WhatIf\nFind all of your Jobs from SQL Server instances in the $servers collection, select the jobs you want to start then see jobs would start if you ran Start-DbaAgentJob\n-------------------------- EXAMPLE 7 --------------------------\nPS C:\\\u003eGet-DbaAgentJob -SqlInstance sqlserver2014a | Where-Object Category -eq \"Report Server\" | Export-DbaScript -Path \"C:\\temp\\sqlserver2014a_SSRSJobs.sql\"\nExports all SSRS jobs from SQL instance sqlserver2014a to a file.", "Params": [ [ "SqlInstance", @@ -8903,22 +9019,23 @@ "False" ] ], - "Alias": "", - "Author": "Garry Bargsley (@gbargsley), http://blog.garrybargsley.com", - "Synopsis": "Gets SQL Agent Job information for each instance(s) of SQL Server.", - "Name": "Get-DbaAgentJob", - "Links": "https://dbatools.io/Get-DbaAgentJob", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaAgentJob -SqlInstance localhost\nReturns all SQL Agent Jobs on the local default SQL Server instance\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaAgentJob -SqlInstance localhost, sql2016\nReturns all SQl Agent Jobs for the local and sql2016 SQL Server instances\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaAgentJob -SqlInstance localhost -Job BackupData, BackupDiff\nReturns all SQL Agent Jobs named BackupData and BackupDiff from the local SQL Server instance.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaAgentJob -SqlInstance localhost -ExcludeJob BackupDiff\nReturns all SQl Agent Jobs for the local SQL Server instances, except the BackupDiff Job.\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eGet-DbaAgentJob -SqlInstance localhost -ExcludeDisabledJobs\nReturns all SQl Agent Jobs for the local SQL Server instances, excluding the disabled jobs.\n-------------------------- EXAMPLE 6 --------------------------\nPS C:\\\u003e$servers | Get-DbaAgentJob | Out-GridView -PassThru | Start-DbaAgentJob -WhatIf\nFind all of your Jobs from SQL Server instances in the $servers collection, select the jobs you want to start then see jobs would start if you ran Start-DbaAgentJob\n-------------------------- EXAMPLE 7 --------------------------\nPS C:\\\u003eGet-DbaAgentJob -SqlInstance sqlserver2014a | Where-Object Category -eq \"Report Server\" | Export-DbaScript -Path \"C:\\temp\\sqlserver2014a_SSRSJobs.sql\"\nExports all SSRS jobs from SQL instance sqlserver2014a to a file.", "Syntax": "Get-DbaAgentJob [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [-SqlCredential \u003cPSCredential\u003e] [-Job \u003cString[]\u003e] [-ExcludeJob \u003cString[]\u003e] [-Database \u003cString[]\u003e] [-Category \u003cString[]\u003e] [-ExcludeDisabledJobs] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaAgentJobCategory", + "Name": "Get-DbaAgentJobCategory", "Description": "Get-DbaAgentJobCategory makes it possible to retrieve the job categories.", "Tags": [ "Agent", "Job", "JobCategory" ], + "Synopsis": "Get-DbaAgentJobCategory retrieves the job categories.", + "Alias": "Get-DbaJobCategory", + "Author": "Sander Stad (@sqlstad), sqlstad.nl", + "CommandName": "Get-DbaAgentJobCategory", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Get-DbaAgentJobCategory", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaAgentJobCategory -SqlInstance sql1\nReturn all the job categories.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaAgentJobCategory -SqlInstance sql1 -Category \u0027Log Shipping\u0027\nReturn all the job categories that have the name \u0027Log Shipping\u0027.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaAgentJobCategory -SqlInstance sstad-pc -CategoryType MultiServerJob\nReturn all the job categories that have a type MultiServerJob.", "Params": [ [ "SqlInstance", @@ -8969,21 +9086,22 @@ "False" ] ], - "Alias": "Get-DbaJobCategory", - "Author": "Sander Stad (@sqlstad), sqlstad.nl", - "Synopsis": "Get-DbaAgentJobCategory retrieves the job categories.", - "Name": "Get-DbaAgentJobCategory", - "Links": "https://dbatools.io/Get-DbaAgentJobCategory", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaAgentJobCategory -SqlInstance sql1\nReturn all the job categories.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaAgentJobCategory -SqlInstance sql1 -Category \u0027Log Shipping\u0027\nReturn all the job categories that have the name \u0027Log Shipping\u0027.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaAgentJobCategory -SqlInstance sstad-pc -CategoryType MultiServerJob\nReturn all the job categories that have a type MultiServerJob.", "Syntax": "Get-DbaAgentJobCategory [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [[-Category] \u003cString[]\u003e] [[-CategoryType] \u003cString\u003e] [-Force] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaAgentJobHistory", + "Name": "Get-DbaAgentJobHistory", "Description": "Get-DbaAgentJobHistory returns all information on the executions still available on each instance(s) of SQL Server submitted.\nThe cleanup of SQL Agent history determines how many records are kept.\n\nhttps://msdn.microsoft.com/en-us/library/ms201680.aspx\nhttps://msdn.microsoft.com/en-us/library/microsoft.sqlserver.management.smo.agent.jobhistoryfilter(v=sql.120).aspx", "Tags": [ "Job", "Agent" ], + "Synopsis": "Gets execution history of SQL Agent Job on instance(s) of SQL Server.", + "Alias": "", + "Author": "Klaas Vandenberghe (@PowerDbaKlaas) | Simone Bizzotto (@niphold)", + "CommandName": "Get-DbaAgentJobHistory", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Get-DbaAgentJobHistory", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaAgentJobHistory -SqlInstance localhost\nReturns all SQL Agent Job execution results on the local default SQL Server instance.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaAgentJobHistory -SqlInstance localhost, sql2016\nReturns all SQL Agent Job execution results for the local and sql2016 SQL Server instances.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003e\u0027sql1\u0027,\u0027sql2\\Inst2K17\u0027 | Get-DbaAgentJobHistory\nReturns all SQL Agent Job execution results for sql1 and sql2\\Inst2K17.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaAgentJobHistory -SqlInstance sql2\\Inst2K17 | Select-Object *\nReturns all properties for all SQl Agent Job execution results on sql2\\Inst2K17.\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eGet-DbaAgentJobHistory -SqlInstance sql2\\Inst2K17 -Job \u0027Output File Cleanup\u0027\nReturns all properties for all SQl Agent Job execution results of the \u0027Output File Cleanup\u0027 job on sql2\\Inst2K17.\n-------------------------- EXAMPLE 6 --------------------------\nPS C:\\\u003eGet-DbaAgentJobHistory -SqlInstance sql2\\Inst2K17 -Job \u0027Output File Cleanup\u0027 -WithOutputFile\nReturns all properties for all SQl Agent Job execution results of the \u0027Output File Cleanup\u0027 job on sql2\\Inst2K17,\r\nwith additional properties that show the output filename path\n-------------------------- EXAMPLE 7 --------------------------\nPS C:\\\u003eGet-DbaAgentJobHistory -SqlInstance sql2\\Inst2K17 -ExcludeJobSteps\nReturns the SQL Agent Job execution results for the whole jobs on sql2\\Inst2K17, leaving out job step execution results.\n-------------------------- EXAMPLE 8 --------------------------\nPS C:\\\u003eGet-DbaAgentJobHistory -SqlInstance sql2\\Inst2K17 -StartDate \u00272017-05-22\u0027 -EndDate \u00272017-05-23 12:30:00\u0027\nReturns the SQL Agent Job execution results between 2017/05/22 00:00:00 and 2017/05/23 12:30:00 on sql2\\Inst2K17.\n-------------------------- EXAMPLE 9 --------------------------\nPS C:\\\u003eGet-DbaAgentJob -SqlInstance sql2016 | Where-Object Name -Match backup | Get-DbaAgentJobHistory\nGets all jobs with the name that match the regex pattern \"backup\" and then gets the job history from those. You can also use -Like *backup* in this example.", "Params": [ [ "SqlInstance", @@ -9066,21 +9184,22 @@ "False" ] ], - "Alias": "", - "Author": "Klaas Vandenberghe (@PowerDbaKlaas) | Simone Bizzotto (@niphold)", - "Synopsis": "Gets execution history of SQL Agent Job on instance(s) of SQL Server.", - "Name": "Get-DbaAgentJobHistory", - "Links": "https://dbatools.io/Get-DbaAgentJobHistory", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaAgentJobHistory -SqlInstance localhost\nReturns all SQL Agent Job execution results on the local default SQL Server instance.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaAgentJobHistory -SqlInstance localhost, sql2016\nReturns all SQL Agent Job execution results for the local and sql2016 SQL Server instances.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003e\u0027sql1\u0027,\u0027sql2\\Inst2K17\u0027 | Get-DbaAgentJobHistory\nReturns all SQL Agent Job execution results for sql1 and sql2\\Inst2K17.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaAgentJobHistory -SqlInstance sql2\\Inst2K17 | Select-Object *\nReturns all properties for all SQl Agent Job execution results on sql2\\Inst2K17.\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eGet-DbaAgentJobHistory -SqlInstance sql2\\Inst2K17 -Job \u0027Output File Cleanup\u0027\nReturns all properties for all SQl Agent Job execution results of the \u0027Output File Cleanup\u0027 job on sql2\\Inst2K17.\n-------------------------- EXAMPLE 6 --------------------------\nPS C:\\\u003eGet-DbaAgentJobHistory -SqlInstance sql2\\Inst2K17 -Job \u0027Output File Cleanup\u0027 -WithOutputFile\nReturns all properties for all SQl Agent Job execution results of the \u0027Output File Cleanup\u0027 job on sql2\\Inst2K17,\r\nwith additional properties that show the output filename path\n-------------------------- EXAMPLE 7 --------------------------\nPS C:\\\u003eGet-DbaAgentJobHistory -SqlInstance sql2\\Inst2K17 -ExcludeJobSteps\nReturns the SQL Agent Job execution results for the whole jobs on sql2\\Inst2K17, leaving out job step execution results.\n-------------------------- EXAMPLE 8 --------------------------\nPS C:\\\u003eGet-DbaAgentJobHistory -SqlInstance sql2\\Inst2K17 -StartDate \u00272017-05-22\u0027 -EndDate \u00272017-05-23 12:30:00\u0027\nReturns the SQL Agent Job execution results between 2017/05/22 00:00:00 and 2017/05/23 12:30:00 on sql2\\Inst2K17.\n-------------------------- EXAMPLE 9 --------------------------\nPS C:\\\u003eGet-DbaAgentJob -SqlInstance sql2016 | Where-Object Name -Match backup | Get-DbaAgentJobHistory\nGets all jobs with the name that match the regex pattern \"backup\" and then gets the job history from those. You can also use -Like *backup* in this example.", "Syntax": "Get-DbaAgentJobHistory [-SqlCredential \u003cPSCredential\u003e] [-Job \u003cObject[]\u003e] [-ExcludeJob \u003cObject[]\u003e] [-StartDate \u003cDateTime\u003e] [-EndDate \u003cDateTime\u003e] [-ExcludeJobSteps] [-WithOutputFile] [-EnableException] [\u003cCommonParameters\u003e]\nGet-DbaAgentJobHistory -SqlInstance \u003cDbaInstanceParameter[]\u003e [-SqlCredential \u003cPSCredential\u003e] [-Job \u003cObject[]\u003e] [-ExcludeJob \u003cObject[]\u003e] [-StartDate \u003cDateTime\u003e] [-EndDate \u003cDateTime\u003e] [-ExcludeJobSteps] [-WithOutputFile] [-EnableException] [\u003cCommonParameters\u003e]\nGet-DbaAgentJobHistory [-SqlCredential \u003cPSCredential\u003e] [-Job \u003cObject[]\u003e] [-ExcludeJob \u003cObject[]\u003e] [-StartDate \u003cDateTime\u003e] [-EndDate \u003cDateTime\u003e] [-ExcludeJobSteps] [-WithOutputFile] -JobCollection \u003cJob\u003e [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaAgentJobOutputFile", + "Name": "Get-DbaAgentJobOutputFile", "Description": "This function returns for one or more SQL Instances the output file value for each step of one or many agent job with the Job Names\nprovided dynamically. It will not return anything if there is no Output File", "Tags": [ "Agent", "Job" ], + "Synopsis": "Returns the Output File for each step of one or many agent job with the Job Names provided dynamically if\nrequired for one or more SQL Instances", + "Alias": "", + "Author": "Rob Sewell (https://sqldbawithabeard.com) | Simone Bizzotto (@niphold)", + "CommandName": "Get-DbaAgentJobOutputFile", + "Availability": "Windows only", + "Links": null, + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaAgentJobOutputFile -SqlInstance SERVERNAME -Job \u0027The Agent Job\u0027\nThis will return the configured paths to the output files for each of the job step of the The Agent Job Job\r\non the SERVERNAME instance\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaAgentJobOutputFile -SqlInstance SERVERNAME\nThis will return the configured paths to the output files for each of the job step of all the Agent Jobs\r\non the SERVERNAME instance\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaAgentJobOutputFile -SqlInstance SERVERNAME,SERVERNAME2 -Job \u0027The Agent Job\u0027\nThis will return the configured paths to the output files for each of the job step of the The Agent Job Job\r\non the SERVERNAME instance and SERVERNAME2\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003e$Servers = \u0027SERVER\u0027,\u0027SERVER\\INSTANCE1\u0027\nGet-DbaAgentJobOutputFile -SqlInstance $Servers -Job \u0027The Agent Job\u0027 -OpenFile\nThis will return the configured paths to the output files for each of the job step of the The Agent Job Job\r\non the SERVER instance and the SERVER\\INSTANCE1 and open the files if they are available\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eGet-DbaAgentJobOutputFile -SqlInstance SERVERNAME | Out-GridView\nThis will return the configured paths to the output files for each of the job step of all the Agent Jobs\r\non the SERVERNAME instance and Pipe them to Out-GridView\n-------------------------- EXAMPLE 6 --------------------------\nPS C:\\\u003e(Get-DbaAgentJobOutputFile -SqlInstance SERVERNAME | Out-GridView -PassThru).FileName | Invoke-Item\nThis will return the configured paths to the output files for each of the job step of all the Agent Jobs\r\non the SERVERNAME instance and Pipe them to Out-GridView and enable you to choose the output\r\nfile and open it\n-------------------------- EXAMPLE 7 --------------------------\nPS C:\\\u003eGet-DbaAgentJobOutputFile -SqlInstance SERVERNAME -Verbose\nThis will return the configured paths to the output files for each of the job step of all the Agent Jobs\r\non the SERVERNAME instance and also show the job steps without an output file", "Params": [ [ "SqlInstance", @@ -9123,21 +9242,22 @@ "False" ] ], - "Alias": "", - "Author": "Rob Sewell (https://sqldbawithabeard.com) | Simone Bizzotto (@niphold)", - "Synopsis": "Returns the Output File for each step of one or many agent job with the Job Names provided dynamically if\nrequired for one or more SQL Instances", - "Name": "Get-DbaAgentJobOutputFile", - "Links": null, - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaAgentJobOutputFile -SqlInstance SERVERNAME -Job \u0027The Agent Job\u0027\nThis will return the configured paths to the output files for each of the job step of the The Agent Job Job\r\non the SERVERNAME instance\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaAgentJobOutputFile -SqlInstance SERVERNAME\nThis will return the configured paths to the output files for each of the job step of all the Agent Jobs\r\non the SERVERNAME instance\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaAgentJobOutputFile -SqlInstance SERVERNAME,SERVERNAME2 -Job \u0027The Agent Job\u0027\nThis will return the configured paths to the output files for each of the job step of the The Agent Job Job\r\non the SERVERNAME instance and SERVERNAME2\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003e$Servers = \u0027SERVER\u0027,\u0027SERVER\\INSTANCE1\u0027\nGet-DbaAgentJobOutputFile -SqlInstance $Servers -Job \u0027The Agent Job\u0027 -OpenFile\nThis will return the configured paths to the output files for each of the job step of the The Agent Job Job\r\non the SERVER instance and the SERVER\\INSTANCE1 and open the files if they are available\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eGet-DbaAgentJobOutputFile -SqlInstance SERVERNAME | Out-GridView\nThis will return the configured paths to the output files for each of the job step of all the Agent Jobs\r\non the SERVERNAME instance and Pipe them to Out-GridView\n-------------------------- EXAMPLE 6 --------------------------\nPS C:\\\u003e(Get-DbaAgentJobOutputFile -SqlInstance SERVERNAME | Out-GridView -PassThru).FileName | Invoke-Item\nThis will return the configured paths to the output files for each of the job step of all the Agent Jobs\r\non the SERVERNAME instance and Pipe them to Out-GridView and enable you to choose the output\r\nfile and open it\n-------------------------- EXAMPLE 7 --------------------------\nPS C:\\\u003eGet-DbaAgentJobOutputFile -SqlInstance SERVERNAME -Verbose\nThis will return the configured paths to the output files for each of the job step of all the Agent Jobs\r\non the SERVERNAME instance and also show the job steps without an output file", "Syntax": "Get-DbaAgentJobOutputFile [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [-Job \u003cObject[]\u003e] [-ExcludeJob \u003cObject[]\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaAgentJobStep", + "Name": "Get-DbaAgentJobStep", "Description": "The Get-DbaAgentJobStep returns connected SMO object for SQL Agent Job Step for each instance(s) of SQL Server.", "Tags": [ "Job", "Agent" ], + "Synopsis": "Gets SQL Agent Job Step information for each instance(s) of SQL Server.", + "Alias": "", + "Author": "Klaas Vandenberghe (@PowerDbaKlaas), http://powerdba.eu", + "CommandName": "Get-DbaAgentJobStep", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Get-DbaAgentJobStep", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaAgentJobStep -SqlInstance localhost\nReturns all SQL Agent Job Steps on the local default SQL Server instance\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaAgentJobStep -SqlInstance localhost, sql2016\nReturns all SQL Agent Job Steps for the local and sql2016 SQL Server instances\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaAgentJobStep -SqlInstance localhost -Job BackupData, BackupDiff\nReturns all SQL Agent Job Steps for the jobs named BackupData and BackupDiff from the local SQL Server instance.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaAgentJobStep -SqlInstance localhost -ExcludeJob BackupDiff\nReturns all SQL Agent Job Steps for the local SQL Server instances, except for the BackupDiff Job.\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eGet-DbaAgentJobStep -SqlInstance localhost -ExcludeDisabledJobs\nReturns all SQL Agent Job Steps for the local SQL Server instances, excluding the disabled jobs.\n-------------------------- EXAMPLE 6 --------------------------\nPS C:\\\u003e$servers | Get-DbaAgentJobStep\nFind all of your Job Steps from SQL Server instances in the $servers collection", "Params": [ [ "SqlInstance", @@ -9188,18 +9308,19 @@ "False" ] ], - "Alias": "", - "Author": "Klaas Vandenberghe (@PowerDbaKlaas), http://powerdba.eu", - "Synopsis": "Gets SQL Agent Job Step information for each instance(s) of SQL Server.", - "Name": "Get-DbaAgentJobStep", - "Links": "https://dbatools.io/Get-DbaAgentJobStep", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaAgentJobStep -SqlInstance localhost\nReturns all SQL Agent Job Steps on the local default SQL Server instance\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaAgentJobStep -SqlInstance localhost, sql2016\nReturns all SQL Agent Job Steps for the local and sql2016 SQL Server instances\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaAgentJobStep -SqlInstance localhost -Job BackupData, BackupDiff\nReturns all SQL Agent Job Steps for the jobs named BackupData and BackupDiff from the local SQL Server instance.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaAgentJobStep -SqlInstance localhost -ExcludeJob BackupDiff\nReturns all SQL Agent Job Steps for the local SQL Server instances, except for the BackupDiff Job.\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eGet-DbaAgentJobStep -SqlInstance localhost -ExcludeDisabledJobs\nReturns all SQL Agent Job Steps for the local SQL Server instances, excluding the disabled jobs.\n-------------------------- EXAMPLE 6 --------------------------\nPS C:\\\u003e$servers | Get-DbaAgentJobStep\nFind all of your Job Steps from SQL Server instances in the $servers collection", "Syntax": "Get-DbaAgentJobStep [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [-SqlCredential \u003cPSCredential\u003e] [-Job \u003cObject[]\u003e] [-ExcludeJob \u003cObject[]\u003e] [-ExcludeDisabledJobs] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaAgentLog", + "Name": "Get-DbaAgentLog", "Description": "Gets the \"SQL Agent Error Log\" of an instance. Returns all 10 error logs by default.", "Tags": "Logging", + "Synopsis": "Gets the \"SQL Agent Error Log\" of an instance", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Get-DbaAgentLog", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Get-DbaAgentLog", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaAgentLog -SqlInstance sql01\\sharepoint\nReturns the entire error log for the SQL Agent on sql01\\sharepoint\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaAgentLog -SqlInstance sql01\\sharepoint -LogNumber 3, 6\nReturns log numbers 3 and 6 for the SQL Agent on sql01\\sharepoint\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003e$servers = \"sql2014\",\"sql2016\", \"sqlcluster\\sharepoint\"\nPS C:\\\u003e $servers | Get-DbaAgentLog -LogNumber 0\nReturns the most recent SQL Agent error logs for \"sql2014\",\"sql2016\" and \"sqlcluster\\sharepoint\"", "Params": [ [ "SqlInstance", @@ -9234,21 +9355,22 @@ "False" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Gets the \"SQL Agent Error Log\" of an instance", - "Name": "Get-DbaAgentLog", - "Links": "https://dbatools.io/Get-DbaAgentLog", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaAgentLog -SqlInstance sql01\\sharepoint\nReturns the entire error log for the SQL Agent on sql01\\sharepoint\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaAgentLog -SqlInstance sql01\\sharepoint -LogNumber 3, 6\nReturns log numbers 3 and 6 for the SQL Agent on sql01\\sharepoint\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003e$servers = \"sql2014\",\"sql2016\", \"sqlcluster\\sharepoint\"\nPS C:\\\u003e $servers | Get-DbaAgentLog -LogNumber 0\nReturns the most recent SQL Agent error logs for \"sql2014\",\"sql2016\" and \"sqlcluster\\sharepoint\"", "Syntax": "Get-DbaAgentLog [[-SqlInstance] \u003cDbaInstanceParameter[]\u003e] [[-SqlCredential] \u003cPSCredential\u003e] [[-LogNumber] \u003cInt32[]\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaAgentOperator", + "Name": "Get-DbaAgentOperator", "Description": "This function returns SQL Agent operators.", "Tags": [ "Agent", "Operator" ], + "Synopsis": "Returns all SQL Agent operators on a SQL Server Agent.", + "Alias": "", + "Author": "Klaas Vandenberghe (@PowerDBAKlaas)", + "CommandName": "Get-DbaAgentOperator", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Get-DbaAgentOperator", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaAgentOperator -SqlInstance ServerA,ServerB\\instanceB\nReturns any SQL Agent operators on serverA and serverB\\instanceB\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003e\u0027ServerA\u0027,\u0027ServerB\\instanceB\u0027 | Get-DbaAgentOperator\nReturns all SQL Agent operators on serverA and serverB\\instanceB\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaAgentOperator -SqlInstance ServerA -Operator Dba1,Dba2\nReturns only the SQL Agent Operators Dba1 and Dba2 on ServerA.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaAgentOperator -SqlInstance ServerA,ServerB -ExcludeOperator Dba3\nReturns all the SQL Agent operators on ServerA and ServerB, except the Dba3 operator.", "Params": [ [ "SqlInstance", @@ -9291,21 +9413,22 @@ "False" ] ], - "Alias": "", - "Author": "Klaas Vandenberghe (@PowerDBAKlaas)", - "Synopsis": "Returns all SQL Agent operators on a SQL Server Agent.", - "Name": "Get-DbaAgentOperator", - "Links": "https://dbatools.io/Get-DbaAgentOperator", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaAgentOperator -SqlInstance ServerA,ServerB\\instanceB\nReturns any SQL Agent operators on serverA and serverB\\instanceB\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003e\u0027ServerA\u0027,\u0027ServerB\\instanceB\u0027 | Get-DbaAgentOperator\nReturns all SQL Agent operators on serverA and serverB\\instanceB\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaAgentOperator -SqlInstance ServerA -Operator Dba1,Dba2\nReturns only the SQL Agent Operators Dba1 and Dba2 on ServerA.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaAgentOperator -SqlInstance ServerA,ServerB -ExcludeOperator Dba3\nReturns all the SQL Agent operators on ServerA and ServerB, except the Dba3 operator.", "Syntax": "Get-DbaAgentOperator [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [-SqlCredential \u003cPSCredential\u003e] [-Operator \u003cObject[]\u003e] [-ExcludeOperator \u003cObject[]\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaAgentProxy", + "Name": "Get-DbaAgentProxy", "Description": "This function returns SQL Agent proxies.", "Tags": [ "Agent", "SMO" ], + "Synopsis": "Returns all SQL Agent proxies on a SQL Server Agent.", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Get-DbaAgentProxy", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Get-DbaAgentProxy", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaAgentProxy -SqlInstance ServerA,ServerB\\instanceB\nReturns all SQL Agent proxies on serverA and serverB\\instanceB\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003e\u0027serverA\u0027,\u0027serverB\\instanceB\u0027 | Get-DbaAgentProxy\nReturns all SQL Agent proxies on serverA and serverB\\instanceB", "Params": [ [ "SqlInstance", @@ -9340,21 +9463,22 @@ "False" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Returns all SQL Agent proxies on a SQL Server Agent.", - "Name": "Get-DbaAgentProxy", - "Links": "https://dbatools.io/Get-DbaAgentProxy", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaAgentProxy -SqlInstance ServerA,ServerB\\instanceB\nReturns all SQL Agent proxies on serverA and serverB\\instanceB\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003e\u0027serverA\u0027,\u0027serverB\\instanceB\u0027 | Get-DbaAgentProxy\nReturns all SQL Agent proxies on serverA and serverB\\instanceB", "Syntax": "Get-DbaAgentProxy [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [-SqlCredential \u003cPSCredential\u003e] [-Proxy \u003cString[]\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaAgentSchedule", + "Name": "Get-DbaAgentSchedule", "Description": "This function returns SQL Agent Shared Schedules.", "Tags": [ "Agent", "Schedule" ], + "Synopsis": "Returns all SQL Agent Shared Schedules on a SQL Server Agent.", + "Alias": "", + "Author": "Chris McKeown (@devopsfu), http://www.devopsfu.com", + "CommandName": "Get-DbaAgentSchedule", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Get-DbaAgentSchedule", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaAgentSchedule -SqlInstance localhost\nReturns all SQL Agent Shared Schedules on the local default SQL Server instance\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaAgentSchedule -SqlInstance localhost, sql2016\nReturns all SQL Agent Shared Schedules for the local and sql2016 SQL Server instances\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaAgentSchedule -SqlInstance sql2016 -Schedule \"Maintenance10min\",\"Maintenance60min\"\nReturns the \"Maintenance10min\" \u0026 \"Maintenance60min\" schedules from the sql2016 SQL Server instance", "Params": [ [ "SqlInstance", @@ -9389,21 +9513,22 @@ "False" ] ], - "Alias": "", - "Author": "Chris McKeown (@devopsfu), http://www.devopsfu.com", - "Synopsis": "Returns all SQL Agent Shared Schedules on a SQL Server Agent.", - "Name": "Get-DbaAgentSchedule", - "Links": "https://dbatools.io/Get-DbaAgentSchedule", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaAgentSchedule -SqlInstance localhost\nReturns all SQL Agent Shared Schedules on the local default SQL Server instance\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaAgentSchedule -SqlInstance localhost, sql2016\nReturns all SQL Agent Shared Schedules for the local and sql2016 SQL Server instances\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaAgentSchedule -SqlInstance sql2016 -Schedule \"Maintenance10min\",\"Maintenance60min\"\nReturns the \"Maintenance10min\" \u0026 \"Maintenance60min\" schedules from the sql2016 SQL Server instance", "Syntax": "Get-DbaAgentSchedule [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [-Schedule \u003cObject[]\u003e] [-SqlCredential \u003cPSCredential\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaAgentServer", + "Name": "Get-DbaAgentServer", "Description": "The Get-DbaAgentServer returns connected SMO object for SQL Agent Server information for each instance(s) of SQL Server.", "Tags": [ "Job", "Agent" ], + "Synopsis": "Gets SQL Agent Server information for each instance(s) of SQL Server.", + "Alias": "", + "Author": "Cláudio Silva (@claudioessilva), https://claudioessilva.eu", + "CommandName": "Get-DbaAgentServer", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Get-DbaAgentServer", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaAgentServer -SqlInstance localhost\nReturns SQL Agent Server on the local default SQL Server instance\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaAgentServer -SqlInstance localhost, sql2016\nReturns SQL Agent Servers for the localhost and sql2016 SQL Server instances", "Params": [ [ "SqlInstance", @@ -9430,16 +9555,10 @@ "False" ] ], - "Alias": "", - "Author": "Cláudio Silva (@claudioessilva), https://claudioessilva.eu", - "Synopsis": "Gets SQL Agent Server information for each instance(s) of SQL Server.", - "Name": "Get-DbaAgentServer", - "Links": "https://dbatools.io/Get-DbaAgentServer", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaAgentServer -SqlInstance localhost\nReturns SQL Agent Server on the local default SQL Server instance\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaAgentServer -SqlInstance localhost, sql2016\nReturns SQL Agent Servers for the localhost and sql2016 SQL Server instances", "Syntax": "Get-DbaAgentServer [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [-SqlCredential \u003cPSCredential\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaAgHadr", + "Name": "Get-DbaAgHadr", "Description": "Gets the Hadr setting, from the service level, and returns true or false for the specified SQL Server instance.", "Tags": [ "Hadr", @@ -9447,6 +9566,13 @@ "AG", "AvailabilityGroup" ], + "Synopsis": "Gets the Hadr service setting on the specified SQL Server instance.", + "Alias": "", + "Author": "Shawn Melton (@wsmelton), http://wsmelton.github.io", + "CommandName": "Get-DbaAgHadr", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Get-DbaAgHadr", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaAgHadr -SqlInstance sql2016\nReturns a status of the Hadr setting for sql2016 SQL Server instance.", "Params": [ [ "SqlInstance", @@ -9473,16 +9599,10 @@ "False" ] ], - "Alias": "", - "Author": "Shawn Melton (@wsmelton), http://wsmelton.github.io", - "Synopsis": "Gets the Hadr service setting on the specified SQL Server instance.", - "Name": "Get-DbaAgHadr", - "Links": "https://dbatools.io/Get-DbaAgHadr", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaAgHadr -SqlInstance sql2016\nReturns a status of the Hadr setting for sql2016 SQL Server instance.", "Syntax": "Get-DbaAgHadr [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaAgListener", + "Name": "Get-DbaAgListener", "Description": "Returns availability group listeners.", "Tags": [ "AG", @@ -9490,6 +9610,13 @@ "AvailabilityGroup", "Listener" ], + "Synopsis": "Returns availability group listeners.", + "Alias": "", + "Author": "Viorel Ciucu (@viorelciucu)", + "CommandName": "Get-DbaAgListener", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Get-DbaAgListener", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaAgListener -SqlInstance sql2017a\nReturns all listeners found on sql2017a\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaAgListener -SqlInstance sql2017a -AvailabilityGroup AG-a\nReturns all listeners found on sql2017a on sql2017a for the availability group AG-a\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaAvailabilityGroup -SqlInstance sql2017a -AvailabilityGroup OPP | Get-DbaAgListener\nReturns all listeners found on sql2017a on sql2017a for the availability group OPP", "Params": [ [ "SqlInstance", @@ -9540,16 +9667,10 @@ "False" ] ], - "Alias": "", - "Author": "Viorel Ciucu (@viorelciucu)", - "Synopsis": "Returns availability group listeners.", - "Name": "Get-DbaAgListener", - "Links": "https://dbatools.io/Get-DbaAgListener", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaAgListener -SqlInstance sql2017a\nReturns all listeners found on sql2017a\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaAgListener -SqlInstance sql2017a -AvailabilityGroup AG-a\nReturns all listeners found on sql2017a on sql2017a for the availability group AG-a\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaAvailabilityGroup -SqlInstance sql2017a -AvailabilityGroup OPP | Get-DbaAgListener\nReturns all listeners found on sql2017a on sql2017a for the availability group OPP", "Syntax": "Get-DbaAgListener [[-SqlInstance] \u003cDbaInstanceParameter[]\u003e] [[-SqlCredential] \u003cPSCredential\u003e] [[-AvailabilityGroup] \u003cString[]\u003e] [[-Listener] \u003cString[]\u003e] [[-InputObject] \u003cAvailabilityGroup[]\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaAgReplica", + "Name": "Get-DbaAgReplica", "Description": "Returns the availability group replica object found on the server.", "Tags": [ "AG", @@ -9557,6 +9678,13 @@ "AvailabilityGroup", "Replica" ], + "Synopsis": "Returns the availability group replica object found on the server.", + "Alias": "", + "Author": "Shawn Melton (@wsmelton) | Chrissy LeMaire (@cl)", + "CommandName": "Get-DbaAgReplica", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Get-DbaAgReplica", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaAgReplica -SqlInstance sql2017a\nReturns basic information on all the availability group replicas found on sql2017a\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaAgReplica -SqlInstance sql2017a -AvailabilityGroup SharePoint\nShows basic information on the replicas found on availability group SharePoint on sql2017a\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaAgReplica -SqlInstance sql2017a | Select-Object *\nReturns full object properties on all availability group replicas found on sql2017a", "Params": [ [ "SqlInstance", @@ -9607,16 +9735,10 @@ "False" ] ], - "Alias": "", - "Author": "Shawn Melton (@wsmelton) | Chrissy LeMaire (@cl)", - "Synopsis": "Returns the availability group replica object found on the server.", - "Name": "Get-DbaAgReplica", - "Links": "https://dbatools.io/Get-DbaAgReplica", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaAgReplica -SqlInstance sql2017a\nReturns basic information on all the availability group replicas found on sql2017a\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaAgReplica -SqlInstance sql2017a -AvailabilityGroup SharePoint\nShows basic information on the replicas found on availability group SharePoint on sql2017a\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaAgReplica -SqlInstance sql2017a | Select-Object *\nReturns full object properties on all availability group replicas found on sql2017a", "Syntax": "Get-DbaAgReplica [[-SqlInstance] \u003cDbaInstanceParameter[]\u003e] [[-SqlCredential] \u003cPSCredential\u003e] [[-AvailabilityGroup] \u003cString[]\u003e] [[-Replica] \u003cString[]\u003e] [[-InputObject] \u003cAvailabilityGroup[]\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaAvailabilityGroup", + "Name": "Get-DbaAvailabilityGroup", "Description": "Returns availability group objects from a SQL Server instance.\n\nDefault view provides most common set of properties for information on the Availability Group(s).", "Tags": [ "Hadr", @@ -9624,6 +9746,13 @@ "AG", "AvailabilityGroup" ], + "Synopsis": "Returns availability group objects from a SQL Server instance.", + "Alias": "", + "Author": "Shawn Melton (@wsmelton) | Chrissy LeMaire (@cl)", + "CommandName": "Get-DbaAvailabilityGroup", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Get-DbaAvailabilityGroup", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaAvailabilityGroup -SqlInstance sqlserver2014a\nReturns basic information on all the Availability Group(s) found on sqlserver2014a.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaAvailabilityGroup -SqlInstance sqlserver2014a -AvailabilityGroup AG-a\nShows basic information on the Availability Group AG-a on sqlserver2014a.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaAvailabilityGroup -SqlInstance sqlserver2014a | Select *\nReturns full object properties on all Availability Group(s) on sqlserver2014a.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaAvailabilityGroup -SqlInstance sqlserver2014a | Select-Object -ExpandProperty PrimaryReplicaServerName\nReturns the SQL Server instancename of the primary replica as a string\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eGet-DbaAvailabilityGroup -SqlInstance sqlserver2014a -AvailabilityGroup AG-a -IsPrimary\nReturns true/false if the server, sqlserver2014a, is the primary replica for AG-a Availability Group.", "Params": [ [ "SqlInstance", @@ -9666,21 +9795,22 @@ "False" ] ], - "Alias": "", - "Author": "Shawn Melton (@wsmelton) | Chrissy LeMaire (@cl)", - "Synopsis": "Returns availability group objects from a SQL Server instance.", - "Name": "Get-DbaAvailabilityGroup", - "Links": "https://dbatools.io/Get-DbaAvailabilityGroup", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaAvailabilityGroup -SqlInstance sqlserver2014a\nReturns basic information on all the Availability Group(s) found on sqlserver2014a.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaAvailabilityGroup -SqlInstance sqlserver2014a -AvailabilityGroup AG-a\nShows basic information on the Availability Group AG-a on sqlserver2014a.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaAvailabilityGroup -SqlInstance sqlserver2014a | Select *\nReturns full object properties on all Availability Group(s) on sqlserver2014a.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaAvailabilityGroup -SqlInstance sqlserver2014a | Select-Object -ExpandProperty PrimaryReplicaServerName\nReturns the SQL Server instancename of the primary replica as a string\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eGet-DbaAvailabilityGroup -SqlInstance sqlserver2014a -AvailabilityGroup AG-a -IsPrimary\nReturns true/false if the server, sqlserver2014a, is the primary replica for AG-a Availability Group.", "Syntax": "Get-DbaAvailabilityGroup [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [[-AvailabilityGroup] \u003cString[]\u003e] [-IsPrimary] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaAvailableCollation", + "Name": "Get-DbaAvailableCollation", "Description": "The Get-DbaAvailableCollation function returns the list of collations available on each SQL Server.\nOnly the connect permission is required to get this information.", "Tags": [ "Collation", "Configuration" ], + "Synopsis": "Function to get available collations for a given SQL Server", + "Alias": "", + "Author": "Bryan Hamby (@galador)", + "CommandName": "Get-DbaAvailableCollation", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Get-DbaAvailableCollation", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaAvailableCollation -SqlInstance sql2016\nGets all the collations from server sql2016 using NT authentication", "Params": [ [ "SqlInstance", @@ -9707,18 +9837,19 @@ "False" ] ], - "Alias": "", - "Author": "Bryan Hamby (@galador)", - "Synopsis": "Function to get available collations for a given SQL Server", - "Name": "Get-DbaAvailableCollation", - "Links": "https://dbatools.io/Get-DbaAvailableCollation", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaAvailableCollation -SqlInstance sql2016\nGets all the collations from server sql2016 using NT authentication", "Syntax": "Get-DbaAvailableCollation [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [-SqlCredential \u003cPSCredential\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaBackupDevice", + "Name": "Get-DbaBackupDevice", "Description": "The Get-DbaBackupDevice command gets SQL Backup Device information for each instance(s) of SQL Server.", "Tags": "Backup", + "Synopsis": "Gets SQL Backup Device information for each instance(s) of SQL Server.", + "Alias": "", + "Author": "Garry Bargsley (@gbargsley), http://blog.garrybargsley.com", + "CommandName": "Get-DbaBackupDevice", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Get-DbaBackupDevice", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaBackupDevice -SqlInstance localhost\nReturns all Backup Devices on the local default SQL Server instance\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaBackupDevice -SqlInstance localhost, sql2016\nReturns all Backup Devices for the local and sql2016 SQL Server instances", "Params": [ [ "SqlInstance", @@ -9745,21 +9876,22 @@ "False" ] ], - "Alias": "", - "Author": "Garry Bargsley (@gbargsley), http://blog.garrybargsley.com", - "Synopsis": "Gets SQL Backup Device information for each instance(s) of SQL Server.", - "Name": "Get-DbaBackupDevice", - "Links": "https://dbatools.io/Get-DbaBackupDevice", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaBackupDevice -SqlInstance localhost\nReturns all Backup Devices on the local default SQL Server instance\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaBackupDevice -SqlInstance localhost, sql2016\nReturns all Backup Devices for the local and sql2016 SQL Server instances", "Syntax": "Get-DbaBackupDevice [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [-SqlCredential \u003cPSCredential\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaBackupHistory", + "Name": "Get-DbaBackupHistory", "Description": "Returns backup history details for some or all databases on a SQL Server.\n\nYou can even get detailed information (including file path) for latest full, differential and log files.\n\nBackups taken with the CopyOnly option will NOT be returned, unless the IncludeCopyOnly switch is present\n\nReference: http://www.sqlhub.com/2011/07/find-your-backup-history-in-sql-server.html", "Tags": [ "DisasterRecovery", "Backup" ], + "Synopsis": "Returns backup history details for databases on a SQL Server.", + "Alias": "", + "Author": "Chrissy LeMaire (@cl) | Stuart Moore (@napalmgram)", + "CommandName": "Get-DbaBackupHistory", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Get-DbaBackupHistory", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaBackupHistory -SqlInstance SqlInstance2014a\nReturns server name, database, username, backup type, date for all database backups still in msdb history on SqlInstance2014a. This may return many rows; consider using filters that are included in \r\nother examples.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003e$cred = Get-Credential sqladmin\nGet-DbaBackupHistory -SqlInstance SqlInstance2014a -SqlCredential $cred\nDoes the same as above but connect to SqlInstance2014a as SQL user \"sqladmin\"\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaBackupHistory -SqlInstance SqlInstance2014a -Database db1, db2 -Since \u00272016-07-01 10:47:00\u0027\nReturns backup information only for databases db1 and db2 on SqlInstance2014a since July 1, 2016 at 10:47 AM.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaBackupHistory -SqlInstance sql2014 -Database AdventureWorks2014, pubs -Force | Format-Table\nReturns information only for AdventureWorks2014 and pubs and formats the results as a table.\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eGet-DbaBackupHistory -SqlInstance sql2014 -Database AdventureWorks2014 -Last\nReturns information about the most recent full, differential and log backups for AdventureWorks2014 on sql2014.\n-------------------------- EXAMPLE 6 --------------------------\nPS C:\\\u003eGet-DbaBackupHistory -SqlInstance sql2014 -Database AdventureWorks2014 -Last -DeviceType Disk\nReturns information about the most recent full, differential and log backups for AdventureWorks2014 on sql2014, but only for backups to disk.\n-------------------------- EXAMPLE 7 --------------------------\nPS C:\\\u003eGet-DbaBackupHistory -SqlInstance sql2014 -Database AdventureWorks2014 -Last -DeviceType 148,107\nReturns information about the most recent full, differential and log backups for AdventureWorks2014 on sql2014, but only for backups with device_type 148 and 107.\n-------------------------- EXAMPLE 8 --------------------------\nPS C:\\\u003eGet-DbaBackupHistory -SqlInstance sql2014 -Database AdventureWorks2014 -LastFull\nReturns information about the most recent full backup for AdventureWorks2014 on sql2014.\n-------------------------- EXAMPLE 9 --------------------------\nPS C:\\\u003eGet-DbaBackupHistory -SqlInstance sql2014 -Database AdventureWorks2014 -Type Full\nReturns information about all Full backups for AdventureWorks2014 on sql2014.\n-------------------------- EXAMPLE 10 --------------------------\nPS C:\\\u003eGet-DbaCmsRegServer -SqlInstance sql2016 | Get-DbaBackupHistory\nReturns database backup information for every database on every server listed in the Central Management Server on sql2016.\n-------------------------- EXAMPLE 11 --------------------------\nPS C:\\\u003eGet-DbaBackupHistory -SqlInstance SqlInstance2014a, sql2016 -Force\nReturns detailed backup history for all databases on SqlInstance2014a and sql2016.\n-------------------------- EXAMPLE 12 --------------------------\nPS C:\\\u003eGet-DbaBackupHistory -SqlInstance sql2016 -Database db1 -RecoveryFork 38e5e84a-3557-4643-a5d5-eed607bef9c6 -Last\nIf db1 has multiple recovery forks, specifying the RecoveryFork GUID will restrict the search to that fork.", "Params": [ [ "SqlInstance", @@ -9898,22 +10030,23 @@ "False" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl) | Stuart Moore (@napalmgram)", - "Synopsis": "Returns backup history details for databases on a SQL Server.", - "Name": "Get-DbaBackupHistory", - "Links": "https://dbatools.io/Get-DbaBackupHistory", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaBackupHistory -SqlInstance SqlInstance2014a\nReturns server name, database, username, backup type, date for all database backups still in msdb history on SqlInstance2014a. This may return many rows; consider using filters that are included in \r\nother examples.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003e$cred = Get-Credential sqladmin\nGet-DbaBackupHistory -SqlInstance SqlInstance2014a -SqlCredential $cred\nDoes the same as above but connect to SqlInstance2014a as SQL user \"sqladmin\"\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaBackupHistory -SqlInstance SqlInstance2014a -Database db1, db2 -Since \u00272016-07-01 10:47:00\u0027\nReturns backup information only for databases db1 and db2 on SqlInstance2014a since July 1, 2016 at 10:47 AM.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaBackupHistory -SqlInstance sql2014 -Database AdventureWorks2014, pubs -Force | Format-Table\nReturns information only for AdventureWorks2014 and pubs and formats the results as a table.\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eGet-DbaBackupHistory -SqlInstance sql2014 -Database AdventureWorks2014 -Last\nReturns information about the most recent full, differential and log backups for AdventureWorks2014 on sql2014.\n-------------------------- EXAMPLE 6 --------------------------\nPS C:\\\u003eGet-DbaBackupHistory -SqlInstance sql2014 -Database AdventureWorks2014 -Last -DeviceType Disk\nReturns information about the most recent full, differential and log backups for AdventureWorks2014 on sql2014, but only for backups to disk.\n-------------------------- EXAMPLE 7 --------------------------\nPS C:\\\u003eGet-DbaBackupHistory -SqlInstance sql2014 -Database AdventureWorks2014 -Last -DeviceType 148,107\nReturns information about the most recent full, differential and log backups for AdventureWorks2014 on sql2014, but only for backups with device_type 148 and 107.\n-------------------------- EXAMPLE 8 --------------------------\nPS C:\\\u003eGet-DbaBackupHistory -SqlInstance sql2014 -Database AdventureWorks2014 -LastFull\nReturns information about the most recent full backup for AdventureWorks2014 on sql2014.\n-------------------------- EXAMPLE 9 --------------------------\nPS C:\\\u003eGet-DbaBackupHistory -SqlInstance sql2014 -Database AdventureWorks2014 -Type Full\nReturns information about all Full backups for AdventureWorks2014 on sql2014.\n-------------------------- EXAMPLE 10 --------------------------\nPS C:\\\u003eGet-DbaCmsRegServer -SqlInstance sql2016 | Get-DbaBackupHistory\nReturns database backup information for every database on every server listed in the Central Management Server on sql2016.\n-------------------------- EXAMPLE 11 --------------------------\nPS C:\\\u003eGet-DbaBackupHistory -SqlInstance SqlInstance2014a, sql2016 -Force\nReturns detailed backup history for all databases on SqlInstance2014a and sql2016.\n-------------------------- EXAMPLE 12 --------------------------\nPS C:\\\u003eGet-DbaBackupHistory -SqlInstance sql2016 -Database db1 -RecoveryFork 38e5e84a-3557-4643-a5d5-eed607bef9c6 -Last\nIf db1 has multiple recovery forks, specifying the RecoveryFork GUID will restrict the search to that fork.", "Syntax": "Get-DbaBackupHistory -SqlInstance \u003cDbaInstanceParameter[]\u003e [-SqlCredential \u003cPSCredential\u003e] [-Database \u003cObject[]\u003e] [-ExcludeDatabase \u003cObject[]\u003e] [-IncludeCopyOnly] [-Since \u003cDateTime\u003e] [-RecoveryFork \u003cString\u003e] [-DeviceType \u003cString[]\u003e] [-Raw] [-LastLsn \u003cBigInteger\u003e] [-Type \u003cString[]\u003e] [-EnableException] [\u003cCommonParameters\u003e]\nGet-DbaBackupHistory -SqlInstance \u003cDbaInstanceParameter[]\u003e [-SqlCredential \u003cPSCredential\u003e] [-Database \u003cObject[]\u003e] [-ExcludeDatabase \u003cObject[]\u003e] [-IncludeCopyOnly] [-Force] [-Since \u003cDateTime\u003e] [-RecoveryFork \u003cString\u003e] [-DeviceType \u003cString[]\u003e] [-Raw] [-LastLsn \u003cBigInteger\u003e] [-Type \u003cString[]\u003e] [-EnableException] [\u003cCommonParameters\u003e]\nGet-DbaBackupHistory -SqlInstance \u003cDbaInstanceParameter[]\u003e [-SqlCredential \u003cPSCredential\u003e] [-Database \u003cObject[]\u003e] [-ExcludeDatabase \u003cObject[]\u003e] [-IncludeCopyOnly] [-Since \u003cDateTime\u003e] [-RecoveryFork \u003cString\u003e] [-Last] [-LastFull] [-LastDiff] [-LastLog] [-DeviceType \u003cString[]\u003e] [-Raw] [-LastLsn \u003cBigInteger\u003e] [-Type \u003cString[]\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaBackupInformation", + "Name": "Get-DbaBackupInformation", "Description": "Upon being passed a list of potential backups files this command will scan the files, select those that contain SQL Server\nbackup sets. It will then filter those files down to a set\n\nThe function defaults to working on a remote instance. This means that all paths passed in must be relative to the remote instance.\nXpDirTree will be used to perform the file scans\n\nVarious means can be used to pass in a list of files to be considered. The default is to non recursively scan the folder\npassed in.", "Tags": [ "DisasterRecovery", "Backup", "Restore" ], + "Synopsis": "Scan backup files and creates a set, compatible with Restore-DbaDatabase", + "Alias": "", + "Author": "Chrissy LeMaire (@cl) | Stuart Moore (@napalmgram)", + "CommandName": "Get-DbaBackupInformation", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Get-DbaBackupInformation", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaBackupInformation -SqlInstance Server1 -Path c:\\backups\\ -DirectoryRecurse\nWill use the Server1 instance to recursively read all backup files under c:\\backups, and return a dbatools BackupHistory object\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaBackupInformation -SqlInstance Server1 -Path c:\\backups\\ -DirectoryRecurse -ExportPath c:\\store\\BackupHistory.xml\nPS C:\\\u003e robocopy c:\\store\\ \\\\remoteMachine\\C$\\store\\ BackupHistory.xml\r\nPS C:\\\u003e Get-DbaBackupInformation -Import -Path c:\\store\\BackupHistory.xml | Restore-DbaDatabase -SqlInstance Server2 -TrustDbBackupHistory\nThis example creates backup history output from server1 and copies the file to the remote machine in order to preserve backup history. It is then used to restore the databases onto server2.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaBackupInformation -SqlInstance Server1 -Path c:\\backups\\ -DirectoryRecurse -ExportPath C:\\store\\BackupHistory.xml -PassThru | Restore-DbaDatabase -SqlInstance Server2 \r\n-TrustDbBackupHistory\nIn this example we gather backup information, export it to an xml file, and then pass it on through to Restore-DbaDatabase.\r\nThis allows us to repeat the restore without having to scan all the backup files again\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-ChildItem c:\\backups\\ -recurse -files | Where-Object {$_.extension -in (\u0027.bak\u0027,\u0027.trn\u0027) -and $_.LastWriteTime -gt (get-date).AddMonths(-1)} | Get-DbaBackupInformation -SqlInstance Server1 \r\n-ExportPath C:\\backupHistory.xml\nThis lets you keep a record of all backup history from the last month on hand to speed up refreshes\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003e$Backups = Get-DbaBackupInformation -SqlInstance Server1 -Path \\\\network\\backups\nPS C:\\\u003e $Backups += Get-DbaBackupInformation -SqlInstance Server2 -NoXpDirTree -Path c:\\backups\nScan the unc folder \\\\network\\backups with Server1, and then scan the C:\\backups folder on\r\nServer2 not using xp_dirtree, adding the results to the first set.\n-------------------------- EXAMPLE 6 --------------------------\nPS C:\\\u003e$Backups = Get-DbaBackupInformation -SqlInstance Server1 -Path \\\\network\\backups -MaintenanceSolution\nWhen MaintenanceSolution is indicated we know we are dealing with the output from Ola Hallengren backup scripts. So we make sure that a FULL folder exists in the first level of Path, if not we \r\nshortcut scanning all the files as we have nothing to work with\n-------------------------- EXAMPLE 7 --------------------------\nPS C:\\\u003e$Backups = Get-DbaBackupInformation -SqlInstance Server1 -Path \\\\network\\backups -MaintenanceSolution -IgnoreLogBackup\nAs we know we are dealing with an Ola Hallengren style backup folder from the MaintenanceSolution switch, when IgnoreLogBackup is also included we can ignore the LOG folder to skip any scanning of \r\nlog backups. Note this also means they WON\u0027T be restored", "Params": [ [ "Path", @@ -10044,18 +10177,19 @@ "False" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl) | Stuart Moore (@napalmgram)", - "Synopsis": "Scan backup files and creates a set, compatible with Restore-DbaDatabase", - "Name": "Get-DbaBackupInformation", - "Links": "https://dbatools.io/Get-DbaBackupInformation", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaBackupInformation -SqlInstance Server1 -Path c:\\backups\\ -DirectoryRecurse\nWill use the Server1 instance to recursively read all backup files under c:\\backups, and return a dbatools BackupHistory object\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaBackupInformation -SqlInstance Server1 -Path c:\\backups\\ -DirectoryRecurse -ExportPath c:\\store\\BackupHistory.xml\nPS C:\\\u003e robocopy c:\\store\\ \\\\remoteMachine\\C$\\store\\ BackupHistory.xml\r\nPS C:\\\u003e Get-DbaBackupInformation -Import -Path c:\\store\\BackupHistory.xml | Restore-DbaDatabase -SqlInstance Server2 -TrustDbBackupHistory\nThis example creates backup history output from server1 and copies the file to the remote machine in order to preserve backup history. It is then used to restore the databases onto server2.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaBackupInformation -SqlInstance Server1 -Path c:\\backups\\ -DirectoryRecurse -ExportPath C:\\store\\BackupHistory.xml -PassThru | Restore-DbaDatabase -SqlInstance Server2 \r\n-TrustDbBackupHistory\nIn this example we gather backup information, export it to an xml file, and then pass it on through to Restore-DbaDatabase.\r\nThis allows us to repeat the restore without having to scan all the backup files again\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-ChildItem c:\\backups\\ -recurse -files | Where-Object {$_.extension -in (\u0027.bak\u0027,\u0027.trn\u0027) -and $_.LastWriteTime -gt (get-date).AddMonths(-1)} | Get-DbaBackupInformation -SqlInstance Server1 \r\n-ExportPath C:\\backupHistory.xml\nThis lets you keep a record of all backup history from the last month on hand to speed up refreshes\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003e$Backups = Get-DbaBackupInformation -SqlInstance Server1 -Path \\\\network\\backups\nPS C:\\\u003e $Backups += Get-DbaBackupInformation -SqlInstance Server2 -NoXpDirTree -Path c:\\backups\nScan the unc folder \\\\network\\backups with Server1, and then scan the C:\\backups folder on\r\nServer2 not using xp_dirtree, adding the results to the first set.\n-------------------------- EXAMPLE 6 --------------------------\nPS C:\\\u003e$Backups = Get-DbaBackupInformation -SqlInstance Server1 -Path \\\\network\\backups -MaintenanceSolution\nWhen MaintenanceSolution is indicated we know we are dealing with the output from Ola Hallengren backup scripts. So we make sure that a FULL folder exists in the first level of Path, if not we \r\nshortcut scanning all the files as we have nothing to work with\n-------------------------- EXAMPLE 7 --------------------------\nPS C:\\\u003e$Backups = Get-DbaBackupInformation -SqlInstance Server1 -Path \\\\network\\backups -MaintenanceSolution -IgnoreLogBackup\nAs we know we are dealing with an Ola Hallengren style backup folder from the MaintenanceSolution switch, when IgnoreLogBackup is also included we can ignore the LOG folder to skip any scanning of \r\nlog backups. Note this also means they WON\u0027T be restored", "Syntax": "Get-DbaBackupInformation -Path \u003cObject[]\u003e -SqlInstance \u003cDbaInstanceParameter\u003e [-SqlCredential \u003cPSCredential\u003e] [-DatabaseName \u003cString[]\u003e] [-SourceInstance \u003cString[]\u003e] [-NoXpDirTree] [-DirectoryRecurse] [-EnableException] [-MaintenanceSolution] [-IgnoreLogBackup] [-ExportPath \u003cString\u003e] [-AzureCredential \u003cString\u003e] [-Anonymise] [-NoClobber] [-PassThru] [\u003cCommonParameters\u003e]\nGet-DbaBackupInformation -Path \u003cObject[]\u003e [-DatabaseName \u003cString[]\u003e] [-SourceInstance \u003cString[]\u003e] [-EnableException] [-MaintenanceSolution] [-IgnoreLogBackup] [-ExportPath \u003cString\u003e] [-AzureCredential \u003cString\u003e] [-Import] [-Anonymise] [-NoClobber] [-PassThru] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaBuildReference", + "Name": "Get-DbaBuildReference", "Description": "Returns info about the specific build of a SQL instance, including the SP, the CU and the reference KB, wherever possible.\nIt also includes End Of Support dates as specified on Microsoft Life Cycle Policy", "Tags": "SqlBuild", + "Synopsis": "Returns SQL Server Build infos on a SQL instance", + "Alias": "Get-DbaSqlBuildReference", + "Author": "Simone Bizzotto (@niphold) | Friedrich Weinmann (@FredWeinmann)", + "CommandName": "Get-DbaBuildReference", + "Availability": "Windows only", + "Links": "https://dbatools.io/Get-DbaBuildReference", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaBuildReference -Build \"12.00.4502\"\nReturns information about a build identified by \"12.00.4502\" (which is SQL 2014 with SP1 and CU11)\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaBuildReference -Build \"12.00.4502\" -Update\nReturns information about a build trying to fetch the most up to date index online. When the online version is newer, the local one gets overwritten\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaBuildReference -Build \"12.0.4502\",\"10.50.4260\"\nReturns information builds identified by these versions strings\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaCmsRegServer -SqlInstance sqlserver2014a | Get-DbaBuildReference\nIntegrate with other cmdlets to have builds checked for all your registered servers on sqlserver2014a", "Params": [ [ "Build", @@ -10130,18 +10264,19 @@ "False" ] ], - "Alias": "Get-DbaSqlBuildReference", - "Author": "Simone Bizzotto (@niphold) | Friedrich Weinmann (@FredWeinmann)", - "Synopsis": "Returns SQL Server Build infos on a SQL instance", - "Name": "Get-DbaBuildReference", - "Links": "https://dbatools.io/Get-DbaBuildReference", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaBuildReference -Build \"12.00.4502\"\nReturns information about a build identified by \"12.00.4502\" (which is SQL 2014 with SP1 and CU11)\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaBuildReference -Build \"12.00.4502\" -Update\nReturns information about a build trying to fetch the most up to date index online. When the online version is newer, the local one gets overwritten\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaBuildReference -Build \"12.0.4502\",\"10.50.4260\"\nReturns information builds identified by these versions strings\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaCmsRegServer -SqlInstance sqlserver2014a | Get-DbaBuildReference\nIntegrate with other cmdlets to have builds checked for all your registered servers on sqlserver2014a", "Syntax": "Get-DbaBuildReference [[-Build] \u003cVersion[]\u003e] [[-Kb] \u003cString[]\u003e] [[-MajorVersion] \u003cString\u003e] [[-ServicePack] \u003cString\u003e] [[-CumulativeUpdate] \u003cString\u003e] [[-SqlInstance] \u003cDbaInstanceParameter[]\u003e] [[-SqlCredential] \u003cPSCredential\u003e] [-Update] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaClientAlias", + "Name": "Get-DbaClientAlias", "Description": "Gets SQL Server alias by reading HKLM:\\SOFTWARE\\Microsoft\\MSSQLServer\\Client", "Tags": "Alias", + "Synopsis": "Gets any SQL Server alias for the specified server(s)", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Get-DbaClientAlias", + "Availability": "Windows only", + "Links": "https://dbatools.io/Get-DbaClientAlias", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaClientAlias\nGets all SQL Server client aliases on the local computer\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaClientAlias -ComputerName workstationx\nGets all SQL Server client aliases on Workstationx\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaClientAlias -ComputerName workstationx -Credential ad\\sqldba\nLogs into workstationx as ad\\sqldba then retrieves all SQL Server client aliases on Workstationx\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003e\u0027Server1\u0027, \u0027Server2\u0027 | Get-DbaClientAlias\nGets all SQL Server client aliases on Server1 and Server2", "Params": [ [ "ComputerName", @@ -10168,18 +10303,19 @@ "False" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Gets any SQL Server alias for the specified server(s)", - "Name": "Get-DbaClientAlias", - "Links": "https://dbatools.io/Get-DbaClientAlias", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaClientAlias\nGets all SQL Server client aliases on the local computer\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaClientAlias -ComputerName workstationx\nGets all SQL Server client aliases on Workstationx\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaClientAlias -ComputerName workstationx -Credential ad\\sqldba\nLogs into workstationx as ad\\sqldba then retrieves all SQL Server client aliases on Workstationx\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003e\u0027Server1\u0027, \u0027Server2\u0027 | Get-DbaClientAlias\nGets all SQL Server client aliases on Server1 and Server2", "Syntax": "Get-DbaClientAlias [[-ComputerName] \u003cDbaInstanceParameter[]\u003e] [[-Credential] \u003cPSCredential\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaClientProtocol", + "Name": "Get-DbaClientProtocol", "Description": "Gets the SQL Server related client protocols on one or more computers.\n\nRequires Local Admin rights on destination computer(s).\nThe client protocols can be enabled and disabled when retrieved via WSMan.", "Tags": "Protocol", + "Synopsis": "Gets the SQL Server related client protocols on a computer.", + "Alias": "", + "Author": "Klaas Vandenberghe (@PowerDBAKlaas)", + "CommandName": "Get-DbaClientProtocol", + "Availability": "Windows only", + "Links": "https://dbatools.io/Get-DbaClientProtocol", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaClientProtocol -ComputerName sqlserver2014a\nGets the SQL Server related client protocols on computer sqlserver2014a.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003e\u0027sql1\u0027,\u0027sql2\u0027,\u0027sql3\u0027 | Get-DbaClientProtocol\nGets the SQL Server related client protocols on computers sql1, sql2 and sql3.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaClientProtocol -ComputerName sql1,sql2 | Out-GridView\nGets the SQL Server related client protocols on computers sql1 and sql2, and shows them in a grid view.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003e(Get-DbaClientProtocol -ComputerName sql2 | Where { $_.DisplayName = \u0027via\u0027 }).Disable()\nDisables the VIA ClientNetworkProtocol on computer sql2.\r\nIf successful, return code 0 is shown.", "Params": [ [ "ComputerName", @@ -10206,21 +10342,22 @@ "False" ] ], - "Alias": "", - "Author": "Klaas Vandenberghe (@PowerDBAKlaas)", - "Synopsis": "Gets the SQL Server related client protocols on a computer.", - "Name": "Get-DbaClientProtocol", - "Links": "https://dbatools.io/Get-DbaClientProtocol", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaClientProtocol -ComputerName sqlserver2014a\nGets the SQL Server related client protocols on computer sqlserver2014a.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003e\u0027sql1\u0027,\u0027sql2\u0027,\u0027sql3\u0027 | Get-DbaClientProtocol\nGets the SQL Server related client protocols on computers sql1, sql2 and sql3.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaClientProtocol -ComputerName sql1,sql2 | Out-GridView\nGets the SQL Server related client protocols on computers sql1 and sql2, and shows them in a grid view.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003e(Get-DbaClientProtocol -ComputerName sql2 | Where { $_.DisplayName = \u0027via\u0027 }).Disable()\nDisables the VIA ClientNetworkProtocol on computer sql2.\r\nIf successful, return code 0 is shown.", "Syntax": "Get-DbaClientProtocol [[-ComputerName] \u003cDbaInstanceParameter[]\u003e] [[-Credential] \u003cPSCredential\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaCmConnection", + "Name": "Get-DbaCmConnection", "Description": "Retrieves windows management connections from the cache", "Tags": [ "ComputerManagement", "CIM" ], + "Synopsis": "Retrieves windows management connections from the cache", + "Alias": "", + "Author": "Friedrich Weinmann (@FredWeinmann)", + "CommandName": "Get-DbaCmConnection", + "Availability": "Windows only", + "Links": "https://dbatools.io/Get-DbaCmConnection", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaCmConnection\nList all cached connections.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaCmConnection sql2014\nList the cached connection - if any - to the server sql2014.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaCmConnection -UserName \"*charles*\"\nList all cached connection that use a username containing \"charles\" as default or override credentials.", "Params": [ [ "ComputerName", @@ -10247,21 +10384,22 @@ "False" ] ], - "Alias": "", - "Author": "Friedrich Weinmann (@FredWeinmann)", - "Synopsis": "Retrieves windows management connections from the cache", - "Name": "Get-DbaCmConnection", - "Links": "https://dbatools.io/Get-DbaCmConnection", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaCmConnection\nList all cached connections.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaCmConnection sql2014\nList the cached connection - if any - to the server sql2014.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaCmConnection -UserName \"*charles*\"\nList all cached connection that use a username containing \"charles\" as default or override credentials.", "Syntax": "Get-DbaCmConnection [[-ComputerName] \u003cString[]\u003e] [-UserName \u003cString\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaCmObject", + "Name": "Get-DbaCmObject", "Description": "This function centralizes all requests for information retrieved from Get-WmiObject or Get-CimInstance.\nIt uses different protocols as available in this order:\n- Cim over WinRM\n- Cim over DCOM\n- Wmi\n- Wmi over PowerShell Remoting\nIt remembers channels that didn\u0027t work and will henceforth avoid them. It remembers invalid credentials and will avoid reusing them.\nMuch of its behavior can be configured using Test-DbaCmConnection.", "Tags": [ "ComputerManagement", "CIM" ], + "Synopsis": "Retrieves Wmi/Cim-Style information from computers.", + "Alias": "", + "Author": "Friedrich Weinmann (@FredWeinmann)", + "CommandName": "Get-DbaCmObject", + "Availability": "Windows only", + "Links": "https://dbatools.io/Get-DbaCmObject", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaCmObject win32_OperatingSystem\nRetrieves the common operating system information from the local computer.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaCmObject -Computername \"sql2014\" -ClassName Win32_OperatingSystem -Credential $cred -DoNotUse CimRM\nRetrieves the common operating system information from the server sql2014.\r\nIt will use the Credentials stored in $cred to connect, unless they are known to not work, in which case they will default to windows credentials (unless another default has been set).", "Params": [ [ "ClassName", @@ -10336,21 +10474,22 @@ "False" ] ], - "Alias": "", - "Author": "Friedrich Weinmann (@FredWeinmann)", - "Synopsis": "Retrieves Wmi/Cim-Style information from computers.", - "Name": "Get-DbaCmObject", - "Links": "https://dbatools.io/Get-DbaCmObject", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaCmObject win32_OperatingSystem\nRetrieves the common operating system information from the local computer.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaCmObject -Computername \"sql2014\" -ClassName Win32_OperatingSystem -Credential $cred -DoNotUse CimRM\nRetrieves the common operating system information from the server sql2014.\r\nIt will use the Credentials stored in $cred to connect, unless they are known to not work, in which case they will default to windows credentials (unless another default has been set).", "Syntax": "Get-DbaCmObject [-ClassName] \u003cString\u003e [-ComputerName \u003cDbaCmConnectionParameter[]\u003e] [-Credential \u003cPSCredential\u003e] [-Namespace \u003cString\u003e] [-DoNotUse {None | CimRM | CimDCOM | Wmi | PowerShellRemoting}] [-Force] [-SilentlyContinue] [-EnableException] [\u003cCommonParameters\u003e]\nGet-DbaCmObject [-Query] \u003cString\u003e [-ComputerName \u003cDbaCmConnectionParameter[]\u003e] [-Credential \u003cPSCredential\u003e] [-Namespace \u003cString\u003e] [-DoNotUse {None | CimRM | CimDCOM | Wmi | PowerShellRemoting}] [-Force] [-SilentlyContinue] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaCmsRegServer", + "Name": "Get-DbaCmsRegServer", "Description": "Returns an array of servers found in the CMS.", "Tags": [ "RegisteredServer", "CMS" ], + "Synopsis": "Gets list of SQL Server objects stored in SQL Server Central Management Server (CMS).", + "Alias": "Get-DbaCmsRegServerName,Get-DbaRegisteredServer,Get-SqlRegisteredServerName", + "Author": "Bryan Hamby (@galador)", + "CommandName": "Get-DbaCmsRegServer", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Get-DbaCmsRegServer", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaCmsRegServer -SqlInstance sqlserver2014a\nGets a list of servers from the CMS on sqlserver2014a, using Windows Credentials.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaCmsRegServer -SqlInstance sqlserver2014a -IncludeSelf\nGets a list of servers from the CMS on sqlserver2014a and includes sqlserver2014a in the output results.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaCmsRegServer -SqlInstance sqlserver2014a -SqlCredential $credential | Select-Object -Unique -ExpandProperty ServerName\nReturns only the server names from the CMS on sqlserver2014a, using SQL Authentication to authenticate to the server.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaCmsRegServer -SqlInstance sqlserver2014a -Group HR, Accounting\nGets a list of servers in the HR and Accounting groups from the CMS on sqlserver2014a.\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eGet-DbaCmsRegServer -SqlInstance sqlserver2014a -Group HR\\Development\nReturns a list of servers in the HR and sub-group Development from the CMS on sqlserver2014a.", "Params": [ [ "SqlInstance", @@ -10441,21 +10580,22 @@ "False" ] ], - "Alias": "Get-DbaCmsRegServerName,Get-DbaRegisteredServer,Get-SqlRegisteredServerName", - "Author": "Bryan Hamby (@galador)", - "Synopsis": "Gets list of SQL Server objects stored in SQL Server Central Management Server (CMS).", - "Name": "Get-DbaCmsRegServer", - "Links": "https://dbatools.io/Get-DbaCmsRegServer", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaCmsRegServer -SqlInstance sqlserver2014a\nGets a list of servers from the CMS on sqlserver2014a, using Windows Credentials.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaCmsRegServer -SqlInstance sqlserver2014a -IncludeSelf\nGets a list of servers from the CMS on sqlserver2014a and includes sqlserver2014a in the output results.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaCmsRegServer -SqlInstance sqlserver2014a -SqlCredential $credential | Select-Object -Unique -ExpandProperty ServerName\nReturns only the server names from the CMS on sqlserver2014a, using SQL Authentication to authenticate to the server.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaCmsRegServer -SqlInstance sqlserver2014a -Group HR, Accounting\nGets a list of servers in the HR and Accounting groups from the CMS on sqlserver2014a.\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eGet-DbaCmsRegServer -SqlInstance sqlserver2014a -Group HR\\Development\nReturns a list of servers in the HR and sub-group Development from the CMS on sqlserver2014a.", "Syntax": "Get-DbaCmsRegServer [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [[-Name] \u003cString[]\u003e] [[-ServerName] \u003cString[]\u003e] [[-Group] \u003cObject[]\u003e] [[-ExcludeGroup] \u003cObject[]\u003e] [[-Id] \u003cInt32[]\u003e] [-IncludeSelf] [-ExcludeCmsServer] [-ResolveNetworkName] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaCmsRegServerGroup", + "Name": "Get-DbaCmsRegServerGroup", "Description": "Returns an array of Server Groups found in the CMS.", "Tags": [ "RegisteredServer", "CMS" ], + "Synopsis": "Gets list of Server Groups objects stored in SQL Server Central Management Server (CMS).", + "Alias": "Get-DbaRegisteredServerGroup", + "Author": "Tony Wilhelm (@tonywsql)", + "CommandName": "Get-DbaCmsRegServerGroup", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Get-DbaCmsRegServerGroup", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaCmsRegServerGroup -SqlInstance sqlserver2014a\nGets the top level groups from the CMS on sqlserver2014a, using Windows Credentials.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaCmsRegServerGroup -SqlInstance sqlserver2014a -SqlCredential $credential\nGets the top level groups from the CMS on sqlserver2014a, using alternative credentials to authenticate to the server.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaCmsRegServerGroup -SqlInstance sqlserver2014a -Group HR, Accounting\nGets the HR and Accounting groups from the CMS on sqlserver2014a.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaCmsRegServerGroup -SqlInstance sqlserver2014a -Group HR\\Development\nReturns the sub-group Development of the HR group from the CMS on sqlserver2014a.", "Params": [ [ "SqlInstance", @@ -10506,21 +10646,22 @@ "False" ] ], - "Alias": "Get-DbaRegisteredServerGroup", - "Author": "Tony Wilhelm (@tonywsql)", - "Synopsis": "Gets list of Server Groups objects stored in SQL Server Central Management Server (CMS).", - "Name": "Get-DbaCmsRegServerGroup", - "Links": "https://dbatools.io/Get-DbaCmsRegServerGroup", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaCmsRegServerGroup -SqlInstance sqlserver2014a\nGets the top level groups from the CMS on sqlserver2014a, using Windows Credentials.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaCmsRegServerGroup -SqlInstance sqlserver2014a -SqlCredential $credential\nGets the top level groups from the CMS on sqlserver2014a, using alternative credentials to authenticate to the server.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaCmsRegServerGroup -SqlInstance sqlserver2014a -Group HR, Accounting\nGets the HR and Accounting groups from the CMS on sqlserver2014a.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaCmsRegServerGroup -SqlInstance sqlserver2014a -Group HR\\Development\nReturns the sub-group Development of the HR group from the CMS on sqlserver2014a.", "Syntax": "Get-DbaCmsRegServerGroup [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [[-Group] \u003cObject[]\u003e] [[-ExcludeGroup] \u003cObject[]\u003e] [[-Id] \u003cInt32[]\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaCmsRegServerStore", + "Name": "Get-DbaCmsRegServerStore", "Description": "Returns a SQL Server Registered Server Store object - useful for working with Central Management Store", "Tags": [ "RegisteredServer", "CMS" ], + "Synopsis": "Returns a SQL Server Registered Server Store Object", + "Alias": "Get-DbaRegisteredServerStore", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Get-DbaCmsRegServerStore", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Get-DbaCmsRegServerStore", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaCmsRegServerStore -SqlInstance sqlserver2014a\nReturns a SQL Server Registered Server Store Object from sqlserver2014a\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaCmsRegServerStore -SqlInstance sqlserver2014a -SqlCredential sqladmin\nReturns a SQL Server Registered Server Store Object from sqlserver2014a by logging in with the sqladmin login", "Params": [ [ "SqlInstance", @@ -10547,18 +10688,19 @@ "False" ] ], - "Alias": "Get-DbaRegisteredServerStore", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Returns a SQL Server Registered Server Store Object", - "Name": "Get-DbaCmsRegServerStore", - "Links": "https://dbatools.io/Get-DbaCmsRegServerStore", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaCmsRegServerStore -SqlInstance sqlserver2014a\nReturns a SQL Server Registered Server Store Object from sqlserver2014a\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaCmsRegServerStore -SqlInstance sqlserver2014a -SqlCredential sqladmin\nReturns a SQL Server Registered Server Store Object from sqlserver2014a by logging in with the sqladmin login", "Syntax": "Get-DbaCmsRegServerStore [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaComputerCertificate", + "Name": "Get-DbaComputerCertificate", "Description": "Gets computer certificates on localhost that are candidates for using with SQL Server\u0027s network encryption", "Tags": "Certificate", + "Synopsis": "Simplifies finding computer certificates that are candidates for using with SQL Server\u0027s network encryption", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Get-DbaComputerCertificate", + "Availability": "Windows only", + "Links": null, + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaComputerCertificate\nGets computer certificates on localhost that are candidates for using with SQL Server\u0027s network encryption\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaComputerCertificate -ComputerName sql2016\nGets computer certificates on sql2016 that are candidates for using with SQL Server\u0027s network encryption\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaComputerCertificate -ComputerName sql2016 -Thumbprint 8123472E32AB412ED4288888B83811DB8F504DED, 04BFF8B3679BB01A986E097868D8D494D70A46D6\nGets computer certificates on sql2016 that match thumbprints 8123472E32AB412ED4288888B83811DB8F504DED or 04BFF8B3679BB01A986E097868D8D494D70A46D6", "Params": [ [ "ComputerName", @@ -10617,18 +10759,19 @@ "False" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Simplifies finding computer certificates that are candidates for using with SQL Server\u0027s network encryption", - "Name": "Get-DbaComputerCertificate", - "Links": null, - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaComputerCertificate\nGets computer certificates on localhost that are candidates for using with SQL Server\u0027s network encryption\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaComputerCertificate -ComputerName sql2016\nGets computer certificates on sql2016 that are candidates for using with SQL Server\u0027s network encryption\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaComputerCertificate -ComputerName sql2016 -Thumbprint 8123472E32AB412ED4288888B83811DB8F504DED, 04BFF8B3679BB01A986E097868D8D494D70A46D6\nGets computer certificates on sql2016 that match thumbprints 8123472E32AB412ED4288888B83811DB8F504DED or 04BFF8B3679BB01A986E097868D8D494D70A46D6", "Syntax": "Get-DbaComputerCertificate [[-ComputerName] \u003cDbaInstanceParameter[]\u003e] [[-Credential] \u003cPSCredential\u003e] [[-Store] \u003cString\u003e] [[-Folder] \u003cString\u003e] [[-Path] \u003cString\u003e] [[-Thumbprint] \u003cString[]\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaComputerSystem", + "Name": "Get-DbaComputerSystem", "Description": "Gets computer system information from the server and returns as an object.", "Tags": "ServerInfo", + "Synopsis": "Gets computer system information from the server.", + "Alias": "", + "Author": "Shawn Melton (@wsmelton), https://wsmelton.github.io", + "CommandName": "Get-DbaComputerSystem", + "Availability": "Windows only", + "Links": "https://dbatools.io/Get-DbaComputerSystem", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaComputerSystem\nReturns information about the local computer\u0027s computer system\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaComputerSystem -ComputerName sql2016\nReturns information about the sql2016\u0027s computer system\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaComputerSystem -ComputerName sql2016 -IncludeAws\nReturns information about the sql2016\u0027s computer system and includes additional properties around the EC2 instance.", "Params": [ [ "ComputerName", @@ -10663,18 +10806,19 @@ "False" ] ], - "Alias": "", - "Author": "Shawn Melton (@wsmelton), https://wsmelton.github.io", - "Synopsis": "Gets computer system information from the server.", - "Name": "Get-DbaComputerSystem", - "Links": "https://dbatools.io/Get-DbaComputerSystem", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaComputerSystem\nReturns information about the local computer\u0027s computer system\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaComputerSystem -ComputerName sql2016\nReturns information about the sql2016\u0027s computer system\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaComputerSystem -ComputerName sql2016 -IncludeAws\nReturns information about the sql2016\u0027s computer system and includes additional properties around the EC2 instance.", "Syntax": "Get-DbaComputerSystem [[-ComputerName] \u003cDbaInstanceParameter[]\u003e] [[-Credential] \u003cPSCredential\u003e] [-IncludeAws] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaConnection", + "Name": "Get-DbaConnection", "Description": "Returns a bunch of information from dm_exec_connections which, according to Microsoft:\n\"Returns information about the connections established to this instance of SQL Server and the details of each connection. Returns server wide connection information for SQL Server. Returns current database connection information for SQL Database.\"", "Tags": "Connection", + "Synopsis": "Returns a bunch of information from dm_exec_connections.", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Get-DbaConnection", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Get-DbaConnection", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaConnection -SqlInstance sql2016, sql2017\nReturns client connection information from sql2016 and sql2017", "Params": [ [ "SqlInstance", @@ -10701,18 +10845,19 @@ "False" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Returns a bunch of information from dm_exec_connections.", - "Name": "Get-DbaConnection", - "Links": "https://dbatools.io/Get-DbaConnection", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaConnection -SqlInstance sql2016, sql2017\nReturns client connection information from sql2016 and sql2017", "Syntax": "Get-DbaConnection [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaCpuRingBuffer", + "Name": "Get-DbaCpuRingBuffer", "Description": "This command is based off of Glen Berry\u0027s diagnostic query for average CPU\n\nThe sys.dm_os_ring_buffers stores the average CPU utilization history\nby the current instance of SQL Server, plus the summed average CPU utilization\nby all other processes on your machine are captured in one minute increments\nfor the past 256 minutes.\n\nReference: https://www.sqlskills.com/blogs/glenn/sql-server-diagnostic-information-queries-detailed-day-16//", "Tags": "CPU", + "Synopsis": "Collects CPU data from sys.dm_os_ring_buffers. Works on SQL Server 2005 and above.", + "Alias": "", + "Author": "Patrick Flynn (@sqllensman)", + "CommandName": "Get-DbaCpuRingBuffer", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Get-DbaCpuRingBuffer", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaCpuRingBuffer -SqlInstance sql2008, sqlserver2012\nGets CPU Statistics from sys.dm_os_ring_buffers for servers sql2008 and sqlserver2012 for last 60 minutes.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaCpuRingBuffer -SqlInstance sql2008 -CollectionMinutes 240\nGets CPU Statistics from sys.dm_os_ring_buffers for server sql2008 for last 240 minutes\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003e$output = Get-DbaCpuRingBuffer -SqlInstance sql2008 -CollectionMinutes 240 | Select * | ConvertTo-DbaDataTable\nGets CPU Statistics from sys.dm_os_ring_buffers for server sql2008 for last 240 minutes into a Data Table.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003e\u0027sql2008\u0027,\u0027sql2012\u0027 | Get-DbaCpuRingBuffer\nGets CPU Statistics from sys.dm_os_ring_buffers for servers sql2008 and sqlserver2012\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003e$cred = Get-Credential sqladmin\nPS C:\\\u003e Get-DbaCpuRingBuffer -SqlInstance sql2008 -SqlCredential $cred\nConnects using sqladmin credential and returns CPU Statistics from sys.dm_os_ring_buffers from sql2008", "Params": [ [ "SqlInstance", @@ -10747,18 +10892,19 @@ "False" ] ], - "Alias": "", - "Author": "Patrick Flynn (@sqllensman)", - "Synopsis": "Collects CPU data from sys.dm_os_ring_buffers. Works on SQL Server 2005 and above.", - "Name": "Get-DbaCpuRingBuffer", - "Links": "https://dbatools.io/Get-DbaCpuRingBuffer", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaCpuRingBuffer -SqlInstance sql2008, sqlserver2012\nGets CPU Statistics from sys.dm_os_ring_buffers for servers sql2008 and sqlserver2012 for last 60 minutes.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaCpuRingBuffer -SqlInstance sql2008 -CollectionMinutes 240\nGets CPU Statistics from sys.dm_os_ring_buffers for server sql2008 for last 240 minutes\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003e$output = Get-DbaCpuRingBuffer -SqlInstance sql2008 -CollectionMinutes 240 | Select * | ConvertTo-DbaDataTable\nGets CPU Statistics from sys.dm_os_ring_buffers for server sql2008 for last 240 minutes into a Data Table.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003e\u0027sql2008\u0027,\u0027sql2012\u0027 | Get-DbaCpuRingBuffer\nGets CPU Statistics from sys.dm_os_ring_buffers for servers sql2008 and sqlserver2012\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003e$cred = Get-Credential sqladmin\nPS C:\\\u003e Get-DbaCpuRingBuffer -SqlInstance sql2008 -SqlCredential $cred\nConnects using sqladmin credential and returns CPU Statistics from sys.dm_os_ring_buffers from sql2008", "Syntax": "Get-DbaCpuRingBuffer [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [[-CollectionMinutes] \u003cInt32\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaCpuUsage", + "Name": "Get-DbaCpuUsage", "Description": "\"If there are a lot of processes running on your instance and the CPU is very high,\nthen it\u0027s hard to find the exact process eating up your CPU using just the SQL Server\ntools. One way to correlate the data between what is running within SQL Server and at\nthe Windows level is to use SPID and KPID values to get the exact process.\"\n\nThis command automates that process.\n\nReferences: https://www.mssqltips.com/sqlservertip/2454/how-to-find-out-how-much-cpu-a-sql-server-process-is-really-using/\n\nNote: This command returns results from all SQL instances on the destination server but the process\ncolumn is specific to -SqlInstance passed.", "Tags": "CPU", + "Synopsis": "Provides detailed CPU usage information about a SQL Server\u0027s process", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Get-DbaCpuUsage", + "Availability": "Windows only", + "Links": "https://dbatools.io/Get-DbaCpuUsage", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaCpuUsage -SqlInstance sql2017\nLogs into the SQL Server instance \"sql2017\" and also the Computer itself (via WMI) to gather information\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003e$usage = Get-DbaCpuUsage -SqlInstance sql2017\nPS C:\\\u003e $usage.Process\nExplores the processes (from Get-DbaProcess) associated with the usage results\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaCpuUsage -SqlInstance sql2017 -SqlCredential sqladmin -Credential ad\\sqldba\nLogs into the SQL instance using the SQL Login \u0027sqladmin\u0027 and then Windows instance as \u0027ad\\sqldba\u0027", "Params": [ [ "SqlInstance", @@ -10801,18 +10947,19 @@ "False" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Provides detailed CPU usage information about a SQL Server\u0027s process", - "Name": "Get-DbaCpuUsage", - "Links": "https://dbatools.io/Get-DbaCpuUsage", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaCpuUsage -SqlInstance sql2017\nLogs into the SQL Server instance \"sql2017\" and also the Computer itself (via WMI) to gather information\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003e$usage = Get-DbaCpuUsage -SqlInstance sql2017\nPS C:\\\u003e $usage.Process\nExplores the processes (from Get-DbaProcess) associated with the usage results\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaCpuUsage -SqlInstance sql2017 -SqlCredential sqladmin -Credential ad\\sqldba\nLogs into the SQL instance using the SQL Login \u0027sqladmin\u0027 and then Windows instance as \u0027ad\\sqldba\u0027", "Syntax": "Get-DbaCpuUsage [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [[-Credential] \u003cPSCredential\u003e] [[-Threshold] \u003cInt32\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaCredential", + "Name": "Get-DbaCredential", "Description": "The Get-DbaCredential command gets SQL Credential information for each instance(s) of SQL Server.", "Tags": "Credential", + "Synopsis": "Gets SQL Credential information for each instance(s) of SQL Server.", + "Alias": "", + "Author": "Garry Bargsley (@gbargsley), http://blog.garrybargsley.com", + "CommandName": "Get-DbaCredential", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Get-DbaCredential", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaCredential -SqlInstance localhost\nReturns all SQL Credentials on the local default SQL Server instance\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaCredential -SqlInstance localhost, sql2016 -Name \u0027PowerShell Proxy\u0027\nReturns the SQL Credentials named \u0027PowerShell Proxy\u0027 for the local and sql2016 SQL Server instances\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaCredential -SqlInstance localhost, sql2016 -Identity ad\\powershell\nReturns the SQL Credentials for the account \u0027ad\\powershell\u0027 on the local and sql2016 SQL Server instances", "Params": [ [ "SqlInstance", @@ -10871,21 +11018,22 @@ "False" ] ], - "Alias": "", - "Author": "Garry Bargsley (@gbargsley), http://blog.garrybargsley.com", - "Synopsis": "Gets SQL Credential information for each instance(s) of SQL Server.", - "Name": "Get-DbaCredential", - "Links": "https://dbatools.io/Get-DbaCredential", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaCredential -SqlInstance localhost\nReturns all SQL Credentials on the local default SQL Server instance\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaCredential -SqlInstance localhost, sql2016 -Name \u0027PowerShell Proxy\u0027\nReturns the SQL Credentials named \u0027PowerShell Proxy\u0027 for the local and sql2016 SQL Server instances\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaCredential -SqlInstance localhost, sql2016 -Identity ad\\powershell\nReturns the SQL Credentials for the account \u0027ad\\powershell\u0027 on the local and sql2016 SQL Server instances", "Syntax": "Get-DbaCredential [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [-SqlCredential \u003cPSCredential\u003e] [-Name \u003cString[]\u003e] [-ExcludeName \u003cString[]\u003e] [-Identity \u003cString[]\u003e] [-ExcludeIdentity \u003cString[]\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaCustomError", + "Name": "Get-DbaCustomError", "Description": "The Get-DbaCustomError command gets SQL Custom Error Message information for each instance(s) of SQL Server.", "Tags": [ "Error", "CustomError" ], + "Synopsis": "Gets SQL Custom Error Message information for each instance(s) of SQL Server.", + "Alias": "", + "Author": "Garry Bargsley (@gbargsley), http://blog.garrybargsley.com", + "CommandName": "Get-DbaCustomError", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Get-DbaCustomError", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaCustomError -SqlInstance localhost\nReturns all Custom Error Message(s) on the local default SQL Server instance\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaCustomError -SqlInstance localhost, sql2016\nReturns all Custom Error Message(s) for the local and sql2016 SQL Server instances", "Params": [ [ "SqlInstance", @@ -10912,18 +11060,19 @@ "False" ] ], - "Alias": "", - "Author": "Garry Bargsley (@gbargsley), http://blog.garrybargsley.com", - "Synopsis": "Gets SQL Custom Error Message information for each instance(s) of SQL Server.", - "Name": "Get-DbaCustomError", - "Links": "https://dbatools.io/Get-DbaCustomError", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaCustomError -SqlInstance localhost\nReturns all Custom Error Message(s) on the local default SQL Server instance\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaCustomError -SqlInstance localhost, sql2016\nReturns all Custom Error Message(s) for the local and sql2016 SQL Server instances", "Syntax": "Get-DbaCustomError [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [-SqlCredential \u003cPSCredential\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaDatabase", + "Name": "Get-DbaDatabase", "Description": "The Get-DbaDatabase command gets SQL database information for each database that is present on the target instance(s) of\nSQL Server. If the name of the database is provided, the command will return only the specific database information.", "Tags": "Database", + "Synopsis": "Gets SQL Database information for each database that is present on the target instance(s) of SQL Server.", + "Alias": "", + "Author": "Garry Bargsley (@gbargsley), http://blog.garrybargsley.com | Klaas Vandenberghe (@PowerDbaKlaas) | Simone Bizzotto ( @niphlod )", + "CommandName": "Get-DbaDatabase", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Get-DbaDatabase", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaDatabase -SqlInstance localhost\nReturns all databases on the local default SQL Server instance.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaDatabase -SqlInstance localhost -ExcludeUser\nReturns only the system databases on the local default SQL Server instance.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaDatabase -SqlInstance localhost -ExcludeSystem\nReturns only the user databases on the local default SQL Server instance.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003e\u0027localhost\u0027,\u0027sql2016\u0027 | Get-DbaDatabase\nReturns databases on multiple instances piped into the function.\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eGet-DbaDatabase -SqlInstance SQL1\\SQLExpress -RecoveryModel full,Simple\nReturns only the user databases in Full or Simple recovery model from SQL Server instance SQL1\\SQLExpress.\n-------------------------- EXAMPLE 6 --------------------------\nPS C:\\\u003eGet-DbaDatabase -SqlInstance SQL1\\SQLExpress -Status Normal\nReturns only the user databases with status \u0027normal\u0027 from SQL Server instance SQL1\\SQLExpress.\n-------------------------- EXAMPLE 7 --------------------------\nPS C:\\\u003eGet-DbaDatabase -SqlInstance SQL1\\SQLExpress -IncludeLastUsed\nReturns the databases from SQL Server instance SQL1\\SQLExpress and includes the last used information\r\nfrom the sys.dm_db_index_usage_stats DMV.\n-------------------------- EXAMPLE 8 --------------------------\nPS C:\\\u003eGet-DbaDatabase -SqlInstance SQL1\\SQLExpress,SQL2 -ExcludeDatabase model,master\nReturns all databases except master and model from SQL Server instances SQL1\\SQLExpress and SQL2.\n-------------------------- EXAMPLE 9 --------------------------\nPS C:\\\u003eGet-DbaDatabase -SqlInstance SQL1\\SQLExpress,SQL2 -Encrypted\nReturns only databases using TDE from SQL Server instances SQL1\\SQLExpress and SQL2.\n-------------------------- EXAMPLE 10 --------------------------\nPS C:\\\u003eGet-DbaDatabase -SqlInstance SQL1\\SQLExpress,SQL2 -Access ReadOnly\nReturns only read only databases from SQL Server instances SQL1\\SQLExpress and SQL2.\n-------------------------- EXAMPLE 11 --------------------------\nPS C:\\\u003eGet-DbaDatabase -SqlInstance SQL2,SQL3 -Database OneDB,OtherDB\nReturns databases \u0027OneDb\u0027 and \u0027OtherDB\u0027 from SQL Server instances SQL2 and SQL3 if databases by those names exist on those instances.", "Params": [ [ "SqlInstance", @@ -11070,21 +11219,22 @@ "False" ] ], - "Alias": "", - "Author": "Garry Bargsley (@gbargsley), http://blog.garrybargsley.com | Klaas Vandenberghe (@PowerDbaKlaas) | Simone Bizzotto ( @niphlod )", - "Synopsis": "Gets SQL Database information for each database that is present on the target instance(s) of SQL Server.", - "Name": "Get-DbaDatabase", - "Links": "https://dbatools.io/Get-DbaDatabase", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaDatabase -SqlInstance localhost\nReturns all databases on the local default SQL Server instance.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaDatabase -SqlInstance localhost -ExcludeUser\nReturns only the system databases on the local default SQL Server instance.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaDatabase -SqlInstance localhost -ExcludeSystem\nReturns only the user databases on the local default SQL Server instance.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003e\u0027localhost\u0027,\u0027sql2016\u0027 | Get-DbaDatabase\nReturns databases on multiple instances piped into the function.\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eGet-DbaDatabase -SqlInstance SQL1\\SQLExpress -RecoveryModel full,Simple\nReturns only the user databases in Full or Simple recovery model from SQL Server instance SQL1\\SQLExpress.\n-------------------------- EXAMPLE 6 --------------------------\nPS C:\\\u003eGet-DbaDatabase -SqlInstance SQL1\\SQLExpress -Status Normal\nReturns only the user databases with status \u0027normal\u0027 from SQL Server instance SQL1\\SQLExpress.\n-------------------------- EXAMPLE 7 --------------------------\nPS C:\\\u003eGet-DbaDatabase -SqlInstance SQL1\\SQLExpress -IncludeLastUsed\nReturns the databases from SQL Server instance SQL1\\SQLExpress and includes the last used information\r\nfrom the sys.dm_db_index_usage_stats DMV.\n-------------------------- EXAMPLE 8 --------------------------\nPS C:\\\u003eGet-DbaDatabase -SqlInstance SQL1\\SQLExpress,SQL2 -ExcludeDatabase model,master\nReturns all databases except master and model from SQL Server instances SQL1\\SQLExpress and SQL2.\n-------------------------- EXAMPLE 9 --------------------------\nPS C:\\\u003eGet-DbaDatabase -SqlInstance SQL1\\SQLExpress,SQL2 -Encrypted\nReturns only databases using TDE from SQL Server instances SQL1\\SQLExpress and SQL2.\n-------------------------- EXAMPLE 10 --------------------------\nPS C:\\\u003eGet-DbaDatabase -SqlInstance SQL1\\SQLExpress,SQL2 -Access ReadOnly\nReturns only read only databases from SQL Server instances SQL1\\SQLExpress and SQL2.\n-------------------------- EXAMPLE 11 --------------------------\nPS C:\\\u003eGet-DbaDatabase -SqlInstance SQL2,SQL3 -Database OneDB,OtherDB\nReturns databases \u0027OneDb\u0027 and \u0027OtherDB\u0027 from SQL Server instances SQL2 and SQL3 if databases by those names exist on those instances.", - "Syntax": "Get-DbaDatabase [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [-SqlCredential \u003cPSCredential\u003e] [-Database \u003cObject[]\u003e] [-ExcludeDatabase \u003cObject[]\u003e] [-ExcludeUser] [-ExcludeSystem] [-Owner \u003cString[]\u003e] [-Encrypted] [-Status \u003cString[]\u003e] [-Access \u003cString\u003e] [-RecoveryModel \u003cString[]\u003e] [-NoFullBackup] [-NoFullBackupSince \u003cDateTime\u003e] [-NoLogBackup] [-NoLogBackupSince \u003cDateTime\u003e] [-EnableException] [-IncludeLastUsed] [-OnlyAccessible] [\u003cCommonParameters\u003e]" + "Syntax": "Get-DbaDatabase [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [-SqlCredential \u003cPSCredential\u003e] [-Database \u003cString[]\u003e] [-ExcludeDatabase \u003cString[]\u003e] [-ExcludeUser] [-ExcludeSystem] [-Owner \u003cString[]\u003e] [-Encrypted] [-Status \u003cString[]\u003e] [-Access \u003cString\u003e] [-RecoveryModel \u003cString[]\u003e] [-NoFullBackup] [-NoFullBackupSince \u003cDateTime\u003e] [-NoLogBackup] [-NoLogBackupSince \u003cDateTime\u003e] [-EnableException] [-IncludeLastUsed] [-OnlyAccessible] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaDbAssembly", + "Name": "Get-DbaDbAssembly", "Description": "The Get-DbaDbAssembly command gets SQL Database Assembly information for each instance(s) of SQL Server.", "Tags": [ "Assembly", "Database" ], + "Synopsis": "Gets SQL Database Assembly information for each instance(s) of SQL Server.", + "Alias": "Get-DbaDatabaseAssembly", + "Author": "Garry Bargsley (@gbargsley), http://blog.garrybargsley.com", + "CommandName": "Get-DbaDbAssembly", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Get-DbaDbAssembly", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaDbAssembly -SqlInstance localhost\nReturns all Database Assembly on the local default SQL Server instance\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaDbAssembly -SqlInstance localhost, sql2016\nReturns all Database Assembly for the local and sql2016 SQL Server instances", "Params": [ [ "SqlInstance", @@ -11111,18 +11261,19 @@ "False" ] ], - "Alias": "Get-DbaDatabaseAssembly", - "Author": "Garry Bargsley (@gbargsley), http://blog.garrybargsley.com", - "Synopsis": "Gets SQL Database Assembly information for each instance(s) of SQL Server.", - "Name": "Get-DbaDbAssembly", - "Links": "https://dbatools.io/Get-DbaDbAssembly", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaDbAssembly -SqlInstance localhost\nReturns all Database Assembly on the local default SQL Server instance\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaDbAssembly -SqlInstance localhost, sql2016\nReturns all Database Assembly for the local and sql2016 SQL Server instances", "Syntax": "Get-DbaDbAssembly [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [-SqlCredential \u003cPSCredential\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaDbccHelp", + "Name": "Get-DbaDbccHelp", "Description": "Returns the results of DBCC HELP\n\nRead more:\n - https://docs.microsoft.com/en-us/sql/t-sql/database-console-commands/dbcc-help-transact-sql", "Tags": "DBCC", + "Synopsis": "Execution of Database Console Command DBCC HELP", + "Alias": "", + "Author": "Patrick Flynn (@sqllensman)", + "CommandName": "Get-DbaDbccHelp", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Get-DbaDbccUserOptions", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaDbccHelp -SqlInstance SQLInstance -Statement FREESYSTEMCACHE -Verbose | Format-List\nRuns the command DBCC HELP(FREESYSTEMCACHE) WITH NO_INFOMSGS against the SQL Server instance SQLInstance\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaDbccHelp -SqlInstance LensmanSB -Statement WritePage -IncludeUndocumented | Format-List\nSets TraeFlag 2588 on for session and then runs the command DBCC HELP(WritePage) WITH NO_INFOMSGS against the SQL Server instance SQLInstance", "Params": [ [ "SqlInstance", @@ -11165,21 +11316,22 @@ "False" ] ], - "Alias": "", - "Author": "Patrick Flynn (@sqllensman)", - "Synopsis": "Execution of Database Console Command DBCC HELP", - "Name": "Get-DbaDbccHelp", - "Links": "https://dbatools.io/Get-DbaDbccUserOptions", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaDbccHelp -SqlInstance SQLInstance -Statement FREESYSTEMCACHE -Verbose | Format-List\nRuns the command DBCC HELP(FREESYSTEMCACHE) WITH NO_INFOMSGS against the SQL Server instance SQLInstance\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaDbccHelp -SqlInstance LensmanSB -Statement WritePage -IncludeUndocumented | Format-List\nSets TraeFlag 2588 on for session and then runs the command DBCC HELP(WritePage) WITH NO_INFOMSGS against the SQL Server instance SQLInstance", "Syntax": "Get-DbaDbccHelp [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [[-Statement] \u003cString\u003e] [-IncludeUndocumented] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaDbccMemoryStatus", + "Name": "Get-DbaDbccMemoryStatus", "Description": "This command is used to run the DBCC MEMORYSTATUS comand and collect results in a single usable recordset\n\nReference:\n - https://blogs.msdn.microsoft.com/timchapman/2012/08/16/how-to-parse-dbcc-memorystatus-via-powershell/\n - https://support.microsoft.com/en-us/help/907877/how-to-use-the-dbcc-memorystatus-command-to-monitor-memory-usage-on-sq", "Tags": [ "DBCC", "Memory" ], + "Synopsis": "Gets the results of DBCC MEMORYSTATUS. Works on SQL Server 2000-2019.", + "Alias": "", + "Author": "Patrick Flynn (@sqllensman)", + "CommandName": "Get-DbaDbccMemoryStatus", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Get-DbaMemoryStatus", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaDbccMemoryStatus -SqlInstance sqlcluster, sqlserver2012\nGet output of DBCC MEMORYSTATUS for instances \"sqlcluster\" and \"sqlserver2012\". Returns results in a single recordset.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaCmsRegServer -SqlInstance sqlcluster | Get-DbaDbccMemoryStatus\nGet output of DBCC MEMORYSTATUS for all servers in Server Central Management Server", "Params": [ [ "SqlInstance", @@ -11206,18 +11358,19 @@ "False" ] ], - "Alias": "", - "Author": "Patrick Flynn (@sqllensman)", - "Synopsis": "Gets the results of DBCC MEMORYSTATUS. Works on SQL Server 2000-2019.", - "Name": "Get-DbaDbccMemoryStatus", - "Links": "https://dbatools.io/Get-DbaMemoryStatus", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaDbccMemoryStatus -SqlInstance sqlcluster, sqlserver2012\nGet output of DBCC MEMORYSTATUS for instances \"sqlcluster\" and \"sqlserver2012\". Returns results in a single recordset.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaCmsRegServer -SqlInstance sqlcluster | Get-DbaDbccMemoryStatus\nGet output of DBCC MEMORYSTATUS for all servers in Server Central Management Server", "Syntax": "Get-DbaDbccMemoryStatus [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaDbccProcCache", + "Name": "Get-DbaDbccProcCache", "Description": "Returns the results of DBCC PROCCACHE\n\nRead more:\n - https://docs.microsoft.com/en-us/sql/t-sql/database-console-commands/dbcc-proccache-transact-sql", "Tags": "DBCC", + "Synopsis": "Execution of Database Console Command DBCC PROCCACHE", + "Alias": "", + "Author": "Patrick Flynn (@sqllensman)", + "CommandName": "Get-DbaDbccProcCache", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Get-DbaDbccProcCache", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaDbccProcCache -SqlInstance Server1\nGet results of DBCC PROCCACHE for Instance Server1\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003e\u0027Sql1\u0027,\u0027Sql2/sqlexpress\u0027 | Get-DbaDbccProcCache\nGet results of DBCC PROCCACHE for Instances Sql1 and Sql2/sqlexpress\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003e$cred = Get-Credential sqladmin\nPS C:\\\u003e Get-DbaDbccProcCache -SqlInstance Server1 -SqlCredential $cred\nConnects using sqladmin credential and gets results of DBCC PROCCACHE for Instance Server1", "Params": [ [ "SqlInstance", @@ -11244,18 +11397,172 @@ "False" ] ], + "Syntax": "Get-DbaDbccProcCache [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [-EnableException] [\u003cCommonParameters\u003e]" + }, + { + "Name": "Get-DbaDbccSessionBuffer", + "Description": "Returns the results of DBCC INPUTBUFFER or DBCC OUTPUTBUFFER for input sessions\n\nRead more:\n - https://docs.microsoft.com/en-us/sql/t-sql/database-console-commands/dbcc-inputbuffer-transact-sql\n - https://docs.microsoft.com/en-us/sql/t-sql/database-console-commands/dbcc-outputbuffer-transact-sql", + "Tags": "DBCC", + "Synopsis": "Gets result of Database Console Command DBCC INPUTBUFFER or DBCC OUTPUTBUFFER", "Alias": "", "Author": "Patrick Flynn (@sqllensman)", - "Synopsis": "Execution of Database Console Command DBCC PROCCACHE", - "Name": "Get-DbaDbccProcCache", - "Links": "https://dbatools.io/Get-DbaDbccProcCache", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaDbccProcCache -SqlInstance Server1\nGet results of DBCC PROCCACHE for Instance Server1\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003e\u0027Sql1\u0027,\u0027Sql2/sqlexpress\u0027 | Get-DbaDbccProcCache\nGet results of DBCC PROCCACHE for Instances Sql1 and Sql2/sqlexpress\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003e$cred = Get-Credential sqladmin\nPS C:\\\u003e Get-DbaDbccProcCache -SqlInstance Server1 -SqlCredential $cred\nConnects using sqladmin credential and gets results of DBCC PROCCACHE for Instance Server1 using", - "Syntax": "Get-DbaDbccProcCache [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [-EnableException] [\u003cCommonParameters\u003e]" + "CommandName": "Get-DbaDbccSessionBuffer", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Get-DbaDbccSessionBuffer", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaDbccSessionBuffer -SqlInstance Server1 -Operation InputBuffer -SessionId 51\nGet results of DBCC INPUTBUFFER(51) for Instance Server1\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaDbccSessionBuffer -SqlInstance Server1 -Operation OutputBuffer -SessionId 51, 52\nGet results of DBCC OUTPUTBUFFER for SessionId\u0027s 51 and 52 for Instance Server1\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaDbccSessionBuffer -SqlInstance Server1 -Operation InputBuffer -SessionId 51 -RequestId 0\nGet results of DBCC INPUTBUFFER(51,0) for Instance Server1\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaDbccSessionBuffer -SqlInstance Server1 -Operation OutputBuffer -SessionId 51 -RequestId 0\nGet results of DBCC OUTPUTBUFFER(51,0) for Instance Server1\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003e\u0027Sql1\u0027,\u0027Sql2/sqlexpress\u0027 | Get-DbaDbccSessionBuffer -Operation InputBuffer -All\nGet results of DBCC INPUTBUFFER for all user sessions for the instances Sql1 and Sql2/sqlexpress\n-------------------------- EXAMPLE 6 --------------------------\nPS C:\\\u003e\u0027Sql1\u0027,\u0027Sql2/sqlexpress\u0027 | Get-DbaDbccSessionBuffer -Operation OutputBuffer -All\nGet results of DBCC OUTPUTBUFFER for all user sessions for the instances Sql1 and Sql2/sqlexpress\n-------------------------- EXAMPLE 7 --------------------------\nPS C:\\\u003e$cred = Get-Credential sqladmin\nPS C:\\\u003e Get-DbaDbccSessionBuffer -SqlInstance Server1 -SqlCredential $cred -Operation InputBuffer -SessionId 51 -RequestId 0\nConnects using sqladmin credential and gets results of DBCC INPUTBUFFER(51,0) for Instance Server1\n-------------------------- EXAMPLE 8 --------------------------\nPS C:\\\u003e$cred = Get-Credential sqladmin\nPS C:\\\u003e Get-DbaDbccSessionBuffer -SqlInstance Server1 -SqlCredential $cred -Operation OutputBuffer -SessionId 51 -RequestId 0\nConnects using sqladmin credential and gets results of DBCC OUTPUTBUFFER(51,0) for Instance Server1", + "Params": [ + [ + "SqlInstance", + "The target SQL Server instance or instances.", + "", + true, + "true (ByValue)", + "" + ], + [ + "SqlCredential", + "Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential)", + "", + false, + "false", + "" + ], + [ + "Operation", + "DBCC Operation to execute - either InputBuffer or OutputBuffer", + "", + false, + "false", + "InputBuffer" + ], + [ + "SessionId", + "The Session ID(s) to use to get current input or output buffer.", + "", + false, + "false", + "" + ], + [ + "RequestId", + "Is the exact request (batch) to search for within the current session\r\nThe following query returns request_id:\nSELECT request_id\r\nFROM sys.dm_exec_requests\r\nWHERE session_id = @@spid;", + "", + false, + "false", + "0" + ], + [ + "All", + "If this switch is enabled, results for all User Sessions will be retreived\r\nThis overides any values for SessionId or RequestId", + "", + false, + "false", + "False" + ], + [ + "EnableException", + "By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message.\r\nThis avoids overwhelming you with \"sea of red\" exceptions, but is inconvenient because it basically disables advanced scripting.\r\nUsing this switch turns this \"nice by default\" feature off and enables you to catch exceptions with your own try/catch.", + "", + false, + "false", + "False" + ] + ], + "Syntax": "Get-DbaDbccSessionBuffer [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [[-Operation] \u003cString\u003e] [[-SessionId] \u003cInt32[]\u003e] [[-RequestId] \u003cInt32\u003e] [-All] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaDbccUserOption", + "Name": "Get-DbaDbccStatistic", + "Description": "Executes the command DBCC SHOW_STATISTICS against defined objects and returns results\n\nReclaims space from dropped variable-length columns in tables or indexed views\n\nRead more:\n - https://docs.microsoft.com/en-us/sql/t-sql/database-console-commands/dbcc-cleantable-transact-sql", + "Tags": [ + "DBCC", + "Statistics" + ], + "Synopsis": "Execution of Database Console Command DBCC SHOW_STATISTICS", + "Alias": "", + "Author": "Patrick Flynn (@sqllensman)", + "CommandName": "Get-DbaDbccStatistic", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Get-DbaDbccStatistic", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaDbccStatistic -SqlInstance SQLServer2017\nWill run the statement SHOW_STATISTICS WITH STAT_HEADER against all Statistics on all User Tables or views for every accessible database on instance SQLServer2017. Connects using Windows \r\nAuthentication.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaDbccStatistic -SqlInstance SQLServer2017 -Database MyDb -Option DensityVector\nWill run the statement SHOW_STATISTICS WITH DENSITY_VECTOR against all Statistics on all User Tables or views for database MyDb on instance SQLServer2017. Connects using Windows Authentication.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003e$cred = Get-Credential sqladmin\nPS C:\\\u003e Get-DbaDbccStatistic -SqlInstance SQLServer2017 -SqlCredential $cred -Database MyDb -Object UserTable -Option Histogram\nWill run the statement SHOW_STATISTICS WITH HISTOGRAM against all Statistics on table UserTable for database MyDb on instance SQLServer2017. Connects using sqladmin credential.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003e\u0027Sql1\u0027,\u0027Sql2/sqlexpress\u0027 | Get-DbaDbccStatistic -SqlInstance SQLServer2017 -Database MyDb -Object \u0027dbo.UserTable\u0027 -Target MyStatistic -Option StatsStream\nRuns the statement SHOW_STATISTICS(\u0027dbo.UserTable\u0027, \u0027MyStatistic\u0027) WITH STATS_STREAM against database MyDb on instances Sql1 and Sql2/sqlexpress. Connects using Windows Authentication.", + "Params": [ + [ + "SqlInstance", + "The target SQL Server instance or instances.", + "", + true, + "true (ByValue)", + "" + ], + [ + "SqlCredential", + "Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential)", + "", + false, + "false", + "" + ], + [ + "Database", + "The database(s) to process - this list is auto-populated from the server. If unspecified, all databases will be processed.", + "", + false, + "false", + "" + ], + [ + "Object", + "The table or indexed view for which to display statistics information.\r\nAny two part object name should be formatted as \u0027Schema.ObjectName\u0027", + "", + false, + "false", + "" + ], + [ + "Target", + "Name of the index, statistics, or column for which to display statistics information.\r\nTarget can be enclosed in brackets, single quotes, double quotes, or no quotes", + "", + false, + "false", + "" + ], + [ + "Option", + "Used to limit the result sets returned by the statement to the specified option.\r\nOptions are \u0027StatHeader\u0027, \u0027DensityVector\u0027, \u0027Histogram\u0027, \u0027StatsStream\u0027\r\nDefault of StatHeader", + "", + false, + "false", + "StatHeader" + ], + [ + "NoInformationalMessages", + "Suppresses all informational messages.", + "", + false, + "false", + "False" + ], + [ + "EnableException", + "By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message.\r\nThis avoids overwhelming you with \"sea of red\" exceptions, but is inconvenient because it basically disables advanced scripting.\r\nUsing this switch turns this \"nice by default\" feature off and enables you to catch exceptions with your own try/catch.", + "", + false, + "false", + "False" + ] + ], + "Syntax": "Get-DbaDbccStatistic [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [[-Database] \u003cString[]\u003e] [[-Object] \u003cString\u003e] [[-Target] \u003cString\u003e] [[-Option] \u003cString\u003e] [-NoInformationalMessages] [-EnableException] [\u003cCommonParameters\u003e]" + }, + { + "Name": "Get-DbaDbccUserOption", "Description": "Returns the results of DBCC USEROPTIONS\n\nRead more:\n - https://docs.microsoft.com/en-us/sql/t-sql/database-console-commands/dbcc-useroptions-transact-sql", "Tags": "DBCC", + "Synopsis": "Execution of Database Console Command DBCC USEROPTIONS", + "Alias": "", + "Author": "Patrick Flynn (@sqllensman)", + "CommandName": "Get-DbaDbccUserOption", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Get-DbaDbccUserOption", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaDbccUserOption -SqlInstance Server1\nGet results of DBCC USEROPTIONS for Instance Server1\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003e\u0027Sql1\u0027,\u0027Sql2/sqlexpress\u0027 | Get-DbaDbccUserOption\nGet results of DBCC USEROPTIONS for Instances Sql1 and Sql2/sqlexpress\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003e$cred = Get-Credential sqladmin\nPS C:\\\u003e Get-DbaDbccUserOption -SqlInstance Server1 -SqlCredential $cred\nConnects using sqladmin credential and gets results of DBCC USEROPTIONS for Instance Server1\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaDbccUserOption -SqlInstance Server1 -Option ansi_nulls, ansi_warnings, datefirst\nGets results of DBCC USEROPTIONS for Instance Server1. Only display results for the options ansi_nulls, ansi_warnings, datefirst", "Params": [ [ "SqlInstance", @@ -11290,18 +11597,19 @@ "False" ] ], - "Alias": "", - "Author": "Patrick Flynn (@sqllensman)", - "Synopsis": "Execution of Database Console Command DBCC USEROPTIONS", - "Name": "Get-DbaDbccUserOption", - "Links": "https://dbatools.io/Get-DbaDbccUserOptions", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaDbccUserOptions -SqlInstance Server1\nGet results of DBCC USEROPTIONS for Instance Server1\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003e\u0027Sql1\u0027,\u0027Sql2/sqlexpress\u0027 | Get-DbaDbccUserOptions\nGet results of DBCC USEROPTIONS for Instances Sql1 and Sql2/sqlexpress\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003e$cred = Get-Credential sqladmin\nPS C:\\\u003e Get-DbaDbccUserOptions -SqlInstance Server1 -SqlCredential $cred\nConnects using sqladmin credential and gets results of DBCC USEROPTIONS for Instance Server1\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaDbccUserOptions -SqlInstance Server1 -Option ansi_nulls, ansi_warnings, datefirst\nGets results of DBCC USEROPTIONS for Instance Server1. Only display results for the options ansi_nulls, ansi_warnings, datefirst", "Syntax": "Get-DbaDbccUserOption [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [[-Option] \u003cString[]\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaDbCertificate", + "Name": "Get-DbaDbCertificate", "Description": "Gets database certificates", "Tags": "Certificate", + "Synopsis": "Gets database certificates", + "Alias": "Get-DbaDatabaseCertificate", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Get-DbaDbCertificate", + "Availability": "Windows, Linux, macOS", + "Links": null, + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaDbCertificate -SqlInstance sql2016\nGets all certificates\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaDbCertificate -SqlInstance Server1 -Database db1\nGets the certificate for the db1 database\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaDbCertificate -SqlInstance Server1 -Database db1 -Certificate cert1\nGets the cert1 certificate within the db1 database\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaDbCertificate -SqlInstance Server1 -Database db1 -Subject \u0027Availability Group Cert\u0027\nGets the cert1 certificate within the db1 database", "Params": [ [ "SqlInstance", @@ -11368,18 +11676,19 @@ "False" ] ], - "Alias": "Get-DbaDatabaseCertificate", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Gets database certificates", - "Name": "Get-DbaDbCertificate", - "Links": null, - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaDbCertificate -SqlInstance sql2016\nGets all certificates\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaDbCertificate -SqlInstance Server1 -Database db1\nGets the certificate for the db1 database\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaDbCertificate -SqlInstance Server1 -Database db1 -Certificate cert1\nGets the cert1 certificate within the db1 database\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaDbCertificate -SqlInstance Server1 -Database db1 -Subject \u0027Availability Group Cert\u0027\nGets the cert1 certificate within the db1 database", "Syntax": "Get-DbaDbCertificate [[-SqlInstance] \u003cDbaInstanceParameter[]\u003e] [[-SqlCredential] \u003cPSCredential\u003e] [[-Database] \u003cString[]\u003e] [[-ExcludeDatabase] \u003cString[]\u003e] [[-Certificate] \u003cObject[]\u003e] [[-Subject] \u003cString[]\u003e] [[-InputObject] \u003cDatabase[]\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaDbCheckConstraint", + "Name": "Get-DbaDbCheckConstraint", "Description": "Gets database Checks constraints.", "Tags": "Database", + "Synopsis": "Gets database Check constraints.", + "Alias": "", + "Author": "Claudio Silva (@ClaudioESSilva), https://claudioessilva.eu", + "CommandName": "Get-DbaDbCheckConstraint", + "Availability": "Windows, Linux, macOS", + "Links": null, + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaDbCheckConstraint -SqlInstance sql2016\nGets all database check constraints.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaDbCheckConstraint -SqlInstance Server1 -Database db1\nGets the check constraints for the db1 database.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaDbCheckConstraint -SqlInstance Server1 -ExcludeDatabase db1\nGets the check constraints for all databases except db1.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaDbCheckConstraint -SqlInstance Server1 -ExcludeSystemTable\nGets the check constraints for all databases that are not system objects.\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003e\u0027Sql1\u0027,\u0027Sql2/sqlexpress\u0027 | Get-DbaDbCheckConstraint\nGets the check constraints for the databases on Sql1 and Sql2/sqlexpress.", "Params": [ [ "SqlInstance", @@ -11430,21 +11739,22 @@ "False" ] ], - "Alias": "", - "Author": "Claudio Silva (@ClaudioESSilva), https://claudioessilva.eu", - "Synopsis": "Gets database Check constraints.", - "Name": "Get-DbaDbCheckConstraint", - "Links": null, - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaDbCheckConstraint -SqlInstance sql2016\nGets all database check constraints.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaDbCheckConstraint -SqlInstance Server1 -Database db1\nGets the check constraints for the db1 database.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaDbCheckConstraint -SqlInstance Server1 -ExcludeDatabase db1\nGets the check constraints for all databases except db1.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaDbCheckConstraint -SqlInstance Server1 -ExcludeSystemTable\nGets the check constraints for all databases that are not system objects.\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003e\u0027Sql1\u0027,\u0027Sql2/sqlexpress\u0027 | Get-DbaDbCheckConstraint\nGets the check constraints for the databases on Sql1 and Sql2/sqlexpress.", "Syntax": "Get-DbaDbCheckConstraint [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [[-Database] \u003cObject[]\u003e] [[-ExcludeDatabase] \u003cObject[]\u003e] [-ExcludeSystemTable] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaDbCompatibility", + "Name": "Get-DbaDbCompatibility", "Description": "Get the current database compatibility level for all databases on a server or list of databases passed in to the function.", "Tags": [ "Compatibility", "Database" ], + "Synopsis": "Displays the compatibility level for SQL Server databases.", + "Alias": "", + "Author": "Garry Bargsley, http://blog.garrybargsley.com/", + "CommandName": "Get-DbaDbCompatibility", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Get-DbaDbCompatibility", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaDbCompatibility -SqlInstance localhost\\sql2017\nDisplays database compatibility level for all user databases on server localhost\\sql2017\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaDbCompatibility -SqlInstance localhost\\sql2017 -Database Test\nDisplays database compatibility level for database Test on server localhost\\sql2017", "Params": [ [ "SqlInstance", @@ -11487,22 +11797,23 @@ "False" ] ], - "Alias": "", - "Author": "Garry Bargsley, http://blog.garrybargsley.com/", - "Synopsis": "Displays the compatibility level for SQL Server databases.", - "Name": "Get-DbaDbCompatibility", - "Links": "https://dbatools.io/Get-DbaDbCompatibility", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaDbCompatibility -SqlInstance localhost\\sql2017\nDisplays database compatibility level for all user databases on server localhost\\sql2017\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaDbCompatibility -SqlInstance localhost\\sql2017 -Database Test\nDisplays database compatibility level for database Test on server localhost\\sql2017", "Syntax": "Get-DbaDbCompatibility [[-SqlInstance] \u003cDbaInstanceParameter[]\u003e] [[-SqlCredential] \u003cPSCredential\u003e] [[-Database] \u003cString[]\u003e] [[-InputObject] \u003cDatabase[]\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaDbCompression", + "Name": "Get-DbaDbCompression", "Description": "This function gets the current size and compression for all objects in the specified database(s), if no database is specified it will return all objects in all user databases.", "Tags": [ "Compression", "Table", "Database" ], + "Synopsis": "Gets tables and indexes size and current compression settings.", + "Alias": "", + "Author": "Jess Pomfret (@jpomfret), jesspomfret.com", + "CommandName": "Get-DbaDbCompression", + "Availability": "Windows, Linux, macOS", + "Links": null, + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaDbCompression -SqlInstance localhost\nReturns objects size and current compression level for all user databases.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaDbCompression -SqlInstance localhost -Database TestDatabase\nReturns objects size and current compression level for objects within the TestDatabase database.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaDbCompression -SqlInstance localhost -ExcludeDatabase TestDatabases\nReturns objects size and current compression level for objects in all databases except the TestDatabase database.", "Params": [ [ "SqlInstance", @@ -11545,21 +11856,69 @@ "False" ] ], - "Alias": "", - "Author": "Jess Pomfret (@jpomfret), jesspomfret.com", - "Synopsis": "Gets tables and indexes size and current compression settings.", - "Name": "Get-DbaDbCompression", - "Links": null, - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaDbCompression -SqlInstance localhost\nReturns objects size and current compression level for all user databases.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaDbCompression -SqlInstance localhost -Database TestDatabase\nReturns objects size and current compression level for objects within the TestDatabase database.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaDbCompression -SqlInstance localhost -ExcludeDatabase TestDatabases\nReturns objects size and current compression level for objects in all databases except the TestDatabase database.", "Syntax": "Get-DbaDbCompression [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [[-Database] \u003cObject[]\u003e] [[-ExcludeDatabase] \u003cObject[]\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaDbEncryption", + "Name": "Get-DbaDbDbccOpenTran", + "Description": "Executes the command DBCC OPENTRAN against the requested databases\n\nDisplays information about the oldest active transaction and\nthe oldest distributed and nondistributed replicated transactions, if any,\nwithin the transaction log of the specified database\n\nRead more:\n - https://docs.microsoft.com/en-us/sql/t-sql/database-console-commands/dbcc-opentran-transact-sql", + "Tags": "DBCC", + "Synopsis": "Execution of Database Console Command DBCC OPENTRAN", + "Alias": "", + "Author": "Patrick Flynn (@sqllensman)", + "CommandName": "Get-DbaDbDbccOpenTran", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Get-DbaDbDbccOpenTran", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaDbDbccOpenTran -SqlInstance SQLServer2017\nConnects to instance SqlServer2017 using Windows Authentication and runs the command DBCC OPENTRAN WITH TABLERESULTS, NO_INFOMSGS against each database.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaDbDbccOpenTran -SqlInstance SQLServer2017 -Database CurrentDB\nConnects to instance SqlServer2017 using Windows Authentication and runs the command DBCC OPENTRAN(CurrentDB) WITH TABLERESULTS, NO_INFOMSGS against the CurrentDB database.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003e$cred = Get-Credential sqladmin\nPS C:\\\u003e \u0027Sql1\u0027,\u0027Sql2/sqlexpress\u0027 | Get-DbaDbDbccOpenTran -SqlCredential $cred\nConnects to instances Sql1 and Sql2/sqlexpress using sqladmin credential and runs the command DBCC OPENTRAN WITH TABLERESULTS, NO_INFOMSGS against each database.", + "Params": [ + [ + "SqlInstance", + "The target SQL Server instance or instances.", + "", + true, + "true (ByValue)", + "" + ], + [ + "SqlCredential", + "Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential)", + "", + false, + "false", + "" + ], + [ + "Database", + "The database(s) to process. If unspecified, all databases will be processed.\r\nThe Name or Id of a database can be specified\r\nDatabase names must comply with the rules for identifiers.", + "", + false, + "false", + "" + ], + [ + "EnableException", + "By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message.\r\nThis avoids overwhelming you with \"sea of red\" exceptions, but is inconvenient because it basically disables advanced scripting.\r\nUsing this switch turns this \"nice by default\" feature off and enables you to catch exceptions with your own try/catch.", + "", + false, + "false", + "False" + ] + ], + "Syntax": "Get-DbaDbDbccOpenTran [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [[-Database] \u003cString[]\u003e] [-EnableException] [\u003cCommonParameters\u003e]" + }, + { + "Name": "Get-DbaDbEncryption", "Description": "Shows if a database has Transparent Data Encryption (TDE), any certificates, asymmetric keys or symmetric keys with details for each.", "Tags": [ "Encryption", "Database" ], + "Synopsis": "Returns a summary of encryption used on databases passed to it.", + "Alias": "Get-DbaDatabaseEncryption", + "Author": "Stephen Bennett, https://sqlnotesfromtheunderground.wordpress.com/", + "CommandName": "Get-DbaDbEncryption", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Get-DbaDbEncryption", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaDbEncryption -SqlInstance DEV01\nList all encryption found on the instance by database\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaDbEncryption -SqlInstance DEV01 -Database MyDB\nList all encryption found for the MyDB database.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaDbEncryption -SqlInstance DEV01 -ExcludeDatabase MyDB\nList all encryption found for all databases except MyDB.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaDbEncryption -SqlInstance DEV01 -IncludeSystemDBs\nList all encryption found for all databases including the system databases.", "Params": [ [ "SqlInstance", @@ -11610,21 +11969,22 @@ "False" ] ], - "Alias": "Get-DbaDatabaseEncryption", - "Author": "Stephen Bennett, https://sqlnotesfromtheunderground.wordpress.com/", - "Synopsis": "Returns a summary of encryption used on databases passed to it.", - "Name": "Get-DbaDbEncryption", - "Links": "https://dbatools.io/Get-DbaDbEncryption", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaDbEncryption -SqlInstance DEV01\nList all encryption found on the instance by database\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaDbEncryption -SqlInstance DEV01 -Database MyDB\nList all encryption found for the MyDB database.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaDbEncryption -SqlInstance DEV01 -ExcludeDatabase MyDB\nList all encryption found for all databases except MyDB.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaDbEncryption -SqlInstance DEV01 -IncludeSystemDBs\nList all encryption found for all databases including the system databases.", "Syntax": "Get-DbaDbEncryption [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [[-Database] \u003cObject[]\u003e] [[-ExcludeDatabase] \u003cObject[]\u003e] [-IncludeSystemDBs] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaDbExtentDiff", + "Name": "Get-DbaDbExtentDiff", "Description": "This is only an implementation of the script created by Paul S. Randal to find what percentage of a database has changed since the last full backup.\nhttps://www.sqlskills.com/blogs/paul/new-script-how-much-of-the-database-has-changed-since-the-last-full-backup/", "Tags": [ "Backup", "Database" ], + "Synopsis": "What percentage of a database has changed since the last full backup", + "Alias": "", + "Author": "Viorel Ciucu, cviorel.com", + "CommandName": "Get-DbaDbExtentDiff", + "Availability": "Windows, Linux, macOS", + "Links": "http://dbatools.io/Get-DbaDbExtentDiff", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaDbExtentDiff -SqlInstance SQL2016 -Database DBA\nGet the changes for the DBA database.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003e$Cred = Get-Credential sqladmin\nPS C:\\\u003e Get-DbaDbExtentDiff -SqlInstance SQL2017N1, SQL2017N2, SQL2016 -Database DB01 -SqlCredential $Cred\nGet the changes for the DB01 database on multiple servers.", "Params": [ [ "SqlInstance", @@ -11667,18 +12027,19 @@ "False" ] ], - "Alias": "", - "Author": "Viorel Ciucu, cviorel.com", - "Synopsis": "What percentage of a database has changed since the last full backup", - "Name": "Get-DbaDbExtentDiff", - "Links": "http://dbatools.io/Get-DbaDbExtentDiff", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaDbExtentDiff -SqlInstance SQL2016 -Database DBA\nGet the changes for the DBA database.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003e$Cred = Get-Credential sqladmin\nPS C:\\\u003e Get-DbaDbExtentDiff -SqlInstance SQL2017N1, SQL2017N2, SQL2016 -Database DB01 -SqlCredential $Cred\nGet the changes for the DB01 database on multiple servers.", "Syntax": "Get-DbaDbExtentDiff [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [[-Database] \u003cObject[]\u003e] [[-ExcludeDatabase] \u003cObject[]\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaDbFeatureUsage", + "Name": "Get-DbaDbFeatureUsage", "Description": "Shows features that are enabled in the database but not supported on all editions of SQL Server.\n\nBasically checks for Enterprise feature usage.\n\nThis feature must be removed before the database can be migrated to all available editions of SQL Server.", "Tags": "Deprecated", + "Synopsis": "Shows features that are enabled in the database but not supported on all editions of SQL Server. Basically checks for Enterprise feature usage.", + "Alias": "", + "Author": "Brandon Abshire, netnerds.net", + "CommandName": "Get-DbaDbFeatureUsage", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Get-DbaDbFeatureUsage", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaDatabase -SqlInstance sql2008 -Database testdb, db2 | Get-DbaDbFeatureUsage\nShows features that are enabled in the testdb and db2 databases but\r\nnot supported on the all the editions of SQL Server.", "Params": [ [ "SqlInstance", @@ -11729,24 +12090,25 @@ "False" ] ], - "Alias": "", - "Author": "Brandon Abshire, netnerds.net", - "Synopsis": "Shows features that are enabled in the database but not supported on all editions of SQL Server. Basically checks for Enterprise feature usage.", - "Name": "Get-DbaDbFeatureUsage", - "Links": "https://dbatools.io/Get-DbaDbFeatureUsage", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaDatabase -SqlInstance sql2008 -Database testdb, db2 | Get-DbaDbFeatureUsage\nShows features that are enabled in the testdb and db2 databases but\r\nnot supported on the all the editions of SQL Server.", "Syntax": "Get-DbaDbFeatureUsage [[-SqlInstance] \u003cDbaInstanceParameter[]\u003e] [[-SqlCredential] \u003cPSCredential\u003e] [[-Database] \u003cString[]\u003e] [[-ExcludeDatabase] \u003cString[]\u003e] [[-InputObject] \u003cDatabase[]\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaDbFile", + "Name": "Get-DbaDbFile", "Description": "Returns detailed information about database files. Does not use SMO - SMO causes enumeration and this command avoids that.", "Tags": "Database", + "Synopsis": "Returns detailed information about database files.", + "Alias": "Get-DbaDatabaseFile", + "Author": "Stuart Moore (@napalmgram), stuart-moore.com", + "CommandName": "Get-DbaDbFile", + "Availability": "Windows, Linux, macOS", + "Links": null, + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaDbFile -SqlInstance sql2016\nWill return an object containing all file groups and their contained files for every database on the sql2016 SQL Server instance\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaDbFile -SqlInstance sql2016 -Database Impromptu\nWill return an object containing all file groups and their contained files for the Impromptu Database on the sql2016 SQL Server instance\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaDbFile -SqlInstance sql2016 -Database Impromptu, Trading\nWill return an object containing all file groups and their contained files for the Impromptu and Trading databases on the sql2016 SQL Server instance\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaDatabase -SqlInstance sql2016 -Database Impromptu, Trading | Get-DbaDbFile\nWill accept piped input from Get-DbaDatabase and return an object containing all file groups and their contained files for the Impromptu and Trading databases on the sql2016 SQL Server instance", "Params": [ [ "SqlInstance", "The target SQL Server instance or instances", "", - true, + false, "true (ByValue)", "" ], @@ -11779,34 +12141,35 @@ "A piped collection of database objects", "", false, - "false", + "true (ByValue)", "" ], [ "EnableException", "By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message.\r\nThis avoids overwhelming you with \"sea of red\" exceptions, but is inconvenient because it basically disables advanced scripting.\r\nUsing this switch turns this \"nice by default\" feature off and enables you to catch exceptions with your own try/catch.", - "Silent", + "", false, "false", "False" ] ], - "Alias": "Get-DbaDatabaseFile", - "Author": "Stuart Moore (@napalmgram), stuart-moore.com", - "Synopsis": "Returns detailed information about database files.", - "Name": "Get-DbaDbFile", - "Links": null, - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaDbFile -SqlInstance sql2016\nWill return an object containing all file groups and their contained files for every database on the sql2016 SQL Server instance\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaDbFile -SqlInstance sql2016 -Database Impromptu\nWill return an object containing all file groups and their contained files for the Impromptu Database on the sql2016 SQL Server instance\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaDbFile -SqlInstance sql2016 -Database Impromptu, Trading\nWill return an object containing all file groups and their contained files for the Impromptu and Trading databases on the sql2016 SQL Server instance", - "Syntax": "Get-DbaDbFile [-SqlCredential \u003cPSCredential\u003e] [-Database \u003cObject[]\u003e] [-ExcludeDatabase \u003cObject[]\u003e] [-InputObject \u003cObject[]\u003e] [-EnableException] [\u003cCommonParameters\u003e]\nGet-DbaDbFile -SqlInstance \u003cDbaInstanceParameter[]\u003e [-SqlCredential \u003cPSCredential\u003e] [-Database \u003cObject[]\u003e] [-ExcludeDatabase \u003cObject[]\u003e] [-InputObject \u003cObject[]\u003e] [-EnableException] [\u003cCommonParameters\u003e]" + "Syntax": "Get-DbaDbFile [[-SqlInstance] \u003cDbaInstanceParameter[]\u003e] [[-SqlCredential] \u003cPSCredential\u003e] [[-Database] \u003cObject[]\u003e] [[-ExcludeDatabase] \u003cObject[]\u003e] [[-InputObject] \u003cDatabase[]\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaDbForeignKey", + "Name": "Get-DbaDbForeignKey", "Description": "Gets database Foreign Keys.", "Tags": [ "Database", "ForeignKey", "Table" ], + "Synopsis": "Gets database Foreign Keys.", + "Alias": "", + "Author": "Claudio Silva (@ClaudioESSilva), https://claudioessilva.eu", + "CommandName": "Get-DbaDbForeignKey", + "Availability": "Windows, Linux, macOS", + "Links": null, + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaDbForeignKey -SqlInstance sql2016\nGets all database Foreign Keys.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaDbForeignKey -SqlInstance Server1 -Database db1\nGets the Foreign Keys for the db1 database.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaDbForeignKey -SqlInstance Server1 -ExcludeDatabase db1\nGets the Foreign Keys for all databases except db1.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaDbForeignKey -SqlInstance Server1 -ExcludeSystemTable\nGets the Foreign Keys from all tables that are not system objects from all databases.\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003e\u0027Sql1\u0027,\u0027Sql2/sqlexpress\u0027 | Get-DbaDbForeignKey\nGets the Foreign Keys for the databases on Sql1 and Sql2/sqlexpress.", "Params": [ [ "SqlInstance", @@ -11857,18 +12220,90 @@ "False" ] ], - "Alias": "", - "Author": "Claudio Silva (@ClaudioESSilva), https://claudioessilva.eu", - "Synopsis": "Gets database Foreign Keys.", - "Name": "Get-DbaDbForeignKey", - "Links": null, - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaDbForeignKey -SqlInstance sql2016\nGets all database Foreign Keys.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaDbForeignKey -SqlInstance Server1 -Database db1\nGets the Foreign Keys for the db1 database.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaDbForeignKey -SqlInstance Server1 -ExcludeDatabase db1\nGets the Foreign Keys for all databases except db1.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaDbForeignKey -SqlInstance Server1 -ExcludeSystemTable\nGets the Foreign Keys from all tables that are not system objects from all databases.\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003e\u0027Sql1\u0027,\u0027Sql2/sqlexpress\u0027 | Get-DbaDbForeignKey\nGets the Foreign Keys for the databases on Sql1 and Sql2/sqlexpress.", "Syntax": "Get-DbaDbForeignKey [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [[-Database] \u003cObject[]\u003e] [[-ExcludeDatabase] \u003cObject[]\u003e] [-ExcludeSystemTable] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaDbLogShipError", + "Name": "Get-DbaDbIdentity", + "Description": "Use the command DBCC CHECKIDENT with NORESEED option to checks the current identity value of a table and return results\n\nRead more:\n - https://docs.microsoft.com/en-us/sql/t-sql/database-console-commands/dbcc-checkident-transact-sql", + "Tags": "DBCC", + "Synopsis": "Checks the current identity value via DBCC CHECKIDENT with NORESEED optuin", + "Alias": "", + "Author": "Patrick Flynn (@sqllensman)", + "CommandName": "Get-DbaDbIdentity", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Get-DbaDbIdentity", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaDbIdentity -SqlInstance SQLServer2017 -Database AdventureWorks2014 -Table \u0027Production.ScrapReason\u0027\nConnects to AdventureWorks2014 on instance SqlServer2017 using Windows Authentication and runs the command DBCC CHECKIDENT(\u0027Production.ScrapReason\u0027, NORESEED) to return the current identity value.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003e$cred = Get-Credential sqladmin\nPS C:\\\u003e \u0027Sql1\u0027,\u0027Sql2/sqlexpress\u0027 | Get-DbaDbIdentity -SqlCredential $cred -Database AdventureWorks2014 -Table \u0027Production.ScrapReason\u0027\nConnects to AdventureWorks2014 on instances Sql1 and Sql2/sqlexpress using sqladmin credential and runs the command DBCC CHECKIDENT(\u0027Production.ScrapReason\u0027, NORESEED) to return the current identity \r\nvalue.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003e$query = \"Select Quotename(Schema_Name(t.schema_id)) +\u0027.\u0027 + QuoteName(t.name) as TableName from sys.columns c INNER JOIN sys.tables t on t.object_id = c.object_id WHERE is_identity = 1 and \r\nis_memory_optimized = 0\"\nPS C:\\\u003e $IdentityTables = Invoke-DbaQuery -SqlInstance SQLServer2017 -Database AdventureWorks2014 -Query $query -As SingleValue\r\nPS C:\\\u003e Get-DbaDbIdentity -SqlInstance SQLServer2017 -Database AdventureWorks2014 -Table $IdentityTables\nChecks the current identity value for all non memory optimized tables with an Identity in the AdventureWorks2014 database on the SQLServer2017 instance.", + "Params": [ + [ + "SqlInstance", + "The target SQL Server instance or instances.", + "", + true, + "true (ByValue)", + "" + ], + [ + "SqlCredential", + "Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential)", + "", + false, + "false", + "" + ], + [ + "Database", + "The database(s) to process - this list is auto-populated from the server. If unspecified, all databases will be processed.", + "", + false, + "false", + "" + ], + [ + "Table", + "The table(s) for which to check the current identity value.", + "", + false, + "false", + "" + ], + [ + "EnableException", + "By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message.\r\nThis avoids overwhelming you with \"sea of red\" exceptions, but is inconvenient because it basically disables advanced scripting.\r\nUsing this switch turns this \"nice by default\" feature off and enables you to catch exceptions with your own try/catch.", + "", + false, + "false", + "False" + ], + [ + "WhatIf", + "Shows what would happen if the cmdlet runs. The cmdlet is not run.", + "wi", + false, + "false", + "" + ], + [ + "Confirm", + "Prompts you for confirmation before running the cmdlet.", + "cf", + false, + "false", + "" + ] + ], + "Syntax": "Get-DbaDbIdentity [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [[-Database] \u003cString[]\u003e] [[-Table] \u003cString[]\u003e] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" + }, + { + "Name": "Get-DbaDbLogShipError", "Description": "When your log shipping fails it\u0027s sometimes hard to see why is fails.\nUsing this function you\u0027ll be able to find out what went wrong in a short amount of time.", "Tags": "LogShipping", + "Synopsis": "Get-DbaDbLogShipError returns all the log shipping errors that occurred", + "Alias": "Get-DbaLogShippingError", + "Author": "Sander Stad (@sqlstad), sqlstad.nl", + "CommandName": "Get-DbaDbLogShipError", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Get-DbaDbLogShipError", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaDbLogShipError -SqlInstance sql1\nGet all the log shipping errors that occurred\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaDbLogShipError -SqlInstance sql1 -Action Backup\nGet the errors that have something to do with the backup of the databases\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaDbLogShipError -SqlInstance sql1 -Secondary\nGet the errors that occurred on the secondary instance.\r\nThis will return the copy of the restore actions because those only occur on the secondary instance\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaDbLogShipError -SqlInstance sql1 -DateTimeFrom \"01/05/2018\"\nGet the errors that have occurred from \"01/05/2018\". This can also be of format \"yyyy-MM-dd\"\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eGet-DbaDbLogShipError -SqlInstance sql1 -Secondary -DateTimeFrom \"01/05/2018\" -DateTimeTo \"2018-01-07\"\nGet the errors that have occurred between \"01/05/2018\" and \"01/07/2018\".\r\nSee that is doesn\u0027t matter how the date is represented.", "Params": [ [ "SqlInstance", @@ -11951,22 +12386,23 @@ "False" ] ], - "Alias": "Get-DbaLogShippingError", - "Author": "Sander Stad (@sqlstad), sqlstad.nl", - "Synopsis": "Get-DbaDbLogShipError returns all the log shipping errors that occurred", - "Name": "Get-DbaDbLogShipError", - "Links": "https://dbatools.io/Get-DbaDbLogShipError", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaDbLogShipError -SqlInstance sql1\nGet all the log shipping errors that occurred\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaDbLogShipError -SqlInstance sql1 -Action Backup\nGet the errors that have something to do with the backup of the databases\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaDbLogShipError -SqlInstance sql1 -Secondary\nGet the errors that occurred on the secondary instance.\r\nThis will return the copy of the restore actions because those only occur on the secondary instance\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaDbLogShipError -SqlInstance sql1 -DateTimeFrom \"01/05/2018\"\nGet the errors that have occurred from \"01/05/2018\". This can also be of format \"yyyy-MM-dd\"\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eGet-DbaDbLogShipError -SqlInstance sql1 -Secondary -DateTimeFrom \"01/05/2018\" -DateTimeTo \"2018-01-07\"\nGet the errors that have occurred between \"01/05/2018\" and \"01/07/2018\".\r\nSee that is doesn\u0027t matter how the date is represented.", "Syntax": "Get-DbaDbLogShipError [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [[-Database] \u003cString[]\u003e] [[-ExcludeDatabase] \u003cString[]\u003e] [[-Action] \u003cString[]\u003e] [[-DateTimeFrom] \u003cDateTime\u003e] [[-DateTimeTo] \u003cDateTime\u003e] [-Primary] [-Secondary] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaDbMail", + "Name": "Get-DbaDbMail", "Description": "Gets the database mail from SQL Server", "Tags": [ "DatabaseMail", "DBMail", "Mail" ], + "Synopsis": "Gets the database mail from SQL Server", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Get-DbaDbMail", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Get-DbaDbMail", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaDbMail -SqlInstance sql01\\sharepoint\nReturns the db mail server object on sql01\\sharepoint\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaDbMail -SqlInstance sql01\\sharepoint | Select *\nReturns the db mail server object on sql01\\sharepoint then return a bunch more columns\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003e$servers = \"sql2014\",\"sql2016\", \"sqlcluster\\sharepoint\"\nPS C:\\\u003e $servers | Get-DbaDbMail\nReturns the db mail server object for \"sql2014\",\"sql2016\" and \"sqlcluster\\sharepoint\"", "Params": [ [ "SqlInstance", @@ -11993,22 +12429,23 @@ "False" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Gets the database mail from SQL Server", - "Name": "Get-DbaDbMail", - "Links": "https://dbatools.io/Get-DbaDbMail", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaDbMail -SqlInstance sql01\\sharepoint\nReturns the db mail server object on sql01\\sharepoint\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaDbMail -SqlInstance sql01\\sharepoint | Select *\nReturns the db mail server object on sql01\\sharepoint then return a bunch more columns\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003e$servers = \"sql2014\",\"sql2016\", \"sqlcluster\\sharepoint\"\nPS C:\\\u003e $servers | Get-DbaDbMail\nReturns the db mail server object for \"sql2014\",\"sql2016\" and \"sqlcluster\\sharepoint\"", "Syntax": "Get-DbaDbMail [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaDbMailAccount", + "Name": "Get-DbaDbMailAccount", "Description": "Gets database mail accounts from SQL Server", "Tags": [ "DatabaseMail", "DbMail", "Mail" ], + "Synopsis": "Gets database mail accounts from SQL Server", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Get-DbaDbMailAccount", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Get-DbaDbMailAccount", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaDbMailAccount -SqlInstance sql01\\sharepoint\nReturns Database Mail accounts on sql01\\sharepoint\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaDbMailAccount -SqlInstance sql01\\sharepoint -Account \u0027The DBA Team\u0027\nReturns The DBA Team Database Mail account from sql01\\sharepoint\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaDbMailAccount -SqlInstance sql01\\sharepoint | Select *\nReturns the Database Mail accounts on sql01\\sharepoint then return a bunch more columns\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003e$servers = \"sql2014\",\"sql2016\", \"sqlcluster\\sharepoint\"\nPS C:\\\u003e $servers | Get-DbaDbMail | Get-DbaDbMailAccount\nReturns the Database Mail accounts for \"sql2014\",\"sql2016\" and \"sqlcluster\\sharepoint\"", "Params": [ [ "SqlInstance", @@ -12059,22 +12496,23 @@ "False" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Gets database mail accounts from SQL Server", - "Name": "Get-DbaDbMailAccount", - "Links": "https://dbatools.io/Get-DbaDbMailAccount", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaDbMailAccount -SqlInstance sql01\\sharepoint\nReturns Database Mail accounts on sql01\\sharepoint\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaDbMailAccount -SqlInstance sql01\\sharepoint -Account \u0027The DBA Team\u0027\nReturns The DBA Team Database Mail account from sql01\\sharepoint\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaDbMailAccount -SqlInstance sql01\\sharepoint | Select *\nReturns the Database Mail accounts on sql01\\sharepoint then return a bunch more columns\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003e$servers = \"sql2014\",\"sql2016\", \"sqlcluster\\sharepoint\"\nPS C:\\\u003e $servers | Get-DbaDbMail | Get-DbaDbMailAccount\nReturns the Database Mail accounts for \"sql2014\",\"sql2016\" and \"sqlcluster\\sharepoint\"", "Syntax": "Get-DbaDbMailAccount [[-SqlInstance] \u003cDbaInstanceParameter[]\u003e] [[-SqlCredential] \u003cPSCredential\u003e] [[-Account] \u003cString[]\u003e] [[-ExcludeAccount] \u003cString[]\u003e] [[-InputObject] \u003cSqlMail[]\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaDbMailConfig", + "Name": "Get-DbaDbMailConfig", "Description": "Gets database mail configs from SQL Server", "Tags": [ "DatabaseMail", "DBMail", "Mail" ], + "Synopsis": "Gets database mail configs from SQL Server", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Get-DbaDbMailConfig", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Get-DbaDbMailConfig", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaDbMailConfig -SqlInstance sql01\\sharepoint\nReturns DBMail configs on sql01\\sharepoint\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaDbMailConfig -SqlInstance sql01\\sharepoint -Name ProhibitedExtensions\nReturns the ProhibitedExtensions configuration on sql01\\sharepoint\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaDbMailConfig -SqlInstance sql01\\sharepoint | Select *\nReturns the DBMail configs on sql01\\sharepoint then return a bunch more columns\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003e$servers = \"sql2014\",\"sql2016\", \"sqlcluster\\sharepoint\"\nPS C:\\\u003e $servers | Get-DbaDbMail | Get-DbaDbMailConfig\nReturns the DBMail configs for \"sql2014\",\"sql2016\" and \"sqlcluster\\sharepoint\"", "Params": [ [ "SqlInstance", @@ -12117,22 +12555,23 @@ "False" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Gets database mail configs from SQL Server", - "Name": "Get-DbaDbMailConfig", - "Links": "https://dbatools.io/Get-DbaDbMailConfig", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaDbMailConfig -SqlInstance sql01\\sharepoint\nReturns DBMail configs on sql01\\sharepoint\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaDbMailConfig -SqlInstance sql01\\sharepoint -Name ProhibitedExtensions\nReturns the ProhibitedExtensions configuration on sql01\\sharepoint\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaDbMailConfig -SqlInstance sql01\\sharepoint | Select *\nReturns the DBMail configs on sql01\\sharepoint then return a bunch more columns\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003e$servers = \"sql2014\",\"sql2016\", \"sqlcluster\\sharepoint\"\nPS C:\\\u003e $servers | Get-DbaDbMail | Get-DbaDbMailConfig\nReturns the DBMail configs for \"sql2014\",\"sql2016\" and \"sqlcluster\\sharepoint\"", "Syntax": "Get-DbaDbMailConfig [[-SqlInstance] \u003cDbaInstanceParameter[]\u003e] [[-SqlCredential] \u003cPSCredential\u003e] [[-Name] \u003cString[]\u003e] [[-InputObject] \u003cSqlMail[]\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaDbMailHistory", + "Name": "Get-DbaDbMailHistory", "Description": "Gets the history of mail sent from a SQL instance", "Tags": [ "DatabaseMail", "DBMail", "Mail" ], + "Synopsis": "Gets the history of mail sent from a SQL instance", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Get-DbaDbMailHistory", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Get-DbaDbMailHistory", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaDbMailHistory -SqlInstance sql01\\sharepoint\nReturns the entire DBMail history on sql01\\sharepoint\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaDbMailHistory -SqlInstance sql01\\sharepoint | Select *\nReturns the entire DBMail history on sql01\\sharepoint then return a bunch more columns\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003e$servers = \"sql2014\",\"sql2016\", \"sqlcluster\\sharepoint\"\nPS C:\\\u003e $servers | Get-DbaDbMailHistory\nReturns the all DBMail history for \"sql2014\",\"sql2016\" and \"sqlcluster\\sharepoint\"", "Params": [ [ "SqlInstance", @@ -12175,22 +12614,23 @@ "False" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Gets the history of mail sent from a SQL instance", - "Name": "Get-DbaDbMailHistory", - "Links": "https://dbatools.io/Get-DbaDbMailHistory", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaDbMailHistory -SqlInstance sql01\\sharepoint\nReturns the entire DBMail history on sql01\\sharepoint\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaDbMailHistory -SqlInstance sql01\\sharepoint | Select *\nReturns the entire DBMail history on sql01\\sharepoint then return a bunch more columns\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003e$servers = \"sql2014\",\"sql2016\", \"sqlcluster\\sharepoint\"\nPS C:\\\u003e $servers | Get-DbaDbMailHistory\nReturns the all DBMail history for \"sql2014\",\"sql2016\" and \"sqlcluster\\sharepoint\"", "Syntax": "Get-DbaDbMailHistory [[-SqlInstance] \u003cDbaInstanceParameter[]\u003e] [[-SqlCredential] \u003cPSCredential\u003e] [[-Since] \u003cDateTime\u003e] [[-Status] \u003cString\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaDbMailLog", + "Name": "Get-DbaDbMailLog", "Description": "Gets the DBMail log from a SQL instance", "Tags": [ "DatabaseMail", "DBMail", "Mail" ], + "Synopsis": "Gets the DBMail log from a SQL instance", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Get-DbaDbMailLog", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Get-DbaDbMailLog", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaDbMailLog -SqlInstance sql01\\sharepoint\nReturns the entire DBMail log on sql01\\sharepoint\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaDbMailLog -SqlInstance sql01\\sharepoint | Select *\nReturns the entire DBMail log on sql01\\sharepoint, includes all returned information.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003e$servers = \"sql2014\",\"sql2016\", \"sqlcluster\\sharepoint\"\nPS C:\\\u003e $servers | Get-DbaDbMailLog -Type Error, Information\nReturns only the Error and Information DBMail log for \"sql2014\",\"sql2016\" and \"sqlcluster\\sharepoint\"", "Params": [ [ "SqlInstance", @@ -12233,22 +12673,23 @@ "False" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Gets the DBMail log from a SQL instance", - "Name": "Get-DbaDbMailLog", - "Links": "https://dbatools.io/Get-DbaDbMailLog", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaDbMailLog -SqlInstance sql01\\sharepoint\nReturns the entire DBMail log on sql01\\sharepoint\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaDbMailLog -SqlInstance sql01\\sharepoint | Select *\nReturns the entire DBMail log on sql01\\sharepoint, includes all returned information.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003e$servers = \"sql2014\",\"sql2016\", \"sqlcluster\\sharepoint\"\nPS C:\\\u003e $servers | Get-DbaDbMailLog -Type Error, Information\nReturns only the Error and Information DBMail log for \"sql2014\",\"sql2016\" and \"sqlcluster\\sharepoint\"", "Syntax": "Get-DbaDbMailLog [[-SqlInstance] \u003cDbaInstanceParameter[]\u003e] [[-SqlCredential] \u003cPSCredential\u003e] [[-Since] \u003cDateTime\u003e] [[-Type] \u003cString[]\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaDbMailProfile", + "Name": "Get-DbaDbMailProfile", "Description": "Gets database mail profiles from SQL Server", "Tags": [ "DatabaseMail", "DBMail", "Mail" ], + "Synopsis": "Gets database mail profiles from SQL Server", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Get-DbaDbMailProfile", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Get-DbaDbMailProfile", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaDbMailProfile -SqlInstance sql01\\sharepoint\nReturns DBMail profiles on sql01\\sharepoint\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaDbMailProfile -SqlInstance sql01\\sharepoint -Profile \u0027The DBA Team\u0027\nReturns The DBA Team DBMail profile from sql01\\sharepoint\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaDbMailProfile -SqlInstance sql01\\sharepoint | Select *\nReturns the DBMail profiles on sql01\\sharepoint then return a bunch more columns\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003e$servers = \"sql2014\",\"sql2016\", \"sqlcluster\\sharepoint\"\nPS C:\\\u003e $servers | Get-DbaDbMail | Get-DbaDbMailProfile\nReturns the DBMail profiles for \"sql2014\",\"sql2016\" and \"sqlcluster\\sharepoint\"", "Params": [ [ "SqlInstance", @@ -12299,22 +12740,23 @@ "False" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Gets database mail profiles from SQL Server", - "Name": "Get-DbaDbMailProfile", - "Links": "https://dbatools.io/Get-DbaDbMailProfile", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaDbMailProfile -SqlInstance sql01\\sharepoint\nReturns DBMail profiles on sql01\\sharepoint\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaDbMailProfile -SqlInstance sql01\\sharepoint -Profile \u0027The DBA Team\u0027\nReturns The DBA Team DBMail profile from sql01\\sharepoint\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaDbMailProfile -SqlInstance sql01\\sharepoint | Select *\nReturns the DBMail profiles on sql01\\sharepoint then return a bunch more columns\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003e$servers = \"sql2014\",\"sql2016\", \"sqlcluster\\sharepoint\"\nPS C:\\\u003e $servers | Get-DbaDbMail | Get-DbaDbMailProfile\nReturns the DBMail profiles for \"sql2014\",\"sql2016\" and \"sqlcluster\\sharepoint\"", "Syntax": "Get-DbaDbMailProfile [[-SqlInstance] \u003cDbaInstanceParameter[]\u003e] [[-SqlCredential] \u003cPSCredential\u003e] [[-Profile] \u003cString[]\u003e] [[-ExcludeProfile] \u003cString[]\u003e] [[-InputObject] \u003cSqlMail[]\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaDbMailServer", + "Name": "Get-DbaDbMailServer", "Description": "Gets database mail servers from SQL Server", "Tags": [ "DatabaseMail", "DBMail", "Mail" ], + "Synopsis": "Gets database mail servers from SQL Server", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Get-DbaDbMailServer", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Get-DbaDbMailServer", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaDbMailServer -SqlInstance sql01\\sharepoint\nReturns all DBMail servers on sql01\\sharepoint\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaDbMailServer -SqlInstance sql01\\sharepoint -Server DbaTeam\nReturns The DBA Team DBMail server from sql01\\sharepoint\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaDbMailServer -SqlInstance sql01\\sharepoint | Select *\nReturns the DBMail servers on sql01\\sharepoint then return a bunch more columns\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003e$servers = \"sql2014\",\"sql2016\", \"sqlcluster\\sharepoint\"\nPS C:\\\u003e $servers | Get-DbaDbMail | Get-DbaDbMailServer\nReturns the DBMail servers for \"sql2014\",\"sql2016\" and \"sqlcluster\\sharepoint\"", "Params": [ [ "SqlInstance", @@ -12365,21 +12807,22 @@ "False" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Gets database mail servers from SQL Server", - "Name": "Get-DbaDbMailServer", - "Links": "https://dbatools.io/Get-DbaDbMailServer", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaDbMailServer -SqlInstance sql01\\sharepoint\nReturns all DBMail servers on sql01\\sharepoint\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaDbMailServer -SqlInstance sql01\\sharepoint -Server DbaTeam\nReturns The DBA Team DBMail server from sql01\\sharepoint\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaDbMailServer -SqlInstance sql01\\sharepoint | Select *\nReturns the DBMail servers on sql01\\sharepoint then return a bunch more columns\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003e$servers = \"sql2014\",\"sql2016\", \"sqlcluster\\sharepoint\"\nPS C:\\\u003e $servers | Get-DbaDbMail | Get-DbaDbMailServer\nReturns the DBMail servers for \"sql2014\",\"sql2016\" and \"sqlcluster\\sharepoint\"", "Syntax": "Get-DbaDbMailServer [[-SqlInstance] \u003cDbaInstanceParameter[]\u003e] [[-SqlCredential] \u003cPSCredential\u003e] [[-Server] \u003cString[]\u003e] [[-Account] \u003cString[]\u003e] [[-InputObject] \u003cSqlMail[]\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaDbMasterKey", + "Name": "Get-DbaDbMasterKey", "Description": "Gets specified database master key", "Tags": [ "Certificate", "Database" ], + "Synopsis": "Gets specified database master key", + "Alias": "Get-DbaDatabaseMasterKey", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Get-DbaDbMasterKey", + "Availability": "Windows, Linux, macOS", + "Links": null, + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaDbMasterKey -SqlInstance sql2016\nGets all master database keys\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaDbMasterKey -SqlInstance Server1 -Database db1\nGets the master key for the db1 database", "Params": [ [ "SqlInstance", @@ -12430,21 +12873,22 @@ "False" ] ], - "Alias": "Get-DbaDatabaseMasterKey", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Gets specified database master key", - "Name": "Get-DbaDbMasterKey", - "Links": null, - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaDbMasterKey -SqlInstance sql2016\nGets all master database keys\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaDbMasterKey -SqlInstance Server1 -Database db1\nGets the master key for the db1 database", "Syntax": "Get-DbaDbMasterKey [[-SqlInstance] \u003cDbaInstanceParameter[]\u003e] [[-SqlCredential] \u003cPSCredential\u003e] [[-Database] \u003cString[]\u003e] [[-ExcludeDatabase] \u003cString[]\u003e] [[-InputObject] \u003cDatabase[]\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaDbMemoryUsage", + "Name": "Get-DbaDbMemoryUsage", "Description": "This command can be utilized to determine which databases on a given instance are consuming buffer pool memory.\n\nThis command is based on query provided by Aaron Bertrand.\nReference: https://www.mssqltips.com/sqlservertip/2393/determine-sql-server-memory-use-by-database-and-object/", "Tags": [ "Memory", "Database" ], + "Synopsis": "Determine buffer pool usage by database.", + "Alias": "", + "Author": "Shawn Melton (@wsmelton), https://wsmelton.github.io", + "CommandName": "Get-DbaDbMemoryUsage", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Get-DbaDbMemoryUsage", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaDbMemoryUsage -SqlInstance sqlserver2014a\nReturns the buffer pool consumption for all user databases\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaDbMemoryUsage -SqlInstance sqlserver2014a -IncludeSystemDb\nReturns the buffer pool consumption for all user databases and system databases\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaDbMemoryUsage -SqlInstance sql1 -IncludeSystemDb -Database tempdb\nReturns the buffer pool consumption for tempdb database only\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaDbMemoryUsage -SqlInstance sql2 -IncludeSystemDb -Exclude \u0027master\u0027,\u0027model\u0027,\u0027msdb\u0027,\u0027ResourceDb\u0027\nReturns the buffer pool consumption for all user databases and tempdb database", "Params": [ [ "SqlInstance", @@ -12495,21 +12939,22 @@ "False" ] ], - "Alias": "", - "Author": "Shawn Melton (@wsmelton), https://wsmelton.github.io", - "Synopsis": "Determine buffer pool usage by database.", - "Name": "Get-DbaDbMemoryUsage", - "Links": "https://dbatools.io/Get-DbaDbMemoryUsage", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaDbMemoryUsage -SqlInstance sqlserver2014a\nReturns the buffer pool consumption for all user databases\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaDbMemoryUsage -SqlInstance sqlserver2014a -IncludeSystemDb\nReturns the buffer pool consumption for all user databases and system databases\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaDbMemoryUsage -SqlInstance sql1 -IncludeSystemDb -Database tempdb\nReturns the buffer pool consumption for tempdb database only\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaDbMemoryUsage -SqlInstance sql2 -IncludeSystemDb -Exclude \u0027master\u0027,\u0027model\u0027,\u0027msdb\u0027,\u0027ResourceDb\u0027\nReturns the buffer pool consumption for all user databases and tempdb database", "Syntax": "Get-DbaDbMemoryUsage [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [-SqlCredential \u003cPSCredential\u003e] [-Database \u003cObject[]\u003e] [-ExcludeDatabase \u003cObject[]\u003e] [-IncludeSystemDb] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaDbMirror", + "Name": "Get-DbaDbMirror", "Description": "Gets properties of database mirrors and mirror witnesses.", "Tags": [ "Mirror", "HA" ], + "Synopsis": "Gets properties of database mirrors and mirror witnesses.", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Get-DbaDbMirror", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Get-DbaDbMirror", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaDbMirror -SqlInstance localhost\nGets properties of database mirrors and mirror witnesses on localhost\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaDbMirror -SqlInstance localhost, sql2016\nGets properties of database mirrors and mirror witnesses on localhost and sql2016 SQL Server instances", "Params": [ [ "SqlInstance", @@ -12536,21 +12981,22 @@ "False" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Gets properties of database mirrors and mirror witnesses.", - "Name": "Get-DbaDbMirror", - "Links": "https://dbatools.io/Get-DbaDbMirror", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaDbMirror -SqlInstance localhost\nGets properties of database mirrors and mirror witnesses on localhost\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaDbMirror -SqlInstance localhost, sql2016\nGets properties of database mirrors and mirror witnesses on localhost and sql2016 SQL Server instances", "Syntax": "Get-DbaDbMirror [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaDbMirrorMonitor", + "Name": "Get-DbaDbMirrorMonitor", "Description": "Returns status rows for a monitored database from the status table in which database mirroring monitoring history is stored and allows you to choose whether the procedure obtains the latest status beforehand.\n\nBasically executes sp_dbmmonitorresults.", "Tags": [ "Mirror", "HA" ], + "Synopsis": "Returns status rows for a monitored database from the status table in which database mirroring monitoring history is stored and allows you to choose whether the procedure obtains the latest status beforehand.", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Get-DbaDbMirrorMonitor", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Get-DbaDbMirrorMonitor", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaDbMirrorMonitor -SqlInstance sql2008, sql2012\nReturns last two hours\u0027 worth of status rows for a monitored database from the status table on sql2008 and sql2012.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaDbMirrorMonitor -SqlInstance sql2005 -LimitResults LastDay -Update\nUpdates monitor stats then returns the last 24 hours worth of status rows for a monitored database from the status table on sql2008 and sql2012.", "Params": [ [ "SqlInstance", @@ -12609,21 +13055,83 @@ "False" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Returns status rows for a monitored database from the status table in which database mirroring monitoring history is stored and allows you to choose whether the procedure obtains the latest status beforehand.", - "Name": "Get-DbaDbMirrorMonitor", - "Links": "https://dbatools.io/Get-DbaDbMirrorMonitor", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaDbMirrorMonitor -SqlInstance sql2008, sql2012\nReturns last two hours\u0027 worth of status rows for a monitored database from the status table on sql2008 and sql2012.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaDbMirrorMonitor -SqlInstance sql2005 -LimitResults LastDay -Update\nUpdates monitor stats then returns the last 24 hours worth of status rows for a monitored database from the status table on sql2008 and sql2012.", "Syntax": "Get-DbaDbMirrorMonitor [[-SqlInstance] \u003cDbaInstanceParameter[]\u003e] [[-SqlCredential] \u003cPSCredential\u003e] [[-Database] \u003cString[]\u003e] [[-InputObject] \u003cDatabase[]\u003e] [-Update] [[-LimitResults] \u003cString\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaDbPageInfo", + "Name": "Get-DbaDbOrphanUser", + "Description": "An orphan user is defined by a user that does not have their matching login. (Login property = \"\").", + "Tags": [ + "Orphan", + "Database", + "User", + "Security", + "Login" + ], + "Synopsis": "Get orphaned users.", + "Alias": "Get-DbaOrphanUser", + "Author": "Claudio Silva (@ClaudioESSilva) | Garry Bargsley (@gbargsley) | Simone Bizzotto (@niphlod)", + "CommandName": "Get-DbaDbOrphanUser", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Get-DbaDbOrphanUser", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaDbOrphanUser -SqlInstance localhost\\sql2016\nFinds all orphan users without matching Logins in all databases present on server \u0027localhost\\sql2016\u0027.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaDbOrphanUser -SqlInstance localhost\\sql2016 -SqlCredential $cred\nFinds all orphan users without matching Logins in all databases present on server \u0027localhost\\sql2016\u0027. SQL Server authentication will be used in connecting to the server.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaDbOrphanUser -SqlInstance localhost\\sql2016 -Database db1\nFinds orphan users without matching Logins in the db1 database present on server \u0027localhost\\sql2016\u0027.", + "Params": [ + [ + "SqlInstance", + "The target SQL Server instance or instances.", + "ServerInstance,SqlServer", + true, + "true (ByValue)", + "" + ], + [ + "SqlCredential", + "Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential)", + "", + false, + "false", + "" + ], + [ + "Database", + "Specifies the database(s) to process. Options for this list are auto-populated from the server. If unspecified, all databases will be processed.", + "Databases", + false, + "false", + "" + ], + [ + "ExcludeDatabase", + "Specifies the database(s) to exclude from processing. Options for this list are auto-populated from the server", + "", + false, + "false", + "" + ], + [ + "EnableException", + "By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message.\r\nThis avoids overwhelming you with \"sea of red\" exceptions, but is inconvenient because it basically disables advanced scripting.\r\nUsing this switch turns this \"nice by default\" feature off and enables you to catch exceptions with your own try/catch.", + "Silent", + false, + "false", + "False" + ] + ], + "Syntax": "Get-DbaDbOrphanUser [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [[-Database] \u003cObject[]\u003e] [[-ExcludeDatabase] \u003cObject[]\u003e] [-EnableException] [\u003cCommonParameters\u003e]" + }, + { + "Name": "Get-DbaDbPageInfo", "Description": "Get-DbaDbPageInfo is able to return information about the pages in a database.\nIt\u0027s possible to return the information for multiple databases and filter on specific databases, schemas and tables.", "Tags": [ "Database", "Page" ], + "Synopsis": "Get-DbaDbPageInfo will return page information for a database", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Get-DbaDbPageInfo", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Get-DbaDbPageInfo", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eet-DbaDbPageInfo -SqlInstance sql2017\nReturns page information for all databases on sql2017\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaDbPageInfo -SqlInstance sql2017, sql2016 -Database testdb\nReturns page information for the testdb on sql2017 and sql2016\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003e$servers | Get-DbaDatabase -Database testdb | Get-DbaDbPageInfo\nReturns page information for the testdb on all $servers", "Params": [ [ "SqlInstance", @@ -12682,18 +13190,19 @@ "False" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Get-DbaDbPageInfo will return page information for a database", - "Name": "Get-DbaDbPageInfo", - "Links": "https://dbatools.io/Get-DbaDbPageInfo", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eet-DbaDbPageInfo -SqlInstance sql2017\nReturns page information for all databases on sql2017\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaDbPageInfo -SqlInstance sql2017, sql2016 -Database testdb\nReturns page information for the testdb on sql2017 and sql2016\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003e$servers | Get-DbaDatabase -Database testdb | Get-DbaDbPageInfo\nReturns page information for the testdb on all $servers", "Syntax": "Get-DbaDbPageInfo [[-SqlInstance] \u003cDbaInstanceParameter[]\u003e] [[-SqlCredential] \u003cPSCredential\u003e] [[-Database] \u003cString[]\u003e] [[-Schema] \u003cString[]\u003e] [[-Table] \u003cString[]\u003e] [[-InputObject] \u003cDatabase[]\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaDbPartitionFunction", + "Name": "Get-DbaDbPartitionFunction", "Description": "Gets database Partition Functions", "Tags": "Database", + "Synopsis": "Gets database Partition Functions", + "Alias": "Get-DbaDatabasePartitionFunction", + "Author": "Klaas Vandenberghe ( @PowerDbaKlaas )", + "CommandName": "Get-DbaDbPartitionFunction", + "Availability": "Windows, Linux, macOS", + "Links": null, + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaDbPartitionFunction -SqlInstance sql2016\nGets all database Partition Functions\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaDbPartitionFunction -SqlInstance Server1 -Database db1\nGets the Partition Functions for the db1 database\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaDbPartitionFunction -SqlInstance Server1 -ExcludeDatabase db1\nGets the Partition Functions for all databases except db1\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003e\u0027Sql1\u0027,\u0027Sql2/sqlexpress\u0027 | Get-DbaDbPartitionFunction\nGets the Partition Functions for the databases on Sql1 and Sql2/sqlexpress", "Params": [ [ "SqlInstance", @@ -12736,18 +13245,19 @@ "False" ] ], - "Alias": "Get-DbaDatabasePartitionFunction", - "Author": "Klaas Vandenberghe ( @PowerDbaKlaas )", - "Synopsis": "Gets database Partition Functions", - "Name": "Get-DbaDbPartitionFunction", - "Links": null, - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaDbPartitionFunction -SqlInstance sql2016\nGets all database Partition Functions\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaDbPartitionFunction -SqlInstance Server1 -Database db1\nGets the Partition Functions for the db1 database\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaDbPartitionFunction -SqlInstance Server1 -ExcludeDatabase db1\nGets the Partition Functions for all databases except db1\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003e\u0027Sql1\u0027,\u0027Sql2/sqlexpress\u0027 | Get-DbaDbPartitionFunction\nGets the Partition Functions for the databases on Sql1 and Sql2/sqlexpress", "Syntax": "Get-DbaDbPartitionFunction [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [[-Database] \u003cObject[]\u003e] [[-ExcludeDatabase] \u003cObject[]\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaDbPartitionScheme", + "Name": "Get-DbaDbPartitionScheme", "Description": "Gets database Partition Schemes", "Tags": "Database", + "Synopsis": "Gets database Partition Schemes", + "Alias": "Get-DbaDatabasePartitionScheme", + "Author": "Klaas Vandenberghe (@PowerDbaKlaas)", + "CommandName": "Get-DbaDbPartitionScheme", + "Availability": "Windows, Linux, macOS", + "Links": null, + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaDbPartitionScheme -SqlInstance sql2016\nGets all database Partition Schemes\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaDbPartitionScheme -SqlInstance Server1 -Database db1\nGets the Partition Schemes for the db1 database\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaDbPartitionScheme -SqlInstance Server1 -ExcludeDatabase db1\nGets the Partition Schemes for all databases except db1\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003e\u0027Sql1\u0027,\u0027Sql2/sqlexpress\u0027 | Get-DbaDbPartitionScheme\nGets the Partition Schemes for the databases on Sql1 and Sql2/sqlexpress", "Params": [ [ "SqlInstance", @@ -12790,18 +13300,19 @@ "False" ] ], - "Alias": "Get-DbaDatabasePartitionScheme", - "Author": "Klaas Vandenberghe (@PowerDbaKlaas)", - "Synopsis": "Gets database Partition Schemes", - "Name": "Get-DbaDbPartitionScheme", - "Links": null, - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaDbPartitionScheme -SqlInstance sql2016\nGets all database Partition Schemes\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaDbPartitionScheme -SqlInstance Server1 -Database db1\nGets the Partition Schemes for the db1 database\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaDbPartitionScheme -SqlInstance Server1 -ExcludeDatabase db1\nGets the Partition Schemes for all databases except db1\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003e\u0027Sql1\u0027,\u0027Sql2/sqlexpress\u0027 | Get-DbaDbPartitionScheme\nGets the Partition Schemes for the databases on Sql1 and Sql2/sqlexpress", "Syntax": "Get-DbaDbPartitionScheme [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [[-Database] \u003cObject[]\u003e] [[-ExcludeDatabase] \u003cObject[]\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaDbQueryStoreOption", + "Name": "Get-DbaDbQueryStoreOption", "Description": "Retrieves and returns the Query Store configuration for every database that has the Query Store feature enabled.", "Tags": "QueryStore", + "Synopsis": "Get the Query Store configuration for Query Store enabled databases.", + "Alias": "Get-DbaDbQueryStoreOptions,Get-DbaQueryStoreConfig", + "Author": "Enrico van de Laar (@evdlaar) | Klaas Vandenberghe (@PowerDBAKlaas)", + "CommandName": "Get-DbaDbQueryStoreOption", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Get-DbaQueryStoreOptions", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaDbQueryStoreOption -SqlInstance ServerA\\sql\nReturns Query Store configuration settings for every database on the ServerA\\sql instance.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaDbQueryStoreOption -SqlInstance ServerA\\sql | Where-Object {$_.ActualState -eq \"ReadWrite\"}\nReturns the Query Store configuration for all databases on ServerA\\sql where the Query Store feature is in Read/Write mode.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaDbQueryStoreOption -SqlInstance localhost | format-table -AutoSize -Wrap\nReturns Query Store configuration settings for every database on the ServerA\\sql instance inside a table format.", "Params": [ [ "SqlInstance", @@ -12844,16 +13355,10 @@ "False" ] ], - "Alias": "Get-DbaDbQueryStoreOptions,Get-DbaQueryStoreConfig", - "Author": "Enrico van de Laar (@evdlaar) | Klaas Vandenberghe (@PowerDBAKlaas)", - "Synopsis": "Get the Query Store configuration for Query Store enabled databases.", - "Name": "Get-DbaDbQueryStoreOption", - "Links": "https://dbatools.io/Get-DbaQueryStoreOptions", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaDbQueryStoreOption -SqlInstance ServerA\\sql\nReturns Query Store configuration settings for every database on the ServerA\\sql instance.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaDbQueryStoreOption -SqlInstance ServerA\\sql | Where-Object {$_.ActualState -eq \"ReadWrite\"}\nReturns the Query Store configuration for all databases on ServerA\\sql where the Query Store feature is in Read/Write mode.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaDbQueryStoreOption -SqlInstance localhost | format-table -AutoSize -Wrap\nReturns Query Store configuration settings for every database on the ServerA\\sql instance inside a table format.", "Syntax": "Get-DbaDbQueryStoreOption [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [[-Database] \u003cObject[]\u003e] [[-ExcludeDatabase] \u003cObject[]\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaDbRecoveryModel", + "Name": "Get-DbaDbRecoveryModel", "Description": "Get-DbaDbRecoveryModel displays the Recovery Model for all databases. This is the default, you can filter using -Database, -ExcludeDatabase, -RecoveryModel", "Tags": [ "Recovery", @@ -12863,6 +13368,13 @@ "Bulk", "BulkLogged" ], + "Synopsis": "Get-DbaDbRecoveryModel displays the Recovery Model.", + "Alias": "", + "Author": "Viorel Ciucu (@viorelciucu), https://www.cviorel.com", + "CommandName": "Get-DbaDbRecoveryModel", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Get-DbaDbRecoveryModel", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaDbRecoveryModel -SqlInstance sql2014 -RecoveryModel BulkLogged -Verbose\nGets all databases on SQL Server instance sql2014 having RecoveryModel set to BulkLogged.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaDbRecoveryModel -SqlInstance sql2014 -Database TestDB\nGets recovery model information for TestDB. If TestDB does not exist on the instance nothing is returned.", "Params": [ [ "SqlInstance", @@ -12913,22 +13425,23 @@ "False" ] ], - "Alias": "", - "Author": "Viorel Ciucu (@viorelciucu), https://www.cviorel.com", - "Synopsis": "Get-DbaDbRecoveryModel displays the Recovery Model.", - "Name": "Get-DbaDbRecoveryModel", - "Links": "https://dbatools.io/Get-DbaDbRecoveryModel", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaDbRecoveryModel -SqlInstance sql2014 -RecoveryModel BulkLogged -Verbose\nGets all databases on SQL Server instance sql2014 having RecoveryModel set to BulkLogged.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaDbRecoveryModel -SqlInstance sql2014 -Database TestDB\nGets recovery model information for TestDB. If TestDB does not exist on the instance nothing is returned.", "Syntax": "Get-DbaDbRecoveryModel [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [[-RecoveryModel] \u003cString[]\u003e] [[-Database] \u003cObject[]\u003e] [[-ExcludeDatabase] \u003cObject[]\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaDbRestoreHistory", + "Name": "Get-DbaDbRestoreHistory", "Description": "By default, this command will return the server name, database, username, restore type, date, from file and to files.\n\nThanks to https://www.mssqltips.com/SqlInstancetip/1724/when-was-the-last-time-your-sql-server-database-was-restored/ for the query and https://sqlstudies.com/2016/07/27/when-was-this-database-restored/ for the idea.", "Tags": [ "DisasterRecovery", "Backup", "Restore" ], + "Synopsis": "Returns restore history details for databases on a SQL Server.", + "Alias": "Get-DbaRestoreHistory", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Get-DbaDbRestoreHistory", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Get-DbaDbRestoreHistory", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaDbRestoreHistory -SqlInstance sql2016\nReturns server name, database, username, restore type, date for all restored databases on sql2016.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaDbRestoreHistory -SqlInstance sql2016 -Database db1, db2 -Since \u00272016-07-01 10:47:00\u0027\nReturns restore information only for databases db1 and db2 on sql2016 since July 1, 2016 at 10:47 AM.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaDbRestoreHistory -SqlInstance sql2014, sql2016 -Exclude db1\nReturns restore information for all databases except db1 on sql2014 and sql2016.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003e$cred = Get-Credential sqladmin\nPS C:\\\u003e Get-DbaDbRestoreHistory -SqlInstance sql2014 -Database AdventureWorks2014, pubs -SqlCredential $cred | Format-Table\nReturns database restore information for AdventureWorks2014 and pubs database on sql2014, connects using SQL Authentication via sqladmin account. Formats the data as a table.\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eGet-DbaCmsRegServer -SqlInstance sql2016 | Get-DbaDbRestoreHistory\nReturns database restore information for every database on every server listed in the Central Management Server on sql2016.", "Params": [ [ "SqlInstance", @@ -12995,16 +13508,10 @@ "False" ] ], - "Alias": "Get-DbaRestoreHistory", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Returns restore history details for databases on a SQL Server.", - "Name": "Get-DbaDbRestoreHistory", - "Links": "https://dbatools.io/Get-DbaDbRestoreHistory", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaDbRestoreHistory -SqlInstance sql2016\nReturns server name, database, username, restore type, date for all restored databases on sql2016.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaDbRestoreHistory -SqlInstance sql2016 -Database db1, db2 -Since \u00272016-07-01 10:47:00\u0027\nReturns restore information only for databases db1 and db2 on sql2016 since July 1, 2016 at 10:47 AM.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaDbRestoreHistory -SqlInstance sql2014, sql2016 -Exclude db1\nReturns restore information for all databases except db1 on sql2014 and sql2016.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003e$cred = Get-Credential sqladmin\nPS C:\\\u003e Get-DbaDbRestoreHistory -SqlInstance sql2014 -Database AdventureWorks2014, pubs -SqlCredential $cred | Format-Table\nReturns database restore information for AdventureWorks2014 and pubs database on sql2014, connects using SQL Authentication via sqladmin account. Formats the data as a table.\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eGet-DbaCmsRegServer -SqlInstance sql2016 | Get-DbaDbRestoreHistory\nReturns database restore information for every database on every server listed in the Central Management Server on sql2016.", "Syntax": "Get-DbaDbRestoreHistory [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [[-Database] \u003cObject[]\u003e] [[-ExcludeDatabase] \u003cObject[]\u003e] [[-Since] \u003cDateTime\u003e] [-Force] [-Last] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaDbRoleMember", + "Name": "Get-DbaDbRoleMember", "Description": "The Get-DbaDbRoleMember returns connected SMO object for database roles for each instance(s) of SQL Server.", "Tags": [ "Role", @@ -13012,6 +13519,13 @@ "Security", "Login" ], + "Synopsis": "Get members of database roles for each instance(s) of SQL Server.", + "Alias": "Get-DbaRoleMember", + "Author": "Klaas Vandenberghe (@PowerDBAKlaas)", + "CommandName": "Get-DbaDbRoleMember", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Get-DbaDbRoleMember", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaDbRoleMember -SqlInstance localhost\nReturns all members of all database roles on the local default SQL Server instance\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaDbRoleMember -SqlInstance localhost, sql2016\nReturns all members of all database roles on the local and sql2016 SQL Server instances\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003e$servers = Get-Content C:\\servers.txt\nPS C:\\\u003e $servers | Get-DbaDbRoleMember\nReturns all members of all database roles for every server in C:\\servers.txt\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaDbRoleMember -SqlInstance localhost -Database msdb\nReturns non-system members of all roles in the msdb database on localhost.\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eGet-DbaDbRoleMember -SqlInstance localhost -Database msdb -IncludeSystemUser -ExcludeFixedRole\nReturns all members of non-fixed roles in the msdb database on localhost.\n-------------------------- EXAMPLE 6 --------------------------\nPS C:\\\u003eGet-DbaDbRoleMember -SqlInstance localhost -Database msdb -Role \u0027db_owner\u0027\nReturns all members of the db_owner role in the msdb database on localhost.", "Params": [ [ "SqlInstance", @@ -13086,18 +13600,19 @@ "False" ] ], - "Alias": "Get-DbaRoleMember", - "Author": "Klaas Vandenberghe (@PowerDBAKlaas)", - "Synopsis": "Get members of database roles for each instance(s) of SQL Server.", - "Name": "Get-DbaDbRoleMember", - "Links": "https://dbatools.io/Get-DbaDbRoleMember", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaDbRoleMember -SqlInstance localhost\nReturns all members of all database roles on the local default SQL Server instance\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaDbRoleMember -SqlInstance localhost, sql2016\nReturns all members of all database roles on the local and sql2016 SQL Server instances\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003e$servers = Get-Content C:\\servers.txt\nPS C:\\\u003e $servers | Get-DbaDbRoleMember\nReturns all members of all database roles for every server in C:\\servers.txt\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaDbRoleMember -SqlInstance localhost -Database msdb\nReturns non-system members of all roles in the msdb database on localhost.\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eGet-DbaDbRoleMember -SqlInstance localhost -Database msdb -IncludeSystemUser -ExcludeFixedRole\nReturns all members of non-fixed roles in the msdb database on localhost.\n-------------------------- EXAMPLE 6 --------------------------\nPS C:\\\u003eGet-DbaDbRoleMember -SqlInstance localhost -Database msdb -Role \u0027db_owner\u0027\nReturns all members of the db_owner role in the msdb database on localhost.", "Syntax": "Get-DbaDbRoleMember [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [-SqlCredential \u003cPSCredential\u003e] [-Database \u003cString[]\u003e] [-ExcludeDatabase \u003cString[]\u003e] [-Role \u003cString[]\u003e] [-ExcludeRole \u003cString[]\u003e] [-ExcludeFixedRole] [-IncludeSystemUser] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaDbSharePoint", + "Name": "Get-DbaDbSharePoint", "Description": "Returns databases that are part of a SharePoint Farm, as found in the SharePoint Configuration database.\n\nBy default, this command checks SharePoint_Config. To use an alternate database, use the ConfigDatabase parameter.", "Tags": "SharePoint", + "Synopsis": "Returns databases that are part of a SharePoint Farm.", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Get-DbaDbSharePoint", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Get-DbaDbSharePoint", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaDbSharePoint -SqlInstance sqlcluster\nReturns databases that are part of a SharePoint Farm, as found in SharePoint_Config on sqlcluster\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaDatabase -SqlInstance sqlcluster -Database SharePoint_Config_2016 | Get-DbaDbSharePoint\nReturns databases that are part of a SharePoint Farm, as found in SharePoint_Config_2016 on sqlcluster", "Params": [ [ "SqlInstance", @@ -13140,18 +13655,19 @@ "False" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Returns databases that are part of a SharePoint Farm.", - "Name": "Get-DbaDbSharePoint", - "Links": "https://dbatools.io/Get-DbaDbSharePoint", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaDbSharePoint -SqlInstance sqlcluster\nReturns databases that are part of a SharePoint Farm, as found in SharePoint_Config on sqlcluster\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaDatabase -SqlInstance sqlcluster -Database SharePoint_Config_2016 | Get-DbaDbSharePoint\nReturns databases that are part of a SharePoint Farm, as found in SharePoint_Config_2016 on sqlcluster", "Syntax": "Get-DbaDbSharePoint [[-SqlInstance] \u003cDbaInstanceParameter[]\u003e] [[-SqlCredential] \u003cPSCredential\u003e] [[-ConfigDatabase] \u003cString[]\u003e] [[-InputObject] \u003cDatabase[]\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaDbSnapshot", + "Name": "Get-DbaDbSnapshot", "Description": "Retrieves the list of database snapshot available, along with their base (the db they are the snapshot of) and creation time", "Tags": "Snapshot", + "Synopsis": "Get database snapshots with details", + "Alias": "Get-DbaDatabaseSnapshot", + "Author": "Simone Bizzotto (@niphlod)", + "CommandName": "Get-DbaDbSnapshot", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Get-DbaDbSnapshot", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaDbSnapshot -SqlInstance sqlserver2014a\nReturns a custom object displaying Server, Database, DatabaseCreated, SnapshotOf, SizeMB, DatabaseCreated\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaDbSnapshot -SqlInstance sqlserver2014a -Database HR, Accounting\nReturns information for database snapshots having HR and Accounting as base dbs\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaDbSnapshot -SqlInstance sqlserver2014a -Snapshot HR_snapshot, Accounting_snapshot\nReturns information for database snapshots HR_snapshot and Accounting_snapshot", "Params": [ [ "SqlInstance", @@ -13210,28 +13726,29 @@ "False" ] ], - "Alias": "Get-DbaDatabaseSnapshot", - "Author": "Simone Bizzotto (@niphlod)", - "Synopsis": "Get database snapshots with details", - "Name": "Get-DbaDbSnapshot", - "Links": "https://dbatools.io/Get-DbaDbSnapshot", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaDbSnapshot -SqlInstance sqlserver2014a\nReturns a custom object displaying Server, Database, DatabaseCreated, SnapshotOf, SizeMB, DatabaseCreated\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaDbSnapshot -SqlInstance sqlserver2014a -Database HR, Accounting\nReturns information for database snapshots having HR and Accounting as base dbs\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaDbSnapshot -SqlInstance sqlserver2014a -Snapshot HR_snapshot, Accounting_snapshot\nReturns information for database snapshots HR_snapshot and Accounting_snapshot", "Syntax": "Get-DbaDbSnapshot [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [[-Database] \u003cObject[]\u003e] [[-ExcludeDatabase] \u003cObject[]\u003e] [[-Snapshot] \u003cObject[]\u003e] [[-ExcludeSnapshot] \u003cObject[]\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaDbSpace", + "Name": "Get-DbaDbSpace", "Description": "This function returns database file space information for a SQL Instance or group of SQL Instances. Information is based on a query against sys.database_files and the FILEPROPERTY function to query and return information.\n\nFile free space script borrowed and modified from Glenn Berry\u0027s DMV scripts (http://www.sqlskills.com/blogs/glenn/category/dmv-queries/)", "Tags": [ "Database", "Space", "Storage" ], + "Synopsis": "Returns database file space information for database files on a SQL instance.", + "Alias": "Get-DbaDatabaseFreeSpace,Get-DbaDatabaseSpace", + "Author": "Michael Fal (@Mike_Fal), http://mikefal.net", + "CommandName": "Get-DbaDbSpace", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Get-DbaDbSpace", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaDbSpace -SqlInstance localhost\nReturns all user database files and free space information for the localhost.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaDbSpace -SqlInstance localhost | Where-Object {$_.PercentUsed -gt 80}\nReturns all user database files and free space information for the local host. Filters the output object by any files that have a percent used of greater than 80%.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003e\u0027localhost\u0027,\u0027localhost\\namedinstance\u0027 | Get-DbaDbSpace\nReturns all user database files and free space information for the localhost and localhost\\namedinstance SQL Server instances. Processes data via the pipeline.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaDbSpace -SqlInstance localhost -Database db1, db2 | Where-Object { $_.SpaceUntilMaxSize.Megabyte -lt 1 }\nReturns database files and free space information for the db1 and db2 on localhost where there is only 1MB left until the space is maxed out\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eGet-DbaDbSpace -SqlInstance localhost -Database db1, db2 | Where-Object { $_.SpaceUntilMaxSize.Gigabyte -lt 1 }\nReturns database files and free space information for the db1 and db2 on localhost where there is only 1GB left until the space is maxed out", "Params": [ [ "SqlInstance", "The target SQL Server instance or instances.", "ServerInstance,SqlServer", - true, + false, "true (ByValue)", "" ], @@ -13267,6 +13784,14 @@ "false", "False" ], + [ + "InputObject", + "A piped collection of database objects from Get-DbaDatabase", + "", + false, + "true (ByValue)", + "" + ], [ "EnableException", "By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message.\r\nThis avoids overwhelming you with \"sea of red\" exceptions, but is inconvenient because it basically disables advanced scripting.\r\nUsing this switch turns this \"nice by default\" feature off and enables you to catch exceptions with your own try/catch.", @@ -13276,18 +13801,19 @@ "False" ] ], - "Alias": "Get-DbaDatabaseFreeSpace,Get-DbaDatabaseSpace", - "Author": "Michael Fal (@Mike_Fal), http://mikefal.net", - "Synopsis": "Returns database file space information for database files on a SQL instance.", - "Name": "Get-DbaDbSpace", - "Links": "https://dbatools.io/Get-DbaDbSpace", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaDbSpace -SqlInstance localhost\nReturns all user database files and free space information for the localhost.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaDbSpace -SqlInstance localhost | Where-Object {$_.PercentUsed -gt 80}\nReturns all user database files and free space information for the local host. Filters the output object by any files that have a percent used of greater than 80%.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003e\u0027localhost\u0027,\u0027localhost\\namedinstance\u0027 | Get-DbaDbSpace\nReturns all user database files and free space information for the localhost and localhost\\namedinstance SQL Server instances. Processes data via the pipeline.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaDbSpace -SqlInstance localhost -Database db1, db2 | Where-Object { $_.SpaceUntilMaxSize.Megabyte -lt 1 }\nReturns database files and free space information for the db1 and db2 on localhost where there is only 1MB left until the space is maxed out\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eGet-DbaDbSpace -SqlInstance localhost -Database db1, db2 | Where-Object { $_.SpaceUntilMaxSize.Gigabyte -lt 1 }\nReturns database files and free space information for the db1 and db2 on localhost where there is only 1GB left until the space is maxed out", - "Syntax": "Get-DbaDbSpace [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [[-Database] \u003cString[]\u003e] [[-ExcludeDatabase] \u003cString[]\u003e] [-IncludeSystemDBs] [-EnableException] [\u003cCommonParameters\u003e]" + "Syntax": "Get-DbaDbSpace [[-SqlInstance] \u003cDbaInstanceParameter[]\u003e] [[-SqlCredential] \u003cPSCredential\u003e] [[-Database] \u003cString[]\u003e] [[-ExcludeDatabase] \u003cString[]\u003e] [-IncludeSystemDBs] [[-InputObject] \u003cDatabase[]\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaDbState", + "Name": "Get-DbaDbState", "Description": "Gets some common \"states\" on databases:\n- \"RW\" options : READ_ONLY or READ_WRITE\n- \"Status\" options : ONLINE, OFFLINE, EMERGENCY, RESTORING\n- \"Access\" options : SINGLE_USER, RESTRICTED_USER, MULTI_USER\n\nReturns an object with SqlInstance, Database, RW, Status, Access", "Tags": "Database", + "Synopsis": "Gets various options for databases, hereby called \"states\"", + "Alias": "Get-DbaDatabaseState", + "Author": "Simone Bizzotto (@niphold)", + "CommandName": "Get-DbaDbState", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Get-DbaDbState", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaDbState -SqlInstance sqlserver2014a\nGets options for all databases of the sqlserver2014a instance\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaDbState -SqlInstance sqlserver2014a -Database HR, Accounting\nGets options for both HR and Accounting database of the sqlserver2014a instance\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaDbState -SqlInstance sqlserver2014a -Exclude HR\nGets options for all databases of the sqlserver2014a instance except HR\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003e\u0027sqlserver2014a\u0027, \u0027sqlserver2014b\u0027 | Get-DbaDbState\nGets options for all databases of sqlserver2014a and sqlserver2014b instances", "Params": [ [ "SqlInstance", @@ -13330,22 +13856,23 @@ "False" ] ], - "Alias": "Get-DbaDatabaseState", - "Author": "Simone Bizzotto (@niphold)", - "Synopsis": "Gets various options for databases, hereby called \"states\"", - "Name": "Get-DbaDbState", - "Links": "https://dbatools.io/Get-DbaDbState", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaDbState -SqlInstance sqlserver2014a\nGets options for all databases of the sqlserver2014a instance\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaDbState -SqlInstance sqlserver2014a -Database HR, Accounting\nGets options for both HR and Accounting database of the sqlserver2014a instance\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaDbState -SqlInstance sqlserver2014a -Exclude HR\nGets options for all databases of the sqlserver2014a instance except HR\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003e\u0027sqlserver2014a\u0027, \u0027sqlserver2014b\u0027 | Get-DbaDbState\nGets options for all databases of sqlserver2014a and sqlserver2014b instances", "Syntax": "Get-DbaDbState [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [[-Database] \u003cObject[]\u003e] [[-ExcludeDatabase] \u003cObject[]\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaDbStoredProcedure", + "Name": "Get-DbaDbStoredProcedure", "Description": "Gets database Stored Procedures", "Tags": [ "Database", "StoredProcedure", "Proc" ], + "Synopsis": "Gets database Stored Procedures", + "Alias": "", + "Author": "Klaas Vandenberghe (@PowerDbaKlaas)", + "CommandName": "Get-DbaDbStoredProcedure", + "Availability": "Windows, Linux, macOS", + "Links": null, + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaDbStoredProcedure -SqlInstance sql2016\nGets all database Stored Procedures\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaDbStoredProcedure -SqlInstance Server1 -Database db1\nGets the Stored Procedures for the db1 database\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaDbStoredProcedure -SqlInstance Server1 -ExcludeDatabase db1\nGets the Stored Procedures for all databases except db1\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaDbStoredProcedure -SqlInstance Server1 -ExcludeSystemSp\nGets the Stored Procedures for all databases that are not system objects\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003e\u0027Sql1\u0027,\u0027Sql2/sqlexpress\u0027 | Get-DbaDbStoredProcedure\nGets the Stored Procedures for the databases on Sql1 and Sql2/sqlexpress", "Params": [ [ "SqlInstance", @@ -13396,21 +13923,22 @@ "False" ] ], - "Alias": "", - "Author": "Klaas Vandenberghe (@PowerDbaKlaas)", - "Synopsis": "Gets database Stored Procedures", - "Name": "Get-DbaDbStoredProcedure", - "Links": null, - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaDbStoredProcedure -SqlInstance sql2016\nGets all database Stored Procedures\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaDbStoredProcedure -SqlInstance Server1 -Database db1\nGets the Stored Procedures for the db1 database\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaDbStoredProcedure -SqlInstance Server1 -ExcludeDatabase db1\nGets the Stored Procedures for all databases except db1\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaDbStoredProcedure -SqlInstance Server1 -ExcludeSystemSp\nGets the Stored Procedures for all databases that are not system objects\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003e\u0027Sql1\u0027,\u0027Sql2/sqlexpress\u0027 | Get-DbaDbStoredProcedure\nGets the Stored Procedures for the databases on Sql1 and Sql2/sqlexpress", "Syntax": "Get-DbaDbStoredProcedure [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [[-Database] \u003cObject[]\u003e] [[-ExcludeDatabase] \u003cObject[]\u003e] [-ExcludeSystemSp] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaDbTable", + "Name": "Get-DbaDbTable", "Description": "Shows table information around table row and data sizes and if it has any table type information.", "Tags": [ "Database", "Tables" ], + "Synopsis": "Returns a summary of information on the tables", + "Alias": "Get-DbaTable", + "Author": "Stephen Bennett, https://sqlnotesfromtheunderground.wordpress.com/", + "CommandName": "Get-DbaDbTable", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Get-DbaDbTable", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaDbTable -SqlInstance DEV01 -Database Test1\nReturn all tables in the Test1 database\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaDbTable -SqlInstance DEV01 -Database MyDB -Table MyTable\nReturn only information on the table MyTable from the database MyDB\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaDbTable -SqlInstance DEV01 -Table MyTable\nReturns information on table called MyTable if it exists in any database on the server, under any schema\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaDbTable -SqlInstance DEV01 -Table dbo.[First.Table]\nReturns information on table called First.Table on schema dbo if it exists in any database on the server\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003e\u0027localhost\u0027,\u0027localhost\\namedinstance\u0027 | Get-DbaDbTable -Database DBA -Table Commandlog\nReturns information on the CommandLog table in the DBA database on both instances localhost and the named instance localhost\\namedinstance\n-------------------------- EXAMPLE 6 --------------------------\nPS C:\\\u003eGet-DbaDbTable -SqlInstance DEV01 -Table \"[[DbName]]].[Schema.With.Dots].[`\"[Process]]`\"]\" -Verbose\nFor the instance Dev01 Returns information for a table named: \"[Process]\" in schema named: Schema.With.Dots in database named: [DbName]\r\nThe Table name, Schema name and Database name must be wrapped in square brackets [ ]\r\nSpecial charcters like \" must be escaped by a ` charcter.\r\nIn addition any actual instance of the ] character must be escaped by being duplicated.", "Params": [ [ "SqlInstance", @@ -13469,21 +13997,22 @@ "False" ] ], - "Alias": "Get-DbaTable", - "Author": "Stephen Bennett, https://sqlnotesfromtheunderground.wordpress.com/", - "Synopsis": "Returns a summary of information on the tables", - "Name": "Get-DbaDbTable", - "Links": "https://dbatools.io/Get-DbaDbTable", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaDbTable -SqlInstance DEV01 -Database Test1\nReturn all tables in the Test1 database\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaDbTable -SqlInstance DEV01 -Database MyDB -Table MyTable\nReturn only information on the table MyTable from the database MyDB\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaDbTable -SqlInstance DEV01 -Table MyTable\nReturns information on table called MyTable if it exists in any database on the server, under any schema\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaDbTable -SqlInstance DEV01 -Table dbo.[First.Table]\nReturns information on table called First.Table on schema dbo if it exists in any database on the server\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003e\u0027localhost\u0027,\u0027localhost\\namedinstance\u0027 | Get-DbaDbTable -Database DBA -Table Commandlog\nReturns information on the CommandLog table in the DBA database on both instances localhost and the named instance localhost\\namedinstance\n-------------------------- EXAMPLE 6 --------------------------\nPS C:\\\u003eGet-DbaDbTable -SqlInstance DEV01 -Table \"[[DbName]]].[Schema.With.Dots].[`\"[Process]]`\"]\" -Verbose\nFor the instance Dev01 Returns information for a table named: \"[Process]\" in schema named: Schema.With.Dots in database named: [DbName]\r\nThe Table name, Schema name and Database name must be wrapped in square brackets [ ]\r\nSpecial charcters like \" must be escaped by a ` charcter.\r\nIn addition any actual instance of the ] character must be escaped by being duplicated.", "Syntax": "Get-DbaDbTable [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [[-Database] \u003cObject[]\u003e] [[-ExcludeDatabase] \u003cObject[]\u003e] [-IncludeSystemDBs] [[-Table] \u003cString[]\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaDbTrigger", + "Name": "Get-DbaDbTrigger", "Description": "Get all existing database triggers on one or more SQL instances.", "Tags": [ "Database", "Trigger" ], + "Synopsis": "Get all existing database triggers on one or more SQL instances.", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Get-DbaDbTrigger", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Get-DbaDbTrigger", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaDbTrigger -SqlInstance sql2017\nReturns all database triggers\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaDatabase -SqlInstance sql2017 -Database supa | Get-DbaDbTrigger\nReturns all triggers for database supa on sql2017\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaDbTrigger -SqlInstance sql2017 -Database supa\nReturns all triggers for database supa on sql2017", "Params": [ [ "SqlInstance", @@ -13534,21 +14063,22 @@ "False" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Get all existing database triggers on one or more SQL instances.", - "Name": "Get-DbaDbTrigger", - "Links": "https://dbatools.io/Get-DbaDbTrigger", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaDbTrigger -SqlInstance sql2017\nReturns all database triggers\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaDatabase -SqlInstance sql2017 -Database supa | Get-DbaDbTrigger\nReturns all triggers for database supa on sql2017\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaDbTrigger -SqlInstance sql2017 -Database supa\nReturns all triggers for database supa on sql2017", "Syntax": "Get-DbaDbTrigger [[-SqlInstance] \u003cDbaInstanceParameter[]\u003e] [[-SqlCredential] \u003cPSCredential\u003e] [[-Database] \u003cObject[]\u003e] [[-ExcludeDatabase] \u003cObject[]\u003e] [[-InputObject] \u003cDatabase[]\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaDbUdf", + "Name": "Get-DbaDbUdf", "Description": "Gets database User Defined Functions", "Tags": [ "Security", "Database" ], + "Synopsis": "Gets database User Defined Functions", + "Alias": "Get-DbaDatabaseUdf", + "Author": "Klaas Vandenberghe (@PowerDbaKlaas)", + "CommandName": "Get-DbaDbUdf", + "Availability": "Windows, Linux, macOS", + "Links": null, + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaDbUdf -SqlInstance sql2016\nGets all database User Defined Functions\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaDbUdf -SqlInstance Server1 -Database db1\nGets the User Defined Functions for the db1 database\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaDbUdf -SqlInstance Server1 -ExcludeDatabase db1\nGets the User Defined Functions for all databases except db1\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaDbUdf -SqlInstance Server1 -ExcludeSystemUdf\nGets the User Defined Functions for all databases that are not system objects (there can be 100+ system User Defined Functions in each DB)\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003e\u0027Sql1\u0027,\u0027Sql2/sqlexpress\u0027 | Get-DbaDbUdf\nGets the User Defined Functions for the databases on Sql1 and Sql2/sqlexpress", "Params": [ [ "SqlInstance", @@ -13599,21 +14129,22 @@ "False" ] ], - "Alias": "Get-DbaDatabaseUdf", - "Author": "Klaas Vandenberghe (@PowerDbaKlaas)", - "Synopsis": "Gets database User Defined Functions", - "Name": "Get-DbaDbUdf", - "Links": null, - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaDbUdf -SqlInstance sql2016\nGets all database User Defined Functions\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaDbUdf -SqlInstance Server1 -Database db1\nGets the User Defined Functions for the db1 database\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaDbUdf -SqlInstance Server1 -ExcludeDatabase db1\nGets the User Defined Functions for all databases except db1\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaDbUdf -SqlInstance Server1 -ExcludeSystemUdf\nGets the User Defined Functions for all databases that are not system objects (there can be 100+ system User Defined Functions in each DB)\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003e\u0027Sql1\u0027,\u0027Sql2/sqlexpress\u0027 | Get-DbaDbUdf\nGets the User Defined Functions for the databases on Sql1 and Sql2/sqlexpress", "Syntax": "Get-DbaDbUdf [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [[-Database] \u003cObject[]\u003e] [[-ExcludeDatabase] \u003cObject[]\u003e] [-ExcludeSystemUdf] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaDbUser", + "Name": "Get-DbaDbUser", "Description": "Gets database users", "Tags": [ "Security", "Database" ], + "Synopsis": "Gets database users", + "Alias": "Get-DbaDatabaseUser", + "Author": "Klaas Vandenberghe (@PowerDbaKlaas)", + "CommandName": "Get-DbaDbUser", + "Availability": "Windows, Linux, macOS", + "Links": null, + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaDbUser -SqlInstance sql2016\nGets all database users\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaDbUser -SqlInstance Server1 -Database db1\nGets the users for the db1 database\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaDbUser -SqlInstance Server1 -ExcludeDatabase db1\nGets the users for all databases except db1\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaDbUser -SqlInstance Server1 -ExcludeSystemUser\nGets the users for all databases that are not system objects, like \u0027dbo\u0027, \u0027guest\u0027 or \u0027INFORMATION_SCHEMA\u0027\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003e\u0027Sql1\u0027,\u0027Sql2/sqlexpress\u0027 | Get-DbaDbUser\nGets the users for the databases on Sql1 and Sql2/sqlexpress", "Params": [ [ "SqlInstance", @@ -13664,21 +14195,22 @@ "False" ] ], - "Alias": "Get-DbaDatabaseUser", - "Author": "Klaas Vandenberghe (@PowerDbaKlaas)", - "Synopsis": "Gets database users", - "Name": "Get-DbaDbUser", - "Links": null, - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaDbUser -SqlInstance sql2016\nGets all database users\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaDbUser -SqlInstance Server1 -Database db1\nGets the users for the db1 database\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaDbUser -SqlInstance Server1 -ExcludeDatabase db1\nGets the users for all databases except db1\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaDbUser -SqlInstance Server1 -ExcludeSystemUser\nGets the users for all databases that are not system objects, like \u0027dbo\u0027, \u0027guest\u0027 or \u0027INFORMATION_SCHEMA\u0027\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003e\u0027Sql1\u0027,\u0027Sql2/sqlexpress\u0027 | Get-DbaDbUser\nGets the users for the databases on Sql1 and Sql2/sqlexpress", "Syntax": "Get-DbaDbUser [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [[-Database] \u003cObject[]\u003e] [[-ExcludeDatabase] \u003cObject[]\u003e] [-ExcludeSystemUser] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaDbView", + "Name": "Get-DbaDbView", "Description": "Gets database views for each SqlInstance.", "Tags": [ "Security", "Database" ], + "Synopsis": "Gets database views for each SqlInstance.", + "Alias": "Get-DbaDatabaseView", + "Author": "Klaas Vandenberghe (@PowerDbaKlaas)", + "CommandName": "Get-DbaDbView", + "Availability": "Windows, Linux, macOS", + "Links": null, + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaDbView -SqlInstance sql2016\nGets all database views\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaDbView -SqlInstance Server1 -Database db1\nGets the views for the db1 database\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaDbView -SqlInstance Server1 -ExcludeDatabase db1\nGets the views for all databases except db1\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaDbView -SqlInstance Server1 -ExcludeSystemView\nGets the views for all databases that are not system objects (there can be 400+ system views in each DB)\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003e\u0027Sql1\u0027,\u0027Sql2/sqlexpress\u0027 | Get-DbaDbView\nGets the views for the databases on Sql1 and Sql2/sqlexpress", "Params": [ [ "SqlInstance", @@ -13729,22 +14261,23 @@ "False" ] ], - "Alias": "Get-DbaDatabaseView", - "Author": "Klaas Vandenberghe (@PowerDbaKlaas)", - "Synopsis": "Gets database views for each SqlInstance.", - "Name": "Get-DbaDbView", - "Links": null, - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaDbView -SqlInstance sql2016\nGets all database views\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaDbView -SqlInstance Server1 -Database db1\nGets the views for the db1 database\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaDbView -SqlInstance Server1 -ExcludeDatabase db1\nGets the views for all databases except db1\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaDbView -SqlInstance Server1 -ExcludeSystemView\nGets the views for all databases that are not system objects (there can be 400+ system views in each DB)\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003e\u0027Sql1\u0027,\u0027Sql2/sqlexpress\u0027 | Get-DbaDbView\nGets the views for the databases on Sql1 and Sql2/sqlexpress", "Syntax": "Get-DbaDbView [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [[-Database] \u003cObject[]\u003e] [[-ExcludeDatabase] \u003cObject[]\u003e] [-ExcludeSystemView] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaDbVirtualLogFile", + "Name": "Get-DbaDbVirtualLogFile", "Description": "Having a transaction log file with too many virtual log files (VLFs) can hurt database performance.\n\nToo many VLFs can cause transaction log backups to slow down and can also slow down database recovery and, in extreme cases, even affect insert/update/delete performance.\n\nReferences:\nhttp://www.sqlskills.com/blogs/kimberly/transaction-log-vlfs-too-many-or-too-few/\nhttp://blogs.msdn.com/b/saponsqlserver/archive/2012/02/22/too-many-virtual-log-files-vlfs-can-cause-slow-database-recovery.aspx\n\nIf you\u0027ve got a high number of VLFs, you can use Expand-SqlTLogResponsibly to reduce the number.", "Tags": [ "VLF", "Database", "LogFile" ], + "Synopsis": "Returns database virtual log file information for database files on a SQL instance.", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Get-DbaDbVirtualLogFile", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Get-DbaDbVirtualLogFile", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaDbVirtualLogFile -SqlInstance sqlcluster\nReturns all user database virtual log file details for the sqlcluster instance.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaDbVirtualLogFile -SqlInstance sqlserver | Group-Object -Property Database | Where-Object Count -gt 50\nReturns user databases that have 50 or more VLFs.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003e\u0027sqlserver\u0027,\u0027sqlcluster\u0027 | Get-DbaDbVirtualLogFile\nReturns all VLF information for the sqlserver and sqlcluster SQL Server instances. Processes data via the pipeline.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaDbVirtualLogFile -SqlInstance sqlcluster -Database db1, db2\nReturns the VLF counts for the db1 and db2 databases on sqlcluster.", "Params": [ [ "SqlInstance", @@ -13795,18 +14328,19 @@ "False" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Returns database virtual log file information for database files on a SQL instance.", - "Name": "Get-DbaDbVirtualLogFile", - "Links": "https://dbatools.io/Get-DbaDbVirtualLogFile", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaDbVirtualLogFile -SqlInstance sqlcluster\nReturns all user database virtual log file details for the sqlcluster instance.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaDbVirtualLogFile -SqlInstance sqlserver | Group-Object -Property Database | Where-Object Count -gt 50\nReturns user databases that have 50 or more VLFs.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003e\u0027sqlserver\u0027,\u0027sqlcluster\u0027 | Get-DbaDbVirtualLogFile\nReturns all VLF information for the sqlserver and sqlcluster SQL Server instances. Processes data via the pipeline.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaDbVirtualLogFile -SqlInstance sqlcluster -Database db1, db2\nReturns the VLF counts for the db1 and db2 databases on sqlcluster.", "Syntax": "Get-DbaDbVirtualLogFile [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [[-Database] \u003cObject[]\u003e] [[-ExcludeDatabase] \u003cObject[]\u003e] [-IncludeSystemDBs] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaDefaultPath", + "Name": "Get-DbaDefaultPath", "Description": "Gets the default SQL Server paths for data, logs and backups", "Tags": "Config", + "Synopsis": "Gets the default SQL Server paths for data, logs and backups", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Get-DbaDefaultPath", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Get-DbaDefaultPath", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaDefaultPath -SqlInstance sql01\\sharepoint\nReturns the default file paths for sql01\\sharepoint\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003e$servers = \"sql2014\",\"sql2016\", \"sqlcluster\\sharepoint\"\nPS C:\\\u003e $servers | Get-DbaDefaultPath\nReturns the default file paths for \"sql2014\",\"sql2016\" and \"sqlcluster\\sharepoint\"", "Params": [ [ "SqlInstance", @@ -13833,16 +14367,10 @@ "False" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Gets the default SQL Server paths for data, logs and backups", - "Name": "Get-DbaDefaultPath", - "Links": "https://dbatools.io/Get-DbaDefaultPath", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaDefaultPath -SqlInstance sql01\\sharepoint\nReturns the default file paths for sql01\\sharepoint\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003e$servers = \"sql2014\",\"sql2016\", \"sqlcluster\\sharepoint\"\nPS C:\\\u003e $servers | Get-DbaDefaultPath\nReturns the default file paths for \"sql2014\",\"sql2016\" and \"sqlcluster\\sharepoint\"", "Syntax": "Get-DbaDefaultPath [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [-SqlCredential \u003cPSCredential\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaDependency", + "Name": "Get-DbaDependency", "Description": "This function recursively finds all objects that depends on the input.\nIt will then retrieve rich information from them, including their creation scripts and the order in which it should be applied.\n\nBy using the \u0027Parents\u0027 switch, the function will instead retrieve all items that the input depends on (including their creation scripts).\n\nFor more details on dependency, see:\nhttps://technet.microsoft.com/en-us/library/ms345449(v=sql.105).aspx", "Tags": [ "Database", @@ -13850,6 +14378,13 @@ "Dependency", "Object" ], + "Synopsis": "Finds object dependencies and their relevant creation scripts.", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Get-DbaDependency", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Get-DbaDependency", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003e$table = (Get-DbaDatabase -SqlInstance sql2012 -Database Northwind).tables | Where Name -eq Customers\nPS C:\\\u003e $table | Get-DbaDependency\nReturns everything that depends on the \"Customers\" table", "Params": [ [ "InputObject", @@ -13886,24 +14421,25 @@ [ "EnableException", "By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message.\r\nThis avoids overwhelming you with \"sea of red\" exceptions, but is inconvenient because it basically disables advanced scripting.\r\nUsing this switch turns this \"nice by default\" feature off and enables you to catch exceptions with your own try/catch.", - "Silent", + "", false, "false", "False" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Finds object dependencies and their relevant creation scripts.", - "Name": "Get-DbaDependency", - "Links": "https://dbatools.io/Get-DbaDependency", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003e$table = (Get-DbaDatabase -SqlInstance sql2012 -Database Northwind).tables | Where Name -eq Customers\nPS C:\\\u003e $table | Get-DbaDependency\nReturns everything that depends on the \"Customers\" table", "Syntax": "Get-DbaDependency [[-InputObject] \u003cObject\u003e] [-AllowSystemObjects] [-Parents] [-IncludeSelf] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaDeprecatedFeature", + "Name": "Get-DbaDeprecatedFeature", "Description": "Displays information relating to deprecated features for SQL Server 2005 and above.", "Tags": "Deprecated", + "Synopsis": "Displays information relating to deprecated features for SQL Server 2005 and above.", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Get-DbaDeprecatedFeature", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Get-DbaDeprecatedFeature", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaDeprecatedFeature -SqlInstance sql2008, sqlserver2012\nCheck deprecated features for all databases on the servers sql2008 and sqlserver2012.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaDeprecatedFeature -SqlInstance sql2008\nCheck deprecated features on server sql2008.", "Params": [ [ "SqlInstance", @@ -13930,21 +14466,22 @@ "False" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Displays information relating to deprecated features for SQL Server 2005 and above.", - "Name": "Get-DbaDeprecatedFeature", - "Links": "https://dbatools.io/Get-DbaDeprecatedFeature", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaDeprecatedFeature -SqlInstance sql2008, sqlserver2012\nCheck deprecated features for all databases on the servers sql2008 and sqlserver2012.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaDeprecatedFeature -SqlInstance sql2008\nCheck deprecated features on server sql2008.", "Syntax": "Get-DbaDeprecatedFeature [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [-SqlCredential \u003cPSCredential\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaDetachedDatabaseInfo", + "Name": "Get-DbaDetachedDatabaseInfo", "Description": "Gathers the following information from detached database files: database name, SQL Server version (compatibility level), collation, and file structure.\n\n\"Data files\" and \"Log file\" report the structure of the data and log files as they were when the database was detached. \"Database version\" is the compatibility level.\n\nMDF files are most easily read by using a SQL Server to interpret them. Because of this, you must specify a SQL Server and the path must be relative to the SQL Server.", "Tags": [ "Database", "Detach" ], + "Synopsis": "Get detailed information about detached SQL Server database files.", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Get-DbaDetachedDatabaseInfo", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Get-DbaDetachedDatabaseInfo", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaDetachedDatabaseInfo -SqlInstance sql2016 -Path M:\\Archive\\mydb.mdf\nReturns information about the detached database file M:\\Archive\\mydb.mdf using the SQL Server instance sql2016. The M drive is relative to the SQL Server instance.", "Params": [ [ "SqlInstance", @@ -13971,21 +14508,22 @@ "" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Get detailed information about detached SQL Server database files.", - "Name": "Get-DbaDetachedDatabaseInfo", - "Links": "https://dbatools.io/Get-DbaDetachedDatabaseInfo", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaDetachedDatabaseInfo -SqlInstance sql2016 -Path M:\\Archive\\mydb.mdf\nReturns information about the detached database file M:\\Archive\\mydb.mdf using the SQL Server instance sql2016. The M drive is relative to the SQL Server instance.", "Syntax": "Get-DbaDetachedDatabaseInfo [-SqlInstance] \u003cDbaInstanceParameter\u003e [-Path] \u003cString\u003e [[-SqlCredential] \u003cPSCredential\u003e] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaDiskSpace", + "Name": "Get-DbaDiskSpace", "Description": "Returns a custom object with server name, name of disk, label of disk, total size, free size, percent free, block size and filesystem.\n\nBy default, this function only shows drives of types 2 and 3 (removable disk and local disk).\n\nRequires Windows administrator access on SQL Servers", "Tags": [ "Storage", "Disk" ], + "Synopsis": "Displays disk information for all local disk on a server.", + "Alias": "Get-DiskSpace", + "Author": "Chrissy LeMaire (@cl), netnerds.net | Jakob Bindslet", + "CommandName": "Get-DbaDiskSpace", + "Availability": "Windows only", + "Links": "https://dbatools.io/Get-DbaDiskSpace", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaDiskSpace -ComputerName srv0042\nGet disk space for the server srv0042.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaDiskSpace -ComputerName srv0042 -Unit MB\nGet disk space for the server srv0042 and displays in megabytes (MB).\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaDiskSpace -ComputerName srv0042, srv0007 -Unit TB\nGet disk space from two servers and displays in terabytes (TB).\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaDiskSpace -ComputerName srv0042 -Force\nGet all disk and volume space information.\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eGet-DbaDiskSpace -ComputerName srv0042 -ExcludeDrive \u0027C:\\\u0027\nGet all disk and volume space information.", "Params": [ [ "ComputerName", @@ -14060,21 +14598,22 @@ "False" ] ], - "Alias": "Get-DiskSpace", - "Author": "Chrissy LeMaire (@cl), netnerds.net | Jakob Bindslet", - "Synopsis": "Displays disk information for all local disk on a server.", - "Name": "Get-DbaDiskSpace", - "Links": "https://dbatools.io/Get-DbaDiskSpace", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaDiskSpace -ComputerName srv0042\nGet disk space for the server srv0042.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaDiskSpace -ComputerName srv0042 -Unit MB\nGet disk space for the server srv0042 and displays in megabytes (MB).\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaDiskSpace -ComputerName srv0042, srv0007 -Unit TB\nGet disk space from two servers and displays in terabytes (TB).\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaDiskSpace -ComputerName srv0042 -Force\nGet all disk and volume space information.\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eGet-DbaDiskSpace -ComputerName srv0042 -ExcludeDrive \u0027C:\\\u0027\nGet all disk and volume space information.", "Syntax": "Get-DbaDiskSpace [[-ComputerName] \u003cDbaInstanceParameter[]\u003e] [[-Credential] \u003cPSCredential\u003e] [[-Unit] \u003cString\u003e] [-CheckForSql] [[-SqlCredential] \u003cPSCredential\u003e] [[-ExcludeDrive] \u003cString[]\u003e] [-CheckFragmentation] [-Force] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaDump", + "Name": "Get-DbaDump", "Description": "The type of dump included in the search include minidump, all-thread dump, or a full dump. The files have an extendion of .mdmp.", "Tags": [ "Engine", "Corruption" ], + "Synopsis": "Locate a SQL Server that has generated any memory dump files.", + "Alias": "", + "Author": "Garry Bargsley (@gbargsley), http://blog.garrybargsley.com", + "CommandName": "Get-DbaDump", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Get-DbaDump", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaDump -SqlInstance sql2016\nShows the detailed information for memory dump(s) located on sql2016 instance\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaDump -SqlInstance sql2016 -SqlCredential sqladmin\nShows the detailed information for memory dump(s) located on sql2016 instance. Logs into the SQL Server using the SQL login \u0027sqladmin\u0027", "Params": [ [ "SqlInstance", @@ -14101,18 +14640,19 @@ "False" ] ], - "Alias": "", - "Author": "Garry Bargsley (@gbargsley), http://blog.garrybargsley.com", - "Synopsis": "Locate a SQL Server that has generated any memory dump files.", - "Name": "Get-DbaDump", - "Links": "https://dbatools.io/Get-DbaDump", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaDump -SqlInstance sql2016\nShows the detailed information for memory dump(s) located on sql2016 instance\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaDump -SqlInstance sql2016 -SqlCredential sqladmin\nShows the detailed information for memory dump(s) located on sql2016 instance. Logs into the SQL Server using the SQL login \u0027sqladmin\u0027", "Syntax": "Get-DbaDump [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaEndpoint", + "Name": "Get-DbaEndpoint", "Description": "Returns endpoint objects from a SQL Server instance.", "Tags": "Endpoint", + "Synopsis": "Returns endpoint objects from a SQL Server instance.", + "Alias": "", + "Author": "Garry Bargsley (@gbargsley), http://blog.garrybargsley.com", + "CommandName": "Get-DbaEndpoint", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Get-DbaEndpoint", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaEndpoint -SqlInstance localhost\nReturns all endpoints on the local default SQL Server instance\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaEndpoint -SqlInstance localhost, sql2016\nReturns all endpoints for the local and sql2016 SQL Server instances", "Params": [ [ "SqlInstance", @@ -14155,21 +14695,22 @@ "False" ] ], - "Alias": "", - "Author": "Garry Bargsley (@gbargsley), http://blog.garrybargsley.com", - "Synopsis": "Returns endpoint objects from a SQL Server instance.", - "Name": "Get-DbaEndpoint", - "Links": "https://dbatools.io/Get-DbaEndpoint", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaEndpoint -SqlInstance localhost\nReturns all endpoints on the local default SQL Server instance\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaEndpoint -SqlInstance localhost, sql2016\nReturns all endpoints for the local and sql2016 SQL Server instances", "Syntax": "Get-DbaEndpoint [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [-SqlCredential \u003cPSCredential\u003e] [-Endpoint \u003cString[]\u003e] [-Type \u003cString[]\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaErrorLog", + "Name": "Get-DbaErrorLog", "Description": "Gets the \"SQL Error Log\" of an instance. Returns all 10 error logs by default.", "Tags": [ "Instance", "ErrorLog" ], + "Synopsis": "Gets the \"SQL Error Log\" of an instance", + "Alias": "Get-DbaLog", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Get-DbaErrorLog", + "Availability": "Windows only", + "Links": "https://dbatools.io/Get-DbaErrorLog", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaErrorLog -SqlInstance sql01\\sharepoint\nReturns every log entry from sql01\\sharepoint SQL Server instance.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaErrorLog -SqlInstance sql01\\sharepoint -LogNumber 3, 6\nReturns all log entries for log number 3 and 6 on sql01\\sharepoint SQL Server instance.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaErrorLog -SqlInstance sql01\\sharepoint -Source Logon\nReturns every log entry, with a source of Logon, from sql01\\sharepoint SQL Server instance.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaErrorLog -SqlInstance sql01\\sharepoint -LogNumber 3 -Text \"login failed\"\nReturns every log entry for log number 3, with \"login failed\" in the text, from sql01\\sharepoint SQL Server instance.\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003e$servers = \"sql2014\",\"sql2016\", \"sqlcluster\\sharepoint\"\nPS C:\\\u003e $servers | Get-DbaErrorLog -LogNumber 0\nReturns the most recent SQL Server error logs for \"sql2014\",\"sql2016\" and \"sqlcluster\\sharepoint\"\n-------------------------- EXAMPLE 6 --------------------------\nPS C:\\\u003eGet-DbaErrorLog -SqlInstance sql01\\sharepoint -After \u00272016-11-14 00:00:00\u0027\nReturns every log entry found after the date 14 November 2016 from sql101\\sharepoint SQL Server instance.\n-------------------------- EXAMPLE 7 --------------------------\nPS C:\\\u003eGet-DbaErrorLog -SqlInstance sql01\\sharepoint -Before \u00272016-08-16 00:00:00\u0027\nReturns every log entry found before the date 16 August 2016 from sql101\\sharepoint SQL Server instance.", "Params": [ [ "SqlInstance", @@ -14236,21 +14777,22 @@ "False" ] ], - "Alias": "Get-DbaLog", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Gets the \"SQL Error Log\" of an instance", - "Name": "Get-DbaErrorLog", - "Links": "https://dbatools.io/Get-DbaErrorLog", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaErrorLog -SqlInstance sql01\\sharepoint\nReturns every log entry from sql01\\sharepoint SQL Server instance.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaErrorLog -SqlInstance sql01\\sharepoint -LogNumber 3, 6\nReturns all log entries for log number 3 and 6 on sql01\\sharepoint SQL Server instance.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaErrorLog -SqlInstance sql01\\sharepoint -Source Logon\nReturns every log entry, with a source of Logon, from sql01\\sharepoint SQL Server instance.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaErrorLog -SqlInstance sql01\\sharepoint -LogNumber 3 -Text \"login failed\"\nReturns every log entry for log number 3, with \"login failed\" in the text, from sql01\\sharepoint SQL Server instance.\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003e$servers = \"sql2014\",\"sql2016\", \"sqlcluster\\sharepoint\"\nPS C:\\\u003e $servers | Get-DbaErrorLog -LogNumber 0\nReturns the most recent SQL Server error logs for \"sql2014\",\"sql2016\" and \"sqlcluster\\sharepoint\"\n-------------------------- EXAMPLE 6 --------------------------\nPS C:\\\u003eGet-DbaErrorLog -SqlInstance sql01\\sharepoint -After \u00272016-11-14 00:00:00\u0027\nReturns every log entry found after the date 14 November 2016 from sql101\\sharepoint SQL Server instance.\n-------------------------- EXAMPLE 7 --------------------------\nPS C:\\\u003eGet-DbaErrorLog -SqlInstance sql01\\sharepoint -Before \u00272016-08-16 00:00:00\u0027\nReturns every log entry found before the date 16 August 2016 from sql101\\sharepoint SQL Server instance.", "Syntax": "Get-DbaErrorLog [[-SqlInstance] \u003cDbaInstanceParameter[]\u003e] [[-SqlCredential] \u003cPSCredential\u003e] [[-LogNumber] \u003cInt32[]\u003e] [[-Source] \u003cObject[]\u003e] [[-Text] \u003cString\u003e] [[-After] \u003cDateTime\u003e] [[-Before] \u003cDateTime\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaErrorLogConfig", + "Name": "Get-DbaErrorLogConfig", "Description": "Pulls the configuration for the ErrorLog on a given SQL Server instance.\n\nIncludes error log path, number of log files configured and size (SQL Server 2012+ only)", "Tags": [ "Instance", "ErrorLog" ], + "Synopsis": "Pulls the configuration for the ErrorLog on a given SQL Server instance", + "Alias": "", + "Author": "Shawn Melton (@wsmelton), https://wsmelton.github.io", + "CommandName": "Get-DbaErrorLogConfig", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Get-DbaErrorLogConfig", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaErrorLogConfig -SqlInstance server2017,server2014\nReturns error log configuration for server2017 and server2014", "Params": [ [ "SqlInstance", @@ -14277,18 +14819,19 @@ "False" ] ], - "Alias": "", - "Author": "Shawn Melton (@wsmelton), https://wsmelton.github.io", - "Synopsis": "Pulls the configuration for the ErrorLog on a given SQL Server instance", - "Name": "Get-DbaErrorLogConfig", - "Links": "https://dbatools.io/Get-DbaErrorLogConfig", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaErrorLogConfig -SqlInstance server2017,server2014\nReturns error log configuration for server2017 and server2014", "Syntax": "Get-DbaErrorLogConfig [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaEstimatedCompletionTime", + "Name": "Get-DbaEstimatedCompletionTime", "Description": "Gets execution and estimated completion time information for queries\n\nPercent complete will show for the following commands\n\nALTER INDEX REORGANIZE\nAUTO_SHRINK option with ALTER DATABASE\nBACKUP DATABASE\nDBCC CHECKDB\nDBCC CHECKFILEGROUP\nDBCC CHECKTABLE\nDBCC INDEXDEFRAG\nDBCC SHRINKDATABASE\nDBCC SHRINKFILE\nRECOVERY\nRESTORE DATABASE\nROLLBACK\nTDE ENCRYPTION\n\nFor additional information, check out https://blogs.sentryone.com/loriedwards/patience-dm-exec-requests/ and https://docs.microsoft.com/en-us/sql/relational-databases/system-dynamic-management-views/sys-dm-exec-requests-transact-sql", "Tags": "Database", + "Synopsis": "Gets execution and estimated completion time information for queries", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Get-DbaEstimatedCompletionTime", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Get-DbaEstimatedCompletionTime", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaEstimatedCompletionTime -SqlInstance sql2016\nGets estimated completion times for queries performed against the entire server\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaEstimatedCompletionTime -SqlInstance sql2016 | Select *\nGets estimated completion times for queries performed against the entire server PLUS the SQL query text of each command\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaEstimatedCompletionTime -SqlInstance sql2016 | Where-Object { $_.Text -match \u0027somequerytext\u0027 }\nGets results for commands whose queries only match specific text (match is like LIKE but way more powerful)\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaEstimatedCompletionTime -SqlInstance sql2016 -Database Northwind,pubs,Adventureworks2014\nGets estimated completion times for queries performed against the Northwind, pubs, and Adventureworks2014 databases", "Params": [ [ "SqlInstance", @@ -14331,18 +14874,19 @@ "False" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Gets execution and estimated completion time information for queries", - "Name": "Get-DbaEstimatedCompletionTime", - "Links": "https://dbatools.io/Get-DbaEstimatedCompletionTime", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaEstimatedCompletionTime -SqlInstance sql2016\nGets estimated completion times for queries performed against the entire server\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaEstimatedCompletionTime -SqlInstance sql2016 | Select *\nGets estimated completion times for queries performed against the entire server PLUS the SQL query text of each command\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaEstimatedCompletionTime -SqlInstance sql2016 | Where-Object { $_.Text -match \u0027somequerytext\u0027 }\nGets results for commands whose queries only match specific text (match is like LIKE but way more powerful)\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaEstimatedCompletionTime -SqlInstance sql2016 -Database Northwind,pubs,Adventureworks2014\nGets estimated completion times for queries performed against the Northwind, pubs, and Adventureworks2014 databases", "Syntax": "Get-DbaEstimatedCompletionTime [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [[-Database] \u003cObject[]\u003e] [[-ExcludeDatabase] \u003cObject[]\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaExecutionPlan", + "Name": "Get-DbaExecutionPlan", "Description": "Gets execution plans and metadata. Can pipe to Export-DbaExecutionPlan\n\nThanks to following for the queries:\nhttps://www.simple-talk.com/sql/t-sql-programming/dmvs-for-query-plan-metadata/\nhttp://www.scarydba.com/2017/02/13/export-plans-cache-sqlplan-file/", "Tags": "Performance", + "Synopsis": "Gets execution plans and metadata", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Get-DbaExecutionPlan", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Get-DbaExecutionPlan", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaExecutionPlan -SqlInstance sqlserver2014a\nGets all execution plans on sqlserver2014a\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaExecutionPlan -SqlInstance sqlserver2014a -Database db1, db2 -SinceLastExecution \u00272016-07-01 10:47:00\u0027\nGets all execution plans for databases db1 and db2 on sqlserver2014a since July 1, 2016 at 10:47 AM.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaExecutionPlan -SqlInstance sqlserver2014a, sql2016 -Exclude db1 | Format-Table\nGets execution plan info for all databases except db1 on sqlserver2014a and sql2016 and makes the output pretty\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaExecutionPlan -SqlInstance sql2014 -Database AdventureWorks2014, pubs -Force\nGets super detailed information for execution plans on only for AdventureWorks2014 and pubs\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003e$servers = \"sqlserver2014a\",\"sql2016t\"\nPS C:\\\u003e $servers | Get-DbaExecutionPlan -Force\nGets super detailed information for execution plans on sqlserver2014a and sql2016", "Params": [ [ "SqlInstance", @@ -14417,21 +14961,22 @@ "False" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Gets execution plans and metadata", - "Name": "Get-DbaExecutionPlan", - "Links": "https://dbatools.io/Get-DbaExecutionPlan", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaExecutionPlan -SqlInstance sqlserver2014a\nGets all execution plans on sqlserver2014a\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaExecutionPlan -SqlInstance sqlserver2014a -Database db1, db2 -SinceLastExecution \u00272016-07-01 10:47:00\u0027\nGets all execution plans for databases db1 and db2 on sqlserver2014a since July 1, 2016 at 10:47 AM.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaExecutionPlan -SqlInstance sqlserver2014a, sql2016 -Exclude db1 | Format-Table\nGets execution plan info for all databases except db1 on sqlserver2014a and sql2016 and makes the output pretty\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaExecutionPlan -SqlInstance sql2014 -Database AdventureWorks2014, pubs -Force\nGets super detailed information for execution plans on only for AdventureWorks2014 and pubs\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003e$servers = \"sqlserver2014a\",\"sql2016t\"\nPS C:\\\u003e $servers | Get-DbaExecutionPlan -Force\nGets super detailed information for execution plans on sqlserver2014a and sql2016", "Syntax": "Get-DbaExecutionPlan [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [[-Database] \u003cObject[]\u003e] [[-ExcludeDatabase] \u003cObject[]\u003e] [[-SinceCreation] \u003cDateTime\u003e] [[-SinceLastExecution] \u003cDateTime\u003e] [-ExcludeEmptyQueryPlan] [-Force] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaFeature", + "Name": "Get-DbaFeature", "Description": "Runs the SQL Server feature discovery report (setup.exe /Action=RunDiscovery)\n\nInspired by Dave Mason\u0027s (@BeginTry) post at\nhttps://itsalljustelectrons.blogspot.be/2018/04/SQL-Server-Discovery-Report.html\n\nAssumptions:\n1. The sub-folder \"Microsoft SQL Server\" exists in $env:ProgramFiles,\neven if SQL was installed to a non-default path. This has been\nverified on SQL 2008R2 and SQL 2012. Further verification may be needed.\n2. The discovery report displays installed components for the version of SQL\nServer associated with setup.exe, along with installed components of all\nlesser versions of SQL Server that are installed.", "Tags": [ "Feature", "Component" ], + "Synopsis": "Runs the SQL Server feature discovery report (setup.exe /Action=RunDiscovery)", + "Alias": "Get-DbaSqlFeature", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Get-DbaFeature", + "Availability": "Windows only", + "Links": "https://dbatools.io/Get-DbaFeature", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaFeature -ComputerName sql2017, sql2016, sql2005\nGets all SQL Server features for all instances on sql2017, sql2016 and sql2005.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaFeature -Verbose\nGets all SQL Server features for all instances on localhost. Outputs to screen if no instances are found.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaFeature -ComputerName sql2017 -Credential ad\\sqldba\nGets all SQL Server features for all instances on sql2017 using the ad\\sqladmin credential (which has access to the Windows Server).", "Params": [ [ "ComputerName", @@ -14458,18 +15003,19 @@ "False" ] ], - "Alias": "Get-DbaSqlFeature", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Runs the SQL Server feature discovery report (setup.exe /Action=RunDiscovery)", - "Name": "Get-DbaFeature", - "Links": "https://dbatools.io/Get-DbaFeature", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaFeature -ComputerName sql2017, sql2016, sql2005\nGets all SQL Server features for all instances on sql2017, sql2016 and sql2005.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaFeature -Verbose\nGets all SQL Server features for all instances on localhost. Outputs to screen if no instances are found.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaFeature -ComputerName sql2017 -Credential ad\\sqldba\nGets all SQL Server features for all instances on sql2017 using the ad\\sqladmin credential (which has access to the Windows Server).", "Syntax": "Get-DbaFeature [[-ComputerName] \u003cDbaInstanceParameter[]\u003e] [[-Credential] \u003cPSCredential\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaFile", + "Name": "Get-DbaFile", "Description": "This command searches all specified directories, allowing a DBA to see file information on a server without direct access\n\nYou can filter by extension using the -FileType parameter. By default, the default data directory will be returned. You can provide and additional paths to search using the -Path parameter.\n\nThanks to serg-52 for the query: https://www.sqlservercentral.com/Forums/Topic1642213-391-1.aspx", "Tags": "Discovery", + "Synopsis": "Get-DbaFile finds files in any directory specified on a remote SQL Server", + "Alias": "", + "Author": "Brandon Abshire, netnerds.net", + "CommandName": "Get-DbaFile", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Get-DbaFile", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaFile -SqlInstance sqlserver2014a -Path E:\\Dir1\nLogs into the SQL Server \"sqlserver2014a\" using Windows credentials and searches E:\\Dir for all files\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaFile -SqlInstance sqlserver2014a -SqlCredential $cred -Path \u0027E:\\sql files\u0027\nLogs into the SQL Server \"sqlserver2014a\" using alternative credentials and returns all files in \u0027E:\\sql files\u0027\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003e$all = Get-DbaDefaultPath -SqlInstance sql2014\nPS C:\\\u003e Get-DbaFile -SqlInstance sql2014 -Path $all.Data, $all.Log, $all.Backup -Depth 3\nReturns the files in the default data, log and backup directories on sql2014, 3 directories deep (recursively).\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaFile -SqlInstance sql2014 -Path \u0027E:\\Dir1\u0027, \u0027E:\\Dir2\u0027\nReturns the files in \"E:\\Dir1\" and \"E:Dir2\" on sql2014\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eGet-DbaFile -SqlInstance sql2014, sql2016 -Path \u0027E:\\Dir1\u0027 -FileType fsf, mld\nFinds files in E:\\Dir1 ending with \".fsf\" and \".mld\" for both the servers sql2014 and sql2016.", "Params": [ [ "SqlInstance", @@ -14520,18 +15066,19 @@ "False" ] ], - "Alias": "", - "Author": "Brandon Abshire, netnerds.net", - "Synopsis": "Get-DbaFile finds files in any directory specified on a remote SQL Server", - "Name": "Get-DbaFile", - "Links": "https://dbatools.io/Get-DbaFile", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaFile -SqlInstance sqlserver2014a -Path E:\\Dir1\nLogs into the SQL Server \"sqlserver2014a\" using Windows credentials and searches E:\\Dir for all files\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaFile -SqlInstance sqlserver2014a -SqlCredential $cred -Path \u0027E:\\sql files\u0027\nLogs into the SQL Server \"sqlserver2014a\" using alternative credentials and returns all files in \u0027E:\\sql files\u0027\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003e$all = Get-DbaDefaultPath -SqlInstance sql2014\nPS C:\\\u003e Get-DbaFile -SqlInstance sql2014 -Path $all.Data, $all.Log, $all.Backup -Depth 3\nReturns the files in the default data, log and backup directories on sql2014, 3 directories deep (recursively).\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaFile -SqlInstance sql2014 -Path \u0027E:\\Dir1\u0027, \u0027E:\\Dir2\u0027\nReturns the files in \"E:\\Dir1\" and \"E:Dir2\" on sql2014\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eGet-DbaFile -SqlInstance sql2014, sql2016 -Path \u0027E:\\Dir1\u0027 -FileType fsf, mld\nFinds files in E:\\Dir1 ending with \".fsf\" and \".mld\" for both the servers sql2014 and sql2016.", "Syntax": "Get-DbaFile [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [[-Path] \u003cString[]\u003e] [[-FileType] \u003cString[]\u003e] [[-Depth] \u003cInt32\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaFilestream", + "Name": "Get-DbaFilestream", "Description": "Returns the status of Filestream on specified SQL Server for both the Service and Instance levels.", "Tags": "Filestream", + "Synopsis": "Returns the status of Filestream on specified SQL Server for both the Service and Instance levels.", + "Alias": "", + "Author": "Stuart Moore ( @napalmgram ) | Chrissy LeMaire ( @cl )", + "CommandName": "Get-DbaFilestream", + "Availability": "Windows only", + "Links": "https://dbatools.io/Get-DbaFilestream", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaFilestream -SqlInstance server1\\instance2\nWill return the status of Filestream configuration for the service and instance server1\\instance2\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaFilestream -SqlInstance server1\\instance2 -SqlCredential sqladmin\nPrompts for the password to the SQL Login \"sqladmin\" then returns the status of Filestream configuration for the service and instance server1\\instance2", "Params": [ [ "SqlInstance", @@ -14566,18 +15113,19 @@ "False" ] ], - "Alias": "", - "Author": "Stuart Moore ( @napalmgram ) | Chrissy LeMaire ( @cl )", - "Synopsis": "Returns the status of Filestream on specified SQL Server for both the Service and Instance levels.", - "Name": "Get-DbaFilestream", - "Links": "https://dbatools.io/Get-DbaFilestream", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaFilestream -SqlInstance server1\\instance2\nWill return the status of Filestream configuration for the service and instance server1\\instance2\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaFilestream -SqlInstance server1\\instance2 -SqlCredential sqladmin\nPrompts for the password to the SQL Login \"sqladmin\" then returns the status of Filestream configuration for the service and instance server1\\instance2", "Syntax": "Get-DbaFilestream [[-SqlInstance] \u003cDbaInstanceParameter[]\u003e] [[-SqlCredential] \u003cPSCredential\u003e] [[-Credential] \u003cPSCredential\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaForceNetworkEncryption", + "Name": "Get-DbaForceNetworkEncryption", "Description": "Gets Force Encryption settings for a SQL Server instance. Note that this requires access to the Windows Server - not the SQL instance itself.\n\nThis setting is found in Configuration Manager.", "Tags": "Certificate", + "Synopsis": "Gets Force Encryption settings for a SQL Server instance", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Get-DbaForceNetworkEncryption", + "Availability": "Windows only", + "Links": "https://dbatools.io/Get-DbaForceNetworkEncryption", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaForceNetworkEncryption\nGets Force Encryption properties on the default (MSSQLSERVER) instance on localhost - requires (and checks for) RunAs admin.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaForceNetworkEncryption -SqlInstance sql01\\SQL2008R2SP2\nGets Force Network Encryption for the SQL2008R2SP2 on sql01. Uses Windows Credentials to both login and view the registry.", "Params": [ [ "SqlInstance", @@ -14604,18 +15152,19 @@ "False" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Gets Force Encryption settings for a SQL Server instance", - "Name": "Get-DbaForceNetworkEncryption", - "Links": "https://dbatools.io/Get-DbaForceNetworkEncryption", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaForceNetworkEncryption\nGets Force Encryption properties on the default (MSSQLSERVER) instance on localhost - requires (and checks for) RunAs admin.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaForceNetworkEncryption -SqlInstance sql01\\SQL2008R2SP2\nGets Force Network Encryption for the SQL2008R2SP2 on sql01. Uses Windows Credentials to both login and view the registry.", "Syntax": "Get-DbaForceNetworkEncryption [[-SqlInstance] \u003cDbaInstanceParameter[]\u003e] [[-Credential] \u003cPSCredential\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaHelpIndex", + "Name": "Get-DbaHelpIndex", "Description": "This function will return detailed information on indexes (and optionally statistics) for all indexes in a database, or a given index should one be passed along.\nAs this uses SQL Server DMVs to access the data it will only work in 2005 and up (sorry folks still running SQL Server 2000).\nFor performance reasons certain statistics information will not be returned from SQL Server 2005 if an ObjectName is not provided.\n\nThe data includes:\n- ObjectName: the table containing the index\n- IndexType: clustered/non-clustered/columnstore and whether the index is unique/primary key\n- KeyColumns: the key columns of the index\n- IncludeColumns: any include columns in the index\n- FilterDefinition: any filter that may have been used in the index\n- DataCompression: row/page/none depending upon whether or not compression has been used\n- IndexReads: the number of reads of the index since last restart or index rebuild\n- IndexUpdates: the number of writes to the index since last restart or index rebuild\n- SizeKB: the size the index in KB\n- IndexRows: the number of the rows in the index (note filtered indexes will have fewer rows than exist in the table)\n- IndexLookups: the number of lookups that have been performed (only applicable for the heap or clustered index)\n- MostRecentlyUsed: when the index was most recently queried (default to 1900 for when never read)\n- StatsSampleRows: the number of rows queried when the statistics were built/rebuilt (not included in SQL Server 2005 unless ObjectName is specified)\n- StatsRowMods: the number of changes to the statistics since the last rebuild\n- HistogramSteps: the number of steps in the statistics histogram (not included in SQL Server 2005 unless ObjectName is specified)\n- StatsLastUpdated: when the statistics were last rebuilt (not included in SQL Server 2005 unless ObjectName is specified)", "Tags": "Index", + "Synopsis": "Returns size, row and configuration information for indexes in databases.", + "Alias": "", + "Author": "Nic Cain, https://sirsql.net/", + "CommandName": "Get-DbaHelpIndex", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Get-DbaHelpIndex", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaHelpIndex -SqlInstance localhost -Database MyDB\nReturns information on all indexes on the MyDB database on the localhost.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaHelpIndex -SqlInstance localhost -Database MyDB,MyDB2\nReturns information on all indexes on the MyDB \u0026 MyDB2 databases.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaHelpIndex -SqlInstance localhost -Database MyDB -ObjectName dbo.Table1\nReturns index information on the object dbo.Table1 in the database MyDB.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaHelpIndex -SqlInstance localhost -Database MyDB -ObjectName dbo.Table1 -IncludeStats\nReturns information on the indexes and statistics for the table dbo.Table1 in the MyDB database.\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eGet-DbaHelpIndex -SqlInstance localhost -Database MyDB -ObjectName dbo.Table1 -IncludeDataTypes\nReturns the index information for the table dbo.Table1 in the MyDB database, and includes the data types for the key and include columns.\n-------------------------- EXAMPLE 6 --------------------------\nPS C:\\\u003eGet-DbaHelpIndex -SqlInstance localhost -Database MyDB -ObjectName dbo.Table1 -Raw\nReturns the index information for the table dbo.Table1 in the MyDB database, and returns the numerical data without localized separators.\n-------------------------- EXAMPLE 7 --------------------------\nPS C:\\\u003eGet-DbaHelpIndex -SqlInstance localhost -Database MyDB -IncludeStats -Raw\nReturns the index information for all indexes in the MyDB database as well as their statistics, and formats the numerical data without localized separators.\n-------------------------- EXAMPLE 8 --------------------------\nPS C:\\\u003eGet-DbaHelpIndex -SqlInstance localhost -Database MyDB -IncludeFragmentation\nReturns the index information for all indexes in the MyDB database as well as their fragmentation\n-------------------------- EXAMPLE 9 --------------------------\nPS C:\\\u003eGet-DbaDatabase -SqlInstance sql2017 -Database MyDB | Get-DbaHelpIndex\nReturns the index information for all indexes in the MyDB database", "Params": [ [ "SqlInstance", @@ -14706,22 +15255,23 @@ "False" ] ], - "Alias": "", - "Author": "Nic Cain, https://sirsql.net/", - "Synopsis": "Returns size, row and configuration information for indexes in databases.", - "Name": "Get-DbaHelpIndex", - "Links": "https://dbatools.io/Get-DbaHelpIndex", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaHelpIndex -SqlInstance localhost -Database MyDB\nReturns information on all indexes on the MyDB database on the localhost.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaHelpIndex -SqlInstance localhost -Database MyDB,MyDB2\nReturns information on all indexes on the MyDB \u0026 MyDB2 databases.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaHelpIndex -SqlInstance localhost -Database MyDB -ObjectName dbo.Table1\nReturns index information on the object dbo.Table1 in the database MyDB.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaHelpIndex -SqlInstance localhost -Database MyDB -ObjectName dbo.Table1 -IncludeStats\nReturns information on the indexes and statistics for the table dbo.Table1 in the MyDB database.\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eGet-DbaHelpIndex -SqlInstance localhost -Database MyDB -ObjectName dbo.Table1 -IncludeDataTypes\nReturns the index information for the table dbo.Table1 in the MyDB database, and includes the data types for the key and include columns.\n-------------------------- EXAMPLE 6 --------------------------\nPS C:\\\u003eGet-DbaHelpIndex -SqlInstance localhost -Database MyDB -ObjectName dbo.Table1 -Raw\nReturns the index information for the table dbo.Table1 in the MyDB database, and returns the numerical data without localized separators.\n-------------------------- EXAMPLE 7 --------------------------\nPS C:\\\u003eGet-DbaHelpIndex -SqlInstance localhost -Database MyDB -IncludeStats -Raw\nReturns the index information for all indexes in the MyDB database as well as their statistics, and formats the numerical data without localized separators.\n-------------------------- EXAMPLE 8 --------------------------\nPS C:\\\u003eGet-DbaHelpIndex -SqlInstance localhost -Database MyDB -IncludeFragmentation\nReturns the index information for all indexes in the MyDB database as well as their fragmentation\n-------------------------- EXAMPLE 9 --------------------------\nPS C:\\\u003eGet-DbaDatabase -SqlInstance sql2017 -Database MyDB | Get-DbaHelpIndex\nReturns the index information for all indexes in the MyDB database", "Syntax": "Get-DbaHelpIndex [[-SqlInstance] \u003cDbaInstanceParameter[]\u003e] [[-SqlCredential] \u003cPSCredential\u003e] [[-Database] \u003cObject[]\u003e] [[-ExcludeDatabase] \u003cObject[]\u003e] [[-InputObject] \u003cDatabase[]\u003e] [[-ObjectName] \u003cString\u003e] [-IncludeStats] [-IncludeDataTypes] [-Raw] [-IncludeFragmentation] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaInstanceProperty", + "Name": "Get-DbaInstanceProperty", "Description": "The Get-DbaInstanceProperty command gets SQL Server instance properties from the SMO object sqlserver.", "Tags": [ "Instance", "Configure", "Configuration" ], + "Synopsis": "Gets SQL Server instance properties of one or more instance(s) of SQL Server.", + "Alias": "Get-DbaSqlInstanceProperty", + "Author": "Klaas Vandenberghe (@powerdbaklaas)", + "CommandName": "Get-DbaInstanceProperty", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Get-DbaInstanceProperty", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaInstanceProperty -SqlInstance localhost\nReturns SQL Server instance properties on the local default SQL Server instance\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaInstanceProperty -SqlInstance sql2, sql4\\sqlexpress\nReturns SQL Server instance properties on default instance on sql2 and sqlexpress instance on sql4\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003e\u0027sql2\u0027,\u0027sql4\u0027 | Get-DbaInstanceProperty\nReturns SQL Server instance properties on sql2 and sql4\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaInstanceProperty -SqlInstance sql2,sql4 -InstanceProperty DefaultFile\nReturns SQL Server instance property DefaultFile on instance sql2 and sql4\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eGet-DbaInstanceProperty -SqlInstance sql2,sql4 -ExcludeInstanceProperty DefaultFile\nReturns all SQL Server instance properties except DefaultFile on instance sql2 and sql4\n-------------------------- EXAMPLE 6 --------------------------\nPS C:\\\u003e$cred = Get-Credential sqladmin\nPS C:\\\u003e Get-DbaInstanceProperty -SqlInstance sql2 -SqlCredential $cred\nConnects using sqladmin credential and returns SQL Server instance properties from sql2", "Params": [ [ "SqlInstance", @@ -14764,22 +15314,23 @@ "False" ] ], - "Alias": "Get-DbaSqlInstanceProperty", - "Author": "Klaas Vandenberghe (@powerdbaklaas)", - "Synopsis": "Gets SQL Server instance properties of one or more instance(s) of SQL Server.", - "Name": "Get-DbaInstanceProperty", - "Links": "https://dbatools.io/Get-DbaInstanceProperty", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaInstanceProperty -SqlInstance localhost\nReturns SQL Server instance properties on the local default SQL Server instance\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaInstanceProperty -SqlInstance sql2, sql4\\sqlexpress\nReturns SQL Server instance properties on default instance on sql2 and sqlexpress instance on sql4\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003e\u0027sql2\u0027,\u0027sql4\u0027 | Get-DbaInstanceProperty\nReturns SQL Server instance properties on sql2 and sql4\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaInstanceProperty -SqlInstance sql2,sql4 -InstanceProperty DefaultFile\nReturns SQL Server instance property DefaultFile on instance sql2 and sql4\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eGet-DbaInstanceProperty -SqlInstance sql2,sql4 -ExcludeInstanceProperty DefaultFile\nReturns all SQL Server instance properties except DefaultFile on instance sql2 and sql4\n-------------------------- EXAMPLE 6 --------------------------\nPS C:\\\u003e$cred = Get-Credential sqladmin\nPS C:\\\u003e Get-DbaInstanceProperty -SqlInstance sql2 -SqlCredential $cred\nConnects using sqladmin credential and returns SQL Server instance properties from sql2", "Syntax": "Get-DbaInstanceProperty [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [-SqlCredential \u003cPSCredential\u003e] [-InstanceProperty \u003cObject[]\u003e] [-ExcludeInstanceProperty \u003cObject[]\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaInstanceUserOption", + "Name": "Get-DbaInstanceUserOption", "Description": "The Get-DbaInstanceUserOption command gets SQL Instance user options from the SMO object sqlserver.", "Tags": [ "Instance", "Configure", "UserOption" ], + "Synopsis": "Gets SQL Instance user options of one or more instance(s) of SQL Server.", + "Alias": "Get-DbaSqlInstanceUserOption", + "Author": "Klaas Vandenberghe (@powerdbaklaas)", + "CommandName": "Get-DbaInstanceUserOption", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Get-DbaInstanceUserOption", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaInstanceUserOption -SqlInstance localhost\nReturns SQL Instance user options on the local default SQL Server instance\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaInstanceUserOption -SqlInstance sql2, sql4\\sqlexpress\nReturns SQL Instance user options on default instance on sql2 and sqlexpress instance on sql4\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003e\u0027sql2\u0027,\u0027sql4\u0027 | Get-DbaInstanceUserOption\nReturns SQL Instance user options on sql2 and sql4", "Params": [ [ "SqlInstance", @@ -14806,18 +15357,19 @@ "False" ] ], - "Alias": "Get-DbaSqlInstanceUserOption", - "Author": "Klaas Vandenberghe (@powerdbaklaas)", - "Synopsis": "Gets SQL Instance user options of one or more instance(s) of SQL Server.", - "Name": "Get-DbaInstanceUserOption", - "Links": "https://dbatools.io/Get-DbaInstanceUserOption", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaInstanceUserOption -SqlInstance localhost\nReturns SQL Instance user options on the local default SQL Server instance\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaInstanceUserOption -SqlInstance sql2, sql4\\sqlexpress\nReturns SQL Instance user options on default instance on sql2 and sqlexpress instance on sql4\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003e\u0027sql2\u0027,\u0027sql4\u0027 | Get-DbaInstanceUserOption\nReturns SQL Instance user options on sql2 and sql4", "Syntax": "Get-DbaInstanceUserOption [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [-SqlCredential \u003cPSCredential\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaIoLatency", + "Name": "Get-DbaIoLatency", "Description": "This command is based off of Paul Randal\u0027s post \"Advanced SQL Server performance tuning\"\n\nReturns both raw and aggregate information\n\nReference: https://www.sqlskills.com/blogs/paul/how-to-examine-io-subsystem-latencies-from-within-sql-server/\n https://www.sqlskills.com/blogs/paul/capturing-io-latencies-period-time/", "Tags": "IOLatency", + "Synopsis": "Displays IO subsystem latency statistics from sys.dm_io_virtual_file_stats. Works on SQL Server 2005 and above.", + "Alias": "", + "Author": "Patrick Flynn (@sqllensman)", + "CommandName": "Get-DbaIoLatency", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Get-DbaIoLatency", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaIoLatency -SqlInstance sql2008, sqlserver2012\nGet IO subsystem latency statistics for servers sql2008 and sqlserver2012.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003e$output = Get-DbaIoLatency -SqlInstance sql2008 | Select * | ConvertTo-DbaDataTable\nCollects all IO subsystem latency statistics on server sql2008 into a Data Table.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003e\u0027sql2008\u0027,\u0027sqlserver2012\u0027 | Get-DbaIoLatency\nGet IO subsystem latency statistics for servers sql2008 and sqlserver2012 via pipline\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003e$cred = Get-Credential sqladmin\nPS C:\\\u003e Get-DbaIoLatency -SqlInstance sql2008 -SqlCredential $cred\nConnects using sqladmin credential and returns IO subsystem latency statistics from sql2008", "Params": [ [ "SqlInstance", @@ -14844,82 +15396,26 @@ "False" ] ], - "Alias": "", - "Author": "Patrick Flynn (@sqllensman)", - "Synopsis": "Displays IO subsystem latency statistics from sys.dm_io_virtual_file_stats. Works on SQL Server 2005 and above.", - "Name": "Get-DbaIoLatency", - "Links": "https://dbatools.io/Get-DbaIoLatency", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaIoLatency -SqlInstance sql2008, sqlserver2012\nGet IO subsystem latency statistics for servers sql2008 and sqlserver2012.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003e$output = Get-DbaIoLatency -SqlInstance sql2008 | Select * | ConvertTo-DbaDataTable\nCollects all IO subsystem latency statistics on server sql2008 into a Data Table.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003e\u0027sql2008\u0027,\u0027sqlserver2012\u0027 | Get-DbaIoLatency\nGet IO subsystem latency statistics for servers sql2008 and sqlserver2012 via pipline\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003e$cred = Get-Credential sqladmin\nPS C:\\\u003e Get-DbaIoLatency -SqlInstance sql2008 -SqlCredential $cred\nConnects using sqladmin credential and returns IO subsystem latency statistics from sql2008", "Syntax": "Get-DbaIoLatency [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaLastBackup", + "Name": "Get-DbaLastBackup", "Description": "Retrieves and compares the date/time for the last known backups, as well as the creation date/time for the database.\n\nDefault output includes columns Server, Database, RecoveryModel, LastFullBackup, LastDiffBackup, LastLogBackup, SinceFull, SinceDiff, SinceLog, Status, DatabaseCreated, DaysSinceDbCreated.", "Tags": [ "DisasterRecovery", "Backup" ], - "Params": [ - [ - "SqlInstance", - "The target SQL Server instance or instances.", - "ServerInstance,SqlServer", - true, - "true (ByValue)", - "" - ], - [ - "SqlCredential", - "Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential)", - "Credential", - false, - "false", - "" - ], - [ - "Database", - "Specifies one or more database(s) to process. If unspecified, all databases will be processed.", - "Databases", - false, - "false", - "" - ], - [ - "ExcludeDatabase", - "Specifies one or more database(s) to exclude from processing.", - "", - false, - "false", - "" - ], - [ - "EnableException", - "If this switch is enabled exceptions will be thrown to the caller, which will need to perform its own exception processing. Otherwise, the function will try to catch the exception, interpret it and \r\nprovide a friendly error message.", - "Silent", - false, - "false", - "False" - ] - ], + "Synopsis": "Get date/time for last known backups of databases.", "Alias": "", "Author": "Klaas Vandenberghe (@PowerDBAKlaas)", - "Synopsis": "Get date/time for last known backups of databases.", - "Name": "Get-DbaLastBackup", + "CommandName": "Get-DbaLastBackup", + "Availability": "Windows, Linux, macOS", "Links": "https://dbatools.io/Get-DbaLastBackup", "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaLastBackup -SqlInstance ServerA\\sql987\nReturns a custom object displaying Server, Database, RecoveryModel, LastFullBackup, LastDiffBackup, LastLogBackup, SinceFull, SinceDiff, SinceLog, Status, DatabaseCreated, DaysSinceDbCreated\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaLastBackup -SqlInstance ServerA\\sql987\nReturns a custom object with Server name, Database name, and the date the last time backups were performed.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaLastBackup -SqlInstance ServerA\\sql987 | Select *\nReturns a custom object with Server name, Database name, and the date the last time backups were performed, and also recoverymodel and calculations on how long ago backups were taken and what the \r\nstatus is.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaLastBackup -SqlInstance ServerA\\sql987 | Select * | Out-Gridview\nReturns a gridview displaying Server, Database, RecoveryModel, LastFullBackup, LastDiffBackup, LastLogBackup, SinceFull, SinceDiff, SinceLog, Status, DatabaseCreated, DaysSinceDbCreated.", - "Syntax": "Get-DbaLastBackup [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [[-Database] \u003cObject[]\u003e] [[-ExcludeDatabase] \u003cObject[]\u003e] [-EnableException] [\u003cCommonParameters\u003e]" - }, - { - "CommandName": "Get-DbaLastGoodCheckDb", - "Description": "Retrieves and compares the date/time for the last known good DBCC CHECKDB, as well as the creation date/time for the database.\n\nThis function supports SQL Server 2005 and higher.\n\nPlease note that this script uses the DBCC DBINFO() WITH TABLERESULTS. DBCC DBINFO has several known weak points, such as:\n- DBCC DBINFO is an undocumented feature/command.\n- The LastKnowGood timestamp is updated when a DBCC CHECKFILEGROUP is performed.\n- The LastKnowGood timestamp is updated when a DBCC CHECKDB WITH PHYSICAL_ONLY is performed.\n- The LastKnowGood timestamp does not get updated when a database in READ_ONLY.\n\nAn empty ($null) LastGoodCheckDb result indicates that a good DBCC CHECKDB has never been performed.\n\nSQL Server 2008R2 has a \"bug\" that causes each databases to possess two dbi_dbccLastKnownGood fields, instead of the normal one.\n\nThis script will only display this function to only display the newest timestamp. If -Verbose is specified, the function will announce every time more than one dbi_dbccLastKnownGood fields is encountered.", - "Tags": [ - "CHECKDB", - "Database" - ], "Params": [ [ "SqlInstance", - "The target SQL Server instance or instances. Defaults to localhost.", + "The target SQL Server instance or instances.", "ServerInstance,SqlServer", true, "true (ByValue)", @@ -14951,28 +15447,87 @@ ], [ "EnableException", - "By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message.\r\nThis avoids overwhelming you with \"sea of red\" exceptions, but is inconvenient because it basically disables advanced scripting.\r\nUsing this switch turns this \"nice by default\" feature off and enables you to catch exceptions with your own try/catch.", + "If this switch is enabled exceptions will be thrown to the caller, which will need to perform its own exception processing. Otherwise, the function will try to catch the exception, interpret it and \r\nprovide a friendly error message.", "Silent", false, "false", "False" ] ], + "Syntax": "Get-DbaLastBackup [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [[-Database] \u003cObject[]\u003e] [[-ExcludeDatabase] \u003cObject[]\u003e] [-EnableException] [\u003cCommonParameters\u003e]" + }, + { + "Name": "Get-DbaLastGoodCheckDb", + "Description": "Retrieves and compares the date/time for the last known good DBCC CHECKDB, as well as the creation date/time for the database.\n\nThis function supports SQL Server 2005 and higher.\n\nPlease note that this script uses the DBCC DBINFO() WITH TABLERESULTS. DBCC DBINFO has several known weak points, such as:\n- DBCC DBINFO is an undocumented feature/command.\n- The LastKnowGood timestamp is updated when a DBCC CHECKFILEGROUP is performed.\n- The LastKnowGood timestamp is updated when a DBCC CHECKDB WITH PHYSICAL_ONLY is performed.\n- The LastKnowGood timestamp does not get updated when a database in READ_ONLY.\n\nAn empty ($null) LastGoodCheckDb result indicates that a good DBCC CHECKDB has never been performed.\n\nSQL Server 2008R2 has a \"bug\" that causes each databases to possess two dbi_dbccLastKnownGood fields, instead of the normal one.\n\nThis script will only display this function to only display the newest timestamp. If -Verbose is specified, the function will announce every time more than one dbi_dbccLastKnownGood fields is encountered.", + "Tags": [ + "CHECKDB", + "Database" + ], + "Synopsis": "Get date/time for last known good DBCC CHECKDB", "Alias": "", "Author": "Jakob Bindslet (jakob@bindslet.dk)", - "Synopsis": "Get date/time for last known good DBCC CHECKDB", - "Name": "Get-DbaLastGoodCheckDb", + "CommandName": "Get-DbaLastGoodCheckDb", + "Availability": "Windows, Linux, macOS", "Links": "https://dbatools.io/Get-DbaLastGoodCheckDb", "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaLastGoodCheckDb -SqlInstance ServerA\\sql987\nReturns a custom object displaying Server, Database, DatabaseCreated, LastGoodCheckDb, DaysSinceDbCreated, DaysSinceLastGoodCheckDb, Status and DataPurityEnabled\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaLastGoodCheckDb -SqlInstance ServerA\\sql987 -SqlCredential sqladmin | Format-Table -AutoSize\nReturns a formatted table displaying Server, Database, DatabaseCreated, LastGoodCheckDb, DaysSinceDbCreated, DaysSinceLastGoodCheckDb, Status and DataPurityEnabled. Authenticates using SQL Server \r\nauthentication.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaLastGoodCheckDb -SqlInstance sql2016 -ExcludeDatabase \"TempDB\" | Format-Table -AutoSize\nReturns a formatted table displaying Server, Database, DatabaseCreated, LastGoodCheckDb, DaysSinceDbCreated, DaysSinceLastGoodCheckDb, Status and DataPurityEnabled. All databases except for \"TempDB\" \r\nwill be displayed in the output.", + "Params": [ + [ + "SqlInstance", + "The target SQL Server instance or instances. Defaults to localhost.", + "ServerInstance,SqlServer", + true, + "true (ByValue)", + "" + ], + [ + "SqlCredential", + "Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential)", + "Credential", + false, + "false", + "" + ], + [ + "Database", + "Specifies one or more database(s) to process. If unspecified, all databases will be processed.", + "Databases", + false, + "false", + "" + ], + [ + "ExcludeDatabase", + "Specifies one or more database(s) to exclude from processing.", + "", + false, + "false", + "" + ], + [ + "EnableException", + "By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message.\r\nThis avoids overwhelming you with \"sea of red\" exceptions, but is inconvenient because it basically disables advanced scripting.\r\nUsing this switch turns this \"nice by default\" feature off and enables you to catch exceptions with your own try/catch.", + "Silent", + false, + "false", + "False" + ] + ], "Syntax": "Get-DbaLastGoodCheckDb [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [[-Database] \u003cObject[]\u003e] [[-ExcludeDatabase] \u003cObject[]\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaLatchStatistic", + "Name": "Get-DbaLatchStatistic", "Description": "This command is based off of Paul Randal\u0027s post \"Advanced SQL Server performance tuning\"\n\nReturns:\n LatchClass\n WaitSeconds\n WaitCount\n Percentage\n AverageWaitSeconds\n URL\n\nReference: https://www.sqlskills.com/blogs/paul/advanced-performance-troubleshooting-waits-latches-spinlocks/\n https://www.sqlskills.com/blogs/paul/most-common-latch-classes-and-what-they-mean/", "Tags": [ "LatchStatistics", "Waits" ], + "Synopsis": "Displays latch statistics from sys.dm_os_latch_stats", + "Alias": "", + "Author": "Patrick Flynn (@sqllensman)", + "CommandName": "Get-DbaLatchStatistic", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Get-DbaLatchStatistic", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaLatchStatistic -SqlInstance sql2008, sqlserver2012\nCheck latch statistics for servers sql2008 and sqlserver2012\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaLatchStatistic -SqlInstance sql2008 -Threshold 98\nCheck latch statistics on server sql2008 for thresholds above 98%\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003e$output = Get-DbaLatchStatistic -SqlInstance sql2008 -Threshold 100 | Select * | ConvertTo-DbaDataTable\nCollects all latch statistics on server sql2008 into a Data Table.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003e\u0027sql2008\u0027,\u0027sqlserver2012\u0027 | Get-DbaLatchStatistic\nGet latch statistics for servers sql2008 and sqlserver2012 via pipline\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003e$cred = Get-Credential sqladmin\nPS C:\\\u003e Get-DbaLatchStatistic -SqlInstance sql2008 -SqlCredential $cred\nConnects using sqladmin credential and returns latch statistics from sql2008\n-------------------------- EXAMPLE 6 --------------------------\nPS C:\\\u003e$output = Get-DbaLatchStatistic -SqlInstance sql2008\nPS C:\\\u003e $output\r\nPS C:\\\u003e foreach ($row in ($output | Sort-Object -Unique Url)) { Start-Process ($row).Url }\nDisplays the output then loads the associated sqlskills website for each result. Opens one tab per unique URL.", "Params": [ [ "SqlInstance", @@ -15007,21 +15562,22 @@ "False" ] ], - "Alias": "", - "Author": "Patrick Flynn (@sqllensman)", - "Synopsis": "Displays latch statistics from sys.dm_os_latch_stats", - "Name": "Get-DbaLatchStatistic", - "Links": "https://dbatools.io/Get-DbaLatchStatistic", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaLatchStatistic -SqlInstance sql2008, sqlserver2012\nCheck latch statistics for servers sql2008 and sqlserver2012\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaLatchStatistic -SqlInstance sql2008 -Threshold 98\nCheck latch statistics on server sql2008 for thresholds above 98%\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003e$output = Get-DbaLatchStatistic -SqlInstance sql2008 -Threshold 100 | Select * | ConvertTo-DbaDataTable\nCollects all latch statistics on server sql2008 into a Data Table.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003e\u0027sql2008\u0027,\u0027sqlserver2012\u0027 | Get-DbaLatchStatistic\nGet latch statistics for servers sql2008 and sqlserver2012 via pipline\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003e$cred = Get-Credential sqladmin\nPS C:\\\u003e Get-DbaLatchStatistic -SqlInstance sql2008 -SqlCredential $cred\nConnects using sqladmin credential and returns latch statistics from sql2008\n-------------------------- EXAMPLE 6 --------------------------\nPS C:\\\u003e$output = Get-DbaLatchStatistic -SqlInstance sql2008\nPS C:\\\u003e $output\r\nPS C:\\\u003e foreach ($row in ($output | Sort-Object -Unique Url)) { Start-Process ($row).Url }\nDisplays the output then loads the associated sqlskills website for each result. Opens one tab per unique URL.", "Syntax": "Get-DbaLatchStatistic [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [[-Threshold] \u003cInt32\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaLinkedServer", + "Name": "Get-DbaLinkedServer", "Description": "Retrieves information about each linked server on the instance(s).", "Tags": [ "LinkedServer", "Linked" ], + "Synopsis": "Gets all linked servers and a summary of information from the linked servers listed.", + "Alias": "", + "Author": "Stephen Bennett, https://sqlnotesfromtheunderground.wordpress.com/", + "CommandName": "Get-DbaLinkedServer", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Get-DbaLinkedServer", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaLinkedServer -SqlInstance DEV01\nReturns all linked servers for the SQL Server instance DEV01\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaCmsRegServer -SqlInstance DEV01 -Group SQLDEV | Get-DbaLinkedServer | Out-GridView\nReturns all linked servers for a group of servers from SQL Server Central Management Server (CMS). Send output to GridView.", "Params": [ [ "SqlInstance", @@ -15064,18 +15620,19 @@ "False" ] ], - "Alias": "", - "Author": "Stephen Bennett, https://sqlnotesfromtheunderground.wordpress.com/", - "Synopsis": "Gets all linked servers and a summary of information from the linked servers listed.", - "Name": "Get-DbaLinkedServer", - "Links": "https://dbatools.io/Get-DbaLinkedServer", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaLinkedServer -SqlInstance DEV01\nReturns all linked servers for the SQL Server instance DEV01\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaCmsRegServer -SqlInstance DEV01 -Group SQLDEV | Get-DbaLinkedServer | Out-GridView\nReturns all linked servers for a group of servers from SQL Server Central Management Server (CMS). Send output to GridView.", "Syntax": "Get-DbaLinkedServer [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [[-LinkedServer] \u003cObject[]\u003e] [[-ExcludeLinkedServer] \u003cObject[]\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaLocaleSetting", + "Name": "Get-DbaLocaleSetting", "Description": "Gets the Locale settings on one or more computers.\n\nRequires Local Admin rights on destination computer(s).", "Tags": "OS", + "Synopsis": "Gets the Locale settings on a computer.", + "Alias": "", + "Author": "Klaas Vandenberghe (@PowerDBAKlaas)", + "CommandName": "Get-DbaLocaleSetting", + "Availability": "Windows only", + "Links": "https://dbatools.io/Get-DbaLocaleSetting", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaLocaleSetting -ComputerName sqlserver2014a\nGets the Locale settings on computer sqlserver2014a.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003e\u0027sql1\u0027,\u0027sql2\u0027,\u0027sql3\u0027 | Get-DbaLocaleSetting\nGets the Locale settings on computers sql1, sql2 and sql3.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaLocaleSetting -ComputerName sql1,sql2 -SqlCredential $credential | Out-Gridview\nGets the Locale settings on computers sql1 and sql2 using SQL Authentication to authenticate to the servers, and shows them in a grid view.", "Params": [ [ "ComputerName", @@ -15102,21 +15659,22 @@ "False" ] ], - "Alias": "", - "Author": "Klaas Vandenberghe (@PowerDBAKlaas)", - "Synopsis": "Gets the Locale settings on a computer.", - "Name": "Get-DbaLocaleSetting", - "Links": "https://dbatools.io/Get-DbaLocaleSetting", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaLocaleSetting -ComputerName sqlserver2014a\nGets the Locale settings on computer sqlserver2014a.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003e\u0027sql1\u0027,\u0027sql2\u0027,\u0027sql3\u0027 | Get-DbaLocaleSetting\nGets the Locale settings on computers sql1, sql2 and sql3.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaLocaleSetting -ComputerName sql1,sql2 -SqlCredential $credential | Out-Gridview\nGets the Locale settings on computers sql1 and sql2 using SQL Authentication to authenticate to the servers, and shows them in a grid view.", "Syntax": "Get-DbaLocaleSetting [[-ComputerName] \u003cString[]\u003e] [[-Credential] \u003cPSCredential\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaLogin", + "Name": "Get-DbaLogin", "Description": "The Get-DbaLogin function returns an SMO Login object for the logins passed, if there are no users passed it will return all logins.", "Tags": [ "Login", "Security" ], + "Synopsis": "Function to get an SMO login object of the logins for a given SQL Server instance. Takes a server object from the pipeline.", + "Alias": "", + "Author": "Mitchell Hamann (@SirCaptainMitch) | Rob Sewell (@SQLDBaWithBeard)", + "CommandName": "Get-DbaLogin", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Get-DbaLogin", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaLogin -SqlInstance sql2016\nGets all the logins from server sql2016 using NT authentication and returns the SMO login objects\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaLogin -SqlInstance sql2016 -SqlCredential $sqlcred\nGets all the logins for a given SQL Server using a passed credential object and returns the SMO login objects\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaLogin -SqlInstance sql2016 -SqlCredential $sqlcred -Login dbatoolsuser,TheCaptain\nGet specific logins from server sql2016 returned as SMO login objects.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaLogin -SqlInstance sql2016 -IncludeFilter \u0027##*\u0027,\u0027NT *\u0027\nGet all user objects from server sql2016 beginning with \u0027##\u0027 or \u0027NT \u0027, returned as SMO login objects.\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eGet-DbaLogin -SqlInstance sql2016 -ExcludeLogin dbatoolsuser\nGet all user objects from server sql2016 except the login dbatoolsuser, returned as SMO login objects.\n-------------------------- EXAMPLE 6 --------------------------\nPS C:\\\u003eGet-DbaLogin -SqlInstance sql2016 -Type Windows\nGet all user objects from server sql2016 that are Windows Logins\n-------------------------- EXAMPLE 7 --------------------------\nPS C:\\\u003eGet-DbaLogin -SqlInstance sql2016 -Type Windows -IncludeFilter *Rob*\nGet all user objects from server sql2016 that are Windows Logins and have Rob in the name\n-------------------------- EXAMPLE 8 --------------------------\nPS C:\\\u003eGet-DbaLogin -SqlInstance sql2016 -Type SQL\nGet all user objects from server sql2016 that are SQL Logins\n-------------------------- EXAMPLE 9 --------------------------\nPS C:\\\u003eGet-DbaLogin -SqlInstance sql2016 -Type SQL -IncludeFilter *Rob*\nGet all user objects from server sql2016 that are SQL Logins and have Rob in the name\n-------------------------- EXAMPLE 10 --------------------------\nPS C:\\\u003eGet-DbaLogin -SqlInstance sql2016 -ExcludeSystemLogin\nGet all user objects from server sql2016 that are not system objects\n-------------------------- EXAMPLE 11 --------------------------\nPS C:\\\u003eGet-DbaLogin -SqlInstance sql2016 -ExcludeFilter \u0027##*\u0027,\u0027NT *\u0027\nGet all user objects from server sql2016 except any beginning with \u0027##\u0027 or \u0027NT \u0027, returned as SMO login objects.\n-------------------------- EXAMPLE 12 --------------------------\nPS C:\\\u003e\u0027sql2016\u0027, \u0027sql2014\u0027 | Get-DbaLogin -SqlCredential $sqlcred\nUsing Get-DbaLogin on the pipeline, you can also specify which names you would like with -Login.\n-------------------------- EXAMPLE 13 --------------------------\nPS C:\\\u003e\u0027sql2016\u0027, \u0027sql2014\u0027 | Get-DbaLogin -SqlCredential $sqlcred -Locked\nUsing Get-DbaLogin on the pipeline to get all locked logins on servers sql2016 and sql2014.\n-------------------------- EXAMPLE 14 --------------------------\nPS C:\\\u003e\u0027sql2016\u0027, \u0027sql2014\u0027 | Get-DbaLogin -SqlCredential $sqlcred -HasAccess -Disabled\nUsing Get-DbaLogin on the pipeline to get all Disabled logins that have access on servers sql2016 or sql2014.", "Params": [ [ "SqlInstance", @@ -15231,21 +15789,22 @@ "False" ] ], - "Alias": "", - "Author": "Mitchell Hamann (@SirCaptainMitch) | Rob Sewell (@SQLDBaWithBeard)", - "Synopsis": "Function to get an SMO login object of the logins for a given SQL Server instance. Takes a server object from the pipeline.", - "Name": "Get-DbaLogin", - "Links": "https://dbatools.io/Get-DbaLogin", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaLogin -SqlInstance sql2016\nGets all the logins from server sql2016 using NT authentication and returns the SMO login objects\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaLogin -SqlInstance sql2016 -SqlCredential $sqlcred\nGets all the logins for a given SQL Server using a passed credential object and returns the SMO login objects\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaLogin -SqlInstance sql2016 -SqlCredential $sqlcred -Login dbatoolsuser,TheCaptain\nGet specific logins from server sql2016 returned as SMO login objects.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaLogin -SqlInstance sql2016 -IncludeFilter \u0027##*\u0027,\u0027NT *\u0027\nGet all user objects from server sql2016 beginning with \u0027##\u0027 or \u0027NT \u0027, returned as SMO login objects.\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eGet-DbaLogin -SqlInstance sql2016 -ExcludeLogin dbatoolsuser\nGet all user objects from server sql2016 except the login dbatoolsuser, returned as SMO login objects.\n-------------------------- EXAMPLE 6 --------------------------\nPS C:\\\u003eGet-DbaLogin -SqlInstance sql2016 -Type Windows\nGet all user objects from server sql2016 that are Windows Logins\n-------------------------- EXAMPLE 7 --------------------------\nPS C:\\\u003eGet-DbaLogin -SqlInstance sql2016 -Type Windows -IncludeFilter *Rob*\nGet all user objects from server sql2016 that are Windows Logins and have Rob in the name\n-------------------------- EXAMPLE 8 --------------------------\nPS C:\\\u003eGet-DbaLogin -SqlInstance sql2016 -Type SQL\nGet all user objects from server sql2016 that are SQL Logins\n-------------------------- EXAMPLE 9 --------------------------\nPS C:\\\u003eGet-DbaLogin -SqlInstance sql2016 -Type SQL -IncludeFilter *Rob*\nGet all user objects from server sql2016 that are SQL Logins and have Rob in the name\n-------------------------- EXAMPLE 10 --------------------------\nPS C:\\\u003eGet-DbaLogin -SqlInstance sql2016 -ExcludeSystemLogin\nGet all user objects from server sql2016 that are not system objects\n-------------------------- EXAMPLE 11 --------------------------\nPS C:\\\u003eGet-DbaLogin -SqlInstance sql2016 -ExcludeFilter \u0027##*\u0027,\u0027NT *\u0027\nGet all user objects from server sql2016 except any beginning with \u0027##\u0027 or \u0027NT \u0027, returned as SMO login objects.\n-------------------------- EXAMPLE 12 --------------------------\nPS C:\\\u003e\u0027sql2016\u0027, \u0027sql2014\u0027 | Get-DbaLogin -SqlCredential $sqlcred\nUsing Get-DbaLogin on the pipeline, you can also specify which names you would like with -Login.\n-------------------------- EXAMPLE 13 --------------------------\nPS C:\\\u003e\u0027sql2016\u0027, \u0027sql2014\u0027 | Get-DbaLogin -SqlCredential $sqlcred -Locked\nUsing Get-DbaLogin on the pipeline to get all locked logins on servers sql2016 and sql2014.\n-------------------------- EXAMPLE 14 --------------------------\nPS C:\\\u003e\u0027sql2016\u0027, \u0027sql2014\u0027 | Get-DbaLogin -SqlCredential $sqlcred -HasAccess -Disabled\nUsing Get-DbaLogin on the pipeline to get all Disabled logins that have access on servers sql2016 or sql2014.", "Syntax": "Get-DbaLogin [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [-SqlCredential \u003cPSCredential\u003e] [-Login \u003cObject[]\u003e] [-IncludeFilter \u003cObject[]\u003e] [-ExcludeLogin \u003cObject[]\u003e] [-ExcludeFilter \u003cObject[]\u003e] [-ExcludeSystemLogin] [-Type \u003cString\u003e] [-HasAccess] [-SqlLogins] [-WindowsLogins] [-Locked] [-Disabled] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaMaintenanceSolutionLog", + "Name": "Get-DbaMaintenanceSolutionLog", "Description": "Ola wrote a .sql script to get the content from the commandLog table. However, if LogToTable=\u0027N\u0027, there will be no logging in that table. This function reads the text files that are written in the SQL Instance\u0027s Log directory.", "Tags": [ "Ola", "Maintenance" ], + "Synopsis": "Reads the log files generated by the IndexOptimize Agent Job from Ola Hallengren\u0027s MaintenanceSolution.", + "Alias": "", + "Author": "Klaas Vandenberghe (@powerdbaklaas) | Simone Bizzotto ( @niphlod )", + "CommandName": "Get-DbaMaintenanceSolutionLog", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Get-DbaMaintenanceSolutionLog", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaMaintenanceSolutionLog -SqlInstance sqlserver2014a\nGets the outcome of the IndexOptimize job on sql instance sqlserver2014a.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaMaintenanceSolutionLog -SqlInstance sqlserver2014a -SqlCredential $credential\nGets the outcome of the IndexOptimize job on sqlserver2014a, using SQL Authentication.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003e\u0027sqlserver2014a\u0027, \u0027sqlserver2020test\u0027 | Get-DbaMaintenanceSolutionLog\nGets the outcome of the IndexOptimize job on sqlserver2014a and sqlserver2020test.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaMaintenanceSolutionLog -SqlInstance sqlserver2014a -Path \u0027D:\\logs\\maintenancesolution\\\u0027\nGets the outcome of the IndexOptimize job on sqlserver2014a, reading the log files in their custom location.\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eGet-DbaMaintenanceSolutionLog -SqlInstance sqlserver2014a -Since \u00272017-07-18\u0027\nGets the outcome of the IndexOptimize job on sqlserver2014a, starting from july 18, 2017.\n-------------------------- EXAMPLE 6 --------------------------\nPS C:\\\u003eGet-DbaMaintenanceSolutionLog -SqlInstance sqlserver2014a -LogType IndexOptimize\nGets the outcome of the IndexOptimize job on sqlserver2014a, the other options are not yet available! sorry", "Params": [ [ "SqlInstance", @@ -15296,18 +15855,19 @@ "False" ] ], - "Alias": "", - "Author": "Klaas Vandenberghe (@powerdbaklaas) | Simone Bizzotto ( @niphlod )", - "Synopsis": "Reads the log files generated by the IndexOptimize Agent Job from Ola Hallengren\u0027s MaintenanceSolution.", - "Name": "Get-DbaMaintenanceSolutionLog", - "Links": "https://dbatools.io/Get-DbaMaintenanceSolutionLog", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaMaintenanceSolutionLog -SqlInstance sqlserver2014a\nGets the outcome of the IndexOptimize job on sql instance sqlserver2014a.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaMaintenanceSolutionLog -SqlInstance sqlserver2014a -SqlCredential $credential\nGets the outcome of the IndexOptimize job on sqlserver2014a, using SQL Authentication.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003e\u0027sqlserver2014a\u0027, \u0027sqlserver2020test\u0027 | Get-DbaMaintenanceSolutionLog\nGets the outcome of the IndexOptimize job on sqlserver2014a and sqlserver2020test.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaMaintenanceSolutionLog -SqlInstance sqlserver2014a -Path \u0027D:\\logs\\maintenancesolution\\\u0027\nGets the outcome of the IndexOptimize job on sqlserver2014a, reading the log files in their custom location.\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eGet-DbaMaintenanceSolutionLog -SqlInstance sqlserver2014a -Since \u00272017-07-18\u0027\nGets the outcome of the IndexOptimize job on sqlserver2014a, starting from july 18, 2017.\n-------------------------- EXAMPLE 6 --------------------------\nPS C:\\\u003eGet-DbaMaintenanceSolutionLog -SqlInstance sqlserver2014a -LogType IndexOptimize\nGets the outcome of the IndexOptimize job on sqlserver2014a, the other options are not yet available! sorry", "Syntax": "Get-DbaMaintenanceSolutionLog [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [[-LogType] \u003cString[]\u003e] [[-Since] \u003cDateTime\u003e] [[-Path] \u003cString\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaManagementObject", + "Name": "Get-DbaManagementObject", "Description": "The Get-DbaManagementObject returns an object with the Version and the\nAdd-Type Load Template for each version on the server.", "Tags": "SMO", + "Synopsis": "Gets SQL Mangaement Object versions installed on the machine.", + "Alias": "Get-DbaSqlManagementObject", + "Author": "Ben Miller (@DBAduck), http://dbaduck.com", + "CommandName": "Get-DbaManagementObject", + "Availability": "Windows only", + "Links": "https://dbatools.io/Get-DbaManagementObject", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaManagementObject\nReturns all versions of SMO on the computer\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaManagementObject -VersionNumber 13\nReturns just the version specified. If the version does not exist then it will return nothing.", "Params": [ [ "ComputerName", @@ -15342,21 +15902,22 @@ "False" ] ], - "Alias": "Get-DbaSqlManagementObject", - "Author": "Ben Miller (@DBAduck), http://dbaduck.com", - "Synopsis": "Gets SQL Mangaement Object versions installed on the machine.", - "Name": "Get-DbaManagementObject", - "Links": "https://dbatools.io/Get-DbaManagementObject", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaManagementObject\nReturns all versions of SMO on the computer\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaManagementObject -VersionNumber 13\nReturns just the version specified. If the version does not exist then it will return nothing.", "Syntax": "Get-DbaManagementObject [[-ComputerName] \u003cDbaInstanceParameter[]\u003e] [[-Credential] \u003cPSCredential\u003e] [[-VersionNumber] \u003cInt32\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaMaxMemory", + "Name": "Get-DbaMaxMemory", "Description": "This command retrieves the SQL Server \u0027Max Server Memory\u0027 configuration setting as well as the total physical installed on the server.\n\nResults are turned in megabytes (MB).", "Tags": [ "MaxMemory", "Memory" ], + "Synopsis": "Gets the \u0027Max Server Memory\u0027 configuration setting and the memory of the server. Works on SQL Server 2000-2014.", + "Alias": "Get-SqlMaxMemory", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Get-DbaMaxMemory", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Get-DbaMaxMemory", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaMaxMemory -SqlInstance sqlcluster, sqlserver2012\nGet memory settings for instances \"sqlcluster\" and \"sqlserver2012\". Returns results in megabytes (MB).\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaCmsRegServer -SqlInstance sqlcluster | Get-DbaMaxMemory | Where-Object { $_.MaxValue -gt $_.Total }\nFind all servers in Server Central Management Server that have \u0027Max Server Memory\u0027 set to higher than the total memory of the server (think 2147483647)\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eFind-DbaInstance -ComputerName localhost | Get-DbaMaxMemory | Format-Table -AutoSize\nScans localhost for instances using the browser service, traverses all instances and displays memory settings in a formatted table.", "Params": [ [ "SqlInstance", @@ -15383,18 +15944,19 @@ "False" ] ], - "Alias": "Get-SqlMaxMemory", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Gets the \u0027Max Server Memory\u0027 configuration setting and the memory of the server. Works on SQL Server 2000-2014.", - "Name": "Get-DbaMaxMemory", - "Links": "https://dbatools.io/Get-DbaMaxMemory", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaMaxMemory -SqlInstance sqlcluster, sqlserver2012\nGet memory settings for instances \"sqlcluster\" and \"sqlserver2012\". Returns results in megabytes (MB).\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaCmsRegServer -SqlInstance sqlcluster | Get-DbaMaxMemory | Where-Object { $_.MaxValue -gt $_.Total }\nFind all servers in Server Central Management Server that have \u0027Max Server Memory\u0027 set to higher than the total memory of the server (think 2147483647)\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eFind-DbaInstance -ComputerName localhost | Get-DbaMaxMemory | Format-Table -AutoSize\nScans localhost for instances using the browser service, traverses all instances and displays memory settings in a formatted table.", "Syntax": "Get-DbaMaxMemory [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [-SqlCredential \u003cPSCredential\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaMemoryCondition", + "Name": "Get-DbaMemoryCondition", "Description": "The information from SQL Server ring buffers can be used to determine the memory conditions on the server when paging occurs.\n\nThis command is based on a query provided by Microsoft support.\nReference KB article: https://support.microsoft.com/en-us/help/918483/how-to-reduce-paging-of-buffer-pool-memory-in-the-64-bit-version-of-sq", "Tags": "Memory", + "Synopsis": "Determine the memory conditions from SQL Server ring buffers.", + "Alias": "", + "Author": "IJeb Reitsma", + "CommandName": "Get-DbaMemoryCondition", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Get-DbaMemoryCondition", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaMemoryCondition -SqlInstance sqlserver2014a\nReturns the memory conditions for the selected instance\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaCmsRegServer -SqlInstance sqlserver2014a -Group GroupName | Get-DbaMemoryCondition | Out-GridView\nReturns the memory conditions for a group of servers from SQL Server Central Management Server (CMS). Send output to GridView.", "Params": [ [ "SqlInstance", @@ -15421,18 +15983,19 @@ "False" ] ], - "Alias": "", - "Author": "IJeb Reitsma", - "Synopsis": "Determine the memory conditions from SQL Server ring buffers.", - "Name": "Get-DbaMemoryCondition", - "Links": "https://dbatools.io/Get-DbaMemoryCondition", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaMemoryCondition -SqlInstance sqlserver2014a\nReturns the memory conditions for the selected instance\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaCmsRegServer -SqlInstance sqlserver2014a -Group GroupName | Get-DbaMemoryCondition | Out-GridView\nReturns the memory conditions for a group of servers from SQL Server Central Management Server (CMS). Send output to GridView.", "Syntax": "Get-DbaMemoryCondition [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [-SqlCredential \u003cPSCredential\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaMemoryUsage", + "Name": "Get-DbaMemoryUsage", "Description": "Retrieves the amount of memory per performance counter. Default output includes columns Server, counter instance, counter, number of pages, memory in KB, memory in MB\nSSAS and SSIS are included.\n\nSSRS does not have memory counters, only memory shrinks and memory pressure state.\n\nThis function requires local admin role on the targeted computers.", "Tags": "Memory", + "Synopsis": "Get amount of memory in use by *all* SQL Server components and instances", + "Alias": "", + "Author": "Klaas Vandenberghe (@PowerDBAKlaas)", + "CommandName": "Get-DbaMemoryUsage", + "Availability": "Windows only", + "Links": "https://dbatools.io/Get-DbaMemoryUsage", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaMemoryUsage -ComputerName sql2017\nReturns a custom object displaying Server, counter instance, counter, number of pages, memory\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaMemoryUsage -ComputerName sql2017\\sqlexpress -SqlCredential sqladmin | Where-Object { $_.Memory.Megabyte -gt 100 }\nLogs into the sql2017\\sqlexpress as sqladmin using SQL Authentication then returns results only where memory exceeds 100 MB\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003e$servers | Get-DbaMemoryUsage | Out-Gridview\nGets results from an array of $servers then diplays them in a gridview.", "Params": [ [ "ComputerName", @@ -15459,21 +16022,22 @@ "False" ] ], - "Alias": "", - "Author": "Klaas Vandenberghe (@PowerDBAKlaas)", - "Synopsis": "Get amount of memory in use by *all* SQL Server components and instances", - "Name": "Get-DbaMemoryUsage", - "Links": "https://dbatools.io/Get-DbaMemoryUsage", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaMemoryUsage -ComputerName sql2017\nReturns a custom object displaying Server, counter instance, counter, number of pages, memory\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaMemoryUsage -ComputerName sql2017\\sqlexpress -SqlCredential sqladmin | Where-Object { $_.Memory.Megabyte -gt 100 }\nLogs into the sql2017\\sqlexpress as sqladmin using SQL Authentication then returns results only where memory exceeds 100 MB\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003e$servers | Get-DbaMemoryUsage | Out-Gridview\nGets results from an array of $servers then diplays them in a gridview.", "Syntax": "Get-DbaMemoryUsage [[-ComputerName] \u003cDbaInstanceParameter[]\u003e] [[-Credential] \u003cPSCredential\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaModule", + "Name": "Get-DbaModule", "Description": "Quickly find modules (Stored Procs, Functions, Views, Constraints, Rules, Triggers, etc) that have been modified in a database, or across all databases.\nResults will exclude the module definition, but can be queried explicitly.", "Tags": [ "StoredProcedure", "Trigger" ], + "Synopsis": "Displays all objects in sys.sys_modules after specified modification date. Works on SQL Server 2008 and above.", + "Alias": "Get-DbaSqlModule", + "Author": "Brandon Abshire, netnerds.net", + "CommandName": "Get-DbaModule", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Get-DbaModule", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaModule -SqlInstance sql2008, sqlserver2012\nReturn all modules for servers sql2008 and sqlserver2012 sorted by Database, Modify_Date ASC.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaModule -SqlInstance sql2008, sqlserver2012 | Select *\nShows hidden definition column (informative wall of text).\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaModule -SqlInstance sql2008 -Database TestDB -ModifiedSince \"2017-01-01 10:00:00\"\nReturn all modules on server sql2008 for only the TestDB database with a modified date after 1 January 2017 10:00:00 AM.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaModule -SqlInstance sql2008 -Type View, Trigger, ScalarFunction\nReturn all modules on server sql2008 for all databases that are triggers, views or scalar functions.", "Params": [ [ "SqlInstance", @@ -15548,21 +16112,22 @@ "False" ] ], - "Alias": "Get-DbaSqlModule", - "Author": "Brandon Abshire, netnerds.net", - "Synopsis": "Displays all objects in sys.sys_modules after specified modification date. Works on SQL Server 2008 and above.", - "Name": "Get-DbaModule", - "Links": "https://dbatools.io/Get-DbaModule", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaModule -SqlInstance sql2008, sqlserver2012\nReturn all modules for servers sql2008 and sqlserver2012 sorted by Database, Modify_Date ASC.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaModule -SqlInstance sql2008, sqlserver2012 | Select *\nShows hidden definition column (informative wall of text).\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaModule -SqlInstance sql2008 -Database TestDB -ModifiedSince \"2017-01-01 10:00:00\"\nReturn all modules on server sql2008 for only the TestDB database with a modified date after 1 January 2017 10:00:00 AM.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaModule -SqlInstance sql2008 -Type View, Trigger, ScalarFunction\nReturn all modules on server sql2008 for all databases that are triggers, views or scalar functions.", "Syntax": "Get-DbaModule [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [[-Database] \u003cObject[]\u003e] [[-ExcludeDatabase] \u003cObject[]\u003e] [[-ModifiedSince] \u003cDateTime\u003e] [[-Type] \u003cString[]\u003e] [-ExcludeSystemDatabases] [-ExcludeSystemObjects] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaMsdtc", + "Name": "Get-DbaMsdtc", "Description": "Returns a custom object with Computer name, state of the MSDTC Service, security settings of MSDTC and CID\u0027s\n\nRequires: Windows administrator access on Servers", "Tags": [ "Msdtc", "dtc" ], + "Synopsis": "Displays information about the Distributed Transaction Coordinator (MSDTC) on a server", + "Alias": "", + "Author": "Klaas Vandenberghe (@powerdbaklaas)", + "CommandName": "Get-DbaMsdtc", + "Availability": "Windows only", + "Links": "https://dbatools.io/Get-DbaMsdtc", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaMsdtc -ComputerName srv0042\nGet DTC status for the server srv0042\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003e$Computers = (Get-Content D:\\configfiles\\SQL\\MySQLInstances.txt | % {$_.split(\u0027\\\u0027)[0]})\nPS C:\\\u003e $Computers | Get-DbaMsdtc\nGet DTC status for all the computers in a .txt file\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaMsdtc -Computername $Computers | where { $_.dtcservicestate -ne \u0027running\u0027 }\nGet DTC status for all the computers where the MSDTC Service is not running\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaMsdtc -ComputerName srv0042 | Out-Gridview\nGet DTC status for the computer srv0042 and show in a grid view", "Params": [ [ "ComputerName", @@ -15573,18 +16138,19 @@ "$env:COMPUTERNAME" ] ], - "Alias": "", - "Author": "Klaas Vandenberghe (@powerdbaklaas)", - "Synopsis": "Displays information about the Distributed Transaction Coordinator (MSDTC) on a server", - "Name": "Get-DbaMsdtc", - "Links": "https://dbatools.io/Get-DbaMsdtc", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaMsdtc -ComputerName srv0042\nGet DTC status for the server srv0042\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003e$Computers = (Get-Content D:\\configfiles\\SQL\\MySQLInstances.txt | % {$_.split(\u0027\\\u0027)[0]})\nPS C:\\\u003e $Computers | Get-DbaMsdtc\nGet DTC status for all the computers in a .txt file\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaMsdtc -Computername $Computers | where { $_.dtcservicestate -ne \u0027running\u0027 }\nGet DTC status for all the computers where the MSDTC Service is not running\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaMsdtc -ComputerName srv0042 | Out-Gridview\nGet DTC status for the computer srv0042 and show in a grid view", "Syntax": "Get-DbaMsdtc [[-ComputerName] \u003cString[]\u003e] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaNetworkActivity", + "Name": "Get-DbaNetworkActivity", "Description": "Gets the Current traffic on every Network Interface on a computer.\nSee https://msdn.microsoft.com/en-us/library/aa394293(v=vs.85).aspx\n\nRequires Local Admin rights on destination computer(s).", "Tags": "Network", + "Synopsis": "Gets the Current traffic on every Network Interface on a computer.", + "Alias": "", + "Author": "Klaas Vandenberghe (@PowerDBAKlaas)", + "CommandName": "Get-DbaNetworkActivity", + "Availability": "Windows only", + "Links": "https://dbatools.io/Get-DbaNetworkActivity", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaNetworkActivity -ComputerName sqlserver2014a\nGets the Current traffic on every Network Interface on computer sqlserver2014a.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003e\u0027sql1\u0027,\u0027sql2\u0027,\u0027sql3\u0027 | Get-DbaNetworkActivity\nGets the Current traffic on every Network Interface on computers sql1, sql2 and sql3.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaNetworkActivity -ComputerName sql1,sql2 | Out-Gridview\nGets the Current traffic on every Network Interface on computers sql1 and sql2, and shows them in a grid view.", "Params": [ [ "ComputerName", @@ -15611,18 +16177,19 @@ "False" ] ], - "Alias": "", - "Author": "Klaas Vandenberghe (@PowerDBAKlaas)", - "Synopsis": "Gets the Current traffic on every Network Interface on a computer.", - "Name": "Get-DbaNetworkActivity", - "Links": "https://dbatools.io/Get-DbaNetworkActivity", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaNetworkActivity -ComputerName sqlserver2014a\nGets the Current traffic on every Network Interface on computer sqlserver2014a.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003e\u0027sql1\u0027,\u0027sql2\u0027,\u0027sql3\u0027 | Get-DbaNetworkActivity\nGets the Current traffic on every Network Interface on computers sql1, sql2 and sql3.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaNetworkActivity -ComputerName sql1,sql2 | Out-Gridview\nGets the Current traffic on every Network Interface on computers sql1 and sql2, and shows them in a grid view.", "Syntax": "Get-DbaNetworkActivity [[-ComputerName] \u003cString[]\u003e] [[-Credential] \u003cPSCredential\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaNetworkCertificate", + "Name": "Get-DbaNetworkCertificate", "Description": "Gets computer certificates on localhost that are candidates for using with SQL Server\u0027s network encryption", "Tags": "Certificate", + "Synopsis": "Simplifies finding computer certificates that are candidates for using with SQL Server\u0027s network encryption", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Get-DbaNetworkCertificate", + "Availability": "Windows only", + "Links": null, + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaNetworkCertificate\nGets computer certificates on localhost that are candidates for using with SQL Server\u0027s network encryption\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaNetworkCertificate -ComputerName sql2016\nGets computer certificates on sql2016 that are being used for SQL Server network encryption", "Params": [ [ "ComputerName", @@ -15649,16 +16216,10 @@ "False" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Simplifies finding computer certificates that are candidates for using with SQL Server\u0027s network encryption", - "Name": "Get-DbaNetworkCertificate", - "Links": null, - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaNetworkCertificate\nGets computer certificates on localhost that are candidates for using with SQL Server\u0027s network encryption\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaNetworkCertificate -ComputerName sql2016\nGets computer certificates on sql2016 that are being used for SQL Server network encryption", "Syntax": "Get-DbaNetworkCertificate [[-ComputerName] \u003cDbaInstanceParameter[]\u003e] [[-Credential] \u003cPSCredential\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaOpenTransaction", + "Name": "Get-DbaOpenTransaction", "Description": "This command is based on open transaction script published by Paul Randal.\nReference: https://www.sqlskills.com/blogs/paul/script-open-transactions-with-text-and-plans/", "Tags": [ "Database", @@ -15666,6 +16227,13 @@ "Session", "ActivityMonitor" ], + "Synopsis": "Displays all open transactions.", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Get-DbaOpenTransaction", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Get-DbaOpenTransaction", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaOpenTransaction -SqlInstance sqlserver2014a\nReturns open transactions for sqlserver2014a\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaOpenTransaction -SqlInstance sqlserver2014a -SqlCredential sqladmin\nLogs into sqlserver2014a using the login \"sqladmin\"", "Params": [ [ "SqlInstance", @@ -15692,21 +16260,22 @@ "False" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Displays all open transactions.", - "Name": "Get-DbaOpenTransaction", - "Links": "https://dbatools.io/Get-DbaOpenTransaction", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaOpenTransaction -SqlInstance sqlserver2014a\nReturns open transactions for sqlserver2014a\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaOpenTransaction -SqlInstance sqlserver2014a -SqlCredential sqladmin\nLogs into sqlserver2014a using the login \"sqladmin\"", "Syntax": "Get-DbaOpenTransaction [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [-SqlCredential \u003cPSCredential\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaOperatingSystem", + "Name": "Get-DbaOperatingSystem", "Description": "Gets operating system information from the server and returns as an object.", "Tags": [ "ServerInfo", "OperatingSystem" ], + "Synopsis": "Gets operating system information from the server.", + "Alias": "", + "Author": "Shawn Melton (@wsmelton), https://wsmelton.github.io", + "CommandName": "Get-DbaOperatingSystem", + "Availability": "Windows only", + "Links": "https://dbatools.io/Get-DbaOperatingSystem", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaOperatingSystem\nReturns information about the local computer\u0027s operating system\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaOperatingSystem -ComputerName sql2016\nReturns information about the sql2016\u0027s operating system\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003e$wincred = Get-Credential ad\\sqladmin\nPS C:\\\u003e \u0027sql2016\u0027, \u0027sql2017\u0027 | Get-DbaOperatingSystem -Credential $wincred\nReturns information about the sql2016 and sql2017 operating systems using alternative Windows credentials\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-Content .\\servers.txt | Get-DbaOperatingSystem\nReturns information about all the servers operating system that are stored in the file. Every line in the file can only contain one hostname for a server.", "Params": [ [ "ComputerName", @@ -15733,78 +16302,19 @@ "False" ] ], - "Alias": "", - "Author": "Shawn Melton (@wsmelton), https://wsmelton.github.io", - "Synopsis": "Gets operating system information from the server.", - "Name": "Get-DbaOperatingSystem", - "Links": "https://dbatools.io/Get-DbaOperatingSystem", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaOperatingSystem\nReturns information about the local computer\u0027s operating system\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaOperatingSystem -ComputerName sql2016\nReturns information about the sql2016\u0027s operating system\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003e$wincred = Get-Credential ad\\sqladmin\nPS C:\\\u003e \u0027sql2016\u0027, \u0027sql2017\u0027 | Get-DbaOperatingSystem -Credential $wincred\nReturns information about the sql2016 and sql2017 operating systems using alternative Windows credentials\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-Content .\\servers.txt | Get-DbaOperatingSystem\nReturns information about all the servers operating system that are stored in the file. Every line in the file can only contain one hostname for a server.", "Syntax": "Get-DbaOperatingSystem [[-ComputerName] \u003cDbaInstanceParameter[]\u003e] [[-Credential] \u003cPSCredential\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaOrphanUser", - "Description": "An orphan user is defined by a user that does not have their matching login. (Login property = \"\").", - "Tags": [ - "Orphan", - "Database", - "User", - "Security", - "Login" - ], - "Params": [ - [ - "SqlInstance", - "The target SQL Server instance or instances.", - "ServerInstance,SqlServer", - true, - "true (ByValue)", - "" - ], - [ - "SqlCredential", - "Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential)", - "", - false, - "false", - "" - ], - [ - "Database", - "Specifies the database(s) to process. Options for this list are auto-populated from the server. If unspecified, all databases will be processed.", - "Databases", - false, - "false", - "" - ], - [ - "ExcludeDatabase", - "Specifies the database(s) to exclude from processing. Options for this list are auto-populated from the server", - "", - false, - "false", - "" - ], - [ - "EnableException", - "By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message.\r\nThis avoids overwhelming you with \"sea of red\" exceptions, but is inconvenient because it basically disables advanced scripting.\r\nUsing this switch turns this \"nice by default\" feature off and enables you to catch exceptions with your own try/catch.", - "Silent", - false, - "false", - "False" - ] - ], - "Alias": "", - "Author": "Claudio Silva (@ClaudioESSilva) | Garry Bargsley (@gbargsley) | Simone Bizzotto (@niphlod)", - "Synopsis": "Get orphaned users.", - "Name": "Get-DbaOrphanUser", - "Links": "https://dbatools.io/Get-DbaOrphanUser", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaOrphanUser -SqlInstance localhost\\sql2016\nFinds all orphan users without matching Logins in all databases present on server \u0027localhost\\sql2016\u0027.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaOrphanUser -SqlInstance localhost\\sql2016 -SqlCredential $cred\nFinds all orphan users without matching Logins in all databases present on server \u0027localhost\\sql2016\u0027. SQL Server authentication will be used in connecting to the server.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaOrphanUser -SqlInstance localhost\\sql2016 -Database db1\nFinds orphan users without matching Logins in the db1 database present on server \u0027localhost\\sql2016\u0027.", - "Syntax": "Get-DbaOrphanUser [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [[-Database] \u003cObject[]\u003e] [[-ExcludeDatabase] \u003cObject[]\u003e] [-EnableException] [\u003cCommonParameters\u003e]" - }, - { - "CommandName": "Get-DbaPageFileSetting", + "Name": "Get-DbaPageFileSetting", "Description": "This command uses CIM (or other, related computer management tools) to detect the page file configuration of the target computer(s).\n\nNote that this may require local administrator privileges for the relevant computers.", "Tags": "CIM", + "Synopsis": "Returns information on the page file configuration of the target computer.", + "Alias": "", + "Author": "Klaas Vandenberghe (@PowerDBAKlaas)", + "CommandName": "Get-DbaPageFileSetting", + "Availability": "Windows only", + "Links": "https://dbatools.io/Get-DbaPageFileSetting", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaPageFileSetting -ComputerName ServerA,ServerB\nReturns a custom object displaying ComputerName, AutoPageFile, FileName, Status, LastModified, LastAccessed, AllocatedBaseSize, InitialSize, MaximumSize, PeakUsage, CurrentUsage for ServerA and \r\nServerB\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003e\u0027ServerA\u0027 | Get-DbaPageFileSetting\nReturns a custom object displaying ComputerName, AutoPageFile, FileName, Status, LastModified, LastAccessed, AllocatedBaseSize, InitialSize, MaximumSize, PeakUsage, CurrentUsage for ServerA", "Params": [ [ "ComputerName", @@ -15831,22 +16341,23 @@ "False" ] ], - "Alias": "", - "Author": "Klaas Vandenberghe (@PowerDBAKlaas)", - "Synopsis": "Returns information on the page file configuration of the target computer.", - "Name": "Get-DbaPageFileSetting", - "Links": "https://dbatools.io/Get-DbaPageFileSetting", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaPageFileSetting -ComputerName ServerA,ServerB\nReturns a custom object displaying ComputerName, AutoPageFile, FileName, Status, LastModified, LastAccessed, AllocatedBaseSize, InitialSize, MaximumSize, PeakUsage, CurrentUsage for ServerA and \r\nServerB\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003e\u0027ServerA\u0027 | Get-DbaPageFileSetting\nReturns a custom object displaying ComputerName, AutoPageFile, FileName, Status, LastModified, LastAccessed, AllocatedBaseSize, InitialSize, MaximumSize, PeakUsage, CurrentUsage for ServerA", "Syntax": "Get-DbaPageFileSetting [[-ComputerName] \u003cDbaInstanceParameter[]\u003e] [-Credential \u003cPSCredential\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaPbmCategory", + "Name": "Get-DbaPbmCategory", "Description": "Returns policy categories from policy based management from an instance.", "Tags": [ "Policy", "PolicyBasedManagement", "PBM" ], + "Synopsis": "Returns policy categories from policy based management from an instance.", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Get-DbaPbmCategory", + "Availability": "Windows only", + "Links": "https://dbatools.io/Get-DbaPbmCategory", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaPbmCategory -SqlInstance sql2016\nReturns all policy categories from the sql2016 PBM server\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaPbmCategory -SqlInstance sql2016 -SqlCredential $cred\nUses a credential $cred to connect and return all policy categories from the sql2016 PBM server", "Params": [ [ "SqlInstance", @@ -15897,22 +16408,23 @@ "False" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Returns policy categories from policy based management from an instance.", - "Name": "Get-DbaPbmCategory", - "Links": "https://dbatools.io/Get-DbaPbmCategory", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaPbmCategory -SqlInstance sql2016\nReturns all policy categories from the sql2016 PBM server\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaPbmCategory -SqlInstance sql2016 -SqlCredential $cred\nUses a credential $cred to connect and return all policy categories from the sql2016 PBM server", "Syntax": "Get-DbaPbmCategory [[-SqlInstance] \u003cDbaInstanceParameter[]\u003e] [[-SqlCredential] \u003cPSCredential\u003e] [[-Category] \u003cString[]\u003e] [[-InputObject] \u003cPolicyStore[]\u003e] [-ExcludeSystemObject] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaPbmCategorySubscription", + "Name": "Get-DbaPbmCategorySubscription", "Description": "Returns policy category subscriptions from policy based management from an instance.", "Tags": [ "Policy", "PolicyBasedManagement", "PBM" ], + "Synopsis": "Returns policy category subscriptions from policy based management from an instance.", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Get-DbaPbmCategorySubscription", + "Availability": "Windows only", + "Links": "https://dbatools.io/Get-DbaPbmCategorySubscription", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaPbmCategorySubscription -SqlInstance sql2016\nReturns all policy category subscriptions from the sql2016 PBM server\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaPbmCategorySubscription -SqlInstance sql2016 -SqlCredential $cred\nUses a credential $cred to connect and return all policy category subscriptions from the sql2016 PBM server", "Params": [ [ "SqlInstance", @@ -15947,22 +16459,23 @@ "False" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Returns policy category subscriptions from policy based management from an instance.", - "Name": "Get-DbaPbmCategorySubscription", - "Links": "https://dbatools.io/Get-DbaPbmCategorySubscription", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaPbmCategorySubscription -SqlInstance sql2016\nReturns all policy category subscriptions from the sql2016 PBM server\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaPbmCategorySubscription -SqlInstance sql2016 -SqlCredential $cred\nUses a credential $cred to connect and return all policy category subscriptions from the sql2016 PBM server", "Syntax": "Get-DbaPbmCategorySubscription [[-SqlInstance] \u003cDbaInstanceParameter[]\u003e] [[-SqlCredential] \u003cPSCredential\u003e] [[-InputObject] \u003cPolicyStore[]\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaPbmCondition", + "Name": "Get-DbaPbmCondition", "Description": "Returns conditions from policy based management from an instance.", "Tags": [ "Policy", "PolicyBasedManagement", "PBM" ], + "Synopsis": "Returns conditions from policy based management from an instance.", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Get-DbaPbmCondition", + "Availability": "Windows only", + "Links": "https://dbatools.io/Get-DbaPbmCondition", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaPbmCondition -SqlInstance sql2016\nReturns all conditions from the sql2016 PBM server\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaPbmCondition -SqlInstance sql2016 -SqlCredential $cred\nUses a credential $cred to connect and return all conditions from the sql2016 PBM server", "Params": [ [ "SqlInstance", @@ -16013,22 +16526,23 @@ "False" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Returns conditions from policy based management from an instance.", - "Name": "Get-DbaPbmCondition", - "Links": "https://dbatools.io/Get-DbaPbmCondition", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaPbmCondition -SqlInstance sql2016\nReturns all conditions from the sql2016 PBM server\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaPbmCondition -SqlInstance sql2016 -SqlCredential $cred\nUses a credential $cred to connect and return all conditions from the sql2016 PBM server", "Syntax": "Get-DbaPbmCondition [[-SqlInstance] \u003cDbaInstanceParameter[]\u003e] [[-SqlCredential] \u003cPSCredential\u003e] [[-Condition] \u003cString[]\u003e] [[-InputObject] \u003cPolicyStore[]\u003e] [-IncludeSystemObject] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaPbmObjectSet", + "Name": "Get-DbaPbmObjectSet", "Description": "Returns object sets from policy based management.", "Tags": [ "Policy", "PolicyBasedManagement", "PBM" ], + "Synopsis": "Returns object sets from policy based management.", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Get-DbaPbmObjectSet", + "Availability": "Windows only", + "Links": "https://dbatools.io/Get-DbaPbmObjectSet", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaPbmObjectSet -SqlInstance sql2016\nReturns all object sets from the sql2016 PBM instance\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaPbmObjectSet -SqlInstance sql2016 -SqlCredential $cred\nUses a credential $cred to connect and return all object sets from the sql2016 PBM instance", "Params": [ [ "SqlInstance", @@ -16079,22 +16593,23 @@ "False" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Returns object sets from policy based management.", - "Name": "Get-DbaPbmObjectSet", - "Links": "https://dbatools.io/Get-DbaPbmObjectSet", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaPbmObjectSet -SqlInstance sql2016\nReturns all object sets from the sql2016 PBM instance\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaPbmObjectSet -SqlInstance sql2016 -SqlCredential $cred\nUses a credential $cred to connect and return all object sets from the sql2016 PBM instance", "Syntax": "Get-DbaPbmObjectSet [[-SqlInstance] \u003cDbaInstanceParameter[]\u003e] [[-SqlCredential] \u003cPSCredential\u003e] [[-ObjectSet] \u003cString[]\u003e] [[-InputObject] \u003cPolicyStore[]\u003e] [-IncludeSystemObject] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaPbmPolicy", + "Name": "Get-DbaPbmPolicy", "Description": "Returns details of policies with the option to filter on Category and SystemObjects.", "Tags": [ "Policy", "PolicyBasedManagement", "PBM" ], + "Synopsis": "Returns policies from Policy-Based Management from an instance.", + "Alias": "Get-DbaPolicy", + "Author": "Stephen Bennett, https://sqlnotesfromtheunderground.wordpress.com/", + "CommandName": "Get-DbaPbmPolicy", + "Availability": "Windows only", + "Links": "https://dbatools.io/Get-DbaPbmPolicy", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaPbmPolicy -SqlInstance sql2016\nReturns all policies from sql2016 server\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaPbmPolicy -SqlInstance sql2016 -SqlCredential $cred\nUses a credential $cred to connect and return all policies from sql2016 instance\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaPbmPolicy -SqlInstance sql2016 -Category MorningCheck\nReturns all policies from sql2016 server that part of the PolicyCategory MorningCheck", "Params": [ [ "SqlInstance", @@ -16153,22 +16668,23 @@ "False" ] ], - "Alias": "Get-DbaPolicy", - "Author": "Stephen Bennett, https://sqlnotesfromtheunderground.wordpress.com/", - "Synopsis": "Returns policies from Policy-Based Management from an instance.", - "Name": "Get-DbaPbmPolicy", - "Links": "https://dbatools.io/Get-DbaPbmPolicy", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaPbmPolicy -SqlInstance sql2016\nReturns all policies from sql2016 server\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaPbmPolicy -SqlInstance sql2016 -SqlCredential $cred\nUses a credential $cred to connect and return all policies from sql2016 instance\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaPbmPolicy -SqlInstance sql2016 -Category MorningCheck\nReturns all policies from sql2016 server that part of the PolicyCategory MorningCheck", "Syntax": "Get-DbaPbmPolicy [[-SqlInstance] \u003cDbaInstanceParameter[]\u003e] [[-SqlCredential] \u003cPSCredential\u003e] [[-Policy] \u003cString[]\u003e] [[-Category] \u003cString[]\u003e] [[-InputObject] \u003cPolicyStore[]\u003e] [-IncludeSystemObject] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaPbmStore", + "Name": "Get-DbaPbmStore", "Description": "Returns the policy based management store.", "Tags": [ "Policy", "PolicyBasedManagement", "PBM" ], + "Synopsis": "Returns the policy based management store.", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Get-DbaPbmStore", + "Availability": "Windows only", + "Links": "https://dbatools.io/Get-DbaPbmStore", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaPbmStore -SqlInstance sql2016\nReturn the policy store from the sql2016 instance\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaPbmStore -SqlInstance sql2016 -SqlCredential $cred\nUses a credential $cred to connect and return the policy store from the sql2016 instance", "Params": [ [ "SqlInstance", @@ -16195,21 +16711,22 @@ "False" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Returns the policy based management store.", - "Name": "Get-DbaPbmStore", - "Links": "https://dbatools.io/Get-DbaPbmStore", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaPbmStore -SqlInstance sql2016\nReturn the policy store from the sql2016 instance\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaPbmStore -SqlInstance sql2016 -SqlCredential $cred\nUses a credential $cred to connect and return the policy store from the sql2016 instance", "Syntax": "Get-DbaPbmStore [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaPermission", + "Name": "Get-DbaPermission", "Description": "Retrieves a list of permissions\n\nPermissions link principals to securables.\nPrincipals exist on Windows, Instance and Database level.\nSecurables exist on Instance and Database level.\nA permission state can be GRANT, DENY or REVOKE.\nThe permission type can be SELECT, CONNECT, EXECUTE and more.\n\nSee https://msdn.microsoft.com/en-us/library/ms191291.aspx for more information", "Tags": [ "Permissions", "Databases" ], + "Synopsis": "Get a list of Server and Database level permissions", + "Alias": "", + "Author": "Klaas Vandenberghe (@PowerDBAKlaas)", + "CommandName": "Get-DbaPermission", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Get-DbaPermission", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaPermission -SqlInstance ServerA\\sql987\nReturns a custom object with Server name, Database name, permission state, permission type, grantee and securable.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaPermission -SqlInstance ServerA\\sql987 | Format-Table -AutoSize\nReturns a formatted table displaying Server, Database, permission state, permission type, grantee, granteetype, securable and securabletype.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaPermission -SqlInstance ServerA\\sql987 -ExcludeSystemObjects -IncludeServerLevel\nReturns a custom object with Server name, Database name, permission state, permission type, grantee and securable\r\nin all databases and on the server level, but not on system securables.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaPermission -SqlInstance sql2016 -Database master\nReturns a custom object with permissions for the master database.", "Params": [ [ "SqlInstance", @@ -16268,22 +16785,23 @@ "False" ] ], - "Alias": "", - "Author": "Klaas Vandenberghe (@PowerDBAKlaas)", - "Synopsis": "Get a list of Server and Database level permissions", - "Name": "Get-DbaPermission", - "Links": "https://dbatools.io/Get-DbaPermission", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaPermission -SqlInstance ServerA\\sql987\nReturns a custom object with Server name, Database name, permission state, permission type, grantee and securable.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaPermission -SqlInstance ServerA\\sql987 | Format-Table -AutoSize\nReturns a formatted table displaying Server, Database, permission state, permission type, grantee, granteetype, securable and securabletype.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaPermission -SqlInstance ServerA\\sql987 -ExcludeSystemObjects -IncludeServerLevel\nReturns a custom object with Server name, Database name, permission state, permission type, grantee and securable\r\nin all databases and on the server level, but not on system securables.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaPermission -SqlInstance sql2016 -Database master\nReturns a custom object with permissions for the master database.", "Syntax": "Get-DbaPermission [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [[-Database] \u003cObject[]\u003e] [[-ExcludeDatabase] \u003cObject[]\u003e] [-IncludeServerLevel] [-ExcludeSystemObjects] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaPfAvailableCounter", + "Name": "Get-DbaPfAvailableCounter", "Description": "Gathers list of all available counters on local or remote machines. Note, if you pass a credential object, it will be included in the output for easy reuse in your next piped command.\n\nThanks to Daniel Streefkerk for this super fast way of counters\nhttps://daniel.streefkerkonline.com/2016/02/18/use-powershell-to-list-all-windows-performance-counters-and-their-numeric-ids", "Tags": [ "Performance", "DataCollector", "PerfCounter" ], + "Synopsis": "Gathers list of all available counters on local or remote machines.", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Get-DbaPfAvailableCounter", + "Availability": "Windows only", + "Links": "https://dbatools.io/Get-DbaPfAvailableCounter", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaPfAvailableCounter\nGets all available counters on the local machine.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaPfAvailableCounter -Pattern *sql*\nGets all counters matching sql on the local machine.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaPfAvailableCounter -ComputerName sql2017 -Pattern *sql*\nGets all counters matching sql on the remote server sql2017.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaPfAvailableCounter -Pattern *sql*\nGets all counters matching sql on the local machine.\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eGet-DbaPfAvailableCounter -Pattern *sql* | Add-DbaPfDataCollectorCounter -CollectorSet \u0027Test Collector Set\u0027 -Collector DataCollector01\nAdds all counters matching \"sql\" to the DataCollector01 within the \u0027Test Collector Set\u0027 CollectorSet.", "Params": [ [ "ComputerName", @@ -16318,22 +16836,23 @@ "False" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Gathers list of all available counters on local or remote machines.", - "Name": "Get-DbaPfAvailableCounter", - "Links": "https://dbatools.io/Get-DbaPfAvailableCounter", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaPfAvailableCounter\nGets all available counters on the local machine.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaPfAvailableCounter -Pattern *sql*\nGets all counters matching sql on the local machine.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaPfAvailableCounter -ComputerName sql2017 -Pattern *sql*\nGets all counters matching sql on the remote server sql2017.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaPfAvailableCounter -Pattern *sql*\nGets all counters matching sql on the local machine.\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eGet-DbaPfAvailableCounter -Pattern *sql* | Add-DbaPfDataCollectorCounter -CollectorSet \u0027Test Collector Set\u0027 -Collector DataCollector01\nAdds all counters matching \"sql\" to the DataCollector01 within the \u0027Test Collector Set\u0027 CollectorSet.", "Syntax": "Get-DbaPfAvailableCounter [[-ComputerName] \u003cDbaInstanceParameter[]\u003e] [[-Credential] \u003cPSCredential\u003e] [[-Pattern] \u003cString\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaPfDataCollector", + "Name": "Get-DbaPfDataCollector", "Description": "Gets Performance Monitor Data Collectors.", "Tags": [ "Performance", "DataCollector", "PerfCounter" ], + "Synopsis": "Gets Performance Monitor Data Collectors.", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Get-DbaPfDataCollector", + "Availability": "Windows only", + "Links": "https://dbatools.io/Get-DbaPfDataCollector", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaPfDataCollector\nGets all Collectors on localhost.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaPfDataCollector -ComputerName sql2017\nGets all Collectors on sql2017.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaPfDataCollector -ComputerName sql2017, sql2016 -Credential ad\\sqldba -CollectorSet \u0027System Correlation\u0027\nGets all Collectors for the \u0027System Correlation\u0027 CollectorSet on sql2017 and sql2016 using alternative credentials.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaPfDataCollectorSet -CollectorSet \u0027System Correlation\u0027 | Get-DbaPfDataCollector\nGets all Collectors for the \u0027System Correlation\u0027 CollectorSet.", "Params": [ [ "ComputerName", @@ -16384,22 +16903,23 @@ "False" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Gets Performance Monitor Data Collectors.", - "Name": "Get-DbaPfDataCollector", - "Links": "https://dbatools.io/Get-DbaPfDataCollector", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaPfDataCollector\nGets all Collectors on localhost.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaPfDataCollector -ComputerName sql2017\nGets all Collectors on sql2017.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaPfDataCollector -ComputerName sql2017, sql2016 -Credential ad\\sqldba -CollectorSet \u0027System Correlation\u0027\nGets all Collectors for the \u0027System Correlation\u0027 CollectorSet on sql2017 and sql2016 using alternative credentials.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaPfDataCollectorSet -CollectorSet \u0027System Correlation\u0027 | Get-DbaPfDataCollector\nGets all Collectors for the \u0027System Correlation\u0027 CollectorSet.", "Syntax": "Get-DbaPfDataCollector [[-ComputerName] \u003cDbaInstanceParameter[]\u003e] [[-Credential] \u003cPSCredential\u003e] [[-CollectorSet] \u003cString[]\u003e] [[-Collector] \u003cString[]\u003e] [[-InputObject] \u003cObject[]\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaPfDataCollectorCounter", + "Name": "Get-DbaPfDataCollectorCounter", "Description": "Gets Performance Counters.", "Tags": [ "Performance", "DataCollector", "PerfCounter" ], + "Synopsis": "Gets Performance Counters.", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Get-DbaPfDataCollectorCounter", + "Availability": "Windows only", + "Links": "https://dbatools.io/Get-DbaPfDataCollectorCounter", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaPfDataCollectorCounter\nGets all counters for all Collector Sets on localhost.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaPfDataCollectorCounter -ComputerName sql2017\nGets all counters for all Collector Sets on on sql2017.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaPfDataCollectorCounter -ComputerName sql2017 -Counter \u0027\\Processor(_Total)\\% Processor Time\u0027\nGets the \u0027\\Processor(_Total)\\% Processor Time\u0027 counter on sql2017.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaPfDataCollectorCounter -ComputerName sql2017, sql2016 -Credential ad\\sqldba -CollectorSet \u0027System Correlation\u0027\nGets all counters for the \u0027System Correlation\u0027 CollectorSet on sql2017 and sql2016 using alternative credentials.\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eGet-DbaPfDataCollectorSet -CollectorSet \u0027System Correlation\u0027 | Get-DbaPfDataCollector | Get-DbaPfDataCollectorCounter\nGets all counters for the \u0027System Correlation\u0027 CollectorSet.", "Params": [ [ "ComputerName", @@ -16458,22 +16978,23 @@ "False" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Gets Performance Counters.", - "Name": "Get-DbaPfDataCollectorCounter", - "Links": "https://dbatools.io/Get-DbaPfDataCollectorCounter", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaPfDataCollectorCounter\nGets all counters for all Collector Sets on localhost.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaPfDataCollectorCounter -ComputerName sql2017\nGets all counters for all Collector Sets on on sql2017.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaPfDataCollectorCounter -ComputerName sql2017 -Counter \u0027\\Processor(_Total)\\% Processor Time\u0027\nGets the \u0027\\Processor(_Total)\\% Processor Time\u0027 counter on sql2017.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaPfDataCollectorCounter -ComputerName sql2017, sql2016 -Credential ad\\sqldba -CollectorSet \u0027System Correlation\u0027\nGets all counters for the \u0027System Correlation\u0027 CollectorSet on sql2017 and sql2016 using alternative credentials.\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eGet-DbaPfDataCollectorSet -CollectorSet \u0027System Correlation\u0027 | Get-DbaPfDataCollector | Get-DbaPfDataCollectorCounter\nGets all counters for the \u0027System Correlation\u0027 CollectorSet.", "Syntax": "Get-DbaPfDataCollectorCounter [[-ComputerName] \u003cDbaInstanceParameter[]\u003e] [[-Credential] \u003cPSCredential\u003e] [[-CollectorSet] \u003cString[]\u003e] [[-Collector] \u003cString[]\u003e] [[-Counter] \u003cString[]\u003e] [[-InputObject] \u003cObject[]\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaPfDataCollectorCounterSample", + "Name": "Get-DbaPfDataCollectorCounterSample", "Description": "Gets Performance Counter Samples.", "Tags": [ "Performance", "DataCollector", "PerfCounter" ], + "Synopsis": "Gets Performance Counter Samples.", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Get-DbaPfDataCollectorCounterSample", + "Availability": "Windows only", + "Links": "https://dbatools.io/Get-DbaPfDataCollectorCounterSample", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaPfDataCollectorCounterSample\nGets a single sample for all counters for all Collector Sets on localhost.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaPfDataCollectorCounterSample -Counter \u0027\\Processor(_Total)\\% Processor Time\u0027\nGets a single sample for all counters for all Collector Sets on localhost.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaPfDataCollectorCounter -ComputerName sql2017, sql2016 | Out-GridView -PassThru | Get-DbaPfDataCollectorCounterSample -MaxSamples 10\nGets 10 samples for all counters for all Collector Sets for servers sql2016 and sql2017.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaPfDataCollectorCounterSample -ComputerName sql2017\nGets a single sample for all counters for all Collector Sets on sql2017.\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eGet-DbaPfDataCollectorCounterSample -ComputerName sql2017, sql2016 -Credential ad\\sqldba -CollectorSet \u0027System Correlation\u0027\nGets a single sample for all counters for the \u0027System Correlation\u0027 CollectorSet on sql2017 and sql2016 using alternative credentials.\n-------------------------- EXAMPLE 6 --------------------------\nPS C:\\\u003eGet-DbaPfDataCollectorCounterSample -CollectorSet \u0027System Correlation\u0027\nGets a single sample for all counters for the \u0027System Correlation\u0027 CollectorSet.", "Params": [ [ "ComputerName", @@ -16564,22 +17085,23 @@ "False" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Gets Performance Counter Samples.", - "Name": "Get-DbaPfDataCollectorCounterSample", - "Links": "https://dbatools.io/Get-DbaPfDataCollectorCounterSample", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaPfDataCollectorCounterSample\nGets a single sample for all counters for all Collector Sets on localhost.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaPfDataCollectorCounterSample -Counter \u0027\\Processor(_Total)\\% Processor Time\u0027\nGets a single sample for all counters for all Collector Sets on localhost.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaPfDataCollectorCounter -ComputerName sql2017, sql2016 | Out-GridView -PassThru | Get-DbaPfDataCollectorCounterSample -MaxSamples 10\nGets 10 samples for all counters for all Collector Sets for servers sql2016 and sql2017.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaPfDataCollectorCounterSample -ComputerName sql2017\nGets a single sample for all counters for all Collector Sets on sql2017.\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eGet-DbaPfDataCollectorCounterSample -ComputerName sql2017, sql2016 -Credential ad\\sqldba -CollectorSet \u0027System Correlation\u0027\nGets a single sample for all counters for the \u0027System Correlation\u0027 CollectorSet on sql2017 and sql2016 using alternative credentials.\n-------------------------- EXAMPLE 6 --------------------------\nPS C:\\\u003eGet-DbaPfDataCollectorCounterSample -CollectorSet \u0027System Correlation\u0027\nGets a single sample for all counters for the \u0027System Correlation\u0027 CollectorSet.", "Syntax": "Get-DbaPfDataCollectorCounterSample [[-ComputerName] \u003cDbaInstanceParameter[]\u003e] [[-Credential] \u003cPSCredential\u003e] [[-CollectorSet] \u003cString[]\u003e] [[-Collector] \u003cString[]\u003e] [[-Counter] \u003cString[]\u003e] [-Continuous] [[-ListSet]] [[-MaxSamples] \u003cInt32\u003e] [[-SampleInterval] \u003cInt32\u003e] [[-InputObject] \u003cObject[]\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaPfDataCollectorSet", + "Name": "Get-DbaPfDataCollectorSet", "Description": "Gets Performance Monitor Data Collector Set.", "Tags": [ "Performance", "DataCollector", "PerfCounter" ], + "Synopsis": "Gets Performance Monitor Data Collector Set.", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Get-DbaPfDataCollectorSet", + "Availability": "Windows only", + "Links": "https://dbatools.io/Get-DbaPfDataCollectorSet", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaPfDataCollectorSet\nGets all Collector Sets on localhost.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaPfDataCollectorSet -ComputerName sql2017\nGets all Collector Sets on sql2017.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaPfDataCollectorSet -ComputerName sql2017 -Credential ad\\sqldba -CollectorSet \u0027System Correlation\u0027\nGets the \u0027System Correlation\u0027 CollectorSet on sql2017 using alternative credentials.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaPfDataCollectorSet | Select-Object *\nDisplays extra columns and also exposes the original COM object in DataCollectorSetObject.", "Params": [ [ "ComputerName", @@ -16614,22 +17136,23 @@ "False" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Gets Performance Monitor Data Collector Set.", - "Name": "Get-DbaPfDataCollectorSet", - "Links": "https://dbatools.io/Get-DbaPfDataCollectorSet", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaPfDataCollectorSet\nGets all Collector Sets on localhost.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaPfDataCollectorSet -ComputerName sql2017\nGets all Collector Sets on sql2017.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaPfDataCollectorSet -ComputerName sql2017 -Credential ad\\sqldba -CollectorSet \u0027System Correlation\u0027\nGets the \u0027System Correlation\u0027 CollectorSet on sql2017 using alternative credentials.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaPfDataCollectorSet | Select-Object *\nDisplays extra columns and also exposes the original COM object in DataCollectorSetObject.", "Syntax": "Get-DbaPfDataCollectorSet [[-ComputerName] \u003cDbaInstanceParameter[]\u003e] [[-Credential] \u003cPSCredential\u003e] [[-CollectorSet] \u003cString[]\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaPfDataCollectorSetTemplate", + "Name": "Get-DbaPfDataCollectorSetTemplate", "Description": "Parses Perf Monitor XML templates. Defaults to parsing templates in the dbatools template repository (\\bin\\perfmontemplates\\).", "Tags": [ "Performance", "DataCollector", "PerfCounter" ], + "Synopsis": "Parses Perf Monitor templates. Defaults to parsing templates in the dbatools template repository (\\bin\\perfmontemplates\\).", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Get-DbaPfDataCollectorSetTemplate", + "Availability": "Windows only", + "Links": "https://dbatools.io/Get-DbaPfDataCollectorSetTemplate", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaPfDataCollectorSetTemplate\nReturns information about all the templates in the local dbatools repository.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaPfDataCollectorSetTemplate | Out-GridView -PassThru | Import-DbaPfDataCollectorSetTemplate -ComputerName sql2017 | Start-DbaPfDataCollectorSet\nAllows you to select a template, then deploys it to sql2017 and immediately starts the DataCollectorSet.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaPfDataCollectorSetTemplate | Select-Object *\nReturns more information about the template, including the full path/filename.", "Params": [ [ "Path", @@ -16664,18 +17187,19 @@ "False" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Parses Perf Monitor templates. Defaults to parsing templates in the dbatools template repository (\\bin\\perfmontemplates\\).", - "Name": "Get-DbaPfDataCollectorSetTemplate", - "Links": "https://dbatools.io/Get-DbaPfDataCollectorSetTemplate", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaPfDataCollectorSetTemplate\nReturns information about all the templates in the local dbatools repository.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaPfDataCollectorSetTemplate | Out-GridView -PassThru | Import-DbaPfDataCollectorSetTemplate -ComputerName sql2017 | Start-DbaPfDataCollectorSet\nAllows you to select a template, then deploys it to sql2017 and immediately starts the DataCollectorSet.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaPfDataCollectorSetTemplate | Select-Object *\nReturns more information about the template, including the full path/filename.", "Syntax": "Get-DbaPfDataCollectorSetTemplate [[-Path] \u003cString[]\u003e] [[-Pattern] \u003cString\u003e] [[-Template] \u003cString[]\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaPlanCache", + "Name": "Get-DbaPlanCache", "Description": "Checks adhoc and prepared plan cache for each database, if over 100 MB you should consider using Remove-DbaQueryPlan to clear the plan caches or turning on \"optimize for adhoc workloads\" configuration if running 2008 or later.\n\nReferences: https://www.sqlskills.com/blogs/kimberly/plan-cache-adhoc-workloads-and-clearing-the-single-use-plan-cache-bloat/\n\nNote: This command returns results from all SQL server instances on the destination server but the process column is specific to -SqlInstance passed.", "Tags": "Memory", + "Synopsis": "Provides information about adhoc and prepared plan cache usage", + "Alias": "", + "Author": "Tracy Boggiano, databasesuperhero.com", + "CommandName": "Get-DbaPlanCache", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Get-DbaPlanCache", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaPlanCache -SqlInstance sql2017\nReturns the single use plan cache usage information for SQL Server instance 2017\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaPlanCache -SqlInstance sql2017 -SqlCredential sqladmin\nReturns the single use plan cache usage information for SQL Server instance 2017 using login \u0027sqladmin\u0027", "Params": [ [ "SqlInstance", @@ -16702,18 +17226,19 @@ "False" ] ], - "Alias": "", - "Author": "Tracy Boggiano, databasesuperhero.com", - "Synopsis": "Provides information about adhoc and prepared plan cache usage", - "Name": "Get-DbaPlanCache", - "Links": "https://dbatools.io/Get-DbaPlanCache", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaPlanCache -SqlInstance sql2017\nReturns the single use plan cache usage information for SQL Server instance 2017\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaPlanCache -SqlInstance sql2017 -SqlCredential sqladmin\nReturns the single use plan cache usage information for SQL Server instance 2017 using login \u0027sqladmin\u0027", "Syntax": "Get-DbaPlanCache [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaPowerPlan", + "Name": "Get-DbaPowerPlan", "Description": "Gets the Power Plan settings on a computer against best practices recommendations.", "Tags": "PowerPlan", + "Synopsis": "Gets the Power Plan settings for compliance with best practices, which recommend High Performance for SQL Server.", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Get-DbaPowerPlan", + "Availability": "Windows only", + "Links": "https://dbatools.io/Get-DbaPowerPlan", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaPowerPlan -ComputerName sql2017\nGets the Power Plan settings for sql2017\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaPowerPlan -ComputerName sql2017 -Credential ad\\admin\nGets the Power Plan settings for sql2017 using an alternative credential", "Params": [ [ "ComputerName", @@ -16740,18 +17265,19 @@ "False" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Gets the Power Plan settings for compliance with best practices, which recommend High Performance for SQL Server.", - "Name": "Get-DbaPowerPlan", - "Links": "https://dbatools.io/Get-DbaPowerPlan", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaPowerPlan -ComputerName sql2017\nGets the Power Plan settings for sql2017\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaPowerPlan -ComputerName sql2017 -Credential ad\\admin\nGets the Power Plan settings for sql2017 using an alternative credential", "Syntax": "Get-DbaPowerPlan [-ComputerName] \u003cDbaInstanceParameter[]\u003e [[-Credential] \u003cPSCredential\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaPrivilege", + "Name": "Get-DbaPrivilege", "Description": "Gets the users with local privileges \u0027Lock Pages in Memory\u0027, \u0027Instant File Initialization\u0027, \u0027Logon as Batch\u0027 on one or more computers.\n\nRequires Local Admin rights on destination computer(s).", "Tags": "Privilege", + "Synopsis": "Gets the users with local privileges on one or more computers.", + "Alias": "", + "Author": "Klaas Vandenberghe (@PowerDBAKlaas)", + "CommandName": "Get-DbaPrivilege", + "Availability": "Windows only", + "Links": "https://dbatools.io/Get-DbaPrivilege", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaPrivilege -ComputerName sqlserver2014a\nGets the local privileges on computer sqlserver2014a.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003e\u0027sql1\u0027,\u0027sql2\u0027,\u0027sql3\u0027 | Get-DbaPrivilege\nGets the local privileges on computers sql1, sql2 and sql3.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaPrivilege -ComputerName sql1,sql2 | Out-GridView\nGets the local privileges on computers sql1 and sql2, and shows them in a grid view.", "Params": [ [ "ComputerName", @@ -16778,22 +17304,23 @@ "False" ] ], - "Alias": "", - "Author": "Klaas Vandenberghe (@PowerDBAKlaas)", - "Synopsis": "Gets the users with local privileges on one or more computers.", - "Name": "Get-DbaPrivilege", - "Links": "https://dbatools.io/Get-DbaPrivilege", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaPrivilege -ComputerName sqlserver2014a\nGets the local privileges on computer sqlserver2014a.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003e\u0027sql1\u0027,\u0027sql2\u0027,\u0027sql3\u0027 | Get-DbaPrivilege\nGets the local privileges on computers sql1, sql2 and sql3.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaPrivilege -ComputerName sql1,sql2 | Out-GridView\nGets the local privileges on computers sql1 and sql2, and shows them in a grid view.", "Syntax": "Get-DbaPrivilege [[-ComputerName] \u003cDbaInstanceParameter[]\u003e] [[-Credential] \u003cPSCredential\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaProcess", + "Name": "Get-DbaProcess", "Description": "This command displays processes associated with a spid, login, host, program or database.\n\nThanks to Michael J Swart at https://sqlperformance.com/2017/07/sql-performance/find-database-connection-leaks for the query to get the last executed SQL statement, minutesasleep and host process ID.", "Tags": [ "Process", "Session", "ActivityMonitor" ], + "Synopsis": "This command displays SQL Server processes.", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Get-DbaProcess", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Get-DbaProcess", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaProcess -SqlInstance sqlserver2014a -Login base\\ctrlb, sa\nShows information about the processes for base\\ctrlb and sa on sqlserver2014a. Windows Authentication is used in connecting to sqlserver2014a.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaProcess -SqlInstance sqlserver2014a -SqlCredential $credential -Spid 56, 77\nShows information about the processes for spid 56 and 57. Uses alternative (SQL or Windows) credentials to authenticate to sqlserver2014a.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaProcess -SqlInstance sqlserver2014a -Program \u0027Microsoft SQL Server Management Studio\u0027\nShows information about the processes that were created in Microsoft SQL Server Management Studio.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaProcess -SqlInstance sqlserver2014a -Host workstationx, server100\nShows information about the processes that were initiated by hosts (computers/clients) workstationx and server 1000.", "Params": [ [ "SqlInstance", @@ -16876,18 +17403,19 @@ "False" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "This command displays SQL Server processes.", - "Name": "Get-DbaProcess", - "Links": "https://dbatools.io/Get-DbaProcess", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaProcess -SqlInstance sqlserver2014a -Login base\\ctrlb, sa\nShows information about the processes for base\\ctrlb and sa on sqlserver2014a. Windows Authentication is used in connecting to sqlserver2014a.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaProcess -SqlInstance sqlserver2014a -SqlCredential $credential -Spid 56, 77\nShows information about the processes for spid 56 and 57. Uses alternative (SQL or Windows) credentials to authenticate to sqlserver2014a.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaProcess -SqlInstance sqlserver2014a -Program \u0027Microsoft SQL Server Management Studio\u0027\nShows information about the processes that were created in Microsoft SQL Server Management Studio.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaProcess -SqlInstance sqlserver2014a -Host workstationx, server100\nShows information about the processes that were initiated by hosts (computers/clients) workstationx and server 1000.", "Syntax": "Get-DbaProcess [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [[-Spid] \u003cInt32[]\u003e] [[-ExcludeSpid] \u003cInt32[]\u003e] [[-Database] \u003cString[]\u003e] [[-Login] \u003cString[]\u003e] [[-Hostname] \u003cString[]\u003e] [[-Program] \u003cString[]\u003e] [-ExcludeSystemSpids] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaProductKey", + "Name": "Get-DbaProductKey", "Description": "This command find the product key for all installed instances. Clustered instances are supported as well.\n\nUses key decoder by Jakob Bindslet (http://goo.gl/1jiwcB)", "Tags": "ProductKey", + "Synopsis": "Gets SQL Server Product Keys from local or destination SQL Servers. Works with SQL Server 2005-2017", + "Alias": "Get-DbaSqlProductKey,Get-SqlServerKey", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Get-DbaProductKey", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Get-DbaProductKey", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaProductKey -ComputerName winxp, sqlservera, sqlserver2014a, win2k8\nGets SQL Server versions, editions and product keys for all instances within each server or workstation.", "Params": [ [ "ComputerName", @@ -16922,21 +17450,22 @@ "False" ] ], - "Alias": "Get-DbaSqlProductKey,Get-SqlServerKey", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Gets SQL Server Product Keys from local or destination SQL Servers. Works with SQL Server 2005-2017", - "Name": "Get-DbaProductKey", - "Links": "https://dbatools.io/Get-DbaProductKey", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaProductKey -ComputerName winxp, sqlservera, sqlserver2014a, win2k8\nGets SQL Server versions, editions and product keys for all instances within each server or workstation.", "Syntax": "Get-DbaProductKey [-ComputerName] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [[-Credential] \u003cPSCredential\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaQueryExecutionTime", + "Name": "Get-DbaQueryExecutionTime", "Description": "Quickly find slow query executions within a database. Results will include stored procedures and individual SQL statements.", "Tags": [ "Query", "Performance" ], + "Synopsis": "Displays Stored Procedures and Ad hoc queries with the highest execution times. Works on SQL Server 2008 and above.", + "Alias": "", + "Author": "Brandon Abshire, netnerds.net", + "CommandName": "Get-DbaQueryExecutionTime", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Get-DbaQueryExecutionTime", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaQueryExecutionTime -SqlInstance sql2008, sqlserver2012\nReturn the top 100 slowest stored procedures or statements for servers sql2008 and sqlserver2012.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaQueryExecutionTime -SqlInstance sql2008 -Database TestDB\nReturn the top 100 slowest stored procedures or statements on server sql2008 for only the TestDB database.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaQueryExecutionTime -SqlInstance sql2008 -Database TestDB -MaxResultsPerDb 100 -MinExecs 200 -MinExecMs 1000\nReturn the top 100 slowest stored procedures or statements on server sql2008 for only the TestDB database, limiting results to queries with more than 200 total executions and an execution time over \r\n1000ms or higher.", "Params": [ [ "SqlInstance", @@ -17011,21 +17540,22 @@ "False" ] ], - "Alias": "", - "Author": "Brandon Abshire, netnerds.net", - "Synopsis": "Displays Stored Procedures and Ad hoc queries with the highest execution times. Works on SQL Server 2008 and above.", - "Name": "Get-DbaQueryExecutionTime", - "Links": "https://dbatools.io/Get-DbaQueryExecutionTime", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaQueryExecutionTime -SqlInstance sql2008, sqlserver2012\nReturn the top 100 slowest stored procedures or statements for servers sql2008 and sqlserver2012.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaQueryExecutionTime -SqlInstance sql2008 -Database TestDB\nReturn the top 100 slowest stored procedures or statements on server sql2008 for only the TestDB database.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaQueryExecutionTime -SqlInstance sql2008 -Database TestDB -MaxResultsPerDb 100 -MinExecs 200 -MinExecMs 1000\nReturn the top 100 slowest stored procedures or statements on server sql2008 for only the TestDB database, limiting results to queries with more than 200 total executions and an execution time over \r\n1000ms or higher.", "Syntax": "Get-DbaQueryExecutionTime [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [-SqlCredential \u003cPSCredential\u003e] [-Database \u003cObject[]\u003e] [-ExcludeDatabase \u003cObject[]\u003e] [[-MaxResultsPerDb] \u003cInt32\u003e] [[-MinExecs] \u003cInt32\u003e] [[-MinExecMs] \u003cInt32\u003e] [[-ExcludeSystem]] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaRegistryRoot", + "Name": "Get-DbaRegistryRoot", "Description": "Uses SQL WMI to find the Registry Root of each SQL Server instance on a computer", "Tags": [ "Configuration", "Registry" ], + "Synopsis": "Uses SQL WMI to find the Registry Root of each SQL Server instance on a computer", + "Alias": "Get-DbaSqlRegistryRoot", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Get-DbaRegistryRoot", + "Availability": "Windows only", + "Links": null, + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaRegistryRoot\nGets the registry root for all instances on localhost\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaRegistryRoot -ComputerName server1\nGets the registry root for all instances on server1", "Params": [ [ "ComputerName", @@ -17052,18 +17582,19 @@ "False" ] ], - "Alias": "Get-DbaSqlRegistryRoot", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Uses SQL WMI to find the Registry Root of each SQL Server instance on a computer", - "Name": "Get-DbaRegistryRoot", - "Links": null, - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaRegistryRoot\nGets the registry root for all instances on localhost\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaRegistryRoot -ComputerName server1\nGets the registry root for all instances on server1", "Syntax": "Get-DbaRegistryRoot [[-ComputerName] \u003cDbaInstanceParameter[]\u003e] [[-Credential] \u003cPSCredential\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaRepDistributor", + "Name": "Get-DbaRepDistributor", "Description": "This function locates and enumerates distributor information for a given SQL Server instance.", "Tags": "Replication", + "Synopsis": "Gets the information about a replication distributor for a given SQL Server instance.", + "Alias": "Get-DbaDistributor", + "Author": "William Durkin (@sql_williamd)", + "CommandName": "Get-DbaRepDistributor", + "Availability": "Windows only", + "Links": "https://dbatools.io/Get-DbaRepDistributor", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaRepDistributor -SqlInstance sql2008, sqlserver2012\nRetrieve distributor information for servers sql2008 and sqlserver2012.", "Params": [ [ "SqlInstance", @@ -17090,18 +17621,19 @@ "False" ] ], - "Alias": "Get-DbaDistributor", - "Author": "William Durkin (@sql_williamd)", - "Synopsis": "Gets the information about a replication distributor for a given SQL Server instance.", - "Name": "Get-DbaRepDistributor", - "Links": "https://dbatools.io/Get-DbaRepDistributor", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaRepDistributor -SqlInstance sql2008, sqlserver2012\nRetrieve distributor information for servers sql2008 and sqlserver2012.", "Syntax": "Get-DbaRepDistributor [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaRepPublication", + "Name": "Get-DbaRepPublication", "Description": "Quickly find all transactional, merge, and snapshot publications on a specific server or database.", "Tags": "Replication", + "Synopsis": "Displays all publications for a server or database.", + "Alias": "", + "Author": "Colin Douglas", + "CommandName": "Get-DbaRepPublication", + "Availability": "Windows only", + "Links": "https://dbatools.io/Get-DbaRepPublication", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaRepPublication -SqlInstance sql2008, sqlserver2012\nReturn all publications for servers sql2008 and sqlserver2012.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaRepPublication -SqlInstance sql2008 -Database TestDB\nReturn all publications on server sql2008 for only the TestDB database\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaRepPublication -SqlInstance sql2008 -PublicationType Transactional\nReturn all publications on server sql2008 for all databases that have Transactional publications", "Params": [ [ "SqlInstance", @@ -17144,18 +17676,19 @@ "False" ] ], - "Alias": "", - "Author": "Colin Douglas", - "Synopsis": "Displays all publications for a server or database.", - "Name": "Get-DbaRepPublication", - "Links": "https://dbatools.io/Get-DbaRepPublication", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaRepPublication -SqlInstance sql2008, sqlserver2012\nReturn all publications for servers sql2008 and sqlserver2012.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaRepPublication -SqlInstance sql2008 -Database TestDB\nReturn all publications on server sql2008 for only the TestDB database\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaRepPublication -SqlInstance sql2008 -PublicationType Transactional\nReturn all publications on server sql2008 for all databases that have Transactional publications", "Syntax": "Get-DbaRepPublication [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-Database] \u003cObject[]\u003e] [[-SqlCredential] \u003cPSCredential\u003e] [[-PublicationType] \u003cObject[]\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaRepServer", + "Name": "Get-DbaRepServer", "Description": "Gets a replication server object", "Tags": "Replication", + "Synopsis": "Gets a replication server object", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Get-DbaRepServer", + "Availability": "Windows only", + "Links": null, + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaRepServer -SqlInstance sql2016\nGets the replication server object for sql2016 using Windows authentication\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaRepServer -SqlInstance sql2016 -SqlCredential repadmin\nGets the replication server object for sql2016 using SQL authentication", "Params": [ [ "SqlInstance", @@ -17182,18 +17715,19 @@ "False" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Gets a replication server object", - "Name": "Get-DbaRepServer", - "Links": null, - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaRepServer -SqlInstance sql2016\nGets the replication server object for sql2016 using Windows authentication\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaRepServer -SqlInstance sql2016 -SqlCredential repadmin\nGets the replication server object for sql2016 using SQL authentication", "Syntax": "Get-DbaRepServer [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaResourceGovernor", + "Name": "Get-DbaResourceGovernor", "Description": "Gets the Resource Governor object", "Tags": "ResourceGovernor", + "Synopsis": "Gets the Resource Governor object", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Get-DbaResourceGovernor", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Get-DbaResourceGovernor", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaResourceGovernor -SqlInstance sql2016\nGets the resource governor object of the SqlInstance sql2016\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003e\u0027Sql1\u0027,\u0027Sql2/sqlexpress\u0027 | Get-DbaResourceGovernor\nGets the resource governor object on Sql1 and Sql2/sqlexpress instances", "Params": [ [ "SqlInstance", @@ -17220,21 +17754,22 @@ "False" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Gets the Resource Governor object", - "Name": "Get-DbaResourceGovernor", - "Links": "https://dbatools.io/Get-DbaResourceGovernor", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaResourceGovernor -SqlInstance sql2016\nGets the resource governor object of the SqlInstance sql2016\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003e\u0027Sql1\u0027,\u0027Sql2/sqlexpress\u0027 | Get-DbaResourceGovernor\nGets the resource governor object on Sql1 and Sql2/sqlexpress instances", "Syntax": "Get-DbaResourceGovernor [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaRgClassifierFunction", + "Name": "Get-DbaRgClassifierFunction", "Description": "Gets the Resource Governor custom classifier Function which is used for customize the workload groups usage", "Tags": [ "Migration", "ResourceGovernor" ], + "Synopsis": "Gets the Resource Governor custom classifier Function", + "Alias": "", + "Author": "Alessandro Alpi (@suxstellino), alessandroalpi.blog", + "CommandName": "Get-DbaRgClassifierFunction", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Get-DbaRgClassifierFunction", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaRgClassifierFunction -SqlInstance sql2016\nGets the classifier function from sql2016\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003e\u0027Sql1\u0027,\u0027Sql2/sqlexpress\u0027 | Get-DbaResourceGovernor | Get-DbaRgClassifierFunction\nGets the classifier function object on Sql1 and Sql2/sqlexpress instances", "Params": [ [ "SqlInstance", @@ -17269,18 +17804,19 @@ "False" ] ], - "Alias": "", - "Author": "Alessandro Alpi (@suxstellino), alessandroalpi.blog", - "Synopsis": "Gets the Resource Governor custom classifier Function", - "Name": "Get-DbaRgClassifierFunction", - "Links": "https://dbatools.io/Get-DbaRgClassifierFunction", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaRgClassifierFunction -SqlInstance sql2016\nGets the classifier function from sql2016\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003e\u0027Sql1\u0027,\u0027Sql2/sqlexpress\u0027 | Get-DbaResourceGovernor | Get-DbaRgClassifierFunction\nGets the classifier function object on Sql1 and Sql2/sqlexpress instances", "Syntax": "Get-DbaRgClassifierFunction [[-SqlInstance] \u003cDbaInstanceParameter[]\u003e] [[-SqlCredential] \u003cPSCredential\u003e] [[-InputObject] \u003cResourceGovernor[]\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaRgResourcePool", + "Name": "Get-DbaRgResourcePool", "Description": "Gets Resource Governor Pool objects, including internal or external", "Tags": "ResourceGovernor", + "Synopsis": "Gets Resource Governor Pool objects, including internal or external", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Get-DbaRgResourcePool", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Get-DbaRgResourcePool", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaRgResourcePool -SqlInstance sql2016\nGets the internal resource pools on sql2016\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003e\u0027Sql1\u0027,\u0027Sql2/sqlexpress\u0027 | Get-DbaResourceGovernor | Get-DbaRgResourcePool\nGets the internal resource pools on Sql1 and Sql2/sqlexpress instances\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003e\u0027Sql1\u0027,\u0027Sql2/sqlexpress\u0027 | Get-DbaResourceGovernor | Get-DbaRgResourcePool -Type External\nGets the external resource pools on Sql1 and Sql2/sqlexpress instances", "Params": [ [ "SqlInstance", @@ -17323,18 +17859,19 @@ "False" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Gets Resource Governor Pool objects, including internal or external", - "Name": "Get-DbaRgResourcePool", - "Links": "https://dbatools.io/Get-DbaRgResourcePool", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaRgResourcePool -SqlInstance sql2016\nGets the internal resource pools on sql2016\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003e\u0027Sql1\u0027,\u0027Sql2/sqlexpress\u0027 | Get-DbaResourceGovernor | Get-DbaRgResourcePool\nGets the internal resource pools on Sql1 and Sql2/sqlexpress instances\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003e\u0027Sql1\u0027,\u0027Sql2/sqlexpress\u0027 | Get-DbaResourceGovernor | Get-DbaRgResourcePool -Type External\nGets the external resource pools on Sql1 and Sql2/sqlexpress instances", "Syntax": "Get-DbaRgResourcePool [[-SqlInstance] \u003cDbaInstanceParameter[]\u003e] [[-SqlCredential] \u003cPSCredential\u003e] [[-Type] \u003cString\u003e] [[-InputObject] \u003cResourceGovernor[]\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaRgWorkloadGroup", + "Name": "Get-DbaRgWorkloadGroup", "Description": "Gets all Resource Governor Pool objects, including both internal and external", "Tags": "ResourceGovernor", + "Synopsis": "Gets all Resource Governor Pool objects, including both internal and external", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Get-DbaRgWorkloadGroup", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Get-DbaRgWorkloadGroup", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaRgWorkloadGroup -SqlInstance sql2017\nGets the workload groups on sql2017\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaResourceGovernor -SqlInstance sql2017 | Get-DbaRgResourcePool | Get-DbaRgWorkloadGroup\nGets the workload groups on sql2017", "Params": [ [ "SqlInstance", @@ -17369,21 +17906,22 @@ "False" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Gets all Resource Governor Pool objects, including both internal and external", - "Name": "Get-DbaRgWorkloadGroup", - "Links": "https://dbatools.io/Get-DbaRgWorkloadGroup", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaRgWorkloadGroup -SqlInstance sql2017\nGets the workload groups on sql2017\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaResourceGovernor -SqlInstance sql2017 | Get-DbaRgResourcePool | Get-DbaRgWorkloadGroup\nGets the workload groups on sql2017", "Syntax": "Get-DbaRgWorkloadGroup [[-SqlInstance] \u003cDbaInstanceParameter[]\u003e] [[-SqlCredential] \u003cPSCredential\u003e] [[-InputObject] \u003cResourcePool[]\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaRunningJob", + "Name": "Get-DbaRunningJob", "Description": "This function returns agent jobs that active on the SQL Server instance when calling the command", "Tags": [ "Agent", "Job" ], + "Synopsis": "Returns all non-idle Agent jobs running on the server", + "Alias": "", + "Author": "Stephen Bennett, https://sqlnotesfromtheunderground.wordpress.com/", + "CommandName": "Get-DbaRunningJob", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Get-DbaRunningJob", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaRunningJob -SqlInstance sql2017\nReturns any active jobs on sql2017\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaAgentJob -SqlInstance sql2017, sql2019 | Get-DbaRunningJob\nReturns all active jobs on multiple instances piped into the function.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003e$servers | Get-DbaRunningJob\nReturns all active jobs on multiple instances piped into the function.", "Params": [ [ "SqlInstance", @@ -17418,22 +17956,23 @@ "False" ] ], - "Alias": "", - "Author": "Stephen Bennett, https://sqlnotesfromtheunderground.wordpress.com/", - "Synopsis": "Returns all non-idle Agent jobs running on the server", - "Name": "Get-DbaRunningJob", - "Links": "https://dbatools.io/Get-DbaRunningJob", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaRunningJob -SqlInstance sql2017\nReturns any active jobs on sql2017\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaAgentJob -SqlInstance sql2017, sql2019 | Get-DbaRunningJob\nReturns all active jobs on multiple instances piped into the function.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003e$servers | Get-DbaRunningJob\nReturns all active jobs on multiple instances piped into the function.", "Syntax": "Get-DbaRunningJob [[-SqlInstance] \u003cDbaInstanceParameter[]\u003e] [[-SqlCredential] \u003cPSCredential\u003e] [[-InputObject] \u003cJob[]\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaSchemaChangeHistory", + "Name": "Get-DbaSchemaChangeHistory", "Description": "Queries the default system trace for any DDL changes in the specified time frame\nOnly works with SQL 2005 and later, as the system trace didn\u0027t exist before then", "Tags": [ "Migration", "Backup", "Database" ], + "Synopsis": "Gets DDL changes logged in the system trace.", + "Alias": "", + "Author": "Stuart Moore (@napalmgram - http://stuart-moore.com)", + "CommandName": "Get-DbaSchemaChangeHistory", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Get-DbaSchemaChangeHistory", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaSchemaChangeHistory -SqlInstance localhost\nReturns all DDL changes made in all databases on the SQL Server instance localhost since the system trace began\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaSchemaChangeHistory -SqlInstance localhost -Since (Get-Date).AddDays(-7)\nReturns all DDL changes made in all databases on the SQL Server instance localhost in the last 7 days\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaSchemaChangeHistory -SqlInstance localhost -Database Finance, Prod -Since (Get-Date).AddDays(-7)\nReturns all DDL changes made in the Prod and Finance databases on the SQL Server instance localhost in the last 7 days\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaSchemaChangeHistory -SqlInstance localhost -Database Finance -Object AccountsTable -Since (Get-Date).AddDays(-7)\nReturns all DDL changes made to the AccountsTable object in the Finance database on the SQL Server instance localhost in the last 7 days", "Params": [ [ "SqlInstance", @@ -17492,22 +18031,23 @@ "False" ] ], - "Alias": "", - "Author": "Stuart Moore (@napalmgram - http://stuart-moore.com)", - "Synopsis": "Gets DDL changes logged in the system trace.", - "Name": "Get-DbaSchemaChangeHistory", - "Links": "https://dbatools.io/Get-DbaSchemaChangeHistory", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaSchemaChangeHistory -SqlInstance localhost\nReturns all DDL changes made in all databases on the SQL Server instance localhost since the system trace began\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaSchemaChangeHistory -SqlInstance localhost -Since (Get-Date).AddDays(-7)\nReturns all DDL changes made in all databases on the SQL Server instance localhost in the last 7 days\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaSchemaChangeHistory -SqlInstance localhost -Database Finance, Prod -Since (Get-Date).AddDays(-7)\nReturns all DDL changes made in the Prod and Finance databases on the SQL Server instance localhost in the last 7 days\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaSchemaChangeHistory -SqlInstance localhost -Database Finance -Object AccountsTable -Since (Get-Date).AddDays(-7)\nReturns all DDL changes made to the AccountsTable object in the Finance database on the SQL Server instance localhost in the last 7 days", "Syntax": "Get-DbaSchemaChangeHistory [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [-SqlCredential \u003cPSCredential\u003e] [-Database \u003cObject[]\u003e] [-ExcludeDatabase \u003cObject[]\u003e] [-Since \u003cDbaDateTime\u003e] [-Object \u003cString[]\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaServerAudit", + "Name": "Get-DbaServerAudit", "Description": "The Get-DbaServerAudit command gets SQL Security Audit information for each instance(s) of SQL Server.", "Tags": [ "Audit", "Security", "SqlAudit" ], + "Synopsis": "Gets SQL Security Audit information for each instance(s) of SQL Server.", + "Alias": "", + "Author": "Garry Bargsley (@gbargsley), http://blog.garrybargsley.com", + "CommandName": "Get-DbaServerAudit", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Get-DbaServerAudit", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaServerAudit -SqlInstance localhost\nReturns all Security Audits on the local default SQL Server instance\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaServerAudit -SqlInstance localhost, sql2016\nReturns all Security Audits for the local and sql2016 SQL Server instances", "Params": [ [ "SqlInstance", @@ -17550,22 +18090,23 @@ "False" ] ], - "Alias": "", - "Author": "Garry Bargsley (@gbargsley), http://blog.garrybargsley.com", - "Synopsis": "Gets SQL Security Audit information for each instance(s) of SQL Server.", - "Name": "Get-DbaServerAudit", - "Links": "https://dbatools.io/Get-DbaServerAudit", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaServerAudit -SqlInstance localhost\nReturns all Security Audits on the local default SQL Server instance\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaServerAudit -SqlInstance localhost, sql2016\nReturns all Security Audits for the local and sql2016 SQL Server instances", "Syntax": "Get-DbaServerAudit [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [-SqlCredential \u003cPSCredential\u003e] [-Audit \u003cString[]\u003e] [-ExcludeAudit \u003cString[]\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaServerAuditSpecification", + "Name": "Get-DbaServerAuditSpecification", "Description": "The Get-DbaServerAuditSpecification command gets SQL Security Audit Specification information for each instance(s) of SQL Server.", "Tags": [ "Audit", "Security", "SqlAudit" ], + "Synopsis": "Gets SQL Security Audit Specification information for each instance(s) of SQL Server.", + "Alias": "", + "Author": "Garry Bargsley (@gbargsley), http://blog.garrybargsley.com", + "CommandName": "Get-DbaServerAuditSpecification", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Get-DbaServerAuditSpecification", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaServerAuditSpecification -SqlInstance localhost\nReturns all Security Audit Specifications on the local default SQL Server instance\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaServerAuditSpecification -SqlInstance localhost, sql2016\nReturns all Security Audit Specifications for the local and sql2016 SQL Server instances", "Params": [ [ "SqlInstance", @@ -17592,18 +18133,19 @@ "False" ] ], - "Alias": "", - "Author": "Garry Bargsley (@gbargsley), http://blog.garrybargsley.com", - "Synopsis": "Gets SQL Security Audit Specification information for each instance(s) of SQL Server.", - "Name": "Get-DbaServerAuditSpecification", - "Links": "https://dbatools.io/Get-DbaServerAuditSpecification", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaServerAuditSpecification -SqlInstance localhost\nReturns all Security Audit Specifications on the local default SQL Server instance\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaServerAuditSpecification -SqlInstance localhost, sql2016\nReturns all Security Audit Specifications for the local and sql2016 SQL Server instances", "Syntax": "Get-DbaServerAuditSpecification [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [-SqlCredential \u003cPSCredential\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaServerInstallDate", + "Name": "Get-DbaServerInstallDate", "Description": "This command returns:\nSqlInstallDate\nWindowsInstallDate (use -IncludeWindows)", "Tags": "Install", + "Synopsis": "Returns the install date of a SQL Instance and Windows Server.", + "Alias": "", + "Author": "Mitchell Hamann (@SirCaptainMitch), mitchellhamann.com", + "CommandName": "Get-DbaServerInstallDate", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Get-DbaServerInstallDate", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaServerInstallDate -SqlInstance SqlBox1\\Instance2\nReturns an object with SQL Instance Install date as a string.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaServerInstallDate -SqlInstance winserver\\sqlexpress, sql2016\nReturns an object with SQL Instance Install date as a string for both SQLInstances that are passed to the cmdlet.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003e\u0027sqlserver2014a\u0027, \u0027sql2016\u0027 | Get-DbaServerInstallDate\nReturns an object with SQL Instance Install date as a string for both SQLInstances that are passed to the cmdlet via the pipeline.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaServerInstallDate -SqlInstance sqlserver2014a, sql2016 -IncludeWindows\nReturns an object with the Windows Install date and the SQL install date as a string.\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eGet-DbaCmsRegServer -SqlInstance sql2014 | Get-DbaServerInstallDate\nReturns an object with SQL Instance install date as a string for every server listed in the Central Management Server on sql2014", "Params": [ [ "SqlInstance", @@ -17646,18 +18188,19 @@ "False" ] ], - "Alias": "", - "Author": "Mitchell Hamann (@SirCaptainMitch), mitchellhamann.com", - "Synopsis": "Returns the install date of a SQL Instance and Windows Server.", - "Name": "Get-DbaServerInstallDate", - "Links": "https://dbatools.io/Get-DbaServerInstallDate", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaServerInstallDate -SqlInstance SqlBox1\\Instance2\nReturns an object with SQL Instance Install date as a string.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaServerInstallDate -SqlInstance winserver\\sqlexpress, sql2016\nReturns an object with SQL Instance Install date as a string for both SQLInstances that are passed to the cmdlet.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003e\u0027sqlserver2014a\u0027, \u0027sql2016\u0027 | Get-DbaServerInstallDate\nReturns an object with SQL Instance Install date as a string for both SQLInstances that are passed to the cmdlet via the pipeline.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaServerInstallDate -SqlInstance sqlserver2014a, sql2016 -IncludeWindows\nReturns an object with the Windows Install date and the SQL install date as a string.\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eGet-DbaCmsRegServer -SqlInstance sql2014 | Get-DbaServerInstallDate\nReturns an object with SQL Instance install date as a string for every server listed in the Central Management Server on sql2014", "Syntax": "Get-DbaServerInstallDate [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [[-Credential] \u003cPSCredential\u003e] [-IncludeWindows] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaServerProtocol", + "Name": "Get-DbaServerProtocol", "Description": "Gets the SQL Server related server protocols on one or more computers.\n\nRequires Local Admin rights on destination computer(s).\nThe server protocols can be enabled and disabled when retrieved via WSMan.", "Tags": "Protocol", + "Synopsis": "Gets the SQL Server related server protocols on a computer.", + "Alias": "", + "Author": "Klaas Vandenberghe ( @PowerDBAKlaas )", + "CommandName": "Get-DbaServerProtocol", + "Availability": "Windows only", + "Links": "https://dbatools.io/Get-DbaServerProtocol", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaServerProtocol -ComputerName sqlserver2014a\nGets the SQL Server related server protocols on computer sqlserver2014a.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003e\u0027sql1\u0027,\u0027sql2\u0027,\u0027sql3\u0027 | Get-DbaServerProtocol\nGets the SQL Server related server protocols on computers sql1, sql2 and sql3.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaServerProtocol -ComputerName sql1,sql2 | Out-GridView\nGets the SQL Server related server protocols on computers sql1 and sql2, and shows them in a grid view.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003e(Get-DbaServerProtocol -ComputerName sql1 | Where { $_.DisplayName = \u0027via\u0027 }).Disable()\nDisables the VIA ServerNetworkProtocol on computer sql1.\r\nIf successful, return code 0 is shown.", "Params": [ [ "ComputerName", @@ -17684,21 +18227,22 @@ "False" ] ], - "Alias": "", - "Author": "Klaas Vandenberghe ( @PowerDBAKlaas )", - "Synopsis": "Gets the SQL Server related server protocols on a computer.", - "Name": "Get-DbaServerProtocol", - "Links": "https://dbatools.io/Get-DbaServerProtocol", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaServerProtocol -ComputerName sqlserver2014a\nGets the SQL Server related server protocols on computer sqlserver2014a.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003e\u0027sql1\u0027,\u0027sql2\u0027,\u0027sql3\u0027 | Get-DbaServerProtocol\nGets the SQL Server related server protocols on computers sql1, sql2 and sql3.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaServerProtocol -ComputerName sql1,sql2 | Out-GridView\nGets the SQL Server related server protocols on computers sql1 and sql2, and shows them in a grid view.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003e(Get-DbaServerProtocol -ComputerName sql1 | Where { $_.DisplayName = \u0027via\u0027 }).Disable()\nDisables the VIA ServerNetworkProtocol on computer sql1.\r\nIf successful, return code 0 is shown.", "Syntax": "Get-DbaServerProtocol [[-ComputerName] \u003cDbaInstanceParameter[]\u003e] [[-Credential] \u003cPSCredential\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaServerRole", + "Name": "Get-DbaServerRole", "Description": "Gets the list of server-level roles for SQL Server instance.", "Tags": [ "ServerRole", "Security" ], + "Synopsis": "Gets the list of server-level roles.", + "Alias": "", + "Author": "Shawn Melton (@wsmelton)", + "CommandName": "Get-DbaServerRole", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Get-DbaServerRole", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaServerRole -SqlInstance sql2016a\nOutputs list of server-level roles for sql2016a instance.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaServerRole -SqlInstance sql2017a -ExcludeFixedRole\nOutputs the server-level role(s) that are not fixed roles on sql2017a instance.", "Params": [ [ "SqlInstance", @@ -17749,22 +18293,23 @@ "False" ] ], - "Alias": "", - "Author": "Shawn Melton (@wsmelton)", - "Synopsis": "Gets the list of server-level roles.", - "Name": "Get-DbaServerRole", - "Links": "https://dbatools.io/Get-DbaServerRole", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaServerRole -SqlInstance sql2016a\nOutputs list of server-level roles for sql2016a instance.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaServerRole -SqlInstance sql2017a -ExcludeFixedRole\nOutputs the server-level role(s) that are not fixed roles on sql2017a instance.", "Syntax": "Get-DbaServerRole [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [-SqlCredential \u003cPSCredential\u003e] [-ServerRole \u003cString[]\u003e] [-ExcludeServerRole \u003cString[]\u003e] [-ExcludeFixedRole] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaServerRoleMember", + "Name": "Get-DbaServerRoleMember", "Description": "The Get-DbaServerRoleMember returns connected SMO object for server roles for each instance(s) of SQL Server.", "Tags": [ "ServerRole", "Security", "Login" ], + "Synopsis": "Get members of server roles for each instance(s) of SQL Server.", + "Alias": "", + "Author": "Klaas Vandenberghe (@PowerDBAKlaas)", + "CommandName": "Get-DbaServerRoleMember", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Get-DbaServerRoleMember", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaServerRoleMember -SqlInstance localhost\nReturns all members of all server roles on the local default SQL Server instance\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaServerRoleMember -SqlInstance localhost, sql2016\nReturns all members of all server roles on the local and sql2016 SQL Server instances\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003e$servers = Get-Content C:\\servers.txt\nPS C:\\\u003e $servers | Get-DbaServerRoleMember\nReturns all members of all server roles for every server in C:\\servers.txt\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaServerRoleMember -SqlInstance localhost -ServerRole \u0027sysadmin\u0027, \u0027dbcreator\u0027\nReturns all members of the sysadmin or dbcreator roles on localhost.\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eGet-DbaServerRoleMember -SqlInstance localhost -ExcludeServerRole \u0027sysadmin\u0027\nReturns all members of server-level roles other than sysadmin.\n-------------------------- EXAMPLE 6 --------------------------\nPS C:\\\u003eGet-DbaServerRoleMember -SqlInstance sql2017a -ExcludeFixedRole\nReturns all members of server-level role(s) that are not fixed roles on sql2017a instance.\n-------------------------- EXAMPLE 7 --------------------------\nPS C:\\\u003eGet-DbaServerRoleMember -SqlInstance localhost -Login \u0027MyFriendlyDeveloper\u0027\nReturns all server-level role(s) for the MyFriendlyDeveloper login on localhost.", "Params": [ [ "SqlInstance", @@ -17823,21 +18368,22 @@ "False" ] ], - "Alias": "", - "Author": "Klaas Vandenberghe (@PowerDBAKlaas)", - "Synopsis": "Get members of server roles for each instance(s) of SQL Server.", - "Name": "Get-DbaServerRoleMember", - "Links": "https://dbatools.io/Get-DbaServerRoleMember", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaServerRoleMember -SqlInstance localhost\nReturns all members of all server roles on the local default SQL Server instance\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaServerRoleMember -SqlInstance localhost, sql2016\nReturns all members of all server roles on the local and sql2016 SQL Server instances\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003e$servers = Get-Content C:\\servers.txt\nPS C:\\\u003e $servers | Get-DbaServerRoleMember\nReturns all members of all server roles for every server in C:\\servers.txt\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaServerRoleMember -SqlInstance localhost -ServerRole \u0027sysadmin\u0027, \u0027dbcreator\u0027\nReturns all members of the sysadmin or dbcreator roles on localhost.\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eGet-DbaServerRoleMember -SqlInstance localhost -ExcludeServerRole \u0027sysadmin\u0027\nReturns all members of server-level roles other than sysadmin.\n-------------------------- EXAMPLE 6 --------------------------\nPS C:\\\u003eGet-DbaServerRoleMember -SqlInstance sql2017a -ExcludeFixedRole\nReturns all members of server-level role(s) that are not fixed roles on sql2017a instance.\n-------------------------- EXAMPLE 7 --------------------------\nPS C:\\\u003eGet-DbaServerRoleMember -SqlInstance localhost -Login \u0027MyFriendlyDeveloper\u0027\nReturns all server-level role(s) for the MyFriendlyDeveloper login on localhost.", "Syntax": "Get-DbaServerRoleMember [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [-SqlCredential \u003cPSCredential\u003e] [-ServerRole \u003cString[]\u003e] [-ExcludeServerRole \u003cString[]\u003e] [-Login \u003cObject[]\u003e] [-ExcludeFixedRole] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaServerTrigger", + "Name": "Get-DbaServerTrigger", "Description": "Get all existing server triggers on one or more SQL instances.", "Tags": [ "Database", "Trigger" ], + "Synopsis": "Get all existing server triggers on one or more SQL instances.", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Get-DbaServerTrigger", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Get-DbaServerTrigger", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaServerTrigger -SqlInstance sql2017\nReturns all server triggers on sql2017", "Params": [ [ "SqlInstance", @@ -17864,16 +18410,10 @@ "False" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Get all existing server triggers on one or more SQL instances.", - "Name": "Get-DbaServerTrigger", - "Links": "https://dbatools.io/Get-DbaServerTrigger", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaServerTrigger -SqlInstance sql2017\nReturns all server triggers on sql2017", "Syntax": "Get-DbaServerTrigger [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaService", + "Name": "Get-DbaService", "Description": "Gets the SQL Server related services on one or more computers.\n\nRequires Local Admin rights on destination computer(s).", "Tags": [ "Service", @@ -17881,6 +18421,13 @@ "Instance", "Connect" ], + "Synopsis": "Gets the SQL Server related services on a computer.", + "Alias": "Get-DbaSqlService", + "Author": "Klaas Vandenberghe ( @PowerDBAKlaas )", + "CommandName": "Get-DbaService", + "Availability": "Windows only", + "Links": "https://dbatools.io/Get-DbaService", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaService -ComputerName sqlserver2014a\nGets the SQL Server related services on computer sqlserver2014a.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003e\u0027sql1\u0027,\u0027sql2\u0027,\u0027sql3\u0027 | Get-DbaService -AdvancedProperties\nGets the SQL Server related services on computers sql1, sql2 and sql3. Includes Advanced Properties from the SqlServiceAdvancedProperty Namespace\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003e$cred = Get-Credential WindowsUser\nPS C:\\\u003e Get-DbaService -ComputerName sql1,sql2 -Credential $cred | Out-GridView\nGets the SQL Server related services on computers sql1 and sql2 via the user WindowsUser, and shows them in a grid view.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaService -ComputerName sql1,sql2 -InstanceName MSSQLSERVER\nGets the SQL Server related services related to the default instance MSSQLSERVER on computers sql1 and sql2.\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eGet-DbaService -ComputerName $MyServers -Type SSRS\nGets the SQL Server related services of type \"SSRS\" (Reporting Services) on computers in the variable MyServers.\n-------------------------- EXAMPLE 6 --------------------------\nPS C:\\\u003e$MyServers = Get-Content .\\servers.txt\nPS C:\\\u003e Get-DbaService -ComputerName $MyServers -ServiceName MSSQLSERVER,SQLSERVERAGENT\nGets the SQL Server related services with ServiceName MSSQLSERVER or SQLSERVERAGENT for all the servers that are stored in the file. Every line in the file can only contain one hostname for a server.\n-------------------------- EXAMPLE 7 --------------------------\nPS C:\\\u003e$services = Get-DbaService -ComputerName sql1 -Type Agent,Engine\nPS C:\\\u003e $services.ChangeStartMode(\u0027Manual\u0027)\nGets the SQL Server related services of types Sql Agent and DB Engine on computer sql1 and changes their startup mode to \u0027Manual\u0027.\n-------------------------- EXAMPLE 8 --------------------------\nPS C:\\\u003e(Get-DbaService -ComputerName sql1 -Type Engine).Restart($true)\nCalls a Restart method for each Engine service on computer sql1.", "Params": [ [ "ComputerName", @@ -17939,22 +18486,23 @@ "False" ] ], - "Alias": "Get-DbaSqlService", - "Author": "Klaas Vandenberghe ( @PowerDBAKlaas )", - "Synopsis": "Gets the SQL Server related services on a computer.", - "Name": "Get-DbaService", - "Links": "https://dbatools.io/Get-DbaService", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaService -ComputerName sqlserver2014a\nGets the SQL Server related services on computer sqlserver2014a.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003e\u0027sql1\u0027,\u0027sql2\u0027,\u0027sql3\u0027 | Get-DbaService -AdvancedProperties\nGets the SQL Server related services on computers sql1, sql2 and sql3. Includes Advanced Properties from the SqlServiceAdvancedProperty Namespace\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003e$cred = Get-Credential WindowsUser\nPS C:\\\u003e Get-DbaService -ComputerName sql1,sql2 -Credential $cred | Out-GridView\nGets the SQL Server related services on computers sql1 and sql2 via the user WindowsUser, and shows them in a grid view.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaService -ComputerName sql1,sql2 -InstanceName MSSQLSERVER\nGets the SQL Server related services related to the default instance MSSQLSERVER on computers sql1 and sql2.\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eGet-DbaService -ComputerName $MyServers -Type SSRS\nGets the SQL Server related services of type \"SSRS\" (Reporting Services) on computers in the variable MyServers.\n-------------------------- EXAMPLE 6 --------------------------\nPS C:\\\u003e$MyServers = Get-Content .\\servers.txt\nPS C:\\\u003e Get-DbaService -ComputerName $MyServers -ServiceName MSSQLSERVER,SQLSERVERAGENT\nGets the SQL Server related services with ServiceName MSSQLSERVER or SQLSERVERAGENT for all the servers that are stored in the file. Every line in the file can only contain one hostname for a server.\n-------------------------- EXAMPLE 7 --------------------------\nPS C:\\\u003e$services = Get-DbaService -ComputerName sql1 -Type Agent,Engine\nPS C:\\\u003e $services.ChangeStartMode(\u0027Manual\u0027)\nGets the SQL Server related services of types Sql Agent and DB Engine on computer sql1 and changes their startup mode to \u0027Manual\u0027.\n-------------------------- EXAMPLE 8 --------------------------\nPS C:\\\u003e(Get-DbaService -ComputerName sql1 -Type Engine).Restart($true)\nCalls a Restart method for each Engine service on computer sql1.", "Syntax": "Get-DbaService [[-ComputerName] \u003cDbaInstanceParameter[]\u003e] [-InstanceName \u003cString[]\u003e] [-Credential \u003cPSCredential\u003e] [-Type \u003cString[]\u003e] [-AdvancedProperties] [-EnableException] [\u003cCommonParameters\u003e]\nGet-DbaService [[-ComputerName] \u003cDbaInstanceParameter[]\u003e] [-Credential \u003cPSCredential\u003e] [-ServiceName \u003cString[]\u003e] [-AdvancedProperties] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaSpConfigure", + "Name": "Get-DbaSpConfigure", "Description": "This function returns server level system configuration (sys.configuration/sp_configure) information. The information is gathered through SMO Configuration.Properties.\nThe data includes the default value for each configuration, for quick identification of values that may have been changed.", "Tags": [ "SpConfig", "Configure", "Configuration" ], + "Synopsis": "Returns all server level system configuration (sys.configuration/sp_configure) information", + "Alias": "", + "Author": "Nic Cain, https://sirsql.net/", + "CommandName": "Get-DbaSpConfigure", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Get-DbaSpConfigure", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaSpConfigure -SqlInstance localhost\nReturns all system configuration information on the localhost.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003e\u0027localhost\u0027,\u0027localhost\\namedinstance\u0027 | Get-DbaSpConfigure\nReturns system configuration information on multiple instances piped into the function\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaSpConfigure -SqlInstance sql2012 -Name \u0027max server memory (MB)\u0027\nReturns only the system configuration for MaxServerMemory on sql2012.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaSpConfigure -SqlInstance sql2012 -ExcludeName \u0027max server memory (MB)\u0027, RemoteAccess | Out-GridView\nReturns system configuration information on sql2012 but excludes for max server memory (MB) and remote access. Values returned in grid view\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003e$cred = Get-Credential SqlCredential\nPS C:\\\u003e \u0027sql2012\u0027 | Get-DbaSpConfigure -SqlCredential $cred -Name RemoteAccess, \u0027max server memory (MB)\u0027 -ExcludeName \u0027remote access\u0027 | Out-GridView\nReturns system configuration information on sql2012 using SQL Server Authentication. Only MaxServerMemory is returned as RemoteAccess was also excluded.", "Params": [ [ "SqlInstance", @@ -17997,21 +18545,22 @@ "False" ] ], - "Alias": "", - "Author": "Nic Cain, https://sirsql.net/", - "Synopsis": "Returns all server level system configuration (sys.configuration/sp_configure) information", - "Name": "Get-DbaSpConfigure", - "Links": "https://dbatools.io/Get-DbaSpConfigure", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaSpConfigure -SqlInstance localhost\nReturns all system configuration information on the localhost.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003e\u0027localhost\u0027,\u0027localhost\\namedinstance\u0027 | Get-DbaSpConfigure\nReturns system configuration information on multiple instances piped into the function\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaSpConfigure -SqlInstance sql2012 -Name \u0027max server memory (MB)\u0027\nReturns only the system configuration for MaxServerMemory on sql2012.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaSpConfigure -SqlInstance sql2012 -ExcludeName \u0027max server memory (MB)\u0027, RemoteAccess | Out-GridView\nReturns system configuration information on sql2012 but excludes for max server memory (MB) and remote access. Values returned in grid view\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003e$cred = Get-Credential SqlCredential\nPS C:\\\u003e \u0027sql2012\u0027 | Get-DbaSpConfigure -SqlCredential $cred -Name RemoteAccess, \u0027max server memory (MB)\u0027 -ExcludeName \u0027remote access\u0027 | Out-GridView\nReturns system configuration information on sql2012 using SQL Server Authentication. Only MaxServerMemory is returned as RemoteAccess was also excluded.", "Syntax": "Get-DbaSpConfigure [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [-SqlCredential \u003cPSCredential\u003e] [-Name \u003cString[]\u003e] [-ExcludeName \u003cString[]\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaSpinLockStatistic", + "Name": "Get-DbaSpinLockStatistic", "Description": "This command is based off of Paul Randal\u0027s post \"Advanced SQL Server performance tuning\"\n\nReturns:\n SpinLockName\n Collisions\n Spins\n SpinsPerCollision\n SleepTime\n Backoffs\n\nReference: https://www.sqlskills.com/blogs/paul/advanced-performance-troubleshooting-waits-latches-spinlocks/", "Tags": [ "SpinLockStatistics", "Waits" ], + "Synopsis": "Displays information from sys.dm_os_spinlock_stats. Works on SQL Server 2008 and above.", + "Alias": "", + "Author": "Patrick Flynn (@sqllensman)", + "CommandName": "Get-DbaSpinLockStatistic", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Get-DbaSpinLockStatistic", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaSpinLockStatistic -SqlInstance sql2008, sqlserver2012\nGet SpinLock Statistics for servers sql2008 and sqlserver2012.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003e$output = Get-DbaSpinLockStatistic -SqlInstance sql2008 | Select * | ConvertTo-DbaDataTable\nCollects all SpinLock Statistics on server sql2008 into a Data Table.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003e\u0027sql2008\u0027,\u0027sqlserver2012\u0027 | Get-DbaSpinLockStatistic\nGet SpinLock Statistics for servers sql2008 and sqlserver2012 via pipline\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003e$cred = Get-Credential sqladmin\nPS C:\\\u003e Get-DbaSpinLockStatistic -SqlInstance sql2008 -SqlCredential $cred\nConnects using sqladmin credential and returns SpinLock Statistics from sql2008", "Params": [ [ "SqlInstance", @@ -18038,18 +18587,19 @@ "False" ] ], - "Alias": "", - "Author": "Patrick Flynn (@sqllensman)", - "Synopsis": "Displays information from sys.dm_os_spinlock_stats. Works on SQL Server 2008 and above.", - "Name": "Get-DbaSpinLockStatistic", - "Links": "https://dbatools.io/Get-DbaSpinLockStatistic", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaSpinLockStatistic -SqlInstance sql2008, sqlserver2012\nGet SpinLock Statistics for servers sql2008 and sqlserver2012.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003e$output = Get-DbaSpinLockStatistic -SqlInstance sql2008 | Select * | ConvertTo-DbaDataTable\nCollects all SpinLock Statistics on server sql2008 into a Data Table.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003e\u0027sql2008\u0027,\u0027sqlserver2012\u0027 | Get-DbaSpinLockStatistic\nGet SpinLock Statistics for servers sql2008 and sqlserver2012 via pipline\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003e$cred = Get-Credential sqladmin\nPS C:\\\u003e Get-DbaSpinLockStatistic -SqlInstance sql2008 -SqlCredential $cred\nConnects using sqladmin credential and returns SpinLock Statistics from sql2008", "Syntax": "Get-DbaSpinLockStatistic [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaSpn", + "Name": "Get-DbaSpn", "Description": "Get a list of set SPNs. SPNs are set at the AD account level. You can either retrieve set SPNs for a computer, or any SPNs set for\na given active directory account. You can query one, or both. You\u0027ll get a list of every SPN found for either search term.", "Tags": "SPN", + "Synopsis": "Returns a list of set service principal names for a given computer/AD account", + "Alias": "", + "Author": "Drew Furgiuele (@pittfurg), http://www.port1433.com", + "CommandName": "Get-DbaSpn", + "Availability": "Windows only", + "Links": "https://dbatools.io/Get-DbaSpn", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaSpn -ComputerName SQLSERVERA -Credential ad\\sqldba\nReturns a custom object with SearchTerm (ServerName) and the SPNs that were found\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaSpn -AccountName domain\\account -Credential ad\\sqldba\nReturns a custom object with SearchTerm (domain account) and the SPNs that were found\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaSpn -ComputerName SQLSERVERA,SQLSERVERB -Credential ad\\sqldba\nReturns a custom object with SearchTerm (ServerName) and the SPNs that were found for multiple computers", "Params": [ [ "ComputerName", @@ -18084,22 +18634,23 @@ "False" ] ], - "Alias": "", - "Author": "Drew Furgiuele (@pittfurg), http://www.port1433.com", - "Synopsis": "Returns a list of set service principal names for a given computer/AD account", - "Name": "Get-DbaSpn", - "Links": "https://dbatools.io/Get-DbaSpn", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaSpn -ComputerName SQLSERVERA -Credential ad\\sqldba\nReturns a custom object with SearchTerm (ServerName) and the SPNs that were found\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaSpn -AccountName domain\\account -Credential ad\\sqldba\nReturns a custom object with SearchTerm (domain account) and the SPNs that were found\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaSpn -ComputerName SQLSERVERA,SQLSERVERB -Credential ad\\sqldba\nReturns a custom object with SearchTerm (ServerName) and the SPNs that were found for multiple computers", "Syntax": "Get-DbaSpn [[-ComputerName] \u003cString[]\u003e] [[-AccountName] \u003cString[]\u003e] [[-Credential] \u003cPSCredential\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaSsisEnvironmentVariable", + "Name": "Get-DbaSsisEnvironmentVariable", "Description": "This command gets all variables from specified environment from SSIS Catalog. All sensitive values are decrypted.\nThe function communicates directly with SSISDB database, \"SQL Server Integration Services\" service isn\u0027t queried there.\nEach parameter (besides SqlInstance and SqlCredential) acts as the filter to only include or exclude particular element", "Tags": [ "SSIS", "SSISDB", "Variable" ], + "Synopsis": "This command gets specified SSIS Environment and all its variables", + "Alias": "", + "Author": "Bartosz Ratajczyk (@b_ratajczyk)", + "CommandName": "Get-DbaSsisEnvironmentVariable", + "Availability": "Windows only", + "Links": "https://dbatools.io/Get-DbaSsisEnvironmentVariable", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaSsisEnvironmentVariable -SqlInstance localhost -Environment DEV -Folder DWH_ETL\nGets variables of \u0027DEV\u0027 environment located in \u0027DWH_ETL\u0027 folder on \u0027localhost\u0027 Server\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaSsisEnvironmentVariable -SqlInstance localhost -Environment DEV -Folder DWH_ETL, DEV2, QA\nGets variables of \u0027DEV\u0027 environment(s) located in folders \u0027DWH_ETL\u0027, \u0027DEV2\u0027 and \u0027QA\u0027 on \u0027localhost\u0027 server\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaSsisEnvironmentVariable -SqlInstance localhost -Environment DEV -FolderExclude DWH_ETL, DEV2, QA\nGets variables of \u0027DEV\u0027 environments located in folders other than \u0027DWH_ETL\u0027, \u0027DEV2\u0027 and \u0027QA\u0027 on \u0027localhost\u0027 server\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaSsisEnvironmentVariable -SqlInstance localhost -Environment DEV, PROD -Folder DWH_ETL, DEV2, QA\nGets variables of \u0027DEV\u0027 and \u0027PROD\u0027 environment(s) located in folders \u0027DWH_ETL\u0027, \u0027DEV2\u0027 and \u0027QA\u0027 on \u0027localhost\u0027 server\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eGet-DbaSsisEnvironmentVariable -SqlInstance localhost -EnvironmentExclude DEV, PROD -Folder DWH_ETL, DEV2, QA\nGets variables of environments other than \u0027DEV\u0027 and \u0027PROD\u0027 located in folders \u0027DWH_ETL\u0027, \u0027DEV2\u0027 and \u0027QA\u0027 on \u0027localhost\u0027 server\n-------------------------- EXAMPLE 6 --------------------------\nPS C:\\\u003eGet-DbaSsisEnvironmentVariable -SqlInstance localhost -EnvironmentExclude DEV, PROD -FolderExclude DWH_ETL, DEV2, QA\nGets variables of environments other than \u0027DEV\u0027 and \u0027PROD\u0027 located in folders other than \u0027DWH_ETL\u0027, \u0027DEV2\u0027 and \u0027QA\u0027 on \u0027localhost\u0027 server\n-------------------------- EXAMPLE 7 --------------------------\nPS C:\\\u003e\u0027localhost\u0027 | Get-DbaSsisEnvironmentVariable -EnvironmentExclude DEV, PROD\nGets all SSIS environments except \u0027DEV\u0027 and \u0027PROD\u0027 from \u0027localhost\u0027 server. The server name comes from pipeline\n-------------------------- EXAMPLE 8 --------------------------\nPS C:\\\u003e\u0027SRV1\u0027, \u0027SRV3\u0027 | Get-DbaSsisEnvironmentVariable\nGets all SSIS environments from \u0027SRV1\u0027 and \u0027SRV3\u0027 servers. The server\u0027s names come from pipeline\n-------------------------- EXAMPLE 9 --------------------------\nPS C:\\\u003e\u0027SRV1\u0027, \u0027SRV2\u0027 | Get-DbaSsisEnvironmentVariable DEV | Out-GridView\nGets all variables from \u0027DEV\u0027 Environment(s) on servers \u0027SRV1\u0027 and \u0027SRV2\u0027 and outputs it as the GridView.\r\nThe server names come from the pipeline.\n-------------------------- EXAMPLE 10 --------------------------\nPS C:\\\u003e\u0027localhost\u0027 | Get-DbaSsisEnvironmentVariable -EnvironmentExclude DEV, PROD | Select-Object -Property Name, Value | Where-Object {$_.Name -match \u0027^a\u0027} | Out-GridView\nGets all variables from Environments other than \u0027DEV\u0027 and \u0027PROD\u0027 on \u0027localhost\u0027 server,\r\nselects Name and Value properties for variables that names start with letter \u0027a\u0027 and outputs it as the GridView", "Params": [ [ "SqlInstance", @@ -18158,21 +18709,22 @@ "False" ] ], - "Alias": "", - "Author": "Bartosz Ratajczyk (@b_ratajczyk)", - "Synopsis": "This command gets specified SSIS Environment and all its variables", - "Name": "Get-DbaSsisEnvironmentVariable", - "Links": "https://dbatools.io/Get-DbaSsisEnvironmentVariable", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaSsisEnvironmentVariable -SqlInstance localhost -Environment DEV -Folder DWH_ETL\nGets variables of \u0027DEV\u0027 environment located in \u0027DWH_ETL\u0027 folder on \u0027localhost\u0027 Server\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaSsisEnvironmentVariable -SqlInstance localhost -Environment DEV -Folder DWH_ETL, DEV2, QA\nGets variables of \u0027DEV\u0027 environment(s) located in folders \u0027DWH_ETL\u0027, \u0027DEV2\u0027 and \u0027QA\u0027 on \u0027localhost\u0027 server\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaSsisEnvironmentVariable -SqlInstance localhost -Environment DEV -FolderExclude DWH_ETL, DEV2, QA\nGets variables of \u0027DEV\u0027 environments located in folders other than \u0027DWH_ETL\u0027, \u0027DEV2\u0027 and \u0027QA\u0027 on \u0027localhost\u0027 server\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaSsisEnvironmentVariable -SqlInstance localhost -Environment DEV, PROD -Folder DWH_ETL, DEV2, QA\nGets variables of \u0027DEV\u0027 and \u0027PROD\u0027 environment(s) located in folders \u0027DWH_ETL\u0027, \u0027DEV2\u0027 and \u0027QA\u0027 on \u0027localhost\u0027 server\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eGet-DbaSsisEnvironmentVariable -SqlInstance localhost -EnvironmentExclude DEV, PROD -Folder DWH_ETL, DEV2, QA\nGets variables of environments other than \u0027DEV\u0027 and \u0027PROD\u0027 located in folders \u0027DWH_ETL\u0027, \u0027DEV2\u0027 and \u0027QA\u0027 on \u0027localhost\u0027 server\n-------------------------- EXAMPLE 6 --------------------------\nPS C:\\\u003eGet-DbaSsisEnvironmentVariable -SqlInstance localhost -EnvironmentExclude DEV, PROD -FolderExclude DWH_ETL, DEV2, QA\nGets variables of environments other than \u0027DEV\u0027 and \u0027PROD\u0027 located in folders other than \u0027DWH_ETL\u0027, \u0027DEV2\u0027 and \u0027QA\u0027 on \u0027localhost\u0027 server\n-------------------------- EXAMPLE 7 --------------------------\nPS C:\\\u003e\u0027localhost\u0027 | Get-DbaSsisEnvironmentVariable -EnvironmentExclude DEV, PROD\nGets all SSIS environments except \u0027DEV\u0027 and \u0027PROD\u0027 from \u0027localhost\u0027 server. The server name comes from pipeline\n-------------------------- EXAMPLE 8 --------------------------\nPS C:\\\u003e\u0027SRV1\u0027, \u0027SRV3\u0027 | Get-DbaSsisEnvironmentVariable\nGets all SSIS environments from \u0027SRV1\u0027 and \u0027SRV3\u0027 servers. The server\u0027s names come from pipeline\n-------------------------- EXAMPLE 9 --------------------------\nPS C:\\\u003e\u0027SRV1\u0027, \u0027SRV2\u0027 | Get-DbaSsisEnvironmentVariable DEV | Out-GridView\nGets all variables from \u0027DEV\u0027 Environment(s) on servers \u0027SRV1\u0027 and \u0027SRV2\u0027 and outputs it as the GridView.\r\nThe server names come from the pipeline.\n-------------------------- EXAMPLE 10 --------------------------\nPS C:\\\u003e\u0027localhost\u0027 | Get-DbaSsisEnvironmentVariable -EnvironmentExclude DEV, PROD | Select-Object -Property Name, Value | Where-Object {$_.Name -match \u0027^a\u0027} | Out-GridView\nGets all variables from Environments other than \u0027DEV\u0027 and \u0027PROD\u0027 on \u0027localhost\u0027 server,\r\nselects Name and Value properties for variables that names start with letter \u0027a\u0027 and outputs it as the GridView", "Syntax": "Get-DbaSsisEnvironmentVariable [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [[-Environment] \u003cObject[]\u003e] [[-EnvironmentExclude] \u003cObject[]\u003e] [[-Folder] \u003cObject[]\u003e] [[-FolderExclude] \u003cObject[]\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaSsisExecutionHistory", + "Name": "Get-DbaSsisExecutionHistory", "Description": "This command gets execution history for SSIS executison given one or more instances and can be filtered by Project, Environment,Folder or Status.", "Tags": [ "Migration", "SSIS" ], + "Synopsis": "Get-DbaSsisHistory Retreives SSIS project and package execution History, and environments from one SQL Server to another.", + "Alias": "", + "Author": "Chris Tucker (@ChrisTuc47368095)", + "CommandName": "Get-DbaSsisExecutionHistory", + "Availability": "Windows only", + "Links": "https://dbatools.io/Get-DbaSsisExecutionHistory", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaSsisExecutionHistory -SqlInstance SMTQ01 -Folder SMTQ_PRC\nGet all history items for SMTQ01 in folder SMTQ_PRC.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaSsisExecutionHistory -SqlInstance SMTQ01 -Status Failed,Cancelled\nGets all failed or canceled executions for SMTQ01.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaSsisExecutionHistory -SqlInstance SMTQ01,SMTQ02 -Status Failed,Cancelled\nShows what would happen if the command were executed and would return the SQL statement that would be executed per instance.", "Params": [ [ "SqlInstance", @@ -18239,22 +18791,23 @@ "False" ] ], - "Alias": "", - "Author": "Chris Tucker (@ChrisTuc47368095)", - "Synopsis": "Get-DbaSsisHistory Retreives SSIS project and package execution History, and environments from one SQL Server to another.", - "Name": "Get-DbaSsisExecutionHistory", - "Links": "https://dbatools.io/Get-DbaSsisExecutionHistory", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaSsisExecutionHistory -SqlInstance SMTQ01 -Folder SMTQ_PRC\nGet all history items for SMTQ01 in folder SMTQ_PRC.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaSsisExecutionHistory -SqlInstance SMTQ01 -Status Failed,Cancelled\nGets all failed or canceled executions for SMTQ01.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaSsisExecutionHistory -SqlInstance SMTQ01,SMTQ02 -Status Failed,Cancelled -Whatif\nShows what would happen if the command were executed and would return the SQL statement that would be executed per instance.", "Syntax": "Get-DbaSsisExecutionHistory [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [[-Since] \u003cDateTime\u003e] [[-Status] \u003cString[]\u003e] [[-Project] \u003cString[]\u003e] [[-Folder] \u003cString[]\u003e] [[-Environment] \u003cString[]\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaStartupParameter", + "Name": "Get-DbaStartupParameter", "Description": "Displays values for a detailed list of SQL Server Startup Parameters including Master Data Path, Master Log path, Error Log, Trace Flags, Parameter String and much more.\n\nThis command relies on remote Windows Server (SQL WMI/WinRm) access. You can pass alternative Windows credentials by using the -Credential parameter.\n\nSee https://msdn.microsoft.com/en-us/library/ms190737.aspx for more information.", "Tags": [ "WSMan", "SQLWMI", "Memory" ], + "Synopsis": "Displays values for a detailed list of SQL Server Startup Parameters.", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Get-DbaStartupParameter", + "Availability": "Windows only", + "Links": "https://dbatools.io/Get-DbaStartupParameter", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaStartupParameter -SqlInstance sql2014\nLogs into SQL WMI as the current user then displays the values for numerous startup parameters.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003e$wincred = Get-Credential ad\\sqladmin\nPS C:\\\u003e Get-DbaStartupParameter -SqlInstance sql2014 -Credential $wincred -Simple\nLogs in to WMI using the ad\\sqladmin credential and gathers simplified information about the SQL Server Startup Parameters.", "Params": [ [ "SqlInstance", @@ -18289,21 +18842,22 @@ "False" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Displays values for a detailed list of SQL Server Startup Parameters.", - "Name": "Get-DbaStartupParameter", - "Links": "https://dbatools.io/Get-DbaStartupParameter", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaStartupParameter -SqlInstance sql2014\nLogs into SQL WMI as the current user then displays the values for numerous startup parameters.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003e$wincred = Get-Credential ad\\sqladmin\nPS C:\\\u003e Get-DbaStartupParameter -SqlInstance sql2014 -Credential $wincred -Simple\nLogs in to WMI using the ad\\sqladmin credential and gathers simplified information about the SQL Server Startup Parameters.", "Syntax": "Get-DbaStartupParameter [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-Credential] \u003cPSCredential\u003e] [-Simple] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaSuspectPage", + "Name": "Get-DbaSuspectPage", "Description": "This function returns any records that were stored due to suspect pages in databases on a SQL Server Instance.", "Tags": [ "Pages", "DBCC" ], + "Synopsis": "Returns data that is stored in SQL for Suspect Pages on the specified SQL Server Instance", + "Alias": "", + "Author": "Garry Bargsley (@gbargsley), http://blog.garrybargsley.com", + "CommandName": "Get-DbaSuspectPage", + "Availability": "Windows, Linux, macOS", + "Links": null, + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaSuspectPage -SqlInstance sql2016\nRetrieve any records stored for Suspect Pages on the sql2016 SQL Server.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaSuspectPage -SqlInstance sql2016 -Database Test\nRetrieve any records stored for Suspect Pages on the sql2016 SQL Server and the Test database only.", "Params": [ [ "SqlInstance", @@ -18338,21 +18892,22 @@ "False" ] ], - "Alias": "", - "Author": "Garry Bargsley (@gbargsley), http://blog.garrybargsley.com", - "Synopsis": "Returns data that is stored in SQL for Suspect Pages on the specified SQL Server Instance", - "Name": "Get-DbaSuspectPage", - "Links": null, - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaSuspectPage -SqlInstance sql2016\nRetrieve any records stored for Suspect Pages on the sql2016 SQL Server.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaSuspectPage -SqlInstance sql2016 -Database Test\nRetrieve any records stored for Suspect Pages on the sql2016 SQL Server and the Test database only.", "Syntax": "Get-DbaSuspectPage [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [-Database \u003cObject\u003e] [-SqlCredential \u003cPSCredential\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaTcpPort", + "Name": "Get-DbaTcpPort", "Description": "By default, this function returns just the TCP port used by the specified SQL Server.\n\nIf -All is specified, the server name, IPAddress (ipv4 and ipv6), port number and an indicator of whether or not the port assignment is static are returned.\n\nRemote sqlwmi is used by default. If this doesn\u0027t work, then remoting is used. If neither work, it defaults to T-SQL which can provide only the port.", "Tags": [ "SQLWMI", "tcp" ], + "Synopsis": "Returns the TCP port used by the specified SQL Server.", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Get-DbaTcpPort", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Get-DbaTcpPort", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaTcpPort -SqlInstance sqlserver2014a\nReturns just the port number for the default instance on sqlserver2014a.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaTcpPort -SqlInstance winserver\\sqlexpress, sql2016\nReturns an object with server name and port number for the sqlexpress on winserver and the default instance on sql2016.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaTcpPort -SqlInstance sqlserver2014a, sql2016 -All\nReturns an object with server name, IPAddress (ipv4 and ipv6), port and static ($true/$false) for sqlserver2014a and sql2016.\nRemote sqlwmi is used by default. If this doesn\u0027t work, then remoting is used. If neither work, it defaults to T-SQL which can provide only the port.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaCmsRegServer -SqlInstance sql2014 | Get-DbaTcpPort -ExcludeIpv6 -All\nReturns an object with server name, IPAddress (just ipv4), port and static ($true/$false) for every server listed in the Central Management Server on sql2014.", "Params": [ [ "SqlInstance", @@ -18403,21 +18958,22 @@ "False" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Returns the TCP port used by the specified SQL Server.", - "Name": "Get-DbaTcpPort", - "Links": "https://dbatools.io/Get-DbaTcpPort", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaTcpPort -SqlInstance sqlserver2014a\nReturns just the port number for the default instance on sqlserver2014a.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaTcpPort -SqlInstance winserver\\sqlexpress, sql2016\nReturns an object with server name and port number for the sqlexpress on winserver and the default instance on sql2016.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaTcpPort -SqlInstance sqlserver2014a, sql2016 -All\nReturns an object with server name, IPAddress (ipv4 and ipv6), port and static ($true/$false) for sqlserver2014a and sql2016.\nRemote sqlwmi is used by default. If this doesn\u0027t work, then remoting is used. If neither work, it defaults to T-SQL which can provide only the port.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaCmsRegServer -SqlInstance sql2014 | Get-DbaTcpPort -ExcludeIpv6 -All\nReturns an object with server name, IPAddress (just ipv4), port and static ($true/$false) for every server listed in the Central Management Server on sql2014.", "Syntax": "Get-DbaTcpPort [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [-Detailed] [-All] [-ExcludeIpv6] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaTempdbUsage", + "Name": "Get-DbaTempdbUsage", "Description": "This function queries DMVs for running sessions using tempdb and returns results if those sessions have user or internal space allocated or deallocated against them.", "Tags": [ "Tempdb", "Space" ], + "Synopsis": "Gets Tempdb usage for running queries.", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Get-DbaTempdbUsage", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Get-DbaTempdbUsage", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaTempdbUsage -SqlInstance localhost\\SQLDEV2K14\nGets tempdb usage for localhost\\SQLDEV2K14", "Params": [ [ "SqlInstance", @@ -18444,21 +19000,22 @@ "False" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Gets Tempdb usage for running queries.", - "Name": "Get-DbaTempdbUsage", - "Links": "https://dbatools.io/Get-DbaTempdbUsage", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaTempdbUsage -SqlInstance localhost\\SQLDEV2K14\nGets tempdb usage for localhost\\SQLDEV2K14", "Syntax": "Get-DbaTempdbUsage [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbatoolsConfig", + "Name": "Get-DbatoolsConfig", "Description": "Retrieves configuration elements by name.\nCan be used to search the existing configuration list.", "Tags": [ "Config", "Module" ], + "Synopsis": "Retrieves configuration elements by name.", + "Alias": "Get-DbaConfig", + "Author": "Friedrich Weinmann (@FredWeinmann)", + "CommandName": "Get-DbatoolsConfig", + "Availability": "Windows, Linux, macOS", + "Links": null, + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbatoolsConfig \u0027Mail.To\u0027\nRetrieves the configuration element for the key \"Mail.To\"\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbatoolsConfig -Force\nRetrieve all configuration elements from all modules, even hidden ones.", "Params": [ [ "FullName", @@ -18493,21 +19050,22 @@ "False" ] ], - "Alias": "Get-DbaConfig", - "Author": "Friedrich Weinmann (@FredWeinmann)", - "Synopsis": "Retrieves configuration elements by name.", - "Name": "Get-DbatoolsConfig", - "Links": null, - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbatoolsConfig \u0027Mail.To\u0027\nRetrieves the configuration element for the key \"Mail.To\"\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbatoolsConfig -Force\nRetrieve all configuration elements from all modules, even hidden ones.", "Syntax": "Get-DbatoolsConfig [[-FullName] \u003cString\u003e] [-Force] [\u003cCommonParameters\u003e]\nGet-DbatoolsConfig [[-Name] \u003cString\u003e] [[-Module] \u003cString\u003e] [-Force] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbatoolsConfigValue", + "Name": "Get-DbatoolsConfigValue", "Description": "Returns the configuration value stored under the specified name.\nIt requires the full name (\u003cModule\u003e.\u003cName\u003e) and is usually only called by functions.", "Tags": [ "Config", "Module" ], + "Synopsis": "Returns the configuration value stored under the specified name.", + "Alias": "Get-DbaConfigValue", + "Author": "Friedrich Weinmann (@FredWeinmann)", + "CommandName": "Get-DbatoolsConfigValue", + "Availability": "Windows, Linux, macOS", + "Links": null, + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbatoolsConfigValue -Name \u0027System.MailServer\u0027\nReturns the configured value that was assigned to the key \u0027System.MailServer\u0027\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbatoolsConfigValue -Name \u0027Default.CoffeeMilk\u0027 -Fallback 0\nReturns the configured value for \u0027Default.CoffeeMilk\u0027. If no such value is configured, it returns \u00270\u0027 instead.", "Params": [ [ "FullName", @@ -18534,18 +19092,19 @@ "False" ] ], - "Alias": "Get-DbaConfigValue", - "Author": "Friedrich Weinmann (@FredWeinmann)", - "Synopsis": "Returns the configuration value stored under the specified name.", - "Name": "Get-DbatoolsConfigValue", - "Links": null, - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbatoolsConfigValue -Name \u0027System.MailServer\u0027\nReturns the configured value that was assigned to the key \u0027System.MailServer\u0027\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbatoolsConfigValue -Name \u0027Default.CoffeeMilk\u0027 -Fallback 0\nReturns the configured value for \u0027Default.CoffeeMilk\u0027. If no such value is configured, it returns \u00270\u0027 instead.", "Syntax": "Get-DbatoolsConfigValue [-FullName] \u003cString\u003e [[-Fallback] \u003cObject\u003e] [-NotNull] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbatoolsLog", + "Name": "Get-DbatoolsLog", "Description": "Returns log entries for dbatools. Handy when debugging or developing a script using it.", "Tags": "Debug", + "Synopsis": "Returns log entries for dbatools", + "Alias": "", + "Author": "Friedrich Weinmann (@FredWeinmann)", + "CommandName": "Get-DbatoolsLog", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Get-DbatoolsLog", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbatoolsLog\nReturns all log entries currently in memory.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbatoolsLog -Target \"a\" -Last 1 -Skip 1\nReturns all log entries that targeted the object \"a\" in the second last execution sent.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbatoolsLog -Tag \"fail\" -Last 5\nReturns all log entries within the last 5 executions that contained the tag \"fail\"", "Params": [ [ "FunctionName", @@ -18628,21 +19187,22 @@ "False" ] ], - "Alias": "", - "Author": "Friedrich Weinmann (@FredWeinmann)", - "Synopsis": "Returns log entries for dbatools", - "Name": "Get-DbatoolsLog", - "Links": "https://dbatools.io/Get-DbatoolsLog", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbatoolsLog\nReturns all log entries currently in memory.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbatoolsLog -Target \"a\" -Last 1 -Skip 1\nReturns all log entries that targeted the object \"a\" in the second last execution sent.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbatoolsLog -Tag \"fail\" -Last 5\nReturns all log entries within the last 5 executions that contained the tag \"fail\"", "Syntax": "Get-DbatoolsLog [[-FunctionName] \u003cString\u003e] [[-ModuleName] \u003cString\u003e] [[-Target] \u003cObject\u003e] [[-Tag] \u003cString[]\u003e] [[-Last] \u003cInt32\u003e] [[-Skip] \u003cInt32\u003e] [[-Runspace] \u003cGuid\u003e] [[-Level] {Critical | Important | Output | Significant | VeryVerbose | Verbose | SomewhatVerbose | System | Debug | InternalComment | Warning}] [-Raw] [-Errors] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaTopResourceUsage", + "Name": "Get-DbaTopResourceUsage", "Description": "Returns the top 20 resource consumers for cached queries based on four different metrics: duration, frequency, IO, and CPU.\n\nThis command is based off of queries provided by Michael J. Swart at http://michaeljswart.com/go/Top20\n\nPer Michael: \"I\u0027ve posted queries like this before, and others have written many other versions of this query. All these queries are based on sys.dm_exec_query_stats.\"", "Tags": [ "Query", "Performance" ], + "Synopsis": "Returns the top 20 resource consumers for cached queries based on four different metrics: duration, frequency, IO, and CPU.", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Get-DbaTopResourceUsage", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Get-DbaTopResourceUsage", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaTopResourceUsage -SqlInstance sql2008, sql2012\nReturn the 80 (20 x 4 types) top usage results by duration, frequency, IO, and CPU servers for servers sql2008 and sql2012\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaTopResourceUsage -SqlInstance sql2008 -Type Duration, Frequency -Database TestDB\nReturn the highest usage by duration (top 20) and frequency (top 20) for the TestDB on sql2008\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaTopResourceUsage -SqlInstance sql2016 -Limit 30\nReturn the highest usage by duration (top 30) and frequency (top 30) for the TestDB on sql2016\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaTopResourceUsage -SqlInstance sql2008, sql2012 -ExcludeSystem\nReturn the 80 (20 x 4 types) top usage results by duration, frequency, IO, and CPU servers for servers sql2008 and sql2012 without any System Objects\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eGet-DbaTopResourceUsage -SqlInstance sql2016| Select-Object *\nReturn all the columns plus the QueryPlan column", "Params": [ [ "SqlInstance", @@ -18709,21 +19269,22 @@ "False" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Returns the top 20 resource consumers for cached queries based on four different metrics: duration, frequency, IO, and CPU.", - "Name": "Get-DbaTopResourceUsage", - "Links": "https://dbatools.io/Get-DbaTopResourceUsage", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaTopResourceUsage -SqlInstance sql2008, sql2012\nReturn the 80 (20 x 4 types) top usage results by duration, frequency, IO, and CPU servers for servers sql2008 and sql2012\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaTopResourceUsage -SqlInstance sql2008 -Type Duration, Frequency -Database TestDB\nReturn the highest usage by duration (top 20) and frequency (top 20) for the TestDB on sql2008\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaTopResourceUsage -SqlInstance sql2016 -Limit 30\nReturn the highest usage by duration (top 30) and frequency (top 30) for the TestDB on sql2016\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaTopResourceUsage -SqlInstance sql2008, sql2012 -ExcludeSystem\nReturn the 80 (20 x 4 types) top usage results by duration, frequency, IO, and CPU servers for servers sql2008 and sql2012 without any System Objects\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eGet-DbaTopResourceUsage -SqlInstance sql2016| Select-Object *\nReturn all the columns plus the QueryPlan column", "Syntax": "Get-DbaTopResourceUsage [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [-SqlCredential \u003cPSCredential\u003e] [-Database \u003cObject[]\u003e] [-ExcludeDatabase \u003cObject[]\u003e] [-Type \u003cString[]\u003e] [-Limit \u003cInt32\u003e] [-EnableException] [-ExcludeSystem] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaTrace", + "Name": "Get-DbaTrace", "Description": "This function returns a list of traces on a SQL Server instance and identifies the default trace file", "Tags": [ "Security", "Trace" ], + "Synopsis": "Gets a list of trace(s) from specified SQL Server Instance", + "Alias": "Get-DbaTraceFile", + "Author": "Garry Bargsley (@gbargsley), http://blog.garrybargsley.com", + "CommandName": "Get-DbaTrace", + "Availability": "Windows, Linux, macOS", + "Links": null, + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaTrace -SqlInstance sql2016\nLists all the trace files on the sql2016 SQL Server.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaTrace -SqlInstance sql2016 -Default\nLists the default trace information on the sql2016 SQL Server.", "Params": [ [ "SqlInstance", @@ -18766,18 +19327,22 @@ "False" ] ], - "Alias": "Get-DbaTraceFile", - "Author": "Garry Bargsley (@gbargsley), http://blog.garrybargsley.com", - "Synopsis": "Gets a list of trace(s) from specified SQL Server Instance", - "Name": "Get-DbaTrace", - "Links": null, - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaTrace -SqlInstance sql2016\nLists all the trace files on the sql2016 SQL Server.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaTrace -SqlInstance sql2016 -Default\nLists the default trace information on the sql2016 SQL Server.", "Syntax": "Get-DbaTrace [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [-SqlCredential \u003cPSCredential\u003e] [-Id \u003cInt32[]\u003e] [-Default] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaTraceFlag", + "Name": "Get-DbaTraceFlag", "Description": "Returns Trace Flags that are enabled globally on each instance(s) of SQL Server as an object.", - "Tags": "TraceFlag", + "Tags": [ + "TraceFlag", + "DBCC" + ], + "Synopsis": "Get global Trace Flag(s) information for each instance(s) of SQL Server.", + "Alias": "", + "Author": "Kevin Bullen (@sqlpadawan)", + "CommandName": "Get-DbaTraceFlag", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Get-DbaTraceFlag", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaTraceFlag -SqlInstance localhost\nReturns all Trace Flag information on the local default SQL Server instance\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaTraceFlag -SqlInstance localhost, sql2016\nReturns all Trace Flag(s) for the local and sql2016 SQL Server instances\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaTraceFlag -SqlInstance localhost -TraceFlag 4199,3205\nReturns Trace Flag status for TF 4199 and 3205 for the local SQL Server instance if they are enabled.", "Params": [ [ "SqlInstance", @@ -18812,18 +19377,19 @@ "False" ] ], - "Alias": "", - "Author": "Kevin Bullen (@sqlpadawan)", - "Synopsis": "Get global Trace Flag(s) information for each instance(s) of SQL Server.", - "Name": "Get-DbaTraceFlag", - "Links": "https://dbatools.io/Get-DbaTraceFlag", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaTraceFlag -SqlInstance localhost\nReturns all Trace Flag information on the local default SQL Server instance\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaTraceFlag -SqlInstance localhost, sql2016\nReturns all Trace Flag(s) for the local and sql2016 SQL Server instances\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaTraceFlag -SqlInstance localhost -TraceFlag 4199,3205\nReturns Trace Flag status for TF 4199 and 3205 for the local SQL Server instance if they are enabled.", "Syntax": "Get-DbaTraceFlag [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [-SqlCredential \u003cPSCredential\u003e] [-TraceFlag \u003cInt32[]\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaUptime", + "Name": "Get-DbaUptime", "Description": "By default, this command returns for each SQL Server instance passed in:\nSQL Instance last startup time, Uptime as a PS TimeSpan, Uptime as a formatted string\nHosting Windows server last startup time, Uptime as a PS TimeSpan, Uptime as a formatted string", "Tags": "CIM", + "Synopsis": "Returns the uptime of the SQL Server instance, and if required the hosting windows server", + "Alias": "", + "Author": "Stuart Moore (@napalmgram), stuart-moore.com", + "CommandName": "Get-DbaUptime", + "Availability": "Windows only", + "Links": "https://dbatools.io/Get-DbaUptime", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaUptime -SqlInstance SqlBox1\\Instance2\nReturns an object with SQL Server start time, uptime as TimeSpan object, uptime as a string, and Windows host boot time, host uptime as TimeSpan objects and host uptime as a string for the sqlexpress \r\ninstance on winserver\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaUptime -SqlInstance winserver\\sqlexpress, sql2016\nReturns an object with SQL Server start time, uptime as TimeSpan object, uptime as a string, and Windows host boot time, host uptime as TimeSpan objects and host uptime as a string for the sqlexpress \r\ninstance on host winserver and the default instance on host sql2016\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaCmsRegServer -SqlInstance sql2014 | Get-DbaUptime\nReturns an object with SQL Server start time, uptime as TimeSpan object, uptime as a string, and Windows host boot time, host uptime as TimeSpan objects and host uptime as a string for every server \r\nlisted in the Central Management Server on sql2014", "Params": [ [ "SqlInstance", @@ -18858,22 +19424,23 @@ "False" ] ], - "Alias": "", - "Author": "Stuart Moore (@napalmgram), stuart-moore.com", - "Synopsis": "Returns the uptime of the SQL Server instance, and if required the hosting windows server", - "Name": "Get-DbaUptime", - "Links": "https://dbatools.io/Get-DbaUptime", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaUptime -SqlInstance SqlBox1\\Instance2\nReturns an object with SQL Server start time, uptime as TimeSpan object, uptime as a string, and Windows host boot time, host uptime as TimeSpan objects and host uptime as a string for the sqlexpress \r\ninstance on winserver\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaUptime -SqlInstance winserver\\sqlexpress, sql2016\nReturns an object with SQL Server start time, uptime as TimeSpan object, uptime as a string, and Windows host boot time, host uptime as TimeSpan objects and host uptime as a string for the sqlexpress \r\ninstance on host winserver and the default instance on host sql2016\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaCmsRegServer -SqlInstance sql2014 | Get-DbaUptime\nReturns an object with SQL Server start time, uptime as TimeSpan object, uptime as a string, and Windows host boot time, host uptime as TimeSpan objects and host uptime as a string for every server \r\nlisted in the Central Management Server on sql2014", "Syntax": "Get-DbaUptime [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [[-Credential] \u003cPSCredential\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaUserPermission", - "Description": "This command will display all server logins, server level securable, database logins and database securables.\n\nDISA STIG implementators will find this command useful as it uses Permissions.sql provided by DISA.\n\nNote that if you Ctrl-C out of this command and end it prematurely, it will leave behind a STIG schema in tempdb.", + "Name": "Get-DbaUserPermission", + "Description": "This command will display all server logins, server level securables, database logins and database securables.\n\nDISA STIG implementators will find this command useful as it uses Permissions.sql provided by DISA.\n\nNote that if you Ctrl-C out of this command and end it prematurely, it will leave behind a STIG schema in tempdb.", "Tags": [ "Discovery", "Permissions", "Security" ], + "Synopsis": "Displays detailed permissions information for the server and database roles and securables.", + "Alias": "Get-DbaUserLevelPermission", + "Author": "Brandon Abshire, netnerds.net", + "CommandName": "Get-DbaUserPermission", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Get-DbaUserPermission", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaUserPermission -SqlInstance sql2008, sqlserver2012\nCheck server and database permissions for servers sql2008 and sqlserver2012.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaUserPermission -SqlInstance sql2008 -Database TestDB\nCheck server and database permissions on server sql2008 for only the TestDB database\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaUserPermission -SqlInstance sql2008 -Database TestDB -IncludePublicGuest -IncludeSystemObjects\nCheck server and database permissions on server sql2008 for only the TestDB database,\r\nincluding public and guest grants, and sys schema objects.", "Params": [ [ "SqlInstance", @@ -18940,22 +19507,23 @@ "False" ] ], - "Alias": "Get-DbaUserLevelPermission", - "Author": "Brandon Abshire, netnerds.net", - "Synopsis": "Displays detailed permissions information for the server and database roles and securables.", - "Name": "Get-DbaUserPermission", - "Links": "https://dbatools.io/Get-DbaUserPermission", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaUserPermission -SqlInstance sql2008, sqlserver2012\nCheck server and database permissions for servers sql2008 and sqlserver2012.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaUserPermission -SqlInstance sql2008 -Database TestDB\nCheck server and database permissions on server sql2008 for only the TestDB database\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaUserPermission -SqlInstance sql2008 -Database TestDB -IncludePublicGuest -IncludeSystemObjects\nCheck server and database permissions on server sql2008 for only the TestDB database,\r\nincluding public and guest grants, and sys schema objects.", "Syntax": "Get-DbaUserPermission [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [-SqlCredential \u003cPSCredential\u003e] [-Database \u003cObject[]\u003e] [-ExcludeDatabase \u003cObject[]\u003e] [[-ExcludeSystemDatabase]] [-IncludePublicGuest] [-IncludeSystemObjects] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaWaitingTask", + "Name": "Get-DbaWaitingTask", "Description": "This command is based on waiting task T-SQL script published by Paul Randal.\nReference: https://www.sqlskills.com/blogs/paul/updated-sys-dm_os_waiting_tasks-script-2/", "Tags": [ "Waits", "Task", "WaitTask" ], + "Synopsis": "Displays waiting task.", + "Alias": "", + "Author": "Shawn Melton (@wsmelton), https://wsmelton.github.io", + "CommandName": "Get-DbaWaitingTask", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Get-DbaWaitingTask", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaWaitingTask -SqlInstance sqlserver2014a\nReturns the waiting task for all sessions on sqlserver2014a\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaWaitingTask -SqlInstance sqlserver2014a -IncludeSystemSpid\nReturns the waiting task for all sessions (user and system) on sqlserver2014a", "Params": [ [ "SqlInstance", @@ -18998,21 +19566,22 @@ "False" ] ], - "Alias": "", - "Author": "Shawn Melton (@wsmelton), https://wsmelton.github.io", - "Synopsis": "Displays waiting task.", - "Name": "Get-DbaWaitingTask", - "Links": "https://dbatools.io/Get-DbaWaitingTask", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaWaitingTask -SqlInstance sqlserver2014a\nReturns the waiting task for all sessions on sqlserver2014a\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaWaitingTask -SqlInstance sqlserver2014a -IncludeSystemSpid\nReturns the waiting task for all sessions (user and system) on sqlserver2014a", "Syntax": "Get-DbaWaitingTask [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [-SqlCredential \u003cPSCredential\u003e] [-Spid \u003cObject[]\u003e] [-IncludeSystemSpid] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaWaitResource", + "Name": "Get-DbaWaitResource", "Description": "Given a wait resource in the form of \u0027PAGE: 10:1:9180084\u0027 returns the database, data file and the system object which is being waited up.\n\nGiven a wait resource in the form of \u0027KEY: 7:35457594073541168 (de21f92a1572)\u0027, returns the database, object and index that is being waited on, With the -row switch the row data will also be returned.", "Tags": [ "Pages", "DBCC" ], + "Synopsis": "Returns the resource being waited upon", + "Alias": "", + "Author": "Stuart Moore (@napalmgram), stuart-moore.com", + "CommandName": "Get-DbaWaitResource", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Get-DbaWaitResource", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaWaitResource -SqlInstance server1 -WaitResource \u0027PAGE: 10:1:9180084\u0027\nWill return an object containing; database name, data file name, schema name and the object which owns the resource\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaWaitResource -SqlInstance server2 -WaitResource \u0027KEY: 7:35457594073541168 (de21f92a1572)\u0027\nWill return an object containing; database name, schema name and index name which is being waited on.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaWaitResource -SqlInstance server2 -WaitResource \u0027KEY: 7:35457594073541168 (de21f92a1572)\u0027 -row\nWill return an object containing; database name, schema name and index name which is being waited on, and in addition the contents of the locked row at the time the command is run.", "Params": [ [ "SqlInstance", @@ -19055,18 +19624,19 @@ "False" ] ], - "Alias": "", - "Author": "Stuart Moore (@napalmgram), stuart-moore.com", - "Synopsis": "Returns the resource being waited upon", - "Name": "Get-DbaWaitResource", - "Links": "https://dbatools.io/Get-DbaWaitResource", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaWaitResource -SqlInstance server1 -WaitResource \u0027PAGE: 10:1:9180084\u0027\nWill return an object containing; database name, data file name, schema name and the object which owns the resource\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaWaitResource -SqlInstance server2 -WaitResource \u0027KEY: 7:35457594073541168 (de21f92a1572)\u0027\nWill return an object containing; database name, schema name and index name which is being waited on.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaWaitResource -SqlInstance server2 -WaitResource \u0027KEY: 7:35457594073541168 (de21f92a1572)\u0027 -row\nWill return an object containing; database name, schema name and index name which is being waited on, and in addition the contents of the locked row at the time the command is run.", "Syntax": "Get-DbaWaitResource [-SqlInstance] \u003cDbaInstanceParameter\u003e [[-SqlCredential] \u003cPSCredential\u003e] [-WaitResource] \u003cString\u003e [-Row] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaWaitStatistic", + "Name": "Get-DbaWaitStatistic", "Description": "This command is based off of Paul Randal\u0027s post \"Wait statistics, or please tell me where it hurts\"\n\nReturns:\nWaitType\nCategory\nWaitSeconds\nResourceSeconds\nSignalSeconds\nWaitCount\nPercentage\nAverageWaitSeconds\nAverageResourceSeconds\nAverageSignalSeconds\nURL\n\nReference: https://www.sqlskills.com/blogs/paul/wait-statistics-or-please-tell-me-where-it-hurts/", "Tags": "WaitStatistic", + "Synopsis": "Displays wait statistics", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Get-DbaWaitStatistic", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Get-DbaWaitStatistic", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaWaitStatistic -SqlInstance sql2008, sqlserver2012\nCheck wait statistics for servers sql2008 and sqlserver2012\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaWaitStatistic -SqlInstance sql2008 -Threshold 98 -IncludeIgnorable\nCheck wait statistics on server sql2008 for thresholds above 98% and include wait stats that are most often, but not always, ignorable\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaWaitStatistic -SqlInstance sql2008 | Select *\nShows detailed notes, if available, from Paul\u0027s post\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003e$output = Get-DbaWaitStatistic -SqlInstance sql2008 -Threshold 100 -IncludeIgnorable | Select-Object * | ConvertTo-DbaDataTable\nCollects all Wait Statistics (including ignorable waits) on server sql2008 into a Data Table.\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003e$output = Get-DbaWaitStatistic -SqlInstance sql2008\nPS C:\\\u003e foreach ($row in ($output | Sort-Object -Unique Url)) { Start-Process ($row).Url }\nDisplays the output then loads the associated sqlskills website for each result. Opens one tab per unique URL.", "Params": [ [ "SqlInstance", @@ -19109,18 +19679,19 @@ "False" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Displays wait statistics", - "Name": "Get-DbaWaitStatistic", - "Links": "https://dbatools.io/Get-DbaWaitStatistic", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaWaitStatistic -SqlInstance sql2008, sqlserver2012\nCheck wait statistics for servers sql2008 and sqlserver2012\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaWaitStatistic -SqlInstance sql2008 -Threshold 98 -IncludeIgnorable\nCheck wait statistics on server sql2008 for thresholds above 98% and include wait stats that are most often, but not always, ignorable\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaWaitStatistic -SqlInstance sql2008 | Select *\nShows detailed notes, if available, from Paul\u0027s post\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003e$output = Get-DbaWaitStatistic -SqlInstance sql2008 -Threshold 100 -IncludeIgnorable | Select-Object * | ConvertTo-DbaDataTable\nCollects all Wait Statistics (including ignorable waits) on server sql2008 into a Data Table.\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003e$output = Get-DbaWaitStatistic -SqlInstance sql2008\nPS C:\\\u003e foreach ($row in ($output | Sort-Object -Unique Url)) { Start-Process ($row).Url }\nDisplays the output then loads the associated sqlskills website for each result. Opens one tab per unique URL.", "Syntax": "Get-DbaWaitStatistic [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [[-Threshold] \u003cInt32\u003e] [-IncludeIgnorable] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaWindowsLog", + "Name": "Get-DbaWindowsLog", "Description": "Gets Windows Application events associated with an instance", "Tags": "Logging", + "Synopsis": "Gets Windows Application events associated with an instance", + "Alias": "", + "Author": "Drew Furgiuele | Friedrich Weinmann (@FredWeinmann)", + "CommandName": "Get-DbaWindowsLog", + "Availability": "Windows only", + "Links": "https://dbatools.io/Get-DbaWindowsLog", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003e$ErrorLogs = Get-DbaWindowsLog -SqlInstance sql01\\sharepoint\nPS C:\\\u003e $ErrorLogs | Where-Object ErrorNumber -eq 18456\nReturns all lines in the errorlogs that have event number 18456 in them\nThis exists to ignore the Script Analyzer rule for Start-Runspace", "Params": [ [ "SqlInstance", @@ -19179,16 +19750,10 @@ "False" ] ], - "Alias": "", - "Author": "Drew Furgiuele | Friedrich Weinmann (@FredWeinmann)", - "Synopsis": "Gets Windows Application events associated with an instance", - "Name": "Get-DbaWindowsLog", - "Links": "https://dbatools.io/Get-DbaWindowsLog", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003e$ErrorLogs = Get-DbaWindowsLog -SqlInstance sql01\\sharepoint\nPS C:\\\u003e $ErrorLogs | Where-Object ErrorNumber -eq 18456\nReturns all lines in the errorlogs that have event number 18456 in them\nThis exists to ignore the Script Analyzer rule for Start-Runspace", "Syntax": "Get-DbaWindowsLog [[-SqlInstance] \u003cDbaInstanceParameter[]\u003e] [[-Start] \u003cDateTime\u003e] [[-End] \u003cDateTime\u003e] [[-Credential] \u003cPSCredential\u003e] [[-MaxThreads] \u003cInt32\u003e] [[-MaxRemoteThreads] \u003cInt32\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaWsfcAvailableDisk", + "Name": "Get-DbaWsfcAvailableDisk", "Description": "Gets information about the disks that can support Failover Clustering and are visible to all nodes, but are not yet part of the set of clustered disks.\n\nAll Windows Server Failover Clustering (Wsfc) commands require local admin on each member node.", "Tags": [ "Cluster", @@ -19196,6 +19761,13 @@ "FCI", "HA" ], + "Synopsis": "Gets information about the disks that can support Failover Clustering and are visible to all nodes, but are not yet part of the set of clustered disks.", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Get-DbaWsfcAvailableDisk", + "Availability": "Windows only", + "Links": "https://dbatools.io/Get-DbaWsfcAvailableDisk", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaWsfcAvailableDisk -ComputerName cluster01\nGets available disks from the failover cluster cluster01", "Params": [ [ "ComputerName", @@ -19222,16 +19794,10 @@ "False" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Gets information about the disks that can support Failover Clustering and are visible to all nodes, but are not yet part of the set of clustered disks.", - "Name": "Get-DbaWsfcAvailableDisk", - "Links": "https://dbatools.io/Get-DbaWsfcAvailableDisk", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaWsfcAvailableDisk -ComputerName cluster01\nGets available disks from the failover cluster cluster01", "Syntax": "Get-DbaWsfcAvailableDisk [[-ComputerName] \u003cDbaInstanceParameter[]\u003e] [[-Credential] \u003cPSCredential\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaWsfcCluster", + "Name": "Get-DbaWsfcCluster", "Description": "Gets information about one or more failover clusters in a given domain.\n\nAll Windows Server Failover Clustering (Wsfc) commands require local admin on each member node.", "Tags": [ "Cluster", @@ -19239,6 +19805,13 @@ "FCI", "HA" ], + "Synopsis": "Gets information about one or more failover clusters in a given domain.", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Get-DbaWsfcCluster", + "Availability": "Windows only", + "Links": "https://dbatools.io/Get-DbaWsfcCluster", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaWsfcCluster -ComputerName cluster01\nGets failover cluster information about cluster01\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaWsfcCluster -ComputerName cluster01 | Select *\nShows all cluster values, including the ones not shown in the default view", "Params": [ [ "ComputerName", @@ -19265,16 +19838,10 @@ "False" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Gets information about one or more failover clusters in a given domain.", - "Name": "Get-DbaWsfcCluster", - "Links": "https://dbatools.io/Get-DbaWsfcCluster", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaWsfcCluster -ComputerName cluster01\nGets failover cluster information about cluster01\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaWsfcCluster -ComputerName cluster01 | Select *\nShows all cluster values, including the ones not shown in the default view", "Syntax": "Get-DbaWsfcCluster [[-ComputerName] \u003cDbaInstanceParameter[]\u003e] [[-Credential] \u003cPSCredential\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaWsfcDisk", + "Name": "Get-DbaWsfcDisk", "Description": "Gets information about the clustered disks on one or more failover clusters in a given domain.\n\nAll Windows Server Failover Clustering (Wsfc) commands require local admin on each member node.", "Tags": [ "Cluster", @@ -19282,6 +19849,13 @@ "FCI", "HA" ], + "Synopsis": "Gets information about the clustered disks on one or more failover clusters in a given domain.", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Get-DbaWsfcDisk", + "Availability": "Windows only", + "Links": "https://dbatools.io/Get-DbaWsfcDisk", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaWsfcDisk -ComputerName cluster01\nGets disk information from the failover cluster cluster01", "Params": [ [ "ComputerName", @@ -19308,16 +19882,10 @@ "False" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Gets information about the clustered disks on one or more failover clusters in a given domain.", - "Name": "Get-DbaWsfcDisk", - "Links": "https://dbatools.io/Get-DbaWsfcDisk", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaWsfcDisk -ComputerName cluster01\nGets disk information from the failover cluster cluster01", "Syntax": "Get-DbaWsfcDisk [[-ComputerName] \u003cDbaInstanceParameter[]\u003e] [[-Credential] \u003cPSCredential\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaWsfcNetwork", + "Name": "Get-DbaWsfcNetwork", "Description": "Gets information about one or more networks in a failover cluster.\n\nAll Windows Server Failover Clustering (Wsfc) commands require local admin on each member node.", "Tags": [ "Cluster", @@ -19325,6 +19893,13 @@ "FCI", "HA" ], + "Synopsis": "Gets information about one or more networks in a failover cluster.", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Get-DbaWsfcNetwork", + "Availability": "Windows only", + "Links": "https://dbatools.io/Get-DbaWsfcNetwork", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaWsfcNetwork -ComputerName cluster01\nGets network information from the failover cluster cluster01", "Params": [ [ "ComputerName", @@ -19351,16 +19926,10 @@ "False" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Gets information about one or more networks in a failover cluster.", - "Name": "Get-DbaWsfcNetwork", - "Links": "https://dbatools.io/Get-DbaWsfcNetwork", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaWsfcNetwork -ComputerName cluster01\nGets network information from the failover cluster cluster01", "Syntax": "Get-DbaWsfcNetwork [[-ComputerName] \u003cDbaInstanceParameter[]\u003e] [[-Credential] \u003cPSCredential\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaWsfcNetworkInterface", + "Name": "Get-DbaWsfcNetworkInterface", "Description": "Gets information about one or more network adapters in a failover cluster.\n\nAll Windows Server Failover Clustering (Wsfc) commands require local admin on each member node.", "Tags": [ "Cluster", @@ -19368,6 +19937,13 @@ "FCI", "HA" ], + "Synopsis": "Gets information about one or more network adapters in a failover cluster.", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Get-DbaWsfcNetworkInterface", + "Availability": "Windows only", + "Links": "https://dbatools.io/Get-DbaWsfcNetworkInterface", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaWsfcNetworkInterface -ComputerName cluster01\nGets network interface information from the failover cluster cluster01\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaWsfcNetworkInterface -ComputerName cluster01 | Select *\nShows all network interface values, including the ones not shown in the default view", "Params": [ [ "ComputerName", @@ -19394,16 +19970,10 @@ "False" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Gets information about one or more network adapters in a failover cluster.", - "Name": "Get-DbaWsfcNetworkInterface", - "Links": "https://dbatools.io/Get-DbaWsfcNetworkInterface", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaWsfcNetworkInterface -ComputerName cluster01\nGets network interface information from the failover cluster cluster01\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaWsfcNetworkInterface -ComputerName cluster01 | Select *\nShows all network interface values, including the ones not shown in the default view", "Syntax": "Get-DbaWsfcNetworkInterface [[-ComputerName] \u003cDbaInstanceParameter[]\u003e] [[-Credential] \u003cPSCredential\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaWsfcNode", + "Name": "Get-DbaWsfcNode", "Description": "Gets information about one or more nodes, or servers, in a failover cluster.\n\nAll Windows Server Failover Clustering (Wsfc) commands require local admin on each member node.", "Tags": [ "Cluster", @@ -19411,6 +19981,13 @@ "FCI", "HA" ], + "Synopsis": "Gets information about one or more nodes, or servers, in a failover cluster.", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Get-DbaWsfcNode", + "Availability": "Windows only", + "Links": "https://dbatools.io/Get-DbaWsfcNode", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaWsfcNode -ComputerName cluster01\nGets node information from the failover cluster cluster01\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaWsfcNode -ComputerName cluster01 | Select-Object *\nShows all node values, including the ones not shown in the default view", "Params": [ [ "ComputerName", @@ -19437,16 +20014,10 @@ "False" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Gets information about one or more nodes, or servers, in a failover cluster.", - "Name": "Get-DbaWsfcNode", - "Links": "https://dbatools.io/Get-DbaWsfcNode", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaWsfcNode -ComputerName cluster01\nGets node information from the failover cluster cluster01\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaWsfcNode -ComputerName cluster01 | Select-Object *\nShows all node values, including the ones not shown in the default view", "Syntax": "Get-DbaWsfcNode [[-ComputerName] \u003cDbaInstanceParameter[]\u003e] [[-Credential] \u003cPSCredential\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaWsfcResource", + "Name": "Get-DbaWsfcResource", "Description": "Gets information about one or more resources in a failover cluster.\n\nAll Windows Server Failover Clustering (Wsfc) commands require local admin on each member node.", "Tags": [ "Cluster", @@ -19454,6 +20025,13 @@ "FCI", "HA" ], + "Synopsis": "Gets information about one or more resources in a failover cluster.", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Get-DbaWsfcResource", + "Availability": "Windows only", + "Links": "https://dbatools.io/Get-DbaWsfcResource", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaWsfcResource -ComputerName cluster01\nGets resource information from the failover cluster cluster01\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaWsfcResource -ComputerName cluster01 | Select *\nShows all resource values, including the ones not shown in the default view", "Params": [ [ "ComputerName", @@ -19480,16 +20058,10 @@ "False" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Gets information about one or more resources in a failover cluster.", - "Name": "Get-DbaWsfcResource", - "Links": "https://dbatools.io/Get-DbaWsfcResource", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaWsfcResource -ComputerName cluster01\nGets resource information from the failover cluster cluster01\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaWsfcResource -ComputerName cluster01 | Select *\nShows all resource values, including the ones not shown in the default view", "Syntax": "Get-DbaWsfcResource [[-ComputerName] \u003cDbaInstanceParameter[]\u003e] [[-Credential] \u003cPSCredential\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaWsfcResourceType", + "Name": "Get-DbaWsfcResourceType", "Description": "Gets information about one or more resource types in a failover cluster.\n\nAll Windows Server Failover Clustering (Wsfc) commands require local admin on each member node.", "Tags": [ "Cluster", @@ -19497,6 +20069,13 @@ "FCI", "HA" ], + "Synopsis": "Gets information about one or more resource types in a failover cluster.", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Get-DbaWsfcResourceType", + "Availability": "Windows only", + "Links": "https://dbatools.io/Get-DbaWsfcResourceType", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaWsfcResourceType -ComputerName cluster01\nGets resource type information from the failover cluster cluster01", "Params": [ [ "ComputerName", @@ -19523,16 +20102,10 @@ "False" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Gets information about one or more resource types in a failover cluster.", - "Name": "Get-DbaWsfcResourceType", - "Links": "https://dbatools.io/Get-DbaWsfcResourceType", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaWsfcResourceType -ComputerName cluster01\nGets resource type information from the failover cluster cluster01", "Syntax": "Get-DbaWsfcResourceType [[-ComputerName] \u003cDbaInstanceParameter[]\u003e] [[-Credential] \u003cPSCredential\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaWsfcRole", + "Name": "Get-DbaWsfcRole", "Description": "Gets information about one or more clustered roles (resource groups) in a failover cluster.\n\nAll Windows Server Failover Clustering (Wsfc) commands require local admin on each member node.", "Tags": [ "Cluster", @@ -19540,6 +20113,13 @@ "FCI", "HA" ], + "Synopsis": "Gets information about one or more clustered roles (resource groups) in a failover cluster.", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Get-DbaWsfcRole", + "Availability": "Windows only", + "Links": "https://dbatools.io/Get-DbaWsfcRole", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaWsfcRole -ComputerName cluster01\nGets role information from the failover cluster cluster01\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaWsfcRole -ComputerName cluster01 | Select *\nShows all role values, including the ones not shown in the default view", "Params": [ [ "ComputerName", @@ -19566,16 +20146,10 @@ "False" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Gets information about one or more clustered roles (resource groups) in a failover cluster.", - "Name": "Get-DbaWsfcRole", - "Links": "https://dbatools.io/Get-DbaWsfcRole", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaWsfcRole -ComputerName cluster01\nGets role information from the failover cluster cluster01\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaWsfcRole -ComputerName cluster01 | Select *\nShows all role values, including the ones not shown in the default view", "Syntax": "Get-DbaWsfcRole [[-ComputerName] \u003cDbaInstanceParameter[]\u003e] [[-Credential] \u003cPSCredential\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaWsfcSharedVolume", + "Name": "Get-DbaWsfcSharedVolume", "Description": "Gets information about Cluster Shared Volumes in a failover cluster.\n\nAll Windows Server Failover Clustering (Wsfc) commands require local admin on each member node.", "Tags": [ "Cluster", @@ -19583,6 +20157,13 @@ "FCI", "HA" ], + "Synopsis": "Gets information about Cluster Shared Volumes in a failover cluster.", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Get-DbaWsfcSharedVolume", + "Availability": "Windows only", + "Links": "https://dbatools.io/Get-DbaWsfcSharedVolume", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaWsfcSharedVolume -ComputerName cluster01\nGets shared volume (CSV) information from the failover cluster cluster01", "Params": [ [ "ComputerName", @@ -19609,22 +20190,23 @@ "False" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Gets information about Cluster Shared Volumes in a failover cluster.", - "Name": "Get-DbaWsfcSharedVolume", - "Links": "https://dbatools.io/Get-DbaWsfcSharedVolume", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaWsfcSharedVolume -ComputerName cluster01\nGets shared volume (CSV) information from the failover cluster cluster01", "Syntax": "Get-DbaWsfcSharedVolume [[-ComputerName] \u003cDbaInstanceParameter[]\u003e] [[-Credential] \u003cPSCredential\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaXEObject", + "Name": "Get-DbaXEObject", "Description": "This function returns a list of extended events objects exposed by event packages from specified SQL Server instance(s).", "Tags": [ "ExtendedEvent", "XE", "XEvent" ], + "Synopsis": "Gets a list of extended events objects exposed by event packages from specified SQL Server instance(s).", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Get-DbaXEObject", + "Availability": "Windows, Linux, macOS", + "Links": null, + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaXEObject -SqlInstance sql2016\nLists all the XE Objects on the sql2016 SQL Server.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaXEObject -SqlInstance sql2017 -Type Action, Event\nLists all the XE Objects of type Action and Event on the sql2017 SQL Server.", "Params": [ [ "SqlInstance", @@ -19659,22 +20241,23 @@ "False" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Gets a list of extended events objects exposed by event packages from specified SQL Server instance(s).", - "Name": "Get-DbaXEObject", - "Links": null, - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaXEObject -SqlInstance sql2016\nLists all the XE Objects on the sql2016 SQL Server.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaXEObject -SqlInstance sql2017 -Type Action, Event\nLists all the XE Objects of type Action and Event on the sql2017 SQL Server.", "Syntax": "Get-DbaXEObject [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [-SqlCredential \u003cPSCredential\u003e] [-Type \u003cString[]\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaXESession", + "Name": "Get-DbaXESession", "Description": "Retrieves a list of Extended Events Sessions present on the specified SQL Server instance(s).", "Tags": [ "ExtendedEvent", "XE", "XEvent" ], + "Synopsis": "Gets a list of Extended Events Sessions from the specified SQL Server instance(s).", + "Alias": "Get-DbaXEventSession", + "Author": "Klaas Vandenberghe (@PowerDBAKlaas)", + "CommandName": "Get-DbaXESession", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Get-DbaXESession", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaXESession -SqlInstance ServerA\\sql987\nReturns a custom object with ComputerName, SQLInstance, Session, StartTime, Status and other properties.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaXESession -SqlInstance ServerA\\sql987 | Format-Table ComputerName, SqlInstance, Session, Status -AutoSize\nReturns a formatted table displaying ComputerName, SqlInstance, Session, and Status.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003e\u0027ServerA\\sql987\u0027,\u0027ServerB\u0027 | Get-DbaXESession\nReturns a custom object with ComputerName, SqlInstance, Session, StartTime, Status and other properties, from multiple SQL instances.", "Params": [ [ "SqlInstance", @@ -19709,22 +20292,23 @@ "False" ] ], - "Alias": "Get-DbaXEventSession", - "Author": "Klaas Vandenberghe (@PowerDBAKlaas)", - "Synopsis": "Gets a list of Extended Events Sessions from the specified SQL Server instance(s).", - "Name": "Get-DbaXESession", - "Links": "https://dbatools.io/Get-DbaXESession", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaXESession -SqlInstance ServerA\\sql987\nReturns a custom object with ComputerName, SQLInstance, Session, StartTime, Status and other properties.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaXESession -SqlInstance ServerA\\sql987 | Format-Table ComputerName, SqlInstance, Session, Status -AutoSize\nReturns a formatted table displaying ComputerName, SqlInstance, Session, and Status.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003e\u0027ServerA\\sql987\u0027,\u0027ServerB\u0027 | Get-DbaXESession\nReturns a custom object with ComputerName, SqlInstance, Session, StartTime, Status and other properties, from multiple SQL instances.", "Syntax": "Get-DbaXESession [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [[-Session] \u003cObject[]\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaXESessionTarget", + "Name": "Get-DbaXESessionTarget", "Description": "Retrieves a list of Extended Events Session Targets from the specified SQL Server instance(s).", "Tags": [ "ExtendedEvent", "XE", "XEvent" ], + "Synopsis": "Get a list of Extended Events Session Targets from the specified SQL Server instance(s).", + "Alias": "Get-DbaXEventSessionTarget", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Get-DbaXESessionTarget", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Get-DbaXESessionTarget", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaXESessionTarget -SqlInstance ServerA\\sql987 -Session system_health\nShows targets for the system_health session on ServerA\\sql987.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaXESession -SqlInstance sql2016 -Session system_health | Get-DbaXESessionTarget\nReturns the targets for the system_health session on sql2016.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaXESession -SqlInstance sql2016 -Session system_health | Get-DbaXESessionTarget -Target package0.event_file\nReturn only the package0.event_file target for the system_health session on sql2016.", "Params": [ [ "SqlInstance", @@ -19775,22 +20359,23 @@ "False" ] ], - "Alias": "Get-DbaXEventSessionTarget", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Get a list of Extended Events Session Targets from the specified SQL Server instance(s).", - "Name": "Get-DbaXESessionTarget", - "Links": "https://dbatools.io/Get-DbaXESessionTarget", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaXESessionTarget -SqlInstance ServerA\\sql987 -Session system_health\nShows targets for the system_health session on ServerA\\sql987.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaXESession -SqlInstance sql2016 -Session system_health | Get-DbaXESessionTarget\nReturns the targets for the system_health session on sql2016.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaXESession -SqlInstance sql2016 -Session system_health | Get-DbaXESessionTarget -Target package0.event_file\nReturn only the package0.event_file target for the system_health session on sql2016.", "Syntax": "Get-DbaXESessionTarget [-SqlCredential \u003cPSCredential\u003e] [-Session \u003cString[]\u003e] [-Target \u003cString[]\u003e] [-EnableException] [\u003cCommonParameters\u003e]\nGet-DbaXESessionTarget -SqlInstance \u003cDbaInstanceParameter[]\u003e [-SqlCredential \u003cPSCredential\u003e] [-Session \u003cString[]\u003e] [-Target \u003cString[]\u003e] [-EnableException] [\u003cCommonParameters\u003e]\nGet-DbaXESessionTarget [-SqlCredential \u003cPSCredential\u003e] [-Session \u003cString[]\u003e] [-Target \u003cString[]\u003e] -InputObject \u003cSession[]\u003e [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaXESessionTemplate", + "Name": "Get-DbaXESessionTemplate", "Description": "Parses Extended Event XML templates. Defaults to parsing templates in the dbatools template repository (\\bin\\xetemplates\\).\n\nThe default repository contains templates from:\nMicrosoft\u0027s Templates that come with SSMS\nJes Borland\u0027s \"Everyday Extended Events\" presentation and GitHub repository (https://github.com/grrlgeek/extended-events)\nChristian Grafe (@ChrGraefe) XE Repo: https://github.com/chrgraefe/sqlscripts/blob/master/XE-Events/\nErin Stellato\u0027s Blog: https://www.sqlskills.com/blogs/erin/\n\nSome profile templates converted using:\nsp_SQLskills_ConvertTraceToExtendedEvents.sql\nJonathan M. Kehayias, SQLskills.com\nhttp://sqlskills.com/blogs/jonathan", "Tags": [ "ExtendedEvent", "XE", "XEvent" ], + "Synopsis": "Parses Extended Event XML templates. Defaults to parsing templates in the dbatools template repository (\\bin\\xetemplates\\).", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Get-DbaXESessionTemplate", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Get-DbaXESessionTemplate", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaXESessionTemplate\nReturns information about all the templates in the local dbatools repository.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaXESessionTemplate | Out-GridView -PassThru | Import-DbaXESessionTemplate -SqlInstance sql2017 | Start-DbaXESession\nAllows you to select a Session template, then import it to the specified instance and start the session.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaXESessionTemplate -Path \"$home\\Documents\\SQL Server Management Studio\\Templates\\XEventTemplates\"\nReturns information about all the templates in your local XEventTemplates repository.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaXESessionTemplate -Pattern duration\nReturns information about all the templates that match the word \"duration\" in the title, category or body.\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eGet-DbaXESessionTemplate | Select-Object *\nReturns more information about the template, including the full path/filename.", "Params": [ [ "Path", @@ -19825,22 +20410,23 @@ "False" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Parses Extended Event XML templates. Defaults to parsing templates in the dbatools template repository (\\bin\\xetemplates\\).", - "Name": "Get-DbaXESessionTemplate", - "Links": "https://dbatools.io/Get-DbaXESessionTemplate", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaXESessionTemplate\nReturns information about all the templates in the local dbatools repository.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaXESessionTemplate | Out-GridView -PassThru | Import-DbaXESessionTemplate -SqlInstance sql2017 | Start-DbaXESession\nAllows you to select a Session template, then import it to the specified instance and start the session.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaXESessionTemplate -Path \"$home\\Documents\\SQL Server Management Studio\\Templates\\XEventTemplates\"\nReturns information about all the templates in your local XEventTemplates repository.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaXESessionTemplate -Pattern duration\nReturns information about all the templates that match the word \"duration\" in the title, category or body.\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eGet-DbaXESessionTemplate | Select-Object *\nReturns more information about the template, including the full path/filename.", "Syntax": "Get-DbaXESessionTemplate [[-Path] \u003cString[]\u003e] [[-Pattern] \u003cString\u003e] [[-Template] \u003cString[]\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaXESmartTarget", + "Name": "Get-DbaXESmartTarget", "Description": "Gets an XESmartTarget PowerShell job created by Start-DbaXESmartTarget.", "Tags": [ "ExtendedEvent", "XE", "XEvent" ], + "Synopsis": "Gets an XESmartTarget PowerShell job created by Start-DbaXESmartTarget.", + "Alias": "", + "Author": "Chrissy LeMaire (@cl) | SmartTarget by Gianluca Sartori (@spaghettidba)", + "CommandName": "Get-DbaXESmartTarget", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Get-DbaXESmartTarget", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaXESmartTarget\nGets an XESmartTarget PowerShell Job created by Start-DbaXESmartTarget.", "Params": [ [ "EnableException", @@ -19851,22 +20437,23 @@ "False" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl) | SmartTarget by Gianluca Sartori (@spaghettidba)", - "Synopsis": "Gets an XESmartTarget PowerShell job created by Start-DbaXESmartTarget.", - "Name": "Get-DbaXESmartTarget", - "Links": "https://dbatools.io/Get-DbaXESmartTarget", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaXESmartTarget\nGets an XESmartTarget PowerShell Job created by Start-DbaXESmartTarget.", "Syntax": "Get-DbaXESmartTarget [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Get-DbaXEStore", + "Name": "Get-DbaXEStore", "Description": "Get a Extended Events store", "Tags": [ "ExtendedEvent", "XE", "XEvent" ], + "Synopsis": "Get a Extended Events store", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Get-DbaXEStore", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Get-DbaXEStore", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaXEStore -SqlInstance ServerA\\sql987\nReturns an XEvent Store.", "Params": [ [ "SqlInstance", @@ -19893,22 +20480,23 @@ "False" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Get a Extended Events store", - "Name": "Get-DbaXEStore", - "Links": "https://dbatools.io/Get-DbaXEStore", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaXEStore -SqlInstance ServerA\\sql987\nReturns an XEvent Store.", "Syntax": "Get-DbaXEStore [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Grant-DbaAgPermission", + "Name": "Grant-DbaAgPermission", "Description": "Grants endpoint and availability group permissions to a login. If the account is a Windows login and does not exist, it will be automatically added.", "Tags": [ "AvailabilityGroup", "HA", "AG" ], + "Synopsis": "Grants endpoint and availability group permissions to a login.", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Grant-DbaAgPermission", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Grant-DbaAgPermission", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGrant-DbaAgPermission -SqlInstance sql2017a -Type AvailabilityGroup -AvailabilityGroup SharePoint -Login ad\\spservice -Permission CreateAnyDatabase\nAdds CreateAnyDatabase permissions to ad\\spservice on the SharePoint availability group on sql2017a. Does not prompt for confirmation.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGrant-DbaAgPermission -SqlInstance sql2017a -Type AvailabilityGroup -AvailabilityGroup ag1, ag2 -Login ad\\spservice -Permission CreateAnyDatabase -Confirm\nAdds CreateAnyDatabase permissions to ad\\spservice on the ag1 and ag2 availability groups on sql2017a. Prompts for confirmation.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaLogin -SqlInstance sql2017a | Out-GridView -Passthru | Grant-DbaAgPermission -Type EndPoint\nGrants the selected logins Connect permissions on the DatabaseMirroring endpoint for sql2017a", "Params": [ [ "SqlInstance", @@ -19991,21 +20579,22 @@ "" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Grants endpoint and availability group permissions to a login.", - "Name": "Grant-DbaAgPermission", - "Links": "https://dbatools.io/Grant-DbaAgPermission", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGrant-DbaAgPermission -SqlInstance sql2017a -Type AvailabilityGroup -AvailabilityGroup SharePoint -Login ad\\spservice -Permission CreateAnyDatabase\nAdds CreateAnyDatabase permissions to ad\\spservice on the SharePoint availability group on sql2017a. Does not prompt for confirmation.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGrant-DbaAgPermission -SqlInstance sql2017a -Type AvailabilityGroup -AvailabilityGroup ag1, ag2 -Login ad\\spservice -Permission CreateAnyDatabase -Confirm\nAdds CreateAnyDatabase permissions to ad\\spservice on the ag1 and ag2 availability groups on sql2017a. Prompts for confirmation.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaLogin -SqlInstance sql2017a | Out-GridView -Passthru | Grant-DbaAgPermission -Type EndPoint\nGrants the selected logins Connect permissions on the DatabaseMirroring endpoint for sql2017a", "Syntax": "Grant-DbaAgPermission [[-SqlInstance] \u003cDbaInstanceParameter[]\u003e] [[-SqlCredential] \u003cPSCredential\u003e] [[-Login] \u003cString[]\u003e] [[-AvailabilityGroup] \u003cString[]\u003e] [-Type] \u003cString[]\u003e [[-Permission] \u003cString[]\u003e] [[-InputObject] \u003cLogin[]\u003e] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Import-DbaCmsRegServer", + "Name": "Import-DbaCmsRegServer", "Description": "Imports registered servers and registered server groups to SQL Server Central Management Server (CMS)", "Tags": [ "RegisteredServer", "CMS" ], + "Synopsis": "Imports registered servers and registered server groups to SQL Server Central Management Server (CMS)", + "Alias": "Import-DbaRegisteredServer", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Import-DbaCmsRegServer", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Import-DbaCmsRegServer", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eImport-DbaCmsRegServer -SqlInstance sql2012 -Path C:\\temp\\corp-regservers.xml\nImports C:\\temp\\corp-regservers.xml to the CMS on sql2012\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eImport-DbaCmsRegServer -SqlInstance sql2008 -Group hr\\Seattle -Path C:\\temp\\Seattle.xml\nImports C:\\temp\\Seattle.xml to Seattle subgroup within the hr group on sql2008\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaCmsRegServer -SqlInstance sql2008, sql2012 | Import-DbaCmsRegServer -SqlInstance sql2017\nImports all registered servers from sql2008 and sql2012 to sql2017\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaCmsRegServerGroup -SqlInstance sql2008 -Group hr\\Seattle | Import-DbaCmsRegServer -SqlInstance sql2017 -Group Seattle\nImports all registered servers from the hr\\Seattle group on sql2008 to the Seattle group on sql2017", "Params": [ [ "SqlInstance", @@ -20056,21 +20645,22 @@ "False" ] ], - "Alias": "Import-DbaRegisteredServer", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Imports registered servers and registered server groups to SQL Server Central Management Server (CMS)", - "Name": "Import-DbaCmsRegServer", - "Links": "https://dbatools.io/Import-DbaCmsRegServer", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eImport-DbaCmsRegServer -SqlInstance sql2012 -Path C:\\temp\\corp-regservers.xml\nImports C:\\temp\\corp-regservers.xml to the CMS on sql2012\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eImport-DbaCmsRegServer -SqlInstance sql2008 -Group hr\\Seattle -Path C:\\temp\\Seattle.xml\nImports C:\\temp\\Seattle.xml to Seattle subgroup within the hr group on sql2008\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaCmsRegServer -SqlInstance sql2008, sql2012 | Import-DbaCmsRegServer -SqlInstance sql2017\nImports all registered servers from sql2008 and sql2012 to sql2017\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaCmsRegServerGroup -SqlInstance sql2008 -Group hr\\Seattle | Import-DbaCmsRegServer -SqlInstance sql2017 -Group Seattle\nImports all registered servers from the hr\\Seattle group on sql2008 to the Seattle group on sql2017", "Syntax": "Import-DbaCmsRegServer [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [[-Path] \u003cString[]\u003e] [[-InputObject] \u003cObject[]\u003e] [[-Group] \u003cObject\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Import-DbaCsv", - "Description": "Import-DbaCsv takes advantage of .NET\u0027s super fast SqlBulkCopy class to import CSV files into SQL Server.\n\nThe entire import is performed within a transaction, so if a failure occurs or the script is aborted, no changes will persist.\n\nIf the table or view specified does not exist and -AutoCreateTable, it will be automatically created using slow and efficient but accomodating data types.", + "Name": "Import-DbaCsv", + "Description": "Import-DbaCsv takes advantage of .NET\u0027s super fast SqlBulkCopy class to import CSV files into SQL Server.\n\nThe entire import is performed within a transaction, so if a failure occurs or the script is aborted, no changes will persist.\n\nIf the table or view specified does not exist and -AutoCreateTable, it will be automatically created using slow and inefficient but accommodating data types.\n\nThis importer supports fields spanning multiple lines. The only restriction is that they must be quoted, otherwise it would not be possible to distinguish between malformed data and multi-line values.", "Tags": [ "Migration", "Import" ], + "Synopsis": "Efficiently imports very large (and small) CSV files into SQL Server.", + "Alias": "Import-DbaCsvToSql", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Import-DbaCsv", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Import-DbaCsv", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eImport-DbaCsv -Path C:\\temp\\housing.csv -SqlInstance sql001 -Database markets\nImports the entire comma-delimited housing.csv to the SQL \"markets\" database on a SQL Server named sql001, using the first row as column names.\nSince a table name was not specified, the table name is automatically determined from filename as \"housing\".\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eImport-DbaCsv -Path .\\housing.csv -SqlInstance sql001 -Database markets -Table housing -Delimiter \"`t\" -NoHeaderRow\nImports the entire comma-delimited housing.csv, including the first row which is not used for colum names, to the SQL markets database, into the housing table, on a SQL Server named sql001.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eImport-DbaCsv -Path C:\\temp\\huge.txt -SqlInstance sqlcluster -Database locations -Table latitudes -Delimiter \"|\"\nImports the entire pipe-delimited huge.txt to the locations database, into the latitudes table on a SQL Server named sqlcluster.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eImport-DbaCsv -Path c:\\temp\\SingleColumn.csv -SqlInstance sql001 -Database markets -Table TempTable -SingleColumn\nImports the single column CSV into TempTable\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eGet-ChildItem -Path \\\\FileServer\\csvs | Import-DbaCsv -SqlInstance sql001, sql002 -Database tempdb -AutoCreateTable\nImports every CSV in the \\\\FileServer\\csvs path into both sql001 and sql002\u0027s tempdb database. Each CSV will be imported into an automatically determined table name.\n-------------------------- EXAMPLE 6 --------------------------\nPS C:\\\u003eGet-ChildItem -Path \\\\FileServer\\csvs | Import-DbaCsv -SqlInstance sql001, sql002 -Database tempdb -AutoCreateTable -WhatIf\nShows what would happen if the command were to be executed\n-------------------------- EXAMPLE 7 --------------------------\nPS C:\\\u003eImport-DbaCsv -Path c:\\temp\\dataset.csv -SqlInstance sql2016 -Database tempdb -Column Name, Address, Mobile\nImport only Name, Address and Mobile even if other columns exist. All other columns are ignored and therefore null or default values.\n-------------------------- EXAMPLE 8 --------------------------\nPS C:\\\u003e$columns = @{\n\u003e\u003e Text = \u0027FirstName\u0027\r\n\u003e\u003e Number = \u0027PhoneNumber\u0027\r\n\u003e\u003e }\r\nPS C:\\\u003e Import-DbaCsv -Path c:\\temp\\supersmall.csv -SqlInstance sql2016 -Database tempdb -ColumnMap $columns\nThe CSV column \u0027Text\u0027 is inserted into SQL column \u0027FirstName\u0027 and CSV column Number is inserted into the SQL Column \u0027PhoneNumber\u0027. All other columns are ignored and therefore null or default values.", "Params": [ [ "Path", @@ -20106,7 +20696,7 @@ ], [ "Table", - "Specifies the SQL table or view where CSV will be imported into.\nIf a table name is not specified, the table name will be automatically determined from the filename.\nIf the table specified does not exist and -AutoCreateTable, it will be automatically created using slow and efficient but accomodating data types.\nIf the automatically generated table datatypes do not work for you, please create the table prior to import.\nIf you want to import specific columns from a CSV, create a view with corresponding columns.", + "Specifies the SQL table or view where CSV will be imported into.\nIf a table name is not specified, the table name will be automatically determined from the filename.\nIf the table specified does not exist and -AutoCreateTable, it will be automatically created using slow and inefficient but accommodating data types.\nIf the automatically generated table datatypes do not work for you, please create the table prior to import.\nIf you want to import specific columns from a CSV, create a view with corresponding columns.", "", false, "false", @@ -20240,6 +20830,118 @@ "false", "False" ], + [ + "Quote", + "Defines the default quote character wrapping every field.", + "", + false, + "false", + "\"" + ], + [ + "Escape", + "Defines the default escape character letting insert quotation characters inside a quoted field.\nThe escape character can be the same as the quote character.", + "", + false, + "false", + "\"" + ], + [ + "Comment", + "Defines the default comment character indicating that a line is commented out. Default is #.", + "", + false, + "false", + "#" + ], + [ + "TrimmingOption", + "Determines which values should be trimmed. Default is \"None\". Options are All, None, UnquotedOnly and QuotedOnly.", + "", + false, + "false", + "None" + ], + [ + "BufferSize", + "Defines the default buffer size. The default BufferSize is 4096.", + "", + false, + "false", + "4096" + ], + [ + "ParseErrorAction", + "By default, the parse error action throws an exception and ends the import.\nYou can also choose AdvanceToNextLine which basically ignores parse errors.", + "", + false, + "false", + "ThrowException" + ], + [ + "Encoding", + "The encoding of the file.", + "", + false, + "false", + "" + ], + [ + "NullValue", + "The value which denotes a DbNull-value.", + "", + false, + "false", + "" + ], + [ + "Threshold", + "Defines the default value for Threshold indicating when the CsvReader should replace/remove consecutive null bytes.", + "", + false, + "false", + "60" + ], + [ + "MaxQuotedFieldLength", + "The axmimum length (in bytes) for any quoted field.", + "", + false, + "false", + "0" + ], + [ + "SkipEmptyLine", + "Skip empty lines.", + "", + false, + "false", + "False" + ], + [ + "SupportsMultiline", + "Indicates if the importer should support multiline fields.", + "", + false, + "false", + "False" + ], + [ + "UseColumnDefault", + "Use the column default values if the field is not in the record.", + "", + false, + "false", + "False" + ], + [ + "NoTransaction", + "Do not use a transaction when performing the import.", + "", + false, + "false", + "False" + ], [ "EnableException", "By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message.\r\nThis avoids overwhelming you with \"sea of red\" exceptions, but is inconvenient because it basically disables advanced scripting.\r\nUsing this switch turns this \"nice by default\" feature off and enables you to catch exceptions with your own try/catch.", @@ -20265,22 +20967,23 @@ "" ] ], - "Alias": "Import-DbaCsvToSql", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Efficiently imports very large (and small) CSV files into SQL Server.", - "Name": "Import-DbaCsv", - "Links": "https://dbatools.io/Import-DbaCsv", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eImport-DbaCsv -Path C:\\temp\\housing.csv -SqlInstance sql001 -Database markets\nImports the entire comma-delimited housing.csv to the SQL \"markets\" database on a SQL Server named sql001, using the first row as column names.\nSince a table name was not specified, the table name is automatically determined from filename as \"housing\".\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eImport-DbaCsv -Path .\\housing.csv -SqlInstance sql001 -Database markets -Table housing -Delimiter \"`t\" -NoHeaderRow\nImports the entire comma-delimited housing.csv, including the first row which is not used for colum names, to the SQL markets database, into the housing table, on a SQL Server named sql001.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eImport-DbaCsv -Path C:\\temp\\huge.txt -SqlInstance sqlcluster -Database locations -Table latitudes -Delimiter \"|\"\nImports the entire pipe-delimited huge.txt to the locations database, into the latitudes table on a SQL Server named sqlcluster.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eImport-DbaCsv -Path c:\\temp\\SingleColumn.csv -SqlInstance sql001 -Database markets -Table TempTable -SingleColumn\nImports the single column CSV into TempTable\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eGet-ChildItem -Path \\\\FileServer\\csvs | Import-DbaCsv -SqlInstance sql001, sql002 -Database tempdb -AutoCreateTable\nImports every CSV in the \\\\FileServer\\csvs path into both sql001 and sql002\u0027s tempdb database. Each CSV will be imported into an automatically determined table name.\n-------------------------- EXAMPLE 6 --------------------------\nPS C:\\\u003eGet-ChildItem -Path \\\\FileServer\\csvs | Import-DbaCsv -SqlInstance sql001, sql002 -Database tempdb -AutoCreateTable -WhatIf\nShows what would happen if the command were to be executed\n-------------------------- EXAMPLE 7 --------------------------\nPS C:\\\u003eImport-DbaCsv -Path c:\\temp\\dataset.csv -SqlInstance sql2016 -Database tempdb -Column Name, Address, Mobile\nImport only Name, Address and Mobile even if other columns exist. All other columns are ignored and therefore null or default values.\n-------------------------- EXAMPLE 8 --------------------------\nPS C:\\\u003e$columns = @{\n\u003e\u003e Text = \u0027FirstName\u0027\r\n\u003e\u003e Number = \u0027PhoneNumber\u0027\r\n\u003e\u003e }\r\nPS C:\\\u003e Import-DbaCsv -Path c:\\temp\\supersmall.csv -SqlInstance sql2016 -Database tempdb -ColumnMap $columns\nThe CSV column \u0027Text\u0027 is inserted into SQL column \u0027FirstName\u0027 and CSV column Number is inserted into the SQL Column \u0027PhoneNumber\u0027. All other columns are ignored and therefore null or default values.", - "Syntax": "Import-DbaCsv [[-Path] \u003cObject[]\u003e] [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [-Database] \u003cString\u003e [[-Table] \u003cString\u003e] [[-Schema] \u003cString\u003e] [-Truncate] [[-Delimiter] \u003cString\u003e] [-SingleColumn] [[-BatchSize] \u003cInt32\u003e] [[-NotifyAfter] \u003cInt32\u003e] [-TableLock] [-CheckConstraints] [-FireTriggers] [-KeepIdentity] [-KeepNulls] [[-Column] \u003cString[]\u003e] [[-ColumnMap] \u003cHashtable[]\u003e] [-AutoCreateTable] [-NoProgress] [-NoHeaderRow] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" + "Syntax": "Import-DbaCsv [[-Path] \u003cObject[]\u003e] [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [-Database] \u003cString\u003e [[-Table] \u003cString\u003e] [[-Schema] \u003cString\u003e] [-Truncate] [[-Delimiter] \u003cChar\u003e] [-SingleColumn] [[-BatchSize] \u003cInt32\u003e] [[-NotifyAfter] \u003cInt32\u003e] [-TableLock] [-CheckConstraints] [-FireTriggers] [-KeepIdentity] [-KeepNulls] [[-Column] \u003cString[]\u003e] [[-ColumnMap] \u003cHashtable[]\u003e] [-AutoCreateTable] [-NoProgress] [-NoHeaderRow] [[-Quote] \u003cChar\u003e] [[-Escape] \u003cChar\u003e] [[-Comment] \u003cChar\u003e] [[-TrimmingOption] \u003cString\u003e] [[-BufferSize] \u003cInt32\u003e] [[-ParseErrorAction] \u003cString\u003e] \r\n[[-Encoding] \u003cEncoding\u003e] [[-NullValue] \u003cString\u003e] [[-Threshold] \u003cInt32\u003e] [[-MaxQuotedFieldLength] \u003cInt32\u003e] [-SkipEmptyLine] [-SupportsMultiline] [-UseColumnDefault] [-NoTransaction] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Import-DbaPfDataCollectorSetTemplate", + "Name": "Import-DbaPfDataCollectorSetTemplate", "Description": "Imports a new Performance Monitor Data Collector Set Template either from the dbatools repository or a file you specify.\nWhen importing data collector sets from the local instance, Run As Admin is required.\n\nNote: The included counters will be added for all SQL instances on the machine by default.\nFor specific instances in addition to the default, use -Instance.\n\nSee https://msdn.microsoft.com/en-us/library/windows/desktop/aa371952 for more information", "Tags": [ "Performance", "DataCollector", "PerfCounter" ], + "Synopsis": "Imports a new Performance Monitor Data Collector Set Template either from the dbatools repository or a file you specify.", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Import-DbaPfDataCollectorSetTemplate", + "Availability": "Windows only", + "Links": "https://dbatools.io/Import-DbaPfDataCollectorSetTemplate", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eImport-DbaPfDataCollectorSetTemplate -ComputerName sql2017 -Template \u0027Long Running Query\u0027\nCreates a new data collector set named \u0027Long Running Query\u0027 from the dbatools repository on the SQL Server sql2017.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eImport-DbaPfDataCollectorSetTemplate -ComputerName sql2017 -Template \u0027Long Running Query\u0027 -DisplayName \u0027New Long running query\u0027 -Confirm\nCreates a new data collector set named \"New Long Running Query\" using the \u0027Long Running Query\u0027 template. Forces a confirmation if the template exists.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaPfDataCollectorSet -ComputerName sql2017 -Session db_ola_health | Remove-DbaPfDataCollectorSet\nImport-DbaPfDataCollectorSetTemplate -ComputerName sql2017 -Template db_ola_health | Start-DbaPfDataCollectorSet\nImports a session if it exists, then recreates it using a template.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaPfDataCollectorSetTemplate | Out-GridView -PassThru | Import-DbaPfDataCollectorSetTemplate -ComputerName sql2017\nAllows you to select a Session template then import to an instance named sql2017.\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eImport-DbaPfDataCollectorSetTemplate -ComputerName sql2017 -Template \u0027Long Running Query\u0027 -Instance SHAREPOINT\nCreates a new data collector set named \u0027Long Running Query\u0027 from the dbatools repository on the SQL Server sql2017 for both the default and the SHAREPOINT instance.\nIf you\u0027d like to remove counters for the default instance, use Remove-DbaPfDataCollectorCounter.", "Params": [ [ "ComputerName", @@ -20459,22 +21162,23 @@ "" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Imports a new Performance Monitor Data Collector Set Template either from the dbatools repository or a file you specify.", - "Name": "Import-DbaPfDataCollectorSetTemplate", - "Links": "https://dbatools.io/Import-DbaPfDataCollectorSetTemplate", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eImport-DbaPfDataCollectorSetTemplate -ComputerName sql2017 -Template \u0027Long Running Query\u0027\nCreates a new data collector set named \u0027Long Running Query\u0027 from the dbatools repository on the SQL Server sql2017.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eImport-DbaPfDataCollectorSetTemplate -ComputerName sql2017 -Template \u0027Long Running Query\u0027 -DisplayName \u0027New Long running query\u0027 -Confirm\nCreates a new data collector set named \"New Long Running Query\" using the \u0027Long Running Query\u0027 template. Forces a confirmation if the template exists.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaPfDataCollectorSet -ComputerName sql2017 -Session db_ola_health | Remove-DbaPfDataCollectorSet\nImport-DbaPfDataCollectorSetTemplate -ComputerName sql2017 -Template db_ola_health | Start-DbaPfDataCollectorSet\nImports a session if it exists, then recreates it using a template.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaPfDataCollectorSetTemplate | Out-GridView -PassThru | Import-DbaPfDataCollectorSetTemplate -ComputerName sql2017\nAllows you to select a Session template then import to an instance named sql2017.\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eImport-DbaPfDataCollectorSetTemplate -ComputerName sql2017 -Template \u0027Long Running Query\u0027 -Instance SHAREPOINT\nCreates a new data collector set named \u0027Long Running Query\u0027 from the dbatools repository on the SQL Server sql2017 for both the default and the SHAREPOINT instance.\nIf you\u0027d like to remove counters for the default instance, use Remove-DbaPfDataCollectorCounter.", "Syntax": "Import-DbaPfDataCollectorSetTemplate [[-ComputerName] \u003cDbaInstanceParameter[]\u003e] [[-Credential] \u003cPSCredential\u003e] [[-DisplayName] \u003cString\u003e] [-SchedulesEnabled] [[-RootPath] \u003cString\u003e] [-Segment] [[-SegmentMaxDuration] \u003cInt32\u003e] [[-SegmentMaxSize] \u003cInt32\u003e] [[-Subdirectory] \u003cString\u003e] [[-SubdirectoryFormat] \u003cInt32\u003e] [[-SubdirectoryFormatPattern] \u003cString\u003e] [[-Task] \u003cString\u003e] [-TaskRunAsSelf] [[-TaskArguments] \u003cString\u003e] [[-TaskUserTextArguments] \u003cString\u003e] [-StopOnCompletion] [[-Path] \u003cString[]\u003e] [[-Template] \u003cString[]\u003e] [[-Instance] \u003cString[]\u003e] [-EnableException] [-WhatIf] [-Confirm] \r\n[\u003cCommonParameters\u003e]" }, { - "CommandName": "Import-DbaSpConfigure", + "Name": "Import-DbaSpConfigure", "Description": "Updates sp_configure settings on destination server.", "Tags": [ "SpConfig", "Configure", "Configuration" ], + "Synopsis": "Updates sp_configure settings on destination server.", + "Alias": "Import-SqlSpConfigure", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Import-DbaSpConfigure", + "Availability": "Windows only", + "Links": "https://dbatools.io/Import-DbaSpConfigure", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eImport-DbaSpConfigure -Source sqlserver -Destination sqlcluster\nImports the sp_configure settings from the source server sqlserver and sets them on the sqlcluster server using Windows Authentication\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eImport-DbaSpConfigure -Source sqlserver -Destination sqlcluster -Force\nImports the sp_configure settings from the source server sqlserver and sets them on the sqlcluster server using Windows Authentication. Will not do a version check between Source and Destination\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eImport-DbaSpConfigure -Source sqlserver -Destination sqlcluster -SourceSqlCredential $SourceSqlCredential -DestinationSqlCredential $DestinationSqlCredential\nImports the sp_configure settings from the source server sqlserver and sets them on the sqlcluster server using the SQL credentials stored in the variables $SourceSqlCredential and \r\n$DestinationSqlCredential\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eImport-DbaSpConfigure -SqlInstance sqlserver -Path .\\spconfig.sql -SqlCredential $SqlCredential\nImports the sp_configure settings from the file .\\spconfig.sql and sets them on the sqlserver server using the SQL credential stored in the variable $SqlCredential", "Params": [ [ "Source", @@ -20565,17 +21269,17 @@ "" ] ], - "Alias": "Import-SqlSpConfigure", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Updates sp_configure settings on destination server.", - "Name": "Import-DbaSpConfigure", - "Links": "https://dbatools.io/Import-DbaSpConfigure", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eImport-DbaSpConfigure -Source sqlserver -Destination sqlcluster\nImports the sp_configure settings from the source server sqlserver and sets them on the sqlcluster server using Windows Authentication\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eImport-DbaSpConfigure -Source sqlserver -Destination sqlcluster -Force\nImports the sp_configure settings from the source server sqlserver and sets them on the sqlcluster server using Windows Authentication. Will not do a version check between Source and Destination\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eImport-DbaSpConfigure -Source sqlserver -Destination sqlcluster -SourceSqlCredential $SourceSqlCredential -DestinationSqlCredential $DestinationSqlCredential\nImports the sp_configure settings from the source server sqlserver and sets them on the sqlcluster server using the SQL credentials stored in the variables $SourceSqlCredential and \r\n$DestinationSqlCredential\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eImport-DbaSpConfigure -SqlInstance sqlserver -Path .\\spconfig.sql -SqlCredential $SqlCredential\nImports the sp_configure settings from the file .\\spconfig.sql and sets them on the sqlserver server using the SQL credential stored in the variable $SqlCredential", "Syntax": "Import-DbaSpConfigure [-Force] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]\nImport-DbaSpConfigure [-Source \u003cDbaInstanceParameter\u003e] [-Destination \u003cDbaInstanceParameter\u003e] [-SourceSqlCredential \u003cPSCredential\u003e] [-DestinationSqlCredential \u003cPSCredential\u003e] [-Force] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]\nImport-DbaSpConfigure [-SqlInstance \u003cDbaInstanceParameter\u003e] [-Path \u003cString\u003e] [-SqlCredential \u003cPSCredential\u003e] [-Force] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Import-DbatoolsConfig", + "Name": "Import-DbatoolsConfig", "Description": "Imports a json configuration file into the configuration system.", + "Synopsis": "Imports a json configuration file into the configuration system.", + "Alias": "", + "CommandName": "Import-DbatoolsConfig", + "Availability": "Windows, Linux, macOS", + "Links": null, + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eImport-DbatoolsConfig -Path \u0027.\\config.json\u0027\nImports the configuration stored in \u0027.\\config.json\u0027\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eImport-DbatoolsConfig -ModuleName message\nImports all the module specific settings that have been persisted in any of the default file system paths.", "Params": [ [ "Path", @@ -20642,21 +21346,23 @@ "False" ] ], - "Alias": "", - "Synopsis": "Imports a json configuration file into the configuration system.", - "Name": "Import-DbatoolsConfig", - "Links": null, - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eImport-DbatoolsConfig -Path \u0027.\\config.json\u0027\nImports the configuration stored in \u0027.\\config.json\u0027\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eImport-DbatoolsConfig -ModuleName message\nImports all the module specific settings that have been persisted in any of the default file system paths.", "Syntax": "Import-DbatoolsConfig -Path \u003cString[]\u003e [-IncludeFilter \u003cString[]\u003e] [-ExcludeFilter \u003cString[]\u003e] [-Peek] [-EnableException] [\u003cCommonParameters\u003e]\nImport-DbatoolsConfig -ModuleName \u003cString\u003e [-ModuleVersion \u003cInt32\u003e] [-Scope {UserDefault | UserMandatory | SystemDefault | SystemMandatory | FileUserLocal | FileUserShared | FileSystem}] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Import-DbaXESessionTemplate", + "Name": "Import-DbaXESessionTemplate", "Description": "Imports a new XESession XML Template either from the dbatools repository or a file you specify.", "Tags": [ "ExtendedEvent", "XE", "XEvent" ], + "Synopsis": "Imports a new XESession XML Template", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Import-DbaXESessionTemplate", + "Availability": "Windows only", + "Links": "https://dbatools.io/Import-DbaXESessionTemplate", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eImport-DbaXESessionTemplate -SqlInstance sql2017 -Template db_query_wait_stats\nCreates a new XESession named db_query_wait_stats from the dbatools repository to the SQL Server sql2017.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eImport-DbaXESessionTemplate -SqlInstance sql2017 -Template db_query_wait_stats -Name \"Query Wait Stats\"\nCreates a new XESession named \"Query Wait Stats\" using the db_query_wait_stats template.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaXESession -SqlInstance sql2017 -Session \u0027Database Health 2014\u0027 | Remove-DbaXESession\nPS C:\\\u003e Import-DbaXESessionTemplate -SqlInstance sql2017 -Template \u0027Database Health 2014\u0027 | Start-DbaXESession\nRemoves a session if it exists, then recreates it using a template.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaXESessionTemplate | Out-GridView -PassThru | Import-DbaXESessionTemplate -SqlInstance sql2017\nAllows you to select a Session template then import to an instance named sql2017.", "Params": [ [ "SqlInstance", @@ -20723,22 +21429,23 @@ "False" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Imports a new XESession XML Template", - "Name": "Import-DbaXESessionTemplate", - "Links": "https://dbatools.io/Import-DbaXESessionTemplate", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eImport-DbaXESessionTemplate -SqlInstance sql2017 -Template db_query_wait_stats\nCreates a new XESession named db_query_wait_stats from the dbatools repository to the SQL Server sql2017.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eImport-DbaXESessionTemplate -SqlInstance sql2017 -Template db_query_wait_stats -Name \"Query Wait Stats\"\nCreates a new XESession named \"Query Wait Stats\" using the db_query_wait_stats template.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaXESession -SqlInstance sql2017 -Session db_ola_health | Remove-DbaXESession\nPS C:\\\u003e Import-DbaXESessionTemplate -SqlInstance sql2017 -Template db_ola_health | Start-DbaXESession\nImports a session if it exists, then recreates it using a template.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaXESessionTemplate | Out-GridView -PassThru | Import-DbaXESessionTemplate -SqlInstance sql2017\nAllows you to select a Session template then import to an instance named sql2017.", "Syntax": "Import-DbaXESessionTemplate [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [[-Name] \u003cString\u003e] [[-Path] \u003cString[]\u003e] [[-Template] \u003cString[]\u003e] [[-TargetFilePath] \u003cString\u003e] [[-TargetFileMetadataPath] \u003cString\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Install-DbaFirstResponderKit", + "Name": "Install-DbaFirstResponderKit", "Description": "Downloads, extracts and installs the First Responder Kit stored procedures:\nsp_Blitz, sp_BlitzWho, sp_BlitzFirst, sp_BlitzIndex, sp_BlitzCache and sp_BlitzTrace, etc.\n\nFirst Responder Kit links:\nhttp://FirstResponderKit.org\nhttps://github.com/BrentOzarULTD/SQL-Server-First-Responder-Kit", "Tags": [ "BrentOzar", "FRK", "FirstResponderKit" ], + "Synopsis": "Installs or updates the First Responder Kit stored procedures.", + "Alias": "", + "Author": "Tara Kizer, Brent Ozar Unlimited (https://www.brentozar.com/)", + "CommandName": "Install-DbaFirstResponderKit", + "Availability": "Windows only", + "Links": "https://dbatools.io/Install-DbaFirstResponderKit", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eInstall-DbaFirstResponderKit -SqlInstance server1 -Database master\nLogs into server1 with Windows authentication and then installs the FRK in the master database.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eInstall-DbaFirstResponderKit -SqlInstance server1\\instance1 -Database DBA\nLogs into server1\\instance1 with Windows authentication and then installs the FRK in the DBA database.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eInstall-DbaFirstResponderKit -SqlInstance server1\\instance1 -Database master -SqlCredential $cred\nLogs into server1\\instance1 with SQL authentication and then installs the FRK in the master database.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eInstall-DbaFirstResponderKit -SqlInstance sql2016\\standardrtm, sql2016\\sqlexpress, sql2014\nLogs into sql2016\\standardrtm, sql2016\\sqlexpress and sql2014 with Windows authentication and then installs the FRK in the master database.\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003e$servers = \"sql2016\\standardrtm\", \"sql2016\\sqlexpress\", \"sql2014\"\nPS C:\\\u003e $servers | Install-DbaFirstResponderKit\nLogs into sql2016\\standardrtm, sql2016\\sqlexpress and sql2014 with Windows authentication and then installs the FRK in the master database.\n-------------------------- EXAMPLE 6 --------------------------\nPS C:\\\u003eInstall-DbaFirstResponderKit -SqlInstance sql2016 -Branch dev\nInstalls the dev branch version of the FRK in the master database on sql2016 instance.", "Params": [ [ "SqlInstance", @@ -20813,21 +21520,22 @@ "" ] ], - "Alias": "", - "Author": "Tara Kizer, Brent Ozar Unlimited (https://www.brentozar.com/)", - "Synopsis": "Installs or updates the First Responder Kit stored procedures.", - "Name": "Install-DbaFirstResponderKit", - "Links": "https://dbatools.io/Install-DbaFirstResponderKit", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eInstall-DbaFirstResponderKit -SqlInstance server1 -Database master\nLogs into server1 with Windows authentication and then installs the FRK in the master database.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eInstall-DbaFirstResponderKit -SqlInstance server1\\instance1 -Database DBA\nLogs into server1\\instance1 with Windows authentication and then installs the FRK in the DBA database.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eInstall-DbaFirstResponderKit -SqlInstance server1\\instance1 -Database master -SqlCredential $cred\nLogs into server1\\instance1 with SQL authentication and then installs the FRK in the master database.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eInstall-DbaFirstResponderKit -SqlInstance sql2016\\standardrtm, sql2016\\sqlexpress, sql2014\nLogs into sql2016\\standardrtm, sql2016\\sqlexpress and sql2014 with Windows authentication and then installs the FRK in the master database.\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003e$servers = \"sql2016\\standardrtm\", \"sql2016\\sqlexpress\", \"sql2014\"\nPS C:\\\u003e $servers | Install-DbaFirstResponderKit\nLogs into sql2016\\standardrtm, sql2016\\sqlexpress and sql2014 with Windows authentication and then installs the FRK in the master database.\n-------------------------- EXAMPLE 6 --------------------------\nPS C:\\\u003eInstall-DbaFirstResponderKit -SqlInstance sql2016 -Branch dev\nInstalls the dev branch version of the FRK in the master database on sql2016 instance.", "Syntax": "Install-DbaFirstResponderKit [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [[-Branch] \u003cString\u003e] [[-Database] \u003cObject\u003e] [[-LocalFile] \u003cString\u003e] [-Force] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Install-DbaMaintenanceSolution", + "Name": "Install-DbaMaintenanceSolution", "Description": "This script will download and install the latest version of SQL Server Maintenance Solution created by Ola Hallengren", "Tags": [ "Ola", "Maintenance" ], + "Synopsis": "Download and Install SQL Server Maintenance Solution created by Ola Hallengren (https://ola.hallengren.com)", + "Alias": "", + "Author": "Viorel Ciucu, cviorel.com", + "CommandName": "Install-DbaMaintenanceSolution", + "Availability": "Windows only", + "Links": "http://dbatools.io/Install-DbaMaintenanceSolution", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eInstall-DbaMaintenanceSolution -SqlInstance RES14224 -Database DBA -CleanupTime 72\nInstalls Ola Hallengren\u0027s Solution objects on RES14224 in the DBA database.\r\nBackups will default to the default Backup Directory.\r\nIf the Maintenance Solution already exists, the script will be halted.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eInstall-DbaMaintenanceSolution -SqlInstance RES14224 -Database DBA -BackupLocation \"Z:\\SQLBackup\" -CleanupTime 72\nThis will create the Ola Hallengren\u0027s Solution objects. Existing objects are not affected in any way.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003e$params = @{\n\u003e\u003e SqlInstance = \u0027MyServer\u0027\r\n \u003e\u003e Database = \u0027maintenance\u0027\r\n \u003e\u003e ReplaceExisting = $true\r\n \u003e\u003e InstallJobs = $true\r\n \u003e\u003e LogToTable = $true\r\n \u003e\u003e BackupLocation = \u0027C:\\Data\\Backup\u0027\r\n \u003e\u003e CleanupTime = 65\r\n \u003e\u003e Verbose = $true\r\n \u003e\u003e }\r\n \u003e\u003e Install-DbaMaintenanceSolution @params\nInstalls Maintenance Solution to myserver in database. Adds Agent Jobs, and if any currently exist, they\u0027ll be replaced.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eInstall-DbaMaintenanceSolution -SqlInstance RES14224 -Database DBA -BackupLocation \"Z:\\SQLBackup\" -CleanupTime 72 -ReplaceExisting\nThis will drop and then recreate the Ola Hallengren\u0027s Solution objects\r\nThe cleanup script will drop and recreate:\r\n- TABLE [dbo].[CommandLog]\r\n- STORED PROCEDURE [dbo].[CommandExecute]\r\n- STORED PROCEDURE [dbo].[DatabaseBackup]\r\n- STORED PROCEDURE [dbo].[DatabaseIntegrityCheck]\r\n- STORED PROCEDURE [dbo].[IndexOptimize]\nThe following SQL Agent jobs will be deleted:\r\n- \u0027Output File Cleanup\u0027\r\n- \u0027IndexOptimize - USER_DATABASES\u0027\r\n- \u0027sp_delete_backuphistory\u0027\r\n- \u0027DatabaseBackup - USER_DATABASES - LOG\u0027\r\n- \u0027DatabaseBackup - SYSTEM_DATABASES - FULL\u0027\r\n- \u0027DatabaseBackup - USER_DATABASES - FULL\u0027\r\n- \u0027sp_purge_jobhistory\u0027\r\n- \u0027DatabaseIntegrityCheck - SYSTEM_DATABASES\u0027\r\n- \u0027CommandLog Cleanup\u0027\r\n- \u0027DatabaseIntegrityCheck - USER_DATABASES\u0027\r\n- \u0027DatabaseBackup - USER_DATABASES - DIFF\u0027", "Params": [ [ "SqlInstance", @@ -20950,18 +21658,19 @@ "" ] ], - "Alias": "", - "Author": "Viorel Ciucu, cviorel.com", - "Synopsis": "Download and Install SQL Server Maintenance Solution created by Ola Hallengren (https://ola.hallengren.com)", - "Name": "Install-DbaMaintenanceSolution", - "Links": "http://dbatools.io/Install-DbaMaintenanceSolution", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eInstall-DbaMaintenanceSolution -SqlInstance RES14224 -Database DBA -CleanupTime 72\nInstalls Ola Hallengren\u0027s Solution objects on RES14224 in the DBA database.\r\nBackups will default to the default Backup Directory.\r\nIf the Maintenance Solution already exists, the script will be halted.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eInstall-DbaMaintenanceSolution -SqlInstance RES14224 -Database DBA -BackupLocation \"Z:\\SQLBackup\" -CleanupTime 72\nThis will create the Ola Hallengren\u0027s Solution objects. Existing objects are not affected in any way.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eInstall-DbaMaintenanceSolution -SqlInstance RES14224 -Database DBA -BackupLocation \"Z:\\SQLBackup\" -CleanupTime 72 -ReplaceExisting\nThis will drop and then recreate the Ola Hallengren\u0027s Solution objects\r\nThe cleanup script will drop and recreate:\r\n- TABLE [dbo].[CommandLog]\r\n- STORED PROCEDURE [dbo].[CommandExecute]\r\n- STORED PROCEDURE [dbo].[DatabaseBackup]\r\n- STORED PROCEDURE [dbo].[DatabaseIntegrityCheck]\r\n- STORED PROCEDURE [dbo].[IndexOptimize]\nThe following SQL Agent jobs will be deleted:\r\n- \u0027Output File Cleanup\u0027\r\n- \u0027IndexOptimize - USER_DATABASES\u0027\r\n- \u0027sp_delete_backuphistory\u0027\r\n- \u0027DatabaseBackup - USER_DATABASES - LOG\u0027\r\n- \u0027DatabaseBackup - SYSTEM_DATABASES - FULL\u0027\r\n- \u0027DatabaseBackup - USER_DATABASES - FULL\u0027\r\n- \u0027sp_purge_jobhistory\u0027\r\n- \u0027DatabaseIntegrityCheck - SYSTEM_DATABASES\u0027\r\n- \u0027CommandLog Cleanup\u0027\r\n- \u0027DatabaseIntegrityCheck - USER_DATABASES\u0027\r\n- \u0027DatabaseBackup - USER_DATABASES - DIFF\u0027", "Syntax": "Install-DbaMaintenanceSolution [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [[-Database] \u003cObject\u003e] [[-BackupLocation] \u003cString\u003e] [[-CleanupTime] \u003cInt32\u003e] [[-OutputFileDirectory] \u003cString\u003e] [-ReplaceExisting] [-LogToTable] [[-Solution] \u003cString\u003e] [-InstallJobs] [[-LocalFile] \u003cString\u003e] [-Force] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Install-DbaSqlWatch", + "Name": "Install-DbaSqlWatch", "Description": "Downloads, extracts and installs or updates SqlWatch.\nhttps://sqlwatch.io/", "Tags": "SqlWatch", + "Synopsis": "Installs or updates SqlWatch.", + "Alias": "", + "Author": "Ken K (github.com/koglerk)", + "CommandName": "Install-DbaSqlWatch", + "Availability": "Windows only", + "Links": "https://dbatools.io/Install-DbaSqlWatch", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eInstall-DbaSqlWatch -SqlInstance server1\nLogs into server1 with Windows authentication and then installs SqlWatch in the SQLWATCH database.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eInstall-DbaSqlWatch -SqlInstance server1\\instance1 -Database DBA\nLogs into server1\\instance1 with Windows authentication and then installs SqlWatch in the DBA database.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eInstall-DbaSqlWatch -SqlInstance server1\\instance1 -Database DBA -SqlCredential $cred\nLogs into server1\\instance1 with SQL authentication and then installs SqlWatch in the DBA database.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eInstall-DbaSqlWatch -SqlInstance sql2016\\standardrtm, sql2016\\sqlexpress, sql2014\nLogs into sql2016\\standardrtm, sql2016\\sqlexpress and sql2014 with Windows authentication and then installs SqlWatch in the SQLWATCH database.\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003e$servers = \"sql2016\\standardrtm\", \"sql2016\\sqlexpress\", \"sql2014\"\n$servers | Install-DbaSqlWatch\nLogs into sql2016\\standardrtm, sql2016\\sqlexpress and sql2014 with Windows authentication and then installs SqlWatch in the SQLWATCH database.", "Params": [ [ "SqlInstance", @@ -21028,18 +21737,19 @@ "" ] ], - "Alias": "", - "Author": "Ken K (github.com/koglerk)", - "Synopsis": "Installs or updates SqlWatch.", - "Name": "Install-DbaSqlWatch", - "Links": "https://dbatools.io/Install-DbaSqlWatch", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eInstall-DbaSqlWatch -SqlInstance server1\nLogs into server1 with Windows authentication and then installs SqlWatch in the SQLWATCH database.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eInstall-DbaSqlWatch -SqlInstance server1\\instance1 -Database DBA\nLogs into server1\\instance1 with Windows authentication and then installs SqlWatch in the DBA database.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eInstall-DbaSqlWatch -SqlInstance server1\\instance1 -Database DBA -SqlCredential $cred\nLogs into server1\\instance1 with SQL authentication and then installs SqlWatch in the DBA database.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eInstall-DbaSqlWatch -SqlInstance sql2016\\standardrtm, sql2016\\sqlexpress, sql2014\nLogs into sql2016\\standardrtm, sql2016\\sqlexpress and sql2014 with Windows authentication and then installs SqlWatch in the SQLWATCH database.\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003e$servers = \"sql2016\\standardrtm\", \"sql2016\\sqlexpress\", \"sql2014\"\n$servers | Install-DbaSqlWatch\nLogs into sql2016\\standardrtm, sql2016\\sqlexpress and sql2014 with Windows authentication and then installs SqlWatch in the SQLWATCH database.", "Syntax": "Install-DbaSqlWatch [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [[-Database] \u003cString\u003e] [[-LocalFile] \u003cString\u003e] [-Force] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Install-DbaWatchUpdate", + "Name": "Install-DbaWatchUpdate", "Description": "Adds the scheduled task to support Watch-DbaUpdate.", "Tags": "Module", + "Synopsis": "Adds the scheduled task to support Watch-DbaUpdate.", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Install-DbaWatchUpdate", + "Availability": "Windows only", + "Links": "https://dbatools.io/Install-DbaWatchUpdate", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eInstall-DbaWatchUpdate\nAdds the scheduled task needed by Watch-DbaUpdate\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eInstall-DbaWatchUpdate -TaskName MyScheduledTask\nWill create the scheduled task as the name MyScheduledTask", "Params": [ [ "TaskName", @@ -21074,22 +21784,23 @@ "" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Adds the scheduled task to support Watch-DbaUpdate.", - "Name": "Install-DbaWatchUpdate", - "Links": "https://dbatools.io/Install-DbaWatchUpdate", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eInstall-DbaWatchUpdate\nAdds the scheduled task needed by Watch-DbaUpdate\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eInstall-DbaWatchUpdate -TaskName MyScheduledTask\nWill create the scheduled task as the name MyScheduledTask", "Syntax": "Install-DbaWatchUpdate [[-TaskName] \u003cString\u003e] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Install-DbaWhoIsActive", + "Name": "Install-DbaWhoIsActive", "Description": "This command downloads, extracts and installs sp_WhoisActive with Adam\u0027s permission. To read more about sp_WhoisActive, please visit http://whoisactive.com and http://sqlblog.com/blogs/adam_machanic/archive/tags/who+is+active/default.aspx\n\nPlease consider donating to Adam if you find this stored procedure helpful: http://tinyurl.com/WhoIsActiveDonate\n\nNote that you will be prompted a bunch of times to confirm an action.", "Tags": [ "AdamMechanic", "WhoIsActive", "SpWhoIsActive" ], + "Synopsis": "Automatically installs or updates sp_WhoisActive by Adam Machanic.", + "Alias": "Install-SqlWhoIsActive", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Install-DbaWhoIsActive", + "Availability": "Windows only", + "Links": "https://dbatools.io/Install-DbaWhoIsActive", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eInstall-DbaWhoIsActive -SqlInstance sqlserver2014a -Database master\nDownloads sp_WhoisActive from the internet and installs to sqlserver2014a\u0027s master database. Connects to SQL Server using Windows Authentication.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eInstall-DbaWhoIsActive -SqlInstance sqlserver2014a -SqlCredential $cred\nPops up a dialog box asking which database on sqlserver2014a you want to install the procedure into. Connects to SQL Server using SQL Authentication.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eInstall-DbaWhoIsActive -SqlInstance sqlserver2014a -Database master -LocalFile c:\\SQLAdmin\\whoisactive_install.sql\nInstalls sp_WhoisActive to sqlserver2014a\u0027s master database from the local file whoisactive_install.sql\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003e$instances = Get-DbaCmsRegServer sqlserver\nPS C:\\\u003e Install-DbaWhoIsActive -SqlInstance $instances -Database master\nInstalls sp_WhoisActive to all servers within CMS", "Params": [ [ "SqlInstance", @@ -21156,21 +21867,22 @@ "" ] ], - "Alias": "Install-SqlWhoIsActive", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Automatically installs or updates sp_WhoisActive by Adam Machanic.", - "Name": "Install-DbaWhoIsActive", - "Links": "https://dbatools.io/Install-DbaWhoIsActive", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eInstall-DbaWhoIsActive -SqlInstance sqlserver2014a -Database master\nDownloads sp_WhoisActive from the internet and installs to sqlserver2014a\u0027s master database. Connects to SQL Server using Windows Authentication.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eInstall-DbaWhoIsActive -SqlInstance sqlserver2014a -SqlCredential $cred\nPops up a dialog box asking which database on sqlserver2014a you want to install the procedure into. Connects to SQL Server using SQL Authentication.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eInstall-DbaWhoIsActive -SqlInstance sqlserver2014a -Database master -LocalFile c:\\SQLAdmin\\whoisactive_install.sql\nInstalls sp_WhoisActive to sqlserver2014a\u0027s master database from the local file whoisactive_install.sql\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003e$instances = Get-DbaCmsRegServer sqlserver\nPS C:\\\u003e Install-DbaWhoIsActive -SqlInstance $instances -Database master\nInstalls sp_WhoisActive to all servers within CMS", "Syntax": "Install-DbaWhoIsActive [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [-SqlCredential \u003cPSCredential\u003e] [-LocalFile \u003cString\u003e] [-Database \u003cObject\u003e] [-EnableException] [-Force] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Invoke-DbaAdvancedRestore", + "Name": "Invoke-DbaAdvancedRestore", "Description": "This is the final piece in the Restore-DbaDatabase Stack. Usually a BackupHistory object will arrive here from `Restore-Dbadatabase` via the following pipeline:\n`Get-DbaBackupInformation | Select-DbaBackupInformation | Format-DbaBackupInformation | Test-DbaBackupInformation | Invoke-DbaAdvancedRestore`\n\nWe have exposed these functions publicly to allow advanced users to perform operations that we don\u0027t support, or won\u0027t add as they would make things too complex for the majority of our users\n\nFor example if you wanted to do some very complex redirection during a migration, then doing the rewrite of destinations may be better done with your own custom scripts rather than via `Format-DbaBackupInformation`\n\nWe would recommend ALWAYS pushing your input through `Test-DbaBackupInformation` just to make sure that it makes sense to us.", "Tags": [ "Restore", "Backup" ], + "Synopsis": "Allows the restore of modified BackupHistory Objects\nFor 90% of users Restore-DbaDatabase should be your point of access to this function. The other 10% use it at their own risk", + "Alias": "", + "Author": "Stuart Moore (@napalmgram - http://stuart-moore.com)", + "CommandName": "Invoke-DbaAdvancedRestore", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Invoke-DbaAdvancedRestore", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003e$BackupHistory | Invoke-DbaAdvancedRestore -SqlInstance MyInstance\nWill restore all the backups in the BackupHistory object according to the transformations it contains\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003e$BackupHistory | Invoke-DbaAdvancedRestore -SqlInstance MyInstance -OutputScriptOnly\nPS C:\\\u003e $BackupHistory | Invoke-DbaAdvancedRestore -SqlInstance MyInstance\nFirst generates just the T-SQL restore scripts so they can be sanity checked, and then if they are good perform the full restore.\r\nBy reusing the BackupHistory object there is no need to rescan all the backup files again", "Params": [ [ "BackupHistory", @@ -21325,22 +22037,100 @@ "" ] ], - "Alias": "", - "Author": "Stuart Moore (@napalmgram - http://stuart-moore.com)", - "Synopsis": "Allows the restore of modified BackupHistory Objects\nFor 90% of users Restore-DbaDatabase should be your point of access to this function. The other 10% use it at their own risk", - "Name": "Invoke-DbaAdvancedRestore", - "Links": "https://dbatools.io/Invoke-DbaAdvancedRestore", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003e$BackupHistory | Invoke-DbaAdvancedRestore -SqlInstance MyInstance\nWill restore all the backups in the BackupHistory object according to the transformations it contains\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003e$BackupHistory | Invoke-DbaAdvancedRestore -SqlInstance MyInstance -OutputScriptOnly\nPS C:\\\u003e $BackupHistory | Invoke-DbaAdvancedRestore -SqlInstance MyInstance\nFirst generates just the T-SQL restore scripts so they can be sanity checked, and then if they are good perform the full restore.\r\nBy reusing the BackupHistory object there is no need to rescan all the backup files again", "Syntax": "Invoke-DbaAdvancedRestore [-BackupHistory] \u003cObject[]\u003e [[-SqlInstance] \u003cDbaInstanceParameter\u003e] [[-SqlCredential] \u003cPSCredential\u003e] [-OutputScriptOnly] [-VerifyOnly] [[-RestoreTime] \u003cDateTime\u003e] [[-StandbyDirectory] \u003cString\u003e] [-NoRecovery] [[-MaxTransferSize] \u003cInt32\u003e] [[-BlockSize] \u003cInt32\u003e] [[-BufferCount] \u003cInt32\u003e] [-Continue] [[-AzureCredential] \u003cString\u003e] [-WithReplace] [-KeepCDC] [[-PageRestore] \u003cObject[]\u003e] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Invoke-DbaAgFailover", + "Name": "Invoke-DbaAdvancedUpdate", + "Description": "Invokes an update process for a single computer and restarts it if needed", + "Synopsis": "Designed for internal use, implements parallel execution for Update-DbaInstance.", + "Alias": "", + "CommandName": "Invoke-DbaAdvancedUpdate", + "Availability": "Windows only", + "Links": null, + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eInvoke-DbaAdvancedUpdate -ComputerName SQL1 -Action $actions\nInvokes update actions on SQL1 after restarting it.", + "Params": [ + [ + "ComputerName", + "Target computer with SQL instance or instances.", + "", + false, + "false", + "" + ], + [ + "Action", + "An object containing the action plan", + "", + false, + "false", + "" + ], + [ + "Restart", + "Restart computer automatically after a successful installation of a patch and wait until it comes back online.\r\nUsing this parameter is the only way to chain-install more than 1 patch on a computer, since every single patch will require a restart of said computer.", + "", + false, + "false", + "False" + ], + [ + "Authentication", + "Chooses an authentication protocol for remote connections.\r\nIf the protocol fails to establish a connection\nDefaults:\r\n* CredSSP when -Credential is specified - due to the fact that repository Path is usually a network share and credentials need to be passed to the remote host\r\n to avoid the double-hop issue.\r\n* Default when -Credential is not specified. Will likely fail if a network path is specified.", + "", + false, + "false", + "Credssp" + ], + [ + "Credential", + "Windows Credential with permission to log on to the remote server.\r\nMust be specified for any remote connection if update Repository is located on a network folder.", + "", + false, + "false", + "" + ], + [ + "EnableException", + "By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message.\r\nThis avoids overwhelming you with \"sea of red\" exceptions, but is inconvenient because it basically disables advanced scripting.\r\nUsing this switch turns this \"nice by default\" feature off and enables you to catch exceptions with your own try/catch.", + "", + false, + "false", + "False" + ], + [ + "WhatIf", + "Shows what would happen if the command were to run. No actions are actually performed.", + "wi", + false, + "false", + "" + ], + [ + "Confirm", + "Prompts you for confirmation before executing any changing operations within the command.", + "cf", + false, + "false", + "" + ] + ], + "Syntax": "Invoke-DbaAdvancedUpdate [[-ComputerName] \u003cString\u003e] [[-Action] \u003cObject[]\u003e] [[-Restart] \u003cBoolean\u003e] [[-Authentication] \u003cString\u003e] [[-Credential] \u003cPSCredential\u003e] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" + }, + { + "Name": "Invoke-DbaAgFailover", "Description": "Failover an availability group.", "Tags": [ "AG", "AvailabilityGroup", "HA" ], + "Synopsis": "Failover an availability group.", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Invoke-DbaAgFailover", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Invoke-DbaAgFailover", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eInvoke-DbaAgFailover -SqlInstance sql2017 -AvailabilityGroup SharePoint\nSafely (no potential data loss) fails over the SharePoint AG to sql2017. Prompts for confirmation.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaAvailabilityGroup -SqlInstance sql2017 | Out-GridView -Passthru | Invoke-DbaAgFailover -Confirm:$false\nSafely (no potential data loss) fails over the selected availability groups to sql2017. Does not prompt for confirmation.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eInvoke-DbaAgFailover -SqlInstance sql2017 -AvailabilityGroup SharePoint -Force\nForcefully (with potential data loss) fails over the SharePoint AG to sql2017. Prompts for confirmation.", "Params": [ [ "SqlInstance", @@ -21407,16 +22197,10 @@ "" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Failover an availability group.", - "Name": "Invoke-DbaAgFailover", - "Links": "https://dbatools.io/Invoke-DbaAgFailover", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eInvoke-DbaAgFailover -SqlInstance sql2017 -AvailabilityGroup SharePoint\nSafely (no potential data loss) fails over the SharePoint AG to sql2017. Prompts for confirmation.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaAvailabilityGroup -SqlInstance sql2017 | Out-GridView -Passthru | Invoke-DbaAgFailover -Confirm:$false\nSafely (no potential data loss) fails over the selected availability groups to sql2017. Does not prompt for confirmation.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eInvoke-DbaAgFailover -SqlInstance sql2017 -AvailabilityGroup SharePoint -Force\nForcefully (with potential data loss) fails over the SharePoint AG to sql2017. Prompts for confirmation.", "Syntax": "Invoke-DbaAgFailover [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [[-AvailabilityGroup] \u003cString[]\u003e] [[-InputObject] \u003cAvailabilityGroup[]\u003e] [-Force] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Invoke-DbaBalanceDataFiles", + "Name": "Invoke-DbaBalanceDataFiles", "Description": "When you have a large database with a single data file and add another file, SQL Server will only use the new file until it\u0027s about the same size.\nYou may want to balance the data between all the data files.\n\nThe function will check the server version and edition to see if the it allows for online index rebuilds.\nIf the server does support it, it will try to rebuild the index online.\nIf the server doesn\u0027t support it, it will rebuild the index offline. Be carefull though, this can cause downtime\n\nThe tables must have a clustered index to be able to balance out the data.\nThe function does NOT yet support heaps.\n\nThe function will also check if the file groups are subject to balance out.\nA file group whould have at least have 2 data files and should be writable.\nIf a table is within such a file group it will be subject for processing. If not the table will be skipped.", "Tags": [ "Database", @@ -21424,6 +22208,13 @@ "File", "Space" ], + "Synopsis": "Re-balance data between data files", + "Alias": "", + "Author": "Sander Stad (@sqlstad), sqlstad.nl", + "CommandName": "Invoke-DbaBalanceDataFiles", + "Availability": "Windows, Linux, macOS", + "Links": null, + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eInvoke-DbaBalanceDataFiles -SqlInstance sql1 -Database db1\nThis command will distribute the data in database db1 on instance sql1\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eInvoke-DbaBalanceDataFiles -SqlInstance sql1 -Database db1 | Select-Object -ExpandProperty DataFilesEnd\nThis command will distribute the data in database db1 on instance sql1\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eInvoke-DbaBalanceDataFiles -SqlInstance sql1 -Database db1 -Table table1,table2,table5\nThis command will distribute the data for only the tables table1,table2 and table5\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eInvoke-DbaBalanceDataFiles -SqlInstance sql1 -Database db1 -RebuildOffline\nThis command will consider the fact that there might be a SQL Server edition that does not support online rebuilds of indexes.\r\nBy supplying this parameter you give permission to do the rebuilds offline if the edition does not support it.", "Params": [ [ "SqlInstance", @@ -21498,21 +22289,22 @@ "" ] ], - "Alias": "", - "Author": "Sander Stad (@sqlstad), sqlstad.nl", - "Synopsis": "Re-balance data between data files", - "Name": "Invoke-DbaBalanceDataFiles", - "Links": null, - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eInvoke-DbaBalanceDataFiles -SqlInstance sql1 -Database db1\nThis command will distribute the data in database db1 on instance sql1\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eInvoke-DbaBalanceDataFiles -SqlInstance sql1 -Database db1 | Select-Object -ExpandProperty DataFilesEnd\nThis command will distribute the data in database db1 on instance sql1\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eInvoke-DbaBalanceDataFiles -SqlInstance sql1 -Database db1 -Table table1,table2,table5\nThis command will distribute the data for only the tables table1,table2 and table5\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eInvoke-DbaBalanceDataFiles -SqlInstance sql1 -Database db1 -RebuildOffline\nThis command will consider the fact that there might be a SQL Server edition that does not support online rebuilds of indexes.\r\nBy supplying this parameter you give permission to do the rebuilds offline if the edition does not support it.", "Syntax": "Invoke-DbaBalanceDataFiles [-SqlCredential \u003cPSCredential\u003e] [-Database \u003cObject[]\u003e] [-Table \u003cObject[]\u003e] [-RebuildOffline] [-EnableException] [-Force] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]\nInvoke-DbaBalanceDataFiles -SqlInstance \u003cDbaInstanceParameter[]\u003e [-SqlCredential \u003cPSCredential\u003e] [-Database \u003cObject[]\u003e] [-Table \u003cObject[]\u003e] [-RebuildOffline] [-EnableException] [-Force] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Invoke-DbaCycleErrorLog", + "Name": "Invoke-DbaCycleErrorLog", "Description": "Cycles the current error log for the instance (SQL Server) and/or SQL Server Agent.", "Tags": [ "Log", "Cycle" ], + "Synopsis": "Cycles the current instance or agent log.", + "Alias": "", + "Author": "Shawn Melton (@wsmelton), https://wsmelton.github.io", + "CommandName": "Invoke-DbaCycleErrorLog", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Invoke-DbaCycleLog", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eInvoke-DbaCycleLog -SqlInstance sql2016 -Type agent\nCycles the current error log for the SQL Server Agent on SQL Server instance sql2016\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eInvoke-DbaCycleLog -SqlInstance sql2016 -Type instance\nCycles the current error log for the SQL Server instance on SQL Server instance sql2016\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eInvoke-DbaCycleLog -SqlInstance sql2016\nCycles the current error log for both SQL Server instance and SQL Server Agent on SQL Server instance sql2016", "Params": [ [ "SqlInstance", @@ -21563,18 +22355,430 @@ "" ] ], - "Alias": "", - "Author": "Shawn Melton (@wsmelton), https://wsmelton.github.io", - "Synopsis": "Cycles the current instance or agent log.", - "Name": "Invoke-DbaCycleErrorLog", - "Links": "https://dbatools.io/Invoke-DbaCycleLog", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eInvoke-DbaCycleLog -SqlInstance sql2016 -Type agent\nCycles the current error log for the SQL Server Agent on SQL Server instance sql2016\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eInvoke-DbaCycleLog -SqlInstance sql2016 -Type instance\nCycles the current error log for the SQL Server instance on SQL Server instance sql2016\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eInvoke-DbaCycleLog -SqlInstance sql2016\nCycles the current error log for both SQL Server instance and SQL Server Agent on SQL Server instance sql2016", - "Syntax": "Invoke-DbaCycleErrorLog [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [[-Type] \u003cString\u003e] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" + "Syntax": "Invoke-DbaCycleErrorLog [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [[-Type] \u003cString\u003e] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" + }, + { + "Name": "Invoke-DbaDbccDropCleanBuffer", + "Description": "Allows execution of Database Console Command DBCC DROPCLEANBUFFERS\n\nRemoves all clean buffers from the buffer pool, and columnstore objects from the columnstore object pool.\n\nRead more:\n - https://docs.microsoft.com/en-us/sql/t-sql/database-console-commands/dbcc-dropcleanbuffers-transact-sql", + "Tags": "DBCC", + "Synopsis": "Execution of Database Console Command DBCC DROPCLEANBUFFERS", + "Alias": "", + "Author": "Patrick Flynn (@sqllensman)", + "CommandName": "Invoke-DbaDbccDropCleanBuffer", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Invoke-DbaDbccDropCleanBuffer", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eInvoke-DbaDbccDropCleanBuffer -SqlInstance SqlServer2017\nRuns the command DBCC DROPCLEANBUFFERS against the instance SqlServer2017 using Windows Authentication\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eInvoke-DbaDbccDropCleanBuffer -SqlInstance SqlServer2017 -NoInformationalMessages\nRuns the command DBCC DROPCLEANBUFFERS WITH NO_INFOMSGS against the instance SqlServer2017 using Windows Authentication\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003e\u0027Sql1\u0027,\u0027Sql2/sqlexpress\u0027 | Invoke-DbaDbccDropCleanBuffer -WhatIf\nDisplays what will happen if command DBCC DROPCLEANBUFFERS is called against Sql1 and Sql2/sqlexpress\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003e$cred = Get-Credential sqladmin\nPS C:\\\u003e Invoke-DbaDbccDropCleanBuffer -SqlInstance Server1 -SqlCredential $cred\nConnects using sqladmin credential and executes command DBCC DROPCLEANBUFFERS for instance Server1", + "Params": [ + [ + "SqlInstance", + "The target SQL Server instance or instances.", + "", + true, + "true (ByValue)", + "" + ], + [ + "SqlCredential", + "Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential)", + "", + false, + "false", + "" + ], + [ + "NoInformationalMessages", + "Suppresses all informational messages.", + "", + false, + "false", + "False" + ], + [ + "EnableException", + "By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message.\r\nThis avoids overwhelming you with \"sea of red\" exceptions, but is inconvenient because it basically disables advanced scripting.\r\nUsing this switch turns this \"nice by default\" feature off and enables you to catch exceptions with your own try/catch.", + "", + false, + "false", + "False" + ], + [ + "WhatIf", + "Shows what would happen if the cmdlet runs. The cmdlet is not run.", + "wi", + false, + "false", + "" + ], + [ + "Confirm", + "Prompts you for confirmation before running the cmdlet.", + "cf", + false, + "false", + "" + ] + ], + "Syntax": "Invoke-DbaDbccDropCleanBuffer [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [-NoInformationalMessages] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" + }, + { + "Name": "Invoke-DbaDbccFreeCache", + "Description": "Allows execution of Database Console Commands that act at Server Level to clear Memory caches\n\nAllows execution of the following commands\n DBCC FREEPROCCACHE\n DBCC FREESESSIONCACHE\n DBCC FREESYSTEMCACHE\n\nRead more:\n - https://docs.microsoft.com/en-us/sql/t-sql/database-console-commands/dbcc-freeproccache-transact-sql\n - https://docs.microsoft.com/en-us/sql/t-sql/database-console-commands/dbcc-freesessioncache-transact-sql\n - https://docs.microsoft.com/en-us/sql/t-sql/database-console-commands/dbcc-freesystemcache-transact-sql", + "Tags": "DBCC", + "Synopsis": "Execution of Database Console Commands that clear Server level Memory caches", + "Alias": "", + "Author": "Patrick Flynn (@sqllensman)", + "CommandName": "Invoke-DbaDbccFreeCache", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Invoke-DbaDbccFreeCache", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eInvoke-DbaDbccFreeCache -SqlInstance SqlServer2017 -Operation FREEPROCCACHE\nRuns the command DBCC FREEPROCCACHE against the instance SqlServer2017 using Windows Authentication\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eInvoke-DbaDbccFreeCache -SqlInstance SqlServer2017 -Operation FREESESSIONCACHE -NoInformationalMessages\nRuns the command DBCC FREESESSIONCACHE WITH NO_INFOMSGS against the instance SqlServer2017 using Windows Authentication\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eInvoke-DbaDbccFreeCache -SqlInstance SqlServer2017 -Operation FREESYSTEMCACHE -NoInformationalMessages\nRuns the command DBCC FREESYSTEMCACHE WITH NO_INFOMSGS against the instance SqlServer2017 using Windows Authentication\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eInvoke-DbaDbccFreeCache -SqlInstance SqlServer2017 -Operation FREEPROCCACHE -InputValue 0x060006001ECA270EC0215D05000000000000000000000000\nRemove a specific plan with plan_handle 0x060006001ECA270EC0215D05000000000000000000000000 from the cache via the command DBCC FREEPROCCACHE(0x060006001ECA270EC0215D05000000000000000000000000) \r\nagainst the instance SqlServer2017 using Windows Authentication\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eInvoke-DbaDbccFreeCache -SqlInstance SqlServer2017 -Operation FREEPROCCACHE -InputValue default\nRuns the command DBCC FREEPROCCACHE(\u0027default\u0027) against the instance SqlServer2017 using Windows Authentication. This clears all cache entries associated with a resource pool \u0027default\u0027.\n-------------------------- EXAMPLE 6 --------------------------\nPS C:\\\u003eInvoke-DbaDbccFreeCache -SqlInstance SqlServer2017 -Operation FREESYSTEMCACHE -InputValue default\nRuns the command DBCC FREESYSTEMCACHE (\u0027ALL\u0027, default) against the instance SqlServer2017 using Windows Authentication. This will clean all the caches with entries specific to the resource pool named \r\n\"default\".\n-------------------------- EXAMPLE 7 --------------------------\nPS C:\\\u003eInvoke-DbaDbccFreeCache -SqlInstance SqlServer2017 -Operation FREESYSTEMCACHE -InputValue default -MarkInUseForRemoval\nRuns the command DBCC FREESYSTEMCACHE (\u0027ALL\u0027, default) WITH MARK_IN_USE_FOR_REMOVAL against the instance SqlServer2017 using Windows Authentication. This will to release entries once the entries \r\nbecome unused for all the caches with entries specific to the resource pool named \"default\".", + "Params": [ + [ + "SqlInstance", + "The target SQL Server instance or instances.", + "", + true, + "true (ByValue)", + "" + ], + [ + "SqlCredential", + "Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential)", + "", + false, + "false", + "" + ], + [ + "Operation", + "DBCC Operation to Perform - Supports specific set of operations", + "", + false, + "false", + "FreeProcCache" + ], + [ + "InputValue", + "Value used for Operation - meaning depends on Operation\r\nDBCC FREEPROCCACHE accepts\r\n a plan_handle of type varbinary(64)\r\n a sql_handle of type varbinary(64)\r\n or the name of a Resource Governor resource pool of type sysname\r\n If blank then clears all elements from the plan cache\r\nDBCC FREESYSTEMCACHE accepts\r\n \u0027ALL\u0027 for ALL specifies all supported caches\r\n or name of a Resource Governor pool cache\r\nNot required for other values", + "", + false, + "false", + "" + ], + [ + "NoInformationalMessages", + "Suppresses all informational messages.", + "", + false, + "false", + "False" + ], + [ + "MarkInUseForRemoval", + "Used when Operation = DBCC FREESYSTEMCACHE\r\nAsynchronously frees currently used entries from their respective caches after they become unused", + "", + false, + "false", + "False" + ], + [ + "EnableException", + "By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message.\r\nThis avoids overwhelming you with \"sea of red\" exceptions, but is inconvenient because it basically disables advanced scripting.\r\nUsing this switch turns this \"nice by default\" feature off and enables you to catch exceptions with your own try/catch.", + "", + false, + "false", + "False" + ], + [ + "WhatIf", + "Shows what would happen if the cmdlet runs. The cmdlet is not run.", + "wi", + false, + "false", + "" + ], + [ + "Confirm", + "Prompts you for confirmation before running the cmdlet.", + "cf", + false, + "false", + "" + ] + ], + "Syntax": "Invoke-DbaDbccFreeCache [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [[-Operation] \u003cString\u003e] [[-InputValue] \u003cString\u003e] [-NoInformationalMessages] [-MarkInUseForRemoval] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" + }, + { + "Name": "Invoke-DbaDbClone", + "Description": "Clones a database schema and statistics.\n\nThis can be useful for testing query performance without requiring all the space needed for the data in the database.\n\nRead more:\n - https://sqlperformance.com/2016/08/sql-statistics/expanding-dbcc-clonedatabase\n - https://support.microsoft.com/en-us/help/3177838/how-to-use-dbcc-clonedatabase-to-generate-a-schema-and-statistics-only\n\nThanks to Microsoft Tiger Team for the code and idea https://github.com/Microsoft/tigertoolbox/", + "Tags": [ + "Statistics", + "Performance", + "Clone" + ], + "Synopsis": "Clones a database schema and statistics", + "Alias": "Invoke-DbaDatabaseClone", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Invoke-DbaDbClone", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Invoke-DbaDbClone", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eInvoke-DbaDbClone -SqlInstance sql2016 -Database mydb -CloneDatabase myclone\nClones mydb to myclone on sql2016\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaDatabase -SqlInstance sql2016 -Database mydb | Invoke-DbaDbClone -CloneDatabase myclone, myclone2 -UpdateStatistics\nUpdates the statistics of mydb then clones to myclone and myclone2", + "Params": [ + [ + "SqlInstance", + "The target SQL Server instance or instances.", + "", + false, + "false", + "" + ], + [ + "SqlCredential", + "Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential)", + "", + false, + "false", + "" + ], + [ + "Database", + "The database to clone - this list is auto-populated from the server.", + "", + false, + "false", + "" + ], + [ + "InputObject", + "Enables piping from Get-DbaDatabase", + "", + false, + "true (ByValue)", + "" + ], + [ + "CloneDatabase", + "The name(s) to clone to.", + "", + false, + "false", + "" + ], + [ + "ExcludeStatistics", + "Exclude the statistics in the cloned database", + "", + false, + "false", + "False" + ], + [ + "ExcludeQueryStore", + "Exclude the QueryStore data in the cloned database", + "", + false, + "false", + "False" + ], + [ + "UpdateStatistics", + "Update the statistics prior to cloning (per Microsoft Tiger Team formula)", + "", + false, + "false", + "False" + ], + [ + "EnableException", + "By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message.\r\nThis avoids overwhelming you with \"sea of red\" exceptions, but is inconvenient because it basically disables advanced scripting.\r\nUsing this switch turns this \"nice by default\" feature off and enables you to catch exceptions with your own try/catch.", + "", + false, + "false", + "False" + ], + [ + "WhatIf", + "Shows what would happen if the command were to run. No actions are actually performed.", + "wi", + false, + "false", + "" + ], + [ + "Confirm", + "Prompts you for confirmation before executing any changing operations within the command.", + "cf", + false, + "false", + "" + ] + ], + "Syntax": "Invoke-DbaDbClone [[-SqlInstance] \u003cDbaInstanceParameter[]\u003e] [[-SqlCredential] \u003cPSCredential\u003e] [[-Database] \u003cString[]\u003e] [[-InputObject] \u003cDatabase[]\u003e] [[-CloneDatabase] \u003cString[]\u003e] [-ExcludeStatistics] [-ExcludeQueryStore] [-UpdateStatistics] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" + }, + { + "Name": "Invoke-DbaDbDataMasking", + "Description": "TMasks data by using randomized values determined by a configuration file and a randomizer framework\n\nIt will use a configuration file that can be made manually or generated using New-DbaDbMaskingConfig\n\nNote that the following column and data types are not currently supported:\nIdentity\nForeignKey\nComputed\nHierarchyid\nGeography\nGeometry\nXml", + "Tags": [ + "DataMasking", + "Database" + ], + "Synopsis": "Masks data by using randomized values determined by a configuration file and a randomizer framework", + "Alias": "", + "Author": "Sander Stad (@sqlstad, sqlstad.nl) | Chrissy LeMaire (@cl, netnerds.net)", + "CommandName": "Invoke-DbaDbDataMasking", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Invoke-DbaDbDataMasking", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eInvoke-DbaDbDataMasking -SqlInstance SQLDB2 -Database DB1 -FilePath C:\\Temp\\sqldb1.db1.tables.json\nApply the data masking configuration from the file \"sqldb1.db1.tables.json\" to the db1 database on sqldb2. Prompt for confirmation for each table.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-ChildItem -Path C:\\Temp\\sqldb1.db1.tables.json | Invoke-DbaDbDataMasking -SqlInstance SQLDB2 -Database DB1 -Confirm:$false\nApply the data masking configuration from the file \"sqldb1.db1.tables.json\" to the db1 database on sqldb2. Do not prompt for confirmation.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eNew-DbaDbMaskingConfig -SqlInstance SQLDB1 -Database DB1 -Path C:\\Temp\\clone -OutVariable file\n$file | Invoke-DbaDbDataMasking -SqlInstance SQLDB2 -Database DB1 -Confirm:$false\nCreate the data masking configuration file \"sqldb1.db1.tables.json\", then use it to mask the db1 database on sqldb2. Do not prompt for confirmation.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-ChildItem -Path C:\\Temp\\sqldb1.db1.tables.json | Invoke-DbaDbDataMasking -SqlInstance SQLDB2, sqldb3 -Database DB1 -Confirm:$false\nSee what would happen if you the data masking configuration from the file \"sqldb1.db1.tables.json\" to the db1 database on sqldb2 and sqldb3. Do not prompt for confirmation.", + "Params": [ + [ + "SqlInstance", + "The target SQL Server instance or instances.", + "", + false, + "false", + "" + ], + [ + "SqlCredential", + "Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential)", + "", + false, + "false", + "" + ], + [ + "Database", + "Databases to process through", + "", + false, + "false", + "" + ], + [ + "FilePath", + "Configuration file that contains the which tables and columns need to be masked", + "Path,FullName", + true, + "true (ByValue)", + "" + ], + [ + "Locale", + "Set the local to enable certain settings in the masking", + "", + false, + "false", + "en" + ], + [ + "CharacterString", + "The characters to use in string data. \u0027abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\u0027 by default", + "", + false, + "false", + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" + ], + [ + "Table", + "Tables to process. By default all the tables will be processed", + "", + false, + "false", + "" + ], + [ + "Column", + "Columns to process. By default all the columns will be processed", + "", + false, + "false", + "" + ], + [ + "ExcludeTable", + "Exclude specific tables even if it\u0027s listed in the config file.", + "", + false, + "false", + "" + ], + [ + "ExcludeColumn", + "Exclude specific columns even if it\u0027s listed in the config file.", + "", + false, + "false", + "" + ], + [ + "Query", + "If you would like to mask only a subset of a table, use the Query parameter, otherwise all data will be masked.", + "", + false, + "false", + "" + ], + [ + "MaxValue", + "Force a max length of strings instead of relying on datatype maxes. Note if a string datatype has a lower MaxValue, that will be used instead.\nUseful for adhoc updates and testing, otherwise, the config file should be used.", + "", + false, + "false", + "0" + ], + [ + "ModulusFactor", + "Calculating the next nullable by using the remainder from the modulus. Default is every 10.", + "", + false, + "false", + "10" + ], + [ + "ExactLength", + "Mask string values to the same length. So \u0027Tate\u0027 will be replaced with 4 random characters.", + "", + false, + "false", + "False" + ], + [ + "EnableException", + "By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message.\r\nThis avoids overwhelming you with \"sea of red\" exceptions, but is inconvenient because it basically disables advanced scripting.\r\nUsing this switch turns this \"nice by default\" feature off and enables you to catch exceptions with your own try/catch.", + "", + false, + "false", + "False" + ], + [ + "WhatIf", + "If this switch is enabled, no actions are performed but informational messages will be displayed that explain what would happen if the command were to run.", + "wi", + false, + "false", + "" + ], + [ + "Confirm", + "If this switch is enabled, you will be prompted for confirmation before executing any operations that change state.", + "cf", + false, + "false", + "" + ] + ], + "Syntax": "Invoke-DbaDbDataMasking [[-SqlInstance] \u003cDbaInstanceParameter[]\u003e] [[-SqlCredential] \u003cPSCredential\u003e] [[-Database] \u003cString[]\u003e] [-FilePath] \u003cObject\u003e [[-Locale] \u003cString\u003e] [[-CharacterString] \u003cString\u003e] [[-Table] \u003cString[]\u003e] [[-Column] \u003cString[]\u003e] [[-ExcludeTable] \u003cString[]\u003e] [[-ExcludeColumn] \u003cString[]\u003e] [[-Query] \u003cString\u003e] [[-MaxValue] \u003cInt32\u003e] [[-ModulusFactor] \u003cInt32\u003e] [-ExactLength] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Invoke-DbaDbccFreeCache", - "Description": "Allows execution of Database Console Commands that act at Server Level to clear Memory caches\n\nAllows execution of the following commands\n DBCC FREEPROCCACHE\n DBCC FREESESSIONCACHE\n DBCC FREESYSTEMCACHE\n\nRead more:\n - https://docs.microsoft.com/en-us/sql/t-sql/database-console-commands/dbcc-freeproccache-transact-sql\n - https://docs.microsoft.com/en-us/sql/t-sql/database-console-commands/dbcc-freesessioncache-transact-sql\n - https://docs.microsoft.com/en-us/sql/t-sql/database-console-commands/dbcc-freesystemcache-transact-sql", + "Name": "Invoke-DbaDbDbccCheckConstraint", + "Description": "Executes the command DBCC CHECKCONSTRAINTS and returns results\n\nReports and corrects pages and row count inaccuracies in the catalog views.\nThese inaccuracies may cause incorrect space usage reports returned by the sp_spaceused system stored procedure.\n\nRead more:\n - https://docs.microsoft.com/en-us/sql/t-sql/database-console-commands/dbcc-checkconstraints-transact-sql", "Tags": "DBCC", + "Synopsis": "Execution of Database Console Command DBCC CHECKCONSTRAINTS", + "Alias": "", + "Author": "Patrick Flynn (@sqllensman)", + "CommandName": "Invoke-DbaDbDbccCheckConstraint", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Invoke-DbaDbDbccCheckConstraint", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eInvoke-DbaDbDbccCheckConstraint -SqlInstance SqlServer2017\nRuns the command DBCC CHECKCONSTRAINTS to check all enabled constraints on all tables for all databases for the instance SqlServer2017. Connect using Windows Authentication\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eInvoke-DbaDbDbccCheckConstraint -SqlInstance SqlServer2017 -Database CurrentDB\nConnect to instance SqlServer2017 using Windows Authentication and run the command DBCC CHECKCONSTRAINTS to check all enabled constraints on all tables in the CurrentDB database.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eInvoke-DbaDbDbccCheckConstraint -SqlInstance SqlServer2017 -Database CurrentDB -Object Sometable\nConnects to CurrentDB on instance SqlServer2017 using Windows Authentication and runs the command DBCC CHECKCONSTRAINTS(SometableId) to check all enabled constraints in the table.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eInvoke-DbaDbDbccCheckConstraint -SqlInstance SqlServer2017 -Database CurrentDB -Object ConstraintId\nConnects to CurrentDB on instance SqlServer2017 using Windows Authentication and runs the command DBCC CHECKCONSTRAINTS(ConstraintId) to check the constraint with constraint_id = ConstraintId.\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003e$cred = Get-Credential sqladmin\nPS C:\\\u003e Invoke-DbaDbDbccCheckConstraint -SqlInstance SqlServer2017 -SqlCredential $cred -Database CurrentDB -Object TableId -AllConstraints -AllErrorMessages -NoInformationalMessages\nConnects to CurrentDB on instance SqlServer2017 using sqladmin credential and runs the command DBCC CHECKCONSTRAINTS(TableId) WITH ALL_CONSTRAINTS, ALL_ERRORMSGS, NO_INFOMSGS to check all enabled and \r\ndisabled constraints on the table with able_id = TableId. Returns all rows that violate constraints.\n-------------------------- EXAMPLE 6 --------------------------\nPS C:\\\u003e\u0027Sql1\u0027,\u0027Sql2/sqlexpress\u0027 | Invoke-DbaDbDbccCheckConstraint -WhatIf\nDisplays what will happen if command DBCC CHECKCONSTRAINTS is called against all databses on Sql1 and Sql2/sqlexpress", "Params": [ [ "SqlInstance", @@ -21593,32 +22797,40 @@ "" ], [ - "Operation", - "DBCC Operation to Perform - Supports specific set of operations", + "Database", + "The database(s) to process - this list is auto-populated from the server. If unspecified, all databases will be processed.", "", false, "false", - "FreeProcCache" + "" ], [ - "InputValue", - "Value used for Operation - meaning depends on Operation\r\nDBCC FREEPROCCACHE accepts\r\n a plan_handle of type varbinary(64)\r\n a sql_handle of type varbinary(64)\r\n or the name of a Resource Governor resource pool of type sysname\r\n If blank then clears all elements from the plan cache\r\nDBCC FREESYSTEMCACHE accepts\r\n \u0027ALL\u0027 for ALL specifies all supported caches\r\n or name of a Resource Governor pool cache\r\nNot required for other values", + "Object", + "The table or constraint to be checked.\r\nWhen table_name or table_id is specified, all enabled constraints on that table are checked.\r\nWhen constraint_name or constraint_id is specified, only that constraint is checked.\r\nIf neither a table identifier nor a constraint identifier is specified, all enabled constraints on all tables in the current database are checked.", "", false, "false", "" ], [ - "NoInformationalMessages", - "Suppresses all informational messages.", + "AllConstraints", + "Checks all enabled and disabled constraints on the table if the table name is specified or if all tables are checked;\r\nOtherwise, checks only the enabled constraint.\r\nHas no effect when a constraint is specified", "", false, "false", "False" ], [ - "MarkInUseForRemoval", - "Used when Operation = DBCC FREESYSTEMCACHE\r\nAsynchronously frees currently used entries from their respective caches after they become unused", + "AllErrorMessages", + "Returns all rows that violate constraints in the table that is checked.\r\nThe default is the first 200 rows.", + "", + false, + "false", + "False" + ], + [ + "NoInformationalMessages", + "Suppresses all informational messages.", "", false, "false", @@ -21649,29 +22861,26 @@ "" ] ], - "Alias": "", - "Author": "Patrick Flynn (@sqllensman)", - "Synopsis": "Execution of Database Console Commands that clear Server level Memory caches", - "Name": "Invoke-DbaDbccFreeCache", - "Links": "https://dbatools.io/Invoke-DbaDbccFreeCache", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eInvoke-DbaDbccFreeCache -SqlInstance SqlServer2017 -Operation FREEPROCCACHE\nRuns the command DBCC FREEPROCCACHE against the instance SqlServer2017 using Windows Authentication\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eInvoke-DbaDbccFreeCache -SqlInstance SqlServer2017 -Operation FREESESSIONCACHE -NoInformationalMessages\nRuns the command DBCC FREESESSIONCACHE WITH NO_INFOMSGS against the instance SqlServer2017 using Windows Authentication\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eInvoke-DbaDbccFreeCache -SqlInstance SqlServer2017 -Operation FREESYSTEMCACHE -NoInformationalMessages\nRuns the command DBCC FREESYSTEMCACHE WITH NO_INFOMSGS against the instance SqlServer2017 using Windows Authentication\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eInvoke-DbaDbccFreeCache -SqlInstance SqlServer2017 -Operation FREEPROCCACHE -InputValue 0x060006001ECA270EC0215D05000000000000000000000000\nRemove a specific plan with plan_handle 0x060006001ECA270EC0215D05000000000000000000000000 from the cache via the command DBCC FREEPROCCACHE(0x060006001ECA270EC0215D05000000000000000000000000) \r\nagainst the instance SqlServer2017 using Windows Authentication\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eInvoke-DbaDbccFreeCache -SqlInstance SqlServer2017 -Operation FREEPROCCACHE -InputValue default\nRuns the command DBCC FREEPROCCACHE(\u0027default\u0027) against the instance SqlServer2017 using Windows Authentication. This clears all cache entries associated with a resource pool \u0027default\u0027.\n-------------------------- EXAMPLE 6 --------------------------\nPS C:\\\u003eInvoke-DbaDbccFreeCache -SqlInstance SqlServer2017 -Operation FREESYSTEMCACHE -InputValue default\nRuns the command DBCC FREESYSTEMCACHE (\u0027ALL\u0027, default) against the instance SqlServer2017 using Windows Authentication. This will clean all the caches with entries specific to the resource pool named \r\n\"default\".\n-------------------------- EXAMPLE 7 --------------------------\nPS C:\\\u003eInvoke-DbaDbccFreeCache -SqlInstance SqlServer2017 -Operation FREESYSTEMCACHE -InputValue default -MarkInUseForRemoval\nRuns the command DBCC FREESYSTEMCACHE (\u0027ALL\u0027, default) WITH MARK_IN_USE_FOR_REMOVAL against the instance SqlServer2017 using Windows Authentication. This will to release entries once the entries \r\nbecome unused for all the caches with entries specific to the resource pool named \"default\".", - "Syntax": "Invoke-DbaDbccFreeCache [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [[-Operation] \u003cString\u003e] [[-InputValue] \u003cString\u003e] [-NoInformationalMessages] [-MarkInUseForRemoval] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" + "Syntax": "Invoke-DbaDbDbccCheckConstraint [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [[-Database] \u003cString[]\u003e] [[-Object] \u003cString\u003e] [-AllConstraints] [-AllErrorMessages] [-NoInformationalMessages] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Invoke-DbaDbClone", - "Description": "Clones a database schema and statistics.\n\nThis can be useful for testing query performance without requiring all the space needed for the data in the database.\n\nRead more:\n - https://sqlperformance.com/2016/08/sql-statistics/expanding-dbcc-clonedatabase\n - https://support.microsoft.com/en-us/help/3177838/how-to-use-dbcc-clonedatabase-to-generate-a-schema-and-statistics-only\n\nThanks to Microsoft Tiger Team for the code and idea https://github.com/Microsoft/tigertoolbox/", - "Tags": [ - "Statistics", - "Performance", - "Clone" - ], + "Name": "Invoke-DbaDbDbccCleanTable", + "Description": "Executes the command DBCC CLEANTABLE against defined objects and returns results\n\nReclaims space from dropped variable-length columns in tables or indexed views\n\nRead more:\n - https://docs.microsoft.com/en-us/sql/t-sql/database-console-commands/dbcc-cleantable-transact-sql", + "Tags": "DBCC", + "Synopsis": "Execution of Database Console Command DBCC CLEANTABLE", + "Alias": "", + "Author": "Patrick Flynn (@sqllensman)", + "CommandName": "Invoke-DbaDbDbccCleanTable", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Invoke-DbaDbDbccCleanTable", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eInvoke-DbaDbDbccCleanTable -SqlInstance SqlServer2017 -Database CurrentDB -Object \u0027dbo.SomeTable\u0027\nConnects to CurrentDB on instance SqlServer2017 using Windows Authentication and runs the command DBCC CLEANTABLE(\u0027CurrentDB\u0027, \u0027dbo.SomeTable\u0027) to reclaim space after variable-length columns have \r\nbeen dropped.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eInvoke-DbaDbDbccCleanTable -SqlInstance SqlServer2017 -Database CurrentDB -Object 34636372 -BatchSize 5000\nConnects to CurrentDB on instance SqlServer2017 using Windows Authentication and runs the command DBCC CLEANTABLE(\u0027CurrentDB\u0027, 34636372, 5000) to reclaim space from table with Table_Id = 34636372 \r\nafter variable-length columns have been dropped.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003e$cred = Get-Credential sqladmin\nPS C:\\\u003e Invoke-DbaDbDbccCleanTable -SqlInstance SqlServer2017 -SqlCredential $cred -Database CurrentDB -Object \u0027dbo.SomeTable\u0027 -NoInformationalMessages\nConnects to CurrentDB on instance SqlServer2017 using sqladmin credential and runs the command DBCC CLEANTABLE(\u0027CurrentDB\u0027, \u0027dbo.SomeTable\u0027) WITH NO_INFOMSGS to reclaim space after variable-length \r\ncolumns have been dropped.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003e\u0027Sql1\u0027,\u0027Sql2/sqlexpress\u0027 | Invoke-DbaDbDbccCleanTable -Object \u0027dbo.SomeTable\u0027 -BatchSize 5000\nRuns the command DBCC CLEANTABLE(\u0027DatabaseName\u0027, \u0027dbo.SomeTable\u0027, 5000) against all databses on Sql1 and Sql2/sqlexpress", "Params": [ [ "SqlInstance", "The target SQL Server instance or instances.", "", - false, - "false", + true, + "true (ByValue)", "" ], [ @@ -21684,47 +22893,126 @@ ], [ "Database", - "The database to clone - this list is auto-populated from the server.", + "The database(s) to process. If unspecified, all databases will be processed.", "", false, "false", "" ], [ - "InputObject", - "Enables piping from Get-DbaDatabase", + "Object", + "The table(s) or indexed view(s) to be cleaned.", "", false, + "false", + "" + ], + [ + "BatchSize", + "Is the number of rows processed per transaction.\r\nIf not specified, or if 0 is specified, the statement processes the whole table in one transaction.", + "", + false, + "false", + "0" + ], + [ + "NoInformationalMessages", + "Suppresses all informational messages.", + "", + false, + "false", + "False" + ], + [ + "EnableException", + "By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message.\r\nThis avoids overwhelming you with \"sea of red\" exceptions, but is inconvenient because it basically disables advanced scripting.\r\nUsing this switch turns this \"nice by default\" feature off and enables you to catch exceptions with your own try/catch.", + "", + false, + "false", + "False" + ], + [ + "WhatIf", + "Shows what would happen if the cmdlet runs. The cmdlet is not run.", + "wi", + false, + "false", + "" + ], + [ + "Confirm", + "Prompts you for confirmation before running the cmdlet.", + "cf", + false, + "false", + "" + ] + ], + "Syntax": "Invoke-DbaDbDbccCleanTable [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [[-Database] \u003cString[]\u003e] [[-Object] \u003cString[]\u003e] [[-BatchSize] \u003cInt32\u003e] [-NoInformationalMessages] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" + }, + { + "Name": "Invoke-DbaDbDbccUpdateUsage", + "Description": "Executes the command DBCC UPDATEUSAGE and returns results\n\nReports and corrects pages and row count inaccuracies in the catalog views.\nThese inaccuracies may cause incorrect space usage reports returned by the sp_spaceused system stored procedure.\n\nRead more:\n - https://docs.microsoft.com/en-us/sql/t-sql/database-console-commands/dbcc-updateusage-transact-sql", + "Tags": "DBCC", + "Synopsis": "Execution of Database Console Command DBCC UPDATEUSAGE", + "Alias": "", + "Author": "Patrick Flynn (@sqllensman)", + "CommandName": "Invoke-DbaDbDbccUpdateUsage", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Invoke-DbaDbDbccUpdateUsage", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eInvoke-DbaDbDbccUpdateUsage -SqlInstance SqlServer2017\nRuns the command DBCC UPDATEUSAGE to update the page or row counts or both for all objects in all databases for the instance SqlServer2017. Connect using Windows Authentication\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eInvoke-DbaDbDbccUpdateUsage -SqlInstance SqlServer2017 -Database CurrentDB\nRuns the command DBCC UPDATEUSAGE to update the page or row counts or both for all objects in the CurrentDB database for the instance SqlServer2017. Connect using Windows Authentication\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eInvoke-DbaDbDbccUpdateUsage -SqlInstance SqlServer2017 -Database CurrentDB -Table Sometable\nConnects to CurrentDB on instance SqlServer2017 using Windows Authentication and runs the command DBCC UPDATEUSAGE(SometableId) to update the page or row counts for all indexes in the table.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003e$cred = Get-Credential sqladmin\nPS C:\\\u003e Invoke-DbaDbDbccUpdateUsage -SqlInstance SqlServer2017 -SqlCredential $cred -Database CurrentDB -Table \u0027SometableId -Index IndexName -NoInformationalMessages -CountRows\nConnects to CurrentDB on instance SqlServer2017 using sqladmin credential and runs the command DBCC UPDATEUSAGE(SometableId, IndexName) WITH NO_INFOMSGS, COUNT_ROWS to update the page or row counts.\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003e\u0027Sql1\u0027,\u0027Sql2/sqlexpress\u0027 | Invoke-DbaDbDbccUpdateUsage -WhatIf\nDisplays what will happen if command DBCC UPDATEUSAGE is called against all databses on Sql1 and Sql2/sqlexpress", + "Params": [ + [ + "SqlInstance", + "The target SQL Server instance or instances.", + "", + true, "true (ByValue)", "" ], [ - "CloneDatabase", - "The name(s) to clone to.", + "SqlCredential", + "Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential)", "", false, "false", "" ], [ - "ExcludeStatistics", - "Exclude the statistics in the cloned database", + "Database", + "The database(s) to process. If unspecified, all databases will be processed.\r\nThe Name or Id of a database can be specified\r\nDatabase names must comply with the rules for identifiers.", "", false, "false", - "False" + "" ], [ - "ExcludeQueryStore", - "Exclude the QueryStore data in the cloned database", + "Table", + "The table or indexed view to process.\r\nTable and view names must comply with the rules for identifiers\r\nThe Id of Table or View can be specified\r\nIf not specified, all tables or indexed views will be processed", + "", + false, + "false", + "" + ], + [ + "Index", + "The Index to process.\r\nThe Id of Index can be specified\r\nIf not specified, all indexes for the specified table or view will be processed.", + "", + false, + "false", + "" + ], + [ + "NoInformationalMessages", + "Suppresses all informational messages.", "", false, "false", "False" ], [ - "UpdateStatistics", - "Update the statistics prior to cloning (per Microsoft Tiger Team formula)", + "CountRows", + "Specifies that the row count column is updated with the current count of the number of rows in the table or view.", "", false, "false", @@ -21740,7 +23028,7 @@ ], [ "WhatIf", - "Shows what would happen if the command were to run. No actions are actually performed.", + "Shows what would happen if the cmdlet runs. The cmdlet is not run.", "wi", false, "false", @@ -21748,29 +23036,30 @@ ], [ "Confirm", - "Prompts you for confirmation before executing any changing operations within the command.", + "Prompts you for confirmation before running the cmdlet.", "cf", false, "false", "" ] ], - "Alias": "Invoke-DbaDatabaseClone", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Clones a database schema and statistics", - "Name": "Invoke-DbaDbClone", - "Links": "https://dbatools.io/Invoke-DbaDbClone", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eInvoke-DbaDbClone -SqlInstance sql2016 -Database mydb -CloneDatabase myclone\nClones mydb to myclone on sql2016\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaDatabase -SqlInstance sql2016 -Database mydb | Invoke-DbaDbClone -CloneDatabase myclone, myclone2 -UpdateStatistics\nUpdates the statistics of mydb then clones to myclone and myclone2", - "Syntax": "Invoke-DbaDbClone [[-SqlInstance] \u003cDbaInstanceParameter[]\u003e] [[-SqlCredential] \u003cPSCredential\u003e] [[-Database] \u003cString[]\u003e] [[-InputObject] \u003cDatabase[]\u003e] [[-CloneDatabase] \u003cString[]\u003e] [-ExcludeStatistics] [-ExcludeQueryStore] [-UpdateStatistics] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" + "Syntax": "Invoke-DbaDbDbccUpdateUsage [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [[-Database] \u003cString[]\u003e] [[-Table] \u003cString\u003e] [[-Index] \u003cString\u003e] [-NoInformationalMessages] [-CountRows] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Invoke-DbaDbDecryptObject", + "Name": "Invoke-DbaDbDecryptObject", "Description": "When a procedure or a function is created with encryption and you lost the code you\u0027re in trouble.\nYou cannot alter the object or view the definition.\nWith this command you can search for the object and decrypt the it.\n\nThe command will output the results to the console.\nThere is an option to export all the results to a folder creating .sql files.\n\nMake sure the instance allowed dedicated administrator connections (DAC).\nThe binary versions of the objects can only be retrieved using a DAC connection.\nYou can check the DAC connection with:\n\u0027Get-DbaSpConfigure -SqlInstance [yourinstance] -ConfigName RemoteDacConnectionsEnabled\u0027\nIt should say 1 in the ConfiguredValue.\n\nTo change the configurations you can use the Set-DbaSpConfigure command:\n\u0027Set-DbaSpConfigure -SqlInstance [yourinstance] -ConfigName RemoteDacConnectionsEnabled -Value 1\u0027\nIn some cases you may need to reboot the instance.", "Tags": [ "Encryption", "Decrypt", "Database" ], + "Synopsis": "Invoke-DbaDbDecryptObject returns the decrypted version of an object", + "Alias": "", + "Author": "Sander Stad (@sqlstad), sqlstad.nl", + "CommandName": "Invoke-DbaDbDecryptObject", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Invoke-DbaDbDecryptObject", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eInvoke-DbaDbDecryptObject -SqlInstance SQLDB1 -Database DB1 -ObjectName Function1\nDecrypt object \"Function1\" in DB1 of instance SQLDB1 and output the data to the user.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eInvoke-DbaDbDecryptObject -SqlInstance SQLDB1 -Database DB1 -ObjectName Function1 -ExportDestination C:\\temp\\decrypt\nDecrypt object \"Function1\" in DB1 of instance SQLDB1 and output the data to the folder \"C:\\temp\\decrypt\".\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eInvoke-DbaDbDecryptObject -SqlInstance SQLDB1 -Database DB1 -ExportDestination C:\\temp\\decrypt\nDecrypt all objects in DB1 of instance SQLDB1 and output the data to the folder \"C:\\temp\\decrypt\"\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eInvoke-DbaDbDecryptObject -SqlInstance SQLDB1 -Database DB1 -ObjectName Function1, Function2\nDecrypt objects \"Function1\" and \"Function2\" and output the data to the user.\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003e\"SQLDB1\" | Invoke-DbaDbDecryptObject -Database DB1 -ObjectName Function1, Function2\nDecrypt objects \"Function1\" and \"Function2\" and output the data to the user using a pipeline for the instance.", "Params": [ [ "SqlInstance", @@ -21829,18 +23118,19 @@ "False" ] ], - "Alias": "", - "Author": "Sander Stad (@sqlstad), sqlstad.nl", - "Synopsis": "Invoke-DbaDbDecryptObject returns the decrypted version of an object", - "Name": "Invoke-DbaDbDecryptObject", - "Links": "https://dbatools.io/Invoke-DbaDbDecryptObject", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eInvoke-DbaDbDecryptObject -SqlInstance SQLDB1 -Database DB1 -ObjectName Function1\nDecrypt object \"Function1\" in DB1 of instance SQLDB1 and output the data to the user.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eInvoke-DbaDbDecryptObject -SqlInstance SQLDB1 -Database DB1 -ObjectName Function1 -ExportDestination C:\\temp\\decrypt\nDecrypt object \"Function1\" in DB1 of instance SQLDB1 and output the data to the folder \"C:\\temp\\decrypt\".\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eInvoke-DbaDbDecryptObject -SqlInstance SQLDB1 -Database DB1 -ExportDestination C:\\temp\\decrypt\nDecrypt all objects in DB1 of instance SQLDB1 and output the data to the folder \"C:\\temp\\decrypt\"\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eInvoke-DbaDbDecryptObject -SqlInstance SQLDB1 -Database DB1 -ObjectName Function1, Function2\nDecrypt objects \"Function1\" and \"Function2\" and output the data to the user.\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003e\"SQLDB1\" | Invoke-DbaDbDecryptObject -Database DB1 -ObjectName Function1, Function2\nDecrypt objects \"Function1\" and \"Function2\" and output the data to the user using a pipeline for the instance.", "Syntax": "Invoke-DbaDbDecryptObject [-SqlInstance] \u003cDbaInstanceParameter\u003e [[-SqlCredential] \u003cPSCredential\u003e] [-Database] \u003cObject[]\u003e [[-ObjectName] \u003cString[]\u003e] [[-EncodingType] \u003cString\u003e] [[-ExportDestination] \u003cString\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Invoke-DbaDbLogShipping", + "Name": "Invoke-DbaDbLogShipping", "Description": "Invoke-DbaDbLogShipping helps to easily set up log shipping for one or more databases.\n\nThis function will make a lot of decisions for you assuming you want default values like a daily interval for the schedules with a 15 minute interval on the day.\nThere are some settings that cannot be made by the function and they need to be prepared before the function is executed.\n\nThe following settings need to be made before log shipping can be initiated:\n- Backup destination (the folder and the privileges)\n- Copy destination (the folder and the privileges)\n\n* Privileges\nMake sure your agent service on both the primary and the secondary instance is an Active Directory account.\nAlso have the credentials ready to set the folder permissions\n\n** Network share\nThe backup destination needs to be shared and have the share privileges of FULL CONTROL to Everyone.\n\n** NTFS permissions\nThe backup destination must have at least read/write permissions for the primary instance agent account.\nThe backup destination must have at least read permissions for the secondary instance agent account.\nThe copy destination must have at least read/write permission for the secondary instance agent acount.", "Tags": "LogShipping", + "Synopsis": "Invoke-DbaDbLogShipping sets up log shipping for one or more databases", + "Alias": "Invoke-DbaLogShipping", + "Author": "Sander Stad (@sqlstad), sqlstad.nl", + "CommandName": "Invoke-DbaDbLogShipping", + "Availability": "Windows only", + "Links": "https://dbatools.io/Invoke-DbaDbLogShipping", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003e$params = @{\n\u003e\u003e SourceSqlInstance = \u0027sql1\u0027\r\n\u003e\u003e DestinationSqlInstance = \u0027sql2\u0027\r\n\u003e\u003e Database = \u0027db1\u0027\r\n\u003e\u003e BackupNetworkPath= \u0027\\\\sql1\\logshipping\u0027\r\n\u003e\u003e BackupLocalPath= \u0027D:\\Data\\logshipping\u0027\r\n\u003e\u003e BackupScheduleFrequencyType = \u0027daily\u0027\r\n\u003e\u003e BackupScheduleFrequencyInterval = 1\r\n\u003e\u003e CompressBackup = $true\r\n\u003e\u003e CopyScheduleFrequencyType = \u0027daily\u0027\r\n\u003e\u003e CopyScheduleFrequencyInterval = 1\r\n\u003e\u003e GenerateFullBackup = $true\r\n\u003e\u003e RestoreScheduleFrequencyType = \u0027daily\u0027\r\n\u003e\u003e RestoreScheduleFrequencyInterval = 1\r\n\u003e\u003e SecondaryDatabaseSuffix = \u0027DR\u0027\r\n\u003e\u003e CopyDestinationFolder = \u0027\\\\sql2\\logshippingdest\u0027\r\n\u003e\u003e Force = $true\r\n\u003e\u003e }\r\n\u003e\u003e\r\nPS C:\\\u003e Invoke-DbaDbLogShipping @params\nSets up log shipping for database \"db1\" with the backup path to a network share allowing local backups.\r\nIt creates daily schedules for the backup, copy and restore job with all the defaults to be executed every 15 minutes daily.\r\nThe secondary database will be called \"db1_LS\".\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003e$params = @{\n\u003e\u003e SourceSqlInstance = \u0027sql1\u0027\r\n\u003e\u003e DestinationSqlInstance = \u0027sql2\u0027\r\n\u003e\u003e Database = \u0027db1\u0027\r\n\u003e\u003e BackupNetworkPath= \u0027\\\\sql1\\logshipping\u0027\r\n\u003e\u003e GenerateFullBackup = $true\r\n\u003e\u003e Force = $true\r\n\u003e\u003e }\r\n\u003e\u003e\r\nPS C:\\\u003e Invoke-DbaDbLogShipping @params\nSets up log shipping with all defaults except that a backup file is generated.\r\nThe script will show a message that the copy destination has not been supplied and asks if you want to use the default which would be the backup directory of the secondary server with the folder \r\n\"logshipping\" i.e. \"D:\\SQLBackup\\Logshiping\".", "Params": [ [ "SourceSqlInstance", @@ -22507,18 +23797,19 @@ "" ] ], - "Alias": "Invoke-DbaLogShipping", - "Author": "Sander Stad (@sqlstad), sqlstad.nl", - "Synopsis": "Invoke-DbaDbLogShipping sets up log shipping for one or more databases", - "Name": "Invoke-DbaDbLogShipping", - "Links": "https://dbatools.io/Invoke-DbaDbLogShipping", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003e$params = @{\n\u003e\u003e SourceSqlInstance = \u0027sql1\u0027\r\n\u003e\u003e DestinationSqlInstance = \u0027sql2\u0027\r\n\u003e\u003e Database = \u0027db1\u0027\r\n\u003e\u003e BackupNetworkPath= \u0027\\\\sql1\\logshipping\u0027\r\n\u003e\u003e BackupLocalPath= \u0027D:\\Data\\logshipping\u0027\r\n\u003e\u003e BackupScheduleFrequencyType = \u0027daily\u0027\r\n\u003e\u003e BackupScheduleFrequencyInterval = 1\r\n\u003e\u003e CompressBackup = $true\r\n\u003e\u003e CopyScheduleFrequencyType = \u0027daily\u0027\r\n\u003e\u003e CopyScheduleFrequencyInterval = 1\r\n\u003e\u003e GenerateFullBackup = $true\r\n\u003e\u003e RestoreScheduleFrequencyType = \u0027daily\u0027\r\n\u003e\u003e RestoreScheduleFrequencyInterval = 1\r\n\u003e\u003e SecondaryDatabaseSuffix = \u0027DR\u0027\r\n\u003e\u003e CopyDestinationFolder = \u0027\\\\sql2\\logshippingdest\u0027\r\n\u003e\u003e Force = $true\r\n\u003e\u003e }\r\n\u003e\u003e\r\nPS C:\\\u003e Invoke-DbaDbLogShipping @params\nSets up log shipping for database \"db1\" with the backup path to a network share allowing local backups.\r\nIt creates daily schedules for the backup, copy and restore job with all the defaults to be executed every 15 minutes daily.\r\nThe secondary database will be called \"db1_LS\".\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003e$params = @{\n\u003e\u003e SourceSqlInstance = \u0027sql1\u0027\r\n\u003e\u003e DestinationSqlInstance = \u0027sql2\u0027\r\n\u003e\u003e Database = \u0027db1\u0027\r\n\u003e\u003e BackupNetworkPath= \u0027\\\\sql1\\logshipping\u0027\r\n\u003e\u003e GenerateFullBackup = $true\r\n\u003e\u003e Force = $true\r\n\u003e\u003e }\r\n\u003e\u003e\r\nPS C:\\\u003e Invoke-DbaDbLogShipping @params\nSets up log shipping with all defaults except that a backup file is generated.\r\nThe script will show a message that the copy destination has not been supplied and asks if you want to use the default which would be the backup directory of the secondary server with the folder \r\n\"logshipping\" i.e. \"D:\\SQLBackup\\Logshiping\".", "Syntax": "Invoke-DbaDbLogShipping [-SourceSqlInstance] \u003cObject\u003e [-DestinationSqlInstance] \u003cObject[]\u003e [[-SourceSqlCredential] \u003cPSCredential\u003e] [[-SourceCredential] \u003cPSCredential\u003e] [[-DestinationSqlCredential] \u003cPSCredential\u003e] [[-DestinationCredential] \u003cPSCredential\u003e] [-Database] \u003cObject[]\u003e [-BackupNetworkPath] \u003cString\u003e [[-BackupLocalPath] \u003cString\u003e] [[-BackupJob] \u003cString\u003e] [[-BackupRetention] \u003cInt32\u003e] [[-BackupSchedule] \u003cString\u003e] [-BackupScheduleDisabled] [[-BackupScheduleFrequencyType] \u003cObject\u003e] [[-BackupScheduleFrequencyInterval] \u003cObject[]\u003e] [[-BackupScheduleFrequencySubdayType] \u003cObject\u003e] \r\n[[-BackupScheduleFrequencySubdayInterval] \u003cInt32\u003e] [[-BackupScheduleFrequencyRelativeInterval] \u003cObject\u003e] [[-BackupScheduleFrequencyRecurrenceFactor] \u003cInt32\u003e] [[-BackupScheduleStartDate] \u003cString\u003e] [[-BackupScheduleEndDate] \u003cString\u003e] [[-BackupScheduleStartTime] \u003cString\u003e] [[-BackupScheduleEndTime] \u003cString\u003e] [[-BackupThreshold] \u003cInt32\u003e] [-CompressBackup] [[-CopyDestinationFolder] \u003cString\u003e] [[-CopyJob] \u003cString\u003e] [[-CopyRetention] \u003cInt32\u003e] [[-CopySchedule] \u003cString\u003e] [-CopyScheduleDisabled] [[-CopyScheduleFrequencyType] \u003cObject\u003e] [[-CopyScheduleFrequencyInterval] \u003cObject[]\u003e] \r\n[[-CopyScheduleFrequencySubdayType] \u003cObject\u003e] [[-CopyScheduleFrequencySubdayInterval] \u003cInt32\u003e] [[-CopyScheduleFrequencyRelativeInterval] \u003cObject\u003e] [[-CopyScheduleFrequencyRecurrenceFactor] \u003cInt32\u003e] [[-CopyScheduleStartDate] \u003cString\u003e] [[-CopyScheduleEndDate] \u003cString\u003e] [[-CopyScheduleStartTime] \u003cString\u003e] [[-CopyScheduleEndTime] \u003cString\u003e] [-DisconnectUsers] [[-FullBackupPath] \u003cString\u003e] [-GenerateFullBackup] [[-HistoryRetention] \u003cInt32\u003e] [-NoRecovery] [-NoInitialization] [[-PrimaryMonitorServer] \u003cString\u003e] [[-PrimaryMonitorCredential] \u003cPSCredential\u003e] [[-PrimaryMonitorServerSecurityMode] \u003cObject\u003e] \r\n[-PrimaryThresholdAlertEnabled] [[-RestoreDataFolder] \u003cString\u003e] [[-RestoreLogFolder] \u003cString\u003e] [[-RestoreDelay] \u003cInt32\u003e] [[-RestoreAlertThreshold] \u003cInt32\u003e] [[-RestoreJob] \u003cString\u003e] [[-RestoreRetention] \u003cInt32\u003e] [[-RestoreSchedule] \u003cString\u003e] [-RestoreScheduleDisabled] [[-RestoreScheduleFrequencyType] \u003cObject\u003e] [[-RestoreScheduleFrequencyInterval] \u003cObject[]\u003e] [[-RestoreScheduleFrequencySubdayType] \u003cObject\u003e] [[-RestoreScheduleFrequencySubdayInterval] \u003cInt32\u003e] [[-RestoreScheduleFrequencyRelativeInterval] \u003cObject\u003e] [[-RestoreScheduleFrequencyRecurrenceFactor] \u003cInt32\u003e] [[-RestoreScheduleStartDate] \r\n\u003cString\u003e] [[-RestoreScheduleEndDate] \u003cString\u003e] [[-RestoreScheduleStartTime] \u003cString\u003e] [[-RestoreScheduleEndTime] \u003cString\u003e] [[-RestoreThreshold] \u003cInt32\u003e] [[-SecondaryDatabasePrefix] \u003cString\u003e] [[-SecondaryDatabaseSuffix] \u003cString\u003e] [[-SecondaryMonitorServer] \u003cString\u003e] [[-SecondaryMonitorCredential] \u003cPSCredential\u003e] [[-SecondaryMonitorServerSecurityMode] \u003cObject\u003e] [-SecondaryThresholdAlertEnabled] [-Standby] [[-StandbyDirectory] \u003cString\u003e] [-UseExistingFullBackup] [[-UseBackupFolder] \u003cString\u003e] [-Force] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Invoke-DbaDbLogShipRecovery", + "Name": "Invoke-DbaDbLogShipRecovery", "Description": "By default all the databases for a particular instance are recovered.\nIf the database is in the right state, either standby or recovering, the process will try to recover the database.\n\nAt first the function will check if the backup source directory can still be reached.\nIf so it will look up the last transaction log backup for the database. If that backup file is not the last copied file the log shipping copy job will be started.\nIf the directory cannot be reached for the function will continue to the restoring process.\nAfter the copy job check is performed the job is disabled to prevent the job to run.\n\nFor the restore the log shipping status is checked in the msdb database.\nIf the last restored file is not the same as the last file name found, the log shipping restore job will be executed.\nAfter the restore job check is performed the job is disabled to prevent the job to run\n\nThe last part is to set the database online by restoring the databases with recovery", "Tags": "LogShipping", + "Synopsis": "Invoke-DbaDbLogShipRecovery recovers log shipped databases to a normal state to act upon a migration or disaster.", + "Alias": "Invoke-DbaLogShippingRecovery", + "Author": "Sander Stad (@sqlstad), sqlstad.nl", + "CommandName": "Invoke-DbaDbLogShipRecovery", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Invoke-DbaDbLogShipRecovery", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eInvoke-DbaDbLogShipRecovery -SqlInstance server1\nRecovers all the databases on the instance that are enabled for log shipping\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eInvoke-DbaDbLogShipRecovery -SqlInstance server1 -SqlCredential $cred -Verbose\nRecovers all the databases on the instance that are enabled for log shipping using a credential\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eInvoke-DbaDbLogShipRecovery -SqlInstance server1 -database db_logship -Verbose\nRecovers the database \"db_logship\" to a normal status\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003edb1, db2, db3, db4 | Invoke-DbaDbLogShipRecovery -SqlInstance server1 -Verbose\nRecovers the database db1, db2, db3, db4 to a normal status\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eInvoke-DbaDbLogShipRecovery -SqlInstance server1 -WhatIf\nShows what would happen if the command were executed.", "Params": [ [ "SqlInstance", @@ -22601,21 +23892,22 @@ "" ] ], - "Alias": "Invoke-DbaLogShippingRecovery", - "Author": "Sander Stad (@sqlstad), sqlstad.nl", - "Synopsis": "Invoke-DbaDbLogShipRecovery recovers log shipped databases to a normal state to act upon a migration or disaster.", - "Name": "Invoke-DbaDbLogShipRecovery", - "Links": "https://dbatools.io/Invoke-DbaDbLogShipRecovery", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eInvoke-DbaDbLogShipRecovery -SqlInstance server1\nRecovers all the databases on the instance that are enabled for log shipping\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eInvoke-DbaDbLogShipRecovery -SqlInstance server1 -SqlCredential $cred -Verbose\nRecovers all the databases on the instance that are enabled for log shipping using a credential\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eInvoke-DbaDbLogShipRecovery -SqlInstance server1 -database db_logship -Verbose\nRecovers the database \"db_logship\" to a normal status\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003edb1, db2, db3, db4 | Invoke-DbaDbLogShipRecovery -SqlInstance server1 -Verbose\nRecovers the database db1, db2, db3, db4 to a normal status\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eInvoke-DbaDbLogShipRecovery -SqlInstance server1 -WhatIf\nShows what would happen if the command were executed.", "Syntax": "Invoke-DbaDbLogShipRecovery [[-SqlInstance] \u003cDbaInstanceParameter[]\u003e] [[-Database] \u003cString[]\u003e] [[-SqlCredential] \u003cPSCredential\u003e] [-NoRecovery] [-EnableException] [-Force] [[-InputObject] \u003cDatabase[]\u003e] [[-Delay] \u003cInt32\u003e] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Invoke-DbaDbMirrorFailover", + "Name": "Invoke-DbaDbMirrorFailover", "Description": "Failover a mirrored database", "Tags": [ "Mirror", "HA" ], + "Synopsis": "Failover a mirrored database", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Invoke-DbaDbMirrorFailover", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Invoke-DbaDbMirrorFailover", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eInvoke-DbaDbMirrorFailover -SqlInstance sql2016 -Database pubs\nFails over the pubs database on sql2016. Prompts for confirmation.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaDatabase -SqlInstance sql2016 -Database pubs | Invoke-DbaDbMirrorFailover -Force -Confirm:$false\nForces the failover of the pubs database on sql2016 and allows data loss.\r\nDoes not prompt for confirmation.", "Params": [ [ "SqlInstance", @@ -22682,21 +23974,22 @@ "" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Failover a mirrored database", - "Name": "Invoke-DbaDbMirrorFailover", - "Links": "https://dbatools.io/Invoke-DbaDbMirrorFailover", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eInvoke-DbaDbMirrorFailover -SqlInstance sql2016 -Database pubs\nFails over the pubs database on sql2016. Prompts for confirmation.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaDatabase -SqlInstance sql2016 -Database pubs | Invoke-DbaDbMirrorFailover -Force -Confirm:$false\nForces the failover of the pubs database on sql2016 and allows data loss.\r\nDoes not prompt for confirmation.", "Syntax": "Invoke-DbaDbMirrorFailover [[-SqlInstance] \u003cDbaInstanceParameter\u003e] [[-SqlCredential] \u003cPSCredential\u003e] [[-Database] \u003cString[]\u003e] [[-InputObject] \u003cDatabase[]\u003e] [-Force] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Invoke-DbaDbMirroring", + "Name": "Invoke-DbaDbMirroring", "Description": "Automates the creation of database mirrors.\n\n* Verifies that a mirror is possible\n* Sets the recovery model to Full if needed\n* If the database does not exist on mirror or witness, a backup/restore is performed\n* Sets up endpoints if necessary\n* Creates a login and grants permissions to service accounts if needed\n* Starts endpoints if needed\n* Sets up partner for mirror\n* Sets up partner for primary\n* Sets up witness if one is specified\n\nNOTE: If a backup / restore is performed, the backups will be left in tact on the network share.", "Tags": [ "Mirror", "HA" ], + "Synopsis": "Automates the creation of database mirrors.", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Invoke-DbaDbMirroring", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Invoke-DbaDbMirroring", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003e$params = @{\n\u003e\u003e Primary = \u0027sql2017a\u0027\r\n\u003e\u003e Mirror = \u0027sql2017b\u0027\r\n\u003e\u003e MirrorSqlCredential = \u0027sqladmin\u0027\r\n\u003e\u003e Witness = \u0027sql2019\u0027\r\n\u003e\u003e Database = \u0027pubs\u0027\r\n\u003e\u003e SharedPath = \u0027\\\\nas\\sql\\share\u0027\r\n\u003e\u003e }\r\n\u003e\u003e\r\nPS C:\\\u003e Invoke-DbaDbMirroring @params\nPerforms a bunch of checks to ensure the pubs database on sql2017a\r\ncan be mirrored from sql2017a to sql2017b. Logs in to sql2019 and sql2017a\r\nusing Windows credentials and sql2017b using a SQL credential.\nPrompts for confirmation for most changes. To avoid confirmation, use -Confirm:$false or\r\nuse the syntax in the second example.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003e$params = @{\n\u003e\u003e Primary = \u0027sql2017a\u0027\r\n\u003e\u003e Mirror = \u0027sql2017b\u0027\r\n\u003e\u003e MirrorSqlCredential = \u0027sqladmin\u0027\r\n\u003e\u003e Witness = \u0027sql2019\u0027\r\n\u003e\u003e Database = \u0027pubs\u0027\r\n\u003e\u003e SharedPath = \u0027\\\\nas\\sql\\share\u0027\r\n\u003e\u003e Force = $true\r\n\u003e\u003e Confirm = $false\r\n\u003e\u003e }\r\n\u003e\u003e\r\nPS C:\\\u003e Invoke-DbaDbMirroring @params\nPerforms a bunch of checks to ensure the pubs database on sql2017a\r\ncan be mirrored from sql2017a to sql2017b. Logs in to sql2019 and sql2017a\r\nusing Windows credentials and sql2017b using a SQL credential.\nDrops existing pubs database on Mirror and Witness and restores them with\r\na fresh backup.\nDoes all the things in the decription, does not prompt for confirmation.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003e$map = @{ \u0027database_data\u0027 = \u0027M:\\Data\\database_data.mdf\u0027 \u0027database_log\u0027 = \u0027L:\\Log\\database_log.ldf\u0027 }\nPS C:\\\u003e Get-ChildItem \\\\nas\\seed | Restore-DbaDatabase -SqlInstance sql2017b -FileMapping $map -NoRecovery\r\nPS C:\\\u003e Get-DbaDatabase -SqlInstance sql2017a -Database pubs | Invoke-DbaDbMirroring -Mirror sql2017b -Confirm:$false\nRestores backups from sql2017a to a specific file struture on sql2017b then creates mirror with no prompts for confirmation.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaDatabase -SqlInstance sql2017a -Database pubs |\n\u003e\u003e Invoke-DbaDbMirroring -Mirror sql2017b -UseLastBackup -Confirm:$false\nMirrors pubs on sql2017a to sql2017b and uses the last full and logs from sql2017a to seed. Doesn\u0027t prompt for confirmation.", "Params": [ [ "Primary", @@ -22811,21 +24104,22 @@ "" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Automates the creation of database mirrors.", - "Name": "Invoke-DbaDbMirroring", - "Links": "https://dbatools.io/Invoke-DbaDbMirroring", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003e$params = @{\n\u003e\u003e Primary = \u0027sql2017a\u0027\r\n\u003e\u003e Mirror = \u0027sql2017b\u0027\r\n\u003e\u003e MirrorSqlCredential = \u0027sqladmin\u0027\r\n\u003e\u003e Witness = \u0027sql2019\u0027\r\n\u003e\u003e Database = \u0027pubs\u0027\r\n\u003e\u003e SharedPath = \u0027\\\\nas\\sql\\share\u0027\r\n\u003e\u003e }\r\n\u003e\u003e\r\nPS C:\\\u003e Invoke-DbaDbMirror @params\nPerforms a bunch of checks to ensure the pubs database on sql2017a\r\ncan be mirrored from sql2017a to sql2017b. Logs in to sql2019 and sql2017a\r\nusing Windows credentials and sql2017b using a SQL credential.\nPrompts for confirmation for most changes. To avoid confirmation, use -Confirm:$false or\r\nuse the syntax in the second example.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003e$params = @{\n\u003e\u003e Primary = \u0027sql2017a\u0027\r\n\u003e\u003e Mirror = \u0027sql2017b\u0027\r\n\u003e\u003e MirrorSqlCredential = \u0027sqladmin\u0027\r\n\u003e\u003e Witness = \u0027sql2019\u0027\r\n\u003e\u003e Database = \u0027pubs\u0027\r\n\u003e\u003e SharedPath = \u0027\\\\nas\\sql\\share\u0027\r\n\u003e\u003e Force = $true\r\n\u003e\u003e Confirm = $false\r\n\u003e\u003e }\r\n\u003e\u003e\r\nPS C:\\\u003e Invoke-DbaDbMirror @params\nPerforms a bunch of checks to ensure the pubs database on sql2017a\r\ncan be mirrored from sql2017a to sql2017b. Logs in to sql2019 and sql2017a\r\nusing Windows credentials and sql2017b using a SQL credential.\nDrops existing pubs database on Mirror and Witness and restores them with\r\na fresh backup.\nDoes all the things in the decription, does not prompt for confirmation.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003e$map = @{ \u0027database_data\u0027 = \u0027M:\\Data\\database_data.mdf\u0027 \u0027database_log\u0027 = \u0027L:\\Log\\database_log.ldf\u0027 }\nPS C:\\\u003e Get-ChildItem \\\\nas\\seed | Restore-DbaDatabase -SqlInstance sql2017b -FileMapping $map -NoRecovery\r\nPS C:\\\u003e Get-DbaDatabase -SqlInstance sql2017a -Database pubs | Invoke-DbaDbMirroring -Mirror sql2017b -Confirm:$false\nRestores backups from sql2017a to a specific file struture on sql2017b then creates mirror with no prompts for confirmation.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaDatabase -SqlInstance sql2017a -Database pubs |\n\u003e\u003e Invoke-DbaDbMirroring -Mirror sql2017b -UseLastBackup -Confirm:$false\nMirrors pubs on sql2017a to sql2017b and uses the last full and logs from sql2017a to seed. Doesn\u0027t prompt for confirmation.", "Syntax": "Invoke-DbaDbMirroring [[-Primary] \u003cDbaInstanceParameter\u003e] [[-PrimarySqlCredential] \u003cPSCredential\u003e] [-Mirror] \u003cDbaInstanceParameter[]\u003e [[-MirrorSqlCredential] \u003cPSCredential\u003e] [[-Witness] \u003cDbaInstanceParameter\u003e] [[-WitnessSqlCredential] \u003cPSCredential\u003e] [[-Database] \u003cString[]\u003e] [[-SharedPath] \u003cString\u003e] [[-InputObject] \u003cDatabase[]\u003e] [-UseLastBackup] [-Force] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Invoke-DbaDbShrink", + "Name": "Invoke-DbaDbShrink", "Description": "Shrinks all files in a database. Databases should be shrunk only when completely necessary.\n\nMany awesome SQL people have written about why you should not shrink your data files. Paul Randal and Kalen Delaney wrote great posts about this topic:\n\nhttp://www.sqlskills.com/blogs/paul/why-you-should-not-shrink-your-data-files\nhttp://sqlmag.com/sql-server/shrinking-data-files\n\nHowever, there are some cases where a database will need to be shrunk. In the event that you must shrink your database:\n\n1. Ensure you have plenty of space for your T-Log to grow\n2. Understand that shrinks require a lot of CPU and disk resources\n3. Consider running DBCC INDEXDEFRAG or ALTER INDEX ... REORGANIZE after the shrink is complete.", "Tags": [ "Shrink", "Database" ], + "Synopsis": "Shrinks all files in a database. This is a command that should rarely be used.\n\n- Shrinks can cause severe index fragmentation (to the tune of 99%)\n- Shrinks can cause massive growth in the database\u0027s transaction log\n- Shrinks can require a lot of time and system resources to perform data movement", + "Alias": "Invoke-DbaDatabaseShrink", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Invoke-DbaDbShrink", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Invoke-DbaDbShrink", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eInvoke-DbaDbShrink -SqlInstance sql2016 -Database Northwind,pubs,Adventureworks2014\nShrinks Northwind, pubs and Adventureworks2014 to have as little free space as possible.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eInvoke-DbaDbShrink -SqlInstance sql2014 -Database AdventureWorks2014 -PercentFreeSpace 50\nShrinks AdventureWorks2014 to have 50% free space. So let\u0027s say AdventureWorks2014 was 1GB and it\u0027s using 100MB space. The database free space would be reduced to 50MB.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eInvoke-DbaDbShrink -SqlInstance sql2014 -Database AdventureWorks2014 -PercentFreeSpace 50 -FileType Data -StepSize 25MB\nShrinks AdventureWorks2014 to have 50% free space, runs shrinks in 25MB chunks for improved performance.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eInvoke-DbaDbShrink -SqlInstance sql2012 -AllUserDatabases\nShrinks all user databases on SQL2012 (not ideal for production)", "Params": [ [ "SqlInstance", @@ -22956,21 +24250,22 @@ "" ] ], - "Alias": "Invoke-DbaDatabaseShrink", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Shrinks all files in a database. This is a command that should rarely be used.\n\n- Shrinks can cause severe index fragmentation (to the tune of 99%)\n- Shrinks can cause massive growth in the database\u0027s transaction log\n- Shrinks can require a lot of time and system resources to perform data movement", - "Name": "Invoke-DbaDbShrink", - "Links": "https://dbatools.io/Invoke-DbaDbShrink", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eInvoke-DbaDbShrink -SqlInstance sql2016 -Database Northwind,pubs,Adventureworks2014\nShrinks Northwind, pubs and Adventureworks2014 to have as little free space as possible.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eInvoke-DbaDbShrink -SqlInstance sql2014 -Database AdventureWorks2014 -PercentFreeSpace 50\nShrinks AdventureWorks2014 to have 50% free space. So let\u0027s say AdventureWorks2014 was 1GB and it\u0027s using 100MB space. The database free space would be reduced to 50MB.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eInvoke-DbaDbShrink -SqlInstance sql2014 -Database AdventureWorks2014 -PercentFreeSpace 50 -FileType Data -StepSize 25MB\nShrinks AdventureWorks2014 to have 50% free space, runs shrinks in 25MB chunks for improved performance.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eInvoke-DbaDbShrink -SqlInstance sql2012 -AllUserDatabases\nShrinks all databases on SQL2012 (not ideal for production)", "Syntax": "Invoke-DbaDbShrink [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [[-Database] \u003cObject[]\u003e] [[-ExcludeDatabase] \u003cObject[]\u003e] [-AllUserDatabases] [[-PercentFreeSpace] \u003cInt32\u003e] [[-ShrinkMethod] \u003cString\u003e] [[-FileType] \u003cString\u003e] [[-StepSize] \u003cInt32\u003e] [[-StatementTimeout] \u003cInt32\u003e] [-LogsOnly] [-ExcludeIndexStats] [-ExcludeUpdateUsage] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Invoke-DbaDbUpgrade", + "Name": "Invoke-DbaDbUpgrade", "Description": "Updates compatibility level, then runs CHECKDB with data_purity, DBCC updateusage, sp_updatestats and finally sp_refreshview against all user views.", "Tags": [ "Shrink", "Database" ], + "Synopsis": "Take a database and upgrades it to compatibility of the SQL Instance its hosted on. Based on https://thomaslarock.com/2014/06/upgrading-to-sql-server-2014-a-dozen-things-to-check/", + "Alias": "Invoke-DbaDatabaseUpgrade", + "Author": "Stephen Bennett, https://sqlnotesfromtheunderground.wordpress.com/", + "CommandName": "Invoke-DbaDbUpgrade", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Invoke-DbaDbUpgrade", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eInvoke-DbaDbUpgrade -SqlInstance PRD-SQL-MSD01 -Database Test\nRuns the below processes against the databases\r\n-- Puts compatibility of database to level of SQL Instance\r\n-- Runs CHECKDB DATA_PURITY\r\n-- Runs DBCC UPDATESUSAGE\r\n-- Updates all users statistics\r\n-- Runs sp_refreshview against every view in the database\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eInvoke-DbaDbUpgrade -SqlInstance PRD-SQL-INT01 -Database Test -NoRefreshView\nRuns the upgrade command skipping the sp_refreshview update on all views\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eInvoke-DbaDbUpgrade -SqlInstance PRD-SQL-INT01 -Database Test -Force\nIf database Test is already at the correct compatibility, runs every necessary step\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaDatabase -SqlInstance sql2016 | Out-GridView -Passthru | Invoke-DbaDbUpgrade\nGet only specific databases using GridView and pass those to Invoke-DbaDbUpgrade", "Params": [ [ "SqlInstance", @@ -23085,21 +24380,22 @@ "" ] ], - "Alias": "Invoke-DbaDatabaseUpgrade", - "Author": "Stephen Bennett, https://sqlnotesfromtheunderground.wordpress.com/", - "Synopsis": "Take a database and upgrades it to compatibility of the SQL Instance its hosted on. Based on https://thomaslarock.com/2014/06/upgrading-to-sql-server-2014-a-dozen-things-to-check/", - "Name": "Invoke-DbaDbUpgrade", - "Links": "https://dbatools.io/Invoke-DbaDbUpgrade", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eInvoke-DbaDbUpgrade -SqlInstance PRD-SQL-MSD01 -Database Test\nRuns the below processes against the databases\r\n-- Puts compatibility of database to level of SQL Instance\r\n-- Runs CHECKDB DATA_PURITY\r\n-- Runs DBCC UPDATESUSAGE\r\n-- Updates all users statistics\r\n-- Runs sp_refreshview against every view in the database\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eInvoke-DbaDbUpgrade -SqlInstance PRD-SQL-INT01 -Database Test -NoRefreshView\nRuns the upgrade command skipping the sp_refreshview update on all views\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eInvoke-DbaDbUpgrade -SqlInstance PRD-SQL-INT01 -Database Test -Force\nIf database Test is already at the correct compatibility, runs every necessary step\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaDatabase -SqlInstance sql2016 | Out-GridView -Passthru | Invoke-DbaDbUpgrade\nGet only specific databases using GridView and pass those to Invoke-DbaDbUpgrade", "Syntax": "Invoke-DbaDbUpgrade [[-SqlInstance] \u003cDbaInstanceParameter[]\u003e] [-SqlCredential \u003cPSCredential\u003e] [-Database \u003cObject[]\u003e] [-ExcludeDatabase \u003cObject[]\u003e] [-NoCheckDb] [-NoUpdateUsage] [-NoUpdateStats] [-NoRefreshView] [-AllUserDatabases] [-Force] [-InputObject \u003cDatabase[]\u003e] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Invoke-DbaDiagnosticQuery", + "Name": "Invoke-DbaDiagnosticQuery", "Description": "This is the main function of the Sql Server Diagnostic Queries related functions in dbatools.\nThe diagnostic queries are developed and maintained by Glenn Berry and they can be found here along with a lot of documentation:\nhttp://www.sqlskills.com/blogs/glenn/category/dmv-queries/\n\nThe most recent version of the diagnostic queries are included in the dbatools module.\nBut it is possible to download a newer set or a specific version to an alternative location and parse and run those scripts.\nIt will run all or a selection of those scripts on one or multiple servers and return the result as a PowerShell Object", "Tags": [ "Database", "DMV" ], + "Synopsis": "Invoke-DbaDiagnosticQuery runs the scripts provided by Glenn Berry\u0027s DMV scripts on specified servers", + "Alias": "", + "Author": "Andre Kamman (@AndreKamman), http://clouddba.io", + "CommandName": "Invoke-DbaDiagnosticQuery", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Invoke-DbaDiagnosticQuery", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eInvoke-DbaDiagnosticQuery -SqlInstance sql2016\nRun the selection made by the user on the Sql Server instance specified.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eInvoke-DbaDiagnosticQuery -SqlInstance sql2016 -UseSelectionHelper | Export-DbaDiagnosticQuery -Path C:\\temp\\gboutput\nProvides a gridview with all the queries to choose from and will run the selection made by the user on the SQL Server instance specified.\r\nThen it will export the results to Export-DbaDiagnosticQuery.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eInvoke-DbaDiagnosticQuery -SqlInstance localhost -ExportQueries -OutputPath \"C:\\temp\\DiagnosticQueries\"\nExport All Queries to Disk\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eInvoke-DbaDiagnosticQuery -SqlInstance localhost -DatabaseSpecific -ExportQueries -OutputPath \"C:\\temp\\DiagnosticQueries\"\nExport Database Specific Queries for all User Dbs\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eInvoke-DbaDiagnosticQuery -SqlInstance localhost -DatabaseSpecific -DatabaseName \u0027tempdb\u0027 -ExportQueries -OutputPath \"C:\\temp\\DiagnosticQueries\"\nExport Database Specific Queries For One Target Database\n-------------------------- EXAMPLE 6 --------------------------\nPS C:\\\u003eInvoke-DbaDiagnosticQuery -SqlInstance localhost -DatabaseSpecific -DatabaseName \u0027tempdb\u0027 -ExportQueries -OutputPath \"C:\\temp\\DiagnosticQueries\" -queryname \u0027Database-scoped Configurations\u0027\nExport Database Specific Queries For One Target Database and One Specific Query\n-------------------------- EXAMPLE 7 --------------------------\nPS C:\\\u003eInvoke-DbaDiagnosticQuery -SqlInstance localhost -UseSelectionHelper\nChoose Queries To Export\n-------------------------- EXAMPLE 8 --------------------------\nPS C:\\\u003e[PSObject[]]$results = Invoke-DbaDiagnosticQuery -SqlInstance localhost -whatif\nParse the appropriate diagnostic queries by connecting to server, and instead of running them, return as [PSCustomObject[]] to work with further\n-------------------------- EXAMPLE 9 --------------------------\nPS C:\\\u003e$results = Invoke-DbaDiagnosticQuery -SqlInstance Sql2017 -DatabaseSpecific -queryname \u0027Database-scoped Configurations\u0027 -databasename TestStuff\nRun diagnostic queries targeted at specific database, and only run database level queries against this database.", "Params": [ [ "SqlInstance", @@ -23246,16 +24542,10 @@ "" ] ], - "Alias": "", - "Author": "Andre Kamman (@AndreKamman), http://clouddba.io", - "Synopsis": "Invoke-DbaDiagnosticQuery runs the scripts provided by Glenn Berry\u0027s DMV scripts on specified servers", - "Name": "Invoke-DbaDiagnosticQuery", - "Links": "https://dbatools.io/Invoke-DbaDiagnosticQuery", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eInvoke-DbaDiagnosticQuery -SqlInstance sql2016\nRun the selection made by the user on the Sql Server instance specified.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eInvoke-DbaDiagnosticQuery -SqlInstance sql2016 -UseSelectionHelper | Export-DbaDiagnosticQuery -Path C:\\temp\\gboutput\nProvides a gridview with all the queries to choose from and will run the selection made by the user on the SQL Server instance specified.\r\nThen it will export the results to Export-DbaDiagnosticQuery.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eInvoke-DbaDiagnosticQuery -sqlinstance localhost -ExportQueries -outputpath \"C:\\temp\\DiagnosticQueries\"\nExport All Queries to Disk\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eInvoke-DbaDiagnosticQuery -sqlinstance localhost -DatabaseSpecific -DatabaseName \u0027tempdb\u0027 -ExportQueries -outputpath \"C:\\temp\\DiagnosticQueries\"\nExport Database Specific Queries for all User Dbs\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eInvoke-DbaDiagnosticQuery -sqlinstance localhost -DatabaseSpecific -DatabaseName \u0027tempdb\u0027 -ExportQueries -outputpath \"C:\\temp\\DiagnosticQueries\"\nExport Database Specific Queries For One Target Database\n-------------------------- EXAMPLE 6 --------------------------\nPS C:\\\u003eInvoke-DbaDiagnosticQuery -sqlinstance localhost -DatabaseSpecific -DatabaseName \u0027tempdb\u0027 -ExportQueries -outputpath \"C:\\temp\\DiagnosticQueries\" -queryname \u0027Database-scoped Configurations\u0027\nExport Database Specific Queries For One Target Database and One Specific Query\n-------------------------- EXAMPLE 7 --------------------------\nPS C:\\\u003eInvoke-DbaDiagnosticQuery -sqlinstance localhost -UseSelectionHelper\nChoose Queries To Export\n-------------------------- EXAMPLE 8 --------------------------\nPS C:\\\u003e[PSObject[]]$results = Invoke-DbaDiagnosticQuery -SqlInstance localhost -whatif\nParse the appropriate diagnostic queries by connecting to server, and instead of running them, return as [PSCustomObject[]] to work with further\n-------------------------- EXAMPLE 9 --------------------------\nPS C:\\\u003e$results = Invoke-DbaDiagnosticQuery -SqlInstance Sql2017 -DatabaseSpecific -queryname \u0027Database-scoped Configurations\u0027 -databasename TestStuff\nRun diagnostic queries targeted at specific database, and only run database level queries against this database.", "Syntax": "Invoke-DbaDiagnosticQuery [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [-Database \u003cObject[]\u003e] [-ExcludeDatabase \u003cObject[]\u003e] [-ExcludeQuery \u003cObject[]\u003e] [-SqlCredential \u003cPSCredential\u003e] [-Path \u003cFileInfo\u003e] [-QueryName \u003cString[]\u003e] [-UseSelectionHelper] [-InstanceOnly] [-DatabaseSpecific] [-ExcludeQueryTextColumn] [-ExcludePlanColumn] [-NoColumnParsing] [-OutputPath \u003cString\u003e] [-ExportQueries] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Invoke-DbaPfRelog", + "Name": "Invoke-DbaPfRelog", "Description": "Pipeline-compatible wrapper for the relog command. Relog is useful for converting Windows Perfmon.\n\nExtracts performance counters from performance counter logs into other formats,\nsuch as text-TSV (for tab-delimited text), text-CSV (for comma-delimited text), binary-BIN, or SQL.\n\n`relog \"C:\\PerfLogs\\Admin\\System Correlation\\WORKSTATIONX_20180112-000001\\DataCollector01.blg\" -o C:\\temp\\foo.csv -f tsv`\n\nIf you find any input hangs, please send us the output so we can accommodate for it then use -Raw for an immediate solution.", "Tags": [ "Performance", @@ -23263,6 +24553,13 @@ "PerfCounter", "Relog" ], + "Synopsis": "Pipeline-compatible wrapper for the relog command which is available on modern Windows platforms.", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Invoke-DbaPfRelog", + "Availability": "Windows only", + "Links": "https://dbatools.io/Invoke-DbaPfRelog", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eInvoke-DbaPfRelog -Path C:\\temp\\perfmon.blg\nCreates C:\\temp\\perfmon.tsv from C:\\temp\\perfmon.blg.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eInvoke-DbaPfRelog -Path C:\\temp\\perfmon.blg -Destination C:\\temp\\a\\b\\c\nCreates the temp, a, and b directories if needed, then generates c.tsv (tab separated) from C:\\temp\\perfmon.blg.\nReturns the newly created file as a file object.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaPfDataCollectorSet -ComputerName sql2016 | Get-DbaPfDataCollector | Invoke-DbaPfRelog -Destination C:\\temp\\perf\nCreates C:\\temp\\perf if needed, then generates computername-datacollectorname.tsv (tab separated) from the latest logs of all data collector sets on sql2016. This destination format was chosen to \r\navoid naming conflicts with piped input.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eInvoke-DbaPfRelog -Path C:\\temp\\perfmon.blg -Destination C:\\temp\\a\\b\\c -Raw\n```\r\n[Invoke-DbaPfRelog][21:21:35] relog \"C:\\temp\\perfmon.blg\" -f csv -o C:\\temp\\a\\b\\c\nInput\r\n----------------\r\nFile(s):\r\nC:\\temp\\perfmon.blg (Binary)\nBegin: 1/13/2018 5:13:23\r\nEnd: 1/13/2018 14:29:55\r\nSamples: 2227\n100.00%\nOutput\r\n----------------\r\nFile: C:\\temp\\a\\b\\c.csv\nBegin: 1/13/2018 5:13:23\r\nEnd: 1/13/2018 14:29:55\r\nSamples: 2227\nThe command completed successfully.\r\n```\nCreates the temp, a, and b directories if needed, then generates c.tsv (tab separated) from C:\\temp\\perfmon.blg then outputs the raw results of the relog command.\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eInvoke-DbaPfRelog -Path \u0027C:\\temp\\perflog with spaces.blg\u0027 -Destination C:\\temp\\a\\b\\c -Type csv -BeginTime ((Get-Date).AddDays(-30)) -EndTime ((Get-Date).AddDays(-1))\nCreates the temp, a, and b directories if needed, then generates c.csv (comma separated) from C:\\temp\\perflog with spaces.blg\u0027, starts 30 days ago and ends one day ago.\n-------------------------- EXAMPLE 6 --------------------------\nPS C:\\\u003e$servers | Get-DbaPfDataCollectorSet | Get-DbaPfDataCollector | Invoke-DbaPfRelog -Multithread -AllowClobber\nRelogs latest data files from all collectors within the servers listed in $servers.\n-------------------------- EXAMPLE 7 --------------------------\nPS C:\\\u003eGet-DbaPfDataCollector -Collector DataCollector01 | Invoke-DbaPfRelog -AllowClobber -AllTime\nRelogs all the log files from the DataCollector01 on the local computer and allows overwrite.", "Params": [ [ "Path", @@ -23401,21 +24698,22 @@ "False" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Pipeline-compatible wrapper for the relog command which is available on modern Windows platforms.", - "Name": "Invoke-DbaPfRelog", - "Links": "https://dbatools.io/Invoke-DbaPfRelog", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eInvoke-DbaPfRelog -Path C:\\temp\\perfmon.blg\nCreates C:\\temp\\perfmon.tsv from C:\\temp\\perfmon.blg.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eInvoke-DbaPfRelog -Path C:\\temp\\perfmon.blg -Destination C:\\temp\\a\\b\\c\nCreates the temp, a, and b directories if needed, then generates c.tsv (tab separated) from C:\\temp\\perfmon.blg.\nReturns the newly created file as a file object.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaPfDataCollectorSet -ComputerName sql2016 | Get-DbaPfDataCollector | Invoke-DbaPfRelog -Destination C:\\temp\\perf\nCreates C:\\temp\\perf if needed, then generates computername-datacollectorname.tsv (tab separated) from the latest logs of all data collector sets on sql2016. This destination format was chosen to \r\navoid naming conflicts with piped input.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eInvoke-DbaPfRelog -Path C:\\temp\\perfmon.blg -Destination C:\\temp\\a\\b\\c -Raw\n```\r\n[Invoke-DbaPfRelog][21:21:35] relog \"C:\\temp\\perfmon.blg\" -f csv -o C:\\temp\\a\\b\\c\nInput\r\n----------------\r\nFile(s):\r\nC:\\temp\\perfmon.blg (Binary)\nBegin: 1/13/2018 5:13:23\r\nEnd: 1/13/2018 14:29:55\r\nSamples: 2227\n100.00%\nOutput\r\n----------------\r\nFile: C:\\temp\\a\\b\\c.csv\nBegin: 1/13/2018 5:13:23\r\nEnd: 1/13/2018 14:29:55\r\nSamples: 2227\nThe command completed successfully.\r\n```\nCreates the temp, a, and b directories if needed, then generates c.tsv (tab separated) from C:\\temp\\perfmon.blg then outputs the raw results of the relog command.\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eInvoke-DbaPfRelog -Path \u0027C:\\temp\\perflog with spaces.blg\u0027 -Destination C:\\temp\\a\\b\\c -Type csv -BeginTime ((Get-Date).AddDays(-30)) -EndTime ((Get-Date).AddDays(-1))\nCreates the temp, a, and b directories if needed, then generates c.csv (comma separated) from C:\\temp\\perflog with spaces.blg\u0027, starts 30 days ago and ends one day ago.\n-------------------------- EXAMPLE 6 --------------------------\nPS C:\\\u003e$servers | Get-DbaPfDataCollectorSet | Get-DbaPfDataCollector | Invoke-DbaPfRelog -Multithread -AllowClobber\nRelogs latest data files from all collectors within the servers listed in $servers.\n-------------------------- EXAMPLE 7 --------------------------\nPS C:\\\u003eGet-DbaPfDataCollector -Collector DataCollector01 | Invoke-DbaPfRelog -AllowClobber -AllTime\nRelogs all the log files from the DataCollector01 on the local computer and allows overwrite.", "Syntax": "Invoke-DbaPfRelog [[-Path] \u003cString[]\u003e] [[-Destination] \u003cString\u003e] [[-Type] \u003cString\u003e] [-Append] [-AllowClobber] [[-PerformanceCounter] \u003cString[]\u003e] [[-PerformanceCounterPath] \u003cString\u003e] [[-Interval] \u003cInt32\u003e] [[-BeginTime] \u003cDateTime\u003e] [[-EndTime] \u003cDateTime\u003e] [[-ConfigPath] \u003cString\u003e] [-Summary] [[-InputObject] \u003cObject[]\u003e] [-Multithread] [-AllTime] [-Raw] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Invoke-DbaQuery", + "Name": "Invoke-DbaQuery", "Description": "This function is a wrapper command around Invoke-DbaAsync, which in turn is based on Invoke-SqlCmd2.\nIt was designed to be more convenient to use in a pipeline and to behave in a way consistent with the rest of our functions.", "Tags": [ "Database", "Query" ], + "Synopsis": "A command to run explicit T-SQL commands or files.", + "Alias": "Invoke-DbaCmd,Invoke-DbaSqlQuery", + "Author": "Friedrich Weinmann (@FredWeinmann)", + "CommandName": "Invoke-DbaQuery", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Invoke-DbaQuery", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eInvoke-DbaQuery -SqlInstance server\\instance -Query \u0027SELECT foo FROM bar\u0027\nRuns the sql query \u0027SELECT foo FROM bar\u0027 against the instance \u0027server\\instance\u0027\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaCmsRegServer -SqlInstance [SERVERNAME] -Group [GROUPNAME] | Invoke-DbaQuery -Query \u0027SELECT foo FROM bar\u0027\nRuns the sql query \u0027SELECT foo FROM bar\u0027 against all instances in the group [GROUPNAME] on the CMS [SERVERNAME]\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003e\"server1\", \"server1\\nordwind\", \"server2\" | Invoke-DbaQuery -File \"C:\\scripts\\sql\\rebuild.sql\"\nRuns the sql commands stored in rebuild.sql against the instances \"server1\", \"server1\\nordwind\" and \"server2\"\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaDatabase -SqlInstance \"server1\", \"server1\\nordwind\", \"server2\" | Invoke-DbaQuery -File \"C:\\scripts\\sql\\rebuild.sql\"\nRuns the sql commands stored in rebuild.sql against all accessible databases of the instances \"server1\", \"server1\\nordwind\" and \"server2\"\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eInvoke-DbaQuery -SqlInstance . -Query \u0027SELECT * FROM users WHERE Givenname = @name\u0027 -SqlParameters @{ Name = \"Maria\" }\nExecutes a simple query against the users table using SQL Parameters.\r\nThis avoids accidental SQL Injection and is the safest way to execute queries with dynamic content.\r\nKeep in mind the limitations inherent in parameters - it is quite impossible to use them for content references.\r\nWhile it is possible to parameterize a where condition, it is impossible to use this to select which columns to select.\r\nThe inserted text will always be treated as string content, and not as a reference to any SQL entity (such as columns, tables or databases).\n-------------------------- EXAMPLE 6 --------------------------\nPS C:\\\u003eInvoke-DbaQuery -SqlInstance aglistener1 -ReadOnly -Query \"select something from readonlydb.dbo.atable\"\nExecutes a query with ReadOnly application intent on aglistener1.", "Params": [ [ "SqlInstance", @@ -23513,6 +24811,14 @@ "true (ByValue)", "" ], + [ + "ReadOnly", + "Execute the query with ReadOnly application intent.", + "", + false, + "false", + "False" + ], [ "EnableException", "By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message.\r\nThis avoids overwhelming you with \"sea of red\" exceptions, but is inconvenient because it basically disables advanced scripting.\r\nUsing this switch turns this \"nice by default\" feature off and enables you to catch exceptions with your own try/catch.", @@ -23522,18 +24828,19 @@ "False" ] ], - "Alias": "Invoke-DbaCmd,Invoke-DbaSqlQuery", - "Author": "Friedrich Weinmann (@FredWeinmann)", - "Synopsis": "A command to run explicit T-SQL commands or files.", - "Name": "Invoke-DbaQuery", - "Links": "https://dbatools.io/Invoke-DbaQuery", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eInvoke-DbaQuery -SqlInstance server\\instance -Query \u0027SELECT foo FROM bar\u0027\nRuns the sql query \u0027SELECT foo FROM bar\u0027 against the instance \u0027server\\instance\u0027\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaCmsRegServer -SqlInstance [SERVERNAME] -Group [GROUPNAME] | Invoke-DbaQuery -Query \u0027SELECT foo FROM bar\u0027\nRuns the sql query \u0027SELECT foo FROM bar\u0027 against all instances in the group [GROUPNAME] on the CMS [SERVERNAME]\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003e\"server1\", \"server1\\nordwind\", \"server2\" | Invoke-DbaQuery -File \"C:\\scripts\\sql\\rebuild.sql\"\nRuns the sql commands stored in rebuild.sql against the instances \"server1\", \"server1\\nordwind\" and \"server2\"\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaDatabase -SqlInstance \"server1\", \"server1\\nordwind\", \"server2\" | Invoke-DbaQuery -File \"C:\\scripts\\sql\\rebuild.sql\"\nRuns the sql commands stored in rebuild.sql against all accessible databases of the instances \"server1\", \"server1\\nordwind\" and \"server2\"", - "Syntax": "Invoke-DbaQuery [-SqlInstance \u003cDbaInstanceParameter[]\u003e] [-SqlCredential \u003cPSCredential\u003e] [-Database \u003cString\u003e] [-Query] \u003cString\u003e [-QueryTimeout \u003cInt32\u003e] [-As \u003cString\u003e] [-SqlParameters \u003cIDictionary\u003e] [-AppendServerInstance] [-MessagesToOutput] [-InputObject \u003cDatabase[]\u003e] [-EnableException] [\u003cCommonParameters\u003e]\nInvoke-DbaQuery [-SqlInstance \u003cDbaInstanceParameter[]\u003e] [-SqlCredential \u003cPSCredential\u003e] [-Database \u003cString\u003e] [-QueryTimeout \u003cInt32\u003e] -File \u003cObject[]\u003e [-As \u003cString\u003e] [-SqlParameters \u003cIDictionary\u003e] [-AppendServerInstance] [-MessagesToOutput] [-InputObject \u003cDatabase[]\u003e] [-EnableException] [\u003cCommonParameters\u003e]\nInvoke-DbaQuery [-SqlInstance \u003cDbaInstanceParameter[]\u003e] [-SqlCredential \u003cPSCredential\u003e] [-Database \u003cString\u003e] [-QueryTimeout \u003cInt32\u003e] -SqlObject \u003cSqlSmoObject[]\u003e [-As \u003cString\u003e] [-SqlParameters \u003cIDictionary\u003e] [-AppendServerInstance] [-MessagesToOutput] [-InputObject \u003cDatabase[]\u003e] [-EnableException] [\u003cCommonParameters\u003e]" + "Syntax": "Invoke-DbaQuery [-SqlInstance \u003cDbaInstanceParameter[]\u003e] [-SqlCredential \u003cPSCredential\u003e] [-Database \u003cString\u003e] [-Query] \u003cString\u003e [-QueryTimeout \u003cInt32\u003e] [-As \u003cString\u003e] [-SqlParameters \u003cIDictionary\u003e] [-AppendServerInstance] [-MessagesToOutput] [-InputObject \u003cDatabase[]\u003e] [-ReadOnly] [-EnableException] [\u003cCommonParameters\u003e]\nInvoke-DbaQuery [-SqlInstance \u003cDbaInstanceParameter[]\u003e] [-SqlCredential \u003cPSCredential\u003e] [-Database \u003cString\u003e] [-QueryTimeout \u003cInt32\u003e] -File \u003cObject[]\u003e [-As \u003cString\u003e] [-SqlParameters \u003cIDictionary\u003e] [-AppendServerInstance] [-MessagesToOutput] [-InputObject \u003cDatabase[]\u003e] [-ReadOnly] [-EnableException] [\u003cCommonParameters\u003e]\nInvoke-DbaQuery [-SqlInstance \u003cDbaInstanceParameter[]\u003e] [-SqlCredential \u003cPSCredential\u003e] [-Database \u003cString\u003e] [-QueryTimeout \u003cInt32\u003e] -SqlObject \u003cSqlSmoObject[]\u003e [-As \u003cString\u003e] [-SqlParameters \u003cIDictionary\u003e] [-AppendServerInstance] [-MessagesToOutput] [-InputObject \u003cDatabase[]\u003e] [-ReadOnly] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Invoke-DbatoolsFormatter", + "Name": "Invoke-DbatoolsFormatter", "Description": "Uses PSSA\u0027s Invoke-Formatter to format the target files and saves it without the BOM.", "Tags": "Formatting", + "Synopsis": "Helps formatting function files to dbatools\u0027 standards", + "Alias": "", + "Author": "Simone Bizzotto", + "CommandName": "Invoke-DbatoolsFormatter", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Invoke-DbatoolsFormatter", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eInvoke-DbatoolsFormatter -Path C:\\dbatools\\functions\\Get-DbaDatabase.ps1\nReformats C:\\dbatools\\functions\\Get-DbaDatabase.ps1 to dbatools\u0027 standards", "Params": [ [ "Path", @@ -23552,18 +24859,19 @@ "False" ] ], - "Alias": "", - "Author": "Simone Bizzotto", - "Synopsis": "Helps formatting function files to dbatools\u0027 standards", - "Name": "Invoke-DbatoolsFormatter", - "Links": "https://dbatools.io/Invoke-DbatoolsFormatter", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eInvoke-DbatoolsFormatter -Path C:\\dbatools\\functions\\Get-DbaDatabase.ps1\nReformats C:\\dbatools\\functions\\Get-DbaDatabase.ps1 to dbatools\u0027 standards", "Syntax": "Invoke-DbatoolsFormatter [-Path] \u003cObject[]\u003e [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Invoke-DbatoolsRenameHelper", + "Name": "Invoke-DbatoolsRenameHelper", "Description": "Older dbatools command names have been changed. This script helps keep up.", "Tags": "Module", + "Synopsis": "Older dbatools command names have been changed. This script helps keep up.", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Invoke-DbatoolsRenameHelper", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Invoke-DbatoolsRenameHelper", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-ChildItem C:\\temp\\ps\\*.ps1 -Recurse | Invoke-DbatoolsRenameHelper\nChecks to see if any ps1 file in C:\\temp\\ps matches an old command name.\r\nIf so, then the command name within the text is updated and the resulting changes are written to disk in UTF-8.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-ChildItem C:\\temp\\ps\\*.ps1 -Recurse | Invoke-DbatoolsRenameHelper -Encoding Ascii -WhatIf\nShows what would happen if the command would run. If the command would run and there were matches,\r\nthe resulting changes would be written to disk as Ascii encoded.", "Params": [ [ "InputObject", @@ -23606,22 +24914,23 @@ "" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Older dbatools command names have been changed. This script helps keep up.", - "Name": "Invoke-DbatoolsRenameHelper", - "Links": "https://dbatools.io/Invoke-DbatoolsRenameHelper", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-ChildItem C:\\temp\\ps\\*.ps1 -Recurse | Invoke-DbatoolsRenameHelper\nChecks to see if any ps1 file in C:\\temp\\ps matches an old command name.\r\nIf so, then the command name within the text is updated and the resulting changes are written to disk in UTF-8.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-ChildItem C:\\temp\\ps\\*.ps1 -Recurse | Invoke-DbatoolsRenameHelper -Encoding Ascii -WhatIf\nShows what would happen if the command would run. If the command would run and there were matches,\r\nthe resulting changes would be written to disk as Ascii encoded.", "Syntax": "Invoke-DbatoolsRenameHelper [-InputObject] \u003cFileInfo[]\u003e [[-Encoding] \u003cString\u003e] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Invoke-DbaWhoIsActive", + "Name": "Invoke-DbaWhoIsActive", "Description": "Output results of Adam Machanic\u0027s sp_WhoIsActive\n\nThis command was built with Adam\u0027s permission. To read more about sp_WhoIsActive, please visit:\n\nUpdates: http://sqlblog.com/blogs/adam_machanic/archive/tags/who+is+active/default.aspx\n\nAlso, consider donating to Adam if you find this stored procedure helpful: http://tinyurl.com/WhoIsActiveDonate", "Tags": [ "AdamMechanic", "WhoIsActive", "SpWhoIsActive" ], + "Synopsis": "Outputs results of Adam Machanic\u0027s sp_WhoIsActive DataTable", + "Alias": "Show-SqlWhoIsActive", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Invoke-DbaWhoIsActive", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Invoke-DbaWhoIsActive", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eInvoke-DbaWhoIsActive -SqlInstance sqlserver2014a\nExecute sp_whoisactive on sqlserver2014a. This command expects sp_WhoIsActive to be in the master database. Logs into the SQL Server with Windows credentials.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eInvoke-DbaWhoIsActive -SqlInstance sqlserver2014a -SqlCredential $credential -Database dbatools\nExecute sp_whoisactive on sqlserver2014a. This command expects sp_WhoIsActive to be in the dbatools database. Logs into the SQL Server with SQL Authentication.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eInvoke-DbaWhoIsActive -SqlInstance sqlserver2014a -GetAverageTime\nSimilar to running sp_WhoIsActive @get_avg_time\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eInvoke-DbaWhoIsActive -SqlInstance sqlserver2014a -GetOuterCommand -FindBlockLeaders\nSimilar to running sp_WhoIsActive @get_outer_command = 1, @find_block_leaders = 1", "Params": [ [ "SqlInstance", @@ -23848,22 +25157,23 @@ "False" ] ], - "Alias": "Show-SqlWhoIsActive", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Outputs results of Adam Machanic\u0027s sp_WhoIsActive DataTable", - "Name": "Invoke-DbaWhoIsActive", - "Links": "https://dbatools.io/Invoke-DbaWhoIsActive", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eInvoke-DbaWhoIsActive -SqlInstance sqlserver2014a\nExecute sp_whoisactive on sqlserver2014a. This command expects sp_WhoIsActive to be in the master database. Logs into the SQL Server with Windows credentials.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eInvoke-DbaWhoIsActive -SqlInstance sqlserver2014a -SqlCredential $credential -Database dbatools\nExecute sp_whoisactive on sqlserver2014a. This command expects sp_WhoIsActive to be in the dbatools database. Logs into the SQL Server with SQL Authentication.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eInvoke-DbaWhoIsActive -SqlInstance sqlserver2014a -GetAverageTime\nSimilar to running sp_WhoIsActive @get_avg_time\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eInvoke-DbaWhoIsActive -SqlInstance sqlserver2014a -GetOuterCommand -FindBlockLeaders\nSimilar to running sp_WhoIsActive @get_outer_command = 1, @find_block_leaders = 1", "Syntax": "Invoke-DbaWhoIsActive [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [[-Database] \u003cObject\u003e] [[-Filter] \u003cString\u003e] [[-FilterType] \u003cString\u003e] [[-NotFilter] \u003cString\u003e] [[-NotFilterType] \u003cString\u003e] [-ShowOwnSpid] [-ShowSystemSpids] [[-ShowSleepingSpids] \u003cInt32\u003e] [-GetFullInnerText] [[-GetPlans] \u003cInt32\u003e] [-GetOuterCommand] [-GetTransactionInfo] [[-GetTaskInfo] \u003cInt32\u003e] [-GetLocks] [-GetAverageTime] [-GetAdditonalInfo] [-FindBlockLeaders] [[-DeltaInterval] \u003cInt32\u003e] [[-OutputColumnList] \u003cString\u003e] [[-SortOrder] \u003cString\u003e] [[-FormatOutput] \u003cInt32\u003e] [[-DestinationTable] \u003cString\u003e] \r\n[-ReturnSchema] [[-Schema] \u003cString\u003e] [-Help] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Invoke-DbaXeReplay", + "Name": "Invoke-DbaXeReplay", "Description": "This command replays events from Read-DbaXEFile. It is simplistic in its approach.\n\n- Writes all queries to a temp sql file\n- Executes temp file using . $sqlcmd so that batches are executed properly\n- Deletes temp file", "Tags": [ "ExtendedEvent", "XE", "XEvent" ], + "Synopsis": "This command replays events from Read-DbaXEFile on one or more target servers", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Invoke-DbaXeReplay", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Invoke-DbaXEReplay", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eRead-DbaXEFile -Path C:\\temp\\sample.xel | Invoke-DbaXeReplay -SqlInstance sql2017\nRuns all batch_text for sql_batch_completed against tempdb on sql2017.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eRead-DbaXEFile -Path C:\\temp\\sample.xel | Invoke-DbaXeReplay -SqlInstance sql2017 -Database planning -Event sql_batch_completed\nSets the *initial* database to planning then runs only sql_batch_completed against sql2017.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eRead-DbaXEFile -Path C:\\temp\\sample.xel | Invoke-DbaXeReplay -SqlInstance sql2017, sql2016\nRuns all batch_text for sql_batch_completed against tempdb on sql2017 and sql2016.", "Params": [ [ "SqlInstance", @@ -23922,22 +25232,23 @@ "False" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "This command replays events from Read-DbaXEFile on one or more target servers", - "Name": "Invoke-DbaXeReplay", - "Links": "https://dbatools.io/Invoke-DbaXEReplay", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eRead-DbaXEFile -Path C:\\temp\\sample.xel | Invoke-DbaXeReplay -SqlInstance sql2017\nRuns all batch_text for sql_batch_completed against tempdb on sql2017.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eRead-DbaXEFile -Path C:\\temp\\sample.xel | Invoke-DbaXeReplay -SqlInstance sql2017 -Database planning -Event sql_batch_completed\nSets the *initial* database to planning then runs only sql_batch_completed against sql2017.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eRead-DbaXEFile -Path C:\\temp\\sample.xel | Invoke-DbaXeReplay -SqlInstance sql2017, sql2016\nRuns all batch_text for sql_batch_completed against tempdb on sql2017 and sql2016.", "Syntax": "Invoke-DbaXeReplay [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [[-Database] \u003cString[]\u003e] [[-Event] \u003cString[]\u003e] [-InputObject] \u003cObject\u003e [-Raw] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Join-DbaAvailabilityGroup", + "Name": "Join-DbaAvailabilityGroup", "Description": "Joins a secondary replica to an availability group on a SQL Server instance.", "Tags": [ "AvailabilityGroup", "HA", "AG" ], + "Synopsis": "Joins a secondary replica to an availability group on a SQL Server instance.", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Join-DbaAvailabilityGroup", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Join-DbaAvailabilityGroup", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaAvailabilityGroup -SqlInstance sql01 -AvailabilityGroup SharePoint | Join-DbaAvailabilityGroup -SqlInstance sql02\nJoins sql02 to the SharePoint availability group on sql01\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003e$ag = Get-DbaAvailabilityGroup -SqlInstance sql01 -AvailabilityGroup SharePoint\nPS C:\\\u003e Join-DbaAvailabilityGroup -SqlInstance sql02 -InputObject $ag\nJoins sql02 to the SharePoint availability group on sql01\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaAvailabilityGroup -SqlInstance sql01 -AvailabilityGroup SharePoint | Join-DbaAvailabilityGroup -SqlInstance sql02 -WhatIf\nShows what would happen if the command were to run. No actions are actually performed.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaAvailabilityGroup -SqlInstance sql01 -AvailabilityGroup SharePoint | Join-DbaAvailabilityGroup -SqlInstance sql02 -Confirm\nPrompts for confirmation then joins sql02 to the SharePoint availability group on sql01.", "Params": [ [ "SqlInstance", @@ -24004,17 +25315,17 @@ "" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Joins a secondary replica to an availability group on a SQL Server instance.", - "Name": "Join-DbaAvailabilityGroup", - "Links": "https://dbatools.io/Join-DbaAvailabilityGroup", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaAvailabilityGroup -SqlInstance sql01 -AvailabilityGroup SharePoint | Join-DbaAvailabilityGroup -SqlInstance sql02\nJoins sql02 to the SharePoint availability group on sql01\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003e$ag = Get-DbaAvailabilityGroup -SqlInstance sql01 -AvailabilityGroup SharePoint\nPS C:\\\u003e Join-DbaAvailabilityGroup -SqlInstance sql02 -InputObject $ag\nJoins sql02 to the SharePoint availability group on sql01\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaAvailabilityGroup -SqlInstance sql01 -AvailabilityGroup SharePoint | Join-DbaAvailabilityGroup -SqlInstance sql02 -WhatIf\nShows what would happen if the command were to run. No actions are actually performed.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaAvailabilityGroup -SqlInstance sql01 -AvailabilityGroup SharePoint | Join-DbaAvailabilityGroup -SqlInstance sql02 -Confirm\nPrompts for confirmation then joins sql02 to the SharePoint availability group on sql01.", "Syntax": "Join-DbaAvailabilityGroup [[-SqlInstance] \u003cDbaInstanceParameter[]\u003e] [[-SqlCredential] \u003cPSCredential\u003e] [[-AvailabilityGroup] \u003cString[]\u003e] [[-ClusterType] \u003cString\u003e] [[-InputObject] \u003cAvailabilityGroup[]\u003e] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Join-DbaPath", + "Name": "Join-DbaPath", "Description": "Performs multisegment path joins.", + "Synopsis": "Performs multisegment path joins.", + "Alias": "", + "CommandName": "Join-DbaPath", + "Availability": "Windows, Linux, macOS", + "Links": null, + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eJoin-DbaPath -Path \u0027C:\\temp\u0027 \u0027Foo\u0027 \u0027Bar\u0027\nReturns \u0027C:\\temp\\Foo\\Bar\u0027 on windows.\r\nReturns \u0027C:/temp/Foo/Bar\u0027 on non-windows.", "Params": [ [ "Path", @@ -24033,20 +25344,22 @@ "" ] ], - "Alias": "", - "Synopsis": "Performs multisegment path joins.", - "Name": "Join-DbaPath", - "Links": null, - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eJoin-DbaPath -Path \u0027C:\\temp\u0027 \u0027Foo\u0027 \u0027Bar\u0027\nReturns \u0027C:\\temp\\Foo\\Bar\u0027 on windows.\r\nReturns \u0027C:/temp/Foo/Bar\u0027 on non-windows.", "Syntax": "Join-DbaPath [-Path] \u003cString\u003e [-Child \u003cString[]\u003e] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Measure-DbaBackupThroughput", + "Name": "Measure-DbaBackupThroughput", "Description": "Returns backup history details for one or more databases on a SQL Server.\n\nOutput looks like this:\nSqlInstance : sql2016\nDatabase : SharePoint_Config\nAvgThroughput : 1.07 MB\nAvgSize : 24.17\nAvgDuration : 00:00:01.1000000\nMinThroughput : 0.02 MB\nMaxThroughput : 2.26 MB\nMinBackupDate : 8/6/2015 10:22:01 PM\nMaxBackupDate : 6/19/2016 12:57:45 PM\nBackupCount : 10", "Tags": [ "Backup", "Database" ], + "Synopsis": "Determines how quickly SQL Server is backing up databases to media.", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Measure-DbaBackupThroughput", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Measure-DbaBackupThroughput", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eMeasure-DbaBackupThroughput -SqlInstance sql2016\nParses every backup in msdb\u0027s backuphistory for stats on all databases.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eMeasure-DbaBackupThroughput -SqlInstance sql2016 -Database AdventureWorks2014\nParses every backup in msdb\u0027s backuphistory for stats on AdventureWorks2014.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eMeasure-DbaBackupThroughput -SqlInstance sql2005 -Last\nProcesses the last full, diff and log backups every backup for all databases on sql2005.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eMeasure-DbaBackupThroughput -SqlInstance sql2005 -Last -Type Log\nProcesses the last log backups every backup for all databases on sql2005.\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eMeasure-DbaBackupThroughput -SqlInstance sql2016 -Since (Get-Date).AddDays(-7) | Where-Object { $_.MinThroughput.Gigabyte -gt 1 }\nGets backup calculations for the last week and filters results that have a minimum of 1GB throughput\n-------------------------- EXAMPLE 6 --------------------------\nPS C:\\\u003eMeasure-DbaBackupThroughput -SqlInstance sql2016 -Since (Get-Date).AddDays(-365) -Database bigoldb\nGets backup calculations, limited to the last year and only the bigoldb database", "Params": [ [ "SqlInstance", @@ -24121,22 +25434,23 @@ "False" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Determines how quickly SQL Server is backing up databases to media.", - "Name": "Measure-DbaBackupThroughput", - "Links": "https://dbatools.io/Measure-DbaBackupThroughput", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eMeasure-DbaBackupThroughput -SqlInstance sql2016\nParses every backup in msdb\u0027s backuphistory for stats on all databases.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eMeasure-DbaBackupThroughput -SqlInstance sql2016 -Database AdventureWorks2014\nParses every backup in msdb\u0027s backuphistory for stats on AdventureWorks2014.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eMeasure-DbaBackupThroughput -SqlInstance sql2005 -Last\nProcesses the last full, diff and log backups every backup for all databases on sql2005.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eMeasure-DbaBackupThroughput -SqlInstance sql2005 -Last -Type Log\nProcesses the last log backups every backup for all databases on sql2005.\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eMeasure-DbaBackupThroughput -SqlInstance sql2016 -Since (Get-Date).AddDays(-7) | Where-Object { $_.MinThroughput.Gigabyte -gt 1 }\nGets backup calculations for the last week and filters results that have a minimum of 1GB throughput\n-------------------------- EXAMPLE 6 --------------------------\nPS C:\\\u003eMeasure-DbaBackupThroughput -SqlInstance sql2016 -Since (Get-Date).AddDays(-365) -Database bigoldb\nGets backup calculations, limited to the last year and only the bigoldb database", "Syntax": "Measure-DbaBackupThroughput [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [-SqlCredential \u003cPSCredential\u003e] [-Database \u003cObject[]\u003e] [-ExcludeDatabase \u003cObject[]\u003e] [-Since \u003cDateTime\u003e] [-Last] [-Type \u003cString\u003e] [-DeviceType \u003cString[]\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Measure-DbaDiskSpaceRequirement", + "Name": "Measure-DbaDiskSpaceRequirement", "Description": "Returns a file list from source and destination where source file may overwrite destination. Complex scenarios where a new file may exist is taken into account.\nThis command will accept a hash object in pipeline with the following keys: Source, SourceDatabase, Destination. Using this command will provide a way to prepare before a complex migration with multiple databases from different sources and destinations.", "Tags": [ "Database", "DiskSpace", "Migration" ], + "Synopsis": "Calculate the space needed to copy and possibly replace a database from one SQL server to another.", + "Alias": "", + "Author": "Pollus Brodeur (@pollusb)", + "CommandName": "Measure-DbaDiskSpaceRequirement", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Measure-DbaDiskSpaceRequirement", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eMeasure-DbaDiskSpaceRequirement -Source INSTANCE1 -Database DB1 -Destination INSTANCE2\nCalculate space needed for a simple migration with one database with the same name at destination.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003e@(\n\u003e\u003e [PSCustomObject]@{Source=\u0027SQL1\u0027;Destination=\u0027SQL2\u0027;Database=\u0027DB1\u0027},\r\n\u003e\u003e [PSCustomObject]@{Source=\u0027SQL1\u0027;Destination=\u0027SQL2\u0027;Database=\u0027DB2\u0027}\r\n\u003e\u003e ) | Measure-DbaDiskSpaceRequirement\nUsing a PSCustomObject with 2 databases to migrate on SQL2.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eImport-Csv -Path .\\migration.csv -Delimiter \"`t\" | Measure-DbaDiskSpaceRequirement | Format-Table -AutoSize\nUsing a CSV file. You will need to use this header line \"Source\u003ctab\u003eDestination\u003ctab\u003eDatabase\u003ctab\u003eDestinationDatabase\".\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003e$qry = \"SELECT Source, Destination, Database FROM dbo.Migrations\"\nPS C:\\\u003e Invoke-DbaCmd -SqlInstance DBA -Database Migrations -Query $qry | Measure-DbaDiskSpaceRequirement\nUsing a SQL table. We are DBA after all!", "Params": [ [ "Source", @@ -24203,33 +25517,35 @@ "False" ] ], - "Alias": "", - "Author": "Pollus Brodeur (@pollusb)", - "Synopsis": "Calculate the space needed to copy and possibly replace a database from one SQL server to another.", - "Name": "Measure-DbaDiskSpaceRequirement", - "Links": "https://dbatools.io/Measure-DbaDiskSpaceRequirement", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eMeasure-DbaDiskSpaceRequirement -Source INSTANCE1 -Database DB1 -Destination INSTANCE2\nCalculate space needed for a simple migration with one database with the same name at destination.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003e@(\n\u003e\u003e [PSCustomObject]@{Source=\u0027SQL1\u0027;Destination=\u0027SQL2\u0027;Database=\u0027DB1\u0027},\r\n\u003e\u003e [PSCustomObject]@{Source=\u0027SQL1\u0027;Destination=\u0027SQL2\u0027;Database=\u0027DB2\u0027}\r\n\u003e\u003e ) | Measure-DbaDiskSpaceRequirement\nUsing a PSCustomObject with 2 databases to migrate on SQL2.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eImport-Csv -Path .\\migration.csv -Delimiter \"`t\" | Measure-DbaDiskSpaceRequirement | Format-Table -AutoSize\nUsing a CSV file. You will need to use this header line \"Source\u003ctab\u003eDestination\u003ctab\u003eDatabase\u003ctab\u003eDestinationDatabase\".\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003e$qry = \"SELECT Source, Destination, Database FROM dbo.Migrations\"\nPS C:\\\u003e Invoke-DbaCmd -SqlInstance DBA -Database Migrations -Query $qry | Measure-DbaDiskSpaceRequirement\nUsing a SQL table. We are DBA after all!", "Syntax": "Measure-DbaDiskSpaceRequirement [-Source] \u003cDbaInstanceParameter\u003e [-Database] \u003cString\u003e [[-SourceSqlCredential] \u003cPSCredential\u003e] [-Destination] \u003cDbaInstanceParameter\u003e [[-DestinationDatabase] \u003cString\u003e] [[-DestinationSqlCredential] \u003cPSCredential\u003e] [[-Credential] \u003cPSCredential\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Measure-DbatoolsImport", + "Name": "Measure-DbatoolsImport", "Description": "Displays the import load times of the dbatools PowerShell module", "Tags": "Debug", - "Params": [ - - ], + "Synopsis": "Displays the import load times of the dbatools PowerShell module", "Alias": "", "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Displays the import load times of the dbatools PowerShell module", - "Name": "Measure-DbatoolsImport", + "CommandName": "Measure-DbatoolsImport", + "Availability": "Windows, Linux, macOS", "Links": "https://dbatools.io/Measure-DbatoolsImport", "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eMeasure-DbatoolsImport\nDisplays the import load times of the dbatools PowerShell module\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eImport-Module dbatools\nPS C:\\\u003e Measure-DbatoolsImport\nDisplays the import load times of the dbatools PowerShell module", + "Params": [ + + ], "Syntax": "Measure-DbatoolsImport [\u003cCommonParameters\u003e]" }, { - "CommandName": "Mount-DbaDatabase", + "Name": "Mount-DbaDatabase", "Description": "This command will attach a SQL Server database.", "Tags": "Database", + "Synopsis": "Attach a SQL Server Database - aliased to Attach-DbaDatabase", + "Alias": "Attach-DbaDatabase", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Mount-DbaDatabase", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Mount-DbaDatabase", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003e$fileStructure = New-Object System.Collections.Specialized.StringCollection\nPS C:\\\u003e $fileStructure.Add(\"E:\\archive\\example.mdf\")\r\nPS C:\\\u003e $filestructure.Add(\"E:\\archive\\example.ldf\")\r\nPS C:\\\u003e $filestructure.Add(\"E:\\archive\\example.ndf\")\r\nPS C:\\\u003e Mount-DbaDatabase -SqlInstance sql2016 -Database example -FileStructure $fileStructure\nAttaches a database named \"example\" to sql2016 with the files \"E:\\archive\\example.mdf\", \"E:\\archive\\example.ldf\" and \"E:\\archive\\example.ndf\". The database owner will be set to sa and the attach \r\noption is None.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eMount-DbaDatabase -SqlInstance sql2016 -Database example\nSince the FileStructure was not provided, this command will attempt to determine it based on backup history. If found, a database named example will be attached to sql2016.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eMount-DbaDatabase -SqlInstance sql2016 -Database example -WhatIf\nShows what would happen if the command were executed (without actually performing the command)", "Params": [ [ "SqlInstance", @@ -24304,21 +25620,22 @@ "" ] ], - "Alias": "Attach-DbaDatabase", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Attach a SQL Server Database - aliased to Attach-DbaDatabase", - "Name": "Mount-DbaDatabase", - "Links": "https://dbatools.io/Mount-DbaDatabase", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003e$fileStructure = New-Object System.Collections.Specialized.StringCollection\nPS C:\\\u003e $fileStructure.Add(\"E:\\archive\\example.mdf\")\r\nPS C:\\\u003e $filestructure.Add(\"E:\\archive\\example.ldf\")\r\nPS C:\\\u003e $filestructure.Add(\"E:\\archive\\example.ndf\")\r\nPS C:\\\u003e Mount-DbaDatabase -SqlInstance sql2016 -Database example -FileStructure $fileStructure\nAttaches a database named \"example\" to sql2016 with the files \"E:\\archive\\example.mdf\", \"E:\\archive\\example.ldf\" and \"E:\\archive\\example.ndf\". The database owner will be set to sa and the attach \r\noption is None.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eMount-DbaDatabase -SqlInstance sql2016 -Database example\nSince the FileStructure was not provided, this command will attempt to determine it based on backup history. If found, a database named example will be attached to sql2016.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eMount-DbaDatabase -SqlInstance sql2016 -Database example -WhatIf\nShows what would happen if the command were executed (without actually performing the command)", "Syntax": "Mount-DbaDatabase [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [-Database] \u003cString[]\u003e [[-FileStructure] \u003cStringCollection\u003e] [[-DatabaseOwner] \u003cString\u003e] [[-AttachOption] \u003cString\u003e] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Move-DbaCmsRegServer", + "Name": "Move-DbaCmsRegServer", "Description": "Moves registered servers around SQL Server Central Management Server (CMS)", "Tags": [ "RegisteredServer", "CMS" ], + "Synopsis": "Moves registered servers around SQL Server Central Management Server (CMS)", + "Alias": "Move-DbaRegisteredServer", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Move-DbaCmsRegServer", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Move-DbaCmsRegServer", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eMove-DbaCmsRegServer -SqlInstance sql2012 -Name \u0027Web SQL Cluster\u0027 -NewGroup HR\\Prod\nMoves the registered server on sql2012 titled \u0027Web SQL Cluster\u0027 to the Prod group within the HR group\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaCmsRegServer -SqlInstance sql2017 -Name \u0027Web SQL Cluster\u0027 | Move-DbaCmsRegServer -NewGroup Web\nMoves the registered server \u0027Web SQL Cluster\u0027 on sql2017 to the Web group, also on sql2017", "Params": [ [ "SqlInstance", @@ -24393,21 +25710,22 @@ "" ] ], - "Alias": "Move-DbaRegisteredServer", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Moves registered servers around SQL Server Central Management Server (CMS)", - "Name": "Move-DbaCmsRegServer", - "Links": "https://dbatools.io/Move-DbaCmsRegServer", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eMove-DbaCmsRegServer -SqlInstance sql2012 -Name \u0027Web SQL Cluster\u0027 -NewGroup HR\\Prod\nMoves the registered server on sql2012 titled \u0027Web SQL Cluster\u0027 to the Prod group within the HR group\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaCmsRegServer -SqlInstance sql2017 -Name \u0027Web SQL Cluster\u0027 | Move-DbaCmsRegServer -NewGroup Web\nMoves the registered server \u0027Web SQL Cluster\u0027 on sql2017 to the Web group, also on sql2017", "Syntax": "Move-DbaCmsRegServer [[-SqlInstance] \u003cDbaInstanceParameter[]\u003e] [[-SqlCredential] \u003cPSCredential\u003e] [[-Name] \u003cString[]\u003e] [[-ServerName] \u003cString[]\u003e] [[-NewGroup] \u003cString\u003e] [[-InputObject] \u003cRegisteredServer[]\u003e] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Move-DbaCmsRegServerGroup", + "Name": "Move-DbaCmsRegServerGroup", "Description": "Moves registered server groups around SQL Server Central Management Server (CMS).", "Tags": [ "RegisteredServer", "CMS" ], + "Synopsis": "Moves registered server groups around SQL Server Central Management Server (CMS).", + "Alias": "Move-DbaRegisteredServerGroup", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Move-DbaCmsRegServerGroup", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Move-DbaCmsRegServerGroup", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eMove-DbaCmsRegServerGroup -SqlInstance sql2012 -Group HR\\Development -NewGroup AD\\Prod\nMoves the Development group within HR to the Prod group within AD\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaCmsRegServerGroup -SqlInstance sql2017 -Group HR\\Development| Move-DbaCmsRegServer -NewGroup Web\nMoves the Development group within HR to the Web group", "Params": [ [ "SqlInstance", @@ -24474,22 +25792,23 @@ "" ] ], - "Alias": "Move-DbaRegisteredServerGroup", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Moves registered server groups around SQL Server Central Management Server (CMS).", - "Name": "Move-DbaCmsRegServerGroup", - "Links": "https://dbatools.io/Move-DbaCmsRegServerGroup", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eMove-DbaCmsRegServerGroup -SqlInstance sql2012 -Group HR\\Development -NewGroup AD\\Prod\nMoves the Development group within HR to the Prod group within AD\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaCmsRegServerGroup -SqlInstance sql2017 -Group HR\\Development| Move-DbaCmsRegServer -NewGroup Web\nMoves the Development group within HR to the Web group", "Syntax": "Move-DbaCmsRegServerGroup [[-SqlInstance] \u003cDbaInstanceParameter[]\u003e] [[-SqlCredential] \u003cPSCredential\u003e] [[-Group] \u003cString[]\u003e] [-NewGroup] \u003cString\u003e [[-InputObject] \u003cServerGroup[]\u003e] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "New-DbaAgentJob", + "Name": "New-DbaAgentJob", "Description": "New-DbaAgentJob makes is possible to create a job in the SQL Server Agent.\nIt returns an array of the job(s) created", "Tags": [ "Agent", "Job", "JobStep" ], + "Synopsis": "New-DbaAgentJob creates a new job", + "Alias": "", + "Author": "Sander Stad (@sqlstad), sqlstad.nl", + "CommandName": "New-DbaAgentJob", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/New-DbaAgentJob", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eNew-DbaAgentJob -SqlInstance sql1 -Job \u0027Job One\u0027 -Description \u0027Just another job\u0027\nCreates a job with the name \"Job1\" and a small description\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eNew-DbaAgentJob -SqlInstance sql1 -Job \u0027Job One\u0027 -Disabled\nCreates the job but sets it to disabled\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eNew-DbaAgentJob -SqlInstance sql1 -Job \u0027Job One\u0027 -EventLogLevel OnSuccess\nCreates the job and sets the notification to write to the Windows Application event log on success\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eNew-DbaAgentJob -SqlInstance SSTAD-PC -Job \u0027Job One\u0027 -EmailLevel OnFailure -EmailOperator dba\nCreates the job and sets the notification to send an e-mail to the e-mail operator\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eNew-DbaAgentJob -SqlInstance sql1 -Job \u0027Job One\u0027 -Description \u0027Just another job\u0027 -Whatif\nDoesn\u0027t create the job but shows what would happen.\n-------------------------- EXAMPLE 6 --------------------------\nPS C:\\\u003eNew-DbaAgentJob -SqlInstance sql1, sql2, sql3 -Job \u0027Job One\u0027\nCreates a job with the name \"Job One\" on multiple servers\n-------------------------- EXAMPLE 7 --------------------------\nPS C:\\\u003e\"sql1\", \"sql2\", \"sql3\" | New-DbaAgentJob -Job \u0027Job One\u0027\nCreates a job with the name \"Job One\" on multiple servers using the pipe line", "Params": [ [ "SqlInstance", @@ -24660,104 +25979,106 @@ "" ] ], + "Syntax": "New-DbaAgentJob [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [-Job] \u003cString\u003e [[-Schedule] \u003cObject[]\u003e] [[-ScheduleId] \u003cInt32[]\u003e] [-Disabled] [[-Description] \u003cString\u003e] [[-StartStepId] \u003cInt32\u003e] [[-Category] \u003cString\u003e] [[-OwnerLogin] \u003cString\u003e] [[-EventLogLevel] \u003cObject\u003e] [[-EmailLevel] \u003cObject\u003e] [[-PageLevel] \u003cObject\u003e] [[-EmailOperator] \u003cString\u003e] [[-NetsendOperator] \u003cString\u003e] [[-PageOperator] \u003cString\u003e] [[-DeleteLevel] \u003cObject\u003e] [-Force] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" + }, + { + "Name": "New-DbaAgentJobCategory", + "Description": "New-DbaAgentJobCategory makes it possible to create a job category that can be used with jobs.\nIt returns an array of the job(s) created .", + "Tags": [ + "Agent", + "Job", + "JobCategory" + ], + "Synopsis": "New-DbaAgentJobCategory creates a new job category.", "Alias": "", "Author": "Sander Stad (@sqlstad), sqlstad.nl", - "Synopsis": "New-DbaAgentJob creates a new job", - "Name": "New-DbaAgentJob", - "Links": "https://dbatools.io/New-DbaAgentJob", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eNew-DbaAgentJob -SqlInstance sql1 -Job \u0027Job One\u0027 -Description \u0027Just another job\u0027\nCreates a job with the name \"Job1\" and a small description\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eNew-DbaAgentJob -SqlInstance sql1 -Job \u0027Job One\u0027 -Disabled\nCreates the job but sets it to disabled\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eNew-DbaAgentJob -SqlInstance sql1 -Job \u0027Job One\u0027 -EventLogLevel OnSuccess\nCreates the job and sets the notification to write to the Windows Application event log on success\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eNew-DbaAgentJob -SqlInstance SSTAD-PC -Job \u0027Job One\u0027 -EmailLevel OnFailure -EmailOperator dba\nCreates the job and sets the notification to send an e-mail to the e-mail operator\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eNew-DbaAgentJob -SqlInstance sql1 -Job \u0027Job One\u0027 -Description \u0027Just another job\u0027 -Whatif\nDoesn\u0027t create the job but shows what would happen.\n-------------------------- EXAMPLE 6 --------------------------\nPS C:\\\u003eNew-DbaAgentJob -SqlInstance sql1, sql2, sql3 -Job \u0027Job One\u0027\nCreates a job with the name \"Job One\" on multiple servers\n-------------------------- EXAMPLE 7 --------------------------\nPS C:\\\u003e\"sql1\", \"sql2\", \"sql3\" | New-DbaAgentJob -Job \u0027Job One\u0027\nCreates a job with the name \"Job One\" on multiple servers using the pipe line", - "Syntax": "New-DbaAgentJob [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [-Job] \u003cString\u003e [[-Schedule] \u003cObject[]\u003e] [[-ScheduleId] \u003cInt32[]\u003e] [-Disabled] [[-Description] \u003cString\u003e] [[-StartStepId] \u003cInt32\u003e] [[-Category] \u003cString\u003e] [[-OwnerLogin] \u003cString\u003e] [[-EventLogLevel] \u003cObject\u003e] [[-EmailLevel] \u003cObject\u003e] [[-PageLevel] \u003cObject\u003e] [[-EmailOperator] \u003cString\u003e] [[-NetsendOperator] \u003cString\u003e] [[-PageOperator] \u003cString\u003e] [[-DeleteLevel] \u003cObject\u003e] [-Force] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" - }, - { - "CommandName": "New-DbaAgentJobCategory", - "Description": "New-DbaAgentJobCategory makes it possible to create a job category that can be used with jobs.\nIt returns an array of the job(s) created .", - "Tags": [ - "Agent", - "Job", - "JobCategory" - ], - "Params": [ - [ - "SqlInstance", - "The target SQL Server instance or instances. You must have sysadmin access and server version must be SQL Server version 2000 or greater.", - "ServerInstance,SqlServer", - true, - "true (ByValue)", - "" - ], - [ - "SqlCredential", - "Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential)", - "", - false, - "false", - "" - ], - [ - "Category", - "The name of the category", - "", - true, - "false", - "" - ], - [ - "CategoryType", - "The type of category. This can be \"LocalJob\", \"MultiServerJob\" or \"None\".\r\nThe default is \"LocalJob\" and will automatically be set when no option is chosen.", - "", - false, - "false", - "" - ], - [ - "Force", - "The force parameter will ignore some errors in the parameters and assume defaults.", - "", - false, - "false", - "False" - ], - [ - "EnableException", - "By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message.\r\nThis avoids overwhelming you with \"sea of red\" exceptions, but is inconvenient because it basically disables advanced scripting.\r\nUsing this switch turns this \"nice by default\" feature off and enables you to catch exceptions with your own try/catch.", - "Silent", - false, - "false", - "False" - ], - [ - "WhatIf", - "Shows what would happen if the command were to run. No actions are actually performed.", - "wi", - false, - "false", - "" - ], - [ - "Confirm", - "Prompts you for confirmation before executing any changing operations within the command.", - "cf", - false, - "false", - "" - ] - ], - "Alias": "", - "Author": "Sander Stad (@sqlstad), sqlstad.nl", - "Synopsis": "New-DbaAgentJobCategory creates a new job category.", - "Name": "New-DbaAgentJobCategory", + "CommandName": "New-DbaAgentJobCategory", + "Availability": "Windows, Linux, macOS", "Links": "https://dbatools.io/New-DbaAgentJobCategory", "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eNew-DbaAgentJobCategory -SqlInstance sql1 -Category \u0027Category 1\u0027\nCreates a new job category with the name \u0027Category 1\u0027.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eNew-DbaAgentJobCategory -SqlInstance sql1 -Category \u0027Category 2\u0027 -CategoryType MultiServerJob\nCreates a new job category with the name \u0027Category 2\u0027 and assign the category type for a multi server job.", + "Params": [ + [ + "SqlInstance", + "The target SQL Server instance or instances. You must have sysadmin access and server version must be SQL Server version 2000 or greater.", + "ServerInstance,SqlServer", + true, + "true (ByValue)", + "" + ], + [ + "SqlCredential", + "Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential)", + "", + false, + "false", + "" + ], + [ + "Category", + "The name of the category", + "", + true, + "false", + "" + ], + [ + "CategoryType", + "The type of category. This can be \"LocalJob\", \"MultiServerJob\" or \"None\".\r\nThe default is \"LocalJob\" and will automatically be set when no option is chosen.", + "", + false, + "false", + "" + ], + [ + "Force", + "The force parameter will ignore some errors in the parameters and assume defaults.", + "", + false, + "false", + "False" + ], + [ + "EnableException", + "By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message.\r\nThis avoids overwhelming you with \"sea of red\" exceptions, but is inconvenient because it basically disables advanced scripting.\r\nUsing this switch turns this \"nice by default\" feature off and enables you to catch exceptions with your own try/catch.", + "Silent", + false, + "false", + "False" + ], + [ + "WhatIf", + "Shows what would happen if the command were to run. No actions are actually performed.", + "wi", + false, + "false", + "" + ], + [ + "Confirm", + "Prompts you for confirmation before executing any changing operations within the command.", + "cf", + false, + "false", + "" + ] + ], "Syntax": "New-DbaAgentJobCategory [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [-Category] \u003cString[]\u003e [[-CategoryType] \u003cString\u003e] [-Force] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "New-DbaAgentJobStep", + "Name": "New-DbaAgentJobStep", "Description": "New-DbaAgentJobStep creates a new job in the SQL Server Agent for a specific job", "Tags": [ "Agent", "Job", "JobStep" ], + "Synopsis": "New-DbaAgentJobStep creates a new job step for a job", + "Alias": "", + "Author": "Sander Stad (@sqlstad), sqlstad.nl", + "CommandName": "New-DbaAgentJobStep", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/New-DbaAgentJobStep", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eNew-DbaAgentJobStep -SqlInstance sql1 -Job Job1 -StepName Step1\nCreate a step in \"Job1\" with the name Step1 with the default subsystem TransactSql.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eNew-DbaAgentJobStep -SqlInstance sql1 -Job Job1 -StepName Step1 -Database msdb\nCreate a step in \"Job1\" with the name Step1 where the database will the msdb\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eNew-DbaAgentJobStep -SqlInstance sql1, sql2, sql3 -Job Job1 -StepName Step1 -Database msdb\nCreate a step in \"Job1\" with the name Step1 where the database will the \"msdb\" for multiple servers\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eNew-DbaAgentJobStep -SqlInstance sql1, sql2, sql3 -Job Job1, Job2, \u0027Job Three\u0027 -StepName Step1 -Database msdb\nCreate a step in \"Job1\" with the name Step1 where the database will the \"msdb\" for multiple servers for multiple jobs\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003esql1, sql2, sql3 | New-DbaAgentJobStep -Job Job1 -StepName Step1 -Database msdb\nCreate a step in \"Job1\" with the name Step1 where the database will the \"msdb\" for multiple servers using pipeline", "Params": [ [ "SqlInstance", @@ -24952,21 +26273,22 @@ "" ] ], - "Alias": "", - "Author": "Sander Stad (@sqlstad), sqlstad.nl", - "Synopsis": "New-DbaAgentJobStep creates a new job step for a job", - "Name": "New-DbaAgentJobStep", - "Links": "https://dbatools.io/New-DbaAgentJobStep", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eNew-DbaAgentJobStep -SqlInstance sql1 -Job Job1 -StepName Step1\nCreate a step in \"Job1\" with the name Step1 with the default subsystem TransactSql.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eNew-DbaAgentJobStep -SqlInstance sql1 -Job Job1 -StepName Step1 -Database msdb\nCreate a step in \"Job1\" with the name Step1 where the database will the msdb\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eNew-DbaAgentJobStep -SqlInstance sql1, sql2, sql3 -Job Job1 -StepName Step1 -Database msdb\nCreate a step in \"Job1\" with the name Step1 where the database will the \"msdb\" for multiple servers\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eNew-DbaAgentJobStep -SqlInstance sql1, sql2, sql3 -Job Job1, Job2, \u0027Job Three\u0027 -StepName Step1 -Database msdb\nCreate a step in \"Job1\" with the name Step1 where the database will the \"msdb\" for multiple servers for multiple jobs\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003esql1, sql2, sql3 | New-DbaAgentJobStep -Job Job1 -StepName Step1 -Database msdb\nCreate a step in \"Job1\" with the name Step1 where the database will the \"msdb\" for multiple servers using pipeline", "Syntax": "New-DbaAgentJobStep [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [-Job] \u003cObject[]\u003e [[-StepId] \u003cInt32\u003e] [-StepName] \u003cString\u003e [[-Subsystem] \u003cString\u003e] [[-SubsystemServer] \u003cString\u003e] [[-Command] \u003cString\u003e] [[-CmdExecSuccessCode] \u003cInt32\u003e] [[-OnSuccessAction] \u003cString\u003e] [[-OnSuccessStepId] \u003cInt32\u003e] [[-OnFailAction] \u003cString\u003e] [[-OnFailStepId] \u003cInt32\u003e] [[-Database] \u003cObject\u003e] [[-DatabaseUser] \u003cString\u003e] [[-RetryAttempts] \u003cInt32\u003e] [[-RetryInterval] \u003cInt32\u003e] [[-OutputFileName] \u003cString\u003e] [[-Flag] \u003cString[]\u003e] [[-ProxyName] \u003cString\u003e] [-Force] [-EnableException] [-WhatIf] [-Confirm] \r\n[\u003cCommonParameters\u003e]" }, { - "CommandName": "New-DbaAgentProxy", + "Name": "New-DbaAgentProxy", "Description": "Adds one or more proxies to SQL Server Agent", "Tags": [ "Agent", "Proxy" ], + "Synopsis": "Adds one or more proxies to SQL Server Agent", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "New-DbaAgentProxy", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/New-DbaAgentProxy", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eNew-DbaAgentProxy -SqlInstance sql2016 -Name STIG -ProxyCredential \u0027PowerShell Proxy\u0027\nCreates an Agent Proxy on sql2016 with the name STIG with the \u0027PowerShell Proxy\u0027 credential.\r\nThe proxy is automatically added to the CmdExec subsystem.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eNew-DbaAgentProxy -SqlInstance localhost\\sql2016 -Name STIG -ProxyCredential \u0027PowerShell Proxy\u0027 -Description \"Used for auditing purposes\" -Login ad\\sqlstig -SubSystem CmdExec, PowerShell \r\n-ServerRole securtyadmin -MsdbRole ServerGroupAdministratorRole\nCreates an Agent Proxy on sql2016 with the name STIG with the \u0027PowerShell Proxy\u0027 credential and the following principals:\nLogin: ad\\sqlstig\r\nServerRole: securtyadmin\r\nMsdbRole: ServerGroupAdministratorRole\nBy default, only sysadmins have access to create job steps with proxies. This will allow 3 additional principals access:\r\nThe proxy is then added to the CmdExec and PowerShell subsystems", "Params": [ [ "SqlInstance", @@ -25081,22 +26403,23 @@ "" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Adds one or more proxies to SQL Server Agent", - "Name": "New-DbaAgentProxy", - "Links": "https://dbatools.io/New-DbaAgentProxy", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eNew-DbaAgentProxy -SqlInstance sql2016 -Name STIG -ProxyCredential \u0027PowerShell Proxy\u0027\nCreates an Agent Proxy on sql2016 with the name STIG with the \u0027PowerShell Proxy\u0027 credential.\r\nThe proxy is automatically added to the CmdExec subsystem.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eNew-DbaAgentProxy -SqlInstance localhost\\sql2016 -Name STIG -ProxyCredential \u0027PowerShell Proxy\u0027 -Description \"Used for auditing purposes\" -Login ad\\sqlstig -SubSystem CmdExec, PowerShell \r\n-ServerRole securtyadmin -MsdbRole ServerGroupAdministratorRole\nCreates an Agent Proxy on sql2016 with the name STIG with the \u0027PowerShell Proxy\u0027 credential and the following principals:\nLogin: ad\\sqlstig\r\nServerRole: securtyadmin\r\nMsdbRole: ServerGroupAdministratorRole\nBy default, only sysadmins have access to create job steps with proxies. This will allow 3 additional principals access:\r\nThe proxy is then added to the CmdExec and PowerShell subsystems", "Syntax": "New-DbaAgentProxy [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [-Name] \u003cString[]\u003e [-ProxyCredential] \u003cString[]\u003e [[-SubSystem] \u003cString[]\u003e] [[-Description] \u003cString\u003e] [[-Login] \u003cString[]\u003e] [[-ServerRole] \u003cString[]\u003e] [[-MsdbRole] \u003cString[]\u003e] [-Disabled] [-Force] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "New-DbaAgentSchedule", + "Name": "New-DbaAgentSchedule", "Description": "New-DbaAgentSchedule will help create a new schedule for a job.\nIf the job parameter is not supplied the schedule will not be attached to a job.", "Tags": [ "Agent", "Job", "JobStep" ], + "Synopsis": "New-DbaAgentSchedule creates a new schedule in the msdb database.", + "Alias": "", + "Author": "Sander Stad (@sqlstad), sqlstad.nl", + "CommandName": "New-DbaAgentSchedule", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/New-DbaAgentSchedule", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eNew-DbaAgentSchedule -SqlInstance localhost\\SQL2016 -Schedule daily -FrequencyType Daily -FrequencyInterval Everyday -Force\nCreates a schedule with a daily frequency every day. It assumes default values for the start date, start time, end date and end time due to -Force.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eNew-DbaAgentSchedule -SqlInstance sstad-pc -Schedule MonthlyTest -FrequencyType Monthly -FrequencyInterval 10 -FrequencyRecurrenceFactor 1 -Force\nCreate a schedule with a monhtly frequency occuring every 10th of the month. It assumes default values for the start date, start time, end date and end time due to -Force.", "Params": [ [ "SqlInstance", @@ -25251,18 +26574,19 @@ "" ] ], - "Alias": "", - "Author": "Sander Stad (@sqlstad), sqlstad.nl", - "Synopsis": "New-DbaAgentSchedule creates a new schedule in the msdb database.", - "Name": "New-DbaAgentSchedule", - "Links": "https://dbatools.io/New-DbaAgentSchedule", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eNew-DbaAgentSchedule -SqlInstance localhost\\SQL2016 -Schedule daily -FrequencyType Daily -FrequencyInterval Everyday -Force\nCreates a schedule with a daily frequency every day. It assumes default values for the start date, start time, end date and end time due to -Force.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eNew-DbaAgentSchedule -SqlInstance sstad-pc -Schedule MonthlyTest -FrequencyType Monthly -FrequencyInterval 10 -FrequencyRecurrenceFactor 1 -Force\nCreate a schedule with a monhtly frequency occuring every 10th of the month. It assumes default values for the start date, start time, end date and end time due to -Force.", "Syntax": "New-DbaAgentSchedule [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [[-Job] \u003cObject[]\u003e] [[-Schedule] \u003cObject\u003e] [-Disabled] [[-FrequencyType] \u003cObject\u003e] [[-FrequencyInterval] \u003cObject[]\u003e] [[-FrequencySubdayType] \u003cObject\u003e] [[-FrequencySubdayInterval] \u003cInt32\u003e] [[-FrequencyRelativeInterval] \u003cObject\u003e] [[-FrequencyRecurrenceFactor] \u003cInt32\u003e] [[-StartDate] \u003cString\u003e] [[-EndDate] \u003cString\u003e] [[-StartTime] \u003cString\u003e] [[-EndTime] \u003cString\u003e] [-Force] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "New-DbaAvailabilityGroup", + "Name": "New-DbaAvailabilityGroup", "Description": "Automates the creation of availability groups.\n\n* Checks prerequisites\n* Creates Availability Group and adds primary replica\n* Grants cluster permissions if necessary\n* Adds secondary replica if supplied\n* Adds databases if supplied\n* Performs backup/restore if seeding mode is manual\n* Performs backup to NUL if seeding mode is automatic\n* Adds listener to primary if supplied\n* Joins secondaries to availability group\n* Grants endpoint connect permissions to service accounts\n* Grants CreateAnyDatabase permissions if seeding mode is automatic\n* Returns Availability Group object from primary\n\nNOTE: If a backup / restore is performed, the backups will be left intact on the network share.\n\nThanks for this, Thomas Stringer! https://blogs.technet.microsoft.com/heyscriptingguy/2013/04/29/set-up-an-alwayson-availability-group-with-powershell/", "Tags": "HA", + "Synopsis": "Automates the creation of availability groups.", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "New-DbaAvailabilityGroup", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/New-DbaAvailabilityGroup", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eNew-DbaAvailabilityGroup -Primary sql2016a -Name SharePoint\nCreates a new availability group on sql2016a named SharePoint\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eNew-DbaAvailabilityGroup -Primary sql2016a -Name SharePoint -Secondary sql2016b\nCreates a new availability group on sql2016a named SharePoint with a secondary replica, sql2016b\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eNew-DbaAvailabilityGroup -Primary sql2016std -Name BAG1 -Basic -Confirm:$false\nCreates a basic availability group named BAG1 on sql2016std and does not confirm when setting up\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eNew-DbaAvailabilityGroup -Primary sql2016b -Name AG1 -ClusterType Wsfc -Dhcp -Database db1 -UseLastBackup\nCreates an availability group on sql2016b with the name ag1. Uses the last backups available to add the database db1 to the AG.\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eNew-DbaAvailabilityGroup -Primary sql2017 -Name SharePoint -ClusterType None -FailoverMode Manual\nCreates a new availability group on sql2017 named SharePoint with a cluster type of none and a failover mode of manual\n-------------------------- EXAMPLE 6 --------------------------\nPS C:\\\u003eNew-DbaAvailabilityGroup -Primary sql1 -Secondary sql2 -Name ag1 -Database pubs -ClusterType None -SeedingMode Automatic -FailoverMode Manual\nCreates a new availability group with a primary replica on sql1 and a secondary on sql2. Automatically adds the database pubs.\n-------------------------- EXAMPLE 7 --------------------------\nPS C:\\\u003e$cred = Get-Credential sqladmin\nPS C:\\\u003e $params = @{\r\n\u003e\u003e Primary = \"sql1\"\r\n\u003e\u003e PrimarySqlCredential = $cred\r\n\u003e\u003e Secondary = \"sql2\"\r\n\u003e\u003e SecondarySqlCredential = $cred\r\n\u003e\u003e Name = \"test-ag\"\r\n\u003e\u003e Database = \"pubs\"\r\n\u003e\u003e ClusterType = \"None\"\r\n\u003e\u003e SeedingMode = \"Automatic\"\r\n\u003e\u003e FailoverMode = \"Manual\"\r\n\u003e\u003e Confirm = $false\r\n\u003e\u003e }\r\nPS C:\\\u003e New-DbaAvailabilityGroup @params\nThis exact command was used to create an availability group on docker!", "Params": [ [ "Primary", @@ -25529,18 +26853,19 @@ "" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Automates the creation of availability groups.", - "Name": "New-DbaAvailabilityGroup", - "Links": "https://dbatools.io/New-DbaAvailabilityGroup", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eNew-DbaAvailabilityGroup -Primary sql2016a -Name SharePoint\nCreates a new availability group on sql2016a named SharePoint\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eNew-DbaAvailabilityGroup -Primary sql2016a -Name SharePoint -Secondary sql2016b\nCreates a new availability group on sql2016b named SharePoint with a secondary replica, sql2016b\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eNew-DbaAvailabilityGroup -Primary sql2016std -Name BAG1 -Basic -Confirm:$false\nCreates a basic availability group named BAG1 on sql2016std and does not confirm when setting up\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eNew-DbaAvailabilityGroup -Primary sql2016b -Name AG1 -ClusterType Wsfc -Dhcp -Database db1 -UseLastBackup\nCreates an availability group on sql2016b with the name ag1. Uses the last backups available to add the database db1 to the AG.\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eNew-DbaAvailabilityGroup -Primary sql2017 -Name SharePoint -ClusterType None -FailoverMode Manual\nCreates a new availability group on sql2017 named SharePoint with a cluster type of none and a failover mode of manual\n-------------------------- EXAMPLE 6 --------------------------\nPS C:\\\u003eNew-DbaAvailabilityGroup -Primary sql1 -Secondary sql2 -Name ag1 -Database pubs -ClusterType None -SeedingMode Automatic -FailoverMode Manual\nCreates a new availability group with a primary replica on sql1 and a secondary on sql2. Automatically adds the database pubs.\n-------------------------- EXAMPLE 7 --------------------------\nPS C:\\\u003e$cred = Get-Credential sqladmin\nPS C:\\\u003e $params = @{\r\n\u003e\u003e Primary = \"sql1\"\r\n\u003e\u003e PrimarySqlCredential = $cred\r\n\u003e\u003e Secondary = \"sql2\"\r\n\u003e\u003e SecondarySqlCredential = $cred\r\n\u003e\u003e Name = \"test-ag\"\r\n\u003e\u003e Database = \"pubs\"\r\n\u003e\u003e ClusterType = \"None\"\r\n\u003e\u003e SeedingMode = \"Automatic\"\r\n\u003e\u003e FailoverMode = \"Manual\"\r\n\u003e\u003e Confirm = $false\r\n\u003e\u003e }\r\nPS C:\\\u003e New-DbaAvailabilityGroup @params\nThis exact command was used to create an availability group on docker!", "Syntax": "New-DbaAvailabilityGroup [[-Primary] \u003cDbaInstanceParameter\u003e] [[-PrimarySqlCredential] \u003cPSCredential\u003e] [[-Secondary] \u003cDbaInstanceParameter[]\u003e] [[-SecondarySqlCredential] \u003cPSCredential\u003e] [-Name] \u003cString\u003e [-DtcSupport] [[-ClusterType] \u003cString\u003e] [[-AutomatedBackupPreference] \u003cString\u003e] [[-FailureConditionLevel] \u003cString\u003e] [[-HealthCheckTimeout] \u003cInt32\u003e] [-Basic] [-DatabaseHealthTrigger] [-Passthru] [[-Database] \u003cString[]\u003e] [[-SharedPath] \u003cString\u003e] [-UseLastBackup] [-Force] [[-AvailabilityMode] \u003cString\u003e] [[-FailoverMode] \u003cString\u003e] [[-BackupPriority] \u003cInt32\u003e] [[-ConnectionModeInPrimaryRole] \u003cString\u003e] \r\n[[-ConnectionModeInSecondaryRole] \u003cString\u003e] [[-SeedingMode] \u003cString\u003e] [[-Endpoint] \u003cString\u003e] [[-ReadonlyRoutingConnectionUrl] \u003cString\u003e] [[-Certificate] \u003cString\u003e] [[-IPAddress] \u003cIPAddress[]\u003e] [[-SubnetMask] \u003cIPAddress\u003e] [[-Port] \u003cInt32\u003e] [-Dhcp] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "New-DbaClientAlias", + "Name": "New-DbaClientAlias", "Description": "Creates/updates a SQL Server alias by altering HKLM:\\SOFTWARE\\Microsoft\\MSSQLServer\\Client", "Tags": "Alias", + "Synopsis": "Creates/updates a sql alias for the specified server - mimics cliconfg.exe", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "New-DbaClientAlias", + "Availability": "Windows only", + "Links": "https://dbatools.io/New-DbaClientAlias", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eNew-DbaClientAlias -ServerName sqlcluster\\sharepoint -Alias sp\nCreates a new TCP alias on the local workstation called sp, which points sqlcluster\\sharepoint\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eNew-DbaClientAlias -ServerName \u0027sqlcluster,14443\u0027 -Alias spinstance\nCreates a new TCP alias on the local workstation called spinstance, which points to sqlcluster, port 14443.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eNew-DbaClientAlias -ServerName sqlcluster\\sharepoint -Alias sp -Protocol NamedPipes\nCreates a new NamedPipes alias on the local workstation called sp, which points sqlcluster\\sharepoint", "Params": [ [ "ComputerName", @@ -25607,21 +26932,21 @@ "" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Creates/updates a sql alias for the specified server - mimics cliconfg.exe", - "Name": "New-DbaClientAlias", - "Links": "https://dbatools.io/New-DbaClientAlias", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eNew-DbaClientAlias -ServerName sqlcluster\\sharepoint -Alias sp\nCreates a new TCP alias on the local workstation called sp, which points sqlcluster\\sharepoint\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eNew-DbaClientAlias -ServerName \u0027sqlcluster,14443\u0027 -Alias spinstance\nCreates a new TCP alias on the local workstation called spinstance, which points to sqlcluster, port 14443.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eNew-DbaClientAlias -ServerName sqlcluster\\sharepoint -Alias sp -Protocol NamedPipes\nCreates a new NamedPipes alias on the local workstation called sp, which points sqlcluster\\sharepoint", "Syntax": "New-DbaClientAlias [[-ComputerName] \u003cDbaInstanceParameter[]\u003e] [[-Credential] \u003cPSCredential\u003e] [-ServerName] \u003cDbaInstanceParameter[]\u003e [-Alias] \u003cString\u003e [[-Protocol] \u003cString\u003e] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "New-DbaCmConnection", + "Name": "New-DbaCmConnection", "Description": "Generates a connection object for use in remote computer management.\nThose objects are used for the purpose of cim/wmi queries, caching which protocol worked, optimizing performance and minimizing authentication errors.\n\nNew-DbaCmConnection will create a NEW object and overwrite any existing ones for the specified computer.\nFurthermore, information stored in the input beyond the computername will be discarded in favor of the new settings.\n\nUnless the connection cache has been disabled, all connections will automatically be registered in the cache, so no further action is necessary.\nThe output is primarily for information purposes, however it may be used to pass objects and circumvent the cache with those.\n\nNOTE: Generally, this function need not be used, as a first connection to a computer using any connecting function such as \"Get-DbaCmObject\" will automatically register a new default connection for it.\n\nThis function exists to be able to preconfigure connections.", "Tags": [ "ComputerManagement", "CIM" ], + "Synopsis": "Generates a connection object for use in remote computer management.", + "Alias": "", + "CommandName": "New-DbaCmConnection", + "Availability": "Windows only", + "Links": "https://dbatools.io/New-DbaCmConnection", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eNew-DbaCmConnection -ComputerName sql2014 -UseWindowsCredentials -OverrideExplicitCredential -DisabledConnectionTypes CimRM\nReturns a new configuration object for connecting to the computer sql2014.\r\n- The current user credentials are set as valid\r\n- The connection is configured to ignore explicit credentials (so all connections use the windows credentials)\r\n- The connections will not try using CIM over WinRM\nUnless caching is globally disabled, this is automatically stored in the connection cache and will be applied automatically.\r\nIn that (the default) case, the output is for information purposes only and need not be used.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-Content computers.txt | New-DbaCmConnection -Credential $cred -CimWinRMOptions $options -DisableBadCredentialCache -OverrideExplicitCredential\nGathers a list of computers from a text file, then creates and registers connections for each of them, setting them to ...\r\n- use the credentials stored in $cred\r\n- use the options stored in $options when connecting using CIM over WinRM\r\n- not store credentials that are known to not work\r\n- to ignore explicitly specified credentials\nEssentially, this configures all connections to those computers to prefer failure with the specified credentials over using alternative credentials.", "Params": [ [ "ComputerName", @@ -25744,17 +27069,19 @@ "" ] ], - "Alias": "", - "Synopsis": "Generates a connection object for use in remote computer management.", - "Name": "New-DbaCmConnection", - "Links": "https://dbatools.io/New-DbaCmConnection", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eNew-DbaCmConnection -ComputerName sql2014 -UseWindowsCredentials -OverrideExplicitCredential -DisabledConnectionTypes CimRM\nReturns a new configuration object for connecting to the computer sql2014.\r\n- The current user credentials are set as valid\r\n- The connection is configured to ignore explicit credentials (so all connections use the windows credentials)\r\n- The connections will not try using CIM over WinRM\nUnless caching is globally disabled, this is automatically stored in the connection cache and will be applied automatically.\r\nIn that (the default) case, the output is for information purposes only and need not be used.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-Content computers.txt | New-DbaCmConnection -Credential $cred -CimWinRMOptions $options -DisableBadCredentialCache -OverrideExplicitCredential\nGathers a list of computers from a text file, then creates and registers connections for each of them, setting them to ...\r\n- use the credentials stored in $cred\r\n- use the options stored in $options when connecting using CIM over WinRM\r\n- not store credentials that are known to not work\r\n- to ignore explicitly specified credentials\nEssentially, this configures all connections to those computers to prefer failure with the specified credentials over using alternative credentials.", "Syntax": "New-DbaCmConnection [-ComputerName \u003cDbaCmConnectionParameter[]\u003e] [-Credential \u003cPSCredential\u003e] [-OverrideExplicitCredential] [-DisabledConnectionTypes {None | CimRM | CimDCOM | Wmi | PowerShellRemoting}] [-DisableBadCredentialCache] [-DisableCimPersistence] [-DisableCredentialAutoRegister] [-EnableCredentialFailover] [-WindowsCredentialsAreBad] [-CimWinRMOptions \u003cWSManSessionOptions\u003e] [-CimDCOMOptions \u003cDComSessionOptions\u003e] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]\nNew-DbaCmConnection [-ComputerName \u003cDbaCmConnectionParameter[]\u003e] [-UseWindowsCredentials] [-OverrideExplicitCredential] [-DisabledConnectionTypes {None | CimRM | CimDCOM | Wmi | PowerShellRemoting}] [-DisableBadCredentialCache] [-DisableCimPersistence] [-DisableCredentialAutoRegister] [-EnableCredentialFailover] [-CimWinRMOptions \u003cWSManSessionOptions\u003e] [-CimDCOMOptions \u003cDComSessionOptions\u003e] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "New-DbaComputerCertificate", + "Name": "New-DbaComputerCertificate", "Description": "Creates a new computer certificate - self-signed or signed by an Active Directory CA, using the Web Server certificate.\n\nBy default, a key with a length of 1024 and a friendly name of the machines FQDN is generated.\n\nThis command was originally intended to help automate the process so that SSL certificates can be available for enforcing encryption on connections.\n\nIt makes a lot of assumptions - namely, that your account is allowed to auto-enroll and that you have permission to do everything it needs to do ;)\n\nReferences:\nhttp://sqlmag.com/sql-server/7-steps-ssl-encryption\nhttps://azurebi.jppp.org/2016/01/23/using-lets-encrypt-certificates-for-secure-sql-server-connections/\nhttps://blogs.msdn.microsoft.com/sqlserverfaq/2016/09/26/creating-and-registering-ssl-certificates/\n\nThe certificate is generated using AD\u0027s webserver SSL template on the client machine and pushed to the remote machine.", "Tags": "Certificate", + "Synopsis": "Creates a new computer certificate useful for Forcing Encryption", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "New-DbaComputerCertificate", + "Availability": "Windows only", + "Links": null, + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eNew-DbaComputerCertificate\nCreates a computer certificate signed by the local domain CA for the local machine with the keylength of 1024.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eNew-DbaComputerCertificate -ComputerName Server1\nCreates a computer certificate signed by the local domain CA _on the local machine_ for server1 with the keylength of 1024.\nThe certificate is then copied to the new machine over WinRM and imported.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eNew-DbaComputerCertificate -ComputerName sqla, sqlb -ClusterInstanceName sqlcluster -KeyLength 4096\nCreates a computer certificate for sqlcluster, signed by the local domain CA, with the keylength of 4096.\nThe certificate is then copied to sqla _and_ sqlb over WinRM and imported.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eNew-DbaComputerCertificate -ComputerName Server1 -WhatIf\nShows what would happen if the command were run\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eNew-DbaComputerCertificate -SelfSigned\nCreates a self-signed certificate", "Params": [ [ "ComputerName", @@ -25885,22 +27212,23 @@ "" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Creates a new computer certificate useful for Forcing Encryption", - "Name": "New-DbaComputerCertificate", - "Links": null, - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eNew-DbaComputerCertificate\nCreates a computer certificate signed by the local domain CA for the local machine with the keylength of 1024.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eNew-DbaComputerCertificate -ComputerName Server1\nCreates a computer certificate signed by the local domain CA _on the local machine_ for server1 with the keylength of 1024.\nThe certificate is then copied to the new machine over WinRM and imported.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eNew-DbaComputerCertificate -ComputerName sqla, sqlb -ClusterInstanceName sqlcluster -KeyLength 4096\nCreates a computer certificate for sqlcluster, signed by the local domain CA, with the keylength of 4096.\nThe certificate is then copied to sqla _and_ sqlb over WinRM and imported.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eNew-DbaComputerCertificate -ComputerName Server1 -WhatIf\nShows what would happen if the command were run\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eNew-DbaComputerCertificate -SelfSigned\nCreates a self-signed certificate", "Syntax": "New-DbaComputerCertificate [[-ComputerName] \u003cDbaInstanceParameter[]\u003e] [[-Credential] \u003cPSCredential\u003e] [[-CaServer] \u003cString\u003e] [[-CaName] \u003cString\u003e] [[-ClusterInstanceName] \u003cString\u003e] [[-SecurePassword] \u003cSecureString\u003e] [[-FriendlyName] \u003cString\u003e] [[-CertificateTemplate] \u003cString\u003e] [[-KeyLength] \u003cInt32\u003e] [[-Store] \u003cString\u003e] [[-Folder] \u003cString\u003e] [[-Dns] \u003cString[]\u003e] [-SelfSigned] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "New-DbaConnectionString", + "Name": "New-DbaConnectionString", "Description": "Builds or extracts a SQL Server Connection String\n\nSee https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.connectionstring.aspx\nand https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnectionstringbuilder.aspx\nand https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.aspx", "Tags": [ "Connection", "Connect", "ConnectionString" ], + "Synopsis": "Builds or extracts a SQL Server Connection String", + "Alias": "New-DbaSqlConnectionString", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "New-DbaConnectionString", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/New-DbaConnectionString", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eNew-DbaConnectionString -SqlInstance sql2014\nCreates a connection string that connects using Windows Authentication\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eConnect-DbaInstance -SqlInstance sql2016 | New-DbaConnectionString\nBuilds a connected SMO object using Connect-DbaInstance then extracts and displays the connection string\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003e$wincred = Get-Credential ad\\sqladmin\nPS C:\\\u003e New-DbaConnectionString -SqlInstance sql2014 -Credential $wincred\nCreates a connection string that connects using alternative Windows credentials\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003e$sqlcred = Get-Credential sqladmin\nPS C:\\\u003e $server = New-DbaConnectionString -SqlInstance sql2014 -Credential $sqlcred\nLogin to sql2014 as SQL login sqladmin.\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003e$server = New-DbaConnectionString -SqlInstance sql2014 -ClientName \"mah connection\"\nCreates a connection string that connects using Windows Authentication and uses the client name \"mah connection\". So when you open up profiler or use extended events, you can search for \"mah \r\nconnection\".\n-------------------------- EXAMPLE 6 --------------------------\nPS C:\\\u003e$server = New-DbaConnectionString -SqlInstance sql2014 -AppendConnectionString \"Packet Size=4096;AttachDbFilename=C:\\MyFolder\\MyDataFile.mdf;User Instance=true;\"\nCreates a connection string that connects to sql2014 using Windows Authentication, then it sets the packet size (this can also be done via -PacketSize) and other connection attributes.\n-------------------------- EXAMPLE 7 --------------------------\nPS C:\\\u003e$server = New-DbaConnectionString -SqlInstance sql2014 -NetworkProtocol TcpIp -MultiSubnetFailover\nCreates a connection string with Windows Authentication that uses TCPIP and has MultiSubnetFailover enabled.\n-------------------------- EXAMPLE 8 --------------------------\nPS C:\\\u003e$connstring = New-DbaConnectionString sql2016 -ApplicationIntent ReadOnly\nCreates a connection string with ReadOnly ApplicationIntent.", "Params": [ [ "SqlInstance", @@ -25958,6 +27286,14 @@ "false", "0" ], + [ + "Database", + "Database name", + "", + false, + "false", + "" + ], [ "EncryptConnection", "When true, SQL Server uses SSL encryption for all data sent between the client and server if the server has a certificate installed. Recognized values are true, false, yes, and no. For more \r\ninformation, see Connection String Syntax.\nBeginning in .NET Framework 4.5, when TrustServerCertificate is false and Encrypt is true, the server name (or IP address) in a SQL Server SSL certificate must exactly match the server name (or IP \r\naddress) specified in the connection string. Otherwise, the connection attempt will fail. For information about support for certificates whose subject starts with a wildcard character (*), see \r\nAccepted wildcards used by server certificates for server authentication.", @@ -26111,22 +27447,23 @@ "" ] ], - "Alias": "New-DbaSqlConnectionString", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Builds or extracts a SQL Server Connection String", - "Name": "New-DbaConnectionString", - "Links": "https://dbatools.io/New-DbaConnectionString", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eNew-DbaConnectionString -SqlInstance sql2014\nCreates a connection string that connects using Windows Authentication\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eConnect-DbaInstance -SqlInstance sql2016 | New-DbaConnectionString\nBuilds a connected SMO object using Connect-DbaInstance then extracts and displays the connection string\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003e$wincred = Get-Credential ad\\sqladmin\nPS C:\\\u003e New-DbaConnectionString -SqlInstance sql2014 -Credential $wincred\nCreates a connection string that connects using alternative Windows credentials\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003e$sqlcred = Get-Credential sqladmin\nPS C:\\\u003e $server = New-DbaConnectionString -SqlInstance sql2014 -Credential $sqlcred\nLogin to sql2014 as SQL login sqladmin.\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003e$server = New-DbaConnectionString -SqlInstance sql2014 -ClientName \"mah connection\"\nCreates a connection string that connects using Windows Authentication and uses the client name \"mah connection\". So when you open up profiler or use extended events, you can search for \"mah \r\nconnection\".\n-------------------------- EXAMPLE 6 --------------------------\nPS C:\\\u003e$server = New-DbaConnectionString -SqlInstance sql2014 -AppendConnectionString \"Packet Size=4096;AttachDbFilename=C:\\MyFolder\\MyDataFile.mdf;User Instance=true;\"\nCreates a connection string that connects to sql2014 using Windows Authentication, then it sets the packet size (this can also be done via -PacketSize) and other connection attributes.\n-------------------------- EXAMPLE 7 --------------------------\nPS C:\\\u003e$server = New-DbaConnectionString -SqlInstance sql2014 -NetworkProtocol TcpIp -MultiSubnetFailover\nCreates a connection string with Windows Authentication that uses TCPIP and has MultiSubnetFailover enabled.\n-------------------------- EXAMPLE 8 --------------------------\nPS C:\\\u003e$connstring = New-DbaConnectionString sql2016 -ApplicationIntent ReadOnly\nCreates a connection string with ReadOnly ApplicationIntent.", - "Syntax": "New-DbaConnectionString [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-Credential] \u003cPSCredential\u003e] [[-AccessToken] \u003cString\u003e] [[-ApplicationIntent] \u003cString\u003e] [[-BatchSeparator] \u003cString\u003e] [[-ClientName] \u003cString\u003e] [[-ConnectTimeout] \u003cInt32\u003e] [-EncryptConnection] [[-FailoverPartner] \u003cString\u003e] [-IsActiveDirectoryUniversalAuth] [[-LockTimeout] \u003cInt32\u003e] [[-MaxPoolSize] \u003cInt32\u003e] [[-MinPoolSize] \u003cInt32\u003e] [-MultipleActiveResultSets] [-MultiSubnetFailover] [[-NetworkProtocol] \u003cString\u003e] [-NonPooledConnection] [[-PacketSize] \u003cInt32\u003e] [[-PooledConnectionLifetime] \u003cInt32\u003e] [[-SqlExecutionModes] \u003cString\u003e] \r\n[[-StatementTimeout] \u003cInt32\u003e] [-TrustServerCertificate] [[-WorkstationId] \u003cString\u003e] [[-AppendConnectionString] \u003cString\u003e] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" + "Syntax": "New-DbaConnectionString [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-Credential] \u003cPSCredential\u003e] [[-AccessToken] \u003cString\u003e] [[-ApplicationIntent] \u003cString\u003e] [[-BatchSeparator] \u003cString\u003e] [[-ClientName] \u003cString\u003e] [[-ConnectTimeout] \u003cInt32\u003e] [[-Database] \u003cString\u003e] [-EncryptConnection] [[-FailoverPartner] \u003cString\u003e] [-IsActiveDirectoryUniversalAuth] [[-LockTimeout] \u003cInt32\u003e] [[-MaxPoolSize] \u003cInt32\u003e] [[-MinPoolSize] \u003cInt32\u003e] [-MultipleActiveResultSets] [-MultiSubnetFailover] [[-NetworkProtocol] \u003cString\u003e] [-NonPooledConnection] [[-PacketSize] \u003cInt32\u003e] [[-PooledConnectionLifetime] \u003cInt32\u003e] \r\n[[-SqlExecutionModes] \u003cString\u003e] [[-StatementTimeout] \u003cInt32\u003e] [-TrustServerCertificate] [[-WorkstationId] \u003cString\u003e] [[-AppendConnectionString] \u003cString\u003e] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "New-DbaConnectionStringBuilder", + "Name": "New-DbaConnectionStringBuilder", "Description": "Creates a System.Data.SqlClient.SqlConnectionStringBuilder from a connection string.", "Tags": [ "SqlBuild", "ConnectionString", "Connection" ], + "Synopsis": "Returns a System.Data.SqlClient.SqlConnectionStringBuilder with the string specified", + "Alias": "New-DbaSqlConnectionStringBuilder", + "Author": "zippy1981 | Chrissy LeMaire (@cl)", + "CommandName": "New-DbaConnectionStringBuilder", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/New-DbaConnectionStringBuilder", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eNew-DbaConnectionStringBuilder\nReturns an empty ConnectionStringBuilder\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003e\"Data Source=localhost,1433;Initial Catalog=AlwaysEncryptedSample;UID=sa;PWD=alwaysB3Encrypt1ng;Application Name=Always Encrypted Sample MVC App;Column Encryption Setting=enabled\" | \r\nNew-DbaConnectionStringBuilder\nReturns a connection string builder that can be used to connect to the local sql server instance on the default port.", "Params": [ [ "ConnectionString", @@ -26225,18 +27562,19 @@ "" ] ], - "Alias": "New-DbaSqlConnectionStringBuilder", - "Author": "zippy1981 | Chrissy LeMaire (@cl)", - "Synopsis": "Returns a System.Data.SqlClient.SqlConnectionStringBuilder with the string specified", - "Name": "New-DbaConnectionStringBuilder", - "Links": "https://dbatools.io/New-DbaConnectionStringBuilder", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eNew-DbaConnectionStringBuilder\nReturns an empty ConnectionStringBuilder\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003e\"Data Source=localhost,1433;Initial Catalog=AlwaysEncryptedSample;UID=sa;PWD=alwaysB3Encrypt1ng;Application Name=Always Encrypted Sample MVC App;Column Encryption Setting=enabled\" | \r\nNew-DbaConnectionStringBuilder\nReturns a connection string builder that can be used to connect to the local sql server instance on the default port.", "Syntax": "New-DbaConnectionStringBuilder [[-ConnectionString] \u003cString[]\u003e] [[-ApplicationName] \u003cString\u003e] [[-DataSource] \u003cString\u003e] [[-InitialCatalog] \u003cString\u003e] [[-IntegratedSecurity] \u003cNullable`1\u003e] [[-UserName] \u003cString\u003e] [[-Password] \u003cString\u003e] [-MultipleActiveResultSets] [[-ColumnEncryptionSetting] {Disabled | Enabled}] [[-WorkstationId] \u003cString\u003e] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "New-DbaCredential", + "Name": "New-DbaCredential", "Description": "Creates a new credential", "Tags": "Certificate", + "Synopsis": "Creates a new SQL Server credential", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "New-DbaCredential", + "Availability": "Windows, Linux, macOS", + "Links": null, + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eNew-DbaCredential -SqlInstance Server1\nYou will be prompted to securely enter your password, then a credential will be created in the master database on server1 if it does not exist.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eNew-DbaCredential -SqlInstance Server1 -Confirm:$false\nSuppresses all prompts to install but prompts to securely enter your password and creates a credential on Server1.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eNew-DbaCredential -SqlInstance Server1 -Name AzureBackupBlobStore -Identity \u0027\u003cAzure Storage Account Name\u003e\u0027 -SecurePassword (ConvertTo-SecureString \u0027\u003cAzure Storage Account Access Key\u003e\u0027 \r\n-AsPlainText -Force)\nCreate credential on SQL Server 2012 CU2, SQL Server 2014 for use with BACKUP TO URL.\r\nCredentialIdentity needs to be supplied with the Azure Storage Account Name.\r\nPassword needs to be one of the Access Keys for the account.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eNew-DbaCredential -SqlInstance Server1 -Name \u0027https://\u003cAzure Storage Account Name\u003e.blob.core.windows.net/\u003cBlob Store Container Name\u003e\u0027 -Identity \u0027SHARED ACCESS SIGNATURE\u0027 -SecurePassword \r\n(ConvertTo-SecureString \u0027\u003cShared Access Token\u003e\u0027 -AsPlainText -Force)\nCreate Credential on SQL Server 2016 or higher for use with BACKUP TO URL.\r\nName has to be the full URL for the blob store container that will be the backup target.\r\nPassword needs to be passed the Shared Access Token (SAS Key).", "Params": [ [ "SqlInstance", @@ -26327,22 +27665,23 @@ "" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Creates a new SQL Server credential", - "Name": "New-DbaCredential", - "Links": null, - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eNew-DbaCredential -SqlInstance Server1\nYou will be prompted to securely enter your password, then a credential will be created in the master database on server1 if it does not exist.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eNew-DbaCredential -SqlInstance Server1 -Confirm:$false\nSuppresses all prompts to install but prompts to securely enter your password and creates a credential on Server1.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eNew-DbaCredential -SqlInstance Server1 -Name AzureBackupBlobStore -Identity \u0027\u003cAzure Storage Account Name\u003e\u0027 -SecurePassword (ConvertTo-SecureString \u0027\u003cAzure Storage Account Access Key\u003e\u0027 \r\n-AsPlainText -Force)\nCreate credential on SQL Server 2012 CU2, SQL Server 2014 for use with BACKUP TO URL.\r\nCredentialIdentity needs to be supplied with the Azure Storage Account Name.\r\nPassword needs to be one of the Access Keys for the account.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eNew-DbaCredential -SqlInstance Server1 -Name \u0027https://\u003cAzure Storage Account Name\u003e.blob.core.windows.net/\u003cBlob Store Container Name\u003e\u0027 -Identity \u0027SHARED ACCESS SIGNATURE\u0027 -SecurePassword \r\n(ConvertTo-SecureString \u0027\u003cShared Access Token\u003e\u0027 -AsPlainText -Force)\nCreate Credential on SQL Server 2016 or higher for use with BACKUP TO URL.\r\nName has to be the full URL for the blob store container that will be the backup target.\r\nPassword needs to be passed the Shared Access Token (SAS Key).", "Syntax": "New-DbaCredential [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [[-Name] \u003cObject[]\u003e] [-Identity] \u003cString[]\u003e [[-SecurePassword] \u003cSecureString\u003e] [[-MappedClassType] \u003cString\u003e] [[-ProviderName] \u003cString\u003e] [-Force] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "New-DbaDacOption", + "Name": "New-DbaDacOption", "Description": "Creates a new Microsoft.SqlServer.Dac.DacExtractOptions/DacExportOptions object that can be used during DacPackage extract. Basically saves you the time from remembering the SMO assembly name ;)\n\nSee:\nhttps://msdn.microsoft.com/en-us/library/microsoft.sqlserver.dac.dacexportoptions.aspx\nhttps://msdn.microsoft.com/en-us/library/microsoft.sqlserver.dac.dacextractoptions.aspx\nfor more information", "Tags": [ "Migration", "Database", "Dacpac" ], + "Synopsis": "Creates a new Microsoft.SqlServer.Dac.DacExtractOptions/DacExportOptions object depending on the chosen Type", + "Alias": "", + "Author": "Kirill Kravtsov (@nvarscar), nvarscar.wordpress.com", + "CommandName": "New-DbaDacOption", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/New-DbaDacOption", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003e$options = New-DbaDacOption -Type Dacpac -Action Export\nPS C:\\\u003e $options.ExtractAllTableData = $true\r\nPS C:\\\u003e $options.CommandTimeout = 0\r\nPS C:\\\u003e Export-DbaDacPackage -SqlInstance sql2016 -Database DB1 -Options $options\nUses DacOption object to set the CommandTimeout to 0 then extracts the dacpac for SharePoint_Config on sql2016 to C:\\temp\\SharePoint_Config.dacpac including all table data.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003e$options = New-DbaDacOption -Type Dacpac -Action Publish\nPS C:\\\u003e $options.DeployOptions.DropObjectsNotInSource = $true\r\nPS C:\\\u003e Publish-DbaDacPackage -SqlInstance sql2016 -Database DB1 -Options $options -Path c:\\temp\\db.dacpac\nUses DacOption object to set Deployment Options and publish the db.dacpac dacpac file as DB1 on sql2016", "Params": [ [ "Type", @@ -26393,18 +27732,19 @@ "" ] ], - "Alias": "", - "Author": "Kirill Kravtsov (@nvarscar), nvarscar.wordpress.com", - "Synopsis": "Creates a new Microsoft.SqlServer.Dac.DacExtractOptions/DacExportOptions object depending on the chosen Type", - "Name": "New-DbaDacOption", - "Links": "https://dbatools.io/New-DbaDacOption", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003e$options = New-DbaDacOption -Type Dacpac -Action Export\nPS C:\\\u003e $options.ExtractAllTableData = $true\r\nPS C:\\\u003e $options.CommandTimeout = 0\r\nPS C:\\\u003e Export-DbaDacPackage -SqlInstance sql2016 -Database DB1 -Options $options\nUses DacOption object to set the CommandTimeout to 0 then extracts the dacpac for SharePoint_Config on sql2016 to C:\\temp\\SharePoint_Config.dacpac including all table data.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003e$options = New-DbaDacOption -Type Dacpac -Action Publish\nPS C:\\\u003e $options.DeployOptions.DropObjectsNotInSource = $true\r\nPS C:\\\u003e Publish-DbaDacPackage -SqlInstance sql2016 -Database DB1 -Options $options -Path c:\\temp\\db.dacpac\nUses DacOption object to set Deployment Options and publish the db.dacpac dacpac file as DB1 on sql2016", "Syntax": "New-DbaDacOption [[-Type] \u003cString\u003e] [-Action] \u003cString\u003e [[-PublishXml] \u003cString\u003e] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "New-DbaDacProfile", + "Name": "New-DbaDacProfile", "Description": "The New-DbaDacProfile command generates a standard publish profile xml file that can be used by the DacFx (this and everything else) to control the deployment of your dacpac\nThis generates a standard template XML which is enough to dpeloy a dacpac but it is highly recommended that you add additional options to the publish profile.\nIf you use Visual Studio you can open a publish.xml file and use the ui to edit the file -\nTo create a new file, right click on an SSDT project, choose \"Publish\" then \"Load Profile\" and load your profile or create a new one.\nOnce you have loaded it in Visual Studio, clicking advanced shows you the list of options available to you.\nFor a full list of options that you can add to the profile, google \"sqlpackage.exe command line switches\" or (https://msdn.microsoft.com/en-us/library/hh550080(v=vs.103).aspx)", "Tags": "Dacpac", + "Synopsis": "Creates a new Publish Profile.", + "Alias": "New-DbaPublishProfile", + "Author": "Richie lee (@richiebzzzt)", + "CommandName": "New-DbaDacProfile", + "Availability": "Windows only", + "Links": "https://dbatools.io/New-DbaDacProfile", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eNew-DbaDacProfile -SqlInstance sql2017 -SqlCredential ad\\sqldba -Database WorldWideImporters -Path C:\\temp\nIn this example, a prompt will appear for alternative credentials, then a connection will be made to sql2017. Using that connection,\r\nthe ConnectionString will be extracted and used within the Publish Profile XML file which will be created at C:\\temp\\sql2017-WorldWideImporters-publish.xml\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eNew-DbaDacProfile -Database WorldWideImporters -Path C:\\temp -ConnectionString \"SERVER=(localdb)\\MSSQLLocalDB;Integrated Security=True;Database=master\"\nIn this example, no connections are made, and a Publish Profile XML would be created at C:\\temp\\localdb-MSSQLLocalDB-WorldWideImporters-publish.xml", "Params": [ [ "SqlInstance", @@ -26479,18 +27819,19 @@ "" ] ], - "Alias": "New-DbaPublishProfile", - "Author": "Richie lee (@richiebzzzt)", - "Synopsis": "Creates a new Publish Profile.", - "Name": "New-DbaDacProfile", - "Links": "https://dbatools.io/New-DbaDacProfile", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eNew-DbaDacProfile -SqlInstance sql2017 -SqlCredential ad\\sqldba -Database WorldWideImporters -Path C:\\temp\nIn this example, a prompt will appear for alternative credentials, then a connection will be made to sql2017. Using that connection,\r\nthe ConnectionString will be extracted and used within the Publish Profile XML file which will be created at C:\\temp\\sql2017-WorldWideImporters-publish.xml\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eNew-DbaDacProfile -Database WorldWideImporters -Path C:\\temp -ConnectionString \"SERVER=(localdb)\\MSSQLLocalDB;Integrated Security=True;Database=master\"\nIn this example, no connections are made, and a Publish Profile XML would be created at C:\\temp\\localdb-MSSQLLocalDB-WorldWideImporters-publish.xml", "Syntax": "New-DbaDacProfile [[-SqlInstance] \u003cDbaInstanceParameter[]\u003e] [[-SqlCredential] \u003cPSCredential\u003e] [-Database] \u003cString[]\u003e [[-Path] \u003cString\u003e] [[-ConnectionString] \u003cString[]\u003e] [[-PublishOptions] \u003cHashtable\u003e] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "New-DbaDatabase", + "Name": "New-DbaDatabase", "Description": "This command creates a new database.\n\nIt allows creation with multiple files, and sets all growth settings to be fixed size rather than percentage growth.", "Tags": "Database", + "Synopsis": "Creates a new database", + "Alias": "", + "Author": "Matthew Darwin (@evoDBA, naturalselectiondba.wordpress.com) | Chrissy LeMaire (@cl)", + "CommandName": "New-DbaDatabase", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/New-DbaDatabase", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eNew-DbaDatabase -SqlInstance sql1\nCreates a randomly named database (random-N) on instance sql1\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eNew-DbaDatabase -SqlInstance sql1 -Name dbatools, dbachecks\nCreates a database named dbatools and a database named dbachecks on sql1\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eNew-DbaDatabase -SqlInstance sql1, sql2, sql3 -Name multidb, multidb2 -SecondaryFilesize 20 -SecondaryFileGrowth 20 -LogSize 20 -LogGrowth 20\nCreates two databases, multidb and multidb2, on 3 instances (sql1, sql2 and sql3) and sets the secondary data file size to 20MB, the file growth to 20MB and the log growth to 20MB for each\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eNew-DbaDatabase -SqlInstance sql1 -Name nondefault -DataFilePath M:\\Data -LogFilePath \u0027L:\\Logs with spaces\u0027 -SecondaryFileCount 2\nCreates a database named nondefault and places data files in in the M:\\data directory and log files in \"L:\\Logs with spaces\".\nCreates a secondary group with 2 files in the Secondary filegroup.", "Params": [ [ "SqlInstance", @@ -26661,18 +28002,19 @@ "" ] ], - "Alias": "", - "Author": "Matthew Darwin (@evoDBA, naturalselectiondba.wordpress.com) | Chrissy LeMaire (@cl)", - "Synopsis": "Creates a new database", - "Name": "New-DbaDatabase", - "Links": "https://dbatools.io/New-DbaDatabase", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eNew-DbaDatabase -SqlInstance sql1\nCreates a randomly named database (random-N) on instance sql1\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eNew-DbaDatabase -SqlInstance sql1 -Name dbatools, dbachecks\nCreates a database named dbatools and a database named dbachecks on sql1\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eNew-DbaDatabase -SqlInstance sql1, sql2, sql3 -Name multidb, multidb2 -SecondaryFilesize 20 -SecondaryFileGrowth 20 -LogSize 20 -LogGrowth 20\nCreates two databases, multidb and multidb2, on 3 instances (sql1, sql2 and sql3) and sets the secondary data file size to 20MB, the file growth to 20MB and the log growth to 20MB for each\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eNew-DbaDatabase -SqlInstance sql1 -Name nondefault -DataFilePath M:\\Data -LogFilePath \u0027L:\\Logs with spaces\u0027 -SecondaryFileCount 2\nCreates a database named nondefault and places data files in in the M:\\data directory and log files in \"L:\\Logs with spaces\".\nCreates a secondary group with 2 files in the Secondary filegroup.", "Syntax": "New-DbaDatabase [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [[-Name] \u003cString[]\u003e] [[-Collation] \u003cString\u003e] [[-Recoverymodel] \u003cString\u003e] [[-Owner] \u003cString\u003e] [[-DataFilePath] \u003cString\u003e] [[-LogFilePath] \u003cString\u003e] [[-PrimaryFilesize] \u003cInt32\u003e] [[-PrimaryFileGrowth] \u003cInt32\u003e] [[-PrimaryFileMaxSize] \u003cInt32\u003e] [[-LogSize] \u003cInt32\u003e] [[-LogGrowth] \u003cInt32\u003e] [[-SecondaryFilesize] \u003cInt32\u003e] [[-SecondaryFileGrowth] \u003cInt32\u003e] [[-SecondaryFileMaxSize] \u003cInt32\u003e] [[-SecondaryFileCount] \u003cInt32\u003e] [[-DefaultFileGroup] \u003cString\u003e] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "New-DbaDbCertificate", + "Name": "New-DbaDbCertificate", "Description": "Creates a new database certificate. If no database is specified, the certificate will be created in master.", "Tags": "Certificate", + "Synopsis": "Creates a new database certificate", + "Alias": "New-DbaDatabaseCertificate", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "New-DbaDbCertificate", + "Availability": "Windows, Linux, macOS", + "Links": null, + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eNew-DbaDbCertificate -SqlInstance Server1\nYou will be prompted to securely enter your password, then a certificate will be created in the master database on server1 if it does not exist.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eNew-DbaDbCertificate -SqlInstance Server1 -Database db1 -Confirm:$false\nSuppresses all prompts to install but prompts to securely enter your password and creates a certificate in the \u0027db1\u0027 database", "Params": [ [ "SqlInstance", @@ -26779,18 +28121,196 @@ "" ] ], - "Alias": "New-DbaDatabaseCertificate", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Creates a new database certificate", - "Name": "New-DbaDbCertificate", - "Links": null, - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eNew-DbaDbCertificate -SqlInstance Server1\nYou will be prompted to securely enter your password, then a certificate will be created in the master database on server1 if it does not exist.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eNew-DbaDbCertificate -SqlInstance Server1 -Database db1 -Confirm:$false\nSuppresses all prompts to install but prompts to securely enter your password and creates a certificate in the \u0027db1\u0027 database", "Syntax": "New-DbaDbCertificate [[-SqlInstance] \u003cDbaInstanceParameter[]\u003e] [[-SqlCredential] \u003cPSCredential\u003e] [[-Name] \u003cString[]\u003e] [[-Database] \u003cString[]\u003e] [[-Subject] \u003cString[]\u003e] [[-StartDate] \u003cDateTime\u003e] [[-ExpirationDate] \u003cDateTime\u003e] [-ActiveForServiceBrokerDialog] [[-SecurePassword] \u003cSecureString\u003e] [[-InputObject] \u003cDatabase[]\u003e] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "New-DbaDbMasterKey", + "Name": "New-DbaDbMailProfile", + "Description": "Creates a new database mail profile, and optionally associates it to a database mail account", + "Tags": "DbMail", + "Synopsis": "Creates a new database mail profile", + "Alias": "", + "Author": "Ian Lanham (@ilanham)", + "CommandName": "New-DbaDbMailProfile", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/New-DbaDbMailProfile", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003e$profile = New-DbaDbMailProfile -SqlInstance sql2017 -Name \u0027The DBA Team\u0027\nCreates a new db mail profile", + "Params": [ + [ + "SqlInstance", + "The target SQL Server instance or instances. You must have sysadmin access and server version must be SQL Server version 2008 or higher.", + "ServerInstance,SqlServer", + true, + "true (ByValue)", + "" + ], + [ + "SqlCredential", + "Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential)", + "", + false, + "false", + "" + ], + [ + "Name", + "The Name of the profile to be created.", + "", + true, + "false", + "" + ], + [ + "Description", + "Sets the description of the purpose of the mail profile.", + "", + false, + "false", + "" + ], + [ + "MailAccountName", + "Associates a db mail account to link to this db mail profile.", + "", + false, + "false", + "" + ], + [ + "MailAccountPriority", + "Sets the priority of the linked db mail account when linking to this db mail profile.", + "", + false, + "false", + "0" + ], + [ + "EnableException", + "By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message.\r\nThis avoids overwhelming you with \"sea of red\" exceptions, but is inconvenient because it basically disables advanced scripting.\r\nUsing this switch turns this \"nice by default\" feature off and enables you to catch exceptions with your own try/catch.", + "", + false, + "false", + "False" + ], + [ + "WhatIf", + "If this switch is enabled, no actions are performed but informational messages will be displayed that explain what would happen if the command were to run.", + "wi", + false, + "false", + "" + ], + [ + "Confirm", + "If this switch is enabled, you will be prompted for confirmation before executing any operations that change state.", + "cf", + false, + "false", + "" + ] + ], + "Syntax": "New-DbaDbMailProfile [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [-Name] \u003cString\u003e [[-Description] \u003cString\u003e] [[-MailAccountName] \u003cString\u003e] [[-MailAccountPriority] \u003cInt32\u003e] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" + }, + { + "Name": "New-DbaDbMaskingConfig", + "Description": "Generates a new data masking configuration file. This file is important to apply any data masking to the data in a database.\n\nNote that the following column and data types are not currently supported:\nIdentity\nForeignKey\nComputed\nHierarchyid\nGeography\nGeometry\nXml\n\nRead more here:\nhttps://sachabarbs.wordpress.com/2018/06/11/bogus-simple-fake-data-tool/\nhttps://github.com/bchavez/Bogus", + "Tags": [ + "DataMasking", + "Database" + ], + "Synopsis": "Generates a new data masking configuration file to be used with Invoke-DbaDbDataMasking", + "Alias": "", + "Author": "Sander Stad (@sqlstad, sqlstad.nl) | Chrissy LeMaire (@cl, netnerds.net)", + "CommandName": "New-DbaDbMaskingConfig", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/New-DbaDbMaskingConfig", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eNew-DbaDbMaskingConfig -SqlInstance SQLDB1 -Database DB1 -Path C:\\Temp\\clone\nProcess all tables and columns for database DB1 on instance SQLDB1\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eNew-DbaDbMaskingConfig -SqlInstance SQLDB1 -Database DB1 -Table Customer -Path C:\\Temp\\clone\nProcess only table Customer with all the columns\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eNew-DbaDbMaskingConfig -SqlInstance SQLDB1 -Database DB1 -Table Customer -Column City -Path C:\\Temp\\clone\nProcess only table Customer and only the column named \"City\"", + "Params": [ + [ + "SqlInstance", + "The target SQL Server instance or instances.", + "", + true, + "false", + "" + ], + [ + "SqlCredential", + "Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential)", + "", + false, + "false", + "" + ], + [ + "Database", + "Databases to process through", + "", + false, + "false", + "" + ], + [ + "Table", + "Tables to process. By default all the tables will be processed", + "", + false, + "false", + "" + ], + [ + "Column", + "Columns to process. By default all the columns will be processed", + "", + false, + "false", + "" + ], + [ + "Path", + "Path where to save the generated JSON files.\r\nTh naming convention will be \"servername.databasename.tables.json\"", + "", + true, + "false", + "" + ], + [ + "Locale", + "Set the local to enable certain settings in the masking", + "", + false, + "false", + "en" + ], + [ + "Force", + "Forcefully execute commands when needed", + "", + false, + "false", + "False" + ], + [ + "EnableException", + "By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message.\r\nThis avoids overwhelming you with \"sea of red\" exceptions, but is inconvenient because it basically disables advanced scripting.\r\nUsing this switch turns this \"nice by default\" feature off and enables you to catch exceptions with your own try/catch.", + "", + false, + "false", + "False" + ] + ], + "Syntax": "New-DbaDbMaskingConfig [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [[-Database] \u003cString[]\u003e] [[-Table] \u003cString[]\u003e] [[-Column] \u003cString[]\u003e] [-Path] \u003cString\u003e [[-Locale] \u003cString\u003e] [-Force] [-EnableException] [\u003cCommonParameters\u003e]" + }, + { + "Name": "New-DbaDbMasterKey", "Description": "Creates a new database master key. If no database is specified, the master key will be created in master.", "Tags": "Certificate", + "Synopsis": "Creates a new database master key", + "Alias": "New-DbaDatabaseMasterKey", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "New-DbaDbMasterKey", + "Availability": "Windows, Linux, macOS", + "Links": null, + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eNew-DbaDbMasterKey -SqlInstance Server1\nYou will be prompted to securely enter your password, then a master key will be created in the master database on server1 if it does not exist.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eNew-DbaDbMasterKey -SqlInstance Server1 -Credential usernamedoesntmatter\nYou will be prompted by a credential interface to securely enter your password, then a master key will be created in the master database on server1 if it does not exist.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eNew-DbaDbMasterKey -SqlInstance Server1 -Database db1 -Confirm:$false\nSuppresses all prompts to install but prompts in th console to securely enter your password and creates a master key in the \u0027db1\u0027 database", "Params": [ [ "SqlInstance", @@ -26865,22 +28385,23 @@ "" ] ], - "Alias": "New-DbaDatabaseMasterKey", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Creates a new database master key", - "Name": "New-DbaDbMasterKey", - "Links": null, - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eNew-DbaDbMasterKey -SqlInstance Server1\nYou will be prompted to securely enter your password, then a master key will be created in the master database on server1 if it does not exist.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eNew-DbaDbMasterKey -SqlInstance Server1 -Credential usernamedoesntmatter\nYou will be prompted by a credential interface to securely enter your password, then a master key will be created in the master database on server1 if it does not exist.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eNew-DbaDbMasterKey -SqlInstance Server1 -Database db1 -Confirm:$false\nSuppresses all prompts to install but prompts in th console to securely enter your password and creates a master key in the \u0027db1\u0027 database", "Syntax": "New-DbaDbMasterKey [[-SqlInstance] \u003cDbaInstanceParameter[]\u003e] [[-SqlCredential] \u003cPSCredential\u003e] [[-Credential] \u003cPSCredential\u003e] [[-Database] \u003cString[]\u003e] [[-SecurePassword] \u003cSecureString\u003e] [[-InputObject] \u003cDatabase[]\u003e] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "New-DbaDbSnapshot", + "Name": "New-DbaDbSnapshot", "Description": "Creates database snapshots without hassles", "Tags": [ "Snapshot", "Restore", "Database" ], + "Synopsis": "Creates database snapshots", + "Alias": "New-DbaDatabaseSnapshot", + "Author": "Simone Bizzotto (@niphold)", + "CommandName": "New-DbaDbSnapshot", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/New-DbaDbSnapshot", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eNew-DbaDbSnapshot -SqlInstance sqlserver2014a -Database HR, Accounting\nCreates snapshot for HR and Accounting, returning a custom object displaying Server, Database, DatabaseCreated, SnapshotOf, SizeMB, DatabaseCreated, PrimaryFilePath, Status, Notes\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eNew-DbaDbSnapshot -SqlInstance sqlserver2014a -Database HR -Name HR_snap\nCreates snapshot named \"HR_snap\" for HR\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eNew-DbaDbSnapshot -SqlInstance sqlserver2014a -Database HR -NameSuffix \u0027fool_{0}_snap\u0027\nCreates snapshot named \"fool_HR_snap\" for HR\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eNew-DbaDbSnapshot -SqlInstance sqlserver2014a -Database HR, Accounting -Path F:\\snapshotpath\nCreates snapshots for HR and Accounting databases, storing files under the F:\\snapshotpath\\ dir\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eGet-DbaDatabase -SqlInstance sql2016 -Database df | New-DbaDbSnapshot\nCreates a snapshot for the database df on sql2016", "Params": [ [ "SqlInstance", @@ -26987,21 +28508,22 @@ "" ] ], - "Alias": "New-DbaDatabaseSnapshot", - "Author": "Simone Bizzotto (@niphold)", - "Synopsis": "Creates database snapshots", - "Name": "New-DbaDbSnapshot", - "Links": "https://dbatools.io/New-DbaDbSnapshot", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eNew-DbaDbSnapshot -SqlInstance sqlserver2014a -Database HR, Accounting\nCreates snapshot for HR and Accounting, returning a custom object displaying Server, Database, DatabaseCreated, SnapshotOf, SizeMB, DatabaseCreated, PrimaryFilePath, Status, Notes\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eNew-DbaDbSnapshot -SqlInstance sqlserver2014a -Database HR -Name HR_snap\nCreates snapshot named \"HR_snap\" for HR\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eNew-DbaDbSnapshot -SqlInstance sqlserver2014a -Database HR -NameSuffix \u0027fool_{0}_snap\u0027\nCreates snapshot named \"fool_HR_snap\" for HR\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eNew-DbaDbSnapshot -SqlInstance sqlserver2014a -Database HR, Accounting -Path F:\\snapshotpath\nCreates snapshots for HR and Accounting databases, storing files under the F:\\snapshotpath\\ dir\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eGet-DbaDatabase -SqlInstance sql2016 -Database df | New-DbaDbSnapshot\nCreates a snapshot for the database df on sql2016", "Syntax": "New-DbaDbSnapshot [[-SqlInstance] \u003cDbaInstanceParameter[]\u003e] [[-SqlCredential] \u003cPSCredential\u003e] [[-Database] \u003cObject[]\u003e] [[-ExcludeDatabase] \u003cObject[]\u003e] [-AllDatabases] [[-Name] \u003cString\u003e] [[-NameSuffix] \u003cString\u003e] [[-Path] \u003cString\u003e] [-Force] [[-InputObject] \u003cDatabase[]\u003e] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "New-DbaDbUser", + "Name": "New-DbaDbUser", "Description": "Creates a new user for a specified database with provided specifications.", "Tags": [ "Database", "User" ], + "Synopsis": "Creates a new user for the specified database.", + "Alias": "", + "Author": "Frank Henninger (@osiris687)", + "CommandName": "New-DbaDbUser", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/New-DbaDbUser", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eNew-DbaDbUser -SqlInstance sqlserver2014 -Database DB1 -Login user1\nCreates a new sql user with login named user1 in the specified database.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eNew-DbaDbUser -SqlInstance sqlserver2014 -Database DB1 -Username user1\nCreates a new sql user without login named user1 in the specified database.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eNew-DbaDbUser -SqlInstance sqlserver2014 -Database DB1 -Login Login1 -Username user1\nCreates a new sql user named user1 mapped to Login1 in the specified database.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaDbUser -SqlInstance sqlserver1 -Database DB1 | New-DbaDbUser -SqlInstance sqlserver2 -Database DB1\nCopies users from sqlserver1.DB1 to sqlserver2.DB1. Does not copy permissions!", "Params": [ [ "SqlInstance", @@ -27092,22 +28614,23 @@ "" ] ], - "Alias": "", - "Author": "Frank Henninger (@osiris687)", - "Synopsis": "Creates a new user for the specified database.", - "Name": "New-DbaDbUser", - "Links": "https://dbatools.io/New-DbaDbUser", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eNew-DbaDbUser -SqlInstance sqlserver2014 -Database DB1 -Login user1\nCreates a new sql user with login named user1 in the specified database.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eNew-DbaDbUser -SqlInstance sqlserver2014 -Database DB1 -Username user1\nCreates a new sql user without login named user1 in the specified database.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eNew-DbaDbUser -SqlInstance sqlserver2014 -Database DB1 -Login Login1 -Username user1\nCreates a new sql user named user1 mapped to Login1 in the specified database.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaDbUser -SqlInstance sqlserver1 -Database DB1 | New-DbaDbUser -SqlInstance sqlserver2 -Database DB1\nCopies users from sqlserver1.DB1 to sqlserver2.DB1. Does not copy permissions!", "Syntax": "New-DbaDbUser [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [-SqlCredential \u003cPSCredential\u003e] [-Database \u003cObject[]\u003e] [-ExcludeDatabase \u003cObject[]\u003e] [-IncludeSystem] [-Username \u003cString[]\u003e] [-Force] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]\nNew-DbaDbUser [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [-SqlCredential \u003cPSCredential\u003e] [-Database \u003cObject[]\u003e] [-ExcludeDatabase \u003cObject[]\u003e] [-IncludeSystem] [-Login \u003cString[]\u003e] [-Username \u003cString[]\u003e] [-Force] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "New-DbaDirectory", + "Name": "New-DbaDirectory", "Description": "Uses master.dbo.xp_create_subdir to create the path\nReturns $true if the path can be created, $false otherwise", "Tags": [ "Path", "Directory", "Folder" ], + "Synopsis": "Creates new path as specified by the path variable", + "Alias": "New-DbaSqlDirectory", + "Author": "Stuart Moore", + "CommandName": "New-DbaDirectory", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/New-DbaDirectory", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eNew-DbaDirectory -SqlInstance sqlcluster -Path L:\\MSAS12.MSSQLSERVER\\OLAP\nIf the SQL Server instance sqlcluster can create the path L:\\MSAS12.MSSQLSERVER\\OLAP it will do and return $true, if not it will return $false.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003e$credential = Get-Credential\nPS C:\\\u003e New-DbaDirectory -SqlInstance sqlcluster -SqlCredential $credential -Path L:\\MSAS12.MSSQLSERVER\\OLAP\nIf the SQL Server instance sqlcluster can create the path L:\\MSAS12.MSSQLSERVER\\OLAP it will do and return $true, if not it will return $false. Uses a SqlCredential to connect", "Params": [ [ "SqlInstance", @@ -27158,18 +28681,19 @@ "" ] ], - "Alias": "New-DbaSqlDirectory", - "Author": "Stuart Moore", - "Synopsis": "Creates new path as specified by the path variable", - "Name": "New-DbaDirectory", - "Links": "https://dbatools.io/New-DbaDirectory", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eNew-DbaDirectory -SqlInstance sqlcluster -Path L:\\MSAS12.MSSQLSERVER\\OLAP\nIf the SQL Server instance sqlcluster can create the path L:\\MSAS12.MSSQLSERVER\\OLAP it will do and return $true, if not it will return $false.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003e$credential = Get-Credential\nPS C:\\\u003e New-DbaDirectory -SqlInstance sqlcluster -SqlCredential $credential -Path L:\\MSAS12.MSSQLSERVER\\OLAP\nIf the SQL Server instance sqlcluster can create the path L:\\MSAS12.MSSQLSERVER\\OLAP it will do and return $true, if not it will return $false. Uses a SqlCredential to connect", "Syntax": "New-DbaDirectory [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [-Path] \u003cString\u003e [[-SqlCredential] \u003cPSCredential\u003e] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "New-DbaEndpoint", + "Name": "New-DbaEndpoint", "Description": "Creates endpoints on a SQL Server instance.", "Tags": "Endpoint", + "Synopsis": "Creates endpoints on a SQL Server instance.", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "New-DbaEndpoint", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/New-DbaEndpoint", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eNew-DbaEndpoint -SqlInstance localhost\nCreates all Endpoint(s) on the local default SQL Server instance\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eNew-DbaEndpoint -SqlInstance localhost, sql2016\nReturns all Endpoint(s) for the local and sql2016 SQL Server instances", "Params": [ [ "SqlInstance", @@ -27292,21 +28816,22 @@ "" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Creates endpoints on a SQL Server instance.", - "Name": "New-DbaEndpoint", - "Links": "https://dbatools.io/New-DbaEndpoint", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eNew-DbaEndpoint -SqlInstance localhost\nCreates all Endpoint(s) on the local default SQL Server instance\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eNew-DbaEndpoint -SqlInstance localhost, sql2016\nReturns all Endpoint(s) for the local and sql2016 SQL Server instances", "Syntax": "New-DbaEndpoint [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [-SqlCredential \u003cPSCredential\u003e] [-Name \u003cString\u003e] [-Type \u003cString\u003e] [-Protocol \u003cString\u003e] [-Role \u003cString\u003e] [-EndpointEncryption \u003cString\u003e] [-EncryptionAlgorithm \u003cString\u003e] [-Certificate \u003cString\u003e] [-Port \u003cInt32\u003e] [-SslPort \u003cInt32\u003e] [-Owner \u003cString\u003e] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "New-DbaLogin", + "Name": "New-DbaLogin", "Description": "Creates a new SQL Server login with provided specifications", "Tags": [ "Login", "Security" ], + "Synopsis": "Creates a new SQL Server login", + "Alias": "", + "Author": "Kirill Kravtsov (@nvarscar)", + "CommandName": "New-DbaLogin", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/New-DbaLogin", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eNew-DbaLogin -SqlInstance Server1,Server2 -Login Newlogin\nYou will be prompted to securely enter the password for a login [Newlogin]. The login would be created on servers Server1 and Server2 with default parameters.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003e$securePassword = Read-Host \"Input password\" -AsSecureString\nPS C:\\\u003e New-DbaLogin -SqlInstance Server1\\sql1 -Login Newlogin -Password $securePassword -PasswordPolicy -PasswordExpiration\nCreates a login on Server1\\sql1 with a predefined password. The login will have password and expiration policies enforced onto it.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaLogin -SqlInstance sql1 -Login Oldlogin | New-DbaLogin -SqlInstance sql1 -LoginRenameHashtable @{Oldlogin = \u0027Newlogin\u0027} -Force -NewSid -Disabled:$false\nCopies a login [Oldlogin] to the same instance sql1 with the same parameters (including password). New login will have a new sid, a new name [Newlogin] and will not be disabled. Existing login \r\n[Newlogin] will be removed prior to creation.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaLogin -SqlInstance sql1 -Login Login1,Login2 | New-DbaLogin -SqlInstance sql2 -PasswordPolicy -PasswordExpiration -DefaultDatabase tempdb -Disabled\nCopies logins [Login1] and [Login2] from instance sql1 to instance sql2, but enforces password and expiration policies for the new logins. New logins will also have a default database set to [tempdb] \r\nand will be created in a disabled state.\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eNew-DbaLogin -SqlInstance sql1 -Login domain\\user\nCreates a new Windows Authentication backed login on sql1. The login will be part of the public server role.", "Params": [ [ "SqlInstance", @@ -27399,7 +28924,7 @@ [ "DefaultDatabase", "Default database for the login", - "DefaulDB", + "DefaultDB", false, "false", "" @@ -27477,37 +29002,39 @@ "" ] ], - "Alias": "", - "Author": "Kirill Kravtsov (@nvarscar)", - "Synopsis": "Creates a new SQL Server login", - "Name": "New-DbaLogin", - "Links": "https://dbatools.io/New-DbaLogin", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eNew-DbaLogin -SqlInstance Server1,Server2 -Login Newlogin\nYou will be prompted to securely enter the password for a login [Newlogin]. The login would be created on servers Server1 and Server2 with default parameters.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003e$securePassword = Read-Host \"Input password\" -AsSecureString\nPS C:\\\u003e New-DbaLogin -SqlInstance Server1\\sql1 -Login Newlogin -Password $securePassword -PasswordPolicy -PasswordExpiration\nCreates a login on Server1\\sql1 with a predefined password. The login will have password and expiration policies enforced onto it.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaLogin -SqlInstance sql1 -Login Oldlogin | New-DbaLogin -SqlInstance sql1 -LoginRenameHashtable @{Oldlogin = \u0027Newlogin\u0027} -Force -NewSid -Disabled:$false\nCopies a login [Oldlogin] to the same instance sql1 with the same parameters (including password). New login will have a new sid, a new name [Newlogin] and will not be disabled. Existing login \r\n[Newlogin] will be removed prior to creation.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaLogin -SqlInstance sql1 -Login Login1,Login2 | New-DbaLogin -SqlInstance sql2 -PasswordPolicy -PasswordExpiration -DefaultDatabase tempdb -Disabled\nCopies logins [Login1] and [Login2] from instance sql1 to instance sql2, but enforces password and expiration policies for the new logins. New logins will also have a default database set to [tempdb] \r\nand will be created in a disabled state.\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eNew-DbaLogin -SqlInstance sql1 -Login domain\\user\nCreates a new Windows Authentication backed login on sql1. The login will be part of the public server role.", "Syntax": "New-DbaLogin [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [-SqlCredential \u003cPSCredential\u003e] [[-Login] \u003cString[]\u003e] [-InputObject \u003cObject[]\u003e] [-LoginRenameHashtable \u003cHashtable\u003e] [[-SecurePassword] \u003cSecureString\u003e] [-MapToCredential \u003cString\u003e] [-Sid \u003cObject\u003e] [-DefaultDatabase \u003cString\u003e] [-Language \u003cString\u003e] [-PasswordExpiration] [-PasswordPolicy] [-Disabled] [-NewSid] [-Force] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]\nNew-DbaLogin [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [-SqlCredential \u003cPSCredential\u003e] [-Login \u003cString[]\u003e] [-InputObject \u003cObject[]\u003e] [-LoginRenameHashtable \u003cHashtable\u003e] [-MapToAsymmetricKey \u003cString\u003e] [-MapToCredential \u003cString\u003e] [-Sid \u003cObject\u003e] [-Disabled] [-NewSid] [-Force] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]\nNew-DbaLogin [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [-SqlCredential \u003cPSCredential\u003e] [-Login \u003cString[]\u003e] [-InputObject \u003cObject[]\u003e] [-LoginRenameHashtable \u003cHashtable\u003e] [-MapToCertificate \u003cString\u003e] [-MapToCredential \u003cString\u003e] [-Sid \u003cObject\u003e] [-Disabled] [-NewSid] [-Force] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]\nNew-DbaLogin [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [-SqlCredential \u003cPSCredential\u003e] [-Login \u003cString[]\u003e] [-InputObject \u003cObject[]\u003e] [-LoginRenameHashtable \u003cHashtable\u003e] [-HashedPassword \u003cString\u003e] [-MapToCredential \u003cString\u003e] [-Sid \u003cObject\u003e] [-DefaultDatabase \u003cString\u003e] [-Language \u003cString\u003e] [-PasswordExpiration] [-PasswordPolicy] [-Disabled] [-NewSid] [-Force] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "New-DbaScriptingOption", + "Name": "New-DbaScriptingOption", "Description": "Creates a new Microsoft.SqlServer.Management.Smo.ScriptingOptions object. Basically saves you the time from remembering the SMO assembly name ;)\n\nSee https://msdn.microsoft.com/en-us/library/microsoft.sqlserver.management.smo.scriptingoptions.aspx for more information", "Tags": [ "Migration", "Backup", "DR" ], - "Params": [ - - ], + "Synopsis": "Creates a new Microsoft.SqlServer.Management.Smo.ScriptingOptions object", "Alias": "", "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Creates a new Microsoft.SqlServer.Management.Smo.ScriptingOptions object", - "Name": "New-DbaScriptingOption", + "CommandName": "New-DbaScriptingOption", + "Availability": "Windows, Linux, macOS", "Links": "https://dbatools.io/New-DbaScriptingOption", "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003e$options = New-DbaScriptingOption\nPS C:\\\u003e $options.ScriptDrops = $false\r\nPS C:\\\u003e $options.WithDependencies = $true\r\nPS C:\\\u003e Get-DbaAgentJob -SqlInstance sql2016 | Export-DbaScript -ScriptingOptionObject $options\nExports Agent Jobs with the Scripting Options ScriptDrops set to $false and WithDependencies set to true", + "Params": [ + + ], "Syntax": "New-DbaScriptingOption [\u003cCommonParameters\u003e]" }, { - "CommandName": "New-DbaServiceMasterKey", + "Name": "New-DbaServiceMasterKey", "Description": "Creates a new service master key in the master database.", "Tags": "Certificate", + "Synopsis": "Creates a new service master key.", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "New-DbaServiceMasterKey", + "Availability": "Windows, Linux, macOS", + "Links": null, + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eNew-DbaServiceMasterKey -SqlInstance Server1\nYou will be prompted to securely enter your Service Key password, then a master key will be created in the master database on server1 if it does not exist.", "Params": [ [ "SqlInstance", @@ -27566,22 +29093,23 @@ "" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Creates a new service master key.", - "Name": "New-DbaServiceMasterKey", - "Links": null, - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eNew-DbaServiceMasterKey -SqlInstance Server1\nYou will be prompted to securely enter your Service Key password, then a master key will be created in the master database on server1 if it does not exist.", "Syntax": "New-DbaServiceMasterKey [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [[-Credential] \u003cPSCredential\u003e] [[-SecurePassword] \u003cSecureString\u003e] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "New-DbaSsisCatalog", + "Name": "New-DbaSsisCatalog", "Description": "After installing the SQL Server Engine and SSIS you still have to enable the SSIS Catalog. This function will enable the catalog and gives the option of supplying the password.", "Tags": [ "SSIS", "SSISDB", "Catalog" ], + "Synopsis": "Enables the SSIS Catalog on a SQL Server 2012+", + "Alias": "", + "Author": "Stephen Bennett, https://sqlnotesfromtheunderground.wordpress.com/", + "CommandName": "New-DbaSsisCatalog", + "Availability": "Windows only", + "Links": "https://dbatools.io/New-DbaSsisCatalog", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003e$SecurePassword = Read-Host -AsSecureString -Prompt \"Enter password\"\nPS C:\\\u003e New-DbaSsisCatalog -SqlInstance DEV01 -SecurePassword $SecurePassword\nCreates the SSIS Catalog on server DEV01 with the specified password.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eNew-DbaSsisCatalog -SqlInstance sql2016 -Credential usernamedoesntmatter\nCreates the SSIS Catalog on server DEV01 with the specified password in the credential prompt. As the example username suggets the username does not matter.\r\nThis is simply an easier way to get a secure password.", "Params": [ [ "SqlInstance", @@ -27648,18 +29176,19 @@ "" ] ], - "Alias": "", - "Author": "Stephen Bennett, https://sqlnotesfromtheunderground.wordpress.com/", - "Synopsis": "Enables the SSIS Catalog on a SQL Server 2012+", - "Name": "New-DbaSsisCatalog", - "Links": "https://dbatools.io/New-DbaSsisCatalog", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003e$SecurePassword = Read-Host -AsSecureString -Prompt \"Enter password\"\nPS C:\\\u003e New-DbaSsisCatalog -SqlInstance DEV01 -SecurePassword $SecurePassword\nCreates the SSIS Catalog on server DEV01 with the specified password.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eNew-DbaSsisCatalog -SqlInstance sql2016 -Credential usernamedoesntmatter\nCreates the SSIS Catalog on server DEV01 with the specified password in the credential prompt. As the example username suggets the username does not matter.\r\nThis is simply an easier way to get a secure password.", "Syntax": "New-DbaSsisCatalog [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [[-Credential] \u003cPSCredential\u003e] [[-SecurePassword] \u003cSecureString\u003e] [[-SsisCatalog] \u003cString\u003e] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "New-DbatoolsSupportPackage", + "Name": "New-DbatoolsSupportPackage", "Description": "This function creates an extensive debugging package that can help with reproducing and fixing issues.\n\nThe file will be created on the desktop by default and will contain quite a bit of information:\n- OS Information\n- Hardware Information (CPU, Ram, things like that)\n- .NET Information\n- PowerShell Information\n- Your input history\n- The In-Memory message log\n- The In-Memory error log\n- Screenshot of the console buffer (Basically, everything written in your current console, even if you have to scroll upwards to see it.", "Tags": "Debug", + "Synopsis": "Creates a package of troubleshooting information that can be used by dbatools to help debug issues.", + "Alias": "", + "Author": "Friedrich Weinmann (@FredWeinmann)", + "CommandName": "New-DbatoolsSupportPackage", + "Availability": "Windows only", + "Links": "https://dbatools.io/New-DbatoolsSupportPackage", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eNew-DbatoolsSupportPackage\nCreates a large support pack in order to help us troubleshoot stuff.", "Params": [ [ "Path", @@ -27677,6 +29206,14 @@ "false", "" ], + [ + "PassThru", + "Returns file object that was created during execution.", + "", + false, + "false", + "False" + ], [ "EnableException", "By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message.\r\nThis avoids overwhelming you with \"sea of red\" exceptions, but is inconvenient because it basically disables advanced scripting.\r\nUsing this switch turns this \"nice by default\" feature off and enables you to catch exceptions with your own try/catch.", @@ -27702,22 +29239,23 @@ "" ] ], - "Alias": "", - "Author": "Friedrich Weinmann (@FredWeinmann)", - "Synopsis": "Creates a package of troubleshooting information that can be used by dbatools to help debug issues.", - "Name": "New-DbatoolsSupportPackage", - "Links": "https://dbatools.io/New-DbatoolsSupportPackage", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eNew-DbatoolsSupportPackage\nCreates a large support pack in order to help us troubleshoot stuff.", - "Syntax": "New-DbatoolsSupportPackage [[-Path] \u003cString\u003e] [[-Variables] \u003cString[]\u003e] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" + "Syntax": "New-DbatoolsSupportPackage [[-Path] \u003cString\u003e] [[-Variables] \u003cString[]\u003e] [-PassThru] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "New-DbaXESession", - "Description": "Creates a new XESession object - for the dogged (very manual, Import-DbaXESession is recommended). See the following for more info:\n\nhttps://docs.microsoft.com/en-us/sql/relational-databases/extended-events/use-the-powershell-provider-for-extended-events", + "Name": "New-DbaXESession", + "Description": "Creates a new XESession object - for the dogged (very manual, Import-DbaXESessionTemplate is recommended). See the following for more info:\n\nhttps://docs.microsoft.com/en-us/sql/relational-databases/extended-events/use-the-powershell-provider-for-extended-events", "Tags": [ "ExtendedEvent", "XE", "XEvent" ], + "Synopsis": "Creates a new XESession object - for the dogged.", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "New-DbaXESession", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/New-DbaXESession", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003e$session = New-DbaXESession -SqlInstance sql2017 -Name XeSession_Test\nPS C:\\\u003e $event = $session.AddEvent(\"sqlserver.file_written\")\r\nPS C:\\\u003e $event.AddAction(\"package0.callstack\")\r\nPS C:\\\u003e $session.Create()\nReturns a new XE Session object from sql2017 then adds an event, an action then creates it.", "Params": [ [ "SqlInstance", @@ -27768,22 +29306,24 @@ "" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Creates a new XESession object - for the dogged.", - "Name": "New-DbaXESession", - "Links": "https://dbatools.io/New-DbaXESession", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003e$session = New-DbaXESession -SqlInstance sql2017 -Name XeSession_Test\nPS C:\\\u003e $event = $session.AddEvent(\"sqlserver.file_written\")\r\nPS C:\\\u003e $event.AddAction(\"package0.callstack\")\r\nPS C:\\\u003e $session.Create()\nReturns a new XE Session object from sql2017 then adds an event, an action then creates it.", "Syntax": "New-DbaXESession [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [-Name] \u003cString\u003e [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "New-DbaXESmartCsvWriter", + "Name": "New-DbaXESmartCsvWriter", "Description": "This response type is used to write Extended Events to a CSV file.", "Tags": [ "ExtendedEvent", "XE", - "XEvent" + "XEvent", + "SmartTarget" ], + "Synopsis": "This response type is used to write Extended Events to a CSV file.", + "Alias": "", + "Author": "Chrissy LeMaire (@cl) | SmartTarget by Gianluca Sartori (@spaghettidba)", + "CommandName": "New-DbaXESmartCsvWriter", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/New-DbaXESmartCsvWriter", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003e$columns = \"cpu_time\", \"duration\", \"physical_reads\", \"logical_reads\", \"writes\", \"row_count\"\nPS C:\\\u003e $response = New-DbaXESmartCsvWriter -OutputFile c:\\temp\\workload.csv -OutputColumn $columns -OverWrite -Event \"sql_batch_completed\"\r\nPS C:\\\u003e Start-DbaXESmartTarget -SqlInstance localhost\\sql2017 -Session \"Profiler Standard\" -Responder $response\nWrites Extended Events to the file \"C:\\temp\\workload.csv\".", "Params": [ [ "OutputFile", @@ -27850,22 +29390,24 @@ "" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl) | SmartTarget by Gianluca Sartori (@spaghettidba)", - "Synopsis": "This response type is used to write Extended Events to a CSV file.", - "Name": "New-DbaXESmartCsvWriter", - "Links": "https://dbatools.io/New-DbaXESmartCsvWriter", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003e$columns = \"cpu_time\", \"duration\", \"physical_reads\", \"logical_reads\", \"writes\", \"row_count\"\nPS C:\\\u003e $response = New-DbaXESmartCsvWriter -OutputFile c:\\temp\\workload.csv -OutputColumn $columns -OverWrite -Event \"sql_batch_completed\"\r\nPS C:\\\u003e Start-DbaXESmartTarget -SqlInstance localhost\\sql2017 -Session \"Profiler Standard\" -Responder $response\nWrites Extended Events to the file \"C:\\temp\\workload.csv\".", "Syntax": "New-DbaXESmartCsvWriter [-OutputFile] \u003cString\u003e [-Overwrite] [[-Event] \u003cString[]\u003e] [[-OutputColumn] \u003cString[]\u003e] [[-Filter] \u003cString\u003e] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "New-DbaXESmartEmail", + "Name": "New-DbaXESmartEmail", "Description": "This response type can be used to send an email each time an event is captured.", "Tags": [ "ExtendedEvent", "XE", - "XEvent" + "XEvent", + "SmartTarget" ], + "Synopsis": "This response type can be used to send an email each time an event is captured.", + "Alias": "", + "Author": "Chrissy LeMaire (@cl) | SmartTarget by Gianluca Sartori (@spaghettidba)", + "CommandName": "New-DbaXESmartEmail", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/New-DbaXESmartEmail", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003e$params = @{\n\u003e\u003e SmtpServer = \"smtp.ad.local\"\r\n\u003e\u003e To = \"admin@ad.local\"\r\n\u003e\u003e Sender = \"reports@ad.local\"\r\n\u003e\u003e Subject = \"Query executed\"\r\n\u003e\u003e Body = \"Query executed at {collection_time}\"\r\n\u003e\u003e Attachment = \"batch_text\"\r\n\u003e\u003e AttachmentFileName = \"query.sql\"\r\n\u003e\u003e }\r\n\u003e\u003e\r\nPS C:\\\u003e $emailresponse = New-DbaXESmartEmail @params\r\nPS C:\\\u003e Start-DbaXESmartTarget -SqlInstance sql2017 -Session querytracker -Responder $emailresponse\nSends an email each time a querytracker event is captured.", "Params": [ [ "SmtpServer", @@ -27996,22 +29538,24 @@ "" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl) | SmartTarget by Gianluca Sartori (@spaghettidba)", - "Synopsis": "This response type can be used to send an email each time an event is captured.", - "Name": "New-DbaXESmartEmail", - "Links": "https://dbatools.io/New-DbaXESmartEmail", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003e$params = @{\n\u003e\u003e SmtpServer = \"smtp.ad.local\"\r\n\u003e\u003e To = \"admin@ad.local\"\r\n\u003e\u003e Sender = \"reports@ad.local\"\r\n\u003e\u003e Subject = \"Query executed\"\r\n\u003e\u003e Body = \"Query executed at {collection_time}\"\r\n\u003e\u003e Attachment = \"batch_text\"\r\n\u003e\u003e AttachmentFileName = \"query.sql\"\r\n\u003e\u003e }\r\n\u003e\u003e\r\nPS C:\\\u003e $emailresponse = New-DbaXESmartEmail @params\r\nPS C:\\\u003e Start-DbaXESmartTarget -SqlInstance sql2017 -Session querytracker -Responder $emailresponse\nSends an email each time a querytracker event is captured.", "Syntax": "New-DbaXESmartEmail [-SmtpServer] \u003cString\u003e [-Sender] \u003cString\u003e [-To] \u003cString[]\u003e [[-Cc] \u003cString[]\u003e] [[-Bcc] \u003cString[]\u003e] [[-Credential] \u003cPSCredential\u003e] [-Subject] \u003cString\u003e [-Body] \u003cString\u003e [[-Attachment] \u003cString\u003e] [[-AttachmentFileName] \u003cString\u003e] [[-PlainText] \u003cString\u003e] [[-Event] \u003cString[]\u003e] [[-Filter] \u003cString\u003e] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "New-DbaXESmartQueryExec", + "Name": "New-DbaXESmartQueryExec", "Description": "This response type executes a T-SQL command against a target database whenever an event is recorded.", "Tags": [ "ExtendedEvent", "XE", - "XEvent" + "XEvent", + "SmartTarget" ], + "Synopsis": "This response type executes a T-SQL command against a target database whenever an event is recorded.", + "Alias": "", + "Author": "Chrissy LeMaire (@cl) | SmartTarget by Gianluca Sartori (@spaghettidba)", + "CommandName": "New-DbaXESmartQueryExec", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/New-DbaXESmartQueryExec", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003e$response = New-DbaXESmartQueryExec -SqlInstance sql2017 -Database dbadb -Query \"update table set whatever = 1\"\nPS C:\\\u003e Start-DbaXESmartTarget -SqlInstance sql2017 -Session deadlock_tracker -Responder $response\nExecutes a T-SQL command against dbadb on sql2017 whenever a deadlock event is recorded.", "Params": [ [ "SqlInstance", @@ -28086,22 +29630,24 @@ "" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl) | SmartTarget by Gianluca Sartori (@spaghettidba)", - "Synopsis": "This response type executes a T-SQL command against a target database whenever an event is recorded.", - "Name": "New-DbaXESmartQueryExec", - "Links": "https://dbatools.io/New-DbaXESmartQueryExec", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003e$response = New-DbaXESmartQueryExec -SqlInstance sql2017 -Database dbadb -Query \"update table set whatever = 1\"\nPS C:\\\u003e Start-DbaXESmartTarget -SqlInstance sql2017 -Session deadlock_tracker -Responder $response\nExecutes a T-SQL command against dbadb on sql2017 whenever a deadlock event is recorded.", "Syntax": "New-DbaXESmartQueryExec [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [[-Database] \u003cString\u003e] [[-Query] \u003cString\u003e] [-EnableException] [[-Event] \u003cString[]\u003e] [[-Filter] \u003cString\u003e] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "New-DbaXESmartReplay", + "Name": "New-DbaXESmartReplay", "Description": "This response type can be used to replay execution related events to a target SQL Server instance. The events that you can replay are of the type sql_batch_completed and rpc_completed: all other events are ignored.", "Tags": [ "ExtendedEvent", "XE", - "XEvent" + "XEvent", + "SmartTarget" ], + "Synopsis": "This response type can be used to replay execution related events to a target SQL Server instance.", + "Alias": "", + "Author": "Chrissy LeMaire (@cl) | SmartTarget by Gianluca Sartori (@spaghettidba)", + "CommandName": "New-DbaXESmartReplay", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/New-DbaXESmartReplay", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003e$response = New-DbaXESmartReplay -SqlInstance sql2017 -Database planning\nPS C:\\\u003e Start-DbaXESmartTarget -SqlInstance sql2016 -Session loadrelay -Responder $response\nReplays events from sql2016 on sql2017 in the planning database. Returns a PowerShell job object.\nTo see a list of all SmartTarget job objects, use Get-DbaXESmartTarget.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003e$response = New-DbaXESmartReplay -SqlInstance sql2017 -Database planning\nPS C:\\\u003e Start-DbaXESmartTarget -SqlInstance sql2017 -Session \u0027Profiler Standard\u0027 -Responder $response -NotAsJob\nReplays events from the \u0027Profiler Standard\u0027 session on sql2016 to sql2017\u0027s planning database. Does not run as a job so you can see the raw output.", "Params": [ [ "SqlInstance", @@ -28192,22 +29738,24 @@ "" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl) | SmartTarget by Gianluca Sartori (@spaghettidba)", - "Synopsis": "This response type can be used to replay execution related events to a target SQL Server instance.", - "Name": "New-DbaXESmartReplay", - "Links": "https://dbatools.io/New-DbaXESmartReplay", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003e$response = New-DbaXESmartReplay -SqlInstance sql2017 -Database planning\nPS C:\\\u003e Start-DbaXESmartTarget -SqlInstance sql2016 -Session loadrelay -Responder $response\nReplays events from sql2016 on sql2017 in the planning database. Returns a PowerShell job object.\nTo see a list of all SmartTarget job objects, use Get-DbaXESmartTarget.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003e$response = New-DbaXESmartReplay -SqlInstance sql2017 -Database planning\nPS C:\\\u003e Start-DbaXESmartTarget -SqlInstance sql2017 -Session \u0027Profiler Standard\u0027 -Responder $response -NotAsJob\nReplays events from the \u0027Profiler Standard\u0027 session on sql2016 to sql2017\u0027s planning database. Does not run as a job so you can see the raw output.", "Syntax": "New-DbaXESmartReplay [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [[-Database] \u003cString\u003e] [[-Event] \u003cString[]\u003e] [[-Filter] \u003cString\u003e] [[-DelaySeconds] \u003cInt32\u003e] [-StopOnError] [[-ReplayIntervalSeconds] \u003cInt32\u003e] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "New-DbaXESmartTableWriter", + "Name": "New-DbaXESmartTableWriter", "Description": "This response type is used to write Extended Events to a database table. The events are temporarily stored in memory before being written to the database at regular intervals.\n\nThe target table can be created manually upfront or you can let the TableAppenderResponse create a target table based on the fields and actions available in the events captured.\n\nThe columns of the target table and the fields/actions of the events are mapped by name (case-sensitive).", "Tags": [ "ExtendedEvent", "XE", - "XEvent" + "XEvent", + "SmartTarget" ], + "Synopsis": "This response type is used to write Extended Events to a database table.", + "Alias": "", + "Author": "Chrissy LeMaire (@cl) | SmartTarget by Gianluca Sartori (@spaghettidba)", + "CommandName": "New-DbaXESmartTableWriter", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/New-DbaXESmartTableWriter", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003e$columns = \"cpu_time\", \"duration\", \"physical_reads\", \"logical_reads\", \"writes\", \"row_count\", \"batch_text\"\nPS C:\\\u003e $response = New-DbaXESmartTableWriter -SqlInstance sql2017 -Database dbadb -Table deadlocktracker -OutputColumn $columns -Filter \"duration \u003e 10000\"\r\nPS C:\\\u003e Start-DbaXESmartTarget -SqlInstance sql2017 -Session deadlock_tracker -Responder $response\nWrites Extended Events to the deadlocktracker table in dbadb on sql2017.", "Params": [ [ "SqlInstance", @@ -28306,22 +29854,23 @@ "" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl) | SmartTarget by Gianluca Sartori (@spaghettidba)", - "Synopsis": "This response type is used to write Extended Events to a database table.", - "Name": "New-DbaXESmartTableWriter", - "Links": "https://dbatools.io/New-DbaXESmartTableWriter", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003e$columns = \"cpu_time\", \"duration\", \"physical_reads\", \"logical_reads\", \"writes\", \"row_count\", \"batch_text\"\nPS C:\\\u003e $response = New-DbaXESmartTableWriter -SqlInstance sql2017 -Database dbadb -Table deadlocktracker -OutputColumn $columns -Filter \"duration \u003e 10000\"\r\nPS C:\\\u003e Start-DbaXESmartTarget -SqlInstance sql2017 -Session deadlock_tracker -Responder $response\nWrites Extended Events to the deadlocktracker table in dbadb on sql2017.", "Syntax": "New-DbaXESmartTableWriter [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [-Database] \u003cString\u003e [-Table] \u003cString\u003e [-AutoCreateTargetTable] [[-UploadIntervalSeconds] \u003cInt32\u003e] [[-Event] \u003cString[]\u003e] [[-OutputColumn] \u003cString[]\u003e] [[-Filter] \u003cString\u003e] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Publish-DbaDacPackage", + "Name": "Publish-DbaDacPackage", "Description": "Deploying a dacpac uses the DacFx which historically needed to be installed on a machine prior to use. In 2016 the DacFx was supplied by Microsoft as a nuget package (Microsoft.Data.Tools.MSBuild) and this uses that nuget package.", "Tags": [ "Migration", "Database", "Dacpac" ], + "Synopsis": "The Publish-DbaDacPackage command takes a dacpac which is the output from an SSDT project and publishes it to a database. Changing the schema to match the dacpac and also to run any scripts in the dacpac (pre/post deploy scripts).", + "Alias": "Publish-DbaDacpac", + "Author": "Richie lee (@richiebzzzt)", + "CommandName": "Publish-DbaDacPackage", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Publish-DbaDacPackage", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003e$options = New-DbaDacOption -Type Dacpac -Action Publish\nPS C:\\\u003e $options.DeployOptions.DropObjectsNotInSource = $true\r\nPS C:\\\u003e Publish-DbaDacPackage -SqlInstance sql2016 -Database DB1 -DacOption $options -Path c:\\temp\\db.dacpac\nUses DacOption object to set Deployment Options and updates DB1 database on sql2016 from the db.dacpac dacpac file, dropping objects that are missing from source.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003ePublish-DbaDacPackage -SqlInstance sql2017 -Database WideWorldImporters -Path C:\\temp\\sql2016-WideWorldImporters.dacpac -PublishXml C:\\temp\\sql2016-WideWorldImporters-publish.xml -Confirm\nUpdates WideWorldImporters on sql2017 from the sql2016-WideWorldImporters.dacpac using the sql2016-WideWorldImporters-publish.xml publish profile. Prompts for confirmation.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eNew-DbaDacProfile -SqlInstance sql2016 -Database db2 -Path C:\\temp\nPS C:\\\u003e Export-DbaDacPackage -SqlInstance sql2016 -Database db2 | Publish-DbaDacPackage -PublishXml C:\\temp\\sql2016-db2-publish.xml -Database db1, db2 -SqlInstance sql2017\nCreates a publish profile at C:\\temp\\sql2016-db2-publish.xml, exports the .dacpac to $home\\Documents\\sql2016-db2.dacpac. Does not prompt for confirmation.\r\nthen publishes it to the sql2017 server database db2\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003e$loc = \"C:\\Users\\bob\\source\\repos\\Microsoft.Data.Tools.Msbuild\\lib\\net46\\Microsoft.SqlServer.Dac.dll\"\nPS C:\\\u003e Publish-DbaDacPackage -SqlInstance \"local\" -Database WideWorldImporters -Path C:\\temp\\WideWorldImporters.dacpac -PublishXml C:\\temp\\WideWorldImporters.publish.xml -DacFxPath $loc -Confirm\nPublishes the dacpac using a specific dacfx library. Prompts for confirmation.\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003ePublish-DbaDacPackage -SqlInstance sql2017 -Database WideWorldImporters -Path C:\\temp\\sql2016-WideWorldImporters.dacpac -PublishXml C:\\temp\\sql2016-WideWorldImporters-publish.xml \r\n-GenerateDeploymentScript -ScriptOnly\nDoes not deploy the changes, but will generate the deployment script that would be executed against WideWorldImporters.\n-------------------------- EXAMPLE 6 --------------------------\nPS C:\\\u003ePublish-DbaDacPackage -SqlInstance sql2017 -Database WideWorldImporters -Path C:\\temp\\sql2016-WideWorldImporters.dacpac -PublishXml C:\\temp\\sql2016-WideWorldImporters-publish.xml \r\n-GenerateDeploymentReport -ScriptOnly\nDoes not deploy the changes, but will generate the deployment report that would be executed against WideWorldImporters.", "Params": [ [ "SqlInstance", @@ -28442,23 +29991,40 @@ false, "false", "" + ], + [ + "WhatIf", + "Shows what would happen if the command were to run. No actions are actually performed.", + "wi", + false, + "false", + "" + ], + [ + "Confirm", + "Prompts you for confirmation before executing any changing operations within the command.", + "cf", + false, + "false", + "" ] ], - "Alias": "Publish-DbaDacpac", - "Author": "Richie lee (@richiebzzzt)", - "Synopsis": "The Publish-DbaDacPackage command takes a dacpac which is the output from an SSDT project and publishes it to a database. Changing the schema to match the dacpac and also to run any scripts in the dacpac (pre/post deploy scripts).", - "Name": "Publish-DbaDacPackage", - "Links": "https://dbatools.io/Publish-DbaDacPackage", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003e$options = New-DbaDacOption -Type Dacpac -Action Publish\nPS C:\\\u003e $options.DeployOptions.DropObjectsNotInSource = $true\r\nPS C:\\\u003e Publish-DbaDacPackage -SqlInstance sql2016 -Database DB1 -DacOption $options -Path c:\\temp\\db.dacpac\nUses DacOption object to set Deployment Options and updates DB1 database on sql2016 from the db.dacpac dacpac file, dropping objects that are missing from source\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003ePublish-DbaDacPackage -SqlInstance sql2017 -Database WideWorldImporters -Path C:\\temp\\sql2016-WideWorldImporters.dacpac -PublishXml C:\\temp\\sql2016-WideWorldImporters-publish.xml\nUpdates WideWorldImporters on sql2017 from the sql2016-WideWorldImporters.dacpac using the sql2016-WideWorldImporters-publish.xml publish profile\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eNew-DbaDacProfile -SqlInstance sql2016 -Database db2 -Path C:\\temp\nPS C:\\\u003e Export-DbaDacPackage -SqlInstance sql2016 -Database db2 | Publish-DbaDacPackage -PublishXml C:\\temp\\sql2016-db2-publish.xml -Database db1, db2 -SqlInstance sql2017\nCreates a publish profile at C:\\temp\\sql2016-db2-publish.xml, exports the .dacpac to $home\\Documents\\sql2016-db2.dacpac\r\nthen publishes it to the sql2017 server database db2\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003e$loc = \"C:\\Users\\bob\\source\\repos\\Microsoft.Data.Tools.Msbuild\\lib\\net46\\Microsoft.SqlServer.Dac.dll\"\nPS C:\\\u003e Publish-DbaDacPackage -SqlInstance \"local\" -Database WideWorldImporters -Path C:\\temp\\WideWorldImporters.dacpac -PublishXml C:\\temp\\WideWorldImporters.publish.xml -DacFxPath $loc\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003ePublish-DbaDacPackage -SqlInstance sql2017 -Database WideWorldImporters -Path C:\\temp\\sql2016-WideWorldImporters.dacpac -PublishXml C:\\temp\\sql2016-WideWorldImporters-publish.xml \r\n-GenerateDeploymentScript -ScriptOnly\nDoes not deploy the changes, but will generate the deployment script that would be executed against WideWorldImporters.\n-------------------------- EXAMPLE 6 --------------------------\nPS C:\\\u003ePublish-DbaDacPackage -SqlInstance sql2017 -Database WideWorldImporters -Path C:\\temp\\sql2016-WideWorldImporters.dacpac -PublishXml C:\\temp\\sql2016-WideWorldImporters-publish.xml \r\n-GenerateDeploymentReport -ScriptOnly\nDoes not deploy the changes, but will generate the deployment report that would be executed against WideWorldImporters.", - "Syntax": "Publish-DbaDacPackage [-SqlInstance \u003cDbaInstanceParameter[]\u003e] [-SqlCredential \u003cPSCredential\u003e] -Path \u003cString\u003e -Database \u003cString[]\u003e [-ConnectionString \u003cString[]\u003e] [-ScriptOnly] [-Type \u003cString\u003e] [-OutputPath \u003cString\u003e] [-IncludeSqlCmdVars] [-DacOption \u003cObject\u003e] [-EnableException] [-DacFxPath \u003cString\u003e] [\u003cCommonParameters\u003e]\nPublish-DbaDacPackage [-SqlInstance \u003cDbaInstanceParameter[]\u003e] [-SqlCredential \u003cPSCredential\u003e] -Path \u003cString\u003e -PublishXml \u003cString\u003e -Database \u003cString[]\u003e [-ConnectionString \u003cString[]\u003e] [-GenerateDeploymentScript] [-GenerateDeploymentReport] [-ScriptOnly] [-Type \u003cString\u003e] [-OutputPath \u003cString\u003e] [-IncludeSqlCmdVars] [-EnableException] [-DacFxPath \u003cString\u003e] [\u003cCommonParameters\u003e]" + "Syntax": "Publish-DbaDacPackage [-SqlInstance \u003cDbaInstanceParameter[]\u003e] [-SqlCredential \u003cPSCredential\u003e] -Path \u003cString\u003e -Database \u003cString[]\u003e [-ConnectionString \u003cString[]\u003e] [-ScriptOnly] [-Type \u003cString\u003e] [-OutputPath \u003cString\u003e] [-IncludeSqlCmdVars] [-DacOption \u003cObject\u003e] [-EnableException] [-DacFxPath \u003cString\u003e] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]\nPublish-DbaDacPackage [-SqlInstance \u003cDbaInstanceParameter[]\u003e] [-SqlCredential \u003cPSCredential\u003e] -Path \u003cString\u003e -PublishXml \u003cString\u003e -Database \u003cString[]\u003e [-ConnectionString \u003cString[]\u003e] [-GenerateDeploymentScript] [-GenerateDeploymentReport] [-ScriptOnly] [-Type \u003cString\u003e] [-OutputPath \u003cString\u003e] [-IncludeSqlCmdVars] [-EnableException] [-DacFxPath \u003cString\u003e] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Read-DbaAuditFile", + "Name": "Read-DbaAuditFile", "Description": "Read Audit details from *.sqlaudit files.", "Tags": [ "ExtendedEvent", "Audit" ], + "Synopsis": "Read Audit details from *.sqlaudit files.", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Read-DbaAuditFile", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Read-DbaAuditFile", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eRead-DbaAuditFile -Path C:\\temp\\logins.sqlaudit\nReturns events from C:\\temp\\logins.sqlaudit.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-ChildItem C:\\temp\\audit\\*.sqlaudit | Read-DbaAuditFile\nReturns events from all .sqlaudit files in C:\\temp\\audit.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaServerAudit -SqlInstance sql2014 -Audit LoginTracker | Read-DbaAuditFile\nReads remote Audit details by accessing the file over the admin UNC share.", "Params": [ [ "Path", @@ -28493,22 +30059,23 @@ "False" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Read Audit details from *.sqlaudit files.", - "Name": "Read-DbaAuditFile", - "Links": "https://dbatools.io/Read-DbaAuditFile", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eRead-DbaAuditFile -Path C:\\temp\\logins.sqlaudit\nReturns events from C:\\temp\\logins.sqlaudit.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-ChildItem C:\\temp\\audit\\*.sqlaudit | Read-DbaAuditFile\nReturns events from all .sqlaudit files in C:\\temp\\audit.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaServerAudit -SqlInstance sql2014 -Audit LoginTracker | Read-DbaAuditFile\nReads remote Audit details by accessing the file over the admin UNC share.", "Syntax": "Read-DbaAuditFile [-Path] \u003cObject[]\u003e [-Exact] [-Raw] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Read-DbaBackupHeader", + "Name": "Read-DbaBackupHeader", "Description": "Reads full, differential and transaction log backups. An online SQL Server is required to parse the backup files and the path specified must be relative to that SQL Server.", "Tags": [ "DisasterRecovery", "Backup", "Restore" ], + "Synopsis": "Reads and displays detailed information about a SQL Server backup.", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Read-DbaBackupHeader", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Read-DbaBackupHeader", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eRead-DbaBackupHeader -SqlInstance sql2016 -Path S:\\backups\\mydb\\mydb.bak\nLogs into sql2016 using Windows authentication and reads the local file on sql2016, S:\\backups\\mydb\\mydb.bak.\nIf you are running this command on a workstation and connecting remotely, remember that sql2016 cannot access files on your own workstation.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eRead-DbaBackupHeader -SqlInstance sql2016 -Path \\\\nas\\sql\\backups\\mydb\\mydb.bak, \\\\nas\\sql\\backups\\otherdb\\otherdb.bak\nLogs into sql2016 and reads two backup files - mydb.bak and otherdb.bak. The SQL Server service account must have rights to read this file.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eRead-DbaBackupHeader -SqlInstance . -Path C:\\temp\\myfile.bak -Simple\nLogs into the local workstation (or computer) and shows simplified output about C:\\temp\\myfile.bak. The SQL Server service account must have rights to read this file.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003e$backupinfo = Read-DbaBackupHeader -SqlInstance . -Path C:\\temp\\myfile.bak\nPS C:\\\u003e $backupinfo.FileList\nDisplays detailed information about each of the datafiles contained in the backupset.\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eRead-DbaBackupHeader -SqlInstance . -Path C:\\temp\\myfile.bak -FileList\nAlso returns detailed information about each of the datafiles contained in the backupset.\n-------------------------- EXAMPLE 6 --------------------------\nPS C:\\\u003e\"C:\\temp\\myfile.bak\", \"\\backupserver\\backups\\myotherfile.bak\" | Read-DbaBackupHeader -SqlInstance sql2016 | Where-Object { $_.BackupSize.Megabyte -gt 100 }\nReads the two files and returns only backups larger than 100 MB\n-------------------------- EXAMPLE 7 --------------------------\nPS C:\\\u003eGet-ChildItem \\\\nas\\sql\\*.bak | Read-DbaBackupHeader -SqlInstance sql2016\nGets a list of all .bak files on the \\\\nas\\sql share and reads the headers using the server named \"sql2016\". This means that the server, sql2016, must have read access to the \\\\nas\\sql share.\n-------------------------- EXAMPLE 8 --------------------------\nPS C:\\\u003eRead-DbaBackupHeader -SqlInstance sql2016 -Path https://dbatoolsaz.blob.core.windows.net/azbackups/restoretime/restoretime_201705131850.bak -AzureCredential AzureBackupUser\nGets the backup header information from the SQL Server backup file stored at https://dbatoolsaz.blob.core.windows.net/azbackups/restoretime/restoretime_201705131850.bak on Azure", "Params": [ [ "SqlInstance", @@ -28567,21 +30134,22 @@ "False" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Reads and displays detailed information about a SQL Server backup.", - "Name": "Read-DbaBackupHeader", - "Links": "https://dbatools.io/Read-DbaBackupHeader", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eRead-DbaBackupHeader -SqlInstance sql2016 -Path S:\\backups\\mydb\\mydb.bak\nLogs into sql2016 using Windows authentication and reads the local file on sql2016, S:\\backups\\mydb\\mydb.bak.\nIf you are running this command on a workstation and connecting remotely, remember that sql2016 cannot access files on your own workstation.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eRead-DbaBackupHeader -SqlInstance sql2016 -Path \\\\nas\\sql\\backups\\mydb\\mydb.bak, \\\\nas\\sql\\backups\\otherdb\\otherdb.bak\nLogs into sql2016 and reads two backup files - mydb.bak and otherdb.bak. The SQL Server service account must have rights to read this file.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eRead-DbaBackupHeader -SqlInstance . -Path C:\\temp\\myfile.bak -Simple\nLogs into the local workstation (or computer) and shows simplified output about C:\\temp\\myfile.bak. The SQL Server service account must have rights to read this file.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003e$backupinfo = Read-DbaBackupHeader -SqlInstance . -Path C:\\temp\\myfile.bak\nPS C:\\\u003e $backupinfo.FileList\nDisplays detailed information about each of the datafiles contained in the backupset.\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eRead-DbaBackupHeader -SqlInstance . -Path C:\\temp\\myfile.bak -FileList\nAlso returns detailed information about each of the datafiles contained in the backupset.\n-------------------------- EXAMPLE 6 --------------------------\nPS C:\\\u003e\"C:\\temp\\myfile.bak\", \"\\backupserver\\backups\\myotherfile.bak\" | Read-DbaBackupHeader -SqlInstance sql2016 | Where-Object { $_.BackupSize.Megabyte -gt 100 }\nReads the two files and returns only backups larger than 100 MB\n-------------------------- EXAMPLE 7 --------------------------\nPS C:\\\u003eGet-ChildItem \\\\nas\\sql\\*.bak | Read-DbaBackupHeader -SqlInstance sql2016\nGets a list of all .bak files on the \\\\nas\\sql share and reads the headers using the server named \"sql2016\". This means that the server, sql2016, must have read access to the \\\\nas\\sql share.\n-------------------------- EXAMPLE 8 --------------------------\nPS C:\\\u003eRead-DbaBackupHeader -Path https://dbatoolsaz.blob.core.windows.net/azbackups/restoretime/restoretime_201705131850.bak -AzureCredential AzureBackupUser\nGets the backup header information from the SQL Server backup file stored at https://dbatoolsaz.blob.core.windows.net/azbackups/restoretime/restoretime_201705131850.bak on Azure", "Syntax": "Read-DbaBackupHeader [-SqlInstance] \u003cDbaInstanceParameter\u003e [[-SqlCredential] \u003cPSCredential\u003e] [-Path] \u003cObject[]\u003e [-Simple] [-FileList] [[-AzureCredential] \u003cString\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Read-DbaTraceFile", + "Name": "Read-DbaTraceFile", "Description": "Using the fn_trace_gettable function, a trace file is read and returned as a PowerShell object\n\nThis function returns the whole of the trace file. The information is presented in the format that the trace subsystem uses.", "Tags": [ "Security", "Trace" ], + "Synopsis": "Reads SQL Server trace files", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Read-DbaTraceFile", + "Availability": "Windows, Linux, macOS", + "Links": null, + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eRead-DbaTraceFile -SqlInstance sql2016 -Database master, tempdb -Path C:\\traces\\big.trc\nReads the tracefile C:\\traces\\big.trc, stored on the sql2016 sql server. Filters only results that have master or tempdb as the DatabaseName.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eRead-DbaTraceFile -SqlInstance sql2016 -Database master, tempdb -Path C:\\traces\\big.trc -TextData \u0027EXEC SP_PROCOPTION\u0027\nReads the tracefile C:\\traces\\big.trc, stored on the sql2016 sql server.\r\nFilters only results that have master or tempdb as the DatabaseName and that have \u0027EXEC SP_PROCOPTION\u0027 somewhere in the text.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eRead-DbaTraceFile -SqlInstance sql2016 -Path C:\\traces\\big.trc -Where \"LinkedServerName = \u0027myls\u0027 and StartTime \u003e \u00275/30/2017 4:27:52 PM\u0027\"\nReads the tracefile C:\\traces\\big.trc, stored on the sql2016 sql server.\r\nFilters only results where LinkServerName = myls and StartTime is greater than \u00275/30/2017 4:27:52 PM\u0027.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaTrace -SqlInstance sql2014 | Read-DbaTraceFile\nReads every trace file on sql2014", "Params": [ [ "SqlInstance", @@ -28704,22 +30272,23 @@ "False" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Reads SQL Server trace files", - "Name": "Read-DbaTraceFile", - "Links": null, - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eRead-DbaTraceFile -SqlInstance sql2016 -Database master, tempdb -Path C:\\traces\\big.trc\nReads the tracefile C:\\traces\\big.trc, stored on the sql2016 sql server. Filters only results that have master or tempdb as the DatabaseName.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eRead-DbaTraceFile -SqlInstance sql2016 -Database master, tempdb -Path C:\\traces\\big.trc -TextData \u0027EXEC SP_PROCOPTION\u0027\nReads the tracefile C:\\traces\\big.trc, stored on the sql2016 sql server.\r\nFilters only results that have master or tempdb as the DatabaseName and that have \u0027EXEC SP_PROCOPTION\u0027 somewhere in the text.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eRead-DbaTraceFile -SqlInstance sql2016 -Path C:\\traces\\big.trc -Where \"LinkedServerName = \u0027myls\u0027 and StartTime \u003e \u00275/30/2017 4:27:52 PM\u0027\"\nReads the tracefile C:\\traces\\big.trc, stored on the sql2016 sql server.\r\nFilters only results where LinkServerName = myls and StartTime is greater than \u00275/30/2017 4:27:52 PM\u0027.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaTrace -SqlInstance sql2014 | Read-DbaTraceFile\nReads every trace file on sql2014", "Syntax": "Read-DbaTraceFile [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [-SqlCredential \u003cPSCredential\u003e] [-Path \u003cString[]\u003e] [-Database \u003cString[]\u003e] [-Login \u003cString[]\u003e] [-Spid \u003cInt32[]\u003e] [-EventClass \u003cString[]\u003e] [-ObjectType \u003cString[]\u003e] [-ErrorId \u003cInt32[]\u003e] [-EventSequence \u003cInt32[]\u003e] [-TextData \u003cString[]\u003e] [-ApplicationName \u003cString[]\u003e] [-ObjectName \u003cString[]\u003e] [-Where \u003cString\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Read-DbaTransactionLog", + "Name": "Read-DbaTransactionLog", "Description": "Using the fn_dblog function, the live transaction log is read and returned as a PowerShell object\n\nThis function returns the whole of the log. The information is presented in the format that the logging subsystem uses.\n\nA soft limit of 0.5GB of log as been implemented. This is based on testing. This limit can be overridden\nat the users request, but please be aware that this may have an impact on your target databases and on the\nsystem running this function", "Tags": [ "Database", "Log", "LogFile" ], + "Synopsis": "Reads the live Transaction log from specified SQL Server Database", + "Alias": "", + "Author": "Stuart Moore (@napalmgram), stuart-moore.com", + "CommandName": "Read-DbaTransactionLog", + "Availability": "Windows, Linux, macOS", + "Links": null, + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003e$Log = Read-DbaTransactionLog -SqlInstance sql2016 -Database MyDatabase\nWill read the contents of the transaction log of MyDatabase on SQL Server Instance sql2016 into the local PowerShell object $Log\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003e$Log = Read-DbaTransactionLog -SqlInstance sql2016 -Database MyDatabase -IgnoreLimit\nWill read the contents of the transaction log of MyDatabase on SQL Server Instance sql2016 into the local PowerShell object $Log, ignoring the recommendation of not returning more that 0.5GB of log", "Params": [ [ "SqlInstance", @@ -28770,22 +30339,23 @@ "False" ] ], - "Alias": "", - "Author": "Stuart Moore (@napalmgram), stuart-moore.com", - "Synopsis": "Reads the live Transaction log from specified SQL Server Database", - "Name": "Read-DbaTransactionLog", - "Links": null, - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003e$Log = Read-DbaTransactionLog -SqlInstance sql2016 -Database MyDatabase\nWill read the contents of the transaction log of MyDatabase on SQL Server Instance sql2016 into the local PowerShell object $Log\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003e$Log = Read-DbaTransactionLog -SqlInstance sql2016 -Database MyDatabase -IgnoreLimit\nWill read the contents of the transaction log of MyDatabase on SQL Server Instance sql2016 into the local PowerShell object $Log, ignoring the recommendation of not returning more that 0.5GB of log", "Syntax": "Read-DbaTransactionLog [-SqlInstance] \u003cDbaInstanceParameter\u003e [-SqlCredential \u003cPSCredential\u003e] -Database \u003cObject\u003e [-IgnoreLimit] [-RowLimit \u003cInt32\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Read-DbaXEFile", + "Name": "Read-DbaXEFile", "Description": "Read XEvents from a *.xel or *.xem file.", "Tags": [ "ExtendedEvent", "XE", "XEvent" ], + "Synopsis": "Read XEvents from a *.xel or *.xem file.", + "Alias": "Read-DbaXEventFile", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Read-DbaXEFile", + "Availability": "Windows only", + "Links": "https://dbatools.io/Read-DbaXEFile", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eRead-DbaXEFile -Path C:\\temp\\deadocks.xel\nReturns events from C:\\temp\\deadocks.xel.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-ChildItem C:\\temp\\xe\\*.xel | Read-DbaXEFile\nReturns events from all .xel files in C:\\temp\\xe.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaXESession -SqlInstance sql2014 -Session deadlocks | Read-DbaXEFile\nReads remote XEvents by accessing the file over the admin UNC share.", "Params": [ [ "Path", @@ -28820,17 +30390,17 @@ "False" ] ], - "Alias": "Read-DbaXEventFile", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Read XEvents from a *.xel or *.xem file.", - "Name": "Read-DbaXEFile", - "Links": "https://dbatools.io/Read-DbaXEFile", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eRead-DbaXEFile -Path C:\\temp\\deadocks.xel\nReturns events from C:\\temp\\deadocks.xel.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-ChildItem C:\\temp\\xe\\*.xel | Read-DbaXEFile\nReturns events from all .xel files in C:\\temp\\xe.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaXESession -SqlInstance sql2014 -Session deadlocks | Read-DbaXEFile\nReads remote XEvents by accessing the file over the admin UNC share.", "Syntax": "Read-DbaXEFile [-Path] \u003cObject[]\u003e [-Exact] [-Raw] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Register-DbatoolsConfig", + "Name": "Register-DbatoolsConfig", "Description": "Registers an existing configuration object in registry.\nThis allows simple persisting of settings across powershell consoles.\nIt also can be used to generate a registry template, which can then be used to create policies.", + "Synopsis": "Registers an existing configuration object in registry.", + "Alias": "Register-DbaConfig", + "CommandName": "Register-DbatoolsConfig", + "Availability": "Windows, Linux, macOS", + "Links": null, + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbatoolsConfig message.style.* | Register-DbatoolsConfig\nRetrieves all configuration items that that start with message.style. and registers them in registry for the current user.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eRegister-DbatoolsConfig -FullName \"message.consoleoutput.disable\" -Scope SystemDefault\nRetrieves the configuration item \"message.consoleoutput.disable\" and registers it in registry as the default setting for all users on this machine.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eRegister-DbatoolsConfig -Module Message -Scope SystemMandatory\nRetrieves all configuration items of the module Message, then registers them in registry to enforce them for all users on the current system.", "Params": [ [ "Config", @@ -28881,21 +30451,23 @@ "False" ] ], - "Alias": "Register-DbaConfig", - "Synopsis": "Registers an existing configuration object in registry.", - "Name": "Register-DbatoolsConfig", - "Links": null, - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbatoolsConfig message.style.* | Register-DbatoolsConfig\nRetrieves all configuration items that that start with message.style. and registers them in registry for the current user.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eRegister-DbatoolsConfig -FullName \"message.consoleoutput.disable\" -Scope SystemDefault\nRetrieves the configuration item \"message.consoleoutput.disable\" and registers it in registry as the default setting for all users on this machine.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eRegister-DbatoolsConfig -Module Message -Scope SystemMandatory\nRetrieves all configuration items of the module Message, then registers them in registry to enforce them for all users on the current system.", "Syntax": "Register-DbatoolsConfig [[-Config] \u003cConfig[]\u003e] [[-FullName] \u003cString[]\u003e] [-Scope {UserDefault | UserMandatory | SystemDefault | SystemMandatory | FileUserLocal | FileUserShared | FileSystem}] [-EnableException] [\u003cCommonParameters\u003e]\nRegister-DbatoolsConfig [-Module] \u003cString\u003e [[-Name] \u003cString\u003e] [-Scope {UserDefault | UserMandatory | SystemDefault | SystemMandatory | FileUserLocal | FileUserShared | FileSystem}] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Remove-DbaAgDatabase", + "Name": "Remove-DbaAgDatabase", "Description": "Removes a database from an availability group on a SQL Server instance.", "Tags": [ "AvailabilityGroup", "HA", "AG" ], + "Synopsis": "Removes a database from an availability group on a SQL Server instance.", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Remove-DbaAgDatabase", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Remove-DbaAgDatabase", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eRemove-DbaAgDatabase -SqlInstance sqlserver2012 -AvailabilityGroup ag1, ag2 -Confirm:$false\nRemoves the ag1 and ag2 availability groups on sqlserver2012. Does not prompt for confirmation.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaAvailabilityGroup -SqlInstance sqlserver2012 -AvailabilityGroup availabilitygroup1 | Remove-DbaAgDatabase\nRemoves the availability groups returned from the Get-DbaAvailabilityGroup function. Prompts for confirmation.", "Params": [ [ "SqlInstance", @@ -28962,21 +30534,22 @@ "" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Removes a database from an availability group on a SQL Server instance.", - "Name": "Remove-DbaAgDatabase", - "Links": "https://dbatools.io/Remove-DbaAgDatabase", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eRemove-DbaAgDatabase -SqlInstance sqlserver2012 -AvailabilityGroup ag1, ag2 -Confirm:$false\nRemoves the ag1 and ag2 availability groups on sqlserver2012. Does not prompt for confirmation.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaAvailabilityGroup -SqlInstance sqlserver2012 -AvailabilityGroup availabilitygroup1 | Remove-DbaAgDatabase\nRemoves the availability groups returned from the Get-DbaAvailabilityGroup function. Prompts for confirmation.", "Syntax": "Remove-DbaAgDatabase [[-SqlInstance] \u003cDbaInstanceParameter[]\u003e] [[-SqlCredential] \u003cPSCredential\u003e] [[-Database] \u003cString[]\u003e] [[-AvailabilityGroup] \u003cString[]\u003e] [[-InputObject] \u003cObject[]\u003e] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Remove-DbaAgentJob", + "Name": "Remove-DbaAgentJob", "Description": "Remove-DbaAgentJob removes a job in the SQL Server Agent.", "Tags": [ "Agent", "Job" ], + "Synopsis": "Remove-DbaAgentJob removes a job.", + "Alias": "", + "Author": "Sander Stad (@sqlstad, sqlstad.nl)", + "CommandName": "Remove-DbaAgentJob", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Remove-DbaAgentJob", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eRemove-DbaAgentJob -SqlInstance sql1 -Job Job1\nRemoves the job from the instance with the name Job1\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGetDbaAgentJob -SqlInstance sql1 -Job Job1 | Remove-DbaAgentJob -KeepHistory\nRemoves teh job but keeps the history\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eRemove-DbaAgentJob -SqlInstance sql1 -Job Job1 -KeepUnusedSchedule\nRemoves the job but keeps the unused schedules\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eRemove-DbaAgentJob -SqlInstance sql1, sql2, sql3 -Job Job1\nRemoves the job from multiple servers", "Params": [ [ "SqlInstance", @@ -29059,22 +30632,23 @@ "" ] ], - "Alias": "", - "Author": "Sander Stad (@sqlstad, sqlstad.nl)", - "Synopsis": "Remove-DbaAgentJob removes a job.", - "Name": "Remove-DbaAgentJob", - "Links": "https://dbatools.io/Remove-DbaAgentJob", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eRemove-DbaAgentJob -SqlInstance sql1 -Job Job1\nRemoves the job from the instance with the name Job1\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGetDbaAgentJob -SqlInstance sql1 -Job Job1 | Remove-DbaAgentJob -KeepHistory\nRemoves teh job but keeps the history\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eRemove-DbaAgentJob -SqlInstance sql1 -Job Job1 -KeepUnusedSchedule\nRemoves the job but keeps the unused schedules\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eRemove-DbaAgentJob -SqlInstance sql1, sql2, sql3 -Job Job1\nRemoves the job from multiple servers", "Syntax": "Remove-DbaAgentJob [[-SqlInstance] \u003cDbaInstanceParameter[]\u003e] [[-SqlCredential] \u003cPSCredential\u003e] [[-Job] \u003cObject[]\u003e] [-KeepHistory] [-KeepUnusedSchedule] [[-Mode] {Strict | Lazy | Report}] [[-InputObject] \u003cJob[]\u003e] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Remove-DbaAgentJobCategory", + "Name": "Remove-DbaAgentJobCategory", "Description": "Remove-DbaAgentJobCategory makes it possible to remove a job category.\nBe assured that the category you want to remove is not used with other jobs. If another job uses this category it will be get the category [Uncategorized (Local)].", "Tags": [ "Agent", "Job", "JobCategory" ], + "Synopsis": "Remove-DbaAgentJobCategory removes a job category.", + "Alias": "", + "Author": "Sander Stad (@sqlstad, sqlstad.nl)", + "CommandName": "Remove-DbaAgentJobCategory", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Remove-DbaAgentJobCategory", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eRemove-DbaAgentJobCategory -SqlInstance sql1 -Category \u0027Category 1\u0027\nRemove the job category Category 1 from the instance.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eRemove-DbaAgentJobCategory -SqlInstance sql1 -Category Category1, Category2, Category3\nRemove multiple job categories from the instance.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eRemove-DbaAgentJobCategory -SqlInstance sql1, sql2, sql3 -Category Category1, Category2, Category3\nRemove multiple job categories from the multiple instances.", "Params": [ [ "SqlInstance", @@ -29133,22 +30707,23 @@ "" ] ], - "Alias": "", - "Author": "Sander Stad (@sqlstad, sqlstad.nl)", - "Synopsis": "Remove-DbaAgentJobCategory removes a job category.", - "Name": "Remove-DbaAgentJobCategory", - "Links": "https://dbatools.io/Remove-DbaAgentJobCategory", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eRemove-DbaAgentJobCategory -SqlInstance sql1 -Category \u0027Category 1\u0027\nRemove the job category Category 1 from the instance.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eRemove-DbaAgentJobCategory -SqlInstance sql1 -Category Category1, Category2, Category3\nRemove multiple job categories from the instance.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eRemove-DbaAgentJobCategory -SqlInstance sql1, sql2, sql3 -Category Category1, Category2, Category3\nRemove multiple job categories from the multiple instances.", "Syntax": "Remove-DbaAgentJobCategory [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [[-Category] \u003cString[]\u003e] [-Force] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Remove-DbaAgentJobStep", + "Name": "Remove-DbaAgentJobStep", "Description": "Removes a job step from a SQL Server Agent job.", "Tags": [ "Agent", "Job", "JobStep" ], + "Synopsis": "Removes a step from the specified SQL Agent job.", + "Alias": "", + "Author": "Sander Stad (@sqlstad), sqlstad.nl", + "CommandName": "Remove-DbaAgentJobStep", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Remove-DbaAgentJobStep", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eRemove-DbaAgentJobStep -SqlInstance sql1 -Job Job1 -StepName Step1\nRemove \u0027Step1\u0027 from job \u0027Job1\u0027 on sql1.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eRemove-DbaAgentJobStep -SqlInstance sql1 -Job Job1, Job2, Job3 -StepName Step1\nRemove the job step from multiple jobs.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eRemove-DbaAgentJobStep -SqlInstance sql1, sql2, sql3 -Job Job1 -StepName Step1\nRemove the job step from the job on multiple servers.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003esql1, sql2, sql3 | Remove-DbaAgentJobStep -Job Job1 -StepName Step1\nRemove the job step from the job on multiple servers using pipeline.", "Params": [ [ "SqlInstance", @@ -29215,22 +30790,23 @@ "" ] ], - "Alias": "", - "Author": "Sander Stad (@sqlstad), sqlstad.nl", - "Synopsis": "Removes a step from the specified SQL Agent job.", - "Name": "Remove-DbaAgentJobStep", - "Links": "https://dbatools.io/Remove-DbaAgentJobStep", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eRemove-DbaAgentJobStep -SqlInstance sql1 -Job Job1 -StepName Step1\nRemove \u0027Step1\u0027 from job \u0027Job1\u0027 on sql1.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eRemove-DbaAgentJobStep -SqlInstance sql1 -Job Job1, Job2, Job3 -StepName Step1\nRemove the job step from multiple jobs.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eRemove-DbaAgentJobStep -SqlInstance sql1, sql2, sql3 -Job Job1 -StepName Step1\nRemove the job step from the job on multiple servers.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003esql1, sql2, sql3 | Remove-DbaAgentJobStep -Job Job1 -StepName Step1\nRemove the job step from the job on multiple servers using pipeline.", "Syntax": "Remove-DbaAgentJobStep [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [-Job] \u003cObject[]\u003e [-StepName] \u003cString\u003e [[-Mode] {Strict | Lazy | Report}] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Remove-DbaAgentSchedule", + "Name": "Remove-DbaAgentSchedule", "Description": "Remove-DbaAgentJobSchedule removes a job in the SQL Server Agent.", "Tags": [ "Agent", "Job", "Schedule" ], + "Synopsis": "Remove-DbaAgentJobSchedule removes a job schedule.", + "Alias": "", + "Author": "Sander Stad (@sqlstad), sqlstad.nl", + "CommandName": "Remove-DbaAgentSchedule", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Remove-DbaAgentJobSchedule", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eRemove-DbaAgentSchedule -SqlInstance sql1 -Schedule weekly\nRemove the schedule weekly\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eRemove-DbaAgentSchedule -SqlInstance sql1 -Schedule weekly -Force\nRemove the schedule weekly from the job even if the schedule is being used by another job.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eRemove-DbaAgentSchedule -SqlInstance sql1 -Schedule daily, weekly\nRemove multiple schedule\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eRemove-DbaAgentSchedule -SqlInstance sql1, sql2, sql3 -Schedule daily, weekly\nRemove the schedule on multiple servers for multiple schedules\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003esql1, sql2, sql3 | Remove-DbaAgentSchedule -Schedule daily, weekly\nRemove the schedule on multiple servers using pipe line\n-------------------------- EXAMPLE 6 --------------------------\nPS C:\\\u003eGet-DbaAgentSchedule -SqlInstance sql1 -Schedule sched1, sched2, sched3 | Remove-DbaAgentSchedule\nRemove the schedules using a pipeline", "Params": [ [ "SqlInstance", @@ -29297,22 +30873,23 @@ "" ] ], - "Alias": "", - "Author": "Sander Stad (@sqlstad), sqlstad.nl", - "Synopsis": "Remove-DbaAgentJobSchedule removes a job schedule.", - "Name": "Remove-DbaAgentSchedule", - "Links": "https://dbatools.io/Remove-DbaAgentJobSchedule", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eRemove-DbaAgentSchedule -SqlInstance sql1 -Schedule weekly\nRemove the schedule weekly\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eRemove-DbaAgentSchedule -SqlInstance sql1 -Schedule weekly -Force\nRemove the schedule weekly from the job even if the schedule is being used by another job.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eRemove-DbaAgentSchedule -SqlInstance sql1 -Schedule daily, weekly\nRemove multiple schedule\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eRemove-DbaAgentSchedule -SqlInstance sql1, sql2, sql3 -Schedule daily, weekly\nRemove the schedule on multiple servers for multiple schedules\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003esql1, sql2, sql3 | Remove-DbaAgentSchedule -Schedule daily, weekly\nRemove the schedule on multiple servers using pipe line\n-------------------------- EXAMPLE 6 --------------------------\nPS C:\\\u003eGet-DbaAgentSchedule -SqlInstance sql1 -Schedule sched1, sched2, sched3 | Remove-DbaAgentSchedule\nRemove the schedules using a pipeline", "Syntax": "Remove-DbaAgentSchedule -SqlInstance \u003cDbaInstanceParameter[]\u003e [-SqlCredential \u003cPSCredential\u003e] -Schedule \u003cObject[]\u003e [-EnableException] [-Force] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]\nRemove-DbaAgentSchedule [-SqlCredential \u003cPSCredential\u003e] -InputObject \u003cScheduleBase[]\u003e [-EnableException] [-Force] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Remove-DbaAgListener", + "Name": "Remove-DbaAgListener", "Description": "Removes a listener from an availability group on a SQL Server instance.", "Tags": [ "AvailabilityGroup", "HA", "AG" ], + "Synopsis": "Removes a listener from an availability group on a SQL Server instance.", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Remove-DbaAgListener", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Remove-DbaAgListener", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eRemove-DbaAgListener -SqlInstance sqlserver2012 -AvailabilityGroup ag1, ag2 -Confirm:$false\nRemoves the ag1 and ag2 availability groups on sqlserver2012. Does not prompt for confirmation.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaAvailabilityGroup -SqlInstance sqlserver2012 -AvailabilityGroup availabilitygroup1 | Remove-DbaAgListener\nRemoves the listeners returned from the Get-DbaAvailabilityGroup function. Prompts for confirmation.", "Params": [ [ "SqlInstance", @@ -29379,16 +30956,10 @@ "" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Removes a listener from an availability group on a SQL Server instance.", - "Name": "Remove-DbaAgListener", - "Links": "https://dbatools.io/Remove-DbaAgListener", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eRemove-DbaAgListener -SqlInstance sqlserver2012 -AvailabilityGroup ag1, ag2 -Confirm:$false\nRemoves the ag1 and ag2 availability groups on sqlserver2012. Does not prompt for confirmation.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaAvailabilityGroup -SqlInstance sqlserver2012 -AvailabilityGroup availabilitygroup1 | Remove-DbaAgListener\nRemoves the listeners returned from the Get-DbaAvailabilityGroup function. Prompts for confirmation.", "Syntax": "Remove-DbaAgListener [[-SqlInstance] \u003cDbaInstanceParameter[]\u003e] [[-SqlCredential] \u003cPSCredential\u003e] [[-Listener] \u003cString[]\u003e] [[-AvailabilityGroup] \u003cString[]\u003e] [[-InputObject] \u003cAvailabilityGroupListener[]\u003e] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Remove-DbaAgReplica", + "Name": "Remove-DbaAgReplica", "Description": "Removes availability group replicas from availability groups.", "Tags": [ "AG", @@ -29396,6 +30967,13 @@ "AvailabilityGroup", "Replica" ], + "Synopsis": "Removes availability group replicas from availability groups.", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Remove-DbaAgReplica", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Remove-DbaAgReplica", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eRemove-DbaAgReplica -SqlInstance sql2017a -AvailabilityGroup SharePoint -Replica sp1\nRemoves the sp1 replica from the SharePoint ag on sql2017a. Prompts for confirmation.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eRemove-DbaAgReplica -SqlInstance sql2017a | Select-Object *\nReturns full object properties on all availability group replicas found on sql2017a", "Params": [ [ "SqlInstance", @@ -29462,22 +31040,23 @@ "" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Removes availability group replicas from availability groups.", - "Name": "Remove-DbaAgReplica", - "Links": "https://dbatools.io/Remove-DbaAgReplica", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eRemove-DbaAgReplica -SqlInstance sql2017a -AvailabilityGroup SharePoint -Replica sp1\nRemoves the sp1 replica from the SharePoint ag on sql2017a. Prompts for confirmation.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eRemove-DbaAgReplica -SqlInstance sql2017a | Select-Object *\nReturns full object properties on all availability group replicas found on sql2017a", "Syntax": "Remove-DbaAgReplica [[-SqlInstance] \u003cDbaInstanceParameter[]\u003e] [[-SqlCredential] \u003cPSCredential\u003e] [[-AvailabilityGroup] \u003cString[]\u003e] [[-Replica] \u003cString[]\u003e] [[-InputObject] \u003cAvailabilityReplica[]\u003e] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Remove-DbaAvailabilityGroup", + "Name": "Remove-DbaAvailabilityGroup", "Description": "Removes availability groups on a SQL Server instance.\n\nIf possible, remove the availability group only while connected to the server instance that hosts the primary replica.\nWhen the availability group is dropped from the primary replica, changes are allowed in the former primary databases (without high availability protection).\nDeleting an availability group from a secondary replica leaves the primary replica in the RESTORING state, and changes are not allowed on the databases.\n\nAvoid dropping an availability group when the Windows Server Failover Clustering (WSFC) cluster has no quorum.\nIf you must drop an availability group while the cluster lacks quorum, the metadata availability group that is stored in the cluster is not removed.\nAfter the cluster regains quorum, you will need to drop the availability group again to remove it from the WSFC cluster.\n\nFor more information: https://docs.microsoft.com/en-us/sql/t-sql/statements/drop-availability-group-transact-sql", "Tags": [ "AvailabilityGroup", "HA", "AG" ], + "Synopsis": "Removes availability groups on a SQL Server instance.", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Remove-DbaAvailabilityGroup", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Remove-DbaAvailabilityGroup", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eRemove-DbaAvailabilityGroup -SqlInstance sqlserver2012 -AllAvailabilityGroups\nRemoves all availability groups on the sqlserver2014 instance. Prompts for confirmation.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eRemove-DbaAvailabilityGroup -SqlInstance sqlserver2012 -AvailabilityGroup ag1, ag2 -Confirm:$false\nRemoves the ag1 and ag2 availability groups on sqlserver2012. Does not prompt for confirmation.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaAvailabilityGroup -SqlInstance sqlserver2012 -AvailabilityGroup availabilitygroup1 | Remove-DbaAvailabilityGroup\nRemoves the availability groups returned from the Get-DbaAvailabilityGroup function. Prompts for confirmation.", "Params": [ [ "SqlInstance", @@ -29544,22 +31123,23 @@ "" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Removes availability groups on a SQL Server instance.", - "Name": "Remove-DbaAvailabilityGroup", - "Links": "https://dbatools.io/Remove-DbaAvailabilityGroup", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eRemove-DbaAvailabilityGroup -SqlInstance sqlserver2012 -AllAvailabilityGroups\nRemoves all availability groups on the sqlserver2014 instance. Prompts for confirmation.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eRemove-DbaAvailabilityGroup -SqlInstance sqlserver2012 -AvailabilityGroup ag1, ag2 -Confirm:$false\nRemoves the ag1 and ag2 availability groups on sqlserver2012. Does not prompt for confirmation.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaAvailabilityGroup -SqlInstance sqlserver2012 -AvailabilityGroup availabilitygroup1 | Remove-DbaAvailabilityGroup\nRemoves the availability groups returned from the Get-DbaAvailabilityGroup function. Prompts for confirmation.", "Syntax": "Remove-DbaAvailabilityGroup [[-SqlInstance] \u003cDbaInstanceParameter[]\u003e] [[-SqlCredential] \u003cPSCredential\u003e] [[-AvailabilityGroup] \u003cString[]\u003e] [-AllAvailabilityGroups] [[-InputObject] \u003cAvailabilityGroup[]\u003e] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Remove-DbaBackup", + "Name": "Remove-DbaBackup", "Description": "Removes SQL Server backups from disk.\n\nProvides all of the same functionality for removing SQL backups from disk as a standard maintenance plan would.\n\nAs an addition you have the ability to check the Archive bit on files before deletion. This will allow you to ensure backups have been archived to your archive location before removal.\n\nAlso included is the ability to remove empty folders as part of this cleanup activity.", "Tags": [ "Storage", "DisasterRecovery", "Backup" ], + "Synopsis": "Removes SQL Server backups from disk.", + "Alias": "", + "Author": "Chris Sommer (@cjsommer), www.cjsommer.com", + "CommandName": "Remove-DbaBackup", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Remove-DbaBackup", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eRemove-DbaBackup -Path \u0027C:\\MSSQL\\SQL Backup\\\u0027 -BackupFileExtension trn -RetentionPeriod 48h\n\u0027*.trn\u0027 files in \u0027C:\\MSSQL\\SQL Backup\\\u0027 and all subdirectories that are more than 48 hours old will be removed.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eRemove-DbaBackup -Path \u0027C:\\MSSQL\\SQL Backup\\\u0027 -BackupFileExtension trn -RetentionPeriod 48h -WhatIf\nSame as example #1, but doesn\u0027t actually remove any files. The function will instead show you what would be done.\r\nThis is useful when first experimenting with using the function.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eRemove-DbaBackup -Path \u0027C:\\MSSQL\\Backup\\\u0027 -BackupFileExtension bak -RetentionPeriod 7d -CheckArchiveBit\n\u0027*.bak\u0027 files in \u0027C:\\MSSQL\\Backup\\\u0027 and all subdirectories that are more than 7 days old will be removed, but only if the files have been backed up to another location as verified by checking the \r\nArchive bit.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eRemove-DbaBackup -Path \u0027C:\\MSSQL\\Backup\\\u0027 -BackupFileExtension bak -RetentionPeriod 1w -RemoveEmptyBackupFolder\n\u0027*.bak\u0027 files in \u0027C:\\MSSQL\\Backup\\\u0027 and all subdirectories that are more than 1 week old will be removed. Any folders left empty will be removed as well.", "Params": [ [ "Path", @@ -29626,18 +31206,19 @@ "" ] ], - "Alias": "", - "Author": "Chris Sommer (@cjsommer), www.cjsommer.com", - "Synopsis": "Removes SQL Server backups from disk.", - "Name": "Remove-DbaBackup", - "Links": "https://dbatools.io/Remove-DbaBackup", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eRemove-DbaBackup -Path \u0027C:\\MSSQL\\SQL Backup\\\u0027 -BackupFileExtension trn -RetentionPeriod 48h\n\u0027*.trn\u0027 files in \u0027C:\\MSSQL\\SQL Backup\\\u0027 and all subdirectories that are more than 48 hours old will be removed.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eRemove-DbaBackup -Path \u0027C:\\MSSQL\\SQL Backup\\\u0027 -BackupFileExtension trn -RetentionPeriod 48h -WhatIf\nSame as example #1, but doesn\u0027t actually remove any files. The function will instead show you what would be done.\r\nThis is useful when first experimenting with using the function.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eRemove-DbaBackup -Path \u0027C:\\MSSQL\\Backup\\\u0027 -BackupFileExtension bak -RetentionPeriod 7d -CheckArchiveBit\n\u0027*.bak\u0027 files in \u0027C:\\MSSQL\\Backup\\\u0027 and all subdirectories that are more than 7 days old will be removed, but only if the files have been backed up to another location as verified by checking the \r\nArchive bit.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eRemove-DbaBackup -Path \u0027C:\\MSSQL\\Backup\\\u0027 -BackupFileExtension bak -RetentionPeriod 1w -RemoveEmptyBackupFolder\n\u0027*.bak\u0027 files in \u0027C:\\MSSQL\\Backup\\\u0027 and all subdirectories that are more than 1 week old will be removed. Any folders left empty will be removed as well.", "Syntax": "Remove-DbaBackup [-Path] \u003cString\u003e [-BackupFileExtension] \u003cString\u003e [-RetentionPeriod] \u003cString\u003e [-CheckArchiveBit] [-RemoveEmptyBackupFolder] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Remove-DbaClientAlias", + "Name": "Remove-DbaClientAlias", "Description": "Removes a sql alias for the specified server by altering HKLM:\\SOFTWARE\\Microsoft\\MSSQLServer\\Client - mimics cliconfg.exe.", "Tags": "Alias", + "Synopsis": "Removes a sql alias for the specified server - mimics cliconfg.exe", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Remove-DbaClientAlias", + "Availability": "Windows only", + "Links": "https://dbatools.io/Remove-DbaClientAlias", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eRemove-DbaClientAlias -ComputerName workstationx -Alias sqlps\nRemoves the sqlps SQL client alias on workstationx\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaClientAlias | Remove-DbaClientAlias\nRemoves all SQL Server client aliases on the local computer", "Params": [ [ "ComputerName", @@ -29688,21 +31269,22 @@ "" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Removes a sql alias for the specified server - mimics cliconfg.exe", - "Name": "Remove-DbaClientAlias", - "Links": "https://dbatools.io/Remove-DbaClientAlias", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eRemove-DbaClientAlias -ComputerName workstationx -Alias sqlps\nRemoves the sqlps SQL client alias on workstationx\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaClientAlias | Remove-DbaClientAlias\nRemoves all SQL Server client aliases on the local computer", "Syntax": "Remove-DbaClientAlias [[-ComputerName] \u003cDbaInstanceParameter[]\u003e] [[-Credential] \u003cPSCredential\u003e] [-Alias] \u003cString[]\u003e [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Remove-DbaCmConnection", + "Name": "Remove-DbaCmConnection", "Description": "Removes connection objects from the connection cache used for remote computer management.", "Tags": [ "ComputerManagement", "CIM" ], + "Synopsis": "Removes connection objects from the connection cache used for remote computer management.", + "Alias": "", + "Author": "Friedrich Weinmann (@FredWeinmann)", + "CommandName": "Remove-DbaCmConnection", + "Availability": "Windows only", + "Links": "https://dbatools.io/Remove-DbaCmConnection", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eRemove-DbaCmConnection -ComputerName sql2014\nRemoves the cached connection to the server sql2014 from the cache.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaCmConnection | Remove-DbaCmConnection\nClears the entire connection cache.", "Params": [ [ "ComputerName", @@ -29737,21 +31319,22 @@ "" ] ], - "Alias": "", - "Author": "Friedrich Weinmann (@FredWeinmann)", - "Synopsis": "Removes connection objects from the connection cache used for remote computer management.", - "Name": "Remove-DbaCmConnection", - "Links": "https://dbatools.io/Remove-DbaCmConnection", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eRemove-DbaCmConnection -ComputerName sql2014\nRemoves the cached connection to the server sql2014 from the cache.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaCmConnection | Remove-DbaCmConnection\nClears the entire connection cache.", "Syntax": "Remove-DbaCmConnection [-ComputerName] \u003cDbaCmConnectionParameter[]\u003e [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Remove-DbaCmsRegServer", + "Name": "Remove-DbaCmsRegServer", "Description": "Removes registered servers found in SQL Server Central Management Server (CMS).", "Tags": [ "RegisteredServer", "CMS" ], + "Synopsis": "Removes registered servers found in SQL Server Central Management Server (CMS).", + "Alias": "Remove-DbaRegisteredServer", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Remove-DbaCmsRegServer", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Remove-DbaCmsRegServer", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eRemove-DbaCmsRegServer -SqlInstance sql2012 -Group HR, Accounting\nRemoves all servers from the HR and Accounting groups on sql2012\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eRemove-DbaCmsRegServer -SqlInstance sql2012 -Group HR\\Development\nRemoves all servers from the HR and sub-group Development from the CMS on sql2012.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eRemove-DbaCmsRegServer -SqlInstance sql2012 -Confirm:$false\nRemoves all registered servers on sql2012 and turns off all prompting", "Params": [ [ "SqlInstance", @@ -29826,21 +31409,22 @@ "" ] ], - "Alias": "Remove-DbaRegisteredServer", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Removes registered servers found in SQL Server Central Management Server (CMS).", - "Name": "Remove-DbaCmsRegServer", - "Links": "https://dbatools.io/Remove-DbaCmsRegServer", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eRemove-DbaCmsRegServer -SqlInstance sql2012 -Group HR, Accounting\nRemoves all servers from the HR and Accounting groups on sql2012\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eRemove-DbaCmsRegServer -SqlInstance sql2012 -Group HR\\Development\nRemoves all servers from the HR and sub-group Development from the CMS on sql2012.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eRemove-DbaCmsRegServer -SqlInstance sql2012 -Confirm:$false\nRemoves all registered servers on sql2012 and turns off all prompting", "Syntax": "Remove-DbaCmsRegServer [[-SqlInstance] \u003cDbaInstanceParameter[]\u003e] [[-SqlCredential] \u003cPSCredential\u003e] [[-Name] \u003cString[]\u003e] [[-ServerName] \u003cString[]\u003e] [[-Group] \u003cString[]\u003e] [[-InputObject] \u003cRegisteredServer[]\u003e] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Remove-DbaCmsRegServerGroup", + "Name": "Remove-DbaCmsRegServerGroup", "Description": "Returns an array of Server Groups found in the CMS.", "Tags": [ "RegisteredServer", "CMS" ], + "Synopsis": "Gets list of Server Groups objects stored in SQL Server Central Management Server (CMS).", + "Alias": "Remove-DbaRegisteredServerGroup", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Remove-DbaCmsRegServerGroup", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Remove-DbaCmsRegServerGroup", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eRemove-DbaCmsRegServerGroup -SqlInstance sql2012 -Group HR, Accounting\nRemoves the HR and Accounting groups on sql2012\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eRemove-DbaCmsRegServerGroup -SqlInstance sql2012 -Group HR\\Development -Confirm:$false\nRemoves the Development subgroup within the HR group on sql2012 and turns off all prompting", "Params": [ [ "SqlInstance", @@ -29899,18 +31483,19 @@ "" ] ], - "Alias": "Remove-DbaRegisteredServerGroup", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Gets list of Server Groups objects stored in SQL Server Central Management Server (CMS).", - "Name": "Remove-DbaCmsRegServerGroup", - "Links": "https://dbatools.io/Remove-DbaCmsRegServerGroup", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eRemove-DbaCmsRegServerGroup -SqlInstance sql2012 -Group HR, Accounting\nRemoves the HR and Accounting groups on sql2012\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eRemove-DbaCmsRegServerGroup -SqlInstance sql2012 -Group HR\\Development -Confirm:$false\nRemoves the Development subgroup within the HR group on sql2012 and turns off all prompting", "Syntax": "Remove-DbaCmsRegServerGroup [[-SqlInstance] \u003cDbaInstanceParameter[]\u003e] [[-SqlCredential] \u003cPSCredential\u003e] [[-Name] \u003cString[]\u003e] [[-InputObject] \u003cServerGroup[]\u003e] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Remove-DbaComputerCertificate", + "Name": "Remove-DbaComputerCertificate", "Description": "Removes a computer certificate from a local or remote compuer", "Tags": "Certificate", + "Synopsis": "Removes a computer certificate - useful for removing easily certs from remote computers", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Remove-DbaComputerCertificate", + "Availability": "Windows only", + "Links": "https://dbatools.io/Remove-DbaComputerCertificate", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eRemove-DbaComputerCertificate -ComputerName Server1 -Thumbprint C2BBE81A94FEE7A26FFF86C2DFDAF6BFD28C6C94\nRemoves certificate with thumbprint C2BBE81A94FEE7A26FFF86C2DFDAF6BFD28C6C94 in the LocalMachine store on Server1\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaComputerCertificate | Where-Object Thumbprint -eq E0A071E387396723C45E92D42B2D497C6A182340 | Remove-DbaComputerCertificate\nRemoves certificate using the pipeline\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eRemove-DbaComputerCertificate -ComputerName Server1 -Thumbprint C2BBE81A94FEE7A26FFF86C2DFDAF6BFD28C6C94 -Store User -Folder My\nRemoves certificate with thumbprint C2BBE81A94FEE7A26FFF86C2DFDAF6BFD28C6C94 in the User\\My (Personal) store on Server1", "Params": [ [ "ComputerName", @@ -29977,21 +31562,22 @@ "" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Removes a computer certificate - useful for removing easily certs from remote computers", - "Name": "Remove-DbaComputerCertificate", - "Links": "https://dbatools.io/Remove-DbaComputerCertificate", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eRemove-DbaComputerCertificate -ComputerName Server1 -Thumbprint C2BBE81A94FEE7A26FFF86C2DFDAF6BFD28C6C94\nRemoves certificate with thumbprint C2BBE81A94FEE7A26FFF86C2DFDAF6BFD28C6C94 in the LocalMachine store on Server1\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaComputerCertificate | Where-Object Thumbprint -eq E0A071E387396723C45E92D42B2D497C6A182340 | Remove-DbaComputerCertificate\nRemoves certificate using the pipeline\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eRemove-DbaComputerCertificate -ComputerName Server1 -Thumbprint C2BBE81A94FEE7A26FFF86C2DFDAF6BFD28C6C94 -Store User -Folder My\nRemoves certificate with thumbprint C2BBE81A94FEE7A26FFF86C2DFDAF6BFD28C6C94 in the User\\My (Personal) store on Server1", "Syntax": "Remove-DbaComputerCertificate [[-ComputerName] \u003cDbaInstanceParameter[]\u003e] [[-Credential] \u003cPSCredential\u003e] [-Thumbprint] \u003cString[]\u003e [[-Store] \u003cString\u003e] [[-Folder] \u003cString\u003e] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Remove-DbaDatabase", + "Name": "Remove-DbaDatabase", "Description": "Tries a bunch of different ways to remove a database or two or more.", "Tags": [ "Delete", "Databases" ], + "Synopsis": "Drops a database, hopefully even the really stuck ones.", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Remove-DbaDatabase", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Remove-DbaDatabase", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eRemove-DbaDatabase -SqlInstance sql2016 -Database containeddb\nPrompts then removes the database containeddb on SQL Server sql2016\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eRemove-DbaDatabase -SqlInstance sql2016 -Database containeddb, mydb\nPrompts then removes the databases containeddb and mydb on SQL Server sql2016\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eRemove-DbaDatabase -SqlInstance sql2016 -Database containeddb -Confirm:$false\nDoes not prompt and swiftly removes containeddb on SQL Server sql2016\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaDatabase -SqlInstance server\\instance -ExcludeSystem | Remove-DbaDatabase\nRemoves all the user databases from server\\instance\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eGet-DbaDatabase -SqlInstance server\\instance -ExcludeSystem | Remove-DbaDatabase -Confirm:$false\nRemoves all the user databases from server\\instance without any confirmation", "Params": [ [ "SqlInstance", @@ -30058,21 +31644,22 @@ "" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Drops a database, hopefully even the really stuck ones.", - "Name": "Remove-DbaDatabase", - "Links": "https://dbatools.io/Remove-DbaDatabase", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eRemove-DbaDatabase -SqlInstance sql2016 -Database containeddb\nPrompts then removes the database containeddb on SQL Server sql2016\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eRemove-DbaDatabase -SqlInstance sql2016 -Database containeddb, mydb\nPrompts then removes the databases containeddb and mydb on SQL Server sql2016\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eRemove-DbaDatabase -SqlInstance sql2016 -Database containeddb -Confirm:$false\nDoes not prompt and swiftly removes containeddb on SQL Server sql2016\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaDatabase -SqlInstance server\\instance -ExcludeSystem | Remove-DbaDatabase\nRemoves all the user databases from server\\instance\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eGet-DbaDatabase -SqlInstance server\\instance -ExcludeSystem | Remove-DbaDatabase -Confirm:$false\nRemoves all the user databases from server\\instance without any confirmation", "Syntax": "Remove-DbaDatabase [-SqlCredential \u003cPSCredential\u003e] [-IncludeSystemDb] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]\nRemove-DbaDatabase -SqlInstance \u003cDbaInstanceParameter[]\u003e [-SqlCredential \u003cPSCredential\u003e] -Database \u003cObject[]\u003e [-IncludeSystemDb] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]\nRemove-DbaDatabase [-SqlCredential \u003cPSCredential\u003e] -InputObject \u003cDatabase[]\u003e [-IncludeSystemDb] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Remove-DbaDatabaseSafely", + "Name": "Remove-DbaDatabaseSafely", "Description": "Performs a DBCC CHECKDB on the database, backs up the database with Checksum and verify only to a final (golden) backup location, creates an Agent Job to restore from that backup, drops the database, runs the agent job to restore the database, performs a DBCC CHECKDB and drops the database.\n\nWith huge thanks to Grant Fritchey and his verify your backups video. Take a look, it\u0027s only 3 minutes long. http://sqlps.io/backuprant", "Tags": [ "Database", "Remove" ], + "Synopsis": "Safely removes a SQL Database and creates an Agent Job to restore it.", + "Alias": "Remove-SqlDatabaseSafely", + "Author": "Rob Sewell (@SQLDBAWithBeard), sqldbawithabeard.com", + "CommandName": "Remove-DbaDatabaseSafely", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Remove-DbaDatabaseSafely", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eRemove-DbaDatabaseSafely -SqlInstance \u0027Fade2Black\u0027 -Database RideTheLightning -BackupFolder \u0027C:\\MSSQL\\Backup\\Rationalised - DO NOT DELETE\u0027\nPerforms a DBCC CHECKDB on database RideTheLightning on server Fade2Black. If there are no errors, the database is backup to the folder C:\\MSSQL\\Backup\\Rationalised - DO NOT DELETE. Then, an Agent \r\njob to restore the database from that backup is created. The database is then dropped, the Agent job to restore it run, a DBCC CHECKDB run against the restored database, and then it is dropped again.\nAny DBCC errors will be written to your documents folder\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003e$Database = \u0027DemoNCIndex\u0027,\u0027RemoveTestDatabase\u0027\nPS C:\\\u003e Remove-DbaDatabaseSafely -SqlInstance \u0027Fade2Black\u0027 -Database $Database -BackupFolder \u0027C:\\MSSQL\\Backup\\Rationalised - DO NOT DELETE\u0027\nPerforms a DBCC CHECKDB on two databases, \u0027DemoNCIndex\u0027 and \u0027RemoveTestDatabase\u0027 on server Fade2Black. Then, an Agent job to restore each database from those backups is created. The databases are \r\nthen dropped, the Agent jobs to restore them run, a DBCC CHECKDB run against the restored databases, and then they are dropped again.\nAny DBCC errors will be written to your documents folder\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eRemove-DbaDatabaseSafely -SqlInstance \u0027Fade2Black\u0027 -Destination JusticeForAll -Database RideTheLightning -BackupFolder \u0027\\\\BACKUPSERVER\\BACKUPSHARE\\MSSQL\\Rationalised - DO NOT DELETE\u0027\nPerforms a DBCC CHECKDB on database RideTheLightning on server Fade2Black. If there are no errors, the database is backup to the folder \\\\BACKUPSERVER\\BACKUPSHARE\\MSSQL\\Rationalised - DO NOT DELETE . \r\nThen, an Agent job is created on server JusticeForAll to restore the database from that backup is created. The database is then dropped on Fade2Black, the Agent job to restore it on JusticeForAll is \r\nrun, a DBCC CHECKDB run against the restored database, and then it is dropped from JusticeForAll.\nAny DBCC errors will be written to your documents folder\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eRemove-DbaDatabaseSafely -SqlInstance IronMaiden -Database $Database -Destination TheWildHearts -BackupFolder Z:\\Backups -NoDbccCheckDb -JobOwner \u0027THEBEARD\\Rob\u0027\nFor the databases $Database on the server IronMaiden a DBCC CHECKDB will not be performed before backing up the databases to the folder Z:\\Backups. Then, an Agent job is created on server \r\nTheWildHearts with a Job Owner of THEBEARD\\Rob to restore each database from that backup using the instance\u0027s default file paths. The database(s) is(are) then dropped on IronMaiden, the Agent job(s) \r\nrun, a DBCC CHECKDB run on the restored database(s), and then the database(s) is(are) dropped.\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eRemove-DbaDatabaseSafely -SqlInstance IronMaiden -Database $Database -Destination TheWildHearts -BackupFolder Z:\\Backups\nThe databases $Database on the server IronMaiden will be backed up the to the folder Z:\\Backups. Then, an Agent job is created on server TheWildHearts with a Job Owner of THEBEARD\\Rob to restore each \r\ndatabase from that backup using the instance\u0027s default file paths. The database(s) is(are) then dropped on IronMaiden, the Agent job(s) run, a DBCC CHECKDB run on the restored database(s), and then \r\nthe database(s) is(are) dropped.\nIf there is a DBCC Error, the function will continue to perform rest of the actions and will create an Agent job with \u0027DBCCERROR\u0027 in the name and a Backup file with \u0027DBCCError\u0027 in the name.", "Params": [ [ "SqlInstance", @@ -30203,18 +31790,19 @@ "" ] ], - "Alias": "Remove-SqlDatabaseSafely", - "Author": "Rob Sewell (@SQLDBAWithBeard), sqldbawithabeard.com", - "Synopsis": "Safely removes a SQL Database and creates an Agent Job to restore it.", - "Name": "Remove-DbaDatabaseSafely", - "Links": "https://dbatools.io/Remove-DbaDatabaseSafely", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eRemove-DbaDatabaseSafely -SqlInstance \u0027Fade2Black\u0027 -Database RideTheLightning -BackupFolder \u0027C:\\MSSQL\\Backup\\Rationalised - DO NOT DELETE\u0027\nPerforms a DBCC CHECKDB on database RideTheLightning on server Fade2Black. If there are no errors, the database is backup to the folder C:\\MSSQL\\Backup\\Rationalised - DO NOT DELETE. Then, an Agent \r\njob to restore the database from that backup is created. The database is then dropped, the Agent job to restore it run, a DBCC CHECKDB run against the restored database, and then it is dropped again.\nAny DBCC errors will be written to your documents folder\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003e$Database = \u0027DemoNCIndex\u0027,\u0027RemoveTestDatabase\u0027\nPS C:\\\u003e Remove-DbaDatabaseSafely -SqlInstance \u0027Fade2Black\u0027 -Database $Database -BackupFolder \u0027C:\\MSSQL\\Backup\\Rationalised - DO NOT DELETE\u0027\nPerforms a DBCC CHECKDB on two databases, \u0027DemoNCIndex\u0027 and \u0027RemoveTestDatabase\u0027 on server Fade2Black. Then, an Agent job to restore each database from those backups is created. The databases are \r\nthen dropped, the Agent jobs to restore them run, a DBCC CHECKDB run against the restored databases, and then they are dropped again.\nAny DBCC errors will be written to your documents folder\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eRemove-DbaDatabaseSafely -SqlInstance \u0027Fade2Black\u0027 -Destination JusticeForAll -Database RideTheLightning -BackupFolder \u0027\\\\BACKUPSERVER\\BACKUPSHARE\\MSSQL\\Rationalised - DO NOT DELETE\u0027\nPerforms a DBCC CHECKDB on database RideTheLightning on server Fade2Black. If there are no errors, the database is backup to the folder \\\\BACKUPSERVER\\BACKUPSHARE\\MSSQL\\Rationalised - DO NOT DELETE . \r\nThen, an Agent job is created on server JusticeForAll to restore the database from that backup is created. The database is then dropped on Fade2Black, the Agent job to restore it on JusticeForAll is \r\nrun, a DBCC CHECKDB run against the restored database, and then it is dropped from JusticeForAll.\nAny DBCC errors will be written to your documents folder\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eRemove-DbaDatabaseSafely -SqlInstance IronMaiden -Database $Database -Destination TheWildHearts -BackupFolder Z:\\Backups -NoDbccCheckDb -JobOwner \u0027THEBEARD\\Rob\u0027\nFor the databases $Database on the server IronMaiden a DBCC CHECKDB will not be performed before backing up the databases to the folder Z:\\Backups. Then, an Agent job is created on server \r\nTheWildHearts with a Job Owner of THEBEARD\\Rob to restore each database from that backup using the instance\u0027s default file paths. The database(s) is(are) then dropped on IronMaiden, the Agent job(s) \r\nrun, a DBCC CHECKDB run on the restored database(s), and then the database(s) is(are) dropped.\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eRemove-DbaDatabaseSafely -SqlInstance IronMaiden -Database $Database -Destination TheWildHearts -BackupFolder Z:\\Backups\nThe databases $Database on the server IronMaiden will be backed up the to the folder Z:\\Backups. Then, an Agent job is created on server TheWildHearts with a Job Owner of THEBEARD\\Rob to restore each \r\ndatabase from that backup using the instance\u0027s default file paths. The database(s) is(are) then dropped on IronMaiden, the Agent job(s) run, a DBCC CHECKDB run on the restored database(s), and then \r\nthe database(s) is(are) dropped.\nIf there is a DBCC Error, the function will continue to perform rest of the actions and will create an Agent job with \u0027DBCCERROR\u0027 in the name and a Backup file with \u0027DBCCError\u0027 in the name.", "Syntax": "Remove-DbaDatabaseSafely [-SqlInstance] \u003cDbaInstanceParameter\u003e [[-SqlCredential] \u003cPSCredential\u003e] [[-Database] \u003cObject[]\u003e] [[-Destination] \u003cDbaInstanceParameter\u003e] [[-DestinationCredential] \u003cPSCredential\u003e] [-NoDbccCheckDb] [-BackupFolder] \u003cString\u003e [[-CategoryName] \u003cString\u003e] [[-JobOwner] \u003cString\u003e] [-AllDatabases] [[-BackupCompression] \u003cString\u003e] [-ReuseSourceFolderStructure] [-Force] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Remove-DbaDbBackupRestoreHistory", + "Name": "Remove-DbaDbBackupRestoreHistory", "Description": "Reduces the size of the backup and restore history tables by deleting the entries for backup sets.\n\nCan be used at server level, in this case a retention period -KeepDays can be set (default is 30 days).\nCan also be used at database level, in this case the complete history for the database(s) is deleted.\n\nThe backup and restore history tables reside in the msdb database.\n\nTo periodically remove old data from backup and restore history tables it is recommended to schedule the agent job sp_delete_backuphistory from the\nSQL Server Maintenance Solution created by Ola Hallengren (https://ola.hallengren.com).", "Tags": "Delete", + "Synopsis": "Reduces the size of the backup and restore history tables by deleting old entries for backup sets.", + "Alias": "", + "Author": "IJeb Reitsma", + "CommandName": "Remove-DbaDbBackupRestoreHistory", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Remove-DbaDbBackupRestoreHistory", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eRemove-DbaDbBackupRestoreHistory -SqlInstance sql2016\nPrompts for confirmation then deletes backup and restore history on SQL Server sql2016 older than 30 days (default period)\nPS C:\\\u003e Remove-DbaDbBackupRestoreHistory -SqlInstance sql2016 -KeepDays 100 -Confirm:$false\nRemove backup and restore history on SQL Server sql2016 older than 100 days. Does not prompt for confirmation.\nPS C:\\\u003e Remove-DbaDbBackupRestoreHistory -SqlInstance sql2016 -Database db1\nPrompts for confirmation then deletes all backup and restore history for database db1 on SQL Server sql2016\nPS C:\\\u003e Get-DbaDatabase -SqlInstance sql2016 | Remove-DbaDbBackupRestoreHistory -WhatIf\nRemove complete backup and restore history for all databases on SQL Server sql2016", "Params": [ [ "SqlInstance", @@ -30281,18 +31869,19 @@ "" ] ], - "Alias": "", - "Author": "IJeb Reitsma", - "Synopsis": "Reduces the size of the backup and restore history tables by deleting old entries for backup sets.", - "Name": "Remove-DbaDbBackupRestoreHistory", - "Links": "https://dbatools.io/Remove-DbaDbBackupRestoreHistory", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eRemove-DbaDbBackupRestoreHistory -SqlInstance sql2016\nPrompts for confirmation then deletes backup and restore history on SQL Server sql2016 older than 30 days (default period)\nPS C:\\\u003e Remove-DbaDbBackupRestoreHistory -SqlInstance sql2016 -KeepDays 100 -Confirm:$false\nRemove backup and restore history on SQL Server sql2016 older than 100 days. Does not prompt for confirmation.\nPS C:\\\u003e Remove-DbaDbBackupRestoreHistory -SqlInstance sql2016 -Database db1\nPrompts for confirmation then deletes all backup and restore history for database db1 on SQL Server sql2016\nPS C:\\\u003e Get-DbaDatabase -SqlInstance sql2016 | Remove-DbaDbBackupRestoreHistory -WhatIf\nRemove complete backup and restore history for all databases on SQL Server sql2016", "Syntax": "Remove-DbaDbBackupRestoreHistory [[-SqlInstance] \u003cDbaInstanceParameter[]\u003e] [[-SqlCredential] \u003cPSCredential\u003e] [[-KeepDays] \u003cInt32\u003e] [[-Database] \u003cString[]\u003e] [[-InputObject] \u003cDatabase[]\u003e] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Remove-DbaDbCertificate", + "Name": "Remove-DbaDbCertificate", "Description": "Deletes specified database certificate", "Tags": "Certificate", + "Synopsis": "Deletes specified database certificate", + "Alias": "Remove-DbaDatabaseCertificate", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Remove-DbaDbCertificate", + "Availability": "Windows, Linux, macOS", + "Links": null, + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eRemove-DbaDbCertificate -SqlInstance Server1\nThe certificate in the master database on server1 will be removed if it exists.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eRemove-DbaDbCertificate -SqlInstance Server1 -Database db1 -Confirm:$false\nSuppresses all prompts to remove the certificate in the \u0027db1\u0027 database and drops the key.", "Params": [ [ "SqlInstance", @@ -30359,21 +31948,22 @@ "" ] ], - "Alias": "Remove-DbaDatabaseCertificate", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Deletes specified database certificate", - "Name": "Remove-DbaDbCertificate", - "Links": null, - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eRemove-DbaDbCertificate -SqlInstance Server1\nThe certificate in the master database on server1 will be removed if it exists.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eRemove-DbaDbCertificate -SqlInstance Server1 -Database db1 -Confirm:$false\nSuppresses all prompts to remove the certificate in the \u0027db1\u0027 database and drops the key.", "Syntax": "Remove-DbaDbCertificate [[-SqlInstance] \u003cDbaInstanceParameter[]\u003e] [[-SqlCredential] \u003cPSCredential\u003e] [[-Database] \u003cString[]\u003e] [[-Certificate] \u003cString[]\u003e] [[-InputObject] \u003cCertificate[]\u003e] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Remove-DbaDbMasterKey", + "Name": "Remove-DbaDbMasterKey", "Description": "Deletes specified database master key", "Tags": [ "Certificate", "Masterkey" ], + "Synopsis": "Deletes specified database master key", + "Alias": "Remove-DbaDatabaseMasterKey", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Remove-DbaDbMasterKey", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Remove-DbaMasterKey", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eRemove-DbaDbMasterKey -SqlInstance sql2017, sql2016 -Database pubs\nThe master key in the pubs database on sql2017 and sql2016 will be removed if it exists.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eRemove-DbaDbMasterKey -SqlInstance sql2017 -Database db1 -Confirm:$false\nSuppresses all prompts to remove the master key in the \u0027db1\u0027 database and drops the key.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaDbMasterKey -SqlInstance sql2017 -Database db1 | Remove-DbaDbMasterKey -Confirm:$false\nSuppresses all prompts to remove the master key in the \u0027db1\u0027 database and drops the key.", "Params": [ [ "SqlInstance", @@ -30448,21 +32038,22 @@ "" ] ], - "Alias": "Remove-DbaDatabaseMasterKey", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Deletes specified database master key", - "Name": "Remove-DbaDbMasterKey", - "Links": "https://dbatools.io/Remove-DbaMasterKey", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eRemove-DbaDbMasterKey -SqlInstance sql2017, sql2016 -Database pubs\nThe master key in the pubs database on sql2017 and sql2016 will be removed if it exists.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eRemove-DbaDbMasterKey -SqlInstance sql2017 -Database db1 -Confirm:$false\nSuppresses all prompts to remove the master key in the \u0027db1\u0027 database and drops the key.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaDbMasterKey -SqlInstance sql2017 -Database db1 | Remove-DbaDbMasterKey -Confirm:$false\nSuppresses all prompts to remove the master key in the \u0027db1\u0027 database and drops the key.", "Syntax": "Remove-DbaDbMasterKey [[-SqlInstance] \u003cDbaInstanceParameter[]\u003e] [[-SqlCredential] \u003cPSCredential\u003e] [[-Database] \u003cString[]\u003e] [[-ExcludeDatabase] \u003cString[]\u003e] [-All] [[-InputObject] \u003cMasterKey[]\u003e] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Remove-DbaDbMirror", + "Name": "Remove-DbaDbMirror", "Description": "Removes database mirrors. Does not set databases in recovery to recovered.", "Tags": [ "Mirror", "HA" ], + "Synopsis": "Removes database mirrors.", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Remove-DbaDbMirror", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Set-DbaDbMirror", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eSet-DbaDbMirror -SqlInstance localhost\nReturns all Endpoint(s) on the local default SQL Server instance\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eSet-DbaDbMirror -SqlInstance localhost, sql2016\nReturns all Endpoint(s) for the local and sql2016 SQL Server instances", "Params": [ [ "SqlInstance", @@ -30521,22 +32112,23 @@ "" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Removes database mirrors.", - "Name": "Remove-DbaDbMirror", - "Links": "https://dbatools.io/Set-DbaDbMirror", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eSet-DbaDbMirror -SqlInstance localhost\nReturns all Endpoint(s) on the local default SQL Server instance\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eSet-DbaDbMirror -SqlInstance localhost, sql2016\nReturns all Endpoint(s) for the local and sql2016 SQL Server instances", "Syntax": "Remove-DbaDbMirror [[-SqlInstance] \u003cDbaInstanceParameter[]\u003e] [[-SqlCredential] \u003cPSCredential\u003e] [[-Database] \u003cString[]\u003e] [[-InputObject] \u003cDatabase[]\u003e] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Remove-DbaDbMirrorMonitor", + "Name": "Remove-DbaDbMirrorMonitor", "Description": "Stops and deletes the mirroring monitor job for all the databases on the server instance.\n\nBasically executes sp_dbmmonitordropmonitoring.", "Tags": [ "Mirror", "HA", "Monitor" ], + "Synopsis": "Stops and deletes the mirroring monitor job for all the databases on the server instance.", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Remove-DbaDbMirrorMonitor", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Remove-DbaDbMirrorMonitor", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eRemove-DbaDbMirrorMonitor -SqlInstance sql2008, sql2012\nStops and deletes the mirroring monitor job for all the databases on sql2008 and sql2012.", "Params": [ [ "SqlInstance", @@ -30579,21 +32171,114 @@ "" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Stops and deletes the mirroring monitor job for all the databases on the server instance.", - "Name": "Remove-DbaDbMirrorMonitor", - "Links": "https://dbatools.io/Remove-DbaDbMirrorMonitor", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eRemove-DbaDbMirrorMonitor -SqlInstance sql2008, sql2012\nStops and deletes the mirroring monitor job for all the databases on sql2008 and sql2012.", "Syntax": "Remove-DbaDbMirrorMonitor [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Remove-DbaDbSnapshot", + "Name": "Remove-DbaDbOrphanUser", + "Description": "An orphan user is defined by a user that does not have their matching login. (Login property = \"\").\n\nIf user is the owner of the schema with the same name and if if the schema does not have any underlying objects the schema will be dropped.\n\nIf user owns more than one schema, the owner of the schemas that does not have the same name as the user, will be changed to \u0027dbo\u0027. If schemas have underlying objects, you must specify the -Force parameter so the user can be dropped.\n\nIf exists a login to map the drop will not be performed unless you specify the -Force parameter (only when calling from Repair-DbaDbOrphanUser.", + "Tags": [ + "Orphan", + "Database", + "Security", + "Login" + ], + "Synopsis": "Drop orphan users with no existing login to map", + "Alias": "Remove-DbaOrphanUser,Remove-SqlOrphanUser", + "Author": "Claudio Silva (@ClaudioESSilva) | Simone Bizzotto (@niphlod)", + "CommandName": "Remove-DbaDbOrphanUser", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Remove-DbaDbOrphanUser", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eRemove-DbaDbOrphanUser -SqlInstance sql2005\nFinds and drops all orphan users without matching Logins in all databases present on server \u0027sql2005\u0027.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eRemove-DbaDbOrphanUser -SqlInstance sqlserver2014a -SqlCredential $cred\nFinds and drops all orphan users without matching Logins in all databases present on server \u0027sqlserver2014a\u0027. SQL Server authentication will be used in connecting to the server.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eRemove-DbaDbOrphanUser -SqlInstance sqlserver2014a -Database db1, db2 -Force\nFinds and drops orphan users even if they have a matching Login on both db1 and db2 databases.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eRemove-DbaDbOrphanUser -SqlInstance sqlserver2014a -ExcludeDatabase db1, db2 -Force\nFinds and drops orphan users even if they have a matching Login from all databases except db1 and db2.\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eRemove-DbaDbOrphanUser -SqlInstance sqlserver2014a -User OrphanUser\nRemoves user OrphanUser from all databases only if there is no matching login.\n-------------------------- EXAMPLE 6 --------------------------\nPS C:\\\u003eRemove-DbaDbOrphanUser -SqlInstance sqlserver2014a -User OrphanUser -Force\nRemoves user OrphanUser from all databases even if they have a matching Login. Any schema that the user owns will change ownership to dbo.", + "Params": [ + [ + "SqlInstance", + "The target SQL Server instance or instances.", + "ServerInstance,SqlServer", + true, + "true (ByValue)", + "" + ], + [ + "SqlCredential", + "Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential)", + "Credential", + false, + "false", + "" + ], + [ + "Database", + "Specifies the database(s) to process. Options for this list are auto-populated from the server. If unspecified, all databases will be processed.", + "Databases", + false, + "false", + "" + ], + [ + "ExcludeDatabase", + "Specifies the database(s) to exclude from processing. Options for this list are auto-populated from the server", + "", + false, + "false", + "" + ], + [ + "User", + "Specifies the list of users to remove.", + "", + false, + "true (ByValue)", + "" + ], + [ + "Force", + "If this switch is enabled:\r\nIf exists any schema which owner is the User, this will force the change of the owner to \u0027dbo\u0027.\r\nIf exists a login to map the drop will not be performed unless you specify this parameter.", + "", + false, + "false", + "False" + ], + [ + "EnableException", + "By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message.\r\nThis avoids overwhelming you with \"sea of red\" exceptions, but is inconvenient because it basically disables advanced scripting.\r\nUsing this switch turns this \"nice by default\" feature off and enables you to catch exceptions with your own try/catch.", + "Silent", + false, + "false", + "False" + ], + [ + "WhatIf", + "If this switch is enabled, no actions are performed but informational messages will be displayed that explain what would happen if the command were to run.", + "wi", + false, + "false", + "" + ], + [ + "Confirm", + "If this switch is enabled, you will be prompted for confirmation before executing any operations that change state.", + "cf", + false, + "false", + "" + ] + ], + "Syntax": "Remove-DbaDbOrphanUser [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [[-Database] \u003cObject[]\u003e] [[-ExcludeDatabase] \u003cObject[]\u003e] [[-User] \u003cObject[]\u003e] [-Force] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" + }, + { + "Name": "Remove-DbaDbSnapshot", "Description": "Removes (drops) database snapshots from the server", "Tags": [ "Snapshot", "Database" ], + "Synopsis": "Removes database snapshots", + "Alias": "Remove-DbaDatabaseSnapshot", + "Author": "Simone Bizzotto (@niphold)", + "CommandName": "Remove-DbaDbSnapshot", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Remove-DbaDbSnapshot", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eRemove-DbaDbSnapshot -SqlInstance sql2014 -Snapshot HR_snap_20161201, HR_snap_20161101\nRemoves database snapshots named HR_snap_20161201 and HR_snap_20161101\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eRemove-DbaDbSnapshot -SqlInstance sql2014 -Database HR, Accounting\nRemoves all database snapshots having HR and Accounting as base dbs\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaDbSnapshot -SqlInstance sql2014 -Database HR, Accounting | Remove-DbaDbSnapshot\nRemoves all database snapshots having HR and Accounting as base dbs\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eRemove-DbaDbSnapshot -SqlInstance sql2014 -Snapshot HR_snapshot, Accounting_snapshot\nRemoves HR_snapshot and Accounting_snapshot\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eGet-DbaDbSnapshot -SqlInstance sql2016 | Where SnapshotOf -like \u0027*dumpsterfire*\u0027 | Remove-DbaDbSnapshot\nRemoves all snapshots associated with databases that have dumpsterfire in the name\n-------------------------- EXAMPLE 6 --------------------------\nPS C:\\\u003eGet-DbaDbSnapshot -SqlInstance sql2016 | Out-GridView -Passthru | Remove-DbaDbSnapshot\nAllows the selection of snapshots on sql2016 to remove\n-------------------------- EXAMPLE 7 --------------------------\nPS C:\\\u003eRemove-DbaDbSnapshot -SqlInstance sql2014 -AllSnapshots\nRemoves all database snapshots from sql2014\n-------------------------- EXAMPLE 8 --------------------------\nPS C:\\\u003eRemove-DbaDbSnapshot -SqlInstance sql2014 -AllSnapshots -Confirm\nRemoves all database snapshots from sql2014 and prompts for each database", "Params": [ [ "SqlInstance", @@ -30684,16 +32369,10 @@ "" ] ], - "Alias": "Remove-DbaDatabaseSnapshot", - "Author": "Simone Bizzotto (@niphold)", - "Synopsis": "Removes database snapshots", - "Name": "Remove-DbaDbSnapshot", - "Links": "https://dbatools.io/Remove-DbaDbSnapshot", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eRemove-DbaDbSnapshot -SqlInstance sql2014 -Snapshot HR_snap_20161201, HR_snap_20161101\nRemoves database snapshots named HR_snap_20161201 and HR_snap_20161101\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eRemove-DbaDbSnapshot -SqlInstance sql2014 -Database HR, Accounting\nRemoves all database snapshots having HR and Accounting as base dbs\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaDbSnapshot -SqlInstance sql2014 -Database HR, Accounting | Remove-DbaDbSnapshot\nRemoves all database snapshots having HR and Accounting as base dbs\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eRemove-DbaDbSnapshot -SqlInstance sql2014 -Snapshot HR_snapshot, Accounting_snapshot\nRemoves HR_snapshot and Accounting_snapshot\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eGet-DbaDbSnapshot -SqlInstance sql2016 | Where SnapshotOf -like \u0027*dumpsterfire*\u0027 | Remove-DbaDbSnapshot\nRemoves all snapshots associated with databases that have dumpsterfire in the name\n-------------------------- EXAMPLE 6 --------------------------\nPS C:\\\u003eGet-DbaDbSnapshot -SqlInstance sql2016 | Out-GridView -Passthru | Remove-DbaDbSnapshot\nAllows the selection of snapshots on sql2016 to remove\n-------------------------- EXAMPLE 7 --------------------------\nPS C:\\\u003eRemove-DbaDbSnapshot -SqlInstance sql2014 -AllSnapshots\nRemoves all database snapshots from sql2014\n-------------------------- EXAMPLE 8 --------------------------\nPS C:\\\u003eRemove-DbaDbSnapshot -SqlInstance sql2014 -AllSnapshots -Confirm\nRemoves all database snapshots from sql2014 and prompts for each database", "Syntax": "Remove-DbaDbSnapshot [[-SqlInstance] \u003cDbaInstanceParameter[]\u003e] [[-SqlCredential] \u003cPSCredential\u003e] [[-Database] \u003cString[]\u003e] [[-ExcludeDatabase] \u003cString[]\u003e] [[-Snapshot] \u003cString[]\u003e] [[-InputObject] \u003cDatabase[]\u003e] [-AllSnapshots] [-Force] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Remove-DbaDbUser", + "Name": "Remove-DbaDbUser", "Description": "If user is the owner of a schema with the same name and if if the schema does not have any underlying objects the schema will be\ndropped. If user owns more than one schema, the owner of the schemas that does not have the same name as the user, will be\nchanged to \u0027dbo\u0027. If schemas have underlying objects, you must specify the -Force parameter so the user can be dropped.", "Tags": [ "Database", @@ -30701,6 +32380,13 @@ "Login", "Security" ], + "Synopsis": "Drop database user", + "Alias": "", + "Author": "Doug Meyers (@dgmyrs)", + "CommandName": "Remove-DbaDbUser", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Remove-DbaDbUser", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eRemove-DbaDbUser -SqlInstance sqlserver2014 -User user1\nDrops user1 from all databases it exists in on server \u0027sqlserver2014\u0027.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eRemove-DbaDbUser -SqlInstance sqlserver2014 -Database database1 -User user1\nDrops user1 from the database1 database on server \u0027sqlserver2014\u0027.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eRemove-DbaDbUser -SqlInstance sqlserver2014 -ExcludeDatabase model -User user1\nDrops user1 from all databases it exists in on server \u0027sqlserver2014\u0027 except for the model database.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaDbUser sqlserver2014 | Where-Object Name -In \"user1\" | Remove-DbaDbUser\nDrops user1 from all databases it exists in on server \u0027sqlserver2014\u0027.", "Params": [ [ "SqlInstance", @@ -30783,18 +32469,19 @@ "" ] ], - "Alias": "", - "Author": "Doug Meyers (@dgmyrs)", - "Synopsis": "Drop database user", - "Name": "Remove-DbaDbUser", - "Links": "https://dbatools.io/Remove-DbaDbUser", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eRemove-DbaDbUser -SqlInstance sqlserver2014 -User user1\nDrops user1 from all databases it exists in on server \u0027sqlserver2014\u0027.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eRemove-DbaDbUser -SqlInstance sqlserver2014 -Database database1 -User user1\nDrops user1 from the database1 database on server \u0027sqlserver2014\u0027.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eRemove-DbaDbUser -SqlInstance sqlserver2014 -ExcludeDatabase model -User user1\nDrops user1 from all databases it exists in on server \u0027sqlserver2014\u0027 except for the model database.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaDbUser sqlserver2014 | Where-Object Name -In \"user1\" | Remove-DbaDbUser\nDrops user1 from all databases it exists in on server \u0027sqlserver2014\u0027.", "Syntax": "Remove-DbaDbUser [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [-SqlCredential \u003cPSCredential\u003e] [-Database \u003cObject[]\u003e] [-ExcludeDatabase \u003cObject[]\u003e] -User \u003cObject[]\u003e [-Force] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]\nRemove-DbaDbUser -InputObject \u003cUser[]\u003e [-Force] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Remove-DbaEndpoint", + "Name": "Remove-DbaEndpoint", "Description": "Removes endpoints from a SQL Server instance.", "Tags": "Endpoint", + "Synopsis": "Removes endpoints from a SQL Server instance.", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Remove-DbaEndpoint", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Remove-DbaEndpoint", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eRemove-DbaEndpoint -SqlInstance sqlserver2012 -AllEndpoints\nRemoves all endpoints on the sqlserver2014 instance. Prompts for confirmation.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eRemove-DbaEndpoint -SqlInstance sqlserver2012 -Endpoint endpoint1,endpoint2 -Confirm:$false\nRemoves the endpoint1 and endpoint2 endpoints. Does not prompt for confirmation.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaEndpoint -SqlInstance sqlserver2012 -Endpoint endpoint1 | Remove-DbaEndpoint\nRemoves the endpoints returned from the Get-DbaEndpoint function. Prompts for confirmation.", "Params": [ [ "SqlInstance", @@ -30861,21 +32548,22 @@ "" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Removes endpoints from a SQL Server instance.", - "Name": "Remove-DbaEndpoint", - "Links": "https://dbatools.io/Remove-DbaEndpoint", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eRemove-DbaEndpoint -SqlInstance sqlserver2012 -AllEndpoints\nRemoves all endpoints on the sqlserver2014 instance. Prompts for confirmation.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eRemove-DbaEndpoint -SqlInstance sqlserver2012 -Endpoint endpoint1,endpoint2 -Confirm:$false\nRemoves the endpoint1 and endpoint2 endpoints. Does not prompt for confirmation.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaEndpoint -SqlInstance sqlserver2012 -Endpoint endpoint1 | Remove-DbaEndpoint\nRemoves the endpoints returned from the Get-DbaEndpoint function. Prompts for confirmation.", "Syntax": "Remove-DbaEndpoint [[-SqlInstance] \u003cDbaInstanceParameter[]\u003e] [[-SqlCredential] \u003cPSCredential\u003e] [[-EndPoint] \u003cString[]\u003e] [-AllEndpoints] [[-InputObject] \u003cEndpoint[]\u003e] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Remove-DbaLogin", + "Name": "Remove-DbaLogin", "Description": "Tries a bunch of different ways to remove a Login or two or more.", "Tags": [ "Delete", "Login" ], + "Synopsis": "Drops a Login", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Remove-DbaLogin", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Remove-DbaLogin", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eRemove-DbaLogin -SqlInstance sql2016 -Login mylogin\nPrompts then removes the Login mylogin on SQL Server sql2016\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eRemove-DbaLogin -SqlInstance sql2016 -Login mylogin, yourlogin\nPrompts then removes the Logins mylogin and yourlogin on SQL Server sql2016\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eRemove-DbaLogin -SqlInstance sql2016 -Login mylogin -Confirm:$false\nDoes not prompt and swiftly removes mylogin on SQL Server sql2016\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaLogin -SqlInstance server\\instance -Login yourlogin | Remove-DbaLogin\nRemoves mylogin on SQL Server server\\instance", "Params": [ [ "SqlInstance", @@ -30942,18 +32630,19 @@ "" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Drops a Login", - "Name": "Remove-DbaLogin", - "Links": "https://dbatools.io/Remove-DbaLogin", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eRemove-DbaLogin -SqlInstance sql2016 -Login mylogin\nPrompts then removes the Login mylogin on SQL Server sql2016\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eRemove-DbaLogin -SqlInstance sql2016 -Login mylogin, yourlogin\nPrompts then removes the Logins mylogin and yourlogin on SQL Server sql2016\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eRemove-DbaLogin -SqlInstance sql2016 -Login mylogin -Confirm:$false\nDoes not prompt and swiftly removes mylogin on SQL Server sql2016\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaLogin -SqlInstance server\\instance -Login yourlogin | Remove-DbaLogin\nRemoves mylogin on SQL Server server\\instance", "Syntax": "Remove-DbaLogin [-SqlCredential \u003cPSCredential\u003e] [-Force] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]\nRemove-DbaLogin -SqlInstance \u003cDbaInstanceParameter[]\u003e [-SqlCredential \u003cPSCredential\u003e] -Login \u003cString[]\u003e [-Force] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]\nRemove-DbaLogin [-SqlCredential \u003cPSCredential\u003e] -InputObject \u003cLogin[]\u003e [-Force] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Remove-DbaNetworkCertificate", + "Name": "Remove-DbaNetworkCertificate", "Description": "Removes the network certificate for SQL Server instance. This setting is found in Configuration Manager.", "Tags": "Certificate", + "Synopsis": "Removes the network certificate for SQL Server instance", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Remove-DbaNetworkCertificate", + "Availability": "Windows only", + "Links": "https://dbatools.io/Remove-DbaNetworkCertificate", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eRemove-DbaNetworkCertificate\nRemoves the Network Certificate for the default instance (MSSQLSERVER) on localhost\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eRemove-DbaNetworkCertificate -SqlInstance sql1\\SQL2008R2SP2\nRemoves the Network Certificate for the SQL2008R2SP2 instance on sql1\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eRemove-DbaNetworkCertificate -SqlInstance localhost\\SQL2008R2SP2 -WhatIf\nShows what would happen if the command were run", "Params": [ [ "SqlInstance", @@ -30996,109 +32685,19 @@ "" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Removes the network certificate for SQL Server instance", - "Name": "Remove-DbaNetworkCertificate", - "Links": "https://dbatools.io/Remove-DbaNetworkCertificate", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eRemove-DbaNetworkCertificate\nRemoves the Network Certificate for the default instance (MSSQLSERVER) on localhost\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eRemove-DbaNetworkCertificate -SqlInstance sql1\\SQL2008R2SP2\nRemoves the Network Certificate for the SQL2008R2SP2 instance on sql1\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eRemove-DbaNetworkCertificate -SqlInstance localhost\\SQL2008R2SP2 -WhatIf\nShows what would happen if the command were run", "Syntax": "Remove-DbaNetworkCertificate [[-SqlInstance] \u003cDbaInstanceParameter[]\u003e] [[-Credential] \u003cPSCredential\u003e] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Remove-DbaOrphanUser", - "Description": "An orphan user is defined by a user that does not have their matching login. (Login property = \"\").\n\nIf user is the owner of the schema with the same name and if if the schema does not have any underlying objects the schema will be dropped.\n\nIf user owns more than one schema, the owner of the schemas that does not have the same name as the user, will be changed to \u0027dbo\u0027. If schemas have underlying objects, you must specify the -Force parameter so the user can be dropped.\n\nIf exists a login to map the drop will not be performed unless you specify the -Force parameter (only when calling from Repair-DbaOrphanUser.", - "Tags": [ - "Orphan", - "Database", - "Security", - "Login" - ], - "Params": [ - [ - "SqlInstance", - "The target SQL Server instance or instances.", - "ServerInstance,SqlServer", - true, - "true (ByValue)", - "" - ], - [ - "SqlCredential", - "Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential)", - "Credential", - false, - "false", - "" - ], - [ - "Database", - "Specifies the database(s) to process. Options for this list are auto-populated from the server. If unspecified, all databases will be processed.", - "Databases", - false, - "false", - "" - ], - [ - "ExcludeDatabase", - "Specifies the database(s) to exclude from processing. Options for this list are auto-populated from the server", - "", - false, - "false", - "" - ], - [ - "User", - "Specifies the list of users to remove.", - "", - false, - "true (ByValue)", - "" - ], - [ - "Force", - "If this switch is enabled:\r\nIf exists any schema which owner is the User, this will force the change of the owner to \u0027dbo\u0027.\r\nIf exists a login to map the drop will not be performed unless you specify this parameter.", - "", - false, - "false", - "False" - ], - [ - "EnableException", - "By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message.\r\nThis avoids overwhelming you with \"sea of red\" exceptions, but is inconvenient because it basically disables advanced scripting.\r\nUsing this switch turns this \"nice by default\" feature off and enables you to catch exceptions with your own try/catch.", - "Silent", - false, - "false", - "False" - ], - [ - "WhatIf", - "If this switch is enabled, no actions are performed but informational messages will be displayed that explain what would happen if the command were to run.", - "wi", - false, - "false", - "" - ], - [ - "Confirm", - "If this switch is enabled, you will be prompted for confirmation before executing any operations that change state.", - "cf", - false, - "false", - "" - ] - ], - "Alias": "Remove-SqlOrphanUser", - "Author": "Claudio Silva (@ClaudioESSilva) | Simone Bizzotto (@niphlod)", - "Synopsis": "Drop orphan users with no existing login to map", - "Name": "Remove-DbaOrphanUser", - "Links": "https://dbatools.io/Remove-DbaOrphanUser", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eRemove-DbaOrphanUser -SqlInstance sql2005\nFinds and drops all orphan users without matching Logins in all databases present on server \u0027sql2005\u0027.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eRemove-DbaOrphanUser -SqlInstance sqlserver2014a -SqlCredential $cred\nFinds and drops all orphan users without matching Logins in all databases present on server \u0027sqlserver2014a\u0027. SQL Server authentication will be used in connecting to the server.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eRemove-DbaOrphanUser -SqlInstance sqlserver2014a -Database db1, db2 -Force\nFinds and drops orphan users even if they have a matching Login on both db1 and db2 databases.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eRemove-DbaOrphanUser -SqlInstance sqlserver2014a -ExcludeDatabase db1, db2 -Force\nFinds and drops orphan users even if they have a matching Login from all databases except db1 and db2.\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eRemove-DbaOrphanUser -SqlInstance sqlserver2014a -User OrphanUser\nRemoves user OrphanUser from all databases only if there is no matching login.\n-------------------------- EXAMPLE 6 --------------------------\nPS C:\\\u003eRemove-DbaOrphanUser -SqlInstance sqlserver2014a -User OrphanUser -Force\nRemoves user OrphanUser from all databases even if they have a matching Login. Any schema that the user owns will change ownership to dbo.", - "Syntax": "Remove-DbaOrphanUser [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [[-Database] \u003cObject[]\u003e] [[-ExcludeDatabase] \u003cObject[]\u003e] [[-User] \u003cObject[]\u003e] [-Force] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" - }, - { - "CommandName": "Remove-DbaPfDataCollectorCounter", + "Name": "Remove-DbaPfDataCollectorCounter", "Description": "Removes a Performance Data Collector Counter.", "Tags": "PerfMon", + "Synopsis": "Removes a Performance Data Collector Counter.", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Remove-DbaPfDataCollectorCounter", + "Availability": "Windows only", + "Links": "https://dbatools.io/Remove-DbaPfDataCollectorCounter", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eRemove-DbaPfDataCollectorCounter -ComputerName sql2017 -CollectorSet \u0027System Correlation\u0027 -Collector DataCollector01 -Counter \u0027\\LogicalDisk(*)\\Avg. Disk Queue Length\u0027\nPrompts for confirmation then removes the \u0027\\LogicalDisk(*)\\Avg. Disk Queue Length\u0027 counter within the DataCollector01 collector within the System Correlation collector set on sql2017.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaPfDataCollectorCounter | Out-GridView -PassThru | Remove-DbaPfDataCollectorCounter -Confirm:$false\nAllows you to select which counters you\u0027d like on localhost and does not prompt for confirmation.", "Params": [ [ "ComputerName", @@ -31173,18 +32772,19 @@ "" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Removes a Performance Data Collector Counter.", - "Name": "Remove-DbaPfDataCollectorCounter", - "Links": "https://dbatools.io/Remove-DbaPfDataCollectorCounter", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eRemove-DbaPfDataCollectorCounter -ComputerName sql2017 -CollectorSet \u0027System Correlation\u0027 -Collector DataCollector01 -Counter \u0027\\LogicalDisk(*)\\Avg. Disk Queue Length\u0027\nPrompts for confirmation then removes the \u0027\\LogicalDisk(*)\\Avg. Disk Queue Length\u0027 counter within the DataCollector01 collector within the System Correlation collector set on sql2017.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaPfDataCollectorCounter | Out-GridView -PassThru | Remove-DbaPfDataCollectorCounter -Confirm:$false\nAllows you to select which counters you\u0027d like on localhost and does not prompt for confirmation.", "Syntax": "Remove-DbaPfDataCollectorCounter [[-ComputerName] \u003cDbaInstanceParameter[]\u003e] [[-Credential] \u003cPSCredential\u003e] [[-CollectorSet] \u003cString[]\u003e] [[-Collector] \u003cString[]\u003e] [-Counter] \u003cObject[]\u003e [[-InputObject] \u003cObject[]\u003e] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Remove-DbaPfDataCollectorSet", + "Name": "Remove-DbaPfDataCollectorSet", "Description": "Removes a Performance Monitor Data Collector Set. When removing data collector sets from the local instance, Run As Admin is required.", "Tags": "PerfMon", + "Synopsis": "Removes a Performance Monitor Data Collector Set", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Remove-DbaPfDataCollectorSet", + "Availability": "Windows only", + "Links": "https://dbatools.io/Remove-DbaPfDataCollectorSet", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eRemove-DbaPfDataCollectorSet\nPrompts for confirmation then removes all ready Collectors on localhost.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eRemove-DbaPfDataCollectorSet -ComputerName sql2017 -Confirm:$false\nAttempts to remove all ready Collectors on localhost and does not prompt to confirm.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eRemove-DbaPfDataCollectorSet -ComputerName sql2017, sql2016 -Credential ad\\sqldba -CollectorSet \u0027System Correlation\u0027\nPrompts for confirmation then removes the \u0027System Correlation\u0027 Collector on sql2017 and sql2016 using alternative credentials.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaPfDataCollectorSet -CollectorSet \u0027System Correlation\u0027 | Remove-DbaPfDataCollectorSet\nRemoves the \u0027System Correlation\u0027 Collector.\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eGet-DbaPfDataCollectorSet -CollectorSet \u0027System Correlation\u0027 | Stop-DbaPfDataCollectorSet | Remove-DbaPfDataCollectorSet\nStops and removes the \u0027System Correlation\u0027 Collector.", "Params": [ [ "ComputerName", @@ -31243,18 +32843,19 @@ "" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Removes a Performance Monitor Data Collector Set", - "Name": "Remove-DbaPfDataCollectorSet", - "Links": "https://dbatools.io/Remove-DbaPfDataCollectorSet", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eRemove-DbaPfDataCollectorSet\nPrompts for confirmation then removes all ready Collectors on localhost.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eRemove-DbaPfDataCollectorSet -ComputerName sql2017 -Confirm:$false\nAttempts to remove all ready Collectors on localhost and does not prompt to confirm.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eRemove-DbaPfDataCollectorSet -ComputerName sql2017, sql2016 -Credential ad\\sqldba -CollectorSet \u0027System Correlation\u0027\nPrompts for confirmation then removes the \u0027System Correlation\u0027 Collector on sql2017 and sql2016 using alternative credentials.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaPfDataCollectorSet -CollectorSet \u0027System Correlation\u0027 | Remove-DbaPfDataCollectorSet\nRemoves the \u0027System Correlation\u0027 Collector.\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eGet-DbaPfDataCollectorSet -CollectorSet \u0027System Correlation\u0027 | Stop-DbaPfDataCollectorSet | Remove-DbaPfDataCollectorSet\nStops and removes the \u0027System Correlation\u0027 Collector.", "Syntax": "Remove-DbaPfDataCollectorSet [[-ComputerName] \u003cDbaInstanceParameter[]\u003e] [[-Credential] \u003cPSCredential\u003e] [[-CollectorSet] \u003cString[]\u003e] [[-InputObject] \u003cObject[]\u003e] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Remove-DbaSpn", + "Name": "Remove-DbaSpn", "Description": "This function will connect to Active Directory and search for an account. If the account is found, it will attempt to remove the specified SPN. Once the SPN is removed, the function will also remove delegation to that service.\n\nIn order to run this function, the credential you provide must have write access to Active Directory.", "Tags": "SPN", + "Synopsis": "Removes an SPN for a given service account in active directory and also removes delegation to the same SPN, if found", + "Alias": "", + "Author": "Drew Furgiuele (@pittfurg), http://www.port1433.com", + "CommandName": "Remove-DbaSpn", + "Availability": "Windows only", + "Links": "https://dbatools.io/Remove-DbaSpn", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eRemove-DbaSpn -SPN MSSQLSvc\\SQLSERVERA.domain.something -ServiceAccount domain\\account\nConnects to Active Directory and removes a provided SPN from the given account (and also the relative delegation)\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eRemove-DbaSpn -SPN MSSQLSvc\\SQLSERVERA.domain.something -ServiceAccount domain\\account -EnableException\nConnects to Active Directory and removes a provided SPN from the given account, suppressing all error messages and throw exceptions that can be caught instead\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eRemove-DbaSpn -SPN MSSQLSvc\\SQLSERVERA.domain.something -ServiceAccount domain\\account -Credential ad\\sqldba\nConnects to Active Directory and removes a provided SPN to the given account. Uses alternative account to connect to AD.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eTest-DbaSpn -ComputerName sql2005 | Where { $_.isSet -eq $true } | Remove-DbaSpn -WhatIf\nShows what would happen trying to remove all set SPNs for sql2005 and the relative delegations\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eTest-DbaSpn -ComputerName sql2005 | Where { $_.isSet -eq $true } | Remove-DbaSpn\nRemoves all set SPNs for sql2005 and the relative delegations", "Params": [ [ "SPN", @@ -31305,21 +32906,22 @@ "" ] ], - "Alias": "", - "Author": "Drew Furgiuele (@pittfurg), http://www.port1433.com", - "Synopsis": "Removes an SPN for a given service account in active directory and also removes delegation to the same SPN, if found", - "Name": "Remove-DbaSpn", - "Links": "https://dbatools.io/Remove-DbaSpn", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eRemove-DbaSpn -SPN MSSQLSvc\\SQLSERVERA.domain.something -ServiceAccount domain\\account\nConnects to Active Directory and removes a provided SPN from the given account (and also the relative delegation)\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eRemove-DbaSpn -SPN MSSQLSvc\\SQLSERVERA.domain.something -ServiceAccount domain\\account -EnableException\nConnects to Active Directory and removes a provided SPN from the given account, suppressing all error messages and throw exceptions that can be caught instead\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eRemove-DbaSpn -SPN MSSQLSvc\\SQLSERVERA.domain.something -ServiceAccount domain\\account -Credential ad\\sqldba\nConnects to Active Directory and removes a provided SPN to the given account. Uses alternative account to connect to AD.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eTest-DbaSpn -ComputerName sql2005 | Where { $_.isSet -eq $true } | Remove-DbaSpn -WhatIf\nShows what would happen trying to remove all set SPNs for sql2005 and the relative delegations\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eTest-DbaSpn -ComputerName sql2005 | Where { $_.isSet -eq $true } | Remove-DbaSpn\nRemoves all set SPNs for sql2005 and the relative delegations", "Syntax": "Remove-DbaSpn [-SPN] \u003cString\u003e [-ServiceAccount] \u003cString\u003e [[-Credential] \u003cPSCredential\u003e] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Remove-DbaTrace", + "Name": "Remove-DbaTrace", "Description": "Stops and closes the specified trace and deletes its definition from the server.", "Tags": [ "Security", "Trace" ], + "Synopsis": "Stops and closes the specified trace and deletes its definition from the server.", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Remove-DbaTrace", + "Availability": "Windows, Linux, macOS", + "Links": null, + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eRemove-DbaTrace -SqlInstance sql2008\nStops and removes all traces on sql2008\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eRemove-DbaTrace -SqlInstance sql2008 -Id 1\nStops and removes all trace with ID 1 on sql2008\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaTrace -SqlInstance sql2008 | Out-GridView -PassThru | Remove-DbaTrace\nStops and removes selected traces on sql2008", "Params": [ [ "SqlInstance", @@ -31378,22 +32980,23 @@ "" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Stops and closes the specified trace and deletes its definition from the server.", - "Name": "Remove-DbaTrace", - "Links": null, - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eRemove-DbaTrace -SqlInstance sql2008\nStops and removes all traces on sql2008\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eRemove-DbaTrace -SqlInstance sql2008 -Id 1\nStops and removes all trace with ID 1 on sql2008\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaTrace -SqlInstance sql2008 | Out-GridView -PassThru | Remove-DbaTrace\nStops and removes selected traces on sql2008", "Syntax": "Remove-DbaTrace [[-SqlInstance] \u003cDbaInstanceParameter[]\u003e] [[-SqlCredential] \u003cPSCredential\u003e] [[-Id] \u003cInt32[]\u003e] [[-InputObject] \u003cObject[]\u003e] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Remove-DbaXESession", + "Name": "Remove-DbaXESession", "Description": "This script removes Extended Events sessions on a SQL Server instance.", "Tags": [ "ExtendedEvent", "XE", "XEvent" ], + "Synopsis": "Removes Extended Events sessions.", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Remove-DbaXESession", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Remove-DbaXESession", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eRemove-DbaXESession -SqlInstance sql2012 -AllSessions\nRemoves all Extended Event Session on the sqlserver2014 instance.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eRemove-DbaXESession -SqlInstance sql2012 -Session xesession1,xesession2\nRemoves the xesession1 and xesession2 Extended Event sessions.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaXESession -SqlInstance sql2017 | Remove-DbaXESession -Confirm:$false\nRemoves all sessions from sql2017, bypassing prompts.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaXESession -SqlInstance sql2012 -Session xesession1 | Remove-DbaXESession\nRemoves the sessions returned from the Get-DbaXESession function.", "Params": [ [ "SqlInstance", @@ -31460,22 +33063,23 @@ "" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Removes Extended Events sessions.", - "Name": "Remove-DbaXESession", - "Links": "https://dbatools.io/Remove-DbaXESession", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eRemove-DbaXESession -SqlInstance sql2012 -AllSessions\nRemoves all Extended Event Session on the sqlserver2014 instance.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eRemove-DbaXESession -SqlInstance sql2012 -Session xesession1,xesession2\nRemoves the xesession1 and xesession2 Extended Event sessions.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaXESession -SqlInstance sql2017 | Remove-DbaXESession -Confirm:$false\nRemoves all sessions from sql2017, bypassing prompts.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaXESession -SqlInstance sql2012 -Session xesession1 | Remove-DbaXESession\nRemoves the sessions returned from the Get-DbaXESession function.", "Syntax": "Remove-DbaXESession [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [-SqlCredential \u003cPSCredential\u003e] -Session \u003cObject[]\u003e [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]\nRemove-DbaXESession [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [-SqlCredential \u003cPSCredential\u003e] -AllSessions [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]\nRemove-DbaXESession -InputObject \u003cSession[]\u003e [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Remove-DbaXESmartTarget", + "Name": "Remove-DbaXESmartTarget", "Description": "Removes XESmartTarget PowerShell jobs.", "Tags": [ "ExtendedEvent", "XE", "XEvent" ], + "Synopsis": "Removes XESmartTarget PowerShell jobs.", + "Alias": "", + "Author": "Chrissy LeMaire (@cl) | SmartTarget by Gianluca Sartori (@spaghettidba)", + "CommandName": "Remove-DbaXESmartTarget", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Remove-DbaXESmartTarget", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaXESmartTarget | Remove-DbaXESmartTarget\nRemoves all XESmartTarget jobs.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaXESmartTarget | Where-Object Id -eq 2 | Remove-DbaXESmartTarget\nRemoves a specific XESmartTarget job.", "Params": [ [ "InputObject", @@ -31510,21 +33114,22 @@ "" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl) | SmartTarget by Gianluca Sartori (@spaghettidba)", - "Synopsis": "Removes XESmartTarget PowerShell jobs.", - "Name": "Remove-DbaXESmartTarget", - "Links": "https://dbatools.io/Remove-DbaXESmartTarget", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaXESmartTarget | Remove-DbaXESmartTarget\nRemoves all XESmartTarget jobs.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaXESmartTarget | Where-Object Id -eq 2 | Remove-DbaXESmartTarget\nRemoves a specific XESmartTarget job.", "Syntax": "Remove-DbaXESmartTarget [-InputObject] \u003cObject[]\u003e [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Rename-DbaDatabase", + "Name": "Rename-DbaDatabase", "Description": "Can change every database metadata that can be renamed.\nThe ultimate goal is choosing to have a default template to enforce in your environment\nso your naming convention for every bit can be put in place in no time.\nThe process is as follows (it follows the hierarchy of the entities):\n- database name is changed (optionally, forcing users out)\n- filegroup name(s) are changed accordingly\n- logical name(s) are changed accordingly\n- physical file(s) are changed accordingly\n- if Move is specified, the database will be taken offline and the move will initiate, then it will be taken online\n- if Move is not specified, the database remains online (unless SetOffline), and you are in charge of moving files\nIf any of the above fails, the process stops.\nPlease take a backup of your databases BEFORE using this, and remember to backup AFTER (also a FULL backup of master)\n\nIt returns an object for each database with all the renames done, plus hidden properties showing a \"human\" representation of them.\n\nIt\u0027s better you store the resulting object in a variable so you can inspect it in case of issues, e.g. \"$result = Rename-DbaDatabase .....\"\n\nTo get a grasp without worrying of what would happen under the hood, use \"Rename-DbaDatabase .... -Preview | Select-Object *\"", "Tags": [ "Database", "Rename" ], + "Synopsis": "Changes database name, logical file names, file group names and physical file names (optionally handling the move). BETA VERSION.", + "Alias": "", + "Author": "Simone Bizzotto (@niphold)", + "CommandName": "Rename-DbaDatabase", + "Availability": "Windows only", + "Links": "https://dbatools.io/Rename-DbaDatabase", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eRename-DbaDatabase -SqlInstance sqlserver2014a -Database HR -DatabaseName HR2 -Preview | select *\nShows the detailed result set you\u0027ll get renaming the HR database to HR2 without doing anything\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eRename-DbaDatabase -SqlInstance sqlserver2014a -Database HR -DatabaseName HR2\nRenames the HR database to HR2\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaDatabase -SqlInstance sqlserver2014a -Database HR | Rename-DbaDatabase -DatabaseName HR2\nSame as before, but with a piped database (renames the HR database to HR2)\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eRename-DbaDatabase -SqlInstance sqlserver2014a -Database HR -DatabaseName \"dbatools_\u003cDBN\u003e\"\nRenames the HR database to dbatools_HR\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eRename-DbaDatabase -SqlInstance sqlserver2014a -Database HR -DatabaseName \"dbatools_\u003cDBN\u003e_\u003cDATE\u003e\"\nRenames the HR database to dbatools_HR_20170807 (if today is 07th Aug 2017)\n-------------------------- EXAMPLE 6 --------------------------\nPS C:\\\u003eRename-DbaDatabase -SqlInstance sqlserver2014a -Database HR -FileGroupName \"dbatools_\u003cFGN\u003e\"\nRenames every FileGroup within HR to \"dbatools_[the original FileGroup name]\"\n-------------------------- EXAMPLE 7 --------------------------\nPS C:\\\u003eRename-DbaDatabase -SqlInstance sqlserver2014a -Database HR -DatabaseName \"dbatools_\u003cDBN\u003e\" -FileGroupName \"\u003cDBN\u003e_\u003cFGN\u003e\"\nRenames the HR database to \"dbatools_HR\", then renames every FileGroup within to \"dbatools_HR_[the original FileGroup name]\"\n-------------------------- EXAMPLE 8 --------------------------\nPS C:\\\u003eRename-DbaDatabase -SqlInstance sqlserver2014a -Database HR -FileGroupName \"dbatools_\u003cDBN\u003e_\u003cFGN\u003e\"\nPS C:\\\u003e Rename-DbaDatabase -SqlInstance sqlserver2014a -Database HR -DatabaseName \"dbatools_\u003cDBN\u003e\"\nRenames the HR database to \"dbatools_HR\", then renames every FileGroup within to \"dbatools_HR_[the original FileGroup name]\"\n-------------------------- EXAMPLE 9 --------------------------\nPS C:\\\u003eRename-DbaDatabase -SqlInstance sqlserver2014a -Database HR -DatabaseName \"dbatools_\u003cDBN\u003e\" -FileName \"\u003cDBN\u003e_\u003cFGN\u003e_\u003cFNN\u003e\"\nRenames the HR database to \"dbatools_HR\" and then all filenames as \"dbatools_HR_[Name of the FileGroup]_[original_filename]\"\r\nThe db stays online (watch out!). You can then proceed manually to move/copy files by hand, set the db offline and then online again to finish the rename process\n-------------------------- EXAMPLE 10 --------------------------\nPS C:\\\u003eRename-DbaDatabase -SqlInstance sqlserver2014a -Database HR -DatabaseName \"dbatools_\u003cDBN\u003e\" -FileName \"\u003cDBN\u003e_\u003cFGN\u003e_\u003cFNN\u003e\" -SetOffline\nRenames the HR database to \"dbatools_HR\" and then all filenames as \"dbatools_HR_[Name of the FileGroup]_[original_filename]\"\r\nThe db is then set offline (watch out!). You can then proceed manually to move/copy files by hand and then set it online again to finish the rename process\n-------------------------- EXAMPLE 11 --------------------------\nPS C:\\\u003eRename-DbaDatabase -SqlInstance sqlserver2014a -Database HR -DatabaseName \"dbatools_\u003cDBN\u003e\" -FileName \"\u003cDBN\u003e_\u003cFGN\u003e_\u003cFNN\u003e\" -Move\nRenames the HR database to \"dbatools_HR\" and then all filenames as \"dbatools_HR_[Name of the FileGroup]_[original_filename]\"\r\nThe db is then set offline (watch out!). The function tries to do a simple rename and then sets the db online again to finish the rename process", "Params": [ [ "SqlInstance", @@ -31671,18 +33276,19 @@ "" ] ], - "Alias": "", - "Author": "Simone Bizzotto (@niphold)", - "Synopsis": "Changes database name, logical file names, file group names and physical file names (optionally handling the move). BETA VERSION.", - "Name": "Rename-DbaDatabase", - "Links": "https://dbatools.io/Rename-DbaDatabase", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eRename-DbaDatabase -SqlInstance sqlserver2014a -Database HR -DatabaseName HR2 -Preview | select *\nShows the detailed result set you\u0027ll get renaming the HR database to HR2 without doing anything\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eRename-DbaDatabase -SqlInstance sqlserver2014a -Database HR -DatabaseName HR2\nRenames the HR database to HR2\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaDatabase -SqlInstance sqlserver2014a -Database HR | Rename-DbaDatabase -DatabaseName HR2\nSame as before, but with a piped database (renames the HR database to HR2)\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eRename-DbaDatabase -SqlInstance sqlserver2014a -Database HR -DatabaseName \"dbatools_\u003cDBN\u003e\"\nRenames the HR database to dbatools_HR\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eRename-DbaDatabase -SqlInstance sqlserver2014a -Database HR -DatabaseName \"dbatools_\u003cDBN\u003e_\u003cDATE\u003e\"\nRenames the HR database to dbatools_HR_20170807 (if today is 07th Aug 2017)\n-------------------------- EXAMPLE 6 --------------------------\nPS C:\\\u003eRename-DbaDatabase -SqlInstance sqlserver2014a -Database HR -FileGroupName \"dbatools_\u003cFGN\u003e\"\nRenames every FileGroup within HR to \"dbatools_[the original FileGroup name]\"\n-------------------------- EXAMPLE 7 --------------------------\nPS C:\\\u003eRename-DbaDatabase -SqlInstance sqlserver2014a -Database HR -DatabaseName \"dbatools_\u003cDBN\u003e\" -FileGroupName \"\u003cDBN\u003e_\u003cFGN\u003e\"\nRenames the HR database to \"dbatools_HR\", then renames every FileGroup within to \"dbatools_HR_[the original FileGroup name]\"\n-------------------------- EXAMPLE 8 --------------------------\nPS C:\\\u003eRename-DbaDatabase -SqlInstance sqlserver2014a -Database HR -FileGroupName \"dbatools_\u003cDBN\u003e_\u003cFGN\u003e\"\nPS C:\\\u003e Rename-DbaDatabase -SqlInstance sqlserver2014a -Database HR -DatabaseName \"dbatools_\u003cDBN\u003e\"\nRenames the HR database to \"dbatools_HR\", then renames every FileGroup within to \"dbatools_HR_[the original FileGroup name]\"\n-------------------------- EXAMPLE 9 --------------------------\nPS C:\\\u003eRename-DbaDatabase -SqlInstance sqlserver2014a -Database HR -DatabaseName \"dbatools_\u003cDBN\u003e\" -FileName \"\u003cDBN\u003e_\u003cFGN\u003e_\u003cFNN\u003e\"\nRenames the HR database to \"dbatools_HR\" and then all filenames as \"dbatools_HR_[Name of the FileGroup]_[original_filename]\"\r\nThe db stays online (watch out!). You can then proceed manually to move/copy files by hand, set the db offline and then online again to finish the rename process\n-------------------------- EXAMPLE 10 --------------------------\nPS C:\\\u003eRename-DbaDatabase -SqlInstance sqlserver2014a -Database HR -DatabaseName \"dbatools_\u003cDBN\u003e\" -FileName \"\u003cDBN\u003e_\u003cFGN\u003e_\u003cFNN\u003e\" -SetOffline\nRenames the HR database to \"dbatools_HR\" and then all filenames as \"dbatools_HR_[Name of the FileGroup]_[original_filename]\"\r\nThe db is then set offline (watch out!). You can then proceed manually to move/copy files by hand and then set it online again to finish the rename process\n-------------------------- EXAMPLE 11 --------------------------\nPS C:\\\u003eRename-DbaDatabase -SqlInstance sqlserver2014a -Database HR -DatabaseName \"dbatools_\u003cDBN\u003e\" -FileName \"\u003cDBN\u003e_\u003cFGN\u003e_\u003cFNN\u003e\" -Move\nRenames the HR database to \"dbatools_HR\" and then all filenames as \"dbatools_HR_[Name of the FileGroup]_[original_filename]\"\r\nThe db is then set offline (watch out!). The function tries to do a simple rename and then sets the db online again to finish the rename process", "Syntax": "Rename-DbaDatabase -SqlInstance \u003cDbaInstanceParameter[]\u003e [-SqlCredential \u003cPSCredential\u003e] [-Database \u003cObject[]\u003e] [-ExcludeDatabase \u003cObject[]\u003e] [-AllDatabases] [-DatabaseName \u003cString\u003e] [-FileGroupName \u003cString\u003e] [-LogicalName \u003cString\u003e] [-FileName \u003cString\u003e] [-ReplaceBefore] [-Force] [-Move] [-SetOffline] [-Preview] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]\nRename-DbaDatabase [-SqlCredential \u003cPSCredential\u003e] [-ExcludeDatabase \u003cObject[]\u003e] [-AllDatabases] [-DatabaseName \u003cString\u003e] [-FileGroupName \u003cString\u003e] [-LogicalName \u003cString\u003e] [-FileName \u003cString\u003e] [-ReplaceBefore] [-Force] [-Move] [-SetOffline] [-Preview] -InputObject \u003cDatabase[]\u003e [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Rename-DbaLogin", + "Name": "Rename-DbaLogin", "Description": "There are times where you might want to rename a login that was copied down, or if the name is not descriptive for what it does.\n\nIt can be a pain to update all of the mappings for a specific user, this does it for you.", "Tags": "Login", + "Synopsis": "Rename-DbaLogin will rename login and database mapping for a specified login.", + "Alias": "", + "Author": "Mitchell Hamann (@SirCaptainMitch)", + "CommandName": "Rename-DbaLogin", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Rename-DbaLogin", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eRename-DbaLogin -SqlInstance localhost -Login DbaToolsUser -NewLogin captain\nSQL Login Example\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eRename-DbaLogin -SqlInstance localhost -Login domain\\oldname -NewLogin domain\\newname\nChange the windowsuser login name.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eRename-DbaLogin -SqlInstance localhost -Login dbatoolsuser -NewLogin captain -WhatIf\nWhatIf Example", "Params": [ [ "SqlInstance", @@ -31741,21 +33347,22 @@ "" ] ], - "Alias": "", - "Author": "Mitchell Hamann (@SirCaptainMitch)", - "Synopsis": "Rename-DbaLogin will rename login and database mapping for a specified login.", - "Name": "Rename-DbaLogin", - "Links": "https://dbatools.io/Rename-DbaLogin", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eRename-DbaLogin -SqlInstance localhost -Login DbaToolsUser -NewLogin captain\nSQL Login Example\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eRename-DbaLogin -SqlInstance localhost -Login domain\\oldname -NewLogin domain\\newname\nChange the windowsuser login name.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eRename-DbaLogin -SqlInstance localhost -Login dbatoolsuser -NewLogin captain -WhatIf\nWhatIf Example", "Syntax": "Rename-DbaLogin [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [-Login] \u003cString\u003e [-NewLogin] \u003cString\u003e [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Repair-DbaDbMirror", + "Name": "Repair-DbaDbMirror", "Description": "Attempts to repair a suspended mirroring database.\n\nRestarts the endpoints then sets the partner to resume. See this article for more info:\n\nhttp://www.sqlservercentral.com/blogs/vivekssqlnotes/2016/09/03/how-to-resume-suspended-database-mirroring-in-sql-server-/", "Tags": [ "Mirror", "HA" ], + "Synopsis": "Attempts to repair a suspended or paused mirroring database.", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Repair-DbaDbMirror", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Repair-DbaDbMirror", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eRepair-DbaDbMirror -SqlInstance sql2017 -Database pubs\nAttempts to repair the mirrored but suspended pubs database on sql2017.\r\nRestarts the endpoints then sets the partner to resume. Prompts for confirmation.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaDatabase -SqlInstance sql2017 -Database pubs | Repair-DbaDbMirror -Confirm:$false\nAttempts to repair the mirrored but suspended pubs database on sql2017.\r\nRestarts the endpoints then sets the partner to resume. Does not prompt for confirmation.", "Params": [ [ "SqlInstance", @@ -31814,18 +33421,19 @@ "" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Attempts to repair a suspended or paused mirroring database.", - "Name": "Repair-DbaDbMirror", - "Links": "https://dbatools.io/Repair-DbaDbMirror", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eRepair-DbaDbMirror -SqlInstance sql2017 -Database pubs\nAttempts to repair the mirrored but suspended pubs database on sql2017.\r\nRestarts the endpoints then sets the partner to resume. Prompts for confirmation.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaDatabase -SqlInstance sql2017 -Database pubs | Repair-DbaDbMirror -Confirm:$false\nAttempts to repair the mirrored but suspended pubs database on sql2017.\r\nRestarts the endpoints then sets the partner to resume. Does not prompt for confirmation.", "Syntax": "Repair-DbaDbMirror [[-SqlInstance] \u003cDbaInstanceParameter[]\u003e] [[-SqlCredential] \u003cPSCredential\u003e] [[-Database] \u003cString[]\u003e] [[-InputObject] \u003cDatabase[]\u003e] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Repair-DbaOrphanUser", + "Name": "Repair-DbaDbOrphanUser", "Description": "An orphan user is defined by a user that does not have a matching login (Login property = \"\").\n\nIf the matching login exists it must be:\nEnabled\nNot a system object\nNot locked\nHave the same name that user\n\nYou can drop users that does not have their matching login by specifying the parameter -RemoveNotExisting.", "Tags": "Orphan", + "Synopsis": "Finds orphan users with existing login and remaps them.", + "Alias": "Repair-DbaOrphanUser,Repair-SqlOrphanUser", + "Author": "Claudio Silva (@ClaudioESSilva) | Simone Bizzotto (@niphlod)", + "CommandName": "Repair-DbaDbOrphanUser", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Repair-DbaDbOrphanUser", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eRepair-DbaDbOrphanUser -SqlInstance sql2005\nFinds and repairs all orphan users of all databases present on server \u0027sql2005\u0027\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eRepair-DbaDbOrphanUser -SqlInstance sqlserver2014a -SqlCredential $cred\nFinds and repair all orphan users in all databases present on server \u0027sqlserver2014a\u0027. SQL credentials are used to authenticate to the server.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eRepair-DbaDbOrphanUser -SqlInstance sqlserver2014a -Database db1, db2\nFinds and repairs all orphan users in both db1 and db2 databases.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eRepair-DbaDbOrphanUser -SqlInstance sqlserver2014a -Database db1 -Users OrphanUser\nFinds and repairs user \u0027OrphanUser\u0027 in \u0027db1\u0027 database.\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eRepair-DbaDbOrphanUser -SqlInstance sqlserver2014a -Users OrphanUser\nFinds and repairs user \u0027OrphanUser\u0027 on all databases\n-------------------------- EXAMPLE 6 --------------------------\nPS C:\\\u003eRepair-DbaDbOrphanUser -SqlInstance sqlserver2014a -RemoveNotExisting\nFinds all orphan users of all databases present on server \u0027sqlserver2014a\u0027. Removes all users that do not have matching Logins.", "Params": [ [ "SqlInstance", @@ -31908,18 +33516,19 @@ "" ] ], - "Alias": "Repair-SqlOrphanUser", - "Author": "Claudio Silva (@ClaudioESSilva) | Simone Bizzotto (@niphlod)", - "Synopsis": "Finds orphan users with existing login and remaps them.", - "Name": "Repair-DbaOrphanUser", - "Links": "https://dbatools.io/Repair-DbaOrphanUser", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eRepair-DbaOrphanUser -SqlInstance sql2005\nFinds and repairs all orphan users of all databases present on server \u0027sql2005\u0027\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eRepair-DbaOrphanUser -SqlInstance sqlserver2014a -SqlCredential $cred\nFinds and repair all orphan users in all databases present on server \u0027sqlserver2014a\u0027. SQL credentials are used to authenticate to the server.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eRepair-DbaOrphanUser -SqlInstance sqlserver2014a -Database db1, db2\nFinds and repairs all orphan users in both db1 and db2 databases.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eRepair-DbaOrphanUser -SqlInstance sqlserver2014a -Database db1 -Users OrphanUser\nFinds and repairs user \u0027OrphanUser\u0027 in \u0027db1\u0027 database.\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eRepair-DbaOrphanUser -SqlInstance sqlserver2014a -Users OrphanUser\nFinds and repairs user \u0027OrphanUser\u0027 on all databases\n-------------------------- EXAMPLE 6 --------------------------\nPS C:\\\u003eRepair-DbaOrphanUser -SqlInstance sqlserver2014a -RemoveNotExisting\nFinds all orphan users of all databases present on server \u0027sqlserver2014a\u0027. Removes all users that do not have matching Logins.", - "Syntax": "Repair-DbaOrphanUser [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [[-Database] \u003cObject[]\u003e] [[-ExcludeDatabase] \u003cObject[]\u003e] [[-Users] \u003cObject[]\u003e] [-RemoveNotExisting] [-Force] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" + "Syntax": "Repair-DbaDbOrphanUser [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [[-Database] \u003cObject[]\u003e] [[-ExcludeDatabase] \u003cObject[]\u003e] [[-Users] \u003cObject[]\u003e] [-RemoveNotExisting] [-Force] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Repair-DbaServerName", + "Name": "Repair-DbaServerName", "Description": "When a SQL Server\u0027s host OS is renamed, the SQL Server should be as well. This helps with Availability Groups and Kerberos.\n\nThis command renames @@SERVERNAME to match with the Windows name. The new name is automatically determined. It does not matter if you use an alias to connect to the SQL instance.\n\nIf the automatically determined new name matches the old name, the command will not run.\n\nhttps://www.mssqltips.com/sqlservertip/2525/steps-to-change-the-server-name-for-a-sql-server-machine/", "Tags": "SPN", + "Synopsis": "Renames @@SERVERNAME to match with the Windows name.", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Repair-DbaServerName", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Repair-DbaServerName", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eRepair-DbaServerName -SqlInstance sql2014\nChecks to see if the server name is updatable and changes the name with a number of prompts.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eRepair-DbaServerName -SqlInstance sql2014 -AutoFix\nChecks to see if the server name is updatable and automatically performs the change. Replication or mirroring will be broken if necessary.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eRepair-DbaServerName -SqlInstance sql2014 -AutoFix -Force\nChecks to see if the server name is updatable and automatically performs the change, bypassing most prompts and confirmations. Replication or mirroring will be broken if necessary.", "Params": [ [ "SqlInstance", @@ -31978,18 +33587,19 @@ "" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Renames @@SERVERNAME to match with the Windows name.", - "Name": "Repair-DbaServerName", - "Links": "https://dbatools.io/Repair-DbaServerName", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eRepair-DbaServerName -SqlInstance sql2014\nChecks to see if the server name is updatable and changes the name with a number of prompts.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eRepair-DbaServerName -SqlInstance sql2014 -AutoFix\nChecks to see if the server name is updatable and automatically performs the change. Replication or mirroring will be broken if necessary.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eRepair-DbaServerName -SqlInstance sql2014 -AutoFix -Force\nChecks to see if the server name is updatable and automatically performs the change, bypassing most prompts and confirmations. Replication or mirroring will be broken if necessary.", "Syntax": "Repair-DbaServerName [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [-AutoFix] [-Force] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Reset-DbaAdmin", + "Name": "Reset-DbaAdmin", "Description": "This function allows administrators to regain access to local or remote SQL Servers by either resetting the sa password, adding the sysadmin role to existing login, or adding a new login (SQL or Windows) and granting it sysadmin privileges.\n\nThis is accomplished by stopping the SQL services or SQL Clustered Resource Group, then restarting SQL via the command-line using the /mReset-DbaAdmin parameter which starts the server in Single-User mode and only allows this script to connect.\n\nOnce the service is restarted, the following tasks are performed:\n- Login is added if it doesn\u0027t exist\n- If login is a Windows User, an attempt is made to ensure it exists\n- If login is a SQL Login, password policy will be set to OFF when creating the login, and SQL Server authentication will be set to Mixed Mode.\n- Login will be enabled and unlocked\n- Login will be added to sysadmin role\n\nIf failures occur at any point, a best attempt is made to restart the SQL Server.\n\nIn order to make this script as portable as possible, System.Data.SqlClient and Get-WmiObject are used (as opposed to requiring the Failover Cluster Admin tools or SMO).\n\nIf using this function against a remote SQL Server, ensure WinRM is configured and accessible. If this is not possible, run the script locally.\n\nTested on Windows XP, 7, 8.1, Server 2012 and Windows Server Technical Preview 2.\nTested on SQL Server 2005 SP4 through 2016 CTP2.", "Tags": "WSMan", + "Synopsis": "This function allows administrators to regain access to SQL Servers in the event that passwords or access was lost.\n\nSupports SQL Server 2005 and above. Windows administrator access is required.", + "Alias": "Reset-SqlAdmin", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Reset-DbaAdmin", + "Availability": "Windows only", + "Links": "https://dbatools.io/Reset-DbaAdmin", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eReset-DbaAdmin -SqlInstance sqlcluster -SqlCredential sqladmin\nPrompts for password, then resets the \"sqladmin\" account password on sqlcluster.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eReset-DbaAdmin -SqlInstance sqlserver\\sqlexpress -Login ad\\administrator -Confirm:$false\nAdds the domain account \"ad\\administrator\" as a sysadmin to the SQL instance.\nIf the account already exists, it will be added to the sysadmin role.\nDoes not prompt for a password since it is not a SQL login. Does not prompt for confirmation since -Confirm is set to $false.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eReset-DbaAdmin -SqlInstance sqlserver\\sqlexpress -Login sqladmin -Force\nSkips restart confirmation, prompts for password, then adds a SQL Login \"sqladmin\" with sysadmin privileges.\r\nIf the account already exists, it will be added to the sysadmin role and the password will be reset.", "Params": [ [ "SqlInstance", @@ -32056,17 +33666,17 @@ "" ] ], - "Alias": "Reset-SqlAdmin", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "This function allows administrators to regain access to SQL Servers in the event that passwords or access was lost.\n\nSupports SQL Server 2005 and above. Windows administrator access is required.", - "Name": "Reset-DbaAdmin", - "Links": "https://dbatools.io/Reset-DbaAdmin", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eReset-DbaAdmin -SqlInstance sqlcluster -SqlCredential sqladmin\nPrompts for password, then resets the \"sqladmin\" account password on sqlcluster.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eReset-DbaAdmin -SqlInstance sqlserver\\sqlexpress -Login ad\\administrator -Confirm:$false\nAdds the domain account \"ad\\administrator\" as a sysadmin to the SQL instance.\nIf the account already exists, it will be added to the sysadmin role.\nDoes not prompt for a password since it is not a SQL login. Does not prompt for confirmation since -Confirm is set to $false.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eReset-DbaAdmin -SqlInstance sqlserver\\sqlexpress -Login sqladmin -Force\nSkips restart confirmation, prompts for password, then adds a SQL Login \"sqladmin\" with sysadmin privileges.\r\nIf the account already exists, it will be added to the sysadmin role and the password will be reset.", "Syntax": "Reset-DbaAdmin [-SqlInstance] \u003cDbaInstanceParameter\u003e [[-SqlCredential] \u003cPSCredential\u003e] [[-Login] \u003cString\u003e] [[-SecurePassword] \u003cSecureString\u003e] [-Force] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Reset-DbatoolsConfig", + "Name": "Reset-DbatoolsConfig", "Description": "This command can be used to revert a configuration item to the value it was initialized with.\nGenerally, this amounts to reverting it to its default value.\n\nIn order for a reset to be possible, two conditions must be met:\n- The setting must have been initialized.\n- The setting cannot have been enforced by policy.", + "Synopsis": "Reverts a configuration item to its default value.", + "Alias": "", + "CommandName": "Reset-DbatoolsConfig", + "Availability": "Windows, Linux, macOS", + "Links": null, + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eReset-DbatoolsConfig -Module MyModule\nResets all configuration items of the MyModule to default.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbatoolsConfig | Reset-DbatoolsConfig\nResets ALL configuration items to default.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eReset-DbatoolsConfig -FullName MyModule.Group.Setting1\nResets the configuration item named \u0027MyModule.Group.Setting1\u0027.", "Params": [ [ "ConfigurationItem", @@ -32109,20 +33719,22 @@ "False" ] ], - "Alias": "", - "Synopsis": "Reverts a configuration item to its default value.", - "Name": "Reset-DbatoolsConfig", - "Links": null, - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eReset-DbatoolsConfig -Module MyModule\nResets all configuration items of the MyModule to default.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbatoolsConfig | Reset-DbatoolsConfig\nResets ALL configuration items to default.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eReset-DbatoolsConfig -FullName MyModule.Group.Setting1\nResets the configuration item named \u0027MyModule.Group.Setting1\u0027.", "Syntax": "Reset-DbatoolsConfig [-ConfigurationItem \u003cConfig[]\u003e] [-FullName \u003cString[]\u003e] [-EnableException] [\u003cCommonParameters\u003e]\nReset-DbatoolsConfig -Module \u003cString\u003e [-Name \u003cString\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Resolve-DbaNetworkName", + "Name": "Resolve-DbaNetworkName", "Description": "Retrieves the IPAddress, ComputerName from one computer.\nThe object can be used to take action against its name or IPAddress.\n\nFirst ICMP is used to test the connection, and get the connected IPAddress.\n\nMultiple protocols (e.g. WMI, CIM, etc) are attempted before giving up.\n\nImportant: Remember that FQDN doesn\u0027t always match \"ComputerName dot Domain\" as AD intends.\nThere are network setup (google \"disjoint domain\") where AD and DNS do not match.\n\"Full computer name\" (as reported by sysdm.cpl) is the only match between the two,\nand it matches the \"DNSHostName\" property of the computer object stored in AD.\nThis means that the notation of FQDN that matches \"ComputerName dot Domain\" is incorrect\nin those scenarios.\nIn other words, the \"suffix\" of the FQDN CAN be different from the AD Domain.\n\nThis cmdlet has been providing good results since its inception but for lack of useful\nnames some doubts may arise.\nLet this clear the doubts:\n- InputName: whatever has been passed in\n- ComputerName: hostname only\n- IPAddress: IP Address\n- DNSHostName: hostname only, coming strictly from DNS (as reported from the calling computer)\n- DNSDomain: domain only, coming strictly from DNS (as reported from the calling computer)\n- Domain: domain only, coming strictly from AD (i.e. the domain the ComputerName is joined to)\n- DNSHostEntry: Fully name as returned by DNS [System.Net.Dns]::GetHostEntry\n- FQDN: \"legacy\" notation of ComputerName \"dot\" Domain (coming from AD)\n- FullComputerName: Full name as configured from within the Computer (i.e. the only secure match between AD and DNS)\n\nSo, if you need to use something, go with FullComputerName, always, as it is the most correct in every scenario.", "Tags": [ "Network", "Resolve" ], + "Synopsis": "Returns information about the network connection of the target computer including NetBIOS name, IP Address, domain name and fully qualified domain name (FQDN).", + "Alias": "", + "Author": "Klaas Vandenberghe (@PowerDBAKlaas) | Simone Bizzotto (@niphold)", + "CommandName": "Resolve-DbaNetworkName", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Resolve-DbaNetworkName", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eResolve-DbaNetworkName -ComputerName ServerA\nReturns a custom object displaying InputName, ComputerName, IPAddress, DNSHostName, DNSDomain, Domain, DNSHostEntry, FQDN, DNSHostEntry for ServerA\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eResolve-DbaNetworkName -SqlInstance sql2016\\sqlexpress\nReturns a custom object displaying InputName, ComputerName, IPAddress, DNSHostName, DNSDomain, Domain, DNSHostEntry, FQDN, DNSHostEntry for the SQL instance sql2016\\sqlexpress\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eResolve-DbaNetworkName -SqlInstance sql2016\\sqlexpress, sql2014\nReturns a custom object displaying InputName, ComputerName, IPAddress, DNSHostName, DNSDomain, Domain, DNSHostEntry, FQDN, DNSHostEntry for the SQL instance sql2016\\sqlexpress and sql2014\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaCmsRegServer -SqlInstance sql2014 | Resolve-DbaNetworkName\nReturns a custom object displaying InputName, ComputerName, IPAddress, DNSHostName, Domain, FQDN for all SQL Servers returned by Get-DbaCmsRegServer", "Params": [ [ "ComputerName", @@ -32157,17 +33769,17 @@ "False" ] ], - "Alias": "", - "Author": "Klaas Vandenberghe (@PowerDBAKlaas) | Simone Bizzotto (@niphold)", - "Synopsis": "Returns information about the network connection of the target computer including NetBIOS name, IP Address, domain name and fully qualified domain name (FQDN).", - "Name": "Resolve-DbaNetworkName", - "Links": "https://dbatools.io/Resolve-DbaNetworkName", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eResolve-DbaNetworkName -ComputerName ServerA\nReturns a custom object displaying InputName, ComputerName, IPAddress, DNSHostName, DNSDomain, Domain, DNSHostEntry, FQDN, DNSHostEntry for ServerA\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eResolve-DbaNetworkName -SqlInstance sql2016\\sqlexpress\nReturns a custom object displaying InputName, ComputerName, IPAddress, DNSHostName, DNSDomain, Domain, DNSHostEntry, FQDN, DNSHostEntry for the SQL instance sql2016\\sqlexpress\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eResolve-DbaNetworkName -SqlInstance sql2016\\sqlexpress, sql2014\nReturns a custom object displaying InputName, ComputerName, IPAddress, DNSHostName, DNSDomain, Domain, DNSHostEntry, FQDN, DNSHostEntry for the SQL instance sql2016\\sqlexpress and sql2014\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaCmsRegServer -SqlInstance sql2014 | Resolve-DbaNetworkName\nReturns a custom object displaying InputName, ComputerName, IPAddress, DNSHostName, Domain, FQDN for all SQL Servers returned by Get-DbaCmsRegServer", "Syntax": "Resolve-DbaNetworkName [[-ComputerName] \u003cDbaInstanceParameter[]\u003e] [[-Credential] \u003cPSCredential\u003e] [-Turbo] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Resolve-DbaPath", + "Name": "Resolve-DbaPath", "Description": "Resolves a path.\nWill try to resolve to paths including some basic path validation and resolution.\nWill fail if the path cannot be resolved (so an existing path must be reached at).", + "Synopsis": "Resolves a path.", + "Alias": "", + "CommandName": "Resolve-DbaPath", + "Availability": "Windows, Linux, macOS", + "Links": null, + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eResolve-DbaPath -Path report.log -Provider FileSystem -NewChild -SingleItem\nEnsures the resolved path is a FileSystem path.\r\nThis will resolve to the current folder and the file report.log.\r\nWill not ensure the file exists or doesn\u0027t exist.\r\nIf the current path is in a different provider, it will throw an exception.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eResolve-DbaPath -Path ..\\*\nThis will resolve all items in the parent folder, whatever the current path or drive might be.", "Params": [ [ "Path", @@ -32202,21 +33814,23 @@ "False" ] ], - "Alias": "", - "Synopsis": "Resolves a path.", - "Name": "Resolve-DbaPath", - "Links": null, - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eResolve-DbaPath -Path report.log -Provider FileSystem -NewChild -SingleItem\nEnsures the resolved path is a FileSystem path.\r\nThis will resolve to the current folder and the file report.log.\r\nWill not ensure the file exists or doesn\u0027t exist.\r\nIf the current path is in a different provider, it will throw an exception.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eResolve-DbaPath -Path ..\\*\nThis will resolve all items in the parent folder, whatever the current path or drive might be.", "Syntax": "Resolve-DbaPath [-Path] \u003cString[]\u003e [-Provider \u003cString\u003e] [-SingleItem] [-NewChild] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Restart-DbaService", + "Name": "Restart-DbaService", "Description": "Restarts the SQL Server related services on one or more computers. Will follow SQL Server service dependencies.\n\nRequires Local Admin rights on destination computer(s).", "Tags": [ "Service", "Instance", "Restart" ], + "Synopsis": "Restarts SQL Server services on a computer.", + "Alias": "Restart-DbaSqlService", + "Author": "Kirill Kravtsov (@nvarscar)", + "CommandName": "Restart-DbaService", + "Availability": "Windows only", + "Links": "https://dbatools.io/Restart-DbaService", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eRestart-DbaService -ComputerName sqlserver2014a\nRestarts the SQL Server related services on computer sqlserver2014a.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003e\u0027sql1\u0027,\u0027sql2\u0027,\u0027sql3\u0027| Get-DbaService | Restart-DbaService\nGets the SQL Server related services on computers sql1, sql2 and sql3 and restarts them.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eRestart-DbaService -ComputerName sql1,sql2 -InstanceName MSSQLSERVER\nRestarts the SQL Server services related to the default instance MSSQLSERVER on computers sql1 and sql2.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eRestart-DbaService -ComputerName $MyServers -Type SSRS\nRestarts the SQL Server related services of type \"SSRS\" (Reporting Services) on computers in the variable MyServers.\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eRestart-DbaService -ComputerName sql1 -Type Engine -Force\nRestarts SQL Server database engine services on sql1 forcing dependent SQL Server Agent services to restart as well.", "Params": [ [ "ComputerName", @@ -32299,22 +33913,23 @@ "" ] ], - "Alias": "Restart-DbaSqlService", - "Author": "Kirill Kravtsov (@nvarscar)", - "Synopsis": "Restarts SQL Server services on a computer.", - "Name": "Restart-DbaService", - "Links": "https://dbatools.io/Restart-DbaService", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eRestart-DbaService -ComputerName sqlserver2014a\nRestarts the SQL Server related services on computer sqlserver2014a.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003e\u0027sql1\u0027,\u0027sql2\u0027,\u0027sql3\u0027| Get-DbaService | Restart-DbaService\nGets the SQL Server related services on computers sql1, sql2 and sql3 and restarts them.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eRestart-DbaService -ComputerName sql1,sql2 -Instance MSSQLSERVER\nRestarts the SQL Server services related to the default instance MSSQLSERVER on computers sql1 and sql2.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eRestart-DbaService -ComputerName $MyServers -Type SSRS\nRestarts the SQL Server related services of type \"SSRS\" (Reporting Services) on computers in the variable MyServers.\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eRestart-DbaService -ComputerName sql1 -Type Engine -Force\nRestarts SQL Server database engine services on sql1 forcing dependent SQL Server Agent services to restart as well.", "Syntax": "Restart-DbaService [[-ComputerName] \u003cDbaInstanceParameter[]\u003e] [-InstanceName \u003cString[]\u003e] [-Type \u003cString[]\u003e] [-Timeout \u003cInt32\u003e] [-Credential \u003cPSCredential\u003e] [-Force] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]\nRestart-DbaService [-InstanceName \u003cString[]\u003e] [-Type \u003cString[]\u003e] -InputObject \u003cObject[]\u003e [-Timeout \u003cInt32\u003e] [-Credential \u003cPSCredential\u003e] [-Force] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Restore-DbaBackupFromDirectory", + "Name": "Restore-DbaBackupFromDirectory", "Description": "Please use `Get-ChildItem | Restore-DbaDatabase` instead. This command is no longer supported.", "Tags": [ "DisasterRecovery", "Backup", "Restore" ], + "Synopsis": "Please use `Get-ChildItem | Restore-DbaDatabase` instead. This command is no longer supported.", + "Alias": "Restore-SqlBackupFromDirectory", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Restore-DbaBackupFromDirectory", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Restore-SqlBackupFromDirectory", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eRestore-SqlBackupFromDirectory -SqlInstance sqlcluster -Path \\\\fileserver\\share\\sqlbackups\\SQLSERVER2014A\nAll user databases contained within \\\\fileserver\\share\\sqlbackups\\SQLSERVERA will be restored to sqlcluster, down the most recent full/differential/logs.\nRequires -Version 3.0", "Params": [ [ "SqlInstance", @@ -32365,22 +33980,23 @@ "False" ] ], - "Alias": "Restore-SqlBackupFromDirectory", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Please use `Get-ChildItem | Restore-DbaDatabase` instead. This command is no longer supported.", - "Name": "Restore-DbaBackupFromDirectory", - "Links": "https://dbatools.io/Restore-SqlBackupFromDirectory", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eRestore-SqlBackupFromDirectory -SqlInstance sqlcluster -Path \\\\fileserver\\share\\sqlbackups\\SQLSERVER2014A\nAll user databases contained within \\\\fileserver\\share\\sqlbackups\\SQLSERVERA will be restored to sqlcluster, down the most recent full/differential/logs.\nRequires -Version 3.0", "Syntax": "Restore-DbaBackupFromDirectory [-SqlInstance] \u003cDbaInstanceParameter\u003e [-Path] \u003cString\u003e [-NoRecovery] [-ReuseSourceFolderStructure] [[-SqlCredential] \u003cPSCredential\u003e] [-Force] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Restore-DbaDatabase", + "Name": "Restore-DbaDatabase", "Description": "Upon being passed a list of potential backups files this command will scan the files, select those that contain SQL Server\nbackup sets. It will then filter those files down to a set that can perform the requested restore, checking that we have a\nfull restore chain to the point in time requested by the caller.\n\nThe function defaults to working on a remote instance. This means that all paths passed in must be relative to the remote instance.\nXpDirTree will be used to perform the file scans\n\nVarious means can be used to pass in a list of files to be considered. The default is to non recursively scan the folder\npassed in.", "Tags": [ "DisasterRecovery", "Backup", "Restore" ], + "Synopsis": "Restores a SQL Server Database from a set of backup files", + "Alias": "", + "Author": "Stuart Moore (@napalmgram), stuart-moore.com", + "CommandName": "Restore-DbaDatabase", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Restore-DbaDatabase", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eRestore-DbaDatabase -SqlInstance server1\\instance1 -Path \\\\server2\\backups\nScans all the backup files in \\\\server2\\backups, filters them and restores the database to server1\\instance1\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eRestore-DbaDatabase -SqlInstance server1\\instance1 -Path \\\\server2\\backups -MaintenanceSolutionBackup -DestinationDataDirectory c:\\restores\nScans all the backup files in \\\\server2\\backups$ stored in an Ola Hallengren style folder structure,\r\nfilters them and restores the database to the c:\\restores folder on server1\\instance1\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-ChildItem c:\\SQLbackups1\\, \\\\server\\sqlbackups2 | Restore-DbaDatabase -SqlInstance server1\\instance1\nTakes the provided files from multiple directories and restores them on server1\\instance1\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003e$RestoreTime = Get-Date(\u002711:19 23/12/2016\u0027)\nPS C:\\\u003e Restore-DbaDatabase -SqlInstance server1\\instance1 -Path \\\\server2\\backups -MaintenanceSolutionBackup -DestinationDataDirectory c:\\restores -RestoreTime $RestoreTime\nScans all the backup files in \\\\server2\\backups stored in an Ola Hallengren style folder structure,\r\nfilters them and restores the database to the c:\\restores folder on server1\\instance1 up to 11:19 23/12/2016\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003e$result = Restore-DbaDatabase -SqlInstance server1\\instance1 -Path \\\\server2\\backups -DestinationDataDirectory c:\\restores -OutputScriptOnly\nPS C:\\\u003e $result | Select-Object -ExpandProperty Tsql | Out-File -Filepath c:\\scripts\\restore.sql\nScans all the backup files in \\\\server2\\backups stored in an Ola Hallengren style folder structure,\r\nfilters them and generate the T-SQL Scripts to restore the database to the latest point in time,\r\nand then stores the output in a file for later retrieval\n-------------------------- EXAMPLE 6 --------------------------\nPS C:\\\u003eRestore-DbaDatabase -SqlInstance server1\\instance1 -Path c:\\backups -DestinationDataDirectory c:\\DataFiles -DestinationLogDirectory c:\\LogFile\nScans all the files in c:\\backups and then restores them onto the SQL Server Instance server1\\instance1, placing data files\r\nc:\\DataFiles and all the log files into c:\\LogFiles\n-------------------------- EXAMPLE 7 --------------------------\nPS C:\\\u003eRestore-DbaDatabase -SqlInstance server1\\instance1 -Path http://demo.blob.core.windows.net/backups/dbbackup.bak -AzureCredential MyAzureCredential\nWill restore the backup held at http://demo.blob.core.windows.net/backups/dbbackup.bak to server1\\instance1. The connection to Azure will be made using the\r\ncredential MyAzureCredential held on instance Server1\\instance1\n-------------------------- EXAMPLE 8 --------------------------\nPS C:\\\u003eRestore-DbaDatabase -SqlInstance server1\\instance1 -Path http://demo.blob.core.windows.net/backups/dbbackup.bak\nWill attempt to restore the backups from http://demo.blob.core.windows.net/backups/dbbackup.bak if a SAS credential with the name http://demo.blob.core.windows.net/backups exists on server1\\instance1\n-------------------------- EXAMPLE 9 --------------------------\nPS C:\\\u003e$File = Get-ChildItem c:\\backups, \\\\server1\\backups -recurse\nPS C:\\\u003e $File | Restore-DbaDatabase -SqlInstance Server1\\Instance -UseDestinationDefaultDirectories\nThis will take all of the files found under the folders c:\\backups and \\\\server1\\backups, and pipeline them into\r\nRestore-DbaDatabase. Restore-DbaDatabase will then scan all of the files, and restore all of the databases included\r\nto the latest point in time covered by their backups. All data and log files will be moved to the default SQL Server\r\nfolder for those file types as defined on the target instance.\n-------------------------- EXAMPLE 10 --------------------------\nPS C:\\\u003e$files = Get-ChildItem C:\\dbatools\\db1\nPS C:\\\u003e $params = @{\r\n\u003e\u003e SqlInstance = \u0027server\\instance1\u0027\r\n\u003e\u003e DestinationFilePrefix = \u0027prefix\u0027\r\n\u003e\u003e DatabaseName =\u0027Restored\u0027\r\n\u003e\u003e RestoreTime = (get-date \"14:58:30 22/05/2017\")\r\n\u003e\u003e NoRecovery = $true\r\n\u003e\u003e WithReplace = $true\r\n\u003e\u003e StandbyDirectory = \u0027C:\\dbatools\\standby\u0027\r\n\u003e\u003e }\r\n\u003e\u003e\r\nPS C:\\\u003e $files | Restore-DbaDatabase @params\r\nPS C:\\\u003e Invoke-DbaQuery -SQLInstance server\\instance1 -Query \"select top 1 * from Restored.dbo.steps order by dt desc\"\r\nPS C:\\\u003e $params.RestoredTime = (get-date \"15:09:30 22/05/2017\")\r\nPS C:\\\u003e $params.NoRecovery = $false\r\nPS C:\\\u003e $params.Add(\"Continue\",$true)\r\nPS C:\\\u003e $files | Restore-DbaDatabase @params\r\nPS C:\\\u003e Invoke-DbaQuery -SQLInstance server\\instance1 -Query \"select top 1 * from restored.dbo.steps order by dt desc\"\r\nPS C:\\\u003e Restore-DbaDatabase -SqlInstance server\\instance1 -DestinationFilePrefix prefix -DatabaseName Restored -Continue -WithReplace\nIn this example we step through the backup files held in c:\\dbatools\\db1 folder.\r\nFirst we restore the database to a point in time in standby mode. This means we can check some details in the databases\r\nWe then roll it on a further 9 minutes to perform some more checks\r\nAnd finally we continue by rolling it all the way forward to the latest point in the backup.\r\nAt each step, only the log files needed to roll the database forward are restored.\n-------------------------- EXAMPLE 11 --------------------------\nPS C:\\\u003eRestore-DbaDatabase -SqlInstance server\\instance1 -Path c:\\backups -DatabaseName example1 -NoRecovery\nPS C:\\\u003e Restore-DbaDatabase -SqlInstance server\\instance1 -Recover -DatabaseName example1\nIn this example we restore example1 database with no recovery, and then the second call is to set the database to recovery.\n-------------------------- EXAMPLE 12 --------------------------\nPS C:\\\u003eGet-DbaBackupHistory - SqlInstance server\\instance1 -Database ProdFinance -Last | Restore-DbaDatabase -PageRestore\nPS C:\\\u003e $SuspectPage -PageRestoreTailFolder c:\\temp -TrustDbBackupHistory\nGets a list of Suspect Pages using Get-DbaSuspectPage. The uses Get-DbaBackupHistory and Restore-DbaDatabase to perform a restore of the suspect pages and bring them up to date\r\nIf server\\instance1 is Enterprise edition this will be done online, if not it will be performed offline\n-------------------------- EXAMPLE 13 --------------------------\nPS C:\\\u003e$BackupHistory = Get-DbaBackupInformation -SqlInstance sql2005 -Path \\\\backups\\sql2000\\ProdDb\nPS C:\\\u003e $BackupHistory | Restore-DbaDatabase -SqlInstance sql2000 -TrustDbBackupHistory\nDue to SQL Server 2000 not returning all the backup headers we cannot restore directly. As this is an issues with the SQL engine all we can offer is the following workaround\r\nThis will use a SQL Server instance \u003e 2000 to read the headers, and then pass them in to Restore-DbaDatabase as a BackupHistory object.\n-------------------------- EXAMPLE 14 --------------------------\nPS C:\\\u003eRestore-DbaDatabase -SqlInstance server1\\instance1 -Path \"C:\\Temp\\devops_prod_full.bak\" -DatabaseName \"DevOps_DEV\" -ReplaceDbNameInFile\nPS C:\\\u003e Rename-DbaDatabase -SqlInstance server1\\instance1 -Database \"DevOps_DEV\" -LogicalName \"\u003cDBN\u003e_\u003cFT\u003e\"\nThis will restore the database from the \"C:\\Temp\\devops_prod_full.bak\" file, with the new name \"DevOps_DEV\" and store the different physical files with the new name. It will use the system default \r\nconfigured data and log locations.\r\nAfter the restore the logical names of the database files will be renamed with the \"DevOps_DEV_ROWS\" for MDF/NDF and \"DevOps_DEV_LOG\" for LDF\n-------------------------- EXAMPLE 15 --------------------------\nPS C:\\\u003e$FileStructure = @{\n\u003e\u003e \u0027database_data\u0027 = \u0027C:\\Data\\database_data.mdf\u0027\r\n\u003e\u003e \u0027database_log\u0027 = \u0027C:\\Log\\database_log.ldf\u0027\r\n\u003e\u003e }\r\n\u003e\u003e\r\nPS C:\\\u003e Restore-DbaDatabase -SqlInstance server1 -Path \\\\ServerName\\ShareName\\File -DatabaseName database -FileMapping $FileStructure\nRestores \u0027database\u0027 to \u0027server1\u0027 and moves the files to new locations. The format for the $FileStructure HashTable is the file logical name as the Key, and the new location as the Value.", "Params": [ [ "SqlInstance", @@ -32646,14 +34262,6 @@ "false", "False" ], - [ - "AllowContinue", - "By default, Restore-DbaDatabase will stop restoring any databases if it comes across an error.\r\nUse this switch to enable it to restore all databases without issues.", - "", - false, - "false", - "False" - ], [ "GetBackupInformation", "Passing a string value into this parameter will cause a global variable to be created holding the output of Get-DbaBackupInformation", @@ -32742,6 +34350,14 @@ "false", "0" ], + [ + "AllowContinue", + "This parameter has been deprecated and will be removed in v1.0", + "", + false, + "false", + "False" + ], [ "WhatIf", "Shows what would happen if the command would execute, but does not actually perform the command", @@ -32759,21 +34375,22 @@ "" ] ], - "Alias": "", - "Author": "Stuart Moore (@napalmgram), stuart-moore.com", - "Synopsis": "Restores a SQL Server Database from a set of backup files", - "Name": "Restore-DbaDatabase", - "Links": "https://dbatools.io/Restore-DbaDatabase", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eRestore-DbaDatabase -SqlInstance server1\\instance1 -Path \\\\server2\\backups\nScans all the backup files in \\\\server2\\backups, filters them and restores the database to server1\\instance1\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eRestore-DbaDatabase -SqlInstance server1\\instance1 -Path \\\\server2\\backups -MaintenanceSolutionBackup -DestinationDataDirectory c:\\restores\nScans all the backup files in \\\\server2\\backups$ stored in an Ola Hallengren style folder structure,\r\nfilters them and restores the database to the c:\\restores folder on server1\\instance1\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-ChildItem c:\\SQLbackups1\\, \\\\server\\sqlbackups2 | Restore-DbaDatabase -SqlInstance server1\\instance1\nTakes the provided files from multiple directories and restores them on server1\\instance1\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003e$RestoreTime = Get-Date(\u002711:19 23/12/2016\u0027)\nPS C:\\\u003e Restore-DbaDatabase -SqlInstance server1\\instance1 -Path \\\\server2\\backups -MaintenanceSolutionBackup -DestinationDataDirectory c:\\restores -RestoreTime $RestoreTime\nScans all the backup files in \\\\server2\\backups stored in an Ola Hallengren style folder structure,\r\nfilters them and restores the database to the c:\\restores folder on server1\\instance1 up to 11:19 23/12/2016\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003e$result = Restore-DbaDatabase -SqlInstance server1\\instance1 -Path \\\\server2\\backups -DestinationDataDirectory c:\\restores -OutputScriptOnly\nPS C:\\\u003e $result | Select-Object -ExpandProperty Tsql | Out-File -Filepath c:\\scripts\\restore.sql\nScans all the backup files in \\\\server2\\backups stored in an Ola Hallengren style folder structure,\r\nfilters them and generate the T-SQL Scripts to restore the database to the latest point in time,\r\nand then stores the output in a file for later retrieval\n-------------------------- EXAMPLE 6 --------------------------\nPS C:\\\u003eRestore-DbaDatabase -SqlInstance server1\\instance1 -Path c:\\backups -DestinationDataDirectory c:\\DataFiles -DestinationLogDirectory c:\\LogFile\nScans all the files in c:\\backups and then restores them onto the SQL Server Instance server1\\instance1, placing data files\r\nc:\\DataFiles and all the log files into c:\\LogFiles\n-------------------------- EXAMPLE 7 --------------------------\nPS C:\\\u003eRestore-DbaDatabase -SqlInstance server1\\instance1 -Path http://demo.blob.core.windows.net/backups/dbbackup.bak -AzureCredential MyAzureCredential\nWill restore the backup held at http://demo.blob.core.windows.net/backups/dbbackup.bak to server1\\instance1. The connection to Azure will be made using the\r\ncredential MyAzureCredential held on instance Server1\\instance1\n-------------------------- EXAMPLE 8 --------------------------\nPS C:\\\u003eRestore-DbaDatabase -SqlInstance server1\\instance1 -Path http://demo.blob.core.windows.net/backups/dbbackup.bak\nWill attempt to restore the backups from http://demo.blob.core.windows.net/backups/dbbackup.bak if a SAS credential with the name http://demo.blob.core.windows.net/backups exists on server1\\instance1\n-------------------------- EXAMPLE 9 --------------------------\nPS C:\\\u003e$File = Get-ChildItem c:\\backups, \\\\server1\\backups -recurse\nPS C:\\\u003e $File | Restore-DbaDatabase -SqlInstance Server1\\Instance -UseDestinationDefaultDirectories\nThis will take all of the files found under the folders c:\\backups and \\\\server1\\backups, and pipeline them into\r\nRestore-DbaDatabase. Restore-DbaDatabase will then scan all of the files, and restore all of the databases included\r\nto the latest point in time covered by their backups. All data and log files will be moved to the default SQL Server\r\nfolder for those file types as defined on the target instance.\n-------------------------- EXAMPLE 10 --------------------------\nPS C:\\\u003e$files = Get-ChildItem C:\\dbatools\\db1\nPS C:\\\u003e $files | Restore-DbaDatabase -SqlInstance server\\instance1 `\r\n\u003e\u003e -DestinationFilePrefix prefix -DatabaseName Restored `\r\n\u003e\u003e -RestoreTime (get-date \"14:58:30 22/05/2017\") `\r\n\u003e\u003e -NoRecovery -WithReplace -StandbyDirectory C:\\dbatools\\standby\r\n\u003e\u003e\r\nPS C:\\\u003e #It\u0027s in standby so we can peek at it\r\nPS C:\\\u003e Invoke-DbaQuery -SQLInstance server\\instance1 -Query \"select top 1 * from Restored.dbo.steps order by dt desc\"\r\nPS C:\\\u003e #Not quite there so let\u0027s roll on a bit:\r\nPS C:\\\u003e $files | Restore-DbaDatabase -SqlInstance server\\instance1 `\r\n\u003e\u003e -DestinationFilePrefix prefix -DatabaseName Restored `\r\n\u003e\u003e -continue -WithReplace -RestoreTime (get-date \"15:09:30 22/05/2017\") `\r\n\u003e\u003e -StandbyDirectory C:\\dbatools\\standby\r\n\u003e\u003e\r\nPS C:\\\u003e Invoke-DbaQuery -SQLInstance server\\instance1 -Query \"select top 1 * from restored.dbo.steps order by dt desc\"\r\nPS C:\\\u003e Restore-DbaDatabase -SqlInstance server\\instance1 -DestinationFilePrefix prefix -DatabaseName Restored -Continue -WithReplace\nIn this example we step through the backup files held in c:\\dbatools\\db1 folder.\r\nFirst we restore the database to a point in time in standby mode. This means we can check some details in the databases\r\nWe then roll it on a further 9 minutes to perform some more checks\r\nAnd finally we continue by rolling it all the way forward to the latest point in the backup.\r\nAt each step, only the log files needed to roll the database forward are restored.\n-------------------------- EXAMPLE 11 --------------------------\nPS C:\\\u003eRestore-DbaDatabase -SqlInstance server\\instance1 -Path c:\\backups -DatabaseName example1 -NoRecovery\nPS C:\\\u003e Restore-DbaDatabase -SqlInstance server\\instance1 -Recover -DatabaseName example1\nIn this example we restore example1 database with no recovery, and then the second call is to set the database to recovery.\n-------------------------- EXAMPLE 12 --------------------------\nPS C:\\\u003eGet-DbaBackupHistory - SqlInstance server\\instance1 -Database ProdFinance -Last | Restore-DbaDatabase -PageRestore\nPS C:\\\u003e $SuspectPage -PageRestoreTailFolder c:\\temp -TrustDbBackupHistory -AllowContinues\nGets a list of Suspect Pages using Get-DbaSuspectPage. The uses Get-DbaBackupHistory and Restore-DbaDatabase to perform a restore of the suspect pages and bring them up to date\r\nIf server\\instance1 is Enterprise edition this will be done online, if not it will be performed offline\r\nAllowContinue is required to make sure we cope with existing files\n-------------------------- EXAMPLE 13 --------------------------\nPS C:\\\u003e$BackupHistory = Get-DbaBackupInformation -SqlInstance sql2005 -Path \\\\backups\\sql2000\\ProdDb\nPS C:\\\u003e $BackupHistory | Restore-DbaDatabase -SqlInstance sql2000 -TrustDbBackupHistory\nDue to SQL Server 2000 not returning all the backup headers we cannot restore directly. As this is an issues with the SQL engine all we can offer is the following workaround\r\nThis will use a SQL Server instance \u003e 2000 to read the headers, and then pass them in to Restore-DbaDatabase as a BackupHistory object.\n-------------------------- EXAMPLE 14 --------------------------\nPS C:\\\u003eRestore-DbaDatabase -SqlInstance server1\\instance1 -Path \"C:\\Temp\\devops_prod_full.bak\" -DatabaseName \"DevOps_DEV\" -ReplaceDbNameInFile\nPS C:\\\u003e Rename-DbaDatabase -SqlInstance server1\\instance1 -Database \"DevOps_DEV\" -LogicalName \"\u003cDBN\u003e_\u003cFT\u003e\"\nThis will restore the database from the \"C:\\Temp\\devops_prod_full.bak\" file, with the new name \"DevOps_DEV\" and store the different physical files with the new name. It will use the system default \r\nconfigured data and log locations.\r\nAfter the restore the logical names of the database files will be renamed with the \"DevOps_DEV_ROWS\" for MDF/NDF and \"DevOps_DEV_LOG\" for LDF\n-------------------------- EXAMPLE 15 --------------------------\nPS C:\\\u003e$FileStructure = @{\n\u003e\u003e \u0027database_data\u0027 = \u0027C:\\Data\\database_data.mdf\u0027\r\n\u003e\u003e \u0027database_log\u0027 = \u0027C:\\Log\\database_log.ldf\u0027\r\n\u003e\u003e }\r\n\u003e\u003e\r\nPS C:\\\u003e Restore-DbaDatabase -SqlInstance server1 -Path \\\\ServerName\\ShareName\\File -DatabaseName database -FileMapping $FileStructure\nRestores \u0027database\u0027 to \u0027server1\u0027 and moves the files to new locations. The format for the $FileStructure HashTable is the file logical name as the Key, and the new location as the Value.", - "Syntax": "Restore-DbaDatabase -SqlInstance \u003cDbaInstanceParameter\u003e [-SqlCredential \u003cPSCredential\u003e] -Path \u003cObject[]\u003e [-DatabaseName \u003cObject[]\u003e] [-DestinationDataDirectory \u003cString\u003e] [-DestinationLogDirectory \u003cString\u003e] [-DestinationFileStreamDirectory \u003cString\u003e] [-RestoreTime \u003cDateTime\u003e] [-NoRecovery] [-WithReplace] [-XpDirTree] [-OutputScriptOnly] [-VerifyOnly] [-MaintenanceSolutionBackup] [-FileMapping \u003cHashtable\u003e] [-IgnoreLogBackup] [-UseDestinationDefaultDirectories] [-ReuseSourceFolderStructure] [-DestinationFilePrefix \u003cString\u003e] [-RestoredDatabaseNamePrefix \u003cString\u003e] [-TrustDbBackupHistory] \r\n[-MaxTransferSize \u003cInt32\u003e] [-BlockSize \u003cInt32\u003e] [-BufferCount \u003cInt32\u003e] [-DirectoryRecurse] [-EnableException] [-StandbyDirectory \u003cString\u003e] [-Continue] [-AzureCredential \u003cString\u003e] [-ReplaceDbNameInFile] [-DestinationFileSuffix \u003cString\u003e] [-KeepCDC] [-AllowContinue] [-GetBackupInformation \u003cString\u003e] [-StopAfterGetBackupInformation] [-SelectBackupInformation \u003cString\u003e] [-StopAfterSelectBackupInformation] [-FormatBackupInformation \u003cString\u003e] [-StopAfterFormatBackupInformation] [-TestBackupInformation \u003cString\u003e] [-StopAfterTestBackupInformation] [-StatementTimeout \u003cInt32\u003e] [-WhatIf] [-Confirm] \r\n[\u003cCommonParameters\u003e]\nRestore-DbaDatabase -SqlInstance \u003cDbaInstanceParameter\u003e [-SqlCredential \u003cPSCredential\u003e] -Path \u003cObject[]\u003e [-DatabaseName \u003cObject[]\u003e] [-OutputScriptOnly] [-TrustDbBackupHistory] [-MaxTransferSize \u003cInt32\u003e] [-BlockSize \u003cInt32\u003e] [-BufferCount \u003cInt32\u003e] [-EnableException] [-AzureCredential \u003cString\u003e] [-AllowContinue] [-GetBackupInformation \u003cString\u003e] [-StopAfterGetBackupInformation] [-SelectBackupInformation \u003cString\u003e] [-StopAfterSelectBackupInformation] [-FormatBackupInformation \u003cString\u003e] [-StopAfterFormatBackupInformation] [-TestBackupInformation \u003cString\u003e] [-StopAfterTestBackupInformation] \r\n-PageRestore \u003cObject\u003e -PageRestoreTailFolder \u003cString\u003e [-StatementTimeout \u003cInt32\u003e] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]\nRestore-DbaDatabase -SqlInstance \u003cDbaInstanceParameter\u003e [-SqlCredential \u003cPSCredential\u003e] [-DatabaseName \u003cObject[]\u003e] [-OutputScriptOnly] [-EnableException] [-AzureCredential \u003cString\u003e] [-Recover] [-AllowContinue] [-GetBackupInformation \u003cString\u003e] [-StopAfterGetBackupInformation] [-SelectBackupInformation \u003cString\u003e] [-StopAfterSelectBackupInformation] [-FormatBackupInformation \u003cString\u003e] [-StopAfterFormatBackupInformation] [-TestBackupInformation \u003cString\u003e] [-StopAfterTestBackupInformation] [-StatementTimeout \u003cInt32\u003e] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" + "Syntax": "Restore-DbaDatabase -SqlInstance \u003cDbaInstanceParameter\u003e [-SqlCredential \u003cPSCredential\u003e] -Path \u003cObject[]\u003e [-DatabaseName \u003cObject[]\u003e] [-DestinationDataDirectory \u003cString\u003e] [-DestinationLogDirectory \u003cString\u003e] [-DestinationFileStreamDirectory \u003cString\u003e] [-RestoreTime \u003cDateTime\u003e] [-NoRecovery] [-WithReplace] [-XpDirTree] [-OutputScriptOnly] [-VerifyOnly] [-MaintenanceSolutionBackup] [-FileMapping \u003cHashtable\u003e] [-IgnoreLogBackup] [-UseDestinationDefaultDirectories] [-ReuseSourceFolderStructure] [-DestinationFilePrefix \u003cString\u003e] [-RestoredDatabaseNamePrefix \u003cString\u003e] [-TrustDbBackupHistory] \r\n[-MaxTransferSize \u003cInt32\u003e] [-BlockSize \u003cInt32\u003e] [-BufferCount \u003cInt32\u003e] [-DirectoryRecurse] [-EnableException] [-StandbyDirectory \u003cString\u003e] [-Continue] [-AzureCredential \u003cString\u003e] [-ReplaceDbNameInFile] [-DestinationFileSuffix \u003cString\u003e] [-KeepCDC] [-GetBackupInformation \u003cString\u003e] [-StopAfterGetBackupInformation] [-SelectBackupInformation \u003cString\u003e] [-StopAfterSelectBackupInformation] [-FormatBackupInformation \u003cString\u003e] [-StopAfterFormatBackupInformation] [-TestBackupInformation \u003cString\u003e] [-StopAfterTestBackupInformation] [-StatementTimeout \u003cInt32\u003e] [-AllowContinue] [-WhatIf] [-Confirm] \r\n[\u003cCommonParameters\u003e]\nRestore-DbaDatabase -SqlInstance \u003cDbaInstanceParameter\u003e [-SqlCredential \u003cPSCredential\u003e] -Path \u003cObject[]\u003e [-DatabaseName \u003cObject[]\u003e] [-OutputScriptOnly] [-TrustDbBackupHistory] [-MaxTransferSize \u003cInt32\u003e] [-BlockSize \u003cInt32\u003e] [-BufferCount \u003cInt32\u003e] [-EnableException] [-AzureCredential \u003cString\u003e] [-GetBackupInformation \u003cString\u003e] [-StopAfterGetBackupInformation] [-SelectBackupInformation \u003cString\u003e] [-StopAfterSelectBackupInformation] [-FormatBackupInformation \u003cString\u003e] [-StopAfterFormatBackupInformation] [-TestBackupInformation \u003cString\u003e] [-StopAfterTestBackupInformation] -PageRestore \u003cObject\u003e \r\n-PageRestoreTailFolder \u003cString\u003e [-StatementTimeout \u003cInt32\u003e] [-AllowContinue] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]\nRestore-DbaDatabase -SqlInstance \u003cDbaInstanceParameter\u003e [-SqlCredential \u003cPSCredential\u003e] [-DatabaseName \u003cObject[]\u003e] [-OutputScriptOnly] [-EnableException] [-AzureCredential \u003cString\u003e] [-Recover] [-GetBackupInformation \u003cString\u003e] [-StopAfterGetBackupInformation] [-SelectBackupInformation \u003cString\u003e] [-StopAfterSelectBackupInformation] [-FormatBackupInformation \u003cString\u003e] [-StopAfterFormatBackupInformation] [-TestBackupInformation \u003cString\u003e] [-StopAfterTestBackupInformation] [-StatementTimeout \u003cInt32\u003e] [-AllowContinue] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Restore-DbaDbCertificate", + "Name": "Restore-DbaDbCertificate", "Description": "Imports certificates from.cer files using SMO.", "Tags": [ "Migration", "Certificate" ], + "Synopsis": "Imports certificates from .cer files using SMO.", + "Alias": "Restore-DbaDatabaseCertificate", + "Author": "Jess Pomfret (@jpomfret), jesspomfret.com", + "CommandName": "Restore-DbaDbCertificate", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Restore-DbaDbCertificate", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eRestore-DbaDbCertificate -SqlInstance Server1 -Path \\\\Server1\\Certificates -SecurePassword (ConvertTo-SecureString -Force -AsPlainText GoodPass1234!!)\nRestores all the certificates in the specified path, password is used to both decrypt and encrypt the private key.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eRestore-DbaDbCertificate -SqlInstance Server1 -Path \\\\Server1\\Certificates\\DatabaseTDE.cer -SecurePassword (ConvertTo-SecureString -force -AsPlainText GoodPass1234!!)\nRestores the DatabaseTDE certificate to Server1 and uses the MasterKey to encrypt the private key.", "Params": [ [ "SqlInstance", @@ -32848,16 +34465,10 @@ "" ] ], - "Alias": "Restore-DbaDatabaseCertificate", - "Author": "Jess Pomfret (@jpomfret), jesspomfret.com", - "Synopsis": "Imports certificates from .cer files using SMO.", - "Name": "Restore-DbaDbCertificate", - "Links": "https://dbatools.io/Restore-DbaDbCertificate", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eRestore-DbaDbCertificate -SqlInstance Server1 -Path \\\\Server1\\Certificates -SecurePassword (ConvertTo-SecureString -Force -AsPlainText GoodPass1234!!)\nRestores all the certificates in the specified path, password is used to both decrypt and encrypt the private key.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eRestore-DbaDbCertificate -SqlInstance Server1 -Path \\\\Server1\\Certificates\\DatabaseTDE.cer -SecurePassword (ConvertTo-SecureString -force -AsPlainText GoodPass1234!!)\nRestores the DatabaseTDE certificate to Server1 and uses the MasterKey to encrypt the private key.", "Syntax": "Restore-DbaDbCertificate [-SqlInstance] \u003cDbaInstanceParameter\u003e [[-SqlCredential] \u003cPSCredential\u003e] [-Path] \u003cObject[]\u003e [[-EncryptionPassword] \u003cSecureString\u003e] [[-Database] \u003cString\u003e] [[-SecurePassword] \u003cSecureString\u003e] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Restore-DbaDbSnapshot", + "Name": "Restore-DbaDbSnapshot", "Description": "Restores the database from the snapshot, discarding every modification made to the database\nNB: Restoring to a snapshot will result in every other snapshot of the same database to be dropped\nIt also fixes some long-standing bugs in SQL Server when restoring from snapshots", "Tags": [ "Snapshot", @@ -32865,6 +34476,13 @@ "Restore", "Database" ], + "Synopsis": "Restores databases from snapshots", + "Alias": "Restore-DbaDatabaseSnapshot", + "Author": "Simone Bizzotto (@niphold)", + "CommandName": "Restore-DbaDbSnapshot", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Restore-DbaDbSnapshot", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eRestore-DbaDbSnapshot -SqlInstance sql2014 -Database HR, Accounting\nRestores HR and Accounting databases using the latest snapshot available\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eRestore-DbaDbSnapshot -SqlInstance sql2014 -Database HR -Force\nRestores HR database from latest snapshot and kills any active connections in the database on sql2014.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaDbSnapshot -SqlInstance sql2016 -Database HR | Restore-DbaDbSnapshot -Force\nRestores HR database from latest snapshot and kills any active connections in the database on sql2016.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaDbSnapshot -SqlInstance sql2016 | Out-GridView -PassThru | Restore-DbaDbSnapshot\nAllows the selection of snapshots on sql2016 to restore\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eRestore-DbaDbSnapshot -SqlInstance sql2014 -Snapshot HR_snap_20161201, Accounting_snap_20161101\nRestores databases from snapshots named HR_snap_20161201 and Accounting_snap_20161101", "Params": [ [ "SqlInstance", @@ -32947,22 +34565,23 @@ "" ] ], - "Alias": "Restore-DbaDatabaseSnapshot", - "Author": "Simone Bizzotto (@niphold)", - "Synopsis": "Restores databases from snapshots", - "Name": "Restore-DbaDbSnapshot", - "Links": "https://dbatools.io/Restore-DbaDbSnapshot", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eRestore-DbaDbSnapshot -SqlInstance sql2014 -Database HR, Accounting\nRestores HR and Accounting databases using the latest snapshot available\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eRestore-DbaDbSnapshot -SqlInstance sql2014 -Database HR -Force\nRestores HR database from latest snapshot and kills any active connections in the database on sql2014.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaDbSnapshot -SqlInstance sql2016 -Database HR | Restore-DbaDbSnapshot -Force\nRestores HR database from latest snapshot and kills any active connections in the database on sql2016.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaDbSnapshot -SqlInstance sql2016 | Out-GridView -PassThru | Restore-DbaDbSnapshot\nAllows the selection of snapshots on sql2016 to restore\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eRestore-DbaDbSnapshot -SqlInstance sql2014 -Snapshot HR_snap_20161201, Accounting_snap_20161101\nRestores databases from snapshots named HR_snap_20161201 and Accounting_snap_20161101", "Syntax": "Restore-DbaDbSnapshot [[-SqlInstance] \u003cDbaInstanceParameter[]\u003e] [[-SqlCredential] \u003cPSCredential\u003e] [[-Database] \u003cObject[]\u003e] [[-ExcludeDatabase] \u003cObject[]\u003e] [[-Snapshot] \u003cObject[]\u003e] [[-InputObject] \u003cDatabase[]\u003e] [-Force] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Resume-DbaAgDbDataMovement", + "Name": "Resume-DbaAgDbDataMovement", "Description": "Resumes data movement for an availability group database on a SQL Server instance.", "Tags": [ "AvailabilityGroup", "HA", "AG" ], + "Synopsis": "Resumes data movement for an availability group database on a SQL Server instance.", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Resume-DbaAgDbDataMovement", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Resume-DbaAgDbDataMovement", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eResume-DbaAgDbDataMovement -SqlInstance sql2017a -AvailabilityGroup ag1 -Database db1, db2\nResumes data movement on db1 and db2 to ag1 on sql2017a. Prompts for confirmation.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaAgDatabase -SqlInstance sql2017a, sql2019 | Out-GridView -Passthru | Resume-DbaAgDbDataMovement -Confirm:$false\nResumes data movement on the selected availability group databases. Does not prompt for confirmation.", "Params": [ [ "SqlInstance", @@ -33029,22 +34648,23 @@ "" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Resumes data movement for an availability group database on a SQL Server instance.", - "Name": "Resume-DbaAgDbDataMovement", - "Links": "https://dbatools.io/Resume-DbaAgDbDataMovement", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eResume-DbaAgDbDataMovement -SqlInstance sql2017a -AvailabilityGroup ag1 -Database db1, db2\nResumes data movement on db1 and db2 to ag1 on sql2017a. Prompts for confirmation.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaAgDatabase -SqlInstance sql2017a, sql2019 | Out-GridView -Passthru | Resume-DbaAgDbDataMovement -Confirm:$false\nResumes data movement on the selected availability group databases. Does not prompt for confirmation.", "Syntax": "Resume-DbaAgDbDataMovement [[-SqlInstance] \u003cDbaInstanceParameter[]\u003e] [[-SqlCredential] \u003cPSCredential\u003e] [[-AvailabilityGroup] \u003cString\u003e] [[-Database] \u003cString[]\u003e] [[-InputObject] \u003cAvailabilityDatabase[]\u003e] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Revoke-DbaAgPermission", + "Name": "Revoke-DbaAgPermission", "Description": "Revokes endpoint and availability group permissions to a login.", "Tags": [ "AvailabilityGroup", "HA", "AG" ], + "Synopsis": "Revokes endpoint and availability group permissions to a login.", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Revoke-DbaAgPermission", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Revoke-DbaAgPermission", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eRevoke-DbaAgPermission -SqlInstance sql2017a -Type AvailabilityGroup -AvailabilityGroup SharePoint -Login ad\\spservice -Permission CreateAnyDatabase\nRemoves CreateAnyDatabase permissions from ad\\spservice on the SharePoint availability group on sql2017a. Does not prompt for confirmation.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eRevoke-DbaAgPermission -SqlInstance sql2017a -Type AvailabilityGroup -AvailabilityGroup ag1, ag2 -Login ad\\spservice -Permission CreateAnyDatabase -Confirm\nRemoves CreateAnyDatabase permissions from ad\\spservice on the ag1 and ag2 availability groups on sql2017a. Prompts for confirmation.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaLogin -SqlInstance sql2017a | Out-GridView -Passthru | Revoke-DbaAgPermission -Type EndPoint\nRevokes the selected logins Connect permissions on the DatabaseMirroring endpoint for sql2017a.", "Params": [ [ "SqlInstance", @@ -33127,22 +34747,23 @@ "" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Revokes endpoint and availability group permissions to a login.", - "Name": "Revoke-DbaAgPermission", - "Links": "https://dbatools.io/Revoke-DbaAgPermission", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eRevoke-DbaAgPermission -SqlInstance sql2017a -Type AvailabilityGroup -AvailabilityGroup SharePoint -Login ad\\spservice -Permission CreateAnyDatabase\nRemoves CreateAnyDatabase permissions from ad\\spservice on the SharePoint availability group on sql2017a. Does not prompt for confirmation.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eRevoke-DbaAgPermission -SqlInstance sql2017a -Type AvailabilityGroup -AvailabilityGroup ag1, ag2 -Login ad\\spservice -Permission CreateAnyDatabase -Confirm\nRemoves CreateAnyDatabase permissions from ad\\spservice on the ag1 and ag2 availability groups on sql2017a. Prompts for confirmation.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaLogin -SqlInstance sql2017a | Out-GridView -Passthru | Revoke-DbaAgPermission -Type EndPoint\nRevokes the selected logins Connect permissions on the DatabaseMirroring endpoint for sql2017a.", "Syntax": "Revoke-DbaAgPermission [[-SqlInstance] \u003cDbaInstanceParameter[]\u003e] [[-SqlCredential] \u003cPSCredential\u003e] [[-Login] \u003cString[]\u003e] [[-AvailabilityGroup] \u003cString[]\u003e] [-Type] \u003cString[]\u003e [[-Permission] \u003cString[]\u003e] [[-InputObject] \u003cLogin[]\u003e] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Save-DbaDiagnosticQueryScript", + "Name": "Save-DbaDiagnosticQueryScript", "Description": "The dbatools module will have the diagnostic queries pre-installed. Use this only to update to a more recent version or specific versions.\n\nThis function is mainly used by Invoke-DbaDiagnosticQuery, but can also be used independently to download the Glenn Berry DMV scripts.\n\nUse this function to pre-download the scripts from a device with an Internet connection.\n\nThe function Invoke-DbaDiagnosticQuery will try to download these scripts automatically, but it obviously needs an internet connection to do that.", "Tags": [ "Diagnostic", "DMV", "Troubleshooting" ], + "Synopsis": "Save-DbaDiagnosticQueryScript downloads the most recent version of all Glenn Berry DMV scripts", + "Alias": "", + "Author": "Andre Kamman (@AndreKamman), http://clouddba.io", + "CommandName": "Save-DbaDiagnosticQueryScript", + "Availability": "Windows, Linux, macOS", + "Links": null, + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eSave-DbaDiagnosticQueryScript -Path c:\\temp\nDownloads the most recent version of all Glenn Berry DMV scripts to the specified location.\r\nIf Path is not specified, the \"My Documents\" location will be used.", "Params": [ [ "Path", @@ -33161,21 +34782,22 @@ "False" ] ], - "Alias": "", - "Author": "Andre Kamman (@AndreKamman), http://clouddba.io", - "Synopsis": "Save-DbaDiagnosticQueryScript downloads the most recent version of all Glenn Berry DMV scripts", - "Name": "Save-DbaDiagnosticQueryScript", - "Links": null, - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eSave-DbaDiagnosticQueryScript -Path c:\\temp\nDownloads the most recent version of all Glenn Berry DMV scripts to the specified location.\r\nIf Path is not specified, the \"My Documents\" location will be used.", "Syntax": "Save-DbaDiagnosticQueryScript [[-Path] \u003cFileInfo\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Select-DbaBackupInformation", + "Name": "Select-DbaBackupInformation", "Description": "Select-DbaBackupInformation filters out a subset of backups from the dbatools backup history object with parameters supplied.", "Tags": [ "Backup", "Restore" ], + "Synopsis": "Select a subset of backups from a dbatools backup history object", + "Alias": "", + "Author": "Stuart Moore (@napalmgram), stuart-moore.com", + "CommandName": "Select-DbaBackupInformation", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Select-DbaBackupInformation", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003e$Backups = Get-DbaBackupInformation -SqlInstance Server1 -Path \\\\server1\\backups$\nPS C:\\\u003e $FilteredBackups = $Backups | Select-DbaBackupInformation -RestoreTime (Get-Date).AddHours(-1)\nReturns all backups needed to restore all the backups in \\\\server1\\backups$ to 1 hour ago\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003e$Backups = Get-DbaBackupInformation -SqlInstance Server1 -Path \\\\server1\\backups$\nPS C:\\\u003e $FilteredBackups = $Backups | Select-DbaBackupInformation -RestoreTime (Get-Date).AddHours(-1) -DatabaseName ProdFinance\nReturns all the backups needed to restore Database ProdFinance to an hour ago\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003e$Backups = Get-DbaBackupInformation -SqlInstance Server1 -Path \\\\server1\\backups$\nPS C:\\\u003e $FilteredBackups = $Backups | Select-DbaBackupInformation -RestoreTime (Get-Date).AddHours(-1) -IgnoreLogs\nReturns all the backups in \\\\server1\\backups$ to restore to as close prior to 1 hour ago as can be managed with only full and differential backups\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003e$Backups = Get-DbaBackupInformation -SqlInstance Server1 -Path \\\\server1\\backups$\nPS C:\\\u003e $FilteredBackups = $Backups | Select-DbaBackupInformation -RestoreTime (Get-Date).AddHours(-1) -IgnoreDiffs\nReturns all the backups in \\\\server1\\backups$ to restore to 1 hour ago using only Full and Diff backups.", "Params": [ [ "BackupHistory", @@ -33250,21 +34872,22 @@ "False" ] ], - "Alias": "", - "Author": "Stuart Moore (@napalmgram), stuart-moore.com", - "Synopsis": "Select a subset of backups from a dbatools backup history object", - "Name": "Select-DbaBackupInformation", - "Links": "https://dbatools.io/Select-DbaBackupInformation", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003e$Backups = Get-DbaBackupInformation -SqlInstance Server1 -Path \\\\server1\\backups$\nPS C:\\\u003e $FilteredBackups = $Backups | Select-DbaBackupInformation -RestoreTime (Get-Date).AddHours(-1)\nReturns all backups needed to restore all the backups in \\\\server1\\backups$ to 1 hour ago\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003e$Backups = Get-DbaBackupInformation -SqlInstance Server1 -Path \\\\server1\\backups$\nPS C:\\\u003e $FilteredBackups = $Backups | Select-DbaBackupInformation -RestoreTime (Get-Date).AddHours(-1) -DatabaseName ProdFinance\nReturns all the backups needed to restore Database ProdFinance to an hour ago\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003e$Backups = Get-DbaBackupInformation -SqlInstance Server1 -Path \\\\server1\\backups$\nPS C:\\\u003e $FilteredBackups = $Backups | Select-DbaBackupInformation -RestoreTime (Get-Date).AddHours(-1) -IgnoreLogs\nReturns all the backups in \\\\server1\\backups$ to restore to as close prior to 1 hour ago as can be managed with only full and differential backups\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003e$Backups = Get-DbaBackupInformation -SqlInstance Server1 -Path \\\\server1\\backups$\nPS C:\\\u003e $FilteredBackups = $Backups | Select-DbaBackupInformation -RestoreTime (Get-Date).AddHours(-1) -IgnoreDiffs\nReturns all the backups in \\\\server1\\backups$ to restore to 1 hour ago using only Full and Diff backups.", "Syntax": "Select-DbaBackupInformation [-BackupHistory] \u003cObject\u003e [[-RestoreTime] \u003cDateTime\u003e] [-IgnoreLogs] [-IgnoreDiffs] [[-DatabaseName] \u003cString[]\u003e] [[-ServerName] \u003cString[]\u003e] [[-ContinuePoints] \u003cObject\u003e] [[-LastRestoreType] \u003cObject\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Set-DbaAgentAlert", + "Name": "Set-DbaAgentAlert", "Description": "Set-DbaAgentAlert updates an alert in the SQL Server Agent with parameters supplied.", "Tags": [ "Agent", "Alert" ], + "Synopsis": "Set-DbaAgentAlert updates the status of a SQL Agent Alert.", + "Alias": "", + "Author": "Garry Bargsley (@gbargsley), garrybargsley.com", + "CommandName": "Set-DbaAgentAlert", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Set-DbaAgentAlert", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eSet-DbaAgentAlert -SqlInstance sql1 -Alert \u0027Severity 025: Fatal Error\u0027 -Disabled\nChanges the alert to disabled.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eSet-DbaAgentAlert -SqlInstance sql1 -Alert \u0027Severity 025: Fatal Error\u0027, \u0027Error Number 825\u0027, \u0027Error Number 824\u0027 -Enabled\nChanges multiple alerts to enabled.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eSet-DbaAgentAlert -SqlInstance sql1, sql2, sql3 -Alert \u0027Severity 025: Fatal Error\u0027, \u0027Error Number 825\u0027, \u0027Error Number 824\u0027 -Enabled\nChanges multiple alerts to enabled on multiple servers.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eSet-DbaAgentAlert -SqlInstance sql1 -Alert \u0027Severity 025: Fatal Error\u0027 -Disabled -WhatIf\nDoesn\u0027t Change the alert but shows what would happen.", "Params": [ [ "SqlInstance", @@ -33355,21 +34978,22 @@ "" ] ], - "Alias": "", - "Author": "Garry Bargsley (@gbargsley), garrybargsley.com", - "Synopsis": "Set-DbaAgentAlert updates a the status of a SQL Agent Alert.", - "Name": "Set-DbaAgentAlert", - "Links": "https://dbatools.io/Set-DbaAgentAlert", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eSet-DbaAgentAlert -SqlInstance sql1 -Alert \u0027Severity 025: Fatal Error\u0027 -Disabled\nChanges the alert to disabled.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eSet-DbaAgentAlert -SqlInstance sql1 -Alert \u0027Severity 025: Fatal Error\u0027, \u0027Error Number 825\u0027, \u0027Error Number 824\u0027 -Enabled\nChanges multiple alerts to enabled.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eSet-DbaAgentAlert -SqlInstance sql1, sql2, sql3 -Alert \u0027Severity 025: Fatal Error\u0027, \u0027Error Number 825\u0027, \u0027Error Number 824\u0027 -Enabled\nChanges multiple alerts to enabled on multiple servers.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eSet-DbaAgentAlert -SqlInstance sql1 -Alert \u0027Severity 025: Fatal Error\u0027 -Disabled -WhatIf\nDoesn\u0027t Change the alert but shows what would happen.", "Syntax": "Set-DbaAgentAlert [[-SqlInstance] \u003cDbaInstanceParameter[]\u003e] [[-SqlCredential] \u003cPSCredential\u003e] [[-Alert] \u003cObject[]\u003e] [[-NewName] \u003cString\u003e] [-Enabled] [-Disabled] [-Force] [[-InputObject] \u003cAlert[]\u003e] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Set-DbaAgentJob", + "Name": "Set-DbaAgentJob", "Description": "Set-DbaAgentJob updates a job in the SQL Server Agent with parameters supplied.", "Tags": [ "Agent", "Job" ], + "Synopsis": "Set-DbaAgentJob updates a job.", + "Alias": "", + "Author": "Sander Stad (@sqlstad), sqlstad.nl", + "CommandName": "Set-DbaAgentJob", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Set-DbaAgentJob", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eSet-DbaAgentJob sql1 -Job Job1 -Disabled\nChanges the job to disabled\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eSet-DbaAgentJob sql1 -Job Job1 -OwnerLogin user1\nChanges the owner of the job\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eSet-DbaAgentJob -SqlInstance sql1 -Job Job1 -EventLogLevel OnSuccess\nChanges the job and sets the notification to write to the Windows Application event log on success\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eSet-DbaAgentJob -SqlInstance sql1 -Job Job1 -EmailLevel OnFailure -EmailOperator dba\nChanges the job and sets the notification to send an e-mail to the e-mail operator\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eSet-DbaAgentJob -SqlInstance sql1 -Job Job1, Job2, Job3 -Enabled\nChanges multiple jobs to enabled\n-------------------------- EXAMPLE 6 --------------------------\nPS C:\\\u003eSet-DbaAgentJob -SqlInstance sql1, sql2, sql3 -Job Job1, Job2, Job3 -Enabled\nChanges multiple jobs to enabled on multiple servers\n-------------------------- EXAMPLE 7 --------------------------\nPS C:\\\u003eSet-DbaAgentJob -SqlInstance sql1 -Job Job1 -Description \u0027Just another job\u0027 -Whatif\nDoesn\u0027t Change the job but shows what would happen.\n-------------------------- EXAMPLE 8 --------------------------\nPS C:\\\u003eSet-DbaAgentJob -SqlInstance sql1, sql2, sql3 -Job \u0027Job One\u0027 -Description \u0027Job One\u0027\nChanges a job with the name \"Job1\" on multiple servers to have another description\n-------------------------- EXAMPLE 9 --------------------------\nPS C:\\\u003esql1, sql2, sql3 | Set-DbaAgentJob -Job Job1 -Description \u0027Job One\u0027\nChanges a job with the name \"Job1\" on multiple servers to have another description using pipe line", "Params": [ [ "SqlInstance", @@ -33572,22 +35196,23 @@ "" ] ], - "Alias": "", - "Author": "Sander Stad (@sqlstad), sqlstad.nl", - "Synopsis": "Set-DbaAgentJob updates a job.", - "Name": "Set-DbaAgentJob", - "Links": "https://dbatools.io/Set-DbaAgentJob", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eSet-DbaAgentJob sql1 -Job Job1 -Disabled\nChanges the job to disabled\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eSet-DbaAgentJob sql1 -Job Job1 -OwnerLogin user1\nChanges the owner of the job\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eSet-DbaAgentJob -SqlInstance sql1 -Job Job1 -EventLogLevel OnSuccess\nChanges the job and sets the notification to write to the Windows Application event log on success\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eSet-DbaAgentJob -SqlInstance sql1 -Job Job1 -EmailLevel OnFailure -EmailOperator dba\nChanges the job and sets the notification to send an e-mail to the e-mail operator\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eSet-DbaAgentJob -SqlInstance sql1 -Job Job1, Job2, Job3 -Enabled\nChanges multiple jobs to enabled\n-------------------------- EXAMPLE 6 --------------------------\nPS C:\\\u003eSet-DbaAgentJob -SqlInstance sql1, sql2, sql3 -Job Job1, Job2, Job3 -Enabled\nChanges multiple jobs to enabled on multiple servers\n-------------------------- EXAMPLE 7 --------------------------\nPS C:\\\u003eSet-DbaAgentJob -SqlInstance sql1 -Job Job1 -Description \u0027Just another job\u0027 -Whatif\nDoesn\u0027t Change the job but shows what would happen.\n-------------------------- EXAMPLE 8 --------------------------\nPS C:\\\u003eSet-DbaAgentJob -SqlInstance sql1, sql2, sql3 -Job \u0027Job One\u0027 -Description \u0027Job One\u0027\nChanges a job with the name \"Job1\" on multiple servers to have another description\n-------------------------- EXAMPLE 9 --------------------------\nPS C:\\\u003esql1, sql2, sql3 | Set-DbaAgentJob -Job Job1 -Description \u0027Job One\u0027\nChanges a job with the name \"Job1\" on multiple servers to have another description using pipe line", "Syntax": "Set-DbaAgentJob [[-SqlInstance] \u003cDbaInstanceParameter[]\u003e] [[-SqlCredential] \u003cPSCredential\u003e] [[-Job] \u003cObject[]\u003e] [[-Schedule] \u003cObject[]\u003e] [[-ScheduleId] \u003cInt32[]\u003e] [[-NewName] \u003cString\u003e] [-Enabled] [-Disabled] [[-Description] \u003cString\u003e] [[-StartStepId] \u003cInt32\u003e] [[-Category] \u003cString\u003e] [[-OwnerLogin] \u003cString\u003e] [[-EventLogLevel] \u003cObject\u003e] [[-EmailLevel] \u003cObject\u003e] [[-NetsendLevel] \u003cObject\u003e] [[-PageLevel] \u003cObject\u003e] [[-EmailOperator] \u003cString\u003e] [[-NetsendOperator] \u003cString\u003e] [[-PageOperator] \u003cString\u003e] [[-DeleteLevel] \u003cObject\u003e] [-Force] [[-InputObject] \u003cJob[]\u003e] [-EnableException] [-WhatIf] [-Confirm] \r\n[\u003cCommonParameters\u003e]" }, { - "CommandName": "Set-DbaAgentJobCategory", + "Name": "Set-DbaAgentJobCategory", "Description": "Set-DbaAgentJobCategory makes it possible to change a job category.", "Tags": [ "Agent", "Job", "JobCategory" ], + "Synopsis": "Set-DbaAgentJobCategory changes a job category.", + "Alias": "", + "Author": "Sander Stad (@sqlstad), sqlstad.nl", + "CommandName": "Set-DbaAgentJobCategory", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Set-DbaAgentJobCategory", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eNew-DbaAgentJobCategory -SqlInstance sql1 -Category \u0027Category 1\u0027 -NewName \u0027Category 2\u0027\nChange the name of the category from \u0027Category 1\u0027 to \u0027Category 2\u0027.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eSet-DbaAgentJobCategory -SqlInstance sql1, sql2 -Category Category1, Category2 -NewName cat1, cat2\nRename multiple jobs in one go on multiple servers.", "Params": [ [ "SqlInstance", @@ -33654,22 +35279,23 @@ "" ] ], - "Alias": "", - "Author": "Sander Stad (@sqlstad), sqlstad.nl", - "Synopsis": "Set-DbaAgentJobCategory changes a job category.", - "Name": "Set-DbaAgentJobCategory", - "Links": "https://dbatools.io/Set-DbaAgentJobCategory", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eNew-DbaAgentJobCategory -SqlInstance sql1 -Category \u0027Category 1\u0027 -NewName \u0027Category 2\u0027\nChange the name of the category from \u0027Category 1\u0027 to \u0027Category 2\u0027.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eSet-DbaAgentJobCategory -SqlInstance sql1, sql2 -Category Category1, Category2 -NewName cat1, cat2\nRename multiple jobs in one go on multiple servers.", "Syntax": "Set-DbaAgentJobCategory [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [[-Category] \u003cString[]\u003e] [[-NewName] \u003cString[]\u003e] [-Force] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Set-DbaAgentJobOutputFile", + "Name": "Set-DbaAgentJobOutputFile", "Description": "Sets the Output File for a step of an agent job with the Job Names and steps provided dynamically if required", "Tags": [ "Agent", "Job", "SqlAgent" ], + "Synopsis": "Set the output file for a step within an Agent job.", + "Alias": "", + "Author": "Rob Sewell, https://sqldbawithabeard.com", + "CommandName": "Set-DbaAgentJobOutputFile", + "Availability": "Windows only", + "Links": null, + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eSet-DbaAgentJobOutputFile -SqlInstance SERVERNAME -Job \u0027The Agent Job\u0027 -OutPutFile E:\\Logs\\AgentJobStepOutput.txt\nSets the Job step for The Agent job on SERVERNAME to E:\\Logs\\AgentJobStepOutput.txt", "Params": [ [ "SqlInstance", @@ -33736,21 +35362,22 @@ "" ] ], - "Alias": "", - "Author": "Rob Sewell, https://sqldbawithabeard.com", - "Synopsis": "Set the output file for a step within an Agent job.", - "Name": "Set-DbaAgentJobOutputFile", - "Links": null, - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eSet-DbaAgentJobOutputFile -SqlInstance SERVERNAME -Job \u0027The Agent Job\u0027 -OutPutFile E:\\Logs\\AgentJobStepOutput.txt\nSets the Job step for The Agent job on SERVERNAME to E:\\Logs\\AgentJobStepOutput.txt", "Syntax": "Set-DbaAgentJobOutputFile [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [-SqlCredential \u003cPSCredential\u003e] [-Job \u003cObject[]\u003e] [-Step \u003cObject[]\u003e] -OutputFile \u003cString\u003e [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Set-DbaAgentJobOwner", + "Name": "Set-DbaAgentJobOwner", "Description": "This function alters SQL Agent Job ownership to match a specified login if their current owner does not match the target login. By default, the target login will be \u0027sa\u0027,\nbut the the user may specify a different login for ownership. This be applied to all jobs or only to a select collection of jobs.\n\nBest practice reference: http://sqlmag.com/blog/sql-server-tip-assign-ownership-jobs-sysadmin-account\n\nIf the \u0027sa\u0027 account was renamed, the new name will be used.", "Tags": [ "Agent", "Job" ], + "Synopsis": "Sets SQL Agent job owners with a desired login if jobs do not match that owner.", + "Alias": "Set-DbaJobOwner", + "Author": "Michael Fal (@Mike_Fal), http://mikefal.net", + "CommandName": "Set-DbaAgentJobOwner", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Set-DbaAgentJobOwner", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eSet-DbaAgentJobOwner -SqlInstance localhost\nSets SQL Agent Job owner to sa on all jobs where the owner does not match sa.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eSet-DbaAgentJobOwner -SqlInstance localhost -Login DOMAIN\\account\nSets SQL Agent Job owner to \u0027DOMAIN\\account\u0027 on all jobs where the owner does not match \u0027DOMAIN\\account\u0027. Note\r\nthat Login must be a valid security principal that exists on the target server.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eSet-DbaAgentJobOwner -SqlInstance localhost -Job job1, job2\nSets SQL Agent Job owner to \u0027sa\u0027 on the job1 and job2 jobs if their current owner does not match \u0027sa\u0027.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003e\u0027sqlserver\u0027,\u0027sql2016\u0027 | Set-DbaAgentJobOwner\nSets SQL Agent Job owner to sa on all jobs where the owner does not match sa on both sqlserver and sql2016.\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eGet-DbaAgentJob -SqlInstance vmsql | Where-Object OwnerLoginName -eq login1 | Set-DbaAgentJobOwner -TargetLogin login2 | Out-Gridview\nSets SQL Agent Job owner to login2 where their current owner is login1 on instance vmsql. Send result to gridview.", "Params": [ [ "SqlInstance", @@ -33825,29 +35452,30 @@ "" ] ], - "Alias": "Set-DbaJobOwner", - "Author": "Michael Fal (@Mike_Fal), http://mikefal.net", - "Synopsis": "Sets SQL Agent job owners with a desired login if jobs do not match that owner.", - "Name": "Set-DbaAgentJobOwner", - "Links": "https://dbatools.io/Set-DbaAgentJobOwner", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eSet-DbaAgentJobOwner -SqlInstance localhost\nSets SQL Agent Job owner to sa on all jobs where the owner does not match sa.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eSet-DbaAgentJobOwner -SqlInstance localhost -Login DOMAIN\\account\nSets SQL Agent Job owner to \u0027DOMAIN\\account\u0027 on all jobs where the owner does not match \u0027DOMAIN\\account\u0027. Note\r\nthat Login must be a valid security principal that exists on the target server.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eSet-DbaAgentJobOwner -SqlInstance localhost -Job job1, job2\nSets SQL Agent Job owner to \u0027sa\u0027 on the job1 and job2 jobs if their current owner does not match \u0027sa\u0027.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003e\u0027sqlserver\u0027,\u0027sql2016\u0027 | Set-DbaAgentJobOwner\nSets SQL Agent Job owner to sa on all jobs where the owner does not match sa on both sqlserver and sql2016.\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eGet-DbaAgentJob -SqlInstance vmsql | Where-Object OwnerLoginName -eq login1 | Set-DbaAgentJobOwner -TargetLogin login2 | Out-Gridview\nSets SQL Agent Job owner to login2 where their current owner is login1 on instance vmsql. Send result to gridview.", "Syntax": "Set-DbaAgentJobOwner [[-SqlInstance] \u003cDbaInstanceParameter[]\u003e] [[-SqlCredential] \u003cPSCredential\u003e] [[-Job] \u003cObject[]\u003e] [[-ExcludeJob] \u003cObject[]\u003e] [[-InputObject] \u003cJob[]\u003e] [[-Login] \u003cString\u003e] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Set-DbaAgentJobStep", + "Name": "Set-DbaAgentJobStep", "Description": "Set-DbaAgentJobStep updates a job step in the SQL Server Agent with parameters supplied.", "Tags": [ "Agent", "Job", "JobStep" ], + "Synopsis": "Set-DbaAgentJobStep updates a job step.", + "Alias": "", + "Author": "Sander Stad (@sqlstad), sqlstad.nl", + "CommandName": "Set-DbaAgentJobStep", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Set-DbaAgentJobStep", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eSet-DbaAgentJobStep -SqlInstance sql1 -Job Job1 -StepName Step1 -NewName Step2\nChanges the name of the step in \"Job1\" with the name Step1 to Step2\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eSet-DbaAgentJobStep -SqlInstance sql1 -Job Job1 -StepName Step1 -Database msdb\nChanges the database of the step in \"Job1\" with the name Step1 to msdb\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eSet-DbaAgentJobStep -SqlInstance sql1 -Job Job1, Job2 -StepName Step1 -Database msdb\nChanges job steps in multiple jobs with the name Step1 to msdb\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eSet-DbaAgentJobStep -SqlInstance sql1, sql2, sql3 -Job Job1, Job2 -StepName Step1 -Database msdb\nChanges job steps in multiple jobs on multiple servers with the name Step1 to msdb\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eSet-DbaAgentJobStep -SqlInstance sql1, sql2, sql3 -Job Job1 -StepName Step1 -Database msdb\nChanges the database of the step in \"Job1\" with the name Step1 to msdb for multiple servers\n-------------------------- EXAMPLE 6 --------------------------\nPS C:\\\u003esql1, sql2, sql3 | Set-DbaAgentJobStep -Job Job1 -StepName Step1 -Database msdb\nChanges the database of the step in \"Job1\" with the name Step1 to msdb for multiple servers using pipeline", "Params": [ [ "SqlInstance", "The target SQL Server instance or instances. You must have sysadmin access and server version must be SQL Server version 2000 or greater.", - "ServerInstance,SqlServer", + "", true, - "true (ByValue)", + "false", "" ], [ @@ -33862,7 +35490,7 @@ "Job", "The name of the job. Can be null if the the job id is being used.", "", - true, + false, "false", "" ], @@ -33870,7 +35498,7 @@ "StepName", "The name of the step.", "", - true, + false, "false", "" ], @@ -33890,6 +35518,14 @@ "false", "" ], + [ + "SubsystemServer", + "The subsystems AnalysisScripting, AnalysisCommand, AnalysisQuery ned the server property to be able to apply", + "", + false, + "false", + "" + ], [ "Command", "The commands to be executed by SQLServerAgent service through subsystem.", @@ -33994,10 +35630,18 @@ "false", "" ], + [ + "InputObject", + "Enables piping job objects", + "", + false, + "true (ByValue)", + "" + ], [ "EnableException", "By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message.\r\nThis avoids overwhelming you with \"sea of red\" exceptions, but is inconvenient because it basically disables advanced scripting.\r\nUsing this switch turns this \"nice by default\" feature off and enables you to catch exceptions with your own try/catch.", - "Silent", + "", false, "false", "False" @@ -34027,22 +35671,23 @@ "" ] ], - "Alias": "", - "Author": "Sander Stad (@sqlstad), sqlstad.nl", - "Synopsis": "Set-DbaAgentJobStep updates a job step.", - "Name": "Set-DbaAgentJobStep", - "Links": "https://dbatools.io/Set-DbaAgentJobStep", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eSet-DbaAgentJobStep -SqlInstance sql1 -Job Job1 -StepName Step1 -NewName Step2\nChanges the name of the step in \"Job1\" with the name Step1 to Step2\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eSet-DbaAgentJobStep -SqlInstance sql1 -Job Job1 -StepName Step1 -Database msdb\nChanges the database of the step in \"Job1\" with the name Step1 to msdb\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eSet-DbaAgentJobStep -SqlInstance sql1 -Job Job1, Job2 -StepName Step1 -Database msdb\nChanges job steps in multiple jobs with the name Step1 to msdb\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eSet-DbaAgentJobStep -SqlInstance sql1, sql2, sql3 -Job Job1, Job2 -StepName Step1 -Database msdb\nChanges job steps in multiple jobs on multiple servers with the name Step1 to msdb\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eSet-DbaAgentJobStep -SqlInstance sql1, sql2, sql3 -Job Job1 -StepName Step1 -Database msdb\nChanges the database of the step in \"Job1\" with the name Step1 to msdb for multiple servers\n-------------------------- EXAMPLE 6 --------------------------\nPS C:\\\u003esql1, sql2, sql3 | Set-DbaAgentJobStep -Job Job1 -StepName Step1 -Database msdb\nChanges the database of the step in \"Job1\" with the name Step1 to msdb for multiple servers using pipeline", - "Syntax": "Set-DbaAgentJobStep [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [-Job] \u003cObject[]\u003e [-StepName] \u003cString\u003e [[-NewName] \u003cString\u003e] [[-Subsystem] \u003cString\u003e] [[-Command] \u003cString\u003e] [[-CmdExecSuccessCode] \u003cInt32\u003e] [[-OnSuccessAction] \u003cString\u003e] [[-OnSuccessStepId] \u003cInt32\u003e] [[-OnFailAction] \u003cString\u003e] [[-OnFailStepId] \u003cInt32\u003e] [[-Database] \u003cString\u003e] [[-DatabaseUser] \u003cString\u003e] [[-RetryAttempts] \u003cInt32\u003e] [[-RetryInterval] \u003cInt32\u003e] [[-OutputFileName] \u003cString\u003e] [[-Flag] \u003cString[]\u003e] [[-ProxyName] \u003cString\u003e] [-EnableException] [-Force] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" + "Syntax": "Set-DbaAgentJobStep [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [[-Job] \u003cObject[]\u003e] [[-StepName] \u003cString\u003e] [[-NewName] \u003cString\u003e] [[-Subsystem] \u003cString\u003e] [[-SubsystemServer] \u003cString\u003e] [[-Command] \u003cString\u003e] [[-CmdExecSuccessCode] \u003cInt32\u003e] [[-OnSuccessAction] \u003cString\u003e] [[-OnSuccessStepId] \u003cInt32\u003e] [[-OnFailAction] \u003cString\u003e] [[-OnFailStepId] \u003cInt32\u003e] [[-Database] \u003cString\u003e] [[-DatabaseUser] \u003cString\u003e] [[-RetryAttempts] \u003cInt32\u003e] [[-RetryInterval] \u003cInt32\u003e] [[-OutputFileName] \u003cString\u003e] [[-Flag] \u003cString[]\u003e] [[-ProxyName] \u003cString\u003e] [[-InputObject] \u003cJobStep[]\u003e] \r\n[-EnableException] [-Force] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Set-DbaAgentSchedule", + "Name": "Set-DbaAgentSchedule", "Description": "Set-DbaAgentSchedule will help update a schedule for a job. It does not attach the schedule to a job.", "Tags": [ "Agent", "Job", "JobStep" ], + "Synopsis": "Set-DbaAgentSchedule updates a schedule in the msdb database.", + "Alias": "", + "Author": "Sander Stad (@sqlstad, sqlstad.nl)", + "CommandName": "Set-DbaAgentSchedule", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Set-DbaAgentSchedule", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eSet-DbaAgentSchedule -SqlInstance sql1 -Job Job1 -ScheduleName daily -Enabled\nChanges the schedule for Job1 with the name \u0027daily\u0027 to enabled\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eSet-DbaAgentSchedule -SqlInstance sql1 -Job Job1 -ScheduleName daily -NewName weekly -FrequencyType Weekly -FrequencyInterval Monday, Wednesday, Friday\nChanges the schedule for Job1 with the name daily to have a new name weekly\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eSet-DbaAgentSchedule -SqlInstance sql1 -Job Job1, Job2, Job3 -ScheduleName daily -StartTime \u0027230000\u0027\nChanges the start time of the schedule for Job1 to 11 PM for multiple jobs\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eSet-DbaAgentSchedule -SqlInstance sql1, sql2, sql3 -Job Job1 -ScheduleName daily -Enabled\nChanges the schedule for Job1 with the name daily to enabled on multiple servers\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003esql1, sql2, sql3 | Set-DbaAgentSchedule -Job Job1 -ScheduleName \u0027daily\u0027 -Enabled\nChanges the schedule for Job1 with the name \u0027daily\u0027 to enabled on multiple servers using pipe line", "Params": [ [ "SqlInstance", @@ -34213,21 +35858,22 @@ "" ] ], - "Alias": "", - "Author": "Sander Stad (@sqlstad, sqlstad.nl)", - "Synopsis": "Set-DbaAgentSchedule updates a schedule in the msdb database.", - "Name": "Set-DbaAgentSchedule", - "Links": "https://dbatools.io/Set-DbaAgentSchedule", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eSet-DbaAgentSchedule -SqlInstance sql1 -Job Job1 -ScheduleName daily -Enabled\nChanges the schedule for Job1 with the name \u0027daily\u0027 to enabled\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eSet-DbaAgentSchedule -SqlInstance sql1 -Job Job1 -ScheduleName daily -NewName weekly -FrequencyType Weekly -FrequencyInterval Monday, Wednesday, Friday\nChanges the schedule for Job1 with the name daily to have a new name weekly\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eSet-DbaAgentSchedule -SqlInstance sql1 -Job Job1, Job2, Job3 -ScheduleName daily -StartTime \u0027230000\u0027\nChanges the start time of the schedule for Job1 to 11 PM for multiple jobs\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eSet-DbaAgentSchedule -SqlInstance sql1, sql2, sql3 -Job Job1 -ScheduleName daily -Enabled\nChanges the schedule for Job1 with the name daily to enabled on multiple servers\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003esql1, sql2, sql3 | Set-DbaAgentSchedule -Job Job1 -ScheduleName \u0027daily\u0027 -Enabled\nChanges the schedule for Job1 with the name \u0027daily\u0027 to enabled on multiple servers using pipe line", "Syntax": "Set-DbaAgentSchedule [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [-Job] \u003cObject[]\u003e [-ScheduleName] \u003cString\u003e [[-NewName] \u003cString\u003e] [-Enabled] [-Disabled] [[-FrequencyType] \u003cObject\u003e] [[-FrequencyInterval] \u003cObject[]\u003e] [[-FrequencySubdayType] \u003cObject\u003e] [[-FrequencySubdayInterval] \u003cInt32\u003e] [[-FrequencyRelativeInterval] \u003cObject\u003e] [[-FrequencyRecurrenceFactor] \u003cInt32\u003e] [[-StartDate] \u003cString\u003e] [[-EndDate] \u003cString\u003e] [[-StartTime] \u003cString\u003e] [[-EndTime] \u003cString\u003e] [-EnableException] [-Force] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Set-DbaAgentServer", + "Name": "Set-DbaAgentServer", "Description": "Set-DbaAgentServer updates properties in the SQL Server Server with parameters supplied.", "Tags": [ "Agent", "Server" ], + "Synopsis": "Set-DbaAgentServer updates properties of a SQL Agent Server.", + "Alias": "", + "Author": "Cláudio Silva (@claudioessilva), https://claudioessilva.com", + "CommandName": "Set-DbaAgentServer", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Set-DbaAgentServer", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eSet-DbaAgentServer -SqlInstance sql1 -MaximumHistoryRows 10000 -MaximumJobHistoryRows 100\nChanges the job history retention to 10000 rows with an maximum of 100 rows per job.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eSet-DbaAgentServer -SqlInstance sql1 -CpuPolling Enabled\nEnable the CPU Polling configurations.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eSet-DbaAgentServer -SqlInstance sql1, sql2, sql3 -AgentLogLevel \u0027Errors, Warnings\u0027\nSet the agent log level to Errors and Warnings on multiple servers.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eSet-DbaAgentServer -SqlInstance sql1 -CpuPolling Disabled\nDisable the CPU Polling configurations.", "Params": [ [ "SqlInstance", @@ -34438,22 +36084,23 @@ "" ] ], - "Alias": "", - "Author": "Cláudio Silva (@claudioessilva), https://claudioessilva.com", - "Synopsis": "Set-DbaAgentServer updates properties of a SQL Agent Server.", - "Name": "Set-DbaAgentServer", - "Links": "https://dbatools.io/Set-DbaAgentServer", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eSet-DbaAgentServer -SqlInstance sql1 -MaximumHistoryRows 10000 -MaximumJobHistoryRows 100\nChanges the job history retention to 10000 rows with an maximum of 100 rows per job.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eSet-DbaAgentServer -SqlInstance sql1 -CpuPolling Enabled\nEnable the CPU Polling configurations.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eSet-DbaAgentServer -SqlInstance sql1, sql2, sql3 -AgentLogLevel \u0027Errors, Warnings\u0027\nSet the agent log level to Errors and Warnings on multiple servers.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eSet-DbaAgentServer -SqlInstance sql1 -CpuPolling Disabled\nDisable the CPU Polling configurations.", "Syntax": "Set-DbaAgentServer [[-SqlInstance] \u003cDbaInstanceParameter[]\u003e] [[-SqlCredential] \u003cPSCredential\u003e] [[-InputObject] \u003cJobServer[]\u003e] [[-AgentLogLevel] \u003cObject\u003e] [[-AgentMailType] \u003cObject\u003e] [[-AgentShutdownWaitTime] \u003cInt32\u003e] [[-DatabaseMailProfile] \u003cString\u003e] [[-ErrorLogFile] \u003cString\u003e] [[-IdleCpuDuration] \u003cInt32\u003e] [[-IdleCpuPercentage] \u003cInt32\u003e] [[-CpuPolling] \u003cString\u003e] [[-LocalHostAlias] \u003cString\u003e] [[-LoginTimeout] \u003cInt32\u003e] [[-MaximumHistoryRows] \u003cInt32\u003e] [[-MaximumJobHistoryRows] \u003cInt32\u003e] [[-NetSendRecipient] \u003cString\u003e] [[-ReplaceAlertTokens] \u003cString\u003e] [[-SaveInSentFolder] \u003cString\u003e] \r\n[[-SqlAgentAutoStart] \u003cString\u003e] [[-SqlAgentMailProfile] \u003cString\u003e] [[-SqlAgentRestart] \u003cString\u003e] [[-SqlServerRestart] \u003cString\u003e] [[-WriteOemErrorLog] \u003cString\u003e] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Set-DbaAgListener", + "Name": "Set-DbaAgListener", "Description": "Sets a listener property for an availability group on a SQL Server instance.\n\nBasically, only the port is settable at this time, so this command updates the listener port.", "Tags": [ "AvailabilityGroup", "HA", "AG" ], + "Synopsis": "Sets a listener property for an availability group on a SQL Server instance.", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Set-DbaAgListener", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Set-DbaAgListener", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eSet-DbaAgListener -SqlInstance sql2017 -AvailabilityGroup SharePoint -Port 14333\nChanges the port for the SharePoint AG Listener on sql2017. Prompts for confirmation.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaAgListener -SqlInstance sql2017 | Out-GridView -Passthru | Set-DbaAgListener -Port 1433 -Confirm:$false\nChanges the port for selected AG listeners to 1433. Does not prompt for confirmation.", "Params": [ [ "SqlInstance", @@ -34528,22 +36175,23 @@ "" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Sets a listener property for an availability group on a SQL Server instance.", - "Name": "Set-DbaAgListener", - "Links": "https://dbatools.io/Set-DbaAgListener", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eSet-DbaAgListener -SqlInstance sql2017 -AvailabilityGroup SharePoint -Port 14333\nChanges the port for the SharePoint AG Listener on sql2017. Prompts for confirmation.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaAgListener -SqlInstance sql2017 | Out-GridView -Passthru | Set-DbaAgListener -Port 1433 -Confirm:$false\nChanges the port for selected AG listeners to 1433. Does not prompt for confirmation.", "Syntax": "Set-DbaAgListener [[-SqlInstance] \u003cDbaInstanceParameter[]\u003e] [[-SqlCredential] \u003cPSCredential\u003e] [[-AvailabilityGroup] \u003cString[]\u003e] [[-Listener] \u003cString[]\u003e] [-Port] \u003cInt32\u003e [[-InputObject] \u003cAvailabilityGroup[]\u003e] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Set-DbaAgReplica", + "Name": "Set-DbaAgReplica", "Description": "Sets the properties for a replica to an availability group on a SQL Server instance.\n\nAutomatically creates a database mirroring endpoint if required.", "Tags": [ "AvailabilityGroup", "HA", "AG" ], + "Synopsis": "Sets the properties for a replica to an availability group on a SQL Server instance.", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Set-DbaAgReplica", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Set-DbaAgReplica", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eSet-DbaAgReplica -SqlInstance sql2016 -Replica sql2016 -AvailabilityGroup SharePoint -BackupPriority 5000\nSets the backup priority to 5000 for the sql2016 replica for the SharePoint availability group on sql2016\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaAgReplica -SqlInstance sql2016 | Out-GridView -Passthru | Set-DbaAgReplica -BackupPriority 5000\nSets the backup priority to 5000 for the selected availability groups.", "Params": [ [ "SqlInstance", @@ -34674,22 +36322,23 @@ "" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Sets the properties for a replica to an availability group on a SQL Server instance.", - "Name": "Set-DbaAgReplica", - "Links": "https://dbatools.io/Set-DbaAgReplica", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eSet-DbaAgReplica -SqlInstance sql2016 -Replica sql2016 -AvailabilityGroup SharePoint -BackupPriority 5000\nSets the backup priority to 5000 for the sql2016 replica for the SharePoint availability group on sql2016\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaAgReplica -SqlInstance sql2016 | Out-GridView -Passthru | Set-DbaAgReplica -BackupPriority 5000\nSets the backup priority to 5000 for the selected availability groups.", "Syntax": "Set-DbaAgReplica [[-SqlInstance] \u003cDbaInstanceParameter[]\u003e] [[-SqlCredential] \u003cPSCredential\u003e] [[-AvailabilityGroup] \u003cString\u003e] [[-Replica] \u003cString\u003e] [[-AvailabilityMode] \u003cString\u003e] [[-FailoverMode] \u003cString\u003e] [[-BackupPriority] \u003cInt32\u003e] [[-ConnectionModeInPrimaryRole] \u003cString\u003e] [[-ConnectionModeInSecondaryRole] \u003cString\u003e] [[-SeedingMode] \u003cString\u003e] [[-EndpointUrl] \u003cString\u003e] [[-ReadonlyRoutingConnectionUrl] \u003cString\u003e] [[-InputObject] \u003cAvailabilityReplica\u003e] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Set-DbaAvailabilityGroup", + "Name": "Set-DbaAvailabilityGroup", "Description": "Sets availability group properties on a SQL Server instance.", "Tags": [ "AvailabilityGroup", "HA", "AG" ], + "Synopsis": "Sets availability group properties on a SQL Server instance.", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Set-DbaAvailabilityGroup", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Set-DbaAvailabilityGroup", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaAvailabilityGroup -SqlInstance sql2016 | Set-DbaAvailabilityGroup -DtcSupportEnabled\nEnables DTC for all availability groups on sql2016\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaAvailabilityGroup -SqlInstance sql2016 -AvailabilityGroup AG1 | Set-DbaAvailabilityGroup -DtcSupportEnabled:$false\nDisables DTC support for the availability group AG1\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eSet-DbaAvailabilityGroup -SqlInstance sql2016 -AvailabilityGroup AG1 -DtcSupportEnabled:$false\nDisables DTC support for the availability group AG1", "Params": [ [ "SqlInstance", @@ -34820,21 +36469,22 @@ "" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Sets availability group properties on a SQL Server instance.", - "Name": "Set-DbaAvailabilityGroup", - "Links": "https://dbatools.io/Set-DbaAvailabilityGroup", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaAvailabilityGroup -SqlInstance sql2016 | Set-DbaAvailabilityGroup -DtcSupportEnabled\nEnables DTC for all availability groups on sql2016\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaAvailabilityGroup -SqlInstance sql2016 -AvailabilityGroup AG1 | Set-DbaAvailabilityGroup -DtcSupportEnabled:$false\nDisables DTC support for the availability group AG1\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eSet-DbaAvailabilityGroup -SqlInstance sql2016 -AvailabilityGroup AG1 -DtcSupportEnabled:$false\nDisables DTC support for the availability group AG1", "Syntax": "Set-DbaAvailabilityGroup [[-SqlInstance] \u003cDbaInstanceParameter[]\u003e] [[-SqlCredential] \u003cPSCredential\u003e] [[-AvailabilityGroup] \u003cString[]\u003e] [-AllAvailabilityGroups] [-DtcSupportEnabled] [[-ClusterType] \u003cString\u003e] [[-AutomatedBackupPreference] \u003cString\u003e] [[-FailureConditionLevel] \u003cString\u003e] [[-HealthCheckTimeout] \u003cInt32\u003e] [-BasicAvailabilityGroup] [-DatabaseHealthTrigger] [-IsDistributedAvailabilityGroup] [[-InputObject] \u003cAvailabilityGroup[]\u003e] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Set-DbaCmConnection", + "Name": "Set-DbaCmConnection", "Description": "Configures a connection object for use in remote computer management.\nThis function will either create new records for computers that have no connection registered so far, or it will configure existing connections if already present.\n\nAs such it can be handy in making bulk-edits on connections or manually adjusting some settings.", "Tags": [ "ComputerManagement", "CIM" ], + "Synopsis": "Configures a connection object for use in remote computer management.", + "Alias": "", + "Author": "Friedrich Weinmann (@FredWeinmann)", + "CommandName": "Set-DbaCmConnection", + "Availability": "Windows only", + "Links": "https://dbatools.io/set-DbaCmConnection", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaCmConnection sql2014 | Set-DbaCmConnection -ClearBadCredential -UseWindowsCredentials\nRetrieves the already existing connection to sql2014, removes the list of not working credentials and configures it to default to the credentials of the logged on user.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaCmConnection | Set-DbaCmConnection -RemoveBadCredential $cred\nRemoves the credentials stored in $cred from all connections\u0027 list of \"known to not work\" credentials.\r\nHandy to update changes in privilege.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaCmConnection | Export-Clixml .\\connections.xml\nPS C:\\\u003e Import-Clixml .\\connections.xml | Set-DbaCmConnection -ResetConfiguration\nAt first, the current cached connections are stored in an xml file. At a later time - possibly in the profile when starting the console again - those connections are imported again and applied again \r\nto the connection cache.\nIn this example, the configuration settings will also be reset, since after re-import those will be set to explicit, rather than deriving them from the global settings.\r\nIn many cases, using the default settings is desirable. For specific settings, use New-DbaCmConnection as part of the profile in order to explicitly configure a connection.", "Params": [ [ "ComputerName", @@ -35021,21 +36671,22 @@ "" ] ], - "Alias": "", - "Author": "Friedrich Weinmann (@FredWeinmann)", - "Synopsis": "Configures a connection object for use in remote computer management.", - "Name": "Set-DbaCmConnection", - "Links": "https://dbatools.io/set-DbaCmConnection", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaCmConnection sql2014 | Set-DbaCmConnection -ClearBadCredential -UseWindowsCredentials\nRetrieves the already existing connection to sql2014, removes the list of not working credentials and configures it to default to the credentials of the logged on user.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaCmConnection | Set-DbaCmConnection -RemoveBadCredential $cred\nRemoves the credentials stored in $cred from all connections\u0027 list of \"known to not work\" credentials.\r\nHandy to update changes in privilege.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaCmConnection | Export-Clixml .\\connections.xml\nPS C:\\\u003e Import-Clixml .\\connections.xml | Set-DbaCmConnection -ResetConfiguration\nAt first, the current cached connections are stored in an xml file. At a later time - possibly in the profile when starting the console again - those connections are imported again and applied again \r\nto the connection cache.\nIn this example, the configuration settings will also be reset, since after re-import those will be set to explicit, rather than deriving them from the global settings.\r\nIn many cases, using the default settings is desirable. For specific settings, use New-DbaCmConnection as part of the profile in order to explicitly configure a connection.", "Syntax": "Set-DbaCmConnection [-ComputerName \u003cDbaCmConnectionParameter[]\u003e] [-Credential \u003cPSCredential\u003e] [-OverrideExplicitCredential] [-OverrideConnectionPolicy] [-DisabledConnectionTypes {None | CimRM | CimDCOM | Wmi | PowerShellRemoting}] [-DisableBadCredentialCache] [-DisableCimPersistence] [-DisableCredentialAutoRegister] [-EnableCredentialFailover] [-WindowsCredentialsAreBad] [-CimWinRMOptions \u003cWSManSessionOptions\u003e] [-CimDCOMOptions \u003cDComSessionOptions\u003e] [-AddBadCredential \u003cPSCredential[]\u003e] [-RemoveBadCredential \u003cPSCredential[]\u003e] [-ClearBadCredential] [-ClearCredential] [-ResetCredential] \r\n[-ResetConnectionStatus] [-ResetConfiguration] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]\nSet-DbaCmConnection [-ComputerName \u003cDbaCmConnectionParameter[]\u003e] [-UseWindowsCredentials] [-OverrideExplicitCredential] [-OverrideConnectionPolicy] [-DisabledConnectionTypes {None | CimRM | CimDCOM | Wmi | PowerShellRemoting}] [-DisableBadCredentialCache] [-DisableCimPersistence] [-DisableCredentialAutoRegister] [-EnableCredentialFailover] [-CimWinRMOptions \u003cWSManSessionOptions\u003e] [-CimDCOMOptions \u003cDComSessionOptions\u003e] [-AddBadCredential \u003cPSCredential[]\u003e] [-RemoveBadCredential \u003cPSCredential[]\u003e] [-ClearBadCredential] [-ClearCredential] [-ResetCredential] [-ResetConnectionStatus] \r\n[-ResetConfiguration] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Set-DbaDbCompatibility", + "Name": "Set-DbaDbCompatibility", "Description": "Sets the current database compatibility level for all databases on a server or list of databases passed in to the function.", "Tags": [ "Compatibility", "Database" ], + "Synopsis": "Sets the compatibility level for SQL Server databases.", + "Alias": "", + "Author": "Garry Bargsley, http://blog.garrybargsley.com/", + "CommandName": "Set-DbaDbCompatibility", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Set-DbaDbCompatibility", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eSet-DbaDbCompatibility -SqlInstance localhost\\sql2017\nChanges database compatibility level for all user databases on server localhost\\sql2017 that have a Compatibility level that do not match\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eSet-DbaDbCompatibility -SqlInstance localhost\\sql2017 -TargetCompatibility 12\nChanges database compatibility level for all user databases on server localhost\\sql2017 to Version120\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eSet-DbaDbCompatibility -SqlInstance localhost\\sql2017 -Database Test -TargetCompatibility 12\nChanges database compatibility level for database Test on server localhost\\sql2017 to Version 120", "Params": [ [ "SqlInstance", @@ -35102,22 +36753,23 @@ "" ] ], - "Alias": "", - "Author": "Garry Bargsley, http://blog.garrybargsley.com/", - "Synopsis": "Sets the compatibility level for SQL Server databases.", - "Name": "Set-DbaDbCompatibility", - "Links": "https://dbatools.io/Set-DbaDbCompatibility", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eSet-DbaDbCompatibility -SqlInstance localhost\\sql2017\nChanges database compatibility level for all user databases on server localhost\\sql2017 that have a Compatibility level that do not match\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eSet-DbaDbCompatibility -SqlInstance localhost\\sql2017 -TargetCompatibility 12\nChanges database compatibility level for all user databases on server localhost\\sql2017 to Version120\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eSet-DbaDbCompatibility -SqlInstance localhost\\sql2017 -Database Test -TargetCompatibility 12\nChanges database compatibility level for database Test on server localhost\\sql2017 to Version 120", "Syntax": "Set-DbaDbCompatibility [[-SqlInstance] \u003cDbaInstanceParameter[]\u003e] [[-SqlCredential] \u003cPSCredential\u003e] [[-Database] \u003cString[]\u003e] [[-TargetCompatibility] \u003cInt32\u003e] [[-InputObject] \u003cDatabase[]\u003e] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Set-DbaDbCompression", + "Name": "Set-DbaDbCompression", "Description": "This function sets the appropriate compression recommendation, determined either by using the Tiger Team\u0027s query or set to the CompressionType parameter.\n\nRemember Uptime is critical for the Tiger Team query, the longer uptime, the more accurate the analysis is.\nYou would probably be best if you utilized Get-DbaUptime first, before running this command.\n\nSet-DbaDbCompression script derived from GitHub and the tigertoolbox\n(https://github.com/Microsoft/tigertoolbox/tree/master/Evaluate-Compression-Gains)", "Tags": [ "Compression", "Table", "Database" ], + "Synopsis": "Sets tables and indexes with preferred compression setting.", + "Alias": "", + "Author": "Jason Squires (@js_0505), jstexasdba@gmail.com", + "CommandName": "Set-DbaDbCompression", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Set-DbaDbCompression", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eSet-DbaDbCompression -SqlInstance localhost -MaxRunTime 60 -PercentCompression 25\nSet the compression run time to 60 minutes and will start the compression of tables/indexes that have a difference of 25% or higher between current and recommended.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eSet-DbaDbCompression -SqlInstance ServerA -Database DBName -CompressionType Page\nUtilizes Page compression for all objects in DBName on ServerA with no time limit.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eSet-DbaDbCompression -SqlInstance ServerA -Database DBName -PercentCompression 25 | Out-GridView\nWill compress tables/indexes within the specified database that would show any % improvement with compression and with no time limit. The results will be piped into a nicely formatted GridView.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003e$testCompression = Test-DbaDbCompression -SqlInstance ServerA -Database DBName\nPS C:\\\u003e Set-DbaDbCompression -SqlInstance ServerA -Database DBName -InputObject $testCompression\nGets the compression suggestions from Test-DbaDbCompression into a variable, this can then be reviewed and passed into Set-DbaDbCompression.\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003e$cred = Get-Credential sqladmin\nPS C:\\\u003e Set-DbaDbCompression -SqlInstance ServerA -ExcludeDatabase Database -SqlCredential $cred -MaxRunTime 60 -PercentCompression 25\nSet the compression run time to 60 minutes and will start the compression of tables/indexes for all databases except the specified excluded database. Only objects that have a difference of 25% or \r\nhigher between current and recommended will be compressed.\n-------------------------- EXAMPLE 6 --------------------------\nPS C:\\\u003e$servers = \u0027Server1\u0027,\u0027Server2\u0027\nPS C:\\\u003e foreach ($svr in $servers) {\r\n\u003e\u003e Set-DbaDbCompression -SqlInstance $svr -MaxRunTime 60 -PercentCompression 25 | Export-Csv -Path C:\\temp\\CompressionAnalysisPAC.csv -Append\r\n\u003e\u003e }\nSet the compression run time to 60 minutes and will start the compression of tables/indexes across all listed servers that have a difference of 25% or higher between current and recommended. Output \r\nof command is exported to a csv.", "Params": [ [ "SqlInstance", @@ -35208,21 +36860,101 @@ "" ] ], - "Alias": "", - "Author": "Jason Squires (@js_0505), jstexasdba@gmail.com", - "Synopsis": "Sets tables and indexes with preferred compression setting.", - "Name": "Set-DbaDbCompression", - "Links": "https://dbatools.io/Set-DbaDbCompression", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eSet-DbaDbCompression -SqlInstance localhost -MaxRunTime 60 -PercentCompression 25\nSet the compression run time to 60 minutes and will start the compression of tables/indexes that have a difference of 25% or higher between current and recommended.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eSet-DbaDbCompression -SqlInstance ServerA -Database DBName -CompressionType Page\nUtilizes Page compression for all objects in DBName on ServerA with no time limit.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eSet-DbaDbCompression -SqlInstance ServerA -Database DBName -PercentCompression 25 | Out-GridView\nWill compress tables/indexes within the specified database that would show any % improvement with compression and with no time limit. The results will be piped into a nicely formatted GridView.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003e$testCompression = Test-DbaDbCompression -SqlInstance ServerA -Database DBName\nPS C:\\\u003e Set-DbaDbCompression -SqlInstance ServerA -Database DBName -InputObject $testCompression\nGets the compression suggestions from Test-DbaDbCompression into a variable, this can then be reviewed and passed into Set-DbaDbCompression.\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003e$cred = Get-Credential sqladmin\nPS C:\\\u003e Set-DbaDbCompression -SqlInstance ServerA -ExcludeDatabase Database -SqlCredential $cred -MaxRunTime 60 -PercentCompression 25\nSet the compression run time to 60 minutes and will start the compression of tables/indexes for all databases except the specified excluded database. Only objects that have a difference of 25% or \r\nhigher between current and recommended will be compressed.\n-------------------------- EXAMPLE 6 --------------------------\nPS C:\\\u003e$servers = \u0027Server1\u0027,\u0027Server2\u0027\nPS C:\\\u003e foreach ($svr in $servers) {\r\n\u003e\u003e Set-DbaDbCompression -SqlInstance $svr -MaxRunTime 60 -PercentCompression 25 | Export-Csv -Path C:\\temp\\CompressionAnalysisPAC.csv -Append\r\n\u003e\u003e }\nSet the compression run time to 60 minutes and will start the compression of tables/indexes across all listed servers that have a difference of 25% or higher between current and recommended. Output \r\nof command is exported to a csv.", "Syntax": "Set-DbaDbCompression [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [[-Database] \u003cObject[]\u003e] [[-ExcludeDatabase] \u003cObject[]\u003e] [[-CompressionType] \u003cObject\u003e] [[-MaxRunTime] \u003cInt32\u003e] [[-PercentCompression] \u003cInt32\u003e] [[-InputObject] \u003cObject\u003e] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Set-DbaDbMirror", + "Name": "Set-DbaDbIdentity", + "Description": "Use the command DBCC CHECKIDENT to check and if necessary update the current identity value of a table and return results\nCan update an individual table via the ReSeedValue and RESEED option of DBCC CHECKIDENT\n\nRead more:\n - https://docs.microsoft.com/en-us/sql/t-sql/database-console-commands/dbcc-checkident-transact-sql", + "Tags": "DBCC", + "Synopsis": "Checks and updates the current identity value via DBCC CHECKIDENT", + "Alias": "", + "Author": "Patrick Flynn (@sqllensman)", + "CommandName": "Set-DbaDbIdentity", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Set-DbaDbIdentity", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eSet-DbaDbIdentity -SqlInstance SQLServer2017 -Database AdventureWorks2014 -Table \u0027Production.ScrapReason\u0027\nConnects to AdventureWorks2014 on instance SqlServer2017 using Windows Authentication and runs the command DBCC CHECKIDENT(\u0027Production.ScrapReason\u0027) to return the current identity value.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003e$cred = Get-Credential sqladmin\nPS C:\\\u003e \u0027Sql1\u0027,\u0027Sql2/sqlexpress\u0027 | Set-DbaDbIdentity -SqlCredential $cred -Database AdventureWorks2014 -Table \u0027Production.ScrapReason\u0027\nConnects to AdventureWorks2014 on instances Sql1 and Sql2/sqlexpress using sqladmin credential and runs the command DBCC CHECKIDENT(\u0027Production.ScrapReason\u0027) to return the current identity value.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003e$query = \"Select Schema_Name(t.schema_id) +\u0027.\u0027 + t.name as TableName from sys.columns c INNER JOIN sys.tables t on t.object_id = c.object_id WHERE is_identity = 1\"\nPS C:\\\u003e $IdentityTables = Invoke-DbaQuery -SqlInstance SQLServer2017 -Database AdventureWorks2014 -Query $query\r\nPS C:\\\u003e foreach ($tbl in $IdentityTables) {\r\nPS C:\\\u003e Set-DbaDbIdentity -SqlInstance SQLServer2017 -Database AdventureWorks2014 -Table $tbl.TableName\r\nPS C:\\\u003e }\nChecks the current identity value for all tables with an Identity in the AdventureWorks2014 database on the SQLServer2017 and, if it is needed, changes the identity value.", + "Params": [ + [ + "SqlInstance", + "The target SQL Server instance or instances.", + "", + true, + "true (ByValue)", + "" + ], + [ + "SqlCredential", + "Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential)", + "", + false, + "false", + "" + ], + [ + "Database", + "The database(s) to process - this list is auto-populated from the server. If unspecified, all databases will be processed.\r\nOnly one database should be specified when using a RESEED value", + "", + false, + "false", + "" + ], + [ + "Table", + "The table(s) for which to check the current identity value.\r\nOnly one table should be specified when using a RESEED value", + "", + false, + "false", + "" + ], + [ + "ReSeedValue", + "The new reseed value to be used to set as the current identity value.", + "", + false, + "false", + "0" + ], + [ + "EnableException", + "By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message.\r\nThis avoids overwhelming you with \"sea of red\" exceptions, but is inconvenient because it basically disables advanced scripting.\r\nUsing this switch turns this \"nice by default\" feature off and enables you to catch exceptions with your own try/catch.", + "", + false, + "false", + "False" + ], + [ + "WhatIf", + "Shows what would happen if the cmdlet runs. The cmdlet is not run.", + "wi", + false, + "false", + "" + ], + [ + "Confirm", + "Prompts you for confirmation before running the cmdlet.", + "cf", + false, + "false", + "" + ] + ], + "Syntax": "Set-DbaDbIdentity [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [[-Database] \u003cString[]\u003e] [[-Table] \u003cString[]\u003e] [[-ReSeedValue] \u003cInt32\u003e] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" + }, + { + "Name": "Set-DbaDbMirror", "Description": "Sets properties of database mirrors.", "Tags": [ "Mirror", "HA" ], + "Synopsis": "Sets properties of database mirrors.", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Set-DbaDbMirror", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Set-DbaDbMirror", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eSet-DbaDbMirror -SqlInstance sql2005 -Database dbatools -Partner TCP://SQL2008.ad.local:5374\nPrompts for confirmation then sets the partner to TCP://SQL2008.ad.local:5374 for the database \"dbtools\"\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eSet-DbaDbMirror -SqlInstance sql2005 -Database dbatools -Witness TCP://SQL2012.ad.local:5502 -Confirm:$false\nDoes not prompt for confirmation and sets the witness to TCP://SQL2012.ad.local:5502 for the database \"dbtools\"\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaDatabase -SqlInstance sql2005 | Out-GridView -PassThru | Set-DbaDbMirror -SafetyLevel Full -Confirm:$false\nSets the safety level to Full for databases selected from a grid view. Does not prompt for confirmation.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eSet-DbaDbMirror -SqlInstance sql2005 -Database dbatools -State Suspend -Confirm:$false\nDoes not prompt for confirmation and sets the state to suspend for the database \"dbtools\"", "Params": [ [ "SqlInstance", @@ -35313,22 +37045,23 @@ "" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Sets properties of database mirrors.", - "Name": "Set-DbaDbMirror", - "Links": "https://dbatools.io/Set-DbaDbMirror", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eSet-DbaDbMirror -SqlInstance sql2005 -Database dbatools -Partner TCP://SQL2008.ad.local:5374\nPrompts for confirmation then sets the partner to TCP://SQL2008.ad.local:5374 for the database \"dbtools\"\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eSet-DbaDbMirror -SqlInstance sql2005 -Database dbatools -Witness TCP://SQL2012.ad.local:5502 -Confirm:$false\nDoes not prompt for confirmation and sets the witness to TCP://SQL2012.ad.local:5502 for the database \"dbtools\"\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaDatabase -SqlInstance sql2005 | Out-GridView -PassThru | Set-DbaDbMirror -SafetyLevel Full -Confirm:$false\nSets the safety level to Full for databases selected from a grid view. Does not prompt for confirmation.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eSet-DbaDbMirror -SqlInstance sql2005 -Database dbatools -State Suspend -Confirm:$false\nDoes not prompt for confirmation and sets the state to suspend for the database \"dbtools\"", "Syntax": "Set-DbaDbMirror [[-SqlInstance] \u003cDbaInstanceParameter[]\u003e] [[-SqlCredential] \u003cPSCredential\u003e] [[-Database] \u003cString[]\u003e] [[-Partner] \u003cString\u003e] [[-Witness] \u003cString\u003e] [[-SafetyLevel] \u003cString\u003e] [[-State] \u003cString\u003e] [[-InputObject] \u003cDatabase[]\u003e] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Set-DbaDbOwner", + "Name": "Set-DbaDbOwner", "Description": "This function will alter database ownership to match a specified login if their current owner does not match the target login. By default, the target login will be \u0027sa\u0027, but the function will allow the user to specify a different login for ownership. The user can also apply this to all databases or only to a select list of databases (passed as either a comma separated list or a string array).\n\nBest Practice reference: http://weblogs.sqlteam.com/dang/archive/2008/01/13/Database-Owner-Troubles.aspx", "Tags": [ "Database", "Owner", "DbOwner" ], + "Synopsis": "Sets database owners with a desired login if databases do not match that owner.", + "Alias": "Set-DbaDatabaseOwner", + "Author": "Michael Fal (@Mike_Fal), http://mikefal.net", + "CommandName": "Set-DbaDbOwner", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Set-DbaDbOwner", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eSet-DbaDbOwner -SqlInstance localhost\nSets database owner to \u0027sa\u0027 on all databases where the owner does not match \u0027sa\u0027.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eSet-DbaDbOwner -SqlInstance localhost -TargetLogin DOMAIN\\account\nSets the database owner to DOMAIN\\account on all databases where the owner does not match DOMAIN\\account.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eSet-DbaDbOwner -SqlInstance sqlserver -Database db1, db2\nSets database owner to \u0027sa\u0027 on the db1 and db2 databases if their current owner does not match \u0027sa\u0027.", "Params": [ [ "SqlInstance", @@ -35395,18 +37128,19 @@ "" ] ], - "Alias": "Set-DbaDatabaseOwner", - "Author": "Michael Fal (@Mike_Fal), http://mikefal.net", - "Synopsis": "Sets database owners with a desired login if databases do not match that owner.", - "Name": "Set-DbaDbOwner", - "Links": "https://dbatools.io/Set-DbaDbOwner", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eSet-DbaDbOwner -SqlInstance localhost\nSets database owner to \u0027sa\u0027 on all databases where the owner does not match \u0027sa\u0027.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eSet-DbaDbOwner -SqlInstance localhost -TargetLogin DOMAIN\\account\nSets the database owner to DOMAIN\\account on all databases where the owner does not match DOMAIN\\account.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eSet-DbaDbOwner -SqlInstance sqlserver -Database db1, db2\nSets database owner to \u0027sa\u0027 on the db1 and db2 databases if their current owner does not match \u0027sa\u0027.", "Syntax": "Set-DbaDbOwner [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [[-Database] \u003cObject[]\u003e] [[-ExcludeDatabase] \u003cObject[]\u003e] [[-TargetLogin] \u003cString\u003e] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Set-DbaDbQueryStoreOption", + "Name": "Set-DbaDbQueryStoreOption", "Description": "Configure Query Store settings for a specific or multiple databases.", "Tags": "QueryStore", + "Synopsis": "Configure Query Store settings for a specific or multiple databases.", + "Alias": "Set-DbaDbQueryStoreOptions,Set-DbaQueryStoreConfig", + "Author": "Enrico van de Laar (@evdlaar)", + "CommandName": "Set-DbaDbQueryStoreOption", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Set-DbaQueryStoreOptions", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eSet-DbaDbQueryStoreOption -SqlInstance ServerA\\SQL -State ReadWrite -FlushInterval 600 -CollectionInterval 10 -MaxSize 100 -CaptureMode All -CleanupMode Auto -StaleQueryThreshold 100 \r\n-AllDatabases\nConfigure the Query Store settings for all user databases in the ServerA\\SQL Instance.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eSet-DbaDbQueryStoreOption -SqlInstance ServerA\\SQL -FlushInterval 600\nOnly configure the FlushInterval setting for all Query Store databases in the ServerA\\SQL Instance.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eSet-DbaDbQueryStoreOption -SqlInstance ServerA\\SQL -Database AdventureWorks -State ReadWrite -FlushInterval 600 -CollectionInterval 10 -MaxSize 100 -CaptureMode all -CleanupMode Auto \r\n-StaleQueryThreshold 100\nConfigure the Query Store settings for the AdventureWorks database in the ServerA\\SQL Instance.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eSet-DbaDbQueryStoreOption -SqlInstance ServerA\\SQL -Exclude AdventureWorks -State ReadWrite -FlushInterval 600 -CollectionInterval 10 -MaxSize 100 -CaptureMode all -CleanupMode Auto \r\n-StaleQueryThreshold 100\nConfigure the Query Store settings for all user databases except the AdventureWorks database in the ServerA\\SQL Instance.", "Params": [ [ "SqlInstance", @@ -35529,21 +37263,22 @@ "" ] ], - "Alias": "Set-DbaDbQueryStoreOptions,Set-DbaQueryStoreConfig", - "Author": "Enrico van de Laar (@evdlaar)", - "Synopsis": "Configure Query Store settings for a specific or multiple databases.", - "Name": "Set-DbaDbQueryStoreOption", - "Links": "https://dbatools.io/Set-DbaQueryStoreOptions", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eSet-DbaDbQueryStoreOption -SqlInstance ServerA\\SQL -State ReadWrite -FlushInterval 600 -CollectionInterval 10 -MaxSize 100 -CaptureMode All -CleanupMode Auto -StaleQueryThreshold 100 \r\n-AllDatabases\nConfigure the Query Store settings for all user databases in the ServerA\\SQL Instance.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eSet-DbaDbQueryStoreOption -SqlInstance ServerA\\SQL -FlushInterval 600\nOnly configure the FlushInterval setting for all Query Store databases in the ServerA\\SQL Instance.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eSet-DbaDbQueryStoreOption -SqlInstance ServerA\\SQL -Database AdventureWorks -State ReadWrite -FlushInterval 600 -CollectionInterval 10 -MaxSize 100 -CaptureMode all -CleanupMode Auto \r\n-StaleQueryThreshold 100\nConfigure the Query Store settings for the AdventureWorks database in the ServerA\\SQL Instance.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eSet-DbaDbQueryStoreOption -SqlInstance ServerA\\SQL -Exclude AdventureWorks -State ReadWrite -FlushInterval 600 -CollectionInterval 10 -MaxSize 100 -CaptureMode all -CleanupMode Auto \r\n-StaleQueryThreshold 100\nConfigure the Query Store settings for all user databases except the AdventureWorks database in the ServerA\\SQL Instance.", "Syntax": "Set-DbaDbQueryStoreOption [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [[-Database] \u003cObject[]\u003e] [[-ExcludeDatabase] \u003cObject[]\u003e] [-AllDatabases] [[-State] \u003cString[]\u003e] [[-FlushInterval] \u003cInt64\u003e] [[-CollectionInterval] \u003cInt64\u003e] [[-MaxSize] \u003cInt64\u003e] [[-CaptureMode] \u003cString[]\u003e] [[-CleanupMode] \u003cString[]\u003e] [[-StaleQueryThreshold] \u003cInt64\u003e] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Set-DbaDbRecoveryModel", + "Name": "Set-DbaDbRecoveryModel", "Description": "Set-DbaDbRecoveryModel sets the Recovery Model for user databases.", "Tags": [ "RecoveryModel", "Database" ], + "Synopsis": "Set-DbaDbRecoveryModel sets the Recovery Model.", + "Alias": "", + "Author": "Viorel Ciucu (@viorelciucu), https://www.cviorel.com", + "CommandName": "Set-DbaDbRecoveryModel", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Set-DbaDbRecoveryModel", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eSet-DbaDbRecoveryModel -SqlInstance sql2014 -RecoveryModel BulkLogged -Database model -Confirm:$true -Verbose\nSets the Recovery Model to BulkLogged for database [model] on SQL Server instance sql2014. User is requested to confirm the action.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaDatabase -SqlInstance sql2014 -Database TestDB | Set-DbaDbRecoveryModel -RecoveryModel Simple -Confirm:$false\nSets the Recovery Model to Simple for database [TestDB] on SQL Server instance sql2014. Confirmation is not required.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eSet-DbaDbRecoveryModel -SqlInstance sql2014 -RecoveryModel Simple -Database TestDB -Confirm:$false\nSets the Recovery Model to Simple for database [TestDB] on SQL Server instance sql2014. Confirmation is not required.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eSet-DbaDbRecoveryModel -SqlInstance sql2014 -RecoveryModel Simple -AllDatabases -Confirm:$false\nSets the Recovery Model to Simple for ALL uses databases MODEL database on SQL Server instance sql2014. Runs without asking for confirmation.\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eSet-DbaDbRecoveryModel -SqlInstance sql2014 -RecoveryModel BulkLogged -Database TestDB1, TestDB2 -Confirm:$false -Verbose\nSets the Recovery Model to BulkLogged for [TestDB1] and [TestDB2] databases on SQL Server instance sql2014. Runs without asking for confirmation.", "Params": [ [ "SqlInstance", @@ -35626,21 +37361,22 @@ "" ] ], - "Alias": "", - "Author": "Viorel Ciucu (@viorelciucu), https://www.cviorel.com", - "Synopsis": "Set-DbaDbRecoveryModel sets the Recovery Model.", - "Name": "Set-DbaDbRecoveryModel", - "Links": "https://dbatools.io/Set-DbaDbRecoveryModel", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eSet-DbaDbRecoveryModel -SqlInstance sql2014 -RecoveryModel BulkLogged -Database model -Confirm:$true -Verbose\nSets the Recovery Model to BulkLogged for database [model] on SQL Server instance sql2014. User is requested to confirm the action.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaDatabase -SqlInstance sql2014 -Database TestDB | Set-DbaDbRecoveryModel -RecoveryModel Simple -Confirm:$false\nSets the Recovery Model to Simple for database [TestDB] on SQL Server instance sql2014. Confirmation is not required.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eSet-DbaDbRecoveryModel -SqlInstance sql2014 -RecoveryModel Simple -Database TestDB -Confirm:$false\nSets the Recovery Model to Simple for database [TestDB] on SQL Server instance sql2014. Confirmation is not required.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eSet-DbaDbRecoveryModel -SqlInstance sql2014 -RecoveryModel Simple -AllDatabases -Confirm:$false\nSets the Recovery Model to Simple for ALL uses databases MODEL database on SQL Server instance sql2014. Runs without asking for confirmation.\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eSet-DbaDbRecoveryModel -SqlInstance sql2014 -RecoveryModel BulkLogged -Database TestDB1, TestDB2 -Confirm:$false -Verbose\nSets the Recovery Model to BulkLogged for [TestDB1] and [TestDB2] databases on SQL Server instance sql2014. Runs without asking for confirmation.", "Syntax": "Set-DbaDbRecoveryModel [-SqlCredential \u003cPSCredential\u003e] -RecoveryModel \u003cString\u003e [-Database \u003cObject[]\u003e] [-ExcludeDatabase \u003cObject[]\u003e] [-AllDatabases] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]\nSet-DbaDbRecoveryModel -SqlInstance \u003cDbaInstanceParameter[]\u003e [-SqlCredential \u003cPSCredential\u003e] -RecoveryModel \u003cString\u003e [-Database \u003cObject[]\u003e] [-ExcludeDatabase \u003cObject[]\u003e] [-AllDatabases] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]\nSet-DbaDbRecoveryModel [-SqlCredential \u003cPSCredential\u003e] -RecoveryModel \u003cString\u003e [-Database \u003cObject[]\u003e] [-ExcludeDatabase \u003cObject[]\u003e] [-AllDatabases] [-EnableException] -InputObject \u003cDatabase[]\u003e [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Set-DbaDbState", + "Name": "Set-DbaDbState", "Description": "Sets some common \"states\" on databases:\n- \"RW\" options (ReadOnly, ReadWrite)\n- \"Status\" options (Online, Offline, Emergency, plus a special \"Detached\")\n- \"Access\" options (SingleUser, RestrictedUser, MultiUser)\n\nReturns an object with SqlInstance, Database, RW, Status, Access, Notes\n\nNotes gets filled when something went wrong setting the state", "Tags": [ "Database", "State" ], + "Synopsis": "Sets various options for databases, hereby called \"states\"", + "Alias": "Set-DbaDatabaseState", + "Author": "Simone Bizzotto (@niphold)", + "CommandName": "Set-DbaDbState", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Set-DbaDbState", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eSet-DbaDbState -SqlInstance sqlserver2014a -Database HR -Offline\nSets the HR database as OFFLINE\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eSet-DbaDbState -SqlInstance sqlserver2014a -AllDatabases -Exclude HR -ReadOnly -Force\nSets all databases of the sqlserver2014a instance, except for HR, as READ_ONLY\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaDbState -SqlInstance sql2016 | Where-Object Status -eq \u0027Offline\u0027 | Set-DbaDbState -Online\nFinds all offline databases and sets them to online\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eSet-DbaDbState -SqlInstance sqlserver2014a -Database HR -SingleUser\nSets the HR database as SINGLE_USER\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eSet-DbaDbState -SqlInstance sqlserver2014a -Database HR -SingleUser -Force\nSets the HR database as SINGLE_USER, dropping all other connections (and rolling back open transactions)\n-------------------------- EXAMPLE 6 --------------------------\nPS C:\\\u003eGet-DbaDatabase -SqlInstance sqlserver2014a -Database HR | Set-DbaDbState -SingleUser -Force\nGets the databases from Get-DbaDatabase, and sets them as SINGLE_USER, dropping all other connections (and rolling back open transactions)", "Params": [ [ "SqlInstance", @@ -35795,18 +37531,19 @@ "" ] ], - "Alias": "Set-DbaDatabaseState", - "Author": "Simone Bizzotto (@niphold)", - "Synopsis": "Sets various options for databases, hereby called \"states\"", - "Name": "Set-DbaDbState", - "Links": "https://dbatools.io/Set-DbaDbState", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eSet-DbaDbState -SqlInstance sqlserver2014a -Database HR -Offline\nSets the HR database as OFFLINE\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eSet-DbaDbState -SqlInstance sqlserver2014a -AllDatabases -Exclude HR -ReadOnly -Force\nSets all databases of the sqlserver2014a instance, except for HR, as READ_ONLY\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaDbState -SqlInstance sql2016 | Where-Object Status -eq \u0027Offline\u0027 | Set-DbaDbState -Online\nFinds all offline databases and sets them to online\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eSet-DbaDbState -SqlInstance sqlserver2014a -Database HR -SingleUser\nSets the HR database as SINGLE_USER\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eSet-DbaDbState -SqlInstance sqlserver2014a -Database HR -SingleUser -Force\nSets the HR database as SINGLE_USER, dropping all other connections (and rolling back open transactions)\n-------------------------- EXAMPLE 6 --------------------------\nPS C:\\\u003eGet-DbaDatabase -SqlInstance sqlserver2014a -Database HR | Set-DbaDbState -SingleUser -Force\nGets the databases from Get-DbaDatabase, and sets them as SINGLE_USER, dropping all other connections (and rolling back open transactions)", "Syntax": "Set-DbaDbState [-SqlCredential \u003cPSCredential\u003e] [-Database \u003cObject[]\u003e] [-ExcludeDatabase \u003cObject[]\u003e] [-AllDatabases] [-ReadOnly] [-ReadWrite] [-Online] [-Offline] [-Emergency] [-Detached] [-SingleUser] [-RestrictedUser] [-MultiUser] [-Force] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]\nSet-DbaDbState -SqlInstance \u003cDbaInstanceParameter[]\u003e [-SqlCredential \u003cPSCredential\u003e] [-Database \u003cObject[]\u003e] [-ExcludeDatabase \u003cObject[]\u003e] [-AllDatabases] [-ReadOnly] [-ReadWrite] [-Online] [-Offline] [-Emergency] [-Detached] [-SingleUser] [-RestrictedUser] [-MultiUser] [-Force] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]\nSet-DbaDbState [-SqlCredential \u003cPSCredential\u003e] [-Database \u003cObject[]\u003e] [-ExcludeDatabase \u003cObject[]\u003e] [-AllDatabases] [-ReadOnly] [-ReadWrite] [-Online] [-Offline] [-Emergency] [-Detached] [-SingleUser] [-RestrictedUser] [-MultiUser] [-Force] [-EnableException] -InputObject \u003cPSObject[]\u003e [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Set-DbaEndpoint", + "Name": "Set-DbaEndpoint", "Description": "Sets endpoint properties on a SQL Server instance.", "Tags": "Endpoint", + "Synopsis": "Sets endpoint properties on a SQL Server instance.", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Set-DbaEndpoint", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Set-DbaEndpoint", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eSet-DbaEndpoint -SqlInstance sql2016 -AllEndpoints -Owner sa\nSets all endpoint owners to sa on sql2016\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaEndpoint -SqlInstance sql2016 -Endpoint ep1 | Set-DbaEndpoint -Type TSql\nChanges the endpoint type to tsql on endpoint ep1", "Params": [ [ "SqlInstance", @@ -35889,21 +37626,22 @@ "" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Sets endpoint properties on a SQL Server instance.", - "Name": "Set-DbaEndpoint", - "Links": "https://dbatools.io/Set-DbaEndpoint", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eSet-DbaEndpoint -SqlInstance sql2016 -AllEndpoints -Owner sa\nSets all endpoint owners to sa on sql2016\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaEndpoint -SqlInstance sql2016 -Endpoint ep1 | Set-DbaEndpoint -Type TSql\nChanges the endpoint type to tsql on endpoint ep1", "Syntax": "Set-DbaEndpoint [[-SqlInstance] \u003cDbaInstanceParameter[]\u003e] [[-SqlCredential] \u003cPSCredential\u003e] [[-EndPoint] \u003cString[]\u003e] [[-Owner] \u003cString\u003e] [[-Type] \u003cString\u003e] [-AllEndpoints] [[-InputObject] \u003cEndpoint[]\u003e] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Set-DbaErrorLogConfig", + "Name": "Set-DbaErrorLogConfig", "Description": "Sets the number of log files configured on all versions, and size in KB in SQL Server 2012+ and above.\n\nTo set the Path to the ErrorLog, use Set-DbaStartupParameter -ErrorLog. Note that this command requires\nremote, administrative access to the Windows/WMI server, similar to SQL Configuration Manager.", "Tags": [ "Instance", "ErrorLog" ], + "Synopsis": "Set the configuration for the ErrorLog on a given SQL Server instance", + "Alias": "", + "Author": "Shawn Melton (@wsmelton), https://wsmelton.github.com", + "CommandName": "Set-DbaErrorLogConfig", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Set-DbaErrorLogConfig", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eSet-DbaErrorLogConfig -SqlInstance sql2017,sql2014 -LogCount 25\nSets the number of error log files to 25 on sql2017 and sql2014\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eSet-DbaErrorLogConfig -SqlInstance sql2014 -LogSize 102400\nSets the size of the error log file, before it rolls over, to 102400 KB (100 MB) on sql2014\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eSet-DbaErrorLogConfig -SqlInstance sql2012 -LogCount 25 -LogSize 500\nSets the number of error log files to 25 and size before it will roll over to 500 KB on sql2012", "Params": [ [ "SqlInstance", @@ -35962,18 +37700,19 @@ "" ] ], - "Alias": "", - "Author": "Shawn Melton (@wsmelton), https://wsmelton.github.com", - "Synopsis": "Set the configuration for the ErrorLog on a given SQL Server instance", - "Name": "Set-DbaErrorLogConfig", - "Links": "https://dbatools.io/Set-DbaErrorLogConfig", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eSet-DbaErrorLogConfig -SqlInstance sql2017,sql2014 -LogCount 25\nSets the number of error log files to 25 on sql2017 and sql2014\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eSet-DbaErrorLogConfig -SqlInstance sql2014 -LogSize 102400\nSets the size of the error log file, before it rolls over, to 102400 KB (100 MB) on sql2014\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eSet-DbaErrorLogConfig -SqlInstance sql2012 -LogCount 25 -LogSize 500\nSets the number of error log files to 25 and size before it will roll over to 500 KB on sql2012", "Syntax": "Set-DbaErrorLogConfig [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [[-LogCount] \u003cInt32\u003e] [[-LogSize] \u003cInt32\u003e] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Set-DbaLogin", + "Name": "Set-DbaLogin", "Description": "Set-DbaLogin will enable you to change the password, unlock, rename, disable or enable, deny or grant login privileges to the login. It\u0027s also possible to add or remove server roles from the login.", "Tags": "Login", + "Synopsis": "Set-DbaLogin makes it possible to make changes to one or more logins.", + "Alias": "", + "Author": "Sander Stad (@sqlstad), sqlstad.nl", + "CommandName": "Set-DbaLogin", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Set-DbaLogin", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003e$SecurePassword = ConvertTo-SecureString \"PlainTextPassword\" -AsPlainText -Force\nPS C:\\\u003e $cred = New-Object System.Management.Automation.PSCredential (\"username\", $SecurePassword)\r\nPS C:\\\u003e Set-DbaLogin -SqlInstance sql1 -Login login1 -SecurePassword $cred -Unlock -MustChange\nSet the new password for login1 using a credential, unlock the account and set the option\r\nthat the user must change password at next logon.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eSet-DbaLogin -SqlInstance sql1 -Login login1 -Enable\nEnable the login\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eSet-DbaLogin -SqlInstance sql1 -Login login1, login2, login3, login4 -Enable\nEnable multiple logins\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eSet-DbaLogin -SqlInstance sql1, sql2, sql3 -Login login1, login2, login3, login4 -Enable\nEnable multiple logins on multiple instances\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eSet-DbaLogin -SqlInstance sql1 -Login login1 -Disable\nDisable the login\n-------------------------- EXAMPLE 6 --------------------------\nPS C:\\\u003eSet-DbaLogin -SqlInstance sql1 -Login login1 -DenyLogin\nDeny the login to connect to the instance\n-------------------------- EXAMPLE 7 --------------------------\nPS C:\\\u003eSet-DbaLogin -SqlInstance sql1 -Login login1 -GrantLogin\nGrant the login to connect to the instance\n-------------------------- EXAMPLE 8 --------------------------\nPS C:\\\u003eSet-DbaLogin -SqlInstance sql1 -Login login1 -PasswordPolicyEnforced\nEnforces the password policy on a login\n-------------------------- EXAMPLE 9 --------------------------\nPS C:\\\u003eSet-DbaLogin -SqlInstance sql1 -Login login1 -PasswordPolicyEnforced:$false\nDisables enforcement of the password policy on a login\n-------------------------- EXAMPLE 10 --------------------------\nPS C:\\\u003eSet-DbaLogin -SqlInstance sql1 -Login test -AddRole serveradmin\nAdd the server role \"serveradmin\" to the login\n-------------------------- EXAMPLE 11 --------------------------\nPS C:\\\u003eSet-DbaLogin -SqlInstance sql1 -Login test -RemoveRole bulkadmin\nRemove the server role \"bulkadmin\" to the login\n-------------------------- EXAMPLE 12 --------------------------\nPS C:\\\u003e$login = Get-DbaLogin -SqlInstance sql1 -Login test\nPS C:\\\u003e $login | Set-DbaLogin -Disable\nDisable the login from the pipeline\n-------------------------- EXAMPLE 13 --------------------------\nPS C:\\\u003eSet-DbaLogin -SqlInstance sql1 -Login login1 -DefaultDatabase master\nSet the default database to master on a login", "Params": [ [ "SqlInstance", @@ -36007,6 +37746,14 @@ "false", "" ], + [ + "DefaultDatabase", + "Default database for the login", + "DefaultDB", + false, + "false", + "" + ], [ "Unlock", "Switch to unlock an account. This will only be used in conjunction with the -SecurePassword parameter.\r\nThe default is false.", @@ -36120,21 +37867,22 @@ "" ] ], - "Alias": "", - "Author": "Sander Stad (@sqlstad), sqlstad.nl", - "Synopsis": "Set-DbaLogin makes it possible to make changes to one or more logins.", - "Name": "Set-DbaLogin", - "Links": "https://dbatools.io/Set-DbaLogin", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003e$SecurePassword = ConvertTo-SecureString \"PlainTextPassword\" -AsPlainText -Force\nPS C:\\\u003e $cred = New-Object System.Management.Automation.PSCredential (\"username\", $SecurePassword)\r\nPS C:\\\u003e Set-DbaLogin -SqlInstance sql1 -Login login1 -SecurePassword $cred -Unlock -MustChange\nSet the new password for login1 using a credential, unlock the account and set the option\r\nthat the user must change password at next logon.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eSet-DbaLogin -SqlInstance sql1 -Login login1 -Enable\nEnable the login\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eSet-DbaLogin -SqlInstance sql1 -Login login1, login2, login3, login4 -Enable\nEnable multiple logins\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eSet-DbaLogin -SqlInstance sql1, sql2, sql3 -Login login1, login2, login3, login4 -Enable\nEnable multiple logins on multiple instances\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eSet-DbaLogin -SqlInstance sql1 -Login login1 -Disable\nDisable the login\n-------------------------- EXAMPLE 6 --------------------------\nPS C:\\\u003eSet-DbaLogin -SqlInstance sql1 -Login login1 -DenyLogin\nDeny the login to connect to the instance\n-------------------------- EXAMPLE 7 --------------------------\nPS C:\\\u003eSet-DbaLogin -SqlInstance sql1 -Login login1 -GrantLogin\nGrant the login to connect to the instance\n-------------------------- EXAMPLE 8 --------------------------\nPS C:\\\u003eSet-DbaLogin -SqlInstance sql1 -Login login1 -PasswordPolicyEnforced\nEnforces the password policy on a login\n-------------------------- EXAMPLE 9 --------------------------\nPS C:\\\u003eSet-DbaLogin -SqlInstance sql1 -Login login1 -PasswordPolicyEnforced:$false\nDisables enforcement of the password policy on a login\n-------------------------- EXAMPLE 10 --------------------------\nPS C:\\\u003eSet-DbaLogin -SqlInstance sql1 -Login test -AddRole serveradmin\nAdd the server role \"serveradmin\" to the login\n-------------------------- EXAMPLE 11 --------------------------\nPS C:\\\u003eSet-DbaLogin -SqlInstance sql1 -Login test -RemoveRole bulkadmin\nRemove the server role \"bulkadmin\" to the login\n-------------------------- EXAMPLE 12 --------------------------\nPS C:\\\u003e$login = Get-DbaLogin -SqlInstance sql1 -Login test\nPS C:\\\u003e $login | Set-DbaLogin -Disable\nDisable the login from the pipeline", - "Syntax": "Set-DbaLogin [[-SqlInstance] \u003cDbaInstanceParameter[]\u003e] [[-SqlCredential] \u003cPSCredential\u003e] [[-Login] \u003cString[]\u003e] [[-SecurePassword] \u003cObject\u003e] [-Unlock] [-MustChange] [[-NewName] \u003cString\u003e] [-Disable] [-Enable] [-DenyLogin] [-GrantLogin] [-PasswordPolicyEnforced] [[-AddRole] \u003cString[]\u003e] [[-RemoveRole] \u003cString[]\u003e] [[-InputObject] \u003cLogin[]\u003e] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" + "Syntax": "Set-DbaLogin [[-SqlInstance] \u003cDbaInstanceParameter[]\u003e] [[-SqlCredential] \u003cPSCredential\u003e] [[-Login] \u003cString[]\u003e] [[-SecurePassword] \u003cObject\u003e] [[-DefaultDatabase] \u003cString\u003e] [-Unlock] [-MustChange] [[-NewName] \u003cString\u003e] [-Disable] [-Enable] [-DenyLogin] [-GrantLogin] [-PasswordPolicyEnforced] [[-AddRole] \u003cString[]\u003e] [[-RemoveRole] \u003cString[]\u003e] [[-InputObject] \u003cLogin[]\u003e] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Set-DbaMaxDop", + "Name": "Set-DbaMaxDop", "Description": "Uses the Test-DbaMaxDop command to get the recommended value if -MaxDop parameter is not specified.\n\nThese are just general recommendations for SQL Server and are a good starting point for setting the \"max degree of parallelism\" option.\n\nYou can set MaxDop database scoped configurations if the server is version 2016 or higher", "Tags": [ "MaxDop", "SpConfigure" ], + "Synopsis": "Sets SQL Server maximum degree of parallelism (Max DOP), then displays information relating to SQL Server Max DOP configuration settings. Works on SQL Server 2005 and higher.", + "Alias": "", + "Author": "Claudio Silva (@claudioessilva)", + "CommandName": "Set-DbaMaxDop", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Set-DbaMaxDop", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eSet-DbaMaxDop -SqlInstance sql2008, sql2012\nSets Max DOP to the recommended value for servers sql2008 and sql2012.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eSet-DbaMaxDop -SqlInstance sql2014 -MaxDop 4\nSets Max DOP to 4 for server sql2014.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eTest-DbaMaxDop -SqlInstance sql2008 | Set-DbaMaxDop\nGets the recommended Max DOP from Test-DbaMaxDop and applies it to to sql2008.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eSet-DbaMaxDop -SqlInstance sql2016 -Database db1\nSet recommended Max DOP for database db1 on server sql2016.\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eSet-DbaMaxDop -SqlInstance sql2016 -AllDatabases\nSet recommended Max DOP for all databases on server sql2016.", "Params": [ [ "SqlInstance", @@ -36217,21 +37965,22 @@ "" ] ], - "Alias": "", - "Author": "Claudio Silva (@claudioessilva)", - "Synopsis": "Sets SQL Server maximum degree of parallelism (Max DOP), then displays information relating to SQL Server Max DOP configuration settings. Works on SQL Server 2005 and higher.", - "Name": "Set-DbaMaxDop", - "Links": "https://dbatools.io/Set-DbaMaxDop", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eSet-DbaMaxDop -SqlInstance sql2008, sql2012\nSets Max DOP to the recommended value for servers sql2008 and sql2012.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eSet-DbaMaxDop -SqlInstance sql2014 -MaxDop 4\nSets Max DOP to 4 for server sql2014.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eTest-DbaMaxDop -SqlInstance sql2008 | Set-DbaMaxDop\nGets the recommended Max DOP from Test-DbaMaxDop and applies it to to sql2008.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eSet-DbaMaxDop -SqlInstance sql2016 -Database db1\nSet recommended Max DOP for database db1 on server sql2016.\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eSet-DbaMaxDop -SqlInstance sql2016 -AllDatabases\nSet recommended Max DOP for all databases on server sql2016.", "Syntax": "Set-DbaMaxDop [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [-SqlCredential \u003cPSCredential\u003e] [-Database \u003cObject[]\u003e] [-ExcludeDatabase \u003cObject[]\u003e] [-MaxDop \u003cInt32\u003e] [-InputObject \u003cPSObject\u003e] [-AllDatabases] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Set-DbaMaxMemory", + "Name": "Set-DbaMaxMemory", "Description": "Sets SQL Server max memory then displays information relating to SQL Server Max Memory configuration settings.\n\nInspired by Jonathan Kehayias\u0027s post about SQL Server Max memory (http://bit.ly/sqlmemcalc), this uses a formula to\ndetermine the default optimum RAM to use, then sets the SQL max value to that number.\n\nJonathan notes that the formula used provides a *general recommendation* that doesn\u0027t account for everything that may\nbe going on in your specific environment.", "Tags": [ "MaxMemory", "Memory" ], + "Synopsis": "Sets SQL Server \u0027Max Server Memory\u0027 configuration setting to a new value then displays information this setting.", + "Alias": "Set-SqlMaxMemory", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Set-DbaMaxMemory", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Set-DbaMaxMemory", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eSet-DbaMaxMemory sqlserver1\nSet max memory to the recommended on just one server named \"sqlserver1\"\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eSet-DbaMaxMemory -SqlInstance sqlserver1 -Max 2048\nExplicitly set max memory to 2048 on just one server, \"sqlserver1\"\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaCmsRegServer -SqlInstance sqlserver | Test-DbaMaxMemory | Where-Object { $_.MaxValue -gt $_.Total } | Set-DbaMaxMemory\nFind all servers in SQL Server Central Management Server that have Max SQL memory set to higher than the total memory\r\nof the server (think 2147483647), then pipe those to Set-DbaMaxMemory and use the default recommendation.", "Params": [ [ "SqlInstance", @@ -36290,18 +38039,19 @@ "" ] ], - "Alias": "Set-SqlMaxMemory", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Sets SQL Server \u0027Max Server Memory\u0027 configuration setting to a new value then displays information this setting.", - "Name": "Set-DbaMaxMemory", - "Links": "https://dbatools.io/Set-DbaMaxMemory", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eSet-DbaMaxMemory sqlserver1\nSet max memory to the recommended on just one server named \"sqlserver1\"\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eSet-DbaMaxMemory -SqlInstance sqlserver1 -Max 2048\nExplicitly set max memory to 2048 on just one server, \"sqlserver1\"\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaCmsRegServer -SqlInstance sqlserver | Test-DbaMaxMemory | Where-Object { $_.MaxValue -gt $_.Total } | Set-DbaMaxMemory\nFind all servers in SQL Server Central Management Server that have Max SQL memory set to higher than the total memory\r\nof the server (think 2147483647), then pipe those to Set-DbaMaxMemory and use the default recommendation.", "Syntax": "Set-DbaMaxMemory [[-SqlInstance] \u003cDbaInstanceParameter[]\u003e] [[-SqlCredential] \u003cPSCredential\u003e] [[-Max] \u003cInt32\u003e] [[-InputObject] \u003cPSObject[]\u003e] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Set-DbaNetworkCertificate", + "Name": "Set-DbaNetworkCertificate", "Description": "Sets the network certificate for SQL Server instance. This setting is found in Configuration Manager.\n\nThis command also grants read permissions for the service account on the certificate\u0027s private key.\n\nReferences:\nhttp://sqlmag.com/sql-server/7-steps-ssl-encryption\nhttps://azurebi.jppp.org/2016/01/23/using-lets-encrypt-certificates-for-secure-sql-server-connections/\nhttps://blogs.msdn.microsoft.com/sqlserverfaq/2016/09/26/creating-and-registering-ssl-certificates/", "Tags": "Certificate", + "Synopsis": "Sets the network certificate for SQL Server instance", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Set-DbaNetworkCertificate", + "Availability": "Windows only", + "Links": "https://dbatools.io/Set-DbaNetworkCertificate", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eNew-DbaComputerCertificate | Set-DbaNetworkCertificate -SqlInstance localhost\\SQL2008R2SP2\nCreates and imports a new certificate signed by an Active Directory CA on localhost then sets the network certificate for the SQL2008R2SP2 to that newly created certificate.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eSet-DbaNetworkCertificate -SqlInstance sql1\\SQL2008R2SP2 -Thumbprint 1223FB1ACBCA44D3EE9640F81B6BA14A92F3D6E2\nSets the network certificate for the SQL2008R2SP2 instance to the certificate with the thumbprint of 1223FB1ACBCA44D3EE9640F81B6BA14A92F3D6E2 in LocalMachine\\My on sql1", "Params": [ [ "SqlInstance", @@ -36360,22 +38110,23 @@ "" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Sets the network certificate for SQL Server instance", - "Name": "Set-DbaNetworkCertificate", - "Links": "https://dbatools.io/Set-DbaNetworkCertificate", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eNew-DbaComputerCertificate | Set-DbaNetworkCertificate -SqlInstance localhost\\SQL2008R2SP2\nCreates and imports a new certificate signed by an Active Directory CA on localhost then sets the network certificate for the SQL2008R2SP2 to that newly created certificate.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eSet-DbaNetworkCertificate -SqlInstance sql1\\SQL2008R2SP2 -Thumbprint 1223FB1ACBCA44D3EE9640F81B6BA14A92F3D6E2\nSets the network certificate for the SQL2008R2SP2 instance to the certificate with the thumbprint of 1223FB1ACBCA44D3EE9640F81B6BA14A92F3D6E2 in LocalMachine\\My on sql1", "Syntax": "Set-DbaNetworkCertificate [-SqlInstance \u003cDbaInstanceParameter[]\u003e] [-Credential \u003cPSCredential\u003e] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]\nSet-DbaNetworkCertificate [-SqlInstance \u003cDbaInstanceParameter[]\u003e] [-Credential \u003cPSCredential\u003e] -Certificate \u003cX509Certificate2\u003e [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]\nSet-DbaNetworkCertificate [-SqlInstance \u003cDbaInstanceParameter[]\u003e] [-Credential \u003cPSCredential\u003e] -Thumbprint \u003cString\u003e [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Set-DbaPowerPlan", + "Name": "Set-DbaPowerPlan", "Description": "Sets the SQL Server OS\u0027s Power Plan. Defaults to High Performance which is best practice.\n\nIf your organization uses a custom power plan that is considered best practice, specify -CustomPowerPlan.\n\nReferences:\nhttps://support.microsoft.com/en-us/kb/2207548\nhttp://www.sqlskills.com/blogs/glenn/windows-power-plan-effects-on-newer-intel-processors/", "Tags": [ "PowerPlan", "OS", "Configure" ], + "Synopsis": "Sets the SQL Server OS\u0027s Power Plan.", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Set-DbaPowerPlan", + "Availability": "Windows only", + "Links": "https://dbatools.io/Set-DbaPowerPlan", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eSet-DbaPowerPlan -ComputerName sql2017\nSets the Power Plan to High Performance. Skips it if its already set.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003e\u0027Server1\u0027, \u0027Server2\u0027 | Set-DbaPowerPlan -PowerPlan Balanced\nSets the Power Plan to Balanced for Server1 and Server2. Skips it if its already set.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003e$cred = Get-Credential \u0027Domain\\User\u0027\nPS C:\\\u003e Set-DbaPowerPlan -ComputerName sql2017 -Credential $cred\nConnects using alternative Windows credential and sets the Power Plan to High Performance. Skips it if its already set.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eSet-DbaPowerPlan -ComputerName sqlcluster -CustomPowerPlan \u0027Maximum Performance\u0027\nSets the Power Plan to the custom power plan called \"Maximum Performance\". Skips it if its already set.", "Params": [ [ "ComputerName", @@ -36442,80 +38193,82 @@ "" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Sets the SQL Server OS\u0027s Power Plan.", - "Name": "Set-DbaPowerPlan", - "Links": "https://dbatools.io/Set-DbaPowerPlan", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eSet-DbaPowerPlan -ComputerName sql2017\nSets the Power Plan to High Performance. Skips it if its already set.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003e\u0027Server1\u0027, \u0027Server2\u0027 | Set-DbaPowerPlan -PowerPlan Balanced\nSets the Power Plan to Balanced for Server1 and Server2. Skips it if its already set.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003e$cred = Get-Credential \u0027Domain\\User\u0027\nPS C:\\\u003e Set-DbaPowerPlan -ComputerName sql2017 -Credential $cred\nConnects using alternative Windows credential and sets the Power Plan to High Performance. Skips it if its already set.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eSet-DbaPowerPlan -ComputerName sqlcluster -CustomPowerPlan \u0027Maximum Performance\u0027\nSets the Power Plan to the custom power plan called \"Maximum Performance\". Skips it if its already set.", - "Syntax": "Set-DbaPowerPlan [[-ComputerName] \u003cDbaInstanceParameter[]\u003e] [[-Credential] \u003cPSCredential\u003e] [[-PowerPlan] \u003cString\u003e] [[-CustomPowerPlan] \u003cString\u003e] [[-InputObject] \u003cPSObject\u003e] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" - }, - { - "CommandName": "Set-DbaPrivilege", - "Description": "Adds the SQL Service account to local privileges \u0027Lock Pages in Memory\u0027, \u0027Instant File Initialization\u0027, \u0027Logon as Batch\u0027 on one or more computers.\n\nRequires Local Admin rights on destination computer(s).", - "Tags": "Privilege", - "Params": [ - [ - "ComputerName", - "The target SQL Server instance or instances.", - "cn,host,Server", - false, - "true (ByValue)", - "$env:COMPUTERNAME" - ], - [ - "Credential", - "Credential object used to connect to the computer as a different user.", - "", - false, - "false", - "" - ], - [ - "Type", - "Use this to choose the privilege(s) to which you want to add the SQL Service account.\r\nAccepts \u0027IFI\u0027, \u0027LPIM\u0027 and/or \u0027BatchLogon\u0027 for local privileges \u0027Instant File Initialization\u0027, \u0027Lock Pages in Memory\u0027 and \u0027Logon as Batch\u0027.", - "", - true, - "false", - "" - ], - [ - "EnableException", - "By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message.\r\nThis avoids overwhelming you with \"sea of red\" exceptions, but is inconvenient because it basically disables advanced scripting.\r\nUsing this switch turns this \"nice by default\" feature off and enables you to catch exceptions with your own try/catch.", - "Silent", - false, - "false", - "False" - ], - [ - "WhatIf", - "If this switch is enabled, no actions are performed but informational messages will be displayed that explain what would happen if the command were to run.", - "wi", - false, - "false", - "" - ], - [ - "Confirm", - "If this switch is enabled, you will be prompted for confirmation before executing any operations that change state.", - "cf", - false, - "false", - "" - ] - ], + "Syntax": "Set-DbaPowerPlan [[-ComputerName] \u003cDbaInstanceParameter[]\u003e] [[-Credential] \u003cPSCredential\u003e] [[-PowerPlan] \u003cString\u003e] [[-CustomPowerPlan] \u003cString\u003e] [[-InputObject] \u003cPSObject\u003e] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" + }, + { + "Name": "Set-DbaPrivilege", + "Description": "Adds the SQL Service account to local privileges \u0027Lock Pages in Memory\u0027, \u0027Instant File Initialization\u0027, \u0027Logon as Batch\u0027 on one or more computers.\n\nRequires Local Admin rights on destination computer(s).", + "Tags": "Privilege", + "Synopsis": "Adds the SQL Service account to local privileges on one or more computers.", "Alias": "", "Author": "Klaas Vandenberghe ( @PowerDBAKlaas )", - "Synopsis": "Adds the SQL Service account to local privileges on one or more computers.", - "Name": "Set-DbaPrivilege", + "CommandName": "Set-DbaPrivilege", + "Availability": "Windows only", "Links": "https://dbatools.io/Set-DbaPrivilege", "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eSet-DbaPrivilege -ComputerName sqlserver2014a -Type LPIM,IFI\nAdds the SQL Service account(s) on computer sqlserver2014a to the local privileges \u0027SeManageVolumePrivilege\u0027 and \u0027SeLockMemoryPrivilege\u0027.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003e\u0027sql1\u0027,\u0027sql2\u0027,\u0027sql3\u0027 | Set-DbaPrivilege -Type IFI\nAdds the SQL Service account(s) on computers sql1, sql2 and sql3 to the local privilege \u0027SeManageVolumePrivilege\u0027.", + "Params": [ + [ + "ComputerName", + "The target SQL Server instance or instances.", + "cn,host,Server", + false, + "true (ByValue)", + "$env:COMPUTERNAME" + ], + [ + "Credential", + "Credential object used to connect to the computer as a different user.", + "", + false, + "false", + "" + ], + [ + "Type", + "Use this to choose the privilege(s) to which you want to add the SQL Service account.\r\nAccepts \u0027IFI\u0027, \u0027LPIM\u0027 and/or \u0027BatchLogon\u0027 for local privileges \u0027Instant File Initialization\u0027, \u0027Lock Pages in Memory\u0027 and \u0027Logon as Batch\u0027.", + "", + true, + "false", + "" + ], + [ + "EnableException", + "By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message.\r\nThis avoids overwhelming you with \"sea of red\" exceptions, but is inconvenient because it basically disables advanced scripting.\r\nUsing this switch turns this \"nice by default\" feature off and enables you to catch exceptions with your own try/catch.", + "Silent", + false, + "false", + "False" + ], + [ + "WhatIf", + "If this switch is enabled, no actions are performed but informational messages will be displayed that explain what would happen if the command were to run.", + "wi", + false, + "false", + "" + ], + [ + "Confirm", + "If this switch is enabled, you will be prompted for confirmation before executing any operations that change state.", + "cf", + false, + "false", + "" + ] + ], "Syntax": "Set-DbaPrivilege [[-ComputerName] \u003cDbaInstanceParameter[]\u003e] [[-Credential] \u003cPSCredential\u003e] [-Type] \u003cString[]\u003e [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Set-DbaSpConfigure", + "Name": "Set-DbaSpConfigure", "Description": "This function changes the configured value for sp_configure settings. If the setting is dynamic this setting will be used, otherwise the user will be warned that a restart of SQL is required.\nThis is designed to be safe and will not allow for configurations to be set outside of the defined configuration min and max values.\nWhile it is possible to set below the min, or above the max this can cause serious problems with SQL Server (including startup failures), and so is not permitted.", "Tags": "SpConfigure", + "Synopsis": "Changes the server level system configuration (sys.configuration/sp_configure) value for a given configuration", + "Alias": "", + "Author": "Nic Cain, https://sirsql.net/", + "CommandName": "Set-DbaSpConfigure", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Set-DbaSpConfigure", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eSet-DbaSpConfigure -SqlInstance localhost -Name ScanForStartupProcedures -Value 1\nAdjusts the Scan for startup stored procedures configuration value to 1 and notifies the user that this requires a SQL restart to take effect\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaSpConfigure -SqlInstance sql2017, sql2014 -Name XPCmdShellEnabled, IsSqlClrEnabled | Set-DbaSpConfigure -Value $false\nSets the values for XPCmdShellEnabled and IsSqlClrEnabled on sql2017 and sql2014 to False\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eSet-DbaSpConfigure -SqlInstance localhost -Name XPCmdShellEnabled -Value 1\nAdjusts the xp_cmdshell configuration value to 1.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eSet-DbaSpConfigure -SqlInstance localhost -Name XPCmdShellEnabled -Value 1 -WhatIf\nReturns information on the action that would be performed. No actual change will be made.", "Params": [ [ "SqlInstance", @@ -36582,18 +38335,19 @@ "" ] ], - "Alias": "", - "Author": "Nic Cain, https://sirsql.net/", - "Synopsis": "Changes the server level system configuration (sys.configuration/sp_configure) value for a given configuration", - "Name": "Set-DbaSpConfigure", - "Links": "https://dbatools.io/Set-DbaSpConfigure", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eSet-DbaSpConfigure -SqlInstance localhost -Name ScanForStartupProcedures -Value 1\nAdjusts the Scan for startup stored procedures configuration value to 1 and notifies the user that this requires a SQL restart to take effect\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaSpConfigure -SqlInstance sql2017, sql2014 -Name XPCmdShellEnabled, IsSqlClrEnabled | Set-DbaSpConfigure -Value $false\nSets the values for XPCmdShellEnabled and IsSqlClrEnabled on sql2017 and sql2014 to False\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eSet-DbaSpConfigure -SqlInstance localhost -Name XPCmdShellEnabled -Value 1\nAdjusts the xp_cmdshell configuration value to 1.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eSet-DbaSpConfigure -SqlInstance localhost -Name XPCmdShellEnabled -Value 1 -WhatIf\nReturns information on the action that would be performed. No actual change will be made.", "Syntax": "Set-DbaSpConfigure [[-SqlInstance] \u003cDbaInstanceParameter[]\u003e] [[-SqlCredential] \u003cPSCredential\u003e] [[-Value] \u003cInt32\u003e] [[-Name] \u003cString[]\u003e] [[-InputObject] \u003cObject[]\u003e] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Set-DbaSpn", + "Name": "Set-DbaSpn", "Description": "This function will connect to Active Directory and search for an account. If the account is found, it will attempt to add an SPN. Once the SPN is added, the function will also set delegation to that service, unless -NoDelegation is specified. In order to run this function, the credential you provide must have write access to Active Directory.\n\nNote: This function supports -WhatIf", "Tags": "SPN", + "Synopsis": "Sets an SPN for a given service account in active directory (and also enables delegation to the same SPN by default)", + "Alias": "", + "Author": "Drew Furgiuele (@pittfurg), http://www.port1433.com", + "CommandName": "Set-DbaSpn", + "Availability": "Windows only", + "Links": "https://dbatools.io/Set-DbaSpn", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eSet-DbaSpn -SPN MSSQLSvc/SQLSERVERA.domain.something -ServiceAccount domain\\account\nPS C:\\\u003e Set-DbaSpn -SPN MSSQLSvc/SQLSERVERA.domain.something -ServiceAccount domain\\account -EnableException\nConnects to Active Directory and adds a provided SPN to the given account.\r\nConnects to Active Directory and adds a provided SPN to the given account, suppressing all error messages and throw exceptions that can be caught instead\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eSet-DbaSpn -SPN MSSQLSvc/SQLSERVERA.domain.something -ServiceAccount domain\\account -Credential ad\\sqldba\nConnects to Active Directory and adds a provided SPN to the given account. Uses alternative account to connect to AD.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eSet-DbaSpn -SPN MSSQLSvc/SQLSERVERA.domain.something -ServiceAccount domain\\account -NoDelegation\nConnects to Active Directory and adds a provided SPN to the given account, without the delegation.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eTest-DbaSpn -ComputerName sql2016 | Where { $_.isSet -eq $false } | Set-DbaSpn\nSets all missing SPNs for sql2016\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eTest-DbaSpn -ComputerName sql2016 | Where { $_.isSet -eq $false } | Set-DbaSpn -WhatIf\nDisplays what would happen trying to set all missing SPNs for sql2016", "Params": [ [ "SPN", @@ -36652,22 +38406,23 @@ "" ] ], - "Alias": "", - "Author": "Drew Furgiuele (@pittfurg), http://www.port1433.com", - "Synopsis": "Sets an SPN for a given service account in active directory (and also enables delegation to the same SPN by default)", - "Name": "Set-DbaSpn", - "Links": "https://dbatools.io/Set-DbaSpn", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eSet-DbaSpn -SPN MSSQLSvc\\SQLSERVERA.domain.something -ServiceAccount domain\\account\nPS C:\\\u003e Set-DbaSpn -SPN MSSQLSvc\\SQLSERVERA.domain.something -ServiceAccount domain\\account -EnableException\nConnects to Active Directory and adds a provided SPN to the given account.\r\nConnects to Active Directory and adds a provided SPN to the given account, suppressing all error messages and throw exceptions that can be caught instead\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eSet-DbaSpn -SPN MSSQLSvc\\SQLSERVERA.domain.something -ServiceAccount domain\\account -Credential ad\\sqldba\nConnects to Active Directory and adds a provided SPN to the given account. Uses alternative account to connect to AD.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eSet-DbaSpn -SPN MSSQLSvc\\SQLSERVERA.domain.something -ServiceAccount domain\\account -NoDelegation\nConnects to Active Directory and adds a provided SPN to the given account, without the delegation.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eTest-DbaSpn -ComputerName sql2016 | Where { $_.isSet -eq $false } | Set-DbaSpn\nSets all missing SPNs for sql2016\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eTest-DbaSpn -ComputerName sql2016 | Where { $_.isSet -eq $false } | Set-DbaSpn -WhatIf\nDisplays what would happen trying to set all missing SPNs for sql2016", "Syntax": "Set-DbaSpn [-SPN] \u003cString\u003e [-ServiceAccount] \u003cString\u003e [[-Credential] \u003cPSCredential\u003e] [-NoDelegation] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Set-DbaStartupParameter", + "Name": "Set-DbaStartupParameter", "Description": "Modifies the startup parameters for a specified SQL Server Instance\n\nFor full details of what each parameter does, please refer to this MSDN article - https://msdn.microsoft.com/en-us/library/ms190737(v=sql.105).aspx", "Tags": [ "Startup", "Parameter", "Configure" ], + "Synopsis": "Sets the Startup Parameters for a SQL Server instance", + "Alias": "", + "Author": "Stuart Moore (@napalmgram), stuart-moore.com", + "CommandName": "Set-DbaStartupParameter", + "Availability": "Windows only", + "Links": null, + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eSet-DbaStartupParameter -SqlInstance server1\\instance1 -SingleUser\nWill configure the SQL Instance server1\\instance1 to startup up in Single User mode at next startup\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eSet-DbaStartupParameter -SqlInstance sql2016 -IncreasedExtents\nWill configure the SQL Instance sql2016 to IncreasedExtents = True (-E)\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eSet-DbaStartupParameter -SqlInstance sql2016 -IncreasedExtents:$false -WhatIf\nShows what would happen if you attempted to configure the SQL Instance sql2016 to IncreasedExtents = False (no -E)\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eSet-DbaStartupParameter -SqlInstance server1\\instance1 -SingleUser -TraceFlags 8032,8048\nThis will append Trace Flags 8032 and 8048 to the startup parameters\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eSet-DbaStartupParameter -SqlInstance sql2016 -SingleUser:$false -TraceFlagsOverride\nThis will remove all trace flags and set SingleUser to false\n-------------------------- EXAMPLE 6 --------------------------\nPS C:\\\u003eSet-DbaStartupParameter -SqlInstance server1\\instance1 -SingleUser -TraceFlags 8032,8048 -TraceFlagsOverride\nThis will set Trace Flags 8032 and 8048 to the startup parameters, removing any existing Trace Flags\n-------------------------- EXAMPLE 7 --------------------------\nPS C:\\\u003eSet-DbaStartupParameter -SqlInstance sql2016 -SingleUser:$false -TraceFlagsOverride -Offline\nThis will remove all trace flags and set SingleUser to false from an offline instance\n-------------------------- EXAMPLE 8 --------------------------\nPS C:\\\u003eSet-DbaStartupParameter -SqlInstance sql2016 -ErrorLog c:\\Sql\\ -Offline\nThis will attempt to change the ErrorLog path to c:\\sql\\. However, with the offline switch this will not happen. To force it, use the -Force switch like so:\nSet-DbaStartupParameter -SqlInstance sql2016 -ErrorLog c:\\Sql\\ -Offline -Force\n-------------------------- EXAMPLE 9 --------------------------\nPS C:\\\u003e$StartupConfig = Get-DbaStartupParameter -SqlInstance server1\\instance1\nPS C:\\\u003e Set-DbaStartupParameter -SqlInstance server1\\instance1 -SingleUser -NoLoggingToWinEvents\r\nPS C:\\\u003e #Restart your SQL instance with the tool of choice\r\nPS C:\\\u003e #Do Some work\r\nPS C:\\\u003e Set-DbaStartupParameter -SqlInstance server1\\instance1 -StartUpConfig $StartUpConfig\r\nPS C:\\\u003e #Restart your SQL instance with the tool of choice and you\u0027re back to normal\nIn this example we take a copy of the existing startup configuration of server1\\instance1\nWe then change the startup parameters ahead of some work\nAfter the work has been completed, we can push the original startup parameters back to server1\\instance1 and resume normal operation", "Params": [ [ "SqlInstance", @@ -36854,16 +38609,10 @@ "" ] ], - "Alias": "", - "Author": "Stuart Moore (@napalmgram), stuart-moore.com", - "Synopsis": "Sets the Startup Parameters for a SQL Server instance", - "Name": "Set-DbaStartupParameter", - "Links": null, - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eSet-DbaStartupParameter -SqlInstance server1\\instance1 -SingleUser\nWill configure the SQL Instance server1\\instance1 to startup up in Single User mode at next startup\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eSet-DbaStartupParameter -SqlInstance sql2016 -IncreasedExtents\nWill configure the SQL Instance sql2016 to IncreasedExtents = True (-E)\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eSet-DbaStartupParameter -SqlInstance sql2016 -IncreasedExtents:$false -WhatIf\nShows what would happen if you attempted to configure the SQL Instance sql2016 to IncreasedExtents = False (no -E)\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eSet-DbaStartupParameter -SqlInstance server1\\instance1 -SingleUser -TraceFlags 8032,8048\nThis will append Trace Flags 8032 and 8048 to the startup parameters\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eSet-DbaStartupParameter -SqlInstance sql2016 -SingleUser:$false -TraceFlagsOverride\nThis will remove all trace flags and set SingleUser to false\n-------------------------- EXAMPLE 6 --------------------------\nPS C:\\\u003eSet-DbaStartupParameter -SqlInstance server1\\instance1 -SingleUser -TraceFlags 8032,8048 -TraceFlagsOverride\nThis will set Trace Flags 8032 and 8048 to the startup parameters, removing any existing Trace Flags\n-------------------------- EXAMPLE 7 --------------------------\nPS C:\\\u003eSet-DbaStartupParameter -SqlInstance sql2016 -SingleUser:$false -TraceFlagsOverride -Offline\nThis will remove all trace flags and set SingleUser to false from an offline instance\n-------------------------- EXAMPLE 8 --------------------------\nPS C:\\\u003eSet-DbaStartupParameter -SqlInstance sql2016 -ErrorLog c:\\Sql\\ -Offline\nThis will attempt to change the ErrorLog path to c:\\sql\\. However, with the offline switch this will not happen. To force it, use the -Force switch like so:\nSet-DbaStartupParameter -SqlInstance sql2016 -ErrorLog c:\\Sql\\ -Offline -Force\n-------------------------- EXAMPLE 9 --------------------------\nPS C:\\\u003e$StartupConfig = Get-DbaStartupParameter -SqlInstance server1\\instance1\nPS C:\\\u003e Set-DbaStartupParameter -SqlInstance server1\\instance1 -SingleUser -NoLoggingToWinEvents\r\nPS C:\\\u003e #Restart your SQL instance with the tool of choice\r\nPS C:\\\u003e #Do Some work\r\nPS C:\\\u003e Set-DbaStartupParameter -SqlInstance server1\\instance1 -StartUpConfig $StartUpConfig\r\nPS C:\\\u003e #Restart your SQL instance with the tool of choice and you\u0027re back to normal\nIn this example we take a copy of the existing startup configuration of server1\\instance1\nWe then change the startup parameters ahead of some work\nAfter the work has been completed, we can push the original startup parameters back to server1\\instance1 and resume normal operation", "Syntax": "Set-DbaStartupParameter [-SqlInstance] \u003cDbaInstanceParameter\u003e [[-SqlCredential] \u003cPSCredential\u003e] [[-Credential] \u003cPSCredential\u003e] [[-MasterData] \u003cString\u003e] [[-MasterLog] \u003cString\u003e] [[-ErrorLog] \u003cString\u003e] [[-TraceFlags] \u003cString[]\u003e] [-CommandPromptStart] [-MinimalStart] [[-MemoryToReserve] \u003cInt32\u003e] [-SingleUser] [[-SingleUserDetails] \u003cString\u003e] [-NoLoggingToWinEvents] [-StartAsNamedInstance] [-DisableMonitoring] [-IncreasedExtents] [-TraceFlagsOverride] [[-StartUpConfig] \u003cObject\u003e] [-Offline] [-Force] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Set-DbaTcpPort", + "Name": "Set-DbaTcpPort", "Description": "This function changes the TCP port used by the specified SQL Server.", "Tags": [ "Service", @@ -36871,6 +38620,13 @@ "TCP", "Configure" ], + "Synopsis": "Changes the TCP port used by the specified SQL Server.", + "Alias": "", + "Author": "@H0s0n77", + "CommandName": "Set-DbaTcpPort", + "Availability": "Windows only", + "Links": "https://dbatools.io/Set-DbaTcpPort", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eSet-DbaTcpPort -SqlInstance sql2017 -Port 1433\nSets the port number 1433 for all IP Addresses on the default instance on sql2017. Prompts for confirmation.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eSet-DbaTcpPort -SqlInstance winserver\\sqlexpress -IpAddress 192.168.1.22 -Port 1433 -Confirm:$false\nSets the port number 1433 for IP 192.168.1.22 on the sqlexpress instance on winserver. Does not prompt for confirmation.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eSet-DbaTcpPort -SqlInstance sql2017, sql2019 -port 1337 -Credential ad\\dba\nSets the port number 1337 for all IP Addresses on SqlInstance sql2017 and sql2019 using the credentials for ad\\dba. Prompts for confirmation.", "Params": [ [ "SqlInstance", @@ -36929,16 +38685,10 @@ "" ] ], - "Alias": "", - "Author": "@H0s0n77", - "Synopsis": "Changes the TCP port used by the specified SQL Server.", - "Name": "Set-DbaTcpPort", - "Links": "https://dbatools.io/Set-DbaTcpPort", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eSet-DbaTcpPort -SqlInstance sql2017 -Port 1433\nSets the port number 1433 for all IP Addresses on the default instance on sql2017. Prompts for confirmation.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eSet-DbaTcpPort -SqlInstance winserver\\sqlexpress -IpAddress 192.168.1.22 -Port 1433 -Confirm:$false\nSets the port number 1433 for IP 192.168.1.22 on the sqlexpress instance on winserver. Does not prompt for confirmation.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eSet-DbaTcpPort -SqlInstance sql2017, sql2019 -port 1337 -Credential ad\\dba\nSets the port number 1337 for all IP Addresses on SqlInstance sql2017 and sql2019 using the credentials for ad\\dba. Prompts for confirmation.", "Syntax": "Set-DbaTcpPort [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-Credential] \u003cPSCredential\u003e] [-Port] \u003cInt32\u003e [[-IpAddress] \u003cIPAddress[]\u003e] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Set-DbaTempdbConfig", + "Name": "Set-DbaTempdbConfig", "Description": "Calculates tempdb size and file configurations based on passed parameters, calculated values, and Microsoft best practices. User must declare SQL Server to be configured and total data file size as mandatory values. Function then calculates the number of data files based on logical cores on the target host and create evenly sized data files based on the total data size declared by the user, with a log file 25% of the total data file size.\n\nOther parameters can adjust the settings as the user desires (such as different file paths, number of data files, and log file size). No functions that shrink or delete data files are performed. If you wish to do this, you will need to resize tempdb so that it is \"smaller\" than what the function will size it to before running the function.", "Tags": [ "Tempdb", @@ -36946,6 +38696,13 @@ "Configure", "Configuration" ], + "Synopsis": "Sets tempdb data and log files according to best practices.", + "Alias": "Set-DbaTempDbConfiguration,Set-SqlTempDbConfiguration", + "Author": "Michael Fal (@Mike_Fal), http://mikefal.net", + "CommandName": "Set-DbaTempdbConfig", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Set-DbaTempdbConfig", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eSet-DbaTempdbConfig -SqlInstance localhost -DataFileSize 1000\nCreates tempdb with a number of data files equal to the logical cores where each file is equal to 1000MB divided by the number of logical cores, with a log file of 250MB.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eSet-DbaTempdbConfig -SqlInstance localhost -DataFileSize 1000 -DataFileCount 8\nCreates tempdb with 8 data files, each one sized at 125MB, with a log file of 250MB.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eSet-DbaTempdbConfig -SqlInstance localhost -DataFileSize 1000 -OutputScriptOnly\nProvides a SQL script output to configure tempdb according to the passed parameters.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eSet-DbaTempdbConfig -SqlInstance localhost -DataFileSize 1000 -DisableGrowth\nDisables the growth for the data and log files.\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eSet-DbaTempdbConfig -SqlInstance localhost -DataFileSize 1000 -OutputScriptOnly\nReturns the T-SQL script representing tempdb configuration.", "Params": [ [ "SqlInstance", @@ -37068,21 +38825,22 @@ "" ] ], - "Alias": "Set-DbaTempDbConfiguration,Set-SqlTempDbConfiguration", - "Author": "Michael Fal (@Mike_Fal), http://mikefal.net", - "Synopsis": "Sets tempdb data and log files according to best practices.", - "Name": "Set-DbaTempdbConfig", - "Links": "https://dbatools.io/Set-DbaTempdbConfig", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eSet-DbaTempdbConfig -SqlInstance localhost -DataFileSize 1000\nCreates tempdb with a number of data files equal to the logical cores where each file is equal to 1000MB divided by the number of logical cores, with a log file of 250MB.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eSet-DbaTempdbConfig -SqlInstance localhost -DataFileSize 1000 -DataFileCount 8\nCreates tempdb with 8 data files, each one sized at 125MB, with a log file of 250MB.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eSet-DbaTempdbConfig -SqlInstance localhost -DataFileSize 1000 -OutputScriptOnly\nProvides a SQL script output to configure tempdb according to the passed parameters.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eSet-DbaTempdbConfig -SqlInstance localhost -DataFileSize 1000 -DisableGrowth\nDisables the growth for the data and log files.\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eSet-DbaTempdbConfig -SqlInstance localhost -DataFileSize 1000 -OutputScriptOnly\nReturns the T-SQL script representing tempdb configuration.", "Syntax": "Set-DbaTempdbConfig [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [[-DataFileCount] \u003cInt32\u003e] [-DataFileSize] \u003cInt32\u003e [[-LogFileSize] \u003cInt32\u003e] [[-DataFileGrowth] \u003cInt32\u003e] [[-LogFileGrowth] \u003cInt32\u003e] [[-DataPath] \u003cString\u003e] [[-LogPath] \u003cString\u003e] [[-OutFile] \u003cString\u003e] [-OutputScriptOnly] [-DisableGrowth] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Show-DbaDbList", + "Name": "Show-DbaDbList", "Description": "Shows a list of databases in a GUI. Returns a string holding the name of the selected database. Hitting cancel returns null.", "Tags": [ "Database", "FileSystem" ], + "Synopsis": "Shows a list of databases in a GUI.", + "Alias": "Show-DbaDatabaseList,Show-SqlDatabaseList", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Show-DbaDbList", + "Availability": "Windows only", + "Links": "https://dbatools.io/Show-DbaDbList", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eShow-DbaDbList -SqlInstance sqlserver2014a\nShows a GUI list of databases using Windows Authentication to connect to the SQL Server. Returns a string of the selected database.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eShow-DbaDbList -SqlInstance sqlserver2014a -SqlCredential $cred\nShows a GUI list of databases using SQL credentials to connect to the SQL Server. Returns a string of the selected database.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eShow-DbaDbList -SqlInstance sqlserver2014a -DefaultDb master\nShows a GUI list of databases using Windows Authentication to connect to the SQL Server. The \"master\" database will be selected when the lists shows. Returns a string of the selected database.", "Params": [ [ "SqlInstance", @@ -37125,21 +38883,22 @@ "" ] ], - "Alias": "Show-DbaDatabaseList,Show-SqlDatabaseList", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Shows a list of databases in a GUI.", - "Name": "Show-DbaDbList", - "Links": "https://dbatools.io/Show-DbaDbList", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eShow-DbaDbList -SqlInstance sqlserver2014a\nShows a GUI list of databases using Windows Authentication to connect to the SQL Server. Returns a string of the selected database.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eShow-DbaDbList -SqlInstance sqlserver2014a -SqlCredential $cred\nShows a GUI list of databases using SQL credentials to connect to the SQL Server. Returns a string of the selected database.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eShow-DbaDbList -SqlInstance sqlserver2014a -DefaultDb master\nShows a GUI list of databases using Windows Authentication to connect to the SQL Server. The \"master\" database will be selected when the lists shows. Returns a string of the selected database.", "Syntax": "Show-DbaDbList [-SqlInstance] \u003cDbaInstanceParameter\u003e [[-SqlCredential] \u003cPSCredential\u003e] [[-Title] \u003cString\u003e] [[-Header] \u003cString\u003e] [[-DefaultDb] \u003cString\u003e] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Show-DbaServerFileSystem", + "Name": "Show-DbaServerFileSystem", "Description": "Similar to the remote file system popup you see when browsing a remote SQL Server in SQL Server Management Studio, this function allows you to traverse the remote SQL Server\u0027s file structure.\n\nShow-DbaServerFileSystem uses SQL Management Objects to browse the directories and what you see is limited to the permissions of the account running the command.", "Tags": [ "Storage", "FileSystem" ], + "Synopsis": "Shows file system on remote SQL Server in a local GUI and returns the selected directory name", + "Alias": "Show-SqlServerFileSystem", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Show-DbaServerFileSystem", + "Availability": "Windows only", + "Links": "https://dbatools.io/Show-DbaServerFileSystem", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eShow-DbaServerFileSystem -SqlInstance sql2017\nShows a list of databases using Windows Authentication to connect to the SQL Server. Returns a string of the selected path.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eShow-DbaServerFileSystem -SqlInstance sql2017 -SqlCredential $cred\nShows a list of databases using SQL credentials to connect to the SQL Server. Returns a string of the selected path.", "Params": [ [ "SqlInstance", @@ -37166,21 +38925,22 @@ "False" ] ], - "Alias": "Show-SqlServerFileSystem", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Shows file system on remote SQL Server in a local GUI and returns the selected directory name", - "Name": "Show-DbaServerFileSystem", - "Links": "https://dbatools.io/Show-DbaServerFileSystem", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eShow-DbaServerFileSystem -SqlInstance sql2017\nShows a list of databases using Windows Authentication to connect to the SQL Server. Returns a string of the selected path.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eShow-DbaServerFileSystem -SqlInstance sql2017 -SqlCredential $cred\nShows a list of databases using SQL credentials to connect to the SQL Server. Returns a string of the selected path.", "Syntax": "Show-DbaServerFileSystem [-SqlInstance] \u003cDbaInstanceParameter\u003e [[-SqlCredential] \u003cPSCredential\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Start-DbaAgentJob", + "Name": "Start-DbaAgentJob", "Description": "This command starts a job then returns connected SMO object for SQL Agent Job information for each instance(s) of SQL Server.", "Tags": [ "Job", "Agent" ], + "Synopsis": "Starts a running SQL Server Agent Job.", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Start-DbaAgentJob", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Start-DbaAgentJob", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eStart-DbaAgentJob -SqlInstance localhost\nStarts all running SQL Agent Jobs on the local SQL Server instance\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaAgentJob -SqlInstance sql2016 -Job cdc.DBWithCDC_capture | Start-DbaAgentJob\nStarts the cdc.DBWithCDC_capture SQL Agent Job on sql2016\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eStart-DbaAgentJob -SqlInstance sql2016 -Job cdc.DBWithCDC_capture\nStarts the cdc.DBWithCDC_capture SQL Agent Job on sql2016\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003e$servers | Find-DbaAgentJob -IsFailed | Start-DbaAgentJob\nRestarts all failed jobs on all servers in the $servers collection\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eStart-DbaAgentJob -SqlInstance sql2016 -AllJobs\nStart all the jobs", "Params": [ [ "SqlInstance", @@ -37279,18 +39039,19 @@ "" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Starts a running SQL Server Agent Job.", - "Name": "Start-DbaAgentJob", - "Links": "https://dbatools.io/Start-DbaAgentJob", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eStart-DbaAgentJob -SqlInstance localhost\nStarts all running SQL Agent Jobs on the local SQL Server instance\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaAgentJob -SqlInstance sql2016 -Job cdc.DBWithCDC_capture | Start-DbaAgentJob\nStarts the cdc.DBWithCDC_capture SQL Agent Job on sql2016\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eStart-DbaAgentJob -SqlInstance sql2016 -Job cdc.DBWithCDC_capture\nStarts the cdc.DBWithCDC_capture SQL Agent Job on sql2016\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003e$servers | Find-DbaAgentJob -IsFailed | Start-DbaAgentJob\nRestarts all failed jobs on all servers in the $servers collection\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eStart-DbaAgentJob -SqlInstance sql2016 -AllJobs\nStart all the jobs", "Syntax": "Start-DbaAgentJob [-SqlCredential \u003cPSCredential\u003e] [-Job \u003cString[]\u003e] [-ExcludeJob \u003cString[]\u003e] [-AllJobs] [-Wait] [-WaitPeriod \u003cInt32\u003e] [-SleepPeriod \u003cInt32\u003e] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]\nStart-DbaAgentJob -SqlInstance \u003cDbaInstanceParameter[]\u003e [-SqlCredential \u003cPSCredential\u003e] [-Job \u003cString[]\u003e] [-ExcludeJob \u003cString[]\u003e] [-AllJobs] [-Wait] [-WaitPeriod \u003cInt32\u003e] [-SleepPeriod \u003cInt32\u003e] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]\nStart-DbaAgentJob [-SqlCredential \u003cPSCredential\u003e] [-Job \u003cString[]\u003e] [-ExcludeJob \u003cString[]\u003e] -InputObject \u003cJob[]\u003e [-AllJobs] [-Wait] [-WaitPeriod \u003cInt32\u003e] [-SleepPeriod \u003cInt32\u003e] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Start-DbaEndpoint", + "Name": "Start-DbaEndpoint", "Description": "Starts endpoints on a SQL Server instance.", "Tags": "Endpoint", + "Synopsis": "Starts endpoints on a SQL Server instance.", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Start-DbaEndpoint", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Start-DbaEndpoint", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eStart-DbaEndpoint -SqlInstance sqlserver2012 -AllEndpoints\nStarts all endpoints on the sqlserver2014 instance.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eStart-DbaEndpoint -SqlInstance sqlserver2012 -Endpoint endpoint1,endpoint2 -SqlCredential sqladmin\nLogs into sqlserver2012 using alternative credentials and starts the endpoint1 and endpoint2 endpoints.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-Endpoint -SqlInstance sqlserver2012 -Endpoint endpoint1 | Start-DbaEndpoint\nStarts the endpoints returned from the Get-Endpoint function.", "Params": [ [ "SqlInstance", @@ -37357,18 +39118,19 @@ "" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Starts endpoints on a SQL Server instance.", - "Name": "Start-DbaEndpoint", - "Links": "https://dbatools.io/Start-DbaEndpoint", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eStart-DbaEndpoint -SqlInstance sqlserver2012 -AllEndpoints\nStarts all endpoints on the sqlserver2014 instance.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eStart-DbaEndpoint -SqlInstance sqlserver2012 -Endpoint endpoint1,endpoint2 -SqlCredential sqladmin\nLogs into sqlserver2012 using alternative credentials and starts the endpoint1 and endpoint2 endpoints.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-Endpoint -SqlInstance sqlserver2012 -Endpoint endpoint1 | Start-DbaEndpoint\nStarts the endpoints returned from the Get-Endpoint function.", "Syntax": "Start-DbaEndpoint [[-SqlInstance] \u003cDbaInstanceParameter[]\u003e] [[-SqlCredential] \u003cPSCredential\u003e] [[-EndPoint] \u003cString[]\u003e] [-AllEndpoints] [[-InputObject] \u003cEndpoint[]\u003e] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Start-DbaMigration", + "Name": "Start-DbaMigration", "Description": "Start-DbaMigration consolidates most of the migration tools in dbatools into one command. This is useful when you\u0027re looking to migrate entire instances. It less flexible than using the underlying functions. Think of it as an easy button. It migrates:\n\nAll user databases to exclude support databases such as ReportServerTempDB (Use -IncludeSupportDbs for this). Use -Exclude Databases to skip.\nAll logins. Use -Exclude Logins to skip.\nAll database mail objects. Use -Exclude DatabaseMail\nAll credentials. Use -Exclude Credentials to skip.\nAll objects within the Job Server (SQL Agent). Use -Exclude AgentServer to skip.\nAll linked servers. Use -Exclude LinkedServers to skip.\nAll groups and servers within Central Management Server. Use -Exclude CentralManagementServer to skip.\nAll SQL Server configuration objects (everything in sp_configure). Use -Exclude SpConfigure to skip.\nAll user objects in system databases. Use -Exclude SysDbUserObjects to skip.\nAll system triggers. Use -Exclude SystemTriggers to skip.\nAll system backup devices. Use -Exclude BackupDevices to skip.\nAll Audits. Use -Exclude Audits to skip.\nAll Endpoints. Use -Exclude Endpoints to skip.\nAll Extended Events. Use -Exclude ExtendedEvents to skip.\nAll Policy Management objects. Use -Exclude PolicyManagement to skip.\nAll Resource Governor objects. Use -Exclude ResourceGovernor to skip.\nAll Server Audit Specifications. Use -Exclude ServerAuditSpecifications to skip.\nAll Custom Errors (User Defined Messages). Use -Exclude CustomErrors to skip.\nCopies All Data Collector collection sets. Does not configure the server. Use -Exclude DataCollector to skip.\n\nThis script provides the ability to migrate databases using detach/copy/attach or backup/restore. SQL Server logins, including passwords, SID and database/server roles can also be migrated. In addition, job server objects can be migrated and server configuration settings can be exported or migrated. This script works with named instances, clusters and SQL Express.\n\nBy default, databases will be migrated to the destination SQL Server\u0027s default data and log directories. You can override this by specifying -ReuseSourceFolderStructure. Filestreams and filegroups are also migrated. Safety is emphasized.", "Tags": "Migration", + "Synopsis": "Migrates SQL Server *ALL* databases, logins, database mail profiles/accounts, credentials, SQL Agent objects, linked servers,\nCentral Management Server objects, server configuration settings (sp_configure), user objects in systems databases,\nsystem triggers and backup devices from one SQL Server to another.\n\nFor more granular control, please use Exclude or use the other functions available within the dbatools module.", + "Alias": "Start-SqlMigration", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Start-DbaMigration", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Start-DbaMigration", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eStart-DbaMigration -Source sqlserver\\instance -Destination sqlcluster -DetachAttach\nAll databases, logins, job objects and sp_configure options will be migrated from sqlserver\\instance to sqlcluster. Databases will be migrated using the detach/copy files/attach method. Dbowner will \r\nbe updated. User passwords, SIDs, database roles and server roles will be migrated along with the login.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003e$params = @{\n\u003e\u003e Source = \"sqlcluster\"\r\n\u003e\u003e Destination = \"sql2016\"\r\n\u003e\u003e SourceSqlCredential = $scred\r\n\u003e\u003e DestinationSqlCredential = $cred\r\n\u003e\u003e SharedPath = \"\\\\fileserver\\share\\sqlbackups\\Migration\"\r\n\u003e\u003e BackupRestore = $true\r\n\u003e\u003e ReuseSourceFolderStructure = $true\r\n\u003e\u003e Force = $true\r\n\u003e\u003e }\r\n\u003e\u003e\r\nPS C:\\\u003e Start-DbaMigration @params -Verbose\nUtilizes splatting technique to set all the needed parameters. This will migrate databases using the backup/restore method. It will also include migration of the logins, database mail configuration, \r\ncredentials, SQL Agent, Central Management Server, and SQL Server global configuration.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eStart-DbaMigration -Verbose -Source sqlcluster -Destination sql2016 -DetachAttach -Reattach -SetSourceReadonly\nMigrates databases using detach/copy/attach. Reattach at source and set source databases read-only. Also migrates everything else.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003e$PSDefaultParameters = @{\n\u003e\u003e \"dbatools:Source\" = \"sqlcluster\"\r\n\u003e\u003e \"dbatools:Destination\" = \"sql2016\"\r\n\u003e\u003e }\r\n\u003e\u003e\r\nPS C:\\\u003e Start-DbaMigration -Verbose -Exclude Databases, Logins\nUtilizes the PSDefaultParameterValues system variable, and sets the Source and Destination parameters for any function in the module that has those parameter names. This prevents the need from \r\npassing them in constantly.\r\nThe execution of the function will migrate everything but logins and databases.", "Params": [ [ "Source", @@ -37555,18 +39317,19 @@ "" ] ], - "Alias": "Start-SqlMigration", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Migrates SQL Server *ALL* databases, logins, database mail profiles/accounts, credentials, SQL Agent objects, linked servers,\nCentral Management Server objects, server configuration settings (sp_configure), user objects in systems databases,\nsystem triggers and backup devices from one SQL Server to another.\n\nFor more granular control, please use Exclude or use the other functions available within the dbatools module.", - "Name": "Start-DbaMigration", - "Links": "https://dbatools.io/Start-DbaMigration", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eStart-DbaMigration -Source sqlserver\\instance -Destination sqlcluster -DetachAttach\nAll databases, logins, job objects and sp_configure options will be migrated from sqlserver\\instance to sqlcluster. Databases will be migrated using the detach/copy files/attach method. Dbowner will \r\nbe updated. User passwords, SIDs, database roles and server roles will be migrated along with the login.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003e$params = @{\n\u003e\u003e Source = \"sqlcluster\"\r\n\u003e\u003e Destination = \"sql2016\"\r\n\u003e\u003e SourceSqlCredential = $scred\r\n\u003e\u003e DestinationSqlCredential = $cred\r\n\u003e\u003e SharedPath = \"\\\\fileserver\\share\\sqlbackups\\Migration\"\r\n\u003e\u003e BackupRestore = $true\r\n\u003e\u003e ReuseSourceFolderStructure = $true\r\n\u003e\u003e Force = $true\r\n\u003e\u003e }\r\n\u003e\u003e\r\nPS C:\\\u003e Start-DbaMigration @params -Verbose\nUtilizes splatting technique to set all the needed parameters. This will migrate databases using the backup/restore method. It will also include migration of the logins, database mail configuration, \r\ncredentials, SQL Agent, Central Management Server, and SQL Server global configuration.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eStart-DbaMigration -Verbose -Source sqlcluster -Destination sql2016 -DetachAttach -Reattach -SetSourceReadonly\nMigrates databases using detach/copy/attach. Reattach at source and set source databases read-only. Also migrates everything else.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003e$PSDefaultParameters = @{\n\u003e\u003e \"dbatools:Source\" = \"sqlcluster\"\r\n\u003e\u003e \"dbatools:Destination\" = \"sql2016\"\r\n\u003e\u003e }\r\n\u003e\u003e\r\nPS C:\\\u003e Start-DbaMigration -Verbose -Exclude Databases, Logins\nUtilizes the PSDefaultParameterValues system variable, and sets the Source and Destination parameters for any function in the module that has those parameter names. This prevents the need from \r\npassing them in constantly.\r\nThe execution of the function will migrate everything but logins and databases.", "Syntax": "Start-DbaMigration [[-Source] \u003cDbaInstanceParameter\u003e] [[-Destination] \u003cDbaInstanceParameter[]\u003e] [-DetachAttach] [-Reattach] [-BackupRestore] [[-SharedPath] \u003cString\u003e] [-WithReplace] [-NoRecovery] [-SetSourceReadOnly] [-ReuseSourceFolderStructure] [-IncludeSupportDbs] [[-SourceSqlCredential] \u003cPSCredential\u003e] [[-DestinationSqlCredential] \u003cPSCredential\u003e] [[-Exclude] \u003cString[]\u003e] [-DisableJobsOnDestination] [-DisableJobsOnSource] [-ExcludeSaRename] [-UseLastBackup] [-Continue] [-Force] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Start-DbaPfDataCollectorSet", + "Name": "Start-DbaPfDataCollectorSet", "Description": "Starts Performance Monitor Data Collector Set.", "Tags": "PerfMon", + "Synopsis": "Starts Performance Monitor Data Collector Set.", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Start-DbaPfDataCollectorSet", + "Availability": "Windows only", + "Links": "https://dbatools.io/Start-DbaPfDataCollectorSet", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eStart-DbaPfDataCollectorSet\nAttempts to start all ready Collectors on localhost.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eStart-DbaPfDataCollectorSet -ComputerName sql2017\nAttempts to start all ready Collectors on localhost.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eStart-DbaPfDataCollectorSet -ComputerName sql2017, sql2016 -Credential ad\\sqldba -CollectorSet \u0027System Correlation\u0027\nStarts the \u0027System Correlation\u0027 Collector on sql2017 and sql2016 using alternative credentials.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaPfDataCollectorSet -CollectorSet \u0027System Correlation\u0027 | Start-DbaPfDataCollectorSet\nStarts the \u0027System Correlation\u0027 Collector.", "Params": [ [ "ComputerName", @@ -37633,16 +39396,10 @@ "" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Starts Performance Monitor Data Collector Set.", - "Name": "Start-DbaPfDataCollectorSet", - "Links": "https://dbatools.io/Start-DbaPfDataCollectorSet", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eStart-DbaPfDataCollectorSet\nAttempts to start all ready Collectors on localhost.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eStart-DbaPfDataCollectorSet -ComputerName sql2017\nAttempts to start all ready Collectors on localhost.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eStart-DbaPfDataCollectorSet -ComputerName sql2017, sql2016 -Credential ad\\sqldba -CollectorSet \u0027System Correlation\u0027\nStarts the \u0027System Correlation\u0027 Collector on sql2017 and sql2016 using alternative credentials.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaPfDataCollectorSet -CollectorSet \u0027System Correlation\u0027 | Start-DbaPfDataCollectorSet\nStarts the \u0027System Correlation\u0027 Collector.", "Syntax": "Start-DbaPfDataCollectorSet [[-ComputerName] \u003cDbaInstanceParameter[]\u003e] [[-Credential] \u003cPSCredential\u003e] [[-CollectorSet] \u003cString[]\u003e] [[-InputObject] \u003cObject[]\u003e] [-NoWait] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Start-DbaService", + "Name": "Start-DbaService", "Description": "Starts the SQL Server related services on one or more computers. Will follow SQL Server service dependencies.\n\nRequires Local Admin rights on destination computer(s).", "Tags": [ "Service", @@ -37650,6 +39407,13 @@ "Instance", "Connect" ], + "Synopsis": "Starts SQL Server services on a computer.", + "Alias": "Start-DbaSqlService", + "Author": "Kirill Kravtsov (@nvarscar)", + "CommandName": "Start-DbaService", + "Availability": "Windows only", + "Links": "https://dbatools.io/Start-DbaService", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eStart-DbaService -ComputerName sqlserver2014a\nStarts the SQL Server related services on computer sqlserver2014a.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003e\u0027sql1\u0027,\u0027sql2\u0027,\u0027sql3\u0027| Get-DbaService | Start-DbaService\nGets the SQL Server related services on computers sql1, sql2 and sql3 and starts them.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eStart-DbaService -ComputerName sql1,sql2 -Instance MSSQLSERVER\nStarts the SQL Server services related to the default instance MSSQLSERVER on computers sql1 and sql2.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eStart-DbaService -ComputerName $MyServers -Type SSRS\nStarts the SQL Server related services of type \"SSRS\" (Reporting Services) on computers in the variable MyServers.", "Params": [ [ "ComputerName", @@ -37724,21 +39488,22 @@ "" ] ], - "Alias": "Start-DbaSqlService", - "Author": "Kirill Kravtsov (@nvarscar)", - "Synopsis": "Starts SQL Server services on a computer.", - "Name": "Start-DbaService", - "Links": "https://dbatools.io/Start-DbaService", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eStart-DbaService -ComputerName sqlserver2014a\nStarts the SQL Server related services on computer sqlserver2014a.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003e\u0027sql1\u0027,\u0027sql2\u0027,\u0027sql3\u0027| Get-DbaService | Start-DbaService\nGets the SQL Server related services on computers sql1, sql2 and sql3 and starts them.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eStart-DbaService -ComputerName sql1,sql2 -Instance MSSQLSERVER\nStarts the SQL Server services related to the default instance MSSQLSERVER on computers sql1 and sql2.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eStart-DbaService -ComputerName $MyServers -Type SSRS\nStarts the SQL Server related services of type \"SSRS\" (Reporting Services) on computers in the variable MyServers.", "Syntax": "Start-DbaService [[-ComputerName] \u003cDbaInstanceParameter[]\u003e] [-InstanceName \u003cString[]\u003e] [-Type \u003cString[]\u003e] [-Timeout \u003cInt32\u003e] [-Credential \u003cPSCredential\u003e] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]\nStart-DbaService [-InstanceName \u003cString[]\u003e] [-Type \u003cString[]\u003e] -InputObject \u003cObject[]\u003e [-Timeout \u003cInt32\u003e] [-Credential \u003cPSCredential\u003e] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Start-DbaTrace", + "Name": "Start-DbaTrace", "Description": "Starts SQL Server traces", "Tags": [ "Security", "Trace" ], + "Synopsis": "Starts SQL Server traces", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Start-DbaTrace", + "Availability": "Windows, Linux, macOS", + "Links": null, + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eStart-DbaTrace -SqlInstance sql2008\nStarts all traces on sql2008\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eStart-DbaTrace -SqlInstance sql2008 -Id 1\nStarts all trace with ID 1 on sql2008\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaTrace -SqlInstance sql2008 | Out-GridView -PassThru | Start-DbaTrace\nStarts selected traces on sql2008", "Params": [ [ "SqlInstance", @@ -37797,22 +39562,23 @@ "" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Starts SQL Server traces", - "Name": "Start-DbaTrace", - "Links": null, - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eStart-DbaTrace -SqlInstance sql2008\nStarts all traces on sql2008\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eStart-DbaTrace -SqlInstance sql2008 -Id 1\nStarts all trace with ID 1 on sql2008\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaTrace -SqlInstance sql2008 | Out-GridView -PassThru | Start-DbaTrace\nStarts selected traces on sql2008", "Syntax": "Start-DbaTrace [[-SqlInstance] \u003cDbaInstanceParameter[]\u003e] [[-SqlCredential] \u003cPSCredential\u003e] [[-Id] \u003cInt32[]\u003e] [[-InputObject] \u003cObject[]\u003e] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Start-DbaXESession", + "Name": "Start-DbaXESession", "Description": "This script starts Extended Events sessions on a SQL Server instance.", "Tags": [ "ExtendedEvent", "XE", "XEvent" ], + "Synopsis": "Starts Extended Events sessions.", + "Alias": "", + "Author": "Doug Meyers", + "CommandName": "Start-DbaXESession", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Start-DbaXESession", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eStart-DbaXESession -SqlInstance sqlserver2012 -AllSessions\nStarts all Extended Event Session on the sqlserver2014 instance.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eStart-DbaXESession -SqlInstance sqlserver2012 -Session xesession1,xesession2\nStarts the xesession1 and xesession2 Extended Event sessions.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eStart-DbaXESession -SqlInstance sqlserver2012 -Session xesession1,xesession2 -StopAt (Get-Date).AddMinutes(30)\nStarts the xesession1 and xesession2 Extended Event sessions and stops them in 30 minutes.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaXESession -SqlInstance sqlserver2012 -Session xesession1 | Start-DbaXESession\nStarts the sessions returned from the Get-DbaXESession function.", "Params": [ [ "SqlInstance", @@ -37887,22 +39653,24 @@ "" ] ], - "Alias": "", - "Author": "Doug Meyers", - "Synopsis": "Starts Extended Events sessions.", - "Name": "Start-DbaXESession", - "Links": "https://dbatools.io/Start-DbaXESession", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eStart-DbaXESession -SqlInstance sqlserver2012 -AllSessions\nStarts all Extended Event Session on the sqlserver2014 instance.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eStart-DbaXESession -SqlInstance sqlserver2012 -Session xesession1,xesession2\nStarts the xesession1 and xesession2 Extended Event sessions.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eStart-DbaXESession -SqlInstance sqlserver2012 -Session xesession1,xesession2 -StopAt (Get-Date).AddMinutes(30)\nStarts the xesession1 and xesession2 Extended Event sessions and stops them in 30 minutes.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaXESession -SqlInstance sqlserver2012 -Session xesession1 | Start-DbaXESession\nStarts the sessions returned from the Get-DbaXESession function.", "Syntax": "Start-DbaXESession [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [-SqlCredential \u003cPSCredential\u003e] -Session \u003cObject[]\u003e [-StopAt \u003cDateTime\u003e] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]\nStart-DbaXESession [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [-SqlCredential \u003cPSCredential\u003e] [-StopAt \u003cDateTime\u003e] -AllSessions [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]\nStart-DbaXESession [-StopAt \u003cDateTime\u003e] -InputObject \u003cSession[]\u003e [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Start-DbaXESmartTarget", + "Name": "Start-DbaXESmartTarget", "Description": "XESmartTarget offers the ability to set up complex actions in response to Extended Events captured in sessions, without writing a single line of code.\n\nSee more at https://github.com/spaghettidba/XESmartTarget/wiki", "Tags": [ "ExtendedEvent", "XE", - "XEvent" + "XEvent", + "SmartTarget" ], + "Synopsis": "XESmartTarget runs as a client application for an Extended Events session running on a SQL Server instance.", + "Alias": "", + "Author": "Chrissy LeMaire (@cl) | SmartTarget by Gianluca Sartori (@spaghettidba)", + "CommandName": "Start-DbaXESmartTarget", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Start-DbaXESmartTarget", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003e$response = New-DbaXESmartQueryExec -SqlInstance sql2017 -Database dbadb -Query \"update table set whatever = 1\"\nPS C:\\\u003eStart-DbaXESmartTarget -SqlInstance sql2017 -Session deadlock_tracker -Responder $response\nExecutes a T-SQL command against dbadb on sql2017 whenever a deadlock event is recorded.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003e$response = New-DbaXESmartQueryExec -SqlInstance sql2017 -Database dbadb -Query \"update table set whatever = 1\"\nPS C:\\\u003e$params = @{\r\n\u003e\u003e SmtpServer = \"smtp.ad.local\"\r\n\u003e\u003e To = \"admin@ad.local\"\r\n\u003e\u003e Sender = \"reports@ad.local\"\r\n\u003e\u003e Subject = \"Query executed\"\r\n\u003e\u003e Body = \"Query executed at {collection_time}\"\r\n\u003e\u003e Attachment = \"batch_text\"\r\n\u003e\u003e AttachmentFileName = \"query.sql\"\r\n\u003e\u003e }\r\nPS C:\\\u003e $emailresponse = New-DbaXESmartEmail @params\r\nPS C:\\\u003e Start-DbaXESmartTarget -SqlInstance sql2017 -Session querytracker -Responder $response, $emailresponse\nExecutes a T-SQL command against dbadb on sql2017 and sends an email whenever a querytracker event is recorded.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003e$columns = \"cpu_time\", \"duration\", \"physical_reads\", \"logical_reads\", \"writes\", \"row_count\", \"batch_text\"\nPS C:\\\u003e $response = New-DbaXESmartTableWriter -SqlInstance sql2017 -Database dbadb -Table deadlocktracker -OutputColumns $columns -Filter \"duration \u003e 10000\"\r\nPS C:\\\u003e Start-DbaXESmartTarget -SqlInstance sql2017 -Session deadlock_tracker -Responder $response\nWrites Extended Events to the deadlocktracker table in dbadb on sql2017.", "Params": [ [ "SqlInstance", @@ -37993,21 +39761,22 @@ "" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl) | SmartTarget by Gianluca Sartori (@spaghettidba)", - "Synopsis": "XESmartTarget runs as a client application for an Extended Events session running on a SQL Server instance.", - "Name": "Start-DbaXESmartTarget", - "Links": "https://dbatools.io/Start-DbaXESmartTarget", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003e$response = New-DbaXESmartQueryExec -SqlInstance sql2017 -Database dbadb -Query \"update table set whatever = 1\"\nPS C:\\\u003eStart-DbaXESmartTarget -SqlInstance sql2017 -Session deadlock_tracker -Responder $response\nExecutes a T-SQL command against dbadb on sql2017 whenever a deadlock event is recorded.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003e$response = New-DbaXESmartQueryExec -SqlInstance sql2017 -Database dbadb -Query \"update table set whatever = 1\"\nPS C:\\\u003e$params = @{\r\n\u003e\u003e SmtpServer = \"smtp.ad.local\"\r\n\u003e\u003e To = \"admin@ad.local\"\r\n\u003e\u003e Sender = \"reports@ad.local\"\r\n\u003e\u003e Subject = \"Query executed\"\r\n\u003e\u003e Body = \"Query executed at {collection_time}\"\r\n\u003e\u003e Attachment = \"batch_text\"\r\n\u003e\u003e AttachmentFileName = \"query.sql\"\r\n\u003e\u003e }\r\nPS C:\\\u003e $emailresponse = New-DbaXESmartEmail @params\r\nPS C:\\\u003e Start-DbaXESmartTarget -SqlInstance sql2017 -Session querytracker -Responder $response, $emailresponse\nExecutes a T-SQL command against dbadb on sql2017 and sends an email whenever a querytracker event is recorded.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003e$columns = \"cpu_time\", \"duration\", \"physical_reads\", \"logical_reads\", \"writes\", \"row_count\", \"batch_text\"\nPS C:\\\u003e $response = New-DbaXESmartTableWriter -SqlInstance sql2017 -Database dbadb -Table deadlocktracker -OutputColumns $columns -Filter \"duration \u003e 10000\"\r\nPS C:\\\u003e Start-DbaXESmartTarget -SqlInstance sql2017 -Session deadlock_tracker -Responder $response\nWrites Extended Events to the deadlocktracker table in dbadb on sql2017.", "Syntax": "Start-DbaXESmartTarget [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [[-Database] \u003cString\u003e] [-Session] \u003cString\u003e [-FailOnProcessingError] [[-Responder] \u003cObject[]\u003e] [[-Template] \u003cString[]\u003e] [-NotAsJob] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Stop-DbaAgentJob", + "Name": "Stop-DbaAgentJob", "Description": "This command stops a job then returns connected SMO object for SQL Agent Job information for each instance(s) of SQL Server.", "Tags": [ "Job", "Agent" ], + "Synopsis": "Stops a running SQL Server Agent Job.", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Stop-DbaAgentJob", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Stop-DbaAgentJob", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eStop-DbaAgentJob -SqlInstance localhost\nStops all running SQL Agent Jobs on the local SQL Server instance\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaAgentJob -SqlInstance sql2016 -Job cdc.DBWithCDC_capture | Stop-DbaAgentJob\nStops the cdc.DBWithCDC_capture SQL Agent Job on sql2016\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eStop-DbaAgentJob -SqlInstance sql2016 -Job cdc.DBWithCDC_capture\nStops the cdc.DBWithCDC_capture SQL Agent Job on sql2016", "Params": [ [ "SqlInstance", @@ -38082,18 +39851,19 @@ "" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Stops a running SQL Server Agent Job.", - "Name": "Stop-DbaAgentJob", - "Links": "https://dbatools.io/Stop-DbaAgentJob", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eStop-DbaAgentJob -SqlInstance localhost\nStops all running SQL Agent Jobs on the local SQL Server instance\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaAgentJob -SqlInstance sql2016 -Job cdc.DBWithCDC_capture | Stop-DbaAgentJob\nStops the cdc.DBWithCDC_capture SQL Agent Job on sql2016\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eStop-DbaAgentJob -SqlInstance sql2016 -Job cdc.DBWithCDC_capture\nStops the cdc.DBWithCDC_capture SQL Agent Job on sql2016", "Syntax": "Stop-DbaAgentJob [-SqlCredential \u003cPSCredential\u003e] [-Job \u003cString[]\u003e] [-ExcludeJob \u003cString[]\u003e] [-Wait] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]\nStop-DbaAgentJob -SqlInstance \u003cDbaInstanceParameter[]\u003e [-SqlCredential \u003cPSCredential\u003e] [-Job \u003cString[]\u003e] [-ExcludeJob \u003cString[]\u003e] [-Wait] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]\nStop-DbaAgentJob [-SqlCredential \u003cPSCredential\u003e] [-Job \u003cString[]\u003e] [-ExcludeJob \u003cString[]\u003e] -InputObject \u003cJob[]\u003e [-Wait] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Stop-DbaEndpoint", + "Name": "Stop-DbaEndpoint", "Description": "Stops endpoints on a SQL Server instance.", "Tags": "Endpoint", + "Synopsis": "Stops endpoints on a SQL Server instance.", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Stop-DbaEndpoint", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Stop-DbaEndpoint", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eStop-DbaEndpoint -SqlInstance sql2017a -AllEndpoints\nStops all endpoints on the sqlserver2014 instance.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eStop-DbaEndpoint -SqlInstance sql2017a -Endpoint endpoint1,endpoint2\nStops the endpoint1 and endpoint2 endpoints.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-Endpoint -SqlInstance sql2017a -Endpoint endpoint1 | Stop-DbaEndpoint\nStops the endpoints returned from the Get-Endpoint command.", "Params": [ [ "SqlInstance", @@ -38160,18 +39930,19 @@ "" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Stops endpoints on a SQL Server instance.", - "Name": "Stop-DbaEndpoint", - "Links": "https://dbatools.io/Stop-DbaEndpoint", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eStop-DbaEndpoint -SqlInstance sql2017a -AllEndpoints\nStops all endpoints on the sqlserver2014 instance.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eStop-DbaEndpoint -SqlInstance sql2017a -Endpoint endpoint1,endpoint2\nStops the endpoint1 and endpoint2 endpoints.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-Endpoint -SqlInstance sql2017a -Endpoint endpoint1 | Stop-DbaEndpoint\nStops the endpoints returned from the Get-Endpoint command.", "Syntax": "Stop-DbaEndpoint [[-SqlInstance] \u003cDbaInstanceParameter[]\u003e] [[-SqlCredential] \u003cPSCredential\u003e] [[-EndPoint] \u003cString[]\u003e] [-AllEndpoints] [[-InputObject] \u003cEndpoint[]\u003e] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Stop-DbaPfDataCollectorSet", + "Name": "Stop-DbaPfDataCollectorSet", "Description": "Stops Performance Monitor Data Collector Set.", "Tags": "PerfMon", + "Synopsis": "Stops Performance Monitor Data Collector Set.", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Stop-DbaPfDataCollectorSet", + "Availability": "Windows only", + "Links": "https://dbatools.io/Stop-DbaPfDataCollectorSet", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eStop-DbaPfDataCollectorSet\nAttempts to stop all ready Collectors on localhost.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eStop-DbaPfDataCollectorSet -ComputerName sql2017\nAttempts to stop all ready Collectors on localhost.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eStop-DbaPfDataCollectorSet -ComputerName sql2017, sql2016 -Credential ad\\sqldba -CollectorSet \u0027System Correlation\u0027\nStops the \u0027System Correlation\u0027 Collector on sql2017 and sql2016 using alternative credentials.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaPfDataCollectorSet -CollectorSet \u0027System Correlation\u0027 | Stop-DbaPfDataCollectorSet\nStops the \u0027System Correlation\u0027 Collector.", "Params": [ [ "ComputerName", @@ -38238,18 +40009,19 @@ "" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Stops Performance Monitor Data Collector Set.", - "Name": "Stop-DbaPfDataCollectorSet", - "Links": "https://dbatools.io/Stop-DbaPfDataCollectorSet", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eStop-DbaPfDataCollectorSet\nAttempts to stop all ready Collectors on localhost.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eStop-DbaPfDataCollectorSet -ComputerName sql2017\nAttempts to stop all ready Collectors on localhost.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eStop-DbaPfDataCollectorSet -ComputerName sql2017, sql2016 -Credential ad\\sqldba -CollectorSet \u0027System Correlation\u0027\nStops the \u0027System Correlation\u0027 Collector on sql2017 and sql2016 using alternative credentials.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaPfDataCollectorSet -CollectorSet \u0027System Correlation\u0027 | Stop-DbaPfDataCollectorSet\nStops the \u0027System Correlation\u0027 Collector.", "Syntax": "Stop-DbaPfDataCollectorSet [[-ComputerName] \u003cDbaInstanceParameter[]\u003e] [[-Credential] \u003cPSCredential\u003e] [[-CollectorSet] \u003cString[]\u003e] [[-InputObject] \u003cObject[]\u003e] [-NoWait] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Stop-DbaProcess", + "Name": "Stop-DbaProcess", "Description": "This command kills all spids associated with a spid, login, host, program or database.\n\nIf you are attempting to kill your own login sessions, the process performing the kills will be skipped.", "Tags": "Processes", + "Synopsis": "This command finds and kills SQL Server processes.", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Stop-DbaProcess", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Stop-DbaProcess", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eStop-DbaProcess -SqlInstance sqlserver2014a -Login base\\ctrlb, sa\nFinds all processes for base\\ctrlb and sa on sqlserver2014a, then kills them. Uses Windows Authentication to login to sqlserver2014a.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eStop-DbaProcess -SqlInstance sqlserver2014a -SqlCredential $credential -Spid 56, 77\nFinds processes for spid 56 and 57, then kills them. Uses alternative (SQL or Windows) credentials to login to sqlserver2014a.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eStop-DbaProcess -SqlInstance sqlserver2014a -Program \u0027Microsoft SQL Server Management Studio\u0027\nFinds processes that were created in Microsoft SQL Server Management Studio, then kills them.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eStop-DbaProcess -SqlInstance sqlserver2014a -Hostname workstationx, server100\nFinds processes that were initiated (computers/clients) workstationx and server 1000, then kills them.\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eStop-DbaProcess -SqlInstance sqlserver2014 -Database tempdb -WhatIf\nShows what would happen if the command were executed.\n-------------------------- EXAMPLE 6 --------------------------\nPS C:\\\u003eGet-DbaProcess -SqlInstance sql2016 -Program \u0027dbatools PowerShell module - dbatools.io\u0027 | Stop-DbaProcess\nFinds processes that were created with dbatools, then kills them.", "Params": [ [ "SqlInstance", @@ -38348,21 +40120,22 @@ "" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "This command finds and kills SQL Server processes.", - "Name": "Stop-DbaProcess", - "Links": "https://dbatools.io/Stop-DbaProcess", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eStop-DbaProcess -SqlInstance sqlserver2014a -Login base\\ctrlb, sa\nFinds all processes for base\\ctrlb and sa on sqlserver2014a, then kills them. Uses Windows Authentication to login to sqlserver2014a.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eStop-DbaProcess -SqlInstance sqlserver2014a -SqlCredential $credential -Spid 56, 77\nFinds processes for spid 56 and 57, then kills them. Uses alternative (SQL or Windows) credentials to login to sqlserver2014a.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eStop-DbaProcess -SqlInstance sqlserver2014a -Program \u0027Microsoft SQL Server Management Studio\u0027\nFinds processes that were created in Microsoft SQL Server Management Studio, then kills them.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eStop-DbaProcess -SqlInstance sqlserver2014a -Hostname workstationx, server100\nFinds processes that were initiated (computers/clients) workstationx and server 1000, then kills them.\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eStop-DbaProcess -SqlInstance sqlserver2014 -Database tempdb -WhatIf\nShows what would happen if the command were executed.\n-------------------------- EXAMPLE 6 --------------------------\nPS C:\\\u003eGet-DbaProcess -SqlInstance sql2016 -Program \u0027dbatools PowerShell module - dbatools.io\u0027 | Stop-DbaProcess\nFinds processes that were created with dbatools, then kills them.", "Syntax": "Stop-DbaProcess [-SqlCredential \u003cPSCredential\u003e] [-Spid \u003cInt32[]\u003e] [-ExcludeSpid \u003cInt32[]\u003e] [-Database \u003cString[]\u003e] [-Login \u003cString[]\u003e] [-Hostname \u003cString[]\u003e] [-Program \u003cString[]\u003e] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]\nStop-DbaProcess -SqlInstance \u003cDbaInstanceParameter\u003e [-SqlCredential \u003cPSCredential\u003e] [-Spid \u003cInt32[]\u003e] [-ExcludeSpid \u003cInt32[]\u003e] [-Database \u003cString[]\u003e] [-Login \u003cString[]\u003e] [-Hostname \u003cString[]\u003e] [-Program \u003cString[]\u003e] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]\nStop-DbaProcess [-SqlCredential \u003cPSCredential\u003e] [-Spid \u003cInt32[]\u003e] [-ExcludeSpid \u003cInt32[]\u003e] [-Database \u003cString[]\u003e] [-Login \u003cString[]\u003e] [-Hostname \u003cString[]\u003e] [-Program \u003cString[]\u003e] -InputObject \u003cObject[]\u003e [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Stop-DbaService", + "Name": "Stop-DbaService", "Description": "Stops the SQL Server related services on one or more computers. Will follow SQL Server service dependencies.\n\nRequires Local Admin rights on destination computer(s).", "Tags": [ "Service", "Stop" ], + "Synopsis": "Stops SQL Server services on a computer.", + "Alias": "Stop-DbaSqlService", + "Author": "Kirill Kravtsov (@nvarscar)", + "CommandName": "Stop-DbaService", + "Availability": "Windows only", + "Links": "https://dbatools.io/Stop-DbaService", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eStop-DbaService -ComputerName sqlserver2014a\nStops the SQL Server related services on computer sqlserver2014a.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003e\u0027sql1\u0027,\u0027sql2\u0027,\u0027sql3\u0027| Get-DbaService | Stop-DbaService\nGets the SQL Server related services on computers sql1, sql2 and sql3 and stops them.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eStop-DbaService -ComputerName sql1,sql2 -Instance MSSQLSERVER\nStops the SQL Server services related to the default instance MSSQLSERVER on computers sql1 and sql2.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eStop-DbaService -ComputerName $MyServers -Type SSRS\nStops the SQL Server related services of type \"SSRS\" (Reporting Services) on computers in the variable MyServers.\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eStop-DbaService -ComputerName sql1 -Type Engine -Force\nStops SQL Server database engine services on sql1 forcing dependent SQL Server Agent services to stop as well.", "Params": [ [ "ComputerName", @@ -38445,21 +40218,22 @@ "" ] ], - "Alias": "Stop-DbaSqlService", - "Author": "Kirill Kravtsov (@nvarscar)", - "Synopsis": "Stops SQL Server services on a computer.", - "Name": "Stop-DbaService", - "Links": "https://dbatools.io/Stop-DbaService", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eStop-DbaService -ComputerName sqlserver2014a\nStops the SQL Server related services on computer sqlserver2014a.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003e\u0027sql1\u0027,\u0027sql2\u0027,\u0027sql3\u0027| Get-DbaService | Stop-DbaService\nGets the SQL Server related services on computers sql1, sql2 and sql3 and stops them.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eStop-DbaService -ComputerName sql1,sql2 -Instance MSSQLSERVER\nStops the SQL Server services related to the default instance MSSQLSERVER on computers sql1 and sql2.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eStop-DbaService -ComputerName $MyServers -Type SSRS\nStops the SQL Server related services of type \"SSRS\" (Reporting Services) on computers in the variable MyServers.\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eStop-DbaService -ComputerName sql1 -Type Engine -Force\nStops SQL Server database engine services on sql1 forcing dependent SQL Server Agent services to stop as well.", "Syntax": "Stop-DbaService [[-ComputerName] \u003cDbaInstanceParameter[]\u003e] [-InstanceName \u003cString[]\u003e] [-Type \u003cString[]\u003e] [-Timeout \u003cInt32\u003e] [-Credential \u003cPSCredential\u003e] [-Force] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]\nStop-DbaService [-InstanceName \u003cString[]\u003e] [-Type \u003cString[]\u003e] -InputObject \u003cObject[]\u003e [-Timeout \u003cInt32\u003e] [-Credential \u003cPSCredential\u003e] [-Force] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Stop-DbaTrace", + "Name": "Stop-DbaTrace", "Description": "Stops SQL Server traces", "Tags": [ "Security", "Trace" ], + "Synopsis": "Stops SQL Server traces", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Stop-DbaTrace", + "Availability": "Windows, Linux, macOS", + "Links": null, + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eStop-DbaTrace -SqlInstance sql2008\nStops all traces on sql2008\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eStop-DbaTrace -SqlInstance sql2008 -Id 1\nStops all trace with ID 1 on sql2008\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaTrace -SqlInstance sql2008 | Out-GridView -PassThru | Stop-DbaTrace\nStops selected traces on sql2008", "Params": [ [ "SqlInstance", @@ -38518,22 +40292,23 @@ "" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Stops SQL Server traces", - "Name": "Stop-DbaTrace", - "Links": null, - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eStop-DbaTrace -SqlInstance sql2008\nStops all traces on sql2008\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eStop-DbaTrace -SqlInstance sql2008 -Id 1\nStops all trace with ID 1 on sql2008\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaTrace -SqlInstance sql2008 | Out-GridView -PassThru | Stop-DbaTrace\nStops selected traces on sql2008", "Syntax": "Stop-DbaTrace [[-SqlInstance] \u003cDbaInstanceParameter[]\u003e] [[-SqlCredential] \u003cPSCredential\u003e] [[-Id] \u003cInt32[]\u003e] [[-InputObject] \u003cObject[]\u003e] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Stop-DbaXESession", + "Name": "Stop-DbaXESession", "Description": "This script stops Extended Events sessions on a SQL Server instance.", "Tags": [ "ExtendedEvent", "XE", "XEvent" ], + "Synopsis": "Stops Extended Events sessions.", + "Alias": "", + "Author": "Doug Meyers", + "CommandName": "Stop-DbaXESession", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Stop-DbaXESession", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eStop-DbaXESession -SqlInstance sqlserver2012 -AllSessions\nStops all Extended Event Session on the sqlserver2014 instance.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eStop-DbaXESession -SqlInstance sqlserver2012 -Session xesession1,xesession2\nStops the xesession1 and xesession2 Extended Event sessions.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaXESession -SqlInstance sqlserver2012 -Session xesession1 | Stop-DbaXESession\nStops the sessions returned from the Get-DbaXESession function.", "Params": [ [ "SqlInstance", @@ -38600,22 +40375,23 @@ "" ] ], - "Alias": "", - "Author": "Doug Meyers", - "Synopsis": "Stops Extended Events sessions.", - "Name": "Stop-DbaXESession", - "Links": "https://dbatools.io/Stop-DbaXESession", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eStop-DbaXESession -SqlInstance sqlserver2012 -AllSessions\nStops all Extended Event Session on the sqlserver2014 instance.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eStop-DbaXESession -SqlInstance sqlserver2012 -Session xesession1,xesession2\nStops the xesession1 and xesession2 Extended Event sessions.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaXESession -SqlInstance sqlserver2012 -Session xesession1 | Stop-DbaXESession\nStops the sessions returned from the Get-DbaXESession function.", "Syntax": "Stop-DbaXESession [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [-SqlCredential \u003cPSCredential\u003e] -Session \u003cObject[]\u003e [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]\nStop-DbaXESession [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [-SqlCredential \u003cPSCredential\u003e] -AllSessions [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]\nStop-DbaXESession -InputObject \u003cSession[]\u003e [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Stop-DbaXESmartTarget", + "Name": "Stop-DbaXESmartTarget", "Description": "Stops an XESmartTarget PowerShell job. Useful if you want to run a target, but not right now.", "Tags": [ "ExtendedEvent", "XE", "XEvent" ], + "Synopsis": "Stops an XESmartTarget PowerShell job. Useful if you want to run a target, but not right now.", + "Alias": "", + "Author": "Chrissy LeMaire (@cl) | SmartTarget by Gianluca Sartori (@spaghettidba)", + "CommandName": "Stop-DbaXESmartTarget", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Stop-DbaXESmartTarget\nhttps://github.com/spaghettidba/XESmartTarget/wiki", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaXESmartTarget | Stop-DbaXESmartTarget\nStops all XESmartTarget jobs.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaXESmartTarget | Where-Object Id -eq 2 | Stop-DbaXESmartTarget\nStops a specific XESmartTarget job.", "Params": [ [ "InputObject", @@ -38650,22 +40426,23 @@ "" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl) | SmartTarget by Gianluca Sartori (@spaghettidba)", - "Synopsis": "Stops an XESmartTarget PowerShell job. Useful if you want to run a target, but not right now.", - "Name": "Stop-DbaXESmartTarget", - "Links": "https://dbatools.io/Stop-DbaXESmartTarget\nhttps://github.com/spaghettidba/XESmartTarget/wiki", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaXESmartTarget | Stop-DbaXESmartTarget\nStops all XESmartTarget jobs.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaXESmartTarget | Where-Object Id -eq 2 | Stop-DbaXESmartTarget\nStops a specific XESmartTarget job.", "Syntax": "Stop-DbaXESmartTarget [-InputObject] \u003cObject[]\u003e [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Suspend-DbaAgDbDataMovement", + "Name": "Suspend-DbaAgDbDataMovement", "Description": "Suspends data movement for an availability group database on a SQL Server instance.", "Tags": [ "AvailabilityGroup", "HA", "AG" ], + "Synopsis": "Suspends data movement for an availability group database on a SQL Server instance.", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Suspend-DbaAgDbDataMovement", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Suspend-DbaAgDbDataMovement", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eSuspend-DbaAgDbDataMovement -SqlInstance sql2017a -AvailabilityGroup ag1 -Database db1, db2\nSuspends data movement on db1 and db2 to ag1 on sql2017a. Prompts for confirmation.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaAgDatabase -SqlInstance sql2017a, sql2019 | Out-GridView -Passthru | Suspend-DbaAgDbDataMovement -Confirm:$false\nSuspends data movement on the selected availability group databases. Does not prompt for confirmation.", "Params": [ [ "SqlInstance", @@ -38732,70 +40509,193 @@ "" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Suspends data movement for an availability group database on a SQL Server instance.", - "Name": "Suspend-DbaAgDbDataMovement", - "Links": "https://dbatools.io/Suspend-DbaAgDbDataMovement", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eSuspend-DbaAgDbDataMovement -SqlInstance sql2017a -AvailabilityGroup ag1 -Database db1, db2\nSuspends data movement on db1 and db2 to ag1 on sql2017a. Prompts for confirmation.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaAgDatabase -SqlInstance sql2017a, sql2019 | Out-GridView -Passthru | Suspend-DbaAgDbDataMovement -Confirm:$false\nSuspends data movement on the selected availability group databases. Does not prompt for confirmation.", - "Syntax": "Suspend-DbaAgDbDataMovement [[-SqlInstance] \u003cDbaInstanceParameter[]\u003e] [[-SqlCredential] \u003cPSCredential\u003e] [[-AvailabilityGroup] \u003cString\u003e] [[-Database] \u003cString[]\u003e] [[-InputObject] \u003cAvailabilityDatabase[]\u003e] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" + "Syntax": "Suspend-DbaAgDbDataMovement [[-SqlInstance] \u003cDbaInstanceParameter[]\u003e] [[-SqlCredential] \u003cPSCredential\u003e] [[-AvailabilityGroup] \u003cString\u003e] [[-Database] \u003cString[]\u003e] [[-InputObject] \u003cAvailabilityDatabase[]\u003e] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" + }, + { + "Name": "Sync-DbaAvailabilityGroup", + "Description": "Syncs depdendent objects for availability groups. Such objects include:\n\nSpConfigure\nCustomErrors\nCredentials\nDatabaseMail\nLinkedServers\nLogins\nLoginPermissions\nSystemTriggers\nDatabaseOwner\nAgentCategory\nAgentOperator\nAgentAlert\nAgentProxy\nAgentSchedule\nAgentJob\n\nNote that any of these can be excluded. For specific object exclusions (such as a single job), using the underlying Copy-Dba* command will be required.\n\nThis command does not filter by which logins are in use by the ag databases or which linked servers are used. All objects that are not excluded will be copied like hulk smash.", + "Tags": "HA", + "Synopsis": "Syncs depdendent objects such as jobs, logins and custom errors for availability groups", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Sync-DbaAvailabilityGroup", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Sync-DbaAvailabilityGroup", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eSync-DbaAvailabilityGroup -Primary sql2016a -AvailabilityGroup db3\nSyncs the following on all replicas found in the db3 AG:\r\nSpConfigure, CustomErrors, Credentials, DatabaseMail, LinkedServers\r\nLogins, LoginPermissions, SystemTriggers, DatabaseOwner, AgentCategory,\r\nAgentOperator, AgentAlert, AgentProxy, AgentSchedule, AgentJob\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaAvailabilityGroup -SqlInstance sql2016a | Sync-DbaAvailabilityGroup -ExcludeType LoginPermissions, LinkedServers -ExcludeLogin login1, login2 -Job job1, job2\nSyncs the following on all replicas found in all AGs on the specified instance:\r\nSpConfigure, CustomErrors, Credentials, DatabaseMail, Logins,\r\nSystemTriggers, DatabaseOwner, AgentCategory, AgentOperator\r\nAgentAlert, AgentProxy, AgentSchedule, AgentJob.\nCopies all logins except for login1 and login2 and only syncs job1 and job2\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaAvailabilityGroup -SqlInstance sql2016a | Sync-DbaAvailabilityGroup -WhatIf\nShows what would happen if the command were to run but doesn\u0027t actually perform the action.", + "Params": [ + [ + "Primary", + "The primary SQL Server instance. Server version must be SQL Server version 2012 or higher.", + "", + false, + "false", + "" + ], + [ + "PrimarySqlCredential", + "Login to the primary instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential)", + "", + false, + "false", + "" + ], + [ + "Secondary", + "The target SQL Server instance or instances. Server version must be SQL Server version 2012 or higher.", + "", + false, + "false", + "" + ], + [ + "SecondarySqlCredential", + "Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential)", + "", + false, + "false", + "" + ], + [ + "AvailabilityGroup", + "The name of the Availability Group.", + "", + false, + "false", + "" + ], + [ + "Exclude", + "Exclude one or more objects to export\nSpConfigure\r\nCustomErrors\r\nCredentials\r\nDatabaseMail\r\nLinkedServers\r\nLogins\r\nLoginPermissions\r\nSystemTriggers\r\nDatabaseOwner\r\nAgentCategory\r\nAgentOperator\r\nAgentAlert\r\nAgentProxy\r\nAgentSchedule\r\nAgentJob", + "ExcludeType", + false, + "false", + "" + ], + [ + "Login", + "Specific logins to sync. If unspecified, all logins will be processed.", + "", + false, + "false", + "" + ], + [ + "ExcludeLogin", + "Specific logins to exclude when performing the sync. If unspecified, all logins will be processed.", + "", + false, + "false", + "" + ], + [ + "Job", + "Specific jobs to sync. If unspecified, all jobs will be processed.", + "", + false, + "false", + "" + ], + [ + "ExcludeJob", + "Specific jobs to exclude when performing the sync. If unspecified, all jobs will be processed.", + "", + false, + "false", + "" + ], + [ + "InputObject", + "Enables piping from Get-DbaAvailabilityGroup.", + "", + false, + "true (ByValue)", + "" + ], + [ + "Force", + "If this switch is enabled, the objects will dropped and recreated on Destination.", + "", + false, + "false", + "False" + ], + [ + "EnableException", + "By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message.\r\nThis avoids overwhelming you with \"sea of red\" exceptions, but is inconvenient because it basically disables advanced scripting.\r\nUsing this switch turns this \"nice by default\" feature off and enables you to catch exceptions with your own try/catch.", + "", + false, + "false", + "False" + ], + [ + "WhatIf", + "Shows what would happen if the command were to run. No actions are actually performed.", + "wi", + false, + "false", + "" + ], + [ + "Confirm", + "Prompts you for confirmation before executing any changing operations within the command.", + "cf", + false, + "false", + "" + ] + ], + "Syntax": "Sync-DbaAvailabilityGroup [[-Primary] \u003cDbaInstanceParameter\u003e] [[-PrimarySqlCredential] \u003cPSCredential\u003e] [[-Secondary] \u003cDbaInstanceParameter[]\u003e] [[-SecondarySqlCredential] \u003cPSCredential\u003e] [[-AvailabilityGroup] \u003cString\u003e] [[-Exclude] \u003cString[]\u003e] [[-Login] \u003cString[]\u003e] [[-ExcludeLogin] \u003cString[]\u003e] [[-Job] \u003cString[]\u003e] [[-ExcludeJob] \u003cString[]\u003e] [[-InputObject] \u003cAvailabilityGroup[]\u003e] [-Force] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Sync-DbaAvailabilityGroup", - "Description": "Syncs depdendent objects for availability groups. Such objects include:\n\nSpConfigure\nCustomErrors\nCredentials\nDatabaseMail\nLinkedServers\nLogins\nLoginPermissions\nSystemTriggers\nDatabaseOwner\nAgentCategory\nAgentOperator\nAgentAlert\nAgentProxy\nAgentSchedule\nAgentJob\n\nNote that any of these can be excluded. For specific object exclusions (such as a single job), using the underlying Copy-Dba* command will be required.\n\nThis command does not filter by which logins are in use by the ag databases or which linked servers are used. All objects that are not excluded will be copied like hulk smash.", - "Tags": "HA", + "Name": "Sync-DbaLoginPermission", + "Description": "Syncs only SQL Server login permissions, roles, etc. Does not add or drop logins. If a matching login does not exist on the destination, the login will be skipped. Credential removal is not currently supported for this operation.", + "Tags": [ + "Migration", + "Login" + ], + "Synopsis": "Copies SQL login permissions from one server to another.", + "Alias": "Sync-DbaSqlLoginPermission,Sync-SqlLoginPermissions", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Sync-DbaLoginPermission", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Sync-DbaLoginPermission", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eSync-DbaLoginPermission -Source sqlserver2014a -Destination sqlcluster\nSyncs only SQL Server login permissions, roles, etc. Does not add or drop logins or users. To copy logins and their permissions, use Copy-SqlLogin.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eSync-DbaLoginPermission -Source sqlserver2014a -Destination sqlcluster -Exclude realcajun -SourceSqlCredential $scred -DestinationSqlCredential $dcred\nCopies all login permissions except for realcajun using SQL Authentication to connect to each server. If a login already exists on the destination, the permissions will not be migrated.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eSync-DbaLoginPermission -Source sqlserver2014a -Destination sqlcluster -Login realcajun, netnerds\nCopies permissions ONLY for logins netnerds and realcajun.", "Params": [ [ - "Primary", - "The primary SQL Server instance. Server version must be SQL Server version 2012 or higher.", + "Source", + "Source SQL Server. You must have sysadmin access and server version must be SQL Server version 2000 or higher.", "", - false, - "false", + true, + "true (ByValue)", "" ], [ - "PrimarySqlCredential", - "Login to the primary instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential)", + "SourceSqlCredential", + "Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential)", "", false, "false", "" ], [ - "Secondary", - "The target SQL Server instance or instances. Server version must be SQL Server version 2012 or higher.", + "Destination", + "Destination SQL Server. You must have sysadmin access and the server must be SQL Server 2000 or higher.", "", - false, + true, "false", "" ], [ - "SecondarySqlCredential", + "DestinationSqlCredential", "Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential)", "", false, "false", "" ], - [ - "AvailabilityGroup", - "The name of the Availability Group.", - "", - false, - "false", - "" - ], - [ - "Exclude", - "Exclude one or more objects to export\nSpConfigure\r\nCustomErrors\r\nCredentials\r\nDatabaseMail\r\nLinkedServers\r\nLogins\r\nLoginPermissions\r\nSystemTriggers\r\nDatabaseOwner\r\nAgentCategory\r\nAgentOperator\r\nAgentAlert\r\nAgentProxy\r\nAgentSchedule\r\nAgentJob", - "ExcludeType", - false, - "false", - "" - ], [ "Login", - "Specific logins to sync. If unspecified, all logins will be processed.", + "The login(s) to process. Options for this list are auto-populated from the server. If unspecified, all logins will be processed.", "", false, "false", @@ -38803,44 +40703,12 @@ ], [ "ExcludeLogin", - "Specific logins to exclude when performing the sync. If unspecified, all logins will be processed.", - "", - false, - "false", - "" - ], - [ - "Job", - "Specific jobs to sync. If unspecified, all logins will be processed.", - "", - false, - "false", - "" - ], - [ - "ExcludeJob", - "Specific jobs to exclude when performing the sync. If unspecified, all logins will be processed.", + "The login(s) to exclude. Options for this list are auto-populated from the server.", "", false, "false", "" ], - [ - "InputObject", - "Enables piping from Get-DbaAvailabilityGroup.", - "", - false, - "true (ByValue)", - "" - ], - [ - "Force", - "If this switch is enabled, the objects will dropped and recreated on Destination.", - "", - false, - "false", - "False" - ], [ "EnableException", "By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message.\r\nThis avoids overwhelming you with \"sea of red\" exceptions, but is inconvenient because it basically disables advanced scripting.\r\nUsing this switch turns this \"nice by default\" feature off and enables you to catch exceptions with your own try/catch.", @@ -38851,7 +40719,7 @@ ], [ "WhatIf", - "Shows what would happen if the command were to run. No actions are actually performed.", + "If this switch is enabled, no actions are performed but informational messages will be displayed that explain what would happen if the command were to run.", "wi", false, "false", @@ -38859,39 +40727,41 @@ ], [ "Confirm", - "Prompts you for confirmation before executing any changing operations within the command.", + "If this switch is enabled, you will be prompted for confirmation before executing any operations that change state.", "cf", false, "false", "" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Syncs depdendent objects such as jobs, logins and custom errors for availability groups", - "Name": "Sync-DbaAvailabilityGroup", - "Links": "https://dbatools.io/Sync-DbaAvailabilityGroup", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eSync-DbaAvailabilityGroup -Primary sql2016a -AvailabilityGroup db3\nSyncs the following on all replicas found in the db3 AG:\r\nSpConfigure, CustomErrors, Credentials, DatabaseMail, LinkedServers\r\nLogins, LoginPermissions, SystemTriggers, DatabaseOwner, AgentCategory,\r\nAgentOperator, AgentAlert, AgentProxy, AgentScheduleAgentJob\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaAvailabilityGroup -SqlInstance sql2016a | Sync-DbaAvailabilityGroup -ExcludeType LoginPermissions, LinkedServers -ExcludeLogin login1, login2 -Job job1, job2\nSyncs the following on all replicas found in the db3 AG:\r\nSpConfigure, CustomErrors, Credentials, DatabaseMail, Logins,\r\nSystemTriggers, DatabaseOwner, AgentCategory, AgentOperator\r\nAgentAlert, AgentProxy, AgentScheduleAgentJob.\nCopies all logins except for login1 and login2 and only syncs job1 and job2\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaAvailabilityGroup -SqlInstance sql2016a | Sync-DbaAvailabilityGroup -WhatIf\nShows what would happen if the command were to run but doesn\u0027t actually perform the action.", - "Syntax": "Sync-DbaAvailabilityGroup [[-Primary] \u003cDbaInstanceParameter\u003e] [[-PrimarySqlCredential] \u003cPSCredential\u003e] [[-Secondary] \u003cDbaInstanceParameter[]\u003e] [[-SecondarySqlCredential] \u003cPSCredential\u003e] [[-AvailabilityGroup] \u003cString\u003e] [[-Exclude] \u003cString[]\u003e] [[-Login] \u003cString[]\u003e] [[-ExcludeLogin] \u003cString[]\u003e] [[-Job] \u003cString[]\u003e] [[-ExcludeJob] \u003cString[]\u003e] [[-InputObject] \u003cAvailabilityGroup[]\u003e] [-Force] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" + "Syntax": "Sync-DbaLoginPermission [-Source] \u003cDbaInstanceParameter\u003e [[-SourceSqlCredential] \u003cPSCredential\u003e] [-Destination] \u003cDbaInstanceParameter[]\u003e [[-DestinationSqlCredential] \u003cPSCredential\u003e] [[-Login] \u003cString[]\u003e] [[-ExcludeLogin] \u003cString[]\u003e] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Sync-DbaLoginPermission", - "Description": "Syncs only SQL Server login permissions, roles, etc. Does not add or drop logins. If a matching login does not exist on the destination, the login will be skipped. Credential removal is not currently supported for this operation.", + "Name": "Test-DbaAgentJobOwner", + "Description": "This function checks all SQL Agent Jobs on an instance against a SQL login to validate if that login owns those SQL Agent Jobs or not. By default, the function checks against \u0027sa\u0027 for ownership, but the user can pass a specific login if they use something else.\n\nOnly SQL Agent Jobs that do not match this ownership will be displayed.\nBest practice reference: http://sqlmag.com/blog/sql-server-tip-assign-ownership-jobs-sysadmin-account", "Tags": [ - "Migration", - "Login" + "Agent", + "Job", + "Owner" ], + "Synopsis": "Checks SQL Agent Job owners against a login to validate which jobs do not match that owner.", + "Alias": "Test-DbaJobOwner", + "Author": "Michael Fal (@Mike_Fal), http://mikefal.net", + "CommandName": "Test-DbaAgentJobOwner", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Test-DbaAgentJobOwner", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eTest-DbaAgentJobOwner -SqlInstance localhost\nReturns all SQL Agent Jobs where the owner does not match \u0027sa\u0027.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eTest-DbaAgentJobOwner -SqlInstance localhost -ExcludeJob \u0027syspolicy_purge_history\u0027\nReturns SQL Agent Jobs except for the syspolicy_purge_history job\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eTest-DbaAgentJobOwner -SqlInstance localhost -Login DOMAIN\\account\nReturns all SQL Agent Jobs where the owner does not match DOMAIN\\account. Note\r\nthat Login must be a valid security principal that exists on the target server.", "Params": [ [ - "Source", - "Source SQL Server. You must have sysadmin access and server version must be SQL Server version 2000 or higher.", - "", + "SqlInstance", + "The target SQL Server instance or instances.", + "ServerInstance,SqlServer", true, "true (ByValue)", "" ], [ - "SourceSqlCredential", + "SqlCredential", "Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential)", "", false, @@ -38899,16 +40769,16 @@ "" ], [ - "Destination", - "Destination SQL Server. You must have sysadmin access and the server must be SQL Server 2000 or higher.", - "", - true, + "Job", + "Specifies the job(s) to process. Options for this list are auto-populated from the server. If unspecified, all jobs will be processed.", + "Jobs", + false, "false", "" ], [ - "DestinationSqlCredential", - "Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential)", + "ExcludeJob", + "Specifies the job(s) to exclude from processing. Options for this list are auto-populated from the server.", "", false, "false", @@ -38916,61 +40786,46 @@ ], [ "Login", - "The login(s) to process. Options for this list are auto-populated from the server. If unspecified, all logins will be processed.", - "", + "Specifies the login that you wish check for ownership. This defaults to \u0027sa\u0027 or the sysadmin name if sa was renamed. This must be a valid security principal which exists on the target server.", + "TargetLogin", false, "false", "" ], [ - "ExcludeLogin", - "The login(s) to exclude. Options for this list are auto-populated from the server.", + "Detailed", + "Output all properties, will be deprecated in 1.0.0 release.", "", false, "false", - "" + "False" ], [ "EnableException", "By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message.\r\nThis avoids overwhelming you with \"sea of red\" exceptions, but is inconvenient because it basically disables advanced scripting.\r\nUsing this switch turns this \"nice by default\" feature off and enables you to catch exceptions with your own try/catch.", - "", + "Silent", false, "false", "False" - ], - [ - "WhatIf", - "If this switch is enabled, no actions are performed but informational messages will be displayed that explain what would happen if the command were to run.", - "wi", - false, - "false", - "" - ], - [ - "Confirm", - "If this switch is enabled, you will be prompted for confirmation before executing any operations that change state.", - "cf", - false, - "false", - "" ] ], - "Alias": "Sync-DbaSqlLoginPermission,Sync-SqlLoginPermissions", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Copies SQL login permissions from one server to another.", - "Name": "Sync-DbaLoginPermission", - "Links": "https://dbatools.io/Sync-DbaLoginPermission", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eSync-DbaLoginPermission -Source sqlserver2014a -Destination sqlcluster\nSyncs only SQL Server login permissions, roles, etc. Does not add or drop logins or users. To copy logins and their permissions, use Copy-SqlLogin.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eSync-DbaLoginPermission -Source sqlserver2014a -Destination sqlcluster -Exclude realcajun -SourceSqlCredential $scred -DestinationSqlCredential $dcred\nCopies all login permissions except for realcajun using SQL Authentication to connect to each server. If a login already exists on the destination, the permissions will not be migrated.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eSync-DbaLoginPermission -Source sqlserver2014a -Destination sqlcluster -Login realcajun, netnerds\nCopies permissions ONLY for logins netnerds and realcajun.", - "Syntax": "Sync-DbaLoginPermission [-Source] \u003cDbaInstanceParameter\u003e [[-SourceSqlCredential] \u003cPSCredential\u003e] [-Destination] \u003cDbaInstanceParameter[]\u003e [[-DestinationSqlCredential] \u003cPSCredential\u003e] [[-Login] \u003cString[]\u003e] [[-ExcludeLogin] \u003cString[]\u003e] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" + "Syntax": "Test-DbaAgentJobOwner [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [[-Job] \u003cObject[]\u003e] [[-ExcludeJob] \u003cObject[]\u003e] [[-Login] \u003cString\u003e] [-Detailed] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Test-DbaBackupInformation", + "Name": "Test-DbaBackupInformation", "Description": "Input is normally from a backup history object generated from `Format-DbaBackupInformation`. This is then parse to check that it\u0027s valid for restore. Tests performed include:\n - Checking unbroken LSN chain\n - If the target database exists and WithReplace has been provided\n - If any files already exist, but owned by other databases\n - Creates any new folders required\n - That the backup files exists at the location specified, and can be seen by the Sql Instance\n - If no errors are found then the objects for that database will me marked as Verified", "Tags": [ "Backup", "Restore", "DisasterRecovery" ], + "Synopsis": "Tests a dbatools backup history object is correct for restoring", + "Alias": "", + "Author": "Stuart Moore (@napalmgram), stuart-moore.com", + "CommandName": "Test-DbaBackupInformation", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Test-DbaBackupInformation", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003e$BackupHistory | Test-DbaBackupInformation -SqlInstance MyInstance\nPS C:\\\u003e $PassedDbs = $BackupHistory | Where-Object {$_.IsVerified -eq $True}\r\nPS C:\\\u003e $FailedDbs = $BackupHistory | Where-Object {$_.IsVerified -ne $True}\nPass in a BackupHistory object to be tested against MyInstance.\r\nThose records that pass are marked as verified. We can then use the IsVerified property to divide the failures and successes", "Params": [ [ "BackupHistory", @@ -39053,21 +40908,22 @@ "" ] ], - "Alias": "", - "Author": "Stuart Moore (@napalmgram), stuart-moore.com", - "Synopsis": "Tests a dbatools backup history object is correct for restoring", - "Name": "Test-DbaBackupInformation", - "Links": "https://dbatools.io/Test-DbaBackupInformation", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003e$BackupHistory | Test-DbaBackupInformation -SqlInstance MyInstance\nPS C:\\\u003e $PassedDbs = $BackupHistory | Where-Object {$_.IsVerified -eq $True}\r\nPS C:\\\u003e $FailedDbs = $BackupHistory | Where-Object {$_.IsVerified -ne $True}\nPass in a BackupHistory object to be tested against MyInstance.\r\nThose records that pass are marked as verified. We can then use the IsVerified property to divide the failures and successes", "Syntax": "Test-DbaBackupInformation [-BackupHistory] \u003cObject[]\u003e [[-SqlInstance] \u003cDbaInstanceParameter\u003e] [[-SqlCredential] \u003cPSCredential\u003e] [-WithReplace] [-Continue] [-VerifyOnly] [-OutputScriptOnly] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Test-DbaBuild", + "Name": "Test-DbaBuild", "Description": "Returns info about the specific build of a SQL instance, including the SP, the CU and the reference KB, End Of Support, wherever possible. It adds a Compliance property as true/false, and adds details about the \"targeted compliance\".", "Tags": [ "SqlBuild", "Version" ], + "Synopsis": "Returns SQL Server Build \"compliance\" level on a build.", + "Alias": "Test-DbaSqlBuild", + "Author": "Simone Bizzotto (@niphold) | Friedrich Weinmann (@FredWeinmann)", + "CommandName": "Test-DbaBuild", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Test-DbaBuild", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eTest-DbaBuild -Build \"12.0.5540\" -MinimumBuild \"12.0.5557\"\nReturns information about a build identified by \"12.0.5540\" (which is SQL 2014 with SP2 and CU4), which is not compliant as the minimum required\r\nbuild is \"12.0.5557\" (which is SQL 2014 with SP2 and CU8).\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eTest-DbaBuild -Build \"12.0.5540\" -MaxBehind \"1SP\"\nReturns information about a build identified by \"12.0.5540\", making sure it is AT MOST 1 Service Pack \"behind\". For that version,\r\nthat identifies an SP2, means accepting as the lowest compliance version as \"12.0.4110\", that identifies 2014 with SP1.\nOutput column CUTarget is not relevant (empty). SPTarget and BuildTarget are filled in the result.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eTest-DbaBuild -Build \"12.0.5540\" -MaxBehind \"1SP 1CU\"\nReturns information about a build identified by \"12.0.5540\", making sure it is AT MOST 1 Service Pack \"behind\", plus 1 CU \"behind\". For that version,\r\nthat identifies an SP2 and CU, rolling back 1 SP brings you to \"12.0.4110\", but given the latest CU for SP1 is CU13, the target \"compliant\" build\r\nwill be \"12.0.4511\", which is 2014 with SP1 and CU12.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eTest-DbaBuild -Build \"12.0.5540\" -MaxBehind \"0CU\"\nReturns information about a build identified by \"12.0.5540\", making sure it is the latest CU release.\nOutput columns CUTarget, SPTarget and BuildTarget are relevant. If the latest build is a service pack (not a CU), CUTarget will be empty.\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eTest-DbaBuild -Build \"12.0.5540\" -Latest\nReturns information about a build identified by \"12.0.5540\", making sure it is the latest build available.\nOutput columns CUTarget and SPTarget are not relevant (empty), only the BuildTarget is.\n-------------------------- EXAMPLE 6 --------------------------\nPS C:\\\u003eTest-DbaBuild -Build \"12.00.4502\" -MinimumBuild \"12.0.4511\" -Update\nSame as before, but tries to fetch the most up to date index online. When the online version is newer, the local one gets overwritten.\n-------------------------- EXAMPLE 7 --------------------------\nPS C:\\\u003eTest-DbaBuild -Build \"12.0.4502\",\"10.50.4260\" -MinimumBuild \"12.0.4511\"\nReturns information builds identified by these versions strings.\n-------------------------- EXAMPLE 8 --------------------------\nPS C:\\\u003eGet-DbaCmsRegServer -SqlInstance sqlserver2014a | Test-DbaBuild -MinimumBuild \"12.0.4511\"\nIntegrate with other cmdlets to have builds checked for all your registered servers on sqlserver2014a.", "Params": [ [ "Build", @@ -39142,21 +40998,22 @@ "False" ] ], - "Alias": "Test-DbaSqlBuild", - "Author": "Simone Bizzotto (@niphold) | Friedrich Weinmann (@FredWeinmann)", - "Synopsis": "Returns SQL Server Build \"compliance\" level on a build.", - "Name": "Test-DbaBuild", - "Links": "https://dbatools.io/Test-DbaBuild", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eTest-DbaBuild -Build \"12.0.5540\" -MinimumBuild \"12.0.5557\"\nReturns information about a build identified by \"12.0.5540\" (which is SQL 2014 with SP2 and CU4), which is not compliant as the minimum required\r\nbuild is \"12.0.5557\" (which is SQL 2014 with SP2 and CU8).\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eTest-DbaBuild -Build \"12.0.5540\" -MaxBehind \"1SP\"\nReturns information about a build identified by \"12.0.5540\", making sure it is AT MOST 1 Service Pack \"behind\". For that version,\r\nthat identifies an SP2, means accepting as the lowest compliance version as \"12.0.4110\", that identifies 2014 with SP1.\nOutput column CUTarget is not relevant (empty). SPTarget and BuildTarget are filled in the result.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eTest-DbaBuild -Build \"12.0.5540\" -MaxBehind \"1SP 1CU\"\nReturns information about a build identified by \"12.0.5540\", making sure it is AT MOST 1 Service Pack \"behind\", plus 1 CU \"behind\". For that version,\r\nthat identifies an SP2 and CU, rolling back 1 SP brings you to \"12.0.4110\", but given the latest CU for SP1 is CU13, the target \"compliant\" build\r\nwill be \"12.0.4511\", which is 2014 with SP1 and CU12.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eTest-DbaBuild -Build \"12.0.5540\" -MaxBehind \"0CU\"\nReturns information about a build identified by \"12.0.5540\", making sure it is the latest CU release.\nOutput columns CUTarget, SPTarget and BuildTarget are relevant. If the latest build is a service pack (not a CU), CUTarget will be empty.\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eTest-DbaBuild -Build \"12.0.5540\" -Latest\nReturns information about a build identified by \"12.0.5540\", making sure it is the latest build available.\nOutput columns CUTarget and SPTarget are not relevant (empty), only the BuildTarget is.\n-------------------------- EXAMPLE 6 --------------------------\nPS C:\\\u003eTest-DbaBuild -Build \"12.00.4502\" -MinimumBuild \"12.0.4511\" -Update\nSame as before, but tries to fetch the most up to date index online. When the online version is newer, the local one gets overwritten.\n-------------------------- EXAMPLE 7 --------------------------\nPS C:\\\u003eTest-DbaBuild -Build \"12.0.4502\",\"10.50.4260\" -MinimumBuild \"12.0.4511\"\nReturns information builds identified by these versions strings.\n-------------------------- EXAMPLE 8 --------------------------\nPS C:\\\u003eGet-DbaCmsRegServer -SqlInstance sqlserver2014a | Test-DbaBuild -MinimumBuild \"12.0.4511\"\nIntegrate with other cmdlets to have builds checked for all your registered servers on sqlserver2014a.", "Syntax": "Test-DbaBuild [[-Build] \u003cVersion[]\u003e] [[-MinimumBuild] \u003cVersion\u003e] [[-MaxBehind] \u003cString\u003e] [-Latest] [[-SqlInstance] \u003cDbaInstanceParameter[]\u003e] [[-SqlCredential] \u003cPSCredential\u003e] [-Update] [-Quiet] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Test-DbaCmConnection", + "Name": "Test-DbaCmConnection", "Description": "Tests over which paths a computer can be managed.\n\nThis function tries out the connectivity for:\n- Cim over WinRM\n- Cim over DCOM\n- Wmi\n- PowerShellRemoting\nResults will be written to the connectivity cache and will cause Get-DbaCmObject and Invoke-DbaCmMethod to connect using the way most likely to succeed. This way, it is likely the other commands will take less time to execute. These others too cache their results, in order to dynamically update connection statistics.\n\nThis function ignores global configuration settings limiting which protocols may be used.", "Tags": [ "ComputerManagement", "CIM" ], + "Synopsis": "Tests over which paths a computer can be managed.", + "Alias": "", + "Author": "Friedrich Weinmann (@FredWeinmann)", + "CommandName": "Test-DbaCmConnection", + "Availability": "Windows only", + "Links": "https://dbatools.io/Test-DbaCmConnection", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eTest-DbaCmConnection -ComputerName sql2014\nPerforms a full-spectrum connection test against the computer sql2014. The results will be reported and registered. Future calls from Get-DbaCmObject will recognize the results and optimize the query.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eTest-DbaCmConnection -ComputerName sql2014 -Credential $null -Type CimDCOM, CimRM\nThis test will run a connectivity test of CIM over DCOM and CIM over WinRM against the computer sql2014 using Windows Authentication.\nThe results will be reported and registered. Future calls from Get-DbaCmObject will recognize the results and optimize the query.", "Params": [ [ "ComputerName", @@ -39199,22 +41056,23 @@ "False" ] ], - "Alias": "", - "Author": "Friedrich Weinmann (@FredWeinmann)", - "Synopsis": "Tests over which paths a computer can be managed.", - "Name": "Test-DbaCmConnection", - "Links": "https://dbatools.io/Test-DbaCmConnection", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eTest-DbaCmConnection -ComputerName sql2014\nPerforms a full-spectrum connection test against the computer sql2014. The results will be reported and registered. Future calls from Get-DbaCmObject will recognize the results and optimize the query.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eTest-DbaCmConnection -ComputerName sql2014 -Credential $null -Type CimDCOM, CimRM\nThis test will run a connectivity test of CIM over DCOM and CIM over WinRM against the computer sql2014 using Windows Authentication.\nThe results will be reported and registered. Future calls from Get-DbaCmObject will recognize the results and optimize the query.", "Syntax": "Test-DbaCmConnection [[-ComputerName] \u003cDbaCmConnectionParameter[]\u003e] [[-Credential] \u003cPSCredential\u003e] [[-Type] {None | CimRM | CimDCOM | Wmi | PowerShellRemoting}] [-Force] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Test-DbaConnection", + "Name": "Test-DbaConnection", "Description": "Tests the ability to connect to an SQL Server instance outputting information about the server and instance.", "Tags": [ "CIM", "Test", "Connection" ], + "Synopsis": "Tests the connection to a single instance.", + "Alias": "Test-SqlConnection", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Test-DbaConnection", + "Availability": "Windows only", + "Links": "https://dbatools.io/Test-DbaConnection", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eTest-DbaConnection SQL2016\n```\r\nComputerName : SQL2016\r\nInstanceName : MSSQLSERVER\r\nSqlInstance : sql2016\r\nSqlVersion : 13.0.4001\r\nConnectingAsUser : BASE\\ctrlb\r\nConnectSuccess : True\r\nAuthType : Windows Authentication\r\nAuthScheme : KERBEROS\r\nTcpPort : 1433\r\nIPAddress : 10.2.1.5\r\nNetBiosName : sql2016.base.local\r\nIsPingable : True\r\nPSRemotingAccessible : True\r\nDomainName : base.local\r\nLocalWindows : 10.0.15063.0\r\nLocalPowerShell : 5.1.15063.502\r\nLocalCLR : 4.0.30319.42000\r\nLocalSMOVersion : 13.0.0.0\r\nLocalDomainUser : True\r\nLocalRunAsAdmin : False\r\n```\nTest connection to SQL2016 and outputs information collected", "Params": [ [ "SqlInstance", @@ -39249,21 +41107,22 @@ "False" ] ], - "Alias": "Test-SqlConnection", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Tests the connection to a single instance.", - "Name": "Test-DbaConnection", - "Links": "https://dbatools.io/Test-DbaConnection", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eTest-DbaConnection SQL2016\n```\r\nComputerName : SQL2016\r\nInstanceName : MSSQLSERVER\r\nSqlInstance : sql2016\r\nSqlVersion : 13.0.4001\r\nConnectingAsUser : BASE\\ctrlb\r\nConnectSuccess : True\r\nAuthType : Windows Authentication\r\nAuthScheme : KERBEROS\r\nTcpPort : 1433\r\nIPAddress : 10.2.1.5\r\nNetBiosName : sql2016.base.local\r\nIsPingable : True\r\nPSRemotingAccessible : True\r\nDomainName : base.local\r\nLocalWindows : 10.0.15063.0\r\nLocalPowerShell : 5.1.15063.502\r\nLocalCLR : 4.0.30319.42000\r\nLocalSMOVersion : 13.0.0.0\r\nLocalDomainUser : True\r\nLocalRunAsAdmin : False\r\n```\nTest connection to SQL2016 and outputs information collected", "Syntax": "Test-DbaConnection [[-SqlInstance] \u003cDbaInstanceParameter[]\u003e] [[-Credential] \u003cPSCredential\u003e] [[-SqlCredential] \u003cPSCredential\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Test-DbaConnectionAuthScheme", + "Name": "Test-DbaConnectionAuthScheme", "Description": "By default, this command will return the ConnectName, ServerName, Transport and AuthScheme of the current connection.\n\nConnectName is the name you used to connect. ServerName is the name that the SQL Server reports as its @@SERVERNAME which is used to register its SPN. If you were expecting a Kerberos connection and got NTLM instead, ensure ConnectName and ServerName match.\n\nIf -Kerberos or -Ntlm is specified, the $true/$false results of the test will be returned. Returns $true or $false by default for one server. Returns Server name and Results for more than one server.", "Tags": [ "SPN", "Kerberos" ], + "Synopsis": "Returns the transport protocol and authentication scheme of the connection. This is useful to determine if your connection is using Kerberos.", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Test-DbaConnectionAuthScheme", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Test-DbaConnectionAuthScheme", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eTest-DbaConnectionAuthScheme -SqlInstance sqlserver2014a, sql2016\nReturns ConnectName, ServerName, Transport and AuthScheme for sqlserver2014a and sql2016.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eTest-DbaConnectionAuthScheme -SqlInstance sqlserver2014a -Kerberos\nReturns $true or $false depending on if the connection is Kerberos or not.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eTest-DbaConnectionAuthScheme -SqlInstance sqlserver2014a | Select-Object *\nReturns the results of \"SELECT * from sys.dm_exec_connections WHERE session_id = @@SPID\"", "Params": [ [ "SqlInstance", @@ -39314,21 +41173,22 @@ "False" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Returns the transport protocol and authentication scheme of the connection. This is useful to determine if your connection is using Kerberos.", - "Name": "Test-DbaConnectionAuthScheme", - "Links": "https://dbatools.io/Test-DbaConnectionAuthScheme", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eTest-DbaConnectionAuthScheme -SqlInstance sqlserver2014a, sql2016\nReturns ConnectName, ServerName, Transport and AuthScheme for sqlserver2014a and sql2016.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eTest-DbaConnectionAuthScheme -SqlInstance sqlserver2014a -Kerberos\nReturns $true or $false depending on if the connection is Kerberos or not.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eTest-DbaConnectionAuthScheme -SqlInstance sqlserver2014a | Select-Object *\nReturns the results of \"SELECT * from sys.dm_exec_connections WHERE session_id = @@SPID\"", "Syntax": "Test-DbaConnectionAuthScheme [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [-Kerberos] [-Ntlm] [-Detailed] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Test-DbaDbCollation", + "Name": "Test-DbaDbCollation", "Description": "Compares Database Collations to Server Collation", "Tags": [ "Database", "Collation" ], + "Synopsis": "Compares Database Collations to Server Collation", + "Alias": "Test-DbaDatabaseCollation", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Test-DbaDbCollation", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Test-DbaDbCollation", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eTest-DbaDbCollation -SqlInstance sqlserver2014a\nReturns server name, database name and true/false if the collations match for all databases on sqlserver2014a.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eTest-DbaDbCollation -SqlInstance sqlserver2014a -Database db1, db2\nReturns information for the db1 and db2 databases on sqlserver2014a.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eTest-DbaDbCollation -SqlInstance sqlserver2014a, sql2016 -Exclude db1\nReturns information for database and server collations for all databases except db1 on sqlserver2014a and sql2016.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaCmsRegServer -SqlInstance sql2016 | Test-DbaDbCollation\nReturns db/server collation information for every database on every server listed in the Central Management Server on sql2016.", "Params": [ [ "SqlInstance", @@ -39379,21 +41239,22 @@ "False" ] ], - "Alias": "Test-DbaDatabaseCollation", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Compares Database Collations to Server Collation", - "Name": "Test-DbaDbCollation", - "Links": "https://dbatools.io/Test-DbaDbCollation", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eTest-DbaDbCollation -SqlInstance sqlserver2014a\nReturns server name, database name and true/false if the collations match for all databases on sqlserver2014a.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eTest-DbaDbCollation -SqlInstance sqlserver2014a -Database db1, db2\nReturns information for the db1 and db2 databases on sqlserver2014a.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eTest-DbaDbCollation -SqlInstance sqlserver2014a, sql2016 -Exclude db1\nReturns information for database and server collations for all databases except db1 on sqlserver2014a and sql2016.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaCmsRegServer -SqlInstance sql2016 | Test-DbaDbCollation\nReturns db/server collation information for every database on every server listed in the Central Management Server on sql2016.", "Syntax": "Test-DbaDbCollation [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [[-Database] \u003cObject[]\u003e] [[-ExcludeDatabase] \u003cObject[]\u003e] [-Detailed] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Test-DbaDbCompatibility", + "Name": "Test-DbaDbCompatibility", "Description": "Compares Database Compatibility level to Server Compatibility", "Tags": [ "Database", "Compatibility" ], + "Synopsis": "Compares Database Compatibility level to Server Compatibility", + "Alias": "Test-DbaDatabaseCompatibility", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Test-DbaDbCompatibility", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Test-DbaDbCompatibility", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eTest-DbaDbCompatibility -SqlInstance sqlserver2014a\nReturns server name, database name and true/false if the compatibility level match for all databases on sqlserver2014a.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eTest-DbaDbCompatibility -SqlInstance sqlserver2014a -Database db1, db2\nReturns detailed information for database and server compatibility level for the db1 and db2 databases on sqlserver2014a.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eTest-DbaDbCompatibility -SqlInstance sqlserver2014a, sql2016 -Exclude db1\nReturns detailed information for database and server compatibility level for all databases except db1 on sqlserver2014a and sql2016.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaCmsRegServer -SqlInstance sql2014 | Test-DbaDbCompatibility\nReturns db/server compatibility information for every database on every server listed in the Central Management Server on sql2016.", "Params": [ [ "SqlInstance", @@ -39444,22 +41305,23 @@ "False" ] ], - "Alias": "Test-DbaDatabaseCompatibility", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Compares Database Compatibility level to Server Compatibility", - "Name": "Test-DbaDbCompatibility", - "Links": "https://dbatools.io/Test-DbaDbCompatibility", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eTest-DbaDbCompatibility -SqlInstance sqlserver2014a\nReturns server name, database name and true/false if the compatibility level match for all databases on sqlserver2014a.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eTest-DbaDbCompatibility -SqlInstance sqlserver2014a -Database db1, db2\nReturns detailed information for database and server compatibility level for the db1 and db2 databases on sqlserver2014a.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eTest-DbaDbCompatibility -SqlInstance sqlserver2014a, sql2016 -Exclude db1\nReturns detailed information for database and server compatibility level for all databases except db1 on sqlserver2014a and sql2016.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaCmsRegServer -SqlInstance sql2014 | Test-DbaDbCompatibility\nReturns db/server compatibility information for every database on every server listed in the Central Management Server on sql2016.", "Syntax": "Test-DbaDbCompatibility [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-Credential] \u003cPSCredential\u003e] [[-Database] \u003cObject[]\u003e] [[-ExcludeDatabase] \u003cObject[]\u003e] [-Detailed] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Test-DbaDbCompression", + "Name": "Test-DbaDbCompression", "Description": "This function returns the results of a full table/index compression analysis and the estimated, best option to date for either NONE, Page, or Row Compression.\n\nRemember Uptime is critical, the longer uptime, the more accurate the analysis is, and it would be best if you utilized Get-DbaUptime first, before running this command.\n\nTest-DbaDbCompression script derived from GitHub and the tigertoolbox\n(https://github.com/Microsoft/tigertoolbox/tree/master/Evaluate-Compression-Gains)\nIn the output, you will find the following information:\n- Column Percent_Update shows the percentage of update operations on a specific table, index, or partition, relative to total operations on that object. The lower the percentage of Updates (that is, the table, index, or partition is infrequently updated), the better candidate it is for page compression.\n- Column Percent_Scan shows the percentage of scan operations on a table, index, or partition, relative to total operations on that object. The higher the value of Scan (that is, the table, index, or partition is mostly scanned), the better candidate it is for page compression.\n- Column Compression_Type_Recommendation can have four possible outputs indicating where there is most gain, if any: \u0027PAGE\u0027, \u0027ROW\u0027, \u0027NO_GAIN\u0027 or \u0027?\u0027. When the output is \u0027?\u0027 this approach could not give a recommendation, so as a rule of thumb I would lean to ROW if the object suffers mainly UPDATES, or PAGE if mainly INSERTS, but this is where knowing your workload is essential. When the output is \u0027NO_GAIN\u0027 well, that means that according to sp_estimate_data_compression_savings no space gains will be attained when compressing, as in the above output example, where compressing would grow the affected object.\n\nThis script will execute on the context of the current database.\nAlso be aware that this may take a while to execute on large objects, because if the IS locks taken by the\nsp_estimate_data_compression_savings cannot be honored, the SP will be blocked.\nIt only considers Row or Page Compression (not column compression)\nIt only evaluates User Tables", "Tags": [ "Compression", "Table", "Database" ], + "Synopsis": "Returns tables and indexes with preferred compression setting.", + "Alias": "", + "Author": "Jason Squires (@js_0505), jstexasdba@gmail.com", + "CommandName": "Test-DbaDbCompression", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Test-DbaDbCompression", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eTest-DbaDbCompression -SqlInstance localhost\nReturns results of all potential compression options for all databases for the default instance on the local host. Returns a recommendation of either Page, Row or NO_GAIN\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eTest-DbaDbCompression -SqlInstance ServerA\nReturns results of all potential compression options for all databases on the instance ServerA\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eTest-DbaDbCompression -SqlInstance ServerA -Database DBName | Out-GridView\nReturns results of all potential compression options for a single database DBName with the recommendation of either Page or Row or NO_GAIN in a nicely formatted GridView\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003e$cred = Get-Credential sqladmin\nPS C:\\\u003e Test-DbaDbCompression -SqlInstance ServerA -ExcludeDatabase MyDatabase -SqlCredential $cred\nReturns results of all potential compression options for all databases except MyDatabase on instance ServerA using SQL credentials to authentication to ServerA.\r\nReturns the recommendation of either Page, Row or NO_GAIN\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eTest-DbaDbCompression -SqlInstance ServerA -Schema Test -Table MyTable\nReturns results of all potential compression options for the Table Test.MyTable in instance ServerA on ServerA and ServerB.\r\nReturns the recommendation of either Page, Row or NO_GAIN.\r\nReturns a result for each partition of any Heap, Clustered or NonClustered index.\n-------------------------- EXAMPLE 6 --------------------------\nPS C:\\\u003eTest-DbaDbCompression -SqlInstance ServerA, ServerB -ResultSize 10\nReturns results of all potential compression options for all databases on ServerA and ServerB.\r\nReturns the recommendation of either Page, Row or NO_GAIN.\r\nReturns results for the top 10 partitions by TotalPages used per database.\n-------------------------- EXAMPLE 7 --------------------------\nPS C:\\\u003eServerA | Test-DbaDbCompression -Schema Test -ResultSize 10 -Rank UsedPages -FilterBy Table\nReturns results of all potential compression options for all databases on ServerA containing a schema Test\r\nReturns results for the top 10 Tables by Used Pages per database.\r\nResults are split by Table, Index and Partition so more than 10 results may be returned.\n-------------------------- EXAMPLE 8 --------------------------\nPS C:\\\u003e$servers = \u0027Server1\u0027,\u0027Server2\u0027\nPS C:\\\u003e $servers | Test-DbaDbCompression -Database DBName | Out-GridView\nReturns results of all potential compression options for a single database DBName on Server1 or Server2\r\nReturns the recommendation of either Page, Row or NO_GAIN in a nicely formatted GridView\n-------------------------- EXAMPLE 9 --------------------------\nPS C:\\\u003e$cred = Get-Credential sqladmin\nPS C:\\\u003e Test-DbaDbCompression -SqlInstance ServerA -Database MyDB -SqlCredential $cred -Schema Test -Table Test1, Test2\nReturns results of all potential compression options for objects in Database MyDb on instance ServerA using SQL credentials to authentication to ServerA.\r\nReturns the recommendation of either Page, Row or NO_GAIN for tables with SchemA Test and name in Test1 or Test2\n-------------------------- EXAMPLE 10 --------------------------\nPS C:\\\u003e$servers = \u0027Server1\u0027,\u0027Server2\u0027\nPS C:\\\u003e foreach ($svr in $servers) {\r\n\u003e\u003e Test-DbaDbCompression -SqlInstance $svr | Export-Csv -Path C:\\temp\\CompressionAnalysisPAC.csv -Append\r\n\u003e\u003e }\nThis produces a full analysis of all your servers listed and is pushed to a csv for you to analyze.", "Params": [ [ "SqlInstance", @@ -39542,18 +41404,19 @@ "False" ] ], - "Alias": "", - "Author": "Jason Squires (@js_0505), jstexasdba@gmail.com", - "Synopsis": "Returns tables and indexes with preferred compression setting.", - "Name": "Test-DbaDbCompression", - "Links": "https://dbatools.io/Test-DbaDbCompression", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eTest-DbaDbCompression -SqlInstance localhost\nReturns results of all potential compression options for all databases for the default instance on the local host. Returns a recommendation of either Page, Row or NO_GAIN\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eTest-DbaDbCompression -SqlInstance ServerA\nReturns results of all potential compression options for all databases on the instance ServerA\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eTest-DbaDbCompression -SqlInstance ServerA -Database DBName | Out-GridView\nReturns results of all potential compression options for a single database DBName with the recommendation of either Page or Row or NO_GAIN in a nicely formatted GridView\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003e$cred = Get-Credential sqladmin\nPS C:\\\u003e Test-DbaDbCompression -SqlInstance ServerA -ExcludeDatabase MyDatabase -SqlCredential $cred\nReturns results of all potential compression options for all databases except MyDatabase on instance ServerA using SQL credentials to authentication to ServerA.\r\nReturns the recommendation of either Page, Row or NO_GAIN\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eTest-DbaDbCompression -SqlInstance ServerA -Schema Test -Table MyTable\nReturns results of all potential compression options for the Table Test.MyTable in instance ServerA on ServerA and ServerB.\r\nReturns the recommendation of either Page, Row or NO_GAIN.\r\nReturns a result for each partition of any Heap, Clustered or NonClustered index.\n-------------------------- EXAMPLE 6 --------------------------\nPS C:\\\u003eTest-DbaDbCompression -SqlInstance ServerA, ServerB -ResultSize 10\nReturns results of all potential compression options for all databases on ServerA and ServerB.\r\nReturns the recommendation of either Page, Row or NO_GAIN.\r\nReturns results for the top 10 partitions by TotalPages used per database.\n-------------------------- EXAMPLE 7 --------------------------\nPS C:\\\u003eServerA | Test-DbaDbCompression -Schema Test -ResultSize 10 -Rank UsedPages -FilterBy Table\nReturns results of all potential compression options for all databases on ServerA containing a schema Test\r\nReturns results for the top 10 Tables by Used Pages per database.\r\nResults are split by Table, Index and Partition so more than 10 results may be returned.\n-------------------------- EXAMPLE 8 --------------------------\nPS C:\\\u003e$servers = \u0027Server1\u0027,\u0027Server2\u0027\nPS C:\\\u003e $servers | Test-DbaDbCompression -Database DBName | Out-GridView\nReturns results of all potential compression options for a single database DBName on Server1 or Server2\r\nReturns the recommendation of either Page, Row or NO_GAIN in a nicely formatted GridView\n-------------------------- EXAMPLE 9 --------------------------\nPS C:\\\u003e$cred = Get-Credential sqladmin\nPS C:\\\u003e Test-DbaDbCompression -SqlInstance ServerA -Database MyDB -SqlCredential $cred -Schema Test -Table Test1, Test2\nReturns results of all potential compression options for objects in Database MyDb on instance ServerA using SQL credentials to authentication to ServerA.\r\nReturns the recommendation of either Page, Row or NO_GAIN for tables with SchemA Test and name in Test1 or Test2\n-------------------------- EXAMPLE 10 --------------------------\nPS C:\\\u003e$servers = \u0027Server1\u0027,\u0027Server2\u0027\nPS C:\\\u003e foreach ($svr in $servers) {\r\n\u003e\u003e Test-DbaDbCompression -SqlInstance $svr | Export-Csv -Path C:\\temp\\CompressionAnalysisPAC.csv -Append\r\n\u003e\u003e }\nThis produces a full analysis of all your servers listed and is pushed to a csv for you to analyze.", "Syntax": "Test-DbaDbCompression [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [[-Database] \u003cObject[]\u003e] [[-ExcludeDatabase] \u003cObject[]\u003e] [[-Schema] \u003cString[]\u003e] [[-Table] \u003cString[]\u003e] [[-ResultSize] \u003cInt32\u003e] [[-Rank] \u003cString\u003e] [[-FilterBy] \u003cString\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Test-DbaDbLogShipStatus", + "Name": "Test-DbaDbLogShipStatus", "Description": "Most of the time your log shipping \"just works\".\nChecking your log shipping status can be done really easy with this function.\n\nMake sure you\u0027re connecting to the monitoring instance of your log shipping infrastructure.\n\nThe function will return the status for a database. This can be one or more messages in a comma separated list.\nIf everything is OK with the database than you should only see the message \"All OK\".", "Tags": "LogShipping", + "Synopsis": "Test-DbaDbLogShipStatus returns the status of your log shipping databases", + "Alias": "Test-DbaLogShippingStatus", + "Author": "Sander Stad (@sqlstad), sqlstad.nl", + "CommandName": "Test-DbaDbLogShipStatus", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Test-DbaDbLogShipStatus", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eTest-DbaDbLogShipStatus -SqlInstance sql1\nRetrieves the log ship information from sql1 and displays all the information present including the status.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eTest-DbaDbLogShipStatus -SqlInstance sql1 -Database AdventureWorks2014\nRetrieves the log ship information for just the database AdventureWorks.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eTest-DbaDbLogShipStatus -SqlInstance sql1 -Primary\nRetrieves the log ship information and only returns the information for the databases on the primary instance.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eTest-DbaDbLogShipStatus -SqlInstance sql1 -Secondary\nRetrieves the log ship information and only returns the information for the databases on the secondary instance.\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eTest-DbaDbLogShipStatus -SqlInstance sql1 -Simple\nRetrieves the log ship information and only returns the columns SQL Instance, Database, Instance Type and Status", "Params": [ [ "SqlInstance", @@ -39620,28 +41483,29 @@ "False" ] ], - "Alias": "Test-DbaLogShippingStatus", - "Author": "Sander Stad (@sqlstad), sqlstad.nl", - "Synopsis": "Test-DbaDbLogShipStatus returns the status of your log shipping databases", - "Name": "Test-DbaDbLogShipStatus", - "Links": "https://dbatools.io/Test-DbaDbLogShipStatus", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eTest-DbaDbLogShipStatus -SqlInstance sql1\nRetrieves the log ship information from sql1 and displays all the information present including the status.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eTest-DbaDbLogShipStatus -SqlInstance sql1 -Database AdventureWorks2014\nRetrieves the log ship information for just the database AdventureWorks.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eTest-DbaDbLogShipStatus -SqlInstance sql1 -Primary\nRetrieves the log ship information and only returns the information for the databases on the primary instance.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eTest-DbaDbLogShipStatus -SqlInstance sql1 -Secondary\nRetrieves the log ship information and only returns the information for the databases on the secondary instance.\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eTest-DbaDbLogShipStatus -SqlInstance sql1 -Simple\nRetrieves the log ship information and only returns the columns SQL Instance, Database, Instance Type and Status", "Syntax": "Test-DbaDbLogShipStatus [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [[-Database] \u003cString[]\u003e] [[-ExcludeDatabase] \u003cString[]\u003e] [-Simple] [-Primary] [-Secondary] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Test-DbaDbOwner", + "Name": "Test-DbaDbOwner", "Description": "This function will check all databases on an instance against a SQL login to validate if that\nlogin owns those databases or not. By default, the function will check against \u0027sa\u0027 for\nownership, but the user can pass a specific login if they use something else.\n\nBest Practice reference: http://weblogs.sqlteam.com/dang/archive/2008/01/13/Database-Owner-Troubles.aspx", "Tags": [ "Database", "Owner", "DbOwner" ], + "Synopsis": "Checks database owners against a login to validate which databases do not match that owner.", + "Alias": "Test-DbaDatabaseOwner", + "Author": "Michael Fal (@Mike_Fal), http://mikefal.net", + "CommandName": "Test-DbaDbOwner", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Test-DbaDbOwner", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eTest-DbaDbOwner -SqlInstance localhost\nReturns all databases where the owner does not match \u0027sa\u0027.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eTest-DbaDbOwner -SqlInstance localhost -TargetLogin \u0027DOMAIN\\account\u0027\nReturns all databases where the owner does not match \u0027DOMAIN\\account\u0027.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaDatabase -SqlInstance localhost -OnlyAccessible | Test-DbaDbOwner\nGets only accessible databases and checks where the owner does not match \u0027sa\u0027.", "Params": [ [ "SqlInstance", "The target SQL Server instance or instances.", "ServerInstance,SqlServer", - true, + false, "false", "" ], @@ -39702,21 +41566,22 @@ "False" ] ], - "Alias": "Test-DbaDatabaseOwner", - "Author": "Michael Fal (@Mike_Fal), http://mikefal.net", - "Synopsis": "Checks database owners against a login to validate which databases do not match that owner.", - "Name": "Test-DbaDbOwner", - "Links": "https://dbatools.io/Test-DbaDbOwner", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eTest-DbaDbOwner -SqlInstance localhost\nReturns all databases where the owner does not match \u0027sa\u0027.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eTest-DbaDbOwner -SqlInstance localhost -TargetLogin \u0027DOMAIN\\account\u0027\nReturns all databases where the owner does not match \u0027DOMAIN\\account\u0027.", - "Syntax": "Test-DbaDbOwner [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [[-Database] \u003cObject[]\u003e] [[-ExcludeDatabase] \u003cObject[]\u003e] [[-TargetLogin] \u003cString\u003e] [-Detailed] [[-InputObject] \u003cDatabase[]\u003e] [-EnableException] [\u003cCommonParameters\u003e]" + "Syntax": "Test-DbaDbOwner [[-SqlInstance] \u003cDbaInstanceParameter[]\u003e] [-SqlCredential \u003cPSCredential\u003e] [-Database \u003cObject[]\u003e] [-ExcludeDatabase \u003cObject[]\u003e] [-TargetLogin \u003cString\u003e] [-Detailed] [-InputObject \u003cDatabase[]\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Test-DbaDbRecoveryModel", + "Name": "Test-DbaDbRecoveryModel", "Description": "When you switch a database into FULL recovery model, it will behave like a SIMPLE recovery model until a full backup is taken in order to begin a log backup chain.\n\nHowever, you may also desire to validate if a database is SIMPLE or BULK LOGGED on an instance.\n\nInspired by Paul Randal\u0027s post (http://www.sqlskills.com/blogs/paul/new-script-is-that-database-really-in-the-full-recovery-mode/)", "Tags": [ "DisasterRecovery", "Backup" ], + "Synopsis": "Find if database is really a specific recovery model or not.", + "Alias": "Test-DbaFullRecoveryModel,Test-DbaRecoveryModel", + "Author": "Claudio Silva (@ClaudioESSilva)", + "CommandName": "Test-DbaDbRecoveryModel", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Test-DbaDbRecoveryModel", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eTest-DbaDbRecoveryModel -SqlInstance sql2005\nShows all databases where the configured recovery model is FULL and indicates whether or not they are really in FULL recovery model.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eTest-DbaDbRecoveryModel -SqlInstance . | Where-Object {$_.ActualRecoveryModel -ne \"FULL\"}\nOnly shows the databases that are functionally in \u0027simple\u0027 mode.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eTest-DbaDbRecoveryModel -SqlInstance sql2008 -RecoveryModel Bulk_Logged | Sort-Object Server -Descending\nShows all databases where the configured recovery model is BULK_LOGGED and sort them by server name descending\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eTest-DbaDbRecoveryModel -SqlInstance localhost | Select-Object -Property *\nShows all of the properties for the databases that have Full Recovery Model", "Params": [ [ "SqlInstance", @@ -39775,21 +41640,22 @@ "False" ] ], - "Alias": "Test-DbaFullRecoveryModel,Test-DbaRecoveryModel", - "Author": "Claudio Silva (@ClaudioESSilva)", - "Synopsis": "Find if database is really a specific recovery model or not.", - "Name": "Test-DbaDbRecoveryModel", - "Links": "https://dbatools.io/Test-DbaDbRecoveryModel", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eTest-DbaDbRecoveryModel -SqlInstance sql2005\nShows all databases where the configured recovery model is FULL and indicates whether or not they are really in FULL recovery model.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eTest-DbaDbRecoveryModel -SqlInstance . | Where-Object {$_.ActualRecoveryModel -ne \"FULL\"}\nOnly shows the databases that are functionally in \u0027simple\u0027 mode.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eTest-DbaDbRecoveryModel -SqlInstance sql2008 -RecoveryModel Bulk_Logged | Sort-Object Server -Descending\nShows all databases where the configured recovery model is BULK_LOGGED and sort them by server name descending\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eTest-DbaDbRecoveryModel -SqlInstance localhost | Select-Object -Property *\nShows all of the properties for the databases that have Full Recovery Model", "Syntax": "Test-DbaDbRecoveryModel [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-Database] \u003cObject[]\u003e] [[-ExcludeDatabase] \u003cObject[]\u003e] [[-SqlCredential] \u003cPSCredential\u003e] [[-RecoveryModel] \u003cObject\u003e] [-Detailed] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Test-DbaDbVirtualLogFile", + "Name": "Test-DbaDbVirtualLogFile", "Description": "Having a transaction log file with too many virtual log files (VLFs) can hurt database performance.\n\nToo many VLFs can cause transaction log backups to slow down and can also slow down database recovery and, in extreme cases, even affect insert/update/delete performance.\n\nReferences:\nhttp://www.sqlskills.com/blogs/kimberly/transaction-log-vlfs-too-many-or-too-few/\nhttp://blogs.msdn.com/b/saponsqlserver/archive/2012/02/22/too-many-virtual-log-files-vlfs-can-cause-slow-database-recovery.aspx\n\nIf you\u0027ve got a high number of VLFs, you can use Expand-SqlTLogResponsibly to reduce the number.", "Tags": [ "VLF", "Database" ], + "Synopsis": "Returns calculations on the database virtual log files for database on a SQL instance.", + "Alias": "Test-DbaVirtualLogFile", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Test-DbaDbVirtualLogFile", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Test-DbaDbVirtualLogFile", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eTest-DbaDbVirtualLogFile -SqlInstance sqlcluster\nReturns all user database virtual log file counts for the sqlcluster instance.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eTest-DbaDbVirtualLogFile -SqlInstance sqlserver | Where-Object {$_.Count -ge 50}\nReturns user databases that have 50 or more VLFs.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003e@(\u0027sqlserver\u0027,\u0027sqlcluster\u0027) | Test-DbaDbVirtualLogFile\nReturns all VLF information for the sqlserver and sqlcluster SQL Server instances. Processes data via the pipeline.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eTest-DbaDbVirtualLogFile -SqlInstance sqlcluster -Database db1, db2\nReturns VLF counts for the db1 and db2 databases on sqlcluster.", "Params": [ [ "SqlInstance", @@ -39840,18 +41706,19 @@ "False" ] ], - "Alias": "Test-DbaVirtualLogFile", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Returns calculations on the database virtual log files for database on a SQL instance.", - "Name": "Test-DbaDbVirtualLogFile", - "Links": "https://dbatools.io/Test-DbaDbVirtualLogFile", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eTest-DbaDbVirtualLogFile -SqlInstance sqlcluster\nReturns all user database virtual log file counts for the sqlcluster instance.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eTest-DbaDbVirtualLogFile -SqlInstance sqlserver | Where-Object {$_.Count -ge 50}\nReturns user databases that have 50 or more VLFs.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003e@(\u0027sqlserver\u0027,\u0027sqlcluster\u0027) | Test-DbaDbVirtualLogFile\nReturns all VLF information for the sqlserver and sqlcluster SQL Server instances. Processes data via the pipeline.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eTest-DbaDbVirtualLogFile -SqlInstance sqlcluster -Database db1, db2\nReturns VLF counts for the db1 and db2 databases on sqlcluster.", "Syntax": "Test-DbaDbVirtualLogFile [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [[-Database] \u003cObject[]\u003e] [[-ExcludeDatabase] \u003cObject[]\u003e] [-IncludeSystemDBs] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Test-DbaDeprecatedFeature", + "Name": "Test-DbaDeprecatedFeature", "Description": "Displays information relating to deprecated features for SQL Server 2005 and above.", "Tags": "Deprecated", + "Synopsis": "Displays information relating to deprecated features for SQL Server 2005 and above.", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Test-DbaDeprecatedFeature", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Test-DbaDeprecatedFeature", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaDatabase -SqlInstance sql2008 -Database testdb, db2 | Test-DbaDeprecatedFeature\nCheck deprecated features on server sql2008 for only the testdb and db2 databases\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaDatabase -SqlInstance sql2008 -Database testdb, db2 | Test-DbaDeprecatedFeature | Select *\nSee the object definition in the output as well\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eTest-DbaDeprecatedFeature -SqlInstance sql2008, sqlserver2012\nCheck deprecated features for all databases on the servers sql2008 and sqlserver2012.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eTest-DbaDeprecatedFeature -SqlInstance sql2008 -Database TestDB\nCheck deprecated features on server sql2008 for only the TestDB database", "Params": [ [ "SqlInstance", @@ -39902,18 +41769,19 @@ "False" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Displays information relating to deprecated features for SQL Server 2005 and above.", - "Name": "Test-DbaDeprecatedFeature", - "Links": "https://dbatools.io/Test-DbaDeprecatedFeature", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbaDatabase -SqlInstance sql2008 -Database testdb, db2 | Test-DbaDeprecatedFeature\nCheck deprecated features on server sql2008 for only the testdb and db2 databases\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaDatabase -SqlInstance sql2008 -Database testdb, db2 | Test-DbaDeprecatedFeature | Select *\nSee the object definition in the output as well\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eTest-DbaDeprecatedFeature -SqlInstance sql2008, sqlserver2012\nCheck deprecated features for all databases on the servers sql2008 and sqlserver2012.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eTest-DbaDeprecatedFeature -SqlInstance sql2008 -Database TestDB\nCheck deprecated features on server sql2008 for only the TestDB database", "Syntax": "Test-DbaDeprecatedFeature [[-SqlInstance] \u003cDbaInstanceParameter[]\u003e] [[-SqlCredential] \u003cPSCredential\u003e] [[-Database] \u003cString[]\u003e] [[-ExcludeDatabase] \u003cString[]\u003e] [[-InputObject] \u003cDatabase[]\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Test-DbaDiskAlignment", + "Name": "Test-DbaDiskAlignment", "Description": "Returns $true or $false by default for one server. Returns Server name and IsBestPractice for more than one server.\n\nPlease refer to your storage vendor best practices before following any advice below.\n\nBy default issues with disk alignment should be resolved by a new installation of Windows Server 2008, Windows Vista, or later operating systems, but verifying disk alignment continues to be recommended as a best practice.\nWhile some versions of Windows use different starting alignments, if you are starting anew 1MB is generally the best practice offset for current operating systems (because it ensures that the partition offset % common stripe unit sizes == 0 )\n\nCaveats:\n* Dynamic drives (or those provisioned via third party software) may or may not have accurate results when polled by any of the built in tools, see your vendor for details.\n* Windows does not have a reliable way to determine stripe unit Sizes. These values are obtained from vendor disk management software or from your SAN administrator.\n* System drives in versions previous to Windows Server 2008 cannot be aligned, but it is generally not recommended to place SQL Server databases on system drives.", "Tags": "Storage", + "Synopsis": "Verifies that your non-dynamic disks are aligned according to physical constraints.", + "Alias": "", + "Author": "Constantine Kokkinos (@mobileck), https://constantinekokkinos.com", + "CommandName": "Test-DbaDiskAlignment", + "Availability": "Windows only", + "Links": "https://dbatools.io/Test-DbaDiskAlignment", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eTest-DbaDiskAlignment -ComputerName sqlserver2014a\nTests the disk alignment of a single server named sqlserver2014a\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eTest-DbaDiskAlignment -ComputerName sqlserver2014a, sqlserver2014b, sqlserver2014c\nTests the disk alignment of multiple servers", "Params": [ [ "ComputerName", @@ -39956,21 +41824,22 @@ "False" ] ], - "Alias": "", - "Author": "Constantine Kokkinos (@mobileck), https://constantinekokkinos.com", - "Synopsis": "Verifies that your non-dynamic disks are aligned according to physical constraints.", - "Name": "Test-DbaDiskAlignment", - "Links": "https://dbatools.io/Test-DbaDiskAlignment", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eTest-DbaDiskAlignment -ComputerName sqlserver2014a\nTests the disk alignment of a single server named sqlserver2014a\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eTest-DbaDiskAlignment -ComputerName sqlserver2014a, sqlserver2014b, sqlserver2014c\nTests the disk alignment of multiple servers", "Syntax": "Test-DbaDiskAlignment [-ComputerName] \u003cDbaInstanceParameter[]\u003e [[-Credential] \u003cPSCredential\u003e] [[-SqlCredential] \u003cPSCredential\u003e] [-NoSqlCheck] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Test-DbaDiskAllocation", + "Name": "Test-DbaDiskAllocation", "Description": "Checks all disks on a computer for disk allocation units that match best practice recommendations. If one server is checked, only $true or $false is returned. If multiple servers are checked, each server\u0027s name and an IsBestPractice field are returned.\n\nReferences:\nhttps://technet.microsoft.com/en-us/library/dd758814(v=sql.100).aspx - \"The performance question here is usually not one of correlation per the formula, but whether the cluster size has been explicitly defined at 64 KB, which is a best practice for SQL Server.\"", "Tags": [ "CIM", "Storage" ], + "Synopsis": "Checks all disks on a computer to see if they are formatted with allocation units of 64KB.", + "Alias": "Test-SqlDiskAllocation", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Test-DbaDiskAllocation", + "Availability": "Windows only", + "Links": "https://dbatools.io/Test-DbaDiskAllocation", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eTest-DbaDiskAllocation -ComputerName sqlserver2014a\nScans all disks on server sqlserver2014a for best practice allocation unit size.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eTest-DbaDiskAllocation -ComputerName sqlserver2014 | Select-Output *\nScans all disks on server sqlserver2014a for allocation unit size and returns detailed results for each.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eTest-DbaDiskAllocation -ComputerName sqlserver2014a -NoSqlCheck\nScans all disks not hosting SQL Server data or log files on server sqlserver2014a for best practice allocation unit size.", "Params": [ [ "ComputerName", @@ -40037,18 +41906,19 @@ "" ] ], - "Alias": "Test-SqlDiskAllocation", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Checks all disks on a computer to see if they are formatted with allocation units of 64KB.", - "Name": "Test-DbaDiskAllocation", - "Links": "https://dbatools.io/Test-DbaDiskAllocation", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eTest-DbaDiskAllocation -ComputerName sqlserver2014a\nScans all disks on server sqlserver2014a for best practice allocation unit size.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eTest-DbaDiskAllocation -ComputerName sqlserver2014 | Select-Output *\nScans all disks on server sqlserver2014a for allocation unit size and returns detailed results for each.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eTest-DbaDiskAllocation -ComputerName sqlserver2014a -NoSqlCheck\nScans all disks not hosting SQL Server data or log files on server sqlserver2014a for best practice allocation unit size.", "Syntax": "Test-DbaDiskAllocation [-ComputerName] \u003cObject[]\u003e [-NoSqlCheck] [[-SqlCredential] \u003cPSCredential\u003e] [[-Credential] \u003cPSCredential\u003e] [-Detailed] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Test-DbaDiskSpeed", - "Description": "Tests how disks are performing.\n\nThis command uses a query from Rich Benner which was adapted from David Pless\u0027s article:\nhttps://blogs.msdn.microsoft.com/dpless/2010/12/01/leveraging-sys-dm_io_virtual_file_stats/\nhttps://github.com/RichBenner/PersonalCode/blob/master/Disk_Speed_Check.sql", + "Name": "Test-DbaDiskSpeed", + "Description": "Tests how disks are performing.\n\nThis command uses a query from Rich Benner\nhttps://github.com/RichBenner/PersonalCode/blob/master/Disk_Speed_Check.sql", "Tags": "Performance", + "Synopsis": "Tests how disks are performing.", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Test-DbaDiskSpeed", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Test-DbaDiskSpeed", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eTest-DbaDiskSpeed -SqlInstance sql2008, sqlserver2012\nTests how disks are performing on sql2008 and sqlserver2012.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eTest-DbaDiskSpeed -SqlInstance sql2008 -Database tempdb\nTests how disks storing tempdb files on sql2008 are performing.", "Params": [ [ "SqlInstance", @@ -40091,18 +41961,19 @@ "False" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Tests how disks are performing.", - "Name": "Test-DbaDiskSpeed", - "Links": "https://dbatools.io/Test-DbaDiskSpeed", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eTest-DbaDiskSpeed -SqlInstance sql2008, sqlserver2012\nTests how disks are performing on sql2008 and sqlserver2012.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eTest-DbaDiskSpeed -SqlInstance sql2008 -Database tempdb\nTests how disks storing tempdb files on sql2008 are performing.", "Syntax": "Test-DbaDiskSpeed [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [-SqlCredential \u003cPSCredential\u003e] [-Database \u003cObject[]\u003e] [-ExcludeDatabase \u003cObject[]\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Test-DbaEndpoint", + "Name": "Test-DbaEndpoint", "Description": "Performs a simple connectivity test for TCP and SSL enabled endpoints. Tests if port is accessible, not if endpoint is working.\n\nNote that if an endpoint does not have a tcp listener port, it will be skipped.", "Tags": "Endpoint", + "Synopsis": "Performs a simple connectivity test for TCP and SSL enabled endpoints.", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Test-DbaEndpoint", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Test-DbaEndpoint", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eTest-DbaEndpoint -SqlInstance localhost\nTests all endpoints on the local default SQL Server instance.\nNote that if an endpoint does not have a tcp listener port, it will be skipped.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaEndpoint -SqlInstance localhost, sql2016 -Endpoint Mirror | Test-DbaEndpoint\nTests all endpoints named Mirroring on sql2016 and localhost.\nNote that if an endpoint does not have a tcp listener port, it will be skipped.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eTest-DbaEndpoint -SqlInstance localhost, sql2016 -Endpoint Mirror\nTests all endpoints named Mirroring on sql2016 and localhost.\nNote that if an endpoint does not have a tcp listener port, it will be skipped.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eTest-DbaEndpoint -SqlInstance localhost -Verbose\nTests all endpoints on the local default SQL Server instance.\nSee all endpoints that were skipped due to not having a tcp listener port.", "Params": [ [ "SqlInstance", @@ -40145,22 +42016,23 @@ "False" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Performs a simple connectivity test for TCP and SSL enabled endpoints.", - "Name": "Test-DbaEndpoint", - "Links": "https://dbatools.io/Test-DbaEndpoint", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eTest-DbaEndpoint -SqlInstance localhost\nTests all endpoints on the local default SQL Server instance.\nNote that if an endpoint does not have a tcp listener port, it will be skipped.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaEndpoint -SqlInstance localhost, sql2016 -Endpoint Mirror | Test-DbaEndpoint\nTests all endpoints named Mirroring on sql2016 and localhost.\nNote that if an endpoint does not have a tcp listener port, it will be skipped.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eTest-DbaEndpoint -SqlInstance localhost, sql2016 -Endpoint Mirror\nTests all endpoints named Mirroring on sql2016 and localhost.\nNote that if an endpoint does not have a tcp listener port, it will be skipped.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eTest-DbaEndpoint -SqlInstance localhost -Verbose\nTests all endpoints on the local default SQL Server instance.\nSee all endpoints that were skipped due to not having a tcp listener port.", "Syntax": "Test-DbaEndpoint [[-SqlInstance] \u003cDbaInstanceParameter[]\u003e] [[-SqlCredential] \u003cPSCredential\u003e] [[-Endpoint] \u003cString[]\u003e] [[-InputObject] \u003cEndpoint[]\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Test-DbaIdentityUsage", + "Name": "Test-DbaIdentityUsage", "Description": "IDENTITY seeds have max values based off of their data type. This module will locate identity columns and report the seed usage.", "Tags": [ "Identity", "Table", "Column" ], + "Synopsis": "Displays information relating to IDENTITY seed usage. Works on SQL Server 2008 and above.", + "Alias": "", + "Author": "Brandon Abshire, netnerds.net", + "CommandName": "Test-DbaIdentityUsage", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Test-DbaIdentityUsage", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eTest-DbaIdentityUsage -SqlInstance sql2008, sqlserver2012\nCheck identity seeds for servers sql2008 and sqlserver2012.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eTest-DbaIdentityUsage -SqlInstance sql2008 -Database TestDB\nCheck identity seeds on server sql2008 for only the TestDB database\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eTest-DbaIdentityUsage -SqlInstance sql2008 -Database TestDB -Threshold 20\nCheck identity seeds on server sql2008 for only the TestDB database, limiting results to 20% utilization of seed range or higher", "Params": [ [ "SqlInstance", @@ -40219,22 +42091,23 @@ "False" ] ], - "Alias": "", - "Author": "Brandon Abshire, netnerds.net", - "Synopsis": "Displays information relating to IDENTITY seed usage. Works on SQL Server 2008 and above.", - "Name": "Test-DbaIdentityUsage", - "Links": "https://dbatools.io/Test-DbaIdentityUsage", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eTest-DbaIdentityUsage -SqlInstance sql2008, sqlserver2012\nCheck identity seeds for servers sql2008 and sqlserver2012.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eTest-DbaIdentityUsage -SqlInstance sql2008 -Database TestDB\nCheck identity seeds on server sql2008 for only the TestDB database\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eTest-DbaIdentityUsage -SqlInstance sql2008 -Database TestDB -Threshold 20\nCheck identity seeds on server sql2008 for only the TestDB database, limiting results to 20% utilization of seed range or higher", "Syntax": "Test-DbaIdentityUsage [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [-SqlCredential \u003cPSCredential\u003e] [-Database \u003cObject[]\u003e] [-ExcludeDatabase \u003cObject[]\u003e] [[-Threshold] \u003cInt32\u003e] [[-ExcludeSystem]] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Test-DbaLastBackup", + "Name": "Test-DbaLastBackup", "Description": "Restores all or some of the latest backups and performs a DBCC CHECKDB.\n\n1. Gathers information about the last full backups\n2. Restores the backups to the Destination with a new name. If no Destination is specified, the originating SQL Server instance wil be used.\n3. The database is restored as \"dbatools-testrestore-$databaseName\" by default, but you can change dbatools-testrestore to whatever you would like using -Prefix\n4. The internal file names are also renamed to prevent conflicts with original database\n5. A DBCC CHECKDB is then performed\n6. And the test database is finally dropped", "Tags": [ "DisasterRecovery", "Backup", "Restore" ], + "Synopsis": "Quickly and easily tests the last set of full backups for a server.", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Test-DbaLastBackup", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Test-DbaLastBackup", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eTest-DbaLastBackup -SqlInstance sql2016\nDetermines the last full backup for ALL databases, attempts to restore all databases (with a different name and file structure), then performs a DBCC CHECKDB. Once the test is complete, the test \r\nrestore will be dropped.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eTest-DbaLastBackup -SqlInstance sql2016 -Database SharePoint_Config\nDetermines the last full backup for SharePoint_Config, attempts to restore it, then performs a DBCC CHECKDB.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaDatabase -SqlInstance sql2016, sql2017 | Test-DbaLastBackup\nTests every database backup on sql2016 and sql2017\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaDatabase -SqlInstance sql2016, sql2017 -Database SharePoint_Config | Test-DbaLastBackup\nTests the database backup for the SharePoint_Config database on sql2016 and sql2017\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eTest-DbaLastBackup -SqlInstance sql2016 -Database model, master -VerifyOnly\nSkips performing an action restore of the database and simply verifies the backup using VERIFYONLY option of the restore.\n-------------------------- EXAMPLE 6 --------------------------\nPS C:\\\u003eTest-DbaLastBackup -SqlInstance sql2016 -NoCheck -NoDrop\nSkips the DBCC CHECKDB check. This can help speed up the tests but makes it less tested. The test restores will remain on the server.\n-------------------------- EXAMPLE 7 --------------------------\nPS C:\\\u003eTest-DbaLastBackup -SqlInstance sql2016 -DataDirectory E:\\bigdrive -LogDirectory L:\\bigdrive -MaxSize 10240\nRestores data and log files to alternative locations and only restores databases that are smaller than 10 GB.\n-------------------------- EXAMPLE 8 --------------------------\nPS C:\\\u003eTest-DbaLastBackup -SqlInstance sql2014 -Destination sql2016 -CopyFile\nCopies the backup files for sql2014 databases to sql2016 default backup locations and then attempts restore from there.\n-------------------------- EXAMPLE 9 --------------------------\nPS C:\\\u003eTest-DbaLastBackup -SqlInstance sql2014 -Destination sql2016 -CopyFile -CopyPath \"\\\\BackupShare\\TestRestore\\\"\nCopies the backup files for sql2014 databases to sql2016 default backup locations and then attempts restore from there.", "Params": [ [ "SqlInstance", @@ -40358,7 +42231,7 @@ ], [ "IncludeCopyOnly", - "If this switch is enabled, copy only backups will not be counted as a last backup.", + "If this switch is enabled, copy only backups will be counted as a last backup.", "", false, "false", @@ -40413,18 +42286,19 @@ "" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Quickly and easily tests the last set of full backups for a server.", - "Name": "Test-DbaLastBackup", - "Links": "https://dbatools.io/Test-DbaLastBackup", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eTest-DbaLastBackup -SqlInstance sql2016\nDetermines the last full backup for ALL databases, attempts to restore all databases (with a different name and file structure), then performs a DBCC CHECKDB. Once the test is complete, the test \r\nrestore will be dropped.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eTest-DbaLastBackup -SqlInstance sql2016 -Database SharePoint_Config\nDetermines the last full backup for SharePoint_Config, attempts to restore it, then performs a DBCC CHECKDB.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaDatabase -SqlInstance sql2016, sql2017 | Test-DbaLastBackup\nTests every database backup on sql2016 and sql2017\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaDatabase -SqlInstance sql2016, sql2017 -Database SharePoint_Config | Test-DbaLastBackup\nTests the database backup for the SharePoint_Config database on sql2016 and sql2017\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eTest-DbaLastBackup -SqlInstance sql2016 -Database model, master -VerifyOnly\nSkips performing an action restore of the database and simply verifies the backup using VERIFYONLY option of the restore.\n-------------------------- EXAMPLE 6 --------------------------\nPS C:\\\u003eTest-DbaLastBackup -SqlInstance sql2016 -NoCheck -NoDrop\nSkips the DBCC CHECKDB check. This can help speed up the tests but makes it less tested. The test restores will remain on the server.\n-------------------------- EXAMPLE 7 --------------------------\nPS C:\\\u003eTest-DbaLastBackup -SqlInstance sql2016 -DataDirectory E:\\bigdrive -LogDirectory L:\\bigdrive -MaxSize 10240\nRestores data and log files to alternative locations and only restores databases that are smaller than 10 GB.\n-------------------------- EXAMPLE 8 --------------------------\nPS C:\\\u003eTest-DbaLastBackup -SqlInstance sql2014 -Destination sql2016 -CopyFile\nCopies the backup files for sql2014 databases to sql2016 default backup locations and then attempts restore from there.\n-------------------------- EXAMPLE 9 --------------------------\nPS C:\\\u003eTest-DbaLastBackup -SqlInstance sql2014 -Destination sql2016 -CopyFile -CopyPath \"\\\\BackupShare\\TestRestore\\\"\nCopies the backup files for sql2014 databases to sql2016 default backup locations and then attempts restore from there.", "Syntax": "Test-DbaLastBackup [[-SqlInstance] \u003cDbaInstanceParameter[]\u003e] [[-SqlCredential] \u003cPSCredential\u003e] [[-Database] \u003cObject[]\u003e] [[-ExcludeDatabase] \u003cObject[]\u003e] [[-Destination] \u003cDbaInstanceParameter\u003e] [[-DestinationCredential] \u003cObject\u003e] [[-DataDirectory] \u003cString\u003e] [[-LogDirectory] \u003cString\u003e] [[-Prefix] \u003cString\u003e] [-VerifyOnly] [-NoCheck] [-NoDrop] [-CopyFile] [[-CopyPath] \u003cString\u003e] [[-MaxSize] \u003cInt32\u003e] [-IncludeCopyOnly] [-IgnoreLogBackup] [[-AzureCredential] \u003cString\u003e] [[-InputObject] \u003cDatabase[]\u003e] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Test-DbaLinkedServerConnection", + "Name": "Test-DbaLinkedServerConnection", "Description": "Test each linked server on the instance", "Tags": "LinkedServer", + "Synopsis": "Test all linked servers from the sql servers passed", + "Alias": "", + "Author": "Thomas LaRock ( https://thomaslarock.com )", + "CommandName": "Test-DbaLinkedServerConnection", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Test-DbaLinkedServerConnection", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eTest-DbaLinkedServerConnection -SqlInstance DEV01\nTest all Linked Servers for the SQL Server instance DEV01\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eTest-DbaLinkedServerConnection -SqlInstance sql2016 | Out-File C:\\temp\\results.txt\nTest all Linked Servers for the SQL Server instance sql2016 and output results to file\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eTest-DbaLinkedServerConnection -SqlInstance sql2016, sql2014, sql2012\nTest all Linked Servers for the SQL Server instances sql2016, sql2014 and sql2012\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003e$servers = \"sql2016\",\"sql2014\",\"sql2012\"\nPS C:\\\u003e $servers | Test-DbaLinkedServerConnection -SqlCredential sqladmin\nTest all Linked Servers for the SQL Server instances sql2016, sql2014 and sql2012 using SQL login credentials\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003e$servers | Get-DbaLinkedServer | Test-DbaLinkedServerConnection\nTest all Linked Servers for the SQL Server instances sql2016, sql2014 and sql2012", "Params": [ [ "SqlInstance", @@ -40451,21 +42325,22 @@ "False" ] ], - "Alias": "", - "Author": "Thomas LaRock ( https://thomaslarock.com )", - "Synopsis": "Test all linked servers from the sql servers passed", - "Name": "Test-DbaLinkedServerConnection", - "Links": "https://dbatools.io/Test-DbaLinkedServerConnection", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eTest-DbaLinkedServerConnection -SqlInstance DEV01\nTest all Linked Servers for the SQL Server instance DEV01\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eTest-DbaLinkedServerConnection -SqlInstance sql2016 | Out-File C:\\temp\\results.txt\nTest all Linked Servers for the SQL Server instance sql2016 and output results to file\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eTest-DbaLinkedServerConnection -SqlInstance sql2016, sql2014, sql2012\nTest all Linked Servers for the SQL Server instances sql2016, sql2014 and sql2012\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003e$servers = \"sql2016\",\"sql2014\",\"sql2012\"\nPS C:\\\u003e $servers | Test-DbaLinkedServerConnection -SqlCredential sqladmin\nTest all Linked Servers for the SQL Server instances sql2016, sql2014 and sql2012 using SQL login credentials\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003e$servers | Get-DbaLinkedServer | Test-DbaLinkedServerConnection\nTest all Linked Servers for the SQL Server instances sql2016, sql2014 and sql2012", "Syntax": "Test-DbaLinkedServerConnection [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Test-DbaLoginPassword", + "Name": "Test-DbaLoginPassword", "Description": "The purpose of this function is to find SQL Server logins that have no password or the same password as login. You can add your own password to check for or add them to a csv file.\nBy default it will test for empty password and the same password as username.", "Tags": [ "Login", "Security" ], + "Synopsis": "Test-DbaLoginPassword finds any logins on SQL instance that are SQL Logins and have a password that is either null or same as the login", + "Alias": "", + "Author": "Peter Samuelsson", + "CommandName": "Test-DbaLoginPassword", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Test-DbaLoginPassword", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eTest-DbaLoginPassword -SqlInstance Dev01\nTest all SQL logins that the password is null or same as username on SQL server instance Dev01\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eTest-DbaLoginPassword -SqlInstance Dev01 -Login sqladmin\nTest the \u0027sqladmin\u0027 SQL login that the password is null or same as username on SQL server instance Dev01\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eTest-DbaLoginPassword -SqlInstance Dev01 -Dictionary Test1,test2\nTest all SQL logins that the password is null, same as username or Test1,Test2 on SQL server instance Dev0\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaLogin -SqlInstance \"sql2017\",\"sql2016\" | Test-DbaLoginPassword\nTest all logins on sql2017 and sql2016\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003e$servers | Get-DbaLogin | Out-GridView -PassThru | Test-DbaLoginPassword\nTest selected logins on all servers in the $servers variable", "Params": [ [ "SqlInstance", @@ -40516,18 +42391,19 @@ "False" ] ], - "Alias": "", - "Author": "Peter Samuelsson", - "Synopsis": "Test-DbaLoginPassword finds any logins on SQL instance that are SQL Logins and have a password that is either null or same as the login", - "Name": "Test-DbaLoginPassword", - "Links": "https://dbatools.io/Test-DbaLoginPassword", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eTest-DbaLoginPassword -SqlInstance Dev01\nTest all SQL logins that the password is null or same as username on SQL server instance Dev01\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eTest-DbaLoginPassword -SqlInstance Dev01 -Login sqladmin\nTest the \u0027sqladmin\u0027 SQL login that the password is null or same as username on SQL server instance Dev01\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eTest-DbaLoginPassword -SqlInstance Dev01 -Dictionary Test1,test2\nTest all SQL logins that the password is null, same as username or Test1,Test2 on SQL server instance Dev0\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaLogin -SqlInstance \"sql2017\",\"sql2016\" | Test-DbaLoginPassword\nTest all logins on sql2017 and sql2016\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003e$servers | Get-DbaLogin | Out-GridView -PassThru | Test-DbaLoginPassword\nTest selected logins on all servers in the $servers variable", "Syntax": "Test-DbaLoginPassword [[-SqlInstance] \u003cDbaInstanceParameter[]\u003e] [[-SqlCredential] \u003cPSCredential\u003e] [[-Login] \u003cString[]\u003e] [[-Dictionary] \u003cString[]\u003e] [[-InputObject] \u003cLogin[]\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Test-DbaManagementObject", + "Name": "Test-DbaManagementObject", "Description": "The Test-DbaManagementObject returns True if the Version is on the computer, and False if it does not exist.", "Tags": "SMO", + "Synopsis": "Tests to see if the SMO version specified exists on the computer.", + "Alias": "Test-DbaSqlManagementObject", + "Author": "Ben Miller (@DBAduck), http://dbaduck.com", + "CommandName": "Test-DbaManagementObject", + "Availability": "Windows only", + "Links": "https://dbatools.io/Test-DbaManagementObject", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eTest-DbaManagementObject -VersionNumber 13\nReturns True if the version exists, if it does not exist it will return False", "Params": [ [ "ComputerName", @@ -40562,21 +42438,22 @@ "False" ] ], - "Alias": "Test-DbaSqlManagementObject", - "Author": "Ben Miller (@DBAduck), http://dbaduck.com", - "Synopsis": "Tests to see if the SMO version specified exists on the computer.", - "Name": "Test-DbaManagementObject", - "Links": "https://dbatools.io/Test-DbaManagementObject", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eTest-DbaManagementObject -VersionNumber 13\nReturns True if the version exists, if it does not exist it will return False", "Syntax": "Test-DbaManagementObject [[-ComputerName] \u003cDbaInstanceParameter[]\u003e] [[-Credential] \u003cPSCredential\u003e] [-VersionNumber] \u003cInt32[]\u003e [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Test-DbaMaxDop", + "Name": "Test-DbaMaxDop", "Description": "Inspired by Sakthivel Chidambaram\u0027s post about SQL Server MAXDOP Calculator (https://blogs.msdn.microsoft.com/sqlsakthi/p/maxdop-calculator-SqlInstance/),\nthis script displays a SQL Server\u0027s: max dop configured, and the calculated recommendation.\n\nFor SQL Server 2016 shows:\n- Instance max dop configured and the calculated recommendation\n- max dop configured per database (new feature)\n\nMore info:\nhttps://support.microsoft.com/en-us/kb/2806535\nhttps://blogs.msdn.microsoft.com/sqlsakthi/2012/05/23/wow-we-have-maxdop-calculator-for-sql-server-it-makes-my-job-easier/\n\nThese are just general recommendations for SQL Server and are a good starting point for setting the \"max degree of parallelism\" option.", "Tags": [ "MaxDop", "SpConfigure" ], + "Synopsis": "Displays information relating to SQL Server Max Degree of Parallelism setting. Works on SQL Server 2005-2016.", + "Alias": "", + "Author": "Claudio Silva (@claudioessilva)", + "CommandName": "Test-DbaMaxDop", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Test-DbaMaxDop", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eTest-DbaMaxDop -SqlInstance sql2008, sqlserver2012\nGet Max DOP setting for servers sql2008 and sqlserver2012 and also the recommended one.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eTest-DbaMaxDop -SqlInstance sql2014 | Select-Object *\nShows Max DOP setting for server sql2014 with the recommended value. Piping the output to Select-Object * will also show the \u0027NumaNodes\u0027 and \u0027NumberOfCores\u0027 of each instance\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eTest-DbaMaxDop -SqlInstance sqlserver2016 | Select-Object *\nGet Max DOP setting for servers sql2016 with the recommended value. Piping the output to Select-Object * will also show the \u0027NumaNodes\u0027 and \u0027NumberOfCores\u0027 of each instance. Because it is an 2016 \r\ninstance will be shown \u0027InstanceVersion\u0027, \u0027Database\u0027 and \u0027DatabaseMaxDop\u0027 columns.", "Params": [ [ "SqlInstance", @@ -40611,21 +42488,22 @@ "False" ] ], - "Alias": "", - "Author": "Claudio Silva (@claudioessilva)", - "Synopsis": "Displays information relating to SQL Server Max Degree of Parallelism setting. Works on SQL Server 2005-2016.", - "Name": "Test-DbaMaxDop", - "Links": "https://dbatools.io/Test-DbaMaxDop", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eTest-DbaMaxDop -SqlInstance sql2008, sqlserver2012\nGet Max DOP setting for servers sql2008 and sqlserver2012 and also the recommended one.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eTest-DbaMaxDop -SqlInstance sql2014 | Select-Object *\nShows Max DOP setting for server sql2014 with the recommended value. Piping the output to Select-Object * will also show the \u0027NumaNodes\u0027 and \u0027NumberOfCores\u0027 of each instance\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eTest-DbaMaxDop -SqlInstance sqlserver2016 | Select-Object *\nGet Max DOP setting for servers sql2016 with the recommended value. Piping the output to Select-Object * will also show the \u0027NumaNodes\u0027 and \u0027NumberOfCores\u0027 of each instance. Because it is an 2016 \r\ninstance will be shown \u0027InstanceVersion\u0027, \u0027Database\u0027 and \u0027DatabaseMaxDop\u0027 columns.", "Syntax": "Test-DbaMaxDop [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [-SqlCredential \u003cPSCredential\u003e] [-Detailed] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Test-DbaMaxMemory", + "Name": "Test-DbaMaxMemory", "Description": "Inspired by Jonathan Kehayias\u0027s post about SQL Server Max memory (http://bit.ly/sqlmemcalc), this script displays a SQL Server\u0027s: total memory, currently configured SQL max memory, and the calculated recommendation.\n\nJonathan notes that the formula used provides a *general recommendation* that doesn\u0027t account for everything that may be going on in your specific environment.", "Tags": [ "MaxMemory", "Memory" ], + "Synopsis": "Calculates the recommended value for SQL Server \u0027Max Server Memory\u0027 configuration setting. Works on SQL Server 2000-2014.", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Test-DbaMaxMemory", + "Availability": "Windows only", + "Links": "https://dbatools.io/Test-DbaMaxMemory", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eTest-DbaMaxMemory -SqlInstance sqlcluster,sqlserver2012\nCalculate the \u0027Max Server Memory\u0027 for SQL Server instances sqlcluster and sqlserver2012\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaCmsRegServer -SqlInstance sqlcluster | Test-DbaMaxMemory\nCalculate the \u0027Max Server Memory\u0027 settings for all servers within the SQL Server Central Management Server \"sqlcluster\"\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaCmsRegServer -SqlInstance sqlcluster | Test-DbaMaxMemory | Where-Object { $_.MaxValue -gt $_.Total } | Set-DbaMaxMemory\nFind all servers in CMS that have Max SQL memory set to higher than the total memory of the server (think 2147483647) and set it to recommended value.", "Params": [ [ "SqlInstance", @@ -40660,18 +42538,19 @@ "False" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Calculates the recommended value for SQL Server \u0027Max Server Memory\u0027 configuration setting. Works on SQL Server 2000-2014.", - "Name": "Test-DbaMaxMemory", - "Links": "https://dbatools.io/Test-DbaMaxMemory", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eTest-DbaMaxMemory -SqlInstance sqlcluster,sqlserver2012\nCalculate the \u0027Max Server Memory\u0027 for SQL Server instances sqlcluster and sqlserver2012\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eGet-DbaCmsRegServer -SqlInstance sqlcluster | Test-DbaMaxMemory\nCalculate the \u0027Max Server Memory\u0027 settings for all servers within the SQL Server Central Management Server \"sqlcluster\"\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaCmsRegServer -SqlInstance sqlcluster | Test-DbaMaxMemory | Where-Object { $_.MaxValue -gt $_.Total } | Set-DbaMaxMemory\nFind all servers in CMS that have Max SQL memory set to higher than the total memory of the server (think 2147483647) and set it to recommended value.", "Syntax": "Test-DbaMaxMemory [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [[-Credential] \u003cPSCredential\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Test-DbaMigrationConstraint", + "Name": "Test-DbaMigrationConstraint", "Description": "When you want to migrate from a higher edition to a lower one there are some features that can\u0027t be used.\nThis function will validate if you have any of this features in use and will report to you.\nThe validation will be made ONLY on on SQL Server 2008 or higher using the \u0027sys.dm_db_persisted_sku_features\u0027 dmv.\n\nThis function only validate SQL Server 2008 versions or higher.\nThe editions supported by this function are:\n- Enterprise\n- Developer\n- Evaluation\n- Standard\n- Express\n\nTake into account the new features introduced on SQL Server 2016 SP1 for all versions. More information at https://blogs.msdn.microsoft.com/sqlreleaseservices/sql-server-2016-service-pack-1-sp1-released/\n\nThe -Database parameter is auto-populated for command-line completion.", "Tags": "Migration", + "Synopsis": "Show if you can migrate the database(s) between the servers.", + "Alias": "Test-SqlMigrationConstraint", + "Author": "Claudio Silva (@ClaudioESSilva)", + "CommandName": "Test-DbaMigrationConstraint", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Test-DbaMigrationConstraint", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eTest-DbaMigrationConstraint -Source sqlserver2014a -Destination sqlcluster\nAll databases on sqlserver2014a will be verified for features in use that can\u0027t be supported on sqlcluster.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eTest-DbaMigrationConstraint -Source sqlserver2014a -Destination sqlcluster -SourceSqlCredential $cred\nAll databases will be verified for features in use that can\u0027t be supported on the destination server. SQL credentials are used to authenticate against sqlserver2014a and Windows Authentication is \r\nused for sqlcluster.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eTest-DbaMigrationConstraint -Source sqlserver2014a -Destination sqlcluster -Database db1\nOnly db1 database will be verified for features in use that can\u0027t be supported on the destination server.", "Params": [ [ "Source", @@ -40730,21 +42609,22 @@ "False" ] ], - "Alias": "Test-SqlMigrationConstraint", - "Author": "Claudio Silva (@ClaudioESSilva)", - "Synopsis": "Show if you can migrate the database(s) between the servers.", - "Name": "Test-DbaMigrationConstraint", - "Links": "https://dbatools.io/Test-DbaMigrationConstraint", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eTest-DbaMigrationConstraint -Source sqlserver2014a -Destination sqlcluster\nAll databases on sqlserver2014a will be verified for features in use that can\u0027t be supported on sqlcluster.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eTest-DbaMigrationConstraint -Source sqlserver2014a -Destination sqlcluster -SourceSqlCredential $cred\nAll databases will be verified for features in use that can\u0027t be supported on the destination server. SQL credentials are used to authenticate against sqlserver2014a and Windows Authentication is \r\nused for sqlcluster.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eTest-DbaMigrationConstraint -Source sqlserver2014a -Destination sqlcluster -Database db1\nOnly db1 database will be verified for features in use that can\u0027t be supported on the destination server.", "Syntax": "Test-DbaMigrationConstraint [-Source] \u003cDbaInstanceParameter\u003e [[-SourceSqlCredential] \u003cPSCredential\u003e] [-Destination] \u003cDbaInstanceParameter\u003e [[-DestinationSqlCredential] \u003cPSCredential\u003e] [[-Database] \u003cObject[]\u003e] [[-ExcludeDatabase] \u003cObject[]\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Test-DbaNetworkLatency", + "Name": "Test-DbaNetworkLatency", "Description": "This function is intended to help measure SQL Server network latency by establishing a connection and executing a simple query. This is a better than a simple ping because it actually creates the connection to the SQL Server and measures the time required for only the entire routine, but the duration of the query as well how long it takes for the results to be returned.\n\nBy default, this command will execute \"SELECT TOP 100 * FROM INFORMATION_SCHEMA.TABLES\" three times. It will then output how long the entire connection and command took, as well as how long *only* the execution of the command took.\n\nThis allows you to see if the issue is with the connection or the SQL Server itself.", "Tags": [ "Performance", "Network" ], + "Synopsis": "Tests how long a query takes to return from SQL Server", + "Alias": "Test-SqlNetworkLatency", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Test-DbaNetworkLatency", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Test-DbaNetworkLatency", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eTest-DbaNetworkLatency -SqlInstance sqlserver2014a, sqlcluster\nTests the round trip return of \"SELECT TOP 100 * FROM INFORMATION_SCHEMA.TABLES\" on sqlserver2014a and sqlcluster using Windows credentials.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eTest-DbaNetworkLatency -SqlInstance sqlserver2014a -SqlCredential $cred\nTests the execution results return of \"SELECT TOP 100 * FROM INFORMATION_SCHEMA.TABLES\" on sqlserver2014a using SQL credentials.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eTest-DbaNetworkLatency -SqlInstance sqlserver2014a, sqlcluster, sqlserver -Query \"select top 10 * from otherdb.dbo.table\" -Count 10\nTests the execution results return of \"select top 10 * from otherdb.dbo.table\" 10 times on sqlserver2014a, sqlcluster, and sqlserver using Windows credentials.", "Params": [ [ "SqlInstance", @@ -40787,21 +42667,22 @@ "False" ] ], - "Alias": "Test-SqlNetworkLatency", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Tests how long a query takes to return from SQL Server", - "Name": "Test-DbaNetworkLatency", - "Links": "https://dbatools.io/Test-DbaNetworkLatency", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eTest-DbaNetworkLatency -SqlInstance sqlserver2014a, sqlcluster\nTests the round trip return of \"SELECT TOP 100 * FROM INFORMATION_SCHEMA.TABLES\" on sqlserver2014a and sqlcluster using Windows credentials.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eTest-DbaNetworkLatency -SqlInstance sqlserver2014a -SqlCredential $cred\nTests the execution results return of \"SELECT TOP 100 * FROM INFORMATION_SCHEMA.TABLES\" on sqlserver2014a using SQL credentials.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eTest-DbaNetworkLatency -SqlInstance sqlserver2014a, sqlcluster, sqlserver -Query \"select top 10 * from otherdb.dbo.table\" -Count 10\nTests the execution results return of \"select top 10 * from otherdb.dbo.table\" 10 times on sqlserver2014a, sqlcluster, and sqlserver using Windows credentials.", "Syntax": "Test-DbaNetworkLatency [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [[-Query] \u003cString\u003e] [[-Count] \u003cInt32\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Test-DbaOptimizeForAdHoc", + "Name": "Test-DbaOptimizeForAdHoc", "Description": "When this option is set, plan cache size is further reduced for single-use ad hoc OLTP workload.\n\nMore info: https://msdn.microsoft.com/en-us/library/cc645587.aspx\nhttp://www.sqlservercentral.com/blogs/glennberry/2011/02/25/some-suggested-sql-server-2008-r2-instance-configuration-settings/\n\nThese are just general recommendations for SQL Server and are a good starting point for setting the \"optimize for ad-hoc workloads\" option.", "Tags": [ "Configure", "SPConfigure" ], + "Synopsis": "Displays information relating to SQL Server Optimize for AdHoc Workloads setting. Works on SQL Server 2008-2016.", + "Alias": "", + "Author": "Brandon Abshire, netnerds.net", + "CommandName": "Test-DbaOptimizeForAdHoc", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Test-DbaOptimizeForAdHoc", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eTest-DbaOptimizeForAdHoc -SqlInstance sql2008, sqlserver2012\nValidates whether Optimize for AdHoc Workloads setting is enabled for servers sql2008 and sqlserver2012.", "Params": [ [ "SqlInstance", @@ -40828,21 +42709,22 @@ "False" ] ], - "Alias": "", - "Author": "Brandon Abshire, netnerds.net", - "Synopsis": "Displays information relating to SQL Server Optimize for AdHoc Workloads setting. Works on SQL Server 2008-2016.", - "Name": "Test-DbaOptimizeForAdHoc", - "Links": "https://dbatools.io/Test-DbaOptimizeForAdHoc", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eTest-DbaOptimizeForAdHoc -SqlInstance sql2008, sqlserver2012\nValidates whether Optimize for AdHoc Workloads setting is enabled for servers sql2008 and sqlserver2012.", "Syntax": "Test-DbaOptimizeForAdHoc [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [-SqlCredential \u003cPSCredential\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Test-DbaPath", + "Name": "Test-DbaPath", "Description": "Uses master.dbo.xp_fileexist to determine if a file or directory exists.", "Tags": [ "Path", "ServiceAccount" ], + "Synopsis": "Tests if file or directory exists from the perspective of the SQL Server service account.", + "Alias": "Test-DbaSqlPath,Test-SqlPath", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Test-DbaPath", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Test-DbaPath", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eTest-DbaPath -SqlInstance sqlcluster -Path L:\\MSAS12.MSSQLSERVER\\OLAP\nTests whether the service account running the \"sqlcluster\" SQL Server instance can access L:\\MSAS12.MSSQLSERVER\\OLAP. Logs into sqlcluster using Windows credentials.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003e$credential = Get-Credential\nPS C:\\\u003e Test-DbaPath -SqlInstance sqlcluster -SqlCredential $credential -Path L:\\MSAS12.MSSQLSERVER\\OLAP\nTests whether the service account running the \"sqlcluster\" SQL Server instance can access L:\\MSAS12.MSSQLSERVER\\OLAP. Logs into sqlcluster using SQL authentication.", "Params": [ [ "SqlInstance", @@ -40877,18 +42759,19 @@ "False" ] ], - "Alias": "Test-DbaSqlPath,Test-SqlPath", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Tests if file or directory exists from the perspective of the SQL Server service account.", - "Name": "Test-DbaPath", - "Links": "https://dbatools.io/Test-DbaPath", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eTest-DbaPath -SqlInstance sqlcluster -Path L:\\MSAS12.MSSQLSERVER\\OLAP\nTests whether the service account running the \"sqlcluster\" SQL Server instance can access L:\\MSAS12.MSSQLSERVER\\OLAP. Logs into sqlcluster using Windows credentials.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003e$credential = Get-Credential\nPS C:\\\u003e Test-DbaPath -SqlInstance sqlcluster -SqlCredential $credential -Path L:\\MSAS12.MSSQLSERVER\\OLAP\nTests whether the service account running the \"sqlcluster\" SQL Server instance can access L:\\MSAS12.MSSQLSERVER\\OLAP. Logs into sqlcluster using SQL authentication.", "Syntax": "Test-DbaPath [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [-Path] \u003cObject\u003e [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Test-DbaPowerPlan", + "Name": "Test-DbaPowerPlan", "Description": "Checks the Power Plan settings on a computer against best practices recommendations. If one server is checked, only $true or $false is returned. If multiple servers are checked, each server\u0027s name and an isBestPractice field are returned.\n\nReferences:\nhttps://support.microsoft.com/en-us/kb/2207548\nhttp://www.sqlskills.com/blogs/glenn/windows-power-plan-effects-on-newer-intel-processors/", "Tags": "PowerPlan", + "Synopsis": "Checks the Power Plan settings for compliance with best practices, which recommend High Performance for SQL Server.", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Test-DbaPowerPlan", + "Availability": "Windows only", + "Links": "https://dbatools.io/Test-DbaPowerPlan", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eTest-DbaPowerPlan -ComputerName sqlserver2014a\nChecks the Power Plan settings for sqlserver2014a and indicates whether or not it complies with best practices.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eTest-DbaPowerPlan -ComputerName sqlserver2014a -CustomPowerPlan \u0027Maximum Performance\u0027\nChecks the Power Plan settings for sqlserver2014a and indicates whether or not it is set to the custom plan \"Maximum Performance\".", "Params": [ [ "ComputerName", @@ -40939,18 +42822,19 @@ "False" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Checks the Power Plan settings for compliance with best practices, which recommend High Performance for SQL Server.", - "Name": "Test-DbaPowerPlan", - "Links": "https://dbatools.io/Test-DbaPowerPlan", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eTest-DbaPowerPlan -ComputerName sqlserver2014a\nChecks the Power Plan settings for sqlserver2014a and indicates whether or not it complies with best practices.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eTest-DbaPowerPlan -ComputerName sqlserver2014a -CustomPowerPlan \u0027Maximum Performance\u0027\nChecks the Power Plan settings for sqlserver2014a and indicates whether or not it is set to the custom plan \"Maximum Performance\".", "Syntax": "Test-DbaPowerPlan [[-ComputerName] \u003cDbaInstanceParameter[]\u003e] [[-Credential] \u003cPSCredential\u003e] [[-CustomPowerPlan] \u003cString\u003e] [[-InputObject] \u003cPSObject\u003e] [-Detailed] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Test-DbaRepLatency", + "Name": "Test-DbaRepLatency", "Description": "Creates tracer tokens to determine latency between the publisher/distributor and the distributor/subscriber\nfor all transactional publications for a server, database, or publication.", "Tags": "Replication", + "Synopsis": "Displays replication latency for all transactional publications for a server or database.", + "Alias": "", + "Author": "Colin Douglas", + "CommandName": "Test-DbaRepLatency", + "Availability": "Windows only", + "Links": "https://dbatools.io/Test-DbaRepLatency", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eTest-DbaRepLatency -SqlInstance sql2008, sqlserver2012\nReturn replication latency for all transactional publications for servers sql2008 and sqlserver2012.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eTest-DbaRepLatency -SqlInstance sql2008 -Database TestDB\nReturn replication latency for all transactional publications on server sql2008 for only the TestDB database\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eTest-DbaRepLatency -SqlInstance sql2008 -Database TestDB -PublicationName TestDB_Pub\nReturn replication latency for the TestDB_Pub publication for the TestDB database located on the server sql2008.", "Params": [ [ "SqlInstance", @@ -41017,21 +42901,22 @@ "False" ] ], - "Alias": "", - "Author": "Colin Douglas", - "Synopsis": "Displays replication latency for all transactional publications for a server or database.", - "Name": "Test-DbaRepLatency", - "Links": "https://dbatools.io/Test-DbaRepLatency", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eTest-DbaRepLatency -SqlInstance sql2008, sqlserver2012\nReturn replication latency for all transactional publications for servers sql2008 and sqlserver2012.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eTest-DbaRepLatency -SqlInstance sql2008 -Database TestDB\nReturn replication latency for all transactional publications on server sql2008 for only the TestDB database\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eTest-DbaRepLatency -SqlInstance sql2008 -Database TestDB -PublicationName TestDB_Pub\nReturn replication latency for the TestDB_Pub publication for the TestDB database located on the server sql2008.", "Syntax": "Test-DbaRepLatency [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-Database] \u003cObject[]\u003e] [[-SqlCredential] \u003cPSCredential\u003e] [[-PublicationName] \u003cObject[]\u003e] [[-TimeToLive] \u003cInt32\u003e] [-RetainToken] [-DisplayTokenHistory] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Test-DbaServerName", + "Name": "Test-DbaServerName", "Description": "When a SQL Server\u0027s host OS is renamed, the SQL Server should be as well. This helps with Availability Groups and Kerberos.\n\nThis command helps determine if your OS and SQL Server names match, and whether a rename is required.\n\nIt then checks conditions that would prevent a rename, such as database mirroring and replication.\n\nhttps://www.mssqltips.com/sqlservertip/2525/steps-to-change-the-server-name-for-a-sql-server-machine/", "Tags": [ "SPN", "ServerName" ], + "Synopsis": "Tests to see if it\u0027s possible to easily rename the server at the SQL Server instance level, or if it even needs to be changed.", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Test-DbaServerName", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Test-DbaServerName", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eTest-DbaServerName -SqlInstance sqlserver2014a\nReturns ServerInstanceName, SqlServerName, IsEqual and RenameRequired for sqlserver2014a.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eTest-DbaServerName -SqlInstance sqlserver2014a, sql2016\nReturns ServerInstanceName, SqlServerName, IsEqual and RenameRequired for sqlserver2014a and sql2016.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eTest-DbaServerName -SqlInstance sqlserver2014a, sql2016 -ExcludeSsrs\nReturns ServerInstanceName, SqlServerName, IsEqual and RenameRequired for sqlserver2014a and sql2016, but skips validating if SSRS is installed on both instances.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eTest-DbaServerName -SqlInstance sqlserver2014a, sql2016 | Select-Object *\nReturns ServerInstanceName, SqlServerName, IsEqual and RenameRequired for sqlserver2014a and sql2016.\r\nIf a Rename is required, it will also show Updatable, and Reasons if the server name is not updatable.", "Params": [ [ "SqlInstance", @@ -41074,18 +42959,19 @@ "False" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Tests to see if it\u0027s possible to easily rename the server at the SQL Server instance level, or if it even needs to be changed.", - "Name": "Test-DbaServerName", - "Links": "https://dbatools.io/Test-DbaServerName", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eTest-DbaServerName -SqlInstance sqlserver2014a\nReturns ServerInstanceName, SqlServerName, IsEqual and RenameRequired for sqlserver2014a.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eTest-DbaServerName -SqlInstance sqlserver2014a, sql2016\nReturns ServerInstanceName, SqlServerName, IsEqual and RenameRequired for sqlserver2014a and sql2016.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eTest-DbaServerName -SqlInstance sqlserver2014a, sql2016 -ExcludeSsrs\nReturns ServerInstanceName, SqlServerName, IsEqual and RenameRequired for sqlserver2014a and sql2016, but skips validating if SSRS is installed on both instances.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eTest-DbaServerName -SqlInstance sqlserver2014a, sql2016 | Select-Object *\nReturns ServerInstanceName, SqlServerName, IsEqual and RenameRequired for sqlserver2014a and sql2016.\r\nIf a Rename is required, it will also show Updatable, and Reasons if the server name is not updatable.", "Syntax": "Test-DbaServerName [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [-Detailed] [-ExcludeSsrs] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Test-DbaSpn", + "Name": "Test-DbaSpn", "Description": "This function is designed to take in a server name(s) and attempt to determine required SPNs. It was initially written to mimic the (previously) broken functionality of the Microsoft Kerberos Configuration manager and SQL Server 2016.\n\n- For any instances with TCP/IP enabled, the script will determine which port(s) the instances are listening on and generate the required SPNs.\n- For named instances NOT using dynamic ports, the script will generate a port-based SPN for those instances as well.\n- At a minimum, the script will test a base, port-less SPN for each instance discovered.\n\nOnce the required SPNs are generated, the script will connect to Active Directory and search for any of the SPNs (if any) that are already set. The function will return a custom object(s) that contains the server name checked, the instance name discovered, the account the service is running under, and what the \"required\" SPN should be. It will also return a boolean property indicating if the SPN is set in Active Directory or not.", "Tags": "SPN", + "Synopsis": "Test-DbaSpn will determine what SPNs *should* be set for a given server (and any instances of SQL running on it) and return\nwhether the SPNs are set or not.", + "Alias": "", + "Author": "Drew Furgiuele (@pittfurg), http://www.port1433.com | niphlod", + "CommandName": "Test-DbaSpn", + "Availability": "Windows only", + "Links": "https://dbatools.io/Test-DbaSpn", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eTest-DbaSpn -ComputerName SQLSERVERA -Credential ad\\sqldba\nConnects to a computer (SQLSERVERA) and queries WMI for all SQL instances and return \"required\" SPNs. It will then take each SPN it generates\r\nand query Active Directory to make sure the SPNs are set.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eTest-DbaSpn -ComputerName SQLSERVERA,SQLSERVERB -Credential ad\\sqldba\nConnects to multiple computers (SQLSERVERA, SQLSERVERB) and queries WMI for all SQL instances and return \"required\" SPNs.\r\nIt will then take each SPN it generates and query Active Directory to make sure the SPNs are set.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eTest-DbaSpn -ComputerName SQLSERVERC -Credential ad\\sqldba\nConnects to a computer (SQLSERVERC) on a specified and queries WMI for all SQL instances and return \"required\" SPNs.\r\nIt will then take each SPN it generates and query Active Directory to make sure the SPNs are set. Note that the credential you pass must have be a valid login with appropriate rights on the domain", "Params": [ [ "ComputerName", @@ -41112,21 +42998,22 @@ "False" ] ], - "Alias": "", - "Author": "Drew Furgiuele (@pittfurg), http://www.port1433.com | niphlod", - "Synopsis": "Test-DbaSpn will determine what SPNs *should* be set for a given server (and any instances of SQL running on it) and return\nwhether the SPNs are set or not.", - "Name": "Test-DbaSpn", - "Links": "https://dbatools.io/Test-DbaSpn", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eTest-DbaSpn -ComputerName SQLSERVERA -Credential ad\\sqldba\nConnects to a computer (SQLSERVERA) and queries WMI for all SQL instances and return \"required\" SPNs. It will then take each SPN it generates\r\nand query Active Directory to make sure the SPNs are set.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eTest-DbaSpn -ComputerName SQLSERVERA,SQLSERVERB -Credential ad\\sqldba\nConnects to multiple computers (SQLSERVERA, SQLSERVERB) and queries WMI for all SQL instances and return \"required\" SPNs.\r\nIt will then take each SPN it generates and query Active Directory to make sure the SPNs are set.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eTest-DbaSpn -ComputerName SQLSERVERC -Credential ad\\sqldba\nConnects to a computer (SQLSERVERC) on a specified and queries WMI for all SQL instances and return \"required\" SPNs.\r\nIt will then take each SPN it generates and query Active Directory to make sure the SPNs are set. Note that the credential you pass must have be a valid login with appropriate rights on the domain", "Syntax": "Test-DbaSpn [-ComputerName] \u003cDbaInstanceParameter[]\u003e [[-Credential] \u003cPSCredential\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Test-DbaTempdbConfig", + "Name": "Test-DbaTempdbConfig", "Description": "Evaluates tempdb against a set of rules to match best practices. The rules are:\n\n* TF 1118 enabled - Is Trace Flag 1118 enabled (See KB328551).\n* File Count - Does the count of data files in tempdb match the number of logical cores, up to 8?\n* File Growth - Are any files set to have percentage growth? Best practice is all files have an explicit growth value.\n* File Location - Is tempdb located on the C:\\? Best practice says to locate it elsewhere.\n* File MaxSize Set (optional) - Do any files have a max size value? Max size could cause tempdb problems if it isn\u0027t allowed to grow.\n* Data File Size Equal - Are the sizes of all the tempdb data files the same?\n\nOther rules can be added at a future date.", "Tags": [ "tempdb", "configuration" ], + "Synopsis": "Evaluates tempdb against several rules to match best practices.", + "Alias": "Test-DbaTempDbConfiguration,Test-SqlTempDbConfiguration", + "Author": "Michael Fal (@Mike_Fal), http://mikefal.net", + "CommandName": "Test-DbaTempdbConfig", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Test-DbaTempdbConfig", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eTest-DbaTempdbConfig -SqlInstance localhost\nChecks tempdb on the localhost machine.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eTest-DbaTempdbConfig -SqlInstance localhost | Select-Object *\nChecks tempdb on the localhost machine. All rest results are shown.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaCmsRegServer -SqlInstance sqlserver2014a | Test-DbaTempdbConfig | Select-Object * | Out-GridView\nChecks tempdb configuration for a group of servers from SQL Server Central Management Server (CMS). Output includes all columns. Send output to GridView.", "Params": [ [ "SqlInstance", @@ -41161,21 +43048,22 @@ "False" ] ], - "Alias": "Test-DbaTempDbConfiguration,Test-SqlTempDbConfiguration", - "Author": "Michael Fal (@Mike_Fal), http://mikefal.net", - "Synopsis": "Evaluates tempdb against several rules to match best practices.", - "Name": "Test-DbaTempdbConfig", - "Links": "https://dbatools.io/Test-DbaTempdbConfig", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eTest-DbaTempdbConfig -SqlInstance localhost\nChecks tempdb on the localhost machine.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eTest-DbaTempdbConfig -SqlInstance localhost | Select-Object *\nChecks tempdb on the localhost machine. All rest results are shown.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaCmsRegServer -SqlInstance sqlserver2014a | Test-DbaTempdbConfig | Select-Object * | Out-GridView\nChecks tempdb configuration for a group of servers from SQL Server Central Management Server (CMS). Output includes all columns. Send output to GridView.", "Syntax": "Test-DbaTempdbConfig [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [-Detailed] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Test-DbaWindowsLogin", + "Name": "Test-DbaWindowsLogin", "Description": "The purpose of this function is to find SQL Server logins that are used by active directory users that are either disabled or removed from the domain. It allows you to keep your logins accurate and up to date by removing accounts that are no longer needed.", "Tags": [ "Login", "Security" ], + "Synopsis": "Test-DbaWindowsLogin finds any logins on SQL instance that are AD logins with either disabled AD user accounts or ones that no longer exist", + "Alias": "Test-DbaValidLogin", + "Author": "Stephen Bennett, https://sqlnotesfromtheunderground.wordpress.com/ | Chrissy LeMaire (@cl)", + "CommandName": "Test-DbaWindowsLogin", + "Availability": "Windows only", + "Links": "https://dbatools.io/Test-DbaWindowsLogin", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eTest-DbaWindowsLogin -SqlInstance Dev01\nTests all logins in the current Active Directory domain that are either disabled or do not exist on the SQL Server instance Dev01\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eTest-DbaWindowsLogin -SqlInstance Dev01 -FilterBy GroupsOnly | Select-Object -Property *\nTests all Active Directory groups that have logins on Dev01, and shows all information for those logins\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eTest-DbaWindowsLogin -SqlInstance Dev01 -IgnoreDomains testdomain\nTests all Domain logins excluding any that are from the testdomain", "Params": [ [ "SqlInstance", @@ -41242,18 +43130,19 @@ "False" ] ], - "Alias": "Test-DbaValidLogin", - "Author": "Stephen Bennett, https://sqlnotesfromtheunderground.wordpress.com/ | Chrissy LeMaire (@cl)", - "Synopsis": "Test-DbaWindowsLogin finds any logins on SQL instance that are AD logins with either disabled AD user accounts or ones that no longer exist", - "Name": "Test-DbaWindowsLogin", - "Links": "https://dbatools.io/Test-DbaWindowsLogin", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eTest-DbaWindowsLogin -SqlInstance Dev01\nTests all logins in the current Active Directory domain that are either disabled or do not exist on the SQL Server instance Dev01\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eTest-DbaWindowsLogin -SqlInstance Dev01 -FilterBy GroupsOnly | Select-Object -Property *\nTests all Active Directory groups that have logins on Dev01, and shows all information for those logins\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eTest-DbaWindowsLogin -SqlInstance Dev01 -IgnoreDomains testdomain\nTests all Domain logins excluding any that are from the testdomain", "Syntax": "Test-DbaWindowsLogin [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [-SqlCredential \u003cPSCredential\u003e] [-Login \u003cObject[]\u003e] [-ExcludeLogin \u003cObject[]\u003e] [-FilterBy \u003cString\u003e] [-IgnoreDomains \u003cString[]\u003e] [-Detailed] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Uninstall-DbaSqlWatch", + "Name": "Uninstall-DbaSqlWatch", "Description": "Deletes all user objects, agent jobs, and historical data associated with SqlWatch.", "Tags": "SqlWatch", + "Synopsis": "Uninstalls SqlWatch.", + "Alias": "", + "Author": "Ken K (github.com/koglerk)", + "CommandName": "Uninstall-DbaSqlWatch", + "Availability": "Windows only", + "Links": "https://dbatools.io/Uninstall-DbaSqlWatch", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eUninstall-DbaSqlWatch -SqlInstance server1\nDeletes all user objects, agent jobs, and historical data associated with SqlWatch from the master database.", "Params": [ [ "SqlInstance", @@ -41304,35 +43193,36 @@ "" ] ], - "Alias": "", - "Author": "Ken K (github.com/koglerk)", - "Synopsis": "Uninstalls SqlWatch.", - "Name": "Uninstall-DbaSqlWatch", - "Links": "https://dbatools.io/Uninstall-DbaSqlWatch", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eUninstall-DbaSqlWatch -SqlInstance server1\nDeletes all user objects, agent jobs, and historical data associated with SqlWatch from the master database.", "Syntax": "Uninstall-DbaSqlWatch [-SqlInstance] \u003cDbaInstanceParameter[]\u003e [[-SqlCredential] \u003cPSCredential\u003e] [[-Database] \u003cString\u003e] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Uninstall-DbaWatchUpdate", + "Name": "Uninstall-DbaWatchUpdate", "Description": "Removes the scheduled task created for Watch-DbaUpdate by Install-DbaWatchUpdate so that notifications no longer pop up.", "Tags": [ "JustForFun", "Module" ], - "Params": [ - - ], + "Synopsis": "Removes the scheduled task created for Watch-DbaUpdate by Install-DbaWatchUpdate so that notifications no longer pop up.", "Alias": "", "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Removes the scheduled task created for Watch-DbaUpdate by Install-DbaWatchUpdate so that notifications no longer pop up.", - "Name": "Uninstall-DbaWatchUpdate", + "CommandName": "Uninstall-DbaWatchUpdate", + "Availability": "Windows only", "Links": "https://dbatools.io/Uninstall-DbaWatchUpdate", "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eUninstall-DbaWatchUpdate\nRemoves the scheduled task created by Install-DbaWatchUpdate.", + "Params": [ + + ], "Syntax": "Uninstall-DbaWatchUpdate [\u003cCommonParameters\u003e]" }, { - "CommandName": "Unregister-DbatoolsConfig", + "Name": "Unregister-DbatoolsConfig", "Description": "Removes registered configuration settings.\nThis function can be used to remove settings that have been persisted for either user or computer.\n\nNote: This command has no effect on configuration setings currently in memory.", + "Synopsis": "Removes registered configuration settings.", + "Alias": "", + "CommandName": "Unregister-DbatoolsConfig", + "Availability": "Windows, Linux, macOS", + "Links": null, + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbatoolsConfig | Unregister-DbatoolsConfig\nCompletely removes all registered configurations currently loaded in memory.\r\nIn most cases, this will mean removing all registered configurations.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eUnregister-DbatoolsConfig -Scope SystemDefault -FullName \u0027MyModule.Path.DefaultExport\u0027\nUnregisters the setting \u0027MyModule.Path.DefaultExport\u0027 from the list of computer-wide defaults.\r\nNote: Changing system wide settings requires running the console with elevation.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eUnregister-DbatoolsConfig -Module MyModule\nUnregisters all configuration settings for the module MyModule.", "Params": [ [ "ConfigurationItem", @@ -41375,15 +43265,10 @@ "UserDefault" ] ], - "Alias": "", - "Synopsis": "Removes registered configuration settings.", - "Name": "Unregister-DbatoolsConfig", - "Links": null, - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eGet-DbatoolsConfig | Unregister-DbatoolsConfig\nCompletely removes all registered configurations currently loaded in memory.\r\nIn most cases, this will mean removing all registered configurations.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eUnregister-DbatoolsConfig -Scope SystemDefault -FullName \u0027MyModule.Path.DefaultExport\u0027\nUnregisters the setting \u0027MyModule.Path.DefaultExport\u0027 from the list of computer-wide defaults.\r\nNote: Changing system wide settings requires running the console with elevation.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eUnregister-DbatoolsConfig -Module MyModule\nUnregisters all configuration settings for the module MyModule.", "Syntax": "Unregister-DbatoolsConfig [-ConfigurationItem \u003cConfig[]\u003e] [-FullName \u003cString[]\u003e] [-Scope {UserDefault | UserMandatory | SystemDefault | SystemMandatory | FileUserLocal | FileUserShared | FileSystem}] [\u003cCommonParameters\u003e]\nUnregister-DbatoolsConfig -Module \u003cString\u003e [-Name \u003cString\u003e] [-Scope {UserDefault | UserMandatory | SystemDefault | SystemMandatory | FileUserLocal | FileUserShared | FileSystem}] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Update-DbaInstance", + "Name": "Update-DbaInstance", "Description": "Starts and automated process of updating SQL Server installation to a specific version defined in the parameters.\nThe command will:\n\n* Search for SQL Server installations in a remote registry\n* Check if current settings are applicable to the current SQL Server versions\n* Search for a KB executable in a folder specified in -Path\n* Establish a PSRemote connection to the target machine if necessary\n* Extract KB to a temporary folder in a current user\u0027s profile\n* Run the installation from the temporary folder updating all instances on the computer at once\n* Remove temporary files\n* Restart the computer (if -Restart is specified)\n* Repeat for each consequent KB and computer\n\nThe impact of this function is set to High, if you don\u0027t want to receive interactive prompts, set -Confirm to $false.\nCredentials are a required parameter for remote machines. Without specifying -Credential, the installation will fail due to lack of permissions.\n\nCredSSP is a recommended transport for running the updates remotely. Update-DbaInstance will attempt to reconfigure\nlocal and remote hosts to support CredSSP, which is why it is desirable to run this command in an elevated console at all times.\nCVE-2018-0886 security update is required for both local and remote hosts. If CredSSP connections are failing, make sure to\napply recent security updates prior to doing anything else.\n\nAlways backup databases and configurations prior to upgrade.", "Tags": [ "Install", @@ -41392,10 +43277,17 @@ "CU", "Instance" ], + "Synopsis": "Invokes installation of SQL Server Service Packs and Cumulative Updates on local and remote servers.", + "Alias": "", + "Author": "Kirill Kravtsov (@nvarscar) https://nvarscar.wordpress.com/", + "CommandName": "Update-DbaInstance", + "Availability": "Windows only", + "Links": null, + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eUpdate-DbaInstance -ComputerName SQL1 -Version SP3 -Path \\\\network\\share\nUpdates all applicable SQL Server installations on SQL1 to SP3.\r\nBinary files for the update will be searched among all files and folders recursively in \\\\network\\share.\r\nPrompts for confirmation before the update.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eUpdate-DbaInstance -ComputerName SQL1, SQL2 -Restart -Path \\\\network\\share -Confirm:$false\nUpdates all applicable SQL Server installations on SQL1 and SQL2 with the most recent patch.\r\nIt will install latest ServicePack, restart the computers, install latest Cumulative Update, and finally restart the computer once again.\r\nBinary files for the update will be searched among all files and folders recursively in \\\\network\\share.\r\nDoes not prompt for confirmation.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eUpdate-DbaInstance -ComputerName SQL1 -Version 2012 -Type ServicePack -Path \\\\network\\share\nUpdates SQL Server 2012 on SQL1 with the most recent ServicePack found in your patch repository.\r\nBinary files for the update will be searched among all files and folders recursively in \\\\network\\share.\r\nPrompts for confirmation before the update.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eUpdate-DbaInstance -ComputerName SQL1 -KB 123456 -Restart -Path \\\\network\\share -Confirm:$false\nInstalls KB 123456 on SQL1 and restarts the computer.\r\nBinary files for the update will be searched among all files and folders recursively in \\\\network\\share.\r\nDoes not prompt for confirmation.\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003eUpdate-DbaInstance -ComputerName Server1 -Version SQL2012SP3, SQL2016SP2CU3 -Path \\\\network\\share -Restart -Confirm:$false\nUpdates SQL 2012 to SP3 and SQL 2016 to SP2CU3 on Server1. Each update will be followed by a restart.\r\nBinary files for the update will be searched among all files and folders recursively in \\\\network\\share.\r\nDoes not prompt for confirmation.", "Params": [ [ "ComputerName", - "Target computer with SQL instance or instsances.", + "Target computer with SQL instance or instances.", "cn,host,Server", false, "true (ByValue)", @@ -41403,7 +43295,7 @@ ], [ "Credential", - "Windows Credential with permission to log on to the remote server. Must be specified for any remote connection.", + "Windows Credential with permission to log on to the remote server.\r\nMust be specified for any remote connection if update Repository is located on a network folder.", "", false, "false", @@ -41411,7 +43303,7 @@ ], [ "Version", - "A target version of the installation you want to reach. If not specified, a latest available version would be used by default.\r\nCan be defined using the following general pattern: \u003cMajorVersion\u003e\u003cSPX\u003e\u003cCUX\u003e.\r\nAny part of the pattern can be ommitted if needed:\r\n2008R2SP1 - will update SQL 2008R2 to SP1\r\n2016CU3 - will update SQL 2016 to CU3 of current Service Pack installed\r\nSP0CU3 - will update all existing SQL Server versions to RTM CU3 without installing any service packs\r\nSP1CU7 - will update all existing SQL Server versions to SP1 and then (after restart if -Restart is specified) to SP1CU7\r\nCU7 - will update all existing SQL Server versions to CU7 of current Service Pack installed", + "A target version of the installation you want to reach. If not specified, a latest available version would be used by default.\r\nCan be defined using the following general pattern: \u003cMajorVersion\u003e\u003cSPX\u003e\u003cCUX\u003e.\r\nAny part of the pattern can be omitted if needed:\r\n2008R2SP1 - will update SQL 2008R2 to SP1\r\n2016CU3 - will update SQL 2016 to CU3 of current Service Pack installed\r\nSP0CU3 - will update all existing SQL Server versions to RTM CU3 without installing any service packs\r\nSP1CU7 - will update all existing SQL Server versions to SP1 and then (after restart if -Restart is specified) to SP1CU7\r\nCU7 - will update all existing SQL Server versions to CU7 of current Service Pack installed", "", false, "false", @@ -41447,7 +43339,7 @@ "", false, "false", - "" + "(Get-DbatoolsConfigValue -Name \u0027Path.SQLServerUpdates\u0027)" ], [ "Restart", @@ -41465,6 +43357,22 @@ "false", "False" ], + [ + "Throttle", + "Maximum number of computers updated in parallel. Once reached, the update operations will queue up.\r\nDefault: 50", + "", + false, + "false", + "50" + ], + [ + "Authentication", + "Chooses an authentication protocol for remote connections.\r\nIf the protocol fails to establish a connection\nDefaults:\r\n* CredSSP when -Credential is specified - due to the fact that repository Path is usually a network share and credentials need to be passed to the remote host\r\n to avoid the double-hop issue.\r\n* Default when -Credential is not specified. Will likely fail if a network path is specified.", + "", + false, + "false", + "Credssp" + ], [ "EnableException", "By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message.\r\nThis avoids overwhelming you with \"sea of red\" exceptions, but is inconvenient because it basically disables advanced scripting.\r\nUsing this switch turns this \"nice by default\" feature off and enables you to catch exceptions with your own try/catch.", @@ -41490,16 +43398,10 @@ "" ] ], - "Alias": "", - "Author": "Kirill Kravtsov (@nvarscar) https://nvarscar.wordpress.com/", - "Synopsis": "Invokes installation of SQL Server Service Packs and Cumulative Updates on local and remote servers.", - "Name": "Update-DbaInstance", - "Links": null, - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eUpdate-DbaInstance -ComputerName SQL1 -Version SP3 -Path \\\\network\\share\nUpdates all applicable SQL Server installations on SQL1 to SP3.\r\nBinary files for the update will be searched among all files and folders recursively in \\\\network\\share.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eUpdate-DbaInstance -ComputerName SQL1, SQL2 -Restart -Path \\\\network\\share\nUpdates all applicable SQL Server installations on SQL1 and SQL2 with the most recent patch.\r\nIt will install latest ServicePack, restart the computers, install latest Cumulative Update, and finally restart the computer once again.\r\nBinary files for the update will be searched among all files and folders recursively in \\\\network\\share.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eUpdate-DbaInstance -ComputerName SQL1 -Version 2012 -Type ServicePack -Path \\\\network\\share\nUpdates SQL Server 2012 on SQL1 with the most recent ServicePack found in your patch repository.\r\nBinary files for the update will be searched among all files and folders recursively in \\\\network\\share.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eUpdate-DbaInstance -ComputerName SQL1 -KB 123456 -Restart -Path \\\\network\\share\nInstalls KB 123456 on SQL1 and restarts the computer.\r\nBinary files for the update will be searched among all files and folders recursively in \\\\network\\share.", - "Syntax": "Update-DbaInstance [[-ComputerName] \u003cDbaInstanceParameter[]\u003e] [-Credential \u003cPSCredential\u003e] [-Version \u003cString[]\u003e] [-Type \u003cString[]\u003e] [-InstanceName \u003cString\u003e] [-Path \u003cString[]\u003e] [-Restart] [-Continue] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]\nUpdate-DbaInstance [[-ComputerName] \u003cDbaInstanceParameter[]\u003e] [-Credential \u003cPSCredential\u003e] -KB \u003cString[]\u003e [-InstanceName \u003cString\u003e] [-Path \u003cString[]\u003e] [-Restart] [-Continue] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" + "Syntax": "Update-DbaInstance [[-ComputerName] \u003cDbaInstanceParameter[]\u003e] [-Credential \u003cPSCredential\u003e] [-Version \u003cString[]\u003e] [-Type \u003cString[]\u003e] [-InstanceName \u003cString\u003e] [-Path \u003cString[]\u003e] [-Restart] [-Continue] [-Throttle \u003cInt32\u003e] [-Authentication \u003cString\u003e] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]\nUpdate-DbaInstance [[-ComputerName] \u003cDbaInstanceParameter[]\u003e] [-Credential \u003cPSCredential\u003e] -KB \u003cString[]\u003e [-InstanceName \u003cString\u003e] [-Path \u003cString[]\u003e] [-Restart] [-Continue] [-Throttle \u003cInt32\u003e] [-Authentication \u003cString\u003e] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Update-DbaServiceAccount", + "Name": "Update-DbaServiceAccount", "Description": "Reconfigure the service account or update the password of the specified SQL Server service. The service will be restarted in the event of changing the account.", "Tags": [ "Service", @@ -41507,6 +43409,13 @@ "Instance", "Connect" ], + "Synopsis": "Changes service account (or just its password) of the SQL Server service.", + "Alias": "Update-DbaSqlServiceAccount", + "Author": "Kirill Kravtsov (@nvarscar)", + "CommandName": "Update-DbaServiceAccount", + "Availability": "Windows only", + "Links": null, + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003e$SecurePassword = ConvertTo-SecureString \u0027Qwerty1234\u0027 -AsPlainText -Force\nUpdate-DbaServiceAccount -ComputerName sql1 -ServiceName \u0027MSSQL$MYINSTANCE\u0027 -SecurePassword $SecurePassword\nChanges the current service account\u0027s password of the service MSSQL$MYINSTANCE to \u0027Qwerty1234\u0027\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003e$cred = Get-Credential\nPS C:\\\u003e Get-DbaService sql1 -Type Engine,Agent -Instance MYINSTANCE | Update-DbaServiceAccount -ServiceCredential $cred\nRequests credentials from the user and configures them as a service account for the SQL Server engine and agent services of the instance sql1\\MYINSTANCE\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eUpdate-DbaServiceAccount -ComputerName sql1,sql2 -ServiceName \u0027MSSQLSERVER\u0027,\u0027SQLSERVERAGENT\u0027 -Username NETWORKSERVICE\nConfigures SQL Server engine and agent services on the machines sql1 and sql2 to run under Network Service system user.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaService sql1 -Type Engine -Instance MSSQLSERVER | Update-DbaServiceAccount -Username \u0027MyDomain\\sqluser1\u0027\nConfigures SQL Server engine service on the machine sql1 to run under MyDomain\\sqluser1. Will request user to input the account password.", "Params": [ [ "ComputerName", @@ -41597,18 +43506,19 @@ "" ] ], - "Alias": "Update-DbaSqlServiceAccount", - "Author": "Kirill Kravtsov (@nvarscar)", - "Synopsis": "Changes service account (or just its password) of the SQL Server service.", - "Name": "Update-DbaServiceAccount", - "Links": null, - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003e$SecurePassword = ConvertTo-SecureString \u0027Qwerty1234\u0027 -AsPlainText -Force\nUpdate-DbaServiceAccount -ComputerName sql1 -ServiceName \u0027MSSQL$MYINSTANCE\u0027 -SecurePassword $SecurePassword\nChanges the current service account\u0027s password of the service MSSQL$MYINSTANCE to \u0027Qwerty1234\u0027\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003e$cred = Get-Credential\nPS C:\\\u003e Get-DbaService sql1 -Type Engine,Agent -Instance MYINSTANCE | Update-DbaServiceAccount -ServiceCredential $cred\nRequests credentials from the user and configures them as a service account for the SQL Server engine and agent services of the instance sql1\\MYINSTANCE\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eUpdate-DbaServiceAccount -ComputerName sql1,sql2 -ServiceName \u0027MSSQLSERVER\u0027,\u0027SQLSERVERAGENT\u0027 -Username NETWORKSERVICE\nConfigures SQL Server engine and agent services on the machines sql1 and sql2 to run under Network Service system user.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003eGet-DbaService sql1 -Type Engine -Instance MSSQLSERVER | Update-DbaServiceAccount -Username \u0027MyDomain\\sqluser1\u0027\nConfigures SQL Server engine service on the machine sql1 to run under MyDomain\\sqluser1. Will request user to input the account password.", "Syntax": "Update-DbaServiceAccount [-ComputerName \u003cDbaInstanceParameter[]\u003e] [-Credential \u003cPSCredential\u003e] [-ServiceName] \u003cString[]\u003e [-Username \u003cString\u003e] [-ServiceCredential \u003cPSCredential\u003e] [-PreviousPassword \u003cSecureString\u003e] [-SecurePassword \u003cSecureString\u003e] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]\nUpdate-DbaServiceAccount [-Credential \u003cPSCredential\u003e] -InputObject \u003cObject[]\u003e [-Username \u003cString\u003e] [-ServiceCredential \u003cPSCredential\u003e] [-PreviousPassword \u003cSecureString\u003e] [-SecurePassword \u003cSecureString\u003e] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Update-Dbatools", + "Name": "Update-Dbatools", "Description": "Exported function. Updates dbatools. Deletes current copy and replaces it with freshest copy.", "Tags": "Module", + "Synopsis": "Exported function. Updates dbatools. Deletes current copy and replaces it with freshest copy.", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Update-Dbatools", + "Availability": "Windows only", + "Links": "https://dbatools.io/Update-DbaTools", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eUpdate-Dbatools\nUpdates dbatools. Deletes current copy and replaces it with freshest copy.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eUpdate-Dbatools -dev\nUpdates dbatools to the current development branch. Deletes current copy and replaces it with latest from github.", "Params": [ [ "Development", @@ -41643,18 +43553,19 @@ "" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Exported function. Updates dbatools. Deletes current copy and replaces it with freshest copy.", - "Name": "Update-Dbatools", - "Links": "https://dbatools.io/Update-DbaTools", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eUpdate-Dbatools\nUpdates dbatools. Deletes current copy and replaces it with freshest copy.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eUpdate-Dbatools -dev\nUpdates dbatools to the current development branch. Deletes current copy and replaces it with latest from github.", "Syntax": "Update-Dbatools [-Development] [-EnableException] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Watch-DbaDbLogin", + "Name": "Watch-DbaDbLogin", "Description": "Watch-DbaDbLogin uses SQL Server DMV\u0027s to track logins into a SQL Server table. This is helpful when you need to migrate a SQL Server and update connection strings, but have inadequate documentation on which servers/applications are logging into your SQL instance.\n\nRunning this script every 5 minutes for a week should give you a sufficient idea about database and login usage.", "Tags": "Login", + "Synopsis": "Tracks SQL Server logins: which host they came from, what database they\u0027re using, and what program is being used to log in.", + "Alias": "Watch-SqlDbLogin", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Watch-DbaDbLogin", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Watch-DbaDbLogin", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eWatch-DbaDbLogin -SqlInstance sqlserver -SqlCms SqlCms1\nA list of all database instances within the Central Management Server SqlCms1 is generated. Using this list, the script enumerates all the processes and gathers login information and saves it to the \r\ntable Dblogins in the DatabaseLogins database on SQL Server sqlserver.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eWatch-DbaDbLogin -SqlInstance sqlcluster -Database CentralAudit -ServersFromFile .\\sqlservers.txt\nA list of servers is gathered from the file sqlservers.txt in the current directory. Using this list, the script enumerates all the processes and gathers login information and saves it to the table \r\nDblogins in the CentralAudit database on SQL Server sqlcluster.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eWatch-DbaDbLogin -SqlInstance sqlserver -SqlCms SqlCms1 -SqlCredential $cred\nA list of servers is generated using database instance names within the SQL2014Clusters group on the Central Management Server SqlCms1. Using this list, the script enumerates all the processes and \r\ngathers login information and saves it to the table Dblogins in the DatabaseLogins database on sqlserver.", "Params": [ [ "SqlInstance", @@ -41713,40 +43624,42 @@ "False" ] ], - "Alias": "Watch-SqlDbLogin", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Tracks SQL Server logins: which host they came from, what database they\u0027re using, and what program is being used to log in.", - "Name": "Watch-DbaDbLogin", - "Links": "https://dbatools.io/Watch-DbaDbLogin", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eWatch-DbaDbLogin -SqlInstance sqlserver -SqlCms SqlCms1\nA list of all database instances within the Central Management Server SqlCms1 is generated. Using this list, the script enumerates all the processes and gathers login information and saves it to the \r\ntable Dblogins in the DatabaseLogins database on SQL Server sqlserver.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eWatch-DbaDbLogin -SqlInstance sqlcluster -Database CentralAudit -ServersFromFile .\\sqlservers.txt\nA list of servers is gathered from the file sqlservers.txt in the current directory. Using this list, the script enumerates all the processes and gathers login information and saves it to the table \r\nDblogins in the CentralAudit database on SQL Server sqlcluster.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eWatch-DbaDbLogin -SqlInstance sqlserver -SqlCms SqlCms1 -SqlCredential $cred\nA list of servers is generated using database instance names within the SQL2014Clusters group on the Central Management Server SqlCms1. Using this list, the script enumerates all the processes and \r\ngathers login information and saves it to the table Dblogins in the DatabaseLogins database on sqlserver.", "Syntax": "Watch-DbaDbLogin [-SqlInstance] \u003cDbaInstanceParameter\u003e [[-Database] \u003cObject\u003e] [[-Table] \u003cString\u003e] [[-SqlCredential] \u003cPSCredential\u003e] [[-SqlCms] \u003cString\u003e] [[-ServersFromFile] \u003cString\u003e] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Watch-DbaUpdate", + "Name": "Watch-DbaUpdate", "Description": "Just for fun - checks the PowerShell Gallery every 1 hour for updates to dbatools. Notifies once max per release.\n\nAnyone know how to make it clickable so that it opens an URL?", "Tags": [ "JustForFun", "Module" ], - "Params": [ - - ], + "Synopsis": "Just for fun - checks the PowerShell Gallery every 1 hour for updates to dbatools. Notifies once per release.", "Alias": "", "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Just for fun - checks the PowerShell Gallery every 1 hour for updates to dbatools. Notifies once per release.", - "Name": "Watch-DbaUpdate", + "CommandName": "Watch-DbaUpdate", + "Availability": "Windows only", "Links": "https://dbatools.io/Watch-DbaUpdate", "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eWatch-DbaUpdate\nWatches the gallery for updates to dbatools.", + "Params": [ + + ], "Syntax": "Watch-DbaUpdate [\u003cCommonParameters\u003e]" }, { - "CommandName": "Watch-DbaXESession", + "Name": "Watch-DbaXESession", "Description": "Watch live XEvent Data as it happens. This command runs until you stop the session, kill the PowerShell session, or Ctrl-C.\n\nThanks to Dave Mason (@BeginTry) for some straightforward code samples https://itsalljustelectrons.blogspot.be/2017/01/SQL-Server-Extended-Event-Handling-Via-Powershell.html", "Tags": [ "ExtendedEvent", "XE", "XEvent" ], + "Synopsis": "Watch live XEvent Data as it happens", + "Alias": "Watch-DbaXEventSession", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Watch-DbaXESession", + "Availability": "Windows only", + "Links": "https://dbatools.io/Watch-DbaXESession", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eWatch-DbaXESession -SqlInstance sql2017 -Session system_health\nShows events for the system_health session as it happens.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eWatch-DbaXESession -SqlInstance sql2017 -Session system_health | Export-Csv -NoTypeInformation -Path C:\\temp\\system_health.csv\nExports live events to CSV. Ctrl-C may not not cancel out of it - fastest way is to stop the session.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaXESession -SqlInstance sql2017 -Session system_health | Start-DbaXESession | Watch-DbaXESession | Export-Csv -NoTypeInformation -Path C:\\temp\\system_health.csv\nExports live events to CSV. Ctrl-C may not not cancel out of this. The fastest way to do so is to stop the session.", "Params": [ [ "SqlInstance", @@ -41797,21 +43710,22 @@ "False" ] ], - "Alias": "Watch-DbaXEventSession", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Watch live XEvent Data as it happens", - "Name": "Watch-DbaXESession", - "Links": "https://dbatools.io/Watch-DbaXESession", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003eWatch-DbaXESession -SqlInstance sql2017 -Session system_health\nShows events for the system_health session as it happens.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003eWatch-DbaXESession -SqlInstance sql2017 -Session system_health | Export-Csv -NoTypeInformation -Path C:\\temp\\system_health.csv\nExports live events to CSV. Ctrl-C may not not cancel out of it - fastest way is to stop the session.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003eGet-DbaXESession -SqlInstance sql2017 -Session system_health | Start-DbaXESession | Watch-DbaXESession | Export-Csv -NoTypeInformation -Path C:\\temp\\system_health.csv\nExports live events to CSV. Ctrl-C may not not cancel out of this. The fastest way to do so is to stop the session.", "Syntax": "Watch-DbaXESession [-SqlCredential \u003cPSCredential\u003e] [-Session \u003cString\u003e] [-Raw] [-EnableException] [\u003cCommonParameters\u003e]\nWatch-DbaXESession -SqlInstance \u003cDbaInstanceParameter\u003e [-SqlCredential \u003cPSCredential\u003e] [-Session \u003cString\u003e] [-Raw] [-EnableException] [\u003cCommonParameters\u003e]\nWatch-DbaXESession [-SqlCredential \u003cPSCredential\u003e] [-Session \u003cString\u003e] -InputObject \u003cSession\u003e [-Raw] [-EnableException] [\u003cCommonParameters\u003e]" }, { - "CommandName": "Write-DbaDataTable", + "Name": "Write-DbaDataTable", "Description": "Writes a .NET DataTable to a SQL Server table using SQL Bulk Copy.", "Tags": [ "DataTable", "Insert" ], + "Synopsis": "Writes data to a SQL Server Table.", + "Alias": "", + "Author": "Chrissy LeMaire (@cl), netnerds.net", + "CommandName": "Write-DbaDataTable", + "Availability": "Windows, Linux, macOS", + "Links": "https://dbatools.io/Write-DbaDataTable", + "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003e$DataTable = Import-Csv C:\\temp\\customers.csv\nPS C:\\\u003e Write-DbaDataTable -SqlInstance sql2014 -InputObject $DataTable -Table mydb.dbo.customers\nPerforms a bulk insert of all the data in customers.csv into database mydb, schema dbo, table customers. A progress bar will be shown as rows are inserted. If the destination table does not exist, \r\nthe import will be halted.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003e$tableName = \"MyTestData\"\nPS C:\\\u003e $query = \"SELECT name, create_date, owner_sid FROM sys.databases\"\r\nPS C:\\\u003e $dataset = Invoke-DbaQuery -SqlInstance \u0027localhost,1417\u0027 -SqlCredential $containerCred -Database master -Query $query\r\nPS C:\\\u003e $dataset | Select-Object name, create_date, @{L=\"owner_sid\";E={$_.\"owner_sid\"}} | Write-DbaDataTable -SqlInstance \u0027localhost,1417\u0027 -SqlCredential $containerCred -Database tempdb -Table \r\nmyTestData -Schema dbo -AutoCreateTable\nPulls data from a SQL Server instance and then performs a bulk insert of the dataset to a new, auto-generated table tempdb.dbo.MyTestData.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003e$DataTable = Import-Csv C:\\temp\\customers.csv\nPS C:\\\u003e Write-DbaDataTable -SqlInstance sql2014 -InputObject $DataTable -Table mydb.dbo.customers -AutoCreateTable -Confirm\nPerforms a bulk insert of all the data in customers.csv. If mydb.dbo.customers does not exist, it will be created with inefficient but forgiving DataTypes.\nPrompts for confirmation before a variety of steps.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003e$DataTable = Import-Csv C:\\temp\\customers.csv\nPS C:\\\u003e Write-DbaDataTable -SqlInstance sql2014 -InputObject $DataTable -Table mydb.dbo.customers -Truncate\nPerforms a bulk insert of all the data in customers.csv. Prior to importing into mydb.dbo.customers, the user is informed that the table will be truncated and asks for confirmation. The user is \r\nprompted again to perform the import.\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003e$DataTable = Import-Csv C:\\temp\\customers.csv\nPS C:\\\u003e Write-DbaDataTable -SqlInstance sql2014 -InputObject $DataTable -Database mydb -Table customers -KeepNulls\nPerforms a bulk insert of all the data in customers.csv into mydb.dbo.customers. Because Schema was not specified, dbo was used. NULL values in the destination table will be preserved.\n-------------------------- EXAMPLE 6 --------------------------\nPS C:\\\u003e$passwd = ConvertTo-SecureString \"P@ssw0rd\" -AsPlainText -Force\nPS C:\\\u003e $AzureCredential = New-Object System.Management.Automation.PSCredential(\"AzureAccount\"),$passwd)\r\nPS C:\\\u003e $DataTable = Import-Csv C:\\temp\\customers.csv\r\nPS C:\\\u003e Write-DbaDataTable -SqlInstance AzureDB.database.windows.net -InputObject $DataTable -Database mydb -Table customers -KeepNulls -Credential $AzureCredential -BulkCopyTimeOut 300\nThis performs the same operation as the previous example, but against a SQL Azure Database instance using the required credentials.\n-------------------------- EXAMPLE 7 --------------------------\nPS C:\\\u003e$process = Get-Process\nPS C:\\\u003e Write-DbaDataTable -InputObject $process -SqlInstance sql2014 -Table \"[[DbName]]].[Schema.With.Dots].[`\"[Process]]`\"]\" -AutoCreateTable\nCreates a table based on the Process object with over 60 columns, converted from PowerShell data types to SQL Server data types. After the table is created a bulk insert is performed to add process \r\ninformation into the table\r\nWrites the results of Get-Process to a table named: \"[Process]\" in schema named: Schema.With.Dots in database named: [DbName]\r\nThe Table name, Schema name and Database name must be wrapped in square brackets [ ]\r\nSpecial charcters like \" must be escaped by a ` charcter.\r\nIn addition any actual instance of the ] character must be escaped by being duplicated.\nThis is an example of the type conversion in action. All process properties are converted, including special types like TimeSpan. Script properties are resolved before the type conversion starts \r\nthanks to ConvertTo-DbaDataTable.", "Params": [ [ "SqlInstance", @@ -41941,14 +43855,6 @@ "false", "5000" ], - [ - "RegularUser", - "Deprecated - now all connections are regular user (don\u0027t require admin)", - "", - false, - "false", - "False" - ], [ "EnableException", "By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message.\r\nThis avoids overwhelming you with \"sea of red\" exceptions, but is inconvenient because it basically disables advanced scripting.\r\nUsing this switch turns this \"nice by default\" feature off and enables you to catch exceptions with your own try/catch.", @@ -41982,12 +43888,6 @@ "" ] ], - "Alias": "", - "Author": "Chrissy LeMaire (@cl), netnerds.net", - "Synopsis": "Writes data to a SQL Server Table.", - "Name": "Write-DbaDataTable", - "Links": "https://dbatools.io/Write-DbaDataTable", - "Examples": "-------------------------- EXAMPLE 1 --------------------------\nPS C:\\\u003e$DataTable = Import-Csv C:\\temp\\customers.csv\nPS C:\\\u003e Write-DbaDataTable -SqlInstance sql2014 -InputObject $DataTable -Table mydb.dbo.customers\nPerforms a bulk insert of all the data in customers.csv into database mydb, schema dbo, table customers. A progress bar will be shown as rows are inserted. If the destination table does not exist, \r\nthe import will be halted.\n-------------------------- EXAMPLE 2 --------------------------\nPS C:\\\u003e$DataTable = Import-Csv C:\\temp\\customers.csv\nPS C:\\\u003e $DataTable | Write-DbaDataTable -SqlInstance sql2014 -Table mydb.dbo.customers\nPerforms a row by row insert of the data in customers.csv. This is significantly slower than a bulk insert and will not show a progress bar.\r\nThis method is not recommended. Use -InputObject instead.\n-------------------------- EXAMPLE 3 --------------------------\nPS C:\\\u003e$DataTable = Import-Csv C:\\temp\\customers.csv\nPS C:\\\u003e Write-DbaDataTable -SqlInstance sql2014 -InputObject $DataTable -Table mydb.dbo.customers -AutoCreateTable -Confirm\nPerforms a bulk insert of all the data in customers.csv. If mydb.dbo.customers does not exist, it will be created with inefficient but forgiving DataTypes.\nPrompts for confirmation before a variety of steps.\n-------------------------- EXAMPLE 4 --------------------------\nPS C:\\\u003e$DataTable = Import-Csv C:\\temp\\customers.csv\nPS C:\\\u003e Write-DbaDataTable -SqlInstance sql2014 -InputObject $DataTable -Table mydb.dbo.customers -Truncate\nPerforms a bulk insert of all the data in customers.csv. Prior to importing into mydb.dbo.customers, the user is informed that the table will be truncated and asks for confirmation. The user is \r\nprompted again to perform the import.\n-------------------------- EXAMPLE 5 --------------------------\nPS C:\\\u003e$DataTable = Import-Csv C:\\temp\\customers.csv\nPS C:\\\u003e Write-DbaDataTable -SqlInstance sql2014 -InputObject $DataTable -Database mydb -Table customers -KeepNulls\nPerforms a bulk insert of all the data in customers.csv into mydb.dbo.customers. Because Schema was not specified, dbo was used. NULL values in the destination table will be preserved.\n-------------------------- EXAMPLE 6 --------------------------\nPS C:\\\u003e$passwd = ConvertTo-SecureString \"P@ssw0rd\" -AsPlainText -Force\nPS C:\\\u003e $AzureCredential = New-Object System.Management.Automation.PSCredential(\"AzureAccount\"),$passwd)\r\nPS C:\\\u003e $DataTable = Import-Csv C:\\temp\\customers.csv\r\nPS C:\\\u003e Write-DbaDataTable -SqlInstance AzureDB.database.windows.net -InputObject $DataTable -Database mydb -Table customers -KeepNulls -Credential $AzureCredential -BulkCopyTimeOut 300\nThis performs the same operation as the previous example, but against a SQL Azure Database instance using the required credentials.\n-------------------------- EXAMPLE 7 --------------------------\nPS C:\\\u003e$process = Get-Process\nPS C:\\\u003e Write-DbaDataTable -InputObject $process -SqlInstance sql2014 -Table \"[[DbName]]].[Schema.With.Dots].[`\"[Process]]`\"]\" -AutoCreateTable\nCreates a table based on the Process object with over 60 columns, converted from PowerShell data types to SQL Server data types. After the table is created a bulk insert is performed to add process \r\ninformation into the table\r\nWrites the results of Get-Process to a table named: \"[Process]\" in schema named: Schema.With.Dots in database named: [DbName]\r\nThe Table name, Schema name and Database name must be wrapped in square brackets [ ]\r\nSpecial charcters like \" must be escaped by a ` charcter.\r\nIn addition any actual instance of the ] character must be escaped by being duplicated.\nThis is an example of the type conversion in action. All process properties are converted, including special types like TimeSpan. Script properties are resolved before the type conversion starts \r\nthanks to ConvertTo-DbaDataTable.", - "Syntax": "Write-DbaDataTable [-SqlInstance] \u003cDbaInstanceParameter\u003e [[-SqlCredential] \u003cPSCredential\u003e] [[-Database] \u003cObject\u003e] -InputObject \u003cObject\u003e [-Table] \u003cString\u003e [[-Schema] \u003cString\u003e] [-BatchSize \u003cInt32\u003e] [-NotifyAfter \u003cInt32\u003e] [-AutoCreateTable] [-NoTableLock] [-CheckConstraints] [-FireTriggers] [-KeepIdentity] [-KeepNulls] [-Truncate] [-bulkCopyTimeOut \u003cInt32\u003e] [-RegularUser] [-EnableException] [-UseDynamicStringLength] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" + "Syntax": "Write-DbaDataTable [-SqlInstance] \u003cDbaInstanceParameter\u003e [[-SqlCredential] \u003cPSCredential\u003e] [[-Database] \u003cObject\u003e] -InputObject \u003cObject\u003e [-Table] \u003cString\u003e [[-Schema] \u003cString\u003e] [-BatchSize \u003cInt32\u003e] [-NotifyAfter \u003cInt32\u003e] [-AutoCreateTable] [-NoTableLock] [-CheckConstraints] [-FireTriggers] [-KeepIdentity] [-KeepNulls] [-Truncate] [-bulkCopyTimeOut \u003cInt32\u003e] [-EnableException] [-UseDynamicStringLength] [-WhatIf] [-Confirm] [\u003cCommonParameters\u003e]" } ] diff --git a/bin/dbatools.dll b/bin/dbatools.dll index 7a75047eb5e3ecacc54e02bbf7c3c03e33978c3a..2b56f24d4ffdc6ac96a86a737ab8fce6e400ae7c 100644 GIT binary patch delta 4744 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 delta 4759 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 diff --git a/bin/dbatools.png b/bin/dbatools.png new file mode 100644 index 0000000000000000000000000000000000000000..0f5b37fcc68d6d92604b9c7483fc2c76aec37aa8 GIT binary patch literal 8046 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 literal 0 HcmV?d00001 diff --git a/bin/diagnosticquery/SQLServerDiagnosticQueries_2005_201810.sql b/bin/diagnosticquery/SQLServerDiagnosticQueries_2005_201901.sql similarity index 97% rename from bin/diagnosticquery/SQLServerDiagnosticQueries_2005_201810.sql rename to bin/diagnosticquery/SQLServerDiagnosticQueries_2005_201901.sql index c0b09460b0..a9f8818d62 100644 --- a/bin/diagnosticquery/SQLServerDiagnosticQueries_2005_201810.sql +++ b/bin/diagnosticquery/SQLServerDiagnosticQueries_2005_201901.sql @@ -1,7 +1,7 @@ -- SQL Server 2005 Diagnostic Information Queries -- Glenn Berry --- Last Modified: July 5, 2018 +-- Last Modified: February 1, 2019 -- https://www.sqlserverperformance.wordpress.com/ -- https://www.sqlskills.com/blogs/glenn/ -- Twitter: GlennAlanBerry @@ -15,7 +15,7 @@ -- Please make sure you are using the correct version of these diagnostic queries for your version of SQL Server --****************************************************************************** ---* Copyright (C) 2018 Glenn Berry, SQLskills.com +--* Copyright (C) 2019 Glenn Berry, SQLskills.com --* All rights reserved. --* --* For more scripts and sample code, check out @@ -283,7 +283,7 @@ DROP TABLE #IOWarningResults; -- Drive level latency information (Query 13) (Drive Level Latency) -- Based on code from Jimmy May -SELECT tab.[Drive], tab.volume_mount_point AS [Volume Mount Point], +SELECT tab.[Drive], CASE WHEN num_of_reads = 0 THEN 0 ELSE (io_stall_read_ms/num_of_reads) @@ -311,12 +311,11 @@ SELECT tab.[Drive], tab.volume_mount_point AS [Volume Mount Point], FROM (SELECT LEFT(UPPER(mf.physical_name), 2) AS Drive, SUM(num_of_reads) AS num_of_reads, SUM(io_stall_read_ms) AS io_stall_read_ms, SUM(num_of_writes) AS num_of_writes, SUM(io_stall_write_ms) AS io_stall_write_ms, SUM(num_of_bytes_read) AS num_of_bytes_read, - SUM(num_of_bytes_written) AS num_of_bytes_written, SUM(io_stall) AS io_stall, vs.volume_mount_point + SUM(num_of_bytes_written) AS num_of_bytes_written, SUM(io_stall) AS io_stall FROM sys.dm_io_virtual_file_stats(NULL, NULL) AS vfs INNER JOIN sys.master_files AS mf WITH (NOLOCK) ON vfs.database_id = mf.database_id AND vfs.file_id = mf.file_id - CROSS APPLY sys.dm_os_volume_stats(mf.database_id, mf.[file_id]) AS vs - GROUP BY LEFT(UPPER(mf.physical_name), 2), vs.volume_mount_point) AS tab + GROUP BY LEFT(UPPER(mf.physical_name), 2)) AS tab ORDER BY [Overall Latency] OPTION (RECOMPILE); ------ @@ -325,9 +324,9 @@ ORDER BY [Overall Latency] OPTION (RECOMPILE); -- Calculates average stalls per read, per write, and per total input/output for each database file (Query 14) (IO Stalls by File) -SELECT DB_NAME(fs.database_id) AS [Database Name], CAST(fs.io_stall_read_ms/(1.0 + fs.num_of_reads) AS NUMERIC(10,1)) AS [avg_read_stall_ms], -CAST(fs.io_stall_write_ms/(1.0 + fs.num_of_writes) AS NUMERIC(10,1)) AS [avg_write_stall_ms], -CAST((fs.io_stall_read_ms + fs.io_stall_write_ms)/(1.0 + fs.num_of_reads + fs.num_of_writes) AS NUMERIC(10,1)) AS [avg_io_stall_ms], +SELECT DB_NAME(fs.database_id) AS [Database Name], CAST(fs.io_stall_read_ms/(1.0 + fs.num_of_reads) AS NUMERIC(16,1)) AS [avg_read_stall_ms], +CAST(fs.io_stall_write_ms/(1.0 + fs.num_of_writes) AS NUMERIC(16,1)) AS [avg_write_stall_ms], +CAST((fs.io_stall_read_ms + fs.io_stall_write_ms)/(1.0 + fs.num_of_reads + fs.num_of_writes) AS NUMERIC(16,1)) AS [avg_io_stall_ms], CONVERT(DECIMAL(18,2), mf.size/128.0) AS [File Size (MB)], mf.physical_name, mf.type_desc, fs.io_stall_read_ms, fs.num_of_reads, fs.io_stall_write_ms, fs.num_of_writes, fs.io_stall_read_ms + fs.io_stall_write_ms AS [io_stalls], fs.num_of_reads + fs.num_of_writes AS [total_io] FROM sys.dm_io_virtual_file_stats(null,null) AS fs @@ -448,6 +447,7 @@ ORDER BY [CPU Rank] OPTION (RECOMPILE); ------ -- Helps determine which database is using the most CPU resources on the instance +-- Note: This only reflects CPU usage from the currently cached query plans -- Get I/O utilization by database (Query 19) (IO Usage By Database) @@ -983,15 +983,24 @@ ORDER BY buffer_count DESC OPTION (RECOMPILE); -- Get Table names, row counts (Query 44) (Table Sizes) -SELECT OBJECT_NAME(object_id) AS [ObjectName], SUM(Rows) AS [RowCount] -FROM sys.partitions WITH (NOLOCK) +SELECT SCHEMA_NAME(o.Schema_ID) AS [Schema Name], OBJECT_NAME(p.object_id) AS [ObjectName], +SUM(p.Rows) AS [RowCount] +FROM sys.partitions AS p WITH (NOLOCK) +INNER JOIN sys.objects AS o WITH (NOLOCK) +ON p.object_id = o.object_id WHERE index_id < 2 --ignore the partitions from the non-clustered index if any -AND OBJECT_NAME(object_id) NOT LIKE N'sys%' -AND OBJECT_NAME(object_id) NOT LIKE N'queue_%' -AND OBJECT_NAME(object_id) NOT LIKE N'filestream_tombstone%' -AND OBJECT_NAME(object_id) NOT LIKE N'fulltext%' -GROUP BY [object_id] -ORDER BY SUM(Rows) DESC OPTION (RECOMPILE); +AND OBJECT_NAME(p.object_id) NOT LIKE N'sys%' +AND OBJECT_NAME(p.object_id) NOT LIKE N'spt_%' +AND OBJECT_NAME(p.object_id) NOT LIKE N'queue_%' +AND OBJECT_NAME(p.object_id) NOT LIKE N'filestream_tombstone%' +AND OBJECT_NAME(p.object_id) NOT LIKE N'fulltext%' +AND OBJECT_NAME(p.object_id) NOT LIKE N'ifts_comp_fragment%' +AND OBJECT_NAME(p.object_id) NOT LIKE N'filetable_updates%' +AND OBJECT_NAME(p.object_id) NOT LIKE N'xml_index_nodes%' +AND OBJECT_NAME(p.object_id) NOT LIKE N'sqlagent_job%' +AND OBJECT_NAME(p.object_id) NOT LIKE N'plan_persist%' +GROUP BY SCHEMA_NAME(o.Schema_ID), p.object_id +ORDER BY SUM(p.Rows) DESC OPTION (RECOMPILE); ------ -- Gives you an idea of table sizes @@ -1144,7 +1153,14 @@ ORDER BY bs.backup_finish_date DESC OPTION (RECOMPILE); --- These three Pluralsight Courses go into more detail about how to run these queries and interpret the results +-- These five Pluralsight Courses go into more detail about how to run these queries and interpret the results + +-- SQL Server 2017: Diagnosing Performance Issues with DMVs +-- https://bit.ly/2FqCeti + +-- SQL Server 2017: Diagnosing Configuration Issues with DMVs +-- https://bit.ly/2MSUDUL + -- SQL Server 2014 DMV Diagnostic Queries – Part 1 -- https://bit.ly/2plxCer diff --git a/bin/diagnosticquery/SQLServerDiagnosticQueries_2008R2_201810.sql b/bin/diagnosticquery/SQLServerDiagnosticQueries_2008R2_201901.sql similarity index 97% rename from bin/diagnosticquery/SQLServerDiagnosticQueries_2008R2_201810.sql rename to bin/diagnosticquery/SQLServerDiagnosticQueries_2008R2_201901.sql index 648780637b..f0ea3e3683 100644 --- a/bin/diagnosticquery/SQLServerDiagnosticQueries_2008R2_201810.sql +++ b/bin/diagnosticquery/SQLServerDiagnosticQueries_2008R2_201901.sql @@ -1,7 +1,7 @@ -- SQL Server 2008 R2 Diagnostic Information Queries -- Glenn Berry --- Last Modified: November 11, 2018 +-- Last Modified: February 1, 2019 -- https://www.sqlserverperformance.wordpress.com/ -- https://www.sqlskills.com/blogs/glenn/ -- Twitter: GlennAlanBerry @@ -15,7 +15,7 @@ -- Please make sure you are using the correct version of these diagnostic queries for your version of SQL Server --****************************************************************************** ---* Copyright (C) 2018 Glenn Berry, SQLskills.com +--* Copyright (C) 2019 Glenn Berry, SQLskills.com --* All rights reserved. --* --* For more scripts and sample code, check out @@ -438,9 +438,9 @@ ORDER BY [Overall Latency] OPTION (RECOMPILE); -- Calculates average stalls per read, per write, and per total input/output for each database file (Query 20) (IO Stalls by File) -SELECT DB_NAME(fs.database_id) AS [Database Name], CAST(fs.io_stall_read_ms/(1.0 + fs.num_of_reads) AS NUMERIC(10,1)) AS [avg_read_stall_ms], -CAST(fs.io_stall_write_ms/(1.0 + fs.num_of_writes) AS NUMERIC(10,1)) AS [avg_write_stall_ms], -CAST((fs.io_stall_read_ms + fs.io_stall_write_ms)/(1.0 + fs.num_of_reads + fs.num_of_writes) AS NUMERIC(10,1)) AS [avg_io_stall_ms], +SELECT DB_NAME(fs.database_id) AS [Database Name], CAST(fs.io_stall_read_ms/(1.0 + fs.num_of_reads) AS NUMERIC(16,1)) AS [avg_read_stall_ms], +CAST(fs.io_stall_write_ms/(1.0 + fs.num_of_writes) AS NUMERIC(16,1)) AS [avg_write_stall_ms], +CAST((fs.io_stall_read_ms + fs.io_stall_write_ms)/(1.0 + fs.num_of_reads + fs.num_of_writes) AS NUMERIC(16,1)) AS [avg_io_stall_ms], CONVERT(DECIMAL(18,2), mf.size/128.0) AS [File Size (MB)], mf.physical_name, mf.type_desc, fs.io_stall_read_ms, fs.num_of_reads, fs.io_stall_write_ms, fs.num_of_writes, fs.io_stall_read_ms + fs.io_stall_write_ms AS [io_stalls], fs.num_of_reads + fs.num_of_writes AS [total_io] FROM sys.dm_io_virtual_file_stats(null,null) AS fs @@ -457,7 +457,7 @@ ORDER BY avg_io_stall_ms DESC OPTION (RECOMPILE); -- Recovery model, log reuse wait description, log file size, log usage size (Query 21) (Database Properties) -- and compatibility level for all databases on instance -SELECT db.[name] AS [Database Name], db.recovery_model_desc AS [Recovery Model], +SELECT db.[name] AS [Database Name], SUSER_SNAME(db.owner_sid) AS [Database Owner], db.recovery_model_desc AS [Recovery Model], db.log_reuse_wait_desc AS [Log Reuse Wait Description], ls.cntr_value AS [Log Size (KB)], lu.cntr_value AS [Log Used (KB)], CAST(CAST(lu.cntr_value AS FLOAT) / CAST(ls.cntr_value AS FLOAT)AS DECIMAL(18,2)) * 100 AS [Log Used %], @@ -562,6 +562,7 @@ ORDER BY [CPU Rank] OPTION (RECOMPILE); ------ -- Helps determine which database is using the most CPU resources on the instance +-- Note: This only reflects CPU usage from the currently cached query plans -- Get I/O utilization by database (Query 25) (IO Usage By Database) @@ -1168,18 +1169,24 @@ ORDER BY [BufferCount] DESC OPTION (RECOMPILE); -- Get Table names, row counts, and compression status for clustered index or heap (Query 55) (Table Sizes) -SELECT OBJECT_NAME(object_id) AS [ObjectName], -SUM(Rows) AS [RowCount], data_compression_desc AS [CompressionType] -FROM sys.partitions WITH (NOLOCK) +SELECT SCHEMA_NAME(o.Schema_ID) AS [Schema Name], OBJECT_NAME(p.object_id) AS [ObjectName], +SUM(p.Rows) AS [RowCount], data_compression_desc AS [CompressionType] +FROM sys.partitions AS p WITH (NOLOCK) +INNER JOIN sys.objects AS o WITH (NOLOCK) +ON p.object_id = o.object_id WHERE index_id < 2 --ignore the partitions from the non-clustered index if any -AND OBJECT_NAME(object_id) NOT LIKE N'sys%' -AND OBJECT_NAME(object_id) NOT LIKE N'queue_%' -AND OBJECT_NAME(object_id) NOT LIKE N'filestream_tombstone%' -AND OBJECT_NAME(object_id) NOT LIKE N'fulltext%' -AND OBJECT_NAME(object_id) NOT LIKE N'ifts_comp_fragment%' -AND OBJECT_NAME(object_id) NOT LIKE N'xml_index_nodes%' -GROUP BY object_id, data_compression_desc -ORDER BY SUM(Rows) DESC OPTION (RECOMPILE); +AND OBJECT_NAME(p.object_id) NOT LIKE N'sys%' +AND OBJECT_NAME(p.object_id) NOT LIKE N'spt_%' +AND OBJECT_NAME(p.object_id) NOT LIKE N'queue_%' +AND OBJECT_NAME(p.object_id) NOT LIKE N'filestream_tombstone%' +AND OBJECT_NAME(p.object_id) NOT LIKE N'fulltext%' +AND OBJECT_NAME(p.object_id) NOT LIKE N'ifts_comp_fragment%' +AND OBJECT_NAME(p.object_id) NOT LIKE N'filetable_updates%' +AND OBJECT_NAME(p.object_id) NOT LIKE N'xml_index_nodes%' +AND OBJECT_NAME(p.object_id) NOT LIKE N'sqlagent_job%' +AND OBJECT_NAME(p.object_id) NOT LIKE N'plan_persist%' +GROUP BY SCHEMA_NAME(o.Schema_ID), p.object_id, data_compression_desc +ORDER BY SUM(p.Rows) DESC OPTION (RECOMPILE); ------ -- Gives you an idea of table sizes, and possible data compression opportunities @@ -1364,7 +1371,13 @@ ORDER BY bs.backup_finish_date DESC OPTION (RECOMPILE); -- Have you done any backup tuning with striped backups, or changing the parameters of the backup command? --- These three Pluralsight Courses go into more detail about how to run these queries and interpret the results +-- These five Pluralsight Courses go into more detail about how to run these queries and interpret the results + +-- SQL Server 2017: Diagnosing Performance Issues with DMVs +-- https://bit.ly/2FqCeti + +-- SQL Server 2017: Diagnosing Configuration Issues with DMVs +-- https://bit.ly/2MSUDUL -- SQL Server 2014 DMV Diagnostic Queries – Part 1 -- https://bit.ly/2plxCer diff --git a/bin/diagnosticquery/SQLServerDiagnosticQueries_2008_201810.sql b/bin/diagnosticquery/SQLServerDiagnosticQueries_2008_201901.sql similarity index 97% rename from bin/diagnosticquery/SQLServerDiagnosticQueries_2008_201810.sql rename to bin/diagnosticquery/SQLServerDiagnosticQueries_2008_201901.sql index 4ed1d7c396..270afe7703 100644 --- a/bin/diagnosticquery/SQLServerDiagnosticQueries_2008_201810.sql +++ b/bin/diagnosticquery/SQLServerDiagnosticQueries_2008_201901.sql @@ -1,7 +1,7 @@ -- SQL Server 2008 Diagnostic Information Queries -- Glenn Berry --- Last Modified: November 11, 2018 +-- Last Modified: February 1, 2019 -- https://sqlserverperformance.wordpress.com/ -- https://www.sqlskills.com/blogs/glenn/ -- Twitter: GlennAlanBerry @@ -15,7 +15,7 @@ -- Please make sure you are using the correct version of these diagnostic queries for your version of SQL Server --****************************************************************************** ---* Copyright (C) 2018 Glenn Berry, SQLskills.com +--* Copyright (C) 2019 Glenn Berry, SQLskills.com --* All rights reserved. --* --* For more scripts and sample code, check out @@ -335,7 +335,7 @@ DROP TABLE #IOWarningResults; -- Drive level latency information (Query 15) (Drive Level Latency) -- Based on code from Jimmy May -SELECT tab.[Drive], tab.volume_mount_point AS [Volume Mount Point], +SELECT tab.[Drive], CASE WHEN num_of_reads = 0 THEN 0 ELSE (io_stall_read_ms/num_of_reads) @@ -363,12 +363,11 @@ SELECT tab.[Drive], tab.volume_mount_point AS [Volume Mount Point], FROM (SELECT LEFT(UPPER(mf.physical_name), 2) AS Drive, SUM(num_of_reads) AS num_of_reads, SUM(io_stall_read_ms) AS io_stall_read_ms, SUM(num_of_writes) AS num_of_writes, SUM(io_stall_write_ms) AS io_stall_write_ms, SUM(num_of_bytes_read) AS num_of_bytes_read, - SUM(num_of_bytes_written) AS num_of_bytes_written, SUM(io_stall) AS io_stall, vs.volume_mount_point + SUM(num_of_bytes_written) AS num_of_bytes_written, SUM(io_stall) AS io_stall FROM sys.dm_io_virtual_file_stats(NULL, NULL) AS vfs INNER JOIN sys.master_files AS mf WITH (NOLOCK) ON vfs.database_id = mf.database_id AND vfs.file_id = mf.file_id - CROSS APPLY sys.dm_os_volume_stats(mf.database_id, mf.[file_id]) AS vs - GROUP BY LEFT(UPPER(mf.physical_name), 2), vs.volume_mount_point) AS tab + GROUP BY LEFT(UPPER(mf.physical_name), 2)) AS tab ORDER BY [Overall Latency] OPTION (RECOMPILE); ------ @@ -377,9 +376,9 @@ ORDER BY [Overall Latency] OPTION (RECOMPILE); -- Calculates average stalls per read, per write, and per total input/output for each database file (Query 16) (IO Stalls by File) -SELECT DB_NAME(fs.database_id) AS [Database Name], CAST(fs.io_stall_read_ms/(1.0 + fs.num_of_reads) AS NUMERIC(10,1)) AS [avg_read_stall_ms], -CAST(fs.io_stall_write_ms/(1.0 + fs.num_of_writes) AS NUMERIC(10,1)) AS [avg_write_stall_ms], -CAST((fs.io_stall_read_ms + fs.io_stall_write_ms)/(1.0 + fs.num_of_reads + fs.num_of_writes) AS NUMERIC(10,1)) AS [avg_io_stall_ms], +SELECT DB_NAME(fs.database_id) AS [Database Name], CAST(fs.io_stall_read_ms/(1.0 + fs.num_of_reads) AS NUMERIC(16,1)) AS [avg_read_stall_ms], +CAST(fs.io_stall_write_ms/(1.0 + fs.num_of_writes) AS NUMERIC(16,1)) AS [avg_write_stall_ms], +CAST((fs.io_stall_read_ms + fs.io_stall_write_ms)/(1.0 + fs.num_of_reads + fs.num_of_writes) AS NUMERIC(16,1)) AS [avg_io_stall_ms], CONVERT(DECIMAL(18,2), mf.size/128.0) AS [File Size (MB)], mf.physical_name, mf.type_desc, fs.io_stall_read_ms, fs.num_of_reads, fs.io_stall_write_ms, fs.num_of_writes, fs.io_stall_read_ms + fs.io_stall_write_ms AS [io_stalls], fs.num_of_reads + fs.num_of_writes AS [total_io] FROM sys.dm_io_virtual_file_stats(null,null) AS fs @@ -500,6 +499,7 @@ ORDER BY [CPU Rank] OPTION (RECOMPILE); ------ -- Helps determine which database is using the most CPU resources on the instance +-- Note: This only reflects CPU usage from the currently cached query plans -- Get I/O utilization by database (Query 21) (IO Usage By Database) @@ -1102,18 +1102,24 @@ ORDER BY [BufferCount] DESC OPTION (RECOMPILE); -- Get Table names, row counts, and compression status for clustered index or heap (Query 51) (Table Sizes) -SELECT OBJECT_NAME(object_id) AS [ObjectName], -SUM(Rows) AS [RowCount], data_compression_desc AS [CompressionType] -FROM sys.partitions WITH (NOLOCK) +SELECT SCHEMA_NAME(o.Schema_ID) AS [Schema Name], OBJECT_NAME(p.object_id) AS [ObjectName], +SUM(p.Rows) AS [RowCount], data_compression_desc AS [CompressionType] +FROM sys.partitions AS p WITH (NOLOCK) +INNER JOIN sys.objects AS o WITH (NOLOCK) +ON p.object_id = o.object_id WHERE index_id < 2 --ignore the partitions from the non-clustered index if any -AND OBJECT_NAME(object_id) NOT LIKE N'sys%' -AND OBJECT_NAME(object_id) NOT LIKE N'queue_%' -AND OBJECT_NAME(object_id) NOT LIKE N'filestream_tombstone%' -AND OBJECT_NAME(object_id) NOT LIKE N'fulltext%' -AND OBJECT_NAME(object_id) NOT LIKE N'ifts_comp_fragment%' -AND OBJECT_NAME(object_id) NOT LIKE N'xml_index_nodes%' -GROUP BY object_id, data_compression_desc -ORDER BY SUM(Rows) DESC OPTION (RECOMPILE); +AND OBJECT_NAME(p.object_id) NOT LIKE N'sys%' +AND OBJECT_NAME(p.object_id) NOT LIKE N'spt_%' +AND OBJECT_NAME(p.object_id) NOT LIKE N'queue_%' +AND OBJECT_NAME(p.object_id) NOT LIKE N'filestream_tombstone%' +AND OBJECT_NAME(p.object_id) NOT LIKE N'fulltext%' +AND OBJECT_NAME(p.object_id) NOT LIKE N'ifts_comp_fragment%' +AND OBJECT_NAME(p.object_id) NOT LIKE N'filetable_updates%' +AND OBJECT_NAME(p.object_id) NOT LIKE N'xml_index_nodes%' +AND OBJECT_NAME(p.object_id) NOT LIKE N'sqlagent_job%' +AND OBJECT_NAME(p.object_id) NOT LIKE N'plan_persist%' +GROUP BY SCHEMA_NAME(o.Schema_ID), p.object_id, data_compression_desc +ORDER BY SUM(p.Rows) DESC OPTION (RECOMPILE); ------ -- Gives you an idea of table sizes, and possible data compression opportunities @@ -1280,7 +1286,13 @@ ORDER BY bs.backup_finish_date DESC OPTION (RECOMPILE); -- Have you done any backup tuning with striped backups, or changing the parameters of the backup command? --- These three Pluralsight Courses go into more detail about how to run these queries and interpret the results +-- These five Pluralsight Courses go into more detail about how to run these queries and interpret the results + +-- SQL Server 2017: Diagnosing Performance Issues with DMVs +-- https://bit.ly/2FqCeti + +-- SQL Server 2017: Diagnosing Configuration Issues with DMVs +-- https://bit.ly/2MSUDUL -- SQL Server 2014 DMV Diagnostic Queries – Part 1 -- https://bit.ly/2plxCer diff --git a/bin/diagnosticquery/SQLServerDiagnosticQueries_2012_201810.sql b/bin/diagnosticquery/SQLServerDiagnosticQueries_2012_201901.sql similarity index 97% rename from bin/diagnosticquery/SQLServerDiagnosticQueries_2012_201810.sql rename to bin/diagnosticquery/SQLServerDiagnosticQueries_2012_201901.sql index e4725644ba..e4a42ecc23 100644 --- a/bin/diagnosticquery/SQLServerDiagnosticQueries_2012_201810.sql +++ b/bin/diagnosticquery/SQLServerDiagnosticQueries_2012_201901.sql @@ -1,7 +1,7 @@ -- SQL Server 2012 Diagnostic Information Queries -- Glenn Berry --- Last Modified: November 11, 2018 +-- Last Modified: March 9, 2019 -- https://www.sqlskills.com/blogs/glenn/ -- http://sqlserverperformance.wordpress.com/ -- Twitter: GlennAlanBerry @@ -23,7 +23,7 @@ --****************************************************************************** ---* Copyright (C) 2018 Glenn Berry, SQLskills.com +--* Copyright (C) 2019 Glenn Berry, SQLskills.com --* All rights reserved. --* --* For more scripts and sample code, check out @@ -856,6 +856,7 @@ ORDER BY [CPU Rank] OPTION (RECOMPILE); ------ -- Helps determine which database is using the most CPU resources on the instance +-- Note: This only reflects CPU usage from the currently cached query plans -- Get I/O utilization by database (Query 35) (IO Usage By Database) @@ -1241,17 +1242,17 @@ ORDER BY f.[file_id] OPTION (RECOMPILE); -- I/O Statistics by file for the current database (Query 50) (IO Stats By File) SELECT DB_NAME(DB_ID()) AS [Database Name], df.name AS [Logical Name], vfs.[file_id], df.type_desc, -df.physical_name AS [Physical Name], CAST(vfs.size_on_disk_bytes/1048576.0 AS DECIMAL(10, 2)) AS [Size on Disk (MB)], +df.physical_name AS [Physical Name], CAST(vfs.size_on_disk_bytes/1048576.0 AS DECIMAL(16, 2)) AS [Size on Disk (MB)], vfs.num_of_reads, vfs.num_of_writes, vfs.io_stall_read_ms, vfs.io_stall_write_ms, -CAST(100. * vfs.io_stall_read_ms/(vfs.io_stall_read_ms + vfs.io_stall_write_ms) AS DECIMAL(10,1)) AS [IO Stall Reads Pct], -CAST(100. * vfs.io_stall_write_ms/(vfs.io_stall_write_ms + vfs.io_stall_read_ms) AS DECIMAL(10,1)) AS [IO Stall Writes Pct], +CAST(100. * vfs.io_stall_read_ms/(vfs.io_stall_read_ms + vfs.io_stall_write_ms) AS DECIMAL(16,1)) AS [IO Stall Reads Pct], +CAST(100. * vfs.io_stall_write_ms/(vfs.io_stall_write_ms + vfs.io_stall_read_ms) AS DECIMAL(16,1)) AS [IO Stall Writes Pct], (vfs.num_of_reads + vfs.num_of_writes) AS [Writes + Reads], -CAST(vfs.num_of_bytes_read/1048576.0 AS DECIMAL(10, 2)) AS [MB Read], -CAST(vfs.num_of_bytes_written/1048576.0 AS DECIMAL(10, 2)) AS [MB Written], -CAST(100. * vfs.num_of_reads/(vfs.num_of_reads + vfs.num_of_writes) AS DECIMAL(10,1)) AS [# Reads Pct], -CAST(100. * vfs.num_of_writes/(vfs.num_of_reads + vfs.num_of_writes) AS DECIMAL(10,1)) AS [# Write Pct], -CAST(100. * vfs.num_of_bytes_read/(vfs.num_of_bytes_read + vfs.num_of_bytes_written) AS DECIMAL(10,1)) AS [Read Bytes Pct], -CAST(100. * vfs.num_of_bytes_written/(vfs.num_of_bytes_read + vfs.num_of_bytes_written) AS DECIMAL(10,1)) AS [Written Bytes Pct] +CAST(vfs.num_of_bytes_read/1048576.0 AS DECIMAL(16, 2)) AS [MB Read], +CAST(vfs.num_of_bytes_written/1048576.0 AS DECIMAL(16, 2)) AS [MB Written], +CAST(100. * vfs.num_of_reads/(vfs.num_of_reads + vfs.num_of_writes) AS DECIMAL(16,1)) AS [# Reads Pct], +CAST(100. * vfs.num_of_writes/(vfs.num_of_reads + vfs.num_of_writes) AS DECIMAL(16,1)) AS [# Write Pct], +CAST(100. * vfs.num_of_bytes_read/(vfs.num_of_bytes_read + vfs.num_of_bytes_written) AS DECIMAL(16,1)) AS [Read Bytes Pct], +CAST(100. * vfs.num_of_bytes_written/(vfs.num_of_bytes_read + vfs.num_of_bytes_written) AS DECIMAL(16,1)) AS [Written Bytes Pct] FROM sys.dm_io_virtual_file_stats(DB_ID(), NULL) AS vfs INNER JOIN sys.database_files AS df WITH (NOLOCK) ON vfs.[file_id]= df.[file_id] OPTION (RECOMPILE); @@ -1525,21 +1526,24 @@ ORDER BY [BufferCount] DESC OPTION (RECOMPILE); -- Get Table names, row counts, and compression status for clustered index or heap (Query 63) (Table Sizes) -SELECT OBJECT_NAME(object_id) AS [ObjectName], -SUM(Rows) AS [RowCount], data_compression_desc AS [CompressionType] -FROM sys.partitions WITH (NOLOCK) +SELECT SCHEMA_NAME(o.Schema_ID) AS [Schema Name], OBJECT_NAME(p.object_id) AS [ObjectName], +SUM(p.Rows) AS [RowCount], data_compression_desc AS [CompressionType] +FROM sys.partitions AS p WITH (NOLOCK) +INNER JOIN sys.objects AS o WITH (NOLOCK) +ON p.object_id = o.object_id WHERE index_id < 2 --ignore the partitions from the non-clustered index if any -AND OBJECT_NAME(object_id) NOT LIKE N'sys%' -AND OBJECT_NAME(object_id) NOT LIKE N'queue_%' -AND OBJECT_NAME(object_id) NOT LIKE N'filestream_tombstone%' -AND OBJECT_NAME(object_id) NOT LIKE N'fulltext%' -AND OBJECT_NAME(object_id) NOT LIKE N'ifts_comp_fragment%' -AND OBJECT_NAME(object_id) NOT LIKE N'filetable_updates%' -AND OBJECT_NAME(object_id) NOT LIKE N'xml_index_nodes%' -AND OBJECT_NAME(object_id) NOT LIKE N'sqlagent_job%' -AND OBJECT_NAME(object_id) NOT LIKE N'plan_persist%' -GROUP BY object_id, data_compression_desc -ORDER BY SUM(Rows) DESC OPTION (RECOMPILE); +AND OBJECT_NAME(p.object_id) NOT LIKE N'sys%' +AND OBJECT_NAME(p.object_id) NOT LIKE N'spt_%' +AND OBJECT_NAME(p.object_id) NOT LIKE N'queue_%' +AND OBJECT_NAME(p.object_id) NOT LIKE N'filestream_tombstone%' +AND OBJECT_NAME(p.object_id) NOT LIKE N'fulltext%' +AND OBJECT_NAME(p.object_id) NOT LIKE N'ifts_comp_fragment%' +AND OBJECT_NAME(p.object_id) NOT LIKE N'filetable_updates%' +AND OBJECT_NAME(p.object_id) NOT LIKE N'xml_index_nodes%' +AND OBJECT_NAME(p.object_id) NOT LIKE N'sqlagent_job%' +AND OBJECT_NAME(p.object_id) NOT LIKE N'plan_persist%' +GROUP BY SCHEMA_NAME(o.Schema_ID), p.object_id, data_compression_desc +ORDER BY SUM(p.Rows) DESC OPTION (RECOMPILE); ------ -- Gives you an idea of table sizes, and possible data compression opportunities @@ -1710,7 +1714,10 @@ ORDER BY bs.backup_finish_date DESC OPTION (RECOMPILE); -- Have you done any backup tuning with striped backups, or changing the parameters of the backup command? --- These four Pluralsight Courses go into more detail about how to run these queries and interpret the results +-- These five Pluralsight Courses go into more detail about how to run these queries and interpret the results + +-- SQL Server 2017: Diagnosing Performance Issues with DMVs +-- https://bit.ly/2FqCeti -- SQL Server 2017: Diagnosing Configuration Issues with DMVs -- https://bit.ly/2MSUDUL diff --git a/bin/diagnosticquery/SQLServerDiagnosticQueries_2014_201810.sql b/bin/diagnosticquery/SQLServerDiagnosticQueries_2014_201901.sql similarity index 93% rename from bin/diagnosticquery/SQLServerDiagnosticQueries_2014_201810.sql rename to bin/diagnosticquery/SQLServerDiagnosticQueries_2014_201901.sql index 184075f1c1..51f07aa6dd 100644 --- a/bin/diagnosticquery/SQLServerDiagnosticQueries_2014_201810.sql +++ b/bin/diagnosticquery/SQLServerDiagnosticQueries_2014_201901.sql @@ -1,7 +1,7 @@ -- SQL Server 2014 Diagnostic Information Queries -- Glenn Berry --- Last Modified: November 14, 2018 +-- Last Modified: March 1, 2019 -- https://www.sqlskills.com/blogs/glenn/ -- http://sqlserverperformance.wordpress.com/ -- Twitter: GlennAlanBerry @@ -23,7 +23,7 @@ --****************************************************************************** ---* Copyright (C) 2018 Glenn Berry, SQLskills.com +--* Copyright (C) 2019 Glenn Berry, SQLskills.com --* All rights reserved. --* --* For more scripts and sample code, check out @@ -76,23 +76,25 @@ SELECT @@SERVERNAME AS [Server Name], @@VERSION AS [SQL Server and OS Version In -- 12.0.2564 CU12 2/22/2016 12.0.4439 SP1 CU5 2/22/2016 -- 12.0.2568 CU13 4/18/2016 12.0.4449 SP1 CU6 4/18/2016 (Deprecated) -- 12.0.4457 SP1 CU6 5/30/2016 (Re-release) --- 12.0.2569 CU14 6/20/2016 12.0.4459 SP1 CU7 6/20/2016 -----------> 12.0.5000 SP2 RTM 7/11/2016 --- 12.0.4468 SP1 CU8 8/15/2016 12.0.5511 SP2 CU1 8/25/2016 +-- 12.0.2569 CU14 6/20/2016 12.0.4459 SP1 CU7 6/20/2016 -----------> 12.0.5000 SP2 RTM 7/11/2016 +-- 12.0.4468 SP1 CU8 8/15/2016 12.0.5511 SP2 CU1 8/25/2016 -- 12.0.4474 SP1 CU9 10/17/2016 12.0.5522 SP2 CU2 10/17/2016 --- 12.0.4487 SP1 CU9 + HF 11/8/2016 12.0.5532 SP2 CU2 + HF 11/8/2016 +-- 12.0.4487 SP1 CU9 + HF 11/8/2016 12.0.5532 SP2 CU2 + HF 11/8/2016 -- 12.0.4491 SP1 CU10 12/28/2016 12.0.5537 SP2 CU3 12/28/2016 --- 12.0.4502 SP1 CU11 2/21/2017 12.0.5540 SP2 CU4 2/21/2017 --- 12.0.4511 SP1 CU12 4/17/2017 12.0.5546 SP2 CU5 4/17/2017 --- 12.0.4522 SP1 CU13 7/17/2017 12.0.5552 SP2 CU6 7/17/2017 --- 12.0.5556 SP2 CU7 8/28/2017 +-- 12.0.4502 SP1 CU11 2/21/2017 12.0.5540 SP2 CU4 2/21/2017 +-- 12.0.4511 SP1 CU12 4/17/2017 12.0.5546 SP2 CU5 4/17/2017 +-- 12.0.4522 SP1 CU13 7/17/2017 12.0.5552 SP2 CU6 7/17/2017 +-- 12.0.5556 SP2 CU7 8/28/2017 -- 12.0.5557 SP2 CU8 10/16/2017 -- 12.0.5563 SP2 CU9 12/18/2017 --- 12.0.5571 SP2 CU10 1/16/2018 --- 12.0.5579 SP2 CU11 3/19/2018 --- 12.0.5589 SP2 CU12 6/18/2018 --- 12.0.5590 SP2 CU13 8/27/2018 --- 12.0.5600 SP3 CU14 10/15/2018 --- 12.0.6024 SP3 RTM 10/30/2018 +-- 12.0.5571 SP2 CU10 1/16/2018 +-- 12.0.5579 SP2 CU11 3/19/2018 +-- 12.0.5589 SP2 CU12 6/18/2018 +-- 12.0.5590 SP2 CU13 8/27/2018 +-- 12.0.5600 SP2 CU14 10/15/2018 +-- 12.0.6024 SP3 RTM 10/30/2018 +-- 12.0.5605 SP2 CU15 12/12/2018 ----> 12.0.6205 SP3 CU1 12/12/2018 +-- 12.0.5626 SP2 CU16 2/19/2019 ----> 12.0.6214 SP3 CU2 2/19/2019 @@ -117,6 +119,9 @@ SELECT @@SERVERNAME AS [Server Name], @@VERSION AS [SQL Server and OS Version In -- Performance and Stability Related Fixes in Post-SQL Server 2014 SP2 Builds -- https://bit.ly/2iJ9G4N +-- Performance and Stability Related Fixes in Post-SQL Server 2014 SP3 Builds +-- https://bit.ly/2PRGTWS + -- Announcing updates to the SQL Server Incremental Servicing Model (ISM) -- https://bit.ly/1RzYITz @@ -549,38 +554,8 @@ EXEC sys.xp_instance_regread N'HKEY_LOCAL_MACHINE', N'HARDWARE\DESCRIPTION\Syste --- See if buffer pool extension (BPE) is enabled (Query 23) (BPE Configuration) -SELECT [path], state_description, current_size_in_kb, -CAST(current_size_in_kb/1048576.0 AS DECIMAL(10,2)) AS [Size (GB)] -FROM sys.dm_os_buffer_pool_extension_configuration WITH (NOLOCK) OPTION (RECOMPILE); ------- - --- BPE is available in both Standard Edition and Enterprise Edition --- It is a more interesting feature for Standard Edition - --- Buffer Pool Extension to SSDs in SQL Server 2014 --- https://bit.ly/1bm08m8 - --- Buffer Pool Extension --- https://bit.ly/2oBuieO - - --- Look at buffer descriptors to see BPE usage by database (Query 24) (BPE Usage) -SELECT DB_NAME(database_id) AS [Database Name], COUNT(page_id) AS [Page Count], -CAST(COUNT(*)/128.0 AS DECIMAL(10, 2)) AS [Buffer size(MB)], -AVG(read_microsec) AS [Avg Read Time (microseconds)] -FROM sys.dm_os_buffer_descriptors WITH (NOLOCK) -WHERE database_id <> 32767 -AND is_in_bpool_extension = 1 -GROUP BY DB_NAME(database_id) -ORDER BY [Buffer size(MB)] DESC OPTION (RECOMPILE); ------- - --- You will see no results if BPE is not enabled or if there is no BPE usage - - --- Get information on location, time and size of any memory dumps from SQL Server (Query 25) (Memory Dump Info) +-- Get information on location, time and size of any memory dumps from SQL Server (Query 23) (Memory Dump Info) SELECT [filename], creation_time, size_in_bytes/1048576.0 AS [Size (MB)] FROM sys.dm_server_memory_dumps WITH (NOLOCK) ORDER BY creation_time DESC OPTION (RECOMPILE); @@ -594,7 +569,7 @@ ORDER BY creation_time DESC OPTION (RECOMPILE); --- Look at Suspect Pages table (Query 26) (Suspect Pages) +-- Look at Suspect Pages table (Query 24) (Suspect Pages) SELECT DB_NAME(database_id) AS [Database Name], [file_id], page_id, event_type, error_count, last_update_date FROM msdb.dbo.suspect_pages WITH (NOLOCK) @@ -617,7 +592,7 @@ ORDER BY database_id OPTION (RECOMPILE); -- https://bit.ly/2Fvr1c9 --- Get number of data files in tempdb database (Query 27) (Tempdb Data Files) +-- Get number of data files in tempdb database (Query 25) (Tempdb Data Files) EXEC sys.xp_readerrorlog 0, 1, N'The tempdb database has'; ------ @@ -627,7 +602,7 @@ EXEC sys.xp_readerrorlog 0, 1, N'The tempdb database has'; -- This will be blank unless you have Service Pack 2 or later --- File names and paths for all user and system databases on instance (Query 28) (Database Filenames and Paths) +-- File names and paths for all user and system databases on instance (Query 26) (Database Filenames and Paths) SELECT DB_NAME([database_id]) AS [Database Name], [file_id], [name], physical_name, [type_desc], state_desc, is_percent_growth, growth, @@ -647,7 +622,7 @@ ORDER BY DB_NAME([database_id]), [file_id] OPTION (RECOMPILE); -- Is percent growth enabled for any files (which is bad)? --- Volume info for all LUNS that have database files on the current instance (Query 29) (Volume Info) +-- Volume info for all LUNS that have database files on the current instance (Query 27) (Volume Info) SELECT DISTINCT vs.volume_mount_point, vs.file_system_type, vs.logical_volume_name, CONVERT(DECIMAL(18,2), vs.total_bytes/1073741824.0) AS [Total Size (GB)], CONVERT(DECIMAL(18,2), vs.available_bytes/1073741824.0) AS [Available Size (GB)], @@ -667,7 +642,7 @@ ORDER BY vs.volume_mount_point OPTION (RECOMPILE); --- Drive level latency information (Query 30) (Drive Level Latency) +-- Drive level latency information (Query 28) (Drive Level Latency) -- Based on code from Jimmy May SELECT tab.[Drive], tab.volume_mount_point AS [Volume Mount Point], CASE @@ -712,7 +687,7 @@ ORDER BY [Overall Latency] OPTION (RECOMPILE); -- database files on each drive since SQL Server was last started --- Calculates average stalls per read, per write, and per total input/output for each database file (Query 31) (IO Latency by File) +-- Calculates average stalls per read, per write, and per total input/output for each database file (Query 29) (IO Latency by File) SELECT DB_NAME(fs.database_id) AS [Database Name], CAST(fs.io_stall_read_ms/(1.0 + fs.num_of_reads) AS NUMERIC(10,1)) AS [avg_read_latency_ms], CAST(fs.io_stall_write_ms/(1.0 + fs.num_of_writes) AS NUMERIC(10,1)) AS [avg_write_latency_ms], CAST((fs.io_stall_read_ms + fs.io_stall_write_ms)/(1.0 + fs.num_of_reads + fs.num_of_writes) AS NUMERIC(10,1)) AS [avg_io_latency_ms], @@ -733,7 +708,7 @@ ORDER BY avg_io_latency_ms DESC OPTION (RECOMPILE); -- database file since SQL Server was last started --- Look for I/O requests taking longer than 15 seconds in the six most recent SQL Server Error Logs (Query 32) (IO Warnings) +-- Look for I/O requests taking longer than 15 seconds in the six most recent SQL Server Error Logs (Query 30) (IO Warnings) CREATE TABLE #IOWarningResults(LogDate datetime, ProcessInfo sysname, LogText nvarchar(1000)); INSERT INTO #IOWarningResults @@ -769,7 +744,7 @@ DROP TABLE #IOWarningResults; -- https://bit.ly/2qtaw73 --- Resource Governor Resource Pool information (Query 33) (RG Resource Pools) +-- Resource Governor Resource Pool information (Query 31) (RG Resource Pools) SELECT pool_id, [Name], statistics_start_time, min_memory_percent, max_memory_percent, max_memory_kb/1024 AS [max_memory_mb], @@ -785,7 +760,7 @@ OPTION (RECOMPILE); --- Recovery model, log reuse wait description, log file size, log usage size (Query 34) (Database Properties) +-- Recovery model, log reuse wait description, log file size, log usage size (Query 32) (Database Properties) -- and compatibility level for all databases on instance SELECT db.[name] AS [Database Name], SUSER_SNAME(db.owner_sid) AS [Database Owner], db.recovery_model_desc AS [Recovery Model], db.state_desc, db.containment_desc, db.log_reuse_wait_desc AS [Log Reuse Wait Description], @@ -823,7 +798,7 @@ ORDER BY db.[name] OPTION (RECOMPILE); --- Missing Indexes for all databases by Index Advantage (Query 35) (Missing Indexes All Databases) +-- Missing Indexes for all databases by Index Advantage (Query 33) (Missing Indexes All Databases) SELECT CONVERT(decimal(18,2), user_seeks * avg_total_user_cost * (avg_user_impact * 0.01)) AS [index_advantage], FORMAT(migs.last_user_seek, 'yyyy-MM-dd HH:mm:ss') AS [last_user_seek], mid.[statement] AS [Database.Schema.Table], @@ -851,7 +826,7 @@ ORDER BY index_advantage DESC OPTION (RECOMPILE); --- Get VLF Counts for all databases on the instance (Query 36) (VLF Counts) +-- Get VLF Counts for all databases on the instance (Query 34) (VLF Counts) -- (adapted from Michelle Ufford) CREATE TABLE #VLFInfo (RecoveryUnitID int, FileID int, FileSize bigint, StartOffset bigint, @@ -891,7 +866,7 @@ DROP TABLE #VLFCountResults; --- Get CPU utilization by database (Query 37) (CPU Usage by Database) +-- Get CPU utilization by database (Query 35) (CPU Usage by Database) WITH DB_CPU_Stats AS (SELECT pa.DatabaseID, DB_Name(pa.DatabaseID) AS [Database Name], SUM(qs.total_worker_time/1000) AS [CPU_Time_Ms] @@ -909,9 +884,10 @@ ORDER BY [CPU Rank] OPTION (RECOMPILE); ------ -- Helps determine which database is using the most CPU resources on the instance +-- Note: This only reflects CPU usage from the currently cached query plans --- Get I/O utilization by database (Query 38) (IO Usage By Database) +-- Get I/O utilization by database (Query 36) (IO Usage By Database) WITH Aggregate_IO_Statistics AS (SELECT DB_NAME(database_id) AS [Database Name], CAST(SUM(num_of_bytes_read + num_of_bytes_written) / 1048576 AS DECIMAL(12, 2)) AS [ioTotalMB], @@ -935,7 +911,7 @@ ORDER BY [I/O Rank] OPTION (RECOMPILE); -- They include all I/O activity, not just the nominal I/O workload --- Get total buffer usage by database for current instance (Query 39) (Total Buffer Usage by Database) +-- Get total buffer usage by database for current instance (Query 37) (Total Buffer Usage by Database) -- This make take some time to run on a busy instance WITH AggregateBufferPoolUsage AS @@ -957,7 +933,7 @@ ORDER BY [Buffer Pool Rank] OPTION (RECOMPILE); -- Clear Wait Stats with this command -- DBCC SQLPERF('sys.dm_os_wait_stats', CLEAR); --- Isolate top waits for server instance since last restart or wait statistics clear (Query 40) (Top Waits) +-- Isolate top waits for server instance since last restart or wait statistics clear (Query 38) (Top Waits) WITH [Waits] AS (SELECT wait_type, wait_time_ms/ 1000.0 AS [WaitS], (wait_time_ms - signal_wait_time_ms) / 1000.0 AS [ResourceS], @@ -1029,7 +1005,7 @@ OPTION (RECOMPILE); --- Get a count of SQL connections by IP address (Query 41) (Connection Counts by IP Address) +-- Get a count of SQL connections by IP address (Query 39) (Connection Counts by IP Address) SELECT ec.client_net_address, es.[program_name], es.[host_name], es.login_name, COUNT(ec.session_id) AS [connection count] FROM sys.dm_exec_sessions AS es WITH (NOLOCK) @@ -1047,7 +1023,7 @@ ORDER BY ec.client_net_address, es.[program_name] OPTION (RECOMPILE); --- Get Average Task Counts (run multiple times) (Query 42) (Avg Task Counts) +-- Get Average Task Counts (run multiple times) (Query 40) (Avg Task Counts) SELECT AVG(current_tasks_count) AS [Avg Task Count], AVG(work_queue_count) AS [Avg Work Queue Count], AVG(runnable_tasks_count) AS [Avg Runnable Task Count], @@ -1068,7 +1044,7 @@ WHERE scheduler_id < 255 OPTION (RECOMPILE); --- Detect blocking (run multiple times) (Query 42) (Detect Blocking) +-- Detect blocking (run multiple times) (Query 41) (Detect Blocking) SELECT t1.resource_type AS [lock type], DB_NAME(resource_database_id) AS [database], t1.resource_associated_entity_id AS [blk object],t1.request_mode AS [lock req], -- lock requested t1.request_session_id AS [waiter sid], t2.wait_duration_ms AS [wait time], -- spid of waiter @@ -1097,7 +1073,7 @@ ON t1.lock_owner_address = t2.resource_address OPTION (RECOMPILE); --- Get CPU Utilization History for last 256 minutes (in one minute intervals) (Query 44) (CPU Utilization History) +-- Get CPU Utilization History for last 256 minutes (in one minute intervals) (Query 42) (CPU Utilization History) DECLARE @ts_now bigint = (SELECT cpu_ticks/(cpu_ticks/ms_ticks) FROM sys.dm_os_sys_info WITH (NOLOCK)); SELECT TOP(256) SQLProcessUtilization AS [SQL Server Process CPU Utilization], @@ -1122,7 +1098,7 @@ ORDER BY record_id DESC OPTION (RECOMPILE); -- on high core count (> 64 cores) systems --- Get top total worker time queries for entire instance (Query 45) (Top Worker Time Queries) +-- Get top total worker time queries for entire instance (Query 43) (Top Worker Time Queries) SELECT TOP(50) DB_NAME(t.[dbid]) AS [Database Name], REPLACE(REPLACE(LEFT(t.[text], 255), CHAR(10),''), CHAR(13),'') AS [Short Query Text], qs.total_worker_time AS [Total Worker Time], qs.min_worker_time AS [Min Worker Time], @@ -1150,7 +1126,7 @@ ORDER BY qs.total_worker_time DESC OPTION (RECOMPILE); --- Page Life Expectancy (PLE) value for each NUMA node in current instance (Query 46) (PLE by NUMA Node) +-- Page Life Expectancy (PLE) value for each NUMA node in current instance (Query 44) (PLE by NUMA Node) SELECT @@SERVERNAME AS [Server Name], RTRIM([object_name]) AS [Object Name], instance_name, cntr_value AS [Page Life Expectancy] FROM sys.dm_os_performance_counters WITH (NOLOCK) WHERE [object_name] LIKE N'%Buffer Node%' -- Handles named instances @@ -1165,7 +1141,7 @@ AND counter_name = N'Page life expectancy' OPTION (RECOMPILE); -- https://bit.ly/2EgynLa --- Memory Grants Pending value for current instance (Query 47) (Memory Grants Pending) +-- Memory Grants Pending value for current instance (Query 45) (Memory Grants Pending) SELECT @@SERVERNAME AS [Server Name], RTRIM([object_name]) AS [Object Name], cntr_value AS [Memory Grants Pending] FROM sys.dm_os_performance_counters WITH (NOLOCK) WHERE [object_name] LIKE N'%Memory Manager%' -- Handles named instances @@ -1176,7 +1152,7 @@ AND counter_name = N'Memory Grants Pending' OPTION (RECOMPILE); -- Memory Grants Pending above zero for a sustained period is a very strong indicator of internal memory pressure --- Memory Clerk Usage for instance (Query 48) (Memory Clerk Usage) +-- Memory Clerk Usage for instance (Query 46) (Memory Clerk Usage) -- Look for high value for CACHESTORE_SQLCP (Ad-hoc query plans) SELECT TOP(10) mc.[type] AS [Memory Clerk Type], CAST((SUM(mc.pages_kb)/1024.0) AS DECIMAL (15,2)) AS [Memory Usage (MB)] @@ -1198,7 +1174,7 @@ ORDER BY SUM(mc.pages_kb) DESC OPTION (RECOMPILE); --- Find single-use, ad-hoc and prepared queries that are bloating the plan cache (Query 49) (Ad hoc Queries) +-- Find single-use, ad-hoc and prepared queries that are bloating the plan cache (Query 47) (Ad hoc Queries) SELECT TOP(50) DB_NAME(t.[dbid]) AS [Database Name], t.[text] AS [Query Text], cp.objtype AS [Object Type], cp.cacheobjtype AS [Cache Object Type], cp.size_in_bytes/1024 AS [Plan Size in KB] @@ -1219,7 +1195,7 @@ ORDER BY cp.size_in_bytes DESC, DB_NAME(t.[dbid]) OPTION (RECOMPILE); -- https://bit.ly/2EfYOkl --- Get top total logical reads queries for entire instance (Query 50) (Top Logical Reads Queries) +-- Get top total logical reads queries for entire instance (Query 48) (Top Logical Reads Queries) SELECT TOP(50) DB_NAME(t.[dbid]) AS [Database Name], REPLACE(REPLACE(LEFT(t.[text], 255), CHAR(10),''), CHAR(13),'') AS [Short Query Text], qs.total_logical_reads AS [Total Logical Reads], @@ -1247,7 +1223,7 @@ ORDER BY qs.total_logical_reads DESC OPTION (RECOMPILE); -- Can also help track down parameter sniffing issues --- Get top average elapsed time queries for entire instance (Query 51) (Top Avg Elapsed Time Queries) +-- Get top average elapsed time queries for entire instance (Query 49) (Top Avg Elapsed Time Queries) SELECT TOP(50) DB_NAME(t.[dbid]) AS [Database Name], REPLACE(REPLACE(LEFT(t.[text], 255), CHAR(10),''), CHAR(13),'') AS [Short Query Text], qs.total_elapsed_time/qs.execution_count AS [Avg Elapsed Time], @@ -1277,7 +1253,7 @@ ORDER BY qs.total_elapsed_time/qs.execution_count DESC OPTION (RECOMPILE); --USE YourDatabaseName; -- make sure to change to an actual database on your instance, not the master system database --GO --- Individual File Sizes and space available for current database (Query 52) (File Sizes and Space) +-- Individual File Sizes and space available for current database (Query 50) (File Sizes and Space) SELECT f.name AS [File Name] , f.physical_name AS [Physical Name], CAST((f.size/128.0) AS DECIMAL(15,2)) AS [Total Size in MB], CAST(f.size/128.0 - CAST(FILEPROPERTY(f.name, 'SpaceUsed') AS int)/128.0 AS DECIMAL(15,2)) @@ -1293,7 +1269,7 @@ ORDER BY f.[file_id] OPTION (RECOMPILE); -- Make sure the transaction log is not full!! --- Log space usage for current database (Query 53) (Log Space Usage) +-- Log space usage for current database (Query 51) (Log Space Usage) SELECT DB_NAME(lsu.database_id) AS [Database Name], db.recovery_model_desc AS [Recovery Model], CAST(lsu.total_log_size_in_bytes/1048576.0 AS DECIMAL(10, 2)) AS [Total Log Space (MB)], CAST(lsu.used_log_space_in_bytes/1048576.0 AS DECIMAL(10, 2)) AS [Used Log Space (MB)], @@ -1309,19 +1285,19 @@ OPTION (RECOMPILE); -- Look at log file size and usage, along with the log reuse wait description for the current database --- I/O Statistics by file for the current database (Query 54) (IO Stats By File) +-- I/O Statistics by file for the current database (Query 52) (IO Stats By File) SELECT DB_NAME(DB_ID()) AS [Database Name], df.name AS [Logical Name], vfs.[file_id], df.type_desc, -df.physical_name AS [Physical Name], CAST(vfs.size_on_disk_bytes/1048576.0 AS DECIMAL(10, 2)) AS [Size on Disk (MB)], +df.physical_name AS [Physical Name], CAST(vfs.size_on_disk_bytes/1048576.0 AS DECIMAL(16, 2)) AS [Size on Disk (MB)], vfs.num_of_reads, vfs.num_of_writes, vfs.io_stall_read_ms, vfs.io_stall_write_ms, -CAST(100. * vfs.io_stall_read_ms/(vfs.io_stall_read_ms + vfs.io_stall_write_ms) AS DECIMAL(10,1)) AS [IO Stall Reads Pct], -CAST(100. * vfs.io_stall_write_ms/(vfs.io_stall_write_ms + vfs.io_stall_read_ms) AS DECIMAL(10,1)) AS [IO Stall Writes Pct], +CAST(100. * vfs.io_stall_read_ms/(vfs.io_stall_read_ms + vfs.io_stall_write_ms) AS DECIMAL(16,1)) AS [IO Stall Reads Pct], +CAST(100. * vfs.io_stall_write_ms/(vfs.io_stall_write_ms + vfs.io_stall_read_ms) AS DECIMAL(16,1)) AS [IO Stall Writes Pct], (vfs.num_of_reads + vfs.num_of_writes) AS [Writes + Reads], -CAST(vfs.num_of_bytes_read/1048576.0 AS DECIMAL(10, 2)) AS [MB Read], -CAST(vfs.num_of_bytes_written/1048576.0 AS DECIMAL(10, 2)) AS [MB Written], -CAST(100. * vfs.num_of_reads/(vfs.num_of_reads + vfs.num_of_writes) AS DECIMAL(10,1)) AS [# Reads Pct], -CAST(100. * vfs.num_of_writes/(vfs.num_of_reads + vfs.num_of_writes) AS DECIMAL(10,1)) AS [# Write Pct], -CAST(100. * vfs.num_of_bytes_read/(vfs.num_of_bytes_read + vfs.num_of_bytes_written) AS DECIMAL(10,1)) AS [Read Bytes Pct], -CAST(100. * vfs.num_of_bytes_written/(vfs.num_of_bytes_read + vfs.num_of_bytes_written) AS DECIMAL(10,1)) AS [Written Bytes Pct] +CAST(vfs.num_of_bytes_read/1048576.0 AS DECIMAL(16, 2)) AS [MB Read], +CAST(vfs.num_of_bytes_written/1048576.0 AS DECIMAL(16, 2)) AS [MB Written], +CAST(100. * vfs.num_of_reads/(vfs.num_of_reads + vfs.num_of_writes) AS DECIMAL(16,1)) AS [# Reads Pct], +CAST(100. * vfs.num_of_writes/(vfs.num_of_reads + vfs.num_of_writes) AS DECIMAL(16,1)) AS [# Write Pct], +CAST(100. * vfs.num_of_bytes_read/(vfs.num_of_bytes_read + vfs.num_of_bytes_written) AS DECIMAL(16,1)) AS [Read Bytes Pct], +CAST(100. * vfs.num_of_bytes_written/(vfs.num_of_bytes_read + vfs.num_of_bytes_written) AS DECIMAL(16,1)) AS [Written Bytes Pct] FROM sys.dm_io_virtual_file_stats(DB_ID(), NULL) AS vfs INNER JOIN sys.database_files AS df WITH (NOLOCK) ON vfs.[file_id]= df.[file_id] OPTION (RECOMPILE); @@ -1332,7 +1308,7 @@ ON vfs.[file_id]= df.[file_id] OPTION (RECOMPILE); --- Get most frequently executed queries for this database (Query 55) (Query Execution Counts) +-- Get most frequently executed queries for this database (Query 53) (Query Execution Counts) SELECT TOP(50) LEFT(t.[text], 50) AS [Short Query Text], qs.execution_count AS [Execution Count], qs.total_logical_reads AS [Total Logical Reads], qs.total_logical_reads/qs.execution_count AS [Avg Logical Reads], @@ -1353,7 +1329,7 @@ ORDER BY qs.execution_count DESC OPTION (RECOMPILE); -- Queries 54 through 59 are the "Bad Man List" for stored procedures --- Top Cached SPs By Execution Count (Query 56) (SP Execution Counts) +-- Top Cached SPs By Execution Count (Query 55) (SP Execution Counts) SELECT TOP(100) p.name AS [SP Name], qs.execution_count AS [Execution Count], ISNULL(qs.execution_count/DATEDIFF(Minute, qs.cached_time, GETDATE()), 0) AS [Calls/Minute], qs.total_elapsed_time/qs.execution_count AS [Avg Elapsed Time], @@ -1376,7 +1352,7 @@ ORDER BY qs.execution_count DESC OPTION (RECOMPILE); -- This helps you characterize and baseline your workload --- Top Cached SPs By Avg Elapsed Time (Query 57) (SP Avg Elapsed Time) +-- Top Cached SPs By Avg Elapsed Time (Query 56) (SP Avg Elapsed Time) SELECT TOP(25) p.name AS [SP Name], qs.min_elapsed_time, qs.total_elapsed_time/qs.execution_count AS [avg_elapsed_time], qs.max_elapsed_time, qs.last_elapsed_time, qs.total_elapsed_time, qs.execution_count, ISNULL(qs.execution_count/DATEDIFF(Minute, qs.cached_time, GETDATE()), 0) AS [Calls/Minute], @@ -1400,7 +1376,7 @@ ORDER BY avg_elapsed_time DESC OPTION (RECOMPILE); --- Top Cached SPs By Total Worker time. Worker time relates to CPU cost (Query 58) (SP Worker Time) +-- Top Cached SPs By Total Worker time. Worker time relates to CPU cost (Query 57) (SP Worker Time) SELECT TOP(25) p.name AS [SP Name], qs.total_worker_time AS [TotalWorkerTime], qs.total_worker_time/qs.execution_count AS [AvgWorkerTime], qs.execution_count, ISNULL(qs.execution_count/DATEDIFF(Minute, qs.cached_time, GETDATE()), 0) AS [Calls/Minute], @@ -1422,7 +1398,7 @@ ORDER BY qs.total_worker_time DESC OPTION (RECOMPILE); -- You should look at this if you see signs of CPU pressure --- Top Cached SPs By Total Logical Reads. Logical reads relate to memory pressure (Query 59) (SP Logical Reads) +-- Top Cached SPs By Total Logical Reads. Logical reads relate to memory pressure (Query 58) (SP Logical Reads) SELECT TOP(25) p.name AS [SP Name], qs.total_logical_reads AS [TotalLogicalReads], qs.total_logical_reads/qs.execution_count AS [AvgLogicalReads],qs.execution_count, ISNULL(qs.execution_count/DATEDIFF(Minute, qs.cached_time, GETDATE()), 0) AS [Calls/Minute], @@ -1444,7 +1420,7 @@ ORDER BY qs.total_logical_reads DESC OPTION (RECOMPILE); -- You should look at this if you see signs of memory pressure --- Top Cached SPs By Total Physical Reads. Physical reads relate to disk read I/O pressure (Query 60) (SP Physical Reads) +-- Top Cached SPs By Total Physical Reads. Physical reads relate to disk read I/O pressure (Query 59) (SP Physical Reads) SELECT TOP(25) p.name AS [SP Name],qs.total_physical_reads AS [TotalPhysicalReads], qs.total_physical_reads/qs.execution_count AS [AvgPhysicalReads], qs.execution_count, qs.total_logical_reads,qs.total_elapsed_time, qs.total_elapsed_time/qs.execution_count AS [avg_elapsed_time], @@ -1466,7 +1442,7 @@ ORDER BY qs.total_physical_reads DESC, qs.total_logical_reads DESC OPTION (RECOM --- Top Cached SPs By Total Logical Writes (Query 61) (SP Logical Writes) +-- Top Cached SPs By Total Logical Writes (Query 60) (SP Logical Writes) -- Logical writes relate to both memory and disk I/O pressure SELECT TOP(25) p.name AS [SP Name], qs.total_logical_writes AS [TotalLogicalWrites], qs.total_logical_writes/qs.execution_count AS [AvgLogicalWrites], qs.execution_count, @@ -1490,7 +1466,7 @@ ORDER BY qs.total_logical_writes DESC OPTION (RECOMPILE); -- You should look at this if you see signs of I/O pressure or of memory pressure --- Lists the top statements by average input/output usage for the current database (Query 62) (Top IO Statements) +-- Lists the top statements by average input/output usage for the current database (Query 61) (Top IO Statements) SELECT TOP(50) OBJECT_NAME(qt.objectid, dbid) AS [SP Name], (qs.total_logical_reads + qs.total_logical_writes) /qs.execution_count AS [Avg IO], qs.execution_count AS [Execution Count], SUBSTRING(qt.[text],qs.statement_start_offset/2, @@ -1509,7 +1485,7 @@ ORDER BY [Avg IO] DESC OPTION (RECOMPILE); --- Possible Bad NC Indexes (writes > reads) (Query 63) (Bad NC Indexes) +-- Possible Bad NC Indexes (writes > reads) (Query 62) (Bad NC Indexes) SELECT OBJECT_NAME(s.[object_id]) AS [Table Name], i.name AS [Index Name], i.index_id, i.is_disabled, i.is_hypothetical, i.has_filter, i.fill_factor, s.user_updates AS [Total Writes], s.user_seeks + s.user_scans + s.user_lookups AS [Total Reads], @@ -1531,7 +1507,7 @@ ORDER BY [Difference] DESC, [Total Writes] DESC, [Total Reads] ASC OPTION (RECOM -- Investigate further before dropping an index! --- Missing Indexes for current database by Index Advantage (Query 64) (Missing Indexes) +-- Missing Indexes for current database by Index Advantage (Query 63) (Missing Indexes) SELECT CONVERT(decimal(18,2), user_seeks * avg_total_user_cost * (avg_user_impact * 0.01)) AS [index_advantage], migs.last_user_seek, mid.[statement] AS [Database.Schema.Table], COUNT(1) OVER(PARTITION BY mid.[statement]) AS [missing_indexes_for_table], @@ -1557,7 +1533,7 @@ ORDER BY index_advantage DESC OPTION (RECOMPILE); -- Do not just blindly add indexes that show up from this query!!! --- Find missing index warnings for cached plans in the current database (Query 65) (Missing Index Warnings) +-- Find missing index warnings for cached plans in the current database (Query 64) (Missing Index Warnings) -- Note: This query could take some time on a busy instance SELECT TOP(25) OBJECT_NAME(objectid) AS [ObjectName], cp.objtype, cp.usecounts, cp.size_in_bytes, query_plan @@ -1572,7 +1548,7 @@ ORDER BY cp.usecounts DESC OPTION (RECOMPILE); -- This can help you decide whether to add them or not --- Breaks down buffers used by current database by object (table, index) in the buffer cache (Query 66) (Buffer Usage) +-- Breaks down buffers used by current database by object (table, index) in the buffer cache (Query 64) (Buffer Usage) -- Note: This query could take some time on a busy instance SELECT OBJECT_NAME(p.[object_id]) AS [Object Name], p.index_id, CAST(COUNT(*)/128.0 AS DECIMAL(10, 2)) AS [Buffer size(MB)], @@ -1596,31 +1572,32 @@ ORDER BY [BufferCount] DESC OPTION (RECOMPILE); -- It can help identify possible candidates for data compression --- Get Table names, row counts, and compression status for clustered index or heap (Query 67) (Table Sizes) -SELECT OBJECT_NAME(object_id) AS [ObjectName], -SUM(Rows) AS [RowCount], data_compression_desc AS [CompressionType] -FROM sys.partitions WITH (NOLOCK) +-- Get Table names, row counts, and compression status for clustered index or heap (Query 65) (Table Sizes) +SELECT SCHEMA_NAME(o.Schema_ID) AS [Schema Name], OBJECT_NAME(p.object_id) AS [ObjectName], +SUM(p.Rows) AS [RowCount], data_compression_desc AS [CompressionType] +FROM sys.partitions AS p WITH (NOLOCK) +INNER JOIN sys.objects AS o WITH (NOLOCK) +ON p.object_id = o.object_id WHERE index_id < 2 --ignore the partitions from the non-clustered index if any -AND OBJECT_NAME(object_id) NOT LIKE N'sys%' -AND OBJECT_NAME(object_id) NOT LIKE N'queue_%' -AND OBJECT_NAME(object_id) NOT LIKE N'filestream_tombstone%' -AND OBJECT_NAME(object_id) NOT LIKE N'fulltext%' -AND OBJECT_NAME(object_id) NOT LIKE N'ifts_comp_fragment%' -AND OBJECT_NAME(object_id) NOT LIKE N'filetable_updates%' -AND OBJECT_NAME(object_id) NOT LIKE N'xml_index_nodes%' -AND OBJECT_NAME(object_id) NOT LIKE N'sqlagent_job%' -AND OBJECT_NAME(object_id) NOT LIKE N'plan_persist%' -AND OBJECT_NAME(object_id) NOT LIKE N'persistent_version_store%' -AND OBJECT_NAME(object_id) NOT LIKE N'persistent_version_store_long_term%' -GROUP BY object_id, data_compression_desc -ORDER BY SUM(Rows) DESC OPTION (RECOMPILE); +AND OBJECT_NAME(p.object_id) NOT LIKE N'sys%' +AND OBJECT_NAME(p.object_id) NOT LIKE N'spt_%' +AND OBJECT_NAME(p.object_id) NOT LIKE N'queue_%' +AND OBJECT_NAME(p.object_id) NOT LIKE N'filestream_tombstone%' +AND OBJECT_NAME(p.object_id) NOT LIKE N'fulltext%' +AND OBJECT_NAME(p.object_id) NOT LIKE N'ifts_comp_fragment%' +AND OBJECT_NAME(p.object_id) NOT LIKE N'filetable_updates%' +AND OBJECT_NAME(p.object_id) NOT LIKE N'xml_index_nodes%' +AND OBJECT_NAME(p.object_id) NOT LIKE N'sqlagent_job%' +AND OBJECT_NAME(p.object_id) NOT LIKE N'plan_persist%' +GROUP BY SCHEMA_NAME(o.Schema_ID), p.object_id, data_compression_desc +ORDER BY SUM(p.Rows) DESC OPTION (RECOMPILE); ------ -- Gives you an idea of table sizes, and possible data compression opportunities --- Get some key table properties (Query 68) (Table Properties) +-- Get some key table properties (Query 66) (Table Properties) SELECT OBJECT_NAME(t.[object_id]) AS [ObjectName], p.[rows] AS [Table Rows], p.index_id, p.data_compression_desc AS [Index Data Compression], t.create_date, t.lock_on_bulk_load, t.is_replicated, t.has_replication_filter, @@ -1638,7 +1615,7 @@ ORDER BY OBJECT_NAME(t.[object_id]), p.index_id OPTION (RECOMPILE); --- When were Statistics last updated on all indexes? (Query 69) (Statistics Update) +-- When were Statistics last updated on all indexes? (Query 67) (Statistics Update) SELECT SCHEMA_NAME(o.Schema_ID) + N'.' + o.[NAME] AS [Object Name], o.[type_desc] AS [Object Type], i.[name] AS [Index Name], STATS_DATE(i.[object_id], i.index_id) AS [Statistics Date], s.auto_created, s.no_recompute, s.user_created, s.is_incremental, s.is_temporary, @@ -1668,7 +1645,7 @@ ORDER BY STATS_DATE(i.[object_id], i.index_id) DESC OPTION (RECOMPILE); --- Look at most frequently modified indexes and statistics (Query 70) (Volatile Indexes) +-- Look at most frequently modified indexes and statistics (Query 68) (Volatile Indexes) SELECT o.[name] AS [Object Name], o.[object_id], o.[type_desc], s.[name] AS [Statistics Name], s.stats_id, s.no_recompute, s.auto_created, s.is_incremental, s.is_temporary, sp.modification_counter, sp.[rows], sp.rows_sampled, sp.last_updated @@ -1686,7 +1663,7 @@ ORDER BY sp.modification_counter DESC, o.name OPTION (RECOMPILE); --- Get fragmentation info for all indexes above a certain size in the current database (Query 71) (Index Fragmentation) +-- Get fragmentation info for all indexes above a certain size in the current database (Query 69) (Index Fragmentation) -- Note: This query could take some time on a very large database SELECT DB_NAME(ps.database_id) AS [Database Name], SCHEMA_NAME(o.[schema_id]) AS [Schema Name], OBJECT_NAME(ps.OBJECT_ID) AS [Object Name], i.[name] AS [Index Name], ps.index_id, @@ -1708,7 +1685,7 @@ ORDER BY ps.avg_fragmentation_in_percent DESC OPTION (RECOMPILE); -- and how effective your index maintenance strategy is ---- Index Read/Write stats (all tables in current DB) ordered by Reads (Query 72) (Overall Index Usage - Reads) +--- Index Read/Write stats (all tables in current DB) ordered by Reads (Query 70) (Overall Index Usage - Reads) SELECT OBJECT_NAME(i.[object_id]) AS [ObjectName], i.[name] AS [IndexName], i.index_id, s.user_seeks, s.user_scans, s.user_lookups, s.user_seeks + s.user_scans + s.user_lookups AS [Total Reads], @@ -1727,7 +1704,7 @@ ORDER BY s.user_seeks + s.user_scans + s.user_lookups DESC OPTION (RECOMPILE); - -- Show which indexes in the current database are most active for Reads ---- Index Read/Write stats (all tables in current DB) ordered by Writes (Query 73) (Overall Index Usage - Writes) +--- Index Read/Write stats (all tables in current DB) ordered by Writes (Query 71) (Overall Index Usage - Writes) SELECT OBJECT_NAME(i.[object_id]) AS [ObjectName], i.[name] AS [IndexName], i.index_id, s.user_updates AS [Writes], s.user_seeks + s.user_scans + s.user_lookups AS [Total Reads], i.[type_desc] AS [Index Type], i.fill_factor AS [Fill Factor], i.has_filter, i.filter_definition, @@ -1744,7 +1721,7 @@ ORDER BY s.user_updates DESC OPTION (RECOMPILE); -- Order by writes -- Show which indexes in the current database are most active for Writes --- Get in-memory OLTP index usage (Query 74) (XTP Index Usage) +-- Get in-memory OLTP index usage (Query 72) (XTP Index Usage) SELECT OBJECT_NAME(i.[object_id]) AS [Object Name], i.index_id, i.[name] AS [Index Name], i.[type_desc], xis.scans_started, xis.scans_retries, xis.rows_touched, xis.rows_returned @@ -1762,7 +1739,7 @@ ORDER BY OBJECT_NAME(i.[object_id]) OPTION (RECOMPILE); -- https://bit.ly/2GCP8lF --- Get lock waits for current database (Query 75) (Lock Waits) +-- Get lock waits for current database (Query 73) (Lock Waits) SELECT o.name AS [table_name], i.name AS [index_name], ios.index_id, ios.partition_number, SUM(ios.row_lock_wait_count) AS [total_row_lock_waits], SUM(ios.row_lock_wait_in_ms) AS [total_row_lock_wait_in_ms], @@ -1784,7 +1761,7 @@ ORDER BY total_lock_wait_in_ms DESC OPTION (RECOMPILE); -- This query is helpful for troubleshooting blocking and deadlocking issues --- Get input buffer information for the current database (Query 76) (Input Buffer) +-- Get input buffer information for the current database (Query 74) (Input Buffer) SELECT es.session_id, DB_NAME(es.database_id) AS [Database Name], es.login_time, es.cpu_time, es.logical_reads, es.[status], ib.event_info AS [Input Buffer] @@ -1802,7 +1779,7 @@ AND es.session_id <> @@SPID OPTION (RECOMPILE); -- https://bit.ly/2uHKMbz --- Look at recent Full backups for the current database (Query 77) (Recent Full Backups) +-- Look at recent Full backups for the current database (Query 75) (Recent Full Backups) SELECT TOP (30) bs.machine_name, bs.server_name, bs.database_name AS [Database Name], bs.recovery_model, CONVERT (BIGINT, bs.backup_size / 1048576 ) AS [Uncompressed Backup Size (MB)], CONVERT (BIGINT, bs.compressed_backup_size / 1048576 ) AS [Compressed Backup Size (MB)], @@ -1826,7 +1803,10 @@ ORDER BY bs.backup_finish_date DESC OPTION (RECOMPILE); -- Have you done any backup tuning with striped backups, or changing the parameters of the backup command? --- These four Pluralsight Courses go into more detail about how to run these queries and interpret the results +-- These five Pluralsight Courses go into more detail about how to run these queries and interpret the results + +-- SQL Server 2017: Diagnosing Performance Issues with DMVs +-- https://bit.ly/2FqCeti -- SQL Server 2017: Diagnosing Configuration Issues with DMVs -- https://bit.ly/2MSUDUL diff --git a/bin/diagnosticquery/SQLServerDiagnosticQueries_2016SP2_201810.sql b/bin/diagnosticquery/SQLServerDiagnosticQueries_2016SP2_201901.sql similarity index 90% rename from bin/diagnosticquery/SQLServerDiagnosticQueries_2016SP2_201810.sql rename to bin/diagnosticquery/SQLServerDiagnosticQueries_2016SP2_201901.sql index d57e0ad663..ca6d2ba9de 100644 --- a/bin/diagnosticquery/SQLServerDiagnosticQueries_2016SP2_201810.sql +++ b/bin/diagnosticquery/SQLServerDiagnosticQueries_2016SP2_201901.sql @@ -1,7 +1,7 @@ -- SQL Server 2016 SP2 Diagnostic Information Queries -- Glenn Berry --- Last Modified: November 14, 2018 +-- Last Modified: March 9, 2019 -- https://www.sqlskills.com/blogs/glenn/ -- http://sqlserverperformance.wordpress.com/ -- Twitter: GlennAlanBerry @@ -23,7 +23,7 @@ --****************************************************************************** ---* Copyright (C) 2018 Glenn Berry, SQLskills.com +--* Copyright (C) 2019 Glenn Berry, SQLskills.com --* All rights reserved. --* --* For more scripts and sample code, check out @@ -68,7 +68,8 @@ SELECT @@SERVERNAME AS [Server Name], @@VERSION AS [SQL Server and OS Version In -- 13.0.5149.0 SP2 CU1 5/30/2018 https://support.microsoft.com/en-us/help/4135048/cumulative-update-1-for-sql-server-2016-sp2 -- 13.0.5153.0 SP2 CU2 7/16/2018 https://support.microsoft.com/en-us/help/4340355 -- 13.0.5216.0 SP2 CU3 9/20/2018 https://support.microsoft.com/en-us/help/4458871 --- 13.0.5233.0 SP2 CU4 11/13/2018 https://support.microsoft.com/en-us/help/4464106/cumulative-update-4-for-sql-server-2016-sp2 +-- 13.0.5233.0 SP2 CU4 11/13/2018 https://support.microsoft.com/en-us/help/4464106/cumulative-update-4-for-sql-server-2016-sp2 +-- 13.0.5264.1 SP2 CU5 1/23/2019 https://support.microsoft.com/en-us/help/4475776/cumulative-update-5-for-sql-server-2016-sp2 @@ -201,7 +202,8 @@ DBCC TRACESTATUS (-1); -- DBCC TRACEON - Trace Flags (Transact-SQL) -- https://bit.ly/2FuSvPg - +-- Recommended updates and configuration options for SQL Server 2017 and 2016 with high-performance workloads +-- https://bit.ly/2VVRGTY @@ -527,38 +529,8 @@ EXEC sys.xp_instance_regread N'HKEY_LOCAL_MACHINE', N'HARDWARE\DESCRIPTION\Syste --- See if buffer pool extension (BPE) is enabled (Query 23) (BPE Configuration) -SELECT [path], state_description, current_size_in_kb, -CAST(current_size_in_kb/1048576.0 AS DECIMAL(10,2)) AS [Size (GB)] -FROM sys.dm_os_buffer_pool_extension_configuration WITH (NOLOCK) OPTION (RECOMPILE); ------- - --- BPE is available in both Standard Edition and Enterprise Edition --- It is a more interesting feature for Standard Edition - --- Buffer Pool Extension to SSDs in SQL Server 2014 --- https://bit.ly/1bm08m8 - --- Buffer Pool Extension --- https://bit.ly/2oBuieO - - --- Look at buffer descriptors to see BPE usage by database (Query 24) (BPE Usage) -SELECT DB_NAME(database_id) AS [Database Name], COUNT(page_id) AS [Page Count], -CAST(COUNT(*)/128.0 AS DECIMAL(10, 2)) AS [Buffer size(MB)], -AVG(read_microsec) AS [Avg Read Time (microseconds)] -FROM sys.dm_os_buffer_descriptors WITH (NOLOCK) -WHERE database_id <> 32767 -AND is_in_bpool_extension = 1 -GROUP BY DB_NAME(database_id) -ORDER BY [Buffer size(MB)] DESC OPTION (RECOMPILE); ------- - --- You will see no results if BPE is not enabled or if there is no BPE usage - - --- Get information on location, time and size of any memory dumps from SQL Server (Query 25) (Memory Dump Info) +-- Get information on location, time and size of any memory dumps from SQL Server (Query 23) (Memory Dump Info) SELECT [filename], creation_time, size_in_bytes/1048576.0 AS [Size (MB)] FROM sys.dm_server_memory_dumps WITH (NOLOCK) ORDER BY creation_time DESC OPTION (RECOMPILE); @@ -572,7 +544,7 @@ ORDER BY creation_time DESC OPTION (RECOMPILE); --- Look at Suspect Pages table (Query 26) (Suspect Pages) +-- Look at Suspect Pages table (Query 24) (Suspect Pages) SELECT DB_NAME(database_id) AS [Database Name], [file_id], page_id, event_type, error_count, last_update_date FROM msdb.dbo.suspect_pages WITH (NOLOCK) @@ -595,7 +567,7 @@ ORDER BY database_id OPTION (RECOMPILE); -- https://bit.ly/2Fvr1c9 --- Get number of data files in tempdb database (Query 27) (TempDB Data Files) +-- Get number of data files in tempdb database (Query 25) (TempDB Data Files) EXEC sys.xp_readerrorlog 0, 1, N'The tempdb database has'; ------ @@ -604,7 +576,7 @@ EXEC sys.xp_readerrorlog 0, 1, N'The tempdb database has'; -- This query will return no results if your error log has been recycled since the instance was last started --- File names and paths for all user and system databases on instance (Query 28) (Database Filenames and Paths) +-- File names and paths for all user and system databases on instance (Query 26) (Database Filenames and Paths) SELECT DB_NAME([database_id]) AS [Database Name], [file_id], [name], physical_name, [type_desc], state_desc, is_percent_growth, growth, @@ -625,7 +597,7 @@ ORDER BY DB_NAME([database_id]), [file_id] OPTION (RECOMPILE); --- Volume info for all LUNS that have database files on the current instance (Query 29) (Volume Info) +-- Volume info for all LUNS that have database files on the current instance (Query 27) (Volume Info) SELECT DISTINCT vs.volume_mount_point, vs.file_system_type, vs.logical_volume_name, CONVERT(DECIMAL(18,2), vs.total_bytes/1073741824.0) AS [Total Size (GB)], CONVERT(DECIMAL(18,2), vs.available_bytes/1073741824.0) AS [Available Size (GB)], @@ -645,7 +617,7 @@ ORDER BY vs.volume_mount_point OPTION (RECOMPILE); --- Drive level latency information (Query 30) (Drive Level Latency) +-- Drive level latency information (Query 28) (Drive Level Latency) -- Based on code from Jimmy May SELECT tab.[Drive], tab.volume_mount_point AS [Volume Mount Point], CASE @@ -690,7 +662,7 @@ ORDER BY [Overall Latency] OPTION (RECOMPILE); -- database files on each drive since SQL Server was last started --- Calculates average stalls per read, per write, and per total input/output for each database file (Query 31) (IO Latency by File) +-- Calculates average stalls per read, per write, and per total input/output for each database file (Query 29) (IO Latency by File) SELECT DB_NAME(fs.database_id) AS [Database Name], CAST(fs.io_stall_read_ms/(1.0 + fs.num_of_reads) AS NUMERIC(10,1)) AS [avg_read_latency_ms], CAST(fs.io_stall_write_ms/(1.0 + fs.num_of_writes) AS NUMERIC(10,1)) AS [avg_write_latency_ms], CAST((fs.io_stall_read_ms + fs.io_stall_write_ms)/(1.0 + fs.num_of_reads + fs.num_of_writes) AS NUMERIC(10,1)) AS [avg_io_latency_ms], @@ -711,7 +683,7 @@ ORDER BY avg_io_latency_ms DESC OPTION (RECOMPILE); -- database file since SQL Server was last started --- Look for I/O requests taking longer than 15 seconds in the six most recent SQL Server Error Logs (Query 32) (IO Warnings) +-- Look for I/O requests taking longer than 15 seconds in the six most recent SQL Server Error Logs (Query 30) (IO Warnings) CREATE TABLE #IOWarningResults(LogDate datetime, ProcessInfo sysname, LogText nvarchar(1000)); INSERT INTO #IOWarningResults @@ -748,7 +720,7 @@ DROP TABLE #IOWarningResults; --- Resource Governor Resource Pool information (Query 33) (RG Resource Pools) +-- Resource Governor Resource Pool information (Query 31) (RG Resource Pools) SELECT pool_id, [Name], statistics_start_time, min_memory_percent, max_memory_percent, max_memory_kb/1024 AS [max_memory_mb], @@ -764,7 +736,7 @@ OPTION (RECOMPILE); --- Recovery model, log reuse wait description, log file size, log usage size (Query 34) (Database Properties) +-- Recovery model, log reuse wait description, log file size, log usage size (Query 32) (Database Properties) -- and compatibility level for all databases on instance SELECT db.[name] AS [Database Name], SUSER_SNAME(db.owner_sid) AS [Database Owner], db.recovery_model_desc AS [Recovery Model], db.state_desc, db.containment_desc, db.log_reuse_wait_desc AS [Log Reuse Wait Description], @@ -815,7 +787,7 @@ ORDER BY db.[name] OPTION (RECOMPILE); -- https://bit.ly/2pdggk3 --- Missing Indexes for all databases by Index Advantage (Query 35) (Missing Indexes All Databases) +-- Missing Indexes for all databases by Index Advantage (Query 33) (Missing Indexes All Databases) SELECT CONVERT(decimal(18,2), user_seeks * avg_total_user_cost * (avg_user_impact * 0.01)) AS [index_advantage], FORMAT(migs.last_user_seek, 'yyyy-MM-dd HH:mm:ss') AS [last_user_seek], mid.[statement] AS [Database.Schema.Table], @@ -843,7 +815,7 @@ ORDER BY index_advantage DESC OPTION (RECOMPILE); --- Get VLF Counts for all databases on the instance (Query 36) (VLF Counts) +-- Get VLF Counts for all databases on the instance (Query 34) (VLF Counts) SELECT [name] AS [Database Name], [VLF Count] FROM sys.databases AS db WITH (NOLOCK) CROSS APPLY (SELECT file_id, COUNT(*) AS [VLF Count] @@ -864,7 +836,7 @@ ORDER BY [VLF Count] DESC OPTION (RECOMPILE); --- Get CPU utilization by database (Query 37) (CPU Usage by Database) +-- Get CPU utilization by database (Query 35) (CPU Usage by Database) WITH DB_CPU_Stats AS (SELECT pa.DatabaseID, DB_Name(pa.DatabaseID) AS [Database Name], SUM(qs.total_worker_time/1000) AS [CPU_Time_Ms] @@ -882,9 +854,10 @@ ORDER BY [CPU Rank] OPTION (RECOMPILE); ------ -- Helps determine which database is using the most CPU resources on the instance +-- Note: This only reflects CPU usage from the currently cached query plans --- Get I/O utilization by database (Query 38) (IO Usage By Database) +-- Get I/O utilization by database (Query 36) (IO Usage By Database) WITH Aggregate_IO_Statistics AS (SELECT DB_NAME(database_id) AS [Database Name], CAST(SUM(num_of_bytes_read + num_of_bytes_written) / 1048576 AS DECIMAL(12, 2)) AS [ioTotalMB], @@ -908,7 +881,7 @@ ORDER BY [I/O Rank] OPTION (RECOMPILE); -- They include all I/O activity, not just the nominal I/O workload --- Get total buffer usage by database for current instance (Query 39) (Total Buffer Usage by Database) +-- Get total buffer usage by database for current instance (Query 37) (Total Buffer Usage by Database) -- This make take some time to run on a busy instance WITH AggregateBufferPoolUsage AS @@ -927,7 +900,7 @@ ORDER BY [Buffer Pool Rank] OPTION (RECOMPILE); -- is being used by each database on the instance --- Get tempdb version store space usage by database (Query 40) (Version Store Space Usage) +-- Get tempdb version store space usage by database (Query 38) (Version Store Space Usage) SELECT DB_NAME(database_id) AS [Database Name], reserved_page_count AS [Version Store Reserved Page Count], reserved_space_kb/1024 AS [Version Store Reserved Space (MB)] @@ -944,7 +917,7 @@ ORDER BY reserved_space_kb/1024 DESC OPTION (RECOMPILE); -- Clear Wait Stats with this command -- DBCC SQLPERF('sys.dm_os_wait_stats', CLEAR); --- Isolate top waits for server instance since last restart or wait statistics clear (Query 41) (Top Waits) +-- Isolate top waits for server instance since last restart or wait statistics clear (Query 39) (Top Waits) WITH [Waits] AS (SELECT wait_type, wait_time_ms/ 1000.0 AS [WaitS], (wait_time_ms - signal_wait_time_ms) / 1000.0 AS [ResourceS], @@ -1027,7 +1000,7 @@ OPTION (RECOMPILE); --- Get a count of SQL connections by IP address (Query 42) (Connection Counts by IP Address) +-- Get a count of SQL connections by IP address (Query 40) (Connection Counts by IP Address) SELECT ec.client_net_address, es.[program_name], es.[host_name], es.login_name, COUNT(ec.session_id) AS [connection count] FROM sys.dm_exec_sessions AS es WITH (NOLOCK) @@ -1045,7 +1018,7 @@ ORDER BY ec.client_net_address, es.[program_name] OPTION (RECOMPILE); --- Get Average Task Counts (run multiple times) (Query 43) (Avg Task Counts) +-- Get Average Task Counts (run multiple times) (Query 41) (Avg Task Counts) SELECT AVG(current_tasks_count) AS [Avg Task Count], AVG(work_queue_count) AS [Avg Work Queue Count], AVG(runnable_tasks_count) AS [Avg Runnable Task Count], @@ -1066,7 +1039,7 @@ WHERE scheduler_id < 255 OPTION (RECOMPILE); --- Detect blocking (run multiple times) (Query 44) (Detect Blocking) +-- Detect blocking (run multiple times) (Query 42) (Detect Blocking) SELECT t1.resource_type AS [lock type], DB_NAME(resource_database_id) AS [database], t1.resource_associated_entity_id AS [blk object],t1.request_mode AS [lock req], -- lock requested t1.request_session_id AS [waiter sid], t2.wait_duration_ms AS [wait time], -- spid of waiter @@ -1095,7 +1068,7 @@ ON t1.lock_owner_address = t2.resource_address OPTION (RECOMPILE); --- Get CPU Utilization History for last 256 minutes (in one minute intervals) (Query 45) (CPU Utilization History) +-- Get CPU Utilization History for last 256 minutes (in one minute intervals) (Query 43) (CPU Utilization History) DECLARE @ts_now bigint = (SELECT cpu_ticks/(cpu_ticks/ms_ticks) FROM sys.dm_os_sys_info WITH (NOLOCK)); SELECT TOP(256) SQLProcessUtilization AS [SQL Server Process CPU Utilization], @@ -1120,7 +1093,7 @@ ORDER BY record_id DESC OPTION (RECOMPILE); -- on high core count (> 64 cores) systems --- Get top total worker time queries for entire instance (Query 46) (Top Worker Time Queries) +-- Get top total worker time queries for entire instance (Query 44) (Top Worker Time Queries) SELECT TOP(50) DB_NAME(t.[dbid]) AS [Database Name], REPLACE(REPLACE(LEFT(t.[text], 255), CHAR(10),''), CHAR(13),'') AS [Short Query Text], qs.total_worker_time AS [Total Worker Time], qs.min_worker_time AS [Min Worker Time], @@ -1148,7 +1121,7 @@ ORDER BY qs.total_worker_time DESC OPTION (RECOMPILE); --- Page Life Expectancy (PLE) value for each NUMA node in current instance (Query 47) (PLE by NUMA Node) +-- Page Life Expectancy (PLE) value for each NUMA node in current instance (Query 45) (PLE by NUMA Node) SELECT @@SERVERNAME AS [Server Name], RTRIM([object_name]) AS [Object Name], instance_name, cntr_value AS [Page Life Expectancy] FROM sys.dm_os_performance_counters WITH (NOLOCK) WHERE [object_name] LIKE N'%Buffer Node%' -- Handles named instances @@ -1163,7 +1136,7 @@ AND counter_name = N'Page life expectancy' OPTION (RECOMPILE); -- https://bit.ly/2EgynLa --- Memory Grants Pending value for current instance (Query 48) (Memory Grants Pending) +-- Memory Grants Pending value for current instance (Query 46) (Memory Grants Pending) SELECT @@SERVERNAME AS [Server Name], RTRIM([object_name]) AS [Object Name], cntr_value AS [Memory Grants Pending] FROM sys.dm_os_performance_counters WITH (NOLOCK) WHERE [object_name] LIKE N'%Memory Manager%' -- Handles named instances @@ -1174,7 +1147,7 @@ AND counter_name = N'Memory Grants Pending' OPTION (RECOMPILE); -- Memory Grants Pending above zero for a sustained period is a very strong indicator of internal memory pressure --- Memory Clerk Usage for instance (Query 49) (Memory Clerk Usage) +-- Memory Clerk Usage for instance (Query 47) (Memory Clerk Usage) -- Look for high value for CACHESTORE_SQLCP (Ad-hoc query plans) SELECT TOP(10) mc.[type] AS [Memory Clerk Type], CAST((SUM(mc.pages_kb)/1024.0) AS DECIMAL (15,2)) AS [Memory Usage (MB)] @@ -1199,7 +1172,7 @@ ORDER BY SUM(mc.pages_kb) DESC OPTION (RECOMPILE); --- Find single-use, ad-hoc and prepared queries that are bloating the plan cache (Query 50) (Ad hoc Queries) +-- Find single-use, ad-hoc and prepared queries that are bloating the plan cache (Query 48) (Ad hoc Queries) SELECT TOP(50) DB_NAME(t.[dbid]) AS [Database Name], t.[text] AS [Query Text], cp.objtype AS [Object Type], cp.cacheobjtype AS [Cache Object Type], cp.size_in_bytes/1024 AS [Plan Size in KB] @@ -1220,7 +1193,7 @@ ORDER BY cp.size_in_bytes DESC, DB_NAME(t.[dbid]) OPTION (RECOMPILE); -- https://bit.ly/2EfYOkl --- Get top total logical reads queries for entire instance (Query 51) (Top Logical Reads Queries) +-- Get top total logical reads queries for entire instance (Query 49) (Top Logical Reads Queries) SELECT TOP(50) DB_NAME(t.[dbid]) AS [Database Name], REPLACE(REPLACE(LEFT(t.[text], 255), CHAR(10),''), CHAR(13),'') AS [Short Query Text], qs.total_logical_reads AS [Total Logical Reads], @@ -1248,7 +1221,7 @@ ORDER BY qs.total_logical_reads DESC OPTION (RECOMPILE); -- Can also help track down parameter sniffing issues --- Get top average elapsed time queries for entire instance (Query 52) (Top Avg Elapsed Time Queries) +-- Get top average elapsed time queries for entire instance (Query 50) (Top Avg Elapsed Time Queries) SELECT TOP(50) DB_NAME(t.[dbid]) AS [Database Name], REPLACE(REPLACE(LEFT(t.[text], 255), CHAR(10),''), CHAR(13),'') AS [Short Query Text], qs.total_elapsed_time/qs.execution_count AS [Avg Elapsed Time], @@ -1270,7 +1243,7 @@ ORDER BY qs.total_elapsed_time/qs.execution_count DESC OPTION (RECOMPILE); -- Can also help track down parameter sniffing issues --- Look at UDF execution statistics (Query 53) (UDF Stats by DB) +-- Look at UDF execution statistics (Query 51) (UDF Stats by DB) SELECT TOP (25) DB_NAME(database_id) AS [Database Name], OBJECT_NAME(object_id, database_id) AS [Function Name], total_worker_time, execution_count, total_elapsed_time, @@ -1291,7 +1264,7 @@ ORDER BY total_worker_time DESC OPTION (RECOMPILE); --USE YourDatabaseName; -- make sure to change to an actual database on your instance, not the master system database --GO --- Individual File Sizes and space available for current database (Query 54) (File Sizes and Space) +-- Individual File Sizes and space available for current database (Query 52) (File Sizes and Space) SELECT f.name AS [File Name] , f.physical_name AS [Physical Name], CAST((f.size/128.0) AS DECIMAL(15,2)) AS [Total Size in MB], CAST(f.size/128.0 - CAST(FILEPROPERTY(f.name, 'SpaceUsed') AS int)/128.0 AS DECIMAL(15,2)) @@ -1313,7 +1286,7 @@ ORDER BY f.[file_id] OPTION (RECOMPILE); -- https://bit.ly/2evRZSR --- Log space usage for current database (Query 55) (Log Space Usage) +-- Log space usage for current database (Query 53) (Log Space Usage) SELECT DB_NAME(lsu.database_id) AS [Database Name], db.recovery_model_desc AS [Recovery Model], CAST(lsu.total_log_size_in_bytes/1048576.0 AS DECIMAL(10, 2)) AS [Total Log Space (MB)], CAST(lsu.used_log_space_in_bytes/1048576.0 AS DECIMAL(10, 2)) AS [Used Log Space (MB)], @@ -1332,7 +1305,7 @@ OPTION (RECOMPILE); -- https://bit.ly/2H4MQw9 --- Status of last VLF for current database (Query 56) (Last VLF Status) +-- Status of last VLF for current database (Query 54) (Last VLF Status) SELECT TOP(1) DB_NAME(li.database_id) AS [Database Name], li.[file_id], li.vlf_size_mb, li.vlf_sequence_number, li.vlf_active, li.vlf_status FROM sys.dm_db_log_info(DB_ID()) AS li @@ -1351,7 +1324,7 @@ ORDER BY vlf_sequence_number DESC OPTION (RECOMPILE); --- Get database scoped configuration values for current database (Query 57) (Database-scoped Configurations) +-- Get database scoped configuration values for current database (Query 55) (Database-scoped Configurations) SELECT configuration_id, name, [value] AS [value_for_primary], value_for_secondary FROM sys.database_scoped_configurations WITH (NOLOCK) OPTION (RECOMPILE); ------ @@ -1365,19 +1338,19 @@ FROM sys.database_scoped_configurations WITH (NOLOCK) OPTION (RECOMPILE); -- https://bit.ly/2sOH7nb --- I/O Statistics by file for the current database (Query 58) (IO Stats By File) +-- I/O Statistics by file for the current database (Query 56) (IO Stats By File) SELECT DB_NAME(DB_ID()) AS [Database Name], df.name AS [Logical Name], vfs.[file_id], df.type_desc, -df.physical_name AS [Physical Name], CAST(vfs.size_on_disk_bytes/1048576.0 AS DECIMAL(10, 2)) AS [Size on Disk (MB)], +df.physical_name AS [Physical Name], CAST(vfs.size_on_disk_bytes/1048576.0 AS DECIMAL(16, 2)) AS [Size on Disk (MB)], vfs.num_of_reads, vfs.num_of_writes, vfs.io_stall_read_ms, vfs.io_stall_write_ms, -CAST(100. * vfs.io_stall_read_ms/(vfs.io_stall_read_ms + vfs.io_stall_write_ms) AS DECIMAL(10,1)) AS [IO Stall Reads Pct], -CAST(100. * vfs.io_stall_write_ms/(vfs.io_stall_write_ms + vfs.io_stall_read_ms) AS DECIMAL(10,1)) AS [IO Stall Writes Pct], +CAST(100. * vfs.io_stall_read_ms/(vfs.io_stall_read_ms + vfs.io_stall_write_ms) AS DECIMAL(16,1)) AS [IO Stall Reads Pct], +CAST(100. * vfs.io_stall_write_ms/(vfs.io_stall_write_ms + vfs.io_stall_read_ms) AS DECIMAL(16,1)) AS [IO Stall Writes Pct], (vfs.num_of_reads + vfs.num_of_writes) AS [Writes + Reads], -CAST(vfs.num_of_bytes_read/1048576.0 AS DECIMAL(10, 2)) AS [MB Read], -CAST(vfs.num_of_bytes_written/1048576.0 AS DECIMAL(10, 2)) AS [MB Written], -CAST(100. * vfs.num_of_reads/(vfs.num_of_reads + vfs.num_of_writes) AS DECIMAL(10,1)) AS [# Reads Pct], -CAST(100. * vfs.num_of_writes/(vfs.num_of_reads + vfs.num_of_writes) AS DECIMAL(10,1)) AS [# Write Pct], -CAST(100. * vfs.num_of_bytes_read/(vfs.num_of_bytes_read + vfs.num_of_bytes_written) AS DECIMAL(10,1)) AS [Read Bytes Pct], -CAST(100. * vfs.num_of_bytes_written/(vfs.num_of_bytes_read + vfs.num_of_bytes_written) AS DECIMAL(10,1)) AS [Written Bytes Pct] +CAST(vfs.num_of_bytes_read/1048576.0 AS DECIMAL(16, 2)) AS [MB Read], +CAST(vfs.num_of_bytes_written/1048576.0 AS DECIMAL(16, 2)) AS [MB Written], +CAST(100. * vfs.num_of_reads/(vfs.num_of_reads + vfs.num_of_writes) AS DECIMAL(16,1)) AS [# Reads Pct], +CAST(100. * vfs.num_of_writes/(vfs.num_of_reads + vfs.num_of_writes) AS DECIMAL(16,1)) AS [# Write Pct], +CAST(100. * vfs.num_of_bytes_read/(vfs.num_of_bytes_read + vfs.num_of_bytes_written) AS DECIMAL(16,1)) AS [Read Bytes Pct], +CAST(100. * vfs.num_of_bytes_written/(vfs.num_of_bytes_read + vfs.num_of_bytes_written) AS DECIMAL(16,1)) AS [Written Bytes Pct] FROM sys.dm_io_virtual_file_stats(DB_ID(), NULL) AS vfs INNER JOIN sys.database_files AS df WITH (NOLOCK) ON vfs.[file_id]= df.[file_id] OPTION (RECOMPILE); @@ -1388,7 +1361,7 @@ ON vfs.[file_id]= df.[file_id] OPTION (RECOMPILE); --- Get most frequently executed queries for this database (Query 59) (Query Execution Counts) +-- Get most frequently executed queries for this database (Query 57) (Query Execution Counts) SELECT TOP(50) LEFT(t.[text], 50) AS [Short Query Text], qs.execution_count AS [Execution Count], qs.total_logical_reads AS [Total Logical Reads], qs.total_logical_reads/qs.execution_count AS [Avg Logical Reads], @@ -1409,7 +1382,7 @@ ORDER BY qs.execution_count DESC OPTION (RECOMPILE); -- Queries 60 through 65 are the "Bad Man List" for stored procedures --- Top Cached SPs By Execution Count (Query 60) (SP Execution Counts) +-- Top Cached SPs By Execution Count (Query 58) (SP Execution Counts) SELECT TOP(100) p.name AS [SP Name], qs.execution_count AS [Execution Count], ISNULL(qs.execution_count/DATEDIFF(Minute, qs.cached_time, GETDATE()), 0) AS [Calls/Minute], qs.total_elapsed_time/qs.execution_count AS [Avg Elapsed Time], @@ -1432,12 +1405,13 @@ ORDER BY qs.execution_count DESC OPTION (RECOMPILE); -- This helps you characterize and baseline your workload --- Top Cached SPs By Avg Elapsed Time (Query 61) (SP Avg Elapsed Time) +-- Top Cached SPs By Avg Elapsed Time (Query 59) (SP Avg Elapsed Time) SELECT TOP(25) p.name AS [SP Name], qs.min_elapsed_time, qs.total_elapsed_time/qs.execution_count AS [avg_elapsed_time], qs.max_elapsed_time, qs.last_elapsed_time, qs.total_elapsed_time, qs.execution_count, ISNULL(qs.execution_count/DATEDIFF(Minute, qs.cached_time, GETDATE()), 0) AS [Calls/Minute], qs.total_worker_time/qs.execution_count AS [AvgWorkerTime], qs.total_worker_time AS [TotalWorkerTime], +CASE WHEN CONVERT(nvarchar(max), qp.query_plan) LIKE N'%%' THEN 1 ELSE 0 END AS [Has Missing Index], FORMAT(qs.last_execution_time, 'yyyy-MM-dd HH:mm:ss', 'en-US') AS [Last Execution Time], FORMAT(qs.cached_time, 'yyyy-MM-dd HH:mm:ss', 'en-US') AS [Plan Cached Time] -- ,qp.query_plan AS [Query Plan] -- Uncomment if you want the Query Plan @@ -1455,7 +1429,7 @@ ORDER BY avg_elapsed_time DESC OPTION (RECOMPILE); --- Top Cached SPs By Total Worker time. Worker time relates to CPU cost (Query 62) (SP Worker Time) +-- Top Cached SPs By Total Worker time. Worker time relates to CPU cost (Query 60) (SP Worker Time) SELECT TOP(25) p.name AS [SP Name], qs.total_worker_time AS [TotalWorkerTime], qs.total_worker_time/qs.execution_count AS [AvgWorkerTime], qs.execution_count, ISNULL(qs.execution_count/DATEDIFF(Minute, qs.cached_time, GETDATE()), 0) AS [Calls/Minute], @@ -1477,7 +1451,7 @@ ORDER BY qs.total_worker_time DESC OPTION (RECOMPILE); -- You should look at this if you see signs of CPU pressure --- Top Cached SPs By Total Logical Reads. Logical reads relate to memory pressure (Query 63) (SP Logical Reads) +-- Top Cached SPs By Total Logical Reads. Logical reads relate to memory pressure (Query 61) (SP Logical Reads) SELECT TOP(25) p.name AS [SP Name], qs.total_logical_reads AS [TotalLogicalReads], qs.total_logical_reads/qs.execution_count AS [AvgLogicalReads],qs.execution_count, ISNULL(qs.execution_count/DATEDIFF(Minute, qs.cached_time, GETDATE()), 0) AS [Calls/Minute], @@ -1499,7 +1473,7 @@ ORDER BY qs.total_logical_reads DESC OPTION (RECOMPILE); -- You should look at this if you see signs of memory pressure --- Top Cached SPs By Total Physical Reads. Physical reads relate to disk read I/O pressure (Query 64) (SP Physical Reads) +-- Top Cached SPs By Total Physical Reads. Physical reads relate to disk read I/O pressure (Query 62) (SP Physical Reads) SELECT TOP(25) p.name AS [SP Name],qs.total_physical_reads AS [TotalPhysicalReads], qs.total_physical_reads/qs.execution_count AS [AvgPhysicalReads], qs.execution_count, qs.total_logical_reads,qs.total_elapsed_time, qs.total_elapsed_time/qs.execution_count AS [avg_elapsed_time], @@ -1521,7 +1495,7 @@ ORDER BY qs.total_physical_reads DESC, qs.total_logical_reads DESC OPTION (RECOM --- Top Cached SPs By Total Logical Writes (Query 65) (SP Logical Writes) +-- Top Cached SPs By Total Logical Writes (Query 63) (SP Logical Writes) -- Logical writes relate to both memory and disk I/O pressure SELECT TOP(25) p.name AS [SP Name], qs.total_logical_writes AS [TotalLogicalWrites], qs.total_logical_writes/qs.execution_count AS [AvgLogicalWrites], qs.execution_count, @@ -1545,7 +1519,7 @@ ORDER BY qs.total_logical_writes DESC OPTION (RECOMPILE); -- You should look at this if you see signs of I/O pressure or of memory pressure --- Lists the top statements by average input/output usage for the current database (Query 66) (Top IO Statements) +-- Lists the top statements by average input/output usage for the current database (Query 64) (Top IO Statements) SELECT TOP(50) OBJECT_NAME(qt.objectid, dbid) AS [SP Name], (qs.total_logical_reads + qs.total_logical_writes) /qs.execution_count AS [Avg IO], qs.execution_count AS [Execution Count], SUBSTRING(qt.[text],qs.statement_start_offset/2, @@ -1564,7 +1538,7 @@ ORDER BY [Avg IO] DESC OPTION (RECOMPILE); --- Possible Bad NC Indexes (writes > reads) (Query 67) (Bad NC Indexes) +-- Possible Bad NC Indexes (writes > reads) (Query 65) (Bad NC Indexes) SELECT OBJECT_NAME(s.[object_id]) AS [Table Name], i.name AS [Index Name], i.index_id, i.is_disabled, i.is_hypothetical, i.has_filter, i.fill_factor, s.user_updates AS [Total Writes], s.user_seeks + s.user_scans + s.user_lookups AS [Total Reads], @@ -1586,7 +1560,7 @@ ORDER BY [Difference] DESC, [Total Writes] DESC, [Total Reads] ASC OPTION (RECOM -- Investigate further before dropping an index! --- Missing Indexes for current database by Index Advantage (Query 68) (Missing Indexes) +-- Missing Indexes for current database by Index Advantage (Query 66) (Missing Indexes) SELECT CONVERT(decimal(18,2), user_seeks * avg_total_user_cost * (avg_user_impact * 0.01)) AS [index_advantage], migs.last_user_seek, mid.[statement] AS [Database.Schema.Table], COUNT(1) OVER(PARTITION BY mid.[statement]) AS [missing_indexes_for_table], @@ -1612,7 +1586,7 @@ ORDER BY index_advantage DESC OPTION (RECOMPILE); -- Do not just blindly add indexes that show up from this query!!! --- Find missing index warnings for cached plans in the current database (Query 69) (Missing Index Warnings) +-- Find missing index warnings for cached plans in the current database (Query 67) (Missing Index Warnings) -- Note: This query could take some time on a busy instance SELECT TOP(25) OBJECT_NAME(objectid) AS [ObjectName], cp.objtype, cp.usecounts, cp.size_in_bytes, query_plan @@ -1627,7 +1601,7 @@ ORDER BY cp.usecounts DESC OPTION (RECOMPILE); -- This can help you decide whether to add them or not --- Breaks down buffers used by current database by object (table, index) in the buffer cache (Query 70) (Buffer Usage) +-- Breaks down buffers used by current database by object (table, index) in the buffer cache (Query 68) (Buffer Usage) -- Note: This query could take some time on a busy instance SELECT OBJECT_NAME(p.[object_id]) AS [Object Name], p.index_id, CAST(COUNT(*)/128.0 AS DECIMAL(10, 2)) AS [Buffer size(MB)], @@ -1651,29 +1625,32 @@ ORDER BY [BufferCount] DESC OPTION (RECOMPILE); -- It can help identify possible candidates for data compression --- Get Table names, row counts, and compression status for clustered index or heap (Query 71) (Table Sizes) -SELECT OBJECT_NAME(object_id) AS [ObjectName], -SUM(Rows) AS [RowCount], data_compression_desc AS [CompressionType] -FROM sys.partitions WITH (NOLOCK) +-- Get Table names, row counts, and compression status for clustered index or heap (Query 69) (Table Sizes) +SELECT SCHEMA_NAME(o.Schema_ID) AS [Schema Name], OBJECT_NAME(p.object_id) AS [ObjectName], +SUM(p.Rows) AS [RowCount], data_compression_desc AS [CompressionType] +FROM sys.partitions AS p WITH (NOLOCK) +INNER JOIN sys.objects AS o WITH (NOLOCK) +ON p.object_id = o.object_id WHERE index_id < 2 --ignore the partitions from the non-clustered index if any -AND OBJECT_NAME(object_id) NOT LIKE N'sys%' -AND OBJECT_NAME(object_id) NOT LIKE N'queue_%' -AND OBJECT_NAME(object_id) NOT LIKE N'filestream_tombstone%' -AND OBJECT_NAME(object_id) NOT LIKE N'fulltext%' -AND OBJECT_NAME(object_id) NOT LIKE N'ifts_comp_fragment%' -AND OBJECT_NAME(object_id) NOT LIKE N'filetable_updates%' -AND OBJECT_NAME(object_id) NOT LIKE N'xml_index_nodes%' -AND OBJECT_NAME(object_id) NOT LIKE N'sqlagent_job%' -AND OBJECT_NAME(object_id) NOT LIKE N'plan_persist%' -GROUP BY object_id, data_compression_desc -ORDER BY SUM(Rows) DESC OPTION (RECOMPILE); +AND OBJECT_NAME(p.object_id) NOT LIKE N'sys%' +AND OBJECT_NAME(p.object_id) NOT LIKE N'spt_%' +AND OBJECT_NAME(p.object_id) NOT LIKE N'queue_%' +AND OBJECT_NAME(p.object_id) NOT LIKE N'filestream_tombstone%' +AND OBJECT_NAME(p.object_id) NOT LIKE N'fulltext%' +AND OBJECT_NAME(p.object_id) NOT LIKE N'ifts_comp_fragment%' +AND OBJECT_NAME(p.object_id) NOT LIKE N'filetable_updates%' +AND OBJECT_NAME(p.object_id) NOT LIKE N'xml_index_nodes%' +AND OBJECT_NAME(p.object_id) NOT LIKE N'sqlagent_job%' +AND OBJECT_NAME(p.object_id) NOT LIKE N'plan_persist%' +GROUP BY SCHEMA_NAME(o.Schema_ID), p.object_id, data_compression_desc +ORDER BY SUM(p.Rows) DESC OPTION (RECOMPILE); ------ -- Gives you an idea of table sizes, and possible data compression opportunities --- Get some key table properties (Query 72) (Table Properties) +-- Get some key table properties (Query 70) (Table Properties) SELECT OBJECT_NAME(t.[object_id]) AS [ObjectName], p.[rows] AS [Table Rows], p.index_id, p.data_compression_desc AS [Index Data Compression], t.create_date, t.lock_on_bulk_load, t.is_replicated, t.has_replication_filter, @@ -1696,7 +1673,7 @@ ORDER BY OBJECT_NAME(t.[object_id]), p.index_id OPTION (RECOMPILE); --- When were Statistics last updated on all indexes? (Query 73) (Statistics Update) +-- When were Statistics last updated on all indexes? (Query 71) (Statistics Update) SELECT SCHEMA_NAME(o.Schema_ID) + N'.' + o.[NAME] AS [Object Name], o.[type_desc] AS [Object Type], i.[name] AS [Index Name], STATS_DATE(i.[object_id], i.index_id) AS [Statistics Date], s.auto_created, s.no_recompute, s.user_created, s.is_incremental, s.is_temporary, @@ -1727,7 +1704,7 @@ ORDER BY STATS_DATE(i.[object_id], i.index_id) DESC OPTION (RECOMPILE); --- Look at most frequently modified indexes and statistics (Query 74) (Volatile Indexes) +-- Look at most frequently modified indexes and statistics (Query 72) (Volatile Indexes) SELECT o.[name] AS [Object Name], o.[object_id], o.[type_desc], s.[name] AS [Statistics Name], s.stats_id, s.no_recompute, s.auto_created, s.is_incremental, s.is_temporary, sp.modification_counter, sp.[rows], sp.rows_sampled, sp.last_updated @@ -1745,7 +1722,7 @@ ORDER BY sp.modification_counter DESC, o.name OPTION (RECOMPILE); --- Get fragmentation info for all indexes above a certain size in the current database (Query 75) (Index Fragmentation) +-- Get fragmentation info for all indexes above a certain size in the current database (Query 73) (Index Fragmentation) -- Note: This query could take some time on a very large database SELECT DB_NAME(ps.database_id) AS [Database Name], SCHEMA_NAME(o.[schema_id]) AS [Schema Name], OBJECT_NAME(ps.OBJECT_ID) AS [Object Name], i.[name] AS [Index Name], ps.index_id, @@ -1767,7 +1744,7 @@ ORDER BY ps.avg_fragmentation_in_percent DESC OPTION (RECOMPILE); -- and how effective your index maintenance strategy is ---- Index Read/Write stats (all tables in current DB) ordered by Reads (Query 76) (Overall Index Usage - Reads) +--- Index Read/Write stats (all tables in current DB) ordered by Reads (Query 74) (Overall Index Usage - Reads) SELECT OBJECT_NAME(i.[object_id]) AS [ObjectName], i.[name] AS [IndexName], i.index_id, s.user_seeks, s.user_scans, s.user_lookups, s.user_seeks + s.user_scans + s.user_lookups AS [Total Reads], @@ -1786,7 +1763,7 @@ ORDER BY s.user_seeks + s.user_scans + s.user_lookups DESC OPTION (RECOMPILE); - -- Show which indexes in the current database are most active for Reads ---- Index Read/Write stats (all tables in current DB) ordered by Writes (Query 77) (Overall Index Usage - Writes) +--- Index Read/Write stats (all tables in current DB) ordered by Writes (Query 75) (Overall Index Usage - Writes) SELECT OBJECT_NAME(i.[object_id]) AS [ObjectName], i.[name] AS [IndexName], i.index_id, s.user_updates AS [Writes], s.user_seeks + s.user_scans + s.user_lookups AS [Total Reads], i.[type_desc] AS [Index Type], i.fill_factor AS [Fill Factor], i.has_filter, i.filter_definition, @@ -1803,7 +1780,7 @@ ORDER BY s.user_updates DESC OPTION (RECOMPILE); -- Order by writes -- Show which indexes in the current database are most active for Writes --- Get in-memory OLTP index usage (Query 78) (XTP Index Usage) +-- Get in-memory OLTP index usage (Query 76) (XTP Index Usage) SELECT OBJECT_NAME(i.[object_id]) AS [Object Name], i.index_id, i.[name] AS [Index Name], i.[type_desc], xis.scans_started, xis.scans_retries, xis.rows_touched, xis.rows_returned @@ -1822,7 +1799,7 @@ ORDER BY OBJECT_NAME(i.[object_id]) OPTION (RECOMPILE); --- Look at Columnstore index physical statistics (Query 79) (Columnstore Index Physical Stat) +-- Look at Columnstore index physical statistics (Query 77) (Columnstore Index Physical Stat) SELECT OBJECT_NAME(ps.object_id) AS [TableName], i.[name] AS [IndexName], ps.index_id, ps.partition_number, ps.delta_store_hobt_id, ps.state_desc, ps.total_rows, ps.size_in_bytes, @@ -1841,7 +1818,7 @@ ORDER BY ps.object_id, ps.partition_number, ps.row_group_id OPTION (RECOMPILE); --- Get lock waits for current database (Query 80) (Lock Waits) +-- Get lock waits for current database (Query 78) (Lock Waits) SELECT o.name AS [table_name], i.name AS [index_name], ios.index_id, ios.partition_number, SUM(ios.row_lock_wait_count) AS [total_row_lock_waits], SUM(ios.row_lock_wait_in_ms) AS [total_row_lock_wait_in_ms], @@ -1864,7 +1841,7 @@ ORDER BY total_lock_wait_in_ms DESC OPTION (RECOMPILE); --- Look at UDF execution statistics (Query 81) (UDF Statistics) +-- Look at UDF execution statistics (Query 79) (UDF Statistics) SELECT OBJECT_NAME(object_id) AS [Function Name], execution_count, total_worker_time, total_logical_reads, total_physical_reads, total_elapsed_time, total_elapsed_time/execution_count AS [avg_elapsed_time], @@ -1882,7 +1859,7 @@ ORDER BY total_worker_time DESC OPTION (RECOMPILE); -- https://bit.ly/2q1Q6BM --- Get QueryStore Options for this database (Query 82) (QueryStore Options) +-- Get QueryStore Options for this database (Query 80) (QueryStore Options) SELECT actual_state_desc, desired_state_desc, [interval_length_minutes], current_storage_size_mb, [max_storage_size_mb], query_capture_mode_desc, size_based_cleanup_mode_desc @@ -1896,97 +1873,10 @@ FROM sys.database_query_store_options WITH (NOLOCK) OPTION (RECOMPILE); -- https://bit.ly/1kHSl7w --- Get highest aggregate duration queries over last hour (Query 83) (High Aggregate Duration Queries) -WITH AggregatedDurationLastHour -AS -(SELECT q.query_id, SUM(count_executions * avg_duration) AS total_duration, - COUNT (distinct p.plan_id) AS number_of_plans - FROM sys.query_store_query_text AS qt WITH (NOLOCK) - INNER JOIN sys.query_store_query AS q WITH (NOLOCK) - ON qt.query_text_id = q.query_text_id - INNER JOIN sys.query_store_plan AS p WITH (NOLOCK) - ON q.query_id = p.query_id - INNER JOIN sys.query_store_runtime_stats AS rs WITH (NOLOCK) - ON rs.plan_id = p.plan_id - INNER JOIN sys.query_store_runtime_stats_interval AS rsi WITH (NOLOCK) - ON rsi.runtime_stats_interval_id = rs.runtime_stats_interval_id - WHERE rsi.start_time >= DATEADD(hour, -1, GETUTCDATE()) - AND rs.execution_type_desc = N'Regular' - GROUP BY q.query_id), -OrderedDuration AS -(SELECT query_id, total_duration, number_of_plans, - ROW_NUMBER () OVER (ORDER BY total_duration DESC, query_id) AS RN - FROM AggregatedDurationLastHour) -SELECT OBJECT_NAME(q.object_id) AS [Containing Object], qt.query_sql_text, -od.total_duration AS [Total Duration (microsecs)], -od.number_of_plans AS [Plan Count], -p.is_forced_plan, p.is_parallel_plan, p.is_trivial_plan, -q.query_parameterization_type_desc, p.[compatibility_level], -p.last_compile_start_time, q.last_execution_time, -CONVERT(xml, p.query_plan) AS query_plan_xml -FROM OrderedDuration AS od -INNER JOIN sys.query_store_query AS q WITH (NOLOCK) -ON q.query_id = od.query_id -INNER JOIN sys.query_store_query_text AS qt WITH (NOLOCK) -ON q.query_text_id = qt.query_text_id -INNER JOIN sys.query_store_plan AS p WITH (NOLOCK) -ON q.query_id = p.query_id -WHERE od.RN <= 50 -ORDER BY total_duration DESC OPTION (RECOMPILE); ------- - --- New for SQL Server 2016 --- Requires that QueryStore is enabled for this database - - - --- Get highest aggregate CPU time queries over last hour (Query 84) (High Aggregate CPU Queries) -WITH AggregatedCPULastHour -AS -(SELECT q.query_id, SUM(rs.count_executions * rs.avg_cpu_time) AS total_cpu_time, - COUNT (DISTINCT p.plan_id) AS number_of_plans - FROM sys.query_store_query_text AS qt WITH (NOLOCK) - INNER JOIN sys.query_store_query AS q WITH (NOLOCK) - ON qt.query_text_id = q.query_text_id - INNER JOIN sys.query_store_plan AS p WITH (NOLOCK) - ON q.query_id = p.query_id - INNER JOIN sys.query_store_runtime_stats AS rs WITH (NOLOCK) - ON rs.plan_id = p.plan_id - INNER JOIN sys.query_store_runtime_stats_interval AS rsi WITH (NOLOCK) - ON rsi.runtime_stats_interval_id = rs.runtime_stats_interval_id - WHERE rsi.start_time >= DATEADD(hour, -1, GETUTCDATE()) - AND rs.execution_type_desc = N'Regular' - GROUP BY q.query_id), OrderedDuration -AS -(SELECT query_id, total_cpu_time, number_of_plans, - ROW_NUMBER () OVER (ORDER BY total_cpu_time DESC, query_id) AS RN - FROM AggregatedCPULastHour) -SELECT OBJECT_NAME(q.object_id) AS [Containing Object], qt.query_sql_text, -od.total_cpu_time AS [Total CPU Time (microsecs)], -od.number_of_plans AS [Plan Count], -p.is_forced_plan, p.is_parallel_plan, p.is_trivial_plan, -q.query_parameterization_type_desc, p.[compatibility_level], -p.last_compile_start_time, -q.last_execution_time, -CONVERT(xml, p.query_plan) AS query_plan_xml -FROM OrderedDuration AS od -INNER JOIN sys.query_store_query AS q WITH (NOLOCK) -ON q.query_id = od.query_id -INNER JOIN sys.query_store_query_text AS qt WITH (NOLOCK) -ON q.query_text_id = qt.query_text_id -INNER JOIN sys.query_store_plan AS p WITH (NOLOCK) -ON q.query_id = p.query_id -WHERE od.RN <= 50 -ORDER BY od.total_cpu_time DESC OPTION (RECOMPILE); ------- --- New for SQL Server 2016 --- Requires that QueryStore is enabled for this database - - --- Get input buffer information for the current database (Query 85) (Input Buffer) +-- Get input buffer information for the current database (Query 81) (Input Buffer) SELECT es.session_id, DB_NAME(es.database_id) AS [Database Name], es.login_time, es.cpu_time, es.logical_reads, es.memory_usage, es.[status], ib.event_info AS [Input Buffer] @@ -2008,7 +1898,7 @@ AND es.session_id <> @@SPID OPTION (RECOMPILE); --- Look at recent Full backups for the current database (Query 86) (Recent Full Backups) +-- Look at recent Full backups for the current database (Query 82) (Recent Full Backups) SELECT TOP (30) bs.machine_name, bs.server_name, bs.database_name AS [Database Name], bs.recovery_model, CONVERT (BIGINT, bs.backup_size / 1048576 ) AS [Uncompressed Backup Size (MB)], CONVERT (BIGINT, bs.compressed_backup_size / 1048576 ) AS [Compressed Backup Size (MB)], @@ -2036,7 +1926,10 @@ ORDER BY bs.backup_finish_date DESC OPTION (RECOMPILE); -- https://bit.ly/28Rpb2x --- These four Pluralsight Courses go into more detail about how to run these queries and interpret the results +-- These five Pluralsight Courses go into more detail about how to run these queries and interpret the results + +-- SQL Server 2017: Diagnosing Performance Issues with DMVs +-- https://bit.ly/2FqCeti -- SQL Server 2017: Diagnosing Configuration Issues with DMVs -- https://bit.ly/2MSUDUL diff --git a/bin/diagnosticquery/SQLServerDiagnosticQueries_2016_201810.sql b/bin/diagnosticquery/SQLServerDiagnosticQueries_2016_201901.sql similarity index 92% rename from bin/diagnosticquery/SQLServerDiagnosticQueries_2016_201810.sql rename to bin/diagnosticquery/SQLServerDiagnosticQueries_2016_201901.sql index ce5ff7834e..ab1b0eac6c 100644 --- a/bin/diagnosticquery/SQLServerDiagnosticQueries_2016_201810.sql +++ b/bin/diagnosticquery/SQLServerDiagnosticQueries_2016_201901.sql @@ -1,7 +1,7 @@ -- SQL Server 2016 Diagnostic Information Queries -- Glenn Berry --- Last Modified: November 14, 2018 +-- Last Modified: March 3, 2019 -- https://www.sqlskills.com/blogs/glenn/ -- http://sqlserverperformance.wordpress.com/ -- Twitter: GlennAlanBerry @@ -23,7 +23,7 @@ --****************************************************************************** ---* Copyright (C) 2018 Glenn Berry, SQLskills.com +--* Copyright (C) 2019 Glenn Berry, SQLskills.com --* All rights reserved. --* --* For more scripts and sample code, check out @@ -86,7 +86,8 @@ SELECT @@SERVERNAME AS [Server Name], @@VERSION AS [SQL Server and OS Version In -- 13.0.4502.0 SP1 CU9 5/30/2018 ----> 13.0.5149.0 SP2 CU1 5/30/2018 -- 13.0.4514.0 SP1 CU10 7/16/2018 ----> 13.0.5153.0 SP2 CU2 7/16/2018 -- 13.0.4528.0 SP1 CU11 9/17/2018 ----> 13.0.5216.0 SP2 CU3 9/20/2018 --- 13.0.4541.0 SP1 CU12 11/13/2018 ---_> 13.0.5233.0 SP2 CU4 11/13/2018 +-- 13.0.4541.0 SP1 CU12 11/13/2018 ----> 13.0.5233.0 SP2 CU4 11/13/2018 +-- 13.0.4550.0 SP1 CU13 1/23/2019 ----> 13.0.5264.1 SP2 CU5 1/23/2019 -- How to determine the version, edition and update level of SQL Server and its components @@ -231,6 +232,9 @@ DBCC TRACESTATUS (-1); -- DBCC TRACEON - Trace Flags (Transact-SQL) -- https://bit.ly/2FuSvPg +-- Recommended updates and configuration options for SQL Server 2017 and 2016 with high-performance workloads +-- https://bit.ly/2VVRGTY + -- Returns status of instant file initialization (Query 6) (IFI Status) @@ -557,38 +561,8 @@ EXEC sys.xp_instance_regread N'HKEY_LOCAL_MACHINE', N'HARDWARE\DESCRIPTION\Syste --- See if buffer pool extension (BPE) is enabled (Query 23) (BPE Configuration) -SELECT [path], state_description, current_size_in_kb, -CAST(current_size_in_kb/1048576.0 AS DECIMAL(10,2)) AS [Size (GB)] -FROM sys.dm_os_buffer_pool_extension_configuration WITH (NOLOCK) OPTION (RECOMPILE); ------- - --- BPE is available in both Standard Edition and Enterprise Edition --- It is a more interesting feature for Standard Edition - --- Buffer Pool Extension to SSDs in SQL Server 2014 --- https://bit.ly/1bm08m8 - --- Buffer Pool Extension --- https://bit.ly/2oBuieO - - - --- Look at buffer descriptors to see BPE usage by database (Query 24) (BPE Usage) -SELECT DB_NAME(database_id) AS [Database Name], COUNT(page_id) AS [Page Count], -CAST(COUNT(*)/128.0 AS DECIMAL(10, 2)) AS [Buffer size(MB)], -AVG(read_microsec) AS [Avg Read Time (microseconds)] -FROM sys.dm_os_buffer_descriptors WITH (NOLOCK) -WHERE database_id <> 32767 -AND is_in_bpool_extension = 1 -GROUP BY DB_NAME(database_id) -ORDER BY [Buffer size(MB)] DESC OPTION (RECOMPILE); ------- - --- You will see no results if BPE is not enabled or if there is no BPE usage - --- Get information on location, time and size of any memory dumps from SQL Server (Query 25) (Memory Dump Info) +-- Get information on location, time and size of any memory dumps from SQL Server (Query 23) (Memory Dump Info) SELECT [filename], creation_time, size_in_bytes/1048576.0 AS [Size (MB)] FROM sys.dm_server_memory_dumps WITH (NOLOCK) ORDER BY creation_time DESC OPTION (RECOMPILE); @@ -602,7 +576,7 @@ ORDER BY creation_time DESC OPTION (RECOMPILE); --- Look at Suspect Pages table (Query 26) (Suspect Pages) +-- Look at Suspect Pages table (Query 24) (Suspect Pages) SELECT DB_NAME(database_id) AS [Database Name], [file_id], page_id, event_type, error_count, last_update_date FROM msdb.dbo.suspect_pages WITH (NOLOCK) @@ -625,7 +599,7 @@ ORDER BY database_id OPTION (RECOMPILE); -- https://bit.ly/2Fvr1c9 --- Get number of data files in tempdb database (Query 27) (TempDB Data Files) +-- Get number of data files in tempdb database (Query 25) (TempDB Data Files) EXEC sys.xp_readerrorlog 0, 1, N'The tempdb database has'; ------ @@ -634,7 +608,7 @@ EXEC sys.xp_readerrorlog 0, 1, N'The tempdb database has'; -- This query will return no results if your error log has been recycled since the instance was last started --- File names and paths for all user and system databases on instance (Query 28) (Database Filenames and Paths) +-- File names and paths for all user and system databases on instance (Query 26) (Database Filenames and Paths) SELECT DB_NAME([database_id]) AS [Database Name], [file_id], [name], physical_name, [type_desc], state_desc, is_percent_growth, growth, @@ -654,7 +628,7 @@ ORDER BY DB_NAME([database_id]), [file_id] OPTION (RECOMPILE); -- Is percent growth enabled for any files (which is bad)? --- Volume info for all LUNS that have database files on the current instance (Query 29) (Volume Info) +-- Volume info for all LUNS that have database files on the current instance (Query 27) (Volume Info) SELECT DISTINCT vs.volume_mount_point, vs.file_system_type, vs.logical_volume_name, CONVERT(DECIMAL(18,2), vs.total_bytes/1073741824.0) AS [Total Size (GB)], CONVERT(DECIMAL(18,2), vs.available_bytes/1073741824.0) AS [Available Size (GB)], @@ -674,7 +648,7 @@ ORDER BY vs.volume_mount_point OPTION (RECOMPILE); --- Drive level latency information (Query 30) (Drive Level Latency) +-- Drive level latency information (Query 28) (Drive Level Latency) -- Based on code from Jimmy May SELECT tab.[Drive], tab.volume_mount_point AS [Volume Mount Point], CASE @@ -719,7 +693,7 @@ ORDER BY [Overall Latency] OPTION (RECOMPILE); -- database files on each drive since SQL Server was last started --- Calculates average stalls per read, per write, and per total input/output for each database file (Query 31) (IO Latency by File) +-- Calculates average stalls per read, per write, and per total input/output for each database file (Query 29) (IO Latency by File) SELECT DB_NAME(fs.database_id) AS [Database Name], CAST(fs.io_stall_read_ms/(1.0 + fs.num_of_reads) AS NUMERIC(10,1)) AS [avg_read_latency_ms], CAST(fs.io_stall_write_ms/(1.0 + fs.num_of_writes) AS NUMERIC(10,1)) AS [avg_write_latency_ms], CAST((fs.io_stall_read_ms + fs.io_stall_write_ms)/(1.0 + fs.num_of_reads + fs.num_of_writes) AS NUMERIC(10,1)) AS [avg_io_latency_ms], @@ -740,7 +714,7 @@ ORDER BY avg_io_latency_ms DESC OPTION (RECOMPILE); -- database file since SQL Server was last started --- Look for I/O requests taking longer than 15 seconds in the six most recent SQL Server Error Logs (Query 32) (IO Warnings) +-- Look for I/O requests taking longer than 15 seconds in the six most recent SQL Server Error Logs (Query 30) (IO Warnings) CREATE TABLE #IOWarningResults(LogDate datetime, ProcessInfo sysname, LogText nvarchar(1000)); INSERT INTO #IOWarningResults @@ -776,7 +750,7 @@ DROP TABLE #IOWarningResults; -- https://bit.ly/2qtaw73 --- Resource Governor Resource Pool information (Query 33) (RG Resource Pools) +-- Resource Governor Resource Pool information (Query 31) (RG Resource Pools) SELECT pool_id, [Name], statistics_start_time, min_memory_percent, max_memory_percent, max_memory_kb/1024 AS [max_memory_mb], @@ -792,7 +766,7 @@ OPTION (RECOMPILE); --- Recovery model, log reuse wait description, log file size, log usage size (Query 34) (Database Properties) +-- Recovery model, log reuse wait description, log file size, log usage size (Query 32) (Database Properties) -- and compatibility level for all databases on instance SELECT db.[name] AS [Database Name], SUSER_SNAME(db.owner_sid) AS [Database Owner], db.recovery_model_desc AS [Recovery Model], db.state_desc, db.containment_desc, db.log_reuse_wait_desc AS [Log Reuse Wait Description], @@ -843,7 +817,7 @@ ORDER BY db.[name] OPTION (RECOMPILE); -- https://bit.ly/2pdggk3 --- Missing Indexes for all databases by Index Advantage (Query 35) (Missing Indexes All Databases) +-- Missing Indexes for all databases by Index Advantage (Query 33) (Missing Indexes All Databases) SELECT CONVERT(decimal(18,2), user_seeks * avg_total_user_cost * (avg_user_impact * 0.01)) AS [index_advantage], FORMAT(migs.last_user_seek, 'yyyy-MM-dd HH:mm:ss') AS [last_user_seek], mid.[statement] AS [Database.Schema.Table], @@ -871,7 +845,7 @@ ORDER BY index_advantage DESC OPTION (RECOMPILE); --- Get VLF Counts for all databases on the instance (Query 36) (VLF Counts) +-- Get VLF Counts for all databases on the instance (Query 34) (VLF Counts) -- (adapted from Michelle Ufford) CREATE TABLE #VLFInfo (RecoveryUnitID int, FileID int, FileSize bigint, StartOffset bigint, @@ -912,7 +886,7 @@ DROP TABLE #VLFCountResults; --- Get CPU utilization by database (Query 37) (CPU Usage by Database) +-- Get CPU utilization by database (Query 35) (CPU Usage by Database) WITH DB_CPU_Stats AS (SELECT pa.DatabaseID, DB_Name(pa.DatabaseID) AS [Database Name], SUM(qs.total_worker_time/1000) AS [CPU_Time_Ms] @@ -930,9 +904,10 @@ ORDER BY [CPU Rank] OPTION (RECOMPILE); ------ -- Helps determine which database is using the most CPU resources on the instance +-- Note: This only reflects CPU usage from the currently cached query plans --- Get I/O utilization by database (Query 38) (IO Usage By Database) +-- Get I/O utilization by database (Query 36) (IO Usage By Database) WITH Aggregate_IO_Statistics AS (SELECT DB_NAME(database_id) AS [Database Name], CAST(SUM(num_of_bytes_read + num_of_bytes_written) / 1048576 AS DECIMAL(12, 2)) AS [ioTotalMB], @@ -956,7 +931,7 @@ ORDER BY [I/O Rank] OPTION (RECOMPILE); -- They include all I/O activity, not just the nominal I/O workload --- Get total buffer usage by database for current instance (Query 39) (Total Buffer Usage by Database) +-- Get total buffer usage by database for current instance (Query 37) (Total Buffer Usage by Database) -- This make take some time to run on a busy instance WITH AggregateBufferPoolUsage AS @@ -978,7 +953,7 @@ ORDER BY [Buffer Pool Rank] OPTION (RECOMPILE); -- Clear Wait Stats with this command -- DBCC SQLPERF('sys.dm_os_wait_stats', CLEAR); --- Isolate top waits for server instance since last restart or wait statistics clear (Query 40) (Top Waits) +-- Isolate top waits for server instance since last restart or wait statistics clear (Query 38) (Top Waits) WITH [Waits] AS (SELECT wait_type, wait_time_ms/ 1000.0 AS [WaitS], (wait_time_ms - signal_wait_time_ms) / 1000.0 AS [ResourceS], @@ -1061,7 +1036,7 @@ OPTION (RECOMPILE); --- Get a count of SQL connections by IP address (Query 41) (Connection Counts by IP Address) +-- Get a count of SQL connections by IP address (Query 39) (Connection Counts by IP Address) SELECT ec.client_net_address, es.[program_name], es.[host_name], es.login_name, COUNT(ec.session_id) AS [connection count] FROM sys.dm_exec_sessions AS es WITH (NOLOCK) @@ -1079,7 +1054,7 @@ ORDER BY ec.client_net_address, es.[program_name] OPTION (RECOMPILE); --- Get Average Task Counts (run multiple times) (Query 42) (Avg Task Counts) +-- Get Average Task Counts (run multiple times) (Query 40) (Avg Task Counts) SELECT AVG(current_tasks_count) AS [Avg Task Count], AVG(work_queue_count) AS [Avg Work Queue Count], AVG(runnable_tasks_count) AS [Avg Runnable Task Count], @@ -1100,7 +1075,7 @@ WHERE scheduler_id < 255 OPTION (RECOMPILE); --- Detect blocking (run multiple times) (Query 43) (Detect Blocking) +-- Detect blocking (run multiple times) (Query 41) (Detect Blocking) SELECT t1.resource_type AS [lock type], DB_NAME(resource_database_id) AS [database], t1.resource_associated_entity_id AS [blk object],t1.request_mode AS [lock req], -- lock requested t1.request_session_id AS [waiter sid], t2.wait_duration_ms AS [wait time], -- spid of waiter @@ -1129,7 +1104,7 @@ ON t1.lock_owner_address = t2.resource_address OPTION (RECOMPILE); --- Get CPU Utilization History for last 256 minutes (in one minute intervals) (Query 44) (CPU Utilization History) +-- Get CPU Utilization History for last 256 minutes (in one minute intervals) (Query 42) (CPU Utilization History) DECLARE @ts_now bigint = (SELECT cpu_ticks/(cpu_ticks/ms_ticks) FROM sys.dm_os_sys_info WITH (NOLOCK)); SELECT TOP(256) SQLProcessUtilization AS [SQL Server Process CPU Utilization], @@ -1154,7 +1129,7 @@ ORDER BY record_id DESC OPTION (RECOMPILE); -- on high core count (> 64 cores) systems --- Get top total worker time queries for entire instance (Query 45) (Top Worker Time Queries) +-- Get top total worker time queries for entire instance (Query 43) (Top Worker Time Queries) SELECT TOP(50) DB_NAME(t.[dbid]) AS [Database Name], REPLACE(REPLACE(LEFT(t.[text], 255), CHAR(10),''), CHAR(13),'') AS [Short Query Text], qs.total_worker_time AS [Total Worker Time], qs.min_worker_time AS [Min Worker Time], @@ -1182,7 +1157,7 @@ ORDER BY qs.total_worker_time DESC OPTION (RECOMPILE); --- Page Life Expectancy (PLE) value for each NUMA node in current instance (Query 46) (PLE by NUMA Node) +-- Page Life Expectancy (PLE) value for each NUMA node in current instance (Query 44) (PLE by NUMA Node) SELECT @@SERVERNAME AS [Server Name], RTRIM([object_name]) AS [Object Name], instance_name, cntr_value AS [Page Life Expectancy] FROM sys.dm_os_performance_counters WITH (NOLOCK) WHERE [object_name] LIKE N'%Buffer Node%' -- Handles named instances @@ -1197,7 +1172,7 @@ AND counter_name = N'Page life expectancy' OPTION (RECOMPILE); -- https://bit.ly/2EgynLa --- Memory Grants Pending value for current instance (Query 47) (Memory Grants Pending) +-- Memory Grants Pending value for current instance (Query 45) (Memory Grants Pending) SELECT @@SERVERNAME AS [Server Name], RTRIM([object_name]) AS [Object Name], cntr_value AS [Memory Grants Pending] FROM sys.dm_os_performance_counters WITH (NOLOCK) WHERE [object_name] LIKE N'%Memory Manager%' -- Handles named instances @@ -1208,7 +1183,7 @@ AND counter_name = N'Memory Grants Pending' OPTION (RECOMPILE); -- Memory Grants Pending above zero for a sustained period is a very strong indicator of internal memory pressure --- Memory Clerk Usage for instance (Query 48) (Memory Clerk Usage) +-- Memory Clerk Usage for instance (Query 46) (Memory Clerk Usage) -- Look for high value for CACHESTORE_SQLCP (Ad-hoc query plans) SELECT TOP(10) mc.[type] AS [Memory Clerk Type], CAST((SUM(mc.pages_kb)/1024.0) AS DECIMAL (15,2)) AS [Memory Usage (MB)] @@ -1230,7 +1205,7 @@ ORDER BY SUM(mc.pages_kb) DESC OPTION (RECOMPILE); --- Find single-use, ad-hoc and prepared queries that are bloating the plan cache (Query 49) (Ad hoc Queries) +-- Find single-use, ad-hoc and prepared queries that are bloating the plan cache (Query 47) (Ad hoc Queries) SELECT TOP(50) DB_NAME(t.[dbid]) AS [Database Name], t.[text] AS [Query Text], cp.objtype AS [Object Type], cp.cacheobjtype AS [Cache Object Type], cp.size_in_bytes/1024 AS [Plan Size in KB] @@ -1251,7 +1226,7 @@ ORDER BY cp.size_in_bytes DESC, DB_NAME(t.[dbid]) OPTION (RECOMPILE); -- https://bit.ly/2EfYOkl --- Get top total logical reads queries for entire instance (Query 50) (Top Logical Reads Queries) +-- Get top total logical reads queries for entire instance (Query 48) (Top Logical Reads Queries) SELECT TOP(50) DB_NAME(t.[dbid]) AS [Database Name], REPLACE(REPLACE(LEFT(t.[text], 255), CHAR(10),''), CHAR(13),'') AS [Short Query Text], qs.total_logical_reads AS [Total Logical Reads], @@ -1279,7 +1254,7 @@ ORDER BY qs.total_logical_reads DESC OPTION (RECOMPILE); -- Can also help track down parameter sniffing issues --- Get top average elapsed time queries for entire instance (Query 51) (Top Avg Elapsed Time Queries) +-- Get top average elapsed time queries for entire instance (Query 49) (Top Avg Elapsed Time Queries) SELECT TOP(50) DB_NAME(t.[dbid]) AS [Database Name], REPLACE(REPLACE(LEFT(t.[text], 255), CHAR(10),''), CHAR(13),'') AS [Short Query Text], qs.total_elapsed_time/qs.execution_count AS [Avg Elapsed Time], @@ -1301,7 +1276,7 @@ ORDER BY qs.total_elapsed_time/qs.execution_count DESC OPTION (RECOMPILE); -- Can also help track down parameter sniffing issues --- Look at UDF execution statistics (Query 52) (UDF Stats by DB) +-- Look at UDF execution statistics (Query 50) (UDF Stats by DB) SELECT TOP (25) DB_NAME(database_id) AS [Database Name], OBJECT_NAME(object_id, database_id) AS [Function Name], total_worker_time, execution_count, total_elapsed_time, @@ -1324,7 +1299,7 @@ ORDER BY total_worker_time DESC OPTION (RECOMPILE); --USE YourDatabaseName; -- make sure to change to an actual database on your instance, not the master system database --GO --- Individual File Sizes and space available for current database (Query 53) (File Sizes and Space) +-- Individual File Sizes and space available for current database (Query 51) (File Sizes and Space) SELECT f.name AS [File Name] , f.physical_name AS [Physical Name], CAST((f.size/128.0) AS DECIMAL(15,2)) AS [Total Size in MB], CAST(f.size/128.0 - CAST(FILEPROPERTY(f.name, 'SpaceUsed') AS int)/128.0 AS DECIMAL(15,2)) @@ -1346,7 +1321,7 @@ ORDER BY f.[file_id] OPTION (RECOMPILE); -- https://bit.ly/2evRZSR --- Log space usage for current database (Query 54) (Log Space Usage) +-- Log space usage for current database (Query 52) (Log Space Usage) SELECT DB_NAME(lsu.database_id) AS [Database Name], db.recovery_model_desc AS [Recovery Model], CAST(lsu.total_log_size_in_bytes/1048576.0 AS DECIMAL(10, 2)) AS [Total Log Space (MB)], CAST(lsu.used_log_space_in_bytes/1048576.0 AS DECIMAL(10, 2)) AS [Used Log Space (MB)], @@ -1363,7 +1338,7 @@ OPTION (RECOMPILE); --- Get database scoped configuration values for current database (Query 55) (Database-scoped Configurations) +-- Get database scoped configuration values for current database (Query 53) (Database-scoped Configurations) SELECT configuration_id, name, [value] AS [value_for_primary], value_for_secondary FROM sys.database_scoped_configurations WITH (NOLOCK) OPTION (RECOMPILE); ------ @@ -1377,19 +1352,19 @@ FROM sys.database_scoped_configurations WITH (NOLOCK) OPTION (RECOMPILE); -- https://bit.ly/2sOH7nb --- I/O Statistics by file for the current database (Query 56) (IO Stats By File) +-- I/O Statistics by file for the current database (Query 54) (IO Stats By File) SELECT DB_NAME(DB_ID()) AS [Database Name], df.name AS [Logical Name], vfs.[file_id], df.type_desc, -df.physical_name AS [Physical Name], CAST(vfs.size_on_disk_bytes/1048576.0 AS DECIMAL(10, 2)) AS [Size on Disk (MB)], +df.physical_name AS [Physical Name], CAST(vfs.size_on_disk_bytes/1048576.0 AS DECIMAL(16, 2)) AS [Size on Disk (MB)], vfs.num_of_reads, vfs.num_of_writes, vfs.io_stall_read_ms, vfs.io_stall_write_ms, -CAST(100. * vfs.io_stall_read_ms/(vfs.io_stall_read_ms + vfs.io_stall_write_ms) AS DECIMAL(10,1)) AS [IO Stall Reads Pct], -CAST(100. * vfs.io_stall_write_ms/(vfs.io_stall_write_ms + vfs.io_stall_read_ms) AS DECIMAL(10,1)) AS [IO Stall Writes Pct], +CAST(100. * vfs.io_stall_read_ms/(vfs.io_stall_read_ms + vfs.io_stall_write_ms) AS DECIMAL(16,1)) AS [IO Stall Reads Pct], +CAST(100. * vfs.io_stall_write_ms/(vfs.io_stall_write_ms + vfs.io_stall_read_ms) AS DECIMAL(16,1)) AS [IO Stall Writes Pct], (vfs.num_of_reads + vfs.num_of_writes) AS [Writes + Reads], -CAST(vfs.num_of_bytes_read/1048576.0 AS DECIMAL(10, 2)) AS [MB Read], -CAST(vfs.num_of_bytes_written/1048576.0 AS DECIMAL(10, 2)) AS [MB Written], -CAST(100. * vfs.num_of_reads/(vfs.num_of_reads + vfs.num_of_writes) AS DECIMAL(10,1)) AS [# Reads Pct], -CAST(100. * vfs.num_of_writes/(vfs.num_of_reads + vfs.num_of_writes) AS DECIMAL(10,1)) AS [# Write Pct], -CAST(100. * vfs.num_of_bytes_read/(vfs.num_of_bytes_read + vfs.num_of_bytes_written) AS DECIMAL(10,1)) AS [Read Bytes Pct], -CAST(100. * vfs.num_of_bytes_written/(vfs.num_of_bytes_read + vfs.num_of_bytes_written) AS DECIMAL(10,1)) AS [Written Bytes Pct] +CAST(vfs.num_of_bytes_read/1048576.0 AS DECIMAL(16, 2)) AS [MB Read], +CAST(vfs.num_of_bytes_written/1048576.0 AS DECIMAL(16, 2)) AS [MB Written], +CAST(100. * vfs.num_of_reads/(vfs.num_of_reads + vfs.num_of_writes) AS DECIMAL(16,1)) AS [# Reads Pct], +CAST(100. * vfs.num_of_writes/(vfs.num_of_reads + vfs.num_of_writes) AS DECIMAL(16,1)) AS [# Write Pct], +CAST(100. * vfs.num_of_bytes_read/(vfs.num_of_bytes_read + vfs.num_of_bytes_written) AS DECIMAL(16,1)) AS [Read Bytes Pct], +CAST(100. * vfs.num_of_bytes_written/(vfs.num_of_bytes_read + vfs.num_of_bytes_written) AS DECIMAL(16,1)) AS [Written Bytes Pct] FROM sys.dm_io_virtual_file_stats(DB_ID(), NULL) AS vfs INNER JOIN sys.database_files AS df WITH (NOLOCK) ON vfs.[file_id]= df.[file_id] OPTION (RECOMPILE); @@ -1400,7 +1375,7 @@ ON vfs.[file_id]= df.[file_id] OPTION (RECOMPILE); --- Get most frequently executed queries for this database (Query 57) (Query Execution Counts) +-- Get most frequently executed queries for this database (Query 55) (Query Execution Counts) SELECT TOP(50) LEFT(t.[text], 50) AS [Short Query Text], qs.execution_count AS [Execution Count], qs.total_logical_reads AS [Total Logical Reads], qs.total_logical_reads/qs.execution_count AS [Avg Logical Reads], @@ -1421,7 +1396,7 @@ ORDER BY qs.execution_count DESC OPTION (RECOMPILE); -- Queries 56 through 61 are the "Bad Man List" for stored procedures --- Top Cached SPs By Execution Count (Query 58) (SP Execution Counts) +-- Top Cached SPs By Execution Count (Query 56) (SP Execution Counts) SELECT TOP(100) p.name AS [SP Name], qs.execution_count AS [Execution Count], ISNULL(qs.execution_count/DATEDIFF(Minute, qs.cached_time, GETDATE()), 0) AS [Calls/Minute], qs.total_elapsed_time/qs.execution_count AS [Avg Elapsed Time], @@ -1444,12 +1419,13 @@ ORDER BY qs.execution_count DESC OPTION (RECOMPILE); -- This helps you characterize and baseline your workload --- Top Cached SPs By Avg Elapsed Time (Query 59) (SP Avg Elapsed Time) +-- Top Cached SPs By Avg Elapsed Time (Query 57) (SP Avg Elapsed Time) SELECT TOP(25) p.name AS [SP Name], qs.min_elapsed_time, qs.total_elapsed_time/qs.execution_count AS [avg_elapsed_time], qs.max_elapsed_time, qs.last_elapsed_time, qs.total_elapsed_time, qs.execution_count, ISNULL(qs.execution_count/DATEDIFF(Minute, qs.cached_time, GETDATE()), 0) AS [Calls/Minute], qs.total_worker_time/qs.execution_count AS [AvgWorkerTime], qs.total_worker_time AS [TotalWorkerTime], +CASE WHEN CONVERT(nvarchar(max), qp.query_plan) LIKE N'%%' THEN 1 ELSE 0 END AS [Has Missing Index], FORMAT(qs.last_execution_time, 'yyyy-MM-dd HH:mm:ss', 'en-US') AS [Last Execution Time], FORMAT(qs.cached_time, 'yyyy-MM-dd HH:mm:ss', 'en-US') AS [Plan Cached Time] -- ,qp.query_plan AS [Query Plan] -- Uncomment if you want the Query Plan @@ -1467,7 +1443,7 @@ ORDER BY avg_elapsed_time DESC OPTION (RECOMPILE); --- Top Cached SPs By Total Worker time. Worker time relates to CPU cost (Query 60) (SP Worker Time) +-- Top Cached SPs By Total Worker time. Worker time relates to CPU cost (Query 58) (SP Worker Time) SELECT TOP(25) p.name AS [SP Name], qs.total_worker_time AS [TotalWorkerTime], qs.total_worker_time/qs.execution_count AS [AvgWorkerTime], qs.execution_count, ISNULL(qs.execution_count/DATEDIFF(Minute, qs.cached_time, GETDATE()), 0) AS [Calls/Minute], @@ -1489,7 +1465,7 @@ ORDER BY qs.total_worker_time DESC OPTION (RECOMPILE); -- You should look at this if you see signs of CPU pressure --- Top Cached SPs By Total Logical Reads. Logical reads relate to memory pressure (Query 61) (SP Logical Reads) +-- Top Cached SPs By Total Logical Reads. Logical reads relate to memory pressure (Query 59) (SP Logical Reads) SELECT TOP(25) p.name AS [SP Name], qs.total_logical_reads AS [TotalLogicalReads], qs.total_logical_reads/qs.execution_count AS [AvgLogicalReads],qs.execution_count, ISNULL(qs.execution_count/DATEDIFF(Minute, qs.cached_time, GETDATE()), 0) AS [Calls/Minute], @@ -1511,7 +1487,7 @@ ORDER BY qs.total_logical_reads DESC OPTION (RECOMPILE); -- You should look at this if you see signs of memory pressure --- Top Cached SPs By Total Physical Reads. Physical reads relate to disk read I/O pressure (Query 62) (SP Physical Reads) +-- Top Cached SPs By Total Physical Reads. Physical reads relate to disk read I/O pressure (Query 60) (SP Physical Reads) SELECT TOP(25) p.name AS [SP Name],qs.total_physical_reads AS [TotalPhysicalReads], qs.total_physical_reads/qs.execution_count AS [AvgPhysicalReads], qs.execution_count, qs.total_logical_reads,qs.total_elapsed_time, qs.total_elapsed_time/qs.execution_count AS [avg_elapsed_time], @@ -1533,7 +1509,7 @@ ORDER BY qs.total_physical_reads DESC, qs.total_logical_reads DESC OPTION (RECOM --- Top Cached SPs By Total Logical Writes (Query 63) (SP Logical Writes) +-- Top Cached SPs By Total Logical Writes (Query 61) (SP Logical Writes) -- Logical writes relate to both memory and disk I/O pressure SELECT TOP(25) p.name AS [SP Name], qs.total_logical_writes AS [TotalLogicalWrites], qs.total_logical_writes/qs.execution_count AS [AvgLogicalWrites], qs.execution_count, @@ -1557,7 +1533,7 @@ ORDER BY qs.total_logical_writes DESC OPTION (RECOMPILE); -- You should look at this if you see signs of I/O pressure or of memory pressure --- Lists the top statements by average input/output usage for the current database (Query 64) (Top IO Statements) +-- Lists the top statements by average input/output usage for the current database (Query 62) (Top IO Statements) SELECT TOP(50) OBJECT_NAME(qt.objectid, dbid) AS [SP Name], (qs.total_logical_reads + qs.total_logical_writes) /qs.execution_count AS [Avg IO], qs.execution_count AS [Execution Count], SUBSTRING(qt.[text],qs.statement_start_offset/2, @@ -1576,7 +1552,7 @@ ORDER BY [Avg IO] DESC OPTION (RECOMPILE); --- Possible Bad NC Indexes (writes > reads) (Query 65) (Bad NC Indexes) +-- Possible Bad NC Indexes (writes > reads) (Query 63) (Bad NC Indexes) SELECT OBJECT_NAME(s.[object_id]) AS [Table Name], i.name AS [Index Name], i.index_id, i.is_disabled, i.is_hypothetical, i.has_filter, i.fill_factor, s.user_updates AS [Total Writes], s.user_seeks + s.user_scans + s.user_lookups AS [Total Reads], @@ -1598,7 +1574,7 @@ ORDER BY [Difference] DESC, [Total Writes] DESC, [Total Reads] ASC OPTION (RECOM -- Investigate further before dropping an index! --- Missing Indexes for current database by Index Advantage (Query 66) (Missing Indexes) +-- Missing Indexes for current database by Index Advantage (Query 64) (Missing Indexes) SELECT CONVERT(decimal(18,2), user_seeks * avg_total_user_cost * (avg_user_impact * 0.01)) AS [index_advantage], migs.last_user_seek, mid.[statement] AS [Database.Schema.Table], COUNT(1) OVER(PARTITION BY mid.[statement]) AS [missing_indexes_for_table], @@ -1624,7 +1600,7 @@ ORDER BY index_advantage DESC OPTION (RECOMPILE); -- Do not just blindly add indexes that show up from this query!!! --- Find missing index warnings for cached plans in the current database (Query 67) (Missing Index Warnings) +-- Find missing index warnings for cached plans in the current database (Query 65) (Missing Index Warnings) -- Note: This query could take some time on a busy instance SELECT TOP(25) OBJECT_NAME(objectid) AS [ObjectName], cp.objtype, cp.usecounts, cp.size_in_bytes, query_plan @@ -1639,7 +1615,7 @@ ORDER BY cp.usecounts DESC OPTION (RECOMPILE); -- This can help you decide whether to add them or not --- Breaks down buffers used by current database by object (table, index) in the buffer cache (Query 68) (Buffer Usage) +-- Breaks down buffers used by current database by object (table, index) in the buffer cache (Query 66) (Buffer Usage) -- Note: This query could take some time on a busy instance SELECT OBJECT_NAME(p.[object_id]) AS [Object Name], p.index_id, CAST(COUNT(*)/128.0 AS DECIMAL(10, 2)) AS [Buffer size(MB)], @@ -1663,29 +1639,32 @@ ORDER BY [BufferCount] DESC OPTION (RECOMPILE); -- It can help identify possible candidates for data compression --- Get Table names, row counts, and compression status for clustered index or heap (Query 69) (Table Sizes) -SELECT OBJECT_NAME(object_id) AS [ObjectName], -SUM(Rows) AS [RowCount], data_compression_desc AS [CompressionType] -FROM sys.partitions WITH (NOLOCK) +-- Get Table names, row counts, and compression status for clustered index or heap (Query 67) (Table Sizes) +SELECT SCHEMA_NAME(o.Schema_ID) AS [Schema Name], OBJECT_NAME(p.object_id) AS [ObjectName], +SUM(p.Rows) AS [RowCount], data_compression_desc AS [CompressionType] +FROM sys.partitions AS p WITH (NOLOCK) +INNER JOIN sys.objects AS o WITH (NOLOCK) +ON p.object_id = o.object_id WHERE index_id < 2 --ignore the partitions from the non-clustered index if any -AND OBJECT_NAME(object_id) NOT LIKE N'sys%' -AND OBJECT_NAME(object_id) NOT LIKE N'queue_%' -AND OBJECT_NAME(object_id) NOT LIKE N'filestream_tombstone%' -AND OBJECT_NAME(object_id) NOT LIKE N'fulltext%' -AND OBJECT_NAME(object_id) NOT LIKE N'ifts_comp_fragment%' -AND OBJECT_NAME(object_id) NOT LIKE N'filetable_updates%' -AND OBJECT_NAME(object_id) NOT LIKE N'xml_index_nodes%' -AND OBJECT_NAME(object_id) NOT LIKE N'sqlagent_job%' -AND OBJECT_NAME(object_id) NOT LIKE N'plan_persist%' -GROUP BY object_id, data_compression_desc -ORDER BY SUM(Rows) DESC OPTION (RECOMPILE); +AND OBJECT_NAME(p.object_id) NOT LIKE N'sys%' +AND OBJECT_NAME(p.object_id) NOT LIKE N'spt_%' +AND OBJECT_NAME(p.object_id) NOT LIKE N'queue_%' +AND OBJECT_NAME(p.object_id) NOT LIKE N'filestream_tombstone%' +AND OBJECT_NAME(p.object_id) NOT LIKE N'fulltext%' +AND OBJECT_NAME(p.object_id) NOT LIKE N'ifts_comp_fragment%' +AND OBJECT_NAME(p.object_id) NOT LIKE N'filetable_updates%' +AND OBJECT_NAME(p.object_id) NOT LIKE N'xml_index_nodes%' +AND OBJECT_NAME(p.object_id) NOT LIKE N'sqlagent_job%' +AND OBJECT_NAME(p.object_id) NOT LIKE N'plan_persist%' +GROUP BY SCHEMA_NAME(o.Schema_ID), p.object_id, data_compression_desc +ORDER BY SUM(p.Rows) DESC OPTION (RECOMPILE); ------ -- Gives you an idea of table sizes, and possible data compression opportunities --- Get some key table properties (Query 70) (Table Properties) +-- Get some key table properties (Query 68) (Table Properties) SELECT OBJECT_NAME(t.[object_id]) AS [ObjectName], p.[rows] AS [Table Rows], p.index_id, p.data_compression_desc AS [Index Data Compression], t.create_date, t.lock_on_bulk_load, t.is_replicated, t.has_replication_filter, @@ -1708,7 +1687,7 @@ ORDER BY OBJECT_NAME(t.[object_id]), p.index_id OPTION (RECOMPILE); --- When were Statistics last updated on all indexes? (Query 71) (Statistics Update) +-- When were Statistics last updated on all indexes? (Query 69) (Statistics Update) SELECT SCHEMA_NAME(o.Schema_ID) + N'.' + o.[NAME] AS [Object Name], o.[type_desc] AS [Object Type], i.[name] AS [Index Name], STATS_DATE(i.[object_id], i.index_id) AS [Statistics Date], s.auto_created, s.no_recompute, s.user_created, s.is_incremental, s.is_temporary, @@ -1738,7 +1717,7 @@ ORDER BY STATS_DATE(i.[object_id], i.index_id) DESC OPTION (RECOMPILE); --- Look at most frequently modified indexes and statistics (Query 72) (Volatile Indexes) +-- Look at most frequently modified indexes and statistics (Query 70) (Volatile Indexes) SELECT o.[name] AS [Object Name], o.[object_id], o.[type_desc], s.[name] AS [Statistics Name], s.stats_id, s.no_recompute, s.auto_created, s.is_incremental, s.is_temporary, sp.modification_counter, sp.[rows], sp.rows_sampled, sp.last_updated @@ -1756,7 +1735,7 @@ ORDER BY sp.modification_counter DESC, o.name OPTION (RECOMPILE); --- Get fragmentation info for all indexes above a certain size in the current database (Query 73) (Index Fragmentation) +-- Get fragmentation info for all indexes above a certain size in the current database (Query 71) (Index Fragmentation) -- Note: This query could take some time on a very large database SELECT DB_NAME(ps.database_id) AS [Database Name], SCHEMA_NAME(o.[schema_id]) AS [Schema Name], OBJECT_NAME(ps.OBJECT_ID) AS [Object Name], i.[name] AS [Index Name], ps.index_id, @@ -1778,7 +1757,7 @@ ORDER BY ps.avg_fragmentation_in_percent DESC OPTION (RECOMPILE); -- and how effective your index maintenance strategy is ---- Index Read/Write stats (all tables in current DB) ordered by Reads (Query 74) (Overall Index Usage - Reads) +--- Index Read/Write stats (all tables in current DB) ordered by Reads (Query 72) (Overall Index Usage - Reads) SELECT OBJECT_NAME(i.[object_id]) AS [ObjectName], i.[name] AS [IndexName], i.index_id, s.user_seeks, s.user_scans, s.user_lookups, s.user_seeks + s.user_scans + s.user_lookups AS [Total Reads], @@ -1797,7 +1776,7 @@ ORDER BY s.user_seeks + s.user_scans + s.user_lookups DESC OPTION (RECOMPILE); - -- Show which indexes in the current database are most active for Reads ---- Index Read/Write stats (all tables in current DB) ordered by Writes (Query 75) (Overall Index Usage - Writes) +--- Index Read/Write stats (all tables in current DB) ordered by Writes (Query 73) (Overall Index Usage - Writes) SELECT OBJECT_NAME(i.[object_id]) AS [ObjectName], i.[name] AS [IndexName], i.index_id, s.user_updates AS [Writes], s.user_seeks + s.user_scans + s.user_lookups AS [Total Reads], i.[type_desc] AS [Index Type], i.fill_factor AS [Fill Factor], i.has_filter, i.filter_definition, @@ -1814,7 +1793,7 @@ ORDER BY s.user_updates DESC OPTION (RECOMPILE); -- Order by writes -- Show which indexes in the current database are most active for Writes --- Get in-memory OLTP index usage (Query 76) (XTP Index Usage) +-- Get in-memory OLTP index usage (Query 74) (XTP Index Usage) SELECT OBJECT_NAME(i.[object_id]) AS [Object Name], i.index_id, i.[name] AS [Index Name], i.[type_desc], xis.scans_started, xis.scans_retries, xis.rows_touched, xis.rows_returned @@ -1832,7 +1811,7 @@ ORDER BY OBJECT_NAME(i.[object_id]) OPTION (RECOMPILE); -- https://bit.ly/2GCP8lF --- Look at Columnstore index physical statistics (Query 77) (Columnstore Index Physical Stat) +-- Look at Columnstore index physical statistics (Query 75) (Columnstore Index Physical Stat) SELECT OBJECT_NAME(ps.object_id) AS [TableName], i.[name] AS [IndexName], ps.index_id, ps.partition_number, ps.delta_store_hobt_id, ps.state_desc, ps.total_rows, ps.size_in_bytes, @@ -1850,7 +1829,7 @@ ORDER BY ps.object_id, ps.partition_number, ps.row_group_id OPTION (RECOMPILE); -- https://bit.ly/2q276XQ --- Get lock waits for current database (Query 78) (Lock Waits) +-- Get lock waits for current database (Query 76) (Lock Waits) SELECT o.name AS [table_name], i.name AS [index_name], ios.index_id, ios.partition_number, SUM(ios.row_lock_wait_count) AS [total_row_lock_waits], SUM(ios.row_lock_wait_in_ms) AS [total_row_lock_wait_in_ms], @@ -1873,7 +1852,7 @@ ORDER BY total_lock_wait_in_ms DESC OPTION (RECOMPILE); --- Look at UDF execution statistics (Query 79) (UDF Statistics) +-- Look at UDF execution statistics (Query 77) (UDF Statistics) SELECT OBJECT_NAME(object_id) AS [Function Name], execution_count, total_worker_time, total_logical_reads, total_physical_reads, total_elapsed_time, total_elapsed_time/execution_count AS [avg_elapsed_time], @@ -1891,7 +1870,7 @@ ORDER BY total_worker_time DESC OPTION (RECOMPILE); -- https://bit.ly/2q1Q6BM --- Get Query Store Options for this database (Query 80) (QueryStore Options) +-- Get Query Store Options for this database (Query 78) (QueryStore Options) SELECT actual_state_desc, desired_state_desc, [interval_length_minutes], current_storage_size_mb, [max_storage_size_mb], query_capture_mode_desc, size_based_cleanup_mode_desc @@ -1905,50 +1884,8 @@ FROM sys.database_query_store_options WITH (NOLOCK) OPTION (RECOMPILE); -- https://bit.ly/1kHSl7w --- Get highest aggregate duration queries over last hour (Query 81) (High Aggregate Duration Queries) -WITH AggregatedDurationLastHour -AS -(SELECT q.query_id, SUM(count_executions * avg_duration) AS total_duration, - COUNT (distinct p.plan_id) AS number_of_plans - FROM sys.query_store_query_text AS qt WITH (NOLOCK) - INNER JOIN sys.query_store_query AS q WITH (NOLOCK) - ON qt.query_text_id = q.query_text_id - INNER JOIN sys.query_store_plan AS p WITH (NOLOCK) - ON q.query_id = p.query_id - INNER JOIN sys.query_store_runtime_stats AS rs WITH (NOLOCK) - ON rs.plan_id = p.plan_id - INNER JOIN sys.query_store_runtime_stats_interval AS rsi WITH (NOLOCK) - ON rsi.runtime_stats_interval_id = rs.runtime_stats_interval_id - WHERE rsi.start_time >= DATEADD(hour, -1, GETUTCDATE()) - AND rs.execution_type_desc = N'Regular' - GROUP BY q.query_id), -OrderedDuration AS -(SELECT query_id, total_duration, number_of_plans, - ROW_NUMBER () OVER (ORDER BY total_duration DESC, query_id) AS RN - FROM AggregatedDurationLastHour) -SELECT OBJECT_NAME(q.object_id) AS [Containing Object], qt.query_sql_text, -od.total_duration AS [Total Duration (microsecs)], -od.number_of_plans AS [Plan Count], -p.is_forced_plan, p.is_parallel_plan, p.is_trivial_plan, -q.query_parameterization_type_desc, p.[compatibility_level], -p.last_compile_start_time, q.last_execution_time, -CONVERT(xml, p.query_plan) AS query_plan_xml -FROM OrderedDuration AS od -INNER JOIN sys.query_store_query AS q WITH (NOLOCK) -ON q.query_id = od.query_id -INNER JOIN sys.query_store_query_text AS qt WITH (NOLOCK) -ON q.query_text_id = qt.query_text_id -INNER JOIN sys.query_store_plan AS p WITH (NOLOCK) -ON q.query_id = p.query_id -WHERE od.RN <= 50 -ORDER BY total_duration DESC OPTION (RECOMPILE); ------- - --- New for SQL Server 2016 --- Requires that QueryStore is enabled for this database - --- Get input buffer information for the current database (Query 82) (Input Buffer) +-- Get input buffer information for the current database (Query 79) (Input Buffer) SELECT es.session_id, DB_NAME(es.database_id) AS [Database Name], es.login_time, es.cpu_time, es.logical_reads, es.[status], ib.event_info AS [Input Buffer] @@ -1966,7 +1903,7 @@ AND es.session_id <> @@SPID OPTION (RECOMPILE); --- Look at recent Full backups for the current database (Query 83) (Recent Full Backups) +-- Look at recent Full backups for the current database (Query 80) (Recent Full Backups) SELECT TOP (30) bs.machine_name, bs.server_name, bs.database_name AS [Database Name], bs.recovery_model, CONVERT (BIGINT, bs.backup_size / 1048576 ) AS [Uncompressed Backup Size (MB)], CONVERT (BIGINT, bs.compressed_backup_size / 1048576 ) AS [Compressed Backup Size (MB)], @@ -1993,7 +1930,10 @@ ORDER BY bs.backup_finish_date DESC OPTION (RECOMPILE); -- https://bit.ly/28Rpb2x --- These four Pluralsight Courses go into more detail about how to run these queries and interpret the results +-- These five Pluralsight Courses go into more detail about how to run these queries and interpret the results + +-- SQL Server 2017: Diagnosing Performance Issues with DMVs +-- https://bit.ly/2FqCeti -- SQL Server 2017: Diagnosing Configuration Issues with DMVs -- https://bit.ly/2MSUDUL diff --git a/bin/diagnosticquery/SQLServerDiagnosticQueries_2017_201810.sql b/bin/diagnosticquery/SQLServerDiagnosticQueries_2017_201901.sql similarity index 90% rename from bin/diagnosticquery/SQLServerDiagnosticQueries_2017_201810.sql rename to bin/diagnosticquery/SQLServerDiagnosticQueries_2017_201901.sql index 8f0b104a8e..5f423d835a 100644 --- a/bin/diagnosticquery/SQLServerDiagnosticQueries_2017_201810.sql +++ b/bin/diagnosticquery/SQLServerDiagnosticQueries_2017_201901.sql @@ -1,7 +1,7 @@ -- SQL Server 2017 Diagnostic Information Queries -- Glenn Berry --- Last Modified: November 20, 2018 +-- Last Modified: March 3, 2019 -- https://www.sqlskills.com/blogs/glenn/ -- http://sqlserverperformance.wordpress.com/ -- Twitter: GlennAlanBerry @@ -23,7 +23,7 @@ --****************************************************************************** ---* Copyright (C) 2018 Glenn Berry, SQLskills.com +--* Copyright (C) 2019 Glenn Berry, SQLskills.com --* All rights reserved. --* --* For more scripts and sample code, check out @@ -81,6 +81,7 @@ SELECT @@SERVERNAME AS [Server Name], @@VERSION AS [SQL Server and OS Version In -- 14.0.3037.1 CU10 8/27/2018 https://support.microsoft.com/en-us/help/4342123/cumulative-update-10-for-sql-server-2017 -- 14.0.3038.14 CU11 9/20/2018 https://support.microsoft.com/en-us/help/4462262 -- 14.0.3045.24 CU12 10/23/2018 https://support.microsoft.com/en-us/help/4464082/cumulative-update-12-for-sql-server-2017 +-- 14.0.3048.4 CU13 12/18/2018 https://support.microsoft.com/en-us/help/4466404/cumulative-update-13-for-sql-server-2017 @@ -202,6 +203,9 @@ DBCC TRACESTATUS (-1); -- It is very useful to know what global trace flags are currently enabled as part of the diagnostic process. -- Common trace flags that should be enabled in most cases +-- TF 460 - Improvement: Optional replacement for "String or binary data would be truncated" message with extended information in SQL Server 2017 +-- https://bit.ly/2sboMli + -- TF 3226 - Supresses logging of successful database backup messages to the SQL Server Error Log -- https://bit.ly/2p6MTjS @@ -217,8 +221,8 @@ DBCC TRACESTATUS (-1); -- DBCC TRACEON - Trace Flags (Transact-SQL) -- https://bit.ly/2FuSvPg - - +-- Recommended updates and configuration options for SQL Server 2017 and 2016 with high-performance workloads +-- https://bit.ly/2VVRGTY -- Returns status of instant file initialization (Query 6) (IFI Status) @@ -513,6 +517,7 @@ EXEC sys.xp_instance_regread N'HKEY_LOCAL_MACHINE', N'SYSTEM\CurrentControlSet\s -- This is valid for VMware VMs -- Recommended value for intensive I/O patterns from VMware is: RequestRingPages=32,MaxQueueDepth=254 -- https://kb.vmware.com/s/article/2053145 +-- Does not work on Linux @@ -522,6 +527,7 @@ EXEC sys.xp_instance_regread N'HKEY_LOCAL_MACHINE', N'HARDWARE\DESCRIPTION\Syste -- Helps you understand whether the main system BIOS is up to date, and the possible age of the hardware -- Not as useful for virtualization +-- Does not work on Linux -- Get processor description from Windows Registry (Query 22) (Processor Description) @@ -531,6 +537,7 @@ EXEC sys.xp_instance_regread N'HKEY_LOCAL_MACHINE', N'HARDWARE\DESCRIPTION\Syste -- Gives you the model number and rated clock speed of your processor(s) -- Your processors may be running at less than the rated clock speed due -- to the Windows Power Plan or hardware power management +-- Does not work on Linux -- You can use CPU-Z to get your actual CPU core speed and a lot of other useful information -- https://bit.ly/QhR6xF @@ -540,38 +547,8 @@ EXEC sys.xp_instance_regread N'HKEY_LOCAL_MACHINE', N'HARDWARE\DESCRIPTION\Syste --- See if buffer pool extension (BPE) is enabled (Query 23) (BPE Configuration) -SELECT [path], state_description, current_size_in_kb, -CAST(current_size_in_kb/1048576.0 AS DECIMAL(10,2)) AS [Size (GB)] -FROM sys.dm_os_buffer_pool_extension_configuration WITH (NOLOCK) OPTION (RECOMPILE); ------- - --- BPE is available in both Standard Edition and Enterprise Edition --- It is a more interesting feature for Standard Edition - --- Buffer Pool Extension to SSDs in SQL Server 2014 --- https://bit.ly/1bm08m8 - --- Buffer Pool Extension --- https://bit.ly/2oBuieO - - --- Look at buffer descriptors to see BPE usage by database (Query 24) (BPE Usage) -SELECT DB_NAME(database_id) AS [Database Name], COUNT(page_id) AS [Page Count], -CAST(COUNT(*)/128.0 AS DECIMAL(10, 2)) AS [Buffer size(MB)], -AVG(read_microsec) AS [Avg Read Time (microseconds)] -FROM sys.dm_os_buffer_descriptors WITH (NOLOCK) -WHERE database_id <> 32767 -AND is_in_bpool_extension = 1 -GROUP BY DB_NAME(database_id) -ORDER BY [Buffer size(MB)] DESC OPTION (RECOMPILE); ------- - --- You will see no results if BPE is not enabled or if there is no BPE usage - - --- Get information on location, time and size of any memory dumps from SQL Server (Query 25) (Memory Dump Info) +-- Get information on location, time and size of any memory dumps from SQL Server (Query 23) (Memory Dump Info) SELECT [filename], creation_time, size_in_bytes/1048576.0 AS [Size (MB)] FROM sys.dm_server_memory_dumps WITH (NOLOCK) ORDER BY creation_time DESC OPTION (RECOMPILE); @@ -585,7 +562,7 @@ ORDER BY creation_time DESC OPTION (RECOMPILE); --- Look at Suspect Pages table (Query 26) (Suspect Pages) +-- Look at Suspect Pages table (Query 24) (Suspect Pages) SELECT DB_NAME(database_id) AS [Database Name], [file_id], page_id, event_type, error_count, last_update_date FROM msdb.dbo.suspect_pages WITH (NOLOCK) @@ -608,7 +585,7 @@ ORDER BY database_id OPTION (RECOMPILE); -- https://bit.ly/2Fvr1c9 --- Get number of data files in tempdb database (Query 27) (TempDB Data Files) +-- Get number of data files in tempdb database (Query 25) (TempDB Data Files) EXEC sys.xp_readerrorlog 0, 1, N'The tempdb database has'; ------ @@ -617,7 +594,7 @@ EXEC sys.xp_readerrorlog 0, 1, N'The tempdb database has'; -- This query will return no results if your error log has been recycled since the instance was last started --- File names and paths for all user and system databases on instance (Query 28) (Database Filenames and Paths) +-- File names and paths for all user and system databases on instance (Query 26) (Database Filenames and Paths) SELECT DB_NAME([database_id]) AS [Database Name], [file_id], [name], physical_name, [type_desc], state_desc, is_percent_growth, growth, @@ -637,7 +614,7 @@ ORDER BY DB_NAME([database_id]), [file_id] OPTION (RECOMPILE); -- Is percent growth enabled for any files (which is bad)? --- Drive information for all fixed drives visible to the operating system (Query 29) (Fixed Drives) +-- Drive information for all fixed drives visible to the operating system (Query 27) (Fixed Drives) SELECT fixed_drive_path, drive_type_desc, CONVERT(DECIMAL(18,2), free_space_in_bytes/1073741824.0) AS [Available Space (GB)] FROM sys.dm_os_enumerate_fixed_drives WITH (NOLOCK) OPTION (RECOMPILE); @@ -647,7 +624,7 @@ FROM sys.dm_os_enumerate_fixed_drives WITH (NOLOCK) OPTION (RECOMPILE); --- Volume info for all LUNS that have database files on the current instance (Query 30) (Volume Info) +-- Volume info for all LUNS that have database files on the current instance (Query 28) (Volume Info) SELECT DISTINCT vs.volume_mount_point, vs.file_system_type, vs.logical_volume_name, CONVERT(DECIMAL(18,2), vs.total_bytes/1073741824.0) AS [Total Size (GB)], CONVERT(DECIMAL(18,2), vs.available_bytes/1073741824.0) AS [Available Size (GB)], @@ -667,7 +644,7 @@ ORDER BY vs.volume_mount_point OPTION (RECOMPILE); --- Drive level latency information (Query 31) (Drive Level Latency) +-- Drive level latency information (Query 29) (Drive Level Latency) -- Based on code from Jimmy May SELECT tab.[Drive], tab.volume_mount_point AS [Volume Mount Point], CASE @@ -712,7 +689,7 @@ ORDER BY [Overall Latency] OPTION (RECOMPILE); -- database files on each drive since SQL Server was last started --- Calculates average stalls per read, per write, and per total input/output for each database file (Query 32) (IO Latency by File) +-- Calculates average stalls per read, per write, and per total input/output for each database file (Query 30) (IO Latency by File) SELECT DB_NAME(fs.database_id) AS [Database Name], CAST(fs.io_stall_read_ms/(1.0 + fs.num_of_reads) AS NUMERIC(10,1)) AS [avg_read_latency_ms], CAST(fs.io_stall_write_ms/(1.0 + fs.num_of_writes) AS NUMERIC(10,1)) AS [avg_write_latency_ms], CAST((fs.io_stall_read_ms + fs.io_stall_write_ms)/(1.0 + fs.num_of_reads + fs.num_of_writes) AS NUMERIC(10,1)) AS [avg_io_latency_ms], @@ -733,7 +710,7 @@ ORDER BY avg_io_latency_ms DESC OPTION (RECOMPILE); -- database file since SQL Server was last started --- Look for I/O requests taking longer than 15 seconds in the six most recent SQL Server Error Logs (Query 33) (IO Warnings) +-- Look for I/O requests taking longer than 15 seconds in the six most recent SQL Server Error Logs (Query 31) (IO Warnings) CREATE TABLE #IOWarningResults(LogDate datetime, ProcessInfo sysname, LogText nvarchar(1000)); INSERT INTO #IOWarningResults @@ -769,7 +746,7 @@ DROP TABLE #IOWarningResults; -- https://bit.ly/2qtaw73 --- Resource Governor Resource Pool information (Query 34) (RG Resource Pools) +-- Resource Governor Resource Pool information (Query 32) (RG Resource Pools) SELECT pool_id, [Name], statistics_start_time, min_memory_percent, max_memory_percent, max_memory_kb/1024 AS [max_memory_mb], @@ -785,7 +762,7 @@ OPTION (RECOMPILE); --- Recovery model, log reuse wait description, log file size, log usage size (Query 35) (Database Properties) +-- Recovery model, log reuse wait description, log file size, log usage size (Query 33) (Database Properties) -- and compatibility level for all databases on instance SELECT db.[name] AS [Database Name], SUSER_SNAME(db.owner_sid) AS [Database Owner], db.recovery_model_desc AS [Recovery Model], db.state_desc, db.containment_desc, db.log_reuse_wait_desc AS [Log Reuse Wait Description], @@ -836,7 +813,7 @@ ORDER BY db.[name] OPTION (RECOMPILE); -- https://bit.ly/2pdggk3 --- Missing Indexes for all databases by Index Advantage (Query 36) (Missing Indexes All Databases) +-- Missing Indexes for all databases by Index Advantage (Query 34) (Missing Indexes All Databases) SELECT CONVERT(decimal(18,2), user_seeks * avg_total_user_cost * (avg_user_impact * 0.01)) AS [index_advantage], FORMAT(migs.last_user_seek, 'yyyy-MM-dd HH:mm:ss') AS [last_user_seek], mid.[statement] AS [Database.Schema.Table], @@ -864,7 +841,7 @@ ORDER BY index_advantage DESC OPTION (RECOMPILE); --- Get VLF Counts for all databases on the instance (Query 37) (VLF Counts) +-- Get VLF Counts for all databases on the instance (Query 35) (VLF Counts) SELECT [name] AS [Database Name], [VLF Count] FROM sys.databases AS db WITH (NOLOCK) CROSS APPLY (SELECT file_id, COUNT(*) AS [VLF Count] @@ -885,7 +862,7 @@ ORDER BY [VLF Count] DESC OPTION (RECOMPILE); --- Get CPU utilization by database (Query 38) (CPU Usage by Database) +-- Get CPU utilization by database (Query 36) (CPU Usage by Database) WITH DB_CPU_Stats AS (SELECT pa.DatabaseID, DB_Name(pa.DatabaseID) AS [Database Name], SUM(qs.total_worker_time/1000) AS [CPU_Time_Ms] @@ -903,9 +880,10 @@ ORDER BY [CPU Rank] OPTION (RECOMPILE); ------ -- Helps determine which database is using the most CPU resources on the instance +-- Note: This only reflects CPU usage from the currently cached query plans --- Get I/O utilization by database (Query 39) (IO Usage By Database) +-- Get I/O utilization by database (Query 37) (IO Usage By Database) WITH Aggregate_IO_Statistics AS (SELECT DB_NAME(database_id) AS [Database Name], CAST(SUM(num_of_bytes_read + num_of_bytes_written) / 1048576 AS DECIMAL(12, 2)) AS [ioTotalMB], @@ -929,7 +907,7 @@ ORDER BY [I/O Rank] OPTION (RECOMPILE); -- They include all I/O activity, not just the nominal I/O workload --- Get total buffer usage by database for current instance (Query 40) (Total Buffer Usage by Database) +-- Get total buffer usage by database for current instance (Query 38) (Total Buffer Usage by Database) -- This make take some time to run on a busy instance WITH AggregateBufferPoolUsage AS @@ -948,7 +926,7 @@ ORDER BY [Buffer Pool Rank] OPTION (RECOMPILE); -- is being used by each database on the instance --- Get tempdb version store space usage by database (Query 41) (Version Store Space Usage) +-- Get tempdb version store space usage by database (Query 39) (Version Store Space Usage) SELECT DB_NAME(database_id) AS [Database Name], reserved_page_count AS [Version Store Reserved Page Count], reserved_space_kb/1024 AS [Version Store Reserved Space (MB)] @@ -965,7 +943,7 @@ ORDER BY reserved_space_kb/1024 DESC OPTION (RECOMPILE); -- Clear Wait Stats with this command -- DBCC SQLPERF('sys.dm_os_wait_stats', CLEAR); --- Isolate top waits for server instance since last restart or wait statistics clear (Query 42) (Top Waits) +-- Isolate top waits for server instance since last restart or wait statistics clear (Query 40) (Top Waits) WITH [Waits] AS (SELECT wait_type, wait_time_ms/ 1000.0 AS [WaitS], (wait_time_ms - signal_wait_time_ms) / 1000.0 AS [ResourceS], @@ -1048,7 +1026,7 @@ OPTION (RECOMPILE); --- Get a count of SQL connections by IP address (Query 43) (Connection Counts by IP Address) +-- Get a count of SQL connections by IP address (Query 41) (Connection Counts by IP Address) SELECT ec.client_net_address, es.[program_name], es.[host_name], es.login_name, COUNT(ec.session_id) AS [connection count] FROM sys.dm_exec_sessions AS es WITH (NOLOCK) @@ -1066,7 +1044,7 @@ ORDER BY ec.client_net_address, es.[program_name] OPTION (RECOMPILE); --- Get Average Task Counts (run multiple times) (Query 44) (Avg Task Counts) +-- Get Average Task Counts (run multiple times) (Query 42) (Avg Task Counts) SELECT AVG(current_tasks_count) AS [Avg Task Count], AVG(work_queue_count) AS [Avg Work Queue Count], AVG(runnable_tasks_count) AS [Avg Runnable Task Count], @@ -1087,7 +1065,7 @@ WHERE scheduler_id < 255 OPTION (RECOMPILE); --- Detect blocking (run multiple times) (Query 45) (Detect Blocking) +-- Detect blocking (run multiple times) (Query 43) (Detect Blocking) SELECT t1.resource_type AS [lock type], DB_NAME(resource_database_id) AS [database], t1.resource_associated_entity_id AS [blk object],t1.request_mode AS [lock req], -- lock requested t1.request_session_id AS [waiter sid], t2.wait_duration_ms AS [wait time], -- spid of waiter @@ -1116,7 +1094,7 @@ ON t1.lock_owner_address = t2.resource_address OPTION (RECOMPILE); --- Get CPU Utilization History for last 256 minutes (in one minute intervals) (Query 46) (CPU Utilization History) +-- Get CPU Utilization History for last 256 minutes (in one minute intervals) (Query 44) (CPU Utilization History) DECLARE @ts_now bigint = (SELECT cpu_ticks/(cpu_ticks/ms_ticks) FROM sys.dm_os_sys_info WITH (NOLOCK)); SELECT TOP(256) SQLProcessUtilization AS [SQL Server Process CPU Utilization], @@ -1141,7 +1119,7 @@ ORDER BY record_id DESC OPTION (RECOMPILE); -- on high core count (> 64 cores) systems --- Get top total worker time queries for entire instance (Query 47) (Top Worker Time Queries) +-- Get top total worker time queries for entire instance (Query 45) (Top Worker Time Queries) SELECT TOP(50) DB_NAME(t.[dbid]) AS [Database Name], REPLACE(REPLACE(LEFT(t.[text], 255), CHAR(10),''), CHAR(13),'') AS [Short Query Text], qs.total_worker_time AS [Total Worker Time], qs.min_worker_time AS [Min Worker Time], @@ -1169,7 +1147,7 @@ ORDER BY qs.total_worker_time DESC OPTION (RECOMPILE); --- Page Life Expectancy (PLE) value for each NUMA node in current instance (Query 48) (PLE by NUMA Node) +-- Page Life Expectancy (PLE) value for each NUMA node in current instance (Query 46) (PLE by NUMA Node) SELECT @@SERVERNAME AS [Server Name], RTRIM([object_name]) AS [Object Name], instance_name, cntr_value AS [Page Life Expectancy] FROM sys.dm_os_performance_counters WITH (NOLOCK) WHERE [object_name] LIKE N'%Buffer Node%' -- Handles named instances @@ -1184,7 +1162,7 @@ AND counter_name = N'Page life expectancy' OPTION (RECOMPILE); -- https://bit.ly/2EgynLa --- Memory Grants Pending value for current instance (Query 49) (Memory Grants Pending) +-- Memory Grants Pending value for current instance (Query 47) (Memory Grants Pending) SELECT @@SERVERNAME AS [Server Name], RTRIM([object_name]) AS [Object Name], cntr_value AS [Memory Grants Pending] FROM sys.dm_os_performance_counters WITH (NOLOCK) WHERE [object_name] LIKE N'%Memory Manager%' -- Handles named instances @@ -1195,7 +1173,7 @@ AND counter_name = N'Memory Grants Pending' OPTION (RECOMPILE); -- Memory Grants Pending above zero for a sustained period is a very strong indicator of internal memory pressure --- Memory Clerk Usage for instance (Query 50) (Memory Clerk Usage) +-- Memory Clerk Usage for instance (Query 48) (Memory Clerk Usage) -- Look for high value for CACHESTORE_SQLCP (Ad-hoc query plans) SELECT TOP(10) mc.[type] AS [Memory Clerk Type], CAST((SUM(mc.pages_kb)/1024.0) AS DECIMAL (15,2)) AS [Memory Usage (MB)] @@ -1220,7 +1198,7 @@ ORDER BY SUM(mc.pages_kb) DESC OPTION (RECOMPILE); --- Find single-use, ad-hoc and prepared queries that are bloating the plan cache (Query 51) (Ad hoc Queries) +-- Find single-use, ad-hoc and prepared queries that are bloating the plan cache (Query 49) (Ad hoc Queries) SELECT TOP(50) DB_NAME(t.[dbid]) AS [Database Name], t.[text] AS [Query Text], cp.objtype AS [Object Type], cp.cacheobjtype AS [Cache Object Type], cp.size_in_bytes/1024 AS [Plan Size in KB] @@ -1241,7 +1219,7 @@ ORDER BY cp.size_in_bytes DESC, DB_NAME(t.[dbid]) OPTION (RECOMPILE); -- https://bit.ly/2EfYOkl --- Get top total logical reads queries for entire instance (Query 52) (Top Logical Reads Queries) +-- Get top total logical reads queries for entire instance (Query 50) (Top Logical Reads Queries) SELECT TOP(50) DB_NAME(t.[dbid]) AS [Database Name], REPLACE(REPLACE(LEFT(t.[text], 255), CHAR(10),''), CHAR(13),'') AS [Short Query Text], qs.total_logical_reads AS [Total Logical Reads], @@ -1269,7 +1247,7 @@ ORDER BY qs.total_logical_reads DESC OPTION (RECOMPILE); -- Can also help track down parameter sniffing issues --- Get top average elapsed time queries for entire instance (Query 53) (Top Avg Elapsed Time Queries) +-- Get top average elapsed time queries for entire instance (Query 51) (Top Avg Elapsed Time Queries) SELECT TOP(50) DB_NAME(t.[dbid]) AS [Database Name], REPLACE(REPLACE(LEFT(t.[text], 255), CHAR(10),''), CHAR(13),'') AS [Short Query Text], qs.total_elapsed_time/qs.execution_count AS [Avg Elapsed Time], @@ -1291,7 +1269,7 @@ ORDER BY qs.total_elapsed_time/qs.execution_count DESC OPTION (RECOMPILE); -- Can also help track down parameter sniffing issues --- Look at UDF execution statistics (Query 54) (UDF Stats by DB) +-- Look at UDF execution statistics (Query 52) (UDF Stats by DB) SELECT TOP (25) DB_NAME(database_id) AS [Database Name], OBJECT_NAME(object_id, database_id) AS [Function Name], total_worker_time, execution_count, total_elapsed_time, @@ -1314,7 +1292,7 @@ ORDER BY total_worker_time DESC OPTION (RECOMPILE); --USE YourDatabaseName; -- make sure to change to an actual database on your instance, not the master system database --GO --- Individual File Sizes and space available for current database (Query 55) (File Sizes and Space) +-- Individual File Sizes and space available for current database (Query 53) (File Sizes and Space) SELECT f.name AS [File Name] , f.physical_name AS [Physical Name], CAST((f.size/128.0) AS DECIMAL(15,2)) AS [Total Size in MB], CAST(f.size/128.0 - CAST(FILEPROPERTY(f.name, 'SpaceUsed') AS int)/128.0 AS DECIMAL(15,2)) @@ -1336,7 +1314,7 @@ ORDER BY f.[file_id] OPTION (RECOMPILE); -- https://bit.ly/2evRZSR --- Log space usage for current database (Query 56) (Log Space Usage) +-- Log space usage for current database (Query 54) (Log Space Usage) SELECT DB_NAME(lsu.database_id) AS [Database Name], db.recovery_model_desc AS [Recovery Model], CAST(lsu.total_log_size_in_bytes/1048576.0 AS DECIMAL(10, 2)) AS [Total Log Space (MB)], CAST(lsu.used_log_space_in_bytes/1048576.0 AS DECIMAL(10, 2)) AS [Used Log Space (MB)], @@ -1355,7 +1333,7 @@ OPTION (RECOMPILE); -- https://bit.ly/2H4MQw9 --- Status of last VLF for current database (Query 57) (Last VLF Status) +-- Status of last VLF for current database (Query 55) (Last VLF Status) SELECT TOP(1) DB_NAME(li.database_id) AS [Database Name], li.[file_id], li.vlf_size_mb, li.vlf_sequence_number, li.vlf_active, li.vlf_status FROM sys.dm_db_log_info(DB_ID()) AS li @@ -1374,7 +1352,7 @@ ORDER BY vlf_sequence_number DESC OPTION (RECOMPILE); --- Get database scoped configuration values for current database (Query 58) (Database-scoped Configurations) +-- Get database scoped configuration values for current database (Query 56) (Database-scoped Configurations) SELECT configuration_id, name, [value] AS [value_for_primary], value_for_secondary FROM sys.database_scoped_configurations WITH (NOLOCK) OPTION (RECOMPILE); ------ @@ -1388,19 +1366,19 @@ FROM sys.database_scoped_configurations WITH (NOLOCK) OPTION (RECOMPILE); -- https://bit.ly/2sOH7nb --- I/O Statistics by file for the current database (Query 59) (IO Stats By File) +-- I/O Statistics by file for the current database (Query 57) (IO Stats By File) SELECT DB_NAME(DB_ID()) AS [Database Name], df.name AS [Logical Name], vfs.[file_id], df.type_desc, -df.physical_name AS [Physical Name], CAST(vfs.size_on_disk_bytes/1048576.0 AS DECIMAL(10, 2)) AS [Size on Disk (MB)], +df.physical_name AS [Physical Name], CAST(vfs.size_on_disk_bytes/1048576.0 AS DECIMAL(16, 2)) AS [Size on Disk (MB)], vfs.num_of_reads, vfs.num_of_writes, vfs.io_stall_read_ms, vfs.io_stall_write_ms, -CAST(100. * vfs.io_stall_read_ms/(vfs.io_stall_read_ms + vfs.io_stall_write_ms) AS DECIMAL(10,1)) AS [IO Stall Reads Pct], -CAST(100. * vfs.io_stall_write_ms/(vfs.io_stall_write_ms + vfs.io_stall_read_ms) AS DECIMAL(10,1)) AS [IO Stall Writes Pct], +CAST(100. * vfs.io_stall_read_ms/(vfs.io_stall_read_ms + vfs.io_stall_write_ms) AS DECIMAL(16,1)) AS [IO Stall Reads Pct], +CAST(100. * vfs.io_stall_write_ms/(vfs.io_stall_write_ms + vfs.io_stall_read_ms) AS DECIMAL(16,1)) AS [IO Stall Writes Pct], (vfs.num_of_reads + vfs.num_of_writes) AS [Writes + Reads], -CAST(vfs.num_of_bytes_read/1048576.0 AS DECIMAL(10, 2)) AS [MB Read], -CAST(vfs.num_of_bytes_written/1048576.0 AS DECIMAL(10, 2)) AS [MB Written], -CAST(100. * vfs.num_of_reads/(vfs.num_of_reads + vfs.num_of_writes) AS DECIMAL(10,1)) AS [# Reads Pct], -CAST(100. * vfs.num_of_writes/(vfs.num_of_reads + vfs.num_of_writes) AS DECIMAL(10,1)) AS [# Write Pct], -CAST(100. * vfs.num_of_bytes_read/(vfs.num_of_bytes_read + vfs.num_of_bytes_written) AS DECIMAL(10,1)) AS [Read Bytes Pct], -CAST(100. * vfs.num_of_bytes_written/(vfs.num_of_bytes_read + vfs.num_of_bytes_written) AS DECIMAL(10,1)) AS [Written Bytes Pct] +CAST(vfs.num_of_bytes_read/1048576.0 AS DECIMAL(16, 2)) AS [MB Read], +CAST(vfs.num_of_bytes_written/1048576.0 AS DECIMAL(16, 2)) AS [MB Written], +CAST(100. * vfs.num_of_reads/(vfs.num_of_reads + vfs.num_of_writes) AS DECIMAL(16,1)) AS [# Reads Pct], +CAST(100. * vfs.num_of_writes/(vfs.num_of_reads + vfs.num_of_writes) AS DECIMAL(16,1)) AS [# Write Pct], +CAST(100. * vfs.num_of_bytes_read/(vfs.num_of_bytes_read + vfs.num_of_bytes_written) AS DECIMAL(16,1)) AS [Read Bytes Pct], +CAST(100. * vfs.num_of_bytes_written/(vfs.num_of_bytes_read + vfs.num_of_bytes_written) AS DECIMAL(16,1)) AS [Written Bytes Pct] FROM sys.dm_io_virtual_file_stats(DB_ID(), NULL) AS vfs INNER JOIN sys.database_files AS df WITH (NOLOCK) ON vfs.[file_id]= df.[file_id] OPTION (RECOMPILE); @@ -1411,7 +1389,7 @@ ON vfs.[file_id]= df.[file_id] OPTION (RECOMPILE); --- Get most frequently executed queries for this database (Query 60) (Query Execution Counts) +-- Get most frequently executed queries for this database (Query 58) (Query Execution Counts) SELECT TOP(50) LEFT(t.[text], 50) AS [Short Query Text], qs.execution_count AS [Execution Count], qs.total_logical_reads AS [Total Logical Reads], qs.total_logical_reads/qs.execution_count AS [Avg Logical Reads], @@ -1430,9 +1408,9 @@ ORDER BY qs.execution_count DESC OPTION (RECOMPILE); ------ --- Queries 61 through 66 are the "Bad Man List" for stored procedures +-- Queries 59 through 64 are the "Bad Man List" for stored procedures --- Top Cached SPs By Execution Count (Query 61) (SP Execution Counts) +-- Top Cached SPs By Execution Count (Query 59) (SP Execution Counts) SELECT TOP(100) p.name AS [SP Name], qs.execution_count AS [Execution Count], ISNULL(qs.execution_count/DATEDIFF(Minute, qs.cached_time, GETDATE()), 0) AS [Calls/Minute], qs.total_elapsed_time/qs.execution_count AS [Avg Elapsed Time], @@ -1455,7 +1433,7 @@ ORDER BY qs.execution_count DESC OPTION (RECOMPILE); -- This helps you characterize and baseline your workload --- Top Cached SPs By Avg Elapsed Time (Query 62) (SP Avg Elapsed Time) +-- Top Cached SPs By Avg Elapsed Time (Query 60) (SP Avg Elapsed Time) SELECT TOP(25) p.name AS [SP Name], qs.min_elapsed_time, qs.total_elapsed_time/qs.execution_count AS [avg_elapsed_time], qs.max_elapsed_time, qs.last_elapsed_time, qs.total_elapsed_time, qs.execution_count, ISNULL(qs.execution_count/DATEDIFF(Minute, qs.cached_time, GETDATE()), 0) AS [Calls/Minute], @@ -1479,7 +1457,7 @@ ORDER BY avg_elapsed_time DESC OPTION (RECOMPILE); --- Top Cached SPs By Total Worker time. Worker time relates to CPU cost (Query 63) (SP Worker Time) +-- Top Cached SPs By Total Worker time. Worker time relates to CPU cost (Query 61) (SP Worker Time) SELECT TOP(25) p.name AS [SP Name], qs.total_worker_time AS [TotalWorkerTime], qs.total_worker_time/qs.execution_count AS [AvgWorkerTime], qs.execution_count, ISNULL(qs.execution_count/DATEDIFF(Minute, qs.cached_time, GETDATE()), 0) AS [Calls/Minute], @@ -1501,7 +1479,7 @@ ORDER BY qs.total_worker_time DESC OPTION (RECOMPILE); -- You should look at this if you see signs of CPU pressure --- Top Cached SPs By Total Logical Reads. Logical reads relate to memory pressure (Query 64) (SP Logical Reads) +-- Top Cached SPs By Total Logical Reads. Logical reads relate to memory pressure (Query 62) (SP Logical Reads) SELECT TOP(25) p.name AS [SP Name], qs.total_logical_reads AS [TotalLogicalReads], qs.total_logical_reads/qs.execution_count AS [AvgLogicalReads],qs.execution_count, ISNULL(qs.execution_count/DATEDIFF(Minute, qs.cached_time, GETDATE()), 0) AS [Calls/Minute], @@ -1523,7 +1501,7 @@ ORDER BY qs.total_logical_reads DESC OPTION (RECOMPILE); -- You should look at this if you see signs of memory pressure --- Top Cached SPs By Total Physical Reads. Physical reads relate to disk read I/O pressure (Query 65) (SP Physical Reads) +-- Top Cached SPs By Total Physical Reads. Physical reads relate to disk read I/O pressure (Query 63) (SP Physical Reads) SELECT TOP(25) p.name AS [SP Name],qs.total_physical_reads AS [TotalPhysicalReads], qs.total_physical_reads/qs.execution_count AS [AvgPhysicalReads], qs.execution_count, qs.total_logical_reads,qs.total_elapsed_time, qs.total_elapsed_time/qs.execution_count AS [avg_elapsed_time], @@ -1545,7 +1523,7 @@ ORDER BY qs.total_physical_reads DESC, qs.total_logical_reads DESC OPTION (RECOM --- Top Cached SPs By Total Logical Writes (Query 66) (SP Logical Writes) +-- Top Cached SPs By Total Logical Writes (Query 64) (SP Logical Writes) -- Logical writes relate to both memory and disk I/O pressure SELECT TOP(25) p.name AS [SP Name], qs.total_logical_writes AS [TotalLogicalWrites], qs.total_logical_writes/qs.execution_count AS [AvgLogicalWrites], qs.execution_count, @@ -1569,7 +1547,7 @@ ORDER BY qs.total_logical_writes DESC OPTION (RECOMPILE); -- You should look at this if you see signs of I/O pressure or of memory pressure --- Lists the top statements by average input/output usage for the current database (Query 67) (Top IO Statements) +-- Lists the top statements by average input/output usage for the current database (Query 65) (Top IO Statements) SELECT TOP(50) OBJECT_NAME(qt.objectid, dbid) AS [SP Name], (qs.total_logical_reads + qs.total_logical_writes) /qs.execution_count AS [Avg IO], qs.execution_count AS [Execution Count], SUBSTRING(qt.[text],qs.statement_start_offset/2, @@ -1588,7 +1566,7 @@ ORDER BY [Avg IO] DESC OPTION (RECOMPILE); --- Possible Bad NC Indexes (writes > reads) (Query 68) (Bad NC Indexes) +-- Possible Bad NC Indexes (writes > reads) (Query 66) (Bad NC Indexes) SELECT OBJECT_NAME(s.[object_id]) AS [Table Name], i.name AS [Index Name], i.index_id, i.is_disabled, i.is_hypothetical, i.has_filter, i.fill_factor, s.user_updates AS [Total Writes], s.user_seeks + s.user_scans + s.user_lookups AS [Total Reads], @@ -1610,7 +1588,7 @@ ORDER BY [Difference] DESC, [Total Writes] DESC, [Total Reads] ASC OPTION (RECOM -- Investigate further before dropping an index! --- Missing Indexes for current database by Index Advantage (Query 69) (Missing Indexes) +-- Missing Indexes for current database by Index Advantage (Query 67) (Missing Indexes) SELECT DISTINCT CONVERT(decimal(18,2), user_seeks * avg_total_user_cost * (avg_user_impact * 0.01)) AS [index_advantage], migs.last_user_seek, mid.[statement] AS [Database.Schema.Table], mid.equality_columns, mid.inequality_columns, mid.included_columns, @@ -1633,7 +1611,7 @@ ORDER BY index_advantage DESC OPTION (RECOMPILE); -- Do not just blindly add indexes that show up from this query!!! --- Find missing index warnings for cached plans in the current database (Query 70) (Missing Index Warnings) +-- Find missing index warnings for cached plans in the current database (Query 68) (Missing Index Warnings) -- Note: This query could take some time on a busy instance SELECT TOP(25) OBJECT_NAME(objectid) AS [ObjectName], cp.objtype, cp.usecounts, cp.size_in_bytes, query_plan @@ -1648,7 +1626,7 @@ ORDER BY cp.usecounts DESC OPTION (RECOMPILE); -- This can help you decide whether to add them or not --- Breaks down buffers used by current database by object (table, index) in the buffer cache (Query 71) (Buffer Usage) +-- Breaks down buffers used by current database by object (table, index) in the buffer cache (Query 69) (Buffer Usage) -- Note: This query could take some time on a busy instance SELECT OBJECT_NAME(p.[object_id]) AS [Object Name], p.index_id, CAST(COUNT(*)/128.0 AS DECIMAL(10, 2)) AS [Buffer size(MB)], @@ -1672,29 +1650,32 @@ ORDER BY [BufferCount] DESC OPTION (RECOMPILE); -- It can help identify possible candidates for data compression --- Get Table names, row counts, and compression status for clustered index or heap (Query 72) (Table Sizes) -SELECT OBJECT_NAME(object_id) AS [ObjectName], -SUM(Rows) AS [RowCount], data_compression_desc AS [CompressionType] -FROM sys.partitions WITH (NOLOCK) +-- Get Table names, row counts, and compression status for clustered index or heap (Query 70) (Table Sizes) +SELECT SCHEMA_NAME(o.Schema_ID) AS [Schema Name], OBJECT_NAME(p.object_id) AS [ObjectName], +SUM(p.Rows) AS [RowCount], data_compression_desc AS [CompressionType] +FROM sys.partitions AS p WITH (NOLOCK) +INNER JOIN sys.objects AS o WITH (NOLOCK) +ON p.object_id = o.object_id WHERE index_id < 2 --ignore the partitions from the non-clustered index if any -AND OBJECT_NAME(object_id) NOT LIKE N'sys%' -AND OBJECT_NAME(object_id) NOT LIKE N'queue_%' -AND OBJECT_NAME(object_id) NOT LIKE N'filestream_tombstone%' -AND OBJECT_NAME(object_id) NOT LIKE N'fulltext%' -AND OBJECT_NAME(object_id) NOT LIKE N'ifts_comp_fragment%' -AND OBJECT_NAME(object_id) NOT LIKE N'filetable_updates%' -AND OBJECT_NAME(object_id) NOT LIKE N'xml_index_nodes%' -AND OBJECT_NAME(object_id) NOT LIKE N'sqlagent_job%' -AND OBJECT_NAME(object_id) NOT LIKE N'plan_persist%' -GROUP BY object_id, data_compression_desc -ORDER BY SUM(Rows) DESC OPTION (RECOMPILE); +AND OBJECT_NAME(p.object_id) NOT LIKE N'sys%' +AND OBJECT_NAME(p.object_id) NOT LIKE N'spt_%' +AND OBJECT_NAME(p.object_id) NOT LIKE N'queue_%' +AND OBJECT_NAME(p.object_id) NOT LIKE N'filestream_tombstone%' +AND OBJECT_NAME(p.object_id) NOT LIKE N'fulltext%' +AND OBJECT_NAME(p.object_id) NOT LIKE N'ifts_comp_fragment%' +AND OBJECT_NAME(p.object_id) NOT LIKE N'filetable_updates%' +AND OBJECT_NAME(p.object_id) NOT LIKE N'xml_index_nodes%' +AND OBJECT_NAME(p.object_id) NOT LIKE N'sqlagent_job%' +AND OBJECT_NAME(p.object_id) NOT LIKE N'plan_persist%' +GROUP BY SCHEMA_NAME(o.Schema_ID), p.object_id, data_compression_desc +ORDER BY SUM(p.Rows) DESC OPTION (RECOMPILE); ------ -- Gives you an idea of table sizes, and possible data compression opportunities --- Get some key table properties (Query 73) (Table Properties) +-- Get some key table properties (Query 71) (Table Properties) SELECT OBJECT_NAME(t.[object_id]) AS [ObjectName], p.[rows] AS [Table Rows], p.index_id, p.data_compression_desc AS [Index Data Compression], t.create_date, t.lock_on_bulk_load, t.is_replicated, t.has_replication_filter, @@ -1717,7 +1698,7 @@ ORDER BY OBJECT_NAME(t.[object_id]), p.index_id OPTION (RECOMPILE); --- When were Statistics last updated on all indexes? (Query 74) (Statistics Update) +-- When were Statistics last updated on all indexes? (Query 72) (Statistics Update) SELECT SCHEMA_NAME(o.Schema_ID) + N'.' + o.[NAME] AS [Object Name], o.[type_desc] AS [Object Type], i.[name] AS [Index Name], STATS_DATE(i.[object_id], i.index_id) AS [Statistics Date], s.auto_created, s.no_recompute, s.user_created, s.is_incremental, s.is_temporary, @@ -1748,7 +1729,7 @@ ORDER BY STATS_DATE(i.[object_id], i.index_id) DESC OPTION (RECOMPILE); --- Look at most frequently modified indexes and statistics (Query 75) (Volatile Indexes) +-- Look at most frequently modified indexes and statistics (Query 73) (Volatile Indexes) SELECT o.[name] AS [Object Name], o.[object_id], o.[type_desc], s.[name] AS [Statistics Name], s.stats_id, s.no_recompute, s.auto_created, s.is_incremental, s.is_temporary, sp.modification_counter, sp.[rows], sp.rows_sampled, sp.last_updated @@ -1766,7 +1747,7 @@ ORDER BY sp.modification_counter DESC, o.name OPTION (RECOMPILE); --- Get fragmentation info for all indexes above a certain size in the current database (Query 76) (Index Fragmentation) +-- Get fragmentation info for all indexes above a certain size in the current database (Query 74) (Index Fragmentation) -- Note: This query could take some time on a very large database SELECT DB_NAME(ps.database_id) AS [Database Name], SCHEMA_NAME(o.[schema_id]) AS [Schema Name], OBJECT_NAME(ps.OBJECT_ID) AS [Object Name], i.[name] AS [Index Name], ps.index_id, @@ -1788,7 +1769,7 @@ ORDER BY ps.avg_fragmentation_in_percent DESC OPTION (RECOMPILE); -- and how effective your index maintenance strategy is ---- Index Read/Write stats (all tables in current DB) ordered by Reads (Query 77) (Overall Index Usage - Reads) +--- Index Read/Write stats (all tables in current DB) ordered by Reads (Query 75) (Overall Index Usage - Reads) SELECT OBJECT_NAME(i.[object_id]) AS [ObjectName], i.[name] AS [IndexName], i.index_id, s.user_seeks, s.user_scans, s.user_lookups, s.user_seeks + s.user_scans + s.user_lookups AS [Total Reads], @@ -1807,7 +1788,7 @@ ORDER BY s.user_seeks + s.user_scans + s.user_lookups DESC OPTION (RECOMPILE); - -- Show which indexes in the current database are most active for Reads ---- Index Read/Write stats (all tables in current DB) ordered by Writes (Query 78) (Overall Index Usage - Writes) +--- Index Read/Write stats (all tables in current DB) ordered by Writes (Query 76) (Overall Index Usage - Writes) SELECT OBJECT_NAME(i.[object_id]) AS [ObjectName], i.[name] AS [IndexName], i.index_id, s.user_updates AS [Writes], s.user_seeks + s.user_scans + s.user_lookups AS [Total Reads], i.[type_desc] AS [Index Type], i.fill_factor AS [Fill Factor], i.has_filter, i.filter_definition, @@ -1824,7 +1805,7 @@ ORDER BY s.user_updates DESC OPTION (RECOMPILE); -- Order by writes -- Show which indexes in the current database are most active for Writes --- Get in-memory OLTP index usage (Query 79) (XTP Index Usage) +-- Get in-memory OLTP index usage (Query 77) (XTP Index Usage) SELECT OBJECT_NAME(i.[object_id]) AS [Object Name], i.index_id, i.[name] AS [Index Name], i.[type_desc], xis.scans_started, xis.scans_retries, xis.rows_touched, xis.rows_returned @@ -1843,7 +1824,7 @@ ORDER BY OBJECT_NAME(i.[object_id]) OPTION (RECOMPILE); --- Look at Columnstore index physical statistics (Query 80) (Columnstore Index Physical Stat) +-- Look at Columnstore index physical statistics (Query 78) (Columnstore Index Physical Stat) SELECT OBJECT_NAME(ps.object_id) AS [TableName], i.[name] AS [IndexName], ps.index_id, ps.partition_number, ps.delta_store_hobt_id, ps.state_desc, ps.total_rows, ps.size_in_bytes, @@ -1862,7 +1843,7 @@ ORDER BY ps.object_id, ps.partition_number, ps.row_group_id OPTION (RECOMPILE); --- Get lock waits for current database (Query 81) (Lock Waits) +-- Get lock waits for current database (Query 79) (Lock Waits) SELECT o.name AS [table_name], i.name AS [index_name], ios.index_id, ios.partition_number, SUM(ios.row_lock_wait_count) AS [total_row_lock_waits], SUM(ios.row_lock_wait_in_ms) AS [total_row_lock_wait_in_ms], @@ -1885,7 +1866,7 @@ ORDER BY total_lock_wait_in_ms DESC OPTION (RECOMPILE); --- Look at UDF execution statistics (Query 82) (UDF Statistics) +-- Look at UDF execution statistics (Query 80) (UDF Statistics) SELECT OBJECT_NAME(object_id) AS [Function Name], execution_count, total_worker_time, total_logical_reads, total_physical_reads, total_elapsed_time, total_elapsed_time/execution_count AS [avg_elapsed_time], @@ -1903,7 +1884,7 @@ ORDER BY total_worker_time DESC OPTION (RECOMPILE); -- https://bit.ly/2q1Q6BM --- Get QueryStore Options for this database (Query 83) (QueryStore Options) +-- Get QueryStore Options for this database (Query 81) (QueryStore Options) SELECT actual_state_desc, desired_state_desc, [interval_length_minutes], current_storage_size_mb, [max_storage_size_mb], query_capture_mode_desc, size_based_cleanup_mode_desc @@ -1920,96 +1901,8 @@ FROM sys.database_query_store_options WITH (NOLOCK) OPTION (RECOMPILE); -- https://bit.ly/1kHSl7w --- Get highest aggregate duration queries over last hour (Query 84) (High Aggregate Duration Queries) -WITH AggregatedDurationLastHour -AS -(SELECT q.query_id, SUM(rs.count_executions * rs.avg_duration) AS total_duration, - COUNT (DISTINCT p.plan_id) AS number_of_plans - FROM sys.query_store_query_text AS qt WITH (NOLOCK) - INNER JOIN sys.query_store_query AS q WITH (NOLOCK) - ON qt.query_text_id = q.query_text_id - INNER JOIN sys.query_store_plan AS p WITH (NOLOCK) - ON q.query_id = p.query_id - INNER JOIN sys.query_store_runtime_stats AS rs WITH (NOLOCK) - ON rs.plan_id = p.plan_id - INNER JOIN sys.query_store_runtime_stats_interval AS rsi WITH (NOLOCK) - ON rsi.runtime_stats_interval_id = rs.runtime_stats_interval_id - WHERE rsi.start_time >= DATEADD(hour, -1, GETUTCDATE()) - AND rs.execution_type_desc = N'Regular' - GROUP BY q.query_id), OrderedDuration -AS -(SELECT query_id, total_duration, number_of_plans, - ROW_NUMBER () OVER (ORDER BY total_duration DESC, query_id) AS RN - FROM AggregatedDurationLastHour) -SELECT OBJECT_NAME(q.object_id) AS [Containing Object], qt.query_sql_text, -od.total_duration AS [Total Duration (microsecs)], -od.number_of_plans AS [Plan Count], -p.is_forced_plan, p.is_parallel_plan, p.is_trivial_plan, -q.query_parameterization_type_desc, p.[compatibility_level], -p.last_compile_start_time, -q.last_execution_time, -CONVERT(xml, p.query_plan) AS query_plan_xml -FROM OrderedDuration AS od -INNER JOIN sys.query_store_query AS q WITH (NOLOCK) -ON q.query_id = od.query_id -INNER JOIN sys.query_store_query_text AS qt WITH (NOLOCK) -ON q.query_text_id = qt.query_text_id -INNER JOIN sys.query_store_plan AS p WITH (NOLOCK) -ON q.query_id = p.query_id -WHERE od.RN <= 50 -ORDER BY od.total_duration DESC OPTION (RECOMPILE); ------- - --- New for SQL Server 2016 --- Requires that QueryStore is enabled for this database - - --- Get highest aggregate CPU time queries over last hour (Query 85) (High Aggregate CPU Queries) -WITH AggregatedCPULastHour -AS -(SELECT q.query_id, SUM(rs.count_executions * rs.avg_cpu_time) AS total_cpu_time, - COUNT (DISTINCT p.plan_id) AS number_of_plans - FROM sys.query_store_query_text AS qt WITH (NOLOCK) - INNER JOIN sys.query_store_query AS q WITH (NOLOCK) - ON qt.query_text_id = q.query_text_id - INNER JOIN sys.query_store_plan AS p WITH (NOLOCK) - ON q.query_id = p.query_id - INNER JOIN sys.query_store_runtime_stats AS rs WITH (NOLOCK) - ON rs.plan_id = p.plan_id - INNER JOIN sys.query_store_runtime_stats_interval AS rsi WITH (NOLOCK) - ON rsi.runtime_stats_interval_id = rs.runtime_stats_interval_id - WHERE rsi.start_time >= DATEADD(hour, -1, GETUTCDATE()) - AND rs.execution_type_desc = N'Regular' - GROUP BY q.query_id), OrderedDuration -AS -(SELECT query_id, total_cpu_time, number_of_plans, - ROW_NUMBER () OVER (ORDER BY total_cpu_time DESC, query_id) AS RN - FROM AggregatedCPULastHour) -SELECT OBJECT_NAME(q.object_id) AS [Containing Object], qt.query_sql_text, -od.total_cpu_time AS [Total CPU Time (microsecs)], -od.number_of_plans AS [Plan Count], -p.is_forced_plan, p.is_parallel_plan, p.is_trivial_plan, -q.query_parameterization_type_desc, p.[compatibility_level], -p.last_compile_start_time, -q.last_execution_time, -CONVERT(xml, p.query_plan) AS query_plan_xml -FROM OrderedDuration AS od -INNER JOIN sys.query_store_query AS q WITH (NOLOCK) -ON q.query_id = od.query_id -INNER JOIN sys.query_store_query_text AS qt WITH (NOLOCK) -ON q.query_text_id = qt.query_text_id -INNER JOIN sys.query_store_plan AS p WITH (NOLOCK) -ON q.query_id = p.query_id -WHERE od.RN <= 50 -ORDER BY od.total_cpu_time DESC OPTION (RECOMPILE); ------- - --- New for SQL Server 2016 --- Requires that QueryStore is enabled for this database - - --- Get input buffer information for the current database (Query 86) (Input Buffer) +-- Get input buffer information for the current database (Query 82) (Input Buffer) SELECT es.session_id, DB_NAME(es.database_id) AS [Database Name], es.login_time, es.cpu_time, es.logical_reads, es.memory_usage, es.[status], ib.event_info AS [Input Buffer] @@ -2031,7 +1924,7 @@ AND es.session_id <> @@SPID OPTION (RECOMPILE); --- Get any resumable index rebuild operation information (Query 87) (Resumable Index Rebuild) +-- Get any resumable index rebuild operation information (Query 83) (Resumable Index Rebuild) SELECT OBJECT_NAME(iro.object_id) AS [Object Name], iro.index_id, iro.name AS [Index Name], iro.sql_text, iro.last_max_dop_used, iro.partition_number, iro.state_desc, iro.start_time, iro.percent_complete @@ -2043,7 +1936,7 @@ OPTION (RECOMPILE); -- https://bit.ly/2pYSWqq --- Get database automatic tuning options (Query 88) (Automatic Tuning Options) +-- Get database automatic tuning options (Query 84) (Automatic Tuning Options) SELECT [name], desired_state_desc, actual_state_desc, reason_desc FROM sys.database_automatic_tuning_options WITH (NOLOCK) OPTION (RECOMPILE); @@ -2054,7 +1947,7 @@ OPTION (RECOMPILE); --- Look at recent Full backups for the current database (Query 89) (Recent Full Backups) +-- Look at recent Full backups for the current database (Query 85) (Recent Full Backups) SELECT TOP (30) bs.machine_name, bs.server_name, bs.database_name AS [Database Name], bs.recovery_model, CONVERT (BIGINT, bs.backup_size / 1048576 ) AS [Uncompressed Backup Size (MB)], CONVERT (BIGINT, bs.compressed_backup_size / 1048576 ) AS [Compressed Backup Size (MB)], @@ -2082,11 +1975,15 @@ ORDER BY bs.backup_finish_date DESC OPTION (RECOMPILE); -- https://bit.ly/28Rpb2x --- These four Pluralsight Courses go into more detail about how to run these queries and interpret the results +-- These five Pluralsight Courses go into more detail about how to run these queries and interpret the results + +-- SQL Server 2017: Diagnosing Performance Issues with DMVs +-- https://bit.ly/2FqCeti -- SQL Server 2017: Diagnosing Configuration Issues with DMVs -- https://bit.ly/2MSUDUL + -- SQL Server 2014 DMV Diagnostic Queries – Part 1 -- https://bit.ly/2plxCer diff --git a/bin/diagnosticquery/SQLServerDiagnosticQueries_2019_201901.sql b/bin/diagnosticquery/SQLServerDiagnosticQueries_2019_201901.sql new file mode 100644 index 0000000000..fd531421e4 --- /dev/null +++ b/bin/diagnosticquery/SQLServerDiagnosticQueries_2019_201901.sql @@ -0,0 +1,1997 @@ + +-- SQL Server 2019 Diagnostic Information Queries +-- Glenn Berry +-- Last Modified: March 3, 2019 +-- https://www.sqlskills.com/blogs/glenn/ +-- http://sqlserverperformance.wordpress.com/ +-- Twitter: GlennAlanBerry + +-- Please listen to my Pluralsight courses +-- https://www.pluralsight.com/author/glenn-berry + +-- If you want to find all of our SQLskills SQL101 blog posts, check out https://bit.ly/2qLwfXW + + +-- Please make sure you are using the correct version of these diagnostic queries for your version of SQL Server + + +-- If you like PowerShell, there is a very useful community solution for running these queries in an automated fashion +-- https://dbatools.io/ + +-- Invoke-DbaDiagnosticQuery +-- https://dbatools.io/functions/invoke-dbadiagnosticquery/ + + +--****************************************************************************** +--* Copyright (C) 2019 Glenn Berry, SQLskills.com +--* All rights reserved. +--* +--* For more scripts and sample code, check out +--* https://www.sqlskills.com/blogs/glenn +--* +--* You may alter this code for your own *non-commercial* purposes. You may +--* republish altered code as long as you include this copyright and give due credit. +--* +--* +--* THIS CODE AND INFORMATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF +--* ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED +--* TO THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +--* PARTICULAR PURPOSE. +--* +--****************************************************************************** + +-- Check the major product version to see if it is SQL Server 2019 CTP 2 or greater +IF NOT EXISTS (SELECT * WHERE CONVERT(varchar(128), SERVERPROPERTY('ProductVersion')) LIKE '15%') + BEGIN + DECLARE @ProductVersion varchar(128) = CONVERT(varchar(128), SERVERPROPERTY('ProductVersion')); + RAISERROR ('Script does not match the ProductVersion [%s] of this instance. Many of these queries may not work on this version.' , 18 , 16 , @ProductVersion); + END + ELSE + PRINT N'You have the correct major version of SQL Server for this diagnostic information script'; + + +-- Instance level queries ******************************* + +-- SQL and OS Version information for current instance (Query 1) (Version Info) +SELECT @@SERVERNAME AS [Server Name], @@VERSION AS [SQL Server and OS Version Info]; +------ + +-- SQL Server 2019 Builds +-- Build Description Release Date URL to KB Article +-- 15.0.1000.34 CTP 2.0 9/24/2018 +-- 15.0.1100.94 CTP 2.1 11/7/2018 +-- 15.0.1200.24 CTP 2.2 12/6/2018 +-- 15.0.1300.359 CTP 2.3 3/1/2019 + + + + +-- How to determine the version, edition and update level of SQL Server and its components +-- https://bit.ly/2oAjKgW + +-- What's New in SQL Server 2019 (Database Engine) +-- https://bit.ly/2Q29fhz + +-- What's New in SQL Server 2019 +-- https://bit.ly/2PY442b + +-- Announcing the Modern Servicing Model for SQL Server +-- https://bit.ly/2xHnh0l + +-- SQL Server Service Packs are discontinued starting from SQL Server 2017 +-- https://bit.ly/2GTkbgt + +-- Update Center for Microsoft SQL Server +-- https://bit.ly/2pZptuQ + +-- Download SQL Server Management Studio (SSMS) +-- https://bit.ly/1OcupT9 + +-- Download and install Azure Data Studio +-- https://bit.ly/2vgke1A + + + +-- Get socket, physical core and logical core count from the SQL Server Error log. (Query 2) (Core Counts) +-- This query might take a few seconds depending on the size of your error log +EXEC sys.xp_readerrorlog 0, 1, N'detected', N'socket'; +------ + +-- This can help you determine the exact core counts used by SQL Server and whether HT is enabled or not +-- It can also help you confirm your SQL Server licensing model +-- Be on the lookout for this message "using 40 logical processors based on SQL Server licensing" +-- (when you have more than 40 logical cores) which means grandfathered Server/CAL licensing +-- This query will return no results if your error log has been recycled since the instance was last started + + + +-- Get selected server properties (Query 3) (Server Properties) +SELECT SERVERPROPERTY('MachineName') AS [MachineName], +SERVERPROPERTY('ServerName') AS [ServerName], +SERVERPROPERTY('InstanceName') AS [Instance], +SERVERPROPERTY('IsClustered') AS [IsClustered], +SERVERPROPERTY('ComputerNamePhysicalNetBIOS') AS [ComputerNamePhysicalNetBIOS], +SERVERPROPERTY('Edition') AS [Edition], +SERVERPROPERTY('ProductLevel') AS [ProductLevel], -- What servicing branch (RTM/SP/CU) +SERVERPROPERTY('ProductUpdateLevel') AS [ProductUpdateLevel], -- Within a servicing branch, what CU# is applied +SERVERPROPERTY('ProductVersion') AS [ProductVersion], +SERVERPROPERTY('ProductMajorVersion') AS [ProductMajorVersion], +SERVERPROPERTY('ProductMinorVersion') AS [ProductMinorVersion], +SERVERPROPERTY('ProductBuild') AS [ProductBuild], +SERVERPROPERTY('ProductBuildType') AS [ProductBuildType], -- Is this a GDR or OD hotfix (NULL if on a CU build) +SERVERPROPERTY('ProductUpdateReference') AS [ProductUpdateReference], -- KB article number that is applicable for this build +SERVERPROPERTY('ProcessID') AS [ProcessID], +SERVERPROPERTY('Collation') AS [Collation], +SERVERPROPERTY('IsFullTextInstalled') AS [IsFullTextInstalled], +SERVERPROPERTY('IsIntegratedSecurityOnly') AS [IsIntegratedSecurityOnly], +SERVERPROPERTY('FilestreamConfiguredLevel') AS [FilestreamConfiguredLevel], +SERVERPROPERTY('IsHadrEnabled') AS [IsHadrEnabled], +SERVERPROPERTY('HadrManagerStatus') AS [HadrManagerStatus], +SERVERPROPERTY('InstanceDefaultDataPath') AS [InstanceDefaultDataPath], +SERVERPROPERTY('InstanceDefaultLogPath') AS [InstanceDefaultLogPath], +SERVERPROPERTY('BuildClrVersion') AS [Build CLR Version], +SERVERPROPERTY('IsXTPSupported') AS [IsXTPSupported], +SERVERPROPERTY('IsPolybaseInstalled') AS [IsPolybaseInstalled], -- New for SQL Server 2016 +SERVERPROPERTY('IsAdvancedAnalyticsInstalled') AS [IsRServicesInstalled]; -- New for SQL Server 2016 +------ + +-- This gives you a lot of useful information about your instance of SQL Server, +-- such as the ProcessID for SQL Server and your collation +-- Note: Some columns will be NULL on older SQL Server builds + +-- SERVERPROPERTY (Transact-SQL) +-- https://bit.ly/2eeaXeI + + + +-- Get instance-level configuration values for instance (Query 4) (Configuration Values) +SELECT name, value, value_in_use, minimum, maximum, [description], is_dynamic, is_advanced +FROM sys.configurations WITH (NOLOCK) +ORDER BY name OPTION (RECOMPILE); +------ + +-- Focus on these settings: +-- automatic soft-NUMA disabled (should be 0 in most cases) +-- backup checksum default (should be 1) +-- backup compression default (should be 1 in most cases) +-- clr enabled (only enable if it is needed) +-- cost threshold for parallelism (depends on your workload) +-- lightweight pooling (should be zero) +-- max degree of parallelism (depends on your workload and hardware) +-- max server memory (MB) (set to an appropriate value, not the default) +-- optimize for ad hoc workloads (should be 1) +-- priority boost (should be zero) +-- remote admin connections (should be 1) + +-- sys.configurations (Transact-SQL) +-- https://bit.ly/2HsyDZI + + +-- Returns a list of all global trace flags that are enabled (Query 5) (Global Trace Flags) +DBCC TRACESTATUS (-1); +------ + +-- If no global trace flags are enabled, no results will be returned. +-- It is very useful to know what global trace flags are currently enabled as part of the diagnostic process. + +-- Common trace flags that should be enabled in most cases +-- TF 3226 - Supresses logging of successful database backup messages to the SQL Server Error Log +-- https://bit.ly/2p6MTjS + +-- TF 6534 - Enables use of native code to improve performance with spatial data +-- https://bit.ly/2HrQUpU + +-- The behavior of TF 1117, 1118 are enabled for tempdb in SQL Server 2016 by default +-- SQL 2016 – It Just Runs Faster: -T1117 and -T1118 changes for TEMPDB and user databases +-- https://bit.ly/2lbNWxK + +-- The behavior of TF 2371 is enabled by default in SQL Server 2016 and newer (in compat level 130 and higher) + +-- DBCC TRACEON - Trace Flags (Transact-SQL) +-- https://bit.ly/2FuSvPg + + + + + +-- Returns status of instant file initialization (Query 6) (IFI Status) +EXEC sys.xp_readerrorlog 0, 1, N'Database Instant File Initialization'; +------ + +-- Lets you determine whether Instant File Initialization (IFI) is enabled for the instance +-- This should be enabled in the vast majority of cases +-- SQL Server 2016 and newer lets you enable this during the SQL server installation process + +-- Database Instant File Initialization +-- https://bit.ly/2nTX74y + +-- Misconceptions around instant file initialization +-- https://bit.ly/2oBSKgZ + + + +-- SQL Server Process Address space info (Query 7) (Process Memory) +-- (shows whether locked pages is enabled, among other things) +SELECT physical_memory_in_use_kb/1024 AS [SQL Server Memory Usage (MB)], + locked_page_allocations_kb/1024 AS [SQL Server Locked Pages Allocation (MB)], + large_page_allocations_kb/1024 AS [SQL Server Large Pages Allocation (MB)], + page_fault_count, memory_utilization_percentage, available_commit_limit_kb, + process_physical_memory_low, process_virtual_memory_low +FROM sys.dm_os_process_memory WITH (NOLOCK) OPTION (RECOMPILE); +------ + +-- You want to see 0 for process_physical_memory_low +-- You want to see 0 for process_virtual_memory_low +-- This indicates that you are not under internal memory pressure +-- If locked_page_allocations_kb > 0, then LPIM is enabled + +-- How to enable the "locked pages" feature in SQL Server 2012 +-- https://bit.ly/2F5UjOA + +-- Memory Management Architecture Guide +-- https://bit.ly/2JKkadC + + + +-- SQL Server Services information (Query 8) (SQL Server Services Info) +SELECT servicename, process_id, startup_type_desc, status_desc, +last_startup_time, service_account, is_clustered, cluster_nodename, [filename], +instant_file_initialization_enabled +FROM sys.dm_server_services WITH (NOLOCK) OPTION (RECOMPILE); +------ + +-- Tells you the account being used for the SQL Server Service and the SQL Agent Service +-- Shows the process_id, when they were last started, and their current status +-- Also shows whether you are running on a failover cluster instance, and what node you are running on +-- Also shows whether IFI is enabled + +-- sys.dm_server_services (Transact-SQL) +-- https://bit.ly/2oKa1Un + + +-- Last backup information by database (Query 9) (Last Backup By Database) +SELECT ISNULL(d.[name], bs.[database_name]) AS [Database], d.recovery_model_desc AS [Recovery Model], + d.log_reuse_wait_desc AS [Log Reuse Wait Desc], + MAX(CASE WHEN [type] = 'D' THEN bs.backup_finish_date ELSE NULL END) AS [Last Full Backup], + MAX(CASE WHEN [type] = 'I' THEN bs.backup_finish_date ELSE NULL END) AS [Last Differential Backup], + MAX(CASE WHEN [type] = 'L' THEN bs.backup_finish_date ELSE NULL END) AS [Last Log Backup] +FROM sys.databases AS d WITH (NOLOCK) +LEFT OUTER JOIN msdb.dbo.backupset AS bs WITH (NOLOCK) +ON bs.[database_name] = d.[name] +AND bs.backup_finish_date > GETDATE()- 30 +WHERE d.name <> N'tempdb' +GROUP BY ISNULL(d.[name], bs.[database_name]), d.recovery_model_desc, d.log_reuse_wait_desc, d.[name] +ORDER BY d.recovery_model_desc, d.[name] OPTION (RECOMPILE); +------ + +-- This helps you spot runaway transaction logs and other issues with your backup schedule + + +-- Get SQL Server Agent jobs and Category information (Query 10) (SQL Server Agent Jobs) +SELECT sj.name AS [Job Name], sj.[description] AS [Job Description], SUSER_SNAME(sj.owner_sid) AS [Job Owner], +sj.date_created AS [Date Created], sj.[enabled] AS [Job Enabled], +sj.notify_email_operator_id, sj.notify_level_email, sc.name AS [CategoryName], +s.[enabled] AS [Sched Enabled], js.next_run_date, js.next_run_time +FROM msdb.dbo.sysjobs AS sj WITH (NOLOCK) +INNER JOIN msdb.dbo.syscategories AS sc WITH (NOLOCK) +ON sj.category_id = sc.category_id +LEFT OUTER JOIN msdb.dbo.sysjobschedules AS js WITH (NOLOCK) +ON sj.job_id = js.job_id +LEFT OUTER JOIN msdb.dbo.sysschedules AS s WITH (NOLOCK) +ON js.schedule_id = s.schedule_id +ORDER BY sj.name OPTION (RECOMPILE); +------ + +-- Gives you some basic information about your SQL Server Agent jobs, who owns them and how they are configured +-- Look for Agent jobs that are not owned by sa +-- Look for jobs that have a notify_email_operator_id set to 0 (meaning no operator) +-- Look for jobs that have a notify_level_email set to 0 (meaning no e-mail is ever sent) +-- +-- MSDN sysjobs documentation +-- https://bit.ly/2paDEOP + +-- SQL Server Maintenance Solution +-- https://bit.ly/1pgchQu + + +-- Get SQL Server Agent Alert Information (Query 11) (SQL Server Agent Alerts) +SELECT name, event_source, message_id, severity, [enabled], has_notification, + delay_between_responses, occurrence_count, last_occurrence_date, last_occurrence_time +FROM msdb.dbo.sysalerts WITH (NOLOCK) +ORDER BY name OPTION (RECOMPILE); +------ + +-- Gives you some basic information about your SQL Server Agent Alerts +-- (which are different from SQL Server Agent jobs) +-- Read more about Agent Alerts here: https://bit.ly/2Giz0Xf + + + +-- Host information (Query 12) (Host Info) +SELECT host_platform, host_distribution, host_release, + host_service_pack_level, host_sku, os_language_version +FROM sys.dm_os_host_info WITH (NOLOCK) OPTION (RECOMPILE); +------ + +-- host_release codes (only valid for Windows) +-- 10.0 is either Windows 10 or Windows Server 2016 +-- 6.3 is either Windows 8.1 or Windows Server 2012 R2 +-- 6.2 is either Windows 8 or Windows Server 2012 + + +-- host_sku codes (only valid for Windows) +-- 4 is Enterprise Edition +-- 7 is Standard Server Edition +-- 8 is Datacenter Server Edition +-- 10 is Enterprise Server Edition +-- 48 is Professional Edition +-- 161 is Pro for Workstations + +-- 1033 for os_language_version is US-English + +-- SQL Server 2019 requires Windows Server 2012 or newer (may change by RTM) + +-- Hardware and Software Requirements for Installing SQL Server +-- https://bit.ly/2y3ka5L + +-- Using SQL Server in Windows 8 and later versions of Windows operating system +-- https://bit.ly/2F7Ax0P + + +-- SQL Server NUMA Node information (Query 13) (SQL Server NUMA Info) +SELECT node_id, node_state_desc, memory_node_id, processor_group, cpu_count, online_scheduler_count, + idle_scheduler_count, active_worker_count, avg_load_balance, resource_monitor_state +FROM sys.dm_os_nodes WITH (NOLOCK) +WHERE node_state_desc <> N'ONLINE DAC' OPTION (RECOMPILE); +------ + +-- Gives you some useful information about the composition and relative load on your NUMA nodes +-- You want to see an equal number of schedulers on each NUMA node +-- Watch out if SQL Server 2019 Standard Edition has been installed +-- on a physical or virtual machine with more than four sockets or more than 24 physical cores + +-- sys.dm_os_nodes (Transact-SQL) +-- https://bit.ly/2pn5Mw8 + +-- Balancing Your Available SQL Server Core Licenses Evenly Across NUMA Nodes +-- https://bit.ly/2vfC4Rq + + + +-- Good basic information about OS memory amounts and state (Query 14) (System Memory) +SELECT total_physical_memory_kb/1024 AS [Physical Memory (MB)], + available_physical_memory_kb/1024 AS [Available Memory (MB)], + total_page_file_kb/1024 AS [Total Page File (MB)], + available_page_file_kb/1024 AS [Available Page File (MB)], + system_cache_kb/1024 AS [System Cache (MB)], + system_memory_state_desc AS [System Memory State] +FROM sys.dm_os_sys_memory WITH (NOLOCK) OPTION (RECOMPILE); +------ + +-- You want to see "Available physical memory is high" for System Memory State +-- This indicates that you are not under external memory pressure + +-- Possible System Memory State values: +-- Available physical memory is high +-- Physical memory usage is steady +-- Available physical memory is low +-- Available physical memory is running low +-- Physical memory state is transitioning + +-- sys.dm_os_sys_memory (Transact-SQL) +-- https://bit.ly/2pcV0xq + + + +-- You can skip the next two queries if you know you don't have a clustered instance + + +-- Get information about your cluster nodes and their status (Query 15) (Cluster Node Properties) +-- (if your database server is in a failover cluster) +SELECT NodeName, status_description, is_current_owner +FROM sys.dm_os_cluster_nodes WITH (NOLOCK) OPTION (RECOMPILE); +------ + +-- Knowing which node owns the cluster resources is critical +-- Especially when you are installing Windows or SQL Server updates +-- You will see no results if your instance is not clustered + +-- Recommended hotfixes and updates for Windows Server 2012 R2-based failover clusters +-- https://bit.ly/1z5BfCw + + +-- Get information about any AlwaysOn AG cluster this instance is a part of (Query 16) (AlwaysOn AG Cluster) +SELECT cluster_name, quorum_type_desc, quorum_state_desc +FROM sys.dm_hadr_cluster WITH (NOLOCK) OPTION (RECOMPILE); +------ + +-- You will see no results if your instance is not using AlwaysOn AGs + + +-- Good overview of AG health and status (Query 17) (AlwaysOn AG Status) +SELECT ag.name AS [AG Name], ar.replica_server_name, ar.availability_mode_desc, adc.[database_name], + drs.is_local, drs.is_primary_replica, drs.synchronization_state_desc, drs.is_commit_participant, + drs.synchronization_health_desc, drs.recovery_lsn, drs.truncation_lsn, drs.last_sent_lsn, + drs.last_sent_time, drs.last_received_lsn, drs.last_received_time, drs.last_hardened_lsn, + drs.last_hardened_time, drs.last_redone_lsn, drs.last_redone_time, drs.log_send_queue_size, + drs.log_send_rate, drs.redo_queue_size, drs.redo_rate, drs.filestream_send_rate, + drs.end_of_log_lsn, drs.last_commit_lsn, drs.last_commit_time, drs.database_state_desc +FROM sys.dm_hadr_database_replica_states AS drs WITH (NOLOCK) +INNER JOIN sys.availability_databases_cluster AS adc WITH (NOLOCK) +ON drs.group_id = adc.group_id +AND drs.group_database_id = adc.group_database_id +INNER JOIN sys.availability_groups AS ag WITH (NOLOCK) +ON ag.group_id = drs.group_id +INNER JOIN sys.availability_replicas AS ar WITH (NOLOCK) +ON drs.group_id = ar.group_id +AND drs.replica_id = ar.replica_id +ORDER BY ag.name, ar.replica_server_name, adc.[database_name] OPTION (RECOMPILE); + +-- You will see no results if your instance is not using AlwaysOn AGs + +-- SQL Server 2016 – It Just Runs Faster: Always On Availability Groups Turbocharged +-- https://bit.ly/2dn1H6r + + +-- Hardware information from SQL Server 2019 (Query 18) (Hardware Info) +SELECT cpu_count AS [Logical CPU Count], scheduler_count, + (socket_count * cores_per_socket) AS [Physical Core Count], + socket_count AS [Socket Count], cores_per_socket, numa_node_count, + physical_memory_kb/1024 AS [Physical Memory (MB)], + max_workers_count AS [Max Workers Count], + affinity_type_desc AS [Affinity Type], + sqlserver_start_time AS [SQL Server Start Time], + DATEDIFF(hour, sqlserver_start_time, GETDATE()) AS [SQL Server Up Time (hrs)], + virtual_machine_type_desc AS [Virtual Machine Type], + softnuma_configuration_desc AS [Soft NUMA Configuration], + sql_memory_model_desc, container_type_desc -- New in SQL Server 2019 +FROM sys.dm_os_sys_info WITH (NOLOCK) OPTION (RECOMPILE); +------ + +-- Gives you some good basic hardware information about your database server +-- Note: virtual_machine_type_desc of HYPERVISOR does not automatically mean you are running SQL Server inside of a VM +-- It merely indicates that you have a hypervisor running on your host + +-- sys.dm_os_sys_info (Transact-SQL) +-- https://bit.ly/2pczOYs + +-- Soft NUMA configuration was a new column for SQL Server 2016 +-- OFF = Soft-NUMA feature is OFF +-- ON = SQL Server automatically determines the NUMA node sizes for Soft-NUMA +-- MANUAL = Manually configured soft-NUMA + +-- Configure SQL Server to Use Soft-NUMA (SQL Server) +-- https://bit.ly/2HTpKJt + +-- sql_memory_model_desc values (Added in SQL Server 2016 SP1) +-- CONVENTIONAL +-- LOCK_PAGES +-- LARGE_PAGES + + +-- Get System Manufacturer and model number from SQL Server Error log (Query 19) (System Manufacturer) +EXEC sys.xp_readerrorlog 0, 1, N'Manufacturer'; +------ + +-- This can help you determine the capabilities and capacities of your database server +-- Can also be used to confirm if you are running in a VM +-- This query might take a few seconds if you have not recycled your error log recently +-- This query will return no results if your error log has been recycled since the instance was started + + +-- Get pvscsi info from Windows Registry (Query 20) (PVSCSI Driver Parameters) +EXEC sys.xp_instance_regread N'HKEY_LOCAL_MACHINE', N'SYSTEM\CurrentControlSet\services\pvscsi\Parameters\Device', N'DriverParameter'; +------ + +-- This is valid for VMware VMs +-- Recommended value for intensive I/O patterns from VMware is: RequestRingPages=32,MaxQueueDepth=254 +-- https://kb.vmware.com/s/article/2053145 +-- Does not work on Linux + + +-- Get BIOS date from Windows Registry (Query 21) (BIOS Date) +EXEC sys.xp_instance_regread N'HKEY_LOCAL_MACHINE', N'HARDWARE\DESCRIPTION\System\BIOS', N'BiosReleaseDate'; +------ + +-- Helps you understand whether the main system BIOS is up to date, and the possible age of the hardware +-- Not as useful for virtualization +-- Does not work on Linux + + +-- Get processor description from Windows Registry (Query 22) (Processor Description) +EXEC sys.xp_instance_regread N'HKEY_LOCAL_MACHINE', N'HARDWARE\DESCRIPTION\System\CentralProcessor\0', N'ProcessorNameString'; +------ + +-- Gives you the model number and rated clock speed of your processor(s) +-- Your processors may be running at less than the rated clock speed due +-- to the Windows Power Plan or hardware power management +-- Does not work on Linux + +-- You can use CPU-Z to get your actual CPU core speed and a lot of other useful information +-- https://bit.ly/QhR6xF + +-- You can learn more about processor selection for SQL Server by following this link +-- https://bit.ly/2F3aVlP + + + + +-- Get information on location, time and size of any memory dumps from SQL Server (Query 23) (Memory Dump Info) +SELECT [filename], creation_time, size_in_bytes/1048576.0 AS [Size (MB)] +FROM sys.dm_server_memory_dumps WITH (NOLOCK) +ORDER BY creation_time DESC OPTION (RECOMPILE); +------ + +-- This will not return any rows if you have +-- not had any memory dumps (which is a good thing) + +-- sys.dm_server_memory_dumps (Transact-SQL) +-- https://bit.ly/2elwWll + + + +-- Look at Suspect Pages table (Query 24) (Suspect Pages) +SELECT DB_NAME(database_id) AS [Database Name], [file_id], page_id, + event_type, error_count, last_update_date +FROM msdb.dbo.suspect_pages WITH (NOLOCK) +ORDER BY database_id OPTION (RECOMPILE); +------ + +-- event_type value descriptions +-- 1 = 823 error caused by an operating system CRC error +-- or 824 error other than a bad checksum or a torn page (for example, a bad page ID) +-- 2 = Bad checksum +-- 3 = Torn page +-- 4 = Restored (The page was restored after it was marked bad) +-- 5 = Repaired (DBCC repaired the page) +-- 7 = Deallocated by DBCC + +-- Ideally, this query returns no results. The table is limited to 1000 rows. +-- If you do get results here, you should do further investigation to determine the root cause + +-- Manage the suspect_pages Table +-- https://bit.ly/2Fvr1c9 + + +-- Get number of data files in tempdb database (Query 25) (TempDB Data Files) +EXEC sys.xp_readerrorlog 0, 1, N'The tempdb database has'; +------ + +-- Get the number of data files in the tempdb database +-- 4-8 data files that are all the same size is a good starting point +-- This query will return no results if your error log has been recycled since the instance was last started + + +-- File names and paths for all user and system databases on instance (Query 26) (Database Filenames and Paths) +SELECT DB_NAME([database_id]) AS [Database Name], + [file_id], [name], physical_name, [type_desc], state_desc, + is_percent_growth, growth, + CONVERT(bigint, growth/128.0) AS [Growth in MB], + CONVERT(bigint, size/128.0) AS [Total Size in MB] +FROM sys.master_files WITH (NOLOCK) +ORDER BY DB_NAME([database_id]), [file_id] OPTION (RECOMPILE); +------ + +-- Things to look at: +-- Are data files and log files on different drives? +-- Is everything on the C: drive? +-- Is tempdb on dedicated drives? +-- Is there only one tempdb data file? +-- Are all of the tempdb data files the same size? +-- Are there multiple data files for user databases? +-- Is percent growth enabled for any files (which is bad)? + + +-- Drive information for all fixed drives visible to the operating system (Query 27) (Fixed Drives) +SELECT fixed_drive_path, drive_type_desc, +CONVERT(DECIMAL(18,2), free_space_in_bytes/1073741824.0) AS [Available Space (GB)] +FROM sys.dm_os_enumerate_fixed_drives WITH (NOLOCK) OPTION (RECOMPILE); +------ + +-- This shows all of your fixed drives, not just LUNs with SQL Server database files + + + +-- Volume info for all LUNS that have database files on the current instance (Query 28) (Volume Info) +SELECT DISTINCT vs.volume_mount_point, vs.file_system_type, vs.logical_volume_name, +CONVERT(DECIMAL(18,2), vs.total_bytes/1073741824.0) AS [Total Size (GB)], +CONVERT(DECIMAL(18,2), vs.available_bytes/1073741824.0) AS [Available Size (GB)], +CONVERT(DECIMAL(18,2), vs.available_bytes * 1. / vs.total_bytes * 100.) AS [Space Free %], +vs.supports_compression, vs.is_compressed, +vs.supports_sparse_files, vs.supports_alternate_streams +FROM sys.master_files AS f WITH (NOLOCK) +CROSS APPLY sys.dm_os_volume_stats(f.database_id, f.[file_id]) AS vs +ORDER BY vs.volume_mount_point OPTION (RECOMPILE); +------ + +-- Shows you the total and free space on the LUNs where you have database files +-- Being low on free space can negatively affect performance + +-- sys.dm_os_volume_stats (Transact-SQL) +-- https://bit.ly/2oBPNNr + + + +-- Drive level latency information (Query 29) (Drive Level Latency) +-- Based on code from Jimmy May +SELECT tab.[Drive], tab.volume_mount_point AS [Volume Mount Point], + CASE + WHEN num_of_reads = 0 THEN 0 + ELSE (io_stall_read_ms/num_of_reads) + END AS [Read Latency], + CASE + WHEN num_of_writes = 0 THEN 0 + ELSE (io_stall_write_ms/num_of_writes) + END AS [Write Latency], + CASE + WHEN (num_of_reads = 0 AND num_of_writes = 0) THEN 0 + ELSE (io_stall/(num_of_reads + num_of_writes)) + END AS [Overall Latency], + CASE + WHEN num_of_reads = 0 THEN 0 + ELSE (num_of_bytes_read/num_of_reads) + END AS [Avg Bytes/Read], + CASE + WHEN num_of_writes = 0 THEN 0 + ELSE (num_of_bytes_written/num_of_writes) + END AS [Avg Bytes/Write], + CASE + WHEN (num_of_reads = 0 AND num_of_writes = 0) THEN 0 + ELSE ((num_of_bytes_read + num_of_bytes_written)/(num_of_reads + num_of_writes)) + END AS [Avg Bytes/Transfer] +FROM (SELECT LEFT(UPPER(mf.physical_name), 2) AS Drive, SUM(num_of_reads) AS num_of_reads, + SUM(io_stall_read_ms) AS io_stall_read_ms, SUM(num_of_writes) AS num_of_writes, + SUM(io_stall_write_ms) AS io_stall_write_ms, SUM(num_of_bytes_read) AS num_of_bytes_read, + SUM(num_of_bytes_written) AS num_of_bytes_written, SUM(io_stall) AS io_stall, vs.volume_mount_point + FROM sys.dm_io_virtual_file_stats(NULL, NULL) AS vfs + INNER JOIN sys.master_files AS mf WITH (NOLOCK) + ON vfs.database_id = mf.database_id AND vfs.file_id = mf.file_id + CROSS APPLY sys.dm_os_volume_stats(mf.database_id, mf.[file_id]) AS vs + GROUP BY LEFT(UPPER(mf.physical_name), 2), vs.volume_mount_point) AS tab +ORDER BY [Overall Latency] OPTION (RECOMPILE); +------ + +-- Shows you the drive-level latency for reads and writes, in milliseconds +-- Latency above 30-40ms is usually a problem +-- These latency numbers include all file activity against all SQL Server +-- database files on each drive since SQL Server was last started + + +-- Calculates average latency per read, per write, and per total input/output for each database file (Query 30) (IO Latency by File) +SELECT DB_NAME(fs.database_id) AS [Database Name], CAST(fs.io_stall_read_ms/(1.0 + fs.num_of_reads) AS NUMERIC(10,1)) AS [avg_read_latency_ms], +CAST(fs.io_stall_write_ms/(1.0 + fs.num_of_writes) AS NUMERIC(10,1)) AS [avg_write_latency_ms], +CAST((fs.io_stall_read_ms + fs.io_stall_write_ms)/(1.0 + fs.num_of_reads + fs.num_of_writes) AS NUMERIC(10,1)) AS [avg_io_latency_ms], +CONVERT(DECIMAL(18,2), mf.size/128.0) AS [File Size (MB)], mf.physical_name, mf.type_desc, fs.io_stall_read_ms, fs.num_of_reads, +fs.io_stall_write_ms, fs.num_of_writes, fs.io_stall_read_ms + fs.io_stall_write_ms AS [io_stalls], fs.num_of_reads + fs.num_of_writes AS [total_io], +io_stall_queued_read_ms AS [Resource Governor Total Read IO Latency (ms)], io_stall_queued_write_ms AS [Resource Governor Total Write IO Latency (ms)] +FROM sys.dm_io_virtual_file_stats(null,null) AS fs +INNER JOIN sys.master_files AS mf WITH (NOLOCK) +ON fs.database_id = mf.database_id +AND fs.[file_id] = mf.[file_id] +ORDER BY avg_io_latency_ms DESC OPTION (RECOMPILE); +------ + +-- Helps determine which database files on the entire instance have the most I/O bottlenecks +-- This can help you decide whether certain LUNs are overloaded and whether you might +-- want to move some files to a different location or perhaps improve your I/O performance +-- These latency numbers include all file activity against each SQL Server +-- database file since SQL Server was last started + + +-- Look for I/O requests taking longer than 15 seconds in the six most recent SQL Server Error Logs (Query 31) (IO Warnings) +CREATE TABLE #IOWarningResults(LogDate datetime, ProcessInfo sysname, LogText nvarchar(1000)); + + INSERT INTO #IOWarningResults + EXEC xp_readerrorlog 0, 1, N'taking longer than 15 seconds'; + + INSERT INTO #IOWarningResults + EXEC xp_readerrorlog 1, 1, N'taking longer than 15 seconds'; + + INSERT INTO #IOWarningResults + EXEC xp_readerrorlog 2, 1, N'taking longer than 15 seconds'; + + INSERT INTO #IOWarningResults + EXEC xp_readerrorlog 3, 1, N'taking longer than 15 seconds'; + + INSERT INTO #IOWarningResults + EXEC xp_readerrorlog 4, 1, N'taking longer than 15 seconds'; + + INSERT INTO #IOWarningResults + EXEC xp_readerrorlog 5, 1, N'taking longer than 15 seconds'; + +SELECT LogDate, ProcessInfo, LogText +FROM #IOWarningResults +ORDER BY LogDate DESC; + +DROP TABLE #IOWarningResults; +------ + +-- Finding 15 second I/O warnings in the SQL Server Error Log is useful evidence of +-- poor I/O performance (which might have many different causes) +-- Look to see if you see any patterns in the results (same files, same drives, same time of day, etc.) + +-- Diagnostics in SQL Server help detect stalled and stuck I/O operations +-- https://bit.ly/2qtaw73 + + + +-- Resource Governor Resource Pool information (Query 32) (RG Resource Pools) +SELECT pool_id, [Name], statistics_start_time, + min_memory_percent, max_memory_percent, + max_memory_kb/1024 AS [max_memory_mb], + used_memory_kb/1024 AS [used_memory_mb], + target_memory_kb/1024 AS [target_memory_mb], + min_iops_per_volume, max_iops_per_volume +FROM sys.dm_resource_governor_resource_pools WITH (NOLOCK) +OPTION (RECOMPILE); +------ + +-- sys.dm_resource_governor_resource_pools (Transact-SQL) +-- https://bit.ly/2MVU0Vy + + + +-- Recovery model, log reuse wait description, log file size, log usage size (Query 33) (Database Properties) +-- and compatibility level for all databases on instance +SELECT db.[name] AS [Database Name], SUSER_SNAME(db.owner_sid) AS [Database Owner], db.recovery_model_desc AS [Recovery Model], +db.state_desc, db.containment_desc, db.log_reuse_wait_desc AS [Log Reuse Wait Description], +CONVERT(DECIMAL(18,2), ls.cntr_value/1024.0) AS [Log Size (MB)], CONVERT(DECIMAL(18,2), lu.cntr_value/1024.0) AS [Log Used (MB)], +CAST(CAST(lu.cntr_value AS FLOAT) / CAST(ls.cntr_value AS FLOAT)AS DECIMAL(18,2)) * 100 AS [Log Used %], +db.[compatibility_level] AS [DB Compatibility Level], +db.is_mixed_page_allocation_on, db.page_verify_option_desc AS [Page Verify Option], +db.is_auto_create_stats_on, db.is_auto_update_stats_on, db.is_auto_update_stats_async_on, db.is_parameterization_forced, +db.snapshot_isolation_state_desc, db.is_read_committed_snapshot_on, db.is_auto_close_on, db.is_auto_shrink_on, +db.target_recovery_time_in_seconds, db.is_cdc_enabled, db.is_published, db.is_distributor, +db.group_database_id, db.replica_id,db.is_memory_optimized_elevate_to_snapshot_on, +db.delayed_durability_desc, db.is_auto_create_stats_incremental_on, +db.is_query_store_on, db.is_sync_with_backup, db.is_temporal_history_retention_enabled, +db.is_supplemental_logging_enabled, db.is_remote_data_archive_enabled, +db.is_encrypted, de.encryption_state, de.percent_complete, de.key_algorithm, de.key_length, db.resource_pool_id, +db.is_tempdb_spill_to_remote_store, db.is_result_set_caching_on, db.is_accelerated_database_recovery_on +FROM sys.databases AS db WITH (NOLOCK) +INNER JOIN sys.dm_os_performance_counters AS lu WITH (NOLOCK) +ON db.name = lu.instance_name +INNER JOIN sys.dm_os_performance_counters AS ls WITH (NOLOCK) +ON db.name = ls.instance_name +LEFT OUTER JOIN sys.dm_database_encryption_keys AS de WITH (NOLOCK) +ON db.database_id = de.database_id +WHERE lu.counter_name LIKE N'Log File(s) Used Size (KB)%' +AND ls.counter_name LIKE N'Log File(s) Size (KB)%' +AND ls.cntr_value > 0 +ORDER BY db.[name] OPTION (RECOMPILE); +------ + +-- Things to look at: +-- How many databases are on the instance? +-- What recovery models are they using? +-- What is the log reuse wait description? +-- How full are the transaction logs? +-- What compatibility level are the databases on? +-- What is the Page Verify Option? (should be CHECKSUM) +-- Is Auto Update Statistics Asynchronously enabled? +-- Is Delayed Durability enabled +-- Make sure auto_shrink and auto_close are not enabled! + +-- is_mixed_page_allocation_on is a new property for SQL Server 2016. Equivalent to TF 1118 for a user database +-- SQL Server 2016: Changes in default behavior for autogrow and allocations for tempdb and user databases +-- https://bit.ly/2evRZSR + +-- A non-zero value for target_recovery_time_in_seconds means that indirect checkpoint is enabled +-- If the setting has a zero value it indicates that automatic checkpoint is enabled + +-- Changes in SQL Server 2016 Checkpoint Behavior +-- https://bit.ly/2pdggk3 + + +-- Missing Indexes for all databases by Index Advantage (Query 34) (Missing Indexes All Databases) +SELECT CONVERT(decimal(18,2), user_seeks * avg_total_user_cost * (avg_user_impact * 0.01)) AS [index_advantage], +FORMAT(migs.last_user_seek, 'yyyy-MM-dd HH:mm:ss') AS [last_user_seek], +mid.[statement] AS [Database.Schema.Table], +COUNT(1) OVER(PARTITION BY mid.[statement]) AS [missing_indexes_for_table], +COUNT(1) OVER(PARTITION BY mid.[statement], equality_columns) AS [similar_missing_indexes_for_table], +mid.equality_columns, mid.inequality_columns, mid.included_columns, +migs.unique_compiles, migs.user_seeks, +CONVERT(decimal(18,2), migs.avg_total_user_cost) AS [avg_total_user_cost], migs.avg_user_impact +FROM sys.dm_db_missing_index_group_stats AS migs WITH (NOLOCK) +INNER JOIN sys.dm_db_missing_index_groups AS mig WITH (NOLOCK) +ON migs.group_handle = mig.index_group_handle +INNER JOIN sys.dm_db_missing_index_details AS mid WITH (NOLOCK) +ON mig.index_handle = mid.index_handle +ORDER BY index_advantage DESC OPTION (RECOMPILE); +------ + +-- Getting missing index information for all of the databases on the instance is very useful +-- Look at last user seek time, number of user seeks to help determine source and importance +-- Also look at avg_user_impact and avg_total_user_cost to help determine importance +-- SQL Server is overly eager to add included columns, so beware +-- Do not just blindly add indexes that show up from this query!!! + +-- SQL Server Index Design Guide +-- https://bit.ly/2qtZr4N + + + +-- Get VLF Counts for all databases on the instance (Query 35) (VLF Counts) +SELECT [name] AS [Database Name], [VLF Count] +FROM sys.databases AS db WITH (NOLOCK) +CROSS APPLY (SELECT file_id, COUNT(*) AS [VLF Count] + FROM sys.dm_db_log_info(db.database_id) + GROUP BY file_id) AS li +ORDER BY [VLF Count] DESC OPTION (RECOMPILE); +------ + +-- High VLF counts can affect write performance to the log file +-- and they can make full database restores and crash recovery take much longer +-- Try to keep your VLF counts under 200 in most cases (depending on log file size) + +-- Important change to VLF creation algorithm in SQL Server 2014 +-- https://bit.ly/2Hsjbg4 + +-- SQL Server Transaction Log Architecture and Management Guide +-- https://bit.ly/2JjmQRZ + + + +-- Get CPU utilization by database (Query 36) (CPU Usage by Database) +WITH DB_CPU_Stats +AS +(SELECT pa.DatabaseID, DB_Name(pa.DatabaseID) AS [Database Name], SUM(qs.total_worker_time/1000) AS [CPU_Time_Ms] + FROM sys.dm_exec_query_stats AS qs WITH (NOLOCK) + CROSS APPLY (SELECT CONVERT(int, value) AS [DatabaseID] + FROM sys.dm_exec_plan_attributes(qs.plan_handle) + WHERE attribute = N'dbid') AS pa + GROUP BY DatabaseID) +SELECT ROW_NUMBER() OVER(ORDER BY [CPU_Time_Ms] DESC) AS [CPU Rank], + [Database Name], [CPU_Time_Ms] AS [CPU Time (ms)], + CAST([CPU_Time_Ms] * 1.0 / SUM([CPU_Time_Ms]) OVER() * 100.0 AS DECIMAL(5, 2)) AS [CPU Percent] +FROM DB_CPU_Stats +WHERE DatabaseID <> 32767 -- ResourceDB +ORDER BY [CPU Rank] OPTION (RECOMPILE); +------ + +-- Helps determine which database is using the most CPU resources on the instance +-- Note: This only reflects CPU usage from the currently cached query plans + + +-- Get I/O utilization by database (Query 37) (IO Usage By Database) +WITH Aggregate_IO_Statistics +AS (SELECT DB_NAME(database_id) AS [Database Name], + CAST(SUM(num_of_bytes_read + num_of_bytes_written) / 1048576 AS DECIMAL(12, 2)) AS [ioTotalMB], + CAST(SUM(num_of_bytes_read ) / 1048576 AS DECIMAL(12, 2)) AS [ioReadMB], + CAST(SUM(num_of_bytes_written) / 1048576 AS DECIMAL(12, 2)) AS [ioWriteMB] + FROM sys.dm_io_virtual_file_stats(NULL, NULL) AS [DM_IO_STATS] + GROUP BY database_id) +SELECT ROW_NUMBER() OVER (ORDER BY ioTotalMB DESC) AS [I/O Rank], + [Database Name], ioTotalMB AS [Total I/O (MB)], + CAST(ioTotalMB / SUM(ioTotalMB) OVER () * 100.0 AS DECIMAL(5, 2)) AS [Total I/O %], + ioReadMB AS [Read I/O (MB)], + CAST(ioReadMB / SUM(ioReadMB) OVER () * 100.0 AS DECIMAL(5, 2)) AS [Read I/O %], + ioWriteMB AS [Write I/O (MB)], + CAST(ioWriteMB / SUM(ioWriteMB) OVER () * 100.0 AS DECIMAL(5, 2)) AS [Write I/O %] +FROM Aggregate_IO_Statistics +ORDER BY [I/O Rank] OPTION (RECOMPILE); +------ + +-- Helps determine which database is using the most I/O resources on the instance +-- These numbers are cumulative since the last service restart +-- They include all I/O activity, not just the nominal I/O workload + + +-- Get total buffer usage by database for current instance (Query 38) (Total Buffer Usage by Database) +-- This make take some time to run on a busy instance +WITH AggregateBufferPoolUsage +AS +(SELECT DB_NAME(database_id) AS [Database Name], +CAST(COUNT(*) * 8/1024.0 AS DECIMAL (10,2)) AS [CachedSize] +FROM sys.dm_os_buffer_descriptors WITH (NOLOCK) +WHERE database_id <> 32767 -- ResourceDB +GROUP BY DB_NAME(database_id)) +SELECT ROW_NUMBER() OVER(ORDER BY CachedSize DESC) AS [Buffer Pool Rank], [Database Name], CachedSize AS [Cached Size (MB)], + CAST(CachedSize / SUM(CachedSize) OVER() * 100.0 AS DECIMAL(5,2)) AS [Buffer Pool Percent] +FROM AggregateBufferPoolUsage +ORDER BY [Buffer Pool Rank] OPTION (RECOMPILE); +------ + +-- Tells you how much memory (in the buffer pool) +-- is being used by each database on the instance + + +-- Get tempdb version store space usage by database (Query 39) (Version Store Space Usage) +SELECT DB_NAME(database_id) AS [Database Name], + reserved_page_count AS [Version Store Reserved Page Count], + reserved_space_kb/1024 AS [Version Store Reserved Space (MB)] +FROM sys.dm_tran_version_store_space_usage WITH (NOLOCK) +ORDER BY reserved_space_kb/1024 DESC OPTION (RECOMPILE); +------ + +-- sys.dm_tran_version_store_space_usage (Transact-SQL) +-- https://bit.ly/2vh3Bmk + + + + +-- Clear Wait Stats with this command +-- DBCC SQLPERF('sys.dm_os_wait_stats', CLEAR); + +-- Isolate top waits for server instance since last restart or wait statistics clear (Query 40) (Top Waits) +WITH [Waits] +AS (SELECT wait_type, wait_time_ms/ 1000.0 AS [WaitS], + (wait_time_ms - signal_wait_time_ms) / 1000.0 AS [ResourceS], + signal_wait_time_ms / 1000.0 AS [SignalS], + waiting_tasks_count AS [WaitCount], + 100.0 * wait_time_ms / SUM (wait_time_ms) OVER() AS [Percentage], + ROW_NUMBER() OVER(ORDER BY wait_time_ms DESC) AS [RowNum] + FROM sys.dm_os_wait_stats WITH (NOLOCK) + WHERE [wait_type] NOT IN ( + N'BROKER_EVENTHANDLER', N'BROKER_RECEIVE_WAITFOR', N'BROKER_TASK_STOP', + N'BROKER_TO_FLUSH', N'BROKER_TRANSMITTER', N'CHECKPOINT_QUEUE', + N'CHKPT', N'CLR_AUTO_EVENT', N'CLR_MANUAL_EVENT', N'CLR_SEMAPHORE', N'CXCONSUMER', + N'DBMIRROR_DBM_EVENT', N'DBMIRROR_EVENTS_QUEUE', N'DBMIRROR_WORKER_QUEUE', + N'DBMIRRORING_CMD', N'DIRTY_PAGE_POLL', N'DISPATCHER_QUEUE_SEMAPHORE', + N'EXECSYNC', N'FSAGENT', N'FT_IFTS_SCHEDULER_IDLE_WAIT', N'FT_IFTSHC_MUTEX', + N'HADR_CLUSAPI_CALL', N'HADR_FILESTREAM_IOMGR_IOCOMPLETION', N'HADR_LOGCAPTURE_WAIT', + N'HADR_NOTIFICATION_DEQUEUE', N'HADR_TIMER_TASK', N'HADR_WORK_QUEUE', + N'KSOURCE_WAKEUP', N'LAZYWRITER_SLEEP', N'LOGMGR_QUEUE', + N'MEMORY_ALLOCATION_EXT', N'ONDEMAND_TASK_QUEUE', + N'PARALLEL_REDO_DRAIN_WORKER', N'PARALLEL_REDO_LOG_CACHE', N'PARALLEL_REDO_TRAN_LIST', + N'PARALLEL_REDO_WORKER_SYNC', N'PARALLEL_REDO_WORKER_WAIT_WORK', + N'PREEMPTIVE_HADR_LEASE_MECHANISM', N'PREEMPTIVE_SP_SERVER_DIAGNOSTICS', + N'PREEMPTIVE_OS_LIBRARYOPS', N'PREEMPTIVE_OS_COMOPS', N'PREEMPTIVE_OS_CRYPTOPS', + N'PREEMPTIVE_OS_PIPEOPS', N'PREEMPTIVE_OS_AUTHENTICATIONOPS', + N'PREEMPTIVE_OS_GENERICOPS', N'PREEMPTIVE_OS_VERIFYTRUST', + N'PREEMPTIVE_OS_FILEOPS', N'PREEMPTIVE_OS_DEVICEOPS', N'PREEMPTIVE_OS_QUERYREGISTRY', + N'PREEMPTIVE_OS_WRITEFILE', + N'PREEMPTIVE_XE_CALLBACKEXECUTE', N'PREEMPTIVE_XE_DISPATCHER', + N'PREEMPTIVE_XE_GETTARGETSTATE', N'PREEMPTIVE_XE_SESSIONCOMMIT', + N'PREEMPTIVE_XE_TARGETINIT', N'PREEMPTIVE_XE_TARGETFINALIZE', + N'PWAIT_ALL_COMPONENTS_INITIALIZED', N'PWAIT_DIRECTLOGCONSUMER_GETNEXT', + N'PWAIT_EXTENSIBILITY_CLEANUP_TASK', + N'QDS_PERSIST_TASK_MAIN_LOOP_SLEEP', N'QDS_ASYNC_QUEUE', + N'QDS_CLEANUP_STALE_QUERIES_TASK_MAIN_LOOP_SLEEP', N'REQUEST_FOR_DEADLOCK_SEARCH', + N'RESOURCE_QUEUE', N'SERVER_IDLE_CHECK', N'SLEEP_BPOOL_FLUSH', N'SLEEP_DBSTARTUP', + N'SLEEP_DCOMSTARTUP', N'SLEEP_MASTERDBREADY', N'SLEEP_MASTERMDREADY', + N'SLEEP_MASTERUPGRADED', N'SLEEP_MSDBSTARTUP', N'SLEEP_SYSTEMTASK', N'SLEEP_TASK', + N'SLEEP_TEMPDBSTARTUP', N'SNI_HTTP_ACCEPT', N'SOS_WORK_DISPATCHER', + N'SP_SERVER_DIAGNOSTICS_SLEEP', + N'SQLTRACE_BUFFER_FLUSH', N'SQLTRACE_INCREMENTAL_FLUSH_SLEEP', N'SQLTRACE_WAIT_ENTRIES', + N'STARTUP_DEPENDENCY_MANAGER', + N'WAIT_FOR_RESULTS', N'WAITFOR', N'WAITFOR_TASKSHUTDOWN', N'WAIT_XTP_HOST_WAIT', + N'WAIT_XTP_OFFLINE_CKPT_NEW_LOG', N'WAIT_XTP_CKPT_CLOSE', N'WAIT_XTP_RECOVERY', + N'XE_BUFFERMGR_ALLPROCESSED_EVENT', N'XE_DISPATCHER_JOIN', + N'XE_DISPATCHER_WAIT', N'XE_LIVE_TARGET_TVF', N'XE_TIMER_EVENT') + AND waiting_tasks_count > 0) +SELECT + MAX (W1.wait_type) AS [WaitType], + CAST (MAX (W1.Percentage) AS DECIMAL (5,2)) AS [Wait Percentage], + CAST ((MAX (W1.WaitS) / MAX (W1.WaitCount)) AS DECIMAL (16,4)) AS [AvgWait_Sec], + CAST ((MAX (W1.ResourceS) / MAX (W1.WaitCount)) AS DECIMAL (16,4)) AS [AvgRes_Sec], + CAST ((MAX (W1.SignalS) / MAX (W1.WaitCount)) AS DECIMAL (16,4)) AS [AvgSig_Sec], + CAST (MAX (W1.WaitS) AS DECIMAL (16,2)) AS [Wait_Sec], + CAST (MAX (W1.ResourceS) AS DECIMAL (16,2)) AS [Resource_Sec], + CAST (MAX (W1.SignalS) AS DECIMAL (16,2)) AS [Signal_Sec], + MAX (W1.WaitCount) AS [Wait Count], + CAST (N'https://www.sqlskills.com/help/waits/' + W1.wait_type AS XML) AS [Help/Info URL] +FROM Waits AS W1 +INNER JOIN Waits AS W2 +ON W2.RowNum <= W1.RowNum +GROUP BY W1.RowNum, W1.wait_type +HAVING SUM (W2.Percentage) - MAX (W1.Percentage) < 99 -- percentage threshold +OPTION (RECOMPILE); +------ + +-- Cumulative wait stats are not as useful on an idle instance that is not under load or performance pressure + +-- SQL Server Wait Types Library (Paul Randal) +-- https://bit.ly/2ePzYO2 + +-- The SQL Server Wait Type Repository +-- https://bit.ly/1afzfjC + +-- Wait statistics, or please tell me where it hurts +-- https://bit.ly/2wsQHQE + +-- SQL Server 2005 Performance Tuning using the Waits and Queues +-- https://bit.ly/1o2NFoF + +-- sys.dm_os_wait_stats (Transact-SQL) +-- https://bit.ly/2Hjq9Yl + + + +-- Get a count of SQL connections by IP address (Query 41) (Connection Counts by IP Address) +SELECT ec.client_net_address, es.[program_name], es.[host_name], es.login_name, +COUNT(ec.session_id) AS [connection count] +FROM sys.dm_exec_sessions AS es WITH (NOLOCK) +INNER JOIN sys.dm_exec_connections AS ec WITH (NOLOCK) +ON es.session_id = ec.session_id +GROUP BY ec.client_net_address, es.[program_name], es.[host_name], es.login_name +ORDER BY ec.client_net_address, es.[program_name] OPTION (RECOMPILE); +------ + +-- This helps you figure where your database load is coming from +-- and verifies connectivity from other machines + +-- Solving Connectivity errors to SQL Server +-- https://bit.ly/2EgzoD0 + + + +-- Get Average Task Counts (run multiple times) (Query 42) (Avg Task Counts) +SELECT AVG(current_tasks_count) AS [Avg Task Count], +AVG(work_queue_count) AS [Avg Work Queue Count], +AVG(runnable_tasks_count) AS [Avg Runnable Task Count], +AVG(pending_disk_io_count) AS [Avg Pending DiskIO Count] +FROM sys.dm_os_schedulers WITH (NOLOCK) +WHERE scheduler_id < 255 OPTION (RECOMPILE); +------ + +-- Sustained values above 10 suggest further investigation in that area +-- High Avg Task Counts are often caused by blocking/deadlocking or other resource contention + +-- Sustained values above 1 suggest further investigation in that area +-- High Avg Runnable Task Counts are a good sign of CPU pressure +-- High Avg Pending DiskIO Counts are a sign of disk pressure + +-- How to Do Some Very Basic SQL Server Monitoring +-- https://bit.ly/2q3Btgt + + + +-- Detect blocking (run multiple times) (Query 43) (Detect Blocking) +SELECT t1.resource_type AS [lock type], DB_NAME(resource_database_id) AS [database], +t1.resource_associated_entity_id AS [blk object],t1.request_mode AS [lock req], -- lock requested +t1.request_session_id AS [waiter sid], t2.wait_duration_ms AS [wait time], -- spid of waiter +(SELECT [text] FROM sys.dm_exec_requests AS r WITH (NOLOCK) -- get sql for waiter +CROSS APPLY sys.dm_exec_sql_text(r.[sql_handle]) +WHERE r.session_id = t1.request_session_id) AS [waiter_batch], +(SELECT SUBSTRING(qt.[text],r.statement_start_offset/2, + (CASE WHEN r.statement_end_offset = -1 + THEN LEN(CONVERT(nvarchar(max), qt.[text])) * 2 + ELSE r.statement_end_offset END - r.statement_start_offset)/2) +FROM sys.dm_exec_requests AS r WITH (NOLOCK) +CROSS APPLY sys.dm_exec_sql_text(r.[sql_handle]) AS qt +WHERE r.session_id = t1.request_session_id) AS [waiter_stmt], -- statement blocked +t2.blocking_session_id AS [blocker sid], -- spid of blocker +(SELECT [text] FROM sys.sysprocesses AS p -- get sql for blocker +CROSS APPLY sys.dm_exec_sql_text(p.[sql_handle]) +WHERE p.spid = t2.blocking_session_id) AS [blocker_batch] +FROM sys.dm_tran_locks AS t1 WITH (NOLOCK) +INNER JOIN sys.dm_os_waiting_tasks AS t2 WITH (NOLOCK) +ON t1.lock_owner_address = t2.resource_address OPTION (RECOMPILE); +------ + +-- Helps troubleshoot blocking and deadlocking issues +-- The results will change from second to second on a busy system +-- You should run this query multiple times when you see signs of blocking + + + +-- Get CPU Utilization History for last 256 minutes (in one minute intervals) (Query 44) (CPU Utilization History) +DECLARE @ts_now bigint = (SELECT cpu_ticks/(cpu_ticks/ms_ticks) FROM sys.dm_os_sys_info WITH (NOLOCK)); + +SELECT TOP(256) SQLProcessUtilization AS [SQL Server Process CPU Utilization], + SystemIdle AS [System Idle Process], + 100 - SystemIdle - SQLProcessUtilization AS [Other Process CPU Utilization], + DATEADD(ms, -1 * (@ts_now - [timestamp]), GETDATE()) AS [Event Time] +FROM (SELECT record.value('(./Record/@id)[1]', 'int') AS record_id, + record.value('(./Record/SchedulerMonitorEvent/SystemHealth/SystemIdle)[1]', 'int') + AS [SystemIdle], + record.value('(./Record/SchedulerMonitorEvent/SystemHealth/ProcessUtilization)[1]', 'int') + AS [SQLProcessUtilization], [timestamp] + FROM (SELECT [timestamp], CONVERT(xml, record) AS [record] + FROM sys.dm_os_ring_buffers WITH (NOLOCK) + WHERE ring_buffer_type = N'RING_BUFFER_SCHEDULER_MONITOR' + AND record LIKE N'%%') AS x) AS y +ORDER BY record_id DESC OPTION (RECOMPILE); +------ + +-- Look at the trend over the entire period +-- Also look at high sustained 'Other Process' CPU Utilization values +-- Note: This query sometimes gives inaccurate results (negative values) +-- on high core count (> 64 cores) systems + + +-- Get top total worker time queries for entire instance (Query 45) (Top Worker Time Queries) +SELECT TOP(50) DB_NAME(t.[dbid]) AS [Database Name], +REPLACE(REPLACE(LEFT(t.[text], 255), CHAR(10),''), CHAR(13),'') AS [Short Query Text], +qs.total_worker_time AS [Total Worker Time], qs.min_worker_time AS [Min Worker Time], +qs.total_worker_time/qs.execution_count AS [Avg Worker Time], +qs.max_worker_time AS [Max Worker Time], +qs.min_elapsed_time AS [Min Elapsed Time], +qs.total_elapsed_time/qs.execution_count AS [Avg Elapsed Time], +qs.max_elapsed_time AS [Max Elapsed Time], +qs.min_logical_reads AS [Min Logical Reads], +qs.total_logical_reads/qs.execution_count AS [Avg Logical Reads], +qs.max_logical_reads AS [Max Logical Reads], +qs.execution_count AS [Execution Count], +CASE WHEN CONVERT(nvarchar(max), qp.query_plan) LIKE N'%%' THEN 1 ELSE 0 END AS [Has Missing Index], +qs.creation_time AS [Creation Time] +--,t.[text] AS [Query Text], qp.query_plan AS [Query Plan] -- uncomment out these columns if not copying results to Excel +FROM sys.dm_exec_query_stats AS qs WITH (NOLOCK) +CROSS APPLY sys.dm_exec_sql_text(plan_handle) AS t +CROSS APPLY sys.dm_exec_query_plan(plan_handle) AS qp +ORDER BY qs.total_worker_time DESC OPTION (RECOMPILE); +------ + + +-- Helps you find the most expensive queries from a CPU perspective across the entire instance +-- Can also help track down parameter sniffing issues + + + +-- Page Life Expectancy (PLE) value for each NUMA node in current instance (Query 46) (PLE by NUMA Node) +SELECT @@SERVERNAME AS [Server Name], RTRIM([object_name]) AS [Object Name], instance_name, cntr_value AS [Page Life Expectancy] +FROM sys.dm_os_performance_counters WITH (NOLOCK) +WHERE [object_name] LIKE N'%Buffer Node%' -- Handles named instances +AND counter_name = N'Page life expectancy' OPTION (RECOMPILE); +------ + +-- PLE is a good measurement of internal memory pressure +-- Higher PLE is better. Watch the trend over time, not the absolute value +-- This will only return one row for non-NUMA systems + +-- Page Life Expectancy isn’t what you think… +-- https://bit.ly/2EgynLa + + +-- Memory Grants Pending value for current instance (Query 47) (Memory Grants Pending) +SELECT @@SERVERNAME AS [Server Name], RTRIM([object_name]) AS [Object Name], cntr_value AS [Memory Grants Pending] +FROM sys.dm_os_performance_counters WITH (NOLOCK) +WHERE [object_name] LIKE N'%Memory Manager%' -- Handles named instances +AND counter_name = N'Memory Grants Pending' OPTION (RECOMPILE); +------ + +-- Run multiple times, and run periodically if you suspect you are under memory pressure +-- Memory Grants Pending above zero for a sustained period is a very strong indicator of internal memory pressure + + +-- Memory Clerk Usage for instance (Query 48) (Memory Clerk Usage) +-- Look for high value for CACHESTORE_SQLCP (Ad-hoc query plans) +SELECT TOP(10) mc.[type] AS [Memory Clerk Type], + CAST((SUM(mc.pages_kb)/1024.0) AS DECIMAL (15,2)) AS [Memory Usage (MB)] +FROM sys.dm_os_memory_clerks AS mc WITH (NOLOCK) +GROUP BY mc.[type] +ORDER BY SUM(mc.pages_kb) DESC OPTION (RECOMPILE); +------ + +-- MEMORYCLERK_SQLBUFFERPOOL was new for SQL Server 2012. It should be your highest consumer of memory + +-- CACHESTORE_SQLCP SQL Plans +-- These are cached SQL statements or batches that aren't in stored procedures, functions and triggers +-- Watch out for high values for CACHESTORE_SQLCP +-- Enabling 'optimize for ad hoc workloads' at the instance level can help reduce this +-- Running DBCC FREESYSTEMCACHE ('SQL Plans') periodically may be required to better control this + +-- CACHESTORE_OBJCP Object Plans +-- These are compiled plans for stored procedures, functions and triggers + +-- sys.dm_os_memory_clerks (Transact-SQL) +-- https://bit.ly/2H31xDR + + + +-- Find single-use, ad-hoc and prepared queries that are bloating the plan cache (Query 49) (Ad hoc Queries) +SELECT TOP(50) DB_NAME(t.[dbid]) AS [Database Name], t.[text] AS [Query Text], +cp.objtype AS [Object Type], cp.cacheobjtype AS [Cache Object Type], +cp.size_in_bytes/1024 AS [Plan Size in KB] +FROM sys.dm_exec_cached_plans AS cp WITH (NOLOCK) +CROSS APPLY sys.dm_exec_sql_text(plan_handle) AS t +WHERE cp.cacheobjtype = N'Compiled Plan' +AND cp.objtype IN (N'Adhoc', N'Prepared') +AND cp.usecounts = 1 +ORDER BY cp.size_in_bytes DESC, DB_NAME(t.[dbid]) OPTION (RECOMPILE); +------ + +-- Gives you the text, type and size of single-use ad-hoc and prepared queries that waste space in the plan cache +-- Enabling 'optimize for ad hoc workloads' for the instance can help (SQL Server 2008 and above only) +-- Running DBCC FREESYSTEMCACHE ('SQL Plans') periodically may be required to better control this +-- Enabling forced parameterization for the database can help, but test first! + +-- Plan cache, adhoc workloads and clearing the single-use plan cache bloat +-- https://bit.ly/2EfYOkl + + +-- Get top total logical reads queries for entire instance (Query 50) (Top Logical Reads Queries) +SELECT TOP(50) DB_NAME(t.[dbid]) AS [Database Name], +REPLACE(REPLACE(LEFT(t.[text], 255), CHAR(10),''), CHAR(13),'') AS [Short Query Text], +qs.total_logical_reads AS [Total Logical Reads], +qs.min_logical_reads AS [Min Logical Reads], +qs.total_logical_reads/qs.execution_count AS [Avg Logical Reads], +qs.max_logical_reads AS [Max Logical Reads], +qs.min_worker_time AS [Min Worker Time], +qs.total_worker_time/qs.execution_count AS [Avg Worker Time], +qs.max_worker_time AS [Max Worker Time], +qs.min_elapsed_time AS [Min Elapsed Time], +qs.total_elapsed_time/qs.execution_count AS [Avg Elapsed Time], +qs.max_elapsed_time AS [Max Elapsed Time], +qs.execution_count AS [Execution Count], +CASE WHEN CONVERT(nvarchar(max), qp.query_plan) LIKE N'%%' THEN 1 ELSE 0 END AS [Has Missing Index], +qs.creation_time AS [Creation Time] +--,t.[text] AS [Complete Query Text], qp.query_plan AS [Query Plan] -- uncomment out these columns if not copying results to Excel +FROM sys.dm_exec_query_stats AS qs WITH (NOLOCK) +CROSS APPLY sys.dm_exec_sql_text(plan_handle) AS t +CROSS APPLY sys.dm_exec_query_plan(plan_handle) AS qp +ORDER BY qs.total_logical_reads DESC OPTION (RECOMPILE); +------ + + +-- Helps you find the most expensive queries from a memory perspective across the entire instance +-- Can also help track down parameter sniffing issues + + +-- Get top average elapsed time queries for entire instance (Query 51) (Top Avg Elapsed Time Queries) +SELECT TOP(50) DB_NAME(t.[dbid]) AS [Database Name], +REPLACE(REPLACE(LEFT(t.[text], 255), CHAR(10),''), CHAR(13),'') AS [Short Query Text], +qs.total_elapsed_time/qs.execution_count AS [Avg Elapsed Time], +qs.min_elapsed_time, qs.max_elapsed_time, qs.last_elapsed_time, +qs.execution_count AS [Execution Count], +qs.total_logical_reads/qs.execution_count AS [Avg Logical Reads], +qs.total_physical_reads/qs.execution_count AS [Avg Physical Reads], +qs.total_worker_time/qs.execution_count AS [Avg Worker Time], +CASE WHEN CONVERT(nvarchar(max), qp.query_plan) LIKE N'%%' THEN 1 ELSE 0 END AS [Has Missing Index], +qs.creation_time AS [Creation Time] +--,t.[text] AS [Complete Query Text], qp.query_plan AS [Query Plan] -- uncomment out these columns if not copying results to Excel +FROM sys.dm_exec_query_stats AS qs WITH (NOLOCK) +CROSS APPLY sys.dm_exec_sql_text(plan_handle) AS t +CROSS APPLY sys.dm_exec_query_plan(plan_handle) AS qp +ORDER BY qs.total_elapsed_time/qs.execution_count DESC OPTION (RECOMPILE); +------ + +-- Helps you find the highest average elapsed time queries across the entire instance +-- Can also help track down parameter sniffing issues + + +-- Look at UDF execution statistics (Query 52) (UDF Stats by DB) +SELECT TOP (25) DB_NAME(database_id) AS [Database Name], + OBJECT_NAME(object_id, database_id) AS [Function Name], + total_worker_time, execution_count, total_elapsed_time, + total_elapsed_time/execution_count AS [avg_elapsed_time], + last_elapsed_time, last_execution_time, cached_time, [type_desc] +FROM sys.dm_exec_function_stats WITH (NOLOCK) +ORDER BY total_worker_time DESC OPTION (RECOMPILE); +------ + +-- sys.dm_exec_function_stats (Transact-SQL) +-- https://bit.ly/2q1Q6BM + +-- Showplan Enhancements for UDFs +-- https://bit.ly/2LVqiQ1 + + +-- Database specific queries ***************************************************************** + +-- **** Please switch to a user database that you are interested in! ***** +--USE YourDatabaseName; -- make sure to change to an actual database on your instance, not the master system database +--GO + +-- Individual File Sizes and space available for current database (Query 53) (File Sizes and Space) +SELECT f.name AS [File Name] , f.physical_name AS [Physical Name], +CAST((f.size/128.0) AS DECIMAL(15,2)) AS [Total Size in MB], +CAST(f.size/128.0 - CAST(FILEPROPERTY(f.name, 'SpaceUsed') AS int)/128.0 AS DECIMAL(15,2)) +AS [Available Space In MB], f.[file_id], fg.name AS [Filegroup Name], +f.is_percent_growth, f.growth, fg.is_default, fg.is_read_only, +fg.is_autogrow_all_files +FROM sys.database_files AS f WITH (NOLOCK) +LEFT OUTER JOIN sys.filegroups AS fg WITH (NOLOCK) +ON f.data_space_id = fg.data_space_id +ORDER BY f.[file_id] OPTION (RECOMPILE); +------ + +-- Look at how large and how full the files are and where they are located +-- Make sure the transaction log is not full!! + +-- is_autogrow_all_files was new for SQL Server 2016. Equivalent to TF 1117 for user databases + +-- SQL Server 2016: Changes in default behavior for autogrow and allocations for tempdb and user databases +-- https://bit.ly/2evRZSR + + +-- Log space usage for current database (Query 54) (Log Space Usage) +SELECT DB_NAME(lsu.database_id) AS [Database Name], db.recovery_model_desc AS [Recovery Model], + CAST(lsu.total_log_size_in_bytes/1048576.0 AS DECIMAL(10, 2)) AS [Total Log Space (MB)], + CAST(lsu.used_log_space_in_bytes/1048576.0 AS DECIMAL(10, 2)) AS [Used Log Space (MB)], + CAST(lsu.used_log_space_in_percent AS DECIMAL(10, 2)) AS [Used Log Space %], + CAST(lsu.log_space_in_bytes_since_last_backup/1048576.0 AS DECIMAL(10, 2)) AS [Used Log Space Since Last Backup (MB)], + db.log_reuse_wait_desc +FROM sys.dm_db_log_space_usage AS lsu WITH (NOLOCK) +INNER JOIN sys.databases AS db WITH (NOLOCK) +ON lsu.database_id = db.database_id +OPTION (RECOMPILE); +------ + +-- Look at log file size and usage, along with the log reuse wait description for the current database + +-- sys.dm_db_log_space_usage (Transact-SQL) +-- https://bit.ly/2H4MQw9 + + +-- Status of last VLF for current database (Query 55) (Last VLF Status) +SELECT TOP(1) DB_NAME(li.database_id) AS [Database Name], li.[file_id], + li.vlf_size_mb, li.vlf_sequence_number, li.vlf_active, li.vlf_status +FROM sys.dm_db_log_info(DB_ID()) AS li +ORDER BY vlf_sequence_number DESC OPTION (RECOMPILE); +------ + +-- Determine whether you will be able to shrink the transaction log file + +-- vlf_status Values +-- 0 is inactive +-- 1 is initialized but unused +-- 2 is active + +-- sys.dm_db_log_info (Transact-SQL) +-- https://bit.ly/2EQUU1v + + + +-- Get database scoped configuration values for current database (Query 56) (Database-scoped Configurations) +SELECT configuration_id, name, [value] AS [value_for_primary], value_for_secondary +FROM sys.database_scoped_configurations WITH (NOLOCK) OPTION (RECOMPILE); +------ + +-- This lets you see the value of these new properties for the current database + +-- Clear plan cache for current database +-- ALTER DATABASE SCOPED CONFIGURATION CLEAR PROCEDURE_CACHE; + +-- ALTER DATABASE SCOPED CONFIGURATION (Transact-SQL) +-- https://bit.ly/2sOH7nb + + +-- I/O Statistics by file for the current database (Query 57) (IO Stats By File) +SELECT DB_NAME(DB_ID()) AS [Database Name], df.name AS [Logical Name], vfs.[file_id], df.type_desc, +df.physical_name AS [Physical Name], CAST(vfs.size_on_disk_bytes/1048576.0 AS DECIMAL(10, 2)) AS [Size on Disk (MB)], +vfs.num_of_reads, vfs.num_of_writes, vfs.io_stall_read_ms, vfs.io_stall_write_ms, +CAST(100. * vfs.io_stall_read_ms/(vfs.io_stall_read_ms + vfs.io_stall_write_ms) AS DECIMAL(10,1)) AS [IO Stall Reads Pct], +CAST(100. * vfs.io_stall_write_ms/(vfs.io_stall_write_ms + vfs.io_stall_read_ms) AS DECIMAL(10,1)) AS [IO Stall Writes Pct], +(vfs.num_of_reads + vfs.num_of_writes) AS [Writes + Reads], +CAST(vfs.num_of_bytes_read/1048576.0 AS DECIMAL(10, 2)) AS [MB Read], +CAST(vfs.num_of_bytes_written/1048576.0 AS DECIMAL(10, 2)) AS [MB Written], +CAST(100. * vfs.num_of_reads/(vfs.num_of_reads + vfs.num_of_writes) AS DECIMAL(10,1)) AS [# Reads Pct], +CAST(100. * vfs.num_of_writes/(vfs.num_of_reads + vfs.num_of_writes) AS DECIMAL(10,1)) AS [# Write Pct], +CAST(100. * vfs.num_of_bytes_read/(vfs.num_of_bytes_read + vfs.num_of_bytes_written) AS DECIMAL(10,1)) AS [Read Bytes Pct], +CAST(100. * vfs.num_of_bytes_written/(vfs.num_of_bytes_read + vfs.num_of_bytes_written) AS DECIMAL(10,1)) AS [Written Bytes Pct] +FROM sys.dm_io_virtual_file_stats(DB_ID(), NULL) AS vfs +INNER JOIN sys.database_files AS df WITH (NOLOCK) +ON vfs.[file_id]= df.[file_id] OPTION (RECOMPILE); +------ + +-- This helps you characterize your workload better from an I/O perspective for this database +-- It helps you determine whether you has an OLTP or DW/DSS type of workload + + + +-- Get most frequently executed queries for this database (Query 58) (Query Execution Counts) +SELECT TOP(50) LEFT(t.[text], 50) AS [Short Query Text], qs.execution_count AS [Execution Count], +qs.total_logical_reads AS [Total Logical Reads], +qs.total_logical_reads/qs.execution_count AS [Avg Logical Reads], +qs.total_worker_time AS [Total Worker Time], +qs.total_worker_time/qs.execution_count AS [Avg Worker Time], +qs.total_elapsed_time AS [Total Elapsed Time], +qs.total_elapsed_time/qs.execution_count AS [Avg Elapsed Time], +CASE WHEN CONVERT(nvarchar(max), qp.query_plan) LIKE N'%%' THEN 1 ELSE 0 END AS [Has Missing Index], +qs.creation_time AS [Creation Time] +--,t.[text] AS [Complete Query Text], qp.query_plan AS [Query Plan] -- uncomment out these columns if not copying results to Excel +FROM sys.dm_exec_query_stats AS qs WITH (NOLOCK) +CROSS APPLY sys.dm_exec_sql_text(plan_handle) AS t +CROSS APPLY sys.dm_exec_query_plan(plan_handle) AS qp +WHERE t.dbid = DB_ID() +ORDER BY qs.execution_count DESC OPTION (RECOMPILE); +------ + + +-- Queries 59 through 64 are the "Bad Man List" for stored procedures + +-- Top Cached SPs By Execution Count (Query 59) (SP Execution Counts) +SELECT TOP(100) p.name AS [SP Name], qs.execution_count AS [Execution Count], +ISNULL(qs.execution_count/DATEDIFF(Minute, qs.cached_time, GETDATE()), 0) AS [Calls/Minute], +qs.total_elapsed_time/qs.execution_count AS [Avg Elapsed Time], +qs.total_worker_time/qs.execution_count AS [Avg Worker Time], +qs.total_logical_reads/qs.execution_count AS [Avg Logical Reads], +CASE WHEN CONVERT(nvarchar(max), qp.query_plan) LIKE N'%%' THEN 1 ELSE 0 END AS [Has Missing Index], +FORMAT(qs.last_execution_time, 'yyyy-MM-dd HH:mm:ss', 'en-US') AS [Last Execution Time], +FORMAT(qs.cached_time, 'yyyy-MM-dd HH:mm:ss', 'en-US') AS [Plan Cached Time] +-- ,qp.query_plan AS [Query Plan] -- Uncomment if you want the Query Plan +FROM sys.procedures AS p WITH (NOLOCK) +INNER JOIN sys.dm_exec_procedure_stats AS qs WITH (NOLOCK) +ON p.[object_id] = qs.[object_id] +CROSS APPLY sys.dm_exec_query_plan(qs.plan_handle) AS qp +WHERE qs.database_id = DB_ID() +AND DATEDIFF(Minute, qs.cached_time, GETDATE()) > 0 +ORDER BY qs.execution_count DESC OPTION (RECOMPILE); +------ + +-- Tells you which cached stored procedures are called the most often +-- This helps you characterize and baseline your workload + + +-- Top Cached SPs By Avg Elapsed Time (Query 60) (SP Avg Elapsed Time) +SELECT TOP(25) p.name AS [SP Name], qs.min_elapsed_time, qs.total_elapsed_time/qs.execution_count AS [avg_elapsed_time], +qs.max_elapsed_time, qs.last_elapsed_time, qs.total_elapsed_time, qs.execution_count, +ISNULL(qs.execution_count/DATEDIFF(Minute, qs.cached_time, GETDATE()), 0) AS [Calls/Minute], +qs.total_worker_time/qs.execution_count AS [AvgWorkerTime], +qs.total_worker_time AS [TotalWorkerTime], +CASE WHEN CONVERT(nvarchar(max), qp.query_plan) LIKE N'%%' THEN 1 ELSE 0 END AS [Has Missing Index], +FORMAT(qs.last_execution_time, 'yyyy-MM-dd HH:mm:ss', 'en-US') AS [Last Execution Time], +FORMAT(qs.cached_time, 'yyyy-MM-dd HH:mm:ss', 'en-US') AS [Plan Cached Time] +-- ,qp.query_plan AS [Query Plan] -- Uncomment if you want the Query Plan +FROM sys.procedures AS p WITH (NOLOCK) +INNER JOIN sys.dm_exec_procedure_stats AS qs WITH (NOLOCK) +ON p.[object_id] = qs.[object_id] +CROSS APPLY sys.dm_exec_query_plan(qs.plan_handle) AS qp +WHERE qs.database_id = DB_ID() +AND DATEDIFF(Minute, qs.cached_time, GETDATE()) > 0 +ORDER BY avg_elapsed_time DESC OPTION (RECOMPILE); +------ + +-- This helps you find high average elapsed time cached stored procedures that +-- may be easy to optimize with standard query tuning techniques + + + +-- Top Cached SPs By Total Worker time. Worker time relates to CPU cost (Query 61) (SP Worker Time) +SELECT TOP(25) p.name AS [SP Name], qs.total_worker_time AS [TotalWorkerTime], +qs.total_worker_time/qs.execution_count AS [AvgWorkerTime], qs.execution_count, +ISNULL(qs.execution_count/DATEDIFF(Minute, qs.cached_time, GETDATE()), 0) AS [Calls/Minute], +qs.total_elapsed_time, qs.total_elapsed_time/qs.execution_count AS [avg_elapsed_time], +CASE WHEN CONVERT(nvarchar(max), qp.query_plan) LIKE N'%%' THEN 1 ELSE 0 END AS [Has Missing Index], +FORMAT(qs.last_execution_time, 'yyyy-MM-dd HH:mm:ss', 'en-US') AS [Last Execution Time], +FORMAT(qs.cached_time, 'yyyy-MM-dd HH:mm:ss', 'en-US') AS [Plan Cached Time] +-- ,qp.query_plan AS [Query Plan] -- Uncomment if you want the Query Plan +FROM sys.procedures AS p WITH (NOLOCK) +INNER JOIN sys.dm_exec_procedure_stats AS qs WITH (NOLOCK) +ON p.[object_id] = qs.[object_id] +CROSS APPLY sys.dm_exec_query_plan(qs.plan_handle) AS qp +WHERE qs.database_id = DB_ID() +AND DATEDIFF(Minute, qs.cached_time, GETDATE()) > 0 +ORDER BY qs.total_worker_time DESC OPTION (RECOMPILE); +------ + +-- This helps you find the most expensive cached stored procedures from a CPU perspective +-- You should look at this if you see signs of CPU pressure + + +-- Top Cached SPs By Total Logical Reads. Logical reads relate to memory pressure (Query 62) (SP Logical Reads) +SELECT TOP(25) p.name AS [SP Name], qs.total_logical_reads AS [TotalLogicalReads], +qs.total_logical_reads/qs.execution_count AS [AvgLogicalReads],qs.execution_count, +ISNULL(qs.execution_count/DATEDIFF(Minute, qs.cached_time, GETDATE()), 0) AS [Calls/Minute], +qs.total_elapsed_time, qs.total_elapsed_time/qs.execution_count AS [avg_elapsed_time], +CASE WHEN CONVERT(nvarchar(max), qp.query_plan) LIKE N'%%' THEN 1 ELSE 0 END AS [Has Missing Index], +FORMAT(qs.last_execution_time, 'yyyy-MM-dd HH:mm:ss', 'en-US') AS [Last Execution Time], +FORMAT(qs.cached_time, 'yyyy-MM-dd HH:mm:ss', 'en-US') AS [Plan Cached Time] +-- ,qp.query_plan AS [Query Plan] -- Uncomment if you want the Query Plan +FROM sys.procedures AS p WITH (NOLOCK) +INNER JOIN sys.dm_exec_procedure_stats AS qs WITH (NOLOCK) +ON p.[object_id] = qs.[object_id] +CROSS APPLY sys.dm_exec_query_plan(qs.plan_handle) AS qp +WHERE qs.database_id = DB_ID() +AND DATEDIFF(Minute, qs.cached_time, GETDATE()) > 0 +ORDER BY qs.total_logical_reads DESC OPTION (RECOMPILE); +------ + +-- This helps you find the most expensive cached stored procedures from a memory perspective +-- You should look at this if you see signs of memory pressure + + +-- Top Cached SPs By Total Physical Reads. Physical reads relate to disk read I/O pressure (Query 63) (SP Physical Reads) +SELECT TOP(25) p.name AS [SP Name],qs.total_physical_reads AS [TotalPhysicalReads], +qs.total_physical_reads/qs.execution_count AS [AvgPhysicalReads], qs.execution_count, +qs.total_logical_reads,qs.total_elapsed_time, qs.total_elapsed_time/qs.execution_count AS [avg_elapsed_time], +CASE WHEN CONVERT(nvarchar(max), qp.query_plan) LIKE N'%%' THEN 1 ELSE 0 END AS [Has Missing Index], +FORMAT(qs.last_execution_time, 'yyyy-MM-dd HH:mm:ss', 'en-US') AS [Last Execution Time], +FORMAT(qs.cached_time, 'yyyy-MM-dd HH:mm:ss', 'en-US') AS [Plan Cached Time] +-- ,qp.query_plan AS [Query Plan] -- Uncomment if you want the Query Plan +FROM sys.procedures AS p WITH (NOLOCK) +INNER JOIN sys.dm_exec_procedure_stats AS qs WITH (NOLOCK) +ON p.[object_id] = qs.[object_id] +CROSS APPLY sys.dm_exec_query_plan(qs.plan_handle) AS qp +WHERE qs.database_id = DB_ID() +AND qs.total_physical_reads > 0 +ORDER BY qs.total_physical_reads DESC, qs.total_logical_reads DESC OPTION (RECOMPILE); +------ + +-- This helps you find the most expensive cached stored procedures from a read I/O perspective +-- You should look at this if you see signs of I/O pressure or of memory pressure + + + +-- Top Cached SPs By Total Logical Writes (Query 64) (SP Logical Writes) +-- Logical writes relate to both memory and disk I/O pressure +SELECT TOP(25) p.name AS [SP Name], qs.total_logical_writes AS [TotalLogicalWrites], +qs.total_logical_writes/qs.execution_count AS [AvgLogicalWrites], qs.execution_count, +ISNULL(qs.execution_count/DATEDIFF(Minute, qs.cached_time, GETDATE()), 0) AS [Calls/Minute], +qs.total_elapsed_time, qs.total_elapsed_time/qs.execution_count AS [avg_elapsed_time], +CASE WHEN CONVERT(nvarchar(max), qp.query_plan) LIKE N'%%' THEN 1 ELSE 0 END AS [Has Missing Index], +FORMAT(qs.last_execution_time, 'yyyy-MM-dd HH:mm:ss', 'en-US') AS [Last Execution Time], +FORMAT(qs.cached_time, 'yyyy-MM-dd HH:mm:ss', 'en-US') AS [Plan Cached Time] +-- ,qp.query_plan AS [Query Plan] -- Uncomment if you want the Query Plan +FROM sys.procedures AS p WITH (NOLOCK) +INNER JOIN sys.dm_exec_procedure_stats AS qs WITH (NOLOCK) +ON p.[object_id] = qs.[object_id] +CROSS APPLY sys.dm_exec_query_plan(qs.plan_handle) AS qp +WHERE qs.database_id = DB_ID() +AND qs.total_logical_writes > 0 +AND DATEDIFF(Minute, qs.cached_time, GETDATE()) > 0 +ORDER BY qs.total_logical_writes DESC OPTION (RECOMPILE); +------ + +-- This helps you find the most expensive cached stored procedures from a write I/O perspective +-- You should look at this if you see signs of I/O pressure or of memory pressure + + +-- Lists the top statements by average input/output usage for the current database (Query 65) (Top IO Statements) +SELECT TOP(50) OBJECT_NAME(qt.objectid, dbid) AS [SP Name], +(qs.total_logical_reads + qs.total_logical_writes) /qs.execution_count AS [Avg IO], qs.execution_count AS [Execution Count], +SUBSTRING(qt.[text],qs.statement_start_offset/2, + (CASE + WHEN qs.statement_end_offset = -1 + THEN LEN(CONVERT(nvarchar(max), qt.[text])) * 2 + ELSE qs.statement_end_offset + END - qs.statement_start_offset)/2) AS [Query Text] +FROM sys.dm_exec_query_stats AS qs WITH (NOLOCK) +CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS qt +WHERE qt.[dbid] = DB_ID() +ORDER BY [Avg IO] DESC OPTION (RECOMPILE); +------ + +-- Helps you find the most expensive statements for I/O by SP + + + +-- Possible Bad NC Indexes (writes > reads) (Query 66) (Bad NC Indexes) +SELECT OBJECT_NAME(s.[object_id]) AS [Table Name], i.name AS [Index Name], i.index_id, +i.is_disabled, i.is_hypothetical, i.has_filter, i.fill_factor, +s.user_updates AS [Total Writes], s.user_seeks + s.user_scans + s.user_lookups AS [Total Reads], +s.user_updates - (s.user_seeks + s.user_scans + s.user_lookups) AS [Difference] +FROM sys.dm_db_index_usage_stats AS s WITH (NOLOCK) +INNER JOIN sys.indexes AS i WITH (NOLOCK) +ON s.[object_id] = i.[object_id] +AND i.index_id = s.index_id +WHERE OBJECTPROPERTY(s.[object_id],'IsUserTable') = 1 +AND s.database_id = DB_ID() +AND s.user_updates > (s.user_seeks + s.user_scans + s.user_lookups) +AND i.index_id > 1 AND i.[type_desc] = N'NONCLUSTERED' +AND i.is_primary_key = 0 AND i.is_unique_constraint = 0 AND i.is_unique = 0 +ORDER BY [Difference] DESC, [Total Writes] DESC, [Total Reads] ASC OPTION (RECOMPILE); +------ + +-- Look for indexes with high numbers of writes and zero or very low numbers of reads +-- Consider your complete workload, and how long your instance has been running +-- Investigate further before dropping an index! + + +-- Missing Indexes for current database by Index Advantage (Query 67) (Missing Indexes) +SELECT DISTINCT CONVERT(decimal(18,2), user_seeks * avg_total_user_cost * (avg_user_impact * 0.01)) AS [index_advantage], +migs.last_user_seek, mid.[statement] AS [Database.Schema.Table], +mid.equality_columns, mid.inequality_columns, mid.included_columns, +migs.unique_compiles, migs.user_seeks, migs.avg_total_user_cost, migs.avg_user_impact, +OBJECT_NAME(mid.[object_id]) AS [Table Name], p.rows AS [Table Rows] +FROM sys.dm_db_missing_index_group_stats AS migs WITH (NOLOCK) +INNER JOIN sys.dm_db_missing_index_groups AS mig WITH (NOLOCK) +ON migs.group_handle = mig.index_group_handle +INNER JOIN sys.dm_db_missing_index_details AS mid WITH (NOLOCK) +ON mig.index_handle = mid.index_handle +INNER JOIN sys.partitions AS p WITH (NOLOCK) +ON p.[object_id] = mid.[object_id] +WHERE mid.database_id = DB_ID() +AND p.index_id < 2 +ORDER BY index_advantage DESC OPTION (RECOMPILE); +------ + +-- Look at index advantage, last user seek time, number of user seeks to help determine source and importance +-- SQL Server is overly eager to add included columns, so beware +-- Do not just blindly add indexes that show up from this query!!! + + +-- Find missing index warnings for cached plans in the current database (Query 60) (Missing Index Warnings) +-- Note: This query could take some time on a busy instance +SELECT TOP(25) OBJECT_NAME(objectid) AS [ObjectName], + cp.objtype, cp.usecounts, cp.size_in_bytes, query_plan +FROM sys.dm_exec_cached_plans AS cp WITH (NOLOCK) +CROSS APPLY sys.dm_exec_query_plan(cp.plan_handle) AS qp +WHERE CAST(query_plan AS NVARCHAR(MAX)) LIKE N'%MissingIndex%' +AND dbid = DB_ID() +ORDER BY cp.usecounts DESC OPTION (RECOMPILE); +------ + +-- Helps you connect missing indexes to specific stored procedures or queries +-- This can help you decide whether to add them or not + + +-- Breaks down buffers used by current database by object (table, index) in the buffer cache (Query 69) (Buffer Usage) +-- Note: This query could take some time on a busy instance +SELECT OBJECT_NAME(p.[object_id]) AS [Object Name], p.index_id, +CAST(COUNT(*)/128.0 AS DECIMAL(10, 2)) AS [Buffer size(MB)], +COUNT(*) AS [BufferCount], p.[Rows] AS [Row Count], +p.data_compression_desc AS [Compression Type] +FROM sys.allocation_units AS a WITH (NOLOCK) +INNER JOIN sys.dm_os_buffer_descriptors AS b WITH (NOLOCK) +ON a.allocation_unit_id = b.allocation_unit_id +INNER JOIN sys.partitions AS p WITH (NOLOCK) +ON a.container_id = p.hobt_id +WHERE b.database_id = CONVERT(int, DB_ID()) +AND p.[object_id] > 100 +AND OBJECT_NAME(p.[object_id]) NOT LIKE N'plan_%' +AND OBJECT_NAME(p.[object_id]) NOT LIKE N'sys%' +AND OBJECT_NAME(p.[object_id]) NOT LIKE N'xml_index_nodes%' +GROUP BY p.[object_id], p.index_id, p.data_compression_desc, p.[Rows] +ORDER BY [BufferCount] DESC OPTION (RECOMPILE); +------ + +-- Tells you what tables and indexes are using the most memory in the buffer cache +-- It can help identify possible candidates for data compression + + +-- Get Table names, row counts, and compression status for clustered index or heap (Query 70) (Table Sizes) +SELECT SCHEMA_NAME(o.Schema_ID) AS [Schema Name], OBJECT_NAME(p.object_id) AS [ObjectName], +SUM(p.Rows) AS [RowCount], data_compression_desc AS [CompressionType] +FROM sys.partitions AS p WITH (NOLOCK) +INNER JOIN sys.objects AS o WITH (NOLOCK) +ON p.object_id = o.object_id +WHERE index_id < 2 --ignore the partitions from the non-clustered index if any +AND OBJECT_NAME(p.object_id) NOT LIKE N'sys%' +AND OBJECT_NAME(p.object_id) NOT LIKE N'spt_%' +AND OBJECT_NAME(p.object_id) NOT LIKE N'queue_%' +AND OBJECT_NAME(p.object_id) NOT LIKE N'filestream_tombstone%' +AND OBJECT_NAME(p.object_id) NOT LIKE N'fulltext%' +AND OBJECT_NAME(p.object_id) NOT LIKE N'ifts_comp_fragment%' +AND OBJECT_NAME(p.object_id) NOT LIKE N'filetable_updates%' +AND OBJECT_NAME(p.object_id) NOT LIKE N'xml_index_nodes%' +AND OBJECT_NAME(p.object_id) NOT LIKE N'sqlagent_job%' +AND OBJECT_NAME(p.object_id) NOT LIKE N'plan_persist%' +GROUP BY SCHEMA_NAME(o.Schema_ID), p.object_id, data_compression_desc +ORDER BY SUM(p.Rows) DESC OPTION (RECOMPILE); +------ + +-- Gives you an idea of table sizes, and possible data compression opportunities + + + +-- Get some key table properties (Query 71) (Table Properties) +SELECT OBJECT_NAME(t.[object_id]) AS [ObjectName], p.[rows] AS [Table Rows], p.index_id, + p.data_compression_desc AS [Index Data Compression], + t.create_date, t.lock_on_bulk_load, t.is_replicated, t.has_replication_filter, + t.is_tracked_by_cdc, t.lock_escalation_desc, t.is_filetable, + t.is_memory_optimized, t.durability_desc, + t.temporal_type_desc, t.is_remote_data_archive_enabled, t.is_external -- new for SQL Server 2016 +FROM sys.tables AS t WITH (NOLOCK) +INNER JOIN sys.partitions AS p WITH (NOLOCK) +ON t.[object_id] = p.[object_id] +WHERE OBJECT_NAME(t.[object_id]) NOT LIKE N'sys%' +ORDER BY OBJECT_NAME(t.[object_id]), p.index_id OPTION (RECOMPILE); +------ + +-- Gives you some good information about your tables +-- is_memory_optimized and durability_desc were new in SQL Server 2014 +-- temporal_type_desc, is_remote_data_archive_enabled, is_external were new in SQL Server 2016 + +-- sys.tables (Transact-SQL) +-- https://bit.ly/2Gk7998 + + + +-- When were Statistics last updated on all indexes? (Query 72) (Statistics Update) +SELECT SCHEMA_NAME(o.Schema_ID) + N'.' + o.[NAME] AS [Object Name], o.[type_desc] AS [Object Type], + i.[name] AS [Index Name], STATS_DATE(i.[object_id], i.index_id) AS [Statistics Date], + s.auto_created, s.no_recompute, s.user_created, s.is_incremental, s.is_temporary, + st.row_count, st.used_page_count +FROM sys.objects AS o WITH (NOLOCK) +INNER JOIN sys.indexes AS i WITH (NOLOCK) +ON o.[object_id] = i.[object_id] +INNER JOIN sys.stats AS s WITH (NOLOCK) +ON i.[object_id] = s.[object_id] +AND i.index_id = s.stats_id +INNER JOIN sys.dm_db_partition_stats AS st WITH (NOLOCK) +ON o.[object_id] = st.[object_id] +AND i.[index_id] = st.[index_id] +WHERE o.[type] IN ('U', 'V') +AND st.row_count > 0 +ORDER BY STATS_DATE(i.[object_id], i.index_id) DESC OPTION (RECOMPILE); +------ + +-- Helps discover possible problems with out-of-date statistics +-- Also gives you an idea which indexes are the most active + +-- sys.stats (Transact-SQL) +-- https://bit.ly/2GyAxrn + +-- UPDATEs to Statistics (Erin Stellato) +-- https://bit.ly/2vhrYQy + + + + +-- Look at most frequently modified indexes and statistics (Query 73) (Volatile Indexes) +SELECT o.[name] AS [Object Name], o.[object_id], o.[type_desc], s.[name] AS [Statistics Name], + s.stats_id, s.no_recompute, s.auto_created, s.is_incremental, s.is_temporary, + sp.modification_counter, sp.[rows], sp.rows_sampled, sp.last_updated +FROM sys.objects AS o WITH (NOLOCK) +INNER JOIN sys.stats AS s WITH (NOLOCK) +ON s.object_id = o.object_id +CROSS APPLY sys.dm_db_stats_properties(s.object_id, s.stats_id) AS sp +WHERE o.[type_desc] NOT IN (N'SYSTEM_TABLE', N'INTERNAL_TABLE') +AND sp.modification_counter > 0 +ORDER BY sp.modification_counter DESC, o.name OPTION (RECOMPILE); +------ + +-- This helps you understand your workload and make better decisions about +-- things like data compression and adding new indexes to a table + + + +-- Get fragmentation info for all indexes above a certain size in the current database (Query 74) (Index Fragmentation) +-- Note: This query could take some time on a very large database +SELECT DB_NAME(ps.database_id) AS [Database Name], SCHEMA_NAME(o.[schema_id]) AS [Schema Name], +OBJECT_NAME(ps.OBJECT_ID) AS [Object Name], i.[name] AS [Index Name], ps.index_id, +ps.index_type_desc, ps.avg_fragmentation_in_percent, +ps.fragment_count, ps.page_count, i.fill_factor, i.has_filter, +i.filter_definition, i.[allow_page_locks] +FROM sys.dm_db_index_physical_stats(DB_ID(),NULL, NULL, NULL , N'LIMITED') AS ps +INNER JOIN sys.indexes AS i WITH (NOLOCK) +ON ps.[object_id] = i.[object_id] +AND ps.index_id = i.index_id +INNER JOIN sys.objects AS o WITH (NOLOCK) +ON i.[object_id] = o.[object_id] +WHERE ps.database_id = DB_ID() +AND ps.page_count > 2500 +ORDER BY ps.avg_fragmentation_in_percent DESC OPTION (RECOMPILE); +------ + +-- Helps determine whether you have framentation in your relational indexes +-- and how effective your index maintenance strategy is + + +--- Index Read/Write stats (all tables in current DB) ordered by Reads (Query 75) (Overall Index Usage - Reads) +SELECT OBJECT_NAME(i.[object_id]) AS [ObjectName], i.[name] AS [IndexName], i.index_id, + s.user_seeks, s.user_scans, s.user_lookups, + s.user_seeks + s.user_scans + s.user_lookups AS [Total Reads], + s.user_updates AS [Writes], + i.[type_desc] AS [Index Type], i.fill_factor AS [Fill Factor], i.has_filter, i.filter_definition, + s.last_user_scan, s.last_user_lookup, s.last_user_seek +FROM sys.indexes AS i WITH (NOLOCK) +LEFT OUTER JOIN sys.dm_db_index_usage_stats AS s WITH (NOLOCK) +ON i.[object_id] = s.[object_id] +AND i.index_id = s.index_id +AND s.database_id = DB_ID() +WHERE OBJECTPROPERTY(i.[object_id],'IsUserTable') = 1 +ORDER BY s.user_seeks + s.user_scans + s.user_lookups DESC OPTION (RECOMPILE); -- Order by reads +------ + +-- Show which indexes in the current database are most active for Reads + + +--- Index Read/Write stats (all tables in current DB) ordered by Writes (Query 76) (Overall Index Usage - Writes) +SELECT OBJECT_NAME(i.[object_id]) AS [ObjectName], i.[name] AS [IndexName], i.index_id, + s.user_updates AS [Writes], s.user_seeks + s.user_scans + s.user_lookups AS [Total Reads], + i.[type_desc] AS [Index Type], i.fill_factor AS [Fill Factor], i.has_filter, i.filter_definition, + s.last_system_update, s.last_user_update +FROM sys.indexes AS i WITH (NOLOCK) +LEFT OUTER JOIN sys.dm_db_index_usage_stats AS s WITH (NOLOCK) +ON i.[object_id] = s.[object_id] +AND i.index_id = s.index_id +AND s.database_id = DB_ID() +WHERE OBJECTPROPERTY(i.[object_id],'IsUserTable') = 1 +ORDER BY s.user_updates DESC OPTION (RECOMPILE); -- Order by writes +------ + +-- Show which indexes in the current database are most active for Writes + + +-- Get in-memory OLTP index usage (Query 77) (XTP Index Usage) +SELECT OBJECT_NAME(i.[object_id]) AS [Object Name], i.index_id, i.[name] AS [Index Name], + i.[type_desc], xis.scans_started, xis.scans_retries, + xis.rows_touched, xis.rows_returned +FROM sys.dm_db_xtp_index_stats AS xis WITH (NOLOCK) +INNER JOIN sys.indexes AS i WITH (NOLOCK) +ON i.[object_id] = xis.[object_id] +AND i.index_id = xis.index_id +ORDER BY OBJECT_NAME(i.[object_id]) OPTION (RECOMPILE); +------ + +-- This gives you some index usage statistics for in-memory OLTP +-- Returns no data if you are not using in-memory OLTP + +-- Guidelines for Using Indexes on Memory-Optimized Tables +-- https://bit.ly/2GCP8lF + + + +-- Look at Columnstore index physical statistics (Query 78) (Columnstore Index Physical Stat) +SELECT OBJECT_NAME(ps.object_id) AS [TableName], + i.[name] AS [IndexName], ps.index_id, ps.partition_number, + ps.delta_store_hobt_id, ps.state_desc, ps.total_rows, ps.size_in_bytes, + ps.trim_reason_desc, ps.generation, ps.transition_to_compressed_state_desc, + ps.has_vertipaq_optimization, ps.deleted_rows, + 100 * (ISNULL(ps.deleted_rows, 0))/ps.total_rows AS [Fragmentation] +FROM sys.dm_db_column_store_row_group_physical_stats AS ps WITH (NOLOCK) +INNER JOIN sys.indexes AS i WITH (NOLOCK) +ON ps.object_id = i.object_id +AND ps.index_id = i.index_id +ORDER BY ps.object_id, ps.partition_number, ps.row_group_id OPTION (RECOMPILE); +------ + +-- sys.dm_db_column_store_row_group_physical_stats (Transact-SQL) +-- https://bit.ly/2q276XQ + + + +-- Get lock waits for current database (Query 79) (Lock Waits) +SELECT o.name AS [table_name], i.name AS [index_name], ios.index_id, ios.partition_number, + SUM(ios.row_lock_wait_count) AS [total_row_lock_waits], + SUM(ios.row_lock_wait_in_ms) AS [total_row_lock_wait_in_ms], + SUM(ios.page_lock_wait_count) AS [total_page_lock_waits], + SUM(ios.page_lock_wait_in_ms) AS [total_page_lock_wait_in_ms], + SUM(ios.page_lock_wait_in_ms)+ SUM(row_lock_wait_in_ms) AS [total_lock_wait_in_ms] +FROM sys.dm_db_index_operational_stats(DB_ID(), NULL, NULL, NULL) AS ios +INNER JOIN sys.objects AS o WITH (NOLOCK) +ON ios.[object_id] = o.[object_id] +INNER JOIN sys.indexes AS i WITH (NOLOCK) +ON ios.[object_id] = i.[object_id] +AND ios.index_id = i.index_id +WHERE o.[object_id] > 100 +GROUP BY o.name, i.name, ios.index_id, ios.partition_number +HAVING SUM(ios.page_lock_wait_in_ms)+ SUM(row_lock_wait_in_ms) > 0 +ORDER BY total_lock_wait_in_ms DESC OPTION (RECOMPILE); +------ + +-- This query is helpful for troubleshooting blocking and deadlocking issues + + + +-- Look at UDF execution statistics (Query 80) (UDF Statistics) +SELECT OBJECT_NAME(object_id) AS [Function Name], execution_count, + total_worker_time, total_logical_reads, total_physical_reads, total_elapsed_time, + total_elapsed_time/execution_count AS [avg_elapsed_time], + FORMAT(cached_time, 'yyyy-MM-dd HH:mm:ss', 'en-US') AS [Plan Cached Time] +FROM sys.dm_exec_function_stats WITH (NOLOCK) +WHERE database_id = DB_ID() +ORDER BY total_worker_time DESC OPTION (RECOMPILE); +------ + +-- New for SQL Server 2016 +-- Helps you investigate scalar UDF performance issues +-- Does not return information for table valued functions + +-- sys.dm_exec_function_stats (Transact-SQL) +-- https://bit.ly/2q1Q6BM + + +-- Determine which scalar UDFs are in-lineable (Query 81) (Inlineable UDFs) +SELECT OBJECT_NAME(m.object_id) AS [Function Name], is_inlineable, inline_type +FROM sys.sql_modules AS m WITH (NOLOCK) +LEFT OUTER JOIN sys.dm_exec_function_stats AS efs WITH (NOLOCK) +ON m.object_id = efs.object_id +WHERE efs.type_desc = N'SQL_SCALAR_FUNCTION' +OPTION (RECOMPILE); +------ + +-- Scalar UDF Inlining +-- https://bit.ly/2JU971M + +-- sys.sql_modules (Transact-SQL) +-- https://bit.ly/2Qt216S + + +-- Get QueryStore Options for this database (Query 82) (QueryStore Options) +SELECT actual_state_desc, desired_state_desc, [interval_length_minutes], + current_storage_size_mb, [max_storage_size_mb], + query_capture_mode_desc, size_based_cleanup_mode_desc +FROM sys.database_query_store_options WITH (NOLOCK) OPTION (RECOMPILE); +------ + +-- New for SQL Server 2016 +-- Requires that Query Store is enabled for this database + +-- Make sure that the actual_state_desc is the same as desired_state_desc +-- Make sure that the current_storage_size_mb is less than the max_storage_size_mb + +-- Tuning Workload Performance with Query Store +-- https://bit.ly/1kHSl7w + + + +-- Get input buffer information for the current database (Query 83) (Input Buffer) +SELECT es.session_id, DB_NAME(es.database_id) AS [Database Name], + es.login_time, es.cpu_time, es.logical_reads, es.memory_usage, + es.[status], ib.event_info AS [Input Buffer] +FROM sys.dm_exec_sessions AS es WITH (NOLOCK) +CROSS APPLY sys.dm_exec_input_buffer(es.session_id, NULL) AS ib +WHERE es.database_id = DB_ID() +AND es.session_id > 50 +AND es.session_id <> @@SPID OPTION (RECOMPILE); +------ + +-- Gives you input buffer information from all non-system sessions for the current database +-- Replaces DBCC INPUTBUFFER + +-- New DMF for retrieving input buffer in SQL Server +-- https://bit.ly/2uHKMbz + +-- sys.dm_exec_input_buffer (Transact-SQL) +-- https://bit.ly/2J5Hf9q + + + +-- Get any resumable index rebuild operation information (Query 84) (Resumable Index Rebuild) +SELECT OBJECT_NAME(iro.object_id) AS [Object Name], iro.index_id, iro.name AS [Index Name], + iro.sql_text, iro.last_max_dop_used, iro.partition_number, iro.state_desc, iro.start_time, iro.percent_complete +FROM sys.index_resumable_operations AS iro WITH (NOLOCK) +OPTION (RECOMPILE); +------ + +-- index_resumable_operations (Transact-SQL) +-- https://bit.ly/2pYSWqq + + +-- Get database automatic tuning options (Query 85) (Automatic Tuning Options) +SELECT [name], desired_state_desc, actual_state_desc, reason_desc +FROM sys.database_automatic_tuning_options WITH (NOLOCK) +OPTION (RECOMPILE); +------ + +-- sys.database_automatic_tuning_options (Transact-SQL) +-- https://bit.ly/2FHhLkL + + + +-- Look at recent Full backups for the current database (Query 86) (Recent Full Backups) +SELECT TOP (30) bs.machine_name, bs.server_name, bs.database_name AS [Database Name], bs.recovery_model, +CONVERT (BIGINT, bs.backup_size / 1048576 ) AS [Uncompressed Backup Size (MB)], +CONVERT (BIGINT, bs.compressed_backup_size / 1048576 ) AS [Compressed Backup Size (MB)], +CONVERT (NUMERIC (20,2), (CONVERT (FLOAT, bs.backup_size) / +CONVERT (FLOAT, bs.compressed_backup_size))) AS [Compression Ratio], bs.has_backup_checksums, bs.is_copy_only, bs.encryptor_type, +DATEDIFF (SECOND, bs.backup_start_date, bs.backup_finish_date) AS [Backup Elapsed Time (sec)], +bs.backup_finish_date AS [Backup Finish Date], bmf.physical_device_name AS [Backup Location], bmf.physical_block_size +FROM msdb.dbo.backupset AS bs WITH (NOLOCK) +INNER JOIN msdb.dbo.backupmediafamily AS bmf WITH (NOLOCK) +ON bs.media_set_id = bmf.media_set_id +WHERE bs.database_name = DB_NAME(DB_ID()) +AND bs.[type] = 'D' -- Change to L if you want Log backups +ORDER BY bs.backup_finish_date DESC OPTION (RECOMPILE); +------ + +-- Are your backup sizes and times changing over time? +-- Are you using backup compression? +-- Are you using backup checksums? +-- Are you doing copy_only backups? +-- Are you doing encrypted backups? +-- Have you done any backup tuning with striped backups, or changing the parameters of the backup command? + +-- In SQL Server 2016, native SQL Server backup compression actually works +-- much better with databases that are using TDE than in previous versions +-- https://bit.ly/28Rpb2x + + +-- These five Pluralsight Courses go into more detail about how to run these queries and interpret the results + +-- SQL Server 2017: Diagnosing Performance Issues with DMVs +-- https://bit.ly/2FqCeti + +-- SQL Server 2017: Diagnosing Configuration Issues with DMVs +-- https://bit.ly/2MSUDUL + +-- SQL Server 2014 DMV Diagnostic Queries – Part 1 +-- https://bit.ly/2plxCer + +-- SQL Server 2014 DMV Diagnostic Queries – Part 2 +-- https://bit.ly/2IuJpzI + +-- SQL Server 2014 DMV Diagnostic Queries – Part 3 +-- https://bit.ly/2FIlCPb + + + +-- Sign up for Microsoft Visual Studio Dev Essentials and get a free three month pass to Pluralsight + +-- Microsoft Visual Studio Dev Essentials +-- http://bit.ly/1q6xbDL + + +-- Sign up for Microsoft Azure Essentials and get lots of free Azure usage credits, MCP exam voucher, three month Pluralsight subscription + +-- Microsoft Azure Essentials +-- https://bit.ly/2JMWe8x + + +-- August 2017 blog series about upgrading and migrating to SQL Server 2016/2017 +-- https://bit.ly/2ftKVrX diff --git a/bin/diagnosticquery/SQLServerDiagnosticQueries_AzureSQLDatabase_201810.sql b/bin/diagnosticquery/SQLServerDiagnosticQueries_AzureSQLDatabase_201901.sql similarity index 96% rename from bin/diagnosticquery/SQLServerDiagnosticQueries_AzureSQLDatabase_201810.sql rename to bin/diagnosticquery/SQLServerDiagnosticQueries_AzureSQLDatabase_201901.sql index 8a4179c8ba..484d90e093 100644 --- a/bin/diagnosticquery/SQLServerDiagnosticQueries_AzureSQLDatabase_201810.sql +++ b/bin/diagnosticquery/SQLServerDiagnosticQueries_AzureSQLDatabase_201901.sql @@ -1,7 +1,7 @@ -- Azure SQL Database Diagnostic Information Queries -- Glenn Berry --- Last Modified: October 16, 2018 +-- Last Modified: February 1, 2019 -- https://www.sqlskills.com/blogs/glenn/ -- http://sqlserverperformance.wordpress.com/ -- Twitter: GlennAlanBerry @@ -14,7 +14,7 @@ --****************************************************************************** ---* Copyright (C) 2018 Glenn Berry, SQLskills.com +--* Copyright (C) 2019 Glenn Berry, SQLskills.com --* All rights reserved. --* --* For more scripts and sample code, check out @@ -40,11 +40,11 @@ SELECT @@SERVERNAME AS [Server Name], @@VERSION AS [SQL Server and OS Version Info]; ------ --- Azure SQL Database does not expose as much information as on-premise SQL Server does +-- Azure SQL Database does not expose as much information as on-premises SQL Server does --- Get instance-level configuration values for instance (Query 2) (Configuration Values) +-- Get logical instance-level configuration values for instance (Query 2) (Configuration Values) SELECT name, value, value_in_use, minimum, maximum, [description], is_dynamic, is_advanced FROM sys.configurations WITH (NOLOCK) ORDER BY name OPTION (RECOMPILE); @@ -67,9 +67,9 @@ WHERE node_state_desc <> N'ONLINE DAC' OPTION (RECOMPILE); -- Calculates average stalls per read, per write, and per total input/output for each database file (Query 4) (IO Stalls by File) -SELECT DB_NAME(fs.database_id) AS [Database Name], CAST(fs.io_stall_read_ms/(1.0 + fs.num_of_reads) AS NUMERIC(10,1)) AS [avg_read_stall_ms], -CAST(fs.io_stall_write_ms/(1.0 + fs.num_of_writes) AS NUMERIC(10,1)) AS [avg_write_stall_ms], -CAST((fs.io_stall_read_ms + fs.io_stall_write_ms)/(1.0 + fs.num_of_reads + fs.num_of_writes) AS NUMERIC(10,1)) AS [avg_io_stall_ms], +SELECT DB_NAME(fs.database_id) AS [Database Name], CAST(fs.io_stall_read_ms/(1.0 + fs.num_of_reads) AS NUMERIC(16,1)) AS [avg_read_stall_ms], +CAST(fs.io_stall_write_ms/(1.0 + fs.num_of_writes) AS NUMERIC(16,1)) AS [avg_write_stall_ms], +CAST((fs.io_stall_read_ms + fs.io_stall_write_ms)/(1.0 + fs.num_of_reads + fs.num_of_writes) AS NUMERIC(16,1)) AS [avg_io_stall_ms], fs.io_stall_read_ms, fs.num_of_reads, fs.io_stall_write_ms, fs.num_of_writes, fs.io_stall_read_ms + fs.io_stall_write_ms AS [io_stalls], fs.num_of_reads + fs.num_of_writes AS [total_io], io_stall_queued_read_ms AS [Resource Governor Total Read IO Latency (ms)], io_stall_queued_write_ms AS [Resource Governor Total Write IO Latency (ms)] @@ -865,24 +865,24 @@ ORDER BY [BufferCount] DESC OPTION (RECOMPILE); -- Get Table names, row counts, and compression status for clustered index or heap (Query 40) (Table Sizes) -SELECT OBJECT_NAME(object_id) AS [ObjectName], -SUM(Rows) AS [RowCount], data_compression_desc AS [CompressionType] -FROM sys.partitions WITH (NOLOCK) +SELECT SCHEMA_NAME(o.Schema_ID) AS [Schema Name], OBJECT_NAME(p.object_id) AS [ObjectName], +SUM(p.Rows) AS [RowCount], data_compression_desc AS [CompressionType] +FROM sys.partitions AS p WITH (NOLOCK) +INNER JOIN sys.objects AS o WITH (NOLOCK) +ON p.object_id = o.object_id WHERE index_id < 2 --ignore the partitions from the non-clustered index if any -AND OBJECT_NAME(object_id) NOT LIKE N'sys%' -AND OBJECT_NAME(object_id) NOT LIKE N'queue_%' -AND OBJECT_NAME(object_id) NOT LIKE N'filestream_tombstone%' -AND OBJECT_NAME(object_id) NOT LIKE N'fulltext%' -AND OBJECT_NAME(object_id) NOT LIKE N'ifts_comp_fragment%' -AND OBJECT_NAME(object_id) NOT LIKE N'filetable_updates%' -AND OBJECT_NAME(object_id) NOT LIKE N'xml_index_nodes%' -AND OBJECT_NAME(object_id) NOT LIKE N'sqlagent_job%' -AND OBJECT_NAME(object_id) NOT LIKE N'plan_persist%' -AND OBJECT_NAME(object_id) NOT LIKE N'persistent_version%' -AND OBJECT_NAME(object_id) NOT LIKE N'database_firewall%' -AND OBJECT_NAME(object_id) NOT LIKE N'wpr_bucket%' -GROUP BY object_id, data_compression_desc -ORDER BY SUM(Rows) DESC OPTION (RECOMPILE); +AND OBJECT_NAME(p.object_id) NOT LIKE N'sys%' +AND OBJECT_NAME(p.object_id) NOT LIKE N'spt_%' +AND OBJECT_NAME(p.object_id) NOT LIKE N'queue_%' +AND OBJECT_NAME(p.object_id) NOT LIKE N'filestream_tombstone%' +AND OBJECT_NAME(p.object_id) NOT LIKE N'fulltext%' +AND OBJECT_NAME(p.object_id) NOT LIKE N'ifts_comp_fragment%' +AND OBJECT_NAME(p.object_id) NOT LIKE N'filetable_updates%' +AND OBJECT_NAME(p.object_id) NOT LIKE N'xml_index_nodes%' +AND OBJECT_NAME(p.object_id) NOT LIKE N'sqlagent_job%' +AND OBJECT_NAME(p.object_id) NOT LIKE N'plan_persist%' +GROUP BY SCHEMA_NAME(o.Schema_ID), p.object_id, data_compression_desc +ORDER BY SUM(p.Rows) DESC OPTION (RECOMPILE); ------ -- Gives you an idea of table sizes, and possible data compression opportunities @@ -1216,6 +1216,22 @@ SELECT DATABASEPROPERTYEX (DB_NAME(DB_ID()), 'Edition') AS [Database Edition], -- https://bit.ly/2ItexPg +-- These five Pluralsight Courses go into more detail about how to run these queries and interpret the results + +-- SQL Server 2017: Diagnosing Performance Issues with DMVs +-- https://bit.ly/2FqCeti + +-- SQL Server 2017: Diagnosing Configuration Issues with DMVs +-- https://bit.ly/2MSUDUL + +-- SQL Server 2014 DMV Diagnostic Queries – Part 1 +-- https://bit.ly/2plxCer + +-- SQL Server 2014 DMV Diagnostic Queries – Part 2 +-- https://bit.ly/2IuJpzI + +-- SQL Server 2014 DMV Diagnostic Queries – Part 3 +-- https://bit.ly/2FIlCPb diff --git a/bin/library.ps1 b/bin/library.ps1 index 6b6c90b8eb..422b37b2d5 100644 --- a/bin/library.ps1 +++ b/bin/library.ps1 @@ -48,9 +48,9 @@ if (([System.Management.Automation.PSTypeName]'Sqlcollaborative.Dbatools.Configu $libraryBase = (Resolve-Path -Path ($ExecutionContext.SessionState.Module.ModuleBase + "\bin")) if ($PSVersionTable.PSVersion.Major -ge 6) { - $dll = (Resolve-Path -Path "$libraryBase\netcoreapp2.1\dbatools.dll" -ErrorAction Ignore) + $dll = (Resolve-Path -Path "$libraryBase\netcoreapp2.1\dbatools.dll" -ErrorAction Ignore).ProviderPath } else { - $dll = (Resolve-Path -Path "$libraryBase\net452\dbatools.dll" -ErrorAction Ignore) + $dll = (Resolve-Path -Path "$libraryBase\net452\dbatools.dll" -ErrorAction Ignore).ProviderPath } if ($ImportLibrary) { @@ -61,41 +61,36 @@ if ($ImportLibrary) { if (Test-Path -Path $dll) { Add-Type -Path $dll -ErrorAction Stop } else { - throw "Library not found, terminating!" + throw "Library not found, terminating" } } # Else we prioritize user convenience -else { + else { try { - $sln = (Resolve-Path -Path "$libraryBase\projects\dbatools\dbatools.sln" -ErrorAction Stop) - $hasProject = Test-Path -Path $sln -ErrorAction Stop + if ((Test-Path -Path "$libraryBase/projects/dbatools/dbatools.sln")) { + $sln = (Resolve-Path -Path "$libraryBase\projects\dbatools\dbatools.sln" -ErrorAction Stop) + $hasProject = Test-Path -Path $sln -ErrorAction Stop + } } catch { $null = 1 } - + if (-not $dll) { $hasCompiledDll = $false } else { $hasCompiledDll = Test-Path -Path $dll -ErrorAction Stop } - - $reslibdll = Resolve-Path -Path "$libraryBase\dbatools.dll" - - if ((-not $script:alwaysBuildLibrary) -and $hasCompiledDll -and ([System.Diagnostics.FileVersionInfo]::GetVersionInfo($reslibdll).FileVersion -eq $currentLibraryVersion)) { + + if ((-not $script:alwaysBuildLibrary) -and $hasCompiledDll -and ([System.Diagnostics.FileVersionInfo]::GetVersionInfo($dll).FileVersion -eq $currentLibraryVersion)) { $start = Get-Date - + try { - $libraryBase = Resolve-Path -Path "$libraryBase\" - $script:DllRoot = Resolve-Path -Path $script:DllRoot Write-Verbose -Message "Found library, trying to copy & import" - # this looks excessive but for some reason the explicit string to string is required - if (("$($dll)" -ne "$(Join-Path -Path $script:DllRoot -ChildPath dbatools.dll)") -and $script:isWindows) { - Copy-Item -Path $dll -Destination $script:DllRoot -Force -ErrorAction Stop - } - Add-Type -Path (Resolve-Path -Path "$script:DllRoot\dbatools.dll") -ErrorAction Stop + Add-Type -Path (Resolve-Path -Path "$dll") -ErrorAction Stop } catch { Write-Verbose -Message "Failed to copy and import, attempting to import straight from the module directory" - Add-Type -Path $dll -ErrorAction Stop + $script:DllRoot = Resolve-Path -Path $script:DllRoot + Add-Type -Path "$(Join-Path -Path $script:DllRoot -ChildPath dbatools.dll)" -ErrorAction Stop } Write-Verbose -Message "Total duration: $((Get-Date) - $start)" } elseif ($hasProject) { @@ -104,7 +99,7 @@ else { throw "No valid dbatools library found! Check your module integrity" } } - + #region PowerShell TypeData Update-TypeData -TypeName "Sqlcollaborative.Dbatools.dbaSystem.DbatoolsException" -SerializationDepth 2 -ErrorAction Ignore Update-TypeData -TypeName "Sqlcollaborative.Dbatools.dbaSystem.DbatoolsExceptionRecord" -SerializationDepth 2 -ErrorAction Ignore diff --git a/bin/net452/dbatools.dll b/bin/net452/dbatools.dll index 7a75047eb5e3ecacc54e02bbf7c3c03e33978c3a..2b56f24d4ffdc6ac96a86a737ab8fce6e400ae7c 100644 GIT binary patch delta 4744 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 delta 4759 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 diff --git a/bin/net452/dbatools.pdb b/bin/net452/dbatools.pdb index 597061159f003e207b92549ad9416c37f1b308d3..f742938ffdfa6f27a6e9badfc75c64492088779f 100644 GIT binary patch delta 206 zcmZqpBi`^we1nIY$l7)1-rL>U&z|d=%(&peeTk^;E}u3!E@51@jU{eVn}`8R>Hjry z%@W(%CAKkcm)OR{q%1j;fs+A*>!A2D6DI=*FK9Qu$+X@0Ci86-PJzBghL+4G2Da_u z|CkN8;k0JkHWraIupQeaWLUphBWsLceOoKRdevbkBLf4&yR6yP*52`syN{mi&Um(A S^LCj!mKT!SSw67-;ROJqyHLdd delta 206 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 R?J{*NFC@3Kd|>^<3ji9POEdrg diff --git a/bin/projects/dbatools/dbatools/Utility/RegexHelper.cs b/bin/projects/dbatools/dbatools/Utility/RegexHelper.cs index e9c0a8ff71..614b009b35 100644 --- a/bin/projects/dbatools/dbatools/Utility/RegexHelper.cs +++ b/bin/projects/dbatools/dbatools/Utility/RegexHelper.cs @@ -8,12 +8,12 @@ public static class RegexHelper /// /// Pattern that checks for a valid hostname /// - public static string HostName = @"^([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-_]{0,61}[a-zA-Z0-9])(\.([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-_]{0,61}[a-zA-Z0-9]))*$"; + public static string HostName = @"^([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-_]{0,62})(\.([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-_]{0,61}[a-zA-Z0-9]))*$"; /// /// Pattern that checks for valid hostnames within a larger text /// - public static string HostNameEx = @"([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-_]{0,61}[a-zA-Z0-9])(\.([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-_]{0,61}[a-zA-Z0-9]))*"; + public static string HostNameEx = @"([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-_]{0,62})(\.([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-_]{0,61}[a-zA-Z0-9]))*"; /// /// Pattern that checks for a valid IPv4 address @@ -38,7 +38,7 @@ public static class RegexHelper /// /// Will match any string that in its entirety represents a valid target for dns- or ip-based targeting. Combination of HostName, IPv4 and IPv6 /// - public static string ComputerTarget = @"^([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-_]{0,61}[a-zA-Z0-9])(\.([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-_]{0,61}[a-zA-Z0-9]))*$|^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$|^(?:^|(?<=\s))(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))(?=\s|$)$"; + public static string ComputerTarget = @"^([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-_]{0,62})(\.([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-_]{0,61}[a-zA-Z0-9]))*$|^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$|^(?:^|(?<=\s))(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))(?=\s|$)$"; /// /// Will match a valid Guid diff --git a/bin/smo/Microsoft.Build.Framework.dll b/bin/smo/Microsoft.Build.Framework.dll new file mode 100644 index 0000000000000000000000000000000000000000..bb1fa678720792a3ff5089e44bba764a402c632f GIT binary patch literal 120368 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 }`u$BF&O* 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 ^q56!MxX=A2s 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 Qvv^u-`Ik(0a3_KR01D*gE&u=k literal 0 HcmV?d00001 diff --git a/bin/smo/Microsoft.Data.Tools.Contracts.dll b/bin/smo/Microsoft.Data.Tools.Contracts.dll deleted file mode 100644 index 1dcdcb2fa3c4f34d5fb13c41c4d0324b94b15706..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 101088 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≫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 - - - - - - - - $(VsInstallRoot)\Common7\IDE - - - $(Registry:HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\14.0@InstallDir) - $(Registry:HKEY_LOCAL_MACHINE\Software\Microsoft\WDExpress\14.0@InstallDir) - $(Registry:HKEY_LOCAL_MACHINE\Software\Microsoft\VWDExpress\14.0@InstallDir) - $(Registry:HKEY_LOCAL_MACHINE\Software\Wow6432Node\Microsoft\VisualStudio\14.0@InstallDir) - $(Registry:HKEY_LOCAL_MACHINE\Software\Wow6432Node\Microsoft\WDExpress\14.0@InstallDir) - $(Registry:HKEY_LOCAL_MACHINE\Software\Wow6432Node\Microsoft\VWDExpress\14.0@InstallDir) - - - $(Registry:HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\12.0@InstallDir) - $(Registry:HKEY_LOCAL_MACHINE\Software\Microsoft\WDExpress\12.0@InstallDir) - $(Registry:HKEY_LOCAL_MACHINE\Software\Microsoft\VWDExpress\12.0@InstallDir) - $(Registry:HKEY_LOCAL_MACHINE\Software\Wow6432Node\Microsoft\VisualStudio\12.0@InstallDir) - $(Registry:HKEY_LOCAL_MACHINE\Software\Wow6432Node\Microsoft\WDExpress\12.0@InstallDir) - $(Registry:HKEY_LOCAL_MACHINE\Software\Wow6432Node\Microsoft\VWDExpress\12.0@InstallDir) - - - $(Registry:HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\11.0@InstallDir) - $(Registry:HKEY_LOCAL_MACHINE\Software\Microsoft\WDExpress\11.0@InstallDir) - $(Registry:HKEY_LOCAL_MACHINE\Software\Microsoft\VWDExpress\11.0@InstallDir) - $(Registry:HKEY_LOCAL_MACHINE\Software\Wow6432Node\Microsoft\VisualStudio\11.0@InstallDir) - $(Registry:HKEY_LOCAL_MACHINE\Software\Wow6432Node\Microsoft\WDExpress\11.0@InstallDir) - $(Registry:HKEY_LOCAL_MACHINE\Software\Wow6432Node\Microsoft\VWDExpress\11.0@InstallDir) - - - - $(Registry:HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\15.0@InstallDir) - $(Registry:HKEY_LOCAL_MACHINE\Software\Microsoft\WDExpress\15.0@InstallDir) - $(Registry:HKEY_LOCAL_MACHINE\Software\Microsoft\VWDExpress\15.0@InstallDir) - $(Registry:HKEY_LOCAL_MACHINE\Software\Wow6432Node\Microsoft\VisualStudio\15.0@InstallDir) - $(Registry:HKEY_LOCAL_MACHINE\Software\Wow6432Node\Microsoft\WDExpress\15.0@InstallDir) - $(Registry:HKEY_LOCAL_MACHINE\Software\Wow6432Node\Microsoft\VWDExpress\15.0@InstallDir) - $(Registry:HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\14.0@InstallDir) - $(Registry:HKEY_LOCAL_MACHINE\Software\Microsoft\WDExpress\14.0@InstallDir) - $(Registry:HKEY_LOCAL_MACHINE\Software\Microsoft\VWDExpress\14.0@InstallDir) - $(Registry:HKEY_LOCAL_MACHINE\Software\Wow6432Node\Microsoft\VisualStudio\14.0@InstallDir) - $(Registry:HKEY_LOCAL_MACHINE\Software\Wow6432Node\Microsoft\WDExpress\14.0@InstallDir) - $(Registry:HKEY_LOCAL_MACHINE\Software\Wow6432Node\Microsoft\VWDExpress\14.0@InstallDir) - $(Registry:HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\12.0@InstallDir) - $(Registry:HKEY_LOCAL_MACHINE\Software\Microsoft\WDExpress\12.0@InstallDir) - $(Registry:HKEY_LOCAL_MACHINE\Software\Microsoft\VWDExpress\12.0@InstallDir) - $(Registry:HKEY_LOCAL_MACHINE\Software\Wow6432Node\Microsoft\VisualStudio\12.0@InstallDir) - $(Registry:HKEY_LOCAL_MACHINE\Software\Wow6432Node\Microsoft\WDExpress\12.0@InstallDir) - $(Registry:HKEY_LOCAL_MACHINE\Software\Wow6432Node\Microsoft\VWDExpress\12.0@InstallDir) - $(Registry:HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\11.0@InstallDir) - $(Registry:HKEY_LOCAL_MACHINE\Software\Microsoft\WDExpress\11.0@InstallDir) - $(Registry:HKEY_LOCAL_MACHINE\Software\Microsoft\VWDExpress\11.0@InstallDir) - $(Registry:HKEY_LOCAL_MACHINE\Software\Wow6432Node\Microsoft\VisualStudio\11.0@InstallDir) - $(Registry:HKEY_LOCAL_MACHINE\Software\Wow6432Node\Microsoft\WDExpress\11.0@InstallDir) - $(Registry:HKEY_LOCAL_MACHINE\Software\Wow6432Node\Microsoft\VWDExpress\11.0@InstallDir) - - - - - $(ReferencePath);$(SSDTPath) - $(VsIdePath) - $(SSDTPath) - $(VsIdePath)\Extensions\Microsoft\SQLDB\Dac\140 - - - - - - - - - - - - - - - - - - - - .\bin\Output\ - - - - - false - Library - .dll - CS - TRACE;$(DefineConstants) - TRACE - DEBUG;$(DefineConstants) - DEBUG - - - - - - - - $(MSBuildExtensionsPath)\Microsoft\VisualStudio\v$(VisualStudioVersion)\SSDT - - - - - $(BuildContributors); - $(DeploymentContributors); - - - - - ConfigurationName=$(ConfigurationName);$(ContributorArguments) - - - - - - - - - $(MSBuildAllProjects); - $(SsdtTargetsParentPath)\Microsoft.Data.Tools.Schema.SqlTasks.targets - - - - - - true - true - true - true - true - dbo - true - false - - - - - - $(MSBuildProjectName) - $(SqlTargetName).dacpac - $(MSBuildProjectName) - $(SqlTargetName).sql - $(MSBuildProjectName).publish.sql - - - $(BaseIntermediateOutputPath)\_autogenerated_sqldb$(DefaultLanguageSourceExtension) - $(SqlTargetName)_Create.sql - - - $(IntermediateOutputPath) - $(ProjectDir)$(IntermediateOutputPath) - - $(GeneratedFilesIntermediatePath)$(TargetFileName) - - - $(GeneratedFilesIntermediatePath)$(TargetName).pdb - - $(TargetDir)$(CreateScriptFileName) - $(TargetDir)$(DacTargetFileName) - $(TargetDir)$(DeployScriptFileName) - $(TargetDir)$(PublishScriptFileName) - $(TargetDir)$(SqlTargetFile) - - - - - - - - - - $(SqlTargetName) - 1.0.0.0 - .2.0 - .dacpac - $(SqlTargetName)$(DacDownlevelVersion)$(DacTargetExtension) - - - - - - - - - - - - - - Build; - Deploy - - - - - - - - - - - - - - - - - - - - - - - - false - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - true - - true - - $([System.IO.Path]::Combine('$([System.IO.Path]::GetTempPath())','$(TargetFrameworkMoniker).SqlClrAttributes$(DefaultLanguageSourceExtension)')) - - - - - - - - - - - // <autogenerated /> - - - - - - ''autogenerated - Option Strict Off - Option Explicit On - - - - - - - - - - - - - - - - - $(GetCopyToOutputDirectoryItemsDependsOn); - SqlStudioSourceFilesToCopy - - - - - - - <_BuildItemsToCopy Include="@(Build)" Condition="'%(Build.CopyToOutputDirectory)'=='Always' or '%(Build.CopyToOutputDirectory)'=='PreserveNewest'"/> - - - - - - - - <_NoneItemsToCopy Include="@(None)" Condition="'%(None.CopyToOutputDirectory)'=='Always' or '%(None.CopyToOutputDirectory)'=='PreserveNewest'"/> - - - - - - - - <_PreDeployItemsToCopy Include="@(PreDeploy)" Condition="'%(PreDeploy.CopyToOutputDirectory)'=='Always' or '%(PreDeploy.CopyToOutputDirectory)'=='PreserveNewest'"/> - - - - - - - - - - - - <_PostDeployItemsToCopy Include="@(PostDeploy)" Condition="'%(PostDeploy.CopyToOutputDirectory)'=='Always' or '%(PostDeploy.CopyToOutputDirectory)'=='PreserveNewest'"/> - - - - - - - - <_BuildExtensionConfigurationItemsToCopy Include="@(BuildExtensionConfiguration)" Condition="'%(BuildExtensionConfiguration.CopyToOutputDirectory)'=='Always' or '%(BuildExtensionConfiguration.CopyToOutputDirectory)'=='PreserveNewest'"/> - - - - - - - - <_DeploymentExtensionConfigurationItemsToCopy Include="@(DeploymentExtensionConfiguration)" Condition="'%(DeploymentExtensionConfiguration.CopyToOutputDirectory)'=='Always' or '%(DeploymentExtensionConfiguration.CopyToOutputDirectory)'=='PreserveNewest'"/> - - - - - - - - - <_SourceItemsToCopyToOutputDirectoryAlways Include="@(_SqlStudioItemsToCopyWithTargetPath->'%(FullPath)')" Condition="'%(_SqlStudioItemsToCopyWithTargetPath.CopyToOutputDirectory)'=='Always'" /> - <_SourceItemsToCopyToOutputDirectory Include="@(_SqlStudioItemsToCopyWithTargetPath->'%(FullPath)')" Condition="'%(_SqlStudioItemsToCopyWithTargetPath.CopyToOutputDirectory)'=='PreserveNewest'" /> - - - - - - - - - - - - - <__SqlBuildInputItem Include="@(MSBuildAllProjects)"/> - <__SqlBuildInputItem Include="@(Build)"/> - <__SqlBuildInputItem Include="@(MSBuildProjectFullPath)"/> - <__SqlBuildInputItem Include="@(SqlReferencePath)"/> - <__SqlBuildInputItem Include="$(MSBuildProjectFullPath).user" Condition="Exists('$(MSBuildProjectFullPath).user')"/> - <__SqlBuildInputItem Include="$(IntermediateTargetFullFileName)" Condition="Exists('$(IntermediateTargetFullFileName)')"/> - <__SqlBuildInputItem Include="$(IntermediateSymbolsFullFileName)" Condition="Exists('$(IntermediateSymbolsFullFileName)')"/> - <__SqlBuildInputItem Include="@(PostDeploy)"/> - <__SqlBuildInputItem Include="@(PreDeploy)"/> - <__SqlBuildInputItem Include="@(RefactorLog)"/> - <__SqlBuildInputItem Include="@(BuildExtensionConfiguration)"/> - <__SqlBuildInputItem Include="@(DeploymentExtensionConfiguration)"/> - - - - - - - - - - - - - - - - - - - - - - <_SqlBuildOutputItem Include="@(SqlTarget)"/> - <_SqlBuildOutputItem Include="@(DacFile)" Condition="$(GenerateDac) == true"/> - <_SqlBuildOutputItem Include="@(CreateScriptFilePath)" Condition="$(GenerateCreateScript) == true"/> - - - - - - - - - - - - _SetupSqlBuildInputs; - _SetupSqlBuildOutputs; - - - - - - - $(AutoUpdateStatisticsIncremental) - - - - - - - - - - - - - - - - - - - - - - - - BuildOnlySettings; - BeforeBuild; - PrepareForBuild; - PreBuildEvent; - ResolveReferences; - ResolveArtifactReferences; - GenerateSqlTargetFrameworkMoniker; - ResolveKeySource; - CoreCompile; - GenerateSerializationAssemblies; - SqlBuild; - GetTargetPath; - PrepareForRun; - SqlPrepareForRun; - IncrementalClean; - PostBuildEvent; - AfterBuild; - - - - - - - - - - - - - - - - - - - - - - $(BuiltProjectOutputGroupDependsOn); - _SetupSqlBuildOutputs - - - - - - <_BuiltSqlProjectOutputGroupOutputIntermediate Include="@(SqlBuildOutputItem)"/> - - - - - - - - - - $(SourceFilesProjectOutputGroupDependsOn); - _SetupSqlBuildInputs - - - - - - - - - - - - - - - - - - - - - - $(ProjectFileName) - - - - - - - - - BuiltProjectOutputGroup; - BuiltSqlProjectOutputGroup; - DebugSymbolsProjectOutputGroup; - DocumentationProjectOutputGroup; - SatelliteDllsProjectOutputGroup; - SourceFilesProjectOutputGroup; - ContentFilesProjectOutputGroup; - SGenFilesOutputGroup; - - - - - BuiltProjectOutputGroup; - BuiltSqlProjectOutputGroup; - - - ContentFilesProjectOutputGroup; - - - SatelliteDllsProjectOutputGroup; - - - DocumentationProjectOutputGroup; - - - DebugSymbolsProjectOutputGroup; - - - SourceFilesProjectOutputGroup; - - - SGenFilesOutputGroup; - - - - - - - - - - - - - - - $(AutoUpdateStatisticsIncremental) - - - - - - - - - $(TargetDir)$(SqlTargetName).StaticCodeAnalysis.Results.xml - $(TargetDir)$(SqlTargetName)_StaticCodeAnalysisSucceededFile - - _SetupSqlBuildInputs; - ResolveReferences; - ResolveArtifactReferences; - SqlStaticCodeAnalysis - - - - - - - - - $(PrepareForRunDependsOn); - SqlRunCodeAnalysis - - - - - - true - - - - - - - - - - - - - $(CleanDependsOn); - CleanStaticCodeAnalysis; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - _SetupSqlDeployInputs; - _SetupSqlDeployOutputs - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - BeforeDeploy; - PreDeployEvent; - SqlDeploy; - PostDeployEvent; - AfterDeploy - - - - - - - - - - - - - - - - - - - <__SqlPublishInputItem Include="@(SqlTarget)"/> - <__SqlPublishInputItem Include="$(SqlPublishProfilePath)" Condition="'$(SqlPublishProfilePath)' != ''"/> - - - - - - - - - - - - - - - - - - - - _SetupSqlPublishInputs; - _SetupSqlPublishOutputs - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - BeforePublish; - PrePublishEvent; - SqlPublish; - PostPublishEvent; - AfterPublish - - - - - - - - - - diff --git a/bin/smo/Microsoft.Data.Tools.Schema.Utilities.Sql.dll b/bin/smo/Microsoft.Data.Tools.Schema.Utilities.Sql.dll deleted file mode 100644 index e30ee8b76795becd81bf61ed85ce85692071ce27..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1586400 zcmbr{4V;wKdGP;XUiTFk26lmU-9-Y7`y%3oB5nv8LWm)R5G06{5QBsu!7;lMf}0f$ zrPLBaEwR*4YL!xIDWxf~#865NHPlc-ETzUG5K9fUlu$w_wG?@--#L5XUiW>H=l}UX zd>((hJKw$Ud#;&tW?!IBrrq;fiBuwyNXvg$uO<@Tmbd)5-SwB}QQ^J~-|3t9R{5b} z-|q9#L&NU++~Us02RllOI__QCxZvIg9wL=e2dB?$Tw1zs;Z4=m z74PXe^~WbC5+Ci8O8om%C+FzZew?_Wv9iz2iNt@@CK6@-)&a|F5{X86zi}`(^mp$k z{r%>KEaA_m#pU)dmj=sRpI*(U^8em_+w&ne$)CUZVohQ?@5p(-p5dLIKmS#m`0@MY z{o4m8s^rae@_E;({eOAecN6*NNVs2Ks-@X4d$}~51 zbapI|8{K_lb_V^a9MkL1?Q$<~>R9;sl6)ffmHW(NkobA*^F9Fg{_}I0i$C1AWFnKO zI-gB^dRS$m+})Z;e15=y#LWxRiQijRlX$e}wqN$<`egCeM53bU;bd{Vylowr?7U6h zj!2c-GoGAn(iP$ofhqZcel>Netw%Dcqb&ES0zN6y%c~@*F%^d@GyC zraBt*-E_w&eK*F7=eMHhB59x#M0qc;9Jm{`moQi%_Qjr~hSk90wO_L95-oKv- zGR2R{2O|eordrBVCD|wymCddP%A-9~hzHkA=qJBRZYs^uwi3hE8?UPD< z@$!6GONAs~UaFHL^O@Sa3z>W-pT6ZA<%Nn915RW|o=A;6k>DvSeo{W8DbI6u$9v`e z_58`nhdOuFfYWUAY}^MO=r_L13~GvyxSCRzP= z^PzmE+T;f*p%nswMUK;Eg4XDwB{NAAf(GFM$y^2^*> zmMh9f%@x^P+ey|C>o;`Vul};*WJ1|ESst8XEARYDl5HsKcpih--JDMJk*ml{Y(CX- zr#z8vPjr4tup(8OFK#QJ-G+D(!KJ2RjRD?8F^csERK*f`40-|@_f3cxIk_% z-X|IVJM#Gh3mJd4vH_XWLT-IjZp~*}zAOvvv+^+u?cEod(jvL3<GI?l{gu{53@pfNL9+BYjw;V*%S(%Suk1v9pY8k+OFm;6l3jJ@Wd;<6Fqc%)IdNAa|A|r3WRg>6+>jL*#Sh z`K)L?a-wfOEiZs+f9Gqe%bWb`-PFXGFZ(YyA4~exmFm1%?pIM>_L}9srxF|GzUSn= zcYZ-mRNs?zV6zy;OD4KJh&zy+l|-G zbmB%?qh)T5mi76?YxE?O`87JQT324muRLBi%g67fJ(HOG%LwD27B#mr#rVfLrf22J z+%f^f^lSoFaIaF(VOR#24E}1RLSHxax`8$c~1MjZo^L_icwajaYJpFt>k?;Jn z99oeqcFUW}T4>bT*zxnXc=gS<%&DR%OSUzhi}M%~TXM3=m*R>`al{fke^%`JT!`qy?G z;Gte3AC63R@emJ44Cpf;IUrT4tCFwQMft`gJEX0^XXcXnnaAHNXUdl3t5L=H{_=R$ z6y)nLPm?T5e{()Pr(s}mqkO`E%z!N4JZ5kE1GyWrsDD>(lrKZ+eD3Z-Syp!7Q*uM; z8{Aqx*x#|%!L>uz$*S!$qNd|sx$3hcYV+mKju_mr%Y85;pMAEtNe=M$+rM~L$hWTT z@@nvVoTyU1+}$R}x8CT#cy5*(^X2)<;_sufEpL}QBsWxa%BxdFN$y!iJ}uu&$*%0V zhw{D|e)qe>kCQK?I_JbRuNnRPL&v7f%cCaWIWy$=*JR*a=@~9rb?cwY2Lq~#&+<{V zf3)(|r7iN|iTQ=TgKInF2g3*Reck=<^~xo1uRxNY6|#kX1NyyF^I!7wL-YmCdu#t> zzArzMWRv;oqC5cEIfKDYwg|{DXRYh8!sOcdLBP zZ69RFz5}Y>sTnOR$$w2L_cKnFr@vfhyg@$D8T$_`49NE%kS~sq9WKvIzLB5(?jJM8 zui!!?;qk(@)CHWZ_h*Azf{W# zFpuggxopp)df7ih?os`RcjAv~S!tULIsP8`w6fA4%e#e|TgPxrP4PKCsvTGulCSN! zEN3kJiQF(?us*(nBaiRU{7`v(hnmNCNYBUm;0)>g_|}%T%L(&Cu06hW`8s)g>-6y* z()0NG8|*1g+*i1c$2TL7?{)ugkME#l{<@yWx3=?7UpIc zoz?r2tnKFOMY7ht8o%C@xZ^#2+^;L{lKc3M{PziYa^=UJYk$7d^YIh%cD~&DUibZS zBEjts%Ev#GxAJwv{gHK-;Aflt@^+kj;J&f*l=!TCEMGnnKbN91Je*@^ebTfINr&i((6+}`^r4J|pjBW}GM$ zvhq%L#);1sa`H}Y#))}_GI^(L#)-QM<^Dv4iovyY>-dF@d?o6XXVrZra!Z9TN5|YP zL-G~Rju_f;k`IdCl>6bAVZQtk`Q|2_uP82+m$-L^_RV~}6+~m&S?}|IiiGjJ=yDM|qiAi3ObIH=Tw-8i_mp);)ZQ z5%Na9$4E?+|0?7^z7ootYq!fc$L@Dt?UCC*(R2IzBDeE=$@jF036a}b58N(an#}p- z2Re7VT;JUOMY;Vh`LFkLUoW4*e>u6GKYwxU+t?5DWh`C%2ygnPyBpa?neGPO^v!e+ zlebOs`Fsz@_fE0~^YXo+e7otsHe=X=@FIoba1d)ZX! zFL_SoJJpJo%8nVmZr{!AU-7puxpuq!nves!-y;{0_xYr5c{bAnD^kTW`8rye%yr)= zAE!#+=Fl7D!?(*T&8cW_xCSZoGw=9tx~>8ogp8#C2N~%nm(Bv z+&x+@((|jQfyH};be+hGO62ALB};!LXYJf8sYq7VR5g#3-=_Yxd{iyJ0of;SM>dQq zzbVsjLwQ@7-cnY3cU4)=9eB$tS@-Q%6Ze0yoO1x@Y#3Gg8#%P*owR)0Uy*FMq1T6% z$%gh`A68{s%W|!mvesm>DVv)wza1{h63#Z|TJjyMWi2FK-NW6~@wmHz`WxhWta*8z zNyvA|`HpoWoi8#G@vz_~8km6_LerK|G`QPz1%5m})RepZGS)S(7-^wSf zla~m2#N7?qn$k;hll%F142zB5U%GeXxVoEjiJv6p#}zrgvt8Dp{4(x)^4XO&_sh@b z$<71vemAG>Sw!{v%0EMfkXQaRulY;d`$ICk{x^?umuM+G1=k}FP7~JuU z|Kz^eYoG1DKs0AMUT|_<$64OG8w=^i#Q!7`Zdn#Goqs2HrXatd%XPlYdu5&9=S_LO zyry(e-sA1xySKHaL+)+gTgKARD~*3b zp5Gp6xh*O0-6@}2l&@TJ-|ms-EAv(E2fo+k_Ci1TIpad|h}#iP}d^KT!{XKMV# zv!xS!V*lpB`Tp)NRUYEIfI?md%J(4 zWo;L#^VNQxP5i!mGum?}YsP%w|9USAaxV+N>|UO@K3^#ptaKMlc9fSV9;~VDJSkUq zn?}CfbiezTC7<9omGbJGm?m#!|F}QgK3ty2Ka~Ft$OqT=+eJa_-i)r0W z)yY(AYH)L(>;3KD>AAfvTf9%cw|UrqczxTT=8DFDlWzds?@xMeyy+}2{I}>{bno1g zEPh&^lNR}9H*e)D-H+uyyWgYAGoPrHr*dG$z{(_hIosMV<=^INt8SIw!X%O<`J#|b zmfqJVk$vdnZtuHWQt#eUnUycYmGW?Oz9A=mI42*~U;D_Pwx!vhwq>}yG~OpC%=tGr zm&-e!m5-Zq0=!ezJf!EI#HpN+o3LCkD%7P;-Ap=fBAPuS`91pDfZ5 zt+gW`Ss?Gclf9k2dP-=-qew9$KPH#nl#i>LXP1?JBJWh^I!4RHZmE`+zL!j7Ym47v z6Mt8*W3tl7oZE74GmW_}=Qkj~2C4O%Fq_O37s@nuSCskH{>+JrvKIO43Ae=k!8O19 zz--U&(BGR_u+jg{pRb!mnQ@5B*fCY^N=5Os+$;I(6SryqP2QJpbZUx=><{^!G7qb~d}idYME*`5&yssJs*%^piqa4G_&@Nf z=8xyAN@sbuy4;P`aebxyd|CO`xA|*dX6t$RNPBHTt4nXotoh0j@;j)W&;0#&KeNg| z^xIBU<*Q`7SLrWcc-^cS^X2lMXH8ypd!9A3 zU*7l)Th86hXGh3iiO83%p3iu;DBs;yl+H;;miy;Je$(Zim$F{Vr&fLp;|a{?1`aGv zls!?_^SS=7nQwc6AI0TGSVk!KBlx3h#{8lq*fcKjm`ZNAqp)0&&zXZ)N`=C%4dd4U}u zM_-g1?#U0x-G6gBKcG38yMM0yYEn-BU!3Z9O;>o&-dmiO%7sTrd|8_tg2>$IxzVkyp$KTI!?q#x) zm%(DywHL+GB^j^wrpk`@bK8H*2M_xV#pM=r*>|#2^kVWQ%zZ&jH{UJKy?j-u@Lv$+ zM``zCOzRyzE9{TuWbzl&?#0G0ceieOFO(YjcAJG#9$6w(1am`6A{A>Ru?qT`DBKxYMb%4AhPmF(=DPETMnriNEx~EYdtK08?lqa(> z(JlWzg>Nb3JbZu6*T{N#9Mh%o@(|Q^{;wP)Kl`|^t4$;MCmYLUS@Jz;Ch=AIT>09W zPd(I+uTEbQkY6$LMt*>~A_um}Uu60lYS&$Hzf5Qty}9&`NM$y9OI7Y`i_5;Y_~wkf zZBEI1)wS~1nDt5djrljqiK)A@AsU_-6i=Os$1n)`5USZ9=egq;uqxY*B0~rL7RSmpzo9( z;&XT|Qi*TL9F6Yr?Jtk7{0k9(oE|?~&K|vOjNFSJ=WmhyyCbSvGV*}7W@>(1*<4mu zv;G}Sq4l-ElSlhGS&zNIrA-lyX-t*ZX5GrT-E`@6s(lsQGcV zT%|_-TCSGA$(8Ry<#!m2EkBk*hmgL_UR4kKUo+Ra#Uy0mOkiXyUl*f%fX}?3~q>C%%{Ev*6TUxGv zL|)L+Ew%1VGUaY8eMFXeDarlJvV4*>f$k=Mux#+&2Y=4p+L7s-cyMSb%Ux@E z_jEO#*QMmMxsUJOSnF@(E;l#5dvi_a;Lzu~8{K%ErS&>DQR^UoUmE3z5pH;Q4Y$s- ziM8AP1J)?t>m)kmU*uGb=%|+a=hApxT6RH7{^3sN$9S6Luk3}}V4|EfJRc@uegYG>a-c9#w)2jLiDR=t=Rib{w0El;CZ41FXcJ77?REFT#Ie~ZZ$U(l zwAZa3BuqR<*K;#Wl!^CrRJzs^1vYmI- z5MdJLSuk;ImisD*#A!D~^rUv)lQ2=X^X7&MlQ55kiRb7(nhg_WJMT)Egn0){9Gh)+ z3?gyrS0_aDq;}qMFj2Pi&WA~u*TKYd^!0fgOqA`s2VmmZY|yh1(If5Ms=iK`c#iI) zQ7}=q*PQ|r$7Z7}g@_($ue%N=o}=q|8%&h#bq~PAv01QZA)-gx>sHqb6VK6gH3}xm z_PSGG;@B*lr4Z30?RD3|q;Xp4^?4UelxGG9^Yl-GNSx#!1U}e7^rUt@ zZ-a@l9q0&5!klRkCZ40~su?EAcHY@A3G?GHacq{|9*D&00z~wrcHV|YVWMp3oeGmM zcf-VUbUkl@iL#ydFigVSXP7W?Y?gZ)MB=mrB6?Cg??#v?+j;lHB+M6K;yJpH>TVDw z%68rVP7O^$L{DnxoedLZJMVg! zg!vFmJV*EM6__a7dE1(WiDR=t$ct`Od4B4-(SsviL$-!T9|}+KTI5(r~fiU;xvA=5Ydy`^}GZo%66d5FbVTfn0St^ zt3Edi6J+gB5`^gB6?Cg?;e;a+j-BzB+Mh)go)?qKAHg&WjpUGn1p!` zOdOkSb^#)B8uMNuq9?WUE`W)$o%czYg!vFmJV#%jFTq6F&O2(XFmY@)=sbw%k@jw_ zgNf(pKH3cvWqaMzFmY@)O8u`05k1mgcN$DQN7wUmm?+!pZi9(qvtW-yM31!BtsW;# zJV)2nIG8Bg>n?(cW3zBJLqw0X*F6N2#-*Xx=kqX8w%4t@RhWc%Doh-kr@sp#ar!1i z^rUt@AA^aq9Vjzin1p#OOgu-|)f|{8+j&>PB+R>D;@B*^QxJ*MklTcap484e2`0*R z-lZ@J^JbWMj;`kyVWMp3Jp+?4*R=~1$7Z=tg-DzpgNUBg&bu8Z%68tPFbQ+!eZs_Z zbRXRa6JZ>Flijx82J6wB$z1Mc~`Zik5;ZTT!r8ix)H?BDvS!bI85I};{h zUJnz;X8#_9NSvxaDn#_8cHT)aQMLoEfJvC2hl%It{(TcB%68tmX~HDTvti=c?B5L# ziPKSt=t=Fol^+u(%68s6U=rqTn0Suv-yJYfw)38XNthd^3lqm?|IUR-oHj#5Pip5q z0uyCBZ~4cCNth?Y#B+52E`y1(op(D-!h9Mgj?MlZK0}DaX(2@Pq;}p-Fj2Piz5GB z4NR2nygOkM=HoDNZ1!*ET|y*I6Ct7}wev25iL#w{Jxs#97bc#g`}ZVFlW_dq00 z=OCgdwe!}_7ADGe-ia^?^HP{Jrse;9CieHg--L;>o%b?K!aVhEVdB{A-%SvS(|L&K zN$tGtbA*Yqop&`%!h94ao}>GB$UVYD+0MHFCSl$M6US!%rsfKfIL(2Gp485}1t!XN z-m@?X^Mqd&CZ41F_c53#+j$SdB+Pa5go$Ibf0sZcPA@`4Pip6_{FE?Jw)4({Ntn07 z#B+52z6BFyJ8#>3VG`z5FmY`5?-7W^>BdhB5k0A$w-YAHcHX@(33K(m!lW@B`u7{- zV4`g2T?CUbZ-$9uvwx33Bu@Q4BSiG1cHW6FQMU7zU=rr7F!3DSzlUL>Z0EfSlQ556 zAWR&a{ksGraoPqEJ*l1dRhTH-d2{y(lQ2(!iRbA4T?7+lJMTuAg!vFm9Gm@{S|~)~ zG!Y_tQai8w|6D0gU@x}wJ`EE++VWADc#iJht1wZv^N#+kFbVTQm^e23cN0Y7^eRO3 zq;}riB4MIz2O0;HFfWCP=jh)LJ^>SDJMSKtI5r#f3`F!ud$$ICPMCO(?xXQAQMT7z z029Y%qileP9%-+;7bc#g>-i0sDBJ5+E*2(^&4O)*h#qOLyAURxqwDH%m?+!p?t+P9 zvv5v9M31!Bt-fEF2q)v;UrmOIvc2vqn1uNNOdOl1zjBEXiPJ2I=t=E*-T)J2JJ2gI z3G<-O3lq=Lbu|qp%68thFbVTvm^e1euCP>y#AzNx^rUv)O)ycm^S%a?FxNjIOgu-| z^DLMs+j%#@B+ReE#IafKbtNGZr-cyFliGQ=z(m>3`vy$HJmNuN;yJpH=D|eS&btXF zVLk~H$7Y)i|AG*S(^81&N$tGbVWMp3eG4XGZtV~zo};hN^I@WF=iLYs$7X{bg@_($ z?^boEF!3DSM-yS9Y_GcrVQjFbVTUm^e01{~3tH zY4UO*q9?WMc>_$8?Lcq9B+O&KBuqR<*Ht%6l!o+iQAFYFlvYq!BOu{_+5n9EVB}|m< zybE9w=KU~nZ1(T)UlSs6dK@BpQakS{m?+zMC#)7GVcrZA&(ZyR9wy3m-l@MXOv1b! zCXUVitz08S;`9ZG=t=Fo2VtUY=N<7I!X(VAVd6Que_w-%vYof>abXhX4KQ(R_U{FV z#A(iN3K2c2op%>Zlhk4W3zuZKqOA5 zA)+U>^NwC8OqA`s%V84cmtf*Kx_@(D6DG=b-svz2^JbVhHv9JsMB+4Yy%5op+IiQ& zMA^=J7$#w^|1DwSIl6!6!$jH6yA38`z6cY?X8%rlLWsm^BSiG1cHWaPQMU7r`fXtn z=4CMP9NoXWVWMp3y$X{sPun0&9Gm^S2_kVi2N6A~op;>Vg^9AAcO^{1d zlrT}Y*OmY65&2#4FXR_s;*K^?f9e}TBu+CSqSv(Rc_U1e?Lfz166O(`go)?qx>^7e zWjpUSn1uN}OdOkK*ZzA#Bu;A~q9?WU9)^jsowu-An1p#AOgu-|^Cp-m+j&pIB+NJd zzA$lYmU|~e;kdwm%dmj?IEy4iP=lUiW#Jc#f{CvoKM% z*KOV^OdOkqQ-X*dX|KBjCc=U5pD)8i*ttV4`g2%{?bf!hA1G9Ghjg2O@E*`x7CeC$;m+|BjG6fxXzy zyB{WcwB`Ek!o+iQJuiWYvYmGyOu{_mPlbtNv)tu>8c1HBgLDKUdQv;@s2##Y*$&hN zlQ18JiRb7(8vbX(MA^=}9429Y1tyNoHf!D~MB=m-B6?Cg?@5>_+j-mmT$qG;9ZVY2 zp@0AUDom8^yraG;Ov2m^6US!%9)U=lM*oEn(UaPFSHeWu&U+XpVIHwdn0SuvU-=*G zk%68tTVG`y(ez@kdAZZ}Z;@6Jm^qO|wOE6Kk^UgdhOv3y;Ogu;TZ{-h# ziL#w{5lq7TGE5ws{oDMC5Q)R>PJFEPip5K4HIQM z?_8LKc^ym|hlcj=E|@6Wc~8P5%=y=ZiDR>WCqX1mT@cZe+IhFZMA^=J1SVn5{If9e z9NoXoFj2Pi&W1^tABTx!vw!zMBu*C~q9?WUHXIWs%68tVFbQ)vOgu;T?-rOS+j$Se zB+PwY7bcF){%wOuoR&aDPip7g2oq&H?|zts`65g_NB3{tabcot=bZwRFt31#W3zv^ zLnKb8AfhL=^Y%L-OqA`s?Jx=RQkZy-{{6yQm?+zMcf!Q6*`TjMM31z0>k3RfNB2?P zNnxUFuR9SYj?G3{3=uujUUwZ#JV)2_c9mG)QW3yo2hKL?%uUr3PVd6QuuG(Ru zY_B^XCXUU*c^o2oq`mGAm^2Ovy*{6UiL$+J!yCdR%=f~?v3dHpKqO9QAfhL=>v`0_ z2oq&H&;po*c`HmjN7vOcm?+zMYflN2FwcRBW3%iwK_pJ6AfhL=^EUjeFj2Pi&V@;s zH^anpbUhz|iL#xy-4kn(Xug`m6qHO0q2NTC; zgWmX-5YZ#;-I@mz&(VFf7ADH}y8B?_*ld)yA)-gx>$d*8F!3B+&vRj-Y_Gc>CXUU5 zeHkKpq`mGHn0St^tL8JpMA=?{&h4U0d^hkT%LojK~gkGP|!bI6#x9}grB+L_G z;@CX>OCS=b%@EO(+V#92Cdzi8w_p$w{y%68r@FbVTvm^e1e{W3)2)Ot>c=t=FoGhw1^ z=UoAlFmHv4=jc9q2`0*R-ZL->bM1c$6USzoO@c_AmO(^MYUkYq6Jk3RfNB2?l{|Xajd)@gk zacnlqQxMT3?R5{q#B+2#UxtaYz3%8M!o;yzu!|w0N80OdhKc9sx;h9GWqaMLFmY@a z&iHqPh#qOLyA&pkUk$xJuZ4-Sz3xt!g!wg?I5tmz>Z%ZlQyWC|q;@^ehKaHrs0$`x z-U<`X(RH;SCdzi+(=Z8hKG8>h-!5@%mR&nU;r!5fCliGO?z(m>3dj=+99+VU&o}>Gy4JOKVpxH19 z^J6e^Y_{2Uh{Wj_MD(O~-m5TCw(|~836n5SgGuAU(EgSGS#|jf{9bJ5-3Svs+VV>< zacuVQ1&G9HR9cAWN$tGTVWMp3T@I5lZ-t5H=>9zb6JWw?HILuR=smYUjNQ6J%68tBFbVSxn0StU ze{~2Z%68rhFbQ)*xiE2T_U}}P#Hkx1dQv;@7MLj8d0&P}m@mS_b9Da>st_j1cHVZF zgn1E69Gm^S0U~jF2_kw@JMS5oDBF4SmBJ*<6JX*wx_{@vMA^=}3MOIR2@}U={~m)# zoT{sYh@RBW+XfS5JMSErgn2bgJV*EMR+uQ;c@M%Q%$H!|*zDio)j}jrvml};wexnt zMA^>!3{1j&2qujqLSKI`z(m>3+t62-gn0%`9Gm^S3Lca(e-==Cd&4@{RRmW$7aEfhln0&uR9MWo}=rk z3nt3;x=+Kzu~|4TLqw0X*F6i9#>&v^^ROCWqHM1_7baoe1QW;R=|2XMI1Q`ini4&! zUC(o2qHG6x5+-3j3KP%KbyYrCm?+zMC&47lt6<{TEW7;>iBtIyt|`%z+Ic6zMA^>U z4U;hMg^B0rdOi;mWjk;4P+=10B`|Spmiu;y#OXXl^rUv)<~pt^QMU6ggh`mU!o+iQ zAH4<>Wjk--I$;v#nJ{r|w%G=V#OXDN=t=Fog?g?jQMU6=gGrdz!Nha)_4x&uDBF3@ zz{IiHpu?{hB6_5~TeD!|Il7M?gNd@e?k<=(HXG#(MD$2|-TDS$;yJpW?}Ul6y>1sw z9GeBZ3nF@?z3!VZ@f=-O`9@))Y_B^BCXUU*>4JzJX|KBjCXH30*XP49QMT8;1d}k2 z7$!^{o2P#!MB=mtB6?E0o_E4T*$(t7Ov0SGL6~@suB%ZnQMU6=he?>bVdB^MHp@Nr9w8E^aS+jy+Ii>0 zMA^=}1}0&C9wwfn`{-4eDBF3j!X(VCBZP@#v(4s0Bu?ugq9?WU?uLo7o%bY6!dyL4 zn0Su9K97QlvYmGdOdOjHx)dUMq`h0~VB$HtkG8=?*xtj;^bxV4`g2-4By6 zUx0~Yv+Ra936VI>fry^e&btaG%68rzFbVTU43jX=g^6Rc+}A=R zPA@`4Pip5q0~2LC@1Pc866VP;@f_Vpi(#T{=iLC4Fz<(nW3$aJKqO8#wh9qFshxKw zOqA`s-7pFB4wy8KOZQ2{{_jK2z(m>3JNhPJ66O^!acuVQeu%`WFj|P{N$tF|VWMp3 z-2{^`zX=o1(fvF8W?`ai=UoJoFn<#!j?MnP43RiZ9V0~aq;}r*Fj2Pi9)U@i>u(Vz zo}>GBE=-i|yida<%x}TOvDv?EZ9*hYt01B$weuc;iL#xy^1Z?&%(GzPIl6y0z(m>3 z`zlPrJZ!8macuVQ5{SfU4@C5&cHXNnQMU6=`W0ak=5;Xf9R2=kKTMSEyjNl3*lf@{ z#t9KU(%!9Zn0Suvqg^mjw%0ue6USzwjJZ{a=#loiOJU+Ux}LYdMA=^VBupHe1v_lK z5YZ#;b?3pvb8KC~8+x(5?qQg?qs_v}-zG%##P+(=VA7Ziy*{skiL$-!KA42LPrER2 zY@Yr}5Q)=Ti0Db}dOiRXWjj#neZnNnlVRdHx~{rlqHO2g4U;gx4HL&^*|kp)B5_&; z5k0A$cOOiY?Yx&^66Oi-7bc#g>$wvq%68tJFbVT{m^e1ey=|fpiBlIu^rUv)-7rzM z^Im{Sn8)5OOgu;T(Gr*_+j+OaB+PHY#If0C&36cqICVlqPip7g2@_>I?-`hcx%C6W z#B=oZc`i(p?Y!$@;@E7^mm#7@+PifHCZ41FsCkkwQMT8e4->~`qdWx>JWdi0F~_x|?C*Il8V6!bI6#_bN;rn}suevJlZD?RA&Jq_HgY z^Y1#CDBJ7qf=QT9!o;z8`YS&qMB+37B6?E0o)^GG*$(tLOv3y;Ogu-|)lrxz+j%d; zB+R3x2ouL<+0BGVoK{0bPip7g4ijZN?<+6~^A(tQj;`nW4+|4zJMSczgt-J0$7Z>2 zf=HYWK}1h#=e+ZbRR8*iL#w{Elk3^8zzp;Hai88I1T!U5Ydy` zdD~&4Z0EffCShI&6VK7t=dCbNw)5_XiDR=tPeVkHw0A2rRhW2=?xT8`DBJ6{!^E-K zDDxqrN80Ol!^CrRJwFK(WqaLSFmY@a?5hybBkgrB!o+iQT~&Wnm?+!pHp9fRSvb=n zqDR{6E`>>Bb?EhZJxrACb$7!g%x}WPv3dFn(}YNzra(kbYS(iKCdzi8jW7xGOEB>q zU00`JqHO2w_c37-<_R!yY?j>;h{Wk>i0Db}ya!;SZ09`(lQ7p$7bc#g>v$7bQ|fQTMxuX_k4jeSF}&lh2$Y_B`~E@2Yp*)VZzp8mBEiPK9E(UaQsd;uoP zcA#Oigh`lZ!NhZPU3J4m+0MHiCSg7a6US!R6+S6M;xr8+dQv-Y7fh7xywAZT%*SEk zIl7)RvxSMWowp4pVO|6i$7Z>2f=HZ>LPSq$=S|%$OqA`sV_*{Ig)s3P-AC(SqHO2g z1CubHgNb9a&4$krB5|4r5k0A$cP&hm?Yu9*B+O@F;yL>ITz!u)QMU88!NjrIpz|T3 zN7}o!8YZ5j`)Dgnl6jN80Pw&lM(~qw9GBOqA_)7r?}^S+MINqDR{6 zJ`WSm(RFncCd&4@mto@AESyolDn#^1d);X;5f1$Q;Nvh+w%0uflQ0+N2@}WW>7NUc zI6VguJ*i#KXJDdi2WtJ4FbVTAn0St^t8cukhJMUJQg!wE?JV#%j zhb`pV5@kE@T$ngE8*~#y^hkTRj>5!qbRU&}R+uQ;>rR4+W4lqHRZ5M0685@#Vd765 zUC-xXqHM3*yhxZhHVbwMMD$2|-K{Y399>th!9>|!x9~Y(;@B*lnGn$B6?E0o_E1S*$(suOu{_qeqrJ{x~?X`MA^=} z1SVmA8YYg-vO5BiI8`qZB6?CgZ#zts?YxU&66Vb?@f=;xFTq6F&U*nSVIK8)VdB^< z_qh;>(~}U?5Q$U$142Yk zYUiB_6J2TVLiU!M=bMA^=J0Va;k25l$_5k1o0t;sO)9Nk9?VWMoWyA~#n z%|_V`5k1mg_c%;EN7wTem?+!p4u4RXI5rD*Iz;qHd);L)@f=-OPr^jmUUv^n9Giu6 z8X|h6y>9gvgh}K0(ChOAm?+!pcETjgJ7MD3JpE@N5~tP>v;i8lm%MA^>U4wEo1hlyje>~=vUP8T7fC$;l7KO{_)?Y#HGB+Q#(;yJpW55Yv) z&YM~$Ou{@7CXUT=?}A92_CiEYYUjNG6JTM_bM< z7bcF)Hk$;IIIV_=p485}2PVpP-t#aCbL*FciRb9+^IVuH+kw`@B+M_v#If1GsTD#b zPLm*_C$;k~hl#SCcRNhN{3c91NB3{xVPT?d=bZwRFh2$p$7cWTfk>P#Lqtz%=N;W8 zOqA`s3t$rF%`ovC-MCXM;f*WWQP zQMU8Wg-Mv#!o;!Jzk47Or}GfeliGRf9u+3acHYS_3G*_Tc#iJhr(mLN=iLvJFkgU) zW3zvUKPE)tGzTJjQakS|m?+zMcfcgf$6?|*x_|q8MVKhtd7EJp=D9F&Z1(S3h{Wkd zi0Db}yk}sdZ08-cN|=OsGE6*2_wQnuDBF2Az$DE3VdB{A-wP0l(~Z9-MD(O~-kC5_ zw)1wwB+NTtBAiad{_j)H!bI85+qPPmgn1=Q9Gm@n5F&A^|8*gvC$;k~fQho5_c@q^ z`65g_NB8g8HNr&M&f5i(Fdu-4W3zt?zad28v=AbCQakTG> z8z#zj-u*BMbHCpdCXUVioePmT?SP1$)XsYWCdzi+@oR-im{-HZb9Dc{1QTUDZ{=5o zNtkED#If1GTObmrixAP1+Iid82@_>I?_)3t^C6gcj(-1K{WW2tZ0DT`lQ2I66US!% zo`p!9?pQBG^rUv)$6=yu=RFLQFxUTWCp;lU;`9VW z^rUv)*I=S-=WY0HVG`!0F!3DSzdK-}Z0EfIlQ7@0L6|r;`*$5g;`9bY^rUv)8^110 zl1C6j?IF73L<)>z3yI^c#f{CV=z&+*S!i8$7bQ&_>>UQBkgsk!9+Ol z_xoKiQMT9J2@}WW`F#r_dZfK>{WpY(=jii06(-8|x+`Jg*gU^4KtzwU*F6gp&(Y_% zZj&%kw%45w6UXNHeHkd3or@u=*_~!v3dHJKqO8(AfhL=uUDsFqHG5m^83Oh%(GzPIl8V^!$jH6y9Xv= zz62A;X4$npEkxq93?h0`JMVUwDBF48fJvC^|3H{{j;`lvFj2Piu7XLJ_rb)mS?-r1 z5~m5z2oXK0owpMv%68u8U=rpxVd6Quj|M#}OqA`sQ(+S3H862(w%LA{2yi0Db} zyzMYiw)1`gCSl$I6VK7_pO3>t+0I+|Ltzr;88C5d_U}4~#OW1?=t=FoCSjfi6VK88 z+YJ+CJMS)-g!w#79Gm^y`o}^fPG5kCp486!988q$yeDB2=KAM^iRbA4ody$SJMSu( zg!x67I5zwD3Pj>`$DarhJ*k~{1x%FfygOkM=Cd$qoEZB0+i$xtQMU7rgGrbd!o;!J zzZ)PDrvnhtliGRD!9>~4Tl=TNB+Qdx;yJp17r{i?&buBaVcrW9$7cVYfk>Phb_fwY zshxKUOqA`sC76VHGfX^3_wPQKDBF2Y!z9du{!ExSHv4xHMB=m@B6?Cg@6#|*w(}l< zNtiFf#B+52*6tK0%68s~FbVTgm^e23cN0Y7bQmIfQakS@m?+zM8~$9Fgn1fFJV(F& zE`^D*op%FF!n_YAj?Ml(1Ccn@e^ZF)N$tFoV4`g2T?~^jKM51h(f#{8OqA`s$6ylX z++PS2$7cVwK_pHKA)+U>^R9)7vYq#vFbVTD&btdHVLk~H$7cUl{-qF!(*%g^KOTUvYq!8n1uNXOgu;TZ~eE0 ziL#w{5=_Eef{A0Ze>XuSPKO|(C$;llfQho5cgPFEB+Qdx;yJp17s5o@&bt;SVcrcB z$7cVYf=HYOeMgAsN$tGtFj2Pi-V2j3uY*bBfYAQk2@_>I@2fBgb7qe)acuT)8${x? z2qJn?JMVg!DBF2=!z9da!o+iQ|K|Qmm?+zMN5dq{^I+oG?BBHziPJua=t=For(vRO z=k2#wn1p!(Ogu;T?|hgj+j-Z(B+Spl#If1Gryvri+P@YedQv;@M3^Ysc^APX%um9^ zb9DdihKaJB_aschT)j`2I5zvY9U^fmK}1h#=iLYsWjpUan1uN(Ogu-wf3E%;VWMp3 zZG%ae=flLY*}rQc5~sZo(UaPFPr*dl&RhPXFbVTmn0Suv-&rtGw)1wuB+T1j;@Irp zBM^yG=DR{fPip6FhKaJBcLq$t+zk`Y(fzv_Cdzi+{V)mhIhZ&$`?qet5Q)M31!Bt^PY< z(s)PvaqHM1_6((Wsgo$JG^lySloL+{Ap46`AGcZw(4D_;awIs}AVd6Quu4ceQ z+0NSulQ3_BiDR?u_Cq92=OLmeweuFfFHDr}yklV!=6Nvj99_>VV4`g2-2{^`?}v$F zv)s=>Bu+yP3K2c2owpq(%68s)FbVT&n0Suvqi0~EZ0Fq%lQ5rwiDR?P3V$y|;&cZ@ z^rUv)1u#*z^R9+Tn0LUWu{^YYPr^jm&Rcs(n1p#2OdOm2y8$9`dKDsiQaf+I9|#j= zJMR>jgn2bgJV*EMZkQWmp~*=J0YScwey~aiL#xy;fKN`%=2L4 zIl6z>!$jH6djKY3&b%T_9Gm?+2_kV?0}(x`op&EhlyA1qOdOkyG7lnpq`mGsn0St^=iM+-w%0uk6US!3*8h_b z(If43r@_Q?bX_fniL$-!Hkddz3+FgQ^hkT%>Q{wH;gpMbmQwnL{Dnxoe2|VJ8w5k!n^|}o};hN zFT+IH&U*$Xj?D%w92X*bq`g~XVd6Quk7mF`*T(B+T<*;@CX>8z2&=!w}Jv+Vy-DCdzi8(LWX@VO|Im&(U?Y9wy3m-hD6$^F^3A zHp{O04IvVzMG(=G+Ics^MA^=J048C+0u#^C^*ridgo(19cQ#DIybdOg&2rxlkvLt2 zh@RBWJNlF`QMU8Whe?>9go)?qKH3KpWjpUVn1p%6zX}t_W}D50NSro8L{DnxJpdDB zJMSf!gt_%iVd6RZ`aB&b%68u6FmY@)=vIj6k@jvKf{EwoJ~{^zWqaM)p9mAjW}{4o zh#qOLyA&p#qw9G+OqA_)cf-W7S+H+HM31!Btv)SGJV)2nXqYJ5>&}LWW3zBpLqw0X z*WCe=#?hhI=Tk6Iw%2X=H(?Uydtu_(JpEfB5~ni|(UaQsJnAiBqHG6R0Fy9pg^B0r zx;h3EWjk-}zYCKv&w+_!v+OoOBu=Lwq9?WUHk=VA%68tlFbVT!n0St^=OZvtw)6J; z4`CAK88C5dmiq>X#OWAB^rUv)+Oxt$+0Hu?CSiUOCZ41F=pam#?Yz043X?G32@}U= zo2`XNoQ^<5Pip7wcTSin+j*zLB+Tnz;yL>I{31-0?Yx&^66W^*6ef<%{_TQDoL+>8 zp485J879hh-m&L}NtlV z&(Zz60w&6K-d!*W^97hVHv6~jzl2DfRzO5gYUkYr6Jm^^!1Yye;(gcLq$9 z?Yvzu3G;TCI5zwD7)0Wf|8F6pC$;mo!$jH6yAUQ}eiA00qx<&-m?+zMPr)S2g|~%? zW3zuJK_pHqAfhL=^KOBOvYq!3Ou~ExCZ41Fci8_36JmB+L_G;@IrpB@l_zW{BuX?Y#S8qHO1V3npP6^o}s` z9NoWTVWMp3oePsNuYrkUvwwF%Bu;NaL{Dnxt-LBslc4Z_g%O8+ zd(QwP$#@$WG1&KC(9?-%c83t+3ia(>3q~CF?Y#<&B;!ZHh{aL=&36hT4*T{l0VBzH z1dJH$`R`pIB#!oi5Lc*g@4*v<5r=(yLokwzZw4b4NB6HD10xRm_U0!FBL;g8dMF5S zIsImx2}UfA`q5Qj#9_bQ`@o37o}=smAugw1??6cyu{b)OSAh|S{dzA3BL;f|_HGd3 za{Be|1|t?n$5pjU7;)II_ed~eus3iIvBAy>c1C*5r=(yZvi98cn26U*z@1EsX|B`Ede2}P~YA&z=*@Xy_bQJWPCRm zu{i3#Pk|AKeS7oMgpp)?AQ&;&^WRfJNE}@SLR_J~z4w3-hkbi@fstf9X&+(4;;8=~ z3`QLG?Oh8-lJRCRVzB4GcY%;NdLD$hLVbIy(}fX-eS4RHkz{-(7^!t9`R|or#9`mw z?O-GszXV1M_WZYhh7b}*r-KkzsBiBTV8mhH-h07FGJX+^SRD1=={>@T!@j-8fRSW; z9vCs$^WWP*NF413A+Av0-f1;q#9`mwqrgZq9swg3NBwsj7;)IQ_Yp9XjPv^nBL;i^ zyBLJT(MAyB3ia*X3Pv3E?R^-GB;)LU!idFD{~Z7$4*T}51|!M%GB9GW=fB%QNF40} zA+Av0-u{`wh{L|UCxMYr1xGF}5l4EFqY69|c;dq9XQ)VFsR7;)IQ zcfu@TBpDwHMl6o{?^-b8uy60hU?dse4n_?2{P$@P5=Yh9LWnEWw|5B`aoD%_3^0<6 zuLL6&NB#E>FygRp?^9qT8F$o$5raMdT?|6vCyE z-_riVh{L|Ui@``T-T+1n_WXAX2#KSIL5M5VxA$c*;;?UTZ=W!dj8}pYi=+PgVKCyb zZ|_zxl8he#BL;i^8}thyakL18xI%qy8w(h?AyBrj3ndDV5BxF$$xJFBM$raJ_bgTadxgSVzB4G3qVL5 zodH5zp}xJBff0v&d+z`v$@m#CVsX@e^9Kkc4*T}b1tZCL4Hz-l^WRM%B#!O@A+Av0 z-d$kCVc*^f^MsLPd?*;PIO@M^!HC1Yy%&R#WPCdqG1&9pr$I;@Rp$#Ku2A3JC1Av1 z-`+F8NHV?>j947?-#fsF!@j*wfstg~u|OCx*z@1TAS8}L5aJ5;?Y#<&IPBYd4;V?t zyTORX(a#t1uNOuf_U)YwMhx~GbQuV7IsImx2}UfA`q9N;#9_bQ8^MUdo})YfLR?P2 z-rZot;^=tJA1I7C?AJRRj2P?<*kvHZ<@D=46O33K9ak5F5r_SHZv-O-djsbI5aM$B z_3j2EwaH2IbNL`)#9_bQC14~Oe-Mlq>|Oq?AS8~S03ohWe>~?87DgQQ4O#$3lJV(a z#Nz0<+5|=%_U*j`j3nb{!HB`$u$#6}2#KQ=AjB2w+j|}uaoD%_CNPqWcYqO#qvJVP zB#b!h+dCJGB;!-Sh{4`)zXF8B(fuIA73$mj5*TsVw|C|t!bmb+2}UfA`q3~LaoD%_ zMlh0$9|t1_dv4aYSO|%uBS45N)VDVTBM$raZUH07_yI6tadduu4vaYL+dJV6!id41 zgDwIgE~nqDHDJWzs2>f35r_SHuLC0ndyeu$5aM$B_3j2E7DvZ(+o8gU!+yPU!HB`$ zfISI>xSW2yBVfeh=(ySfMjZC*y$6gK>|Or5Ku8?@9)!3;{qa0)i7?`@Z_rXOl8iTk5sRba>S{3Juy5~nFp`X403!x_ z!*1qbLP#8)1VUV)zP%TM5r=(yZw4dDcn27_3eEQ zj5zGuJAJ7zl8je^5sRb#djS}6*thpKFp`X)10x3e{`(f8nUXj<1%$XleS5C}BM$ra zejkh^<2_)+;;8@bf21(tuy5~bFp`X~03!x_{(Cg%DS$Z|`C-;;?V;nP4Ot zZv!J1NB#F2yun__C5zj9QN%UI93=*#v8$i#Zmvg z6^uCS+xr3-Nydwp2_pu3{(B(^iKB->h%3~$xBNC?#9`mwm0%KLbWAj{5JkmBNU_zP+o!NHV?}j2P_s z?-L*-j%L0?2yun__O1mZ4*T|Q0VBzH2Nc8bx!idAZy~lx(WPCXoG1&9pM?gp% zO*>HtafSN!t^y+t`}SS|Mw0QPV8r66|F)eZj5zGudn6c1#+QH*gFXMfAB4nF`D7u) z73$l292jxfw|5g5NyZO=k=oRx`|lnw;;?V;g4M!EG7iCr!Jhx#1VZ9yHwbZs`u5Iz zr!eBMZ|_N9BpF``Ml6o{@Atuo!@j*QgOOx>@ET#nV9$StKu8?j4nka^zP-c7?Z3L_5t_AUV<$@ok# zVzB4GTR=!0JqSWvp}xH@ff0v&dwb3hMw0O|Fk*4^^My0Oh{L|U7lRRlJqNuRgt(l3 zvmO8=7DxSP7Z`EauQ&g9!id41qYQu$m(#Cz85prRI-bt}BM$rZUJOPI_6F?DAjIYL z>wN%>SR5T!yTFLUe!cm1!id4%z!?A`E~j7bGB8qmUDEu#5sWzO*Si&rB;&`xh{4|F zZ(A>f#L-d^;tKW0^AH$u*f;2UFp`WP1tS(m$JHJ%;;?UT{{~?s8LtH+27ANq3J?-U z4}cI?sBiDfV8mhH-u>Svj3nbVV8r6+c)kdXIPBYd8yHE(yTFLS-f*9GrVtWGD?x}W z)VKFSFygRp@2y}Y89xI?EROn7$NPm5hkbh&gOOw$f)Rr~H`@wA;%Em5afSN!wuQoo z!@j+Xz(_Ja6O33Kou4;@5r=(yZv!I+dk*>(2yr?6W@SGhj947?qh2uLuwU;nV8me0 zQO*V-E~j7bwP3{J=y<*xj5zGq`!pCa*c-4DJ}88^oPNCrf)R_O<7y=saoDeS7>pR~ z4V)W6h|B5M`v4fJot!j3KMzJ6_Uo+<3M0vQDHt)>yZl2SB#v$bA+At=JU<9V9QF-* z35+D;-XUSc;^??K5{x+P+Z%$BWPB|cG1wb+_k)l)+6zKlp}xJd&k{x)_U%0mj3na` zFk*3ZJYNS!9QN(K4~!(^7r}_Z-f*9}Q3#2nRUpI_>f3uB7;)IQ_eL<1j2{If7DxT) zB{1T!Z*R|sgpp*t42&4;x!EuXiKAOUh%3~$_c1Wyuy5~PFp`W1&K5>2j?T}^z=*@X zy+dFm8D9rR4EFr@eh?Bzdq9XQ)VFu$-wPuS`}Q6MMw0PHFk*4kf3E~14*T}r1xAwb zE-+%S=fC9-3n6i|6oj}!eS0^65r=(yF9##Z_--&_anyfzfDwm%dxLX?kz_m8NBwsX7;)IQxBpyWBpI&-BL;i^dj$xIqX$5UE7Z65WiaBf zZ}0x+2_wmP4H&UF>c1C(5r=(yZv!LAco!Hk*z@0M=L;cmv=W54LVbHL1S1an_TCCc zlJPTO#Nw#`c3dEgIPBZI7>p$25R4e?`!8r~BH95$T%o?bZ66gz9QN&91V)nanP8;$ z=A`xWW-#KgZ|`kjBpE*iMhy1-_d=mINgN#tLR_J~y{Cc^hkbi50VB!yb}(Xb)PElZ zBM$raz6?f^@$8QYBL;i^y8?v7(M2G{73$l26Bu#WxA$Q%l8pC&5sRb#JN+VI#9`mw zBfv;94#9}Qp8swEA#wBo2yun__Pzi{9QN&<@^N7#87~DR7DxT}bTHzuZ|^2Bl8o;F zBL;i^`!ooNqe&MFA+Av0-o;?VVc*_Uz(_LQ3`Q)DuAgrLBM$raJ_tsV@t?qm!Jhxl z{0AW1Qd!@j-wON5bRJP(W*?D_9%5E4h5 zK!_{UxAzt>;;?V;BVZ&M?*StgNBwu&Cxj7)eS4RHkz~9Mj2P_s?-d{P-Z*SWsVI&zJ2u3W9`tJ%b;;?V;*!4*T}r0!EVY<6y*K&wqo>LP#7f03ohW-`-VV#9`mwVK9=6 zw}BChqyD=cj5zGuy9dm$Kc*thp)Fp`XSfDwzMz(_LQ4n_?2-0TGq5=Z<0 zlMvzx_3d2&MjZC-9RVZB_+~ItD<=8xvtYzw-`@VKg^^@D1V#+@{TFmsA}U-Xgt$U| zdyfGl4*T|Q1|!M%Q7~e0)PGA`gb{~*dsl#wWV{8880`7)(;y^{=6zNOafSN!4uKJe zeS2>QBguFV7_m6&zl*LFMjZC-9R?%Gcsm#|*z@1E&j}%MbP@=0h5Ghx0V59k_U-^9 z$+-7AVZ`F7|DFOy9QN(q3PzIgb6~_^&wm$uUI>Y!3qXh~)VFs#7;)IQH+#J>l8l#u z5sRbis|&!0!@j+Dff0i}2YnfYxSW2o4!l7au{i2S>%fS^e!W}4h{3+2fSz`!){^q; zoxW8Vu?0uR^KvlauwU;cFk-MbVDASZE~j5__6x#@#nExK2#h%F*EJ>W}A_!HC1YLA_rTMw0PL zFk*3ZTzwdfIPBZI6^ta~N5F`|-mnX96hh)?5eRXG`u3g*MjZC--3&&O@!ep=;^=t( zB^Ytox3}#}!bmb+3`Pw0hWiE(5=YmA5Lc*g@BLuJVc*^t!ALUh{jxA(anz5F0wWIl z_6~uOWV{uO80@*(BOoM>3SSXIT%o?b3&4oOzP)R}NHX3GMl6ob&tC>34*T}r4@M03 z9P|Yc;&S@Unsk#eVsX@u=7AB1{d!k`5raKP83rLPr(f^2V8r6+c)k;iIPBN^1Q;>c z8?eDwg%Fq1ueTSBSR5T!hl3G^{d!LYBL;f|XA=lnX@~;LVadbHdafSNh`7SWxuy4>aU?dq&`kF9eadccQ0wWIl_MQqxlJON_ z#9(jOZ3iK7^d}JF3ia)sd5bXOuy5}&Fp`W%z=*}s@q9fPaoD%_elU`ZUj`!vd&9l| zpM{V(It7HdLVbHTff0v&dv6CL$@m#CVsX@u3bzU)4*T{l03*rxR4`(&=Vn)ckU07w z2yun__Pzi{9QN&<{&is_87~7PweyqwHv}UN`}ST1Mw0RO!HB`0|Gof1;%N45LWnEW zxA!n1e~$qnadaLCafSN!-Uvn< z_U(NTj3nbdV8r66|MuK2j5zGudn6c1#v8$i!Jhwa1tD?t7zlBN`u6SxBM$ra&i;ll zl8je^5sRb#do~zx*thpOFp`WP03!x_{`)criKDr92qCUe-`-VV#9`mw^T0?lz8Q?v z_Dk~LN5P20zP-V}3M0w*U@&5^=f4|3NE~egA+Av0-bcWQ!@j*OcM2oP_&_jXanyg; zfDwm%dpCiRWPA@8G1&9p7eGiH4SZ7wafSN!t_C9x`}SS}Mw0Q}V8r66|2_jo9QN%k z-zAJB<0HX{!JhvPgOE779fY_-eS4nf3t^7;)IQ_X04IjPC{`7DvbPZZP7oZ|}_S2_wmPEf_J_8}3^`NF40| zA+Av0-tzZ_5r=(yj{+mf_#!Z3am>G3$7)i!=f)Rr~|9u*S#8LSNLWnEWxA$N$ z;;?V;YA}+FF9IVLNBwsz7;)IQ_dYO^jDHVC4EFqY+7E@0I64M|xI%qNBM$ra-Va8S@rz)@ z;;8?Y?-xcK_U%0wj3nbzz=*+~|84>yada05afSN!J_SY`_U#RREQ}=M0WeZKBFTSG z0wWIl_HF_r$#^>$G1&9pmqADzEqXu*afSN!ZU7?=`}ST7Mw0QPV8r66|F--@7;)IQ zcL5kl#v8zh!Jhwa1tD?tOAz7;_3bS`D2zDl+q)EuB;ye>Z+j}7xNyc}95raMd zeF22T(Y&7uA+Av0-c!Md!@j*&f{|qW02r}2`h4^f7;)IQclIN~NHSgnMhy1+_X-da zM-PG!SEz6AUNGXYZ|~fn2_wn)bTDFZ)PFAnBM$ra-UCLG@rz)@V9$U19~DC4=nN3z z3ia*13XC}H+j}1vNydA?h{aL=o&9rR#9`mwRbV6;Zw4a)dwZS`Mw0PLFk-Ohznefv9Nh;(T%o?bFM$zqI-c?{E8E*z77Dw;Dw}26ceS04R zBL;g8n*D_k;&S@U8UP~}NB!tHFygRZ@7Z9)V9!yufe@F|ulE5kVsUglKMzJ6_UosgRYAD~5D)tU8BO6lNM}F-!H3T7XbOi{BqnklU9Q_c4)LNo-?E)cj zl;16c#L;vR5=RGuklM0nU8_Jy91VkzT0_4g<@LswK}Z}u4npE6`&%I-juwEBS|i%R z)gUB}E&?HObQ1`PqennU?aXLhFMyCZn)JL7Qd=6$bsz|dqg5cJHnkS%!%IL&9Ni5< zYE!!-xt;|faa8@C5K=og)LP#8~1|hXf zCh+aL8id5r;~*rCO8+Z_#L+PzL?~j{MIa=O?gb%n^dbm}qy86#5TS@&8$n1M-3vl$ zndq3$|3L_eqvJqGycySnkT`k~gs8yCh&u8mAta8rfRNgS(LTHzgv8M=K}c#NE|%?LTU$RTKpM1zefm(qa#2_9Bl+4ar9*nQp-o{ zdIE&R(S%ookT_ZdLgMIj5K?Q6_QnMuB#y2FA#rpY2#KQ~f{I0U>d8CkPRWjE&!ekT~j31-e&C;%GGpiKERRq&6XH z*R3EVjvfOcar6QRiK9}B5K>zdt?N(_5=R?ANE}@WLgMIN5K=2e>-r@KiK8Gbgv8Nw z5E4g=K!{Mr_vMWsB#v$aA#wCP2#KSCKnM|vjEz+wB#tfwAwrQg+btj@j&^{MI4Wd> zkT^ORgw&Qq>skpy;%FlXiKELwNF3b)LTW3bb=?m_;^gv8P5AS8}9gOJ*+Xk9mh zkT`k}gv8M<5E4f%c_E}WJ6hLl5E4hnfsi;l6NJRkW)M=F8?Eae5E4f(fRH$v*(!v@ z(Mk|fJ0x1yMi3H5SAme)1<_o$fsiofRH%a z3PR%Oeh^aoNVJ8|f{-{W6oru5DbZZBK}Z}O2|{Y!(OerqNE}@bLTaZ*bKL?$;^;vT zQrkb8>v<3oN2N9)q&6v{}B9Q_G| z)T+_CrnCzoakLnO#Q*p6Q$a`^Z3ZFn|8x2KAS90Vf{^(C^g6FY2#KT9K}h`nm%JQ= z#L+zw-F?EoQhvNv=)TK(H0OA|DO@=1R-(sI0%WO7ePoIl_v@z@gI0U7=*;p8W0ly?b#25kT|*u zgv8OUAS8|+03q>TLfi#H;wUHyA#pSbgv8PQASC{qZ%2WUINAV0;=d)d6@}~sB#st8UZ13bTtTxqdP!I{F^&ZgOE5XbqgW!?+f&UkT^OLgv8%+3_(a7T@6Cw=pGOf zN4r2s{GFSQNkT{*9SB0=Xaxv~qahFyf4kr^5E4f>gOK=Vnm+^~QPlU%`uV9;?)(E& zsZ9L>LI)`{xa{XGAEccg=HF}a@3IoW(q=eTU?AQQH_H*O(A=S8Pc2Pdgx;TCU?vwWI%# zV4yo4>J!{zPsf~rW~g({OdFcIU}8FK6AZs4vn%u3`(5G*3ySHmU8J`-@U2|i&g`s8 z+s;&8W~N#uO7!pOqf=S+Ps>}2&B^{Or)f4)&nd%8U4{K)4Hx96QdrEV@X+zWJ+}eyP z&biTsX3Y6qGpb|Gr*{UkcBcCJnthr}ee4sdfIgjeKp}OmOx74IRf-c*8g%LUC)9O? z)^|5L(__tU>z~!#J@}Fu*R5lrkkVs=Wb#m#npkd2S4(X}Wd+;*N~%myEoDrqa<-JM zgxyM?Zyu`ki&bkmSIRa+`AWI9S}rc!-lFT#TP~Da^QON_S#wzYRrRoqnY#G%qv4*8 z#aE1-bS|hhlTVp*UNfZOd6o-y&RJ)R=qWDfsFaKOQnA?#udX>qG%K2ONHclIoCBJn z&chmN;AkyVT+tnKI$f~yFwF_gwpJIMCZqDP+RI ztC0lUkwaUqQOY+ubNS3!hiihW zf1DJ-#*)JAX>;hvH7c!*a;~+0j@bBQ`9`JCC>Kn;mp>hZ({yFc92%q!Q(N~}TPLJ` zQOq6N7Ub3G=HK~idzPG5UH?kU2^kmnyYtrey#BOxwY{20PkMVczwci2Z$fJA%0BEq zKp9o6E$bMSRa1n@={c=xiqYx$Dx!K?&v|68?cIA`YVG@1_RUK7bk;wGZGT8l9ywIE z*K}Reb1^-%ha1rKBI)kBdNr30MwWnwG-nj+pC-lzKSS;r>ESnVZ{APIOh6GwxCj$C zBwY>viClI4ylAoSH4+G+L&mM zy7hO5`>2Xp6n3Ob+6+uHHuk+MJ&di>=ID+*5KQiGnPKC<*^FP1tDn}I%AI3RXDpc1 zU#$I?x}Ise*o>UByKlbk*V^&4rr?#->KugQPSwDT8|hc3rYklkRasxoR?4|bxv=o{ zEw~m9FBQVHhCx}gRP{vNk&33(i?rfMrH3i0F(+N$r8d~koZ>oD34hH%{V$>F&|jpc zU;7XJKU4RdR?3~+>^1%5ZE^Lu%hFwL>n^vayV|HoF-b+hxIRWc}i`i_GUzD zS2jKTMm4j3lSsKk(Z5u)nznU>1=+Uqh*|c$p-VVA@L!o)?o8Kp|IC#-!_TVy;l66j zPTkto?QP*()WxNC1=~&V$x=bxQz#Y2HGIi8HNo#(todsE)d>$(&OC8rSI5Mq%^G6- zAbe62$Ki5l4c*ka`a4#CKhj^j{@lOE6qv6+?y6lnzFzkS*!QHYM<*#WE4cNM`2J@6 zI>l2y=|^-tTqi6C`A2-4{?1TfP=AYw)Ia=bW+s)=NGvsdDKnrYcD8=2x~tE)*kAFj zz_?Wqj`OIDiOQI$SMj54xSw^Qxf=Ap*7Yzh^gUh7#&ldL;yvR|n=bPM-({>n*|v0*8kIbyq+2!c%gODZUQSr+aX)?j-TpX)FWF6GWrXQ{)w-FJ1Z zXX)g1vaYdjsdI21bBv885%D(V^Co4pUp}gnff=PvGdT?|Ql6&$W=gX8)AcJcuG2iM z82{e!3ytsc1lx#-rHQ2p;~Oz?eBH2U-4nut)P?nC-4h2_jy09!z|gd^zu{Wr(%N!TOH<3e@?a}|i758iXVF&-pdhXX- z+Nl9~e^=_2N$Rg@T`l$)7`ICshih+bR9iP{U6k%9G&;Ich44~*eU`e*dgo}esWw?T zqy3D|t`^<7M^kpC>a&%hQB|O>08fsMgY=X*XU)QosWDwGhO_X_mvhx}wkv1Sm9le! zN`GEwCVP6a*7u`ntA9Q1l<{dN|Mj$!`=)3^MSYS@{ZY-Cqdv)WFAuV2cJIt~>iL$r zW_hPIxifDjJkvjoaz?RtY1DP*I`dVVE;zpTl{}Nu&}Mn_kT#BrTE1nDZ**tkq%AnU z8ZJ}fO!Jrvb?+?Z8@ap*K7oMYDhjFE2ck!GPZ(9)ObJ+`|3#Fas1{k&N{r>)N% zdvdUPT`|{l+Pt9Wv|=uM^qdLl+|YKl+ANl`xwmWoB$wK)!8cdsbQdeyy{YKoJkwpy zc9(PA<$QO!RSULkmo9ZzzN@t}SN~@`*Q`^6@JKbV@=8ltW6TBHO2vV8d3I;Et5E-n z(w5r%b1kqI?xztQgl|>ua!1AeOd;D(p5F8i9YG$!czxTF461@qMt+xoj& zt0%VWA(?_p?RCu;xxd+#_2X^pf2XWFv6Ru;OiOCr45(s!U$hMz;-zn>cj{Wob(HeW z292vY)^o)HEd>`n!gG9a;4RG#o7l`g(Nxwy+xFY|T1em$s~(%s)-&+18hmuK%S)pT zFWIv8kC$bWjAm#p*`(ISfd_Xko~7r6qGtRrs?#-I%!Wg2^Q=|V2fG@UWp!P(%x|9M zUYWXcL)JKG)-0~_tp#mZJ*msAks3auWAh2*<0@Ijs_4)JvkGQyFsES71eG{^NqLkq z{F6Cm!xzjk7rv)kPjTFKh~i7Giz4jS1XRS zsqO)z|A^Q6FQw-zGk>%8ou8Kf=`sIGHMUQjePiw&dOj~16n;S@?3bT!E-Sq@Gshwr z=f?B;wW|;muDPKz(^~l~gOp2Iu!BF;-dAz{Q~k4Sl6-4trf|7Qlxxi>&$tMaEBNHP z`9DkNH0xbGu1!a%P4m>IihR9)emZ|mkiRCAXO~nd>zC>O2?jR#*n5^Wh6Rz2>ZU%i@k; z{8>3u80gj==pA_y=LUjF{Vlqo>|9&Q3`}%!)&7=AiaSOFBX73#+gmI1qI96OGIunt zS;~~0d5k?|P@5$?i{`rbt4U8*`bt^5FRQz1>dMciifXRx$fO?EjI=;@1l`MZOUZWY z9@4#>331_FB11n>$F!%-BxDTj=wDtiR&pC{HJ3H~U)hnLGH1FzK?q+|Sckuu!_fDX zJN&7nf7&?s=Ljs=NADYV77GnMF_;FY!=GsI+A0^`t+qC6&Dyre52%R^`rIL(6V4Bu zP|7yj^E(lFplwUmwk12(meF+oH>wTYX`dXlL<{-J5bC|S+KA(J7aBQe(TVMGP9WHi%4c2mDjOdey+^Sem+c0t>?qc$(e-b!&dhc*j$;JXKMQt*jmcxy8`ZQyc&jxj|EYN(Q73((wWvU3%ibqd#5M)RstmL2+MG+#UL(9{#cJ`jF1`*{9}WGrzQD z%>2?=Wsk<`%bEUpnn##VS&VBtP6Nx%H0l^L%OrSq#ty1~Q-5W2hs@ZyBr`UbsMuw$ zSgluBTWQT}jvAh$Q_4WSq{Z#HDlJnIGqL5yO(xAMzv5S!H!iCsr5&bYYaNZsfkV@J zsMnLmS2WV~A%I;5YFCkEptdi~lElx^HZF%22S2t8f{Yoq8MBC}RI=+TW)abwF>8q4 zRf`I|+%TuUQhCll zOv6cA%k`=1E%v+X(+JGcR&aefA@ex|<3(emln%O5;eakyBc0Q;&?}Rads<%m&%r~7 zD^%AmbTOPGzKzqqAGzK4qBc+J-%$^whfMIh1S|FLap`dV37> zwBg)UDwqB5x6)WP!R`D z&!oO|{fEN25Vaq_>r>)%Uh(%SX5&O9)MIg1YcAycEY8Crh5BrS+3m1tO|bb1{`_%K z_L^!+PU*9eQqY*4X}m7T%&7(Id-OG#_n)Yb1Wu4Wxl6P9Fe!T}>$q^PE-Lxb=9%B* zOG?eh{l#tMXlSWb)o?WHDSg75TEzGnUZH}+1C*$(zdaw$Q=l>u=2BX$HFS*!ezVg) zIhy;0x$P9S;2M`};a63p&Dc>GCg&kcWL2%a!V~mjMdJhZ7@n*X-K!4QgrcXw;#oZ{ zsdPD)E)2h4dF1OWc?;ta_1l0hAFXP}h3^tD1rKOnKeLmYooU)Pc1|i~H%^y>>3Lw> zrwE#irsZt0m;Q;aGPl4&)tFV4k>oz)D6={+PsPTz)f2gY6XtU<)t)*;{b+l}wmUE_ZcFEL^`FZevrcCXd$ZCm=KAso9qv>k ziv5#wrZcwD&cO7_`_fwuQDof0|Gi8iX?O$vWIZ*UFFzW3r&=+>NNz?hP-Jo84}YuF1A3w5H##;}wT9my_iuEW zy~S0*#H%w$S3kTT)0n6}YESE#MxVLVcc?YG24<3rEUudUdocYw?t!z<`sf!^Z~T>8 zR}7>c+GFRh@&U!vH)JROf`%+5W}AGPil$p`sQ*?4viF{==k&~_F*8jz=tY>+8=LcIV6PA>O4G;1h5x0NHg^Q_ z8xPl2ZEs!lGsU%rfg0BMyVg)|_~jb!w&(WD-ijN?I!mh7l9QBhYSWUyeC#75^0sNc zlWhSq!j=(jY^&+I*6`12&YX9+k|*1ePy9bh);P{xy002)Y# zXBAA>jiVeSpA80|HxVx>TX?XEc+o^K9K(es;$;(|=NOlwrAiskkEO_)2+a~MONWVg zVJxC-B1SI-A9tzlDJFLGl9I z5W{T*{jMz7`Ov-^Y~!91%;_F+Yk_H%=9$?!^O9$yC!MROX@MM*L%OczWv)J=40TP( zxs-~fqY{gKS*dnTn59hgZQY!vn)icL>Sw9_{*an5q#?|jR--a?nCT-ff4a^!A9_}z zcR}msdeadKQ&dQUZBrVrYX(A^>B6*CVJ=okGtHPj&5c+S&=5Y|MVNph-s>VvKoMuS z2oq4m-?<1AP{cYHVFEw34IjwcQQVgvUN2t%s60|{PT0u$*YjE>5N|2YxxtlU0*ZK_ zi!gyV>Y>n>9GFfd$C)mH2`J+IF2V#9p|yr}P!mwZ2V8^+DB^=I!UT>^*Y#$DUewZy z9>tMCn68O?Pq~|Uc)YL9)>Ti}**i9#sQ2lP3kC-isVDDU+#cS@=#`m8jUBdun{GAl zuO%6EeZ929g{S!WUvllZKIzP^e`P!Xblh7iP`qc&Hqf_K{iPczDcn;4pGr;-6{LJpY?}Qk*9H?%qpolfCZLE1QhWZ7hwWwls>%FfYs-6 z#gVIEx-i;AlOe~_9$gAzgL*3$=G^8P?@P$+Wn^upejBM(+(Jg{&~ZAeA5WAX*_Z1W zo-qDo1t)6E+c~lmVglN~(PmE3ZrkjmRSHS;ZkxRjCh)~{{Uj^24@`{Zt-5%*yto*TWivb;%Pwm?_PE5_ z*g}q{Ju@-wC5f?jCB{CQ82fx;Y}=HiHuNOM9-J7vEHU=f#MrA6V{c20{b6G46N$0E zPmC>0O|orKV(iMq*ozZmuTPA3%5#MtK&V}of)?VXYsJ2x@*)Wq2H5@WCQV}IM6 zO}gt_aq-If`XwBL`Zja0AK3mun?Uu?6H&hit=7M!gPwQOcC$tIJMGbaS#dkHqNr-} z;ML0J^Rzy*E9k>U{o}orpX>N0-5a}$bv?}#>nBUJ)9^~=e5E(rkoDDyD(33%)S;2? z)*|oG+~C7%wYf>#=!xTF)+nJqu=;`~jC8I#xia)FMT~rr)ATThp|wP8GkmP1(Uf1Z zDLL4bHxe;S`pWw7-IQ+22~VLMJ)x=|zq=~yN4}!yzK^GeX~yI^ZG%s!#X~o#OU_Bx zKTD_8FQ(7-OHVN^W!n8JS(uqkU>4uq+C-W;dMeV}>6a4b8RR1M*%7QK&U&{xsTi0; zTW&z#4=`J&`ffv|FVlRsY)s>0!}iv2KTYmE6Bp<^Sgm27!VQIT=DT8f`;D>p$ePA} zIrG+kqcv~d?H}mMnIq@F)>Sv(G011khtK2oY4fQWnN;e{w8@(IG|DaU7D`1ir^_gL9;%t4we5zX0-gBBccJzNB7v8FL<<{$Z~)aO&{=j~fax9Uk# z8|s%SiDiDxx$riTbe-1C|7c#{Vuqi~ZB}Qs7(# z&pMCCg*Lrs-Zpf)(%BjX8-fG>q5a{a-5=KLoBDvN-R_@iYlT8L&twBS>(1DL<*o6K zg_|@E3VI{cEN-Zwvc3|&S2=j0y&3&cD(b) zKRwKqZ)k^wqv@$;knT#?Z;*~T9~O)Fp1IJ(p| zX+f@3E_d}W3G|_aV!N&x{s=qva1+Xe=d04nycs6hWRt{Djf2Y#$v{eFSyL{Ro7T+# zoQht2t@=7W%uHZQK365%xnNu*)tN|jPnY`m-MS84_VSqP&|T`beLl$rD&2axjr4i9 z?ei)Xl`5r4rRr#(ca8P=!oTnul#+Dcu<-W;?M}T0UC9kP>I~QE8oPn^>sJ|QqvLfS zmzB}f8?IO0aD&8L5m(9+uTqNbp74E2pC0Ctnf&AD0o?@bXBHhTeFwKpQkQCf^`pUz z&j-!$-NF99wqfSHN~OM8m&Lr3*WQv!y+!kjytWb;x2T@fnXO+TUO!VcPM$Kw%=5*X zcG6O9`JwkKvc1(z;2i~ zlS@HhY2eRhghMIk4HA*T;HvIoIE=9cfpLdRE2ct0%Sf-!1@`0%Pm>J0sTLVx)T#iql@mEOkW&N@U99lDwR z%Ec-CpM>$_zT8=F5Z7Bia;`s*rqIbB$0gCnn7Vap&JLd+OOg$Lr;~EKzK8nvt^p+Z z@6n8zocTIr_+eAgHu-~Yxf#9BeGcjATTX`EiNYUIxKU_!yuO)fdtP8fpq$T?@|91U zb}LjJ4NV>mO|cBaF)FWPTjn5GXN%3|?$nIdz{Sl>@a z_Vu)P*DY^mP7ZR{WXybQH{i@;%KWFz%6ZcI`ZY>n=DtkoUzPW0GxvQ#&dI|3)X}wQ zrm?R!G|}ym47i?SwFXI9}LpNU*U$w!$H43 zz~)&YYtHPQBd}5Re^SBrHfaaB4Ufxg7o7TlP4BJSCocB1TP zV8oaU=j<1X7X>}-ucf36W5YVyMjXw2;XLS>@Hdx{v;LXoCo4w%lan$3%r^ZquoGi{ zK4|)9*7|2I&^^O?ph8XmRH*5n3XS@wnU;Gy8ixiwoqux^gTg1**~EpW2b;;fx4p6S zH5H?E!szw$CWMW6cVl5N^>1%dZrj+5klV;$Z|Kq$UrPaG3bg|ux8BI?p$1HQE&0c0 zoZLnx9Oa+LEd`9t>*Hr>euG4x=J5U5=6=BB1&7-i zu(2pT%!bK~_4DW2skAZM9$oxN%}3bgylNi6%}ly;TCt~^t6ieWZ}2+J*@Guf*B;Qv zHTv}HBKpd^o#Wl_wj6tGYMO5T`i+rnYKPjg%(R7hxuJ?V+6R?xvk%lP`O}E)k+BvPQr<$*Q@l~?%v`99Nt~SCur?vM~TWeo`m25mZk!|b|s(Xa+ z&S@Pz)k5vtiP>~}OSQaSqNktkeXQ+#dfUCig+G+){)7wPoa(;UhG*D)7q*{nRvl*h z$pmKE+hA}x=xYv{fFf>j5hkFYG%&k;&7U+7|7XWdK&@hL@K&0qe?dcUwXz4+uYCZn zTXU~q`m5{}blXiNvt?jDlN>nJ?jO_-)JKwhi~I%^Qh&WpqWcOqh4wT^F}B@c)0&q< z&Boo%u37rPS6_+QS(vpmH_QBBP0+||6Vq&Ls?9AL%$yN5*_#zz#_WRJ;IHRc|7B9At3AgVf2Ql~ zmh`*TuiADPHKQ#(i~(AUkwzm7QvYYQCO!NO1@pPqp}RPw7tZuY6&*|j}Do%z&F zdZszv^g+7$7^Qvj)I0PiOZDaIRBEY?dYnjUv6<37Z%RF!8qhJT;|==Ll0Ee;oqtcq z*DL)`6`rl|oAtL+e}nq_t>XAAiZ7fivE5o+ILCz9uNzXm#Y+#w+=Y|JVt2}xUfb>A z(+U?CzN~Trb4iCDH4%EeaS{JJF12ogO8vkXq=GIDLTamjLee_)U*pn0XVS}URhYJ? zix+2&CnZJIHYZyp&mQ#W&m z?$z%IeXh4!%6+bPaw-40-YKQl&kboiqIl`YOfPheR#fF{w=Grk-f?lEUV&*g;8GSE z#f8tBh)o!W1FSsV20God!9ibJ6p`)B&G_R#tXnWAUn`rzcz z8!v^YnC=|h7w$Ab6JRm=`4HrL} zG*sp{DN{bk+r0LltzPrKnZ@i4*)*Fdn%|6~-9(x8uTu-`EI^c*CrniL2vcFY+fJ0- zb|UQ_Ay40@+(cc!8!IyPdpKn4_j1st@phV~yWKq`=7Sp(P{em!gb66(UKe2kiukUJ zFoChx+J0m!k~>n-52!%42WFPQdhcBp``+0Pm8kiWihU!D-JVPL)nj%u*1kA)pG&5D zO2)jmM0w6a^A4MRx63r)ue^0-+GbzmN_t7fHd-d?G1B&m2`J)6F2V#plOEQC>A07S zu*1G&M7*W+?vGtI6VM9_+O*=Qqs+ZvxsKh8>-al9{YvKE@tOVV@A$BNU^>d)YU*U0 z|Bx$xjmkek<=a|gwT!;TbMULZ#-o{f+ga4{2Bp8>bC7$M$3im6sr(^pyZSH)O z6EyY$qZ?|QmpS58#j8)srv6{uK!Fx5s$hE6HvRDn`%0)G~?+vDu(g2MP&{> zrIX%tUCWM~S(0epv189qs|Nuy_L7)Z8HQz3dIKr-4pWELM>+jE=rcN`>%Wt#)670@ zW&Qm8;9=_C{;d9Qj?@SAnp6|NQaQ+tzqWiOZ#LMcoD_aerE9al{!Mkb9hbJRz4pCQ z(Xfb*UDBAb%MLSr-84Noi-?djwh{fY%VMhjlF+!WHmB;@pSzwl0YyCKB22*b-73=u z+ITVjto0`E>ec_O^C7bYOxORYu<38@rO-+EwYAI3JFZX0`y^?MU2LvnSF@_X?6!xT z@#Y71y+@ygm`A8FsmoV#eQ)7YlTOQQ4C5r7x-B$iU_>942fYdvuQ` zoC&uoN!C2=>8C(VT$RVAVt=natC%wz&W77WY*-)CeR1?;@GW?ou1GPhk8D1w2Jx@yJ+Y^>A*e%ra3chTyLA0&_RHRq>OavnJs)_7fT3CSQ1yGU(H+8I$?dDE;c_GC2H3gssDDj)Itu2RnyXRHwAu@%A1P=x z*QCTNh{I1hGfhD6U#g?@+Ndr`u3nKzq|u&}z3-ZU7A?1^aMp-CgEn8c)M~jI`Z^&q zm&#Q0Z`?{l-cl$)#&u_9u9wA$80~wG9DZ3Go70;?aw-f^%0b2>st=z*QX2(~CKh9#zj@6=AA-bXt~ zm&m@4whxBgQscdMH4w-SZx#HVfg24T8P@!B28 zjhNmtUvp?oR-B5>x$hR_3AakL&{a}VZ9wEg{l1I7VQ{i7SMUCtp6p8x(^q|Zci(n! zU|PbMrlZYcjtMBjB;>ir1QbErObQcF1jE2Yn1CW^v57DNMbK;$VFHSvpG<@aD1r_$ z5hkFBoQp64y9UuUNu6x23msX^O`TKC^_1sy<$5Y}I&wYjbF}41muN<|qqZ+MWx-4v zH@H}%W-2dy6}2;2F@w6#C3EMhm%*-;Xi%S_f|{?1zfrZ(H|k>BNE1+my4yyWfFcSm z!UPmibP*RK%d-AkpuXoB z>{WhlOFy%vYhizL%l+Ke+f)iaw`K0R?^piST)T>?eyA$QPpN;4Q6Gfg)*+~$rbvAQ zbsoQ>dO$8e{0$iuYA-FP@EwHzjc}+J7IO9P>Mk?TRzFvlY3Pr-O`N0mGnXrWE}SF{ zA19?8n(yk}pvC<=Rd*2HO-^bl4z5(UcQhU4Y59#aXQypBRXnWfk(%wb!9A0WG z*0qbMUzSG-dPL~W@$zA@w;F1%fWvp};a(0E-bf^JyFGkQhoSFF+QNU6w&#ZK)1jjf z{y>LWt%ZEGQmKY|F4k76UTpZ00%4I#D&hTve+{~^;RDG zv<_zS)Yk(a`lqpz$q(sv`p{#eC;S*kQ9s1QhFpGfb@LS>+LO!O5I!iN z-?&Pv1zq|23i|dT(zf=WtM?W3U|sCxXMT$1La41Qy%4FC1^wP-wtk}0rkmlD2s@zP zml_4{90lRelwH5*eabkxW?cAPz6b;)X-)dbYk1kVcMWPls~Xth1=h!wS^DwE4R__ zIafvqP?z3jJVCYjKLfIJez~)!TI#I*Nh5!7yN1=^NA`6eX6c>F4{MMQU7~E~jJ^1! z@#=n`b=o;MWrs)-_wc@6<=5Q zGrF*pLwuV8SLsi~&HUrLJ;_buHM1;NLF8z($H&T10^FLeL^Ty zI1uItm-Vpc)zr?J?BzVR0ivlfm8CFUtd}-ju6%sH_3KeOdp2dZ3)u z_rW#5|5MCf)PY-f7RS8>XIrx5?|EU1#~zK;{<(VZ=2rx@nS8I@T7&Z$oz^=kxyy?S zC+G)8l>FD?13%c=*_C^xqWNH&eaB9}jioh0TE7Ok;-l`py3eQH@MKCQF@FT9=XHFS z`ebOA3MlIRA8oGmXNR8E*>YYe(yvwM2mGH?puN=?q#rYAt*?}2jcNAxDhs9w`aciq z+H2?!cPnYXe$y_zOlh*m>nmKC-u#h^+sFUNg(}l-O@F8dV!pb)LcR1nL3J1}I2FU+ zODf_2NXN%iO$=XlAG(DO)(f}7I9Pa(&TXUg+edVaifk~>zu=EwO`f)2rlyWt=lbP> z)VqIahZp^#SthlXetAI!(=S~#^?!BJ)_?-YnoFxmRWDPY9#>u0Z5rQodUsNtolccgAHLMKpLMNf<8tpkQDiRslfv3I=I+>N{v>*S;}(rw{h-PWeTQ1OQJJcH#6RK38`NjBD&_o+L1oU@ zZ`7BBt3xaj^&R}#x}q;r`~saT{1?Ldb!fu6i5K-ta^e4D?>pe!Dz3e+C9R~@7F#QO zcU>jh*uK8nT{mpx6~#8aHv;|v=BlZAcR0d5=ufzA)OZTcp-VT z03nb7A*2yP67v23XXf5}bXPL=d&&1D-?M(YcV^Ck!e*OB z_F)D0s6HH?kniY&JD;0%OuFYNh(v|YNH?*$Sw6TTTV$oLh;z=;E4OE?g5N0a9%rqRBHbI1FtI@zz z(36CTvz6&7z18M;vwI#~(p`4v2R zmYlVWj1oqX(6%sv{KoSmz$t_dSR|4hEE4N*SS0Y!g$WcA)_^TcplGn31Rl+_Sh*wN z&d?3UaWK2#Zn6IPVX%w_q0J`@r-cb@r^SzZ7znMt&j=}ZuJbq!`CN)x(ZsW#GA_EL z#Y!`5nc}wi7!54Z8eBmuhx12G4aKN@B85qv1E6bdz~4=%kzJJn46HkS5LBaZys;r&Y_?mB3L468Nsx)N?OV|s-t0A#sz7Krt<7^B_#;VBi?#otg#8h{o<&Y!>Dw%poBOIdD-5}6@c!)_7CzTbmL)p!0OtqcldNFOW$>fLO9YoAd>ss` zSuxF_BA9lj(u!uI&6NG}ERxAQ;-fQ&gP+O4fks^vif%RD5ZM;xKulCFN5KKJM!_)| z$QGB^i$vvXAUDgsvx1q3WHE)8Np=XcIE4`>|4Gr0L?DY`{p_XcLsEir$U0BF=$Av2 za}MZ-i%#LlwM=C+ZkgiJWCh!H2j?FvvNOHg3{t1I=2Qh|yJjl=l1OwFapsLx^X7^; zhsG-pfQ)a8)u{coHAyr&*XkU1s-M0D*VQ^lNc!@WfCdlg!-)*zVQGm`p_d?Dw3zs~ zQe_^jID`go>zT?nuv^vsQH>P8ZnZkIwyKo_{6xv4mB{c5WJb=Ub;!Yx$_C5X68Skw zIOE^ zWLZ0)IMVaV!C^GLskzbthf(qr+jER}m z4pbTK#|!c_=6px89~@t?2NbD-Rv&vM#mcueZ{Jv4PD8`Vh|j@2**%h?CdU)QT|D)q zw=ZTfmR|=NM&);eQMrNs+?X`H$vv8Olr#6kjDm@IXq<6aL6ahTgDtC?7d@zTDC+&$| ztg^Zu;-s*OEk?FD+KeaD5_krj{6Y?MlP@gpU5w&I&W#vusTMK*i9-BH7y6obIhu*o zV(1_wpzjJocQacGoR>5bRZ(nm{EvGJhF>ZeVaz1WNi)W}kPpXLPYJB-)Mb(;0o=W9 z4iiuj+z8e#_5(4SC&`|-xVI%)ebkR34oG#6M=Eldaq8JFmP|~lya(qJP(6v z3HLZquui7cd9}rHj)kst9?dPWzCtJk6BTM*mx{#Q3Sz@((u;hKEybxAwU`DgHx$Kk ztvFg<^bdw8AWWlyi|~mNQ*ocfcC{9>T@AZCu`#vHycQ4l55#ZkIm{%f2g?8hedF3L zI#vKcW0h_s0$aC?_qRaCXPNRwb!!VCR9d=sniY0>g@b*BiSq1vabq1vazI;2!8 z9o7JR-;T`$2HE^4UE)hY&BGo#JjdO=!*dtf30r0bL$1`AsY>@Utq8;8xe&Dr7D zXq?So5v9B0JQ3XJd+B62YD%Fq+o`hM1yNmbX_=Ew>L^)tCq*%8||p&)skf@=%B#(fzGPO~%`ahu1{wRmnj1&yq1#ZaSh zZs=%sZZf$s>Cu;9SP5gL)ftoGCjdaRT>#DM&f*xE9fL385P59rUnjJZ$k?48c0tQG5%@OGrr>FT%e7!VO&D3a9|Xzy}& z4pb*^p1?gE6gf4Uhw9|*VFH<+WkFdNx34MaO|qLvLH9Jng7RldH<9AT;FgiM$vWlr z-i-l5EzC3^{j2bq%LX+zI|4;K0_C*j&S2`yO)Bo&oSkGg{7M5gxv8gsgC-~2_Ph!E zFNegllbfWqmsY(v&iG49UB^E=2_hzCCz-PuX5QSHn^MFxnxcfbh{2syk*UQ*Kilwh>==x|Bx_Yub3c7j$UA-E*`Yd!!Gtf0XixCeCUG1nZC*vZFVTQx`CXk~v zHGr=?sv*HFJKe8_Pf^8nHJp*1VX7h4o;a{eHM|4%uG~yNSyByWWoMxp&QR5GR!|LR zvKnrRYG}N(o2qI!OS^(##VxS*3%R)XDPNtkMm8SYE|bYKgg0wp9HUux7M;9C}3GqI9-2Nl~h)$>{8C1L&6W zuGfV0vhAA)Hoh-x)~NCEn~7WW*QoyIb&X?N!iZoWkJ&Q|u^4{dh= zW~$M(z2W|2)&XWkC~7fV9KGdSFxduH4R=`J3Ye0%VorCv$ME!G!@s z`H_y7COLN$FWWWrFT#!YPA8Ty3H6NdvB=57Qlv9GUG@7ec@gR z^Nt9;AMsy^>)W8~cuvG1^lRYXuemm!<#2Oc{TmVb^KfqidLdKGzW{D@6P+P=*U|A$ zg`49eC&Sd~{3E8bZ$x^oQ2ZRr-xj?5C3?rl%*z2gpZ4V4p!-^R2$0~#!Y*um2E@bp zs~b^H7*Dq6rOT0l`1(5EJmh7gHQkFrnpov#5ai5eyryh}HvufWkm(uot=XAr8Gpo> zr}Vaiq)1;`1_*O0OuxzI6ELL_7;&%*g+b<;Z+oQ8$_0$>CuPi{O;VJzXTGHIo!hi@ z|75Ga9ExO4T_1ud&HEmv&wEB<^4%UigyR8>*o+Zt=T^Uh);et}T#KIBPE}?xXRXDp z@tVk&NI4Qb*VfVIqB*c4+Tq$1Y$g#yG5I~zqyl4Oncn7R95nPCf=)&hlE-@>thJ7? zpp_j~9D&K8VbaXnpu^B;;yaO@(_Zt>Kk=MB2aKA;oZFmTerHrE<_sOO$6|BF4A-bE zz;oRS&odSdZ<(=RMKI%CnWW4)PKt#Sjj(S|XnU9%ME!`#cT0{(e0V>{f}lg-AtOsT zOy8}-QGixE2OOPgFupy^$&UBOGh^Ie;9&kITj0zPKDdWZe?VGGs#+naV$=htl2ou{ z2UD3l|jjcq%P_34R65-F-QgG!8mI)cfJ!}24@WR z&9^b-HF|opgOocbKsJVqhIkk-ynt=O5Kmq@alDK9C>O>l_%Y=Lm=)fgRvxkSJut4A z4*((HCwnGqQoD?i%D2a`P9<60bP7i6FgumuhtcHG-wX9tUqVQBnsa-*&7$m#l*Dq3 z0%ls8!hTQd@V543PdO1*Ve1)Gte$b}@N6rN!MDFyVF?e>pxmBj&OA3~p*I%~#N6bs zkp#)5oLGU;)MU>#Hsq6VpgR4L5u%fo?44{q*ca*FQzrLy;CchL6t6!#3$orE$O)K5n>z znQX=GNPKp%)vCu<$D?h|wqRZ-n^+vicWh03FXF3(a_AR~`;i1LxE$iLy_x9jUiIs1 z$B?5=8zK-NbFLinjlE(+sjZ`@w>V>fzbCSOK?ys#Vhi=6v#q!vo)Oj+;e#c(nFoVe z6{CWi@tc1sIT)__hV~|(lNyLmVRqnaotS?~yC)$_?FrGz$|Hz(vV0xRY$Kg{b2|nE ze+nuzkwVA%Z}2A}cX)$uZ(=Xza&e4omzVcz#K9xscSL}-lg3nkmh@leTjS|YcO@SK zDha+%vP;SgPBazA0O(~fjw1vZ9>b{GJgEuD zUA+^zGR0HGv2N9O0%saKCKff%NHiz+hdRZuiOIc}5Q<2mpOFDoGCK=j_Y*R6w&jiBZ=9R13_k9< zS9^Mo-gJ9fdJcOEwBw7UP5AI@#yt(i*JfkJ+K|AS`(Ow^K#0mU_fC`@Y(Z5x9m!=? zNU$p0B94)$7Ne^7h<$W3>%i+Hz$8Ojt@dN3J?+*a?}WV*q~$V0pge_FM*evs<4wr1 zS^O3ZpMBd%l)A_LRCt4+^ikF4=^;{bO(GJDzvczO{;GntPF2CW>F|TOa5PI`X`*tN z>}BcZQc~>lx!2{dkboW(j+BILvhl%J(6h~pvZd@ zOQ*+hlGl)qR-CqVA(|>Q1o?P%H{=-=_a0Q->QS&u&TVxcTkCy7tv56jt)P>T^K0f} zo)?uAy_T4q-o!H?FI`p;y-dI>9?Q0Miql<15PSsLoZLtybM0Cub3?6CcHwin=1 zxFB26Tr1O1?(}l0C`2K0?59GN2qPpQBAx zUkoUF7FVRI?*z^T#lz#(=g@sIC5LU6kFk5ZH_8gTw$h$or0{q`d9cG{LKG*}gg40N zhY#7XyD135@8%|DecVbsyC%GRH2H5KotY--40BGrxUjb48$Lx!Rk0Q`J_K2zHy!gOLc|Q=o5r->1H@d6gC|6Hlt1AoJYh{1)+H z%^%+T(1uIz3tPbX_Ru>eF5hr$QEep8ua`D5#gEP_3aiLmb@HmN=)%4GG9AcP$| zSW~kuTL7r1J!!hrqfK|(Y;Hz%wQJ_KbIy6xUlS8|&PH`P1?3U%O-l9k;wv{p)6#=g z+|pBwn`1KD;?ga|Mi(?+;F*osdRpUhs-(Lb=?1Nz;abhcXZH+4D_I&%ca5QyEsdso zmZ5EKX*At44J}Jr!3^vb@Dk%J#y6nz**;7&GijzNg z*!DGSpJ#cDir-2Td!uzk`xy?rQV!`E5tnoG+B)JNbdq4p*cdZ$WNiG>WrFsyH}h^h zvs3YG@`a}E1G*P2Uxb+OPJ!hGPh&hHop$#J0re?`IhU5FyAN2DpT4(poU(WP(w<6u zQm&~7%a1Qz)|>2n32WBT%jvufOPa9-Ac3yi)?tX)0EW__sZVEJMHt25W#nH!0(Fn0AI9o=2Ik*L^Ry%@ow zJv*{@pD>8Tuwn@`7Yi(EBQn&{SnJS?8j87U8tx&uanP*0I5aydJ9@bJ^Z?~#yXDms z>u_asUB=@~Mpe_NTekM5o_?J897vV4C_O@s*k&3^b|?yT2+K-FjEW^4QZl}tA5tK5R}x;_Ga`p5=H54YzZUVl*|ru4+IM2#>BH@ zRM#RLWEzV>COhpXgG}S%*>QT1$t>3B^5@mQHSI{|p3%ZNpP z+UlPzbYcwz`oSEjy9qjyD})G@8;@E!u_TkNNv!b@6xbwE_cn>vz0*()Iwo~Y&Tit@ ztV!9)<-!?Q6v*Xt}mYLOKnb`uz zQ|wq~cD(cgYR58jZanL*m!cKp+2V#P+C(ZE*4$V{+Zr_@P_YjmTb_S4fD>&g_sJZL z>k3>lund#*Z(!tbD$HNO908L*(sx7GdjZVLVQT)#STDhMwR>P{`c#ZlGM>F6bE01Y z?U&%a0ra7;^S9HuOYq7NoAlH+{0(hrjwEwO~*&CJH0*^ zGfl}gT=vN5NEteF1~Lu6@FO9B4*_v2zn7`v~$OG?1ND+%Kjt17vZJVX&d3RYzh=d zguQ-*V!>ANk0Ei~Do#^v6@SfcKOgSiMvvj{r)c2AHa8gOHNw8Ci0JSk-5wfEt2{;y zA$`6Ov9RxyaIhHMIUTiAj{V5Q1UfKD%g#mhI)J2mG~hu_6vL=Dhfdp?aS*^U&G`}g zZ`+Kpd*b4|$YGHS8%#tu=vO>M@V9yk;!CB?t6Xuhp^ffUw4Dv@@;*h|%+R`~fhKQl znc^mfTKV#nUW6mSaZAT5spm0#XzBuHj-D6_sdJC%Y>aZ@mHzHOXHyIls z9LUtVI|o3tiU?)!$z8>1r^|Rd7)XWpT>4cO!@dgJ+!8Ntjc;e)h}>7djg*Zx$9s&a zz6M8%t0ypoC*R&p;xs-Y5q4>%#PVVWd$f(sk?&QbfSv7japoQayc7GmPR3&2GzgNj zNyGx20-PFxSRRNCFeyB7l4fNI6KYTvBuVd5l7>r)dAgFY9ReD_hht7`PtHKOnA#|v zMfu<}-n~0pOUJ?2_@u%fzJ)q$J{^lfMVsU-2at@l*Zyb#Uq)kBgqeZo-#|z99Zmt3 z;C>h8Qe4;L`XT6SQ2nrsi}puR4Cf>Ko47_Iu2s0u0LjI*hNbJkY4Vb;9E!~3_@#iu zVCnxde3B`+4u?w)MqOL_q~bn;+)bG3#%7#M|G9>{$vp}#Io5S;=|si7jNIIzax}U3 zGu*Q01|80h)CZkw@W@PGrZiWDJC@elJQf*TTS|w4!YGG!3^h@{foETn%3&SDOq5T-2jw%=L^;eviE&Oud2cij zzHns%eVjh-^{9shR*`CRDbae2g zEz{2<91%|k=M*w>NbcIw48?s4xpN&k4hU!Zy9{@ZZ{6lZ;I*Z=;ucLF-Z9)1z^_md z5chDc$v+0oFBD8QWO5@qMsNTy)Bm91miZHNLh{v!DK2sa&75#JSac6A_MR4M#dBH0ncb7 z{4S%W~hKxIYTA3++heurj}A zhcqz4MkE#SLPmz}5Zj8hP%a_`=PnDSBCaV&$tGF6!Dgo{{~^S!Etb{go62pz+6Mf;)}60m*Q z#zB+KOxO^>^M30|Q<|6nOyGH+^`x0&gA(8pJRh{4G^PCrv;&@Bv7R*L(^;#Kw2R{? zTX^0}&tb7!X-aFshQW(@C&fM(u>+naRw&+qr-rjA@1)V>ejWxN+)V$$i3J3#@-$CU zEFfS#ry+>N|8haX{URfZyI-bZKA4TS6ZUdD> zcR1#L2_f0V+(8IHrn`lpw@C5KFmrzONa~jaksVakJrIba${FkxWw;16?95tmS`vEW zHA0Zs&HTiQ1%#4M5DN%cTW9ho77+S=NR>=+KQpo(+M|16mNsWTqU>CqFOc>Ln6 zI4ppP>3yY^eizxW$2=Y&1opNq;SeD_8WN5Yg1mL1d=ba-LU=snSRsUOlYmT_K4!xC zlt~WSUrdc5STDa%k0vNH87C?-9p+r{?;#inOot)-zz~>@r*cre@O(!1G2_J)Jyn1P zhF&YgiJm3nVgl>>KVkftUO6q&{SFAhdF)2vBo1R0_AbNZ>!@);*^Mk$lAmxT(U_TK z5LN-Ky*E!tEFfTipCO0^ge`r7SU}jyCx``vc|JibAk6m(V!;Wam!dRd%P+%y)dKp7 z4xfs09}XR^(Ss={{FpltPscyIe0O`axFh2PE>e*ZWX5dI)5wI?h8YM4OqJ!pgIEGJ zvS*w#`kA-m6$9yL;`(3bOsPvuX1vNI1P7b%W2M`frXXq;wGW>Z-7~g zS0yD;cF~wLcY9(nGd|UuocS4?IxC^$m8(F7%Y=7FA!2^@USgAZ@VJEYxhX5)u3Sx5 zzvWI;Fy=(hxH}AcE8YL%LzcPr-H}JsyX^9(K*CrN2AgoiiI=Ke3rj1G2)PGzEF+Nn zeZ0HR;=cS_xK+@tLr0+pm818`$ck>WPN2=1v$a2uJ;dpPth1#&pF=<#?2$5OpLn9I zOix^1x6nReo#t1-vw96i2q*P+O8ShCc3S6p1?qH$;Y06)-i5 zA-SYCyrqCQ`ZF-P#YkiWS6lIbX4yi?X@0}FBP_wr$n>-h?QG2^FpQun=~>*(KOPcN zayO^VcTU4ub}e?%@=Y&h!gJ~H&FPdk+^$94(>daPQx0$2!M?6lTSF=EJYGi%(Ey>> z%m(O98mNW87PHCyjhIRIw=i+AbZlT7s*-yEihM;YRs^r2TX}q>)&o_JV!R9Sc?(+l zx^XC}2sSaT#t>u1#p`ep-IT7%E0jXrj|Jb>iT70S7EUQK_jmB_K|g~g50mCtPY??T zJNN{#fUu)a5DN%9`2?|mu(MAP3kbXT1hIgyt4|OM2)p?Nv4F6_JL56;ZP1`%E8xOx*f_LZ6;kx25!0N^fi=#>IDvar_PlieaJ5 zsy!)@O0pj;T1n_u9-)$m2cEn;1gIe2Az6gnvM%c3poJ)6kFvpoFu0-DvCSo15@*0v;!GH}KXT>Y2w1h-uEfXSXN(g_V@@Y^Ku@907sVJL@zSoVgn49GAB=%IAQ~gBPC~3ELtV;#ReE3PNtE7wA%-A zYs~}cl-vLUC}tss2^sf73^g;7h3z0P=t7HCea_-b%(MA?Z1q__{+=oLdpPkIFFL?q z`nXtVU33d9iC6qm$LpCbOy zZNMGREa6czT->`yC~X9`#hx~A8f}S!}!Pr$WNz)TApEcZ0lO$ z5`Npju4bJ6$%*Ne+d*^Y4!}EZ8eTbHqOE!EQ6Qx&dC}i*&>@ICdtwp z5RIkJ;VP4q*|&p1@L=j-<$OrsKBc)2kvkF{EG^&C$K6fz z&bNfrY+sL0?GC9eeVsnFW!7RphVEGlL46A`7~xnB4zCGJ_!Qj4#rP|K!A)F4(6m&N zxQVNWoYTl@PgOIg93rRec=TsDcHf#sX9AQWD9@WMfKBPJ@y}uVzz}3NV|oDC!6!X{ zx%Y$Etk_yh7m=;iuwl`*VLORL?jB<6&jYP8{fC0oiRu5gum^!igWkkEv|sQaRy@K| zv01MbfpMUR3E{gtu#lJ!2P=kY$R_XJ$spn>l1O6~R~yR{7}nPUnz7Ep+K+Z@1s{gR zU04UMrO&)D+ur|8KHnBe@^S!oGB?y`!K1*-dvUtel^l+gHOJNELOsDzD8qZ&u_T09 z$_|&gE?eTg->WTdL^}~oJ=yF~b2uRPH_EwySc=nPwxTy9+n82OV(Ww)wMW(hV>XBE zfxm|?zl_11MqBgZD7z!Fe;JQ$z)mYX*U~2m3!FLm`T~LcP{d~}VhUXF>AeyF`GH^q|-dq>EfIbj*K@eR^{%FVmjFt zJcB%6NSOl+*0Xdq3L3{7;Y}oy5qm=HnCK}^#QO-|O)_nmgQkfY-E5){TWS+?(7hVr zrMt2AGI{B;X*g34pQ-*4tT3m=MtH_H16=5A4KSHT0;gcFU^Z2p0L@HYfrV_T zEBc0ob_O1SQ&mv|xzz>BH>cs)lPqGM`6OMmQIu~t!upm2v@>g%Cy#B#|GbQkK~yN? zV;SRzl<_#fjI+?Yi=>PhOuj9>`e@kvVy4{|bMn%jMC#Js&g7-NNto!I8e0#t*5zUO zHVeKrWz4p8^QNGun_2$dSjsvMmHdhnuD*8PX3H&sa>L6Q3km*wJpXAP%HYSt9EOjF zu7CF9VgB)WvWEbr z&j{C@&4)~5a?X8X&QwPDYNcsv`FPIm38_3ADJz{WtWzI-qPM(6VqvKA<%qkqRJ_jr z&bFH}^e5iSZd$$oX+S4oAdWBuav}-RDOrWe2cIQ`^%7n$`$dtvlFA=pa`qP1{XV(!=<>btNExcU81U|&EP7of zUaRk$bUi~)xN`QjWtCzT-|!l`%Z{Ha-zQmNO3DjhE$t*+ zn>~Nc_nDlQw_3l%2p{R5_r)?sH4uuVa*V8bVSRS!g!{@Z5+OsCzsTZDh}ZqaR~}{P zKUJRje)$opPb8JM19$0VDV_a4_vWMJ?IjI|CKmm$JRnw7=t1GS;J%r^um!d2 zZCk#~lpQ$zlK*7f_nz_0f0QqmxJfF{VOGzTP&fYWm1oLJr4$&dJf9IBEnaucJ?&M7 z&Y$+XSIQX1K)y&S-@<%tFDy&8dE(VFW=`OB^<}YNl)o$~V@k^RKwN3OaD95m-G4v3 zoGgsI+kJC(cd}3&`~GWvCmMJ8L8j%;@}$Omc8@o$+AxSwn-|5)J?5M5OHO`p-}~i# zBrPPB-=&lXg=N)~r~RdjVK1a*x8t7ppl|nNA#ua5e=mQQEZ2c0Ry_@)$Fhg2|EH9C zwh+G(5Pv}8@j`qzAU;6i{zBYxrXT!sByJ#N}J0R{!;&+AkMnGIZBK0a(-DFcgPEq?Cg?Lmz+=QIx z3vq2g96@4Lh(8U8NfHkdV)tx6&Oh<-?;yn80^%=8oF&9710tcOG){<*2gFB7Y!+g2 zjvwcPB>n-?V%5z9;+-V^Oo%51#7~g;s1WZ9h?kOhuMpo2h-Z*^vk*7g%olV5i5CfR zuYkCe#FK=0K|tJ##HB*~T0q>I#9f5=c0k;e#La{_uH*}vMB)S??iCO_No*71c>ys+ z;(NHost*Lj_gMRXF2uJ3BA2R`o)qG^xxS!hN&Ko1cMFJo2`{mp#;WH8#D_?{Oo$Hz zL>`b>I!%c02gI95JY0zV{l1{fNZdn+Cj`VbB$kDETR=RK#K}T@Eg&93VpfQg%YK}D zllWKMV%38K;x;6{F2rjB;%pNCLx|4=#K|N+EX2;u{W!U3qjb9v_YH^y^U_s9ye1%G z&=u{U5T6N%7>jaBY;9xJ&Mo{nF>LRY77B6SfcQ9xTbVcm;=?3*CeDC}@e!wl*B8W@ z+0u^_gM&`V5#p8s@p2L|77or60wNZ7I3>PY;X8N%u}b1Mh4^ehJd{L?{eZJ$D__t; z5;3a*;&uUXTN1HY1jO?K;v5o>6XGKQ5n~ljX^{~B8W6il+**h|^L#o1sSoN)d$b}=NXN5RszAxx&Bz{MTy9C59ka#z4%bOB- zpIVMRl(>(R`(N1mUp`#yL*pSIdHxr_eL^>KKyF_f!wiInCu4$WsMSK|W)iEL9JPGZP5nRho#sMbhKH!tqJDBZlI z=b&^?Z$05tjPT<_;hlWT>+?oXzE}&PqQSRLEj-iEXBJ6FJ zJzZ?hAMWK(_wr|e>lt}emtesbK30b#U(Cnq*6>+rpVymw9~NYw6WEU-Ig$FvJm~9Fa zvrR#$6UP{xph2Bbfg4JqPAI;HLh9-Svne`33v~jIn)UMqnEb^G(+fCW=tT4A%hw4h z2h#rAVp)T;1lOUsj#by5urI_l*V6WbiAi2=s~5g)VeWwIAnW$SE`ZyJ>)X0`NUYFb zfMBTRT$p{E8h79J#T{aWJ4wmJ3KPb|oLQWcU*P4p@$%bx`R%;?_FjGmFTbOg-^t7G z?B#d&@_TssJ-z&1UVd*cztGF?qqXTlZJagT$OSWQ#veis)y;71MD~fRpu-rqs)eb-kp+#p@UA<#MSSq)5F~e5rvb zpP|&Rmo*Y2^-@KeG?C6R!dHaCgLMPn3MSG*~ZH;D(Y|FBM-yA$98| zvnlnG7S_vkb&Aj?NvpGNE}*&KwQY}5a$W?QCPzR2I3F1X;4*9Yz_d?u;KR}!c?pnu z^rX&i(*f%&`~nf(G^wlb8cnRf9pv#{8EXF^@G5>WG20Y`x`tJ1{5&xY>Y57NP!e@b@ii1uSJ#+L(KT9vHXy|{j`Gu5kPNhdg{*zH z3Vc`sQT@oz=hL=25GaSCT9v7<8K)pJbfElqxht)1tdufJxMDi)NpMm(Xo_xJgVY4N zL5GXs7UIyU@_0xQ-B5g~fheD$)Ypv~i4omUktR)~^NjG*Lg9gKC}x`i#cWd$>c+{E zZJ%xXge#`wo(d;*gQn=l$F*+I;bPp7x^cQZ9#TX%6klo}%4aC`b)!aNL^o8VNfRkH zmQgr*zW^-}9_WT*wkc4|HU*(>oF@5pX;3#*;D(Z@8;Y-?kh;3TY>IBsvfjGELe{zw z;s#4#J#|CSWSzLN8j&g8xZ3K*fRqsq@1yCsr^BFb&=lRcS?dNJ?vCd1oFR{g6wwXE zml}xj8A^TKsF4`a4Haq9M7om^z9tkN=!RmpDNxKd1)*-Nl6<=~s2eJ9LrK&P#n(_s zUEN?dMK@>(bR*_q9fJH~g~x8kN5KE z$?Fk>UA+9RUVb+jN;t&JAL``~^ElphgqJ_kD_nqJ{{2F+qniYZ-1Dow!kKi!64(s| zy*;*_d!fAeYh3PJ-D1m~?g!X%-={=QTkarAxug8Ua-RqPt#NIKYe!tW;MyHm zagY257!$2Os?p=+xAOAyy!?ER13g>ISkDPw9{;M0I%41v59LU?8_SV0xWm2m`yzJ! zG_q|@_>jId!9)A>20pCWU6H z$EcSPyMGa{PQf)`X&Sf4gZT|P^MZ@${V+7I!Bu)5H(Q?y2FJ>03Q2}LkF-_lkkUOu zlo3x5rAi&|SE*+B)q}D_K=&&oiN# zct)O!ab1RsdGN!~MBQ~tFX9$?9&3ao&*KRDJeHQQtrvXqJV2D^aa^omAdb(2aJCn& zMYs;cbug}_xDLa0G_DhH6<2H^+!dHauRz7|3fIg1PPyO3dw!KyVB6^B5BBm)ygV8y zJc~1hK|R4>e4!pD4hxWvK%_Ad2lraEMBQ39CY}QZg^5V6^!v{gY)H6bI__C;5))|( zCgPh!Atut{Vi5tm-cTNNy-5*FRD3C+YCc1$kBK!BBbcZnHKJTB3ZU@wLg4`>DrTDk z#cWd$V&d77Z2o)WP?}8rH#uaC35pT?7B(L=Pu+mRQ=MF#Y}>d8)X4-1NiHB!-r5!_C$~zi+q9 z_Az$16>z5#_1acI5Tyd{>sP=y{Cq&9mKXQiVBnLAWU7;ezsnJkSCD)DG|&8PU5YvV zA6mAtux#H)Or?ytrEK4UJ64dg{iRsLvfUGImhW}yVvhVCE9vaD`cO}|?$7CP#KaOC zAzQYiY`^(%TedsfvfZwTA$CEw-E6_4fDN*-VCUi58W%fn#qBo`!SWT4{}a9Zfcy{g z^73avHtMJC7$6UUKx5M1f>|oo(slOJ&Ig0Sq-!lEog;NK;fm?F=fX)$qA8g41&v8` zxQh%dTp+MOieQrBOASQ%45dCM)kutBl8Q8GBE^YL#H5dg!UIfF%r*sz*`^@Gr1K=- zE)8Om3fxcT>Nf#KvDU5=qb>x47mlR^yQSZBzSPx(E2iUK04FhureM@P8l&iN4>B-u zk-!8gf>DYuH4x=9l=>J|BQb(eD$=Bh^k5_W;!t>iQHt57Kr!1Cgc$Wv$+t^`7^MO? zltheDd<})v#VBS|Fp3t1Q5YhSpIQ5|1&5xNkIX1=toHCX$!HcBwGTcfS zONCp8&9FhuhAJOGF9Mo*-DGIYqB!Lp0#aFeUt5Y>s-PKkyOLZ_LVRhWcug;0h>mYF zvBL8)lMI~x;glZ;Nad%<{YP|nSJV{P>o?Bo}D`Tf280bc$i zUf~kR_wP4~-P~`Xo%J>5aIYeN8}$5+K%f%l&=5+V-~M8iW@sV34iq=LZ^83h5RlCC z!_h$qUHAE!j`jLJzu!pW2R}aom4E5yN7@ox{_~?-KR-VV&6?+T9takQ{RLOy^E-CX z^E-e;q>UCKVYsfZ{vxD&$;;36^8H?Zb1#1i|E5=M?>8Y4!MNS$;owgrszZpAaXSK> z_Q?c3M4!>oal73)W5tT9C&2SUWt{~zoX6Tboc*3OGME!zNGgX2z&omz`hif_Tmr!g z!%;;9!!HypOSob>?nQ7C!)XeJe-$a0oNzpl4)+iPqn8Sdk|G$c_)>%T45dDX*GP`P|P+3A%B6=yIE)j{#fQ7sF}A1M(AP{h?WT zh)Ulp_1-K&9JKz>R{gS6{Vlxwmj0OjQm-KOzOWW)^9o<&-MkaVoKK-l`TKDEK3qy) zp4~yPme>ee{N6^a^6WOJ*KXqGg9`AwHz1W?g1Ayq+=Aav2ja_*(QBA^34U{AEzWpckFEFpd`f%`OEgj@gG6Lvm74px%J0Tn*Kt*o2Rh#1a66+aA3K3m)VZe2V* z0^Z?+!?c%lox=yWNB$Kr|C*Qom6w0R%fIR6-}3Um_VRCg`QLc?-+KAqdHLUa`9FC1 zKYIChz5JiN{Ci&heJ}qPFaK9B|2NO{unY43zLc{tktN@+1^r$^m`3SW0w3Z_xQ6Wp ziS%r*sz*`^@G%F86*E)8O(3fxc5`Pc;=5?<81HwJ>_-TNxR zjD#zu<6aFXv67}>2OapaCNo76)A$1iZ3+~)QLXK0?;htpR>KcJ7 zQUog%UuqDaq14C98i^6CRFPWYCmZ3{hQb4^RLnL7irJhVS070163R8YDXdAL2^*?u`Lz=}%rSSdnnWble-@Bu3H{jQl>r2N+3*J78ey zI)N!t1S1t+Y9PvIDD^S2Mq&gbRisH1>FGxJ^`YKxU?eRHBR9_F0Q&U1x1Iy4!AK6CHGGZxzcrWhAQG{0F6ZBAF6Xr9 zT+XBb5eZ=$E4{#n_!45}CoNXqD43CO#dO?Hz)7s6DOmX!!UtGMhr7nW)eQnyqzG0j zzSKaJ&rs@PWsSrLR;oyoCekyF@Q;VW1FTfcHU)~=rXa-1nZ4PvDV+)xs+Qt>qu zQWqNe>m?w2rJV8A`-$hR*nvQ zh%X^l-fXe*lY$uuS4_vf8BSs)O~J}15kA05I^1&&T-_*eMT%gh;!6!g`3$8#R@O+2 zV5N#QX(Bz(2>(PVJitoDY*V0^Z3;rH{FLO|r9rGzfg4I9Rw}-RLh52Avng0fi^9r{ zb2_%J`S0HU!gD%bLsI=YoqxNz@93P)E69xAys!jr&gp2p({nnc|C`{XKc|DeiIEAN za)5?}FO8G!fe*1I#K})toLnn-k#NOy+)u+voTMo@`6Gl6aFP!9LIYJd2~?3HIH~wj z15rLhsgIL25+gXNB2Ah|FEYYE843?@QZd^UC}x|25GQYue7iJ=lPYjSNyJIT*HB1Z zoMbiyCuvbQITaI@{59T3$Qfq4kC3`vGK(2GL0W!ZyksKuCt?k!GUvj*IW8{A@h>ia zV^hDarTMSDyIHqi4GywyKim?yOK0I`_K|QoI%in>u%Bcu%}tBgVZy<~zFs?by9 ztehF)3PhP$emx+SWg(LR3Mse$5HBgWN5vYJ+Z?!Ab}Q6XhJ8z1^DS)~nA_vp$-4K3 z>F*=d;XVR7SL(Bnf3~nW_3{ps?nK6u}+EmlCSxGnD$cQzJ2gJ1SBm%DvnOUmFS!a7QuQ6ewn! zf)IB;Bl&h|5O-AIhLVUoim#!Ny12t^3hvOdLAdiG}k2$+qw~sl*869ph z+@&*dYY06!^+NDE3Ozd(cilkfvHQ6%gfxHW(4}I(f_JmWZ{0Y=3axQyvjB%!+Xmr~ zJ}E77w%&IkvS#0jK6UZah)m(or!5ZMF7+|tis`tYg_Af$Q*h`xjYD*}R~sn6;wRt` zDS|_aFC|pXXDIb?s77K0hg76Sl>0Fw{MJx-fJ2Jera&><6ofc*hveI(K^#(n8%iP$ zDZYk6>f#WyDL6!n!l8T&4-LP@{U5Vdj7@v_NZib)56oF6hr(?)g&i!`us%J2I3LEv zdgou?fcsmxs3)ZT0OsSkerVl4h4~z=7p>b5_cGk2Q$zr3&GgBp|5IjIQ^m?(5G#Gl zpMkZslW=ooSNXHz#qLn~F0ncekId?ZU3VNk(Wf=5~WmYcO@$+)Z7+2GQ7)QtVL!Cwuvmy#jk( z_MTtq70wZ-xnCr9b3aq;=6;#j<&GfyBdP)aWECCOaEb`K-tf0W5E#G4x^fISY@0>h zD1B4he2!(a=TNYBp->0w%I={1*ViG3Mfe?Dq1zfBOI$<&@hScplwjhHU)~=rXXw^?vi}FG}tz% zzzrp_ZBTp-h16{um`!OLXxX5)p(<5J+6LZq+hDe@otsAMu!^du{=(RJ3i_QMjXR!<`Z!Y#aRcU=ipC<64S~?E%{Y zwgc;G1Bm}@WIuuH)3`p1>kGK<#q}VrZ{jMkCEUQap}w5WCjJ00Zr;rmpMm+H1R?i zvE!8CnH3nxBoGB33HryJIbs0a+&{%yS}=Fwkc=N}JaeSxyn!Q7E?22*TiES*{Ej7d z0&L@gL3*|*ec|)-*QkYO#{47B9641``AP`(2kQA|8elD7Ir!6v+7}=y0Z#jL1wKTd zL1RDv%`->V+=<8(F5hNx`HO;230F+V{SutSWtxJ^Zy+_2INfBID ze5pZvhEgAwYa~W+Sw(7v-(rMg#U^lBga^2+m~9FavrR#W%U_m!yEKT)DsV$d#AU_T zP)J=|W;O+vX;HZRKbre`1xjVde)tZqr+oi4#-O(h=Dybd;B(#gJs-L9hg7AzW8Z^g z&i`oc>&IcaJrOClIdHS=^c+?h?k#c6xAbjbZjWmx>)spYzPR?cZa*xCv;G@%Uz_=J zUv3qzX?nJNAp>)hvoK6gK}e!#J_wTA%>9VqYttb(Yr5EY7kg zp_q?%1ZzQp-o}AE(~&1a;{zM%IqvLWWa$}Q z-R1_>joPn$h6g@WO;ykEswsQX9uR#?xMDi)gK)B*(Uf}jCqy6-@_m2~_e)0A?-f-i zMe3R2OAX>Pl=}6oMq;F%sYtExFB{?ag~Ee+rkHIC6thi1SkE4ke7iJQ&s5-sl333a zUqc~v>lw2t^^BH{^(?4ktTX?r^{m>so>BXCJ!=c<8C6r&vpZ}(dsy@>;fm?FUxSnN zjHcAH_jNs^!@b|A`u(Enq)0tee5rvbpP|&RXEhQd^-M*YG?9MA2>(hbJg8@i*``1- z+Z2TL?CX+mmj>&Z3fxc<>zU$fD5P#ZV>YFp(W2@Z-m?oTL#AqcRjLLlQZE%> zY9PvIDD~@Qjl@X3RFNi4qz@b64}`*lda0Og3KX+VL0B&zk$k%}ST9xJhLTt>6<%!iR&&T%6K3yExbO&UWeWZ@n$PKBEz9B2_Hw(R^0Bt)YPm(= zLseGoC8l|$UVcmTGvSKqxZj48^^&I4ODCoJrF6L8G*#n4sT!n6y;OXufheD$)UTH{ z5+n6eMVd5`K4OGF6bcXOrDC=zP|P+3VZHp0{$d4wsbf0kH@UEf%X9al&TfI5 zJ$$|-R{EA_;a1vC+^68qW&5&zY{-xVw(sskOCoZ(IBTZMoZMtR$Uj^|` zN!}M<1u=stXqR^P^4M=x_ZuLXLOEVOC5BlP>?5k$mfEiEH|ufCavpR41QOvDWL(tD zx5S(kC=>n~Jd3$fWU{bghFIlUa00NjxwvbdMOQ#7cavqLxaC>=I*?KR60D^U#9i|& zm^$5GnhQ7kN0+Hf_Zdj{hvV3HpqqUK4$B>4-G11^;kM6WiQN)c(`A}#pM`9RlP=Td zw#&4O{~e{#UVf^VuY1J*3@^X^pzkE(ncyRD6|cZY@86jo`_)P_Ce4Lo{AmCi8FVZN zINE1I;6pSR^lcB>WAR z9$>0swkc4|HU%N3J|_8gX%JIY;D(Zjsfw?mkh+-4Yzn5*vi_L5wbVqZ$1}w$^_aE0 z9;S{K7FO+zm|720iSGWlXKxhyTHbw3U4??0-5OKrr*u0u;Ag0=H zDzAYouVC)?iT!@LKPdMf@^0r#QcgX5Ed?k_@X`1>EASyQ)W_G?5PuE6&gb`#Eb4~% zS|ODW8N45cuX--=5eQcJ`UQ)xj|8TLN*U2)-)5 z)IgNaQ0n7rjl>APsz{S2(jOV&-wuTb_^Oy~3KX+VL5QzUO1@nh#8(x#p(Ns~;%g|R zF1|9Gg0HkFd}TG{&vYWTxLT~zeMLt!+S}xQuF@OAB8Qf<$EABVTf#jb*V*dY33k8c zk*-HW=w@v@3KvI2bhzW;wmq9=#Zx0yaDnaCY*AbsE8J1Q2oN@_OZR4;?cU5UZo6Jx zO^gc-?rmNG*>)YbkA1lhEvH{gf?0I3`>ynJaZ5Q7MeCK*>7e_Up0Fg16P5emT4Z?+ zgLx#bqpjNycO2ZdoQ`6LyQcd$-xL|hDGlxkqU;7u!?XrS z!wRY~Xy?F(wFgij^S*3TpjOh?`k~Z`ge#`wJ_RSSfTm!8Q%a6?JN0>#%* zNL?&oHU$f4*@y-E$Y#I&y!`rNLAc(LeUf^Z8N~v&t@h2l5f+>Q7XQ*%K$^w^x-}N~ zVQAK1!ODhMa9~3$n7=;Vm%3Q6%qyIS6hud}LO5U@)o}1?Fq*{*B;WER7JSiS!GB1d zNVsA;?$dA*3up=!$+Iu6{c(N7`upJ)!#!yI^B%UW<^*T|OtWQ$cN{6J;OrlC z52ko|x87LM;Ms8Ok3-?%AFh8s7V`Pi5b$OI0j#vzXI#)%V2$dIe(P1ggM?>p2$jWs z)7mvZK(GK)Ffb?miyuqfLa%|Q<30m}m_k!9rCVbP9q!LewSH8pH7SBAiZ3+~1z;BmA*Ycz`L2*``1-+Z2SD@)OCoOM{rA0ymUIOi_Fdh1A6qW>YYQ zmJPy`KR`q55IL*J|6)wx5Ho)@=ZV!|$~)pKnDPp&_QQzlizz1~h<|BJAx&cn-5OK; zFf;{I(9Nj9-w;#K%@F(@j45F^WBoA&Z)wNyUyz~ZU>s!KxWbC7abx}o5aP++Ufh|CCgHQUrGtUuq!AXDIb?r$%A~ zcT}WF6X_d9_>V&20q!Vfn*zmbQxM|L3zBb_260CPZYYVkqxc#Msf#WG)3bO9q!u(3Z51yAVqLU@udc$ ze1=jVhiW87a7aa(G?D(s2>;Jecz{ES*``1-+Z2R2^pfP;r9m80fg4I94k^BdLh9lW zvne=4i^8F`z!&~L{5+AJz-iyFj)1jvw76x?oSi7!)N{7B!~^6a-*h*NW~B8`kfldh zWSgp)S(lfO$B>dzR=hYMvjvyyn6XcGD`ZgU{(w||n%ripBm_Wq>MOW3kP+CH;37DZ zekiUZa1j{k-WC@@ahY}dVL7m5hlaK*u8NF_`b(AeFCJC7{4^;czu-R>??Nh{@jn50ux}o5aRF8CEqR$;;#zaP!jQ1@ii1u z7k`;e!CzW7;_pWM-Pm3Rhi|dH{Ac0sS%SWe@RuN_@pp#+nTaq_{LOF3JGe&PpCU5V z_eB>*#{OOv48n*WO~?HO3}P=$!QL4fd+BiBGw}Cc0)M0k_A0*AK$Oo=>SJ$>#0d7P zNRuYgKO5oChQb5vRm?U8irJ)8*gGS@ULwqTVy_;J2-lfv?0pWADeV1<#opHigA%Toj{8eEiM=!hd*^8E zrNjN3fxqVk{zwt*ReY&|D4(I!$KD!=5$siwCQYOt7~wC3!UOD8%r*sz*`^@G-d{<+ zT^ht*6}X`!Vz1(BD5Ng-GMj?Ev=Do*F(VCqSaWgoB&?`tixn=WnJzZxaqf%k>{&P0 zB+qOh59aZzb=vq}25(Y)U|P>Q0zG4CM(6Q@S1CJ~)#x2-&5H=E^y;ftuilXIO}Jt@ z?wfE@uV{*1m9<{c;l>hp6s@a&CXbdB(JRH58i?{4N`1Ymkr>e{6=~8$8aKjU3WW!H zrI>9B6thi1s8?@EzFivBD;2n*B<6ofkP8_BmzgF2uBHMfBZW#boF{te~4LaOT z^LXBr$3u$fhT=;NMEMM*zHZb=jOd1nG-)F3GQ!^qg$KH!m~9FavrR#$8}CWJT^iI4 z6}X`!>W1QLD5S1#Fq@(qw5+#ou#mNGEC_UiB``=g>W>*|jj4|szeZ$AH@;?d`;x^aH{|J`^! zK}=(BI9^YLSx@X0L|*4i={tx_Vei*1_Wo5cDB+6fxPOC_*h^EecYlq&bhrfrf4>#@ zBSo-R@udc$e1=jVdut>{uvbNzG?9)s!haVE53pA;+Y~5fn}QH~KahO8G>E+_a6?JN zUd7i?NL}n@HU)cW39$FW-tAe)S~tRXdzQeU_d02Tqk}xUC%5MJ2p06)zhQOY?@|^C zS4_us+Kdj+6dgEN>i`|@B=Z>lAdi6*(E-Jm8i?{4N_`!ukr>ed6=~8$I@t*SV<EVeJ}(JJJIg)b@OMzvRz|OySNW7I&JY{v}*79XAOlafhbh&QTh7=y0c*s{g)J zeNqH>6klo}%4aC`ai>ON1b0-VNfYUGBm6I+@BnudvrU0wwkZg4CnfoIX%Kf*;D(Zj zJBqKNkh-|TYzpqsvO&1>zilo5`r*#TwfwcvW40$+xV}o@dac|)ZQ#1mTK*7+SfMoz zWdj^yZ5xC`_4_{>o$8NG{S}cZ9Qu~Up|sS;ge#`wHp59AqA56ZoW>zK+)WJ>{7s;M z6u}|Iml}xj8A^Q|s*xDMAr)!TL^|6D{~#0|;E-arDNxKd1tAV)B;PI#;*bj5P!e%S z@ii1u7l)Wl!68~U2#4N;BH6_+d;!*bie3>fS&;vNSi>dt|Gs;Q2ICOVl<*32-`M}D z+yBAWjPb_@ia&HO<0b*RumWq`84~!gb`8QEjWFSR*N69i{*K5L?tI(gPK(sPge#`w zw!%r=p((gi)wn~4JJ(cwC&te@ks`RG_)fR|fIEuW zra&><6ok0bCi!-05O-AIhLVUoim#!Ny12t^3hvOdLAbNA|5FclHuira{h$BC-kX5Q zRaAZBckb=Jz0D-)%%poVStcZz$xSa=CM;PX31Lmxk`N#XVHE@da-o}uW-?<$K#@gR z1dM>ls)8trh^VM2;)($jm1PtJ#0{5M+ztQV?^NA;t2?&=-|zcB&-cBbc`{vf&Z#J9Y}d)rQW=)XJvvBAvHLl0>^G)nqo!V}l> zMgycCqAPmnTvHDb@D?jo;D{<9M)Z&oE;ZO3PGREpP(zAMddOhvDyB4;kTFCK9WMm`%|`^cZ@G^A`S7SN6j9{@L}+XQYk? z%o~6-6$}1W!M_H7oazu4T#4olLBjjtk2eH)lQ4)wcNzZl4Z(fNCpO&>48A#XK>5I? z8-fGn-Cyg5VC(12!#T_UU3qQJ#l1J|Q&a0;r9W{-vc_@ZO5Nx)S#B=&i{9Dd9VM|HIx`fiZXNjobf~Z)4{| zeZUTEYKnbA3VYX1->*HKmur8D`oJr2DFiUa_=mMF>5@K`@Wi#eaR8}H=!!0Rhp9^l zcn7NPoR;oPjOY?0Txzg6oWjKGl7;8P+fKU0ypxng07JKYQ|p$Z^s$5|uH|(Dq;8=ry5)RRw-E3SQQbQy-J2NEEk?N1 zU~@QyiPtR+DK_aAgQ=^S9;y;=j}i}cixF5$Uxf2!IDyGM%#K%R6hxKg)))E+jwFFUpPnCRo zbXea;e~$o;O_IEM&93yTkfs3A|=~7ZAXx@9*mRo+kNDc;Z^# zbbzdHx>DcQn)OY)VLjG9}ix5w2w-vGvVtN`2GwhU=S!Y}R+wzgYsWS>NLkz^L!< z>H6-Md?!3{EpG-u);C?L@9WL_Cg8nU6?u;oIWbb-M!3{qb2x>GukVHwo9f$O>MEwE zsKh5kiHG%V1lAH5fwcrteS4B`j}GhGh}<$I*0&L^Wg@Zl&1_12(-YRWZ5@IKFZoZu z*U#_LDkGinEo~PewB1e{yz?gsJcQpx|B}#RxARx=Ms_X=M=o@0i=8hbzKfdk0JEe>k69h%(~8)@5r; zS;{-he@DRiS%IZ&e=iZGY+n*@RJOr^ArBXWKl57$#2tsf6Y+Pl4s#~lv+;M1hJ$$L z0-jHMKV7yxx@=F@WqXh=+x^SIM(35>v6 zf=DNoCEp$$>Lep_%ao{-jBqUziPcHWrsyPk{w)_}2oT!V43-r;c8V>Xk zbx;t8?q>YWzZE}C`up*AVzeQ5iT{@98O{4byP!&O*+b8>MEvZtHgJS5)XBh5m-xL z1lAHnI%<~W+oMArWkhb75_Oaju4N*zI*Qp89Yv3!qyA%8z|T&ab_Ewo-%!8Gu0VYl zKz_qH(SP>q&Hef_OTGC2M)vFX4mAclu&GP_E1d7JcfF=AnTi00F4?Yi$!zIUxS2)Q z^5(#yE}<*B$e+z$G&r>4Z!VYcfmVbo0 zg}v=HbxR)t7`o+Aty>19k0m^DEpHw`>K3}9TkbY>3juGl>fZg*y@?UsVuVW#HiuJ~ zc-_*FVv}w$n7WGTph|p3lz6CHjKEp~Be0er(k;76zCAkBEk@*)DN(l=;aVmVt6P{& z(Jk~Cy5*j5zR!=G>~%g`g5KX*-1J@CGi9DH-(@@v-uYVuJ|4e|juWq_pYn;=)|GoY5CJE_{*5B_$_?_#IdrrZh zS%1VGkH4V)2%Gg6#G%_ze;hOPf^p~iJ7cH%TmL%G{^Oe~afad1XIJnM=C||zl*^HD z@cUunrpMmi-&w z$?6HQhCN5$gb;fUtxO<(D#pPeLr9HUcwXC@)iK3zNaht{tKqQC*Ym0RBlC7E-|9-jc}>K z=5PuVukRaDY|{4zQ&%y)KqX#{5)bvg5m-xL1lAHn`hKD0+oMB$Z$xgH67{_iu4N*z z`kvVoeNT^}?;nEd;6F8EopYwS{;vQ(8-Lt?5B>(=-wl8BHEt2y;5+IJvjTsI;BO`V zf;e;!$Df`mW2aqa$Gesf(evY~o?T(SEN89*<$1lmrQRt!y>Arm0GQtxJg(Gxe5v;x zGHsG?1>YFq(es~v7WOgrng3J! zS*>+HW9v8jSx4B<*fdLb4dc_~iR$Fqmc5;`wqprydr%x%|Hw8gTR#dvTS=EdrJmur zj568YD(*(_Qnc|}ewlNY5d6>CR`#3+EUT@gNxQWs9nqR}N^8=)T9ZE1n)LbBq!(I~ zGW)d5*DkF|3tE%bwI-e0nsh;H(kEM!9&JtfuhyjezAdvntu<+GYtjL&N%hvG54I+K zzBTDPtx0YBwanLEtx2b~CVika>9eg#KWt6V1>5$f>qgs>BZB4qqHR*G$Ne{Osz0jKUht{Nyl`RWuQfty) ztw{&8CLP_HbXsdty*24Wtw|5HCcV&_^t;xij#VuSYG!NFqSmCtT9eL=A+4}I?89a4 z`h8eC4$V``ORt=?+|q@^16-MQ)w=<0rC$*Kc!1(7_1lGl|9M0#O~4`*-*&Tph`pjh z*7olQGMDO}m*~!x-BfX&UCg@Oi>~8tm;VLO+S3bYl$Z9u2*Cdmemcr;$@mYz)0xO8 z{4c}PJ?{t`-mfskSNZb{rXromvX@W#BlNm?w=yB`dJ`cKc2baBGM~zh^yZPE10TX+ z|1n$r{z!X1SxEsb1AN-;o@bAAWfbk=k!+^oW;CVLHW3nH*KxP2taiu;{~p%cKV@a< zUuZjyq~%R!@nE0OvAzKO6Uei(2|I>uS?t@`Zo>0OcQ#>Tv@MqcDuv5~3iTnN+S5R# z6W%Tg^$nmpGC*Z;1xcas+D;pbp^`-bB)sVg`%Pk#$O*7Xd{{$azeOxd0$3zHRbjtP zEQ+MknNRr-qVPzD7}H3$9jSwa*GowDJJ%u~u-(dcWo^fs0W{>EpO6bHHb`Cg%i*s) zA?5FbU8!ujlJfTx&$N_(fOvWWQr`Byh7^U3gf6+TPj;*&MjHOtgAhol$MGKmxak8B zy3&!VU5a*!s}GPO>sCiWS_anA>T+KNUO(3IHt?!AW9_ky_YK5IS4O95pO1Kz$7IO; zsR$Ftop#QS#r@l$JR10qbG(Pan~V(Bv5d$E4bJ)r#8fUs$$Nv_giM4+rKiP6uZT9L2>(-VNLVI8-=2Fe2n8NmMn9pYU9RJ(kTus%u zYA+{ib+CF3aYH^W%FD-gvXmDU|LgIY0J)x$dUYyY_8|3<<9`PX##;V&;q>eJkLt(q zzeoO)%o0YMLj8Q=4am*?c;-K9>QjJW*Dnu%<1%U4vu&sLJuve&LVal51mJ$sgiG0~ zbGW5hP9ixfQD1`S>|d_+EHuc|NT99?_p8`uqZ?Hz6v^;3TYIT(6~m>up41gL)> zh`#Mtp+CrGpywi#zg>{*Bnp|2kjR2Ywna#6@b8R7WoV=wg+xo!$X{baQ743bON~rL zA+crIjC2Pnx%UWTJ_-?YsTw!hybl54RS;EG!=tu0)l_XCovom}um-2)QIgemg*F$)6&uC1;!Qo(95{oT^=I%0`mw zOkvpDiPX3K;xMhBHl=l=krvgQcU@Cj95b5J(sD9rASZQ?$HFn?_kI8e3V^_U?Cm5xV*=0(-yJs!Y{BIF6EU2k;?M@A{pO=*eHA^=sI3ZRRb17fo@ zecLhcDy;V)MN<9afUxXGMGXqula*q&sd4SYankGBl^r#-a42#L=GqiR8;9I4 zM2Gx37Y3Z^o?* zaSY;@@YA6+Iu|pMCdkNaAR|*v#e_OABQsF%V@!>3-}X0!(!3mH=A;m5OjJ$|k$;Fn zzBxqxF+!daB0mrzPYsc`M99-ZR@r?~RaWhDf7v z+z|Hv-$fyphR6>`$ZLbL^}ZG%{gCHZBji~j@_`6>c8L5+gsg?g8v^9^dWgF|z^Qdb zLN4NC5^dQ|!rvP+T5|@C6>ZpJ0%ACo4v1_zLM&~=vfGJb1bzlkXlYkC6d#0sPL!tF z&X9P3fNoX@@c;q6tPtY4YZxk-NAJJHEM_|FtgNSv%`+ z?A{RJ>%Duy%7MIK%}sM5$$@+mN%Pv)$V+2iZp3a>>B`}KJe$R9;zW`o{iX<-mmKNG zljKN0o+Rh?@gzC7k0;5weLP9d?c+&uZr?=G#j_zcw{n`_6hY@!PV?hQa+)7clGFSq zl9u4ISPA5eKR&|OVN!^PWQlA>{*RiooTThXkxBOVmlB|65D}zlGqN! zlf-r)o+P#d@g%Vwh$o5dKs-ro2jWR$JJ3YZCHK+TG7^h|rU<%>#G)XcBo+nnB(W%n zCy7NtJV`7H;z?pr5Kj_|f_Rcx6f}`^K|CE>5MpQ06hRk+*cmjDG_Sum^3vFSkBn=& z=fz_0jm7>s7CZH*IKGF*VmHTPZ;Qn~7K{C7EVi;XPKHxsvDe08pNPd4*2VGN5R1J! z7W-r@cIx^#zGuc_KOT#HF&0}nI*#udvDmv}v44-nF5D2u_oP_twXxX88nL<&i`h$j zBesrdNK!`-i$FbPLu?^yDzRO~<=fq;~ zjm7>Z7F#*4AvIkhV$IW(ZA}tuo_La&?8K91)9NLjBqlrYBr(~ECyB{UJV{J;;z?q% z6HgM8op_R%?8KAAWG9{^COb_eU72ed3teL`Y{Ulbmc}>nY(Cx?L9_XKEcTC$Sj}9F ze&U%=IX*~No4Lr$cS9`p+D5EqE@neb%r!~OhT=(LHWW`1v!QsBm<`2~#B8XEq>Jj2 zSh>ZRs40S$Ta1aCNSfEL8hL5#)Dz-LaZMvuGZ%BDCgz$X=1B1*F)@lKiHT7>Nlc95 zNn&EuMAErAt5I%^y{r+dMHX|Ucs92*M$l}Yi^WbpF|GjD$6`Mfi+w2;JM~R*d{2zU zUfqb*85Eu;NK#fYn6O$sBl6L(ViWG0SR-ph;qu z)kF%awvm^{-qVQHY{Z1CiH#vK#l9;l^lf;xQo+PGh@gy;2izkUGTRcfj+2ToJ z$`(%&Q?@3OF24817M~cn#YecmF@k3En?|fIYB7e3XEXKGxF#Sba`6$4Z;YVRy)PDP zpVq)!hdnhG`$R0Zvax}K&X1VsHHoK5Vx|{Q5;MJcl9=hmlf+Cfo+M^^@gypA#$va{Vjqjejy*Gu@6uT8 zdt$NQjKyaCIKBtQVmHTPKNXApXDoKvS#had8;gBD7CZgyI1X=(#XcB|{bMY4_gWm^ zQ)97r#$sQL#d`HPzN=%g7sg`mkH!8z7CYyhxYW*w#oiT*eKHo?wJDD8+F0!QvDo`! zvA>VSPJe4$YNy6xKN^c2iN$uE8^`y+SnN5m*au>R9ZSSnU0=*q36l zv)&$;+8MFf8)C6f#A3b8aePmT#cqqmJ|Bzi8jRz6U@Z2$SnQ``u`kAAr)-H!ZDlNW zODy)jSnNx&*wRp3YHMP#*TrIAjK%g3$MIbmi#;zE`|Vil-y5-d3>L%t_<^?n9dUx} z-iXy~#7Mu1jV6haemqHx^y5ilq#sWbBmH=i80j~W^aNozR&KG+Z;GJh7W@1rlIHb| zMqV2GTrAez+E9v`xmfr&G1nxq@Q){ng?|%CCqBI~8I7&QV(*W|TJLNSRCCxr7JFGN z_S>=8uJhvfu8hTA9gBT37CY-*aePmT#oic;{c$4}_6)S?{x4d@XBQ!)HU8vY9n|80i<+lK#T!$0}Li04Yf z|2D&ar{RCv@c-5D54=0#bFksR(C~lJ@c+i}k9toOcb4H_ZTQbK{C67u?;8G>4F8mi zBA#mv{}qP+n}+{6!~ajizw3J=J}V9XTMhqxhW}57f8oVZ+zp2RLc@Q*;eX!ncV804 zU1s=?HT;_m{}&DapA3J`r4gU~4gav=zsvAHZ}@vIGvXTlvkd=DpGm0|abq6+%4w+unx|a`;dOw<>;wh^1d?%wYkh zI$dK{hM2J$vns$;>>}Qz*8+X-|?cEG^*^x~Dj-L8qY0KS=J2P!~Ov|>WSrZnkyLUET0~>X$@>|w; z>*#YV2QT?zB!>T7%SG_E33J-4$&h~p^5YJok}~Bzr_zjM0(+}%3?pZ(%vi;C1XuK?j9T(9l_ z8a~_}9GCWg!-P6e;`Hbctk7Fgl-@Lmhr~EnIR|My%Y0OP+n+9C`!6F(VeWB|@^|p% zQcCK>lq>T3zbE^>nlVms?YyxD(((Vu@~F+9?3`twy+0s!sS9`hZ29)nb4Y*qC=@`} z-h}(1yb^hM%Ksw*@g`*2yPefv24f5?S^rP?DR>_x&h-|s5%#Ax-HK?{$+q`#pmA3c zmp5NQuu8jf6$e%;^2}CaSwEM$`!jj@eX6$duKyRn#d&Gu{IBpqM1)URGY}qk69X9? zTs8X}$nN+{{{`#XzU>Qx2b+8ttn2o15aLMt@cs^5C1?|>nN)K@!$2Rj{eGnH{{z7a zbH@Yr{>d1lZ6E2D{eKa^!$wyPZ{qF%YUow`AVU*ShZ~UA^UROj)O9MW?Rpr*@ht}h zTQ0eN6=jvP2N@Bsvb6zy2`*PnfZwM7Cir~^K383QePjeJ*mYGmEvf!6!PJI~o zk)J?>QkL(w+wuf5M6n#R|R(7C^h3_H!VmRK8yr z$)`3=LVH3xGVc9~KA39t?rr6n#~{5Io6>7H((BkcJ!X;Vjrw=fJJKGl>I@F6%NvcK z(iq#y8YLH^U6rPeCrRWK7L6;`zir5F+`PK%^!BTx2MzfR2wN7Pxu zx(n(50%ho+xje{GM4C&YFgsU!gy2}P+wAzAaEf!f6V7F)%^r)N#5$cDw!hh9yq}=a zsQ5ApC4wsN0y$USRoAwUT5We+428HWqbeVMn0l+WS09Jax7>&-a*Jz&=J55H=74^u z`ojim>2<0-EG*Ouh}~xo72#kM_qyp`f!osK;fXEQ9uPPNzx+l@tJ0}*tou+9mpYu| z#Y-&1H_-303AdUX+qPpITVkqQXkZ%l!grGDmKJJiLi7S=2hxHZReM2uViAXp3q3vp zCYTguceuY~|5bXk_BI(^*A1qEYA4R{rokPWP9Qnd2gmEj z4=(n156yt5oU)7JvFy4BcxWbm>_PtacKM|cz@^|afO-W#el2+f6l#Bi z4BqLGr(ZFsj8(3WJ3LvtOIVLsx*c2A<7yXuHCNc3_^WXeG>zhtIxZ2Bc!ygUq$J8-6(W;@`TZQW}C1o}BnH zklfD@&w4F-yB2+SQaNLlB5@?UjI~D)OFTeO3}GXl7wtjjLTR_M3SONinXw0%8}DM| zOG`K(aK+UbqJH``Wc?M|NcW`}IPgNfJ;<`SsSm?f$n~bIZL>>pFiG|0q|j25o+`LO z*1zj7z;FM^DeXOl+Sjkc{Z)TC()Bj-M`~*1;0{g7>_nQ|nb0&mc+niM%icm+lmMt) zO87ME7L#87Td~5LfN>FB0sfP%2^h1Kf2%bKy0^^+{`%|X4F~H&UFb3G#r6;_TY3U2 zjh)1)Exum&7u)|La#8K^F2|jhqAn@tCNIV7U8~s%N>9ecS_nZ4b9%h@w~ThbnTne2 z^?28`49z@D*-aY8?-WS8|D9W4)(u)frxzaPGPdChz zP@pnb7;mjUUCotnL|0^WgjB3N!oV50Z%YSxlZBWWiZDZ)Q z{S4|tX`Ei~N|T#^KPU}lPkxwQ%ReXLXV=aN_$7?Gbi6$wYqjEC0j}eN%9KXOX0O=y zbtf8P4TJ27`4>0M=TvoC4K%`k9tw5L0vJgUVUBQ54vwj*)p{yR~R zmZ-;?t)?(1<#-Ce!^A`HO0!MOX)AeGo6=FRn~=jx_)!Won~i*DhkW~Or|A6&eWG+^ zu)0rFokF>-=>3J*#UWO~_bV9lrq7{=V92--6;ZnjKWY(e7lv@DGXcemYn%z0Cmn}! z{Y^Ml+0G!Yf+mLe13&JHCWiO}KO;(PXA2`s3Y8g-|2GJdwOyxgM~eERz85OlOCb5i z#;e-yVym!5wO#7KVWju~FgM-NE4ic(#C|63f+*T0D65X@%iQ>E- zTZEmmbupg$?yyxr5x1oL^-*ZCIXi{NEso^s)(|aPlvAHczdF_$S68y#W*b?=D8wvc z6kDy33NuZ_B_%%os#RJFUXu46eX-U<1v&+nReAC!;{wn8~ib|aMrKg zm{WOaPy5S&Oci{5EGOHKWog3S2Z;U=JY9oDL>c^_c5&4T$tYoPnG&}^nW!qOs?~FV zk_p2i8w;9Zl)1u=w$gcaWrBgKVz6cT$?gsY+aiWruMMT9mA|ZemY|&Y4?~SKx`-pz zxe8!Gd&fYOk@kLU+>E&WBToN_rKmf`eF>4(9uA)l8ryFED2o?mX%IhDF)zN25V^R_hG+rYWJa&`3oRe)~S7${zdTT zY&WHPCi0iCK8`qlU>wzqb(ZiM6t|F-RxH()GqPGxjcGsBL`S)3tFlh7m0plZ71I9x zpg5_5#FjejYcI_Ck@>V#v8kxs>P)k=?1X;+c&GwbbtHXFl3;x=MUh&&Th%wI`es=k zb9Pj&$6!A!DA!}ojmq^H?AWnfZ&F308m+%O3PqKVEehq5S{vTwB9`r$dm{YIF8|e@ zr`9?UqHR4M?WQ(xLjYo?nW$|ILEOwXL0rF1^d7hMZNxqj2111;%u}<8AC7ieD~5lu z;a?g0w=PHYVxdr|!;{^*LZAs6I*1U6igqxd?l9ybgeC;ELjjEsX@?OC8pM zQcJsgdtmUu5D(Rnm3OST$2eNr97Mp9K{`{l!!2T~1xuE4#ZIAXsl6z)T()PdLDFbn zS=+x4T&f9oJYGaYpaG|nc2M__mwOzJbp*=&j|g9f%-O!)qkTw=GsWK7foDnJSr~Zw z15YXNYzaKm0#9GynHqSG2|RlSp2fMsUl%{LmyqjA}t;7lm8r6}JrjYPPqYA-<^~80b)@QI2v)q5L`C ztQwVA>1_ZRJM5^5@&t>BwGg?()HWkIXya62&K08)U5rvqk4kuNL9|tnU%hd6v1MNx z=#ulS;s=#3k*Us}%qM&WPkhvwyCFA!LVlfYZyX!4TgM0aIH)I*UMCPEUC~e;4WW*| z4w6Z^%e#7`tz3^v)3(yq#Ocb5~pD+W8=Cpw(a^?GO5&M zRkyw#>^3_oe;AlVVdI>~N;OsT)lOR#OU|CMl_h_)N|>?}{xfAS&Kqz08$hV$YuixY zwtozO`mtnM$adw*Yb>X@4qBeN*0R_@*ni8r;BcVeABSM=BlB(lc=61(d&URIX|?;n zPHkr8rf}cEdoL<$1goXBS+_SkaC>TVTE;KSnr@zkmDD2DXqUiHk^~}g<>27 z0hFhWCm82}Nj0w;R5jz+6a3F0<5@I9#^o6W|LJi1=x~d4vzlioyaISuN(tLP0Ww!I zm_Yg+;803*O6b1XI*hUfg-oCV1eEe8PbY(#g*1xlHaWS=A1qmsEX_S2Ow?l zhFN1A??j}QbG$dPpvtz>ZhO-tb9PZ}sTV{eT<`BdjE-~+vNMsntkRWFTvi#KDQwFp z3fm_5CxKg43sA%}kflsMxlQ_ue=`axXu0QW8UG-%F(8KtKBH|X;4g3hf)8$g$MMCLqI(V84i|b~0 zG)7D#VmdFxfk#rR2zSHz!;itXGA-}+i4R5gW(Y1R&T8U-^D`}wij+od_J7tr*T4^> zp8m%AsigJle6&-+n}A%XbKX}hS#}X0Qa%LLi;n9BCgxzol4RXu74Wc zLsA;CZ%QHdbp4GWc=J$k9jVBVn#m_7cwbQIw2$o5UuYj$%%27P*_A(dFVAza5!F7@ z*O|n2mG>ruuKfU|42^yr{N79a!F&aCU8_(^W3IRqLRsrAlvVOV^bPU9+e)fA4e*y( z$vp%73|g0>R(&msD~DGZdG0`6%YV8*W3O5IU;&-?3|0w; zlQC_M>QikaIj@FQamC)zGh#WSYxM*glaU;@h%l#4Sl_ zKqaxTF$rRYq!?8vODY<`*+ILJimY1DVvsS(XU@uWS!uQt>ckHN|IaX=G6<_;T!wW@g_Lp;(^H>1)ldwH}f{4Dp|%p^NEdsv*7mI-q~<+h4%9NRC*iEv`MXu%QzX) zcoHe$O-2EgJDZR-goIXTPp6=O9xNS-=Gw#d!BZCp#^D?#Sx*}v<-bIJm9ni;#_HjK z95;TygMv$WccKO8?lY@BK&MS~u_HidOf)*1TWZ53mH#?Bt)g0&!C$h9s(-=1w^ii2 zY?-aIuZ2*3D`7zo$$62Ixo)M)ovaP#x`MQ&l?jo5vV^dW~tFQ<~Z`bFN_H2 zvpn{#?r#SbG54^^f~tMCP1hz6WbGpZLY+UEpv9J(M8@+hESQ8orXiESt$HM zwmiyqFL&I_3CVB`%D`{XKcp|tLA+NH&nav?LifW?yZ%;6;JE&|aE~bFMnNNaiB{;Vmp;Z^cTIEXb1lB9IbNYd_E@| z+nw!hzFj4fQ>WT5;)&}Vp197bg;73>w6pna8fjltW`R|14hmQLTiaSxk~PiBRIGy9 zgMojU)vd-}_}5$A?`8|N>Q-ip)vdz7e^n3${yS9|+v;nZyic3Fm(BWrGdN@aAa8R4 zd8o`1+f&s}Zxz?kk)~`f?;;ZeZ#D2K*^HHWff>Y>Ib>R`pt#_1l}h@!E1jl#6Enm4 zD)pwrG-a%8oTrAf&fZyS$_WFMxu})m+_B1ZrH^yCZKA%jz<1B>4DsFTwz=N@D1Ee8 z?u*=jbTG4QN~dvltY%@wb=mS*=m<_Uydku-N*X;Z>lSAJs+e=yaq9R*P>SnjO>v-h z{5)FBBySkuymzpfI|X8?ATegB!lBmhOyEUuDUJ>nhZ=&a&m<~Oa@MjHF{|6rb)`)1 zf~?7%WVOB7Xi?a;;Ordb$+>zk0}l!ab~!GZPH}cH-R?*iwqbp~PEGvNg?vJ$H5nz? zJHg_n0;c5sXup_~Z)ADpljN{&7G^-S4+@ZImza*TT|S<2RlRcdr0es;L4BfZEa>~D za{lkgUg$t#J=kvPD0U{&nQahrgU$vP5R#3&ItuV~K3vI%8{|VuqB$R^96q|U~b07A;H&mq-CNO zYEa|?JC3BI#_6bWG$s2AEL<5j)x@;9VmsXe);wFVh)HdexS2WmOav9zuInhTjo{4O z85!(TVBN$B1%sf{RBIH>s5^8Jy=Y10u|tHq2U;pWK%;!Ho+5F{+cC~?Jticzm2Q{L z)ZI5%dmQRYn-&#hL9EB)3JNeS?Lsy|uOM_R^WJ>Ti= z4fabh(oVIUJw?C4->3FVxvrWA{s+q(MCM;5J@pycC5sVCtz%w+XztF-7>t)PA5B}C zytNC*$S5~UZV7XvmiL$g*zz7e=Ombe?1s@uw$tbKySY~n`fOY<2P;s1ybh>czAag71sk8jBC!HI~<&ak`8~)KjTJVnz_PgQNve^h< z=(eO}f-?o#XYsJsK)#c*@WfnLuazCn2>ZYy+~~8iO<1i&EBEYVQSx7SeBu zb2D~Ply*et{It>&&~dz=y{fMuoQGXSq>b|uOEeJY;yV3x>w@%C7HY`KNqM2Z)Le69 zbS}24{$Z4vSyg&Hov<<;L7Bmi-6hrL;qMH}5B@?>e(;YE&S4T5`SB9Iw412auvcV9 zj+M2@3AZ+_MGla)2+<7_qdBq`A-ZA4HeStQiEo^;aTTxHnr-E=Mp0{h_`@{{{8*!? zwhsSVHTUFv@^HwE9WL4iaPKQvHa*%bs#-P?-5{!3HWA$*sw|se4g}`-he>)-?MuMF zOCSgQ^VJ&a8&0L_)P6AzXTHD1kL;{rEh&J9)pS;4V6f!v4I%qs;9cA2Hb*xxe5;{$ zcnERpLNy#TARim?S=3?${dX#2VsQg`*uHmxtLNO(V*0US9NRxKy1(&&j@{U5gMwp! z%Asu_4o4#^2d*kl@S|-6Wu8OZP;CZyv<)>6gny#taIPr(#mt1-FBTtl&S^*i$G+0% zWulSt79vzNo${u@t?Yum7Ss`TTe2Qb0J7!w0J<1Zv3;aEG8)mqqd~+%L-G!UI(vxvzf;Sd3=-@h^cK zRdiu)5sTuNUB>#Q0I_!>WZSZZ0~=w?ibmKM59awJ~INQWGq{8$~9 z${I`hf3LOo@s`8+Hs{Y-$RN6k8+iM&Y}NXhXAWZ^TcWU9bx5|2;m)+SA0G?P4tG6I z*xwH(eOpO^%Kaob;F}CTLBWaE@h%4yR^L~^;ci%uo6cP6UkRw1OJ`(L>iR@+wc69d zJnd&`IfBkPRoe!iXThgO_Mxlo0;FVW2g*-f3lv$U9H|^Sy5I`muGX;%^9^l>z5ieAO~qI zw~G;n|7>psn_7o=74oD`U(k1YXZLRKKL89B_AjFTwNh#6o`K!$@p=n;UdirO-X-(c z{WN~oys@?4A|hbU)+KYL+AG9#o0!z?z$hy6qV`J=LC*oRZmvAXP6_|^bnmQrw2Vlp zF`|@Kds5wL+2oitCOv#LB%YN{VQro(%>JetHdd?I!AFC*HxYbS2;NNadm(rW!Q#h) zz_$`SAp~zDct;4{PVkiw{3yXC9}nVwjNnBf_;G@dhu|FqC*2VQzLVf7A@~V`cZc9z z1YZro&k(y%=LtR&g7*`g@rfYt7YLpmf?p)~g%JD_!Q@>*;0FjE7J^?R zczpG_{k95PViqL_&C7> z?hfMqgy7{N_$0xnLhxyVGd~>!9wB&c2>y)VLm~Ja!OqVFfnOweLJ0nY;2k0OFM_Xx z;Hw0e+~b_J6?0ltJbbFLCI~(rf=PmtJ{wS7f~SOFj^N!P*iP^tA=p81zk7qYqX=FZ zf@26i8-jU)vp*LE-i6>$2u>yVoe-QxaNK=C;C_O~g`h|9V<9+`;9o+p)CiUd?)UkC zRfXV{Ay_5&YzWRGIQ#w}@N9xZAqZ^;AwzI3!SP=R0uK;8B?NaRcy|cyM)1`T+@0X^ zF9vb8nB9 zAnqXqKNNz868vQd9!7AFuLXfu61*S;R}p+X1XmN>Cq|w`W&kMqd2Sxs(x{Bk4shk(TsRe z7;yu^sBa!a@JAu_Sb}{I2dNxKupWZP6Z~ojo)Y?MZ zi^c2Uy59Bp#bw3#&tsPFANC zUN=;-&{612q#T@iM=Y4v2$H-ixg+GxL6qDhsg#e|4$L|+S=t-B6E~ zXCjX{{bNCP{0;c^)-xn>b2@XwZ*+(Uh%*9&cz}3IfDli_{1k9N%BPXhGOnFZBqHgZ ztT~?<#1jt~`2j*aK%5mI#Dl&vU-C4B38&mvqU&S283CAV%GD)O93OMdY^kS?Ic9b< zuBj*_rkHY{NuY#}DP|NM6HMHmq>-%-jDBne#uPIOY!P^?UB^T-J9HUD)$-LT<sqj`smw@T8UAYkQZoJ_g?jh}V(m%5tUPV{**PwkuQ= zdytv)F-6Yu%v*hHQ}R(wCkktlU8@Quu{% zy_viCo#m>Jmq}`@Y5;~+ZFdEX^ApzZD6CPYyfd~0Xc>#2h1U~923Fx7Z?+2uX146 zh~}y#VmK9=Jeijx;Eod>ln4@EOndkqNK(7*+d;Pas$=>ioRXVCN3u8% zcLTYJiR8{$i}nrVPFYw9TLnq;y-cERdl#$nJI$^A3F&nCpGA_qETmwk=-&%OBe7CQ zZF&(iNUVNS=g>1mX61ftNp*iG+L986dRxktx|DGCAVWjIPOOz--)j{q&z5%s>0xo0 zU5HN^V&4M$%&6A|*8y;A4})zeTCaj9$bnmrmd^}P**mp~_gN|nQn%7=Pmi0E7}s8& zn4arPGIq?dEy7f3ff|EI|-A>m(5Bw12DDQ@>{MO70*#}vfU<7Qp4G2fe!{3ea zZx52!B{+JV5JXkEydUZ4{67`c$Cmem`NzB>%K!P2|Chiv%>NX(M!0v+h5|5yRA%S` z=(SY|6lUX!j;s7idL~!i1KAw&y+~r=8_3$brxCKlHbG?cW+R$CNN$Z8mF%dDvYuh> zr`p|?i^6<<(aa|srdu2Rh>=g!GvUJjN;a9A)aD`J6zr7>+aQ|-l}icOZW|CX`DY`N zJ;)%9nUuUpCNZK?lb5cxw@}&JTP~4bc5K{Xy#{T$j?Ig#Hxnkb{iu76S$)WIH`;y| zhEwcaH16+?QVg-f2TB*4i`MI~7S0BG9e(Uv2m8=z>|663faA!02tOXY>l@@AlRY#Y z8=!7-Xcsz(p{aD7p=orwhNi&LBhiyu@KOj~Jq?$1>2U`cURmBvw{dmp7;db7 zh55MxIV0xS28=sM&PIge8pw=rd;?}AjSDDD>S=e7(&+mwGp(&3v(m_l=u3Rf)anu4 zbs<77+zlX)(awhmuwuYA>)XGN6NaxstgI+R{p<=Zoee(-WbNXR9HM>^p(-=n+R@v= zfTJu9{YTl#%6y24l@E7)Y#^Z`%F7kAvl&#dtVlvpMjFQ{u0M~s22vmPXq3_Lu>oRiTFD9vN2I=|+dI1g`E zS)Wzkf@Zc=rkvczUX3!CfVNnB3H5;q1?PRLy{8nA6-rL36&KAoSyc3K3c%|moH@ce zhhuy@Ze^vtE0KhZ3yz!n-Ftq zte6^bFayn&jwWScluI-OsWz|%+Z7lD$sWXuAb0^rw`A((7HqLZl6S&Oo)&cc#1?MwK3)bD% zBWm=j;-AC5^ClI2% zyR*_i6A(_1SN4goxGwVfKSG$!1nxrp7@o9>_Y-(s|4ID9c?!DVYghJkYX_s^l`)P@Gv?{3^yM(U`UU8<)gWaq;U=kA;i*ue$?_A*c3o_m-j4F0 z0=^iCYR8k|2}l^dK!B)?^PG*XJ|s7G0g~l-Jcv!8A-2?d_c04$3t<&L?h15nk7G;$zp9 zR{(mS>@go8$j8<`wz|AqK9gaj%*3^`XClfN1nPxl=-P~mG%kvy(TtYY_eZ*y4AM$U z+nUj8YG1%^sYlMuQ5UZC1sI#=d*`T}d(R->bsU;xbM>F%*Y$B?lI?BRyWd{01&Yq- z;u)-GLF_&{tvnu1Q?k-nI_f`%m!oa(4F7p};i(3mQs9{#cs2x{se$L{z;jICnHhLI z@z7du4Q}9E&QeV3aw{V5#Cb0;br#i>fjoYP=j3qd25)KsT^ZebLaNX^(finQc3PoZ)7-u7+P-tc18up}k5+w1Iy}i1RL(8T zNu&yMJ8f4*Os#X3)<7#3yU@MCUyWVoq4iYvP{GE}onP%5R~DJfh$?Jl>CUn_TvVDO;@ zPvujUY(Aw0Po-(9{y1-~0h`v?bh0ukpU(8bK$k-H9(uS5%{biY%+CK7Ybce^1{rRM zFyruuv|;JH7!*eW%==~%qP(9@Fv|M|Go1|$sWw6#4YX_nv=a>pzzlz!!8?@h@W5go z(k-b{>!vf3C*o8JFdWN(fcLZ=FnA~Vd7N=x`iE1=>c24#L*|FLc{n< zJ=Vh{*3Lw;krCGW6(Y*mioMV)s+z3pN{rgK#?X#B?^7HHF%y#{jJf8?tq<)-`m9;dNvHYaity1D$~=& zZ3*QapYGn4RNhhP@!N1`SVGuE%n_Gu#~zLPK(_aQOxijAY($mzK?dplH~~5m!u!7i zTkrSy!4maQHM=+;+3V4d&7}N4fF?T}c!~utK}JwF9)XOY@hSgLAtd+jA&1hB>yU0g z^|{y=_xP}jiVUe$aleA7xm0h4wl8p~UR7vxIW@V%G_Qz>D7#D)WxSeVgFkJGPKL{W zPC=KbzOlt}sgA~0(k-kvSk7hp3ngd8q*)bb#pGEtoE5#9S-aqO|5+38yK>ez{H~wH z2;GmH5qh(DW~OgNZ+88fA~yeP?*&y&ZK{}kzdwX

    xG(OG&wy@_tRKKxD+6QT}Nw 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

    jK0=x{!2eh}I?V;1~OVCDTV6U}_D~DoFraT> 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
    X=5;7#~%P{H1Z+ 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

    49I!L_vP29GxtW}$pl;dID})>jWZl(d_?eAF zITSwD6OrnR*&=y{-A*MLRJfgSomSbMfecOTfm*b-u${s*8oTI4a z86FD1er3PEJ-g(gd3(wZgksnrZ)@^Y&E1zcqOG^UVp&DDrlzTz2@2r0^w|cHKHWerksqH@I3tF-O-IFf~TdxZ+BJ zHdll69XNf&*+_0qk5O4uG1|J40|K%qibkTzq8p!VY7(|{@bzwNfndo<4hu*}pm~{5 zy@m6&*-3QU&hoA@9mJm@%Qnwbu2FKzr?2Qv%9>^voXdB+wzQ6PZ%=OHX{0>L9a={f$D`-wMv7t?;Bj@ax) zMU)#JwL{P?D`BQlCjmwcFJUZ>$vgBL+1S%bw%XOqM`7e}hOBUye`(pXS!1c&xmdH- z7btMn0E}*5o!!CP0O$hr8SxyB^%~Du$FYKN_Js?999qenMLg6gcFp4;$$|a z%;n%~nr<^bjJoyQrH8ML%~Bs-y@K^Q&p*b8xQ?$7-7(EEt`a-t{1@IoK1NX1!te%; zkN@-Jd<5(1I77`1y}2xg1*;5KesvmWrJym&*C=f-!@04I`u*pK^4q!6^M%bwus*;A&t zZ?V@hRhgynb>cg3mCYNP5O!B zbCzfgpnO7vJi$3KJ&&V`M9n$Q&RCTx#-~iw84Q+VjqHfaES&K8vy9B_q1v}CU>I7^ zJhlHb%=bJ*B+BMAKwly7<8fLSd4UTMD#U*?IQwt8v0IN=a(?W|(;N5mJkI{1HSE-3 z758F<_~i4GK2x=QF;38%NNJbFcgx%IxB_px!;Q#ea-6? zdDM>G?|p&$)b$Y#LE!{z152qbC~y(+wcOr<;{aCnBt9%d>^dVg{P+NuqK*VF5xZ-UK`8shfGDbH6eCI z`pzc?W9*-F=cjCEn8ILMGM~eu{(!TPc>g<{zn_O9Ov~`+-V;`76u`bIHa=srEf|z zJIi* zKD?C9w-GRg#^)CJssu4synMlu&*;qXS5A#S{_cD;{Nq3U>geb-f9b|5h9Vf;$`{{p ziNWhjcF^{1c@BY6uPiFZ8aLjU(QbN7P~GCjJ3pm8y3F0<7cZV*4Hrb`DR)d{8`H+1 zW{?TpU4GL~qyADJ=^mdGg>`fM&DyFf?eGMvZKoKh%DIB$7n4R?hgrK{q|P(s?Of?A z|Abe*5od6RO7RUfJ#N9(3aFeOlh(8aO>1f{g);ML0?>!>$%|+9m=4?}0uIu&@kj}# zvdfnv2lQ~fwlF>G0n;%_h{suy?8}YVg=FYQFP9&IDLV6{Fc7GCO<#JnO?N|-(LZ91m8z1##rK|4|+!(j~|0TBj!z6a~ZFk z7ORH{J2;xl;Uq2;z(NQrA?v&P8)qswl{h~|bkMk}={k?o-!^B#S|&aLwz-9K#b81g z#V!%{Qt^c$u8f$id<#V*`zXFQ#ebl{Be zT6HL!N5>s?1S{vyYLW4nflZJct-1Ont3ER0D07P>O6$X;B11Vz(xWSkm`fh^sgf++ zmSE5@IA+HT1TBx<9zP5(jjDJ)<61vs-WXqHwyG)c4f%#0UZ}J4ZftH?7|Nb0w>gAF z8yi|ryr;}Em*hC{79s&oR$|N{^Ar_CJ=S;BZ+$a;h%&pIW`Q*4JYPoj((+49sB z@A6bV%#o*%dUWbMLtn%}h1V-9qaZ7Vkg>b0gazV(k8b$ zEVpHT)5Jt1G3ZSG@kzGxvB7(QI1VR0o5fc#Fcf2Z>k@U?t7jj9)RNG-%dRvI0pp&( zV=PObz)hsf-SAo^i-YOQk32cVR*fy6mvVSRb}Q0#R^Eq9Q}`(gV=Eq^CtT~F48$z| z^wd^hFdXA1^~K4X`&^(gR^l`w58oY-mZ$FGkLWsh1C<=I@w7B5e1KuEE?1-%-5e#p zhy`n$*Sy#q8~5!fp9gg4%jd`AlAGj@em#pgd2xwVt#R^OIIm1$VbtuyXcHG%M7X!23t89ctaMJ10!5yRWlW78d7}0N$$t-J2;=VwYb`a6gTa)pbjvvj zi32EBM|Bq&X-cqHZBSTSIFL0)|E;^t{v`MN;qT9ADRUq~6hoqc%VAJyb5Ocn-wkMa0HgES6`byEwP9(oLLOS?M0m zt*mql=QQgd7NtnHb53cd&!~#_Pg@yy;Y;?-w=#aYl<~<@#;+DK{$U~gv$^z_Xk#xj zP5aL|cT~x9M418`ZYPK{k8eXcv0wkHZnKpQ_sfxI{J0md+a43OsivhI&!Bft&VpgI zc)FE@gCCq|I2miJjax^k){rr(JNvU^l!-qHg{(BZe&cDivkM#u;B+!N4V_2lCrjw{ z^^*=$T4{^6D30}-?Q6cWa-?+zu@k<_T(X?B&Le|{Jm=E%$TjE}$FD55+lh)ZOl#8F zMC;wKiL2)=rn&aY2j8K=;mMcAOJ1tyRqS}T9;;OH59`3Om|VQAZ2g@kCSyZok_(A> zYD4^=cFBI(>_IKReBIC8bJX^Lbie1KAaKsR>J#%9n7fMu`@ zA6;4!_En(1v+tdjkTec=nv5#GC+4RFSM7Df))(dk)?7iK&4HO#mWEjy1na#}a3yezLJ!A#bqoI@*;pZgn` z(U26o=%-ahmUW1Gzj!k^yR4Lvk0v!$n&ft}aiLAqhmjH=l%1}aj%>o&z=;L<%hb;4Ahgiri_QTid-x=>Ly3dd^@Gw5XrH!D3#tBdQ)(> zk8N5+(JV29wIs`SG+h79|_e&ZpM6rdv&$&T@$O(FK+p@s=CrFKD%2;kU@Sly~%6D`mq}nw@XYP(|=r|G3Og$E+0@Bjohy8i-$ zj875+B*nTqaR4~sh!{=FLdH}ojdy6`HU%D-bmj#6SvI_2f8{Un;Ve0t1y&HyJ>r&U z?6C0a@&~wiRdtKDitf*UpW}0&Eb8+T zM*=dmR9qX2-gqT!^vinVsLw|XGRB`tRd_kN*bG>rd3g`B`4^&6(E}zck1%ZE3uJn1 z%LXXIIK`APb)4EI34A?g#E80;JEv(nKG_Vo=$fvxouRX&5vQ_`kKi``=3+Ihr%TXd zD!pPH=cxDVGSA`J%X6%!;B^x{-I9UW0Gc553g{l#0Bm?SzVxJ($@ozQziJK>D!*e6 zKYxXJiM%qVi-?b&9-cjuFeJUS%HXjG7UBXAr`k+9zQD4}#Tm{p;+iNr6M~QZTIhrP z!YBWzj9h%frCPAFyPyUH%4<~UDo@k+uNS|-M#raek%TuV&n)HM9oh27NE~-`SlYoK5TH}guvEAr`RhvqI?NwOsA_VZ zJZ6bJ6@^gDg%m%n<6~Nw1>2_=Xa|0kY?gyD43?U(M#XGtnpP^pHRtx*8QPiUP%gMk z2idu2vP<~-68-$i^GCQ4yclrn+sJbxZOxe*Viz&rM~9j?jyh7Zy-*}qO-ntM8ILCD;-+WWb&gszTps$M z!=uw-Fwz8;S|kubedYLboCd(RF~?N2Ad6xtP3X>kNC_7s{55(sU06#@eSn%$uu!27 zuSQ9|!&b3zcOG7Y<5iTHPK{X}#u@HXqPqNC8X~zYe2rLieYjqFE17{T4H>xBq=N^M z#RfLz1dB_}s^QUhmjFiZ^E!T67k9Kxspqq0y%3!?-XrJm-yWqgj)6<=$QDU4lsuKq zOReSvL4{}h{AQ3hmZsM;PE%=Vb|KdqR_*73E~?<=0ZTyttRUjkx@1PVm55_f82IW} z|F$wEYb!NhSlG&B$sn_dN>=h#V$NnO6Kk4!Xf~^mO%E-_Cx`ZkP{%KYi;8%n2=@*6 z<3>{%Xt{{MBlWU*D3ks(OQYQ8A_`){=u{~Qi_G8RBt+|ME4EFV7?vQotn9-#n0TP! zo{Slz4BJ^g*551>VV5~)Xd87S^VD^yW9843O2-^U7c_c){?G3$~zrh^=f&`X2!aZ*}K(&Z)e)F z#vto$mivGwK2fU-obNN)B1w7YxZITXJfnbl^pJ$5Q7_Xpwk}Mv-E%ODzfCg80*mU;g6bU)rhyzC5D|znUcc z;?qgO$N$GP;n$OdU;Kk7a60^W!&c-e-uUz~j68=gI>@&E^%Dm(iFc@s&y-QVYvCzW zA(`-4+n9zzfzxj!<%wiP*XEUMqVBt29paN|+qblMKDo#+(Gw6oE`N|^AMKg2c*u2T zaVQt#@OpzY*RQ!&fwdv@YFKvQ8xI4fD&ss%nk2TTc^d=2+`xv5Ni}zl9$$Wa29Bu2 zA4GGH&rZI(z_j$)8@vm{!!4c-tlHF<05HIBew;~tAI8eurRV(@1UxN0IF{(xO~u8xeCFZsxoW1QSlQzS1@8g~LwMOO8+V2@nS$a>0ulJ%e?CBuvEd?{ z4399&GsxNa3s%-6oo8GMuxx(M1U`|ako_cy#Y~b;OCsiCLD{*YP*~ZDz!zddS(xJ!`xefa(9BGi3jiwn`Xq3|emlspW8MoaH4q@$=4AI6PP+JDWffQbTC5!)qtSIPD>2LHWhPV2I?^3)`*VF_|+Hv=& z{yycoP7~x?etS!T;BPTl!B1EcfAJA044Y*B_QzxVzI=7W3srD^rTk{tlHWc}{R+;p z;bO2^4-JE%N*GW3dtHQ-kDgU_J*)0a4;lsz8EL0Ii7{cod>cr8-N@DrcF;e~cc zf;2cJqrdI*p&S@%0vfU`#_BaEMC)s12!L{V)7=-m!yt1F$&mJaOLz2c(eLbH=lk!mL-Q4VTRWzkj!EQP z_DE=clWjt0h?PSB$(7{8=jX4`DS48d|MLg3)k=8E!}C)FGk@~wOIlRoVwmUZ>YzXQ z`jtQ5yVPY_e?C2vuRv*|#(e6jXXt03bct)aIYAtP@5M>l$dDI=v2G|!J6ZCXA4{_m zRJubwSmR~EA@ycsT}x#r_~moYJjfSM#9l>$bUBE{PN~LMBVcSK8`S8)wURkdMi5Q~w*HfnYFFtg-=1ML zN{4ZtWN$C{qgi`%B=4wO9dvoYAq<=TTY{!PjI{SL?|tK`XT}7tE9%(_@e6I_Sn;wn z(CVm48}n;?4GI%syv6PSR>t#E>K0kbIv+{#sR|ro993u0L3UeGqNsP0#xgbV9esW2 zJL{N7*tsGEVQlv%7W~eHy&jwrv9X^X)R;(O?Bo1!nzfzIR=u67j6~+`OugJ`%G&PP zNXaQ|@=OW_QE@X>_}Mxs-(VeFp=cm*#!=2SSY~?4}t)$aZf3mF^^3^Rv2(YFt!=6 z#{3nQaWIxu5<1^QtU+>^X}0z~6zF!P(#OhF%?eUg9%F6zzNiRo?R_R!Y7OU!-uXElb6|l!zrz4k2#a zmbGxqE=ooq@H?=uGLD)E2Vbe-_!5ViaO?J%Z@(TM zKi3zoUpZ^L5y9_S;u_BBnSLiRrH#i|eDsONBQE^BQb_ve4av^5jsygC^$-o%SF9>6b^oE|BS# zQ*J$Vg{k0%MofB_S#X)DXI0>4Sm@w8`cA~6xkF_y&B-#^k$hnrj?QBdV5|QUDTf-w zv-FxRn^R-F%|%|`wvBJqU|U0G+MX)Qf7tOp(bE$HzmagoPqKP~E(9oxZ;x>|PWJN= z`Vj6tr;=q!YD{6nC{tvtGv?!s16;8rgF0n_v4h3W%L~q}_$Gr0UmQI`<*mDy+S+gc zmBu9rU-C_$46tw_16P&uNIj2N{}$iqmi^gBR~YHpF3O`TUO}X-Z7l5EDD+Iz^uz`u zg>+wBgUBSXF=Hw7be&>)tV1fcl}LSVC8B5DO3Ovr%2a{2l0mbTb}iQdWR;GMbr z%E>Vu%u6%MIVISV#RRpTN)v9ULOt7wxq`NHRYlwBpqfdZ zQm>5l9lTX3WgT36tPdKJ?E&w0+b_yQ70sob_<;rM!^ z{&>K-H9z`ikC(;cRhETU!1-Az#gXeFMtu52>C@8@&-rS`(edWZ#fdC4`0?Ivj&UR~ zF&PhAYtj#T`ak8%`*Z1$w-M^o5!Q~zc^P5?YlX^iWIp$eAIX>Lze0TlhntiLB5n|y z2Vo(Rr~fdRd!%Ql;4((1bM$4viJizw5@A};tK)RrDiwtWJ}&iVseWczlO!&cNk`+j zFj3j)AxpT#!Z#~L2AGQI!x63k(O)N$dGB&u*-RdTo3hixE!;bI!Uc}m;bDdohj8o> ztu9n}VVLuL-#3;tLNT$&u9x2At3Y@~nZk%5w~NVJZw1(5W058T$ab&PS=X585xSjd z&qNhR3~d^Ec{QGCx8*7Q*u0VH6j5W7B_Y!JdkzK29*pmqJ^GS@3iuR*7|W2Q0ZpZB zX+P5PeIbX7JX@Khkgj(t=g=34wsJ^g`rFF$!p5bcEyTk!?!4H1@&MPEnwY1U1ldnr zl+Y^SlUtncN!vf;ILct(_NWlzUHlkCahW0GriP4Rz{Ki6+eAiq6( zj_-HlohyGAe~TFpyJ?Nx?mCFk#RScn%pdRA0UNle)-rXr#%iNGA{X5c@CWLLLij4ybEzh!Ts%6be*d~*x$I?79(yy=&_EzAR*DwGc=df3p|>A)m;9}(x{ z1s_Ii;~PFoZ)tliwOhwfB|;^%I&A%RuS-29jsnQfSzAR8Ug&{HSc&@s$CnJjIh>K= zkC#`^h4u(vzp`Iv_6n*5BFVJr?+ba5o(#?8_Qe~nb3D3|MI~L7I=B$Xc3Z|763Jni z(=`BJ)aF@v0YODuX(T*=cV7vD1IF~Ed2mDC-60EI^7@D%Wi&0nY}Ag!7ceAAs1Lls zt6DqM_m(A7Ui+QRxqWqY{6;Vjw%f+Ycv`{jcLk*UnPk*_CRK!ms`(b6zfgehw_*ZS6KbV_x^&i3Y3?HV(bm)2`=f1Ad zba5sDjpz}6(#(8BKxZyi^su?Xmw}#R8DcwQk}?je3I;gHM+VN%K&VZg>Vx(?O@)yF z>%`zC74T=)(bZgJNTGOZ^!kFmXOWfDe04dG$%ULpB!TDi6NjR3Co2+Po2sS4ydYJM zE{OpTHZTj$F%2*U|M|lc_`vY58@L%yYd*%84RItHE(SC54rQeMh5xXUJPb2%b4h;K zf&g7wa^(k09Dleq9l;2mrx83&J27V=jSh5#9R^%nLzmwelk#9L2M&DCm7@~P@Sr6q zwk&0U-Lf$y|Kg2E&9|~7m%@w>-+Ag&c}GnE)PO{+5uTn-zQd`6^ynu%^0CXv150ru z2mg(My`+8p+I5AFQhwVkQo9RJM5x9);WFwml)d$R_^*ruTswCtrItl>Z2N4!!#!8V z7tMvAQ-m&gdA;{hqEKb&5v16DaO&3d3c$DlD+?~{LEeGz6t&{gTAo~xfK>TDS_0UJVZ5wI$qo=+F@T+cg` zQAO0O>{O?P5D}KF+zu z)&~SDgoAm0O5(|W3xVZdj{Qltu7iQbUqwx@*Ema~OM$y;fgnY0s`wPj_yrKx)5 zy)1Zs6h?$D5|mSsqzsEB2wFUE@K%<8hi{NmfXn40pr*|6LCYN^Ru>;R6{ zb?aabN5#ELI=Ba;{X{d6U0RJcxp4v1~ zOFZUuH5Cp=vn3Kuqs^yj*s`Oh@z3|XoRQN+MnX&!n7Z-rwc4|xc*7}QX##|*wElp! zSq>b4gUi3*^esCloKtyv{%0KV0#95AiXQwPx-?1C31XSX5rKZjh2kI@oM7}R=%*&4 zJu)QQ&#Xin^|K9aXO6rr>*1kK;-m+a>}(CpP_~qEh&R+&55D$eztcd?5{^z@|9N=) z-Py&RH-oGN;a@5WHa>nM9i#rz`$%vQ68*Qny*lW+3R-|Ckj{$cIy)Jt``}fWm&dO- zdiQiGLT^<*!(nwt#D+x9nvju=Wi))l<0dqO{aIUPENCo-zTz$gW zlIyC!J^QoP4etbwc~8b)2jdswl!{{5GFtk!)6pG%Rp}LOs8Nu7`TI(LpChpF(9%X9 zkB-?EMC;R5>W3e{xx~9d3YjD^)Yu701EITzl@W+}q`+{_l{>QW9=UD=4;h%-) z>&skQ=exNGIPgpaE=|PR4Zi?0Zaee+eG#4iT2CckdLJ;lyU_Ps=c|^zmM?((?SARQ zrhut(Zs%|I3yU%Zswoq^>A1+K$6;{>ZT$AMBXm2&pQZw&6)h<}d(_S*OQ3eA0w!fgc*xZNhI@y9?Xw< z(oJu1!~!fu`VR2Pr@gWp_UEGy4^6&&@SrU)VH@47Nrr$;veT+9>KsR?B zCxz8p2Vo>FmZ7;2Dh1Fsase_v1;YY=i%lMue#r+Caq=u5lJ)f-93w{-_Tr(@h0K!> z4Z@MGASp*|Q()1Ur(3WRqh(7Q@x>#o^2z;`aBq$*j&#!vZ%fD-ZT)Po?ZKhrpG(E+ zwk4lBja=y`U6X}t_EI`+K_A86syK5;n;ZMnIc^USHyt+DSi8PL1^(qLd@-B9Fa^KZ za4YccSKnHajctk*P0Lb8wgurLa&vVU;DY3fUu0 z`;1tQ&A&Q-az(l?ug=E&HV03?KI6$HLM+~(I9*B~p71-#dIM8d(csFO|W_Nya3&!r|8<%qII#9p)fiF$- zLIt*~%d1JIt<5Q>$b+~qM=`5qG;}$Q??%0Y zjlPsi_wt;S${4+!iVGiodVppR<0ATCOr$sb$Y8-z@p}1}e@;UPONAhh@rFH`H7tlG zHqNb5xkr2jzXmwfGsH8b+?L@T<+$c9@w0AuzF54H@6~{4e>jA<^D>l_dh|W-YAMq= zi{@BImkkn@ZTljlrC#lAjs()!=!NRg0wa8JeXOef7E8}mDgp@(+uXr|>h&v6!!Ux^ za=qbM4JEkGS1$*=`^e7_=>vLyN`ci@ea0+!{4u^6EM!+_FEr;{zN?97BJa7vD4Xy2 z1~fVA8@}7=teL!0wVeeuZYOeuNjb`*k^W3Qgg&21k!CLUe0I9LI#-WbqN=iwkNcXB zafibjUg&V2-_o|<2NyVpu1~j5{{#Ei`l`e0%Cg20Q* zH)ptV$FhmFcs!<2tZ5q7RCsWD#OQj4b0G!BB)C2WCF(}k_{b8b(;4hnJWrR~NY^<@ zf|e&KH?!e(u=xsmK`#2ultB%Y| zh$}c~U9^k6t*;L+$G5AsG%QpIh?dmjSD;YA$HzlIw}o|9$731Qe;#4BgEOOqT7$;OvZO}$H6XSN`xa^+1<3?euE@?YJR$08dytMG$}*3f(j9YOIShx_^!kADbMwIb89l!A zRuTg=;f%|h`qM)-=k(v6K6!>E-C_9Kd&Bu~GT<=Za5-EI$HUd|W*GjH-!74VI{ab8ZHD3h{(tWee+HYg;ni5c zTf<#Iu7_vCcSw5+#a`g=Auz86bAg=Aa0i$T(ry8LIlKft1v{JI^1^;T91L?+`A6`f zuq@}<@ZV8Z{`^nF`@{c6!WiN4o`;R$3H+RSHtt+D^!cs z8GiE+DW_1-3#jfIskFrzF#nA7Cs5OV*=bxjT zGw>qE3*+(rF#Jo5o<_J2iLRt(Z$bV`NOU^N@)W;bfIm$2Bm935-r+i0!n`i-!pG>1Y_NyW{CA>_V>HWSq#iG6=!a;jwR-iJJ^a{h_cdgD30a5B zs3hy_e;f8Zb>H|?w7gww?xn`##C8oOOy2F2m?8T$yy9w%2=L=)EglU1I3y1L`3kvjpcW&p0$Y&4t3{qVoCPvDc@O=9O5;4A= zK|b#@5An-8nBgake{2OFcSi5}iAsNrIH{f6nDe9ehQIpJ|2_<#eIt@>5L3uOyTudH z-#MP&Amsqu87aO%=bdS1SA)UV%H`x2+^j{$5aQFsXK=b3@3-y(7 zy$6oNkC6J`z7gp*gZ43}O#k1==Srg56`%j^^RZ2PUA`Fp9rXWW7=Gfdouyxj?2Kuk zdgpVIo;5ia*)=*-Q;hb{i1{%i2+LycBW0tkx1{^W1=P7r3pFP7VvYa)70Tf_g*IY& zPo-?q41YEJc$3L{58g5Sn6h1ozu=HIQ~vf5{{Az(?=GU*5$bafF?IOs_c5>-{^$Qk zM(m{M8ti1R5mp#<*$lK=>=;f#$ngx_@CaBciN<>$SUSdA!+T&(HzBV>2>TcO``++3 z!~Y6_*+G&kpWe#;+rT|GaOzX!9^vm3D@8kbchw_cSSg&)2Ce_rQIXPfxbPn+k98pC z694D<8{~LkS00oEr_Dgadd^9vCEfzB#QR7LtXtsFe%Uh_c**OsV{w z2kX9_H`P+kX}d%n^89@G&*2xt{{?&e)!*EO7WL_aVfggka2uAnjj(io_@*8dU%h(}1H&y-Y;k^YTP|5Et= z=kSUAn<)Ns_?2*ZJPd~%Ghf4dsIv?FrZ>{t`0s16)LUXJ`rehH=&KySvFTmH&xmv% zM9}`*xxhD^v!rP_d<&d(An=xOB)?bS%;6^o2U@m<%rglpOH#2+Z5zY?{P$8Js`Olq zY#2XmHK?frw29-xAdB5>UvGM zx?W3MOs_S6Ret;{@q5uzjYJlw*3t zNH&kmiBj`TBNZ+p?Lzsm=K>|=7dtML@A>ueT?@lj`OJ}ax>dgCER|p8FO{EA^Yz#K zx%zufy?mmwK6arNL`nJ3B3C(eH-Za>vwbY)fo+t@g}G=HYb~IQLZrsHI9>)RtfXK) zd_EE>L*xn8Ad@7Zclba+Ubi>bJzDZQHm>(X5!HK15!XBEqIxGbs&~g4_p08B_4)U* zE*%x|_Yxb?`;?-s_c@A)E)!i_?+M%1dx?$fz2)!9mwzSxSN*-j#`W&p&A+N~W?BX{ z6W4n$HmY~>%_M=AxRt}bLawOdcs_o;z<-PLDb%@-!tC+IIy%$XYHHET-L++Bnp#nB zX*VnAMCKJW&ZONR#PsZD|v^v+FK&YwXJMGHE}m_dK6XcQQZi!<$V%UqfX!=`K;U(p4{bYgZ}Mq4;W7y_{-I zz1(U;uwKMVbPd+a@qP6wsru@bXnX9XRB?MbeoehdODnIb*GPpKa2kz%g>?!&KRmli zQS_a4tktLJJ0lcxF)Bv49c$urbA3pQTKc*!jfjL@8X<+r7Pb?7FD#XNP&sz3)!Zq1 z?Ud;H>{QbA+KJSCb|OWeotz?WCsIi43)soA@%B_w#O*Yti`r?9F0S=N9ko-Uh}x;7 z=(SUtKpB8xP9}CLw_&)jF3PV$VA|;wN<#%LM{t_RRKT*Z> zulR`m9oZ*8sj^X8P)no|`QPCi4I3QreU25yE2Pex-h97}F_}M#A}um>;6>U`AhcrufTMy0B9U0Yg!pHPn;-h*dRZP!B#`Nq+<6O}*krGKN zdUj0PpG#z0&r^I$&vW>;_7YV~&k5PmbBT=Vx$e)(lYgbJsrYk=jOy7rn-^8$#*{y` z5!G`aGNxzp%w&K+^EHTPh|=8iS&GjsOww}Yso67yUjdVT7kS0S@ z&+5;0p0u6&a|{{PvvW@V9Oa++65?K)DyC=mQuah`o|z04J(H)$=OvzwY3sQ}w)H&4 zxBPhy-}dK3)zWi9w*0w7w*6W0b$@nDRL{igC{*fI@rsgj+n?v~Q9YA3re`8!dUm97 zM#Q_s_&L4(6xyTzd<~V^;`Vx4lX)i&qNNAB$UqJz$x1zlO;^&2{3|t(Nxs7FXmKlK zrmmzkBE?2v}NhLjR(2kDpvtvosXU8dRj~(Y|`z(?; z^w=>`_1LkbT4Tp}d(^V{x2HXpRBP<$B`%FK=cD4ZTxxZV9oJL!+mU5ua=v{ByGFbw zhL^g`u1>z!LYS>SjNwc_VYJlnlPK@3W&ydS?F4WlLqOuJ^oCy1A{yn=PSOS%XkU@F&5=>L`$zFuBF#0x~|tbbW5*^rmok7tLwGI z#q?V9SLMgQb$=~!F}*rh^OeOoFy&1R#Pr&Oi|Cd7veNI~#ojz`Z_?}Fj&S1>BkeQM zmj60L{N-I%ym|L%n4U)&4tD2Zwt2KKPNv&E@)O%C{dsb52&r9sG=(q=()?PtId^ zKPx%y?q^eeyZYH2zuo;TaoyF=5~p4LtmL#WKie&ysZ9L4YdkAC?aR+xGHc~K^qW)p zXw7~3*?u|g$ImEJR>$|JBaUxy-zKkf-5P~`6h)fPeA$A%m ze2-noKa=X6rO2G_>lzl@RKl1o7TeSmY5ELtmfAJtgy%H5vF_qCO*tJImD9C4ROBQ^ zB2Pt5$F$`vk!?8>zNJq^*7fO_sGP)8^HDiR!^Nxh37xCGXcI{SsG9P8sj;<5&-w#-Bs5CrK1$`(TTi z(pg*`19Y((CvRZ>g+9!%RGKMux^qw;M+e$`SxF7}P=G2`RoOQ(1q?uU=*0-u{IceU3^ z$tUi=WPZ!b0Vw#Cn$?QUP^W|rME z&;9vfk~6c*-t@UYKct-d^F!xm*4fby$xV8>9rfmX_7e|FZu{}WDbIcQ;T+HX#KXjS zAAXp)?ZXdCZu|7Z-Q%Ik#=kPg+%a~Q-1g~*E}=z+9sA{}ocoK1iSz#akUaP2ht93f zI_0`5zpbp_il0649kfmlPxH^CSbyEm*|c$k{KbN2Hz$AQ!#ART@#h=iESk9y&1X6Z zMz*-;AolKE8*G~rhxe`x=X_Isp7`I4pO^ft7B`~*oAGnXe=~mWocABk$yvs_d(^Y@ z+`pffocHhNQ~vw*^Ev+e_w!WBzWqFL-nXBZoNvm{_Z!buX8zrGJTE!ll%Kog7Pa;` zZkftYZ@DQyzgf;V-Agfyq(|`{(p)8pW^?SbEjJ?9=#mQ zhqqQd*6}f0?~R*SVQX}^R<=y@d(fN2*gf!(I_^PZS?zZ8D@4m3>qS48*tlc8oX>vz zDskI~UzOZU!aeA1AAUvI_Tg8~$7;9QugFJ6o2&KX9Cr1qlFzPwHRZOOU(Ipb)vprI z-TW%?+0Cy?KKt>jUE-C>!@s-5tCG)t{K}=Ww!FF@oXSQE?#Hk8$!8yaMR~H?ZJiiz zjU3YXk)b=*C0g^P?pQbFV0Pb064B~vJ)mW+E}gcJHnmz0&S6(QxK|7-^gvqaxmM`G zY1iwafaPU0Pp>a)_iR&ooOWIO6f#w|PYkb3Q?A@Z;q?cg_PK|9pNTfp{h3~|449=rQZ z;_=8}i%LZ^&a;zi}SB_zihT546f}oO+jdQ}WowZ>F5q`^_AuU2LBCt@oS6 zW4+&$Ja+e+wed#f;9nWTt%{u`kKO&orLlIos-K$5L`&`NH~ZqTtKU$LtVUbsifg?@ zntg1)w-uu^U+IcdsnmSruwDYu;Hr9~rF8Y{E;)5BZDduwo!WeQwFGPG&9bFu=`7Xh z*44YDURUqLV|~5*?X9Kq?;3lT)VtK1oTT0}tLszVbX_1sKHTc-;i<8;|t36-Zs>l@)LTHQLIvk#fc*(Beyo@KnUXP%;mJ!?4Az#jb; zt$2@hAKUgG>+U@F@3)EbzWui3ynnwX|9$%{dG6b9ou^5=7r!M>>2>$wx6W;!@wVi- zPrsdV-k;yjao(qoCI0*K+r)E!ep~X~zu)dF-m0AZD`Tm>#M_eR{{7aawK%hval%w) zdcyww_NI95+ixjnrh%DNhxyTC^9|RTwSsk=%wK=My+*zZKePDWxr%-Mec!TX7TTj; zC9dv~pVWPi8qI3GC%;52-BW$pZX}NGslLu{zkZpx?$a+zt|svw^}0{Lq^$e&OXp{` z-q|n7PsXM@>(4pu%P&iQ`|`^v*ZuhA9M^sMW#YXbzfAo0`Rpd^kXiSJ>>zRXhIos9ZpZ?eW^Tam5u0y7Cv2}0r*A+f&im&4 zK9z7&eqWYgHMt=>+?3z54maiZ&f7GzSHCB387uEq-_G?W{J!LU6MjD}VgG(VSHeyB zeJW@FexG>n-|tJ_H|O{Jj`u1z|L#BDm%MMz?_GL}XL}vzOzS|;xjDbTY2G*G_mn%+ z%*uG*xB+KnysvZJ&F>?;ck}yL31ZikejhJkH@|O{vrD{h@!rMnBfL#BH{kc{<9$tT zw%1+aeT4VT`MpcOTfC3eA&Y7^5Px=!_pLhIl;7WEyeIEn#`p6&ajrMv_a*O}@cU^A z`;Yf?CEP^3Pvz`C-Y4Gs_xqCfO~iXGVc+rIx!#=Lvjp}fH|O`Mgq!mFvV@!S`%z1K z?Muk@wpie%{GKI{w`t~GuEbvr8=Q4Mu{(2S*5f~jpv*6EBYvA>;b&bGq8GfK5HBOE zZLl5^&w^NyCs>0_l7QY3KLRq)k~01a$lzGBeHTSk@2QNew!wNt_0BS)dUtHZ--(s+ zN>yG*Mf6@`BYK}wwDmqmVI>9Y(bjt^qpkN68`pcw-<2=_w*9@t#`W&p&A+N~W?Dwn z-xFO_@1%(8-LXmUSBRCz@-~a!i8deK+o+`XC^qRmPT~IEM`0zw-y?Lc_XyVY9>vD> zuKwQQOMAM%N3n6eJNM-8@iIz(kI+T+?mo<~>qPiwlAvE*rXXLB?`>2>@6J)N5xq|- z+WtOA5%Kp#*VcQ&w*9@tM*LkVTK?{+xZX*T%~z`4QgV;@`y54F@1&0Eo!F?}9c$cw zy6x}&R_(#SuenbBJms36-*00~x&}9?K}8bUSiCWVybMis&(6+j=aq5j~Qktw*BTdUTX= zT+ky?5+N4!==pVjEKzkmPO&vT&SC2sN)$CcCR9z2B`TuFWq(v&{40IMf5TDe~9VNx#BrQJ=+_4N62%iQ^L6K1Zyn!8yFd z0_*`FU{&Z$)`wn5I`2v2n$gS}(QnpLn(X&?qqlakGZ)dq?{<}iTuh=J^dhlv2YRW? z4jRd7vC=Q#u`A_wuN_v(@ASL*MdGrHUzA*S^9%CY#V<&|i(fdsNzv^Wq?ZWV?H5kD zHeQtUYyD!%Wu0Hlaan8E#A}^jB>HuJQPS_`7i;2$me0S^=Xb}8l72V8a4D>fb@wAv zS!j{n{9+&UyZ8mm&uZ~u*|UBv=lXuY2;&(>7J6PKjUISpiWJ_-)vaL7bTY4j=r8mbIw^_XrBkg}yZ=PH8w-Qs++Z4I1w>e}@Ckel- zw}e^NTZw7wZOPx15C2NspY^vA)7G1FGrP~W(9xeQ^g2b?^*V=c={3>R^_p;Xy_UF` zUTglU{P?%-uO%*~SLbTJvKR-Zys3ehUVCs6y^>#6`p?S9we^L*ckB74(+?sjt8Wl1 zb@@2PH>*!mUh&Z;N=k1^nw4ACBfPU(B5fkRSuN2~5j`esTaP8yxHsi(>ydohdUTYP zyP!v+Bzi8$<@t3zmZ-WOr`Vbv=dg7>CW@LK6RM`i5*5+ovOg*>{;m0AiHhjaIhsc- zwCgEf);glcII68j^2*D-kDagASe3fK2yglQsR+t+`f(g5(8veScjI6dF#OTCl zgIJL#Sc6QGciWP{ivu#yp5n^^85|qed!mTyy`=EA6RB+DMefFa}*I>Cc3u2Cv02qCDtUV`nyuJ{M}J;y_14%Bd+&E5!HK15!d@DRlwJX zjq2U8Cdp5?TVA%`@J=n)^!$DsW70LaNewFU!2T5uuIHg5k7L^MxR!=ld6=u~eRFm9 z+?sw$OiiAIT-J|bmh|JfZFz{)_8?`=YCCZg%qL%BTyPS zT+*+#Gr6p@Gbz{E*(t5$4m*=lqF{%eoup3?W)d5*r{T8T@qofBoRolDBK zcJ6D>S|+@qsCmy~Pm>?K>P=!o0X@~Q2$cHWJ0ot;@`Ci4fa9xEH|eH_P{U4Pw6 zVfN@MN%Rn|2mCb5ow^eL4A;Xcdh6j<83OenR^n=)9*&LIqojz}Bhf|ep%gKDIJUPQ zq{~LEVU3Ya>hboMa-#cU`3Em#Qwxup*Z;6#Ri z#Kc+Y4ZXrE8s)lWheo-Mi|I9?BYG{-F};!|qF3S~dUae&uf$2zSk$W{TK-z%T6&$L z>w29-xAc{0>UvGMx?W3MOs_S6Ret;{eaWJ~mbjQ+ovZoEVjP(ArUqhq?ZHL#N`6`C zKPe+uHrn{vQjY2I-Fm)hq{2m{T__*+T%e@mY(PEZS5thmYx%`rRNeE)pOmSl_&p7EU)-;iHz#mIhz+%;>MIewGq{G zA2OzA^2}uTg14RVF6s2X$wNG!BJ~RM4NA(~h3{0}-G$n0bFe!P)8}3|i54I2L#9m2 zJL*Z=+KxP=UOQ?itI-aAgOQ5~p4LrsQOj?Wm_+{f08_>Nn2A zYP8C4$U}P8Rr+x1UHqoxv5VhKIj#4bIZnIyP2#uSZxWC7epB+;-EY>$8b ziV~@3X%{Q%>$L0Z>sB7R>Psr=N4o0kRBP&6(ypm*;?QqjrR}w^Q?0KrInX!O*LS29 z`(6z%?dRv*sq*@+qqQh1En+PPvGN1PkX<;KBrEkG z{r^f@k$u)F(tpWfV8hZQnA?RvW>4r}dRa#(M7@>y$l(yq0;)2^{QX;VCp z+TE$vwD*#Bjoqgl`t3f)VU6t)pMJY1+J3v2wCnBO+upTY{!QbSKA&;g^>$Aj*4n+~ zu-@+Ev)1mUU2AuzwbDOq_jK8~{F5HE+4-}68mnDrX`+#i`oMoXN^rXm9rbaV{`$C; zhERQomN*=$kE46+Q_}R*CsD@jqcl%{H|3R>)kI0@O-ZwIt9pbdR7-R_4%HGJ713kDw)I$IBYGr7TaQGw z_2?+$xS&U(Btk6c(evy6Sfc8BoMLNwoWs^NlqhO?OsJY3OH@RU%l@dm_*cd_3;tN5 zB6@U=<`E0+ddiozj_5ItYU`1_vU2|}k3iW-;-~ZJrnh%$xu%0f4kF`hxv<+T6=fEC z&6exAwQ{}I!=zlMOS_wt>*@35mbvrgCd^!YHFvwdo?a`Ln5GzM!AlQ z={2DvdM(j0y^nz~*SuCCV- z7t?FaUzH#KN(^4~*Af@gt8+D9S&Rcy-qb)$uRXYkUdb;j{U>GQ%6ibBE#;UV->v7H zMk-uH+J*9A&jm`#FLqog-}CF`yB3D6@|h#;bgO*NSt`HGUn)PL=IgKdbM^O}dig|U zz3W0Ph?4RVjjplZ^2}~oUAzGXttNsq+0YK+Xlna&y0bUW3#C>20N#f`pJ0zO89ZH%WJCHJN2cqM4aI}@sumjN&9U69UT&z8m=$IX* zG!Z+@(Zn>HC?j@A=!hLkbdMd{?Lm3-uk;y>_E4gG?BFGs=QZNev>a-w#}57IxE;tl zlL!6BcAU&c3Fw7u`KI>|A}G^clcUt7Di{2s%7t|lf2hjksEAyyHI7>5^uc_I8w+xI zeqF8-RhKJaYx+{uvc5b&A{VjQ$fH_QVnwdc=k)a$vweP%kayCZU}UoJmG0Z?X{|mF zcI9BLb`N|+8xMDvhkQ(`o%ADdekTr6qn$L9)n&Dxz_(Y|!aaIeT?^;1tDhu3yZK4U zXIDQVx83}N9Cq^)=U|eo@Dp;7*u26|oOXRYDLJh7lPRCIelo{ry_FNUwSJN~to4(U z!>)d^E}p0i{43**74f9xu&bZAB-Z*?^gB~|Xq{dCWIr5s^ApOD)n#_ZFgHHQ#>BIu z|2mEN#c!hhe=1EW&5o-|7JYTs6YZe8H0oCTzq_7Jxwf8e)%g{XdE1ai`h|{qI!%8) zOUnLwCi-4`DrKKNon~!4NuSLXx;0FCspoqKm?4~DhQO6e-b%Ufwbl<~IIGVmJ!p%1 zoirl-XMN?6#!3sp}6Vq&>jMyQeBX%g!J$7if2j$Jb(r-4}Ly7LO zgO}j_PQ*J(njSllGHwT=<92YgmGHBj1mxS(FLzje3 zwZ@K#w%?8=?HW6hL%$tK)o(|qvJ!)KB$dRopdB6G*B(o%K08ind+azz+h>u)p~sGi zs>hBc)fzj-+oP7nzcQW*w#SlcjUBy2^YCC?ot8_juCe2Ks(w4NtV~YK_tLz4+COf6 zjSu77INEH8Idm_L>2MXLXyi9*%FMLVSx;$$oirk6XALt6JM4zm*C8AIL)u=4Y);c} zw?x@%x02FI?yP68-B@O?-JHfG4B3q|())$#cGw?rSeTcU~E zt)%IAA#PDIxh|dM5vvo*ij2RP;=w^cod89n;oxiEQh6if`$84&T;uqH5_mAzOMbkx@O@ z{aJbPZ_A%cWK_@2*}SL{H>Uilji{dckTE@zXC}jMwj#jw6$GBsP&wQG> zY3lxN^k$#m?SqSHbx*uRoBy&OxiWq4tS@PIJ9ClR?X0P+UOV{_+VV~{qEAaZ->F8< zWgmW&cr z(XWPIfIizl?~F%Ndh?@)edCaME=R*3U@!P~XD_+LO>}*@AIVhXCf|cyc^aRcbuTsC zS@%WVcJinGxK!GXzAbTSr#d;8{rFSjw!1%-yhizU@+b1#hd+_e?*8OlMwwRn6Zxze zFS$QC{ciqLavAHiGCobY?cz^!yhiy}`cvY$n?EH!yZBSdWvtsy{sbsX=DBn*0l<`^F-zC|0_b2iy>h{y^zC0Tp&8()TT=RvQ)zm4* zY}4Q-wX4Vj@2zlP&BQk=@;Ig~kLziem4~?!ooD6o+?qTkrY289F6&1zOZxHLwmd{q zhi!RA%!k|l^Lw0UILCVo`jxI?wEamB+T{JLpT^|xEKT&=Q6K2LqXgIO&`}?!>90?p zeTWu+4%NreJ@zSSdg_xXQ`ySFN?NJi?RDjn)=KZLudH`bIj)S&2bAl1d_G(2kDpYmX&WpB<;PJ$9UiyI_)i^(Fc)=32=;rRal2t>tPVwtr9!A%QUE6Yt#NE0oWbLwNyIqzt(s!g?cFE{e z>+G4R`|VlMj^%gRlRVbglXU&|bgHq;pglS?_co$bDS8PJt6j93t=|n3B$fZS1>$Pkb?E4`st zw2X#)w3M`kM!AlQ={2DvdM(jbLO||_UdcP6SI1fDi+UwadXPo=9MRHiiEHU~imvN* z4&BmgqN(dO;p%!VaWTEt{8jn!Z{1%@TuiUd)qG_!4orDd12Mh!;39e@zpV71m62=f z-HCVW`KHqkA}FhG5G!^0IL0@tPg7p;(I!etZ%Ue#Th$}Hvsxl;BEDHI(NPgSCTv@e zCDyn%4-x*n(4njYt{bv-7EnjRCXrpFQ$(c`i| zDlh)6`D2NS=+QZvM=Z4KDPPt)qQ^L@tw-|8%7s6Ehp%JvPLbKsC;YLNpY+&9B|S#4 zQWNMgicNZ~Q@B6YQLe`}%F3ZU#`J?r;adPVjda6S-D}f)ClA981JlR0lCFD z12~Z(AaPcDL$C1AM!B?*#LPyyj*ICvp(A=N(N;o0?ucH=JEB*|wfvPhpP$eBiX&Qj zEpaWqPSJI}&Y@d+O*D1ACR|;wB`&7dn!hSP{;m6KiHqsgxtgym#(^nsY9OZ99$ZAP zC>aZ~P%bMy0BzUdV6$~MaC8^lUoF#e42&FX_5s7~SieH|sGHzm!=t?E(x`{fd8 z6CZ!JQ4u{lNAt_79!soouj-K$Z9Njz)}y10QPX2W)$~}RB6?i*N9D!8HGeEo5j{G`x<5|&X6iX;-w0PC4mE(pEaqRP1I}bT2h+?E9$+*t}J_vU7gOP4cnD; z(kq1P=M=qmE$MpgI;HNj>l}5jT@#N!yC%9myOwn8?Ap^_wLJdqYp*5UI=gzQ=KJ9| zJT03VUT4=`=+@Yk>oU+;O+o6N&UQKZ@N(>}aepraJ2eNcY*V~{iTBYqf^-|>C& zyA_6}{6y;fx1~=9O#h0H=--ij@{@}8>XU!OzoT0H9wW@f9Z0iL4P!E! zkF}8&D?0F^ZS%;A5(sM$#^jspNdanDk^5kFX zYbvd&L`L=OoXv|WabwD#+KB484;j-ld1f-mdeZA5we)O6BI`->d8SucC#fM!KUGd5 z_o5uI^CC6tBKBRB!x1exTr0zj9L!7WYh`UcZ&{8Ku`EZzE$KrM^ZM|-mK?-oz4?r0 z6DN@avFse{L%a=|{dc7oM;nVFO-8ht9=x@gZYrt8=e=c-D#e1RoDvf|^dPcz)F_iG zXcu@(P#*V;At;aI`|OgadhAkC_1T5AJ$50!$1aYyQkr%l-sc;2zj9=>y_EQWT!ELt+nKxI7qD@>>>j>m?SIpAaQ>st;oMp1DWKX_GPPL}Jm$Yl_KIPDF_c;!0Y?t`-+da|t z+r6Y+Z};BzuI2Kt^!Huuy`)`lcQ4)AOIMtq%0SJpxBITNYwgZ*Gs!<`$N8-@`=9mG zn9YB)meTaR1HI_${`&GWovo_BwDDDxBKfMCXEJx&8LhipTKbl>?QUtEa;=>c{W?3B z^d`ls`meJy%U@?_r!<*6>`Y4Oy*ujZH2roiDf{g_rSG-#9DTo?6PI2)C(2$smy~Pm z+}ED9O#ba{&n4wrJA292Dmvo!w0vrNt(|wHTxVyNnaTVPd#o4OVeqd5&&;;pZ)41k zA4QR-u@1b{R%Q=%X;qSNl5Y@J)`|JOQ-Fmy);XAWK_=yAJcP*w^Bm# z$Mj78F+DrdWT^Nvk8n)pNY-y*7HrjA4E`A>mXKY^Kp!C zR-dN4;f715(}G>=$l*HgZ% zbwrPGR9lbam6a=f`74}`Ikk717f-p$m??rZ-AbPk$D1CysielTzTHz+rh$%ni7$8H zMYfI_Wl{z00#6UhL%WO52jy{mpIs7Fk6lVCE3u{&c3Fe( zu?zWUQlTf*@7!JCbOI%PW#=$AIFmU$BL8(Sh1uzgb#$h^)zqS!yKBqNG_|7M(!N&E ziOef%oJrehSG2oMIq65z{yOD!x^;F<)NAZoQkw)T>b=IUEPIVzozA2U+m&?E&xPyf z6uovW>3Z!trS7xq9Cfc<6OTT-Cb~YmmUQdv+S6XOJpS!#uO;0&yLzeS`{6h|Et?u% zXV+cm*4UNhWzu3iTI*l4bEp`P#*k)5%oBR>W`T}Ur1nAib=($_hx+kxTMxcZezyYm z9O|VI>GOdYGAh4wR(w?cL>1G&;v@QZWS{(`qP_a$AMtNf|KDLu`NQxWJZ4sS-)kXE z-Vb9qixOe9Xc@cybt!WlSP22Sr9TPaM23LG#98SLy}}b#baIV)VTI%#k z58CzGrcr-w<5aIPoR!|tEB&?3k9Jajjp1T?b*}EOQQn!y1muqB)%|ezuq{JY`l4RR zPvh$nKS#9mTH;!IoucdhI)`rgYoe*^HR0<1TH;#%s_2@(IwGc5qIEndwOO=&$+hLL zbLf~}Ng2^AaS^>bE^+1QgdY%PpCQ67?!G|}5uE85@i2}yNjhnyuAlXlLmDeBTp#y> zSbapQa7{9K5VhJRz{^8&vz8K@Ly|bU#}0`mZikYl#}1^7+kxn~9UN^XH0(gMMDd0l z92c`giH_M}N)xfe98FBKi85k`gpSyuMEBUC-5!)T|3=zFiSDt3mtdaPh)dIQsHGk| z^rPc;An#0`x4%K3z`e59h)?tD8!d$C{=*o~^$D9S<1dZ~}Y8H??qF49Bp`lmDS^XCMl{g)LFV)ErExnewmR_gmy1&k$ zTmG78>UvGMy1$mVm|koCs{Hu3?yn^-rdQ|M^4BTvh`%P9h+c_~=+$vnzjwaD$omQr zwlem9zl|~7eiTJo=^c2f+oy5$ya>^*qJ5^gM@e>p4-i^qi0_J(tL+p6mXs zJo&ff&m}UdXXk8QREZl?{?tZP&wa?4p2;(l0pp2FS$keQFNX0>9br1gI3|L#x`)wH zt52f5vzi6u_I|G=x5yBXI4ixOR~=8(%B7urJQ2ag^y*yAZyS0o(N;o3ucV3SmAHsr z9cNq@^-7$Nf9Lh(h?ZVUTuZN0wA5))uXE^@z7kDcuL)PzYl(~LwdSwNkALg_TH<1Q zb*?Rco$}6F;-bGMnuuPBj_B2KR==N=kt;hd^s}WL)8o7Ke3PcaMWkIQANE|Jr2JyX zh4MYWUcPH#*eahn(oVO^_nf8j%lxJC6KcNxnm<>6 MB6!lXtf6RaPTl9)AW#6GP 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 nj43nZ+Jdd$w=!0V&q*MRKCtR diff --git a/bin/smo/Microsoft.SqlServer.Management.InMemoryOLTPMigrationAdvisor.dll b/bin/smo/Microsoft.SqlServer.Management.InMemoryOLTPMigrationAdvisor.dll deleted file mode 100644 index 7738ee849e4d282d9f571c4aa975d551255b806a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 154344 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 diff --git a/bin/smo/Microsoft.SqlServer.Management.SDK.SqlStudio.dll b/bin/smo/Microsoft.SqlServer.Management.SDK.SqlStudio.dll deleted file mode 100644 index ca8c1811aaf7ac183ad787cab0970544cc29c39c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 135400 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 diff --git a/bin/smo/Microsoft.SqlServer.TransactSql.dll b/bin/smo/Microsoft.SqlServer.TransactSql.dll new file mode 100644 index 0000000000000000000000000000000000000000..1299929767d386239888cae96352bd002ff60c76 GIT binary patch literal 65752 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 delta 4085 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 diff --git a/bin/smo/coreclr/Microsoft.SqlServer.ConnectionInfo.dll b/bin/smo/coreclr/Microsoft.SqlServer.ConnectionInfo.dll index 134102f15ac656aa10b8badf5804b2e6fcdce8ed..6d96ba96df77c89c6fe85668a228ea2a5c251c79 100644 GIT binary patch delta 39408 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 Pue?H@M;v*El&AjyLAybJ delta 39257 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
    {6oJPkxwDFSX8!u-%kI%z?kA+-5 zi@LG9>*u^?98&WTaCd~t?Cu2AM}l{5nL`Zmt|%LT6O*sY(u+r8fWW&M-gvSy5;)lPGrtsnB1M&JKW+f^IoWk zL0K)8pCpt+Hx*SBI3&+Vu$km|FHA@*$Et5~5B9F^Qt7Sg((zyYDtvzZaqxGsOJ87B z*Tz8JT3lS)M<#k->N+TuCwAb;Lbor!AWJqD{=slde6TZ7VF-?4y%pU?hzjr8Zau_U z@40T1oqUrz=KyMdGEu=flLN~?$DA_OJGttbu+}CDRAxN`FC0#NRMpA#7)CViN#rrF zdlN|Jjf$=`rskN_S}fkO?lDze&;U)(A#uZAgpY5OoR`~%5l(rRB^A7~H|&URRq)E) z5Fe{4ysNwC<7Vxx?z23&53&ZD+>fD@2_Xd`=7zjP%!RJVBrPk*+_1#QbRR4GyyMfd zPfpvG6pFhW65^CaZh`J9kVYQk!Fayvj;k8r?tu%I&}v*F-93c|W4lJmwZMkS9I6+j zM{p;ngc({Luk>5t^E0v^UPQzf7U5+3-~3;0@s|a2)gcGh!>F>=qor`5C|Bn2MN5h> z6V~sR;$Gsp-c~o(BZS>xH)`&95%NDmW?bQJH}Ora*_s<-=kam4y1w@*^aWO< z?(mcQSWY)nL%ol5Fg0A`BN?WK;XV>?YMAOHVWx&UH@(bX3r zGp|?VAX41yqPW@G*vmVjCc)GXW*l-as2Na==WA=4JX%9Nw;{NDEo=C-+%6>0S;J93 zi{T2(*V5ums!hflg6_2yBG4X4=Nxj&q4nW*tQp z**=`@l3i)XQ>V1wC+*Dq>^Kw8^V)kgiPPSDdS!S9AkUe6oV6N@ZaEfR4<0HFu7OZz z2Ws*)kTd7L4|U7yEtJF0Ex6S!_~ekt#zF9J;wVS>j=%NjHVB8SgE?-3#dmV+lIIfP zt|8F3CTw}>hibu^qLjz9c_?>&%(5O;otygm?6~Q zcWkWPh$+s@00%4~SDL(u_2ISH3ibOqB`Px@=AYBYWCle3vn4V!vf(tkDZq8DcW!+< zG1U7+eJ9|T^`*en-aUa6d%pY8w+0cV`7$8n9k zqJ4&YLkILkfvz18g9$fn0Kbd+bimbN4csX5z&-PN+-$(J!P|ATv(-V)y^vzTy8_>^jtUn@FgD>e^G4Ay(#8=2Po#Gs-W?uRRyErgw+ob!$MuEFt1 zE=(Mgey%9bx^Bk2?236AiANWU>Yn56JhPLqT*}&L4G*Y&EAbzaCtFsI5e8`Jdvx0m_C-l^0r+nb8fuK+dey-d8Bv&HB$=K0dcns1lh}p;@H?Pqu85 z_t}AX-6HR^gYaaNj!e_cc<}Llc5OkFWPFMuokw%22P&=`z1c%^@G^JEP##>j49$kT zVQ4Dw(9kLmZ%&!ft{vPKIDdPZuel9v(^0QyGPqw*Q)Asa}r~Anp zTVxM1d$WZ={>o3bX0!&%^pkt~$+P|Bhy3KH{p7FwH2-sdNO zU`pG}F%ASUx?AAaoKe^6Np5!Or<0qf=ldUq3{hF>5nuALmHQ$uV!5KNg}ObZ%%Fx6}Y4Nd-J zk49wv1q~PcP4RhtiF*2z>Hg$}R??&4b0+dGLd&g3!*74nB<5e~Q_wIZzpGzXtJ$t4 z@6hlZ6V>&sR*zGyCOkCgH*`31!sEo49W^7eg}BLk%gATulB=QCXuTjl-`-&SJ>pwU;l*WxHh`-6?#=(m3 zdkrMRO9K)%#G{ZT>TnHNkuQD4_n8IP=UB(Vc@7R%44K|>*GE^6=j^*Hez_{M*s7vv z(iVr!3+F5bK6u~ES?hL_dxBrK-Z!srD>i$-y*|dH@+LqvsHm!a+h8*Awr@2V-Ai!6 z7dDY0hDO|~nNqcH8TiGjDKHBsYh7S(?7)D#FKi5%xs4N%NfS4iJoSc2F24$;Adg_= zVTf|M;bK!F<@E1hThzpi0nh78E@k>MR(>ElJp9I&;2KgP#TpW$yV-OsK z7~HH@wYSl?{Ik*En#@UO{)^S9-IGr|a!pG&Ha2)GM-`Rr8AX&lmx#Z?N$Cx_-;{>2 z6UX3|h^TG{k)r^*0sUwc-WH(CD7kt-4HkQv0)EiDZB%-f4Pe*dKXeA|R)`|;UkEsV zO!zFW2*Qm`D*g+=e{Jy}Zo3KR8-! z7%jqU5ffEN{idh_==*n7>P@u6$vDDM9cQ97(R(vYq&gWxrQBA^`y8zKMB=YfW0G>$ zF6UBAl#+VRgUh)vCJoL%+M4KfC(FGZjGuL2O`I&&0y?gk=$0rhR$2&K3rlvFndn8S z|2>%H`y9PGn&|gjwjOWC_+j4HE)#uF!}xvF8CYM+I}Uka{@x5L?aSI-w`F&giQY*+mtrMv2bMc@WuI?z+2@|lta&hwYkylF2fDKdYd($Q;$ACj zc^Jj|jD9QOmV3P`7iC$6#3;r$qZw~3L|c03?F=sar5aBBT{X)}G0R^_`CHU-40XcT zMxb8Yn9GnQ8eG=GbP}a}O@QPmx{Sq{bcuLbmU6j>PcYp3E5{!9W&!l z`@*<9WSPnMwag~c!tw%HgKMKW`|k@l)$$IkKNirdqm^u#9QsUq);wD+GnR!IXvmDS zQo6KSWG>Sac^t$``A9ntyN<+gFwv=6mOn0K`H$ew^HJCKtO;z-ow6l_^%FZYj*Va} z>B!dcGVQQDmb)c0UR}V2SSttGm|)gWCO3Qc2*!?rHO7uC&o0REC?WJdx*&u;C}fN) z=4OAiAP3zMgN`s!a5=k9lU?vp2G@RAFk?U2H3_vWf0x5Sho>?|)p2nR-B~_|*5%2K z!yx<<_&;7u&eyanu9r;U*oU?x=jHXmo}iL|eP1ZEAe~*xW@gjb;ZkPNI@{KXS(46D zr7cxwA(FMz+0j7uY_GFLVa!T2=Ar%dOe=I_sWf&2YsOBs5Mk=6US}uDnO&u`K9cnz z1BpZ%)wRpZyB#mUjU+cvaPuq3zlq}&g_zT?$K$4q-hAl37wK1(pj8j z_v$Q3vQB!sRLKVEEJLzN-7|-pQM6eRTcM#OzKwL+fBI2+6|( z+cNq}vM`O-%9pDu*SZV%&DilC|QGUyCm5e zo&6x$m{cv@kCH9R%=5^y{U&RFyE8BEN0ihc)}q|E_hMHs1qg17v$EN|6pS%yqe;>1 zxttu5COvi8YidZ5KP_#4i6)k^j#;Y1Xk2NUx0qUkZ}4NvUWa&&K`t0nu*%ENi9WHu_n{FzQq zfpNO+E{^#ctr8*;gF79}LvPU|lD0tu$BLu0RkBLS-lOLQkLTj7ygZxug1(To7=oaa z=u7%RG$YIu46jM_ANoVuwqoclrJpH7k(Ef{41cC}U_=YihPR7fs8HcH{1IcVS$KY- zVrh()#^0z^8aGShZ&abILnCf0;I6n#T_yWiXH^Qk=(C91DD8w}~;RiBd8!&FR-l>0`J;-8?n3pz+KR1;iuO8;boG=ho=^~up2vIMK9nZ5D+=PX#@nRkgp|(*9Py=%sd^9AH60n>D}FE1GqCBX!sOjv zj1{Tx`CP}R9EWD4#A|>p#mWf%82ZLE#vu}~k~mx9jS{~vW@~pTmjYYUo`OCgjq&ve zpr@%=VG@>n%IEZn;d5w0yMFG|M1-D)CaDwSo{o%fNh}R#`LUeyKF^7H7odrWWy}D! zWPB*)J7_lKGw#b`>=w%CSuXf8w3xA0;^%=ZH&io5S01B*O^a)fQ3raf!w-=i=n0^p z(Ar;s*LA!AToCqMWIh=q{)n{G%zPzE&|{Tm;PAxjRYCO;!+~#CT*jbzxG)I%bA@(b zf)WW_=L!5AAwDy*Q?ZLN$i(=HD+cE2R?cQ*Pfol<`nZxf#Ok6%;LC|DpD$(q{qc;K z1CC+P+S3?+vZTU#RXFQ^Yr~rQ0M^WJ&ziNFj4LBOd|7Rm8N@O^C-Iof@*0d-)K4Z( zS2@J{A&lpxk2Rjdb*|tD_h&QiENAPP^i1e`^w6VX;jB>;`V)`Otj8&O;pPe%LpBcx+Z5ZMwSir(~pE^aTQ}x%1ERQs^K`l z7o%7n5{XP^1s+FJmm!>>n=~xH5po!My-(9>nek^qlTg1`m07^+J2QS;#h8)G7#7EP zW8hGrHE<;GTql{f+cE0XL{;4EJJ81cnqr|5l!|UmBG0|)zeFa{GwDrHN%St3nj{Ly zIRdn&viVDlfIdxw>o~#8VlJpxVrBu$edRc~!Nv0S>;+LB=wbNVX@ltwWFK6{UG`#| zdr*xLf^nG~PgQcXY2$2(M~2V_l>Z<)7s)-{I+U8}1;Zq>HlUiRCVNFxGj)Lv?su}- z^Too|$e>Yn*;`pW{Tglez^7Uc(xGy8e2tk#f#6}Q38{6`^QDBc1*6ZRBvW6&{b839=pPoa+6#Pr%{JW!R?vLT?7ahf#TFI`7S+$l9>b!FOU?hdAEdK``YNE4@`i3+y?tpG*tEhJOJt$@NPJmZ|7y?rr3H);9T*EF&WdFD-F(Ie zsu}lrutH%km$*e@gUs@%VEsl}%k5IWEKyXjetsh31x(R_P1j4Gb+T}WjI2qKt+>CAP>O|bl&_YKzzB>^#NU~)PPjttN=<6Xm)!2N=meZSMKf-peWLiSJ4)rk` z9`7FUv6Xm&dQ!6a$YL#?nRfeZm}s=$$82D)w=hq~m1Lp!ByE-nt#q=*h>`};Ss$~3 zed}W@aUl1rU%ED=CK3K=1+`P4kJ+#Xg!|Y^3Z;0-I6u!?3MZG(C@7Nhe9Q*c(Z^Qe zR}I~K3D@FruHI)86hi}i%m#LykFBIwy2&qHJT>@iSpO4grjOdd=K0u4EWk@8(^@8( zR`_gKziEw+*}yjX*h>5cXS-iI7wz%c1ZC1IK8A0}6_A0?1@*2dq97l$Q4vM>*h*^ep#({_8WvNAWITifb)-rkBS%LX z=3^#DC%Rp-g_c{wf*hr^OlMW;cCb}C8<-viwq9o&>f;@qX|vAu)+dAEsDl5!ViX2! zzqCUd4^X#+?O^Xq=Cynuz7y;d$(A{Ij+D`tSFj%?TTUmlG8|eW0eyfJ*j6Zdp1+0l0>!COK0mV1lX)pS^s&ouyBf_mgY<2Ld$@N zBz$eZL}$Yzkc{rrS#HlYqK?+;th}d@>Zl4w-{@@%H-0@`t21u=db&$z>(ggCdeds1 z?FnrH+mt5Tf1%~u>;<4Zbt9#2r{46k&Yn-c1GXbNb7HRcrj&H8PEWe-g6#*Ly_tF+ zn8Bsl(v7(LrC2=Panbfxu6A5S2X*#K#CF(z2SfdvX=xXBorLpHxYBmXuFhgMpR6hC zk??pnvu1kR{Dh+)jmXh#&8Xo3nl0HvaqbNN`ZdGsKn45Z6CQ>Bel5xv~zw=PMr z$$uVt*}O@*X63TtY``a}Z0so6JX+hs1~x>pg_fs+PKj%1lFs&l4WhX^O9?tB2GhMd zD*_ur4@=f;F(>VGTuUG8ED3BV+40p3>c7x3G-#(|813-zLqd0PHwX6EWv66E0JuTWrsP5CQ%Q`7FwKX+rfJ4EZLKW zgD3Lnu0!BDneNt&B49h%E}ex0*uZSXoZ&)COhBR1K%I4#8*tIlKo3YZk5<96k@o1e zVc7bn&?`Ed5MB#*QfDDH&vu$hXLXulvw;QS1p{X>8rk1MMLP2!=q<#*FJ;@k?UQI4 zP1D(1=0a5>2O7I(sX#7Ho&kp0%$LGw6Apy=OOiXa=3p>HV>5#7z21XPaY< zcq3r%sAYH%wprxV*>TurQKin#Vo91!J$3dgmZaIle>;K;dMW)E#~hlbGn4C2u!TAs z-eWs?=F*)yorJ{uRA&Y8Hn32<(BcfI#TP2g zl&iCQ;x9UyX^_swVkx_oM(Au#ve9{~hh|DT&vFm?ex7_U#$i^p*$#HM?z*Lo4Q!|G zSqjhj^onjPR=0z_sk0i@26jpJoC41UBucfSeG#%9EI?;Jh1kG6c{=?O4ZM&_bY_S% zVkI1|vui4n=r$Uovnds|V9h$4n4Lt6=ysjW&#ndAAlW?2{POK|J8hAynMQTBfxWNW z$_+_$2Yutwjj09!s^ZgIUS{Wn;}n~mI{PU)(7BjWe9VrYRQHfG_?W|a z58dqZOmN;ut8_LoZmDr4ZSb))=PKIOS?+($^h(@zdVo6PgB;HOar7@(g~s~0vYijm zd7Ulpk?mYfj!L%8vv_fz@F3Od?B~)Xu)aF8bgl)vRL>p()bnrKz=r&NVb$vgNcquA_4;J*=~V36;)u^pWnlqHDEtJ^ie+PvWYb8>pxY z;h&dokNZq{n68(M?}?4{D9zUx)%WVCK1M-Z<^H#j?ojKD8)+9P54|HP-Hn^*>TZ(J zOIQ&%(^ES84qxVPrUNYuH^7_esKzW|)oa9NIYP5CaSLv5e9RL(4qJzh20u~d&!%E-`)tPTxNT@4aUUD!alS`iNy>B7M#tz^$+V#FQyYB3!#5Zl^nHrbm<;+pW%$@==Lb~kW8<91 zsa`TI<_Q`qnHKXyYS27oOwWfj)0gl%=ZCb!$3{CpqKABJobzLPN-{0zC-kCZTF{eR zO8h%uoZj&b=SeyyZ8)MU{lIyOF6gX3*cqDMlRcYhd}$1Q?xAgx@_pF{&M)Y=WSm6| zoujH6&Gk&XQ_k~rhh+08J;rAKl2%G~fNsf)GJHip>gg*vdL&&&>(sz#A?kW@ zxxI96P-wIwrs!;LYE-l;UXqMk2FEGlb;-2GH;Yq}&9iLHON=&)^E&&sEDh{CU%G6t z-+inw+9FQjRU!T@wDf3S8f_J(-po#mi(yq@iIQ=Kwb4PMoo=fv>k}O;y6Eg~>tDt; zVv^5uu*oJok{z({khO~?k}bDH2VN6x7hate1`Y#zpts!rmRrtPM@5H<^}6vJ>&;-B zCG%Qd?ld_%Ol;HHu}-fV!o+ULw6+KrANW{rN4WUO$Hq7!MCMhpf~dr95h;p%Y?vcT z3$c66MWEt&RwkSLDntSCD>I#C$>I?c&GdQ2k?3MkH$*11 z1ea{5PNKig5=(4gQ#3|TR(up)D)5kte+$9Bi0&*>eC$GWnK+`ei3LAISBSGZ^Gqzb z99=0)Lpk9*npj|p=_(Q>Yo>8v-NahS7Lq7v6H_JXhG|)d0-L$JsN!$skm2naf_jLp zI=f%8s^OZgPO^_RW(iMRBYNP42-}(|!;=^l(?i@ODen3^#l}>NNjiJHQxe#0oh6l~ z$Mh7RYm9CS$p-sDw@nKvh^Y}%MiTxlv@8;9M2*;|vm88d)(Fe>nk^5{6*XeD&dS<& zY@quzNP;mZ%lyHD={Ai(2uAWb>%b#J12IWKc@VD#qV;O82pfm^x7< znYKV(C7#u6yq3gVC0_TjL7td?;xCO__}pi(Fptto%7;mVMH`**@zG!rr87Q08Y~iY z#-~U4dyG2c^P<5bPqO9oq-$)z0_IVzy+<>8AAAF`i-KNu9ouJ}>4v z@s?z~CfpG-Tzu|h?ZrqT#%M*GRJ=xv5&=59T{64Qq6^sOluWy^A0>K8w%qbX*Sljz ziBXy-au77yBWC&Ns+iH@J|DBujbfLN1vbwhG&y>rn0_-CW;yM$?0{|FxRzoIa*G#y3}+~ms z&iIsImRP7WK7^Vr?$j9{Ld_N{C2O{9#`ESJ5sQ-_Wm-g=ZXxS@o9=j8aE|I?VoV!LFo5Wf{z zES{DOH{p2xTP*hIjGzA&i&wRDmOA4XF-yc*os9%rD*lqJnPwO-#M~(&8)c`-D%~X# zH0A-_E$$NSB;}G`in&`{tr;x?@Q}4k+^DlrIG$T39@N>5S*soQh(~lb9mkRPh^IA% zO8ge%6?-JpD&Z9`NH*Vce-g!d#Q~jpwk4TB-`45Dq(bFh@qy01NV@2_SA3^4rEL=3 zCyZ0L7V|A>ZEL|oB%5cMgrLhsq|O!~=5mpsvriHWl@+3s&c08)=vX28NjBfI%Y&dR z#kD&906|xZQ93I}&{bl*&aOewRbr~nYTK?6_lr3?yQ!^_?iUMnwh*=l#GN`@1KR^) zg~nv#uNLq4n1>vz#a})e9Q&Xsn%dG&;g|_aB;yxSaj_djofx`ENGdP_#eYc7>l4&>STSc6Y*$^|^$5ztg z9?@A+?WOUPqNildbP+F1wuyTsTW)#QmJ+*7JRq5Ng1=2XCD}sD!!<70f@X5|e3WHF zx)`1Dan*KN302j4oTTowDAaA{%C_q}4D z7v&nWyp1E8y`qQCHs<$>-79)arnSZ1D>7_hoZ%~u7kxRnf(OU$7jpgQ>^Z|%#Xw(% zV`2}8(Rvo^izmjuCMNi0@tO?7kK4NxL9I+Fp8`*=65BR~&-7yh3k4l)u?4@^qdAtD ztUu0SKo5zTzU&3PE^hTP8`xqWTS;$-`y|sk?XV2m(!g))jO)87_Nb4!g71!f*T=ZJ zABZ(GW&S)&9*R9Kp3$Pv7Pk%O#BaK>Z}mqoDzmr|7g}D-x!-h7SS8b5 zOP>>=k}bDU}l`nZHOG&Fth8dO&GH{jd?6ZF-$Xb zW4&bUb@rkR(?w^O+p}lA&TcPYHdtr&4$MaDELXD0I-3^BwmCX`JD=I@I`gckW_q7a z_tY|5r?X{}J+8CIB-^dC!-73u)!D-aW=D1QgtUF4v!5mVQfGgZv*(XGYw{#A6?3$P zI-klcSZ5E)CUxrURU_L{b(Uyimanr~*}!EwEAPs-8jaD8@M`CIF;HhO#S9Z)iqSf= z#(1io7es?jCsb8CzZM>y-P^9(`Hfhjv%3-ITd_)KF9laSzY~w@?CG>>=S8tYXWtpB zo!^UnI{VO6?Ytxo>+IR$(C8n;r#kE1Gt?9PqqwNk$Ld0(e-i3k*%lPk>ul`L!ltu^ z&}!!|B2H)58$MHh6DV_1)TutmD<>XQG&{vqDb*-IteVS87yg_e}|Kfv~}WXq|G z^*6AgO>J1A)b>fV*V0E&C*73*=n5PQErt~+c-_ioswxAr%72U**tuB z)F#fP9Q5-HP~P+N3{XDSJ#V1MxB%s(&i=rs>4C~A$+$51o=Q0{nYMTZDV}e2%Bxq9 z^0UUM4kzKkO2DmL(&b?BaUn{YkEO)flqw&~iVIV2kW8yYl!Ajze0s>ZF{lLi zh-pPHGzvYJ+G_2KMn+Rh&jV7=sL+&p)_+~u>hI}-(h2%C-ezktA5LM7e+HU-B#ZSs zGdS@AgixuVEB-hDy`IZ@wkq^|2+JR)Gmfug{Ck`$G#4PAH-nR{;y^HuSK~s-2Zhn9{>I!;_Vzl!)laW`J1fL2eKF0Mq@;G|JrKok6JD5 zvd^?}Fe-tIH5*e-r8^PSKpeVdKxy*pX4d4Cw-mRf6JL_6!f`9>KWWc#6f8|Dy%L~! z5NMj;%B8JkjyCLimu!i)ax@ep*_9e?U~ZD*!+%(5vbO4J^IluHv;|6AB@1Lx7_t6$ z!T{v5a0aZpQll*z+FGXJ3ABVD4G-6_f1a!{%Pp&(|Jvu3Q%rLK)GDjG4+qt(`0EaloS9ZvEd&1uSH?thlh#iDsHO5~$$s@)s~?cPrGu;yO5&1}zRxk5H_5L!jiyHeZz{ys9aaZ@bk)U7ywLE>BG z668M)w8S+Ctx&D(v%d%Wf3HEly#D_^du_!2TMe{~EoEHv{}a#uR#2?}{$}kKLo1NK z+}bt<`nTH<|2Y39|HJ){{|(_8xt`Z_;b#9(&IteAy;W9eU?ML;?8(0kW8}07?aF8Q z|2%@nKg1hypuHgnmwyfZR_ZHm%l^+Z^Uv!HMwLPvJwg9><^6kzn^m4cqcC?2bTcMo zONWk?mEmeAavMXN<*`-UkhJQ>^p@jaQ)#G8s>d-S1ZnGbirkb(_GFF!et%f56TC+# z^tsH8M+yH7iIL|{3%0BxHe1We@gGchg?1-k{Ht_Fn$2d=mlO}`p-?Io3YEIcj^M^u z=qXtUts}IuYrCbkm-i>mtW{R=^Y(wz7^pzx;`6Q|I*7jRtjcvLU~MN70Lr^YP=9(v@X?e_v&*Ic-?YxA0G0h$$!s>!=#bl~i)t%ghL18>&xl{f06i<^Wi1U> zSakx3{Y@EGxfzN1mk=FAc*IWXB2Lup0eWH%0B?zTi)z&G>yP36F{jE`_zRkR<)N^% zw26M~bOG3=_a*9sLhw6gj_H)1gVo6$6ueDk{Ya5fU+bZfDjzqGRryoe!Rk+40|Yw- z;4OALOO&Wl2Uf<38S35|8_iIgLz4ww)gjziwJIH7NJDNf#;SdyI>Yl!{Z+uZmHnYv zg|GZM?J&q3zeYV#Hx}||srXH;sJCvXRcd+iO5vHI*3_*LW5vXR4ai0mal+4|brmzIA5Nl994M)tP-Jhg~~jtAgf(K7Ec7bD@?_Q1En&FA{lU#L6rTr<#7jj+{^We5;18-tiboSz z?k)BF(siVWl6ro3I8yLi!jYmht`^9z8b^x7)hzQH(UF3`7~Vv`o12wQbhvJj(nTD` zNID@$#yWA>Q+KzrPArPar*$+WaxIE7wZ~J+I(1~+;}|CViS221K0d)Ztxiy00P<&5 zHR^}8?-ALga6X>oBJh)c$g= z#nRbYPd3K+?6M-LcoJUJlkrEgb(lQ-3zzyzM*hOJ4zCz0)L7yVQ|pLdFm#ssSo!1R zSouTcSoss>FJ+5vq7ir>v zBs!J0mF*4r$^x~kp++sl7jHGH+P^2O> zi{*WWk%lHU3DfMU>Q^CuMf22=27UwFQLN58Vi;>E41eFS3M<_jQ6$&68S3LT+i8^S zvhh+g*^nEWj~{e!e@~J9y-n?gcdFY|Zk4gfH_kX#@eB-2#${A!hH;x(i7B*At-*Mn zB1gk`*}J3UC)1o~-gJIYUV;A8edqIFd5l*laixy&W0z zSYgdfXn3;iR*OZm@pc3IbH#2mPF9Y35|-k^O*dW+sAUG8{j6CH{ksVdBPb6&G%wb# z8L9yjk2?!Ls74>}HLg+$@QFfza)lP8?D2|U|MJBU0Vy;6I@ICWg*rn??;E?Z?bcN)+zIXoTlBn{6}D-X`S*rJ~>#Y zh&=oy1H&+M%`#Ou<@w3CnQ4VPj)5?{#0kO2()lp&aF%{A5wUa@bF$& zZ2lEB7WnDNjWJ2UGtt;eF^DSEeC0%4U-Kq9ft8EdMnN!U)3+#dO%)cr* z!FQUSvfhj<9nbHRb^09qLEwGKE(QAr~UM@n>b5nO8u3(BPrQnD@-{=|svW z<|WATTOezeNX>jXlAXrd+F%PW9bpzOdkkcr>lWNIoUvGN&U+3RP8WaEmOHCM|({bis*GSE;NXoL(jN(LG) zQ%#borpQ#&rT=VcZK5{FY>~7sk=DCq%#||LYN=oAk%ot5vW+s?R+;Q63P<9n$qC#= z@xXmD*();HL7D1Jnd*ov&~a(~SXw`q@_8v=ke=VkjDL{+zeps(EoTrOZaRzLrn5;^ zxL}P#YGMU9W}@K6Oc9qYxH%PdD2hvPlV%HU(mY`e2%#d83@i}^&;%*6QM$;fdNVW!)n5WF^ozKkEQCfGuLIs>Yy^%s z-U*y!+y02?@uLKm2P84R+m^9w3ghFcjIrsAOI(bXG8p^fx2;+9d^TfDF5{i; z7%${8)_4l|vbK=%_aesYJ20LtW*m>7!e-I=PK-BpX8fj%u}=l#vz3hDT^Xl#WBjO! zu}=@i7pfWKYZ#kr8Nchr*uS1}M{mZ!t378(GQOY+l4j;?7`)0=U@r;j8V05{2J-95M#N@ll zj5jwj9-G2gdJE&8X^b&57-!C86tfu@&S4Cc6k>X8t~IYr-7z5s=^VvD4_wdYeoX|*E9or ztXT&fwq`$Y@|x4YJJ$#`G+@h`B;bo{YShd48#rsn;&SiWdFmzL4F*-*zc#?gnhc4_ zraCQc#kI+1&T^gk0Xn&6o`utXrlEBU^lBjE4HD-`d|BeUAl9Fj zSQCs~JZskmvudBj5g{x$Njwz7h1l1IHHX@;d`ik)Y^=H6o`sESla6dXB;`YPmdA!N zHpjB(={WX0l@25fYmuu4VL| zcy4Kr{pR1y21`7SW4hz!hc;O`Nv|Fa8gPNy=uQYHb92Hpbv#mJf`QfGN^Nw%`mXl}X8?BzCWsE~3!o{EX4OF2;LEpZ%rdIg7Ao6WecoPF@%2Hc#$ za!_ZMe~xGTBxNaZd^M+fq}RQ`;Z>`EMN;#ZEOa|NJUw(v-GeZ=WgBd-;y^QG_FAK9 zZL?4|yVhvSWE-@r9B3Pd&cml!_qd@YWPtM%(_IS#bW(#C-{CcZSB zfscR3m1LiX=C4c-H{&$fr2DdX+&+`^4KTlLGcdC)TW^<|pAuQ~k5yj8ZhR@~=pKk)c}r{)*nyRz@M=Kl%#WU&G7i#LZ^fop@f zey@btAP<)#V_6fRNf^Lw$JoWnRkVui$&K#c$S zlI+iB^JFO>lk)Be)|7-Y?kr;L7R>lp55~!D7{kICOJW%NNPJmZ|7y>gr3H);9T*EF z&WdFD-F(Ies(~KbSIgu+iCZKd6|C84VB9X{%MwKeYvw01UPxtJCku4Q$a0E_v9~N% z*RCwvy7K}xyE{)jSNlZ0wJbCiN8L93Aq#$Gw*g=a zh9>?~+j#xegO9k0DlHdqu#eaAzJIBfuW+x=F9ce(x%l(btZPZhaUaM;VI8rxn zpF^psaSF>ls16qc^`toE1cfQ>#Aao&*sm_dfA~}HJ03jb5<3pOemHQ)=J)4YcT}Bz zvV%xn(IsAludpQx%d?>lF)7Vbb`y?KrqHBkmz0a9K%C(RXYcsWrg=d<7esX)y#M#T z53Pu;6?cmVS3F)T;>Cm&Z`O(#&iz)i8rt+oXw%-%sis6#SS%J}BH5c?U2$D6;Sh&b zOzS0XjyV>PsDw7R53x6QF(e8RYapTE)CPX{t@yo{NHCucZRY=9(Y8)x7k!Bcp-qQP zB<#&IaHpW)qWwQqOpIm`+O$pLVN;?A32i>K;?_DbD`W!x_vDq3kPtIxH(^C!z1Sj* zE1sbIv{I{+_w_J_6;r#-e15C>~|k5R)UMW`n4}DfB=DH&GNF z1`ugaU<+W0BzXdMfHTtWi9Y`aAn!cUSy^8K*Pp-*#4oBFvao^u7dL^3?P}nN+Z|za zaXXS=kf=gjmb{240Y<-31UQKD3Ff9vIuY_Qp^H$@vOyhE?F2f z3+ZM7>XwND8X7H&U9t;ZvWv)`#SOf;QCR3&Yy~zFm;r${0S0CV(E;fb;5^bI_291< zC`5Na)siG*39x{L@gJ6w1z9BsvI$TX74$iweMtKzfFv!z*8So{4SNuIzX{Mo)Hee< zKnUW#8MtA^64plLCZa8BgM~H3H9F=@c&vVNS?Il<;@RZkvrp_E{rvHGlWJGF zVa46vAiGmUs3{%LIS1AF00t66}CkeVP z07H_X4mir-$>7nhJV-=kofRq=eX}scwQ|FW>1H@(%u1qCtGHH{D9H>_kp^94@gwmD zN!zw+@MkkfZG)o^bRGx|@%BiAGgzs4L%-q&7fO;3F6cLpaOJ=vIT}4+sU*#eMxz_i zAv%Pj5c~k~lmUGat~_Xmr!h=zskRIoGb$ZoG7(8jkc>>pgW8>3ywRVh+idZw)41R_`y8)RpkEsU)4JbQobw_=}%uIkbfX+zhReN=8g z?-Hl3}jWz1oiODGy<9{_wQ&u;xHLnRz25y zvDMw7y1amh#7T!)o}f2MM(CQ1$tp=(ial!Lhaxr=Ewj%6ZLr)EAt`_gvV#=<^!K7S zmvVYd@7~32(fD3lS%EkyfZsV}#${abe3@SYb>+uB4RXRBpDMMaS7&Fg@kwKF>Sia7 zC*LyCmRi+PL5p5Vy+9SV2z4WA29_3*6ryzUI#mrS+Zkh}$NVZJhf`+eWgpgySwCl} zP_y4M%3t)08)4Fp0$_@+Z|~UU6TA3Te2ryZhhja;(}aHXmc|;KqCDqlS4hic)jo!o z?^b$wqo(0<{NZ&?r$##LukBkO{x-I`ICXXhZ^f1FcRIYKbD!eAM~WnGWf;@24-AET zdfL;rOrDNG90-lyb~V&#l5~2lA3xkAQX2UhR{wZyO|Q|GN-xpm2$I%Sn~`l!oy%{! z*56bQeyu)QoP4*6PQEEI@D_}AeEWTIheAi<&%sot-^9)qgTB+i zXM*jptzLT;V8WeOt)# zt8CZTvNz4bjhipS`Mi#_I5Fo9*6}zQ<)d89D@cVlc;tVayv{nH8OM}HqZvUa3?pN+ z07(6JP7uS=9{-cRRx2aMO-6ej3AJ8iN9Bf^ez6Q??5&_jbW*N+IjN^jYdyk&;L zNpv!}mowOK`^}8yd~ATWTf6$Ro>yCJe5Ibq)TfUv+okHT)z2gE-2szkvOeX-X{_cK zOcQ|76n|{Kk7hX}zjn%K-@Bvc8xK70Wel7f7!RL5GPl zIyT+fT{QPOUpfQV!|#-~30UD8=suL1WXu^qU=jStWp9n>tDt(9k-$;=GnjiSoHJSI ztAb>`$P#Tgd^aBAkM+hUeoqEZha~wuiD5sKRZMmoY0NT+PJjCFfnn|mzAeP19Kwm~ z;n3$gxh5bMpm8ZFC~fy|Qwee`g^iLnqcKdA5*RT!!wFy^KXpMnGCZ>Kz0uIxkvDC& zCr;h1a)^hdR1UCoHS}0fIh!N)xADUCz)VS;{8or7AHkb61;qh!@KgAej7Udf&CD&i zD>B_R=C0*f16*+V?GPu68?>tW#rO|^1BNKKvSMf{qo2vOnR%^VekE%A{B#Z<)bzbq zKq;=a{LyKv@RfeEq1895`F>jX3A@5|ZBju^nI(^(C$N5QTOPYF(PjQEJ9PS4yA(IW zh&5H&<=Cu*SAAx8$@{J>m-Tiy=Y~zJF1ByQK^q}2RymZdR-VJPibTj1G>!DFL zc{e7!JAYtol@6cNnD0I%?35F2$mL~2}uj;bP^5yuR2BT>IQ;0p ztEVmGz@QpIrcA1xy@TmO^`!c+ViF?5SXEpp6^M(ShPar4DhvpKAQ8R&P^g=XeQmSCA2-SqE8nu((S=V2C$blJ)bW?#UAADw&d>spX;a;0TvWQ!|(6Sj;_ z;z{S0jIoHi-DXbJn%X!mqV>fFeC;{bH(OUz_BoLdg_HQX6Zb;y|9R77V%hV4w~MSK z_q?;_2ldK>yp>OX=(?PmkvrPS(+UwDJ>ZW|y0~>$tmmLCKW}>lJR4h>loCwW9p^B5 zY0CoVH{14(hv#L7|M|mMYO_IqZQUBH4)?7mZ}|`8gydiGr)(d(82B+$SE9{v>s+)( zn@)I(&l=sL!mn>~-6L3EE)>Uoz?ym9v1BW`aN(dNl`lmRB1og*Q~R;!0k3n`5`4vX zZyjj%dHQ8=U~&WEAQrGh zVdaFLSKerP*Q3#|?qSaEN*;O3SG+jsJoEfxf#al`No%#lX4wCUJ99&I*0gY4h`~-q zUB~owjNW?N*}yykkRfzzv|NWb)?sKTH+D6bu3|bhT!2)!4hEa|&etRqR-DS|Lz_eR5TgU-GINlK{h2 zWh-=Q^RE7xXs+2(`(QF}NAJ=;?6-Ch*5^@ez@0cbOdZ4p3m5A4{L%kkbesQ*?qeF_ zXt@`|3G3l8ppviFF&xcB!(ryfTO z(m)-Bl^`zPW*fO9f)zvdSmQ&s_wg_{HgRB5ZE5xp)!3L}OVfjN1dJG>ntNne%=Xyr zo8ri8BBNMjpY8E6VJxzHNNgOsx9!&LVeEg@K2TU_s35x;Qd5xn&sl9`Os54Xxc)_9 zKqdlmri9@0S z9*q1*@X^0uk)z~)D23so^E%9+nf=XDKBeYixlR}M$FIwgoHN{;&75=#&i>x63-B%;nFiSE{Ntu@H3L^3hr0?M@sx%ei!pQn$GEnwi`$d$d>1d zHYoe*h99^$@AT(h><+^nZ;NU_dyRLJF8g2E_!5F&{jCsyOK9+82!05`_aXQKR`!1j zPY5oC;MC(OMYdo{ksFBP{8JS)k&qMJ?rv(OE*-YYwB_72dTBn`cjNC~l~}yY5{XR< zsIBH+oS!X`{iZ&lR8v4bT*+q#)ZVL$XSbHN{PDftp)b;BcMt8DmY>K~c3Aq8paD|- zSawGH^r^y=7ceoORvqQ6c1!IUOQ<)<{=?Man$O&}vAeP>W4LMB1KTG;x_fJ`?$w@_ zVc*Z%L0>xhMmpxK5P{cVR?t;vcwSdJ?irEl(L3v!<`{pxr)=s`Q-iPN>X7|71G&DR z{cNAIi(7HKMiD0e9xJ8uUfV;%CBZVm)u1iEf7|)FRgN~H&UZ9^Sge;Uo||@q)4k0t zhMaeEI$`mOgvXn$Z zB_vC!$i9t?-{|e__kNeZzxS_mKj+-%KF>MN`Fzg1i-?qTL`Dh%G=*tqI{UWbrB-7k<=7AbPf%_giTCV`P|wW~Z!H)LB}tYjCP&A`l!5vk$oY35ZH2%j+s|?( z>jyJPqN#ag#FJDIUSm>2&TL_Z!*MVS`9|A3uxpSq+YkH#KDJAM;wd_`Uw|MCBI-mT z8TTfeC9ksr^k5-T$Bzb`B8hid@I1UPO?R$02UxbOU6@0Hrf#Pvddaa}YY27<)j2vG zHe-;ydkPqZMC{4of;1iZSekT2*M$w(@D+3k#xEHyT z%*o$avO5q{hAI1J*{?Xiv8Sc-o+>fp$K z9`qI_iS!BZochRWwcM~7>TZ2v{A9|2o1Lk>1<9B6{8r6n+~}cQ-0bRtygCgZ{h%Ps77&Cd5YFg+5bL%}7fMYG zBlcnLY({Hg-?lkaxt^Jql=Ime91YY<3$_Mhh}-6cJK@C zoz9nZ8!I!OaH-W*Sj{+p?cE4gSl#AL<0i+Zi(MZFtS$zBHN88*>htwCJ@QieMYB{+ zkKZM zUwP|Fv~zpe0*Psld7m>loil72f+gQD2u~l$%9tK7-Aih4QXKA>^Vr6eTwy(tlKh=kN*9df@s-V18EU?;tcm|%mttXdC1kj>^;-*Hv z?(`z+8BBey&CkdIc*i9MCfOyUu$iyh#e57_O1klt#GJKzrEJ}}z+3klU5-}xmuGzU zI3m=4*-_x}On&=0ouGBp-@C_A=q319+b0=g(X+bH=B9@-P;~W7nE7)7de_+D+|PH`q@6k13IgX9-VCHzA@_ zBa%r02_OI>7DNDOqSS2~cJoiFcG*Xab&V&)l=egu9=3tKJ zi*Ki2EDxu9cXt1n>5(D2)YwpBurGsc$R3mDSdqMW5Ro^Bys*FopfLUxotKTyy!PBn zY@t4BzDr-xww2N_2)y*ROcH#K>G*Z?pI2_mpPT2TZw)J$g1@pq&VFZ0(BY|&mXT%q1Uefp)H^#coe_=%y7i5m{osN10FW@I3gN&IO3+Ew8lORaAmg?DvC znQ@Ej<|xLCbtHb@?IDS>Fso~0-R^H^i-=s)5RvQCpVGkLw9;_BreQt*QW~x&H0Tis z!2eMiI06LdXqpIEA(?+`A|nTYC?o=Uv`eo|b7+#bmnBc;Wsg1D+^a?LkoD{kHGk*J zVn+?V>(hdJ`vraMrBzl6h;#~5p?gLzz^w|Q|G(W-l{GLpM+gxQ0xN}tzEVODM0kN_ zh8U4>TLh9Dw6*^Gg@GHi*Cz!(S5sDk6n4GL+|mbqJVF9P15chonTL4!yPft#9S-se zaXaG^csdki=@Z~{#>QVR773HR~vDkQSePJvj2 zi17D?a1a1NZZ(>M4;6S3F0u-g?Aw)d*bvEW^_nv7pK`9DPTTkYXsHV4{2WMtSnAu5?O`YE%f8#JSr&OHbP=S4;|tGUfp`}3tDx8(zkwGFTQDYYgp|@8B=VmnYOGrUyA>9 z?!ns{0@tqejN20*W-R1c4tkv06O;L}c)t2j>}Z#CHfp4Av2Y0q(;U)L2S1#@yg{1} zY#`FOIa(-g?GV361*azVQpyHdaf1cGAMQ_zKc7Ec);6B`pk0Z2vYyhgQhh9Oe{fxp z2sXAvFumA1uBU(1V_^y7@6N!BoOgca?oRM7KhCGSq8?Wf5I{e@AlyaL-?$5tNlm#| z!uA7>XR!ZrVW$hld#FWnv(dQNZlXz4YwqWYdW^CsbAIKANWYM}4Te*T-7r}(++~t83iksdRG+b)Z}NC+G7S;mMgZObc`0Pt`ir`p;aJ zi7c__d|ITTWtpv$FMQ+Hd)xU=eZ^q)VZaV5Jal0>OfSAqh)aBG%jrjctFX;T0r@hP zI>xu(IH~hllqz;&%P&X1FIn$WBPiQU)}%xrRlrve5ybu)5H^bbr%k2)yQzw$m}uh( zJ(5m=4Gs#yd134}E*8xy-`$|>mFl$KdfMF1`?`>j01@I#<48fPc>KTWDM$w!m&@^n zBn8<2&;^Y)FshD!0L-p~20#(e{@=`&=)go19Ti9kV*0%R2*7AIKpX4jZiB!MME}d? zjQA^H&zG6q01evbxqNUy2oDxAK@7VgaQY%t(cdo~Q<~TEdBI~|tV_^8X!N;t-I=G5)GEiI&8;J^z)u{;2F(`1En=>nn1~S!S=x-QKRq6t+m367&zr0;S0~2 zzt4~>Vj(uX>{{wCv$6x>e delta 4087 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

    $q5O*2t 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 literal 273752 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 bEJ4(^On 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%0Dq83; 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 diff --git a/bin/smo/coreclr/Microsoft.SqlServer.Management.RegisteredServers.dll b/bin/smo/coreclr/Microsoft.SqlServer.Management.RegisteredServers.dll new file mode 100644 index 0000000000000000000000000000000000000000..5ab73729cbde1696f1511f9fd3022da1777b2a4e GIT binary patch literal 77448 zcmc$H31D1R_4j#iX5LID$z*1-btOrgq?46ybYV~T(7kC(SxcHs+o8$4bY@aWOH0xs zQbZQn1QA6*s32Mt1QZcLv?3KyQML+#NEQB|f(i(HzjN-LnU}3Bf4=Vv%z5{md+xdC zo_p@O%eymOeDbB_A|f|FAAU%551#yYyud?)UStQ#?hDZOa~`X>$5`}O#mbGbWO-M@ z-jHbREN^R#$L&=4x@dW#J6;}(m(N++Qr>B|M;r6={gqnuvbjWy3>U4r{NFEV61_m< z%5#m0L@$HlSJdlGgQy(oay*HGk~WpzOkn-x?+oOFKEJ|5yN>@Hv-1Dhr$!YwEri^q zoQB-vEluRdn?x5Ji|6qM<>B!kGH4~!Kki>SkF1HQn4H>RRzr-1+HPXNf1wnA^` zUpdhkjfrHU4MfomI*QO&oLtgZ$2TUT9X1$QSJs(W*8dFRo7JB}bS~Q!f2^BH9$MCl z#05k-OvK-^gG7;1qO;NdUZETs6i)O|wQfgp9J;R;^4%&0vQEL{bPD~ZQy!#tFmnQ+ z%N~!ig4&fxC2Y`2lT}FC)%|lWK~CZt&Mrw#7$W~h&i~=?`A={@TG>@Hba}%VuI7=* zNi+bIlsanWRwkx^s+z#4YC?v+pQ73PjH3M%$>tBOD4Q~IOQt$T4^bXtk$vtrc*1W&<~9ss_mK|*P1ZmxjWhu1 zJ`<91z4e8PW_n8^7z~!(h&562@i5nwx4RCkIQDL`(0i+b8W1JW?hN*o8-W@Hlh z#P{sUNZC^WM7#*I5{to<=w>a36t3D*d!*@-y3B|d!fT(>V$bDr8Lsrg6=M8%YE~&(Jh{>dsWwDAJmL z4|S!}4`tGIE1g_*FhkbFGd1Egah0N(-qNgz>w?md$iJatvKe5jvN<|%^h6h(uM`Uv z`Q7z_2vqaC?CF61ICWq)Kv2@{027rjolp*D5NF90^)}T@ELY;$&&w zfud?}SD#l}C=6pPpAsb}OkF014gqD_}U0t_B<&D_N)`*>v6 zZ-avuqp)B3Zhe&*84Xl9a#T9bC7p%7mW&dv2@XDl&!yOFi zb;(Gno34zO=Nr)&_Kln}Mnwjfy#RI9jj|GtV(@4z&q_R-!JLsM-5KovtPjFKTAzgI zQ>B_@W4QS369D{m$6EHnbaQgO_9CS7d=ix+i;->^<&(-3lJ65e1gUp>^A1#4_7dj0 z??A}vMi@2nbLy=ednstoDcks9Tmu2vq%t}oMj@z0=`P|aG22BqZvkhf`wkwW`!adD z`wAzTga9XF170pxb_|II6P`M(yF))7TQGwBss5`EN;HoAgS~7ST7yuTmFv<�x*= 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 XunO1QEVJBu_~6d8mt}l*INbjO&pzfy literal 0 HcmV?d00001 diff --git a/bin/smo/coreclr/Microsoft.SqlServer.Management.Sdk.Sfc.dll b/bin/smo/coreclr/Microsoft.SqlServer.Management.Sdk.Sfc.dll index c93769b064409a2e089e5d812cff6502157bae80..fb0e38b070079f06d13be3f6b87f08fc3c8d5f86 100644 GIT binary patch delta 6034 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 MgjWV9sU*^W0XDXFqyPW_ delta 5884 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 diff --git a/bin/smo/coreclr/Microsoft.SqlServer.Management.XEventDbScoped.dll b/bin/smo/coreclr/Microsoft.SqlServer.Management.XEventDbScoped.dll index 485011fc66614ed34cb4f1bd31e5b861df77e0e5..b2951455e026e2774de3d10d7c86c2e4b83629db 100644 GIT binary patch delta 4146 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 SSU6eT^ZekOzO+*?*na>*mD%k8 delta 4145 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 diff --git a/bin/smo/coreclr/Microsoft.SqlServer.Management.XEventDbScopedEnum.dll b/bin/smo/coreclr/Microsoft.SqlServer.Management.XEventDbScopedEnum.dll index 7bfb46a149331cbfbab6a1b08d5e7fb279d12832..69276b39274be4daea3f21182aa4fc0c0a3a274d 100644 GIT binary patch delta 4128 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 F{{u(c%tinJ delta 4123 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 DO;^%z delta 4104 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

    ~+@cTPkFqfHP|7J8_a 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 z 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 V$dm;U9b>M)PHtbd7%rave*iz}0+j#& literal 78688 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

  • 7LaUo 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

    (RM>tvdY1>bL+?9+ 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�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 literal 3716448 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�G)tA)Rc2H(^ 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�c`_T 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 z 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

    Qn;EZqhx85lAAy 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≪%9#p8AJ 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

    iNT{5N-67!#Nbg2rHqxZ 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

    #L-I#=hUAZ)49Oq88InKx zG9-WWXGs1S$dLRom?8ONC`0ncaE9cMkqpTnqZyJv#xf*-jAuyxn8=X)F_|IxV=6=P z$8?6|kC_a~AF~;fKjtzdf6Qk{{#eM6{IQrJ`C} zkty%9O_}mO+ng!yvn`qOKHHip@3W&a<$ZQ^ro7L#XG%Vb&y;+WlqvZrIaBhHBUAEG zTBhWq^i0V|&P>TiS(%cLvNI(gxiTdm!pY6?*_u0Nod7oXM zDetozGUa`CW2WS*AjvW$*I(NwNt{rl`dxwf=J0uSE?vOatw?pDk{|<>m13M%R4epRQG_*tF z(C`k4LnAvR4vp@RI5f6H;?VdGi9-`RBo0mPkT^88L*mf%4v9lEJ0uRx?vOY%w?pF4 z{0@mj3p*qZE$)yww6sIw(DDw6Ln}KZ4z2ExIJCAy;*gOeambV-ambt_ambP*ambn@ zaVRQB;!t#s#36f*#G&{ci9<;_5{Hs=Bn~-pBo3wJNE}MfkvQbckvNoMt-9En5j9En4o9En5T9En4|9En5qITD8&awHBl=13fB%8@wKoFj3lB}d{= zYmUUBwj7B=?Ku*MI&vfqb>>JM>dKKg)SV-7s3%9_P;ZXJp}ri6L;X1thX!&a4h`l= z92&}zI5eCiacCq*;?QW0#G$bqi9_Q#5{D*oBo0mHNF18VkvKG+BXMXZN8-?Ij>Mt4 z9En5oITD8!awHBd=13e`%8@vBo4K@ zBo4K?Bo4K^Bo1}BBo1}DBo1}CBo1}EBo6hsBo6huBo6htBo6hvBn}O@Bn}O_Bn}O^ zBn}O`Bo2+ZBo2+bBo2+aWL`b)l6m!nOXk&+E}2(Px#WAAX_tIYGvku)X=YvWJqU`x#fRd_R+yE8oxL=gRjp?p*nP#*-`S1aGda6MVU{PN>h7bwWd~ ztP>h@Wu4HJE9->jTv;cy z^2*}bl2?|_mb|ijw&aynb>5mf&p1cUbDksRWt}7CWh=Yu94Rkf9e1na9(CNSj@PT> z4eEHKI^L!1-OAph?7ix|zH_9W{pUzM2hNdt4xS_VZ|EG!f5YcU{u@>0jj8g+ReAP& zsegRF)ITX-?khQ8>Yt{Lr>o;mb=(K?KNU%226&|DC59{+49C;+Vm-C$I~gJ5*QOQ5~rD=@ym-oXAz1wR3k3myU; z1#g0B1?C^|@$`c8Kxe^U!K{L#f6Vsmf-cZi@GO{Du>L1(&o4M0bQgF*Pr>g%Z^2(d zU%|h?`hw_2_HQVt0UHbM2Ac|=0h=tI1;-2AKj-5U1-}I+3;qgD6$Ji*?b8K$;7q}9z}bSQz`26JWAvpD4YgOg$SPD7|F9Wj*?+3FB=Rj9s+%MTbudoWt zFT53W7tVs7!i~S;bbQ^@0XgV9s?1&;q-9q%pN zaT(kD3eN}o3%kLA!Y7F9jC+*dVB!0)4;3DLIr|S6Hh?3A_k*K_pMhhAr?&C&@xl&p zqVO4Tx^Vp!T;2gy-b`UC{k*}LE%bnMg+Bx53p?OZB_Q_<6)x#%6xQWSb6pJy$K2cwEk1EY(4puK1h7+>@Vm{jy8 zm|PUq&gVIbc7bU{17Ld5d!Vz(w40A-6`cWQ7hMLrif#w62eMQfJ^+o2Z`FKOosbFK#xnNV#Ua+}n7Hlc{57=6CLI?Y|75xNkFX{q2ie3Oa zi_E{_<6TA7V0Y0F*i-a_YuMgfbSBtWbUD~xGy)D3y$uc)CH|KEhKh>7;i5Khr0D;^ z(V|zuv7#Szvfp@-8=NS*6r3#T1E-4igVRNCfip#6*Rua?(Fx#OQ6)HE^lNaTXdk#( zv)9{KT>~b&Zv!3f55P2c+6{a>-CYej-PeIx?n7X<`{Wz>xXb-JFweaR z=DTCM+3t3ifFAd6L9crh^trzP>)j{pVZR3V#bBfRA+X8)CfMv=e-j^Xai0XXx_=6` zx$gkm-Oqs??ytd4ciPSD-{n3Z>~>!T_PFl=d)<$KeeQ!`zuV|x{{i>0;GjDn9CH5x z9CqIZj=28}j=E>TF?aCq`Mhzr6P$3L2TrYP?d<0*E(CqWmw@%f_kj(?FN2N6Mj!h%6`uw+7heRn6z>CD zix}9{H;?uzCVjnnDd?h$r zJOIuWzX;A3uYwE3C*95GEfzO`OT~M@<>Dc5rTA~)YViWNR{S|=lx+JWpJyt$5Hy!O z1X@bo1+67V4Dj)&l43BrP zStZ|r*(KS3;`3Z37lU~v_ksB(?}6@;kbC*Kr(`GSE%`ak{U0A+EvW_9 zO6~%U(pN!K>BeC`ZZ7qJmeN~5Yw7D?RH^MjJ|10K2--`p1>;Kx!KBjHz~s^m53!%4 z^jI*h)D5PW{sMHC_JCQX4};mIAAzpYEf4c~d8OrGe(Cj~yL1Bdlzt0(OS4DV&sTaq zSYJ90Hk5u1HkLa7!pECR&jXuFZvtCNp8#7+KLXoIkA8&x+Dps9j?yc@&eAcktMqNK zyLA1d?AKFz64+b%Q?Re}cCf$n9dMvDW|aK~OTFMw>5brU=`c7_`WiS|y5TYQ8!J5t z951a0CrWPyCrcj!r%FEnr%R7`oc(7?%fQ*vc5tqAFF0TN9Jo*#@C5rUmL`HrrKf?* zrRRbxrB{HfrGwyF>GPoB`3y99Y-4=B*^>@hJe8o;a|0OVc@m8FY<+%jR_Vj@+&$D2jX9djn#QlxWb9?eYkLM?# z*K;4}^Slk#d+g)v*WjrG8$JDClji`~?1|pb$6Gw-fvui9!8XtHV7tfs6d&*K90hiI zGQloSDcJ4#IoRX59qjcy4)%Fo1N%M3(|rDb=U8yilMN1es=;ATD>&l06&&@U-6s*u6mllHP5Y}QT7mMDhv1r`^E6E&O8&hl+D?4MO$17??B2fE7d0rSeA z1M|y22i@hzy~6&U@*6>K`6r;Se9NnBuP?t2Y$!hfHkPk}P346Jj;F^<;R1a(>gXQmo zL*-$wv)^#J0~{$o4;(G;2gl0a1;@)xZ?NA)`6=LJ`9+dUOKL2t!Hps(UFu)ZSdT|VAWQ3Ezsbc0P5 z`@!alPr#On%?s?;TCoFctGEDcuXr5ns0e(Ik9SrSf?XB&fZY|JfISs~@AL8A3M<%G z5eN2HoD2?B{16%EO&gZD15(R&}* zYtx9vt(Y3XXeg!3pn;;G}mLobnz3r@brS zjCbR|`TSY06P)uFfb-rqaKU>ExafTfT=IShE_)-E`MeeHDd4KN9$fSO7BnjV0GcWv z1!=| zsWNVb%W1AW6Ktvc5!hPU3AR=K5p1t~3hbzS6YQ+~2JET~{esW$t}F+8DlY_kD|^7c z%D;g9l`nwuL}|6pY%I8^xyaJceraHR5WaI`Y|EA|_!%mv3Q+rWv+KZBE%3*c1c z(W~q?U0Dy#RNf5ER!)O+l|f(g@%hSFaG^34T&&Comnts?mn;7Ou2lX7T&?^kxK{Zd zXjH9%rmD@~aCzpc6F^JV8KAYQ0gS5p4H#YZ0BEl|0LE8+11434{)f*`uCjxUs;yvJ zRW_JjRR=n&eg$S#-3n$`Jp#I_o(J=)-Usumz5?AOb{-1a#{#P9Z&Q|4vb5+-a^HukO3sp~oi&gXBQq{NMa#ef)pTAPI6I`wO zF}PNBIcQY>0W?)V2AZqqKudMNIzG=@?Es^y&jF*W&jsz(SA+4@cY{gQ&x6U;UxJS6 zErEP~T6GDSUVS;}tiBV>s{TJPyLuLMRsRRft3JlW=jB)L0^QZapr`uZptpM45BRvR zdN){KJpndUzXvu}Th{aOrs@>1x%zCdrTRj!wfau5t@;J9y?Pexs6GUCR<94@^Si1y zg5A}LU{CdlU~jbx?5nN-`>UJ4f$FQl!RkA~q3RdG;p$~@q&nEl<&IXzgJadFg5%X* zaH4uQI9YukI92@yI9(kT%;(KipAXJfKLpNIe*w-{8zFprp*j*=thR$o)my>k>P&E@ zx*A-qz6@Nez7{lmw}B?#UqG{O4z&0_0Ij|?Fv_<%l&=%*D+KMnU0}Sg8BFqB4kr70 zL5J^QFwOUOFx~ea==6OCX8AT+xV&s%I_UEK2+Z@ff%(4MLAUR5(Bpd-^!knrOsuJ{(gRbPOO z%U|=wgY@4BfTo%T&|LFd&{ER}T5BE#qiS9SqiYU<_L_(YE+@X`EHJ6&$6#{JFF{95 zADCA24=}yvRnS@UZ!oLo$VfgvyXGX&Rg(|q)l`D{HEp1~=8vGKW(xGyd z=0$L#W*MBU*%HHkQ#FO)bj?q|nVPG>*_!*oxtb|(zUEVKp(Z(&&s(f11(#~B0heoD z09R^4;`sP#O#!%8(+nE5w}7VFr$BRUn4SGBwI!gn_GU1u_AM~FHg_{0x7S_=#@D_8 zCe*1id5)kep&J-c=%=&J1k^J?z}^K1VJx@-Rp zdTNhLV1IAzIiRn$9jveY3)oO=PUPc_wYgwZ?KNO??PFj|?dxD`ZO~Ed*H)Viw%1+{ zcGUhI?5uqc?5edUv0ry>2G~>E0QT124))c41oqb^9L;_MwZ8%fYaauLYK>#qK3sb~ zI8yrvI9~fPI8kdomXA-?o(N9Wdco=1E5MoBL2$PAWpJ+cGjP7vmdxiZ)Ru#bwYP&y zwL{=??S62j_9bw&_5*OO*146>GwMn~Q{AsYbKNtbrOt93AGg+>14h+d2S(RD0ov=9 z!1%h;QrIu4&I=~jT@5&^$W>TUqD>mCMOb#q`|-M3(Voimls zbJtw}dg_KiZ`~`Pug=)U$Ls61fDLu!U}N1SU{hTm*j%?CY^nPQY^@7Dp3iHmI}>cL zyBzGOdmQYndl&4g+mOb7-F2y8Pn{3!t-BHIt9u0OuX_(1sEgjt{)2Tt1c&M_1BdJO zfg^Qu;Amag3G6pkcQQC$R}D_oT?bCqJp)eFt$@>Y$DYXkGj(2Ywr)2#SNA7yzU~!p zp>BOT`z_X83NFGe~fv;P0NIs>rC z#{G|Hi`&=`LQ9B3LrVy`Lc4{A5JGI2nyKd0R5LZzR8up}Of_eo2D5 zG;JrCt{nk0v_F8E+KVrt@hoi{n63Q;%+a23Ddk$N4C=K@ph0_S3gt%aX3(Vl8MJ7# zH&AZXJ^|Xazk&{J?ncVp+HugMJua2DTeU@CoAzz6T^pN5d588fuv2@&WwhO;tpj_s zQ(&+5w96^)(^i4~+TGxgHu?(6hqYILquNq%OuG#n*M1C6X#WH!wTbCeKc&qFr?m~> zjP?O=PP-GF*S-xdXnz0~wZR(NZ%KPBxU4-JT+wELLAixsNNxidn)@&qmb?1B!0_DF z?*&HWu6{2tGWTj7{oWFlJBqsK-2Gr|?#WluapH2X0^@TnU_!1JOw9cfOv*j#DymD) z%>Yw!U0_=7%V2u$FJMM)LI%}k<`#lkxsQO^xu1YJx#3sSxHk7{P@lUQG~|we#@rRq zlzZ4URAC3t&%c4{mUHdkO70jKl=ll5 zl6P_zjfdvtgJF5SV0hlAU_{=*H_~`y-dSK&UKSXgR}aSKZ3pA>{s+eArQbyL33+xf zG4BO1Deqe_IWOX78c)fSz_h$q!SuX8z>K`4Y#PtZD+9Cgwu9MuAAmV|E1)*-yj!SF zpH~VR^0tD;yfM&}w->bJ9eOL(S@W&~ZF%jWBkvQ?opx7Qz0!4YyJKK;AvzVBT-wP@eX7%7^ow0Y~%J z+(Fx8c~^krd9C0?-v7YKygV(9Pvt!TPUnq-GkL#(b9txc()fH{KDdzA11{$60hjXD zk{&5JVAFYn5ZiSlXOpj$+{UZMR#NY)urh!2h(*;V1{lK%+#$dr131>^1|7N)(5+ijMB^Ua2C!A< z0NZpsz;@kdV2AFQVyf%ZWr1C~|A0NZ_rPA=pJ1OZ-bi)*Ix{$+dleki{Rs}~l1pfO zSXTj#>YfD0bYFnuy6{pOpU@S9le)LSDczsov@WrX#%FY9a89=qoY(ygF6c5%G`^^N z30%^hY^LpHT`sty>jH!HZ-XKF|AL|V_2pC-rZGhyP|1jv*e++u` z$Jf$$t6mSb=|{kJ{mFHdcj#{eJM|r4m;Mv5M}M@9#(VWQfPMNluwVZiIH3O+9Mm6D zPjy53G;mm7436sW0mt;OfaCgka6*501JzIJ{|!#*E5K=eA2_4`9-PykY^S<;eJ;45 z?*bR~UxQ2flN~g^te3zQeLonK{{hvr`hhUFW;@cie&i2OB98jsAs0F25v zg3G{ur8TmoY zlxOB&2WI6z4rb^72e}*kV0->%up|E^urq%i?8-m)PO9t4ZvcDqyI_dp9F{VPuxP|qxnVPSpJLPcz(!TluzW}0#4@d1gG+U1gG=k@22sY z{CaRM|2=R%|I#+f7xMeT#r*$)OZk`lhw|lo9k`P30fP!&0z(RZ07DDb-a~a^1@T~b z!6q=GU^5t5@H`k*Fat&xoO>_T#}+ujxPte=_=2c*$`cB5!Nh{?U{b*!U~)m`eKej@ z@HCiKaOnNConCMim{H&XGYdWfvkFdrfX1^6%wSHzFsLo~4b&H$(?R2gf(p=BFaVkg z4t$VuOTkT`wO}h~E0_Tt1t&d3?`O1`wKn-2MUgOgvJL8E&_)N^x$y8Q{ZU9K5(qyqDQH2yub}k z6np?q7M##U`BXs(I9)IV&J-N}80B*X1>k(aW8gx;G`Lu>{&5;#Drf+g3wD7k1q1DZyV)Nh3#N;;ZI;};g#Ddk1N~;#uo-X zLE8z1cYuk7uYyU1$MjO3TxbGQ3SR@$3J>*Co?a+{8HJ-@X5k@EQl3?K6PR82G?-Hu z`V{5b!plH?p%XL|z6cr%7eG^?x{vBCg$1Cs@HNm@7`cOTN8xp#yKpn;DSQ`fEezjD z<86f!*k1Ss*im@Q)0B4>8o{o@N5P)L55eBT!~1ExuP_trFSLULg*(B)!oA>7VcauR zH(Zztjut)yjuq|(#|u}$iNX!fQr%=>GdNZF2{>IC_Z;Ojh4tWE;fLUS;lBnbUnool z7Yl2^rNS4$<-(u9mBP5^sV>NH5g1~)1`IXW!7xKV7;g9kj4=EKMjFn3f%c0s=)q{i zePFENEile-;EOaKZ%6|Z4Ao$w;Yl#b@Gh8aSOilHF@sc}X1EDVH{1ZB+t04nyGu#Qb8{Pps48cQG*J(%wy9{@LJq9P(Yw&`7h6%9Wupb;S9Q_LIH)yyN z95NWdVS^VOHT(dM87_L2>c$PN;Dq6AaMG~mHOi+97lYFVD>!4=2F@8i1m_LwhN*7B zpamBVkAX{uZ@^{4DX-J`iopN|N!!2>=^HRqI^_)-50eaFxYP|sNMC}H(rF_!9wnK; zXz3X+R@w)~NvDj`c)XMiCP+_#iPB$Sl62ymG@dM_fGJW1m?mup)1{BV3@PL-s>_s8 z!7RxMW=k)DInpAil`eRj>hw|rXpmk6jnX1$l1>_1l9Wng=JOn0KjeQo0?SlD2@;(hxW!{STaz&UugO<|PSSkh;J{ z$p{%L*D837fEdBzFDvqC{Ji53Zj4gf-j4M9wTgu~$4PZj?E-r!_`FL?B zI8pp3I9YuAe#)ncp8=X&j4-4G|*uz0o}&?L6314*lL^s+lg3Qikmz!~F-Yp8C{csn?6tN<5`9&pjP8(cCT8ccP| zMh&=Pbb~=9yTFi=ePC$GX(3b>R+0mTm(+t1C69oSC2xXJB@1A5$!P~teQZe{7+2y2 z<4YF7gpzd!(RgCXMlh*l6PR3L0aHqz2GdG@0Mkp3`4`n^l%#=~C1qe%$wOdv$q1NJ zvH)sJP6?%YeaY>hp=1kaEExh#CHp~3$>}PpvzBZEZ6&RsqhuH8F8KlUl&m|L>RL?%2aE!FpwTn_e@+zs}XOo9C+$A{7QKuI1rSn?=1R5A?? zmmF{ijgOX`3XYZB433w0z=@Jw;AF{v!KsqKN^^a3!d)Br}8 z%3y5ivtV55=U{wk$PrYZP`VyWEWHU#Dz$^jrM+NE>HA<>>91gV=^01Tei@}&FthYN zFst+(FuU|;FsC#!g6g!Tsi3~J6f~4R0UAqZKvU^4M^T-n^cv7w>H=-0gP@~yH|Q?? z67-ZFcr?|wmd1l^rFVesrT2gxrCzYJbQtU^{S@pe-3RuT9(N4w-&dLj_LoZFKPJgY2FFUT2FFXS;6&**aI*A6aH>?bj_RjNQ^1*037jjv2b?c` z30x?h0T)Y;JC^E~N^b&}OYa3&N+-aevbD$2cu3jhU}%{O3@aN3!^^$~Bg)o9QC(!& zdN8Ui8;mZy8;mV`3ydrCgYjiy$5VYm*~MUDSt*!Q_9B>E7IXrQr<7d`rj^x#>18j0 z8D-00X4zRMQe9SA0hnF(Fql&|32MuZiKcOV*{z_V>;ceNHVK-_4mpX&EoGO3*0K`N zR@M$W%Dw{KWv8D^b)K@@z}B)hu&vAowwJAmq4AEgi^0w^E7(=`BG^;*E7)6hMl99! zm1)8LvaR4i*~j2u+27z$S==d9H(YizI9k>Wj+MOvj+ZTg6J-~jN_CTEPH?I$^fcO@ zF1rhyDf5DJWuxGH*&pCS**S4kw^()?xK!o=m&=|8SIRyHgG>jisV>Bn2!@(&0K-h> zV7Tc~Fv2trMw$*do$8}Z=Y!Fvd@$D34#t_@1>;Qzok4X8rnA9BQx2G9Y66o@JHZsw zUNFrR7fnVe&4O8`==C(7ZMp-@F+BomO|OG`(;R3p9eyU&8BLdfCQ~(N zG4+F1(;m=f`W1AT)}KZ7Zj&DLn4SPzO+SEbro$6xyxo)pc9_gyr|C(s%k&A@V+uK& z>UvEvV4rCt*l(%^2TXn7plKEyG97yk)eoC421iX=aLjZcIBt3eoG|SNCrwf3QvHi8MZM+5|3`9tRgqKY~l9r1NNe*;E6rm|g~h%zuI*=9KekJk)$Q z7-s$w3^%X8fbs~l4U9BD4Mv&20i(_5CDC}S*#pLzePF!#;0q~FFkcHMn%lu7^H*T9 z`SgF&c#63MOf&a`>E;72qCCTVJ(y|U0cM#)lPS+OUkc`!t3a*!O;B%+xR}Nb=3>xj zegia_KL;)5CD3X<{t~LQnJ)(&=4#Mw?gc&OkHA**noFs!&3qQvZq5Na%re+%egW(< z&w@SX@D!@=HEX~=vlHw$KLHMy$H76f9~?3tw1Mh}&1!JeoB@uR3&C--6Pz$V4NjV; z!720FjkMpi`QPA-IUk%ew}JEK-Qa@xpj4_`G@k-4nbW{!a~-&1eijTW{~in}k4mHZ z(DIwXu=0Dr@bWjoi1KAHvi$hVs4l8}BN$z72V={Jz_{}LV0`)Mms4Fr`Hf&=xdTip ze+o=4{}@auKky2wODj(V)5{CNjPi%T%<|n}R{08;U4CLZ)#sFN1hwTgpuW5xG?ecL zjpgTSsLoVw2QB4eptbxb&{lr*l{D@szYKJjTR>0w6JTrkXJA|T+N-Fpy*wH0C^v(h z<=ero@;zWrc~Az`^_E`*_LWzG{pF8>1Lb4jVEJKJQ{7PcP2h0(1K?=+6gXCXlSw03%l^=dBjZc@~3eJ>wgLCBz;C%TNnKZso{y4Z;{yn%<9)BI>%jLI# zE9K2#P{kfFq$2uy8V{|w0}QKp1Prg31tTirZlLkViefOTVka0~u@{W3h|8k!xQb0+ ze8pX0Ld7hYSdnxijVD!9fXNj*!IX+`!L*8~n`k_};zlr|;w~_=VmFvo5qdL?XIE?h zb1G^uPP0(EtdMo9gifh5v ziu=K~ialU^MffHf@2I#I?5wy8?5g+_?5T*&q4C~|GO(}WWw5`(4-QmB-bUkt6@}nX z#S7qY#eQ(KBH?x#AFD8f;}y?>6BWOKlNBj<(D+n^9h|Os6`ZL!N=x}%g%O;ucobZy z_z+yII6jxgmnsb4a>Xm)O2rX*lm}VP07EQkV5p@I46{57hFfOA2up;H>LV?ef>D+t zFxv6}7;6~?<1BxI@s{)TRG(nk1SVP>V3Or&Fxm1Ym|{65pX$;qnP9qQE0|&V4$QO! z7tnZ?B^u1O+y>@Y9s;$N*Fe2x4m4PfETnp)Wg}>^lzTOEx%WX#vMAFMt!4{ote}!ASK}79BWkxgVUdJO$2KhQWDDa0%5d zSS|+_EnC4Q%ObdJIlGj`S1fuksInUjsr&{Etz271<6)JFV0fhtjHtW^jI4YcjH+A# zqbrX$QGIOXC16~o8H}&&0TU{BgNc>m0` zpz>L8u<~ngs50D2b;Fe#z|qQbaIEq%aJ+H?oT&T>oUA;whU%v(H-OWX7I3EWd2p`s zS8%@aqFSn3sC0mfm7jo1m1ovbzFaATE0uF#P}PMt%0sH|0z<1_2g9nC!0@W8>S;Wp z>Txi#>LW0!Dzt&}=qe2uTeTUCt9lNMubKuEst&PJU1HTGU{aM1Os?{PDOIn4X;u5c z^s18_RG(3m31(J32xe7%17=s9)kxzxRW?vtwGGr)y$2eq{sxUz2~MgrRpo+~s(V0d z)r+95Y8rG@9q6Juch#Aor|K54waN{)RqX=XtM-8%RqNeU-&thGO~sII@N1RSW^4h~j*0S;9~G}HKS)h2MX>Tz(a>PK+ADyfCWC#v$n$*Oz6sjBC| z>8eR^rs@}PuIgwH)z4Sm04`Lufs0k|f=g8g%QU`Rl?tv@*}$Ocd%=+EC&AF_kHE0% zpv_btUVRoAQGGiYS=|CgRriC@)n9NktV0`s3m{5IgE9HsR+rgyjKf&bc ztSywMRBr{-s=oo#tB<;i@{HI*@4bphz9ei&@6o&?*f{|4KuPrrxiJF0WR&g%QY zuIfEtPj&dcG~QdC3ief3f&JCbg9Ft|;9zx3JJk(UUk?sf*MXzeJ>Xci4;-)lFE~*h zb05`DR%e4#)lJ}Z^|Rni^(;779dSR^%~xLyE>t&zi`CD8OVu;ra`n0gsBWeDdN9bk z1q`u{fuYs|J7_%2x)BVwR)P`MUNF-72^eKP=s~KBwypnNCR{SnNt9=(<7Gp!mh%W4C&t*?VQ)`L1}Tx-1$)LV_9 z!Fn%fw7v|QtlxqbYxu)dZ?&EW+N`&N4yz2ht%IP)>IYk`$38;!ZPrV{cB>xju-*rD zTHgY@tUrT2)~H9RzSnvk*k^49`>oG`1J)UE(7LvZ>V~Z6gTvM`aMaohj#)nd$F0AE z6V}rnqxwl}7C2?S6P&ib0nS*1AE)s-YZ^FjHG>P*N5DnvZg9!E3@%&OcT@d}H4hA` zc^V9d%)zHzrd85v!9^4v>H8_UUM&)QS%0vS@Rp1Rg=(5b=ftAU{1{=ptj~+ zP+zkG8fwn)Qk}8pR?t+_1X^nPL2Jz(&{p#+=%_j5Nve0(#DbohOTpHfTfw%PEns`i zFxXM^HP~6R<|*2*tL8+orzRQft+@^Ct7!oHYj%JGHPhf=jjE6K8>%@U9ImMVM{D}Q zv6_#-@tWVkiJG%^Q2k_$9-OM#3QpI22+q_Twv)!^YBIq2njPRm&7n_IzF1QaF4Zi6 z%QYMNDPO6%9}KGf2@I)Ce}?kV+Q-1K+TX$O+MA!HJfe00jI2HEIogh@Edrx!Ujt)n zBL*mstIY@FYhM5pYEOEe^2FL!FsXJwm|T173zVnSz7D3<#=S_}>9yTpM(qiMw4GV| zA26#nDQKxp9-`b@`vhpKJ>nJG zcGQ-D?%FZXQ+v^?l(*LI1lwwldX2W*Yi(dh?Ym%S?Fqw_chznIdums}-rC~VDetTO z4D7GH>J8c+s2u_aYuAs^_E7C3;Bf7MqqIF*YXrw?zXr!^Z+esRiQ4DE$=ZmwXnU&G z1y0xQ17~Wlc$@OM+D>r3_P{aPUZ^bv7i)dsQf;h{^5xn_aHaN3FsSZ=cPJ03YXd{; zegebluGvj_c-@O&L|ybaZAaGCfl+lIgVA*tze{;+T@M&n7yKS=$Jgb733YFSiFNVs zQ=U|32b1eQ1XJqHn4mnZ&JCv5eGX>So$~?ZnRQ#ith$g7X*;{F1k9=X7}VCCvWIeg zodq=1eE=Hk&YYy&RQDgyQnv(J>#qBVa$DU_&{22T$F%LPGl8DEPr=r@jh|57R@V)- z*M&^cc1K+a*je{6*j0D&r#mxie4%bT zxLBw9nzonfjNo$J2jEKG`QK0;WRt-V+cX$zyL6WFFx%r`xb1*B+K#Yk!ARTZV3h5q zZz+$qy${CP(!ZnaINS4JyzS)gX*{d z1|7C_|E1h*%K<&M$G}$GcVL_Cw4Z3a-DUtgY%hVGwu2Wb@3LJ1_SoEDuk9nS&vxq1 zG~REM!2#O>IB46jkMbeg{ot_eD{#~nx1aJc+il>u?H+K#_B}XhOJ1V!DchakwCyu+ z#&*&#l+W1=;Job>aKU!Ouaqy^ZUdKWz2LHKKe%GMYb9eEmK!q5j-IC{L`nfJyZ)fywoM zfhqNuuF!Z|y#q|IzYol)e-g~B-vegVuYlS0Xa7m{IrRmgw*Em-Uq22S>VE=_^+)_g zb*B0YKudiNXsvGqZS~thNBwJ{yM6}r)c*;#)*t&f?cY{^F4$h50d~~e!Or?;!LIrr z!Jhg!_Fo5P@Bixa!M^&(!T$R9!GZb}aIik+0ID0RzY-j-uK-8uJHfH~55V#IgVs>p zMEzypWW5`ls{aU_u0J)H#%Jnlz`6QyaK8SG5Xu+oH-n4ypMXpCu?JGVTwe^X)ISRb zHT(jGG$b8Fbow`Jk!cHqg@G2CWSvpsiuep;YH+SP!}zvO!NnH`v2ZI}Va8jd-V#>X430Vf(B1}7U9z^R7QB4~WNArG8scmBHyvtq<_SmPuUi*cyl=s;m0{iWM zf&+H#DU=V|Ujv8iC!9*#!}bfoQF|6RW|zTn`>WuD{bz8}9(x+qPuWw!X?q?xW8VtS z*(bqy``S3FTd;2g7w!4rlHCI?+joE~_7A}z$8TVWBU(-Sg*r4~n4=sFcRUP6IL5$8 z#~)ynZUP??_xvbp}TnXmmUYnjD{k7DworG;VcV0NNY{ zpu^z;-HtBM<9Hoxb$kQ1ISxOI_G@>ffE|u{u+#A}*yZqpJ&wo(s_S)J3-&ph!G4Di z9B_o4P2+=(OTi&WIXLXt297$Wz%j=u=TP0aqa2)Y+zC!PdcY~i>)^EGOK`>!d@j|` zIpV;1$Bp2E!wD`ro&uK~li;%BfJCZaahwSTHQo${G&;c0#%I8=#&5vz#$(Q-`iRC1 zFtSkwqZ;1=qZihx>bDn=0jfXq!V1#oFjC3AwIptB#e}mCZI~eO61>>AQf$`2`ub{dFrv^-PTEQge z4lvpI4VdEmS31?DIpe`}XCav3d>qVl&VpIaSPj)>J4?VE=L?|L`3tCbCSFP724^v7 zbUqH6oS%XgXZTe#Zgt)W+MEx84(I2f+ZmNX;~r-&*y`L4wmE0Pc4zd}G~VIN1v{OO zgI&&V!5(MaH8kGql)ygclVHE|4{*SlaV?DxI*Y*}=Vox&xdR+^PJm<1;7qC;cb*SU zI4i+P=Kwh6oCT+yM_fmBGtO(lIcF<4?;HUaoWFyM&hxIPx+SLxTy{PUt~mb-2DvW2 zfyP5ztzf9@doawkF^lqW*A_6sH3dex&c2cIDA#5%+Vuq(>q@wZ@;KLZV7#jwOmIB_ zCc1{eB-c?lQ(dyF6ijhF1*W;?!F1PA*)*Qv+6ZR4O28~v2bk^hgE_8$-$Hd-S0Si( zwSxxNF3{-u1~j>jx|QlIu5{4qss?SY?V!W;Ip}tUZ=yPn>uRvowHa)4y$H6u=D-fu zQ8`rC>AD>3aqU1!`*<3p}eaM<-2IO>`N$6Rag zpz(3nMsUK_2u`|&!70~TEsamRZUSdqTfsTk3^?yPEtkd@T&3Wm>veF+6_H2zvMU!{ zaqR?y++ zg9+|K3Mfx>Yr!P<17NcIJut<6Tp^98xeZ{t`*|?Ky~aR!ruzyo%iRiQyWa zu617v>fNoN!TmL8be~^D<0khe(BgK0R(CgObH4>T+0){s22E&?8woo44WCkOehQY`tbtUCdP4|G&O(S4z(-Iih zbY2yW$2V1h2~AIfiB0ohQqzUiG@jhF8BA&V8cb_SvQnPj^e~vww5Eo(Gn=jhvzofV z?50^Tr|HyM8rL=zgZid^(9m>19p%QR>p@e~gP^5p2DCP5Y&33bdKPpvt*fVPcasD3 zH0=djn{H~Lysha8u)S#+>}c9xr@XUiGuYMi3E0yV>!7^1=}xe(X&>0%bZsN$15JJ4 zVAEkv+8$~u2Zx(p14o;}T$GPBT>*|aIl+mh55UQ$Xg7^dH5G!>O*_Gvrmw-dridmQ zpKmGy7n6I^b33|wj22L?5t*FxhV%~mk9`3o?td83E&@a8+gh~`N! zviW$K@~GwlFuM6UFt#~pGv#s3=YsLg1z2GzYiRc3QI* zOmBW2%xFG&3+0*3b}*}X8q99i+(mg#^9!K1dEMQ#t#7u0hUPCoWAi0#l$)AcKuhxk zXl*|HKa|^=uLm8?-JrX93G_5ydk>AbHa`irHSY)8o0IRQyrWqLJDWcSyP8jIr@W`x z0QNRN5B4>$xsUSx=BvPg=5}zf`73a!`Skl~e7Ly|9Bm#4$C^)kfb#L?a&V$~1e|P+ z=%9S6xe%Ogei@u;{?~()&oyU(^UdAhLi0XwvH7xxXnd);16*$Y8eC~UeJkZbE!AL1 z%P1Jy@~=+H!&;lJIJ_9FO4)@adWJ@|Y)$%Yn-LemyX<7dyjnB0h!17wI_zjPhI$Mtin`v7R|F z&a-YO)x~?R0TVnjnCKY=lRRsmrtxIY^?Z z0&_eEJwxMK&$*!9qXi8fFKG1a15KVwpQSpBrxmn%z5;EYbDpEz;b{Who+;4dQ4dhw z>Zt|WJgWFy!skAQvhv163?%bUOfxf2|e zzXpfoQ++f(EStemc?cYnPke{+aoNeZCg|`dSN}WO_dP{CBIvvwtN-2T4Lj(+8@(pz z#vPQ02AP%Z*9TVX9($hZjtJVJ@Fj&l@X(-dpATaHJ0fV?3#)b8UR>of;F_QxU-aYn zKPzk+T%E@jFgVCRxR;Fw2mJ^h5hT5|y8j`&R(ZI>bqbGHc#1-`!u1NzQ+T1m%M@x9 z-l*^vg}Dk#6xJx*q40TyZz_CO;YSL;Q1~aPW^1vF{j)F-5_BfxTJ{gEFZq$|pHDAc z&5vXLjp8xP4@gCx9_OgH%UlH(+(*u6}l>wi)D&W~y2mHNj z0)9be!27QY_$fC8d~;U7f4wo_x|;+3X?DQV*?(bx)`8A(a8tk&ZVPzV?Ew$b2D~me z;NRs1{Azu`pU)3?Vqw4^GXy-UDB!Kd0bel&yr?wbAC(0>-5l_@%LATe3HW=J0Z*w8 z`196)pIsYpZ(YD+>jVBkL%{dj1Aa|oz@KpjJlq{{Q&YhAGzUDv6Yw@U;6HB;_^qu0 ze`QO+PrN(e&bENh|0m$r-W%{|+XH^m{Q-AA5b%8+0nd3T;BRdWc*4U0?|3BOzdjo9 zn;#4K*N+GMrk;TRzAfN+PXzqC-hf~EWWWcW3V7^}RX>;Aw>>)p`O}JD#PYEI)jXB? z5sF{MT%$O91O(|7-^ARkIQzfA4cex7G4tD=S?yE7yiD;r=FN(`n0GOk8AsSZm+lS; z@(S+zf4-Y-r?VQ$_ppDyW6veOP!oJWP|&?>+y8t>5cyW-`vi}EVKwh&`PGU)#hjjL zslvYGvn;=f)o{N{aq9V|;=B*l@ID&mpR=0a@sJ>$((_kVPfqoJE6(fnEWeZGGzW?K zF6Q*SbqV{D^L@$rzTH9%IjdARMIj@gpey4JdYUX@j^4%;?V{65Izu-^4yPETBoyzL@^(E)WBIn1_Fz5Xx z#mn9c2_mOsSrz9!T`cE4WntfLA@5<%=kFD2MuZyjS=K-F#gHKGHz`i@r2CC>K2M*} zXIAJ#PJO!BzTAISocE!e_X!RT%%7b0y=0JGJLcWWamjhTiaEc>Vwlsp)3qk=W={7f zIj>JuYUnkkVLrlYXgzgGj(eMVx3Vwgd|!$Ah*Ixj&exf|Td61K^)mAjrQR#}2y;G9 z@;ll6O0O56P%|skkasKn$$5W2^AV+ga7bW2rbyi@~zArY&})X`MxpAzI5(t zC69lfJu8Hqoc3*F`)ZULtea9p>#0*}o?tbSP~%c+s6RQM8**iCvQXcx)KgD#dPY6R zdUE#({-xs7lkQ2X;p>BX*8jkl*mGFuKce)f`H=JZkn?@X>3k1k`}&ykwVGwluRA&4 zmz?kG7wUr#4AhfT&vmS)iaGBYqtwuR$mx7fWi{N>1kY8Rj!WlDHT<}0p=YYn6Zg50 z>xA4TxXgSn>$yc66huyQqkEuRsPQuAueA{+r#btSdb%HGh1@UX!3PEIc@^`2&RxlA zo-xenyzrW3{?B;{^{GO=M#!&ZzK88gKSOmw4LPm(X0~pUQ123I$oX-}`Eg~TzFVj# z=k?^g-Ye9P2=%jq`UTh>-i3^FFge?icdl&_I6`b6y{#!8$(vKq>tWA$`DtCe~WJ(Gocjgr61 za-EXXxkyTW!~{DpAt(Rm9GU-fj?DQz>1EE>bA&lRM;~*#7CEfvtdNuQp5(lzpE>WN zIym4l%y~~Wb6STY)-zSeb^p(Kf694(i8-IMOQ1O-|5xyJL#y>PXS$}e?^DX0Rm}OZ)Pkon=W`~fed*^H zIp3Fj7rUm3tiOgi@1tYR*PNWc50r!&mrz5_`;+tjvQXbG)RXgiA19pRKw?qdUjlTKjs(us}2dQNepwoCTby16>@T# z|HrhRLXA$SA*Y&eS&byrxP%&VzCPr9p0ZNEhrLd_g?e)8xsUbqDmC=l91&{Bsb+=M z_=K8Sr3TLdC8z$XLxpo^&hI6)kf#bcIiE8*pR-1&mjrh)=RL`3ZuDMA7HYbM8gjb6 zp|7xWS3FMeD+Iqya9MGF-O-aBi=H7~;aEPwXPNW4k<;Ah=VS0;ft;M5FF8M774s1` zPdpoi`WT^}oY$*`dYw@3Qk4j0amIq#2LSvM8SdCyd#o}AZ{^Z96)^ZB@hdU9S*&g;8{8ZUD?7JZg7BIM+J zUvj>$PpO|~_wcMxPfqvGPIkWB#|8Hb{+HnDS6A!lSa@zwPh}na%CTr}s>1{GjA732 zA98;GsFfPLH&$xs`f8M%`jGEt$D+?_xYK7f-08C#@;$5uzf&lE==G~(&ew#T&r@Q~ z*U%-@lk<9VzJ{_;?-hK6IX^FQIPgpvaz5u&WnWqca(-NLUL!GI%jWzoyEn*>WWG=EKLtPL1NMAiH6!d; zbX|Oc`vq4WxmuIJ>eY&0$Xug1U2944jVzZHzlyn!`Cit4i!Ue^Dgb61?s%da?HYt>P!HRNi=Y5p3; z=^Q1YhI}_W-xej`!<_D6S*Y89^-6t9$*9p0# z=KAeef}X`KXxl^^6g6wUX0(QiWV2)a!&?QgT{z zmypXseYcQ%g?vQFeL_Af-h)d{)T)N>1xTPWPLG9gCdbZ^7$?^J32LH#KuQM?9Z}8V&Q~ z*t3FuN6-nmB;+n3?-qPS@L9qA%s*$xqQ74RA1lm@P3Hit4c{}CbgG2g}KEaZOXyiahH zFlXjGj}daUkf#c{M#yzSE(y6y$h!p}5!}c8pLq(opE=Ek-pd6aFU*tqKl2oFwUDO@ zxkku!LM{opOUPv*?-p{elGA)fgnU-;;1h&-GUwM$#r&T+3pJ^NYnbzO&n5T+4KW>bWtC`ca$YE=qD&!iWUMJ*|kh_Fj7V>T(_X_!l zko$yuR>=KA9(;0O{xO29ne%&|oX(40FB--1{!nn4IlnF=%=!D7S;2#20=bGg^`zg~ zV}x9-jx6}x&Ya<$+Z!6m_E#c6I{!F`I; zx%(Awr~ao1{RK~D&R3GP=M zYZ$kBEbI~sn zisM*sOCO z{ndhN1eXMt1@|gW^B-Z(`}>rfUTc2EX+6nzv)AT0J9lz^O;u;E&VklMtvJqCaq6RE z&ihM3E-OxR=oV_cN>0zQ5h3>}Ip(G~9ZPlA>Kv$#T5-x#ne*dnl>GXS*=ts)k%io= zIGwLgaKGZXz6qgjhMFY`Kf zPgb$qC%B)vi{&nss}fi1Ut_LjPWdu(jgp`93G1)qbdwXD?Y-!n>p`E&W}aT`;+tj4-|V<|3iZzlJ|g&Uf}iVNp>?A})VM&^>@_b`{4^XG$C$tPIuV@}V3$Z2-&%=sM1 z`P|6)e8~BH$Z0+&usM*^e9mR=XHGq}tY`2AtM_C&%gL!f{k@o+_b2E5Rm^GM2id-A z=5$^kGEZgB=SI%=CFlE+^SP1J+|2B_z6t2NzQwc^Pc3qCpqNm{ZSe)>CFqbAFI{H*?;TocAQBp7gvTr=Fj%KIGJMA9Ejb>hmebI9mwJ@rv5&d<@$YH*)?$?n6XRlkaP4D+q*SaglJU&i+3o-4Rbaef`C zhR=tbuN67Xr&Fn?`HU*g&qd8@Xg*DB4jRQ@VXkA&=S}x*5L%!hkLT%ws`Z+Mb5u_5W}3GFF9Xla^91iAB&v&uVX#QssH(k?_&MwI}d7>)3I)1$4X_+`;+tj zgJXdh1;ExOL z6Z|K^*Nv_Ax}q&xM@MWusD0=W+{kndSUkx|#EHA*Z#a_X*tTeFArSpTOP3 z`f#V8x#WC4QJkMS=IgD&~Bx)XaCW`QSTLLM{vL72GGdpZP9jUv;w3 zlR5oP_cS{$<@{P`gc?b3S#Yo5KEc%&2Y#m@r}@+8W|HExp0eWfdk{IzA?52;=X3BX zHS~LsPpJ1RPJL9D1g=F4bH1-y$Tk1Z=~yA(u;;%}F9|iW;9kLfiqr2zejyLOG;q(T znA7>vd8rkrd1?gLF)t2g|Bej1_ar5!bCj9yW&6_aV&v3^{(j_T&aa&+W%ap4zkjKj zQw@Ii6kJjq>#R6EH@t%T1osObykYhA@(r7tiaGVCePfjT4EDu!wUDPOc{$59Lat-J zmhDTg1xd(d!M%d}nE!K*8w1Bx3$77d5?mJCE4ZII?-`sLxJDZ0{JbQ=Wx>6I`vmt3 zu1X8^Q45~RoIiiapIQ?X^aibuQbX5866$5ayP5Onk5|Y?nDb|gPsnG5+%M#+%Y?ZJ zt`S@kTo&9bxKD7u;Ht}o{(@@+mjssu_X_S4+|Qg}FVz)7f5A0^OM=USdjvR?Mu&3AM?G++{mdXJ#YO&J^5~y z(|5YK(|5YK(|5Ya`5aVN2kzk*=6wDd=G31)$CCt?1@9K>y-H3$H+_oJbJ#Dq>YBiM zss-05j-RcA=(K@CO9P_t}*B)A!T( zzWCmnl0PogKP~txf`2IZqTol*1$v$K9yMZMx!`A z-*n9BzWR{eSCUZUV$Sa?S*Y(8axZiKS{M=XS;76x`SUsW#=!5|mUr|gU8v*Pr(71d3v$0Cnm&U=#cp5(kIa(?bC=j-ee_9f^0 zlJk9$EBks`&d+f~*q5B|OV0O2&d){I*DrYR&4K$z#hmw#5puPVrwX}7$aO+43Aszi zWg+hta<7n&2)R$lXNBCaRg93Um7Jbk zsY0$1a-EP%N{;Vx2)QiOcMG{!$VY^HR&YP_&)M91>E6f@=FFVG?qY;oW=`iqbM^}E zQ=Hy6&Ib_K?R-B&I8pUbdB*njG^N|(D_i35$XUC=YLS7}OIrtQ(KIC*C z{=oJn=l7vss8QV>n1hD-Ki5~tCB><~i#b28%$z>o{^&dQIh&AsnbR85d+8A&_c7;d z6I`vmt3uF75Q zgP*gC)0$}hpVOM--}PWQIsRP_#qsZYFz44o684n^_X_S)oQ~^PoIcwL&I_!Miuo>f zEc(4EM#xhI*D&YnLr&{MuV0-|BP%%_%d0r>-m%}a*Naf^Wj?}kIxnB#e!aaYsH+Oi^QB?7jk}FS*Y>&R(S^eV)x(ae8k1 z6{pv)s(AIdbWPQQYXp}Rr@6_BTP?axe34w(rIt*!e1X19LxfI@U0AjcL{Kb6;_qgDm7;!F@uFUvQN<&_^w}MsP`S z^cP%JzWRFfvH8f%X>N3lyoyu3PjJ6bqpk?7EjjH=YpY@Y&ud)CsgGZATwlv-J-J$O zs?i882{khFKUn{d**v?M?`MwpLPCvCaKGTHO5s?7YnbzUgPhM_Qk*_;9#a*lS2L%cbdIS)t`TxsaXOY)ae7va2=zWC#~KQ*s$T6+xmt0&-i2Hea#?YD zjdU~r=e&g6r#Q{QFXX}2K)s4Nofq|q5puPVrwX}7$!VTCA(xb#<}3>}Ud5^Zh*0kn z>Su-AujJG}xF+y^QpKF+N#~+goO)^$r{n6F^L3Df+$H3)l2d=L;?&0{xL>FVt_}25 zG3RTg7Ccp`(FnOt$R#0n3AwD~G@ouE_X@dBaKGYozN$Lmo)KIlxFoo&IIW>qaG&6Q z=DXNB(|b|1EpWaX#p$?`;IiQV$K0DhS53A5{yWKG2%HvZam1mtJ%uCAv!GZ;jiQ2p z;DoK>5a;Pd#DStX1Q7+4K|zZk5>!yZ5r-lOMi2)SXDo_nKoJ#3MDO?6**p8OtFQNW z*S+h%{%iSt`Mlq=^W@n>c9NZ((-5q;jg(LIiW$2%u$&otjD5xdFt4jD&`W5(|2BtGSkXY47KeZl;IaRkih1aF3G4D9D<7%y zD^P}*%73C*mycB$`rRS-)+FaMsP16BUr+g0Y{v1fn92vL47Ewf%0$YS$2(*9wj`#! zHUMu!J`~4OEaR&(6f)W~%-9`k;(Opts*c2z57p5J>--~DK4$FQnUtrs9bd8R7v_gx9VcdG z+;PdaR6ftxQ%rpwf^}}hdJIHh>La>_j}?E6HgxYYF+IjU<3KUx95Rj=$6%dv{%(^4 zvChE*>oS4zsV*Voh?OT^ft+*SV+?@xahe~`;)B!pU|mOF`Lb=n>3+fbemqc2&+j5u z-ko6L6YKbSu#Q8l<7lQhfhsTS#W-RdGj=DM_RlMp#{yXID^R}dUsgV19J4a+JuGL& z9%G+zz&HZyHgxZ0xhbai!92!3)W~%-Efp9O8lXbB6$|>q4x@n`T-s3e~pMwh`l)v3p+{ zW5(_*6DQBuW9%~y6w7lf^CQMFE8{-Q;xi7wpP(<~8XZ{oQK-sLA4STiJ|bSC`%W>{ zJwH3~X?%K&eZ_SB7BCLM+YqPA4~VIJxvrvE&a01@n0dyYV%o3IIA9#I@)6^hu{(#g ziDH?*V#?WPe!w_n9I^7TVycT9Ch_I9D`StbubB25Fb)+{9qYgcSwg(@B-)Dk^~&Gr zDI7b>r#RMJw#EXc{-QYTnV(lamG8!UkNLi0+BQ%u*E$qay&|x_=Ow0nQOuaJ`>65r zj6KD&ADJI84jD&^X}_^z+SYxH#aB#aJjOobfN{t;VjL@$@gFyBm}l&PX$+r)G3+Z} z_9H73GCxu*^Jl(0kL9nJ_UkeBS($+OA>)W~%*wm-S$xIRj~-)RG3_@5Z$iE9titnj z=11U8Hoose$1L+>#_kiWtrSz6gkXJr5;2Yy%kM)ynUo>UgX#IgBiNS*ra5XowX@>g zf5eznd3$9oR3eBSotGO(-8LUIKO(CUJfT=M{JV8Fg1Y8k~Q|^t;E{ z2QNYnG@plzV^)TE1LbS>mQYhvaZdyIX?0b}<$wrvBZeGT{pIm6fc@>Cf* zUaG-Ap^RKxW7`IdL&g!~xB=6?n*WM=!Pon8pEtR+2kU+1nct219`mc2?=ycC^8@CG zj2E*q5%bqEKUO}qgZqN%J0Gm)+kkP%%EXNG=yYA)W9%~y7>A7A7tOYL#vWszalkla z95HrZGIjC5Iyawjz&K`VwN*wkFn1q`z7{`qBuO{vD2y*to zIyWDz`z~M{GL9I>jPuw~#|gj`N1lTiM~q{}?ov}e&)93gbiB)Vkl+)`caRjzcaXq( z9`M<=5tznDZSqwel&Y`2)ocqAKE}<$zeG!8H{KE>U@ zkt!qaNflFF+&4_U@`@>r$9%s5Q$94_$S0=prkTbYvCcDK+lGuI#x8n!Y8J&q?yJN zvChYR+l&EXUH825@2tXc-oV$}lCQ^r2d42xW6THZehk&N)OQi%n6di~t2<+lvClYQ z9Dz4szmzAj&OZk09Nc#kU-mU)kFn1<1XE0Tt;_sK`Ep;(kHLCu2WT9fL#UYMpGYya zL#&vN5n}42w`e?o@n3Sy{9Y1=uHW*CX#WnBqVDcfvY;q{`5H zYcbo_eLvYR?TeVUy-qZdthddxGM-|Y5Ay@YA>)W~45nk@L<{lPnEmD%dyIX?0ppNy z#5iW`evrhcw#qA(?aA0@954w1;Ld9~f08^jJ`9ZOq9~8^^0j&Ev0@HY=Jc()BGtpnfx=gIf(6xd4 zaZ+B6TgDz^Uojnz0ppNyq*xv!j9pAJln#y;bKaj01CS249) z%-H>c^_OC*qo&nsXL0jb}P`@?h#~d7Y+w`8%kJ<#<*sk7cm#J9m8& zhmKQXYO8S>j6<+)tGp^B`+}ACRQW+oFg{s%pOp_7hl*tmVA>b`ZCvv8z9LpWX6$~I z%=z@rNgljJ*Bwl8c5RB|1+3$Esto1qGY%9}yT#y5*!IpU+-or3-H^nW;~$*1EqD>i z%k#S`L-9i}wK`@ZwS`) zBG%Vh#MEx`+`-C6syx+;SeJ>xy6)~b2|q&Z4A%Q1rug!A@)gtX3+dFehk*}HB)@eKO-Mvy)QR5W7`L7KVTdxmhAwh_8i%)i6CF^Hv(^iPk%cj zR^_QK?#3i0^-*52yth?MWqjrbj6=qeVv0jdIZ*#2nDPw3_%FGSV`W0+({VwpwzDy66Dp=WBk-dbV{(m}`LSY}Ki%(=eQBonbe~SXj-OX$sLegavcJI8R&<{p zC|`~ZRwhzq=>9!szPmZuFO|4G3EL2SAvWS(5!Fs&qe@M2adD~Mg-+5zxz&Hf! zdJ)rpseGh-su!{LWAGxBk?ruK*>3=*GSt5zGw#N?n(-*cGZ-&sypFL|%HlJ&aFM3Rq*ZRXJ!31!e8$}vS2G^PcwL3rc5w&8 z>lj-djo+SeH^z(erp!9V-TD}R6yq73`LQHWA|}O zoMR`~czMPiSf781_4(I*$x46sJ6vq`>%VH^1dKz*5#yM#yTojpXY4Wd83&9*#u4L~ zvAdMTXY4VKUNdFFH`44EJNWXeR0gRRC7el{F~>A0SVdJ$6{L$Lcx;=iJp{13o+<$tf3{AO(v zU$=>;%IpcBn93Xh_LbjXG5Pd2N&@9y4WF3&F^YA}P?f2LPfTT&DAr{nRfhfs3bBqK zD}MvZ6O-R^2h{P`q>lS5CjU6aI%Zy#84916%8Uei%D+!B`STU)ZGBZ{DSToo^CLJ= ze#wprlYbC6RDN&8eM)|5vd4TT-u*of0PhEO1`=4=5&oE!b23 z9y=#Y{wZKz`QsFmUkA?rp2YuAG5LkNU|Z$yrI`GlU|;z|6q7#;94LRBV)EyKL*=hh zO#av4Ncm#dgvl=j$I9=inEWAN_m3pc;fl#056&xpu43}v0(;8esF?g_?U29n%N3K~ z4IFGs;tx?w{s?fW{7H(*e;OPq|2@Uz{|t_mzvFHRlYbD{{WFQ*S26iFgY(LNMltzo zz@GAdQB3}>yCZ+)cU4UOFmRxJ>MvsQslP(y&qEnv^4|nU%Kug|`JMJa&dR?~G5Mpx z?)D`A2NaXP1e{m?H;Tz`z9;fmen-XR_XPXOuTo6@b>KkxlN6J`92_eDH^t<)FG2pw zKTa|Emx5#EPf$$$La_T+lK&dT~DwK4J1{T=~jB0zNVMRp3DR zw<*?ssQfwbiOF9Dj{Z*a*{YcQol23v@;fUge-PLeww&9qR!sgxa9;UODJK7Iu&4aZ zipg(YhMbjOs+j!F;6V8&D<=OkaHxDakAcaT^O*9-qD-XxC&97u*C?j)Tfv@{t zF!|lUzVa_uO#W1Gp!`=AlfNAtD*y0Y!sMR=j+8%6G5O2EvGPSl!sPD*cI_me(-f0` zFF3FKw-uAW9qcK8uMP>5e;U}&Byq+lCjT*Tp!`*e$^QWyD!*;Vgvmbw94UW@V)93W zW983PO#W)H+a%d9T|*L+PuGxn<^PE?#N_XlN6yM0teE`qU|;!k%}Go?U2_J?e*$0;WNQgEdF35v;o4je0g ztzzeyu8O$KHZas%BOqMNcr{HmYCwSJP7$K|4_x`SA*RaN&aIMlm8qz zul)6j$!~iwa#ns%#pL^7U-{z{lm9w6P=3=x5+?s(aHxE`rz0kx?&%`spN%ra%F}4 z>H3_Qe7ZjOl>aKWB_@A0*jGMXw-b|3*X@Dw*P{$E`QixVul(HUyxV+29zNtziDUWto#ba??ncV)B=P1Ldz*Oul_2a#ntcV)DC!BjwZm4l((3zY{B;?stgEr~4hZb&~%X*p`_5 zo4|SH%lkp)7ouN0<?^-sG5O*s6Q?+6Z*-&-;H)!#4?t_TQr~9B-`E(ydOg`NQxkX9-bRR@aKHUf9l~4Cy#N^Zcm#6$^j!u~T zcfr2$H!CK;RVDIQ{{D)|?*k5%e}Q8118}7Lxr)h;z_IebQA~b8H{@KLRuYm*QuUAZdi=N0|`THv- z|2S}@{Gp1;zXKdA|0%`fe+qVYNb+ymD`E0W!FlC(RZRY1u&4Yh70dWwU-`2XlV1l8 zl>ez>^1lOz%Ku9-`R#fmf8`&pnEXEASou|o$sZ1OcTDo9{vsxy`YW&eyHSRi{D;7v z@)s&5e+AfA{uheL7snuf}t#3PPzOktlze?)8|bgSU;O1ra1JjT?AeYrg!s*%ka(* zy+^H?-iOpo?>Q6GwoBg6h?@QE^toQi{)W9H?ezJe&p7OXcE+}}h98`7@*$@E()Tfm zDL(yfA+gRaRORLRKP!{J!0gLo>@yA+hm0e}F=N*^G4qT)#y;bK^Mz*Hka5H~X6#;M z%I6t-jD5xde;j6=o|jNL2Dwt2=L>toQp(ZnR?z8?SN>tiGjz8Nv;-DwZ3-%s@yA+hm7-{iQ|K5{A7;9m{Hsd94fvQ>>Y2)2VlKl;uY9- z6>SUFV>M)Dq6SRm7afn|f|ZY18Mlv#?}2q&1zKaURvy1# zUB?)#bIbQj{Db-U-3)eK(RdlV_tD@aHMz)I99v{?4E4mdtlv$KI5PP>w1w- zO!d-C^&-~wiosNu-3DS`{Y|~{U|p{Oya{Dwe}O3nYD4lV{(0DzSjP;(dRupZ$vMy1 zW9&Czib>yHC11x3SecM<#5iW`4rKdf>@oHk2aLl8O!=I83i=Da&L;wIgD=OtDo^iX zd8e4RBG%_nV%=`UI*zZ((>a=0mkAWpcniVQM|4a@;IwTAu{tvL82gL^#-U<)e1WNs zbS#ihOk+kfjTvH{bELMV-137>Zr&NJ?qFRPAAAn(Dd?S?fN{t;VjMGe&otZS8GDR< z#sT9HtlKIAQ$BLuVC)Vtex9+%*k>Ft4jD&`W5(`TEIwn8vClYQ95Rj=$Bf-77N4=l z*k>Gq(>7tgTg~Dy_89w&1I8iah;hu=J)6a6>@oHk2jDbM#<40x$C`Ui5>x(u0%MP{ z&p1#lk156x)W~ z%-Fq%#b@j>_8A9^L&g!~Sg|~gE>7ah<47^}i^te!954|U0{-w4ht-upDf2kSBKgLR$(^FziFjNL0t zo_WR|W1n%rIAk0#jv2dGn)p6AZ3pIuj3dS|WA`c(C(qbp>@yA+hm0e}F=O{?7N4=l z*k>GqbzLInyZFt4jD&`W5(_^CT5=C>%GXWE$aUQpp2F{APsyb37}qlvQ;lE3xRP-d;~K`bjO!TJGZy!;_>8L_HGU1_ zTE=yZ>lus3%(iv!7_Mh5-c9P>azRFn2H$}>hpt`4YE!=I{iMuUC{yx*@hcfuF|J`; z%eanlJ!A2qiCOZI;Y!9;jB6Or`rPC^bc5lgzZ#}@+FGi5l`x)_Z<5w`{l$h$E^m^K zfl9_zjB6OzGOlA>&sbbxVwNzjWITGf$zj&DjBhsFbF|^njF&Rb++xb~WIUSjQpTBE zP5Jt%rme(%hD#V%GOl7=!?>1l9pie&;(ivNaV6tf51ZU7e{CX<)8{Y_YyUFsS;x4Z zvH07RDPdg6xQcNN<66dbjO!WWjf-@glrXMjT*bJCaV_II#wC`CS;@GTaUJ7&#=*D|hST+bLUCZ=_-V_eU;vV|#A#khuXE#u0TtUTkIF2=8A zT*tVcu{hF{FJWBCxQcNN<66dbjO!VTqgZ^#m5i$x*D$VST*tVcvFOU;Gp=M@#khuX zE#o@I^^B{!nfNt~YZ=!uu4gQ|n{7)NS2C_*T*J7QaUJ7&#-fLbU(ZWW!o~YWL(9#o-tlHPUnFV#+8ig7}qlv$FXf0S2C_*T*J7Qamn!}P9@_i#x;!V z8H+w<+bYI2jB6R!F|Is;ZOgcZaV=wUqA6d(xRP-d;~K`bj7v^3aVi;CF|J`;%eanl zWnUAgig69&TE=yZ>lurFCQb?CO2$=;YZ%uuu47!!Se(q_Gp=M@#kiia=+CxgT**py3k6m5l2KHI>&b-4|v=<=}*;fNRb)+tv*+T+djXW&9Gxm5i$x z*D$VST*tVcab1;(U(dL<+W2*h>lur)O_>tLm5i$x*D$VST*tWnQWH~LX1IiLCF9x~ zO_@5zRU?gG!?>QYs4->g#xzaW{OiUVzn*dB1mjmRu3=ouxQ=l>E#o@I^^Dhp^|s<+wqM3W!MeYf ziCM+ChH)+9I>z;k#p5PU3FAt}Rg7yGmn<-2Ks?LhFs^yt__d71B6f|loKF7Rycf z62_H`s~DI3i2YLv48d?FZh47kzz}JvODbxYNt3?8jyT$nsmV-pQruc3Kv@e9) zU4hFGaV~TVbO&?~G#6S0ZH10)CdA3m>Chx-K2*?Lh&`bS=uoH{ng~4#)j{7tKSO^( zEnK{-4t0bMg1SIGp(~&<(B04!=pkq}v=~|iy$^i?HE)66C5JAACPGso93lcuEnb6G zL7Sj$kc|bvPSDYi2b~9vgXTg{L$5%uL!U#xLw`d%pc{6F&Vj~5Gofdp7ooNVXhWzo z)C0N}x)quZ&4rdg>!6>Z?NCu6+6CGNIs)nr9SfZXT>#w<-3!fx=0QuL)zFvFkI=!b z@I5o=7HA4I6IubSgZi~bn?ct=qoB{AAEEYbFfO3p&_L*P=v?SBXc%-OG#Z)=O^0Sd z3!&xED(F4vD`+#6DMEii?V&u>8R`M`flh&{po^g^p&OuEp>fb0Xfd=FDlNu$QlPHT zaZo>~8oCm?0U8TUf@VU`LaU)KpiR*4kkc093)%tN8#)Z?1&xIkLCc}lP(AcL^e5DA z2lNxv4_XYp4y}i_K-P}N&d`W)H{{SN&NHQgCw3ECYhhdM%ipn=et(1p+y&@gBw zv;bNGeGGjG{Q)_<;JrDh7^;8{gt|ckp^Kmq&}e8fG##1+y#UogZ$jTd*IyG4s8o{gM8?EXf!k)nhreyy#;NAn(c;qLhYdapp&4} zp(~&pp()Tq&{NPKkl0;_U7(JT2la!7LKi~Ap{da0&`PKt`Ud(Q`U}eLf#VI@1|7Zp+V44$cLsv%b_o!%}|?Ce5VGgfDVCrLIWWm zx(vDj3ZTi*Q_%NNlQQ%PbP#kj)Cam63ZMzlL(qI^5%dQ17W6H&9kR<&52y#!4;lmw zfi8tcK(|77LDQfopvBOe&_?KIXdARc4#y>Ja=oF|LIv2VMx(S*KeF+tI65>ASJ*Xb~8u}T^?~QXZ)C)QtIv=_O zx*D1aJq$ewy$CIbzK866Fjqt4pk>h8&^OSJP{F>KBcQI(vCt&wacBYb4)i0m9V*%n z#}ITBG#Z)&O@n4a3!qn_kD#xh&Cs6vBQDeh>IPLqK6E8C0=gZV2|WQl16ceZHp<3uk=w)ar^d+MtBH9Hi?1k@4Q7djX^8tM%Vf@+{! zp=Y6&p?9DS(6`Vp(4SDjVWM`Wo5-Wjmwo zpi<~WXaICJbTM=_bR%>-Gy$3g&4m_0Z$j@wpF*3V-yzWj@t_XS!O(E%c4z{$0{RTv z0-bs!t_7jXp;6Fes1}+By$F2@ZGpB!Esw(WHgp7Z5_B0<13e5q3cUz@41Ev%4K?eE z`2i|}_Juk_-JwCynUD{SfF?r^K_5U(k4E0mK2SI4SZD||A6g8(1(jB!AE6JSqr0IF z&`@YS)V@2eDWR#*E6@==(1y?$Xd?6mv=!>n6Jr{xhK51cL(8D`P{&@#6FM2X1R4fC z1}%eDLSI82dgD9}9RhWQ20-URS3#4YnNSEl1w99S1N{K~2|350EukHtQm6-X26P^D z2~-1(gJwXpq506W&^u5)^bNEbYH=)bg?d5*pmU%aXg2gDgdg`2F0>=m4;loW1Jyu} zK}(>wA^SMw0d;_U=ql(IXeu-ZdKP*KS_7?zwnHtC$NU17Li<98LPtTzKqo`zLYG0; zK+~c5(9=*1?b-)(0(3BR0@NQG3Ecusg=Rt_v;cY$dI$Ox`U`4)0>%?`IMf|F1-cYk z4t)%L4Q+fc|&=b&?Q1g>;K8ALO%AtLrE|3SE z4P6M`3{8ZlK@UUopckMO(7Vu9Xve;I*B&Z`IzszH-Jp}8GocYs4Kx{=2F-%zK}(@G zp^u@jp&~4B-=pJYq^boWF+W%zq4|E=MF?1z#Ei@9k z4Z0JW1I>e6VToe=Hq-9H!4#4ay+jjnf@muGie}<8(Oguc#08>-xExQ{ufl!$Fi{{z zh(d9rXeCC8*5YQ-M%*rn#GQz8w`ePNvvv@>TkXU#R(mnTDise{Wul#(69?KI#EEt% z(a+vjRNMQB%k2Hd9rgiYu6?k0%sxcSw+|Ih*@uaz?Zd^hHYP_g5^ua6>;C`u->Xls z#FRo@Ssi1EY54c6UY4lEzqcQ2iCOq}pDQwA4*vZcZ+kw5fB#R*-+EC-lsCah#!?4f ztP#E1IpVtvj+7HETF4iR_fPx_UUkIK<~ZZ4e}gTycpLwpKK~T|Hh&`{S0N@on33DJ ztxf)&dT8>mZs!i_^G{#Ph&r_U_nU2T6Z+xNeJyb-{vENOC3eStb@~6Lv6pkWIM_Ktba6V1 z-p-NYZs#a*pVL)5?i?)^I+fxprBy*y;Hgl4=Dbr7k&73U8XZnl#GXumUnSo+q<`nT#W{_B!87w}@oGR93 zP8XXpXNVs&XNql^A)-Z-vqak_RrmqAv&H^R&Jj;G87iJ`a;|u#$$4URlk>#~O?*+` zejX5 zil*0zo10!Q?rM62nA~)v__b+`__OIvV)tgF#evOk5#5{Jij}V0#97S(aa*%7_{FI^ z#Q0`o#Y4@;iD#SLgr;=Jq!_!XZI#l_i=#AVr!#g*Al z#DB7%is9MM#C6%V;>PUfVpO(XjLxnTw`IQ&W3pe0JG1M>UD>b1gzN@!Z}w|3CHsxI zKO2kb*^Qz$y9q05--_AU@9=9so5f?<@5TJ=7O^1vgLo$Uqj*016IR-`in{F2;??Xg zVp;ZA{Nm4VVrBMs@mBT^u{yg=tjYcx6*Rtm z>y(0=HK?G2by`73>%4-!tP2V{Sr-=UZCzZjpLJ!y{?;`G2Us^09Aw>GaIiJE;BaeR zK^N=Ef+MX31xHyg7Id{17aVP63oETwh25;;!tU0tg*~jY!d_N+VQ(u}c$`&Hc!IT8 z;fdD1g(q426`pJzSlHhhSUA8MTsY7=qwo}KNZ}x>s&KG%PT{GRUpU0NvhXZxcwx0Q zvhZwcbm2MH?S(_FpztPZOyMoo*uq<_y9#f!#uwgh-BTD?lMBaK(+cmfW)zOKW)-oZatrrU?SuYh%wq7orV!cv0)v7DJ z&stn~zx8V2G;2xW1J=^Q8CFy{(^^sZu=Q5qY->&7Bi3hyp|z=SuC=xBQS0Zz$E-gK zAGiK0oM(wv^DV2@6PDBJNvlb#r>v%}p0=8`de%Cp)pOQ)tzNL^w_0Q^YW1SEwAD*i z)aqsHy;iSSpSG&AerdJX`m5EeR`b?NtQM`8TE(qjvvzB}%qnfY+$wARx^-&n$hx5Q z8`hnzS6Gu;ue9d0e$!gedX@D`>$k1C*6&zLTCcWVYrV#Lz4eFI%GMuSt6G0%z1zCp zdcXBL>%-PxS@o?qSQTx)wk~Y*jdfj{*c#hrqcy+HChOfc-&*gr`Of;h&1S2<&G**2 zHa}QjwE59m-{vRlw>H07zqi?DSw(+Z&5E{L&5QoBS{D6nWs5AkO_6QyTIAU6iZb@@ zMOnLjQ7gN=sI}dpsL1YE)Yk4)w1d5O(T?`MMLXO37wu{vRMgHsq-Zz$u%g}V!;AK? zk0{#H?p#!EcPYx*ql-G)pBClq--`CKn-zDm-QvCNmc{$nt%~=xcP!q|-nn>xyIt`C z_8!H!&L}>_-naO0`=H`3_94Yb+MSD!vbz*l+D8}nw!0O3_6fy(?7qb(*!_!7v%OY+e?ba*h`D=uwO48XMa_Ex4ofwyd4+cV{a;+WPe*c z+5WzGioLaXs{L2-eYVy1emmQCnmw}Zbo+vx9^kKVS>1=yI=_B@_(mD2NrJ;Rx>7(`~rH|XgOXt})ls;kKR{ErUcj*FqYUx6I zdg(LvGo{bjua-VF4?DtAvwm&R=#r~wU&i=e~iTy?CQv1u& z*X*xKm)RRim)l>LzHY~*k-e$(4g1^D74~>ayr z*}L|2WvlIpW$)P!m%VS#DO+PdQTBnosO&@g<+6|L#bqDcOUpj7mzRBNzfty?{bt!( z`|YyN?bT)V_L{PF_D5wK>`%+Sw(HBjvDcTy_U5up_V;C*?cd72xBn>n!Tz)CNBgg` zpKMY7t8JJ6W@pNOx0{x4x0{#$Ww$8*+s>8?r?A{|T9@0-e&vqStvuuODsSQ(Q{L3^ z%9}aImp6A#D0iKc%3C=7%3C`9%d^gDg^Lu%zv#q?`**Tb|?d=rg_HlN|?d!D5?dR;C+uzwEcYw2J?jWaq?qH`ZcZieA9qM$* z9p>b7hdZ5eM>zZBIy=Yaj&x4Xb#;d1j&{zW1OM6W1Vwz$2;fc z`Z(w3PH-;Bo#3Siu;_t756(QS4?vTR7`hHsd&H{ zT=AfDT1BmMM#T(gNX0`=RmDu_?23n-p%srg=T$u6oL}*zb3w&Z&V?1vIu}G;5=CIwKJpQ8)s%k>^xkt(Rrj|lM_~a>pWWVo%49bW@moI_s)|QTbusAXKW!Cx#>0-<+sK)=xLkgEsb?#1&Af~lCcW8% zEk)PjdoPJ+a-mvYC(HeN-P%87i&3)Nu2!MC-r^eH@)BG3w2i4oneXFZFbh&LY z+92tzt9t8gn_Q~twS6>QfiKj8dUM~fMJ#Cy{v2Ae#VcsjBwmrFy@GT+zl>up`83=&qqdlomfI2Q za!Hhb_CnIrqi?mu_i}GLuGH<)1AiUoXX(8=+rn=d(~*2V`q$c>|k=p;g!DtaeWKaT@YVdUg2*BL?=mMIyM^XY46UAI6#(rVQfYmCTYrddX)UsSC8?}vD%^9FFoQnPqFcA zh+3ogXkGJVE%iA4XFLD*nNa*_tA5*@&WUCepZtQ3j7uTaR;FFd%r(K*<;;9lmu?|W z(j&smVKlQIFSGw=rhTRN@3Wc7?=Z~X$*Ak!Mbp0NY|*=`ZjH;P>I}@@%$zd?YgS2= zf6naZ5FM58Vb2;t4}C9}KL~eK}#E-p8~_I+s!Sm4>8O z54%#AGiRZ_aMnmZ4RD4yTkdW1Y+GC)sl|h~xKxs9jc4A}xja>sQFHN>jH7193|6ov z%H!y))a&t_-r}NunrhC}M{+m(3RTiBQ=ZhH-hGO$hgYsYosjmzNBG-Y$rk56r^nTW z&ui**wyu%snI9(WEvD|M<9iFyTC%uK~RWqYolWaUIrQ^f& zs_FARC);9#{Pd=ibOwWPE=#h%`)a(WEkDiwNAHbh$K*I_Z1yp|U~;)~j;*d4%zh94 z(-F7I$P{m^Br{4jrXy!+I&!AGXRGtR84+e5F4iZ_%#h?aZ3kVCf6sK`A9~wF2NOE3K8ibqnp;MMpV(tv=!p7^R~$Jyd^s&lQ%M9sj`E`+QlCyDRml zW){7#l_Q>(pAOhTM>!Ek)FSDbk$rsH3xBuPx!e_4VzDe&*hg=Bct=g6Z`1S8&MCcv z^I$S2%?!K*&kSCZQLgW-^DDenm!r95h5YpOtM#Xg4%EG{ex)WeUfxc#Dww9X*m>8EqkPq)s}<+i2eE>5prS4`0Rz3v6Q-vbWQ zS&i9S)37ofW&U)%#a?|hZJMOZnd^fsFX}6W%kR{*DD_UqIWHMkFLuv}cVzora3G%3 zNLrH8%CY*qH3W~rk}LR^P@|-ehFqu55XE2UJCTkz=yBB*Bj*DdultSKtHXKvGwC_$ z71`E(^gJ{MxqK-c?7yhQl!L)RX_Al$Y-I0#TZdnI!=FnN_ z?6lkB+2W^nF-{j@C*d{+6 zfb(kNy^gwBs41SpV%|uuOWM4rd-ZSBDCv*k>-DESP`a7iBGXszmu9JC+gs1o`ThBs z{~D@ZPtq@$jJR0RJ6$v4N=e&6!zG>lnImqL z)C*_q(UO{dYu_Lq@;n! z`2|V0?SvGMsFSTAYTAsMkz z(qFM7wn#d(G$VeIwC!U@{3+=syq0d`P7v=$AWCyduWfNep`^8FtG1GE!x?N>NpB;+ z5=pzDT!o~cU(blWB^~_??vx}gFUOsdq<8PM#8Hy$ahh6AcSH~Ab-!7U*pkKgr61}2 z)WZ=cOZu!Xqo~t2wxYXIFA)0EA=ozAV(`g&W~fZhRtxZyI~jH6TE&dh?>v1>TUYC2 zrVUy*Ig;1oNp?bJTXWy@!=?JzGG{uoR%Nb68e69^88mj~X7+J9W`-pD8%OEA<>u%s zir1>O*H{L_r)9)o*^(RQ>Ux+n-5FSK8X`Y6_hsff+nhh%+Mwrgb4RdCnw7b0GgnKd ztxPT7>YNcn<=)J3K4+e8`^)dv`Q3Yq?k!Uzx~9HRZaW8e@0UxW`>kP;{^+mU;K%fC z_EnrOleNQ<=^gVi>8Iunx3NtBdPT<@J=wuuIHKcYA;!i{lIHK}h}$KZ7CK<2CB{k5 z)YnA5@M}lh)8JDx|NY-w6RuySXYZF>P3D?#xAaqUb!e{t%+;K^ax>Rq=Gwws3z)OG zIXj#4@5uD5+t|6bu`{eW51R9vIjd3oB`Z(&r>lb_@z<@Bs|<5RdtwLeJ&SV5*>9h8 zW$|9Tk&<|=ab8W%wQXLu)jf7&tCs_@N|GFJX7%!_YBeVpF5I`wjCyaiaToha}8tu#NgYWjNmX~*=_8`2fI!RhK{^)-&TPmZ-KM(Asc z##UUX_0wbgob;-tv9W8;-DXBI$EBI;%&Zb37d6|aYnJASH*Un(4EL;34 zw=nzNJ-x#<>!;?<&>ZKczFQD)d$M1Q9A`heDlmJabstxHwC>YNQe$KH$v%$QL4Im- z`SE^`t9O$A0~U#er9Hv-Z~@N$y`idewoHwkjA62 z+g_IYXMH|9a-qswejb(3gemAF&(7CufIa2dlCR?z%3gXBEZ*gi}%Vu?#oyA)?`|DJk}$U zp1!+-jyGp6{;H9TcQ9zYq%%C-YEBPL=4xcYvpR~Iukd2MihSs7{i$j3exK@Vvq|Zv z<4?21WVyHbDZQD}rj&*puj{evOda_{L`lX$Ij+4E`hB@ArptIcqaHIQ^}-RFTrqx# z>zq(}w9YkOlIdx4ESMRSj;*IuJ z3m2tNH;1RstT(6acTuRfpfUcDjBMsQI=_7`JsRU*NxFQ4?m;t}?oRiyK7IG2u{Qm0 z``DE3;|ED5ayQK5Nsamr*Ddtc@!Fe`(ktnVemL$3ew9%Q7wL0jbyqz$=$mQD4E+5z zeeO9UegDApzIg^|>ha&Q-=1dg;2RD2hR=50Lc4$(o)MR9(%!vebq|^+D{o>&J<0DO zJZVknLwvg_iSjO1Tod{;UE|(%iH>*VF#YM;bavbcPm+=?&cQn|3AMn}f+X^(>DkmA z=RMOW?%O)+cK)uXraqzWg#*&jWX>~d(yUhfs`uMue?3dlU$;s!@ZcphFujg#vs`EO zMVkHAy|i~^UwxcEQ>eGSH@&kC(>6UI(&awDQ*&4LN0)TJ^;p?Syzf1o%e*?>3u{tZ zk;bDwZ+I>xCMd?vN=lEoA^rlU6ysgFanPdxd z5BAjky7!NKLz6jH_c}ZZxm*BrH1eyeL47T}lsWzSGA>>|m`YoA?YnMBFr_z8R>f{Z>Luj=BmKV zAPZLNUMRtn{yk;CeQ~88SLYp}Y26-<$jMJ%#fn3+U-N#`BD}lMNq$P__yZ)FQDXYn zw1KIwspZ61blqypHJNeHSQN94PUQ|uvd24Z$uWI;hm1H%dS+Xb)xWQbQ@kE>Ta)ua zxZh7|ZlX{*PnM%+QOT#~2}kGj=zb7Smy%D{;(9lsx#=32hbL!=cf+rmb{ntTxv}hN zzbDE4(lx_CNp#I{x}?Ug8B7#YBkw~!uFM!R#|Q1B;W23X&1`WPuD+7lZ2f&Ue)E9N z$uthmmt^*9TFqR;wL>3WBFl~V!x2|WGWnVFwAot+tVJe!dwxHCCb=DLm3Wl%@c+8s z#%g3D-*~G&76zQ7iRy9Ve~oAALC^h?w-;$24ewpdJ{oHcvjz3#Xt_7)%Q2F^?xp*v z3r2QQ%huQF`=0h6>vcWT_O#A*cY~Zw%?G1K$-HZ_GV=xzaAjtiCnHnt8HcvkrG#y6t;uRy(JwbQz4W7i0$JIC>VV zbajnnm5e`=!LanotsmY#PG-m6*XZ^$hqPdoSD5%E>EO)F$bQZpM#nF zOguB{Or}5KPPpOsD@wq)UhccIcw%S_h`MvN~gruSeY_U<2o8DWUoVMRF=~d}*>32*_%}-44 z9L`BsSWKH%cG9!_5$PL#KjFDXGG7hC8w&}UcxGGEYB%5+UvlJ`_FIJWVDfatw4`aj zIq9d*9;{pPm-IbG)24Gj(ovSI(PUb;`Te%oBHN`)T8>8NFVZtPo7Qct7tDRKnb%t2 z9j`xSl-<+2vDVk?*4Ts@)5h~z{Mtu)mu2pRcj~9xuMg(u=CWLX=S+o?%=!1oZ^1^&OVdq>VbO|JV23 zx87{wH=C$Ud(`TE{QJH57wNjKxhwxA)@QZG?$2jo9~E*R=1%?h1N51*v3vIBWAyRS z*xmbztiGoC_xtz=-}Fh|H|v#-A%SQ9$+5LltZ7X;t{S`ZUz@IlUSF zl3D5M$G@)-m^b6h-1I+QAxNK>nfc(x^i7!U$2s`*EqSEiyn48#WjAI-S4oqL9MMzK zYCKgqPSWrrajhrmRXkrfMbeI-GbF9Vs`%NG?sYTb0!a?u*t%3wggfS|CDFTOBP4CZ z)mM$ApSR%McuA)(a>Q6k?G`&Cx!yQ?VMa`l-io~(F-6i&8GR@6cuz+>Aib-0&xl!) zUU=UTb0vLtttFn2L~oQmBZ=N4dr{J2yoda%qzmyD-0PAuWf`$b()@QE@t&l2QW|i7 zMtm$in$7AZEp;+tgQSP<%ZP6!{dI_*8D2@pP!l{Y_)&g(W%~WHa(vGwxfkl0u6Vtc z(zE^a419V@=E=`L-$84*jznjJhU+x{uiq^*v-1D#8)d)CcA1F#{p83q=cE7gH_94& zkIb}&Irq@pV}Hy2nl{~-&H{~XVLWq0nJb<<575^>CVTVdia9sZ$Z3LiJn>!C^awR; zBme$>*qiBl!{+*LYkH11@l2-1YwXO~*tyJ{w;G%I%{*@AY%{MlwqJ96nDG*)^WWJ$ z_5F0See^M7zVBk*!#fMBF3H&VkeR0-kDO-0=N{wY@R+)Aiu4noF z=~KLm(leN8=UdVhL-XCf+b+bJUGA;_Je}VHc)Lokt?!7E20i@@?gA?k4@cUr5=~b#*!)s;J&US0e<8oVb{kH($^l5mMnG81Hujd>y zV$HXbY3v>+qd9p{@pV1(Db6(wubJW?%r^xC8Nv0*ueogjf+kfwc#%9O={adz| z$_$Qj^%y@r{Z^yN#mtUob#P7kJf*RFA=A_59bD7XX71cLL$~gTF}iiB{jQc-jo*s1 zxFpm2w3<>Qy~bL|T;Koi*CLa(P1E*o%+nc|RmsL$+>CK^XG3$ztuiaqYG%cCNP36c z*f;devjkJ4#`bG6UA9mkTQiQ=*XSRm-(~#nMctR5VMS@I%&M`RO{V64%k&ZT!i4`p zJDZ-NoEu&XJo%^+JPZqXxR9ln*4%)1Asch;ZZr$_eIS-S0SpQ*{b zZ?O>HkV*Pz$|L&IrgJnMo<8YXmzEow#;g2a?7d}_T{+SvdJ@dc%yyZXnVFfHnVIcO zGh>;VnK{i&WoBl^G{aMz$i4N-bK76_>Yn*AYyRA|*H(lSM+!wqx(8U_86tbvMz|Wd zOCVQAj8QYzlAfiTct^z%j^K~C=)Y9-aXW4W*r&Tf!g^;C+E~pz-RQZo#6A` z_J6+=<{!JY?#S5rVei$j(Jb->ob{bD_d9NOHM(B{m)AVixYOnAb6KMTFmAb80S)4b za6ex83|ckET(6FioLEnE&wOX)fNrHU82zZ}fKHgZ3HG_|uHX(bkpFX@G2@|UH%Duk z-HF;~{)Io~qOIm%Q1vE>2j^YRMyXonIhLy~7bB$Er?@Ep4{mVE49?#`w{ae zqJXEnK{By`hQnj+sKy(C^`EtVp1CLT zty{Cq_+Qrtc23);SAL&OGnkWJwYiY_kN%TevpmQ0YlgMHYx8Ow+WZ%FtKCC=cIWW> z{A;h*W?g$KY5nxn9@PAC3M`fJ{h__V=xAfCjq?97!Sh%T~zV6W0X@nx^~_u1f| z`i8aH#vB_(R2g+vaKeP6<0Q zwl#Zg_8-MSlh5_v5&JF%Pnq5JhNt&4v@z$W8iziZyQI_)JYAdZKig}+AHjcro_m_p zJIxbmiQQ4KyZ&6?nD{D9o06yTDZXMNT0pP0Mp6;(HRUr~0`e~P5X|2==PF~XC- z*wwXNQ$Ngs*6f=4_bX{n>u0+{w&QE#hF#nKeg|%S(yjnL)x>&S#}JGWu6muOEWL@3PM}AgDbWc=yY|U zo138P7l4}24F}qI0&;(vHImjmas#-dK9Gws5vYl|r%mPFL9X zr@{3!cULM`Wf{2O6M$}-`#iMtyxAEl8r>ULna!LyDA&Qf1x3+=O^{1C5^|l*y-ZqK zp7kXd4KB$5$R%T+Ry>E&1-npl!bjj*n`oi+Er^NI2#Zk5@UtlWQN?`A!X267<6%{! zRX|bAU7|syHNZvBjr!h}0$RhG1I+(Ds!`YcYow_88lbi&pDX8UcFc+@F9(`F8*YXz4O=Dd>MY{K3^Rr!Fctz8tt2TcCT|+(W9R-i&LL z>4~uz*VgljX44b>>51*>iIwPy<>`r2=!x^`iC5`~aTwQD(i5A|6EDychtm@`=7r5a z=!p?H(#aY1O3)LNGwPkACyr*6+QO(8hOzDuJ+U&;9$wK;dSWShVr@ zWuYhbpeH_{C-z{hd(83J#(dOq$qlH(Ogj#nf(UXkQ@MUvwcNsd<}IbMq$qlH(Ogj#nf(UXkQ@MUvwcNsd<}IbMq$qlH(Ogj#nf(UXkQ@MUvwcNsd<}IbMq$qlH(Ogj#nf(UXkQ@MUvwcNsd<}IbMq$qlH(Ogj#nf(UXkQ@MUvwcNsd<}IbMq$qlH-Fo#yZLI z%1Mq_BspG@q$qlH(Ogj#nf(UXkQ@MUvwcNsd<}IbMq$qlH(Ogj#nf(UXkQ@MLA54S0p)Jk>q$qlH(Og zj#ni6_*R+aKZg;Hr0{Yw*C^S)XTJ?jqOlSwWTC`y7G;sA&qTOJ$d46Y<`W43Ydeed)lTo^s z_GM@3EZVn(Rt;dy8z`5RZIq^cC8)8R*HMA>ouXWrr{;}lZr>js0bBZ*XRnnzJr*ea zFrdrkO)y%z%sg+ZDAfnllBWSmD~<$uWahrgd6{Q#6m94P-50GP*TtMRYH56PU!fYRn(jPgY(P|G`i(=-q%FWLKE)iRc zJ{1}rLITM@ma1{z+y}3yjyYLW6d@`~516Q@+)5KI6df^l7b#j42PpP5=st;r`pU-u zdKU+%YC@pWNr1K{1sZ9-R-iSvN(q!JHBg*%Kz+@sS>-lN#g*Hgh(sxkToR=eNt99~ zQA&|SDMb>c6iJj)BvDF{L@7lQr4&h&QY2AIkwhs)5~UPLlu{&7N|8hc6iJj)BvDF{L@7lQr4&h&QY2AIkwhs)5~UPLlu{&7N|8hc6iJj)BvDF{L@7lQr4&h&QY2AIkwhs)5~UPLlu{&7N|8hc6iJj)BvDF{L@7lQr4&h&QY2AIkwhs)5~UPLlu{&7N|8hc6iJj)BvDF{L@7lQr4&h&QY2AIkwhs)5~UPLlnO$;V^E@$auTH!Nt99~ zQA&|SDMb>c6iJj)BvDF{L@7lQr4&h&QY2AIkwhs)5~UPLlu{&7N|8hc6iJj)BvDF{L@7lQr4&h&QY2AIkwhs)5~UPLlu{&7N|8hc6v)ClAXUI+3zco{k|gE?<$y(^O4yCT`W zE0W#2BH6twlHI!^*|RH>J-Z^=vn!IFx+2-BE0UeMBH5`clKr_N*`F(t{kbC9pDU96 zxgyz%E0VpqBH4>8lD)Vh*?}vP-L@jxZ3l6jgR zudB$eBJFwhf9DkY_b1k#&ZPg7^Jja){GXgF+tcL#<)%!2g}oU-@5G^Y1@B z^Zos)u06~BPtI-a$?Sh}9&1lw|2t=||0hmYe}AU>Pft?+{qxg*dRA&rNdJ@5Pe~O9?f)*)Zh)&Hd#eL3k`I%BOG{Q@sg$Q zS*l-vkkT(Kb+X965BC03DGly&g2J-Y>PBX1OqS|5R7E2`OOv{2(PAGb4drYtnJAZo zrPlgv$+_#L^ZlwKcb6X&0927Yn84UgWIC0BQ_j zslAR-ES=z?^iP(~W~r@tAxoFD)YiO~rJGr5b$7CKKTB=jA7kkmmRj8_EWPca^bt#6 zdMFKK=~tHO*C?d_yt0a~2@2_=zx#6pmPRLvM>%`t$yl0(rFQf)vose=?X?wTX$hk8 z9^|UCw4R63rYvpap|mqgd$CmC=OI@kqFiTId)aqVf>2;Rc9>2%Zr!3Vs9*b3PSo+CB=}(phH*X}-IAnFh zxt!Dzm8I4X;;=NahtiZR&A?K9U#ZlWou&C$YOl8_OUtm-wp*E{wOFdpZA;A!$?1C~ zg=;~L_AD)#0i)WDrF~hd&!UK~A4^BF)LJ@$rPEld??n{dx#X!CCYOLG$yqMW`PP1-0$&emL!8a0UOQ_lKTbC$OAP}-HHeLR#7 zX6Xo)>Kiu1s_`uSlV~pGtffm>x|*f>1`DZW6H9lp)Q;eOmL6lNzDYuK&#?3|OKrQi zSo)CY1?BAA3S{XwmfBi;a$rVNEtWQ9sja02OWS)W?Z(o+M1GWu%XQr-mQG};ZDTr1=MgRSAh(vKTZjTEXQR|1 zmY!s(?bGuty~a{&%RQDpC3@pQ?lVgr^ADJ=BSN_7?;{<7rO}DvQBI!-5}!=Q(lji! zR%K>sE~0`ix@+z~)v>f|+uFTwuWsWD*k9V`cEmpIjYLaQu6uk#b*Co-sQ$z z^Kq)WDE12Tj^AJ8>>JVQ^+s!DYhd>@&3si?-)$(@*3i{0p3=){;i6lq@WfI8QQ_l0 zP8YZIf3B~WD|aV_mov~s1Cpb@7DWGZEu&rC2*#>OF4|_0K2bH5$gdl&?Hj+$6XMo$2B01i0Mr5OaG$j|hc zKF3_IE&8A_-`ZI=6ndkK`3FI-V_7hVOP#tZ{OJ(xhK3Nr0B3`s{nRx>iE3Jq`(Ezam^A3$7zQzk6-py&a8j zhpE0BapUp?{G;tu$N$|Kh*t2PiEErQvHIZ4(ZPrw7{8zI&V`Xghl%PFg}>t+B=^dE zHA*#p)W+Ly?U%+|@qIyISvuXk`BlFlIgrS&g0BQ7Yq0CW>p2g-36r~y&Wn&1M>m%_A`Oo6B`Z&q0K)7(F# zrHyEdd<9&&k}SQ%Ys;7$x^MCU4PZa}a8#d|=UB9s-r<4PvhRnRIH{#xc~HyXyg>J} z16^Qior%V=^b<7}u(To3T=sn~UfXE;OKuY*)PghSZYo7R$c3K|Zf-ZoO`}{~^Cm#m zxHu7VzO*G0d)L$ICgTLGWbAXyDfrH$;Cwr@_=cX*%6mxleflNCm@gf;F+0{_Zzr=m zdls5ikmeMd)ok3g`EBG2pP*V6y#(sQ_bggn`@Q1=2M}Yg4n^Ee91E>Q8UQ5oJf~|* znSJJ6gukGY=3jHQZ@7t_x{}$~9hqqu(X<`Ne%5+V(M-OISj25(L36BC3N%5kEz{7) zDesnMs^{xebx|C1Kc*u8YT)jT@ebnBlmvHR8&Kq9Kmo&`JDv6Y*oxB9Q-IPMf6+F& zd7JgA+wMlTk(au!sVmQ}tK5e{(3nEGrZd6SX3cqt0w{N=1+L?h$;n!uWN}@4+guTU zinr6nL`cW6Z?*XS8{5uy@pWpu*U^%9k8L$~y{J$A{;dM`8T{YN*>$IV6GH8w$UU!l zx176LcWtp5C*Mx^g2kqR_2PP&eDsF-VmFC&1*)Cc@Ik9D-%UL9r>O8l*j&$Ze9^GpMU*PR5cQxvmoT74; zn`iD+{MX#e5wOpbM%%N#&RVx-Po-A3+@Gi=0@3d^K1MX}gm!E0W1dseb@uNy{{2!< z8lJdL1z^2hD|?c&*So~r>7;vID`!#PVi*N0=V=tI#s+gIrTW_M<*dfPk8HNGF)Ya} zFK3rK3L(s_)p;3`yNNXgeVzSo>D!Lxo6jy1-BT{I=La?u+tY>Y6ItI5#E1kZFr%)R zoxfi1WTI$`(FfJZ{da1y=f(C*!188zue36M6LY_{V<+}o_U$Y7TlPPB|MLwq%e1cw zhBdzHMt=LX;r=GmJ#o2$=3SV2mHSQ3JE+`mHGXeZS@W*;pmsgfY)d^^YOlOIYw5HN z_1WvS7I>1gy%8xjbS<(O(dNP5bGFn*^k5P2l?nR}Y)@YUuwPy9^oC* z`~3<}Z{fDzP_W+$uwQ$y-?^~gzL5Qvj?4kGQdJ~tOdWmM2Pl$#fFfBnE0Q(3YRC>v zk?bK9H6xN0w`z>yyRy^egq-XWR6}+)D)%89IN2#FCwmB$la;a|q%8t2`)FMAE;WVfhtvgTJLYkozt=2s+Zenqm|B+T9jPMOTWP86AQj0DNRjMo70E7Ik?h(O?cfN? zu2MPKMQhEn%U2}(C`Gc5QaRZtD|e&-IN2F$sqC^8S>LdpXlLmEKEJo#ZrlC$z5U73c%2-VDWV!uGE1$=|O_?6p}-|NVAt|Jl`zjjT2*+q`P?pv_U9^31jy z$Zy`vLY}x1%uJVfsx~MUGT7XdKy`@1vUGSNlzvJGbcpDGU(K(~^KTDa-v~P!+4RN% zjO8VRG{X+&$=$?pD7B|_qs?>|$H<^p8&4n%KwNHmYPt^!aR_`_zbJ?-#K3*_r35<{`YprJ89&?;x?~ zf3}vt|LgYNwORfv*Z1Fhs@eXN?y1zCHoi3bX^oxlY6C^$YS{iyVz1o3jXh;o^npAr z@x`@Dp5btEOWvAfo)}it!aO&tDA5jZAIuZO%C$150g57bhum88e7ABt`hkmA0&=V0 zL3gh?0aCg3<_TX#?aUddqUC47)i>)1<#w8X(-civ12outL07rStH4F;g<8s(=WDez z_X?nbdr)6~^DM2FHhTkeHisU(ZMe-!3B6*jd zB6$K{QP#YuPo8X7PM&~QB+pAKk|)-KO3kx8isU&+Me>}wB6&_-kvuP{NS?-5Bu||y zlBd`e$@Axme9t|IYWMdG`P#CH{m?jXurlIzN^<^zp^8~tDN|* zBJo{C;=78(cNK~6DzabC5kFN<{8W*|*x+tt6+aE@A{i}3GFpnnK1E`mqD1CS2}NS5 zqFvX)iOtH1&58osdIce|R5`Ivk=UnbvH8zSk-Wh|k*68u$*(;1q*$ugYx`6zRnAlI ziltg=`_xlUilr)N-=isg8rkj1=TUu~m@XP#1IXLgJa6D~MNEuUl)yYUq3F5sVnyl9 ztWcCI6}YB5fqGp5ihB&Y-oDV7*uyJGH~ucjB{%Q$)%u3T0eWxds&c*AuDm-{xt1p8 zD9Y0ZsI7^5%5|g7MQOnUGgq}VJ<(P3jv3|TU80J@jzBH)hFIllWCJSs1gJFIh{!&$ zejvT8eJ{PMNP1V1^sXZ5T}9HnillcHN$)C>-c=;Mt4MlRk@T)2>0L$AyNaZD6-n*l@a`yeZ(!0t@?<$hs zRV2NusM&BYC%)^Qwx92rJ2`YM`f{4LlhiGZc?^5vc#FXuI^^x7a!XqV_i-|~C|gdf z=Hy=DY%b^NUgGAw18n3xZzqo{C#Von2^ZNFn61{8f~$6+iWu5J89sy@nsNntyNY|_8QGxIYDh*^!vMK?NyFuZ`kva z+w7|`@6DZ4Zhf}3ZsxmCG2Jtd>`l$nye_J1?#k)^i<}*gZ|vRp>|NV#b918Z=jz&1 zwP5@PRF%T`USK%$96>qve&wxy0F5yF6#bWM^Kq=ST9}!l+zfNapn7cE%udi3_Y!9U zvR@(;FVUwyJl!*K*ZjXa!nLn}xtC6Bjy}uR8Rv5LPDQ&P^t3CQGZgnRh8^VVOmTIW z`vDc34omI6tl0oxXQnHccnIXOEcbTCr#EX<=j8%;os9V+SI&;nD&8Mv@1g440r!Zk zi0|vHbTzhRMlJULeS6AjIg4a&t#@_h)O4$hikUr~qWtFG3PszJ0Quzy>Uh&UTkmQl z+zKwB7|^$(K;KKC<{W0usK%=hDD7|7)XK@%>J{zv0xCWfZ6q-LqNP340wpdCv~3@d ze6L*P3TFWta2KT;XPKutT$`WnMX7x6NjcfWDmukJC~of4S8kBGhf2|1^UelEJIs1W z(V6c+Rft}i`+c#_yHe$lje<162}fL5kkTf!y{yK+i$}75stz%g@o5uQ#dg zs~@PPhv|3adPf0w#AJ5mhMWHg6fHNaFGUl~J3`^4MOp(koMfN{5nU~5*wmRne_|!e-sb3e_ z8C8#cUxNL7Z9jCAWQ8rCl7h3d*3Qrt-B3E_CoCO%9=b2j0i7XtliWX@jg9j9I+tAQ zOP%y}Zn#KR&G%fi-mG|@xJXVkU%4o`>6btk^@-){e092waRUyugO=%m9w5` z{aIEvS~`GHc@XF74i9rR4CjZ97IyC289MV4+VwP(?fj73qZZg$XID_W0#VwpiH{S- zy~-|zi|?Y*mwlY1E;_u?$4TX)z@=s%zdlGckN2Q$zf#9n!G~q4YdUGhaae{dbjzduF<~ESoXo>U;4n)X+V6Ft!BG&MR{)FNzV49eTTs@a~&GtJk1$u)^a5<|n)~tARrr4R>jc;fl z%6H=bQ=6k##kkoWbM&b`&fZ_zm3I#42zu%(TWUSqM$wdMF;ns{M?4+<3UmKVH)P_R z=Dg{!+iv_iK%Q#3&>h}nbHKS2UO_#X)0}T;pURWUlhTRDe&H$N9kW{RoIyBQmlSbN zV(j}Z%9*70;^G@18D{OsrBoO5-zFe1%Ok887UwXmmPi3g+9j+-4z z`_J<4pTM)v3*C=^eqP-fqa{0=E3Q?tv$^G>y-R%^eJ7S3EgSjm7l^F|_KW1{2YLnl z$MR24QezkmJ#Vt7ruKAIW`JfP`;WWj#ET!eHVb<0q66lQ3GZCwpAl#l(I%pkL=T8U zo4x60S2qPwF`_0!gNQcp{)1y*yn>#DTd>@mXu6)0aVNNv9l?d)2<~=EaN$;f8`=Qe zhdkavwN!ct?sFM%N#BF3TmYQk6L8yhp}zi|z^!Qox!4g<8etpIopzARQx0;?1HpA$ z4Y}8i!3}K#xwjEf8g>)V%~p`x$7{>e5L~F<&@B-c8bzamYqbw@2@jxjau0C+CR%9k zCb|l4ei3jFpM$IX7j(z?flG7@+<<=I`cQ5QcCk9FIPop*tx$G-9;|=f^SXO&^*_AG*ID8k<|7jl;{p6|4^~AN{4} zJ8-dnK<+K=n@aoY(!RFzm&@Uy@qxa3gyXxMk-63qZpn0-g{orH==q_6WE^kwCMZ8g8y!GI6euG@(mEaI~2gegmA1 zKIK24v~*?PAX}3BiJGfS1KQ#36I3c+`cs=Am7M{(o?TJ;M@5vTGXGYoMn$5t zkD-wv0^}})2dYW#4Y@(zpiz&y&&~bCTJu74kFcVHW~HDg^+c3jI|r@|x%NbrSj)vU zkV|1s!L*hb<^)pF%OXH+CZn|?Ie;doMQbl;{TB0O8`Z6t8)y@)UuEu-(b5~{{vk#A z*lXcfOG)-YS8~b7Z7^pAs{80q)H07qR=rsqWYs{ITYTPsbm?&EH4W&bf!runB zBQDywK=hWVvss5}Ep5y*dx~Z+0IErJd?D%!T>+&t_oLg=KR-~9 z@+gg-1sZ?W1b3ZiE0MpA{M}$d9ik5BQOlAVWY&_Y2sE;r z`z2{+W|G%547MYY)(}Xx+gmT^)RQV zs{3XltV+)qu`~`!Z+fA3_nY;+Y77bkWEPe|++K4_o0cXdN@{LyQ?5R18I}ZG7S{J8 zG`KbifO>@hGFz9RT5_{KbFdS{nM1H3WDd82P^?wxgOXu!9kCcEcelj#`kT9&)V^j! z`AVaQViMK=1GSViCseAjja(tKw^uH35m3GBsJV^#Pee;E42D&Y)&kX`Zu`a19l}~d zEd+OJ70@%H%rU@qXKTaQ+6~$_Yb$J7b`z)u{iQGEB6fsTpEJPbP&?5^{z54AHeb`y zE6Pw5a>0mvi$ZQ*0MHi3tDiMcU#Q|J^;?2kGPXu(uMt4GYXX&IEx}fR`!h1oWOJ8_ zS~c1@rJ?|i>NNB1J>}{Wz1$0pI=tSG=^+=|oPw!_|4a1R9%kM6o4~CwyKR-5%z54^ z8fwmGP7<^<1KU{96&gj%E=fy$BSUUa44@-%fo3KIYQfoaB`LU-<~wIv%K(l{1@oOV z<$9a%oGCKFHVBPpYvE#os}v8Yaw4GjY%OszaJiEM&1GxP*jhNw#spCymyc~UWgA=B z#v=2-hT7N5{I8+t^Gu)=Q&Ad7AKX5o8T6*Nbs_RA}@V2yVp_aP^LX%hMicU0a~g?7!|e&@U;c zp|n9+SXGLsGtm`VHHauyMzs5~40L^|5tk?v(RS({qQ(*WMrf{!FSmnz)fd6OTA#q} zssL1nF((X59j;YYnY*a9$Lp>|PhK8?`rdJEQOcaKs9aC(Q~KqDM%cbU8}^|-xj$Al z9;^eBFG?sU-&9c~_xmVH&bg3oJX%|`8>LZLnxq{{YZ6830=fKiQTo!{ld3gmI*!(U zG6y6t3k~mkuxfdEpb=GwLO^aIqjK|+C`~sCsAUq!m1k65_6((t`3F#KIn2CJGzGY8 zVo<{Gcp7#2JWgiH0m-kEHwB1YioU& zaat0sGylkH=^n02hVm+XX=xX(Hs@2fXIkhk?g2D6I?%a0uz5vDaLLyJ9pRiw#w*In z(z{)to1!bwilji{w!ss7g+qN65(72=0J*R4fzFvTU%kpvL@5}bGk-?uNRHb`^Ph-n z%;awD=4;5MX0Mff3%N?)Q2K(q)V7n*_jeqW&L0j=?uXMh?nVO|!=9{M1+gwa(QA&( zDYiRsC~A&IG-(L9wOk3x6A#+jRPI>1`#~;)x%*g4qnQ6h6a`!dw~%O5AC&Iz2Q;0i zC}UVgB7b^Lb@pzllc;$$_dQd%&Th!7TuN>i(E!G#`b0B{{+ff{T}AYgs6Q=DM6{EZ z)+hIk+;pOXEWJXm7t!aE=#6gUfeQ0_Po%{4-c15@pWN4@;GPlr(T7$rG7Rhqxrx(o zm9@;hOgdUci89>+caRn=;ySh(qiq25Oi`W>P3I}ZlVZ4zXRJAOY1BOMB2Y-~{YG-u zc4ao*T^MpJi7N06Amu&G9{G-wUdLj3SOC$h&bZzwA0Zd(2T&EFv<__EO|B&^ePaFv z)i&bLCqq?1&5xR+zOO`Eh$6Q@>1lG^zksV;2DM~n9C~*KrD4wk)p-RpkvohR%%O$2 z8rf~0!BR^%nKxf6ig5tf)}b(J=~oIU9#4u6y#?2#5i~OV2`&?Na^K>jG=}-dN!v)5 z8?8ko+Dt!PRumdz%^i8Faf!O=kE0g(l986y9}6xrQ4#a+tCk++2~}SDWcMd1Jwnu& ztAd)0_X9FPE)~6G2s7f=Z7AJe49M9IG>N5?S$dV+r%kYa&PJeQn}Ko?g(K=tjR{1t zn4`8NMZ1|2pq2tWgOX>1v^Nrt#hCXZ+SCKwgH(_kv>9`zMgwqvF*;T+4sLIHpd$ld z!9*{hQ0Y*5k@5Z&(Ke!^JQui^7aGGj=8cHt9yGmXUy#Rl`3WN@x5;Ez`MXSjW;+D1F^`X$)PtM@}^s z9f7Vq8?Kx@Gq33GB5-YYf_s(%sPq)nQhNuuRfkYtllb7$ael;RZmddgD$KQVD03H$ zw!3y9bTjdaVsJ&Vst8KuooA}?mb2_ePuP5g*EYQ?N+%3l8 z{^L_l$mL@kif5i~RSU|NN9pbLXl)*2#8vua$`mO5&i)HW56i=KUDOe%?{Nk6%Sz6? zS@Tgkj!|IND%89;03)-Xb1+#6lvZYh>%kL(*D+CF1)iQqC3lEuFaH_1LDZlI`k)ri z$R2Z55Sjb<2Ko4WMsA)_S6_++u6;G&wRtkk~xJY{;q|8<{nWz;(|Esr9!Ip;uAQ$O2&|;$NU&);U$`T5?z1gSrkAo}2|J1Mcg+@Ss zpoQ0g9-fEB@smI|P6G`ix^@IyOpa>EE8ubuM}4U{GBJ72$^OA8%|%p19E3hynFwuU`UF&dDdciq1UF^`xTCZx{upqP;-bD!N5M4>1+LFFaD^&@3-bxw zk1F8$d;u3gE)Ti>FUL>rPMWWbH;+3%le`R zLuoE@YuQE^as$cPST~Qkq6POUa{s;h%O-^+@NR23;~S{tAUm` zhHmRNXyal;lupbB?$8~`T@M59)edk;?m?sVRB$)LLGH~ia2Z}huIGGkNy9=e`%Z9v z8z5J$CAi*EAUAg}xGMW0ceFdW?#scwsShp<`{jNoa0PfTXRPJm-fxHQ0N&$OZ4J1m zO(2&!Gi-Ts6Wp;B;6h&n_pKbb!$uB?IFLi$D;`bHM^b07Be&Q8$X z5Dk`w`U-TH*LI58elGKG*wD}owH@tt&I9iB18`f?fs1$z+#l?}pN!~zx1!zhyw|kH zMsTHCK{q4UNK3e;Id=|nDTYDLVNR|}ZZYM)4u#z7AJ9Fz8eEq+u(>ufT}7_6QgWqr zHZSDTJ%a8Ct{Lufec%-pa)0cDT$%f5ch#TZCVvOlZWXw=FTr)33vMIl))mgJ9YxW` zl^2lPo(x>XbKv^WpR;hD*I$7)t~7vL9=1E4?G9nK8pmw)xC`1?9s{+!j|lGPZqzp- zJGlCH!Ii2EE&{XoS;oX+uOU~I|9B?(2(At5E6DoZQgxGOqIx#dmK#sl7id$18WCnT)u z#p_+o>#fT;l#Q{jN?GXke-Hc8CINTxFL1NirwQ3Fz5jsRQO>u`wZWy~J|!jlbR~6L zF&-ReJQ!aOx*@ol+d{dR(_l-;1dzMU*i@H()tr9Shkdn$ebs^aqvTrDmnRqMi+CU0 zwf5jzM?s%%x&Rb<1mya1_jJ8KxF(d_HXPg+?l8)8hcPxX+8EAxv^gcXP0WoKcB9== zT~J@zGvEgKgIgR7y8XG^j!xgG$TdwO?)P6MLoFRS2M=)$zMxO0zJWHb&^HF10e34u z+D-BV+^M~&xo|gdjXFT?E&J3z5xBaiA=jllxK%MxOGU<}#q7Te10Xktc|Unba2>Xy zzI+|QEr^QxLUFy@|2yOw@g!l(NN_U;LN@_-l~6tD}oTcNKGT-ooH=GRD5%`9Fc92`jQ-klE`!%bhzSG}O zU$(^He$bz*H3m1H@j3M}T<@ZK&}~8PF1gz5moe;@b3;(yJkH;#Tu-*-dh#1%*eK4o zON>ovcpdXN9uCK2IOT3Kh9%}4?9Ms3oH1-6W7wpsurKsiT-#a3wKI%s%_(<-CnC-s z^h;O9x-yJ)^BC)9GhV%8yo#9-?N(#F^5t3cD#oj@1t3>}@#+)fRa?fZp^R5C7&q23 zUJc{;PGP({&3M(Def1an>J8)74$ilgj7^ak50Wu9&0uUA#rSfE@#PHXZxzO-&x}o# z7@IOucL;UYFh(?Ij5x>`(U&nIBir~&n;p(+U(V?fj1dPJBfc<3EMbgzz8T{i&<4Jd zHyXyH(SC4+4nl5APjD^RFE`mQaaTcZN+Za1WS?H-xZUW9HonJ(Mz8Ha!8<@V2iHyG zxo&F6Gld}sAUB_93NdAXlU>xQy{(RcY2YnDx!2 z?q%vGAy=E65BK7Io1l$VcTjWSWN;+{!ByfOr^`cdo2EnV6wf?zMndVQn?PkJLT(-R z@z(>vm1&M^8yXfGS-GaUOWzp7eSCEK+V&FA?Z7?G;1{Un{v5OsxB=YZmf(8&LbuXJ za4XoS_t>XdydW2D9pr{{ulwL3xVOvEMw_Twi*{6*sfNPWjy7Q?!Cnvbh_aOJ-4eC3+0Nk}QkPFWBeaV*KN{5F=Z_dlIoR=@y z2PL_;y2jWU_9@!vz_Wr9C%`pezieW^q`i*T291MUS?*2ieE=7QXJ2*ZgFC^!M(p$8 zl9TIt4%`v;%S`smMQ>d1n)Q$i#x?&H%2i|B*ul8b)epM+lEC_wJkyGP3-z^Z2)SFq zAvdWlxD}i;SJH#a$bDXK=JS%w=T&K6O2&{6lDa9Vd*uV#D6#}?WJreVSbP@TZRX1+?7vgo!=|4Nxuzdc-wf6lqbBMb z{R487I3Ax_-zNI$Q2J?8?ya_uhHm@wXyX9S!veVmdCxV-##Cr`!zJiOObsr=WpE|V zp}tu|!JV%Ixl-OJeNziua|hfx?gKJ$kC>n5-gDV6gR?+41J|(&x!)?wF^};8HP_&t zxamo72YCMSobxCc<3T-gOE|aM(;_L;)N^v#QC;}^DU}BY-yMja>1*C>%(>DjDp}!FkbZ@4DJWd zBl=S}kh+_B9X@R1U47`b42E{wBm`IF6#6A4*U$a9eqPWRayPjTs70TwNuNBzGdC~0 zp6mhLjj_<~&vxL(^8ff&(kJ&GK*e^ZKqK%V7U`ra#nfX7#g{JP^li*VGd}y8zYPrk$vU6URA~%O^ z^y6ObJ@;z062s=if1!;kb-^9uoZiHCQ}bLZA=~K6HqxJhRbvLBz7Lzg9cc~j0M|KX zxXwAoGxJybAa^Y$Y;g{Q8_zRV_hqfQFMFR2^}XXcdfO)8mU551 zioWrfzA=3z+KAc+w#4K=w{6FQ>vb4%SGX?T#I-=^Nst@e8ts1K+3>el&@IZ?RGNFl zz1$-n2m{?qJ5XP)N6>9M16*pJ6*Th$mvSHEW_JS@iTnMUQ^8FOk2avJZeJjD!D}*quUIk#1{sOkNCO48?=HRe7 z>}JTFW^5nI*dB%Zg(ciCcyXPWlIz5M5m4Wx-KcK{$M-eYdKu{(L+Bfmxc+;>_20Sy zsBbXmLaVzNqxDnJ#_qS^(r~Rj`UbeW<003BZJcBqPq}xg%5~VccxdR1MYr2 z)O?z`rw?<_R-Si$dko#I!1|i9zKDI%#&>crf`L1<3H8lpKX+h1H`ooUe7ZpH z0{cD{=T_t1sINy{Xtd4>E)wVdK*~*_oX;P){~$f(LU0}1iT!t#*LIlKF|rm~d(3$> zmvhUD=lt8q#U^)_TxN2MD!}GHKjM1(FrTktKJU-Is>r@-PA(_8(w$LXzohV`(yQ{nC>5&7*x`xYjGeKFG8O^(|p+O3bxmZLVWW6h|9(U!vV!`M?c$1a3Un5wClL zE6w>4kMko5$2=*=JQ(N9P0pEEoHMC7XPhu-Hv#8N4$hhNoHM?hGjTX)QgaX6a0%>t zI}r7Ca$O;uunUFg1?MeivIKGS=HKi z;AXMi_H1{^ZRlQO&YR11T{N~kf$fH6jGe%C*Rb8WZ1*_Z-Mj^D3}f85-yGwcmuJJ7 znY+U>ch_Q$FV0+X%L}?&*WucZM+5hIKe$~7(QYQji0xee1#@fgbekr($zzU9zH`atM@T@PDMwg8tk0p!A+1osE$ zR%yF0qzIa&lPgQmZbL}x8@DxhAjYB zi*v@Gb7la?s4vH87}wdoxX!LZt{Azy^ zT-%-lxQ@rn$#r{!3!RyA+~?)v{^%_CMmNGyP{5 zz}=z0gymeg$vnMCj`4&9`$`Oxo=GLGl# z0o^>Dzr8tsE2l*pudYBYH)F&K#)u*-U~>RtaU;g7u8dco8QTjoHl5|1&dalc`t0Y8 z6VPrk#;XJ?z-8n8O%30JYsh#tGYqU6!+gG#`8*-lD*L!rxxjru-2~7Lq}+;EXye#( zl%}2oZuB*9cgKPY{t#U8>EO;X_bg=YiNOCQTQK+3X70(d3A%oLF&-V6dwjY6yTLJk z!`u^{bKwbdPd(TW&D-WMb|a#@zE4$G0$Z&uZqL zGaSq19Lu=$@#^&P`1Hwq^vPS~;&We{EIaIrd>8gzV?VEAKgVQ0cVs^|VL#_(KZj$V zK4hPMVV@>opT1?EHfNtMi3?lC9D^-0N`ia*8r)-EM{-`rQ_i;`S0NXV<1v-v5uM|a zlH*afE7~{}17o>`?fSk!ePI(r?*3_T4>^{(IhNx&mRC5IWjK~wIF?sAmK!*hV;LiU zGDalh_%`79*5O&{ea<((60k29`>Ns#T+w>Yx5}{~mzn3M{dv77sQZZXGS4_%Z#B-# zshpR2xE2l1wdne~Xd{IWEQoj+sOc!wSCxLXg4cH9IOI|ffLtNQ;^xfzFK$7u5ZAjA z7@z%^_X~2a_Tjo@9?#9fFGL$7iooVm&%u=}3a;e~aAA0Mc%Ob>f%U!TT3{gOM=i?5 zI|`fo^hJI1xzAh5ecqc=Xg4MIm(6*$)F&QlDM-1V^wYGAb+H-i(r~}pg!T2K?q=%x zlFLIbIrj_mxNZu?d{mEppN?k*ITqvEI&v*_Xgs(Ht#EDMxfVS_xp>T59l4g8$+gsJ z_UTggX&&aS?#x@oxvpExb=}v~=(TKqu;pfK*mCd)xRv~W;mjd$)4xHtGxyHZJ41Ip z&&?`u&6kfzRic{dc`Cs`If7o&_DM|yGS5Gmoj$pgb*!TTt z-@7hoBSCu9*W((v^50Q&idEo3aC~EMd^^#W-L$14{WKT-Gz{Z?bH@9R1<-B^p5IU6 zxm24IXmHKiF|itB;s^(AG+vAP7SP8x)5nuDCf?%uAoO+gL4B?T z4so3mp8LyoJh$l2y;`x?&>cG;?Y^d8<)aUkAUB1+_Js3t*FEUIWgI%rIFuw8uI(e` z{`3R)APFq+JdNR~EiuLX0{YZuF{X@@S zRdmjeQXjz$V0|BJpuV<0VBd7wT$pWi=HAcy735N{MSZ&&$3uJpcY7J+8uKhDE6;+$ z7eu@HIX|*94*AoEs?txF(@($h+UoGy?gdAEcQ&KluDp);ypBZeAa|4F8_EaV-SyBt z$MtilXsLi?={7pc1&jJafBBZVtKk+`EJbfbOKG&^^t4=nD2#+lw5OF;hL+)7K~9U=A&_|z=duMTZ+-IE=ED==7F#;XCiPpYl2%t zABxX)(+9@7N|_*+=qB0-U>}^}{;eJJTLI>`NmtO?lhM#!&U@c}4g;5y{|Dr_3@%|R zw42}(xLf3Il50V(Ik_(9(C*Qp(2dRiCdN4^{lfKW&Hj+<`T(Vyc^;PhIJhB{Tf}wj z?ZMEU%6-KLuJv|g!F9B_4Y_3}P+!P_;0m){KejvhB;?*xt|;4B$Tkvk?UQo>>Knm$ ze~$4!egoJtDHv*=$2j?!xpsbK$kqCc`i5r(SN0CLOTEE8kBj;aQf@fqqHw*Ng6rKm z)ZIwkfrU_?|1-2vkojW_^G9j+-*WCvojTC%<^@|)v+pl6e-z;QU^LeUnX5r}*;llC zh_UV?W8E^|o0o>Rtfy{@Z_vFNxMu2_6cy z_@{)f-$m%Y?FKG&OvtU~f5MM=k6fnqklPm-a^o0d%af~{4sthmp0n!`G$M~eyGyyp z2|=HX!*;8%U59;8bp&+l^h6tz`G0MkMBv`BUzVRmyFYox)36rgF8xG(r@1~2&Hl^5 zevZicYS)AA86VUfnQ@~zU@|DC&Y zjB+q0j%G}}LHjEELig-tpyZ6Fb$PuzX&cZ2Dx{=&+^I0mxN91l<$8z!hOXS7$$W zW?Vbl2XZ;M4~?`6T$4Z0#(M6Vs`9<;&FSMg@1x!6e?oWsYH(qifNRHfSh17fS~F&U zWqj_=IrD;kRfpVJa`Pj?zBRj1UyOd>j`QrHFz;6>G81yKc)szhHMrzldpjGz-HVF) zLUL|hKY(ki$a!>`_s(QzpFX<>xiajR6)V9d<6Ou~TOu$XRG}?tX-g!|^K7&wBImR} zZSmpwHli(2I7VG)%Ng2Inzkg|3j5x+MIWpwfIhhW1YGHm;3jPaSBdSeW4kw)KZY=W zoaVg-^Vs+8Y0Hy_sIMjG>iGz;YBKk9?Uq9>-Yb+gn+L8qxpCx9lZ!bYa(iDwH#Fti zQf@Q3e!Skpyxyhc-jF-YYn#SvYtC!C(-7@8g~StHEm<`5tnU7eOu|xm4snlJnw!2{Cy; zLj#^Sy$b^$555!iRpzI0viImIk!%**jcE;6mu` zrQC7K-Dhr0Lz^=(R|GIu)QF4g$bSs=m5cx`4rAvg#_aTr*?l@eu5&b4wYm+sSUk6Q zM}Ij%f2qYB>dzc{oX?kKV11kRqUKcHU|+3_Xk*w7aFsY79eJL3FBarx9EMyRt|N|g z2A6UJ+W5+Ii^$8tjj9j1i1hK&^zpA(Ay;86X$Bv3?o2G`x;>MNr@R=cunH_kJUuf*Z~?YaizG z6Sq-cBCfd-=0$yd`2SH|?i+6>hDHnO?wW))M(2m_naAJ~(N9;=Pv_JB;?n;X??lZ3 z{NJS**FLQepuVnLUw!BLYEB8XTb1jpR$N~lp99^?^o`~GkNF&Zqih4ng{Lil(3S;5 z(MHEVU}YD_CX)c%dwo7k!W8<+P9niJf8i$ zmHnKF{hXjEY|j4zw)k@mvYBg;M$ENYm}|eRfX!W)Yaejkx$7kA+spY8jBVWI{(Sps z$Q|MyClA-18~ESJ$PG8bSoN?ht}Rj^bj!p5*YO~@D9r1a$u&)6u4(RbeNc;M6z|zr>DgD4xqfc90quTd z{7dl++ylx5P;L#++>-HpV=LvxQ*IXhuRZ-QC)au#=zrt6huFLi?e^dv;zbW|Lm5k| zGM01;kAChP0J)j$)2{5(v9zTjZAndA7SWc$v}Gx6X+>LZ(UzXHr8sSAL0g*AmNB%Y zIc-_A5o6xH6>RRzdHI6#ybSZ@KK>^XjB_Cs=R$JcH~gA8sx{})l=o<(5zijF^6a5P z8uVZJE0FulwO+xg;3C9?T$V%Ndb9;Mmg}5ZTn|m+`sF!ojzrx*xIX>FJzXuX3D0xw zJ(7F6wcOMF;Q3k?p5fKu`k*G)2jh75ADm~y+u8S{*!LsY_rCOl>Wt&<8OQhYylLh} z_5shEDy{<;k3Lk0KJ<1!#=JRw$p0p|tITEo9JjR`x1L-}z2aJGFVC+6wxQi5ytY8* zj}^?dAs#_)a}@KkJr1L{`Z#a_Ga97=V*sEZjf6;ZY{Y%En612U|oRPr!XoL$2>Hc13-Q9E?%FwcyfmuBPQ&-S`yk zcA5pb{OO@PmH+MR?hfu#OlW-h2$Xawbo&&8T#c9D_Lc(o`3<<0SE1`Q7ThZ84yW!I zuE!g2JszFcJCfJCmbP47g8II2@3NkIm+suF)jI~c)p20o9t)*u3xO-kJiV_txE`;dJEt(XCfwtE7y|AYuij*+umRt4`dwAz`l>c zzHh^rlaKKYN#5B=%@{VECP?ztuH*Dt^z-0m;D!f>T%*n4=2Na3wIx@0@$CQxn&kAaG!EJ7i#gLeV?*}o6VeeW;C9+ugF+Zc`Cl| zQYQ}DczPJ^PT@Q+G7el^UPtpW;C6C6#*78mhkcN}JK8wUnA7wGkr*~%pcQkf{Vhn<8#J?q})R!;vV80^UQqanRXdbOR4j?@H~)iNOMec- zcBiu4_H5UO?e1WGw>dw;v%bNsFEP&<-qWAMaNl^JXCp<(#oGw`+SBioFg~wl+-SnM z;TsRv`++fW9Aj7`?xzEJzR{lh>8o7BouF>>L8$L(B8V18kQf_HD^F_O#d89Q@ zHQQROZi;6b!F+;RlUjo1mHL{;gDJLO;v5On>#~nK?0nx3T~g&IWXxrS>Y{C-HScWe~p~u@U1tE+Ww8 z%JAKYy?vdDt}W6Vhkxk}`TnZfVz2VZOfP3|8mam3J@o55Dq&hz-E_U-8!vg~c4P`s z&U*Xbz3JpHR@rtJE%tHJm~S#`j8zLHZk%&91YLE}zmmH{xyQeidqueqE)rkUxg~9U zXQ^+#|J9Z-E+=x4UG%SPiAA}DtVO*}bd$3*9ZT)?W@Tv}qQV~JO0%?*i|nXcWFwd5 zJfR9%%xrZ1z?RzCV>yeY*G9RSxWY1Tr>1Lxw;z16@-EDZ_L0GT4Mg_qWAc`IQkc(#abjpQmhIx7P zIJn|HAos<5!(8pNk-=WCwa=Dzv*!h|v4fw1ab8N@If&EAIfaay}_ zcFi?19Jq=^eoHY%QO%c+b=?$bYF6ZF1glQ`|pImv>EU1ba%OlY$AOIXfQ9L&MU(M}hK%_I1X( zt@U8(%6C4_WS6^a&HQ|BCiO=|w*;$J>ou6Nh1LC7%oHV-E-ShNUatcn5j0 zjG(Trt-siwYA9T?flVgs%$S1Y0bH+s-%?{&|i`pdi zb#Az*+({qjo{Rd^>p~gbCoVTM0G5hXuUxJ+=fblA=y4l?=affZS?>&GR$qaxuAPG` zi(}mEY>aExW;*6i%J?{6U5#^Qb}QGTEVw9xz`ZdM&MUv<(3s}DSjQ+f*QaaEb*Sz) z`tCUsH&ia4>8lW~uI=4zf7?B2?y(ui?&-P}!sy$p+{(NV$eEXw^DQQ0b^=D~jV3CG zb1g_|P7HO12AcCkMW06l?Im}N+!%7!dKn|N*;?hPbSGoen3M3>5NR=PHUisP?Ckbb z-#uQX)i}o92xexou3q=&N8dk+fsrY}kvUSx*NNixM%hLv_0*be!&9lOePX$_2ui5q z%YJcJMl4O|p)@N?^RQIospuAFX(^WKtdP=*EUm#(9ShGYX1z(QU%^_|6K!*mr`6II6OnZ04dOgc zH4(9-p!rU^=HK?rwf`S`_a7Biy~qE4&z|42=lAbDd-jm2nVFfHp_wTW84(c~nGq2Y zkrJ61nHd?885tRwnVA`p$IQ&k<1r#LGb1x1A|fI(GczJ1GcqFLK7}*Gy=!&Px@&#E zYu)cU-*10B)@!|IK$!XL*Z%Ac=@T5u10RteI}@K5OaHg`JhtB$JO+zmyNtmrf`zoy zuKus@@z`mMt39Eab+{`6=dDT6)9IYg7Duwdop%aesyB>-G4kI+H21| z8Eu9*c2EP2Ssc3xEXj&K`dvo!itk@^$-qABwdytaU6Lao~uP<|c^doxHqu){egy=_nH!Av>*G`J=>oV?(J{o^}G@W)* z^pz~D5``Q3_hCQ%LlkcAPnNZ!aBF`WT+fNGM_+^cvV?!XehD0J1Fz&$TcVFXc2)E{ zPaYP1^l|P63_LII_2{cM>W1i7u!1xDzx;dnZ=V;P6~$7U5Pj9m*G1pA@v%qaV%L(HUqxT%85d}UVWUs1wXy7J2HrPAY^VCf z+~_L);~efX^{x}m3pS!FqdjG}F zu4>@Vop5S2JrLW42V<$>m*^{g&dlgnb@$Qe@$nZs_Ce&G?hkarp8l`po^zvL zv;D#7XSst%_Vqv7_FD8^c%SR@fv;u!;^@~>!`-}r*|#4?)8LWvaqRoBaYt$3dBH`| z=jCpVe!owi7X5rjxH=wq-iH;@bl;9cGY2blB_f7Uq4gIg~1*Op={-j;eb$|0&!oTmn?T)1nABnc|b?gKOt}l1+{SLI_ zb+Nl|o^PTJ9ABjoYWvTorxr)w{qtFq%>#cfcZmm9#M_)x+WKeO*j3iAtoeb@{4ihX z!Tv`_O^JTzw%BVrc9FXrr%zE7lAb6-B@LPivx&*0NI=cwQIQVL=-Gyh7*z@zh1qis9*vzWNp+4S{CqDNy5chv@dwpfuAJ-Qzo5q zf49yiRrIH8lcTTXIsb@$#Nhju{$=#s^JMJNifc5&%Knet97}bv)DcUes_5q%#%^ig zUFfEz*7SdDkguSsKYh-f_YM6iYgf9~KbIXEjn96c6BoT3xP_OFA%KV$HDf0zF5d4IQxZ~HF#RXrBF^7?jk z^s5?th5qhi|L(dhVM+93FTX4Ly40scXHUh_;I-A?T}SQY_e%y|$q8Js9PfYk?KROp z$T>gy=-?Gq-MP`LqRyV^+3H$;vhx4s=yvu-Ujvym@DYFa{r4-LeYmruXssCJYPVBda{_{D0@R;6ViZ<}yowo+>g%6&8 z<=9u?Zi-$xe6(H^{?-2#%x{j)&Yc}Se(&cuJqH?dP3&IP#@Noob*EPNsQ+VMkKK76 zyyGyqn^R(E$-#Zy2VBv=(EqWguZW&Mniog^+ymUp82EF~iv51c{->kg@2@XJU&)7J zyNtoTz&}?-pZC=I=<^IOM$?4Y-KYbx=RFepd{bkeuOXHOcNDg(qjzG?}wu-IPZ!`Qxf z@GAe*1g-FD|EoKA)jPOrnasVfH~SwQybgWjt>|liZ|o~w9sA5{`AP@A-@)I{xq_Y6 zzz+KOC27dZb7=6!kV|Ur}V>_*?{OGwSz?FJq{~eM4{F!&;>V#L%`+t4~ zgP+C5z2^V--PhL5qVRJ6SO1^W|Hv!(e?Io_ujBuFUl)^b6~Eu^6lS0(gt(`!5fn5D z!$ckP;V24WLC@q_y@APE6a`f6HnEZ*N5GRBPa@!1Rs;T z+k>*YiD@glWDA zlZ%m^H{TOqmG2}b)yU72_zq0MDgKk0j6hMy@+5|C1XW0-t6>`W$gC<;#sWBL3m(Ik8{>@4Q>C<;#r})0tC<;#t>MVI zCo4}+QMd2CY#NS%A22H{j!_H;iilXo=uewS2YS?*9_M<4Q6(%$JX4v^m z4x%VLCrsgEE72r;J8UZRLnsQ*3kl4t&?Kxnd8KZl~QSx964Dw>4Kvo2@;Jc_~=A)Wba$htl23g$1M$X`k~ zo%uh}B&<8@O6LDSQP?JAF#i{tgsyQ{G5-xkp_=22qh{RIO#Vbscte=UGi%T!^o_fQ zxp4M1%s*uzL%DD10ttGqI1qo{0lRp@o%e5)E{bbQW^dYqpaMP!w*_RFeylpI~chaDiqAlePahawCAJepAg{BQ3*X+mTnge|76DSHRGzalX%^_T=IgC$f+Ie&p(n6XJ z@@k}QG)M4RO(#C5If|8=ZTYqbST1bI5m~C=`jg zK-7YoUYkToyPA(tR)UYv`i;yfk~AZuPM z!Ux6qOqQT1JR~l_GI1e3EEY3gimZ8Y5xE>$^I{2k8M5ZZQmhacGkF|Y^WqZn6Udqu z%g9e6YhGMRehNill~_)G8admF%gE0lcl*T(^0Ua9R9ueFi7S{?BI{pVNv=Z9apEd` zNnDLDi)-)|aV>5ZD|ybV$azYvBEN>5o5XeavA7;T5jQYzL{_i3k$eb6;U{quxfAJU zaWnoRZeel^Md4R*D;^iO;qT&h>=vte^be$s#Tqnecc4YPlevVVVAbv-+fWqj+TCOa zvd7f!A-hl%+}c{Q2Sp*E-HSo(K0H}l$9yP?!f1U_JpwVWRdRCTR~bxd=sJn)WazYuoV> zZ3m`kkKm=+PM(vB{8o$hC^-#9;d1RUayoL1XuB|9dz{J5NPBC$u|V5{w`hB@P}|3& zx1uO4(rWnsi%Ydyk(G(8OsyW5XpQ)g){JFZ2_M#;_*eFpY9089*2VM7ku|CHke4BA zQtQJCZ2%wF%D7ys;1gOES7_t#DeVwkr5(ygJ&mkG?QncXd*WYu+M*rF{553dXh-38 z?Pz>mI|i$@WAP2`IG$63+#S)5C+|Q}cuN~k-ie~{wssS4!6C7Ne+Jf?8b} z>U2v{uPaA`ZW$VN6=>2eN3(7PT68N>(ycmRoym>=(b~=t{P9$)$sfwNE_&O z;85L89H!fa!*#py6x|*ip{wPYry^%n-CjIRw+~0@>hN@3J&%q?&aJuz9HVQ*Gj&bO z$0FxeT{C$ca&FbN;CNjtlXH-+(6x~#AYGx`kLT(RFqwp$XLSd0vhEO*^HCJ0=nj*o zBD+LgJ6@pcV3LTUaG~x9ISEDKB3&nW8nR>59VI6toufNOPC+_H*F{c6I!AY$oQ8Cc zuA7{W{9cZ(2dC?L@k(7EX6Q6p&hm+g(a`xBR z$l1tMu+BlwLH4CO7v}0bc%#n8JP)~&)dk4;$bMBP<1C$mvvn#K=;C2Brem9!pC%@u|hY7=Rb~gmu@W9=*Hovy7A1LkiDEPp4^P= z<#ZFVMK=k*&`rix-4y&%mw;`$MEpvZg!^^V@M~Q%9?+%WH@Z|js7u3db?JCWHyyvz zW#D1m4E$a<6Weu}_=7GBJ9OFjqb>)J=yLHVT^@Go^6_WgEc{hhfL*#m{7p9pkL%{* z@49)|tt-Mmbn~%Cw*ddtEyP}3G5)1ngnhaa6!fL2(Jw|(zXY}VGSumpqF!H)2K_QL z>MPKsUye5Y3bgB2@+vuyGp~LX*@Yal`qk*suVLavQSj;4lKsfJSYJsFqA1AvDsl)p zX7%gHVdR+AuO~;4V^+U`d=hf?q~AzB8QI0@H{qT7%}nMaI~n~Jd_lhz|DoT8>-F1t z^hIQEqpv2vgj}=hYsfDn*XjBlqptNl2p_;>pvHMm0<%CnJq&m_$xN8r3kFoQgE6VG217X;ec3IUQ+K zLn3)P(x`?cat6|HPF^V9@40W8RUGVQ4KS3mLZeLY@|^QS>#)gMm1!UZ$+-B3_0Z6kn1T!F8Oxk zddiSTz5_WD4f*6dk?SeLEWFE5z+?e(J!L2)FGNu&Hq60AhPim3VIGzkitv8Jd@MCA zzy}Nqaj~HoA2ck&C594w$WV%9hQ;`>VF@lZl;I*#vctWc*M}kbACdOP(vH}XJj{M z*iZfi*$o;F;ID>**kw4x{5RwbVmOSy8``nk(1Cv#j__y?azqrzk&6&PG3rq@8ZlxtW1LaKlZ-YTVsz-~ zd1OCkbdgU%_G3m5`BY>-X7u41#sHpYl<@+i!lQ}Ek!w`(B4Zp*GY(;XF>>W)9Ez71 zhhvIy1YT+!$)l;rF>4$}PDAcO7)Rqx#xa<09E-)qaXfl2vSN+nvBDV7SWS17qT`?#bgh%LQIRuK4i~qD#59yQYHz=J8N2u7n+tZNkZOPQyES(EoE{s za%ag@j@O%(;SHt=yu-8{i%cu<9@9#mS&ZDtF|ES;OslcPvw{Dq<>76fqCZ8eiyQz`vO_TK zCx3(NX-x;n-y-{1(?R^+bcjhi(o3ep_@k*EdrckKXF9^8g82wpW9}r2NMo3fl8wk( zG9N>$xeIOP<7hW`qr=?8bDYSo(%g$)a~~5QvY#|-3|s@6wHPw%Q8610>?DzfF`F@B zKJhQC$C+(-lG(wdLy)UKvx__w*+rN=INa=GathKm<^Y~*mT{z6!PCqtkB&li5#~6& z&^&}m60#c2L-Atsa3;yfb&Yuh=9xz_xd~|!^Cz~-6c zUC18ToJrn|?19Z$xW}B$%sJ%uk@alO#ShJSSZB^>{tG|wV`iJS+`1^AV@ z5WhCh!2{;GJo*iCwldGdKg>l;dXV*FnNPMO>&LQy>_qM=SQe7q$Xc=#lfB5f$+C#- zM^==jgd9Z9R+dr>Sr#)U*e^PJ026w)l!zVmXQ>mScFor3*_f$MFG6H!imH;DeT4Tw>|tqaH$bo)(RfU7tm3 z>K$A3*N6p9?UmAsy zG#aha80I$QEH8~kmo$!v8@XR6jVA|?u9o64EKNjJnuHN)GR8?$c+N@4(Ih31Pe$&} zNr^a2O2XmNH0Gxu$C{K(J{39Eq!jXL$lW<9m3%sK^hs&tGmxWCN++L*9DUMs@>$4z zdntn)k6Z&vGsqK>qfDBKQ>08LQ;}mz%EBZm8!wV_aGI3MqZcDbkd#Nh1UYJ?e7szm zh3QfOULh6YbZHJ=Db2+UX&zoB72ynNK3**?z?srQyhbXDi~m6qX+QU&Ho%kd^@1?EdD@n&fi&XQK+Y-tS^NNe#HsS*pND!f%% zhjXO$c$>5V=Smy#c4-sNlQ!cW(iSX|w&I=AHk>bQ$GfCzTp-op-O>)cN7{+^O1p58 zv>We}_F#!ri}y==u~gcJi={ezP^!lzQUg9DHDa06gbz#2xKwJvN2FFPm)h`AX+J(D z9l$50gS`GLk*hiB5I!v(X0jUDn@R2DHOLN4>L9O0c4*QOawT#$lsd^($k|XjN?wPY z4W(naUg~1@S3DCX@srFy(URZ z-iF+3lJw;5$Q>uiNUlciI7w!54RX$vB=QdAoGaPLJCSp)9=EtVQnR zSVyA4Itq=}(P*-c;ZZZv57x0{3F!yxII<1d*ICD-!y1oH>qK-}C!yOq89ml1JkyJu zm#qotw=OmawMbDb{p6)jFN|NM!$J%^;6L z_HWi1INCas$r(sLSTpfVYZjBS$d!mSn>-G=dvDFb@zz{C$C`)n)_j~`orM#v1$eHt zkmpZAu1T$PaI$qSlk<@#vChM()*>be$aRf%J|Gf(YhEnS(o4|)-v2|U5c+-%kiJqWjucy@{=`d1=d-YW4(0+^N*410_#fh zXUKJdbrpVYU5zc)HF(&%mPfxw)`_)}{3EhjtX1TnkaLH19r&Na3gvK86m z*>;fa$Xc@PBs-C{WZOk{BUcKx-RQIJVd6*5EVf$m$;b+^?ZpwceR!&^j`>Jro!IJe zw5A_ahz@IW>SE3xUGj= zh;+EEmpljQYFi(<23w&D0M z+X&ol8_A=uBkR^Siu?w0SHw0NciYA=c^7Fp+gS2@NXyyAk>5w|li0>%oh_cpN61de zHj&(b?38Siu+cV|$*0IsV4Fhz3^@vH3FOa_qrjF({sOrYu_ckeM6N_^)5u>TSI4$w z^4G`}u`LA;*;4VCEe*SD>G+#%I?p+d92d3>ayN2x*k+J>kb7&kndDyNNU>#-`;a5W zo<-Im$BR9itVNC&dk$HTbgw;^Y()Cjo`;e>AHDWj=(iW}XaL!F*$c@s(wz1=WChuY z+2`U(_IXT(AlJqAA{=U;kE87i@J#zc9vzFUe|s^WZC}J>Jkp2u5{$Q(;spC*<`a=) z!M=n%2{|I{W#q}o5n*3So`UqDy_}qY92fRwCC;#~ z!kPBfc#VAxX4=>C%xjUIlD!hIvsYoZeH~tJUynKV4S0inBj(yS;m!8VeAF!DXtHl1 z7a&KIeJi;TIhyR-aGrfTlRJ=|kG&e_+iUPH`wm=S--*TcU07n@%`@*ujvf0Re866d z58C(Q68k=U$X>^D%8=`Edp%a#8}NC1Bl9X`2V!r+9rk7>Zz1P;dkc9Na(!)Y#ohKc zChsCggnd8xJ>&|)egOB`4>I`>xfZY=A~z#FZ$FG**xRwy-hp4*k6@dBc1HfSUA5sv=;98A?J689z6~t z6ED)t4l~)0Tq8Rq9OJMtITP8XI~?S*kiK=e@N9<%r#gIifg`}9iAa|^WO5R+W*iE6 z8nR{_DmfXswspjjQ;=(0#}INVvNLxK#p#aWc%@?m^9*F2I7X6lkp^~*!kZkUG2bzU z`OQcVJI0b{BWuPn4(B??Gr1jEGmdyHa!h1$C$eT7lkhIbWL)5wf_FO-aG@iS=iGy= zB1aPWUS!Ygn1=T`lCi{b;$J7dA6Zw9RPqDJ&e@Sheh^t*j&$-vNIyHKlOINQxsD8c z-Z2BK95e9+M<$Q1L-x0hEb@A!y&c))4ak1dk%R9!PW;Qiwa8VfBagfnS!0fT+~=5u zA36%K&QXXTIp$!!V=jK|n1>CHBK*WL9~&JD@KeV^Y;qLy**-(M*RhEFInuq368yqZ zimi^t%)dm|r(+3z~;33CK{LZlo4?9-l_l`B# z?pTXII4ZHjQH4J`*5MJydi=?;0XrQV@n^>-{`8~B)v;qU`51C^IJRJyV=MmV*oMa) z+wpftHFi5{c;+9-&)*$8@K481>~-v7{ugpb)Ug`{=N{BJYf*IWMXhrm>YR0`ch;l9 z*?>l8BbuB|Xm&QE#o2ea=q4 z9zU|Xb{@r`^BBs`E(|%3<3wjSPIC6(dCp#*KN;z8XCF>+YWR0Rr#ksHGT}m}9+R9# zobEJB+z~>$*C}C+(}p)V9hmEM;f+oY<~e z=p2r>I!E9f=SaNGISS`GN8|0zF*wgT7VmJ5!y@N+ywe$v^PLm%F6Sg%;GB$iJE!16 zX9C{iOvIO*Nx0ED4c~GmcQE<&+qCr-LYc6VC^HAq1LcMD~ z8e9v|#i_q#S;bU#cN^q5u9mq;>Ek>7X2@^N65?p2IbuC4otDLzXSqZLX zUU zG2K;-SGa0;=5%C5xpv@e*G^pK+Qs}arS9jt2)`3dBw!>(HLlgLkbTzkn+ zAwSo1?Zc;Cbxc+xKi6~B}$ zk*gCwb{*w84M+pKj*%OY26lCkn~+uQI!L+#VF&J|f-Mdj!hvkxW9!&yw7u$YJDOrF%3vg50ZgkHJ&iWAQBaIOgM!{fT=#j(5jnyn7<^ z3CP-ZPr`HElW~%J3ZCaqz{&1Jo^w9ZrS2s1ROC*hdm8xyWUuQ^#%tUunCVW%EO#2- z>Q2XE_jI0lFS1W?XW;$r8TgQUCi61n?wLCiA8}_fDM#*`xwFa3kh^E@9ISBX;^Xc- zT<*@tC)~4eg}VTsbQkjcmB>||dk#MBo{P`8=P_S{+*NZIVXb>UllPHpG4}%8=U#|) z?qdANy@*Hakrn7JAvYl_&|Qkn?#0;RUc&qfq-ot{NbW|i@7$ZnJ;<5Yvl)G!E$H`b#eioU20hzR z_EhuC5VGDpHRLd|T0A?*laSTo*-4&^^r2@Lc?!~Xp55dtkaMnQ4`z63nOude9M4|z z)yP@cvyYsEoP|Agc%!Et^E?fBlcy2$JxzGCrx|B?T5z_f6$?CVeC#dA`PZ|bd@Is^ zo&&hvbCAi4$bC`IA$-Ym7+?0ZGv9<<`+GXbn~^(Io+IQf$Q@BnCwVJ!&&qQYw|S1? zzdT*I-E$mY_jF^mr-x_0fvg-)FMj6f!)6cvJB{!;vT{6H@)yX;@#yiW$B4gp%=oKE z!Y+>ufAcu-xW|RRdpy|f@!=ny0QPuf?DZ)4mq+Du_95qGZybu=A*l5ZMV)sz>b)b- z=pBhB??v^)|d@Ax&5^oy$G~}lw-gNTm z$ThxqI{6IbjO@)IpNU+5d1sK%Lax8OGx2P1CXV-J;W^%HjQ8f?1aB@*^ycBY-h7RrM-71;@R%gAZSPQbeq)4kH#I?A^tq_aax6-reN;kSj{>9`gOj6{WY9`~Y%A>D^0y5V@lC z?jt{h>|4BbxZPWiuX`J?+S`b4c$=`s+srfHM0P3O7V=xjF2&nQejEAySZ^Eo9pv7H zcR%@Eyn zUxvKD`g)mUA@8rRkDQIXzdjBBdRz|j{`$0->(k?n zJ|puyyyZ{koVVTBNrg=ug`&nJ{OZ)k!u#8hkP4y&EoTsZ%3|Kd;#(u z$Tf>kCf|v?zdnV07jn(wQ^|KD@2@Y8d=K*e`i9`WzM)JOAv*!zaB>NHdXG zu0(pqUrfFVIT!mE;Y@!C-rz4~o{Ov&|6+0hvReF0@K%2r&h;{#AIte>Kl3Mc#M+8uDV~efO`$CH_i$$X~_040-qc z>u{-mJ(EX}pRxKkkRL^^oBSKek0Eg}@QA9=T=- zbdrt8o*{6QY(~zofnyjS=)wts<9KeM8!rp=U|OITFAwx#dO+h~)djQ;u5*#D3+Txi z$k{DmB+o!vE?_2SAuSh>$k|BC1#ILTWW5ErUn|^>bWy;C3j-b|_aJL5;3MCQoIwHs z@_ook3&`aAk=_U>eFpY6@B;(;g3iI!g)fGs^9|CDiI*_Y|Ksp`?Ovj%B z8Q2+^fjBv4UIFEb=(pSME@|j3$1?Q8`LRu@hfP6O6TET_nbC4AkEGADtS}VASd@iz2 z3zm@2L-uLGQu6u8J}tPIJQdle1(%R7K=x_DGV+DUJ}tPEd=c`~>R>tfV&q<t-es zR&1~WuMI9|l7+0m;0nwRuEd<+D&{vJXV~CsyfL^2^MY&freG!J2dnVr;5wWYT#vJZ z8?Yd_5pM}@!ouKYyfwH5=LEOnZNY7P=DA3V2Djt9U^SCFkTYzs2JZ~+!1=+Q%bi=5Gd4dlJZ9hG1s zxdpkS5^TaRgUw9Zkj4wPkoO~v7i`4?!8Rt}AiWpdkKYClFgb+WR|y^@A4aZcgNMlN z$jS^JCU+ofFW6501?i<=2WsUbOmxWAirk3?`6!y?V`!GU&>|m4N$%#ER^)0z?!hzU zUOY$c!vtBw-^zc1ti?oGj~B{DOp?ubku2df*@hR(4osF^c!})66xoND$^lH3WxPyQ zFilqRaybsu5JQSzP!|_Ua1ZK!1@hW)~&X7mr)$$meDUZc#4}c+8R~ z;&t*Q%$6tP_3{+VkrVI+IT3T^B)n0chIw)_-Xy1BzMP6T%V{`EPRH5ubS#iF@D_On z7Rod6Ryh;r$XR%soQ-qk9K2o5#d&fb-XZ5>kvt3UlnZdaT!?qcb8vw?7w?wm;X=6x z?~&(YvAh89l^5b7xft)07h#E9g7?d%SSl~Z2jnHVST4f{<)yepF2{%DWmqOx;KTBA zTq>`?N92`QF0aBz<<+=MUW1RxYq3JE#K+|-TrRJ}C*<|GLf(K+${TT|ya}I@H{&XK z3qCDx#ntjQd`8}mYvgKtR<6Od@(z4X-iej+E_`0zjaBjPhrAEh%XRpo zT#p;%27F0w#Eo(jzAQK6Cb1T+vIlqm)wEd z*eZ|5FXeb_lPBU=@+90ZPsXq1DR@9mz;EP4JSZpO zxAHVRBq!r{ata=nQ}KH_4cp~({6U_M9dZW#D9^wn@=W|m&cseR3xAfg@u-}GzsR|G zOwPk!<$UatXW?&h0UnnN@ppL+cFS||4|yK;$VK?4JRf`I1^Ab|5c}j}6hezo6DmP5 zREpZrV$_9}pgvTFhR{+phRV?tT88FO1qMUQF%(+i;-?tMeU;EkvWnbS39TZ>A@@~6 ztI0!Llen6k(LfkBJV<4Iy9NQ8)@m#6!IRVr9%ni zTBM~ziR8UVONWxk`;e9nO(WMKEgecG*CQ<*N+CBOEgecFHzF+^N+UNREgecHHzO?_ znoe#(S~`?LZbe!;G=toRv~*}Dc|X$9p-l1tq@_bya|0`?ALy`Vh){=)K{jXG#Mkp5R1$TN`sR~pGPk^Wbj$eBq0E6wCAr2mx`ayHWcN-H@B z>3^k-oQw3ovY(uX^uKa|oR9Rsa*#X=>3`)Axd7>Z3^l2JO}B2rGq>d>3`)2 zc^=aLN+-Dp>3`)Yc|Owr$}#c+r2myJ@3@a4?oC*N^uMAdmm&SH=*dfw{#T6Ta-{ziGkF=(|B6JeK>A;?k(VR=uQ3>BguSNP_QOK1@|0^oF3h93(j=T=(e`N@H zJ<|WmQ1S+(|CQn7jmZ978G)}WBe7Z;g>NXMu|^q#Zz^MPhcXV|QpV#>B_7{aCgLt- z627BM#@)&kd{;@pJxU_JrzBymG7aBXl5ww+f*&ZUxKByL50!MRQ>NobN(R;|Gw@?& zCN?OU_=%E*jY>9ts^nmkl8c`ydDyJvJWzDvR)2r34QtrTCq)7!NB;@Oz~U+m)sGgHnzi$};>>slX%3a{NhI zft|`q{8?FrN0rt1i?RlfDQodpr4qZ8D*R1ZhsTxm_`9+JyOoXjhq4KKl+F03vITpU zt@xL+4f~YsD1@s~6RtrqyaTo2ou~`%LVb8Q8p3ekvN);wfQ0jtCp^)UX*xh9x{LY{OAu z2c8~w;pngj&kOtT{BXca$08jYmdOc7$A%ShBGR#8m7IihY&ecQ4e8kM5OOlovEiZQ z6r^Lr!^x>g$A(9c(~yo0k0hrf9UC4+o{n^Ecr-Z!>DcfX@(iS7!(+)ak&X?IBWEHV z8y-*2LOM1aPtHagLG_o5;+&?*zja>9@4SlDdc>lW5WsLSxCo*6UhZg$A**0 zg-FMSr;+C%9UD$2&qX>moI;+5bZj`4T!eINIE_3X>DX{Oc>&U~;pyasNXLdV$i+y< zhG&o$Asri@NiIP;Hk?T=MLIT|MP7__Y&e^|1nJmt4!I2J*l;d+DblgwJaReGvEh93 zGNfa}v&a=l$A$~Y%aM)^7m`;X9UGoQUWs&UcrJMr(y`%r(%}knHPX`I<>VTqrNb-8JCK$RuO#n8S~|Rn zybEdR@M`jIq@}}a$a|2M4zDHGA}t-RB=1F9I$TBGhqQEf9k~u^>F|1TJ<`(Q4de!- zrNbM^jYvy}H<6o=mJV+wHzO?_-a>9cS~|Ry+={excpJG5Y3cBG@_wYH!`0*iNK1!n z$On;@4(}izLRvb!lYAIy>F_RcJJQnO-Q*6WrNev3N062d*OEJtmJaVFA4OU^ypMbg zY3XnsxeICOa6S1r($e7uayQb_;YM-~($e83axc=-;bw9l($Z=RS%b8++Dg_UEv>eZ z^+-#r`^iS6rPTvuGt$!PL9&Fjw0ekaLt0urOm-kGt+tb0NK307WDnBP>JhRJX=$~S z96(xHJxZ35mR66E6{MxrF0zWWw0fKzhqScXO&)@@wAw=+inO%aOCFB2wAx1=fwZ*B zUx_P>MEY6fub~vqQS}(F8gYVZ#)+zg=c+cGq&o0C)rFH)51z03aEcnhsj7?#s)84& zDkiFNc%eE3lhmPjkvbfwsUz@WbtERMqwo@SG^VIy@KSXwrmExcGIczrsquKZIuX;= zNqB`i8KNLDsO~#pO3SOh8Vy2pg*Q)85rB27|)C|m4XW;ef zOw3U;@dh;ubJc9TQO&_TH5YGE^Dtk{$D7qzI7=|>mwE~OP<#?~U z0vD+(@ji7GmZ+=oesv9&s%!B9wGtPrRrsK~4wtCw@ga2smZ=-@VRaKORX5`!>J}_l zx8kGfHe9A|$H&xatWaz4adihSS9jtQ>MmTN?#3t8J-AY>#i!K0xJuoJPpfsfTCK-t z)COFmHsZ5t6RuU8@j0~xE7ewfUTwoFbw9qK9>8_#LHvh$2-mBJ@kO;AH>e%>l6nL; zs-5_R-xgKw!m+^GieZB@oys)FyRD(+U}@LhEXHmXChNgeLz|I0vj!s-a} z=g3Z29ZCKI*$Jzo$X_BmVRbb5D`Y3Ejv;@I?1a^^(pop5A2S%>U|BN=1^vJ;NX zAe)e#aAYRgg6xDNnPe-n6OLq&?Z{3zl1+9ZJK;zU*^TUkBe`TRvJ;Nvk^RU{IFe5e zB0J&8EOH3h2}cUZVPq#9DI`abop59h`6Of~9GOc#8QBR(=8=aXJK;zX`4nU)9GOo( z71;?#7LZRvnl`eKd^)ldjuey6Kz{BVSwub)`MGnXgnSnAbLU7Y`E2Cp&XL9BbC8yf zEFn)oS~^ljJ{M`}$WrooNJ~e`$>$?29a%=6inMg3f_wqe(vjul3z3$NtRP>6v~*-8 z`C_D{Bdf@lAT1qPO}-Rq>Bt)LWk^d$){-wrS~^lmz5;3KNEP`?q@^S4$X6jP9a&Gl z8fods2J$sXOGh@6uSHrqvWa{h($bO5{fV6aEEBQvGr6b$OHz6$@*-pM0 zY3WEcc{bA0ks9(XNJ~d{kZ(m=I`WLRvb~ zLVg%&=}0U25u~LfZRAIhmX7QvKZdk)0_j`WgWL0US}M}8G)=?H&KzwjE;(h)8BpGZqb^yGgbEgdnEUq@OxVkWX>Ho-Z@@Gi@M@Eo8NBTc9lKchI z|B+GTFOmL_j3$4D^nYXw`D>*ABV)q75{U4b~{sHO# z$RzTQNdHGBlYc_`KQe{t>`(!f7OlBsTnVHEX`(&R+yVDHeR61;ZKP~_E=pmtwZ)$T^_AR_E=p$Z9w)|T>))E_E=pZ zZ9(=}T@h_X-Ztnq&;s(dL03#Wkaxwp6555lE7q0L9^_rIu8j5~?}~NhbUZR$brpEA zt`d`VRd|W68dG!|@lst4rs`_(GF=^}>FV)vT?3};8u1EU6K3d|@k(6_uGh6_0absb4<6Lz7N?mbvv*|*Nczpc4Dn=7e1!jjjg&q+@$O0 z^Uou*Lbr#00htxLz4VL7tkCVFUqW^{-G1!W9l$qq2eD5#fc?5deC9*sdejZlA0hja zZU_(Q4&#@)VI0*R!7<%YKJx=|&g(|#ACV_Y-6+oL#_%`YIQm6R;IgP=eC8D7%#50( zPesnjs3{DIn#OaYX3!8di>9dKe8!C2yQAjl803tKnnxjO0qs#IFh1%eCPXcwFUs#c zo_(U0VN#SoUL3U?)1y}46;T105fzBnMFruys9?N4Dg^VQLh;t9FwBn%$Gf5;usA9b z?~c-8d6XXSk1}9IlnEb*vS4kL6(5TdurA7hO;Ijd(3fDS zz7)^ZmtmN`9HaCVsMl9ww7v?R`f7CPH=g(}ReFLWI8}TxI6Q=2# zakah$uhzHX8vQ0*uW!Q}_3fCg-;4$N4!m8z1q=0^c!z!~-lOlrQvEi(SKp0Q`W}2p zza6XfJMeLRFV^dK;uHE^*rMN!&+7ZIRo{;<>GxoVelNbP--q4${rHCd0QTq);(Pi5 z+^s)^efmNCL_dW4^@s6O{V)#dkKkAOqd24=!4dr^ey1P9QT;gnPd|Z^`eXQ$eiG;O zQ}~B|8voSKpkMSXE{#5pr$o=rgpSXlTVG z!zR4g(1yu|cD%x{88ZwWc%@+rt}=AuwT7*@*3gC58Ma}Lp&M^D^kA-GJKkZ~fklR1 zywk7~%MH8me#35jz|e;^hJJk1um@`md+{;DK77isADavZu-R}BUoZ?{yWtSNXc)w; zh9P{_a2UG`!}yxv2)<=FiaQJ=__kpb`wV0Ffngl`4HNi@;TY~WOyZ}8DLi19#zDgj zer1@&A;WR}&M=3ghI#znuz-_>6Zn(iBu*I?@n?hI`OG)NGMqE`b1)~Y=MhiNOR&*K# zOfWjoXLO-x^q^$)Vv;c)FE;ux*(l*9#zefrsA7h3C0=Pv!nMX^yv~?{>x`**y)g}M zHm2h(#tgjOxC#r6tIucaK(0IE8obMxiN(gXSYljNagH{u({8tgIF;+w`ge9KsmJB$tZwy_c4H#T9Pu^B%wwqU=p755r9;iRz*e=@e? zv~e>YH+JBhaSQ%w?8F7*R{YD@g(r;L@E>D0`k8ugscAbdGwncsQ!jrHry{$tX(xRe zvKyOr(WfKlhG{pRVd~>ZAaZV)`spC#syFSSgORt#roD6svcs76(V@s$WZF-MA#aaO z2k3BQK9~;D5y%;38la8H#5NtG&B&f(8brY~gf7!zj=PcRZ5pOyky&jzf|r?&Vw!0L zFE@>1x@iorGL2)FX@bw+fZR__$LJf8`>AP?z6qHarYXF|G>t{38NAapiyKVG@h;OG zpDaeUAk#dSm=>_YbOIkRoy1DhB0gyHi{Okh@gGcD@{q|NYfa1XG1CgHGX>z|ra-JW z1>qB>U~Djj;FG3MY&3=8Q>JiiGDYCirbuiy>F^no9$QQXeAZ;bR+9yvGg)zyNxds5nnc`xW%**|7A+TPE#_zVoJfSrc`{@l!jfV zbbQT}f!j>0@O9H_++|vWdrX=5v1u*tGp)lH@v*;ItnrVaRusTgNWCHSkU6lYCk{BQn-ob#q~{L55YtYYJi%ZRQxXfISrdbpF%DfNt=KUCLK7a=EK{T2N&}2S@X7eCg%tIJsK8#lLFxt#V zP%s}wyLkj1=23K-$IxXSN4I$bJ?3K=Yo0`}c?#pq(-?1_!36Ux`pm~sG|!=Ao=4fd zfQjZ4sF+WpYF~{fg`OM4kBC|gxnU~|m<`tN14!}#yftX?r!b{D;m}(Be%gmve zW)8!2b2wgMj=&6aB(68>@J6#9v&{y)$!xlSpL8SpnAw82nynnkM}9J57U%-xeqnat z9cC96nLT)?*^4FSc)Z8#!&0-v=kG=C9p*&5&#Yp(c_qj1N3MNy68!*j?VFS72a#*v zoI*c@{G`L2O4lG0z???cAy>LNoo+;~9dic#9oc#VKS#Dc^E&*}oQ1>Y_4u7R8%NDK__H||7tMLN#FCFoEd_Xrr4W}}itsec z23%n&#?vh&7+@*IGc09zrllOuvQ%KOr4rA!RAGpv8qcw8#868Oo@=SaFiRbtXQ{_1 zO9Mt*8qr{BLW`vtV=OJ`w6yYX;X=+s%O=``oQIY++KZfrmUcQGIS(zHX&-VPS~_S6 zIS(yc=tSf^v~#(5}DhU-Skt)#J2R&&B(;I^yBlEJsfF6=B;HfZn5mcS1tQF z-i6Fn%K>^DGFL4JvD-3$Z&(gtk7W?wv<&f??a2OMIZW?B_6N%_-HZI3$Z`aCS&rgv z%Lu-28O1)!7=B|xcGLJu77I4~f0)Mfb#5v0%{$cTpWFxikpAuZMVDZNjmgV@5Wd$x; z0?;oe5SPUS;i)mfczR3-hR1|rL`)c(V#3i96M-=?k?4%kp({p@2{8ur#h6fxvEW59 zR!oW!@ZuN;rp37M@)!?Z5#z;-n0UN0#)p|P5?&jVh}XraxGrWTULTW$IWft2b4&{6 z#-w6lOd8%1la56(8F)|3DlCmzjg>KL@WGf&d^Bb)J{GeM>teF-@tF149FvXD#N=R0 zOfEhflZP+Fby#*|@yOgZk0 zslbCVl{gqvg~Kt`I1;lF$75=6GNu-PiK)Yxn0o&Ae?`7WF%1}OZN&4eO&DcuM!mHK zE!I|yv2H@EwGD07c8s-dMz6I4)=T8hO)VJw#uFeBZ5u^tH${h;@j*4*Bj|57XBp_ZsUkor9bM)+2N-vOQXl(s{_; z$2x-f)=|98I)(+-alG9+!DkAQv&DLhEm(Lir#NyqazC<8)At}}k#z>|wa#Lh z^*G*Vox^hLJXTm2@B!-ye9(H5f2s=EKdp=Su+{HE?nKsQSY!3aC#}n|(YgYgtO59n zH4wY3LHL?A_(G--GKH)m*li8PH>_dUV-3eQtr5808i{XNb-2T-$G5Ep?6sQk9jgU* zTCMo5Rlr?V2fk-@;clx3-?w_P&l=C4_yKaRT7C3~$UbS6=#P*mAZsH1F>)qbRr(X; zsoA=c{uH@0T9fF{kn`M{On;8t8LcVw7sy*&YbyOEaurz9=&z9HYim0FHS!kGnnC{? zxkjw3@EhxDjvPUL@5s7_K8pO_ku{SZLGHHJwe%?RY;Ijgk0I|{tXcFp^1j8oo}NJV zUTZde44I+1hOsLTIfh*Teh{*I%GQ8Hqm-y>#()a24q{dwbLeKTefYcEy(P$b!Ll#l(TK4y~vcab<^?4l(Y5FK4i+-w$lufvd zL}b?4dTAAzb+(=KN@UjAcF{@5-O9F`PDZw6TOXZ*%s^W|or=sr+a5X%nSr*wbUJch zv+biZkcns8PhX8pJlg^K8f46}ui9CJV zCh#uXF^&`?Pv5plx&*ny+NS7IWH#ES=`v(C+Ggl-OX`tldD}9&0hzHjf4UKQ zmbWdZn~=@Wwt{X(?)A0+x&^t{+XCrU8;4lY17eN$h5cV>21igw;AYeWZK(IbPqD^Z5Dbv zGVN_vdIvJ?Z35kkOnaMy-ib_mn~UCsOnaM$-i=Iqo0slGwoqF<-H*J%w)yBi$nPoH zBziCMCc&0S??c`s*i?Ey@{ZKDl0Ja^49J#5A4J}M+mh)4WWTkg(1(!y)|N^SBKxf^ zjUGbwTU$DP7};-a8T2qR?QN^*BgnM3t)`D6)84j*9zmwPEt4KaroC+~J%&ts+d6t2 znfA6UdIFjDw)ONeWJ9)PGiuF!&ELMxspY{GD% z4bKg&s5s+tDoSK#S0eF~Ux?3cJuI z>_$Q8L%YzA4q*>Eg}vw!_MuzYj~?Lw#tH|~D-2+qa0ugtK}-;a&?g*5Q5Z%^ID)cp z6cdFJRD@Afg)!8Gaa<`(;6=hQOcEyXVqpp|5vDOkn88bhSxgm<<7L7erU~SL7naf2Ad_71r>{jOxv-qR4w>Y_3i^6vk_!R! z4ag)H0_hu(NiGD@HzCto2&QjArneA6--=9WAr$Wr!mvmP$2)}x+#p2aU4jma1wGy^ z7_dYzVX0ujdj%_&2?E|HIIvuB;r)UKD+Dh-AjD&(;KOP`;?I2;`F$iIk$wc(U{rLaeBqVd>Wg!K7gj9~diR`OF8vPcsuL|k(+sM8uWYF&*`>L>t zeizwSh1K+X$i6D9q2EXLRUwo90NGcCwe*L`zACJvKSK6ZA&dSP*;j@2^e4!^DrD22 zBKxY4Lw|# z6>4x&sKuXzI*v~vGfk++X`ums5gIu@gUmFciJnDfn$S!iM`oJPf^$MENB%(G3<#U( zKauwXLL2=T@&qch(|;rHb%o9JKgb&cp@Uvx@1XtcTX3np6PMYy;wknn^tW&0Gp8am z&E8F)hRig34}Cf^)9l;nGmyz<-$9>=yxq0;(q|!)&At=Qw(sId2(qu*chjNBl(Y9? zn7tp*v+u!h`(8ZXzK_pDAXCo1A0zDt@Iw1Rj_Z(p)jmM$ky&RyL>rJTJ1;CW*q_DS^Er!dw&jb8f<#@S~v-hLbt z>~rX|&!cExK*@drW&24?v@fD!_tP`$?8{KI`{PRca=ggC0+Z|kc(FYYlkGuxi9Hxo z>>+rmJrq;zVR)H69MkL(dVYr!nRxa{`U+(3*>&`l$lSB*>8p^rXE)&0b`wX|AirsE zx6ql$yBfQdUW>f3u?zG%WJY>yfv|b`NITy?B#79&_wIyxA^cu04@Y z-h#|PyNb8kS8^mDd7`%`VSzoFBex^7(Vjxzfy_pGD&A>N!wvRyyvv?}#r9Qv=5Ay* z+E?Q}_BB{)&%}G}Yx!y!G9m5ju-u-7_uJQFg*_V|u;*ZEyz}BucJGWHv{&1e8b*=J@!WIvp4b850KetZ>B#)W~03YKe4ys=k`rFU~j`Q zdprJM-;Cq-4*b!+g@0-SnIZO0dItH4k9{ltZtuc>?AtiLh+OrKZal@&gDV`{@pQ)y zz8Zi$fjWBWKx9{O?4*N`UB$5rgB`m$ayIfF+tEj#gIuSMemWAlBRlrsYR6u@+OZGU zIQHW;jsuwKIEdFe25_z85MJjP#C47#yxwsbvmC>CgX0LUcO1nV9V3|S7{!|$W0>O@ z$D17!nCm!(w>Ty-&oPC!I;Jt-F@v``X0gC=9B+5bVWDFl?{F+&k>dp3={SiS9E*6D z!!Me1&#?^ecKBn7V>#aASb?RE0KC@`h-Ho-yw4Gg<&F@%-w}!xjxc<{5ssCP2z<~H ziB%3AKIG72wZni9J50FIVZlcnR;+Od_^88ywGJ0P=I~&h!;6nQ;<4W0!zUaPHaHUT zNr#G!j+OY7BMF-v$@sJ*1)CkI_>3bBTO8^5iX#KN9IK-FonGXplaAH&>&RK^SVO;o zoTZLT`b}gXaIB@@LiPd2I{Iy7A8=&R?;!htV?F&YvJW`2>GzO*z>!10kDT+4T>1m# zoOk5WA0p?xBcJ{V*#{g2^vB3P;3%X&LG}Sh5&bE$4>&f^pCS8zqnQ32xl$Y@^cToJ z;3%cPMD_tk8T}Qq4>-!{uaSMgQ9=J3*#{hz^f$=w^g62O{~-H-qniE}*#{gO>FKO(==>!_#yi~LTnqk;Y(vJW^K>7S5i97hxVGqMjjn(1GV zXB;sNYdWo}>_H%Bfmm>Rsvx`0j*$154=u?q>z}ZcohD;A<4}Cha4>-5eXCV84a|eAU zvJW_W>9dgO;oM1|jZ6>cF8UngsmHmSJ{Q>soPG3p$Uflgr_V>8dYpUc3y^)lxtG2W zdFpZQqoa^#ALo8L8hQ3{9-xiLKHxk^n~{CMIY7rC`+)NhZA10}=OArI_5tS*?L_YQ z&cm4K97e@?1Xbrz)SM%@(m9G3Ima-`IgS@QCotK03@>p`Vv2JLFLh31s&fV}bIxL# z^Eh7aoWm^VJl^PB;LpuQrkwKxor6p{=SeyjnR3oWIuDt0PCo;8SY*mMm(c~tlymyi zg~*h1E~kr-Dd${4Z$PG;Gk`8erkpd7EiAGlVWjrkpdBu0W=o zGmNf8=9n`aA9qGzy)zP@aO$wZsmCXs25fYi@F}MSo19jB+9_bO(}B-8UD)FE;ImFI zwmReSIj0XdIVF7FnTTyp6<=_!#CB&AzUWNG&CV2j$(f2B&NO`4nT}hW8Tc>fD(rNw z##fwcaH}&DUv;j2wqMmh87kC7SW%%?v= zW|Xsl{uG%}&O-V#WJWoQ=+BWE<=jAjfy^jpG5sYnqnsu5SICTVmeOA%Gs;;;{~MW6 z&T{%2WJWnF=>H%y%2`Q&i_9oz75yDDqny?B_sEQLZlr%eW|Xsr{t=l`&RY7v$c%E< z(f>ncl(U}x37JvO2Kr}YMmZblUyvE)Y@&ZfW|Xs;{tcN?&KCN2WJWn#=|7Me<=jO7 ziOeWx8~qnDqnz#Z-^h$|Zl?c1W|XsoUgGMY{ajnYBoQ*EE0DZOA6$n!zI1EI#BqjxV|9@MYILcDokvP1gzB?mCHY zyB4w6##-#YtBf{^AP98CL}U>Wai!mkxh(>2c0w;D7TE@>`gG(@r zUPE7soG0!~`ZDCF=Y~6r&P29f_j)=D*?ZmDc&j^yBl*bmcIV;- zcOI6x^YK1+0Y2m|2Bm~ahKtH z?sDAiuE6)*mDuO5!Vlcl*zewmAG&LBkGmE>a@XNrcRhaWZoqx+M*PIxg!|pi_^G=E z54cYfVdryZ7Okdq4i*K7ixygZQI+04Lms z@W1XsJmwz4|G5w2qD)k3af(mSeDI zg^6tnIg>pB^f}0x>BkxQ+R$4-? zCXYZTB3qWnL9591<#Ev~ap{taJRUj;*|I!dIvLrrJn?i2vSoREbSg5RJrbRU%x6y` zeFbtQdQ^H9GOIl+>8p_|(UU}HBJZan!X)*0`;t+??5KGCzHMt*~&a?>0)Fn^Q@ywkgd#5_*%1@uPb+0#=<*C5ZH zo+7#ydG_>dpzDym&Qna+BYT~vgl<6gI!`Ixi0pNqGP()b>pbOjGqTrtD(Dtuuk%#W zt;k;IsiHR_d!476ZbSAu&qlf(+3P$t^k(Ev=c%PTaOsklJ$3XJWUuqo)1Am(=V_p~ zB72>uk?unFI!_b54ViwPX1W`B8{=uAdyq-!X{EO#Ke_X4qIV$oP){4(i~Quy(@yV1 zesbs8Oz%SGr>BG7jm%Ha7P=3apPo*-ADN$?t@IvbetNp-y~zCZY@_!f^V8E!??>jR zr-wd(%ummD`XDktJv-Q^*YT9H6I>8R$7k&mc3^OZEG9hCp=(CXt8GDRA2bqwulk~aBgp8e{&qF3;>@=PqJA=B|S&l~`lQ8x; z9gR%F*g4vWOv2cC+Kf!X*abQUnS`+?Xd5yKV^7j{WD>?M(oSR&#`>9=gvfj5*kyDq z@}4=?pN>P`GsiBc6Oi}Ju`6g1dCwdhK+DLJX>1^^AQLh+h)zN#WNa{06M^Hddf-MV?h-9dse`tQza0i;zhe>!FL0Nf_&;OOQzz z8&8)a@7!X2^!>;?w^)gO0D0#Yn@B&1Ou1N<-iS=O*p+k*GUZ~E=vrjT#U|5r$drps zq3e+;7n@2qAX6?jjc!DyTx>esgiN{E47wS4R*hXnKZiW4#;&HHN1jz<*U&E@&#JMR z^oz)|XY5+~Rb)4dT}Qu$JbT7w(XS&{O6+=i9=TFtv*`t7TZqk}PaxYuY%YBg*%o5+ z=tX2J_U7ZM-U5y+N3IlaA$=xtrFe_zvydyryMaC%xl+8v^f}0t;w_=iMXn2PDII}) zXT4?g&B%`GEvNI5w-DY6x&XPac`LEZTg8$4knfkbn!X?TJNIs+>yW>5Zw+0K{GEGi zvB6u%ktdNi2Htvn%GNZ^-uO z-B16HY>eIm^q@*ETwgm=XSV{u#v$L~ho)yIX>_aK{6To{(eh2#Bk5m*ryi4Vl-@WD7e zR>c|cp*Ryh9cSU6ZALbhI4j+PY%FmC-TMD_#5p+98Rx?8I1k6)KsJXsFTN8Ok2~Xh zxGPTLtM4J_UR)yXjZ^XCxRv;IToQg4myBa^DSYw=@jLI3znJT-nTo*uuBPX-`A&56&V1Cj4+{CYYBc?S}oP3w_&An`f0 z0eSL`&!tVsn~?ZC+Jd|fiO;94$Q2r2KsO*$F}@I6;)}2~egnQ9U(8p#k)IvJmtb#v zDZUe5hVRCg^VMC*UKC$J_aj$jd?kJ!U&WCDLJLRC$o)E@6=M=Mp*5img@ktWBy7gm zgbws3Y{9D&I`Ni-t^Bij$iz$N!iN*K;gbp7_*6mpU)pZ@GZxF-wOQD7l31Ge@nc^I?(>D>C%!QJ)E6GZMvZLLz6d<%i^R`;Ivnun@e7{;5BW^^rO$$cJ}Z9Z z6L84qz^{ESJnZw}zkOaD_Qm5jJ|78*t87jDPq_aNbvnfBMRB!B>ud`6}>)uM+?ERpCirHU8t< zh>N}&Tq4$@pIC=W#d=&OHsC2@Bl?R?c&gZp%f%KvO>D&#;wC&@Y{LMt9nTOqW1!f9 zXNp@eNbJP3#H|=CcH!CLHVhHF@f@)SL&fcQuDAok#9lm4+==1hE<9h{jS*rWULf{k zq__t!6!)S|+=o%(e$3q&>|kj7;zY_;t{loM^O+*&@PUm zLmWe=IF2rH0^Q;<^oWxfD^8(ToW?kD2IIw9Oc0NwPn<(hoJUDqKv_J2iQ-9A#YN6r z4f&~)=x62rD=xz%(H}1smt(TH0xuB*FhvZ+OT{2e6@&3IF$B}ZP`q3W!*nqmuMi_J zLyW{LMIEjZ^>~$Nz}2D&uNE!1MzrEJqJWvA1FscbxRzHr+`&aJt`p<&deMhjqJ%ey ziMU==@kVhaW{XL9lbDP-VhY|Yredy`hPR06m?vi7t>P-o7gytL;ui~}tHm08Sggg3VjVsr)?fRBoeSSvQ+V`4Mbi7oiJ z*oyVyCVWC{!v?V(pAV7QS8Uf;vRfS+>0IJK73i+k6Xk8_%HDwc8UY|ig*aOii7y7 zID}o|VSG&-#%-QozoA&z2?IEHVExI>)8x5X*!6{qnXaRzsa zv-qxf9CwLx_?|eAyTt{3Up#?*;z|5KT*Q9S&&JFbm*F1KA3qY8<6dzEek=yyJ~0qK z5rc5Q7>u8aA$ULx#m~erJSc|a=VAm7h>`e(sKY~|9={X~I4GL%E75{Oq7}au1w1S| z@ZX{fheZ#5BYN?O7?1xEeRx!q@LMqvM?@9B6IbG>n1tVp$v7sa;16Odj*DsdqnM5p zVg~+KT!qKP)%ZVg4Ni)g_>;I6r^I#mvzUd`;(Gi=%*Gip2Y(fFaaPR3-^6@8E*9YL zVj<3nMfiuf0q4bH{8KE!1+f(W63g&}SdM>-6?jst#DBypTokKuiL?>@q#9f*)#5U# z4o{Kl(O+u7Q>8{+E;Zq4QZufQTJUtK6$7MAc!t!5fl@o3DQ(6esRPfFwqUT-iDye& zF+}RZbEIt;Ds|(zQV)hn+wnYU2Zl?%c)qj~Bcxq;fwUVVr9Qk+>PMZl2cx9DsF(I( zw6q@$(g8F|2hk)ApjkSE7HJS;q#?9QhtVbtqaYnYyL1#C(g-@GQFKXT=$6LOBTZne zbPT=HB*sZo7%xp@f;59ZX%9?MObWp?DHJc4!Z2M5$19`=%#b4SN=b*SBt2dw8E~~^ z!mA|4U5daRKe@KLD|Yo#W9OlrnDsRbXGTCrZ*gilCq*dVpzlhS5v zlsfP!X$v+l(5cHkzd7oV4QVwhc8R}af@^S|0Ny7PH6yNkq+TjX%JtPhOkRIjIT++GTbBi<44kR+$*iXkEHZQT#CQ}DH6Ysba+V8*~a;Jj3fe@Z2| zAeG`@QW>6*%JFZh0#8bn_>WYDi&8Z%kvF2BT!TyHT3jaA;VE)G`pXS?s@#ans_77Ug<@oaf3hR9ubj=T*+G|Pw3 zA`fDWJcL&HFxuo{6yzglmye=D9zmx(iY|E!-SRkkxvq1gi2$)Z|56Df>B?|MD_SlKt^wc{wJ_EASFI08`{Zyi^Xt zR5=(glS42~4#msmFie-j@d`NtGvr9TQr6)rS&vuA23#$h@M_tDYh){4BMX=*JMdcB zg==LGUMG8Tog9zX%RbDKCA>jS#Pza@H_9t9TTa58+lh| z9&6+Vd{l14TDb`ylbf+lZo$XpR;-sd;S+KjHpuPxq`Vm$iDWA?%V5<7@ITZj+DT>+(_TmPhanc@%r(F?>@V$L;b2 zz9k>S9r7f;El**uJdN+jGq_Wp#dqc7xJ#bH_vCrpEid5v@(JvdPvQsiBKFIEPUgS7 z4EMsIE_sT2qV>tl#$$|KZ9EAJjVEj}L!2@zAekOIoy9UhYP z_@!*XLD_^~$rc=vt@yPp;9=Q;|CU`iEPL=9*^5Wyc>Is-!=ti<-^z(NBCGhFyb?#{ zB>Y}Z#xXese~?pgTu#Fu<#e2oGw{FiDm*5y#{bD{a8l01pX9YTC9lJu9DpK=K<$ffv~T!ts)a{ODaz>{(% z{v%i6qFjwj5;vk>Vht`$ti@%Cb$Ci*J^Cj$;Him?xID25PfKjZ6^Si)dSWXEByPep z65B8^u^rD$+>Akq9e7sa77R}8#IqB(Vn|{ao|Cu@Lle94+{7LXOWcm@#Ru*xM;^$%-E6Xrb@yBbG<+xT^f!8SkxK0Vg z>y;qPQiAaYB?Q+ip?ISbhS^Fu-lRlejuMGCD>}?o^mvP6z&yo-w<;FQSFCuOB4B~y zz}poU7AhXRL-Asf5|4K(KHQ*4c$boh#fpk|D=V=?Ny2-SWGq!u@LnYq%ak;{Pf5pe zB?IqQR$+y*8Xr*BV5O3Y4=QW1N?C^wDOp&ptjC9yY}}~i;3G;d)+l-SsFIJhN&!Bm z6k?rHgpVs5uwE&~CzKLwP)hMhr3@RDa(qguz$T>Bk+)9(-Hbi@nM| zd`H=jJCy_Yu5u9HQwCi8P75-Jl|$I44B`jM5cVsF@k3=8_b5m3BjqUWRYve*Wfb=* zWB7?Oj{B7f{8TxH2b4+tOqs%i$~1ni%;11Bi(e?m@sKiyUn=uBs4U=D$_X4&PU6?f zA|6)!+{|HR84fG{_>Hn0k0>kfKS}@|RRZx_B?w29VEj%A!BHg?zgNO=ObN#yln5MG zBJoE>hZBk(|En1Am}0{JDHfbmtoV~6;FRLPpA{EQD<1qs@#2gUkH0EDoK+lr;QHNyigP2L7$A!jsBs{6|@Xi%KRgQP-lMx(=7B zS-4DHkEf{F=&$DBscJ4RSM%^RH6K@~1$eqzhyiL5o}q5QK(!dpR7)^OEyc6cG7MJB z@ocpML)1zA6JDq`qfTwXD76*! z>L!d<+t8r4qfyK3%9ofxBTMXTC{Hgy{cYB$=|9(1VN(W&l0m)eVNbtih% zT^OtGMz7k3acV!tt9vj(-HSeTAByUJl+*(#s|PVr9Y94rgsM7-nmU9l)x&s^I*du` z5xiJEiplB-UZRd-iaLgus^gfdPT*zgF-%h@@p5$v)75FbLY=`3br!EwkK-zJ4zE(@ zakaXDSF0y*jd~KVQ5P{&_46?K)n&L=^~dYf<+x5=f!C`6n572d4QddsSA+3JH3YNO zP`pVE!yGjnZ&o8PSB=D5R2}B2dc0LNV7_X?+f)k{s8+mP6|his;2o+9i&PKZsd{mP z8jp9WJ}g!xyjxAg5>>@})RkDOCgHtmGM1?+c%Pbz0ftFTgCjSs48 zuu9Fuht#!Lt**m|)hyhouE$5zY^+gp@KH4vYt=k_OwGqSwE!Pi3$b1;!Y9-X*q|2U zlWGYzs-^gpT82$(IXPBo;Yw$U>7B{JN_`F(=ZE6F)pf+N= z+JrBv&A3@@!I#ul>`*u1%W4~LQQPrf>SpXzJMa~C3vN|A@l|yzcBx(Xnz{|QsonUx z+JoKdc6>wKfjw$3zNzlS?dmRkOWln-)INM$?Z;kq55A-B#hvOtd{^C%yVL{to_Y{> zs{{DHdIIiUN;e@Kk|EdN&rke17 zss$%iEB>SkIHfx9XVrz%st12jy*Q)B45Umo=(W)?1tHyJ+ zjTolY;CWgthHG_rzE+PBS_597HDaXJgcoYfsMA_7N^3>Ewh5!PHZ*AMXw){NN$Wtf zwgoL(C&p-7(W-T!P1}Zo){ShD;T&*qO)!GSMqn*TSv_;I+ z{JhM6Z5giB{P8+%Ij+-I;PqMnW@&+VgBFDAwP3ta3&CtH6mQbPFh>i=o3#kc)gtj0 zO^11!9&gnQn6H`eHqC+sniX%?1T54Xc!%b~BF%$$YF^x+#p7L?4~sPk@75BrL{sq| zZ6%g!NqDc8jAdF1-lwHvxt50aYw1{_W#9waDy-C2^A#E*IYwPe~Eekhl z>+umS8*8*2d{oQDS}hMB)AF%SE5OIKLaf({@Cj`LHfY88q*j8BS}8uIm0^=sj!$b9 z*sN9JGg=k4Xw~?vwh>#k8hlQx#Z6irKCjhdo7R9YXpPveHQ|d|Gj7&e@FlGkJG4#s zvet%Mw08WLwi!FM4tz!1f?Kstd{x_uU0N5urftJ*S~tF~^|Z)!Vn zyS5A8(sttxtq~QaX-9FdHi92(qqt8S!%wtv+^$Nblp;jre9-)PJ6h_(X%qXpnmEfBxef^b9& z#_zNc9MwYcdo2vdv~c`Ei@7 zgoH5X+3fQXh)9Wyh)4~Q42g);kjRLXjLeA043*4NW=3XcW@bjj*Nn_ejm(J5Jf-II zetv(f*Y&xE3C)>V_qqp#U(=(oFFhK6OOL^m>9P2GdK{igkHiSsa6EXV7`3Jeh|akN;4p<*@OATGc#aS`4q)?m0;i#LgN7$GjfF=9QA z6&vtoaVd@y8*#k293#ahyhU7rQQ}IRAU0#P*n+o;tr#P&!inN)j1}APHgPS+iS0N^ zT#xbM2E1L|gp%niAPWukD?(SL$i1SGsHf$h$qo1oL>85WH6m!W?lJ-Y1U0 zTyZ4cFOI@#VlYk@LoiPa#RtSN%ooG)K`{bnh-2{~aU2$ik@&C}g@s}?J|f0okr<1Q zig8#h#^Yn+WSl7`;4Co_XNyVrxR{J3VhYX?Q?XP`!?~h}WulBvh$_w#b$n7ZW4UO- z`JxRgL% zgH2*Bz9!b;3ULX(F4p5pu>s!@mtwQnh;NF^u|;gcx5O3LDz3!0#b#V3w%|KrE3Ot- z;k)8$Y!lmXjkp%qitV^gT#xPI27FK4gzLpE_`bLmH;CJCqqrS6i5<9E+<{xfo%n&+ ziCe|p_@TH5w~2f4BXJ*Y7x&}G;sNXsyYLgS8+V93_^EghcZ!GbGqD#t#lyHuJc7H$ zqxiXa4EKm9@C&gI_lhU+OYs!$6Z`QiaRB#=r}1m?3?2~A;y2=X>=G~Hx8f!27O&uU z;#KSs1Ma5(i-CAh9D?7AL3l_UhChfSuvZ+3KZ>L9uo#R#i6MAI48@I=S3Yah-SPfTJT@dhL=PKUKU+=MfBi*q7Sc%nJ7rv7$D`~ zASo9ErD-@=%EKX2K3*fuz#yprhf0MwOe(_RQZbH@W}-=&jU%NJyjCj3QBoORC(XlP zsT{ADDlkN<#L-d}hDz0VgR}s{q(yk6RD)ic%L)^bET1ZzcdP`Nx?W> z3c)-n6d#bnFkcGC2c-y{A&td{q;XgvMdHI!6c$R+_=psPMN%w2D#c;36pxQdlX0e$ zfU~4ToGm5c<5Dt~NGUi+O2tws4d+TCmPs-`A*nb|((y^jjOCIA=Sw!MkR14w4K_)&_?lFQE2Jg( zx>S!Vr3QRMT8hn5Bfcpu#}=sx-;!2ftF#i|mYQ*u)PnCwt+-lRh3`tMu}x~jHPTvK zE4AY~X+5?}8}L186RwxG;QP{6+#qekjna19Bz53sX$NkRcH#$8CvKH?57+$QbC zkEDILUD}TyO9!w+>cUT?ZrmaD;HT0-+$kNx&!k@Lln&!A=?LzYj^gLiG2A1az%Qge z+$){LFQrqsPwL07qygM7oyM=FGk8Eci{D7+u}iv$-%6LTTe^bZNmsE)3YbFwmjdyi zGz7nwg7A_S%JLT<| zD0kpp@(xUrcjDc0Cnn3gaf-YLQ{=sPkGv04<^4ESK7eU*7pBYID9Sx3$p=xE51}IW zqADLoO+JFUd=w4&7@Fl1m?8I}MLvmE`4rmZezeO2=#WpNQ$B+(`7FBS^XQQ;qF26z zKKTmz<*S$}2c*#dXpL!MC@hqt@ew%&i{w~*RF1=9IUXOAC*w>x0cXjHI9pD_$K_-! zkyCJvoQkD#8qSqPER$t?LRN8}tmBii8Ovo0&X;XiAv^FX*@cy|2cMRGSS4rTGjcXo z%Q^V0oQn(OX}D0%!$opFJ}1w>8o2-$%Y|4g7vb}AG1kd5@dbG{E|E*{MY$B~mTXD6#3g4AiW1HNDYvi@KR&K|2@_KBSH{g5n zCR{IX!T05@xIx~A8|Ce|N$$YS@($c0@5B$}PTVT*#t-E^xJ}-RAIbZ0ySyJimJeWu z+=ZXW-MB;U!B6FbxKloapUJ)0DIdmN@)6uEAH~n*W4K2?fnUgdxK}=jU&^O&pWKgM z$pg4wK8;_?XYhc07Qd0tW0!mpzm+dxw|oV^ldocr9B>c)Uk=2B@(}!94#Gq7F#JIt zfxYrb{81i-hvi`WNe;myawz^Rhv88<9Dk7`@R&RnkIUomgdB;#%2C)SN8@jD44#x@ z@pm~6Ps#E4hddek z*@FMdHoPP|@UrZ}E3yawlYMwq&O|}U#sDP;2PwH2s7%AbN*)eT^6?sF1_mhwI8-Ub zVM-AWSBi0jG80Y8Y#gbS;I&FAj#A3-I%OUPE9H2-Qh^~#C5~3AFjT3=87_-lnX@IHesYDeEy_*?_kzn{cwS1@BO{VuG>_?^L#9qSAqPDLXJp*@<^6 zotUib#wp4kOi}jYJ<2{zRrcdlh)MHRTBE%270w zV`x@RV209%7Ud*bl~ZU_`q8cophG#0PUQ@`l(Xno&Z9@Uh+gFq`jji^SFU2F5|B#& zR{}9x8G`pJL71Zq!~2vGn5&G$`;}2RO$o;7N(kmDq4RG? zB@!Q2qOeej#z&MGEK*|eQ6&zGm3VwinT#`)1e~QL;%p@eA6JsGL`lIpN-CBrX*gFA zu}qQi2}Q+uijGezW-M1MIA5`0h2p@c6c<)19(-EyVU?1J&nVegt>oadN-i!?rr|;* z4;Lx<_?$8WYm@?9tQ2CcQiRVd#aO4z#21v=xI`(z7nM@1SIY1uWga#t<@mBvflHN2 zT&7fEqf(8pC<}18vIt*QYOqPE#n+TNT%jz%*Ohu)sWjjl%2I4r8u3kKIkqTG_?EH) zTa}ggw$hBNlootPX~osbDtuR2jcrOBu2I(FTBRM=DeJLa*?{jUn{d6d1>aY;;s#|K zZdA78CZz*6D?4zDvJ*d0I&rJA8$VR`;5KD1ex&Tf?aF@qSUG?lN*8{jbmI=C2R~H~ z;!fodex~$dr*ar~DMxU(auh#Tj^Q5V1b(6P;a=q=eyNTCl_B`O5`>48VfceG0(+H__@gok4=cg= zlM;eQlu-Ox3B#jGIR2tU;4x(^9#_WU2_+JLRidy@iN@cQ7(A)O;_pfvo>JoR4`nj; zD+&0gl86IJ68@zm<7p)Y|5j4*jFN``C?cL!WIU&+cwW)*f?~#tiUt2wYy zR}>Har}*%yl8J(vjR9&74pMV5P@RT@)jS-c=HoT$3=C2WaHv{{!_*=it`_46btanB z**H=y!E4o09Ho}wb?Q6}R?G2vwE{!bN*t|LVW?V-H>e9ROkIRGsx=s{*5XZS9Y&~2 zaEw}yW7P({SzU_b)J7byF2_i<32#wXV3fKNC#cOBt+wE;YAeR5t8k*a8e`QqyiHw; zacVnGQrBa=x&d!jH{oP;3*Mn_#RPR5-l=ZKM70C&Qg>jIx)bkKJ26?^jZ@S;n4<2* zd(?fHs_w_B>H$nsyD(ktMp5lSNj-?NdI%M@7ghBzYU&Zx)uU*r$Iz^vzznqyE$T_M zs;AJV_M=@LK!FjpOk_p76Dni`DL)ey{6L-7GM4D;1+d{B+R8R}SkNF9d-Y9v0aMq!~EjgP1? zSfs|{qiP%$tMT}lIvHoG2{=nl#Mx>RKCUKXiJF3Q)Kn~0({QdTVwo!A6RL{yR2`pG z%~-BlaK3883e|y6sV=NkJ@~Zh!zwispHZ{1TFt>{)m&VlPQ!(29xhVz@i}z{)~E%z zSS`d_wFsYAi?L3fi7%+Lafw=jFRGO5>v%kgEk0+*_lxJ<3WMztDWQ5WEH zbrHU*)?kxbi?6A5xI$fmudDUAQf9>YEA3H(Cs!@cTB{8BxI`_z8?N*%!c>S_F1J%b0-v-pjA9=p_w_^o;g zyVWcBoq82})PQvQzZ!@K)gk!38ia?`VfceO0(;ew_@g=s539lWlNy3Y)KL6c4a1{q zIR2tW;4yV99#_ZV2{jUbRim&^jmF>97(A)Q;_qr4o>JrS4|Ov3s|on0nur5x68@zo z<7qVo|5j7+jGBi3s3M+KWjv>wLBc6<>NKl3=Gl=aHv*@!?YqCt`*}5Z6=zu**H=w!E3cr9Ho`v zb=o`(*2?jEtpY=|N*t|KVW?J(H)snmOk0FEYBdjnSzC(Z zv_>4SEyqZ$32)I>V3f8JCuq$Wt+n8-S}VqAt8k*W8e_FKyiHq+aauc0($-_VwgGR~ zHsNG#3*Mn^#RP2|-l=WJM6Cnw(sp2ywiEBxIx$(>jZ?Hen4;~)d$fI+s_noUhriLUZ6# znhPs64?eB=uu99sXS8gr)^hM!Ef*JP({Q1dhl{j)d`_EzHCh2K)(Wv!E5hfsVyx3< z;tSerT%wiWi&`nxYi0P7HV+%La(r2smdo)Ee*&Z7DWujrgXv99y&|d`nw_t=dX_TWiKuS_{6Twc=`R6~3#j#x|`D z*Jx{Tt=5j~wDs7oZNT@mO}Jj$g70fvaf7xEH)`8)lh%QowH>%c+le1&ow!xojUQ@z zaGSOlKhpN$c5Od?tR27(tqVWVx^airgP&>#ai?|&Kht`#Q#*{iv?I7%JBpuc$8e8! z0>9AuaIba}ztm3QKCK_W(gtw9b{fCd&fo#rV&?aNQmVke1i8!Do;a^%Zp4L+EZ!HziXleM5 zCgNF5#&epA=QSNKXlA^qS@2)YhLchU(RLgT4U6^hJ21UW4I!E#9QpVT8T}$LRGqR&T(Y^`$sYZ^ZHXa*WiQ@D_aq zM(HbYg5HeLdJEpFw_=RG3McBTF;;KG+w`>fYeiq&OdGzQP z(W_rVpMC}X`c=%-17!NY9*Eic5WH6p!W?}V-lvbiTzw?ouaClMdN5AcLoiPd#Rv2- z%-6&5K|KOz=wtCAeH<3(k@&D4g@t-FKBC89ksgbW>Ty`C$KzxAWSprd;4D26XX{D$ zxSot9dJ4|bQ?XP}!@0VMWx9+{=qk?Bb$n7cW4Ug@`MM1&bO%1AyRcIC;M2MftMp8K zM$g7-JqMrFb8&$_4HxQpxJb{(=kys^qZi;}y%1~lB79yi#yWi_zM#*>C3*?IsFz~B zUWPB}^RPiL$CvdAT&h>%GQA2L^=f=YUx3T?Mfj>-gH3uZzNXjV3VjK_uGiyAy#e3Q zmtwQth;Qo4u|;pfxAYa*s;|Vi^=4e9x8OT^E3Vd8;k){3Y}4CtjlLGw>g~8rUytqj z27FK7gzNP!_`bdsH|X1NqrM$C=^eOP-+^27o%n&?iCgvE_@TZBx9NNFBYhuk*Z1Sc z`T^|FyYLge8+YhE_^Eyncj|}mGrbo(^~1PJKZ3jUqxiXg4EN|K@C&^U_v$C{OZ^n? z)BEu&eE|3Cr}1n33?9(W;y3zv?9wmdxB4aQ*011q`c>@F0~Gqd9*76^A^5!>gopHD z_=7$Id-aj{qdp1`>%sVw9)d^oQ2bdB!=rjQ{-Q_VF?}o^*T>-rJraM_qp(kp#^3Z9 zJgLXx?|K}b(&OH9}o`(PEBA(S{Jg2L8Uf1!0 zZpMqc1^?A;cu9BQW!;5WbPxWg`|zrsiGq=h0Y(lEGIBA{n1+LmJRD-=<2A+%3^EFE zs8NW+j3OLv6ypeECYp@dIMOJ=YmHJIWt8D{#yku*%JF)m0z-^S9Bou#s8NkK7z;4W zScEqkH5hKx;!Q>!Mi@(Qj8TtcjRw5gSc>C}MjUS}$4H|IZ!uP2l(7;g7|j@MwBW5q zE5;bBaH6pqV~sYv%~*?ZMmtV2)?>V}0dF@p;bdbA-eGLT1Y;ZCX>7+tqXX|Uc3_gR z6Yn-UG1=ISQ;a>BV(i6xjD47D?8m9b0ZcQxFx}`z(da?RIEb=w2o<9jRpT&f#u3zw zqi7h%&}^K*45JS%#!0jqr_g5fqum%lhjAL6#u;=OXVGn(M~`t4y~ZW<8CTG6T*XWy zK&Ag1ftYO!!F!D$%rS=HeZ~mPHAdq7#weU-1mkog1oMnge8339d?OqmG$L?@F%};( z#$kaGi4Pl5SZGA!BSs7s8L{}N5r@S_JU(Vj#+gO}&N32lwvmL78_8H=q~IJQ6-$jY zoNI_!X2|%2q2fG4$0rRlmKzqFZ`iQHaNtvh3o8u|K5h80%E-iLjBKnna`0Ir7Z(`Q zaG{Zhi;R4H&X|EUMgcB13bEEG!sm@*tTSff3&w0*VwB*EMk&@CW%!aY4;zefeA%eL zrA8$#GpexBsK!@}1-RT;gs&Pk*ksh=YepTeFqYu!Mm?@H8t@HcDK;C8_@=QOTZ|@r z%UFS}#!7tKXvS4W3%+Bt;%Z|RzH6+;Hlq#K7;AB@(T?kk_1JD~!1s(zxZc=;?;Bfj zgRu=a8ryM`(Se(d9k|8Vi60o9xYgK=9~ygbo3R%^GWOwiV?Tau9Ka5v3qLWsafi`^ zpBe{or*Q~BGkUSpIE=fDBe>f*ik}A$Y_H#h;BZJZgmFFGd6&Gsfa^V;r6^BJo!v3j2&`{LP5LlSVB5Zp7g!BOd=S zCS$*mfPWf^IAA2WsG6mvPI znJYLx73q-XN;J$>=rvcP-@Jg2W+Hveyoj8Q^f7Y{=9p_aav##i%ys1Zkq%~Ff_dh8 ze8Akm@qDDin3rOixe?3F%W=NB2`kJiu+qE|pEfsRmAM6L%&oZCyb5d0tMO%X8!k1k z#bxGpTxnj9Z`I*oHiV=B>ESyp1F6$kS)uj_b`G9C;sk`pi4X8Twl{(`vhGiVV8#9h#c*Ze4dJ}S$Gft4lAZv6+ANgivjm|hp z9*aO4uw88TetD@bR^@Q|+}ox$QG z2OyK7B@+WJ*&G>++#!}6@-@h0XvrlHMJ7YbH1cp{GPLAjq$MAtEHiL|rGSq{BU72B zkQ{^D50)aFYAHsmWhTdM$W&vQjZRAmM_kA}V<{zjkPcueBm0m(V3~)RmU50{A@hu- zf_yJ>7g;LF_aPI7r3&X*sGswh47DEQ$PGw8w;m!#AkVe6mpmTn z=hnj*Wj(@?3CPrKJ&Lzlk8vahnYyhf$g#-OZS5n+Ayc>YB*t4$;qBIboNOK7qjw;y zgY`7|PGst~o+00bOx@PAc(?UDN0O1QV!cRCL8fl&C2}fqM_I3s(~zm#dKE=$fDs@_ z$kc5OBrC|&Z5=|^kg3}mL^hCl+d2&MtRpz`05auTN8&@)QTT{8nBzsrG;0kZ7bDZG zHIzIPnP#nF7x3%+Hw@zGYKXIdS&%Id;* ztR7r#_2Ii#b|FF=(m$=)xYnA3>#VsPZ%3Xc>ooFuWFocZkvAX{sWl%rS!Zx$Gcu7{ z3&!#G$q-jt@hgAX_!rgzSQC3&__Z&y;Nu`8wp8vel5UN7hzbEsnO;aU>L( zqijpaVaN(=t0#ve&z-G-9D(eDZA-~xkzKH@kvtBWtZd84k;wCCYrRWDR*bZ0%^+)^o&+JR`OZ zWDC;0ZJWq8q< zM{|%pscjEA7ul2A_L8R|6P;}z=Gpe+1GWPk&qtnCTNil-^32-0$py%4U}N?d3X!MS zc92|z>_%;e@G)C2&aoZF8ru=*CuF4il-iu6? zwlMNOWLISiC+|mgRkjH70c4%BjU{&>yDHl_ayPQ8vPF`6kmtx2g~x5t_=hcq`+oy443bG#A^YC7KKHg`a zfw}eqyx(4k)9gh!-Cm4&_L=yAeKzLXOYlK^DL!N`!$SK!KIbFI8e}iW$Ltk2-(HCo z_9}eJUX3;O1-RJ02y5*%xXfOQjrKZx#l8ev?DhDTy#ZV8OL2|85!c$6W4pZxKd`UB zt@f4pp}iS9?Jc;=-io{JtMD89YV5MN;kWj+*lTacAMNY$uzdsmYTtx?_AU6EeJc)f zY{NjucK(kBBR$s9fhNZe9PQYNp^i?x!Lb{|9D8uQV=w1NBHhoij~sC z4v=GzE9mGV$0E~+qnjLuOe2mSay&API1Z90BiGk)h@602Uq>%F5$T+c!>BusaKu2~ z(K(KiGmv+5j$>pi@{Z1Nf^0|np`(xNMEarQB-xGhL&qty7wLzNezG6whmHYq7IHs0 zPGg?q3_k2Qi-nH!SmL;da~zkj+;IixJFa52BOrtKT8=<$a16nh9YNUS7>2JoMqrC$ zB);Vsg&Q5gxXBTMA2~vCyCV!gbA)53BLcs4jKzJ9arliRGJ`&VTxCZTxf|&Nj%acZ zvZ^{_$On<0;D{w3LiVSQIC3v?S2*Iyhmk4QF`0Y>*%>(!$VZW#kt30O4CyM4B=QO5 zE^;K3`;fcHkwQL+yj^jml20N1$B{V8=^+Oo_qNkV4n*b$XC`?F@^;;s zO%6itc4rQG81i=AnM)pl-2cvL8vK-iF8Zn0&)`4EuD+V$;fQ) ztRbf$(~Gl~oQljU&N`HwOVI4B#|&o!x|~bV?QFzs=W@K)*@St{75IR2B^ElH@eyYW z&UUuq}(@Hi9A!zwdDCoM|HN7pF-XUIoFe)M&2qoH;|t}o;&9z z^0UY^?%YCNguF?1ZY9?seb~8;T#HN;&h6wnWTJ3(ke476g>whF9+@bdJIM{mQ|#;{ zFGYH|b2qsW>EX^jC(L$t#h!QqBY9W@K)6c9C0xl6NCBkMlfv4>I#OFOv5nJzr}qOGvMC#*?ogz0NtAd==?+t^{%b((7D_s)E%k;qpPT_SlD@|8rFOb$lAlIT*&A;?tV(#fI7 zRNyj`!;n3c%R&xE_E0VxIRe>3xg6xN$R5h&B9B9+2$zQ(iA)hLA2|w{B3zl|Xk?0T zWs_r&DZ-UQjzy*jS1vgYnIc@%$nnS&;mRXVMy3c?J~;uIB3v`biAdjb6_AsVzUL|= zCnJ5&RYXof`kt$poQk~DaLpvAAv2_FHd#bEp{s-}Bk##wrDPTPN}{WbtRuTN*F3Tr z>6Wf?vIW_-xhlvuWY^}ZBs-8dZ>}n`3+bq?YO)7;^X6JW_91WHT#Lw=$ga&*L(WFJ zuB(=ugUq+CI&v;D-@2BNry=ujYV-HU4#xeR&t;#y6fhrD}n zwUNt_Y09;hT!GBeu6A-I^6tg8o?L}|CDFBkT#Zazu1(|xNdI?jAumGuziTVG2I>E< zZRA>{|GT!6>yZBM>L4#cdbMi@zTw)5Z@W729oKGL>)M0sTzheoYaecQ?Z@q|1NgD4 z3p-uixXaap`&j)lk9mQW=$FR?J0{?XN;ehKTo^zeT^R9mU z&ozKoU8nIH_ZbXwpT%q4=W&$#B93ui!m;ivIKh1tqul{ko(p#%#=D2$UG5-Eau36) z?h%;g9*LTJ6zc9^w7Wyl;SNQ=I}9`3;dq}r!pgmb+)M7U>iM}7?XdbB&9JPVl<+>^Mm~hBiSBviUSv&lmy-`8_oTamd<0n&-Ie5{$eQS`A|FH6M0Yj$ z1ajZH7m)jqHPO9@d=gm`-8JM>$eQS`CHEuuw!4lzfUJq`CFIk{n&_@4pF!R~xEsjl zkUQVKlzahs|KM&U|BJkTa4#ocM&3WTo5=qmPltO2S@5hN2Y6PJ2O+y!PcwNi^8Ufo zLcRuhf;_F{p~(9O&noh82q7B%lUw0R@Z?u|m9HyZuk7|iv?;{Dz@oZ*ef zhrE-q*qeZlc@weJn}l<{$yn}9;rBBiS^K=HK-$bTUH!FPrH zCvxq4SIK`N{lOPtr#~S5!52vW2k8&KA>?z&_4NgjFChKFH;nu*(jR;y$d{4+;2TN) z54i_?qsW4P6gj{jOdf>v2Y(28Fw!6Vq2z0j`@|nc9*Xn_e>izK(jWX0WE0XK{A0=2 zB6pF0961=-TAbT8tGC3Bxhy5w!IOI;J z_(gI8a)!!(qBZ*MY^lMm^=-cOZ_v+dB|MqpH0q3o?L$k zc?Qyf{iWmrWG?lWkqeQz)IX10ggo8;a&j@!rTrD;naCc;UrC;g>~Z{6|gv#aFM?rU+_2J68}Ie=?2PxI%t7U`3jXK+jAS^O~bJjb^o|JRup$)6yzcjhJX9;9bxULk*leBC7T zDt?<8;NWj_Wd`C8nM3esW)S|8ISfx`j=w zD;brn6trZeqBScGJy{}pvt-Q4Qt`el9rLry_+XX=i?VF^XqE#@vRpVP%Y)@vKAfMG ziPc%z_-s}V)@J46^I6ldAuA7G&dSH8tQq)PRsptT72;c2Mc9^AjBB!HI))1O2=T&j z;bR;j+z}8jTrX@4j2A`=S%c$+P~rXmbMxSH#i7CngD(_^3ol+1FGL8#gW`oT!o&aP zqe172#|V!FT__$WJT@X;7%wcwXd!E4yl|`V4aNu)u8kKa3U}iqVcDp7ezif@#S6C! z3-J!&GA0O9g5!ldg=PQetHI}r?-X7OzEGSfTz7rEkSL74{v7#+>n{}FCEUT0B;j+M zB77VY&;NsW^#3<&^ts}DgnLI{D4r?|z9C+iDh$2h9C`Q+7mCw_J2;Xi+{KYJ;ckwk z3(s;SU3iWo>B3@;$if|A@q!}!4^?64jq!pe*wGNO!s7+A@ET?af1y>#xanN6Rj}T4 zq1Yx&zbRg@3v=hn~xKQjDe&tA}FmX)0kR?2X_X@vb zjxcm=yzro~c-;T@rST>B^7v9*HogpB89xu#MV8}xkrnuUWF>BltisKa)%Zc=0{k#? zk?@dkIWk@-5Juk;FFYo^9u+Ul79O1tFU%1}N5>0ug_p5Rcn{|Z@7x+Mlneftc%ec# zj+MeK6aT-rPCQp!DNLMrq4*hL^KJ3Mv%)iR@xnr3`lNVak?=h}CtSuF;j{R7p;q|y z_IROAuuhH_UJ$;-7X|Mf@j|`u2{s6u6XJ!J1=F4JLU_O&O9MV>S&H*5jrf#hxo}g! zGnRTGBH%eoHZHb!@Oew7kQVTVtwC@GeCTKqTmhdre1bdRXGgB!4S3Djimy9Y;Tz7? zLUw@RYQqdyu22v#(VZ(i8*sNfTlhQR)9G9Av*}xL*Ys`p`Sk7h#q*4NF%=g$a38HNCR$uBv*KJ(5FQWLfxP@9_z!$XPw07W}U*tv-Kltc&>CtV=@sptoL%7d8#r)etXi9`qAlA9z=@3-50B z;FM+`-qW0kQ=79fy*US^=3F5pP~*&yK!YB+$y4A%S+z3<-2{W=No$Gs^?r z@3_$WjtBkk)L_;-nRxFz*?8YOwRrzKxx(9l|FqQ$s{;RRbK&JS5B}FygDe0zXiYW_ zUQ>(LtjQJL5A<_nL*V^uTsVD=2OnRv66bLKhQPW1_t7WTG?Sm?{EdN6apuOrr#W+D z;6l#a82B7#ZVX(^nHvM2=gf_PFK}i@;AfoK5x9#pI|4sna}dAa%#Oe>IkO}1t2Kx4 zYtH;E@E6YfEbusIeirx}pYyZ8-#PQMz&|+iv%o+3oSy~$#hIOf|8Qn!;5p9h4E%S^ zQM}BVoq_*xW@n(V_81OYn=3R5g0PC3z(^cNNfci$;qDcL94eoBlq#iOrCO*p)JN2C zwo)O~7%H0LN74y=LlS`vvv4n!Pd!SNQkB$m)DmhLwUYXk8lZ**3c|Hi7&V@XrS7Cs zsS+w^upl%I5rl)(oNEMO7xf!8G)NFeQ@2rfQ+p`aP(gT#3LPN`QPec*Y3ezui~1k+ zt4R-n{)Q`8k|NC>|-N(&W)dg@*3BP#X=exKA_ zY610S7(a?7To8`mBnUkbf>1a{5NfH&v3x#i*3E(tF(1c3!ZP^l-VMbxX*YU+LJ2o-y~AQVw^sQJ{})DCJ7bz!m~+;E2=9H4%o zoC*9nQoVO_k0c7h=hU~7sdH4QA@J|v1pd7e&j!>Z%Csdb{>rNeY3Bn)L(;oiJsEgD{FZU#MeBKlx z%=8c5Xd3+F6d~L+8gDX9#R!uf$C&2gSkvoxvuPKOGyQ?%O{2@F2$80#c#G*Fj557| z6HKpTv}qUKYWfaiOqX$@X~O&|LafP-x0&W*oauF(WZH%Crtk1}(`B4&nou!CxWi<} z1k?R^r)eQ3nwH^RrjIenbR6$CnVy;=B%8+I6w@S3F-^sLOb=nI=>?o>+Kg$YA2HoD zxN?dhnkJ!Snu@aNAyiB+plaHTn(0T>O@p7FA{eI8Xf{p74AVnsF};9R(`K}penh)z zaMcvSVVZ^Gsji1Ezm4-!$ggDZ+y$4QH4h!-q`Eu)y>&K5Y65 z3r+vvBc{O%rU*r*N%*K~Di)jU_?T%f&NRJ_vrOx7w&^>3+;kaBOcNGP5$2feSZbP! zb4{;fnQ0e3Vfqf|nU3R=CexxRLb+)S&NpdTVR{UoGA+YO)5rL<={Q!IOwUabo-y5p z)u#LLS<^yXU|NR@P2b@n(`9_lG@)jSP-C*=V$=OtYg&lUo7Q2S>0^AsbR3tMOpB)o zFPiScdei;*l4&6}nAYLTrtfg6=`t=eO{kqBG@9)AifJw`H!Z|hP3y49^fA6>I*uz$ zrst;!ubb||m8Sdg4bwtwHZ8+9O&?>6={UY+GSy8HT1|K1+ot<*m1*!ZbQB?ge<4Vx z7U=#wZ4W;4|44feILWs3pzltX#IA(Gl7zq_NGoAUu#d_CuU5KMb!(<}J8f6@3m{Rd z>8hEjH`P_WRn;@E1tKRQ1V%PCHc_kJZ-tC_NFam>#@J?UmYjnD2ZRwOSp;Kj6a4>9 zy64=`JrBR%>zaGN?>qUN?|kW;Tj7bFNB!!bKMefGZ-qktXVb{rr@{U4uQv$($>P5C z@1!|pam`<#%aYVt+&}-)6!%$PZT<}9{n6=Xr3LaNH5>kqLjT*F`t6VWb$L7eYeWg~ z@3*M8KleejRNf90Xn2(`iGC!1pU2e|`Q2{0;d__#5%}kiSR#jrsd1e;?!TkiVnKhofWuPWU^md`y@vK-l%+C^kyZF-m3JYpIsS5Kc_N`zP>VwzM=9k`ni=y(X=v-zOnMrXvW`T z{w^zr(Y$gTEh;C`lgh`Vrxo->{+9f`U71ABE9cRwauHosUXRw5H=<4D&FH%F7Sh|# ziMExmk9L)Bi1wAA8{Jf<(TmDAMlUOmqj&hbj8~UtPJ0zP0i) z`ZbkzqHp8x*H&($Usw5g(SKO^`O&Yhd~@{e{QXD#{m1=~U|9RzCM8B!>E2H0B`IhLnRDN~zTPxoh{kF=liGF+K*GAt_`E}7JE5APa z&dRr=G5iyBfiHUSsmf1&@Ll}<4*tHIzyE^2-^t(iRB8`?7k}?o8V`Oqf8SgAng`!k z89n$tl}8VLZ{_5{_g8+&gWp&Atq*>n@~H>Ezw!?s{Fjv|LnmZto+Lde~7<7 z%-?^--yf;`s|Wuze}A;{V-EhCO8wx!&@LgCDGX|H0p>{J_EgR{4_$f4B0d4t}Werw{&K<x?{-hW*FF6{_w>OlOLy`~`}A@1^u^J4I@s@5Pw%e&0WJNO2fz5U zk>?)#34VY5gU|mF^8BS}D1YFAU_Y&XKl9-41NoEc`G*wtGY`Jy{b&HI&gUS9KmUf$ zli#1u@3%epVSc~)Kz={{;QaH+|3H4+1LG)$e2V`%L|=)$dOI-tzlBtNxFYnw+TL zU&HVE1JcIz2c#A24+wUzAba(^{y-IN>fP1firo)c32N zd{^cF=?AkfLFQJ!-~0UAdH&w#-|>^=_q+Igcl9ICuHIe!tDhn{$nW>7eBNDs{7XeE zlKTAZuliN$`8V+UcfU&4;b(rCr26g;%5Uw<<+r1LzefH39rgRQUmy2fvi(U#Q@pdGP+90p(|Zkl&s9{q$#dKP0vNi26NLzh~TQ`7v(NdGuR~k>9HIZz+tRvkdmzsn1^J%U zM`M9Y>pu1NyXyH5sb6W`r{0#C`Kh;maUcErZ5fy4=g9A;-u~neEy?65v;AMI=TE=? zFCtgHyAql&yOR0;Wmli|NPcCMzZq^MwUys*{apEdclCWAmD+wgy3?oM|K0rlkXmuy z`&?>r{K@sH{K~92{-pHV@hA5RB5995DK$U-r1a$RCuI(N|4Qb}Cl%y-R2_am!GAzO ze&CZblTQu(SASe)&O7}6pqdrG;Ya>G^(;B#f&1L|^Y=OYeI9?G&)*mD_l40nL|?=o z|Ba6ahZn^tKn=vJHNeN2<+)%Kb_oMUvIYi z#r$Nwx;6zgTTv=E0NA&GvF}vK=mV`z*-|FW155 z>Uy?cK3=Yt``g3Ci^WP&7gon%`h#A5&}j`CgJHFmw3>}-KWQ`@ackJ=bX%SJpxqhO z8dQCFc5*r$#^-TAo+M`{hspGa9!Sn6(^{>#y?{@*o9o4PfBX7ub+gF!hlejfNe>=x z_6{@JY)#iBv+ZiR*q%R|t)*zwr$Nu8;L^^6Z)Nl0$twFWf?GO5`c6Znw@_(~ghcMfA3(B;;@v3cyuxJ2NaB1Tp zdBM!I$;%oCMbTnxzG?*_EUF;j7d3w3daKs&wcE{htJ<$8?OreLRfpYnwG&qdgHC_g z=ytn32&dD@p4E97Z@07C@p`!zRxw$A)8cDD7S*uzsx^erG7Xbv!sJ|RCm%n2Q3Enc zdYwkASEHugRNxR(|H2a+@7us<%NphH+C+6jiv+;Q{)xW2# zf54_Bo?h^m;fj;<_#E~)9&~dk_{L$92M_zgO7igdl=6xY#}~qMlHnBmAQ@hq6(qg` zWf@q$#KEIv@UcAjaD4nRN`vLSo}5iNt2jO`ASworE{+H16kt~Wl*e;4Z##Uo$R!5$~tin=!DMFT2KD(e9pfk%VpTJ*Md8{m} zJk(!Sd8{m}JX9^KJa}|IEyJV>PLfTgdJ0WP<2PYmCuh^si~iwwFa=q@8YN|B4FW1y zgFp+m#1vY#+Msy2*vG3qd(-81dA$elB28AZ(jdsyL9KES?apx6N`?rm{bn=nA+?VB z)m~C>x7wp-bJTB-l1{zVXAe|#y;`f@ZYIby!+Nbc?8NOsx8ILDt=_QTsSg_i*g>~9 zYPMSS&S2Ep2*typ2!xl@>2SHbUd?U?tJ!XcoIMqAPvk{; zI^XD4e&n%*uz4<@u=!u#>;>3!3EDMDaJJZORxcKlPpsnIZgKT^bvs;KFV^$L`f|D0 zNeWGuExFNE$))6;deY?%wu{+*aq{@>#pPb5*2rw?plBsH4Ckx!?egi<1u93T{Dy5} zPd({^&K9%z1|8>YbF*KrpB^rEx_O#7(@i?z>2~pCvA=xg)vngGdDj~1alGr#E}!3A z?-2c;FXpNnHO6$5C|r+cyTu*#RT;tJ&qb6Mdda1upe7TA5e+Td)?QklYRexUEnF=w zZ?@=Jx&hg=HJw66q^{D6z_*;O5ci}48pc|%Ex6b%wyJ$iMGeMvq5`N%)o4pC2Aegq z-Cp`!YVGwo^KHMS|8++x;@nv4JWSKaOs#kPs=u+^KVu9>v&;Qvdn@_0RW`3(3P9c) z9R3H30yJB)@>RMH$$+oLr2yL`An6f(RX+pnlX7m1RHCtaU z<^_EyZPc{VEv# zJ*B)#zY7Ke4OTpxWvKL1DNZJ$H1TLLU(V=O;oYmnUNsL~INc?ig_f|!keT%3-T8KQ zxfrcxPfykc=9LyeG%I_!-P~Mj8BOss@?|2L1+kdZDLX=e4fg@5*{#knF>nH(TKj)o6#wArGBxpPC)WQ~9e=quF8Oh+Fl3wH*&&!TrXtUvG38qqsHb z^!lw)wLNNAYf;i3#G|;^>~{yfUZ>MUH5?3vz0PRZ8a1)9G#Z_H5<@uX*91}@w1&NU zV=(IVYqe3YH$)K^mAuyNj(TyUR@2*|R~bO{L9c_pIc&9Bjee)m=~7UAP#slkNmB3C zM)9cA8MNvUat(5WdN*Wq>(Pc@uQy`5>^4RT+guHUPcmY6j7IHxyTQ)ajfXXM)b6m^ zANH{k^x}TM+pCW1{hI8D`Pu*)3`bSTJQ+1R?MBk7cYCy${k0Phdfi&P--u%|I6&BL z*ZZwOuU#D`alcV*S4XuvJ901X42E%kRFB*JZnG9OT2M8xQnZJiF55ail?=M|W;bcD z(RUj4VbbcgJ2kEfW{YkQ>B3>NN`{SEw^6NEYu$L%ZuUkf=Jj|`i)&Hbp?a-Bmz`hg z*pHh{`lml?$HP{?lc2=6JA>MYq8rq=9XCe_m5c|&dZX4v=Wo?|je1O@;z7UBZ9=%; z9@d=2%h|1r@vl~$oYvAU{{DRyVp)Q0mpoUc?CeIKyN;kZ01c61lVwd8PF9(9iv^A%ylmKrw6W6DW{ZvuG5 zT{t?vS*?V*d}ED|46JXi7K+u#+sSsm*e>P)@c8CxHaNW)Y*s5|HdN6*(hbB&OY`L= z!W_>ZzggU<>{2SAb}I{jlP8y2JW1YR@1ZydCs&&sEP1h5?;p+9^OYhQD?xm#pOa7A zAhzsp1DI|IA^{mbn(dy!-F4RbVJtitfQao`ep)N!vbE?MOY!mSYEg?$uoz<~+pIC1 zj@PGD9GOOJXW-z)wP;z3Hjm$~MJq9JliwaT&c8R?H3%6uYpGS4<{1=8R1S18|6cR+ z;g4KRr=#V1wp!iR?y%I=>UrK$O3*)#Se6YPVMt z#y0A-S|b#ZS`$TN)N9uobzv7z>B{Y`v7?I?FrQAFpqf}}TGgam@7L?iT5r^=w>of3 zc9LdeI7EUT*7%r%FUEM7rTp@z&Y)7E}?Bsu%L8y5mvxh)rs7zPwu0@8DMT=;C?~ zU0P|y#OlJt>d~?;Osp=;O>adqfXO?k+q>n9#b~)$&37!c#TKTNp~@l^AEeHT57vbb zlD7}+r>`R3)aZL*ZgRS+41D$oy&zXlAbT#0qZl)dem<>`|Vz> z-Hto$es9!oCPPdm_>Q=Mz1548&JdZfUu)!JYJmD)~sR<*;rKwgqn zGp^R#ad*f!bNWdSK`$P58!)q4U&P))+@X2(ZX;?nYb}^;j37U3HDYA*K`j~7+MRA( z?YHA3Y6cn89yKR{d_QVQQ_sP;$A z1RbE(u8okodng3`Q3tUZ!ftI)MWtwnm|N{4qV}i|dI3Eh8;$M6g>ehvGz0Y&5Tt+s}V=nA6-HEzHf2R#g5_0}Nn4`cjB=mE4E z*|!$VAO~X%`^yoiCrY;29`;)ujFpWF7NkiC1L(4pkXwy*4D8FnPcP?0|d@AWMoP$Qc-(&OY z54*{T4<0nxpnFNb-f7fOZkvq(tD#eEM!inlV7rd1onFGGh1^o>H`}A(fc*}79C1mf zmeiVVWh?I^?;o~nRSTU;^67=(qRD4@A*ebJ^Y)pqSu#;mt~x&8KEb`0C1akdT6Ri1AQ{a z2 zy-D(7@YLd=YgAaKF`m7bdeaD}G ziHvDQ9W?g(u-)hm=u-r+Ru#ciVjDUDJ4{`S2UrJMZm#Hgo4(t*QupRY7J=a@pk!x5&;8>Rk{jDy&-Kn<+J+zW~eSqO;#MH-j)@=^O`O=Q! zSZ&l0w0px&(rAl^raxqhz)wN9<|Ub|Oxq+7Rm%Osmlt!9NB_@$EL=q<*!|ZWps0Tf}lS za0p=x8nRP0>#(9Gmc1_KC6tS#iES!jUBj@F8aAaaHYn_FvQ9@0qAsdf-r8=2d3sMH zth+Qjr0v2Xl~T-*=0`$9#=G(93!zI#w;jPbd)?*$_FjddA}5V{)fhvhbbmjtHu_yg zEU9+f=&H4WDXkM#F*8;>Z4oa<{DZxuS*yX1n)F7s)oHVNbdm(ZEDHt%(?fEpk6O)s zoFHxV#57pPF;^cEic*z1fK9I6i8}41iCT-00*9uuEHM-@WU6kp+h}%cNgsKq+w4Tc z28^8*3jPVY|P^v+KrDL0+Sd3=rIWa#R3PO4#*@3I5)0W@qP%&|c=sSc1h z`^;;md#{05!-|fEwU~W%*oGm&P+G9-27Ssx=*q%pAO}e1$m~%I4$$q^YDf-bDK=`H z$k;Z-CEQF9PJ?XKBqavV8bcFe#616xlM+popmgFRX zf#G~ce8;ejxR3PEA0a!#vpO89L*A;jy7ghN+Q-CDN8qYsbAhE{MI!tRZ$pd;h7&C@ zb_pbU%t64B%HtioNX&G^>I?I z5SnEQQjv5#IZX(wj|cGcY7G$w$t97A%E+--Gqu@rSV#40FKXc9XtAVOc1TW5)(6~z z0b=|x@guAb&_t`XUWDrea}FA4zslB&jwrtUE`b3(wg~2aqrncx8qM>o9;-=Me4ojI zuLK^2cEk8}+I6BOQPSFMh74T27oje~1KAN^1fsH$geQC_-9bIBA$&BEIO>faLgE1X z7ZU}4&!CMXg+W8IL&JlajF2cA?3jHB2`22}J;CF`vS$kPB{;JcW5GfUM*?nkM%4k0 zmw}9G0|Fq>>6+DA6|olY1ha;~KNdeaD!MT9j0w=ga#-zl@i8?MIup^Qg<9Kg4=_Mg zhXYKK!w#k>)B?W1*u^vl1r2Do*gM-DW)yB8nVIcjyWZ+0HRNVYVk`~uyYz<%dIUB% zjC?hU7p;IG3`|+DmxKnvd0M?DoT!1UUc*k+C98M zIBq&EEQ@S9Z0o}wau%D^pj|`wa#NV6_cVo}-*5J_l@g-dJO+xsVpSG}(-v1fGqMb; zS2)3YQRrKcAdIatqgxE|3JoPrh$FA3ln99 zc6;p@{V`$n)Zll+<^Y*Um{E-x#P-r<-(^Q@!g?U=bsIhAcmsFe5STjgVGFF_USDjTyd-9kz=z6T2v@d4L@?#*c|(j~T#{=A)I^OkuE9 zOih@bW9BR7S)7R@2s2T7@$2#UFz$~J$LDWN&yrK3qH;7B!#J9#XufHDJXAsNe6ln_ z=p<7_UnV`~3|xvZem36rh$v}fT=w*8Kf-y5{Rp!wB95q}gczY**E(>sR$PUYb;CZ; zkBA;d#_iy=q|?~3M+l6~7+C@K!rtCR7sY7Z>PPUi1V<)zeXLClyp|YnI>@QGY#XBy z3?4aSz-ArQu&A`?SOl7pi0GtXX%5(UsDl`QhP_dOb{dUDP^b@v7^|^4(ccJS1O&6K z4Kd4$HZ2C~UO%ElEc(@MoFINxA;RoKxG-uiY?Cp)e#ua;|$08DN!pONaJ1Q}ou zeP{2oj9)NcXZpN@%Qpj*%rhVih4ck(38VqWrGwm#2$vwgBY}?E@TE=_e}%62>9gA% zw!+mBmc#As#SUl0c>OVrljv>rA}vZ^EL2*elf|pmM%;Jv^Nj{b5W|&tV~knE$W z)BIsf^ZxBCWqmKH)Y--UFgZS-e)OatRq?!xWFggiL(Hy7;Z5S+kp__Bnr${b-2L4~eZV%_ z>okS`py1(`8sRcR!WWUdJsPo`ShLMK@+5?vF0mT0sb&{zCh`h<7&}`P4V0x{Ll{sB zZJjV2NIa3c(>s8rn{)*sBqJyf19ORa-+!}c1rTcZ(DH}Qt`mYAMVGDbCmI@nEP z;z5v61{^bp2NBXa{-7Q^wJ65OC-6JWyn_KYI(APHHxjhifm(TQo(`_&lV^+7Dp`vs zdd@MT%Lzzypgy4z?4xMADBX=D9-_x$+5lb?eY+ob;UiIuEK9^koy;+BV|PND7GG2y zjl5f}67eF2!(8zA+vWMP%<9^wo#0vv46V^Jfm;Aj{|NMQt; zG%)y}3f2*==`e)9W&^H=$UVgViAe%NLQ@dv7>ZVcxC}~cb2&O zFIe~DHcCW-x1$9RRyt%7!S>l0*eZv_iq>kKVT52h>Q)C-Kt{iYz=+(0CflVJI3_3o zYahBU_6fETtmnd^5o+k%HX*GXzoN>hdpI6&ouZONQtwWeV2a+0n0>?m%G>BY=?G{fgK3fRcovR{T)?09X1lgEP9M=O4 z=*1&Ew!|W#%?@aFpEjUO460%vreSnC3MsNToh}`K+nSj-L~^5^qOHdga*F`YcvsPC zB(FA`33DC!61f(1gwT!-UuVj6hBaJ76o-I~ffL<{JrWb|2&YFv@hnozFx^p`AStXb zOejLDk{Z!XXk3gSO=!mu9y3W^PY&Oj4o;3valHaLk&}Cqb2&7^M=Z}D$+@+Yv$xdY zi6geCp;{(~gRy?#AGJa0H-t)JGFUdsPcSt!AKg4QWculC^)6iP80zEAd;uEgm3>s) z5n)X>51svydlMY)?i8Rl6CZFD&>qg#PjAwUyjRKTkbQ>A>dHSNc7RPwdCyF_8IY!sQl6LEP;pyrgw1ja*mURNJkZN4M>JE1A2&E6eD?`Q3*(?f}irr#8r~XV-*BF zA>A+{^>FcIcC(Tf=%?6NO*#4rulG`%&iYL#-n?2#?9OIQ7Z}nENT@RN{B$P!Kjehi zsDGF0R}Qb*bs>&aW`F+{h{$&KS#o>0*xT3f&ICFs!e#KL$?U{a1mf}~sSL(W0iaR; zO16yK&DA_?cmYY73L#6Dt4BC-^7PhT9f16)P5m=m1nS8`UNh4M^}Y*Pum zQDR96V#LdZ=MLKg2{B5+{iy)X;v^alus5`!z=nyq-;qO%Y*%86>Y$rr`)V3=Wua8)*N1iO5v8c6PxA`)Jg_Bv7M`s2A)2*s)q-eyw5|ZepPsurDBO zjN(KL9YfJ8usI`1pdX`S?Y0oKKa!$xd+`A1bYHIyt#Gg9g1u$seeT@$tip@lb(NVVz3Iw4g(ymx4{HN;mr zlG|exs#v<}L$DbqO`p#m4iC*)sN`4i$YwH(Zppr12F#nkS8|G%v#8kkg9UyflHs z21BVwa(Wye6^@-osMA&UF*xsk8lRny<*?;cNv6`_lMAxS4Ea$qnNW-A`CF%g1+7 zAoT;H1kn0TPsA7D@#qZH3bRs!Ee!)5YBoC9XcV1F zI4ryG{DhaW62v$)#WPIRXn8C9K?v5VClSh$@Lw(J~p}v;Jp}s~O>TAR0lP834b1-lH z^tH+9*w}nyqW3;N)zB_F#y9IZfs8_{AQ*PBovC-nP5T#zAIo;GWg3&g$tim{90E(pI6lnMc^D)lt8B23 zh$xDXsp1pOt3;VgxT1NLf3ziB8KcE`H(RbHl2lNfR?K9K5ZNlpMeuGE+;B&J?aJNJ}jPH&+szIB8rhm*^Z$NMi_Smu}8gHMyQqwz$6^d{#4G6l0vVQGkp1I?NJY`AHL@A9G6lC{pq zhh#E(^XL%G_wX=L_YPzSGu_1OA#87T9;b`*SZl<{%#UWAQdlqMhm#bB61E^jH3Q=S z=)zJZ>-ou(!_8Cse!eB1S1DW;a!B52C0EP651BAG?7LO<rd5@u}(V z^j*aM$<5<6Ghb($zF4S`VDKECXae&n(2RyZA)4Y*JUokr$$*U_Q6ifdObFXN6ON5}M;|TM zm;VSz>K?!{y*xO3>-7BO;aPn8h!f~YJg*}^pJm6wGNdWY!CnB6rP1vODC8E5k6*A) z46)4!3mc8|c?aT>YUK2gYf2KvIYJ=QyO5R1)c*1iBhv9yjl4(UNp3kRb8&{UJJE4x z8TKKPml2)hIDUKxcN1|;OJLcC>cN9EpYd&$GorFNWX=sxX9Ra%5-)zH7lONOWfGY! z&a^~?TnCeql}HPO&Wd4D(_?tSAuV1CuE zOuqhw2-!xM(YlMoGI{PPfQ52v$WeS=lnweD9gDUV56)Be%XJIF=H=RjY@!Q5v^HA6 zVMaNuVz*3jb=3*WPE;r6=P}vIuYMdKBZ`iP)4`)yij~HS`Zr)LKuB#SRAFrK(&^Z>eWtXox`S`aM@O^O~uYBeS)`i8MSp zK77l%_tkTJ{1(iBpG<1UoeszSGsY@HYnck;N3qrBAuGgYQ|i?#D)&P?4aHuEjLMSD zf_t&VdPT$Wqo3#MmRaK2)VcyNfH&WYUdY{h(`mHlzA+^XPdQAX`~*f>IAeRk#jRGp z?<%+OndfFNg30z|(~JGq0VwKnspfU7~4v#N##1Us}j!WuKl9x@MoHGL)xNsUEs!oArt*MM}z% zx>DeLGvGQxeC4`ECIZL@3GEq|o`}+js46}suZUvI)s#LeN+Ox*GK%rKbL5JhV!TSP z&Y+*cGYK4cjF$dvdA;-NrD~j_vnbz{d8EhxXq&?`<&8+>_*}onBrhzJtrls{ri#z6|9?xzNmu&l9*oi3R;lN}GIbES+H? zEU4EW%4tf+HJBvcn{k{Oh^&whLfR0(5Q?YG%R(hXAe>y?!O?S+HvbP9C~$`!nFjTS6=wSL;^$4dn$k(_rDS(zt#c7Ahn* zsw|}oArBXOd!%-wX@KZ;t8(T|mu~)*JoSur1$(bo(-o?K!eHBgA0w!%w^uNqa&-GO znMHHy(o4DYR%sTO4n|cnkliO%!407VnVrRsk>Qd+?wFP+r^XZV)slAGdP%# zo-OtqsoDi_8R{Z90fpbhJ~Mo*?vC8a!+6a&>=_lF84`Xqn@iSDm+Qq?Cz$NFa^)FF z%K_llHw)i%FUDQk`Pi6!urC&3rN&yE+MPVHrszG%1fi}ZX5mRt+{YfP37Y}II?P-b zs{$cmno3>Aq+cZ;E!a2@g9%Xa>vO)ix+bj<%L)7O+5n{ELV%Aw-CW-gez6#BH&;hH z(m%xBU}GG14m#dpXWdEk!CFyW&m<%Pa?e!G!JK%{ooA1unf^zrLim8H(wLAIk$~h~ zYUIBQUCeDK4(VPL<|!pPh@_1J$lK(2{WubSuI$}RVtwVINY!$4$s4mBAJuqFboym< zc^S!#U4v)baw=OkGitjetYVIZGcu7PYki_rAaWj4LseJEdKJszYL6s%DP83*aFO?T z{z7gtlSFBDggIns6{8d2tF2Alf4kB09jXcUJlUS!JVwSh@Zs%xcIDob$ic*ACt)kT z)P23nLd_nY3N1S}Ydj<*kT%+9>3$J}=vktFm8rpG7{Y|k86&v*fNmGFgzD;(8(d$L z+ci1A!)0=NR@ho~fNZ#C8pk`qOD^=TYyc@BzS(c|%?+-AoyMw}P>RhIrju|^os0TJ z4vp5Ewcf5Di|(Q)tp7?(a1tYqwzBk4=i`?Y*b*~Re+*z zxmoiGJA)F9=52O(P7>uRe!1OdGhhr`Zr)CSDU9k3W3^$^!ZTRmdWLY zlLo~!EO+%eh11Pu<)^h%t_%-9*{pA`{3OgK4k&mHvgOA&^QFF)rBJ4mpH+b_=%c*>lN)uisoe}MLdva^EAGlvA&-8hvVd|x-)xja4kTP}^K?7A zezug0o5Wtb^|LhAV;^KYAidhv$LcOD#z~`n+Qa3V%VTv4A8rR++QaUJNbX~W9!4cj zYc8n_P-^6STB9}kAUvSg8)7DXn4Qin#%sBX$j40|7oPje8D+Rm7%7fkGRgQ$)YKxzYjJya%mITNw#2s53`>Ji~I-S!IlN6Ggl zY}NIQm&DfDSXD*dSWLw??)lwa`K83jb=D#OD#XT9e>bV;!gqxJBDa;92EKhqYSBT% z-UDe6A8>cBLTUmB9ARNi=_a|w_m+qPM_5?TB0{-94VwJ;Yg(`=zZS~sec~J7$99K&d`jVK--)lrFhdHdxKUjJWYxXrQqh+C5LUYhk zhUO>=B{+w*8=jTl9Kw^#9L!cbC%ZX{Kr(YsJ9CS%R%&zPT4r;vlk}jegV~xCNNA2m z&(FIkJUd@HoMWA?5NC@m68SRaB9-V{tCd9OkS2E>=q8e)!xYJh4(UxNCkQ&ETV{Dw zC?UEOseI@_K6BI3p+gnRh7N5dLkFR3lDjHff!qO{ zIPM^pH#uS4VG2ZXhf{*Md(&dLd(FrK4sMIeklUsh$=s0#a=C+sQn>>cu;_GHG}6hP zDIz0}yWFIg)jpna%{v0St(W0FRw8++EmqryTo%5EOxrod1B;tMympSt%P8IAGBjq! z>P;()3$wEmB14teJ~9MeHC%gA&$X*LJ(wOJ}bnPhW6Vtz${OqD-;+17of^s%)H8)g=Oea?bmvJe^ zvc4RF;{-X3TH6Kg9#^VfzrJ6?p;Tttpy&3Crxrk8D5Ur&#paia9HTK%!muNDR@ScUJ z>^b68DJ`QgT4x#B_OGi?VKF%-SC*YtH_NczidWUr+GH7ZPE{-;^s-I&y*s*0$!tb# zE6dZ@w#sO1-{rNhvJ_6UDkCtORvFrsSfoRhrP1^4y`(7EA~!E=u@iV? z3+8N=v~+T335!+cELBc@%@XKYkcB#dQ4d)bZS>p%HO}7IbeT<3iqPy_f=-_6q1|b( zJDZ zPOM#7!cwNya+C_1tZugxaA6IouX!D=h#+zDTheLkD%-PjU-e6%ddE!5-q z8ql)1)C^yU5ka`lwV-+#Ld+ZZtPAMuq@AYj{cKD1=uXcsuXC8xiK54@oWL&A5;`@l zS@4f$^KCX0S4C|tD??ibT}-7L5wZX@+fS?*$83&P!k67P6i94UJb^t=q>H+fB(w~d zWf9i)jm6_PPjfXYYM0?1uSjk5bD10kDax0}-RTPJb+zF-hT+xbJ(Yt=uryUsDJo+3 zJ(Wc@>K1R5EW40BM zq?E`q50UQfqn!$oeBSewaw{Y(?^WHQ(kdj#b*==H&?;+MD3O&&Jim%tKPT8WpRA}G ztsH*|n^|*ulJ%b}&h_CjvC^XUs&B*R$jX~@cRH87kr`er%1W@5cAQ>00Y~+?YwFN%!c`1Q}C_Q-C}@%w%KxKUzAinK3KBL+0K5IH07Pbz7-?Q?eHb!O1cYIo}+lP zS%R1fh+s^wXUaCCXwoy+?OjA!^78WTPZX|4R_{Bv%mVpHMz$0;bTJl$XSf2Em+@l` z$&}IAF?dCCxrSDbRuJa1p1)GY_a^Xd`6h;Ae`)TJD62IS(~3A*k~F9cKiP5@%2(DV zmqVDq*L;esB1m&M(R}hm%b7bl_<=!8&UrlII0l&Y>QV z8!XP5+tA9?K?NI(=rvyPE9LnZ?>w-}%bzoD#*cR&B{JG;n8g@L(y9mf5ksDlva_lpgQK;yWZ()8(l zR4yj5IK%vmz9+-f}5EWGLKBxF?Zffhnq`y z`+6@f2@x=IC0K>bLpV)B#g-c@yXz(03(jk*^^mmQMe$H*H90b?<-qhsQOe_CzWxy; zq#t#UvsX`Vt#~siPnR;(JkD~HjN+XwN;mo*A~R3(g}90H=J~0+N6B?)v4h5Ua=mJr zAnGfh$YV>%JI`h^z0+~CGg$qrWIPE%Pw|#%Wxg8XTHy_bA~h?mjNBGihW8_xC(E=N zdO7(JDVVRRq$EKv1Q9*yH-+4$)j`GVditpAYij?=?&`pYlF@iD+}WP^TE# z#mv2|I=IF)p=?X;i=ghPyrt*yLA`m0lqn}H!Up?nn6PA@4T%ckg&F1{_XX{rZPMy$ zP9m3L+`@sb&X-&zi1y)8xLFdqyPP>XL#}zk5&TTk+pX4hkjsxkMNl2DQBH5t8VOzn zveJ`twWGSEq9jWc2K&mEa=kgi%=b5lGFQVI}lOh+}B1{qW79U;VAh2B9F}X;eAK~8h^YJ^ujHJ4kL(U`wggOsQ z6yCuQuv789 zd4l=MFt%cR5r52OVp(GjVTzyT5Q<&qphZLA!@{O9M`XhdR-Jh%O=Kl8`EHP#L2fFm zX{WV`+0z2N5=;~)Q5QnE49qZ@9gcg*A#Kj7rX!dFvsNF@#Dpk{DO;2|3@^F2pfE>4xD(4`jUo)xOo#uX&8r+3t;fYOw9 zStN6B-dYxIEu0hi+?6ZLV+^uvl*(c(o27*1M79E+Da;(m)tJ%jxw)uMy}MdiRY?7N zvJR1MU1Ku4o});M5yvHUShb)H$MEpQ4dhU}pNU7L$~G;$gGyaMvJ)RwkWsN7;LGzy z3h+xWP88^Hubj#+3Ofr1@>i%|P}D1@@{58wC{M+EY*tY+H2|1I)LaNEZ-nza!XG|8 zF!*O)$JFUp$4wNhEy~dpV6*0MY;D?+WZV%2Ndi%acuajyf<)n91@}wVEjru0R9{Vw zcf$==L!~p=a3;e-Wa+rc?H!xcE8j;-gOp${!M5rf7MZl_0tbnaVn=)8r*zpCBE{zK znVm%Ey}I_3``fY=u|#Tg)wW$-w5JDzeok6qRk!S#bOEX1y;cj;43UO8htYVa_FtT> z8-4Xwkla;?dWw_9-qYpktVco86rx@6?x^J(%k><2PUhZ@I15#MCM_D>Og_UKl%8v+ zHrZRBi)pWNx?HTEEoQ6zv)j@PY?rgE827UXRFrI0==Yq`-fHZRp|_@_?-WNA`7_gD zT-CvR-%6C_WPj_SwZ>ttR}hDZOPD=R5+Ln3sn75Az&_%tiG9gl6 zDf>`BEj3WgSAGHvB5N^18#8kBrnLg+n8adsHF?H8IYE}DlZY1LIxwZ4$gRx*i5+QY zz?`gS*BAr2CvsOpsr$($EX*xn;64*8OrUSY` zKcCL_&jNyUoA$m@8c>AGy@)*oIbCRi9f%|l;)ch_?%CW*vzvMu*5>cvJt9-M7AFb zyip1i5bF|NiS&q@ZI_5#VQC>NVKS);^MW!mB)R+Z?jSa2yyX)z0ad{PL;nIdvlfUb zfdRaigzgk#kjPsAY7r3~$7dK;Vb0lgR7m9IlrE+FDBWr*B(w{v5NYRvw_pnCa?7fa zDqUIXX}H`Hh01r8gU+%=PE*06m{8~DVtACOnhNWBM=ryrHIbXTXIEu(Iv1(Q-E_9n zmeVR0EQiwV?SA4Zb6Pr>IvE zWoQL_wBKJ(^l6>(oDYg<(``@-T|hors`!LA~l8aCI+XVG^?kSXX^OW5>$fP(`ib(6(L}&WB_)?1!J8hB-owE%~jfAJVdK7ZVyQmy@%n=2a0RJT@&`Ro( z+}@|?9s^3pWL%MF@*Sao#x=}73}(a+1|%8rBEZ?J8bo;t5%zLeCviC0BcKz-#Q}EQ znH~V-)^cg5ngfi_OOIG^b`lhzG{=>%1`y`Haz#igXQV*N-fu29A=VpEJ3>_^r$ET8n0$a-Up2 zb$0j1ZoblogXEY-t{`l#5?Jdd(jDY>f4_r7`c+(+-Y$O!weIOxqxA;Q)zv-(jq+p0 zPlr}`;JCTO7@&xX(AEfy^`wkO!I>68a=orj))M0{pK7te>$Wkbhr@6QeOga_ zGvs8gKk<@H#~$ah@Jv!Jf0-EWng%$Rz6s7INy)ss;BrVksK$Yk!&-noU?|6UT&@=7 z4vR<_ZjQoi)%5(ON zRzRiOcQ=hxxTuDjMHOUfR(??$S)}A5?|5E<~e1Ywwr~+A2Xi-ky$3xN^ z4Cqgv11K)30|iTHtbNB`9&NrFh1?@Px)mqpHtQf$J7VgL1M}C&=6<;WiTi98`_Fx} z1$bXJ5oP%v5~UOt);F{c@Y$}#dVW?^>wr+0wYEOI8vWT~z6o-*`+epDAoAsmj8g;L z-eMR+I<^j@=XU|Zt}bInuv@9~P>MRDzTuQk3^zbZ!*fMgu-(`~tQ9*lc@^zO?qg0KZqL|LL)Cd_R2s~0Yn>$nbwX*^T0>bL%`aLI0tx#d*{34W+ zP>!}WApDQBry-r2qxK<0`=!`ybVID+C#1JaYq)?Brpw2TzZSYN>PYaW;g>0y>s$Sq zq(BH(25-0U3U&o;5jQH%Vjj}l2_{O!WF~An#5>Us(^H7?Q-&Cq#$An3g6G%>(ct?M zEFHKl!(lfIQ|bOALQh>Q>$*d@ggfJ6M^atBlkZ$S!rb#L2h`;dvCG1D%y89PA&p^1 zW$5hAs3XASlgQb^WT2H)FQ0;RRj{Id0JL+0<5eE1B-ToD0Cq#7>`(#9j-zZV>N&t_ zna5a%)fVQLX6q2J4r(hqoQf6*@+zd3Z7xrm?J@szn66uNuZQ+&ykO#i$C%1fPMP-|Q7D7fue zj%B2FgLGHJm8QrJzI|6~JgA=Ks&W*CTLSp9s+Cz>1d=kF4{lf3NuK$pnX)js5I8qAT}NpgP*pDmkf1CXx$e$Y*v-ifrsb0<;% zMm_|)+7=UKJ^Ly|rno9bPh?TKhQoX8he=d~t&j5+7QJU-1(a5~9c_pv-UqKPYu8HAFMV+}0%M26WOW)uN z_Ifm{;A2<~@SgcadQ#cS4j1dEUKSpSLYw&Haw?aRjZJ(7Quc*%Dpl;=6cPeiLKeh~ z(f&+1p`Rg-m)6Lnnj$#i3Ugi0U>1S(n1*5p>h~o^4vy>N3w-W!DBm(l61cf8CnqP* z;Ad%O7H4^60ZCES?04|mO%`36TY1$=5|n^nC7vS@-@TY_9?yM5u+ zy?m0ECNbtt{k_S_^X0XQxtTp)q&?z|g#PfR9PG%WEd#Peg;cs7Uf7qqn!`#h|9|pCdE_7k>!hRI@|n-Vt5xEVn(doinB>KA~jREIe~Ov zLR$%+PG*DUb@Hr@^R9N9U)hT+xVGY1ym~5~_w35i+-GfLHs=$0%}xU&3dnr_&s~H$ z@#ZdKUqDCF-#_7=O4l4a!L#u2Oao$?oFE@^SYWX@c_NA^*WRs`yEG$hje7;cqSZ~Z zJM%6`qfg`AlkgsNLAC@??Dp=a8I-TWwiYDR^?8-l0S$vuRDxY|IP_%!u-b`yBn;7d zCQjDr2>O$T7(Tue<#2jX)O|6mo&M&XH?irKW8Vs}rHyp@$#(VSEvA=9-7$Q;QH#`J^pYJe*0+9ujYI1;c)s84rX1$x${~W}F{xrX zR_QVeuzDN1gTT6bLlXC)PK(y_hH>Mv!mT~Y>59~{Pxi_lSes@;_s}VGdWO=Oh0T$B z(Mr?}jV>=w>X8;J1?*Lb?hc8WR>)wD6ciUd)=*5bZsV|NNCk1qCJGS{Cx(CIj1_4E?q{>t1q=8Ct(R`P$9G~Ozirpu%tZp@W} z{IgeDpgspg+`4(UI=7>=>)Lr%RCKO<&T^Zh^`~&6wM>_fnZRY>HCBs79?7S2n09VP zrE^P#bgLGmB{*)tEJu+qAkhO>iq>@urp5G#$vkuS@wvjvwcnBiR)Eu0U@KB5_w*>c zT#J-3iJ>wYn6hsR@ph@co9@z;*JiwyYe?ktU-pB1GN3E;I*&uzITzTj%;!%Lg}L;> zm1Ie$7u!70&RHKP=Y6j>`c!9OqKxZImfT>qn5{3aU7@eiEph;8wivSs8myzCgqYLTxNzdV&#+B!5y%5uQpH9$a$Bsn|YZ6-NG{q@p$ph9xgu5myuRY zYtVU$w2U$e*Cob9CV9LU+OSh}jl?~kuZvmkjQ)_XPA%7A%Jee5_$iSoMI`>1tHe{n z;`kWA3j)_?+5{8knZrm(diqJq9NG;{RxD(GY`Ol$;e#D^a`RZ0A8||$ZI zL71WNWGcHws5=ESWLC~DuSQWScNbwMH`moljbt6N!E+~X+A=_LYDZ?pW6@nDL59ZG zNC#%BD+*kCi_?*1#W><42=@$e=|XVV9;A7Sq&P)u(FK|!9NOwM#aO-iNUUpAmbe(} z61$L&vh<|{{shzu)D8h7!_7w73|*1&6E^28*0!|}>5}RWE=yaC4VJIEGHUnCn->9E z_(h(?o6k!6*LUj6WBS<~H)ysK(vTfl!Pprbh2L>@e(JnPh|*KF0O56jBv+jfCiN%^u)cg+p3bRFAxV~Ng;?91Ov`;YTA0AAX?ofu zB$0k#v)57hAu71_$lfy?l4NCp5NnT?gixIRKWbFJMy1GZJM(q;x- z@BxFcP_-ySkW=^cfr<>$H;aa-(0U%?+!zXL4pF{F!AWQgsw??;M7o&toQ0_u;0g!J zn;Ahywi2FACu_G1=&cDvL?2_DLXuK}Q7g1MrGJ=9F>Tg*>tO-CM5*!G5aP|&l%a7! zJAT4cl4Tp9B0f$Fg9UI~8bQ!c#HPkI(bkS`3;{c$rzqAd=4)d;Jes||N$X_hhs7<| z9rN8*Y*Uu-c!&+wJGA__>k=&^v%wMyo)Hl}GChnJbIQ>bP#dMk#(FSA^!D%Z`M4E_avO|0fqR@GS~T-xgnxpEoi^&A*Gj zyzO_Tvb(qD@6S(tTP4p0vqB~cp=p=vajyoykmwn%rpTQg>b_;?cpVpmm;LROTXNwSuo5{VeYG6ANU z=&hEyFYfm{P;w4QRQZs^IUBijmvEwWy1&X$af7Vc6u8Ir8khc_`*@y;k44`{lh(rJ zliR0FKDKEm_vKVHTep2wsn6qk#TTT~V#2*igCTTdWx|ir66}_04b1xH z9o_4yLR|ZmQWsQb%E)bAYId9wmanx!a_LMNKvz%U!xG`=m2G?t5xNazK+Fhw!{~Gy9{0rHfi)td>m8C1MK@oKt=cUyR z+ZE1dbGYFiFW0;>a?O@sjaGbkH`jy)ouDDeK~uxj?=M9fP?p4ZF|hlHFvy+bX~mV6 z!(>c-mecU_(T=pd1MO-TBlBvnoaV-wmKKzrOkpzvkydO=@IAZ2Ux5W0M&W+gbY z64e#F84?jw*3zI1+-2)r9DGxFO*gp)Ne!JjEuPP}rAVDcmc*7|IE!B8CK7?qHqwKK z8?QJ^E_Kx(oRLtt3OD`zQmnmGz8e>0^dgcVUX2rjHrQl<_=5 zbWU3oDsxJDH`2M$22;{PlOG1C^=5s0#hpxUQrZ@%yD>btu5A|TsNE!&S?DFR0*=*W z(o0!N2z9rXl9_5en$5Q+pemD(9(peBWAjP95E-JZ>HHq@qS=53;dlGvHh10 z{e3BNv*w->l&Sh28r^3xmjOuBJzstahA`V%WpqWoR7PvNrwm`vFJ+{;4k;s4JyC|V z1*YC9!>u!&;pku+XNwyQAlw+6p-H!DT=SRDZ?2uhg#gY+E(txE-KHx}&-n3EEU=5= zjWQ&vTMJVPuV}~~H{ZY0_jgsI{^XRB7Hx#q6X4)xAeQI1>2kPsb8Eoio zD=GK=rLRJ(_mh&0ypePJN(pJm+)Ie; zIx0ci{_)sL31w~-mC#88%4UY?ZA7lUTxMTJ=6rG`MW}UJf-`HScxGzkU;ztbp=GA6 z@17x6Medt%6W({GA+gHID~Hn^BZ6!Z80p*GeeV*825}|UIb9tu_A-9V_Z^fUUzmnV zpi2k^Rb>YWsLBPYJgv@And|N^#l|nnNsvQv(77b{6j`1yXDF0QGekmjS$pe1=BVOo zCiKeD*hS~@F_H;smeNl1spalv1XheMqsvMw_^Nc=kE@haMw?0VI9CnqL9>P!mOLg-QG}6lFE*a(x&1JQ zHHmNrsry%F@%Hi=H&N+}-tbapbIUeB-+jgX2KhqSG)&oO$$Ysy?ejF^v4o&}{NV;8 zj(Ll(U|y0~z?6;5qP{$=o1d+MD}f~qGm>C9d$i3BtlMZ+B%1?UdS;w_OYjjq)Zuj5 zAz!y)`2CGfStp2+4Ut?_`6ce^AesbL2F{%G;ThZ%C*Dkab*;C^_CL)OF(l< z9riYOwzzzr&9$hHw5qDas4RJTtc0wyE&CPbL&SsyiMQa?dxqZa- zO3^kU-b+VdC!8ml26)}BGHiwqBZY;Dv0nP0@XW?5xmpyptd!WYfKq~jHkH!m+IJ_V z+SB^z8 z-HTFbNhXJMwF}cIy@xu7(1J44=nM})OuM-@o@>1?+Rb4+pWJYz zTiTsko`<2_AbPK6x0&`^mz+8|uP4? z_8?wAB*;hW2lyh^kSoQqgdD;Yuj2HBY}Fv=$V0(X`)`q>Tx+yVA)s~LDQFm%^@G(uDs#r2X0#vqQ zg#?nGM(1#JVj0RU34N?iuZqFdT$t?H^64`ig2aRe!)-c<1se&b)wT9J zVVzM0xxOeDOUly}m7pfP4lUFry+R3hr14#x=EQd#g4fmzi-SJNtH`P?3DFyx2V9yuc2VfLti1E)^^ zsdicI(}iSfnfp9Pj?&w)B$2YIsW71&r7YbW7$j?UkBvlhit+kle;Mugj8-|aER}qG z%TLAgR;e<@nP$;mwi%RUJf27LPr*nS3=4|LmKkqX?nzRx6fE352^@n1w9-=jq;i+T zmMJ1mU*A^LLSrrq*IviD4k9L_4}WAeoi4F$A{;uP(92jOx2Hl?v{=ujM#mezR!K81guPJ8 zG8yuyn(LhvWvVQc$;066d^4}wrej~WYrJC5%$w9*?nppyMeRgJ(1t`(!vEQXB1ME|mH#Shpq%nkz^PoCmxz;aq zkbY3})gzd_V+icSrAmDHjM=B_LRQ$__@#k%?yAfmaYw=o<05le_rr+D%$2-J(HxQ& z@rpMQ;i6~qBXF|-^&*S3{<|OoNE3p>+a;V8>cAb*#yf?Gp4eK{WTupbH4}@T;1)TSq&wg;5uCC41^x8ZP#8if`&O&E& zBc=qbV8#Vd^JvDOBo+&|4pTI*PKq@5W-!#mFsk;CcO^*O7rPze`&{3`lZeP;)7iV{ zGAPl7xkZTJ*jwph3VA%)qcBoEo;L`O+&ZV8A1?N4_Z4>wI=Z0On|;E$4)rWwy-*MO zd@B3b@bUP`@dBIfJmP8#!inbkFtdYBZiop}c&R%RP-esK*=B{PZVJ^?o%wLX+t)Fx$x$+P0g`Z4d69Z%V9g1TE!^QP$0?epfEUZvII_s8Emm*!>5|>E<#h^!McEg>;ue;vumxW$ zN0V!Z1!E9N*5XdJ$0}|uCT*F8jKk(Q@NS^a6)tD`0G}P&^UaO$d4|G1Js$5UPhi)4 zX;GGi1B}??6-I_j_rgw37;~o3CtU(V6Q(qW6-sNc1 zLYTaE*5#-!hUe#l*?PTUR&!=iuBOp-OgGd*v`Qx|h_8(lq*iD(4T|w%;xHXlnqDhi z+1#B=)e1AN)~puoh%Lv6kzeAi3v45bh+O+aO)wQoFO$flZ~GOlI#X)xS$UrO|$=_F3TC`7xYbTA)-b2NX(L za{1iMZhgXL?x(o}Evd!+fUz=3ZWq?9yyNuXv?K}2Ulp-Z%{4&Vhdll@Uu1wI< zc0@}*(_)Ou(Fh%x1XdRDz(OrM*>1(F$Yhc5nJXH=AkM_#W;;`fD7_&wsPdkPp4UH8HMD5kj=cvB+CJX(yV{Y`#o2T zU*3H*y2O&iFp2bDQJbrzI9V;^tSFjkrk;feNx?^KWXF1{uPd~9$>B_OXO`gM4OOa-i&BHal3)S@t5oZD?R{drQwXu4yj6#v4k#^ljBl)EFW&4HZp+akC zaUSc>@jQ01zTDm_)y$TmT5x&ozv?+;A(CMTkt9~iuvAMUb=Y@JBk}n@L~FkmqH^AD zIE!x~Iu+}Vc@Ve;OCK;^i1IeHeD`~}eFh5;hhdBn!55d+PAP)*fG~r|DvUj@5sNxFXOGlxq z3xztPVY9Qz0-#XpT1)u|A8VJ1(3hZes_T_p0*mc=f6fBUCM?6IB_c$dU?$d^D^~E~ znM}U{#TcEZ+C5(^%wFj-)a@uiO3Lh!mmp;+GHr)G&F9xrcUuS-da(#vTV7B~Awp7& zcYL>Mhz$*!uS7Cvv6Fq&FYaEV$->b~ri0aHx4=d!$1qRilh=fD`}y64m-Mhx45jda z**Zv91Q&V<&t^7anZZ(-Dv5rP_mHSsb69};AVj_NQ!<6JV4)r%=x$!JY>f8FV#dVK z=iZ~en2g0aQIe7b@7$WePg{_zU!{a$Ik7M)B}Qj@#!Zk4Oq)=a3jb zlT08=LBw3TTpOSot{W~}_JKmFWg0_e<*CEP?8PGIGs+OjSGvn+q((UO4p~48E;TeM z(I({9G} z79gYu^1>I866?SplX8eq<$`>?t+TV#EPg@#~ zC#)?c8Ys{kM`ISE`a)#@mn?>Rv2&)hI$ImMl*08_qOA>A2j!@p*huz1gEWFTBk32uqdDR7N1Q zG6mNCngi<&@Vxq_fj&f8Ouf8ihMI!(cBKkZeJ;u*C@HK2r3=*kXROpFf$g&tda+KQ zbvovizB%2c@gXK}d2CgBqwoS{rf!lBFM!hJA39wVi5qrk41tY z2!gwB`8WI;JXyY=Lw0&1qTj}W{rlmJF0WXor6TOU24qcp#JuuR zsew=>-YsBvw$;(&J~>i3Wk^DxO646=Ro;OtLYw0d)}w}$20Be{pu@C*o|3_+HPKdl z86GIWST!-x>j_7A(Tb7xe77tB)}sPkOAPi3MAiV{sCJaEf<@K}suinq!X)92y;7x5 zo9v$3;@knZh3g?iFygGhyX$@fmur{2LKk1PvNZtuSFF&yn7?HA{*}z^ieONgWzOI@ z5}11~I&z9Yp@)4eR-EPb8E-2Lm-j*Sbqh1h0@5kH-6r0OiH70}TP}^?nc$eIl5dCm z5F7FSFMRbY>N-zRwNLqEB-q;DIyAw?VqK%nRE$Gg{2*?A~@rck|ZA{0@QwO^7&?tl^+2jAnzG<1>n!KXUDp+!|IrlWW-Y` zJI~NbuE$#X8MReVDR|Q5phcY|6H+)@Ye##ALyD|(NG0nW$c!r49KznHAw||XO_p^I z(?Q{>!y}zh?xABi1nwoUzbog{)ee3pFOFKm@~$&RyY|zDiim2C*NAL1$D!7VOfiuX za(M@k;U_#Jh>}L^a5oKm6**#oZl##7YbO%%qt{stSDJ32kYvDW1s$T(i)?wK!w^fd zh&1jn1!;XeiN9J;q6TtT;eK|9q2yjgA*@ z#9{I0XHTQC4|G(MuH zqe~aXs>9!P`LG^myIKz%3%q4eO2?;w7~9&4RN&fE9DQWTVaHuRjfU^=gcUp{)(?eP zBHwKv3qW(b(~gda7Ar?sxHc_sQ|9K28)2cwGkH5vqzY&`28n$5j)N-Q;p4+XnU3G5 zJKQFpZ66beRbT0uBc0>k4BQzzW9FRAkGCsBj9mPgG-8yDCjCAE7wh z;1m~Q5yLJ_MOapH5Arlec2qUkJ40;2RR*%g?H75YHnu}`=47y{vRbcm6433d!jWx$ zbiRBSVyeqP1x1qpzwOucK8A!9QuS5FlO0Z>p~Z1q-~zX#A7=@v#P5GTLg^qe^ibF| zU2b#vpf89B?MN_>Xzx3Op`q1MX`XK3ij~qzX7iQCzM#}XWi1^+gGkqjNHPyj>u?tE z9rd{$xG1}xzPDgN(*#&=U6=LEy&v?J(D320T( zjDvP5r}))!oe7@g_#bO{24bknbbK&j^BIoVctUFbAT;kiBC&W zu4+mP@AT|t>E_>PPFc?(RoBvEuTX0hs~iM<+MIpjA7pEv)km?wIoo>hMDO2yDqk1R{0x)1 zgCEo33}HH-cY_p&S;YFR_#f{|;LknQ5Q6B8&S{3}g}>xbKkfl{gv)ct)+v1W*&m^S zWFT2k)Fn_w;gp|1A3?<=->f6EN(EaJN~PsJ_5XgcLmS!qDXE>tHxL@2B>$z(qDf{E z?Ek2-nhfl})>usv%g&H$$PYr!m-pC#Lx+dgIE}=DfJ5pSDAYFhgAZ3OM&;0KIUzlO zU1yZU_b8!ly}5)*Z&L=1aZ9w)UAl{b~3S{2}<_x89zR-!TcC3QC{#k`Cqc* zTL1gI|NZS&PC}qB8;15T4g4YzP#{w-*B?7{m*?ZWh^V!OY5nsU!*4f+x~Sdt(U-WC z!{rU;hH+jwobF<%8e^K{+uM2DI5VxUy{m7>DP=Pk*W|{usLkbK3|6&je2_M#gc$As z^=NpEz(9G}!N7xRJq%;CXsBbbt_L?8s@G$z?IkIW#z^5ff#PnVo5^QwAM1m?kHt_& z?2}GS$dpR#xQ?_n+KGx2!LOgvW`cgV?jv;Q^>Jad8J918q+fiDl;Fu6d!34lLkp+n zI2%sAp!**oNZzdD+|Zri^}l`?V`{I|F}_SBHT{k$a6RXKfFsTr8<&V36gb5b)UhS4Re4eewnArHq=@z6a4p_Q`HygZ?I?fLPG6u>H1xxA}1Lyo{Bqu+< z=`cg6F`C21+4=prQ({ly$Z$+RMOIus$0%Hqp+}2YJ!4lfCeugUeW1M0PaKblAu2ohqgB!; zW8Rk<`d04yVVY~C`7xP@!JBx3Y)qi#yh>*F?$iC415OIL9_@LW(?RR$^nbv61JP12 zeg>E`p@_j6Ac|}^kBC9c(=IZ4<|vh2%6uEK-3Eha)VO)#kA=I7w)S>u?Cr)*?zoWF z!Kv#=2LYK`u7izhlU zb#RyNc{46XH|}cg=;S=N5pB1>I~2-5h8)FFS;xj@neSSMi8WS-M+cwcH+Hc2s!s^q zqKz0AtM-jC9FB(E&y5kXhRGb1D3D_U%lQV92?o4g$`F!c*8JYu4P%_j`Y9|uKBjO! zBc||}yEK!Hi~Nijk9~{}Ov=b^)^Eehm|rD+#%S0GAeP2(s1Le|@Km9TW`wFfl6#&# zACHG7jkSH($v=lO0YU$8zLYo+T^j8=ww8`iaE{}9jvZdOnEAX~(1zMUstyg4E!;CZ zXpgGWX(5IMx3sEgP_Y*ca7_3&+PPs|rHyxt^^aERD}CCF0WZJf!AuwkX^7O{+=N@O z4$;qSSH9aHG&!fuS%C6ly8N<3Jetz|C)uc*FO2tk_gziu;`&=)q5!AAB!Pmh?oRkYWPIFi-pok*V%ps^bs@v-swR($I$-!$IDS0Y>T! zkK`GCvux;>@>|D+da~l6jIODH!d(#0k$%eAyCcXJUj?U!Ypex`DPine*rK7ifTNix zsh)|9t_RC4KL`;l1}a=!kipSoC~0pnO`J+M+R|vAok$$Ui2r4doBEwm?-N#@y*YdO zcm66X;`{Zpf;M7L7c7hVy1pafH~yy;pW_8j^sD?4r!)Bch%1arjCXWNw(4XEzXVLt zuoFGa3XRVrjr!0KEGzPT%4+WyK~IE@51ZND>0*YLpmx7Y;c5<}x(q3$AXXjz-0+d$ zuCD^)s+TxR$kC|oQvz@0Fpo@|Vpg9d(HD>pVnr=wbH5o`!W!YVQ^%Rh^_^5-QwX!G zNsK>yF!8aaG-0Iv*-i*kbP&X8c-;6Gf@Q+e>~wTeq`luBv1$6|G&v!k7GEO@K=^PQb({z@1XzS6el( ziqPP^StriNDOg5(moH_WKuPz=Nt!Jm_Bba^5qL?}7{KA0_y@6RQ-JiZ_71C z4@BpJ6Lu@V)ekX}>|*m2;4Ll#0E!J2uEyA9#X!RB(t-*-3|%b} z8?F|_?oc(CYuOdVj)wS<6{(9*!P`*Nq3R%Stp@`c0<;<}EoefEiS&BFdy-ac`8?3U zt>u9%jSCRt1Es9;MpQZ?Lchsy;0&6=u}D>4#0}`gkN@ctl2?Qu^%e@4I18*mi(ZFD`imfLY8t2_`*SETC=5orK+=k8q-MP)ab% zm&PqmzVQf1N}UooiZR}GTIYsi=Tz19LMZj(@^QL;;ZRX1N0Rhw1tqQQekCVqN{Tqx zV^lpUU=nq}y1*2&OX{q{0+ga%xKT%S*$(_?viwN@U>jak4P?XpGSk)6kg2s=hIT=ZGp0cF|_A7e!iT+h_=U-HTZBa+Jp`%>2XbxS4w`B z`(Za5I?|~>n6w(}kfrD%FrT6JTsThthAk1yUY2s-SkAqaS(Q8k=#giYSST;H)fOZv z({|>%M9FZhA*9z8#B;GNHH0*>hfiE`S`T$Szh21j6!S{YI3T*p0V*pzMS4HGaM-;? zSoU=A#Bg_5uuU+n$=+&BF0==Dnq1`TL5aW)5L+gE3bGjiNm)EZL4%KK- zOc%E;)s-`}vbEdCL7hp^e?HUhEs6MEw8dWIriWly^*)A8b{VB3i0;8yr+C97@{g%{ z6fRCup$*8rpwa&@*i`Jbd34!q5Gr00&k7))jH_TUlh0H^NE5BUp5Z(dvLZ2@#u*VA zaEaCPG?^DENh~e?JZo&gG94g>I_Rio9}Vf$WB3u~C48S$ks1OkV#3dHsI6O7&oLJr zkCMn(47;8El4j7m-qJ9QI*rw3K`lc9N#OFP{g}`8bKGu{v1d1(PISh3ihSYay{5Aa z7C1VNK+P-=;%(#w6+5Sek&d6f? z=Z@b{3UQ9BKpG{`d>SwVr;oim1$M-Evqe&5EA~`LVbzzZTp;Lvo=1SQRzS>kaR4h( zIQIw(1iW;K8tS@u=Es^6wEml7Wcl+H^?i`r|4|s-O;yBu@n#}X!yB51_cM6`%r4ys zJ$ESb<3D)k3;X5Wa0c@e90Uc5`O<;1YC@k$*`5)Ql<8`NR4=Eq`1DH|~qm**Um*V&YwqszpBHwi@H3q>{&a0qSaA(qurL=p#a|`4G$LGIHWm zHDjlS#|mlTalg-2&uV+~aZ8^b`X4RMRs-(*Z=={QqLkl7|1*Yg7tPl38b6&MqnrxR z8KV^*XEIO`SPPsB3k&kJ_Inj;}OsR?_F}LmN1k8!V<3fh~T`@?=6CrEQ?=K%+mGHSJ2-UN=-Q^CW7s331Z zacfSm!rZ;K|X5Yk{R#%C-HFJUohXW{16leAcroY|4_Tpw+ylOzJc9w22L?`g z(rt>2dwjRzWG!7*L$(#3HDNRYY*2BvdHMAGq<4ZuL_ieLcI!j&Ep+5}iT5TM#kI~o zhLRS~TCmVDc^4r$w3?k9Jp^+=O&(K^fT=dx1x@{}LL*$N(+I~;T6JsU$$TH|5}kae zNcfu*I1LY&@ACq{?4~RPOvY~=Z~WvUthPaxvbsGmaEZkT$9(T?@A_eR$9J=;d{elU zw~`ESxqV@x&3;;lt@O5wSm#uBxRB>j6IKG`yvDW1x6;ZeelxYMJK$dmlNB;0(Ew~Z zMFl~OiprBjR7M=NU)?L3_0(H#FECeAX+dZjDBDYSV|-B$6h*OXkRv6;rAVaR3nuWE zJ1iVcrzaGurMcK#%F73_esGoS60lUbog>5uraAl{^sLn6>C2o59P2#D!{K;Pe){ z*~l(S3Fqz|u1Tqr$CCfB{HBXBW6Fpi7YJ!|@Vdf*P;n=4B*J&*uXj8qx8K4K%eLw! z`107U%&!Ho=SRo@R0SUH6=U?RQEp}^j{r$6PJ@YI4CoBxktg(1#3 zZ-o(=hv|7y>ej-bL$x4gRsE~Qu($h|C$UMQHF9Sh{@h|)!Z1_ir1p}KFaBu*VGzC? zS8M7Li27B!=F>(%zea*N{}1dX#jbI=tPMPtAlts z2P46sqSiZqqSt8_jHR26{^XN{99Y^GR1i3fE5ow2zO+!C)jXzM%g+7l9+@NP11xm- zDCf@>147pg3{}m?c5swhYHm-sX_ES={$im#rN^p=<7MoN3ivh`R0S42bfiFc|Y7KPRm*1zjFOREq63-t4O)5w)Q+Q+XH)blnL;_$tvwKPDq0nB+ zh_ezz7+Ith0kNHOM$K`rpO%knvW!U#^Oz5?oz!SIIE;Adunh1XbC|A3@OZz`?rPxb zVw`%-yK^zZXn#8V5{$MRaZpBF415B9TM@#!z3V-Ur~;U?OVF8`;(3k!dh42wmE6bT zZ=6cP^si)QuLT2kek6W4+e_^RYLbCel7|94asW~RaAZ1Co#7eO~$ zgUi{VZb~%jZoU?&0-oj}3212NV3^;SLt3}9Yjs0L2zixB7H{ciCy@A87TxyV4YjmVg zF}9>pB*+C8AKWEbIO%$D($kylJ5EEE`s5zRY0fGib;0&4{$|r+xk?6_d+L^e zJsYyb((_wne0Ksg9A z2vi366?%TD^f7`Z#>@Q-;dwjM9~3N!!WN6;+K(P+Z4+#NJ?)5X3NRZ_xvThh`ODJ^)$%YDM8C$pgBs(?}oY$qbZ z?6i)qQKlEdl8}L>k1kiZ`BuU4_V0diCmD4JN0J4gyHg}PvFmX6^BF>(4;5Hx6qj(7 zjkM1Z0W3^v23B{Tl4R>sk|l<9EC_0dbdZ|xmvk|KG!IHFxjekC;MypNV}$j`_!e5z z@gUZ)kGDI$fn))HE^)8m$DX?99=2bxg6`qH^|GHW@SL$QAsu8O`azb~fN6VLOlfJ0 zAs;H+Eu1-ea4DBNv|a|$sar(Jv3_ZBEJZVoakEbAWNVx{v83@!dKo5GjtlK$081Ae z#v3eT-b(F0T!GqN?ew=-EXbsqfzxj-NfeS&WUt>K0ZaEMpbm`$@R}u%*DryhI}`_s--bE>t20o2xQ=hN-y$Co`X6R6!)&cQDcf~@4V zMdnrsXp@In=2E2qj~2F2ry9ue>CBM&i+4ETsVuy`eC(K~*)5{~c@sj{$v|~XXG7rj zlo9T#n_;fZatXZ_KY)x4=g$nh;SMtcn3sBPhC!aRpu9?F(q@Uss3P4ml*2El<2X(_ zs6uf?g>J`_au&}WUCx=%Ey~X3TX4?7erWNsq31cDKBATj^Y&-hS@A2*;8e=#1J3jx zFt#$@J}zEv>cXLVK3DXdf%-N9h6LpWw3y7#4}2}KRYpNZ*b!lddRwmNIG)KV2t8Nv^ zYs6NA(*dkbrO&-49Zjm_6I<9Z3OX!s@rOJstS@z3cX3{9Pc>`Gh4xS$of&c0_m8S_ zd-`1POv5P@wm`--8>4DXE^-t-Eiiz77{?*Wd!+y_9scz-j09Fl=J!C#5Ut zN|Ot2KAf^)kJ;V}zMRT*}ZL(O)quT2EE-s_$tU%xh5M|w2XRNxmpqMrS`dw19^7o`^r`hpzUgF6l*C5Oy zZdte;!qC~vA!4TAsU0?WOHltvaa4%j!AD+{X-(j2NDq&VpOjc5-QsD?}yn*`(cYGH0D zgmlmvhrK6d6e2Tauv;3GDGH@+IxxgeQ-EYrtE^IB!z-(5c6g1&uCv57`C_WXhA?l{ z67hw51II^g^;G*RDG#gO>+?RPi!;C3&|%a;?dzV32gqa?O5qr}QRgUQ665Q`h#&;r z2qU6P@2SJRX87Tr`cmqCH$T6N@>Nh>!?oxVul+r37X<}Fx@JJ9`EU3_Mph|S?URIVA#N{Hg z=yHgg_j`%LGRByU=n!}tCrbkXTstud6W4Ag2PV2st#Qh-{O5CKmWiClaVpjNMvOf3 zWK$$xs$PuD&$AcCw~79APV``LA6Jy4(90*rGNKVGw7DV!@SvTa%%UPYqv}I zk|1u9!Z~_eeAVP0p^gyQ0;6$^lK_|8#3+|&%;-Kd(Bd&7jvfCbg{~-*Xdq-rMSZ%( zjO650ePk~`Sy-C?QY~4HC#lS~dmq)J=aNg5!e??zkO$sE3Iog~mP zIf?cXI~&x=JUZTfB}Zq;ogRUy^FyXj*2TAdlLX$twAq`a)rP%=l69PJK_&htOVdrn zB)YRNn531(b`l%v%m$tcFVoeob^?>!dRu^3h>Nj)l8~DgeU2eZE*-p=dtA%H2}%g& zs(G~IgUZNk>x|@v;;afT4?hjTeO)LIy+}os?TQ#0?rNNB6@NXA<|Sl|G()6w~HZ*mV**8*6JCSLC43GlX-938Re z;ak;Ef}Te`pgrY1ewdx^5GVfoh|EW&c(Up%ZWEN#9q?))I-aYMa(i0d8V++!hfWPD zzeH@IXZVG&jcJ9$coFQ=eo*dC3W{#H8gaVXK@=Gk^* zv6$;N2c&Xnt5JeR)M6*EN2HfR2j`Z4x~<1@9m7p?gwJoU3RB=tOaA^D?=W0H4y#{i z$8?@)jLz5FoB8%~i)Hb!nQwlfM9pm~6;3bl4h2@vU+8)D7S|I-irt+?v3om*tCfeg z>=b+yIsNs{RtPwH7~uUu9igquaqNW5)`xgH-0B@5?nEv7r8crdUfAeXuOW<3_-!+M zVBYJ>U|i@LUd4tIb5JgQNzT_#1|NNxLfj^s{`=}B-r zU$bM;D*n>4>v!c-3b+7e&4HRw$Z4I#$P9M%Vpc`+D{zFNgu ziE-U-H!vV0A4#0bH~lrZeRO->sJL!7E&kZd)8+=&ZU*;jn>AhHDH*6*IFa{t3aywN z>nuJmx8ve_HLrwroCl0*Uiuh!@&26csGLj^x$vN#_ZqF-=i^oHH*xC{PWP&IC|f1F z&56(9+cwplITNuzlDCg<5EKPxS&iK4b)#$aDQ4j)U-aQ8+&JR~SnipR$flcfJYTRk z&EWemRf1FccY1RM#A}5=?m}Nagbi~ys(j1()eO_E)h^ZByrWNmhjiS6JgS2#1q@jL zAL=>oM?wZjfIHZa;m6VP@+xD&{M8(Ir(!=KoI7I9A&v&OtIJ9D-q~--GuKGO^k8th+&eZGh|!89;KWgJUs7ItuZiN#c4^3 zM;}hrG_t}Xj7M&r8zJ;Sual#wpsHc|B`Vc3ujFI|;a&D|@gqp{n28a8x&J?KA5RP&W16IXz!6p6 zFv)LBukR9&E3t9`+Jupc3OPPp%2HnMlpZeG>GYhO_Kwme&bEh3{lbP?Z@ohKMyhZK z#TG^m=Id&WM|6)WRj?dMO)&I}BHiK=qc~pa^N~}9KFUR?ITQ7XQc2cRxMG8Qi}J8x z`Y!d9Ia}f7F~q+q-z}!f80Dj3jB(-Qr?IjZPfRtZMT<>v9V8qBQ#i>vMwWTZnR&jM zLsa7(dr^52oS`&FOYjX@Lc~r&T=#VgQ?h9<#Hp(8Lo#{>dooHx(73~k-0nalh7p0GmiE05q&tzUs3qBJj#k%x&&)3MFu{73?a2? zH%0EnP2sao`Sr3?L+4h8u;AMasCuEo_{Vm)B@dYTVV+88iF|T(iM1IY81MLBE_R7a zLi~>@#J^SuFSm0f$k#=pqjfO7My02CRYos>r?7JP*vIJ z1i8D5<0&<@RU~dwUTzQJ}Z40V~7_jZFS&A=oMdz3{W_OR93TZ*{nP9X||PaPhnl_b3+Q<6@G z9UpECTYs)ra$!f~446a33$L1MRL6MCHA;*zRUeIoSsI?-coR0rRZx_OxV{(%LGVMN zRAueC$_g(_tw7jF<|vRwm0}x+7f)Y&34Meyn4vZkn8?(;)i}yJg%1Wcxa=Lr$gh$B zdmEb0v0wUDnsA3h$mgxz#|nDN7fjhUt(S4saM6-fP`}Gu0fXBZnw)H#k|iQ;E{mii zp!Ym|39AhP{FCO0*|0VbyL2-kYD4CDI=b8$2uyu%!~)ad96t!$hMEB18Be-`|AO29 z`3CWf)*s+E@SFbpf51q(M)+3D2)1t3ud3pCM8lEAUM<&6x${Yn=tFoKRV*YBW3_R4vOx%3uc;2TiPc?rTGRA-OF z{99Ni1O$_+KK~VLbX1jxh7!WAd1A;yJ+(_R}2;@rbF3!h>*T+P zM5s!)viJv6ADaPvmnZlzsEAAzA2(wX!(%8_ulNLub`853^pTt(Fn=35UDCXP*kvt2 z1mx`Fd+Xnbi7$O4gcUz7R+hsNdG8ZsSk=8gKr8WNiOEd5BEo1C!vtPscp#>9m`_g` zw(-u$7%#f0?HXqfg@JuC+a}uEB9a}BRDAO!Sk=<-4Np%*PIotxh!gf|L-qc{1ZC&> zh@f=sqUL=pM@88_HW7R)DyysRPcRAX?TrayEqs#rSdAw$sRrZQjwm>rEJjG#42_`n zp(o(Ac(8deqMcTwr*ib*B2w!|F`{8w%WiGjJy_&w>(nIO0K><6{Vr<&S_Y(S<3jNF`u+@R8bi1n^)qhE|+JHku&D z17+@l*#BM{#=A!(rPv2MLL~u@BG7j*>Tj>}Ho1gHekD_70eN$-TvQ3E{3}JhIae+U zveiR0|4LcCZ1MpxE@ZgT^c@UsPdi4WZ)_GToaI;)=E$9fT#3LO*!E-z7HK_`wV0}% zER`Y(C+9XabMV#{wb7FU&1ozN&X!2ng3ek8Os1|}L<|t-U=84$uwZux%xs)_w1o%g z3gB5TS_K~OeZ+5YjNfEt>yC?BXQ?Ptg{OzsQm5 zLT5_!&waNpEppou@^~;s5~Hb14*ueUWNpqhbM9n61ln zjRI^%^ivXb{6LH2p!ss&iQyXAqkgC~dNP8#27!K4mfuB3@o_)?4S`gHx$W;f45q;M zvhj!p^IMMkMo$F&NZ0yk92Yan$qf86LGhT5b@@vt~y68 zH4$cPWKE0qG=#0yEa*%`XWLKUbn#)kik+lEHX34sZS}W6_j+4O%bHtIvj&vqvBCw$ z&8jZx1EEIG5!hNwxV|VPp;4JDa*`x2)W}M@zyshFiGS%(MX%Sh?f!9dpk1O*sr}>` zyEN5`kOfpXmwsQXEZ-V`u1ofPi)!E&+^8y7G4lVgz%9wov%_OWQ1luGQ${Q|K1x?n z)YH8u9xC#_)>DyqTgM{4OE%eOvSLJH%uc-SG-bVXB|$*AWNsj9p5{a}=!bMisv(;=5Ppv%1oAqE!k$4oBm!o8{ zYK*CT(HLXA8`63(CerRZN}`gQgIfJStJXG40rZ>$qk2{}%^IqaV=4+)C`+Wu9GIjc zZ3q71xhXB1un=Rg%539o0?d0D2wHvJWb%F#v0ulY6;P*yH<5nC0~AZBTy+&|QG&@P z5lyQy8j_)PkU2tZ@hA9LT}7qy+=e{vU|^nO`xdb|E5xs449QVtN)tdPkw55C5w$k` zE>YrCrqXMaF`K%CKB2lu9}8*1bm>OZs!LU7mi#(j?ht7hkEmAt;6;jpqKZYIP`QQw zpq#!J)k9b0DQu~UK1wu2r(7rtj?;OiUDCoks}9_HgEM$GQzNrO2jf}bh#GrfiQM{D zYKCsDXl=s#wu2!%)UJmL_9$xu@gIl7_FAv{@l9)c-?>x3I9u899nT5d>UQ{mI4*od zs^UD^h1jUUUH)yf4E*{!<$FAz0|$S+uwo%#yID|GKGE2v@eYnqf#@rkQTA}RXYBFI zD_GRj#~?nsXUT^*mz(YWHA+1V8B<>9gR&e)@7H*Zr3|l+cpA#nPw6)|zwBiWXV@FA z?(bJlMwILSV@%N!)HVR49HVIJP8osSGMAD5;#nFx3PR}{TA(7qdW7Adb*(U6>357O zB;Sar+U4g&RiJC(%x*z)%g>531V|Jq4_;R^(J=oZ4>DIIjp|V0JVXpPMm1s-kvjB> zijGy6Zx6ll$KkQU`N!{|R8}&e7cR%Fs$5}SfPO4@lmol}XHA(toqr3wWC*9pr^uq; zp604sQ;cybX!l$b*f}1bAF48vzd8w2;Ql!PTqqv71Jj85RR-a61h0GHbL@EG0?pf- zRql2T$8o_*uNRI;Q-{QmIYREM^br#FE2TkNtB+8RR_r6Ry}Ej(tM+F{Q*2wlL&ie0 zD%w;<+-}ESA?L`|4N?56*vXgUe-+dgMEz4^ux*nKQ4KBOfn!5d5u|PH#~I(mmOVyA z;vZtPvz^MIgW7DnlF(z0;Cg{qvuE;NV=N~wn%Eh-Pr21Uk%{w3=kAx`KcQ#^0^H&^ zUpT}DAkxg__2=V3es8NHh-vRXDr~Zabl^B1r0GM5dT6Z3@+cCFC{r{7$GD2@+C9Sq zRLOv`AsQE1pGG<4^=1OWhc6mxWrH{{aIj*(BsLu&srf+~dzdJF5Rv+3O00S{gn3oE zT&;Om$_!|2#?;m2>JCaJkPYW`c48Q93iISs~ucz1m6G zSFD-Pi0OnTK4Ddf`!R^QIb+8L#VV(erMRRco`aL)_3k=vh>lQk50N)KMid-r_^y~yyOb9d>?3mBZ0BJQyP+nfY*$Wt zI29*)*QCniZIPp_4!%7)>5xc(zz#euK2khqc&~2l+S_5}wd`e2#gv_OhetI6J9vQ1 zy4x$oYcN_GI-FeJ>!5THb`Z|LW02`k>-zUL+Ft0t4$IVyt|9dLVXQ89c)8BgL3ulq zuG68?_8q5Tg?lwrQQTo_Q@@u-93whe!rZ5U`+5{PN_Pj}u~+pf(3-D%oYIS2a+glD zSoCL>03u}7oq2-BZF2t7!{^Nw&y-WkH6I83s+js0lRI%3zqaSfJsuNdCGu5*`$*-7Ump2?J&^y#9d$H^x~3`>hJS9Jlox}{R}MUOg%Q&nTVxf;^X z(bbHO=FGKobp`6h>UsOi*@|(pu3RocwwBXquK^s4@fd7P7lY1!)aYD_v(bjQX|bmF zIdwkJRV)Tq97~I~T2fRy{kxc2Q9TwT=NiGKvykY)hwXNUMNRLciW|sldB(NIhqee8 z?;4YH)|ki>(U&IhxP{0SU;>L?+fCtMj;(XqrgX0dLeU*~f=qi@tdO3NErjkg^t{hM zti*RKpTxWU_6++W2>Sh!5iEjvKAA(r(JqY%n<;d=%;K{5oX+#(!dMs4`>&V(RjS~d zfeIMauAt1U_LT}8A4`mt70SOb*C_d2VO4>$GXz-=bH%(4l_WuJxm?QFu6T8+xn_<@ z+a7z*N6pDNm#)1Iv5+2Bf)#`=7_i>sS4BPT7eAe+R|1YSOBl99fG0jqde)oO_r1L7RAc6zQMmDABv;8dB6!CU|<11=oXaPqu+84-+Kz4Zm1N&58I zpjQ&#?pQrr^i+{8oeghaNUI|H=WFMyaDbH7i}f`Q%SMMDI%WKn5=SU#8F36PJMJ%<8_8Z zx4|IPZ5>Q{_I3jQL^fzV#MnVhT-2JDZaW8KEEeLx;9!3gY z=s?^XoP-zB>9ubnL(F|z5Uw8~c?&bgxis&P^s45M_x{_zV(Jub(^Z?uFadrGpUbPN z=)$Q%9IJjq`g*ZVhGV>|+P%)XBKO8rKz=G2Oz&O}gFN2%JD&Ss2#pv;KHR1$Y9@ao zm?L6R-asvz;?gJaVN-2Bh`uz3ZprK#7E3b65!hmr+qY1m z!FYzYgJ?jqB#yItGsZ7WH2FElKkk3p6}kpFA2Vi{^&RYD@nv+UhltsT0a_v2LznkI z;ftbHVDR{P!1A@8!|AiI;-HHYyw}N-AdmBe*K@gcf1Gk#RqkRqe8!<`Q`KQt?-Jc) zBVF`85l_#N$t?Dw86g31hU2Nv}~& zb*=Is9bii+uBh91LfA1idT0U52VQ(<=&qpei5E%$tV_e}Nj)6u9MgUHO1`8Fp$F+A zT{E_p9m9#@*5)$(w}X?Z+kwZIh|Q{oPpLTvm0UtQEbo@9C4&7`-Pd@UVBT}FdJWY1)E2#$$EK zMO*En;%gbbjhT+a($@z5#%>HlTWTlAAhLIsBzEwI;KxzH?@_c6Gwbnm1@9HcCXS}P zW~s$|8)r)WVFukkSw3z&MmSP5r-*TwQmUSJP}qtcu=6ZPpNlQLzW)T3c=`1FbdHNf z!*F%ajzoCg)pB1LsY&+@ggrroY)5%_^62f~S2DhW?y$uK-5(;-9(K{)wstaVecqD0 zqQS@LmEb}E4kdh9S)H!o4dvcKSL+y=)#e1=!g%jeaQB5ozm3GZgQ$47`T2L84+MiF zavlunY?8oXIoT+~-7l+4R%lip$$lW8VbCdc1CVZIG{I4+(SuA10gvp}(B!=pZ zN`vSekqwcG&vJgZsWD>XDj>?!22>=?`LM>0Z@oY`sgi@}KQQ)chz_*mGtuf$g?zr* zzLeC8%Ivt_@H@K$x6{Sb6jn8XBLwa~QIo_I^p4i~fboc6(L4AS&#EF-oJ#$k@VE{J z`0Dwo)K@j!HeTYG&O$oC#)kNaEf07mB@n*|tpEwcF6S*-TR*)5r0jr6jjaugjd%zV zay&6&jww_kLpV8{;Gg2P^=Rx9kH&Wy!eaW(Zz<=6jkIL=r}#yBfF5q(B}90Pf~383 zAd5}Jg7h3EK2DgI7s%T&Cmq8u&~AY+m$8i8CWH7e?^XcsX^}a&W^MKBlC$yUk;bWaI-0CL35o}bhKH#mY{>^ zAgM0=1x>rpLj}^oP>}h)3nF-e!uv4^m}z34*%qC=Pspi|+zX>F-d`-yw&1+D&xsT? zI_yW_%2qwXI^*;q)WQ1vZbVz{-9A6Q>~ZH{HKKBksj99L>q8qjz-($>S8?`VFB*In zhu+IY-9~%KQ0R@bX^oy5&(H(+ZX!-hmmgZL?qD6ctlMH95V! zCBJKu4FpO(1hi|fpLh3s9SNfcTdZ=-9(>DS`?R6i7V-@5p_s|I=BQP8l`Q%IKhSM( z9noROZS9lAt&QTH*!R3|$-|ETH<;X&d2*E*)$x^$f}wjK#8{&DRc|Bh=B=P~5fCT3 za?^xQ!tX}3d9=S*V@&X|u|5TsyMtpS9*xB4iGfju2o3}B~(Qi13 z);d-r1!1rk%UMLEj^<2n9wsvQd6HHEE1BFd*AFjTFNVYWpYs93BrOd++W{R(&0rv> zVYmi1-z`hNP5HSJvd-{o z?TGXiXTT$%kNJ#)UQ*%-IpVpKxjE`HiA1Z3+d z?|Zs)=8B5-$2JA>J1SO93bhgiuE_Z&Pd1Ko8K}`dlFy*hV7n!j+J>Ua!@eJLiK*Cd z4@qQ_>C^D@fVFBd=1{7y2Cp$iDPxL4J5(%`=3YQ9$Ejh>Otf{&wNA7h)U~;)F<_$&*{{2HjRDH(A=93rC1PN>*y3F?6e7*)7R9Ty{f|G+$qx zCH!?m<~yY6YV>kN*zAT|^r2W;AQhl);rWo#GJs@?2_8luW@u<2>moRl42%lEaRL7V z>BR~`+0sRP>rs=9H(l=vM7ShbG90Hq&wU(R^#qbJ~lFk%i&c1NrF85RfzZiz_?i9M!&uk8m);UPw%0XwODU! z7a3W#*QfIKv6X=M{Co$q{bL%H6`EG8F-e+DvP0Ad$N00nDJsnbYn*K*=H4SktZ-e+ z6uB2&h=|QF`c3!JYEBKHp2u;(@f^0v;Fho&tesfHynb?1vPS7(?jTZcFuU|foi$N( zuz8m5%LiQD;asE%z*I66<5Ve^#S(<7@=}I7&^@DoHigFICpi zRH+c&HH8%k?O)=3HO+;ccnihQEbuX8yehuuXmVYTB3U&AGDF*X*v3q+5;n+utXHGz zgS;9S-;k?Bjbg`0b13d3L1~_MoVbIGQ=ZjO5wOQ_xY5OViIIWqM?eqhuuq=E+mhSRl&t~Q z5|o+qtL8k0zo$=*)MAdeqx`pg39k}Nz4tT>BUFK(4VqQ#BOPFez4&`v?ckS{^QS0; zvP7odMI-lkp*$L&MW-x4Yzgn6a~tUDTTtr=h@`o)`tDVRM<6rjK83e(?Cq4-lVIo* z9cnhN=5QzmikE&8=o9;Fh3g>+2ES<-q!>mCw?QKFMKaF|Hv$TJJ^V;1ei}GkCCI*z zo-VK-R{n@bjv*)PIM}}@0lDEx0K7tulcIJV z!uS@P1Zv|}v!F3kt6<`+m9OnP82BrU(_DdR+fI*|QT@2TZMm3_f)!8EQbUIIeD|`= z<>nDo&eevCt4!Ku4rAI7B4lo743Jl}*ye7u? z9(dr04X5Nke)Vi3(}muvmZrL=w~$fVtiM7d|K>WL(LW-#c(e7MYtX07 zazB7y>dId8kI_$e{jprGa_KT^7oYTz!_v^GFLtyzzc?(1G0sPChorKVcJLkZzi1ec zS7MlKN~B667IT=|p4VdhJx1;=bR!^D1@oGbMh^?wc9a%r$H$zp8Itkl=IFC(M8O%Q zBZ+hQ0ny`5A#?#OO!VFh#y-8aj-Yt)nKqu9Bz!sWXasbdbx~pXsSr%S)))-gEj+;v zh#>jElT;0{SZWb`MyinU@upq9#;G@2@vhJsOEm-&&0_fQ8qX;e-^rz#*sEEqPZ;0I z9BfMozL@*jkOq^~UY82th3Z1xsm?9F+~$Xh<3cz+*Sh5FOn$(qC)T}hbhS@qTTdS& z34?PCdx@EdbF}BgC?+fJ`r^%T6PUX{Hi!G=&qUX2ERM~;y``1sFYDRUa$b{nfht$f zUbrJ}etgE_S7)m6(4J~^uadgO;nx$v7E4(@By4W$ad2rxsBD4WU=Rw(y!fdKXM(^3cRbI8G?RFN@8 zo6Ebv6qdbaT|YwZExuDWEo^m&Z#CVtW4WS#P0!-FU(2~y6LwciH(i4sb@3C{9h`SX z9JhYhAT(_>Z;D*S^4n;6BLBRFVtj?wj*%@)sJ~tc8!(jxTdKHCg4Ku0Anxdvip!P@ zgRyuZ+q01#j@6rP{UcXK@B|E#sw2xNEXtrc^2lt^=AF@w0SOs z-U12CmEc<278=ws$T$VH;Rr{#QU#&`qy%dM$IcF$kD_rG;MdBB0v(apy5f!>SOl$VT#r} zU<%)9`4s7>$y0>V)+wY848u+ld9BK!qzUb&CxQ;r?!u63Ahx)$eM=d%oi-qvo6`rA)5a#97?9fc ztc4K|YH~58!iswEmvnUX&j3=G7KHUsD@T~F3#C7BCB@d1sK3NSYw1#a;0C1h1mMIc!Ed=&jd1`+D?$PGi-t^hSda~Ga1^UJQqn;vl|}7f=$AlVJpeJq*N&YIDbMfiWxdfg;?+DqOQw@Yk)> zfk!rP+$U7voMwG;8cm2|?bRz`MSbBVp7G9@>y$&k?k%=W>0KF_RfovpgDSZat`U*Tn;5)7m8o0jGKgMx|I8HHMFI zQ4LuAW-ElRbi^#j(~;xv2x;@dcYz7o8b>ggcJLh|Mj z=bMa9Qoe2NztbZ~uD`Z(r_PV}bN+^{!Wn%=qO8#%$4KZ?*g`VGEBxIvBU#otRi%O9 zy9RUchKe!5TBdk`!Fo~S7UL|u<<>Spqq@Q!bzCUcVJjPoW7P}A(|dxz$KcrG1XAdC zMDyWE)M6qt!6+MQ;E(;_k@0dBFmm@p2EctJCpo}M&>s1Ay3k_1i}%L`JZl;j^@f1L zkfa0fwZ)E(A)vv)B*`(Jl6ZqYrRdwe)sZt>;oveDgi0k|xdDbo8V@*%8eao;bN_S| zoNe`IM9@44I0QPu;eV+gEXFj(b&wMXWjWi;A3J$iS{KD!(=U`9$s`Y&=rz*`Dt*yp z3W;u`D{J(le>lhsoQbY@Pd{)vv>=a?QQO1AyxU~TX$_-KU)f5(Z0C5=E=rx|#ig7+ z%RCt|AA!gf?FdWG6opIrNy3ru&8>PpOQe;SYp;(~O3TKhC7*8GkxaQlE^_Vp#Fl@r zIvAG{E9VbHs=(B0vrJd%m5kL##3MR z^)mufYX@K8$*xwDrwi~qd1UwmXth&Vn%$s#RY*$839%dNJGt&F4*dA-k3Zx!hE(Hb=yR#bswMQ{74F_d3y44v)M6^dZ2^Rt9L z^9qs26mDzR>YSFNKxx(e-r5q6;cqy!yf2;QI9IKX zkic~l!s^FncX*u6-=oP7eT%|h0dS|BMjTA&MFq#nJuZr_#zkSTg=qYU&ljCv>@6cy z+rBOV^JA)wa2QEbs1P}N*G8qz+0%jxB3iutn*+|NG_G1d`hCWi2v2#Qx*1P>NB13A3YJ!d%lk|3}T5q=jjJf@> z!4YvCfHsJviz{NT3R{bLm@$=gu^dI6DgcK{1vo#%sB7dF{(su7qJ&E#*7Z9v;-L3eyl=!xMXJSOR z#@bS6)J+O|x`OX31DW&y&hFO3fl=KnN^??24N?^7ih^tJRLtFq5LWTeyhn=|yA^z8 z;m<0dR_BtA_~o-h*Y8Bts7QP?R(Iwrip#C}#8pr_KVf1odN-wTgXCs|odOQesyuoo zQGuGypqaD6kBwRtx;8LXsCrgcsBP{eiZEb*>bSOfVJQ&WFYG39XY^^tPmh=1hLfjT z4xW?6o&3Sw$kjrAk=+;E*#M5b>?fgr&UWi7L^2Yb8hk8q;Di(K0@M6}!6ykE9LMj) za4)bYyt0lN<#>f*Hmu~=e4~F?be9wen<_t^_rp$pVDUM~4?UOGpIZgdq_q1kAQ&~| zFBCA1(1lVp6ppAc0XCTQo0BFw)dG6deGEH_>(sTZQ@woCSmr%PdwaQhaMGX33!+WM z*_bY3+Ym;2&%rTB&oBbZ#RlO}`6kHu9W9A65_)jffbc&M5ejh|7DDVmgnt|GfL;Oq zISk(xvls4Lc90Fhxd$hcYuKGSoxi;tI9wH9X)IHISC~IJ3|RWj2FhR976aUL(*%{g zb+DN&=r|!+IZ{VJ7IVsQP1ldl2ShnuSLA(+bPPIOrFK+{-vN&hYGI@iBUYfBS{LNg z@<9V377%miky|4{G8l#vM4yF)14k;u z3DzqADfi(7$m+myF2C80{u?9jj+xLR`g5#!F=qb_CxP!JCgVwLYN z5(Si-t?2DjEXW@vJuj}83vjXU!4TQF7g`GXKhIW`kMtX$(9w|^sgJX714Qz>9sV9Z zZ5R(1G@qCF?-zo_du@NC4t`P}5MQnjm*)ciD-798$;=-T9aB#MOfm@f>OsheZnU5{ZCrk)(;IT6(Y_b z@mbN=kze{MrPZ$_&fyn0l&#m~B2+fca z(upB)1&=D*y+Lwh_E1&{*tzD)gpGR1x3f*-8MjN$sU&05lq z_r+j@BNxQ3;hUdb9KW%8sRaK9L~}j1O){|(B^jrJvEi6K*^o?B962eOeA*JUI(13# zz39PGuW(b0uK9!=pCmBnC0;Z03dg4rVF&vA9$HM9bXGQ!3_Ff=NGP?9f%M0qX$aAZ?Hr zD!>{jIjMrw$-)krL_XcZz)bzNlks}M@;`w)Od)W1w8KWC!)`HdO`2P}M6lm;#ai49~)5eE~RmS{H{BTZx)6>Jz;!15I&?BQ2P z$i?=quTYZN+bA!FLsWtMBW!szv4*(yx`u9H+>?0tl1u7|qXX>KDb%GhC5e5(cM~Im zhDjQa76o-|6R)6%it5XSO*xVACAEWRO{4NTdAWy233o_Q3#c0hs?!3%dXH5rbl@PO zSr#XDBV1sXwDvqNIrXI2;}~ivr`fZ(-L1o(L{aLrERF(&&T} z9(z_y6M0`oC@IQXnDkCnKK0#);EY{0G-a8E0%I?2t$!0R9 z$<3#0)T;s{`B=g4EliZ;QmI2{q|IKQWf16GWKj!ck>ZkJuN?>}fyK8aYSMuC@$Y1L zmf(5bC|#@?+6z3WpfUEGjAc+{LI%Q#r9logt!tn%&(Q+NK7Id6s&@XP4bw9 zb@DxhX!O^eei)7i|Bb4vgPjAO*Gp_nJO%SN#;B)M3aewPaE;vPRS|jgO2wP^YAWoF9@6~d}oj(DD8TRl|D~`FSiV3Pf<}})x z&o1RkRK}CDIe#6cnh=leQP`kJHY8>F^)#y{ z+XKV%Yvl9;w+n_Nt&P`2T|;!MRl}GMPhMSOF4R;-ktCM~ zN{s|ET_8cADdg<>m{wFUCB1?o0TTQI>bV!L-{RUJI<-6{E3qf|(W$1bG%t8?Ls zv)-$S52nyU54b?~#B%`_#JnwR-q5hGu}$_YDmf&#H{-+dj!sf!_7&J2IAh-mS6d2_Y*YEFHklQ2{Qn8(>LJp#JBP**(|2_-- zdnw}?YY>kAX;kLeK5)tPXy@b|89U(grBhK}{nHuu_EU}+;>fZp%|@dg(NY1HMR>dOX1sz3LO zm93_DJGr8sLP=w`K}s%HYjc#6PgYV{m4p4@*+$9r5-u;2V%1AZs=dI$RYqe(762*u zZ41O3pCFN46(|hwXKbQTwrWu&O>VfzE^6=P8HTP`(0`M;|Gt3r?9LNX54($z@^PKm zEom+>;IajzBAw=TZp3G^t<(TJY&U}A%*b%!XAwZns zg-yLdU2kTvE_0XOAj}lpK&kv%r5nu1q}AYE+TeRLEV<~z4GEGsj50MAS`d~XS>zfr z>}?td)EsErXk!B(>HTze<2lgfXN*{y5!wuQP=#U5X~5vG9$79_RPZ)b*Gq2A`zSbh z4mhEww@3A5PItSR+%#_Cwg%E~S3Y667brykp$VpmjFhWm9Cy=oMsSKSUlzDIo+LPOCb*xBgh5` zQn5JGgJ-co$;_!`4a4?o9?PzX;TpmWUxx3SZ#7W^5?=>+f5^(FpGqFOhkGszuw`AB zB4fFTim;o;P!{cCEJz7tw*-KBE5KdGlH9C8)<;P@2p(y{3>b6D!YB7Iq+u>Uq3o(! zg0=;{9c`@e>ae_jnNVbPJ{)HA$DkJOhYEzIVu_(Vt*HJTk2wSYH1RtsNK@cuXRo;i zn*E|@WnJ|7^V2qHrGi)-0>I2%F9Sdd-9`pTJDw5N0u)sWNYo-A7v(fbM#FWJwgoBZ zr7F5)28`v1aUvk3sv)G&FOS2*if#;zdbgz7fhoUm)%)WuEfzjrE6-q3bNS3L*0hC@ z?%dwR;qa9)S^=bn$tn~L;_>3bhxTHzf@Salo}mS#T^H$WS_JNo%D+zw{NI-PLxeeMF zJ!GM8QCeK=mb8fx;5I5P1UqiNTMt2l=!lOkiHZxDF1HCQ!F-h04Hqu8@>^Ccvkl|{ zMdMnwl#P1YFN_EUnZ$wH`tXS0rP{D_8*pfph6be-h`^d`8mk?0EU%v8lIM@MXm}Sc z=vk$8!D*s8T4_?Q?&H8*30O`I;diDZCgPpJrM0jj>}sw;Toyzfx*f1{z!HGqP_hyg z+6qX@SbUTwC5inqJW%&TTcSNGWq*gcVb6tNI8l3D0(b@9KjG9a^0B6$p~(dRzC24k zXB7~;q5;94lqtx!M1$qd9%cg!zQPgiozI#SZY7DHbPTyblitzQH43f)8S9O4YNq+h zZcejl*!#!&Q@Xo`I@sKVGcn`0Kl*Fwm+=mVa=?s&l_eq_VPPBInT_4;8^I=5my( zrjTtwm@|1|N#%1|@N!(3p&ax&fisi>NW?EJzj%orXSF6Ip+99h=B7@SVJt^W%e{g9hG7o)1Pq4zfYBG&?P)vE726Ap_(DuUR~=7CJVuGr*CRA?}c}pHDdV!oHZ- zN({nuNoj69gDlVsEXOPZtH0R4l?o391s71b)9W++ z>S{ASBXJ_ucANA(x)hw&ttUN^vq} zdgU}36^%vEDTy~cOqV%1V&uYtW%5yfaZTX1BirEQbDa-+xmhao?EMPhfo_z^d)%^> z%h^BnoS3ByJAm^-3W7VZ8py^2-U=J za&@_$M&ky_O9!uSwM7uP!dKoHxm0JPtxz^^4CNP%%FSSZ;K#{d z&pykDh8dxyz{RW-TDfp3__9P}FLcx!CQB+v7LjamF%DYTb!D;>GIX~a>?BQA++x|+ zgifpFvr~F-u0v=f`BMXrR$Vtz*gAA0nubpp0E$PbO#gDDyg}sA88i50J%5C6 zr`fsx3GoNSopM2n#;^v z+=UcQetL^c)AYBrIhw&F6JOQq$^7y(I15!n*9Flh*%KPtRLQfU%S4US=rC>e9Q zs-ZlKVGEO=k0=*th-x#}q-uT{B9b@*-l~!2LwN{-%z_OANQ;zKnxlw9u zTtvd|kjLfXdI)8)7#?opbnNW&)v_zxN2OW@4v&2DRPN1ND5qcwY-Z{V4sF( zsKG1rf!yWU#{RnF0tE-nfMWB6;PB57WFY*3i|^d1Xrl!8&=>~cUTTFh6?0Hu7&*0gHc3P`&JOz z1Bj-zT)>uG;NoCG`)2`pt7xaNo#7anLJQ$RR5hWFsUUyLNp(TXexpK(|63vODnKFC zqn=zpKiA&d_qf@VjAqDI;akAyTS!!~g3Fk)!_Pv%{zhfLL({~wX)$gjYysaC^MM{? ztkAf5gy;MF0{(q9dq_#008%)t{)qC`VR4vKooqcK+Bns{1W3bv$(6YZiPQ!=oy zP&EVzB30QTLNbp`aMPTN-xH!A!(fi}3}@q>eD_k?fwSCaHe51mf~9G_9a*P|XUz+? zq@tz;DechYIqtcp;xzGot$*LDjigUc`xt8fS8}qVe?2$XTFreSPKw`g;Sy3FjONWyxbGw5LQP4J_`#nh`+JZ7|s>tQCmPqM2ft-Cx}Y zFP=~mQ9+a6}Qwss1lT= zl_oUEI>Ux*`hYFe4~-+P08{|V=*2V6CO1aII`dIW98V$kh?241E$p$O@q8L+q|TRN z%$L*5hr&vRNDw0i@qi%SfYO!izoyLqnb&kh%*UV&B71I(4~u|cR@zO;!tt!B3w7Gn z1P8YMVn*~xN$8-`bQxrt#*s1D=fMDe)agK(LSe+^3T#;araq3Ps7uUhxi?m-*ML|d`N$pknR;Mq zUYx0~tq++88>O8k+1)8g>=hIYx>F@EsXAb|)wGmRrIed6d~fJqb-67Jqr0Mkq$<6E zabNl&5>Z?QF}X)|VW&3_u`!#eYa+HYeV@gX`4obMe4)}MPFuKtQ7X~_-!YVZ5Xn~1 zJwi0!1-8iUiR$A+F|yyPL9Z=mPn+K^JqM=;HLn?t4YI?$GJlQJ;@fXnO@F)08+=sN zng1G-v@Tx{hu?G({~D{wmVx1~aq6{f#AItTSljt@`&|~oN(3s1g!=1g_S302q-+(2 zeEc@ND1syBaG<(pIvF?OH8!^UUr1-?MDyJ~TyS62%Ux2jz82)lS!LFg?9k2)*7oCqAYqa`ccuRE9b@QUk!BDq{)wQ z*r4oxL`3#?1GeZ|_FtLu+$FE9bEwMWSokA80~}_}Qt&_j8$hRb0)uYIVPoXiTZtNi zMT-#jVGUtL`Kq6y_(S8M2~2x#{x}4MFbf<6e0~{Fc(gF`Fpmw{V?^dJ@Xx3r<{yo5 z2L~#~PKaXr7_yf52*Fcqwk(YeA^IKVZm=mS;%r62FjgN32no27?e{I!9=b(=u?wLi zSFoqsyC}!R$HlObpaoGAEA8eH$G-@VyIBba3T#elmFb`w`Fz3jh{b~7Mv<#%1vK{> zHr+I#;u-S}Z);!!EORsl!F%~{TWn_$?tPkAIX!`mLg+9@ap>_=9MVOhFswsv9 zcQ;Ya1d4@$G|2q7z?U?^qrNd}9LtKwIpYYcm2z5g@>du{a7$Smy|}u8#8JP_lQX!H z?l7a`r04BhSXrrQEc%UyzYiAi**!*27+@fA0 z*ALGNkR$ZyY{y^XQ}P|hD@@$O>l+p_oQz=fAYqKAPEo)jX0vaI?ZFkGK3 z@Q;m!QGAWIz&8}`<7b$8*KEFO;q-(CwM+>b+ggmWYs(qN*)|G9WbeH zer(R6Lm&QuL2w3dTchrPUyq5^4vy#H zmobxQbObRi=KwbwPqOFun_C~Em-~y=<_-~5ct3*XQkcRHB>|JZf$xcvexXMj7nf(8 zfRtxo*`L}$NAT`|EsVabQJA_ItAN8d))KI6S|FV0a!)T2kx~_ZZuUW*IoEcptbE@HSs@Q34j7&SygIFmBLPJkVE95C@`7iO_8Z!)|0Dx`JWoQVOP zch|1%xfS_zW9V$LfWeA81F=*2Fs+SNlD7eABO4&=!IR_$%u&+;Ljl{t9YalRvImv+ ze_L+lE>b|qmHx!nI2`i|e&AO3$H4!oI}j{R`G=1K)&rYtXS>aQfBx?3#~SBHkIOBp zg*jqKx6_QVGRVz}GsfDqHf#THrf`z0c1i2>FQ4NNxbN~dJ0~%xE!5xy*>%lXuGlqR3~88e&Q!t(gqZ!74sMN1ADrJqLL|c-jUtRuKwFyo;bYZOFD@ zd91=|E}#!RZ6MwC5EXi>{%E^A)DwI&_6zYEZSCLw75Ar@#KI>wCun<5xYa2z-glBt zvNW&2SLYJjh6I}=uV?C<65%+XXNxYbK(G~QE-@)HrP0*p49wq%8@V5j0OFV@l` zf@Y7-(S(+=S)&*bYJ666M zc$7%pEX_5OK50CKLDhI!G)Q=?B8OxF`2+(WW(mALga>Pl6;%%l6vTnpfJh~w-j)(` zz0i$-r2HFg7N-{bO_p>!1LV-c&N5JFe%%y=9`HNWh7bk7vKz=90F0YKsRU}h@cntZ zXmeFzDCzPZB;tn~e2}ak!!!&!>jiOBep)hh;va(p+0YM&@BR*&A)b$2biRTeKN=UP zlkI1!3CJ-nx}%Q}pBeT~MwX2)g_U9Vf?K$Hurj8>sa4QJrQK^zo4lr9FYGu%wU|Z| zqNH^^X1V{As^M1S4`1N*L6KN&oQ`Xa>t_z*diZ@9fv<2YK@~YC^jIWeR&&IY#)ZY+ zpMvi9)dq%YIWR_-a>Sq9K?B?TxV)Fz5r91=)2JT?g84xczEqcJ{+xSe))@yV;xj`8 z+gdguGTzmJ060#KDV*tM*lW~zAR}Q}r{-#ropfNbC`=UbsW+hjMWTeoM7BaGb&|Wp z624iooC(9M_eP+l;>v$-I*oSJtducu8;BJ&Z z>W1!RRt<*ySf*v}aFKg=j-9#H z>?i>_;3|3$`)}=3ov;oQT7HrYumSBL%_l0ggP6@Xtr=$RXi@Bj2^2Zu^G;yz?YYQY zhBkmj9H1aNhDG!-EWtO~ZH^wC^wQW~5nV*&z?NY$QwPV^u|{+ISmYx^$3Jr<1jDnk zz<2__StrA8_i+zJ5C8PO`U&r_z~uz)U?-U6_6v7ckR~fJ8i+Yh#(7HWjSPb} z=}IYT7`huU4BPiV^(WbV6kzwb2R4v}o%~42a$|)o_`M===?ZB;$aVyjVPr~rP+rJ| zJ-Lh!FdI!H21QcaDddR4RD}`zVjuSoq7*-|*Vp`1?d5^Nn1CCh4qp3?_qEi*Bb}me zryAg9^X#8Y&XKPXdwuh0a!~du6cP%QE`y9(A)YAi)Ni$q&nt+EXGCe4EzpnLT*y~3 zyXrq`rAQ1|k)MnY@!7DdMQ58x& z*kj;=NGgEU?T%YHp}{5rM&HNR$oAil@Q{9&cRE-Gt~<+bVgJ+zTdAy;)h8-!C`22Q zik+wsqK#AU{u;&)OBmf({xmoyawebiClS zxNE8Jy<%zbM6JCaAYKBdY%;_bS0TZ8#1~t=h*M=`I)_ovyU>4MLrxf&9SYGaBx2l+ z*w81i&I~_Gk_|C;Wj^HRJR1SmP zehek83AM;e1AEjc63TVHdR`1{BhMUci3}2cF*s%%Bhe*4Z0k~?C>Y*SQLg`Hv1(J& zj|lj!JnRrO`?%L1Z>-W5Ml-Jo<^~-O@&uB7l?zpOpGL&I5NZ z1;$#mFw`UEz`kxx*8^N>%wTlC5y7IUPGu*!%&@1pJrOS${V5H{J{&;Aqk;b&e?H0o z?>6{Jyaq!Tkz_v!m2*cJ^LaQ7>0=ljJBf^kzv_1QlAt;h{(S~})>6t)z&V~zTrE#_ zo8`%NdGb$1ecdgkZ2o1z2$H0hR!3BTh2q>}AKMq6r_eC#Ga{qD$ZnKGdx<%9LKQ%g z{BMJQc;#a~Kf~j7JX}1%!H@o6MPxSvb!dar%FFXl8*#)@AknhVfyEY{%uunV2@Oa) zs{vAb)7~&;U2-dFhFqvAYg49?#>G`&87MhBEG;l4 z@Ro3e@}1sZ3qtbpUfN~=a)pV5<~#d8Q3~M!<%KyhyV1KZDQgb_$u9;d>7h2) z4|ZD%WEpgYf~K*@`^JYrBfKZezouc+vxl*bL^Cxh->Ymzc4CH<37CrDsYQIT%I+A4Xmz9Ggc-=X!0 zuK)J0SX#8!4Tv072wwjGw7qR}TRW~LtY4J6-F@eod8)d)%8nBs)lKYli$RJHQfI11aZ!Og0AViAqZll<;U0+!Tm`(->wLnSJx0ZBFM`k708Y^0+Nz*eRD&0 z5a~HQ<5OKQh%x}#T#Sit09VP`2?o*C4-yP>RSK0@=qU-T;paUnfuqX$71XHfRjm(b zJ=GdeAYZ_}7v5o2JB9TpANoGSifR}#pT;mZfhmT)(-9}ojC}=bY`9*i2{iyx;1rN1 zzPj57U2Oy}aiP;OMrHQB>R)01I}58{ZkVV_)}(JIDc}g8rt(QlXr2r83swy{@_H3l z##EQ^W;(xUAYgfi`EUST96JaKg%Imk4qETwm?#t+ZtP2F(E>v!!H$8RnqzZbQD%0@ z6}G@wW9kC5Lz0)rieqb^!YN)cT<1(sSXxHW_b~7Vz>AA_-rt6ZHLQLx0@%Ddmg7d> zWtDP@dbOe!2cX3V^W9RxFuK5wX#l<0+1|b6UX^U6 zk9~cMYw6MTEDM~*vFe-Q>f23szwS%YAaa?ARAXf2Fu)lC8_XTtg|dk&Pna>uAO(^v zTpX69f|WN0bP|yJ3lZyTY(!*}wcY1}A4N7}lkEq$D290^a zk{CSf4JFrd8CwULuwF^9S6|_bbBCj&h(#X5Q@o00`lqq`!X>m{R)4f&r6K}KmV2mJ z(STULR@lw(C8`5dD2E;hrc8;(ItCArvDNR`REO4QQH?`5HB1Y zA4k4NjT7lD9D2-Pd3~t?dARwq++H8vz>ZnacMvi&2!{v6kR?6O;k-qy_03^#`OqVa zhx8yr796vF3P)ZAHyxuuNgF2A1xV&2piv$VZ65GQO@fdH9*tF1{Jq57xTdTERUN}^ zU$>?q97I=-513~?zim>@+sq8xF5$9zd0rd>)ahN8VQqW0N5L@pp=2tgmp7$2P!4qB_*8QL^e+l6>MjJ zHBt_9lK{PPw|sb`=UQO>StFjooe|v*)~GFnnb(!#hNgv(hQ3s}2H_el&3n>r$&^u{$#2B!a0}hW#FQrJn#}`j~)TnpX`> z{B{-GSgcer4ajO^1Bo@~3(Hi3kfy4Qp_OWAr!nTko2`GZ(z+o&R~&jqN(h_dy9$X# zn9`@eR9e`ugF!f<4>p;zrC4EqB2U}(F^@_C6Q`3nrZu(6tFd8rv)evBQ~=Dpt&nwU ztVpDlvKkM~RXpbH8(a;9qvZ;-dELdh3Ql~AH#rR}tJpVD?nD>qO_A{gu%99ry+~EF z5KbV>|5t^Zp51eRSp6P2M|6f>HPa#qtp|?G*Pj$a+{uA9mH7@uwpo zIJCp_WB0Hsp^*~5m`|un`N_${KNpZQTn7VRA;f7@z%NYikO+?v*PoHX;S+pv0-(m3i{${6xdR)B*<#$Br!jTN^MjXVsj>)_N4N zT2fIoYP=H zu-AX}5jwu#7ei)Ait^8U{;-fZ0QwFWLtBPfB{{s>KT=>uPvXNz`el^rX+SYjkW}=k z#28pVFeE6GGqmBq`|gh2a)$Z%i$0J5!&WgkRmUx!E!>6@1f9|0m(3PV5E7J^FI>Fz zXKiP3AuGbnAexo_{k2E5*KcQNqzUNFY7YTL@8iO1<(NXh9FH0GB?p;AxCkrJ3B;~% z2eZ>vaUfQ(dLqoy!GRIVV1kQu1|ZrCrmSl_7be8C#8e&ISZ~0h)?K0Zn6+p$Yy0hn zC|39e*!cp~0LhL!n+C`ZF#?iO86T03p$9iDRY8V1hCdJ75A_DMLMUi;lK_$7;I@xQ zXwu^$s>r_~QQ>WC59Ig!{_w~DpeY8X`M6E?zYK7xJHpr=35}udWU?{TH?Mr~dWQm^ zw!F|$f*&!tz@o%B!{MWSE}*@%dpN@A1p$3o;UJax^v!q@*liHVrd5QjcNl}R8WeW@ z5^NP}0fdmjkiIIy%%krGtre-DnHfo6#}Sf9^ohz~hm?C>Y1EiOY9w($$t)QUl#aJ8 z6lkO=LDFJ^*qC~Ifw8O9BUDyWgRy2q2ga1Fax(-qX)Bnq#uQ^!sG!cY^@Ur&P-v0G z5@xMtUTRvO4$CP_bslJdJc8fy0z#JvVPEVvqKu|4YqJT191lK?1Qyh*?xuHS4KXH# zU~GJ0MxvN0NNjR_78C;zsW{8;s$qYf#3IhK1mqA?RYb^P!|QHEZ<#cgKnsKxe|-np zxJ-mcs%x^DQj&N=PF1@tNma7)hgcRFpUFC3gkC#57v3MvZ z?-jzt<6whkb}gpvdn%l5J_V2cR#weP?Ti(p`)D)ia(dbjC zMS9p~3J=4S2Rv4H*wD${6v5YNaA%uWO!&15_whh|X&CI3t@}ZHke;*06mxIgcM6U! z`S!3=PlkgC7&qW;N64pwLA8k)i(4ZL!eyX7)ZSPbF!@@7RK3Ai)Btef^#FMcvjR=C zF1pW$uDj+%4oJ)$p2)B$&!E`=&!8V(WIUCoGo3=QIImFxUIOmF;J6y&IcJwqpTjdg zoMW-H8f%{S$qf(|9-esNihA6x4-=<34H>U?!X_OBM+8suurX&mre*V(1E9LZd4LDN zJ<;J5hfyx+SfoVu#n}dvL>EXs#?~}9`nH9@bvc?YS_rd2c_LFZVdur%b7uY6iH$uEwt;B~n+_%cW7|Kk{Wh}u(j>Zw|@aGLqY_-!^*7{<# z-11 z!m*urYy}PA77u(NUl0SuW8Ry;RxgqV<`7-G?;NW)xNG8d1cxp-I#PI{Gv^XqCe%>` ztUhQEB8~EyCouteJPfjr_QPm8S|ChAgC`FR5Cc6xgUn$R(AH{Zx=@)sNoDwZRNMrZ zW^A59k!>YT`=JMu{&jf|qbob+vx5&pLu9p7F-&;JvM^f(SDm}@+8(;*QZt~6BGW)b zg4>6`V|c5qLl}#kVE;WqCm888z(>@?#1!!Qu>6jPl(y^dn>DJ#(>#sMaWS^=+|bF$ z6KKp0cnz7U{NTSQ{!@869!Nk}ubbGj+crpwY|&;!><42gX??x{J3MeD7t^Z939uh@ zInml^EjeUJv2=hyna)03G_e52tV4UhD^jIxY&7Ue%?T`9TbQ7OFAmu@s2oiBV^LKmwV6Fys$^<&q=hvy4m7v0Fr~ftCM_LpRSeFJdo#qF-LC;?>}Gj2ka z5OEq26`6v>(mW8eqm()|CC~2&m-0Tsm3)jajKwuzoEA>32dQ&8qH>A1Z)$!n@HFGE z*i!Dkv-^3QkANyIwZxUi&Y2X&#(L#xn?p!W=ncHORU=JfFsIhYCZd}Ro}o5N4B;&N z5QaT1j{0`gV8SG~OObBm2%*qHz%B(_2v=d;{QgJ8abW~$On6RqxjD6_4$92G@&vyKdx^4eP9obn8 z>(pi*$1q337DB(p({Yx{R10RjwPA*+HXyaKDJ4ocCr?&OO^6C(yk?Op^xXtYB?Vy& zA`$kfp3dD6u(m52D=W|ndNy7&-EE--#B{6COJj9Bm*Al*dIH(N!+HQ&2_v9tuA}XJ zw;mx?ZKshZVi`->NZ}l5l!+4vE7*vBJ7hraF3!}VdF509sjxAufPJZkOXw+})W?w< zDhdI1Zyq(efk?%X$MxcGSWu!$^{@t4bHfxreARIhwbfuZDD3|icwQi zv_nf5mHmhRm@o-eHL!{P_$>BM&tm`cS?vEfiJi(18)^y;pI%eo1^vJA_U*XL#}jbw zH)#rMV~Ecw)KLUCbM6JFsZ(Bd!NG1uAYi#Z ztPGIrt<`!&vbv5Cxq3YY$ZIfyJ_sUcRrxK=v9?QkL;np6yZvQq53RTjn2B){&;Z$s zMnF<(Ngk1op@kNkfNAm}Lis>FQRak7Q>%rtF@TZI#0S>uka`+p(0VH*$5Of`6}Wye zWdPb`+|S#=iU)fk^oShMWtc>*tYLk^v{i52sooc3=m^5tgByE%VM-Tu6FY1)YS)I? z(#M*ZpsX2Myd@CrnK#|H4BGTo1Y|c6{`cco9KGQV9(_P0_#CSfB*p~!gl?CDHo6mF zZd$SgLEbIN1Y3Jv_hr1I#<~`q#;B;rv1yoM+8}#|i2e6PBB~Xh;lUDdC_Y0HqxBgQa?vP#hK6ijqFH-u zov0D(11FGH6DLV(Wt}8pRh>jeMV%ywYC1_!D(NIesiJ2n*mqCVz_UFQJCN3fa2A!l zq~fUGV+W!a#3@Jj8X^-2+az;aUcCZP8CYVfkhqqRd~ri_UzhL(L1MF+AAwEHGy-EZ zjbPUB8mn3h8iLyFCkRTbV8w{uJIzL&_gO0PvfNB_IEAb6A_vf0J;&l%vc&BLE>md6 zE^G6sDyK1w6SXs)?bBGs#nP8tiEHW|fJlYR44`b>F?2hkV{FJYG@%=&GXaK)DwbtD zVr&ZmBg5GqRHbkgfJ>&$L9!-l-Z?6$x7`o$>n^QPlrhw3K3U7RQ;SN3^cToQ}Jjd|+AYjCI%YQwYeY+=9>ShYz zHOsqYd;pN!Z*w5XSY(&n!6po=YZ^nlYo~b-3e68|BwX z7S=UThnd1k3%YE&Yh+ZsS&I1rZ^>r|UyKF21A>JF|F-pDa~?ok;8 zp)Gu0slJ$lODF+e&o9aj-{gnT0jOVA9HmSs>7e9>8TW04CtfF~^1Mn8t^hUF zNtS*=4e7MTVFsv^l9rf?sUZQ2_$Negy53eAXHfb#J7Y`gog+dpQi<8GfoQnz07_DhC}9d?!QVckT2hi7Eq$^^%Xya128K5uY& z6n;Y4M_D7!;UBX7pgM3e9-L|Q&H!y(Si>1egG4X#lDC}Ha@(r7T4I1)VZgIl(z;4b?KUG zQ`Ztrfa8Q|0)>6fkcnr-H~m-yEB}YzaM+8*50^yu6{Y$+O*XFJhVS==$pjcGZ>qvGB^kWKU92H2 z8}@;Be%$G0f`}yqlmUkNFyQ zI{U|_tV0;-N@vCaM?*Y`Xkw^;PBSP&A#-Kqcf0R#@iL=WEhkVDNuHp5_zkyurnr+u zX|AVepQom{&*9g_3Bfq-I*)?a@G=Qudj0{6eSJ3Dg`5nT5JnbqBr}fKs3N9_)({)g zz0Og}i`{a6f~`#pEs{;4G^db}7J4|n-i*>>52Z_eIbhJ5!@9rP@lGsPI6M@;f>ig& z6MkQ6Pa+u;qX53_Ic?PlLzo@azOtuiHvck02gV~3C`-N2b@HZ{8VVCDgd`~HP1c}} z{2{n%^ge@UmYG`=O@qTs`Wcr*V*{g3Sjl76v!Fj_5l+YHnt4S>cvvUdKB(KOXmQ`0 z29{!=LZT;ickWY;QMs$)(JA(9kKH-mwkb&Jhl4PC6!86g!m`*fm>6ELw%I}l6jNAs z5>wAiVac=ZBc~`B|9J}Xp!(!g>{B?#)5LKq;z{I>iCVx!!fTIFm9Wi9Aqe}$iYO?Q zJRJp;IMq&DcB2X7g76T0i47JFOA{q|3}Kv5KP+LuwOnI^`(>BuVL<;3R)eKDyybSR zr+eX)o}IneIdTTeCp~9mc*scbc+@+AXmUWePZSVMos*EXZRT6mna5SVIvRCZ7rYwR zZpx)DTvO>QB4mw35p%?QI1G7;xi`IrK*E& z0Bbk431|Y5qH!CUq9lD&f@XTzp0|-?tFnfrDfgz;xkO@so&u}m=O{30U!Zus+#ltY zr3}+NOGYE5L`R#$gnNxS*i`zt^vTXL(WcTD9}@{3Df>Ll87A|DSAR1ZOi_F|^5LIM z>R^c}iMo-pv~Dy=s%`46BA9LsN!au3upz}Wg_WmBQ#j}o6FT(+e}yI?Jr?q%HFHeB z6k(&oH^6yMB}L^TGL4y20)&P@R~yFhhK$0hEh)}?eQu}9ly*^yIU!WOUlZDVv?f3_ ztc%X*zB~t&abwH@t0`d2qu2+@`iU2$6Whn$PJI)|FVrMR-BifbK4C_N)(OWPBj|cO zFJ@lyT8!7!C`K}TOw6Ok6>AiyidZ8Q$IpjyIGs2~1&$zn<7n}s4ONg&_#!uA_L4sgXf6y zl#y~xX~$Y50duEGUW$r#}RZA9qOfP%WmAd6S8*pqEH%E?6EM%_eeGd{V9_1Oym4p$Se! z_QM0DIIc-Ni$*R1^X10`ZZ2*o_%dJUPVi<8jGO>J6wp!>!{R&_6N*{gN4&I4N%Yab z-)-w#xUZj~WfYE4*2ZJ_xps`94IQM7YK~*&oQ#R6(Z5ohwku@BKg)yA z2`UZB1RMF{k=`T`WAo2t;9N< z85h`zQB|2RXcBF45(x8REQbmDv0K810-h88Jp8$z z-D#~U*<-e2)-FJ-Sdf4cGnQ3$d4=S6*xol0X?~v=|J!UdgO=Rfz@$8JWuc_xf$>oS zW0su)uWDo2krdT(WRVuvSPy59s2f)|6xhZroJ$z11uB_(iUJ}#U#}jwrubuS1|W(9p^75Qch%uOQc`;Thn@q+|9l2s1yH&DZd#a0^$bB|+xv1nN!&8^s{A zk>sFEj-j<8#<*G|V;tjA;Wx%G)-;B3)D5O1oj~n}GLUKGk#OtJt}s(aq(yxVk# z0#<>>;F7O~P}wOE_OrFAweF(Fl$;d^IlVEjvdX2s8yb-HZ5t+aOfO@M>FB2MEXZ^C z%Q|n38Ji4vn(=e^a!q17`Xa7NOrwvwGBJ%?`_7`xZ@0yj;Vvpr4aM0z0IUa1=K-L* zkL8+^KD`&gv`zyMD|Zl(1w>swnj0W88GvwP0O3?k(}zS$9yUoNAQ_B+7<)Z^K4C^oq>NAT zEP)t%0MdLofJIDA?IT$z@f#6hPBgJ-nkYddE3{qZ7)n#B92GIGP!Jfwf`}jb$ zm-$A6@_mO3J$QSEFZKEMO7I0tCXZ8ayiTpLnFZDMe6vH1Jkfz|_EnVAUx-lKC; z+Hx4HdZ71;)uc7Sv_cuzuv+UNoRk>CAEhiHr(|>#p&To7@$d0>0v7zuXF}rz5cXb%L%DN znnQ1g-Q|ODhgp84t8vJK7nkjJ#wNQ!s!3g(Q*Om z-*7{qH&lySk7dM__iYecc7w6@mmXlsv5yS=7(^=Xn-KZ2gOcPe-J?gc6vmKWmw1E; zH%5y=M|C`1LEx0_wyQfef_=$=GXO`tZInNYKS--5^sBW72s-C zG1wa5neA0)SqPnqw_2A_Seob>Q7=*q;N=!vWi;G8#BHU-&`Dq#6sz7i`WWMHx!c&S z5wN|$Gm5w>&gTj$`0Vf*N_=#JN4V0|Oj&W(3=@dDr9<+r?ZJ!PrIMm-)7WGXW4aq2 zj@HPmed{S0rHPhsF0+-AZI%d3%xFpK*2E1mYV2aeHo_#HZ()2*;bc@adHJnid$AGn zYOxfkIQ3vSsruZ}3V~+eEe=;4!cuuoRDARidQq-W2wXKVXo|ntz08U?0Tk1N+vHcwDHqvs z*VXhP82vShTZLwG&=JyeFij)VF70fywxIGDl%|niD^+AeQ)O9EDjsRqKxvH@gi2H! zRj72^HE1J2z3ot;ChXO4xaVM!T;DS08*eT|gV>237Mn^@at2FM9Cx<}^;nzE@wiZQ zzfaquEm@minu@dasfK+zvXNfF^x`brAb;LkLePR979x?-$8l3D!%<}mDNm|{`5MXF zBzo)!@freZ1+wV0BCQbYBvXj#K>f_y8PI-IDjd+QzFtFra|bKL3dT+)2Q}lylSY*) z%Efhs{;DcQb1Qk$dnpv*tMxdCiMJZS76>1T`hf2yC{4iH;>=r!W3Q zUG*^ZcB&SLLx@D3)#C|Fwh*78woX6*yq~vl=5-Q5E=0EEkS`O{{t=IX;GP9K-r|d{ zUbx30hy+C#;(7&rt_Zp{CS|j`n2uz3K|4DAoQl9qg{oaPMh!c*@@cFJ^nE(k#RS}1 zze#{B=v{RLM0QQ%S;P&s*#wv@@GjO4c8wB5&9)KeClIEK^!qFUIoQ;w8}0sb#-e-R zy8vtnc@=&|LFyH^ZvefZ9KLwC`$Z?;S zZcK^}V!I7M2V)!dCcHMbVLFV>_m;lG?a&e7OX#g2JMs2Z2E#*G!OPfhftA}J6ig;xcfm~bk`QOU(zQ_?Kw5((i03Ycc$rp#fhXS@o*?)D#~ zvw`f3B`28WeFba&t3VWrrbNVF;%Hsom_@9|&0&b(J#A*}P|pE~g_>U2;AbT!viX+L z13AZQhLY3_9I~YZ9n!srzGH*UB~DkljVB1p9d8--LQgzvQ{|&qi?zT1a(2Jzw$>AP zOyq1J$>W^Te#WcltvNXCpFqXw%@lmrv*3diuPov1Q{D@l+5TUj z#;!Uj6cEYD2e8&L6VROoYs zDV(p{B9q|80Z`t-u&Wd;2rqJrmfK|C#zfp4jMOm8x)UT(*?KqtT6Z1*nU_Ia3C}}d zzFwjvrqxg5rx3^09Lp9r0Esr z>JOZ45Am`tD)kFC7EUr?^9h87y=6#2h?=%RPq2>rNMTViZt01AqaY|9WHoqz@-XVY zV?V;MgQ7wtzGt$U7KC}>w1(R`TcaUYw}~kf@%C2%#M;9Hpb;`;x|2lcJUm;#dl9G@ zESWZ5%A`x^&EW|pe623qAVALMYGKs~LM&N?h5)RZ@Pg?v>MUhquK-wO2SfBpy8DwmRE@we~) zm%(7(0}St7smgi3bH|i%W@Mia_QSL(NC~A69XRTXI7<)nhOG~UbPCS5Dh}wkpcdVn z!3bQsw+o910|6&uBI#tI^>!yV7DJ!B%BBx#a^`pE9rQcC$iO2dyXR~Q^~ckwKb=PX zr=gfb%NBP!ISqN|6u|Om<_lN`wN;%$U{{0(a)ntlvu1^5BMbu4tl#rbVZObl50kI- z3B8_-`K>W{frx$W1{ZP?5k?Eo=N!T&Zy_v?1Z@g?x0q=jEgiwg%VC&znNcdtTQxR( zGriUE9wsM`s~IQ0B|bD})#_cA=@!nsut8fW^E`%W03y@2V-^AzU2 zxfV8u2kBR$#M6M|v?`pEPFvO%Vj~2T%L9xoE8$&f12KnMNjp@);rmk`rg+3oafwHA6x$(KA|1%O z9Ra%^-3qteDwRC0Z{e5cFk2fV%-=j&n(h6!KYU|QMYFR6>{YCEHK>YT<0dILGCbwO zD>oi+6fNH!!kj^?lpv&G4@sct8VTf_Y|JIN^Bci~>j)9NM~H}#vOb5BsgCOg;em^8 zWyM~=oWQ=W;9x{GL55elQ>hyBPeSD+IE9N%3(rmwolkSb?cl`WC&P=GzqT}G12j~_&e82nbUk|_GVdGLSE`ucqcD-g+ z5XSssXPE9Ej7Sch-X9&t^lN~FGm!dCQ@b}H)?LNm-`^-yKk%T=%HCk3Cx7qhaf z(J&dyEnz}pbBSpQs>}pK*{d3vD}$5tauxK2vuRhYC1} zW9F~+I*`=lavU|K=pHr1))#L(K zz2F8bfX9kPN36PUcO+io7In%Hp*qx69Ay_LFgz40@xT<{+HblF{!npuE8ZnJTf@*0 zSDz!Bh%yD9LneZrvyk!XPOvUO#6>CZH{4N=kmd=_NGKOikTmtWj~rb>Q;C7)ju0dm zU_P+fs&v$Q_S9ZhtwBLejp1v>;vL0D7!re4twl2nS^@?TXEwJP4=H|*_awG(cxwr; ziN`?PH#^MiMjB-%Y5@6Y3ZWr26hLuNQXo~#Dxl=ppun87+%XJ+a>h`AQ(hAalG6ZB zD8|>>3yEdu1%h-%wM0~u5{i_<*=0er*X?*yv!Hs2_b^iTKHH#zUA4GCZ!Zzs`+yY; z;nW-3Tu;esfTorl)-b{}3TKXdLJ6&Qw3)|(tArw{IiRYna@hJMdK|2Qje;@4UZpjk zsT`ie(;Jle2QzwGf-3L1?hI63IjmleRSv?F5$sgH^GBXP&Tj38Qv=Ka?DR@@7({Aw z1__1rUV!4Kb-Dp@*|7!Iwmvx==M;fIvvl?A_V<=K`1*zEZhd$2~##4_FMpH|M`d|n->h#k^lOL&CPl)FERo$!4dGX zJC0z?2YmEE7fJaiaUcTE9>Ab90U=X%GytgyS+&21_8r3=_Ab@C44s$)_>x%vuzO|8 z0L}n>we&D^Foq;!54U-5Y1kXF%sCGm_a3O}eQN-@hfLOf)kY&E1;z(-%*pr0!v<7bM zc(7|`v7WJ%ibJeY+W;hMN+b;sbJh87{p2w0pnh3y;hOdUtCVf|Uf-_ZE57fsk_Fln z>k(=sBHVp3@xjiSlAPJ%M2l zhA)B%jJoY4#@4$wj_-Y8CM)Z!BAzsid3OkoDKV*F#cSg))MvcHn@HBqQy6ySR5#W; zqTocLj;&4_hE4wua;qonL8#;=0xYWUI?Vg$y4=FS5wR@S4RK|m3l0sn8M#A&bihN3 z=vz%hEYN9`L<*R+TdH!aumM}w^pmOv6KUbzB?QU_CA(5sxnZ%AcW8SKEK=@r*1z}& z(c!4nJ$75w_ItX&N!Nn59Qm%f9+z+g^7h~?A1~-2rC=a&@{pl~Go=n9?t=%{1-sP- zuUDVtvA%4zwGy91;s^~l7$;(pWu1Vhxju)-X5DSM#&OBpw>HJU$(V`@_RCbA?NFcL zgUPH`hO4o#YahX25mjMYKCItX;2gR}9Q@{Sk&qApehg#u>fV)zB`>;th%iU?02Xuv zB&BRegtjljxFxCZ8lp~*W+Y)4i{AO!j87yEX-jJZKgN3HauTVAqP4TpUUo+-y9J3| z0HkCUP-!b)s|^doFx5VGBG=OOOLvcMVs^@eZZeH$DUvL<;DwBxNO$h-a3FeT z!TTaH;Iqi(4dzUdGuDt6TS#1SgvAGLwy&sLxaEUAC57lu*(K+I#8#w6Fx#yJs&rmJY-;FaO89H~hRJNHuB_=aVl*+j7a#SJ zmV$i~io%*iK$$}HaS(9=NI@}3VdOo9T8;^^_9Y7p$)7^1K70i%H|}w74ST6*wWP^` zSz*M9yATDyJov`9z>+poFcxD7V@^yqsw7et6fUOaE7%lVLk^2K&xOZqSFS;uVYI-g zFZCuF?MDf0150!34{$v59r_|n7lEXNS5hni=2a42LDi7TAqBNfqQMk3DQYQss2hnS zf`HcqPgOT0LqBy^G`B1%EQ<1m>j&03Ay~090EbHB2ll%c`oZF%BLHn)f%!D#p)u7k|aW&)0`{m>)=ijmt3jC%K0C!yhZr z2{ws>Y*O$^OZMd6}*paIFJq$l7+KT@frEdzx>d$DTQ}8?gy23Tn$} zWeLzZjLaK=?7K@{4-$=idyT=aJ=oM&B))8w9mm_BM$JtCvdsF~Oy$WO;UU1sL%%yz zD9860I>E>mxEc{vPy?6}Yrqo14P`v&QK6R55K3ChFLvUvm|#CAX(qTtOmze6(eDjI+al^;$IDO)h9wc4n* z?Mvp?_IYbRq~iR9h31QPoS10iLFM_@Xt-)#`}d}guZvyfU@dWds1U!h#(Kb7C5`G6 zTK8txk~*1EE_dOY2w*UbWHoJ;5TI>2T2h{Fi`w*U*!Z-tK5wu3D3MVPZ%!d?D{!YX z5gNx?*vLx;4R|@WNiPVCfclXV1XBH~joOwC?&wu&TZ@=M?R&xXiOT9UPoB>pZ#dkmDI0xIfoo_veO)dtr z>lGZvTw>qkp;Utvi1A(neGd3_Kab3bA#ueh^AKCGhBowghO>r$VRsmwe}fWr;BmYY zSRDcEIzGp$a=t;`>tR%_zX0xlJBz5DFSZoa9xombcTo7AVa9Z8hjK$3wSrFYK&fwt zf>UEikK2qwF>M2wEF}DvDi$-!B10w-p5s<|e1l60p@i^Awf|DE%5t-Z3)CEo07|4P zl(ZU%5GAK@UIn-TF8`nrCBWEnwV(*a!VtbV0v-`;Z9-+KC~+1zutVLqWTlj7n-=4C`6GDFAKcH-wz!RmS{VT#o?m=#q0)^@%Jer! zFgH>;hYrt4qoT{^<`e;aOiDrLS58_wii0p}!+GWXQnyxW8qKiP(*S<2BjBDDet&&7f*-7=<_VO0|+gUN;2FpYtKLwTxABVm|>UHS2XmI|3>f6b(nDs_X_zTF9~A&CgKE z!3apoYgnJaGK0DqC$&|rKCS^*-to?cbx1y&1oy+%m(>>=NSUB#X6gjDrSj@Ozn~QA z(KfK1qyQ$4Dg$ei9_KatCFUoQ%>C5@_qQ>F(g3W3Ix^yY-N;!}@Q?d7DNR<{H@{co zV3Ul&@Drqlg99Hl^QMSc{ZlAw!&DaI%aV>z6F1@%MQ%r(C#y4u_jbfl>uTP+&Yz0N zlo56r%qe{f#Ev*IzNkU?yD*-Zef-OYoCnaroqw|V{S!7DYiI}O;^_ofUf0d!Jf&$}c~E7c@I?4SX7?&#R>|w zd4=c#%NV?%hReONDGfD>MPpmq*K)nC*H8>}&{!HmnKp(dW)_@EZLQ@n%UG0{Hl~r< z1r%CLC>|+3GV8+ldOK!4LNcc0FO)4FNX-#X;apE+!Wui4rG@6IhB5_ot!esOH$){* zdq&IL_{AMFAbG$(rlT*5FzZNUnIp-GLGNU!U*MjL@jH2;hq40nOW?_%LKjp>AM zg?AcDcu6!Ihi2FnXQ#K&QLBH;`OXb>3s_zhlUffr52eqCc!xIWrj-S$Uh~Oe4)Z;8I&1$J2Xrbf>FHm0+ zotsZE4h{%-#-1P)RMcAmSg;w3$rLZc?Nvw*$ zxxdfEHE5NKS_?e%p7Hr=CH5GdXguhz<+Mt9fx2k_eg~C?=S>H#86c??NM2bZamVEPLUj#ron178ZShCfx;<`z9_nP^e(Kv=rg7KTh z{spqxtp8>Kuky2AnW`bMuu9lNhZi#ayE+AbHwU-s)ygQ0aA&~WKJV+pU~PKnj3tPIBaq%#G2W{VN+7E z($djat%2CPCqOaD84>Ofz^)5BLmN5%9rn8!#~oSe8VYc~B?!DpukHG*6(NUN5DY+j z=^d{SBQ40$D8Dkzr8<4w1B}+ z2M3#*QX-=t8*Ou%BUOT>O}ikGQ&IRy*n@DJYAp6lSeK5K0h>?`#KfQV&2TUj0=!Q)#c$VdcRD(I+yt z*iVo#;bd>5oaZnHZ4UE99an)eNUL@RFb*fJ3}ZSr8Djm(2+Jo%08d{sf-&B}RW8)f zCnG+Gzr_B|w)`giPBH<}B)kvpYtGSYx&=pVbI*?#sVSp0Ip%RursttS4xfF7AeaHD z$QIBzCd!nUiQ}?F>16vu?Qp!&tK)?-i9|?Tp#H0PdImsu-!A17$Xv46v@r#b_*1wT zMXvQXCMHoRcJ5#k?Ev(GAO^dkS5O9^K|j8VV}}=|H%2P2 z<}par_FdH}WP9)a?5 z8|eZ{`Oi2c{Y+yFEN-S9py+4-HX;4T@&pr|niqO_@+4vo@l!a)+B5=~Bx0V>DFm37NfK(H?|fPn zFjkAtV>?WsSo>Y#82~vmz&iTV#oKaf6SNJ09jgI&M6F2NdxOJbkDCHhL?;o7Jr!eM z3U!jMiOY)QFlm6y_y~xDe_A2jj}Y|l&_ri*Hvlhpv@NgNm_v<8s%NpbSf1d3tw*|v z1&PB3l%K4XHu4)|lZkuxi;iF&Z;J9~C}h6sU21~UCHHYDbF6k#$24HCJ$9HWxP<8` z1ZJr4qA-P4|DaiYgIwnfv2!>JRvyMjVaafesTRse*uD2XoP@$y%ht*U!1XH{1A}|_ z9Y^<&5MeEW{&k2b)0iq9yxZI!jG8IN`d^`uyD>&Nl;Z(zXd}I=7P8`|HF61Q*iB>z z!L~Ss$SsZ<5;zVW5{Q&%5Xu)^8jl1wH8s65G2e%Bfo&&R?3}pNXS{7^qED5_9 zAE#^xkxhe#II0EEqB-eH9`Lv&sa{lQuw0)upYiepE=Q)x>2D=tP1~ zs$noX{Ykiliwu{lO*mu>MVZ2cX!dahU0u!%qS%g#yt?h~7T}vVlfGHm04Jj!-gvg0L_`^uy$oIX4zh8H=Jfl}%md4ohO9!zU~K zC&?xlV2^z0`Y#vfdL%4yMs22$vPta zr%iCydy=Q3?Cc}hj+)=e$RtusF(a|-!|M8gr4Ms%Mn^}1-j&xmQbgMoCqQtD`+Kld z!DZfBIfFcE(M)Kil&Q@kHn99?FXXo&^MXUOGJR0}K7+1T&6_3cLXTmlX9$+>2CzhPY zgSTW%Ze?hcF|>wd(aydR)K6C`!X4~eKxFOv83u%htIr( zOa-o?uuIx~u2fARGi(r7ewJK-ocl&VmX0ST@R0KzWw1m@IRcW>HR+YA0obX6KLuhm zHs1KH3*iP#oZzrte%(hLTLcSfYER4qmC4O+_f~hpymG5RsfRJpK1J?y0F%ZLy({g3 ziDm^IH63B%)2>w%0@lN`1b5HHHa(fA^#EJ5=mYk}GQIEDw-$;)8+)BfO*+hyd;k%h zzQ(mLoULQWx^l%tjg?-^tWj(eREgAgeCJ{=b+Ad>Vi^kFAK~A``mKFME-M@oF4eJg zgyMuU7)4iVFc5uPGQMmJoBtBEAB4Yl-Tu=S!!^-Z=Up71A}vz{OHmIE1CQj|#oN&gM<;5z+i@%^Q5&A_iYItyFn1v7;MJ_p@~qVuwt7 zPiMrH`A*(rDi_mJl&3-sp^+*D#sIOL0y43S!zR?RQtnhf(-@p1Vh%Q{J(jPUA$#e; z!s^U=-NC{S`I}~%>biQ+(+JQ+_VJc}(byE4mbJtgf|)(*pB^6I@@=!irrf~GF(_tm zG#m!W|GXL(IrEo<2noWLp|)6a9^S0r^F?S6?GQX6)fm zCE64XgK#sI?XdKq6W>oz#-enRR(9;%8*smA>KJ*DWJ(5Rx+f9rkLP@cqop^^eubGB zQo~JBlgSt`>MEsgh|4fXz>O7U9xDy{QH1cY8)jE%L@VzGP&Ac>Z?nVRQ{&~ND`qNV z70U(Mu3`sW#qD|Qf}vO;Tm))*aDB1bJve|JwgKQgyJCykK)vUQJ|3PIGLUVk4PzE4 zvEs%{fy;Z#fVG>w=Z!_a=8ElXAst`C!V=P{0gCS3g3%DLVXo0jPO}}F2E6aqjg-ap z1A4PeFmU$+FC1eIF%_M`*q5k>&M=me2L*h+q%v$Fq$zi4@Sx=d9%N7lV%n34CdLG< zfsQ_ebY+-o1amKAYxM|NbsZxVljGKaijWa9y3X8&)0oK6D2j@KPJ?p^K1emJkQFRh@mSOd$&~Pf)HJdd?)r{a$}se?`t>W?oWi1C z7@~$Aa0(+c3GX*Op2V_Sx{0PSldN#2n>%icfl#}AI`59(yAGPXeh;HyUuvc?cxLq; zVw-9NO4xqZ{aD>Ut~(oh70gs!?5{x9&j=WGUCHG9Q${Hlzr6lXyw4#qVSahKg~3(^ z$M!tKhQ-!+4Y!|}a5;RuY>FuK@gI0}^K^xmGu&^V50N<8sbJo(E63L6&pjj=7BPffRR*Qs*Q8JAk zA0VfG>?&2}6J=u7qxX$5HnL^*{8dhYUOvB$YuicZ^s0C~`S+r$+Z@e~9a+Al9YufK zJtVdyiKT}R%nndoY-|fPKtQ7ob%j+!Z8>Ubu|8lys)l1hsrjU|@pF{Q6P8!YGNrKd zr$`GUj$Rz*TLbwZ%%F#s0)HEi3WTsqk&mK*#3B!sbdThwLpb^_yj2r z&AF_w6jD~HSaK}$^D%{qM-DOwqoa_+S!DOsqmq=W!J^7`IJQ_0+ie|WN}|SF=GD$| z$TMYLITm)%`O_X3Aw7WH_}AJDBTGCU!D(rczhehWfX{%z@{&<895O7|ZHA}u7ar3x zI#|`y%Z#-i`5Z1&n_QA1JRi*Aq(sSJYZ2}Ro2vGj5th3GKjnFfYQ?icM>+fLDU$FbQ*~12;O|0%m$~1Nq|+~0}nk;o!WjQ&ytYECO9zt56j2Cq=c@q;o=%e zkU-iD%Lr3ULA6No>f?RD&u)ST%ub8nA5eI$V8IOnvMI(%8Cb280{XGr9X>C4l_$m5 zz9)s3c${a2t12adW&LDYIJ60VEKmwsCrE%FmDF03dJJ3~6`--`wl1uo8|wY5l++BEC2jI5RtqvG#5V7aQ12Fin=I1jqvG zv+kS~U>~H!+7ic`;XPLNUzZ2!n2pN`6l0yi?xLY>0Hi3J?}ls)B`uF$8?pw_s7&53 z_xn<{NpsS`*>hsaEC>Rrj>4-^&Z3Aq?ECalTQJI$i9sWr2_OrIk*udnSmKoT=1h7z z(%{!c!OjC1kBj)W#=|M;*Ec&A>NF?X)T@}#7Z`UxQzeTsxgMtOlOip7k5t!@E zhE~%}f%I%eYNiTgZgNBkLtg^J7Tni)0Iih?`k?jg-ZN65c6friwSlP*X3pR~x(Ygn zNyT=-)zBSZ_O)6g#HpZSf_o`paGLgbFHg%bf?3`N@d$`)O;g%ch7o<*VBiYH606A4 ztpDtBk+TDG6+?c6u&Lr>x5YJuL~mdko5s5+Vq;*{`k30TsU;>hRyqh9njmRIFNL*a zGV!B%&fqN+!4D_k*1$e$DjN>m?wBwHUrQT%{l4~j{pMwx!6L{YGl=S4Y!k(*5<$7#zFzOehP z22g?-z%;aeRD22&OCgEc3_fI1iN;XnR&#er*<+$-jw2Qz@dLmocomY0PR6A7=ybtiET~87T$H z9R?S=mZ9V3gd^!G9CMjS;eLvb!dXofm9yzX_#!G+i*J$oGw3tk{=l3qJ0$Ncm|5Xy zO8MqnY5eYxxI8-2HF5x#^q-pnF|*|J0W%~vE*VZ&IlD*Q`wV_98mbw%CcWQnyUc>M zS2AL!u8<{z1MBZJmNj@9TS_zHYGYDMK_p}#O(y|bdsY3-{9S!Ivfe^pX(44E(%2Oi zN2_0oVippPW6Xlu$jSZH2l#%shQTf_L8^^x3n!zn3L0asI_TsVn4uskU{LwTWyh^d zflg>RDxrTVzi{vHcxx)>$ReG&4S=lo2~gEcoZZ8-1kBTwC3q*;ZJ+ST6q%cTf=EjgRZlNZ=`_ z?G#~Xz@~76`lL1&TM5Y6IWsJMgdzRYmN|kf;|M@5Rylfcg=S+MZaL1??w1XGufVWQ z-9i>|p$ck^S38sVIKM(?9boGwR5S*}mZc22 zbManXBgoh>R^Blr21}D<)~`M5Ne7PH`&(D{nbP}xoH!TgCDg$qV1F8-^`yiugx4@` z?H&po+BXxe3k2!BhVcQtV-(oKZ{KVh#}qEZn^&|nedV^Jbesdr02PG(nDtD~hwg!{ zC!%mwtaJ&Wh?%&=v`((xt@wI8c4ax^QU1Kw?Q=}lDIV*vk_<5+;0)oM*%K2sFBxSR zssJWCH;_tTQ((=R(Y23fC>h}dF0m#ZJ9CDC^$_$pAgRU55ec>anW3mU>%X&wFu> z8g$K=cR!SgHCLg`tx;zvS=nmXQVwBSKy{9y1&GEo5OryJXmv+E1DXck9KOdPo@JFu zVdt0MKdyJ+CXvZxuVn>ExqVovGMYd!&wkl;?jGSvgY$|pBsDHNSP_D)jpS1}^1E_% za*Bf7etGI?=$C*>dm0>Di6pb2#V9~e@S)^40e+2<0EH6b@r~J1Dwhnj(Tr~!<8GA@ zz+03t?tcZ0S%&iE`w*_FbplQvt`ZCunkoHUGhk$UeZP(%xusy_?)Gt0X$+{2=;uxm z`(RFFBgkbRs;cksw-O-N8){c@0>?f#L@}4HS^c!fY(kHWR<9Dda5!K^4d`607a_|q z1<@AbMd)EQ8VDtXo(GLqfFA4&D9d)5@kbJ$pkBSx$Vy*wWW&@f z@;8rZJ^*!P2nb6xq*4=@UN^`r!SZ@-fYoi#m(BeKZnk*UldBikVxr3j4t;0@BmK~K zNYJz2ox-K0CwX$~gs}}RH%|=0he+W(1i(55FW(1x*@P_i#l<_#70dgelJBMn^y2vG zP_Sq{THghJuBwd?OYOs(JvP8B@C2CDU{_TILGL-kveQDW1!ZK`BEp(1pmUC^2r!u( zW^QsA!j2To(g8&zRRTs4YB@kC0UWDG=+K1jFy64mz(u*hUt&`l!&Y@@XFPJ5Uof~l z1rPcq7_+OKj0|E^9alg)^IG5vb^%esuxbmUIk$8XFjPKQA7K2+n-;1$BS6?5bw47| zajthE*Gs8~p>`g4_$|Kv$vHq{I3SN`oA{1=DWw50-8ZORqzdKO(`4}1HmF8FU@xlH z<_9KbT7Tm>nks(0@U@O-XANePs?hd8U`!$cL5gj{=Z~we-4SL4!eV#2o%A6@3sxvq zq2(5xbtp^22NrU}g;g`35X##la|zAAorvJQGtIYt7H0uFMT1<{K-mup;2(CtZuEZD zBuc@3s9hVOd7ahM3nc1e&^+UPj6r19c8DW5zA-uA-EIfI$d3-a2jCpT?kcq88AjSV zC0JH-`0pm{QbFC%{_Y;PEaYUj*VZo$2w?#l`Yr6VWV2+zoT1md!{KpHb8<+FI_k6R z)Y6=$aNXTvyWIC*cE^ZF_L{iZtl>`40mKbJc4IN&xuB=urQN-A2xp&!WIOruycauM zecL8nelEkou&_oB7HU`rB@QWWNU7*^INWgr$JZoc}pF#W3{-wLebPRWk z)a@Nm%NDeKpE2S3UN>YGV(yFRWUY{b#QI5Uf~rRBI5k1jrchH)eVW)(2Wfs)B*i4Z z)7aHz7Npjcn}oI1kE$o$=N`~l#~#Dedo3`IaOq+Yx21uOA>mU! z#^yR^b4H;|AI51dwnuDfQ! z=CFv(7%tlNOGXZh}blY89pTcO(L9B6fvI1jA>t@mtGep~TKHy+* zK15(&ukWEf0h!ywJUo!;CwQXjwc zFsu4)pf_eBRnkioS_2CL>KwhVU;t(ZGU&xQ?~$WW3{x!kAaj?3!n&c&+4`5=Dw9pX zNl!7!ECw+bh9VihI4nKu7SB;g3&KM&x-9Zo{lY@yoSg+WULA$%@|7BlM+~sEHclgs>#0zhgi12 z-P9-r(E|{v;tiPriqt1i+mMtKkjYX93y?1OXSRWISbSnlfkH*qhgZfnFAlVN*Lx5 zyAeGu`&5$kJdP3T5viZ#L-1Od3He7|-m?jJv40KCsE+kDAaj^`eS^0du%6+O9L&t` zb{LNAmZ%;*Rq+A01Z2Eeu$m}JsM>FFiZjiir5pRF4387IDIA&^HSPKfs*_+sL|M{{ z#Hypkycf#KS%HXcO=K3~*WclyF#vb&4<}(X=B0T8XM^9tn!vK@m z7n%D;4D#a^!>{CpQP+$ThQ#le_xf;4qGu>$@OluA+?s#vBb{k#f)k9(^M~WMwN}K**?tT$)t{4tiQR_bGeo#jrIQHLx0>$_ zJ4Ws_piEP@V1U_3LDpLeQeA7&sbN=y7aWI6pKl}3uLeSOj^(VM-O8a0N@$6~kmSvF z_xSnC$Ia(24&$UiPY;*@A?_ZrrKN!WK%?~T{+>^)+c^3eI!>wGPw?|e_Gd`dDS0>n zOMUwxq*W&r-R}oku<=QE%kxi=;egNX16vK1Ky8HricVMn>Q0AE39BciaP;F!!5DsQ zOT#%=l1W4F-BCLMbcjGnaUX%!yAh=;OvOEHoxLq%W8^p4`q^c7l=0tYg$oZjnkAv1 zYE%FwLPy;}pCKBROn!dhQ!juj-VnGR0-*FLEVN<4bjXEp8G*1-^)UL3e>E>w1hqd3 z;6V*2{~q`~D-q%V!2!s9R+c%G0zKM|mKs!}I5gce3wE5zt1}gc#zw(|$*WgHO9DX) zLVG?&ayAScUpt%wK2F>fbQG0dZXkwv$AN4!Ep`>e78`(4)UxSB3z^-tbJCfsf6sAI zC)IRhpjKaK)*Mr+djKyMYrd(~BDwcS>TboUw*%GPhCm1$gZuCOjBV+07CL1}0r)ov zX(gc0N7;R$e#Qyb!P343N%bY@kdEh(HbeXZ#gNS|_NBZZHmG!sMY$n0JTBr4prp0M zmD{-P@Jj)DPNUZFAu$tg) zVq<65(E>tlEkt!k7vM&&!dOs_!3}!Jm&$mxm^0Ja0a`M=2$i3qd&J8+yeQ}7+_m9| z$h?8$2)*}m>u79LG=_4&k{$n54pVT{mbHkt+Z(=mj|~{MQvNxo@HxNp(57#K%$UcV z-%+Hp=&2)QaFbF-%i6a5%U+M>)#ltUPY0FFNI?L|i<4|C3*5R$YBU;n$T5`iM+IAi()Lu93MOE=zd+| zT43!}Q((j5I^#F)OZm$QgloBVO8W|F-9o)~tM<)(W2J_vfkm?^YOV02Ja5^zl?i9( zs74`KaGP8m@SvI21Fi}vY_GcS`ri7l*xA&J_WlJk4_*tbd?zs}&WQ*aOlmk4go3y0 zzUqSzRO-E5C*a$hupPO_bDqMoJg2dYYg5x;o0VcehiCi}v!vHTNFz05!PgLRbBape zm$0z%D@;PU2*{FGC|0;h1j~&!X8@| z90ayJ^Cns5jB!yx0lpq5cmFgrK zp%3A#zYz@T2)-0IHbKvnaiy|a{FU0UzA=GdYLIzkO5?TT{YV<40RvMb30T}3e`Rl? z-1eUoDR_6EaZX`vUG%@BgSQX?H27Bq0HiUs7RQuK-#1!m+z#o#yW6-c|{UF^P|HmfM zdE(5`ze1oH&~cuK`Y@$Q#02XG5QV!#ZQa#KZ}HwLTHx{aNUb-TLN4-97Zf8y)InHeAz{o=6yO% z@FUcZ@)hH(>6_O-S&wi#9zoW53RZ{0{=i;7H}JW_89_r0gK0lR!1N#!5#NM8EnvV2 zPb%D*KNmAKff$uxXpT{C zx;MwWY*c(|-uNYA zpa$S_dZp+~?qXSr(+Opsy7C?pMbtF-4M3}wVuPv+>Ki;4&BJGEE}a3|uL;xj!p-gj zY*d^85s(}nQ=xIK!|;Xq6Gr>r(;j$kJ5W*e9krOoqOZ z37*h3TLlC_t{}Oibikb3$jYyD!GrZ=EFTqF1562$JfB2yGzUftxvakSoo0{uh-Vfa z+*!HF3o|&MRadW$Z^2=29bo&^KEhshQA@@KRvNmSonzLRZa6kusO8%7K$Sy_WmCj> z9AhKzV~j0XXrM1kQ9^t-+`=K+NzHUFa#yTtsj@b#sB+0uRf3 z2xKfM2P8HFvUu`KN#un&15CYiYdmPrTj$hP%pUmhK zsH*WKqOh=nlpuFKC4fqd`&k9n>GBaub^LOGy%tq`Ope`HCnM3%9X`ixkF8#^Bh@^) znPV8E1icOO?f_oqU!THA`?JegVuieD1M-ULBvx~1_wHZ`aR%X3$HTL7wGln+jsh

    68H{5Ugny8jE}xs9mv%tPs|{3iT>4` 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%0A5p`s-<+6l`tNu-=Zm9G$ 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⋘cJ;Ob=ws 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

    u4?wz3!!HdZD%XdMgi?>FxU} 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 diff --git a/bin/smo/coreclr/Microsoft.SqlServer.SmoExtended.dll b/bin/smo/coreclr/Microsoft.SqlServer.SmoExtended.dll index 0b00a26b5e2afcca54d91563fb66da648dd56385..608a76e5c21ea26b631a10fb610321fd5bd3361b 100644 GIT binary patch literal 175240 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¥K5BnY*polsFQb6xUaGt-Yn$$T0Z-br_xYAVMIfG@l$8KY50R9 zOGBU0rmHv+%u|BP=daouC417@G$duDi|qM$#aM>BW!dyjChbxk2n^%?2p7d$xs!W0HQYw9(28^4yPsUNd?gw%=d}+-<+>b30t7|02vKwf+fZrpg%|Oz5fIIKtAqU z-xu&9-T)T>u3&KaX3GJaO;Doe0!uyYKQ;iOdhj&_ybzTo9~ty}V;sLGa{cxXtn&+q zf4FpNbz~^0WPkVdAi7uNRBQkfu^I|S8g1IiYe-<~>CyyoRT>P2#5BvNMa!A#vfktY zr$&h^)=&)2IlRn0c=ttJgMl9o;}Hk?bgE}&YnJ3>O?}jaMs$f4Tkf98Fu%yYipKs( zv&|v{3&)y}Me7;)bTQZ!MX9;h^K~z=gz&G92~>H+cD~Jf@mMvSPe;>d^ST;)ZtK-s zZ$EA0Z7siiyJjH}%X}9KN5KPoN37!+{pjyKqTkFcziC}hqbNA!DnS07IDmdDyq}l? z@MpHfJF;}%2Q`B9QnlHNgUp+KddoYsChU76SRc>7n};e-*F&VgZNUx z)5RYO2GA3V)@w33^NUVCCVbDs+{e}H=vs|pb$UXAjRnHLbKXrjay4Zj;&lP{*|4Zj z;z8L=Dc!WhH%T1B)wSMIPh~wNNLD{GmV6Gi!MhvU*fsW+FE4(r&V97+gwH1| z5AEn!CDihAR=r8y#~_GKglZ8NfBu7kS>>n7tfq$D9MoBZ(YXX^=>5;NFMTQXwfPcd zIgr;Xh@N>?yb3+RZKp4s3xVtG0>dUg3#btzbKm}KRY q3BG4+KV&eUy<2$8(f++-qnNdq`fHe`p_bTu4{qDTE(;tar2hwg0y4({ literal 173408 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 jiM!Mt@`(Y(m-NE|Kg*AD#;W!q7P diff --git a/bin/smo/coreclr/Microsoft.SqlServer.SqlEnum.dll b/bin/smo/coreclr/Microsoft.SqlServer.SqlEnum.dll index cfa00c71e0bb98d397ba3794b9e5118ef6cdc202..23c89c1913cf9d317bd9a363c637d9f149c76ba7 100644 GIT binary patch delta 97050 zcma%kcU%-#)b_o*%hC}QDWZUixKc!{D0W4_8f!FG)Yx?u#J0jNwivq^buHL6vBWe~ zH1^(mjSWrE#F(fl8q@SU&zWJFyzl$R$M2Wtp65B|o?GY6>@1QOU-g*vbB~3yIzQj& zcT;FT4@Bh%Z&_1_XXS+OP{m(;1BHknJAz6f{Mj}LVFII{;!^Y{Kj|JP7u}AETTQh( z!cDdIxxvtWUY8TInvmTrQ20?0!7pwG?)x2K+Obthn{!E!It9YVGGqD%S zE*b7gRnUNVrQDa5% zRJ2hg%ZZF@AcXWn^fRWn*wk(iCJ=+K%5(M4N%Ey%hW-j9*fw!uzC zkaZ0yY6k0CugZsqHD_yN_uoK;pFJ|)L4`CD~k2HALeav*Tp`MZero|`Q(kRrS{6Y zLr-=Vll*QmX(qo|6E^B05@So}#44Z0&y%rA!2K4Yt}!cA9x!4D1|UuTIWA%Rb7%^s&!BZ^q>`% z>eN@ubAq|^s0|uI1Es0vEw6cBz)KgW>a}X#3je2fP3xdYWDfgZ-hk*P7%cfPbmeyI zZ)8JdM@kIggOnimhH%&#DsNKy(De6CO)<(OWn2zQv2~pZ$Yoa`F zTc=SI1Q6jkpp|CJE2w9X^-n6ZOLVGF=a!pzk4pR)Y>kzE?W#vNMopdwQaDQ^!tiRA z&9u&z#Ym#cjq|^1x7i#3uffe=LuqLsvFFArqq|h1elP5j9={h( zXzmq77{}PPSIr7zsULyXLDbKTp%yX5dV{P@STFQzZ7(Fb*b5z6+bckM(+drk?_HI! zS?@%`NxiERZs^^X@OkeUK0Lgf1w40(qt7%?Wq+7n~8=R*azo&|slE zrP)Ha0&_Mzw8@kqeP79@O5c7J38yfw=vTf1yw*g@8q8e{w7yTazagfh!PZo{)UP}R zKV>xce-+-0g4N|R3%Ynjb6#(#4QCQnVm}F1YNro(hhnfbQ#Pi@$Y#o=^j)+D9}K7; zLd8Mb-b%8$Vp|njra48$mNJ;!EFM^`!0hJA=2ev{wjg=#$LhXr>9TPu22sT0RhwiB zW$x;#cKGN#4a!a?L%W#00;4Y&Y!G7UXrRnKlsUUK0s=YCm@&yA##q|ZAYsAQ|H^nA8&`yA?Tk|7FaeItCka>^rZ_3N+Y9+xjUB)>N{iwdgk5DUxZDv@cU2 zQD0_eL`@fCLNh71m!mg{8Ovw6cpn5&qh+b_DpH8nJejC!L4Db0D1zVIHmsDDfGa(W9=Fl!CCl#4tQf!8!-qAHC9_~BtLWgSVIu+ zAi5``v`(bf0uy4fpZ?z1QyIRgd|89K-3F6eGlwX-o64mOBq46J!C=%TY7hbp#vne3 zv)@-)u*y(5z{_B%$QR@g_;_y`Y=e}0o2q*u7az(475|Ux`k``oAHKv5w!uo5VoAN~ zAuatlq9M{m^TSR{8WVo#K`xYA;J$h0bfVGFF0O9Oh+JB{-W3eCfy#@IW8?^>!Y6wP zZ+%itj`(PEbnpnu#}@(5LVRpS^l~it2&Kj5>h|Gi42v{bZA#FVgGRTjt#p0G`e<`A z3~}0p_aQl~-%%gJJ>%)I5BcMK3{Se+lb%!Vo5x2Ab; z-$6dv+P01rji`5Ex==8^!;7ca2A_8Q*1>d)L2O{QRf*bG!vlowhhvo9+iF!C4UY|| zKC;t8HAuz{*$2fweu#w^HMil|1c z{$w|xk2!QV%B0wav)Rm0{I&IYMp8TACW7$0AF2+ANu6h-7Cdm$$#A+wbMiaym_k~kz|s*56)Ce=V6A=GQ0uVk;BiOSl~8`@D@oiCpp&Wevav1X2m z=G@UAb4w-OI3L!zmMfB5;meSY7104li~2DU=c8A)jhZo9y^MIIvw@hc{zR-w&o4?# zTmFbIy2^@ENH!R))kwGa(dMJaF&i`-&Qp}TUmo+yCdN<1*~+(HMb+tE{DCvufvTqL zT=?l(7nI}JAb}l~=}|gYG3Af2PgBFEqj1Zffx^#}J(Ekf><_p!XV0RN<_uHUipGQ= zSA+lm84P~z*&lL7kL=mV7-mrXceDtjUZElGCL1Jhi|FPorNfR$JF3N%GuyZ^#`2ba zG@ITr^eG8Wy~|3csuz8FGq}?gfre0%N64tF38&trt7+ygs2z#78_GrNg#<$oah@H< z+O(8lv4+6nCTp5)Je!PKliVes=ii9Z~V2auDXh2XIRR7Y7uL!pu}9U zfrrKnqq;~r3&>@gO3<(eNlevyF*MDqJlYv_yiX-;0a0Oe(3mT3alGrz=qu-nxs_dS(DUD@f92(4)p zpVHKJ=F7Zwe#<>;jIy5c-M)rp=Fk+=tp40Nl5ea;(_!umcC?c+`M{$MO zSRi`1@uJgzq4H+`2DvbQ{ef&rpHw0ay(SDfJX0=I)*cQFSx8y5`*Lm1jCt$Cn6l=W z8mM;ha1h0Oe|VFer_4KYo$P@}ljIy_%~8~iI@VCmSJIC)C0utbnecnIs~xwIz2P{N zC&!ZrtDg8*wp6N|{KFkRHrPH=DxE4vO8rxRQ=ZzV+fz*L>Dh9w;&Y~aDNK>2IZev? zszI2Nx@VeD`{T~UQ_CCAG^84ZXDWpuD%PStijMmPPbRKFF#PP2&Jsk^kmWKk11?v9xlF^9Nt4D+4e9^~Oqf!lkq=X-vxJS1qZo z{+0H!;uB$6?|`!Oss*jaT1tDVR>=V3>0=#ytQ1$F_&g>2T2K^v)PO#R2x=HMzYS_O zjRngxYPI%cawxs8CCTN=vTM0=u~Po}m~!YtoVR76>+K!-t*p6Tk^K9wC)roQ@0Hns zhUkEu1Bfnf*-RNRduu^4b~Z>@T`aIc!kS`%4SKy+m=LOs@l z;`Lvdn{(wlWzEfSdi{6sW;MB9`Tk}lxjx_X*3YJ(k15KKSsEwSCne@)Wz4*Bg(EJA`_)w1R z`5nH^mvXyeC_3o9iF~nT47C26lygOUsohzR-VMP3{yRV@G%)4$qgg>btl{eLv}Z?3 z`)R)O@p2j3mQHbR_e?L^I@t;IC4lBjF1pX`(V7>~j7 zFSb=@dM4he9DDkW+?c=mr&b2vFW@s;f5)r5FO}!dg6um~$@K2(SUo)-RFtJ(a~70%!|Bx9)&U6OQ`4CT!5=q}Gs zzO|^#=FCtHw%tnZ?`0bzFr(?GbVF|Jx@q&QevPU$nR}`H?*@WGx^m(73UaUV^!JuN zP^|QEgZi~sY51}|$+KQ|x9>xs(OMB_zyZ|`hkcL}0OQgOHbljG(mm=B88L}eAq+uW zx!4(`Iz!1B@jsmIhG2G*s}fxMk=$slViZcBS4jb!M$Jv?Z`g19l}}%V{SU{Vs^k8v zG%wWPb>62W{86qgcavW8LXM%w6#B-|tnMN&gAJpKGnk{z8Sl~*s@y^!3%#O0QX^^A zZODM_xL;ZH$5DAm>Grw`;iT7%Jb&n2*iyJ%&gLYhT$qwR2iUZidL!0_VRW7e4 zqUiIk(b^beIIQ&fGgKbVpY&%}seJcWefw#08`O*VOo@4+#5~I;f8%owruw0k?~)h6 z1GCR_VM(L>hH}}LRq+anfb6R(yG8}Njto3`&>_@8Wf;hX@=|dG8zdkfS7D$asW3`wn#pA1;q83I9}(7nBZ!r`bNC%=)KlFuFzg z{zui9pDO+SDW}~2r>s1sJfkXS^1c5xNISYnj{|r^M_B?-Gp5MMLN-*gPq;$ql@W-KCT4>eJk&Hk1`n$;_l>t5 z6UZmL(T17pN#C2WVYIfU+&y?L%z+6l)u|3N@{Ch~VCx*}uyrnh>eXs;h#Fxo35hB5 zpA=lpXsduZu%=TA-R7;UFq*=o~3T?}u)LDT>>K}>0?3z4VV(nFnU>}j<- zF$NovDyFhn0m#|B-%FcSx38hJS*_V~NuCT#>5BR`-c^iRFO4=_8fq0Z2&Pu+qBe;A zP~twj%3$XigYLQRm54ulSy~;0QCY1$mRnoAp3%|olyq+V?oqqQG4UeFv+TR+FYcon})YDUn1)M z?&<9wn9#z^vYD>~ZDXtMk{z#x=r0X-)wzfkC8o6AZG~j6s%Epaj&fak>N&<2h)+ya zkCF?-*KE7!Y+{o2+H`8>iA@X3!lW^SGp9Fcr zISa)}=NIi|xIE>&1a{i_y1lF~&p2y#An~m8oem_Pb52BY-nkaV1?Q;_GDTi=`gcUy zj!4^)(q4Aar1@Ky_{TUmT4lT(TX4-PYq`k`r+XG9&veG480UN!MOJ}5OU{;Zywhs}#ZGWG zoFJ=JnyAkls%36dl6jJIDup@!oIo3F*96*NHs=)*7Jm+61<~u9fs94}^ zW0QO3LZ^8Ou|>`rC_Zv_pCZHE6mIdZ)z#u+=jthPtz6=4noUtlokOze+H*QT09)q# z9K~|yO%yAfEpuo`4spJ(79Xg^7PUC57C);+DLY3ds6`jG$WjZZTI^AaJ8JQ-T7)~e zUURh=s1`HS;uEzvtrkz!!Z(*I#H&Rowa8S9C2CQi7T>7F-)d2DD%WeO7U^m+O)WO5 z#Ywezq88rMxI&y-bX1G6YN4pbPPMqH7JsTm=ya~vSS|XgMXp+Gpu*1A5nYeVX=Pjo z5Qyt~ERI;Aj{x~^M2$>OI@TSl$PqnQyLvN^(0QM|k|g?ElLrsoB#nZ8^GdA5qrD~6 z`F6T2o1lv@T8~j3{61o3v%5l{+2QlB9w(7**vLUQ>^x`788XV3s~N2)(MXlXc*BR3aY-jIWF)S!oUB($DI>j69vdJ5n>u+d6)d#~v7 z9Ekfk53iucOu12-Q7O~gxp%ItRPg5qa*~@|>CBubTT)RlkDk+3I`7SsFXYOC3-jqn zvv;6dBc-r(L|G$a+irZ;Qtd*W?Y*Z&Z>h7bI(wzgKCH8!>g+0C>++CoFK%q0&ap&i zZ`aw!b@p#MyX@YQq_uT+ADul`XRj%-?HT(^NXAK>eMe_|?kj1asm|`Gv-{}mu{ztX zvzP1aZEV}ssotY=T-Mpob#|%!C7r0PvpebRY@MC2v+wC_w*w`4;_Nz-th0OR>`a~g zq0atXXP?*E-|1}MgC&h6=@7O`pw51%v;WoEafeD8YpJu})!7qt z_NGI^?%M75bdHxgJLqsp()v1kpw6DAvp4AM<2w7g&i>71+iPTm9w})cNoRM`*%Ng3 z9G$&RXW!A;aYsvX4%68yb@pM{cI{e!q;pg{R#G`dXOGp{OLX>Oo&8*AhaNAu`=-uzJIOiieCoxigza~A_6(h!ue0yy z?6*2Q81r$QdoC zoi4waVnTLfo!w7oFVWf8b++%>lFqf%*>;_MR%ZvDD~W%fY}fgpuXCK#*$;L0A3D4A z`I1DHbap45ovE|u>Fhlvwmsv!5|Z(=&UU*{(m++6T~}v!)7fKnwxY8?(b*?;_CvO{ z^Z#F+!~J4O!xeRQy3Ss%v;WZ9r7o4!t)#P?>+B&qdxBj@^!6g1zDZ|)sk8U!?4vHb zR>pa<4VF&0v(?IYSwiY%RJ=?cqouRz>PF1&3S0nRajiWiq+Z6o|I~83qKk_!A@wr) zfVi^TN?f%v6g~M;N1A6`)Uk|T^rXR6T}!qS(mLZ45cO?cCuihx+1g&6zBR+YI6%p- zid>`$Uf&dZ0u4lpzgTTUzyD9+CTkF>>dUfXSNWX!NEl{taM?Pi9#I2})?nnwu#BX< zF1Z4=3f;(W52MHb$Ln-kAuG8fLx7{cGj4^9X&gICiYhrmETi)7cS2O@GA?7-=pmW( za4g1+G>B_gN$b`{q&73szu_V~rCS<)pQ;D(yUrymWPIb-?m~3&6k?SdJx!A?Ouz@ihA_b zxLJH!2fAnN^MuwTZyuV(t2)5nYadK9i$!(c8(|h>>Hr6@y@2gF#x{(NSRY&)F+cV1 z-OnsK*Pce%+z-R$_ko&D@TW80DVy-u=pm>I+b} z7Y)Ww1X4D$_+k*^pX4^aL^H>E`j;J?;w8H0VMcwI0qxgTVPbuF^sT02+6x!MF<>Nc zDo_5N1&F!pm}2x2WwW3MW&%gwgg%PrujRllZeC(zH7JL;qnD{kFR`IHluG@k7|o(t z(A_*QapVx{_9xv-EVFZCO{p2P_>9;7-~+6XZ?j&Dyu`@w5LETX3iC;Ma}-@{BIP6^ zZ`8uZG_TH}*F5!jWIGs_@e+)ggN0~(8CYgKVixnVHfWCFJ#ipsm$Jx{UDu8&GE3my zK;UPMu)`aUgMB6!*mgDWhep+xnZ*@OG-Cz!N3*HGUGeZPnTl&^p`2PV_CJm8<6f#!tsg%;Tl`Z50|D zG!57;2Ka6a*8VfDm6whT9qR$N-T>at0gmUo`HYDMC}kP@uEyqFG;&Cu-7Na#fHaO7 zLi={-RBW6RBa3MFHdzKcibmikj<0|n5;Q8uECP6{M`s}2$PwsbFt6+Jj1}fGV%H%McrBT;X(#!giN z%g|U%HL&p->ru@PIz^)otAaT+_LkWUjs3$F=V+{M14J&;*v~b=mTIhk8(gWeE}Uhf z##WU<OuJI4U0nqK$~i8H0|~FqP4~fnYGbaFmJXF8vB>$qKn3M3`f1b z8au}kVzG}$F-2pKxcR9XJH=!AP-9>AL%sPL zyUc94#zt`DT8(XIwn5s}Rhz`2TQp}RH}RRqayfKgaYbIygBm-RfCi6hY}FdDGa9>a z2kZxp?WOC!z4%FEBYCl3$N_e~?pN>xzto&R^OXLhv4K1@MuXbX?dy@oLt}IJs_@lV za4q=CXzU{A4AfX(W+56|co2~lh}m)M^k8R%=G@CHQey*oW-J=}npZ7OW66t=rl!Uw zb4L?3R?`o@mKtl!OW0XsA4kL26U*VvDIK7OS#yZD8Z?$Vrj#}T?uV;gy94rwfuM}JIXySUyd zjaBDOdO>5~Mj?yQsP36;9)!Ebn(#9DYRqou)2p;bqj(F2Xsjbwtf;XJp0>&w+rqwT z8XI384aR6JnOVHXa(HIyXzUWVS6^dZYV(aWTD~mOw9wd3TrovsQQTlVja8&uYD!x%6n@h{1!xdSZA`5PiWm7)S95@kxC& zvBfx_*&SxDHFkuVr)j=$(4&Z*=CGTH1*0s-YZs2MD&tJ_p^kjpi7hnLFwq~DAeK$c z4(jC47i&?mhG`i$|8i;J_&h@$6a7nnO7mejSUuC%%tC9ZjD9tOe4lH+gUr%}>O0JA zg-K;cnKh*aMV8~tBIqc~vlBhbw0@ZCyu>Vpc7C3rzKK2vQxm!Cz#5uvF&m+=+sypF zEgZj*e0P~Wp;_B#NHX1LW^06cNu~$P4lOJkA7M-~eambr4KTuJZ)$qRG;0Y$o0@)Q zX5i5`GyTr&tj1pPJOyt+WHZxi_Bn~YFf=#4VYXLeI92^cC%R(t$Y)~qW*S&4lP57D zEOcDu8B**f`d4%m+J$@5*A&R?y+Akzn#wb?UjiFu3TKv2%-=ZDWMTGdI((x|3CxxZ z0vl_pCmoct7u`j{=pS!#5LT$Q((-7t+Y;7n-zLE-pE z@}?<6O**%5{95BJ(X5VTf#IJ|a%xEK=%j~Jv;5=rZX!YhZ%b2BhW&yK&Z4e8Y*L%_I!@{g}SJ_@>oxKXj4>CPBU1HXVd|=m@ zEnPzQzd@!Krn^k@%EI}=RLHEyw<;@QwsVEb{$LhCml`6?^s>`mETrQK%#&FP`Gykn zW_HI%Wu=%sYpzC?F=7yTmH6}D3sWFF%Y1~;ml~VJXDbm8s zNhcdvG_x*r>Vd^FyG|zra@Js0`iRPEGyA5HI%6kieIq{a2Ga=JiYKk}91^&0!F3fLza>)H=&tHyq< z23DZ4nijBq8gm-~c1UB}PkDB!#r2}V zo@?x*6=1(ld zcI+mq6LX^pUPOOh1T4jqE+COnM$oIAX!o|B-sD?4Oo;O$j+l|y1$qMLCKBA++KCF$ zA`+ps+}nE^Xl4F90B1d7X7d5l&KBJrj;!5;rCS2OxdS|KV|NQF;=SIuOR=f^KC&z3 z9VQICaGdaNYzU>`ua}=9`4ahutBZ zaSj!Zt_6-M^AO5v#H{mu+=AYp$G>qmixu%Z$!V}8`-YnyVE%;Uxucg zvxm?d;G6g1%4QsOABw`bj?gH|uY5!QdZ$wb*p6#YTNuSF-={4SM8Ccv#sqP~0G#c- zoG+_1{esdZh(Tw8)mH**^#d+81E;J8whIK-&jNOlz+VV!ivi+odgy|ymskD5&w{~?+)#itr$1usg7(H*hxFqZymAvXt#?#;&9k zXImQRL-CP8z=#Pxnr`pz7(T%t>GFUlr~11p6h#D(l6DDrGzggD4s3ihz!j5{7)**^ zIbcyluuJdkQ33H@z+cmWMG+NT-hQ4DtPt8A?==GnhzI_f9^ncqiijk|;RDQIOlRy! zSUjep2n%^1UIu3M2L?5>xV$~?$C5Is9I*LGU?O30UBCV{NwIshM6uEUJiz!i0`^~w z5BtJ)WYu(4YY|b0l)@a~(m zWo-&=MpAzdU~)<`R|UJd6)8UFfVUU4a_K%PX{7k|2O3)f2j2(&+XDDkM4BtoJfj0C z1G0gZ0YHy<;5WB`+0*SP?%F!IDp&?|A!YV-phrCLn_IvH*29v!xFUPp??HO=lfZw| zf&DytxV-s6eMmX&1-w_jk4wLBU;rsk%)lPg2H0JWqKF|R?Z_SCQr;CKNm;`v86yl( zeAo_Rtjrk4m`GT>x;5O#QshnVu`Z>h7*9%!0Z1>t3Ew58{lA8ZWb|PSVyw&<$CyZ1 zoVsHx8&xjT2spVR@MRM4yTibS5x`wHfL*hIK4pQgJb^ufY_2?KJRI2nM^HE%4S?C{ z4xM`jDdW6>29Fsoy(nTfDV>i3hY=Qct0-atDb=n3PnQMmwEzbvF3`m+CZ)z2;HM21 zlWteWLFe5}df@=zrwumi z^z9rE{ItP#m+onw{uMibpEmf)wxvVfCf+C%OqgeEMWa);K3`masK<(0I?0d?MjiH zQpiDtI;Dse;H3B>m%iKW2`Qt_0*A)|FULG_d2h!(BPF;MuzoVIdQ;#M8_<(<`tDKP z0YwqNk(8VQte*@_XPn>%`!A2*TuC=Kcuh*AJ1{-@wM#FG_?MJ19>B})z!7YpBfF#( zL#yr%uYth0@`QFr`57RygMmXr46TYob8owovgQu(i68JmuDi<{>*+(v7ZO;(0JJN> zNsN0;uzRq+g=3nqJ?W;8E<`k z1E2T-zhPy~olsXy4?_g$TO_av+mn|_N-jt06jwq*S` z#?g!eIVOp{6A6nudb>t6)!Kh6+NF#v7f;F{#-IlAF1;wC4(XoWb`%HJ0pEH7ud=;` z(3Lc<0qH#k0-Lx2%g+GL4h9Yh0ZzONoLdRF<$d7fQb1>A;I4x};SX$`1iV=n7}vCc zor)nBL85K}ugwQ~abwkzIjB7F)ES^hJTUD7@EeZrlmmNsX<%Jyrnu8Z5lu*WG74BT zy@^h5NlIKYu-1Z>t#tc8l_WR2tn%K^|2-`Uj_*;44%xl1?Q@|f>z}0@h19gGtS(!^p$>>*+eqk{%Z6$Cw z+moBa?tO2S8foVb73)cwbPxF3!}YoppOA8CAn@-|zrf5+5cxe_L3Ck4Ls_(*Hx`3;t(kn48SY}7{Yc2 z*~Me^?0=l}^{atTY;19qi!pxu#`;HvQbx_TT6bY#_Y=_i{ck@AEw+6T5HE6L>zXwr-n_d?*K`#?ul zGnaRtS28J1Mn_h%OCP_g4e361E*x2HT#m!5I+El0J>Yn@9a$Y+-bnYZq^Bo$btz*# zdy*3856oqBWc74;8%FdceF?Ay~e;OQi?CR71J|Fc{&YvEen`<9~c~yf&KsIS&*OD zaUn3nRc+hD38WV?9%LMI56Xo=VAXXKT#;LAP9eo79r(IG@Iv4emv?g6TvGb212$l+ zN~m^@_J6~OndDf)IG53pHPcnuy>JeBE8hn`Vl0Y)?Z}$rib=^@NXn{2;IK8oHjG`y zz;=+gcqUGpmyl8v0SrrCQnLR)wXGm2o3SThafKgdtRelY=4)JvPs&D8YMuj*iwCAL zPOr7m6|=d)7SgAu1KkU^xb%Xg&q%4~1uTmAjCAeuZ$Hm`k`~nhHo5^k(i~Wkadu9= zD@Evu-J~}e25fEGolO4#FknC7uh)+d=JI>k?Thj5wOh-Rq&Nf45&lE(GmD4Re#T|0 zd-)cypFISH`5sWj1BaFZt{(!t+7!5;GBB|`ut`0}B%t3RU>GN==LY*V*Zq4c>@wU; z80Xv)3nhrNZRi90@L}Mrp>`CP&j1f{Xh%-h`Yx1CHGoyQa`O|g|KV;88x6Y`r;Fjv zEw2t`D0gmaFznZLf!#xa+ZzJ!9R%*Y2`n@LJEmX8{@={Keq9bypDMt$mw_ur0B6?% zp5keU!c2@PN{=`k{f`2&mP0@Dh5haX;3N+HWen`>B%p8U8?I)K=G`IXRZHNpQNVd|z|lj2 zht2>E1A)Wm0q-loKN5gHt^j^e3TR))?pE_b+V=(8I8it!>coj=41wM?3)p%r@Jo*I zs0I7GyTAy>Q^#OeEe|{q0!+&Rp3DXgd>?qq30%z?p4kW7NiHqENqUf6NpwiW*A#V{ zKcNdIFbwvPoS(@4?4uWic@g*qV$%eCGf}x5zJZu^+>`XDPJG?5!2s{imx0^eUXtGP z2)@raT=q}0arx1O`T)448Bq1+?X)B4Y&fdLm->f78!*=QL6EAitO$G6g%`=49QYQZ zlLOyEbaKo-1>EHg^k%(PBiN_?fHxWM(pMCn97T-Hjj)631KYU)E36E$Q!y|H zx2_RC4uvv|N8gf0Px&d*B+gyJ9Lu9`-09aYR$Rgy^uK~B9ZX-_NTDBn_Cr52Y2Pvh6Z{Ew~vf}G&Ax8QaB-hdWv_)8;J2XR5 z%;l~u%|a`;u@L^Ekq<~a%TD^L=fl7k&h6)AMY=0fk4TcD%k@iwzJeA#V`S(``!nRY=MJ*nz=UV{aPdv23}}Pc>O$Z4%=-G zHz)h)VKk#}?A0RF?ZBN-^Y^TToLw7)7->}+(7a2LO1njhZ2k&P{dTY3dQ?;GySy`l z?zN@{4)H9jmr7y~YCWF;+`)OmD`2c`BimBs0UuyyJmAm)z!i6Z4+4NWm4U$=-z^;W52blDMb$wz)B{FwerC!W%8c+Mn`_})QyZ9Kbmcy_Du?0WI+R^rI! zCq}oXyLTs^a9HD*L6{$JI_I(3HEOnfJHZezMNpLN3oWdpfN9jg~z&L1oRtm zz)SOiA>6=Myb#&E5S6+4e|aI&c_G%;KxA2-gW9|hlCP12ybu|@5P7^1ow?Kf?7R{K zX(i|>l^3GNP}ott=i_*yPJRnz9xp@)@BH(;5Us4x7jk#wcot9d60~K^;^q(XLUgN) z$nSU|BEw-H<@q~U-3~I7clF<#;t4OrU|xt>JmP4M3FMdzUJh^G|1sQ&0G{3iPB)+D zBa(O0Gp;+6>z?67S;l9Ejpw5sFU`Z7y#L4Y+C&DTE75#mw26YfmzQQAFU<&Enrpl$ zb$L;~HhTXp3K(v z(xT~Z5F<zf&qcOlZs`bpKh6Urxy^*B!?HB(xQ=lD+h zVQ<)%S$wM69d7oC)a$HhV6#KOHX*?4cY#}P0h=BJj*JB^dOrALMZTidoYUDJl2j}*~DW_;8Aws zQGUZClicfj2NCbZBd)}H^Ak{th5!{FeJ>vUQy%Mb?&z@5@aA6uUgbH9;n8m&ZHM%0 z7;qJjV>yq0D35h}L+D$%i?8d#?#{g~G{OGu0;~D z<$ym=1@@@|%$PnA=l@!s9E-X(BjC6Z2Mpn9|BB}(o9Cu7&rLed&03zDvOJpFJU5be zPiLN+empk=d2V_PMYfYXH}iOILU?DKr@5i?zm*m4h1`4=C+fzN^BqrGWH`J>d3*;OVJW-K> zXfm3&Pn#&%dwCP><9WKqGgOyn=m;;|+Ze?B!P_d4oBwO!M84vI>J>j@S2kUEfA0fU zW}Hv}+x`z11&j`M++~z|;cmuy&)u*?Sow?Xqa2g4A9^R&d$H1P4-_lw5gh4Y??Tq| zINNhpZgPj3+PT_kcE_?*mMgF2pv|oBX8n7vJeKV%Y;R=y+DRjJQjXbMqgXH%xXl-6PPyv} zYSQWcl5JvzS?pKHG`HO29X3-w@6)zvF87Z*yBpbZ;84^U=0+ z0dJaWOerngV?0vm^*DX{rQd{ezPu;v+SBNj1zn44fv@fW{}>0nx&XMs1K2`uQNN_R`n=`jd)XL_GNIXSb}71#>BHlfYs+;U%5 zk?%Us-2R%ZS_|p-NzdE|F%<$gc>xv1 zHA7+VNCMvEo^O5#`!3@?#!>g6oTXn`rAucW@ROQA&vf8R9@j4RPAChdH^GcY|Z(Rdy&De1a z>_Cp`&G>FZC~cyFqnrs3Wl+=>8^~nF?u?`8l?R<1&4E9(1_qvUj(#XR+iTKW8@jgo z0*^Na&gG4;$QO3C2f%Ha!1u}lKXw3fcpzW1y~G5iP72WT1km3TIDqwE&%yqT@e1Q! z#>b4CJMy;f!V|o@7D8ir5BqSs2<}`Fjq{xd`h9RQJ@}Ue^m3i*3Y=VwYAY=R`O96E7#29rMg|Uj9~w+7}J-FNBQ6slX$AJh+W6qr}zqo z$~;>1>zd*x6wNnn!8@Xq*rYOUu#`BjMf!g?OqLSYnVk?L&yS@@Q3W|qh(~Vr_fkp; z|Ei$JMB;ZI9{wVg*)(x)Svs9TBctGZEPr+zmQqGkpuaL9=pSUZuazVM#VL(#pCLt% z_#OWfNO8i$`);*TLBhW}Gx1_=ws(+-&={Hz7Hyc#L`S<4?d+oMQ-Z|+7n_h0BE~Vx z72(Gxq=brpRG(N{n43~jM8u$pnPU5}4^zTL1^R#Rg6%B#k#m0${ZYwxobr*h8tBg% zXFQS?L&RBU-XmGw{+JdZN>r?a=v;C1>avt5(VW?1&ldegifW>*i&b*7h<+-Q%hP`} zR2QQ()~?>FlxQ(UV|SOYPl*vbGhG!#uWwzblwlqAt#V;c|NOlc%WYiyp+ z-IT^+ipJ_1zDsE$W@~JjEVV49saU2_f5Q*XqmN}v`-|mO49Oy~p4yK#DL)!o)89=2 z<5dzVq6f1@!GA3HIVD9zHh^!Da3udiY+{ni77}YCtc}2y3OC2UDfIU1DWo>bt^LEYZQx zLo9Z&pj7-d5&WF+{d0XY(UWarZt3^KQhSQc963$+AM9c5DGD^^e(*;_FL8?5bn&!) zWNL5WpNy*0#e){HseQ#e8tbz@wsUGf@d;D(*4?we*zaPsQ`5ymX1U^Kg-|g___s!y zY2xr0I@LteD;~b+8zhg791s6BC;BB8jhYC|Fd^5$x zcz-cWyrZ!r>(f$)i(?ua=biw#d5C;Z!>p{3%;`pndcB7&Jh z{m)6YiC7o=Ff~WKD2}wRccxAiqHS@-HL26ZU1quBRNXD9vqWM$)i-_67pWhLF&g{1 zazW~Bu}@=O4We)Xu&s{m-T@5DPn~tZ&8S zE2#^GPe+wHBCn(_604aWS^C*2j-Fu}7RhbAn-c96*C}zhz z$2!1bHD8}|^d+L$r?Ep59;cG8GiMRMPbf@XEygjU3!>@s)HULi#wuQVp1NLmbwT8G z@vd|GQ(4OXI`w0bph=q!y-nRLT5D{kG^cG9^f%i$+^^5;)KA4AjU_blP5TTE`Z?it z$t@u53o(a%C!~*AihMDTSuWq!@3k=|3!U$TNbim`YSPnUBr`SXY4KR+J11T+ z%N3_HTcw>7vG|ipG^7g6mWT_^20u%0d%LuY;*=(zet(y^EQF2-rhGplFX4N>zwHMwV2m$ci$+#gKMaz~V6re?V>f=hh%wEIHQC|2*G z$kT;B6dRdMJ^FS@dng*E3;M|wA?BKC--=@cz|;o66Bh=l3^^Z*2O7hY zJQf4qhfnQ{{fQXPRIT_#e5iB&Bo^y@KZ$EYODaAWcbTd6o{Is)N_@YH;mlOuuOdh1 zdnslzQ#a&G=iz6vYWTl}!{ke`YdBJz5a{zu@e{LLQKN5rr`vN`-M@XxE0H)>4Z%R1 zO`gkOI!>hcTg{}w+mQ~UC_s5}Lc>fqmqSZ1p4jR>Q^qFC&c(!xyj zNx4DiGs$hmzOK{}ll)QVbeF&WhneWF0^p+Gd|<7CzQE+4V{Z30RC05do7tx};UVb{ z$kGoD!dd+VACyvf%e$&5P{CVHbRZ;GBsLz9<|Dn9gQ;Wjl>y9-aip*Of?2M3zwxj% zKRJGHNn|NGgPA&8rQ|GTY9~s`hZ^%qrBx^+e`1;|J}n%RRz~jHhcxQR5+IK=Q_}>< zQ_R#f0rDR;lIl%xdec9bOu{;a$W!<$AKE&F$g|AU`$UL*!7Nuq=H;Y?$cTg7l-O`- zhO-|f7~G&=1&_*d*&)bkE0MDIVX$K!Smk7_=a*niNM$A}zATQ80C?Vq}~D zuvyG<#e?-V)13Ezp-nZXP|_d4+IOrZL#*^ZUXmeRMlhQ$_R*@w%TpSAcF4mcUJgBh z$mt%x9qA@&$}uVv+b)est0`YGJ0`b?32C+D8%gUHtz-c+bt+TkA!gIXtJt+^sm0sd_h08c zs{Ae%y^XwkwxoqNa{4(iwR(Fwmzny|+Fp8{FY$Gd0nF6x(LuhiGEvdvXXjf=ZvP~$ zqrA%EQsI6b>|c#tVrId=i{^&5k#C5~_>=EDatt%I*>_}xi^Y*rbdr(GR9`1Ko!MhK zeb85Fo#kAO{aksEJ*|setkFl-Lup-Q9y4`h-Q-4Q_!xdNt(&~0`b6cv7t*@RpIwnB z)83V@m@O6eT3=7=A?eTl($5Kj&&2P^FlNYkGOdrS#tf17(~|qjX1dV+vZF3^pzPra z{XT7w9IJ~QEFG@M7tTH}WwlbXvYLrea+fN5EO06>Wp(2(3;u8(d?{Pj_%f@N$dr99 zmrT+)`93q;m;Ox~C-Yp)y^XWxEBRF^)R`q0Ue)S2e|aTi!h+h&mUV7IS|rwFrTfm7 z|KQK=&>E$`k%$|XnfFHHE(aU>vS|Xk&YFgI6(^B#LJuU83 z`Vfy!%f#ZJ-e9^~{=4Yo#Gi1h#WO!+FiypkPOHVc8tFzY^y&bc5D$5ru6`bpl_)&V z9Vmckmg?1Et=Nj_Gu0iaBd1JV@%PQDtP|sj-yWSy8uxb~lTu(#wlFZ52P_ zl&Sl5NrJFloJ?`4?bdYKE*{}DQ@GW~tHYP#cdb4DJLD(<4a{}8@oqxcu@w5(y#3ovh@UwEh(^0VpQC4YLrxW4? zP8q_Th$o%C7Eg0JF3t$767`K(#_5=J%(Y6?b@A~FtR_Ra#VqGH7HuZttn!l_8yyWAlBDn8|uA*@_J zBDR;t`ub+$ff*z#b zijfYf-hYWE{Xb7ksq$Pjz#r0K)ExDLzrZp->hOn{&V#aq!NpUm{3(9J=|m;mrF%+ZiRZSbmqBCE(t!j*a5ily)h9V?ql_%X9TRDL z-KyJbF|gj*NHd$oLo#A?h3U+V@1 zMdccVYOK0OLb2awAnGKAHJn^8e*6Q$e&k0pZGmz?kp$k_<+I>#d2n9tzF$E=i7rZ6&l zQ&dB?!V4?J8=^Z=!E7%lY}(_f_gIRNHwI{JR1>znf_{%`%5HJOe6OOKvFAj^uCCD` z%)_LWS?p>Mqg6kV)p8EcJsa7AP2mwUg}XD(Mz&<@IBEB3t=JZP*B*J^HtawJB~@v| zs(AA_enDx=j2h|eORYi#vk_HVnjo}eHHmQi+OhhaGIbA}aF5ZBH6@fkbq5O9NEowV zNK|{aos(t-9oSw@c|zYbpXd&3m*wxKbz~!akTP`!HK;>J_&a1yf}_wcx+9xLaRrOR zg-AA=DEX{!vnr7+m*Y$w`r1gggsACJHIcDE=X=QsLKHiqg$gZh)sBv0mne-fvAQmr z-5|0h`b9^xJDe5^MJF3X$1nrFn-F$skEO%g?O1)H?U&(IhO85j-$;YdjSV8I_l-eF zU|B?;ITsj&?raTVtwe+HAv;54NHz#P*iS_1fd+V4tgBV4P`qLgK4Jl!G6eC;r!Ku% zbVXcfbRSkqlzMA^r$koSR~xTk`E8>6GasU=r{K+ZDJ+oVOrftSro#Ys-mWFBURYf> zkUe$q3Uw2U)5L)+$X}y~Z;(PcWeNwsfj^#S@mieF=jQBA1KH{7S}C*O@-vV<;51X% z0QpiGyu%r%QaH94{@6N|r4v@af{__SZdXKz%O%=SsMDpgCIOf+Lx@f86rIL)aQajj zHNJ{6jQz+dQ^*=A!rO44a>5k_@AzVJP0V*f*Ug?L!uLHmX>n?n%y2IzKp4g1v{XWD z;#9ZMY$PY}%I|*|oz5(^cnL!1#NBS=Su`iujtlD_J&A26>U6Px^kinNt)<*Q_MF>P zHkuRGB?{A7);pBK!`$4&8i*9=}5@5UYPvq46E6^$vwpkQ3Y1sREID zzeB^{p=s~X!gpxhJGA>9Dt?E){hORn;e)>s=+!%9sPlH8s=q@`-l6vIP>*+L@H;g5 zEpkq0^WVbhEdL$)@*OIAhpxOs_uipD-XXWTZ+F7}HaS`F+sN9yL*3q?f$z|ScWCZA zw1QKfu(Q@O*Xe9fL##ea2s$%3I+HEolqU=i8yh`?ImoMt{QYRM4lnzX7qA^XaHj6tWM6qB+eh?6^3CXt>?qL=csRC+og(^r#NFsk>=F^) zz-(qWi0}qxGrOY^EanH%TUhg^*a&R(uhCzyVHG5*NtKw7VZeA%*ue^TaF*bmqRy?v zstsJWaAh>SATpGu6(kD(V52#m5JS!<0L|3mgpl(e0DWGO z^4I9yY!}6y@)l#%%9U9YXBJ%A4zh(|yqUU!WtCzMvb{tD7wdss@HM!+3lE|XGQCE+ zs9UC(L#!52u9p?4#ak&4vGx@Am3NwWnDrn^fFV1~MiO1L!#&YqHjD6^RHRiJVOP}~ zm6;D~^PT#vGK&a(0S{P?u;5l&TYFyik2%766SefJ3ACLk{WPY$PIOcqQ-vjm)Pn>~ zTL0adBdmo+I@z2i7P2^^B{PsxhystQ9&XIn*(j!v6;s&gk?#Y2Pn1~L0_YhL4n-kz zZ=*GGe4DmF0YvjJM*@97;Tb(0Z5mLq=jQ*PO#T+@)^LQPcU7C zHej%^p?>bpYQwLL2hk_lLJH=8(sR=tF2iU*#q2tTTauBU5Ha5bp_sX}(~7Fat+>nmW}*7QS@0hQ6pVZy)^M0`-CV19zvXB zD~WEEAZ_D>+oTg?&ap!p>9#hT7IU7R;FPC3dTb`pSt4W5$efr9>^lwNM_x|MCH4bF zPMn$(^9{p4pTr+Mlc(mWPq4+0rY?`U&U`xXU>$tC7Ra9{u`W^_BF7P=Mnv^}kV1(L zmm;+$%DILVNfcCs)R`zU2&pGgvU5ISe?l+bm?1>z3?uszx$%h^M8rP8xRFH9LXjpCjqigrooE5K zi%*FBc$tfc%nGJlNz?|%$;s9e*1n37+lX57mhL55#Z9P?sP!OBd5Y*SUg0I8D|(D8 zC7Q*pdD> zh)>fsqVH2MWjWE+K%}1{@wNA``<~7h*RK@Wf-kO@MCbUDQ95Z2ox~TH2T>Pp>)u4G zFJhs7M8(-ib%@6B)zp|s$LRwgs6S7)pAS?7MaJ{R6+`677gu+pdA!1YM3?PYMJmw@ zZnC3@GGK9CXOoD!@pX_%w2LqFY$PXCKest1T}+Vs}I z=#-3cM~N<;Mf#fP(HDGiJttbo7nc~NO~q|K z+?9!{EWkp&h?eoC=1UZsgmE>A?wF7oXynvgosRfEMRuxz6i(ESFT+Tpd3+gmA@ZMq zDSHulaw|z8n!p$3Frvcxm~tG^!TCr|BIjRxfM*k~vUz8n*nx|sZx)He#a3UrW>bcDhCE9cg<0cS|;)^ni=rteiT%zrK zQLZ3rI0Ew(5KZMNcM%!6asVBdka~cSn^7ZRWRLs|JAW6PYuSqKQIl zA@v~I#FuXh(PqAUM-p}B%XhMqa2H>(vxyvh#V#UR$yaPX(a2=1Vhhnu?t=Fc-K&Rj zMMO?Mq34Op`K7s(s3xD7d$Dx=E6>G@PkE%a338pite`azr^Ml~VO&AXx6D{U+hT68 zuAJ~r-O#a=4dn!XXb67*{T-XA#R(&h6~uhU<`Inpy2;kWiTHPaGvQ8sPt5mhGmo4p z+zZ(gQ^x+mDNkn{c_gNs6=?)1kHp+&XDBXs$dQ=4td!!uID91LM|PLf3Ed0zjFnkC z6y8n{?z46Ay!E=TZ(D)BAbK=4LHLR7ClZ}jpi@Ml&II9~>>5#LwV^MoV{jZv5PoJ= zJ8Ol79Z^$#;V$%WX@c;GMN{a7QY%m|qMU09!ef?3wEmhEXaZ4CQG)P<%_RDuNWBK7 zbx59{ApFV-DRkO=E6@cZFKF;nRz}odsuk!lQF?iT@Edzgl&yBKL4)gkn;`toT6EDG z-0@p=nvDhOvojKe7wlsS-K_3`q|Q+T6NEq6J_=ks&28cwDpt~$hE6h;rjy;gjdW=6f?jIREwzeR)X-FH6?nc_Or7($@MNL2%=OJZj&z=Aqxw&%s6)$n z@U2nFqnp;wZu6`_cA|v-34*IspD3lj6{rPK=8XhFCq)zGsl6Pmo#DlBcup#9q(I{c zb-RO2Hn_n=8l;E>t%~aN)i6I6p&t)_)axa!q0o71jvq@3Y6D&KmTcX%qZM6CxU2v%t+QL;M1pS25`1(sl!o>AbM zZ>>NsA8Hl;0#!I96OrzkS_V}(n`I^l{!&*8?T~2&N+vp;l^|4?MiYITWd)i}bo@es zP(xZkbm@W>XbsVn2?;`gw4G?t1S`-Hq6b3~gqqShqDsC)t$^PX79LL!YDo`?E~sm( zvv$sgu<+_gQ9ZO?w1I_JN9slN9xS}N(qN(}Sa@}%Nkos2!AD`GIYa^sUOj0k(S|AT z%{Hlk=-3o1&|V@VEV261Nuv5F9StR=r`C*bV0AQj>^aIf(F!@%}Z$yj1 zb6n_kq+V_q+B8k#6?K?MEhX|+ezDq&Z(}oSUdeZXkkamt+&?RjcTu2 zY>Ivt_>>rF0|kDq{#XkJ#sTX+PP$8h%~VHiHl^Ohvk5{sX<8pG`=hf~pj@JpR}zE- zX*E%qda^dFQ?C;&_YbA-C@>K$_Cx7sqJ7}Fdq^*dN>ythEREYROueL@eYG0?fMMz- zr4dzGkRbGyCJ^~8uma5{S_ZD5kE9aqxM~I3KopvkAoP`X6GbIifld(JF(nB7q;H6x zs^14Pcm37r2|}XulmhRoe+Gh4^aIz?UuxV>YuRvc9sQ*?MDxIPBukx%R)FhBmXe74 z!F8laBZ)%6b)-nsh&;j221q$X0bpnYq}4xRb$BI8idJvLR9zqKV*6hDZa53@|xErSU{|n4F=~T%zy6oeYy! z5WN6*GECY=)E?Z)aH)`}kD6H*E=<3IGZ`sWNzxjj2Zu3IvJ-j3#b=ZhOw{m(6{s!I z18^pzr39kC)L)@6eLOgmbZIpO4p-~dgKpLXdl@I)r@&ZnCgY@+L@l89@sdY>t@d8v zOvX$8L~-CuCP?oQ^#f-zL26Gl37pA9sRz*~;7le;Lx`HgbCpTb6rygnR4ZUEp*wiC zkEPFust-^f*Ml3BP2f$YNDnCVm|8ms+Wi_P*(o(k*4k!*djqEwNwgij$uy}KQ3-gH zY0_|_hH!6?Ax$F+hkJtz=~JSqQ08>$bE0f8oaxeDA|ov4Oz9L+9lS@#l)fX}3?3s( zdPH;_JVutpQnaRpLfj0=NYnx1W=OS(`oR>=ltPI{sWs|@H#rX8WR6rof#0j+>w`DB z1=Y`&k_KpH{;o<5U_xWSo8(HHDX_o#0R$Sn;8t~^^cw}%a;oVKSYnVH3`w3eXP}n9 zHVjFgw1Vgb_!w2%N@Td2*N_DUjRP}YDm|ybxnRair7DB8?61LQmPs}uzd>p@$e~Yz zidRU3D0I5|Nki~FJ>edCwRD97#~-l*-6v`ao+n@Wlc*zjo_xt8RjZ;HJkJ`*kLWw_ zJZq%)i28u%`Alj@Gz>h?XHpNMs%HE+>tG^3H7=OB8_aO;vQEmOz*?E=&|nsrya`;- zdg(fa?g7`cUV1>Z8C=f>=@rpla6KC&&or%Rox$}KNHvHCf$J%dni1^+_p(vyNOWHP zJs8~eN^mcmrG*su1>D1LmOdvMnVcYOk@gTxQllENcJ-Vv+1sRAgSGl{!PK@%p+x0y z>$6>oBKlR`-v|~%d2WL6rL>p=pXFMC3OH$h^S@I%G*T<Ej1$i0y6HF+P{h1kRa@lx)SAY zumYtL?cNT5B`l34y13m6G?(a?O$ow2NhPYf*$T9U=&SV!!dKEhqVLzkPqnY4vxJqm zB?$Ya8$`9YS%DrCg+cERNPiLahTb2Ls*curSO66slpI87Hd%q15RHSlLsDy^9Edw4 zbtihhF2N}rmXZm*KDPo*Aesyn9+74ct$+%TNXv*KprM7*2BK7GXrXj~C~0kia8xQG zn!MHubd#t)#2u6VNz?)2oW~^iw*vg_tZM^9S|qs>CBcvuN!5wwZ%z=7OAU#>f+0OF zMG!IQ;R&fTkw5hCgfx)I@Q(!Hq%?-8@jt9Uvx%~H!c$PEw3x79r&TDHHgUoofYUK0 z(msvgS>2_WQ&J%(d{%cIsD#Kk@>a~((lw3XXZ@|1Gg3LlO`Liw=A87H;wA%KkX~>) zA^Z}SCSH=%n@yMwp4~l+xg;6WaUk+^iFJ{Di5y3e0*LDSAO#T}E=6iWlyeO!j3}rG zDS{|62q~HXS9NS_kj zI)}7^XzU22&xw{@aw2Xe%)EiLhiE``q$5Nxh9i{_g*cEd5?$~_xW>+-68W z6R{7Fo)InZdFTXuP3Xsy>c(nQVOB7yCs7;Ti)uu*uVP#cqL#e+AfhXJjB85t3s2dS zsDT;dIuJF>d>G@rB*hb+&ceu^M8_{6^(T5T1ZfCS;c=vNqAFITDMTd}q?tqwxs~J) zy~nL&3DM(YkkTowAvAKs*hKU`w~L)bd-&WRAiB-12qVfSqSBd`O6_ydz zJArZciHZgxIe#Hc=LYpBQ44NR@;GfO&RxQ!?nIOLRG5jnaJz62t-gpU1Bv$YhBhMd z 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 R6MXKLB-Scx`avN0{{WfHQ=$L> delta 94324 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 literal 0 HcmV?d00001 diff --git a/bin/smo/coreclr/System.Data.SqlClient.dll b/bin/smo/coreclr/System.Data.SqlClient.dll new file mode 100644 index 0000000000000000000000000000000000000000..1ab74776bfd12a4d8cae9f5f80b3eb31b97f913d GIT binary patch literal 260344 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 + } + } + } + #endregion Utility functions + + #region Ensure Credential integrity + <# + Usually, the parameter type should have been not object but off the PSCredential type. + When binding null to a PSCredential type parameter on PS3-4, it'd then show a prompt, asking for username and password. + + In order to avoid that and having to refactor lots of functions (and to avoid making regular scripts harder to read), we created this workaround. + #> + if ($SqlCredential) { + if ($SqlCredential.GetType() -ne [System.Management.Automation.PSCredential]) { + Stop-Function -Message "The credential parameter was of a non-supported type. Only specify PSCredentials such as generated from Get-Credential. Input was of type $($SqlCredential.GetType().FullName)" + return + } + } + #endregion Ensure Credential integrity + + # In an unusual move, Connect-DbaInstance goes the exact opposite way of all commands when it comes to exceptions + # this means that by default it Stop-Function -Messages, but do not be tempted to Stop-Function -Message if ($DisableException) { $EnableException = $false } else { @@ -231,6 +279,7 @@ function Connect-DbaInstance { } } } + #'PrimaryFilePath' seems the culprit for slow SMO on databases $Fields2000_Db = 'Collation', 'CompatibilityLevel', 'CreateDate', 'ID', 'IsAccessible', 'IsFullTextEnabled', 'IsSystemObject', 'IsUpdateable', 'LastBackupDate', 'LastDifferentialBackupDate', 'LastLogBackupDate', 'Name', 'Owner', 'ReadOnly', 'RecoveryModel', 'ReplicationOptions', 'Status', 'Version' $Fields200x_Db = $Fields2000_Db + @('BrokerEnabled', 'DatabaseSnapshotBaseName', 'IsMirroringEnabled', 'Trustworthy') @@ -241,31 +290,80 @@ function Connect-DbaInstance { $Fields201x_Login = $Fields200x_Login + @('PasswordHashAlgorithm') } process { + if (Test-FunctionInterrupt) { return } + foreach ($instance in $SqlInstance) { #region Safely convert input into instance parameters + # removed for now + #endregion Safely convert input into instance parameters + + # Gracefully handle Azure connections + if ($instance.ComputerName -match "database\.windows\.net" -and -not $instance.InputObject.ConnectionContext.IsOpen) { + $isAzure = $true + + # Use available command to build the proper connection string + # but first, clean up passed params so that they match + $boundparams = $PSBoundParameters + [object[]]$connstringcmd = (Get-Command New-DbaConnectionString).Parameters.Keys + [object[]]$connectcmd = (Get-Command Connect-DbaInstance).Parameters.Keys + + foreach ($key in $connectcmd) { + if ($key -notin $connstringcmd -and $key -ne "SqlCredential") { + $null = $boundparams.Remove($key) + } + } + # Build connection string + $azureconnstring = New-DbaConnectionString @boundparams + + try { + # this is the way, as recommended by Microsoft + # https://docs.microsoft.com/en-us/sql/relational-databases/security/encryption/configure-always-encrypted-using-powershell?view=sql-server-2017 + $sqlconn = New-Object System.Data.SqlClient.SqlConnection $azureconnstring + $serverconn = New-Object Microsoft.SqlServer.Management.Common.ServerConnection $sqlconn + $null = $serverconn.Connect() + $server = New-Object Microsoft.SqlServer.Management.Smo.Server $serverconn + } catch { + Stop-Function -Message "Failure" -ErrorRecord $_ -Continue + } + } + #region Safely convert input into instance parameters + <# + This is a bit ugly, but: + In some cases functions would directly pass their own input through when the parameter on the calling function was typed as [object[]]. + This would break the base parameter class, as it'd automatically be an array and the parameterclass is not designed to handle arrays (Shouldn't have to). + + Note: Multiple servers in one call were never supported, those old functions were liable to break anyway and should be fixed soonest. + #> if ($instance.GetType() -eq [Sqlcollaborative.Dbatools.Parameter.DbaInstanceParameter]) { - [DbaInstanceParameter]$ConvertedSqlInstance = $instance - if ($ConvertedSqlInstance.Type -like "SqlConnection") { - [DbaInstanceParameter]$ConvertedSqlInstance = New-Object Microsoft.SqlServer.Management.Smo.Server($ConvertedSqlInstance.InputObject) + [DbaInstanceParameter]$instance = $instance + if ($instance.Type -like "SqlConnection") { + [DbaInstanceParameter]$instance = New-Object Microsoft.SqlServer.Management.Smo.Server($instance.InputObject) } } else { - [DbaInstanceParameter]$ConvertedSqlInstance = [DbaInstanceParameter]($instance | Select-Object -First 1) + [DbaInstanceParameter]$instance = [DbaInstanceParameter]($instance | Select-Object -First 1) if ($instance.Count -gt 1) { - Write-Message -Level Warning -EnableException $true -Message "More than on server was specified when calling Connect-SqlInstance from $((Get-PSCallStack)[1].Command)" + Stop-Function -Message "More than on server was specified when calling Connect-SqlInstance from $((Get-PSCallStack)[1].Command)" -Continue } } #endregion Safely convert input into instance parameters - if ($instance.Type -like "Server") { + + #region Input Object was a server object + if ($instance.Type -like "Server" -or ($isAzure -and $instance.InputObject.ConnectionContext.IsOpen)) { if ($instance.InputObject.ConnectionContext.IsOpen -eq $false) { $instance.InputObject.ConnectionContext.Connect() } if ($SqlConnectionOnly) { - return $instance.InputObject.ConnectionContext.SqlConnectionObject + $instance.InputObject.ConnectionContext.SqlConnectionObject + continue } else { - return $instance.InputObject + $instance.InputObject + continue } } + #endregion Input Object was a server object + + #region Input Object was anything else if ($instance.Type -like "SqlConnection") { $server = New-Object Microsoft.SqlServer.Management.Smo.Server($instance.InputObject) @@ -273,23 +371,43 @@ function Connect-DbaInstance { $server.ConnectionContext.Connect() } if ($SqlConnectionOnly) { - return $server.ConnectionContext.SqlConnectionObject + if ($MinimumVersion -and $server.VersionMajor) { + if ($server.versionMajor -lt $MinimumVersion) { + Stop-Function -Message "SQL Server version $MinimumVersion required - $server not supported." -Continue + } + } + + if ($AzureUnsupported -and $server.DatabaseEngineType -eq "SqlAzureDatabase") { + Stop-Function -Message "Azure SQL Database not supported" -Continue + } + $server.ConnectionContext.SqlConnectionObject + continue } else { if (-not $server.ComputerName) { - if (-not $server.NetName -or $SqlInstance -match '\.') { - $parsedcomputername = $ConvertedSqlInstance.ComputerName + if (-not $server.NetName -or $instance -match '\.') { + $parsedcomputername = $instance.ComputerName } else { $parsedcomputername = $server.NetName } Add-Member -InputObject $server -NotePropertyName ComputerName -NotePropertyValue $parsedcomputername -Force } - return $server + if ($MinimumVersion -and $server.VersionMajor) { + if ($server.versionMajor -lt $MinimumVersion) { + Stop-Function -Message "SQL Server version $MinimumVersion required - $server not supported." -Continue + } + } + + if ($AzureUnsupported -and $server.DatabaseEngineType -eq "SqlAzureDatabase") { + Stop-Function -Message "Azure SQL Database not supported" -Continue + } + $server + continue } } if ($instance.IsConnectionString) { $server = New-Object Microsoft.SqlServer.Management.Smo.Server($instance.InputObject) - } else { + } elseif (-not $isAzure) { $server = New-Object Microsoft.SqlServer.Management.Smo.Server $instance.FullSmoName } @@ -297,8 +415,8 @@ function Connect-DbaInstance { $connstring = $server.ConnectionContext.ConnectionString $server.ConnectionContext.ConnectionString = "$connstring;$appendconnectionstring" $server.ConnectionContext.Connect() - } else { - + } elseif (-not $isAzure) { + # It's okay to skip Azure because this is addressed above with New-DbaConnectionString $server.ConnectionContext.ApplicationName = $ClientName if (Test-Bound -ParameterName 'AccessToken') { @@ -352,6 +470,9 @@ function Connect-DbaInstance { if (Test-Bound -ParameterName 'WorkstationId') { $server.ConnectionContext.WorkstationId = $WorkstationId } + if (Test-Bound -ParameterName 'ApplicationIntent') { + $server.ConnectionContext.ApplicationIntent = $ApplicationIntent + } $connstring = $server.ConnectionContext.ConnectionString if (Test-Bound -ParameterName 'MultiSubnetFailover') { @@ -360,16 +481,14 @@ function Connect-DbaInstance { if (Test-Bound -ParameterName 'FailoverPartner') { $connstring = "$connstring;Failover Partner=$FailoverPartner" } - if (Test-Bound -ParameterName 'ApplicationIntent') { - $connstring = "$connstring;ApplicationIntent=$ApplicationIntent" - } if ($connstring -ne $server.ConnectionContext.ConnectionString) { $server.ConnectionContext.ConnectionString = $connstring } try { - if ($null -ne $SqlCredential.UserName) { + # parse out sql credential to figure out if it's Windows or SQL Login + if ($null -ne $SqlCredential.UserName -and -not $isAzure) { $username = ($SqlCredential.UserName).TrimStart("\") # support both ad\username and username@ad @@ -399,15 +518,26 @@ function Connect-DbaInstance { } if ($NonPooled) { + # When the Connect method is called, the connection is not automatically released. + # The Disconnect method must be called explicitly to release the connection to the connection pool. + # https://docs.microsoft.com/en-us/sql/relational-databases/server-management-objects-smo/create-program/disconnecting-from-an-instance-of-sql-server $server.ConnectionContext.Connect() } elseif ($authtype -eq "Windows Authentication with Credential") { # Make it connect in a natural way, hard to explain. + # See https://docs.microsoft.com/en-us/sql/relational-databases/server-management-objects-smo/create-program/connecting-to-an-instance-of-sql-server $null = $server.Information.Version if ($server.ConnectionContext.IsOpen -eq $false) { + # Sometimes, however, the above may not connect as promised. Force it. + # See https://github.com/sqlcollaborative/dbatools/pull/4426 $server.ConnectionContext.Connect() } } else { - $server.ConnectionContext.SqlConnectionObject.Open() + if (-not $isAzure) { + # SqlConnectionObject.Open() enables connection pooling does not support + # alternative Windows Credentials and passes default credentials + # See https://github.com/sqlcollaborative/dbatools/pull/3809 + $server.ConnectionContext.SqlConnectionObject.Open() + } } } catch { $originalException = $_.Exception @@ -424,47 +554,85 @@ function Connect-DbaInstance { } } - if ($loadedSmoVersion -ge 11) { - if ($server.VersionMajor -eq 8) { - # 2000 - $initFieldsDb = New-Object System.Collections.Specialized.StringCollection - [void]$initFieldsDb.AddRange($Fields2000_Db) - $initFieldsLogin = New-Object System.Collections.Specialized.StringCollection - [void]$initFieldsLogin.AddRange($Fields2000_Login) - $server.SetDefaultInitFields([Microsoft.SqlServer.Management.Smo.Database], $initFieldsDb) - $server.SetDefaultInitFields([Microsoft.SqlServer.Management.Smo.Login], $initFieldsLogin) - } elseif ($server.VersionMajor -eq 9 -or $server.VersionMajor -eq 10) { - # 2005 and 2008 - $initFieldsDb = New-Object System.Collections.Specialized.StringCollection - [void]$initFieldsDb.AddRange($Fields200x_Db) - $initFieldsLogin = New-Object System.Collections.Specialized.StringCollection - [void]$initFieldsLogin.AddRange($Fields200x_Login) - $server.SetDefaultInitFields([Microsoft.SqlServer.Management.Smo.Database], $initFieldsDb) - $server.SetDefaultInitFields([Microsoft.SqlServer.Management.Smo.Login], $initFieldsLogin) - } else { - # 2012 and above - $initFieldsDb = New-Object System.Collections.Specialized.StringCollection - [void]$initFieldsDb.AddRange($Fields201x_Db) - $initFieldsLogin = New-Object System.Collections.Specialized.StringCollection - [void]$initFieldsLogin.AddRange($Fields201x_Login) - $server.SetDefaultInitFields([Microsoft.SqlServer.Management.Smo.Database], $initFieldsDb) - $server.SetDefaultInitFields([Microsoft.SqlServer.Management.Smo.Login], $initFieldsLogin) + # Register the connected instance, so that the TEPP updater knows it's been connected to and starts building the cache + [Sqlcollaborative.Dbatools.TabExpansion.TabExpansionHost]::SetInstance($instance.FullSmoName.ToLower(), $server.ConnectionContext.Copy(), ($server.ConnectionContext.FixedServerRoles -match "SysAdmin")) + + # Update cache for instance names + if ([Sqlcollaborative.Dbatools.TabExpansion.TabExpansionHost]::Cache["sqlinstance"] -notcontains $instance.FullSmoName.ToLower()) { + [Sqlcollaborative.Dbatools.TabExpansion.TabExpansionHost]::Cache["sqlinstance"] += $instance.FullSmoName.ToLower() + } + + # Update lots of registered stuff + if (-not [Sqlcollaborative.Dbatools.TabExpansion.TabExpansionHost]::TeppSyncDisabled) { + $FullSmoName = $instance.FullSmoName.ToLower() + foreach ($scriptBlock in ([Sqlcollaborative.Dbatools.TabExpansion.TabExpansionHost]::TeppGatherScriptsFast)) { + Invoke-TEPPCacheUpdate -ScriptBlock $scriptBlock + } + } + + # By default, SMO initializes several properties. We push it to the limit and gather a bit more + # this slows down the connect a smidge but drastically improves overall performance + # especially when dealing with a multitude of servers + if ($loadedSmoVersion -ge 11 -and -not $isAzure) { + try { + if ($server.VersionMajor -eq 8) { + # 2000 + $initFieldsDb = New-Object System.Collections.Specialized.StringCollection + [void]$initFieldsDb.AddRange($Fields2000_Db) + $initFieldsLogin = New-Object System.Collections.Specialized.StringCollection + [void]$initFieldsLogin.AddRange($Fields2000_Login) + $server.SetDefaultInitFields([Microsoft.SqlServer.Management.Smo.Database], $initFieldsDb) + $server.SetDefaultInitFields([Microsoft.SqlServer.Management.Smo.Login], $initFieldsLogin) + } elseif ($server.VersionMajor -eq 9 -or $server.VersionMajor -eq 10) { + # 2005 and 2008 + $initFieldsDb = New-Object System.Collections.Specialized.StringCollection + [void]$initFieldsDb.AddRange($Fields200x_Db) + $initFieldsLogin = New-Object System.Collections.Specialized.StringCollection + [void]$initFieldsLogin.AddRange($Fields200x_Login) + $server.SetDefaultInitFields([Microsoft.SqlServer.Management.Smo.Database], $initFieldsDb) + $server.SetDefaultInitFields([Microsoft.SqlServer.Management.Smo.Login], $initFieldsLogin) + } else { + # 2012 and above + $initFieldsDb = New-Object System.Collections.Specialized.StringCollection + [void]$initFieldsDb.AddRange($Fields201x_Db) + $initFieldsLogin = New-Object System.Collections.Specialized.StringCollection + [void]$initFieldsLogin.AddRange($Fields201x_Login) + $server.SetDefaultInitFields([Microsoft.SqlServer.Management.Smo.Database], $initFieldsDb) + $server.SetDefaultInitFields([Microsoft.SqlServer.Management.Smo.Login], $initFieldsLogin) + } + } catch { + # perhaps a DLL issue, continue going } } if ($SqlConnectionOnly) { - return $server.ConnectionContext.SqlConnectionObject + $server.ConnectionContext.SqlConnectionObject + continue } else { if (-not $server.ComputerName) { - if (-not $server.NetName -or $SqlInstance -match '\.') { - $parsedcomputername = $ConvertedSqlInstance.ComputerName + # Make ComputerName easily available in the server object + if (-not $server.NetName -or $instance -match '\.') { + $parsedcomputername = $instance.ComputerName } else { $parsedcomputername = $server.NetName } Add-Member -InputObject $server -NotePropertyName ComputerName -NotePropertyValue $parsedcomputername -Force } } + + if ($MinimumVersion -and $server.VersionMajor) { + if ($server.versionMajor -lt $MinimumVersion) { + Stop-Function -Message "SQL Server version $MinimumVersion required - $server not supported." -Continue + } + } + + if ($AzureUnsupported -and $server.DatabaseEngineType -eq "SqlAzureDatabase") { + Stop-Function -Message "Azure SQL Database not supported" -Continue + } + $server + continue } + #endregion Input Object was anything else } } \ No newline at end of file diff --git a/functions/ConvertTo-DbaDataTable.ps1 b/functions/ConvertTo-DbaDataTable.ps1 index b8dc937b5c..1affe8699c 100644 --- a/functions/ConvertTo-DbaDataTable.ps1 +++ b/functions/ConvertTo-DbaDataTable.ps1 @@ -374,10 +374,10 @@ function ConvertTo-DbaDataTable { $datarow.Item($property.Name) = $newColumn.Value } catch { - Write-Message -Level Warning -Message "Failed to add property $($property.Name) from $object" -ErrorRecord $_ -Target $object + Stop-Function -Message "Failed to add property $($property.Name) from $object" -ErrorRecord $_ -Target $object } } else { - Write-Message -Level Warning -Message "Failed to add property $($property.Name) from $object" -ErrorRecord $_ -Target $object + Stop-Function -Message "Failed to add property $($property.Name) from $object" -ErrorRecord $_ -Target $object } } } diff --git a/functions/ConvertTo-DbaTimeline.ps1 b/functions/ConvertTo-DbaTimeline.ps1 index e682c2ef1c..b4841a4efd 100644 --- a/functions/ConvertTo-DbaTimeline.ps1 +++ b/functions/ConvertTo-DbaTimeline.ps1 @@ -45,7 +45,7 @@ function ConvertTo-DbaTimeline { .EXAMPLE PS C:\> $messageParameters = @{ >> Subject = "Backup history for sql2017 and sql2016" - >> Body = Get-DbaBackupHistory -SqlInstance sql2017, sql2016 -Since '2018-08-13 00:00' | ConvertTo-DbaTimeline + >> Body = Get-DbaBackupHistory -SqlInstance sql2017, sql2016 -Since '2018-08-13 00:00' | ConvertTo-DbaTimeline | Out-String >> From = "dba@ad.local" >> To = "dba@ad.local" >> SmtpServer = "smtp.ad.local" diff --git a/functions/Copy-DbaAgentAlert.ps1 b/functions/Copy-DbaAgentAlert.ps1 index e932a119c6..89107557bf 100644 --- a/functions/Copy-DbaAgentAlert.ps1 +++ b/functions/Copy-DbaAgentAlert.ps1 @@ -150,6 +150,23 @@ function Copy-DbaAgentAlert { continue } + if ($serverAlert.HasNotification) { + $alertOperators = $serverAlert.EnumNotifications() + if ($destServerOperators.Name -notin $alertOperators.OperatorName) { + $missingOperators = ($alertOperators | Where-Object OperatorName -NotIn $destServerOperators.Name).OperatorName + if ($missingOperators.Count -gt 0 -or $missingOperators.Length -gt 0) { + $operatorList = $missingOperators -join ',' + if ($PSCmdlet.ShouldProcess($destinstance, "Missing operator(s) at destination.")) { + $copyAgentAlertStatus.Status = "Skipped" + $copyAgentAlertStatus.Notes = "Operator(s) [$operatorList] do not exist on destination" + $copyAgentAlertStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject + Write-Message -Message "One or more operators alerted by [$alertName] is not present at the destination. Alert will not be copied. Use Copy-DbaAgentOperator to copy the operator(s) to the destination. Missing operator(s): $operatorList" -Level Warning + continue + } + } + } + } + if ($destAlerts.name -contains $serverAlert.name) { if ($force -eq $false) { if ($PSCmdlet.ShouldProcess($destinstance, "Alert [$alertName] exists at destination. Use -Force to drop and migrate.")) { diff --git a/functions/Copy-DbaDatabase.ps1 b/functions/Copy-DbaDatabase.ps1 index 41e4aabe0c..db6a63cc99 100644 --- a/functions/Copy-DbaDatabase.ps1 +++ b/functions/Copy-DbaDatabase.ps1 @@ -8,6 +8,8 @@ function Copy-DbaDatabase { By default, databases will be migrated to the destination SQL Server's default data and log directories. You can override this by specifying -ReuseSourceFolderStructure. Filestreams and filegroups are also migrated. Safety is emphasized. + If you are experiencing issues with Copy-DbaDatabase, please use Backup-DbaDatabase | Restore-DbaDatabase instead. + .PARAMETER Source Source SQL Server. @@ -118,7 +120,9 @@ function Copy-DbaDatabase { Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. .PARAMETER Force - If this switch is enabled, existing databases on Destination with matching names from Source will be dropped. If using -DetachReattach, mirrors will be broken and the database(s) dropped from Availability Groups. + If this switch is enabled, existing databases on Destination with matching names from Source will be dropped. + If using -DetachReattach, mirrors will be broken and the database(s) dropped from Availability Groups. + If using -SetSourceReadonly, this will instantly roll back any open transactions that may be stopping the process. .NOTES Tags: Migration, Backup, Restore @@ -1111,7 +1115,7 @@ function Copy-DbaDatabase { If ($Pscmdlet.ShouldProcess($source, "Set $dbName to read-only")) { Write-Message -Level Verbose -Message "Setting database to read-only." try { - $result = Set-DbaDbState -SqlInstance $sourceServer -Database $dbName -ReadOnly -EnableException + $result = Set-DbaDbState -SqlInstance $sourceServer -Database $dbName -ReadOnly -EnableException -Force:$Force } catch { Stop-Function -Continue -Message "Couldn't set database to read-only. Aborting routine for this database" -ErrorRecord $_ } diff --git a/functions/Copy-DbaDbMail.ps1 b/functions/Copy-DbaDbMail.ps1 index 5f1d71fb99..774a0f416a 100644 --- a/functions/Copy-DbaDbMail.ps1 +++ b/functions/Copy-DbaDbMail.ps1 @@ -124,6 +124,8 @@ function Copy-DbaDbMail { Write-Message -Message "Migrating accounts." -Level Verbose foreach ($account in $sourceAccounts) { $accountName = $account.name + $newAccountName = $accountName -replace [Regex]::Escape($source), $destinstance + Write-Message -Message "Updating account name from '$accountName' to '$newAccountName'." -Level Verbose $copyMailAccountStatus = [pscustomobject]@{ SourceServer = $sourceServer.Name DestinationServer = $destServer.Name @@ -134,25 +136,25 @@ function Copy-DbaDbMail { DateTime = [Sqlcollaborative.Dbatools.Utility.DbaDateTime](Get-Date) } - if ($accounts.count -gt 0 -and $accounts -notcontains $accountName) { + if ($accounts.count -gt 0 -and $accounts -notcontains $newAccountName) { continue } - if ($destAccounts.name -contains $accountName) { + if ($destAccounts.name -contains $newAccountName) { if ($force -eq $false) { - If ($pscmdlet.ShouldProcess($destinstance, "Account $accountName exists at destination. Use -Force to drop and migrate.")) { + If ($pscmdlet.ShouldProcess($destinstance, "Account '$newAccountName' exists at destination. Use -Force to drop and migrate.")) { $copyMailAccountStatus.Status = "Skipped" $copyMailAccountStatus.Notes = "Already exists on destination" $copyMailAccountStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject - Write-Message -Message "Account $accountName exists at destination. Use -Force to drop and migrate." -Level Verbose + Write-Message -Message "Account $newAccountName exists at destination. Use -Force to drop and migrate." -Level Verbose } continue } - If ($pscmdlet.ShouldProcess($destinstance, "Dropping account $accountName and recreating.")) { + If ($pscmdlet.ShouldProcess($destinstance, "Dropping account '$newAccountName' and recreating.")) { try { - Write-Message -Message "Dropping account $accountName." -Level Verbose - $destServer.Mail.Accounts[$accountName].Drop() + Write-Message -Message "Dropping account '$newAccountName'." -Level Verbose + $destServer.Mail.Accounts[$newAccountName].Drop() $destServer.Mail.Accounts.Refresh() } catch { $copyMailAccountStatus.Status = "Failed" @@ -162,18 +164,18 @@ function Copy-DbaDbMail { } } - if ($pscmdlet.ShouldProcess($destinstance, "Migrating account $accountName.")) { + if ($pscmdlet.ShouldProcess($destinstance, "Migrating account '$accountName'.")) { try { - Write-Message -Message "Copying mail account $accountName." -Level Verbose + Write-Message -Message "Copying mail account '$accountName'." -Level Verbose $sql = $account.Script() | Out-String - $sql = $sql -replace [Regex]::Escape("'$source'"), "'$destinstance'" + $sql = $sql -replace "(?<=@account_name=N'[\d\w\s']*)$sourceRegEx(?=[\d\w\s']*',)", $destinstance Write-Message -Message $sql -Level Debug $destServer.Query($sql) | Out-Null $copyMailAccountStatus.Status = "Successful" } catch { $copyMailAccountStatus.Status = "Failed" $copyMailAccountStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject - Stop-Function -Message "Issue copying mail account." -Target $accountName -Category InvalidOperation -InnerErrorRecord $_ + Stop-Function -Message "Issue copying mail account." -Target $newAccountName -Category InvalidOperation -InnerErrorRecord $_ } $copyMailAccountStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject } @@ -189,6 +191,8 @@ function Copy-DbaDbMail { foreach ($profile in $sourceProfiles) { $profileName = $profile.name + $newProfileName = $profileName -replace [Regex]::Escape($source), $destinstance + Write-Message -Message "Updating profile name from '$profileName' to '$newProfileName'." -Level Verbose $copyMailProfileStatus = [pscustomobject]@{ SourceServer = $sourceServer.Name DestinationServer = $destServer.Name @@ -199,39 +203,40 @@ function Copy-DbaDbMail { DateTime = [Sqlcollaborative.Dbatools.Utility.DbaDateTime](Get-Date) } - if ($profiles.count -gt 0 -and $profiles -notcontains $profileName) { + if ($profiles.count -gt 0 -and $profiles -notcontains $newProfileName) { continue } - if ($destProfiles.name -contains $profileName) { + if ($destProfiles.name -contains $newProfileName) { if ($force -eq $false) { - If ($pscmdlet.ShouldProcess($destinstance, "Profile $profileName exists at destination. Use -Force to drop and migrate.")) { + If ($pscmdlet.ShouldProcess($destinstance, "Profile '$newProfileName' exists at destination. Use -Force to drop and migrate.")) { $copyMailProfileStatus.Status = "Skipped" $copyMailProfileStatus.Notes = "Already exists on destination" $copyMailProfileStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject - Write-Message -Message "Profile $profileName exists at destination. Use -Force to drop and migrate." -Level Verbose + Write-Message -Message "Profile '$newProfileName' exists at destination. Use -Force to drop and migrate." -Level Verbose } continue } - If ($pscmdlet.ShouldProcess($destinstance, "Dropping profile $profileName and recreating.")) { + If ($pscmdlet.ShouldProcess($destinstance, "Dropping profile '$newProfileName' and recreating.")) { try { - Write-Message -Message "Dropping profile $profileName." -Level Verbose - $destServer.Mail.Profiles[$profileName].Drop() + Write-Message -Message "Dropping profile '$newProfileName'." -Level Verbose + $destServer.Mail.Profiles[$newProfileName].Drop() $destServer.Mail.Profiles.Refresh() } catch { $copyMailProfileStatus.Status = "Failed" $copyMailProfileStatus | Select-DefaultView -Property DateTime, SourceServer, DestinationServer, Name, Type, Status, Notes -TypeName MigrationObject - Stop-Function -Message "Issue dropping profile." -Target $profileName -Category InvalidOperation -InnerErrorRecord $_ -Continue + Stop-Function -Message "Issue dropping profile." -Target $newProfileName -Category InvalidOperation -InnerErrorRecord $_ -Continue } } } - if ($pscmdlet.ShouldProcess($destinstance, "Migrating mail profile $profileName.")) { + if ($pscmdlet.ShouldProcess($destinstance, "Migrating mail profile '$profileName'.")) { try { - Write-Message -Message "Copying mail profile $profileName." -Level Verbose + Write-Message -Message "Copying mail profile '$profileName'." -Level Verbose $sql = $profile.Script() | Out-String - $sql = $sql -replace [Regex]::Escape("'$source'"), "'$destinstance'" + $sql = $sql -replace "(?<=@account_name=N'[\d\w\s']*)$sourceRegEx(?=[\d\w\s']*',)", $destinstance + $sql = $sql -replace "(?<=@profile_name=N'[\d\w\s']*)$sourceRegEx(?=[\d\w\s']*',)", $destinstance Write-Message -Message $sql -Level Debug $destServer.Query($sql) | Out-Null $destServer.Mail.Profiles.Refresh() @@ -294,7 +299,7 @@ function Copy-DbaDbMail { try { Write-Message -Message "Copying mail server $mailServerName." -Level Verbose $sql = $mailServer.Script() | Out-String - $sql = $sql -replace [Regex]::Escape("'$source'"), "'$destinstance'" + $sql = $sql -replace "(?<=@account_name=N'[\d\w\s']*)$sourceRegEx(?=[\d\w\s']*',)", $destinstance Write-Message -Message $sql -Level Debug $destServer.Query($sql) | Out-Null $copyMailServerStatus.Status = "Successful" @@ -315,6 +320,7 @@ function Copy-DbaDbMail { return } $mail = $sourceServer.mail + $sourceRegEx = [RegEx]::Escape($source) } process { if (Test-FunctionInterrupt) { return } diff --git a/functions/Copy-DbaDbTableData.ps1 b/functions/Copy-DbaDbTableData.ps1 index b8ca76c172..d8c1ae3c59 100644 --- a/functions/Copy-DbaDbTableData.ps1 +++ b/functions/Copy-DbaDbTableData.ps1 @@ -200,7 +200,7 @@ function Copy-DbaDbTableData { } } }' - + Add-Type -ReferencedAssemblies System.Data.dll -TypeDefinition $sourcecode -ErrorAction Stop if (-not $script:core) { try { @@ -209,7 +209,7 @@ function Copy-DbaDbTableData { $null = 1 } } - + $bulkCopyOptions = 0 $options = "TableLock", "CheckConstraints", "FireTriggers", "KeepIdentity", "KeepNulls", "Default" @@ -312,7 +312,7 @@ function Copy-DbaDbTableData { } #replacing table schema if ($newTableParts.Schema) { - $rX = "(CREATE TABLE \[)$([regex]::Escape($sqltable.Schema))(\]\.\[$([regex]::Escape($newTableParts.Schema))\]\()" + $rX = "(CREATE TABLE \[)$([regex]::Escape($sqltable.Schema))(\]\.\[$([regex]::Escape($newTableParts.Table))\]\()" $tablescript = $tablescript -replace $rX, "`$1$($newTableParts.Schema)`$2" } @@ -404,9 +404,11 @@ function Copy-DbaDbTableData { [pscustomobject]@{ SourceInstance = $server.Name SourceDatabase = $Database + SourceSchema = $sqltable.Schema SourceTable = $sqltable.Name DestinationInstance = $destServer.name DestinationDatabase = $DestinationDatabase + DestinationSchema = $desttable.Schema DestinationTable = $desttable.Name RowsCopied = $rowstotal Elapsed = [prettytimespan]$elapsed.Elapsed diff --git a/functions/Copy-DbaLinkedServer.ps1 b/functions/Copy-DbaLinkedServer.ps1 index 51761fd2e5..77f6b072b8 100644 --- a/functions/Copy-DbaLinkedServer.ps1 +++ b/functions/Copy-DbaLinkedServer.ps1 @@ -119,12 +119,14 @@ function Copy-DbaLinkedServer { } $linkedServerName = $currentLinkedServer.Name + $linkedServerProductName = $currentLinkedServer.ProductName $linkedServerDataSource = $currentLinkedServer.DataSource $copyLinkedServer = [pscustomobject]@{ SourceServer = $sourceServer.Name DestinationServer = $destServer.Name Name = $linkedServerName + ProductName = $linkedServerProductName DataSource = $linkedServerDataSource Type = "Linked Server" Status = $null @@ -183,7 +185,7 @@ function Copy-DbaLinkedServer { $destServer.Query($sql) - if ($copyLinkedServer.Name -ne $copyLinkedServer.DataSource) { + if ($copyLinkedServer.ProductName -eq 'SQL Server' -and $copyLinkedServer.Name -ne $copyLinkedServer.DataSource) { $sql2 = "EXEC sp_setnetname '$($copyLinkedServer.Name)', '$($copyLinkedServer.DataSource)'; " $destServer.Query($sql2) } diff --git a/functions/Copy-DbaSsisCatalog.ps1 b/functions/Copy-DbaSsisCatalog.ps1 index ee934dbbc1..3a157e5bca 100644 --- a/functions/Copy-DbaSsisCatalog.ps1 +++ b/functions/Copy-DbaSsisCatalog.ps1 @@ -102,6 +102,7 @@ function Copy-DbaSsisCatalog { ) <# Developer note: The throw calls must stay in this command #> begin { + $ISNamespace = "Microsoft.SqlServer.Management.IntegrationServices" function Get-RemoteIntegrationService { param ( [Object]$Computer diff --git a/functions/Disable-DbaTraceFlag.ps1 b/functions/Disable-DbaTraceFlag.ps1 index d2624d70c9..ccfbaa6eab 100644 --- a/functions/Disable-DbaTraceFlag.ps1 +++ b/functions/Disable-DbaTraceFlag.ps1 @@ -21,7 +21,7 @@ function Disable-DbaTraceFlag { Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. .NOTES - Tags: TraceFlag + Tags: TraceFlag, DBCC Author: Garry Bargsley (@gbargsley), http://blog.garrybargsley.com Website: https://dbatools.io diff --git a/functions/Enable-DbaTraceFlag.ps1 b/functions/Enable-DbaTraceFlag.ps1 index 8f5d00e1a0..b9b1884a6d 100644 --- a/functions/Enable-DbaTraceFlag.ps1 +++ b/functions/Enable-DbaTraceFlag.ps1 @@ -21,7 +21,7 @@ function Enable-DbaTraceFlag { Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. .NOTES - Tags: TraceFlag + Tags: TraceFlag, DBCC Author: Garry Bargsley (@gbargsley), http://blog.garrybargsley.com Website: https://dbatools.io diff --git a/functions/Export-DbaDacPackage.ps1 b/functions/Export-DbaDacPackage.ps1 index 3869424f86..29e0500c76 100644 --- a/functions/Export-DbaDacPackage.ps1 +++ b/functions/Export-DbaDacPackage.ps1 @@ -75,8 +75,7 @@ function Export-DbaDacPackage { Uses DacOption object to set the CommandTimeout to 0 then extracts the dacpac for DB1 on sql2016 to $home\Documents\DB1.dacpac including all table data. .EXAMPLE - PS C:\> Export-DbaDacPackage -SqlInstance sql2016 -AllUserDatabases -ExcludeDatabase "DBMaintenance","DBMonitoring" C:\temp - + PS C:\> Export-DbaDacPackage -SqlInstance sql2016 -AllUserDatabases -ExcludeDatabase "DBMaintenance","DBMonitoring" -Path "C:\temp" Exports dacpac packages for all USER databases, excluding "DBMaintenance" & "DBMonitoring", on sql2016 and saves them to C:\temp .EXAMPLE @@ -194,8 +193,12 @@ function Export-DbaDacPackage { Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue } $cleaninstance = $instance.ToString().Replace('\', '-') - - $dbs = Get-DbaDatabase -SqlInstance $server -OnlyAccessible -ExcludeSystem -Database $Database -ExcludeDatabase $ExcludeDatabase + if ($Database) { + $dbs = Get-DbaDatabase -SqlInstance $server -OnlyAccessible -Database $Database -ExcludeDatabase $ExcludeDatabase + } else { + # all user databases by default + $dbs = Get-DbaDatabase -SqlInstance $server -OnlyAccessible -ExcludeSystem -ExcludeDatabase $ExcludeDatabase + } if (-not $dbs) { Stop-Function -Message "Databases not found on $instance" -Target $instance -Continue } diff --git a/functions/Find-DbaBackup.ps1 b/functions/Find-DbaBackup.ps1 index 856b191d3c..d2ba50a3d9 100644 --- a/functions/Find-DbaBackup.ps1 +++ b/functions/Find-DbaBackup.ps1 @@ -61,6 +61,10 @@ function Find-DbaBackup { Searches for all bak files in C:\MSSQL\Backup\ and all subdirectories that are more than 7 days old will be included, but only if the files have been backed up to another location as verified by checking the Archive bit. + .EXAMPLE + PS C:\> Find-DbaBackup -Path '\\SQL2014\Backup\' -BackupFileExtension bak -RetentionPeriod 24h | Remove-Item -Verbose + + Searches for all bak files in \\SQL2014\Backup\ and all subdirectories that are more than 24 hours old and deletes only those files with verbose message. #> [CmdletBinding()] param ( diff --git a/functions/Find-DbaCommand.ps1 b/functions/Find-DbaCommand.ps1 index cab3caf3a7..e9a835c057 100644 --- a/functions/Find-DbaCommand.ps1 +++ b/functions/Find-DbaCommand.ps1 @@ -38,7 +38,7 @@ function Find-DbaCommand { .NOTES Tags: Find, Help, Command - Author: Simone Bizzotto (@niphold) + Author: Simone Bizzotto (@niphlod) Website: https://dbatools.io Copyright: (c) 2018 by dbatools, licensed under MIT @@ -105,11 +105,17 @@ function Find-DbaCommand { $maxverRex = ([regex]'(?m)^[\s]{0,15}MaximumVersion:(.*)$') function Get-DbaHelp([String]$commandName) { + $availability = 'Windows, Linux, macOS' + if ($commandName -in $script:noncoresmo -or $commandName -in $script:windowsonly) { + $availability = 'Windows only' + } $thishelp = Get-Help $commandName -Full $thebase = @{ } $thebase.CommandName = $commandName $thebase.Name = $thishelp.Name + $thebase.Availability = $availability + $alias = Get-Alias -Definition $commandName -ErrorAction SilentlyContinue $thebase.Alias = $alias.Name -Join ',' diff --git a/functions/Find-DbaLoginInGroup.ps1 b/functions/Find-DbaLoginInGroup.ps1 index 77d71f4109..e740011cd5 100644 --- a/functions/Find-DbaLoginInGroup.ps1 +++ b/functions/Find-DbaLoginInGroup.ps1 @@ -84,8 +84,8 @@ function Find-DbaLoginInGroup { $group = [System.DirectoryServices.AccountManagement.GroupPrincipal]::FindByIdentity($ads, $groupName); $subgroups = @() foreach ($member in $group.Members) { - $memberDomain = $member.DistinguishedName -Split "," | Where-Object { $_ -like "DC=*" } | Select-Object -first 1 | ForEach-Object { $_.ToUpper() -replace "DC=", '' } - if ($member.StructuralObjectClass -eq "group") { + $memberDomain = $ads.Name + if ($member.StructuralObjectClass -eq 'group') { $fullName = $memberDomain + "\" + $member.SamAccountName if ($fullName -in $discard) { Write-Message -Level Verbose -Message "skipping $fullName, already enumerated" diff --git a/functions/Format-DbaBackupInformation.ps1 b/functions/Format-DbaBackupInformation.ps1 index d6da7887a3..f4b5239e9b 100644 --- a/functions/Format-DbaBackupInformation.ps1 +++ b/functions/Format-DbaBackupInformation.ps1 @@ -175,40 +175,39 @@ function Format-DbaBackupInformation { } } $History.Database = $DatabaseNamePrefix + $History.Database - if ($true -ne $Continue) { - $History.FileList | ForEach-Object { - if ($null -ne $FileMapping ) { - if ($null -ne $FileMapping[$_.LogicalName]) { - $_.PhysicalName = $FileMapping[$_.LogicalName] + + $History.FileList | ForEach-Object { + if ($null -ne $FileMapping ) { + if ($null -ne $FileMapping[$_.LogicalName]) { + $_.PhysicalName = $FileMapping[$_.LogicalName] + } + } else { + if ($ReplaceDbNameInFile -eq $true) { + $_.PhysicalName = $_.PhysicalName -Replace $History.OriginalDatabase, $History.Database + } + Write-Message -Message " 1 PhysicalName = $($_.PhysicalName) " -Level Verbose + $Pname = [System.Io.FileInfo]$_.PhysicalName + $RestoreDir = $Pname.DirectoryName + if ($_.Type -eq 'D' -or $_.FileType -eq 'D') { + if ('' -ne $DataFileDirectory) { + $RestoreDir = $DataFileDirectory } - } else { - if ($ReplaceDbNameInFile -eq $true) { - $_.PhysicalName = $_.PhysicalName -Replace $History.OriginalDatabase, $History.Database + } elseif ($_.Type -eq 'L' -or $_.FileType -eq 'L') { + if ('' -ne $LogFileDirectory) { + $RestoreDir = $LogFileDirectory + } elseif ('' -ne $DataFileDirectory) { + $RestoreDir = $DataFileDirectory } - Write-Message -Message " 1 PhysicalName = $($_.PhysicalName) " -Level Verbose - $Pname = [System.Io.FileInfo]$_.PhysicalName - $RestoreDir = $Pname.DirectoryName - if ($_.Type -eq 'D' -or $_.FileType -eq 'D') { - if ('' -ne $DataFileDirectory) { - $RestoreDir = $DataFileDirectory - } - } elseif ($_.Type -eq 'L' -or $_.FileType -eq 'L') { - if ('' -ne $LogFileDirectory) { - $RestoreDir = $LogFileDirectory - } elseif ('' -ne $DataFileDirectory) { - $RestoreDir = $DataFileDirectory - } - } elseif ($_.Type -eq 'S' -or $_.FileType -eq 'S') { - if ('' -ne $DestinationFileStreamDirectory) { - $RestoreDir = $DestinationFileStreamDirectory - } elseif ('' -ne $DataFileDirectory) { - $RestoreDir = $DataFileDirectory - } + } elseif ($_.Type -eq 'S' -or $_.FileType -eq 'S') { + if ('' -ne $DestinationFileStreamDirectory) { + $RestoreDir = $DestinationFileStreamDirectory + } elseif ('' -ne $DataFileDirectory) { + $RestoreDir = $DataFileDirectory } - - $_.PhysicalName = $RestoreDir + $PathSep + $DatabaseFilePrefix + $Pname.BaseName + $DatabaseFileSuffix + $Pname.extension - Write-Message -Message "PhysicalName = $($_.PhysicalName) " -Level Verbose } + + $_.PhysicalName = $RestoreDir + $PathSep + $DatabaseFilePrefix + $Pname.BaseName + $DatabaseFileSuffix + $Pname.extension + Write-Message -Message "PhysicalName = $($_.PhysicalName) " -Level Verbose } } if ('' -ne $RebaseBackupFolder -and $History.FullName[0] -notmatch 'http') { diff --git a/functions/Get-DbaAgentJobHistory.ps1 b/functions/Get-DbaAgentJobHistory.ps1 index 1c8799fad8..01bea6e9d6 100644 --- a/functions/Get-DbaAgentJobHistory.ps1 +++ b/functions/Get-DbaAgentJobHistory.ps1 @@ -241,7 +241,7 @@ function Get-DbaAgentJobHistory { Add-Member -Force -InputObject $execution -MemberType NoteProperty -Name ComputerName -value $server.ComputerName Add-Member -Force -InputObject $execution -MemberType NoteProperty -Name InstanceName -value $server.ServiceName Add-Member -Force -InputObject $execution -MemberType NoteProperty -Name SqlInstance -value $server.DomainInstanceName - $DurationInSeconds = ($execution.RunDuration % 100) + [int]( ($execution.RunDuration % 10000 ) / 100 ) * 60 + [int]( ($execution.RunDuration % 1000000 ) / 10000 ) * 60 * 60 + $DurationInSeconds = ($execution.RunDuration % 100) + [math]::floor( ($execution.RunDuration % 10000 ) / 100 ) * 60 + [math]::floor( ($execution.RunDuration % 1000000 ) / 10000 ) * 60 * 60 Add-Member -Force -InputObject $execution -MemberType NoteProperty -Name StartDate -value ([dbadatetime]$execution.RunDate) Add-Member -Force -InputObject $execution -MemberType NoteProperty -Name EndDate -value ([dbadatetime]$execution.RunDate.AddSeconds($DurationInSeconds)) Add-Member -Force -InputObject $execution -MemberType NoteProperty -Name Duration -value ([prettytimespan](New-TimeSpan -Seconds $DurationInSeconds)) @@ -303,4 +303,4 @@ function Get-DbaAgentJobHistory { } } } -} \ No newline at end of file +} diff --git a/functions/Get-DbaAgentSchedule.ps1 b/functions/Get-DbaAgentSchedule.ps1 index 127968173e..01526f285c 100644 --- a/functions/Get-DbaAgentSchedule.ps1 +++ b/functions/Get-DbaAgentSchedule.ps1 @@ -252,10 +252,10 @@ function Get-DbaAgentSchedule { foreach ($schedule in $scheduleCollection) { $description = Get-ScheduleDescription -Schedule $schedule - Add-Member -Force -InputObject $schedule -MemberType NoteProperty ComputerName -value $server.ComputerName - Add-Member -Force -InputObject $schedule -MemberType NoteProperty InstanceName -value $server.ServiceName - Add-Member -Force -InputObject $schedule -MemberType NoteProperty SqlInstance -value $server.DomainInstanceName - Add-Member -Force -InputObject $schedule -MemberType NoteProperty Description -Value $description + $schedule | Add-Member -Type NoteProperty -Name ComputerName -Value $server.ComputerName + $schedule | Add-Member -Type NoteProperty -Name InstanceName -Value $server.ServiceName + $schedule | Add-Member -Type NoteProperty -Name SqlInstance -Value $server.DomainInstanceName + $schedule | Add-Member -Type NoteProperty -Name Description -Value $description Select-DefaultView -InputObject $schedule -Property $defaults } diff --git a/functions/Get-DbaBackupHistory.ps1 b/functions/Get-DbaBackupHistory.ps1 index 777c79d407..ce17dbc487 100644 --- a/functions/Get-DbaBackupHistory.ps1 +++ b/functions/Get-DbaBackupHistory.ps1 @@ -260,7 +260,7 @@ function Get-DbaBackupHistory { if ($RecoveryFork) { $recoveryForkSqlFilter = "AND backupset.last_recovery_fork_guid ='$RecoveryFork'" } - if ($null -eq (Get-PsCallStack)[1].Command) { + if ($null -eq (Get-PsCallStack)[1].Command -or '{ScriptBlock}' -eq (Get-PsCallStack)[1].Command) { $forkCheckSql = " SELECT database_name, @@ -275,6 +275,7 @@ function Get-DbaBackupHistory { $sinceSqlFilter $recoveryForkSqlFilter GROUP by database_name, last_recovery_fork_guid + ORDER by MaxDate Asc " $results = $server.ConnectionContext.ExecuteWithResults($forkCheckSql).Tables.Rows @@ -283,7 +284,10 @@ function Get-DbaBackupHistory { foreach ($result in $results) { Write-Message -Message "Between $($result.MinDate)/$($result.FirstLsn) and $($result.MaxDate)/$($result.FinalLsn) $($result.name) was on Recovery Fork GUID $($result.RecFork) ($($result.backupcount) backups)" -Level Warning } - + if ($null -eq $RecoveryFork) { + $RecoveryFork = $results[-1].RecFork + Write-Message -Message "Defaulting to last Recovery Fork, ID - $RecoveryFork" + } } } #Get the full and build upwards @@ -540,14 +544,14 @@ function Get-DbaBackupHistory { $from = " FROM msdb..backupmediafamily mediafamily INNER JOIN msdb..backupmediaset mediaset ON mediafamily.media_set_id = mediaset.media_set_id INNER JOIN msdb..backupset backupset ON backupset.media_set_id = mediaset.media_set_id" - if ($Database -or $Since -or $Last -or $LastFull -or $LastLog -or $LastDiff -or $deviceTypeFilter -or $LastLsn -or $backupTypeFilter) { + if ($Database -or $ExcludeDatabase -or $Since -or $Last -or $LastFull -or $LastLog -or $LastDiff -or $deviceTypeFilter -or $LastLsn -or $backupTypeFilter) { $where = " WHERE " } $whereArray = @() - if ($Database.length -gt 0) { - $dbList = $Database -join "','" + if ($Database.length -gt 0 -or $ExcludeDatabase.length -gt 0) { + $dbList = $databases.Name -join "','" $whereArray += "database_name IN ('$dbList')" } diff --git a/functions/Get-DbaBackupInformation.ps1 b/functions/Get-DbaBackupInformation.ps1 index 5bf29078b6..d62bd4a32a 100644 --- a/functions/Get-DbaBackupInformation.ps1 +++ b/functions/Get-DbaBackupInformation.ps1 @@ -192,12 +192,12 @@ function Get-DbaBackupInformation { if ((Test-Bound -Parameter Import) -and ($true -eq $Import)) { foreach ($f in $Path) { if (Test-Path -Path $f) { - $GroupResults += Import-CliXml -Path $f - foreach ($group in $GroupResults) { - $Group.FirstLsn = [BigInt]$group.FirstLSN.ToString() - $Group.CheckpointLSN = [BigInt]$group.CheckpointLSN.ToString() - $Group.DatabaseBackupLsn = [BigInt]$group.DatabaseBackupLsn.ToString() - $Group.LastLsn = [BigInt]$group.LastLsn.ToString() + $groupResults += Import-CliXml -Path $f + foreach ($group in $groupResults) { + $group.FirstLsn = [BigInt]$group.FirstLSN.ToString() + $group.CheckpointLSN = [BigInt]$group.CheckpointLSN.ToString() + $group.DatabaseBackupLsn = [BigInt]$group.DatabaseBackupLsn.ToString() + $group.LastLsn = [BigInt]$group.LastLsn.ToString() } } else { Write-Message -Message "$f does not exist or is unreadable" -Level Warning @@ -210,11 +210,11 @@ function Get-DbaBackupInformation { if ($NoXpDirTree -ne $true) { foreach ($f in $path) { if ([System.IO.Path]::GetExtension($f).Length -gt 1) { - if ("Fullname" -notin $f.PSobject.Properties.name) { + if ("FullName" -notin $f.PSObject.Properties.name) { $f = $f | Select-Object *, @{ Name = "FullName"; Expression = { $f } } } Write-Message -Message "Testing a single file $f " -Level Verbose - if ((Test-DbaPath -Path $f.fullname -SqlInstance $server)) { + if ((Test-DbaPath -Path $f.FullName -SqlInstance $server)) { $files += $f } else { Write-Message -Level Verbose -Message "$server cannot 'see' file $($f.FullName)" @@ -239,19 +239,19 @@ function Get-DbaBackupInformation { Write-Message -Level VeryVerbose -Message "Not using sql for $f" if ($f -is [System.IO.FileSystemInfo]) { if ($f.PsIsContainer -eq $true -and $true -ne $MaintenanceSolution) { - Write-Message -Level VeryVerbose -Message "folder $($f.fullname)" - $Files += Get-ChildItem -Path $f.fullname -File -Recurse:$DirectoryRecurse + Write-Message -Level VeryVerbose -Message "folder $($f.FullName)" + $Files += Get-ChildItem -Path $f.FullName -File -Recurse:$DirectoryRecurse } elseif ($f.PsIsContainer -eq $true -and $true -eq $MaintenanceSolution) { if ($IgnoreLogBackup -and $f -notlike '*LOG' ) { Write-Message -Level Verbose -Message "Skipping Log backups for Maintenance backups" } else { - $Files += Get-ChildItem -Path $f.fullname -File -Recurse:$DirectoryRecurse + $Files += Get-ChildItem -Path $f.FullName -File -Recurse:$DirectoryRecurse } } elseif ($true -eq $MaintenanceSolution) { - $Files += Get-ChildItem -Path $f.fullname -Recurse:$DirectoryRecurse + $Files += Get-ChildItem -Path $f.FullName -Recurse:$DirectoryRecurse } else { Write-Message -Level VeryVerbose -Message "File" - $Files += $f.fullname + $Files += $f.FullName } } else { if ($true -eq $MaintenanceSolution) { @@ -271,19 +271,17 @@ function Get-DbaBackupInformation { $Files = $Files | Where-Object {$_.FullName -notlike '*\LOG\*'} } - Write-Message -Level Verbose -Message "Reading backup headers of $($Files.Count) files" - try { - $FileDetails = Read-DbaBackupHeader -SqlInstance $server -Path $Files -AzureCredential $AzureCredential -EnableException - } catch { - Stop-Function -Message "Failure reading backup header" -ErrorRecord $_ -Target $server -Continue + if ($Files.Count -gt 0) { + Write-Message -Level Verbose -Message "Reading backup headers of $($Files.Count) files" + $FileDetails = Read-DbaBackupHeader -SqlInstance $server -Path $Files -AzureCredential $AzureCredential } - $groupdetails = $FileDetails | Group-Object -Property BackupSetGUID + $groupDetails = $FileDetails | Group-Object -Property BackupSetGUID - foreach ($Group in $GroupDetails) { - $dblsn = $group.Group[0].DatabaseBackupLSN - if (-not $dblsn) { - $dblsn = 0 + foreach ($group in $groupDetails) { + $dbLsn = $group.Group[0].DatabaseBackupLSN + if (-not $dbLsn) { + $dbLsn = 0 } $description = $group.Group[0].BackupTypeDescription if (-not $description) { @@ -295,25 +293,25 @@ function Get-DbaBackupInformation { } } $historyObject = New-Object Sqlcollaborative.Dbatools.Database.BackupHistory - $historyObject.ComputerName = $group.group[0].MachineName - $historyObject.InstanceName = $group.group[0].ServiceName - $historyObject.SqlInstance = $group.group[0].ServerName + $historyObject.ComputerName = $group.Group[0].MachineName + $historyObject.InstanceName = $group.Group[0].ServiceName + $historyObject.SqlInstance = $group.Group[0].ServerName $historyObject.Database = $group.Group[0].DatabaseName $historyObject.UserName = $group.Group[0].UserName $historyObject.Start = [DateTime]$group.Group[0].BackupStartDate $historyObject.End = [DateTime]$group.Group[0].BackupFinishDate $historyObject.Duration = ([DateTime]$group.Group[0].BackupFinishDate - [DateTime]$group.Group[0].BackupStartDate) - $historyObject.Path = [string[]]$Group.Group.BackupPath - $historyObject.FileList = ($group.Group.FileList | Select-Object Type, LogicalName, PhysicalName) - $historyObject.TotalSize = ($Group.Group.BackupSize.Byte | Measure-Object -Sum).Sum - $HistoryObject.CompressedBackupSize = ($Group.Group.CompressedBackupSize.Byte | Measure-Object -Sum).Sum + $historyObject.Path = [string[]]$group.Group.BackupPath + $historyObject.FileList = ($group.Group.FileList | Select-Object Type, LogicalName, PhysicalName -Unique) + $historyObject.TotalSize = ($group.Group.BackupSize.Byte | Measure-Object -Sum).Sum + $HistoryObject.CompressedBackupSize = ($group.Group.CompressedBackupSize.Byte | Measure-Object -Sum).Sum $historyObject.Type = $description $historyObject.BackupSetId = $group.group[0].BackupSetGUID $historyObject.DeviceType = 'Disk' - $historyObject.FullName = $Group.Group.BackupPath + $historyObject.FullName = $group.Group.BackupPath $historyObject.Position = $group.Group[0].Position $historyObject.FirstLsn = $group.Group[0].FirstLSN - $historyObject.DatabaseBackupLsn = $dblsn + $historyObject.DatabaseBackupLsn = $dbLsn $historyObject.CheckpointLSN = $group.Group[0].CheckpointLSN $historyObject.LastLsn = $group.Group[0].LastLsn $historyObject.SoftwareVersionMajor = $group.Group[0].SoftwareVersionMajor @@ -329,20 +327,20 @@ function Get-DbaBackupInformation { $groupResults = $groupResults | Where-Object {$_.Database -in $DatabaseName} } if ($true -eq $Anonymise) { - foreach ($group in $GroupResults) { + foreach ($group in $groupResults) { $group.ComputerName = Get-HashString -InString $group.ComputerName $group.InstanceName = Get-HashString -InString $group.InstanceName $group.SqlInstance = Get-HashString -InString $group.SqlInstance $group.Database = Get-HashString -InString $group.Database $group.UserName = Get-HashString -InString $group.UserName - $group.Path = Get-HashString -InString $Group.Path - $group.FullName = Get-HashString -InString $Group.Fullname + $group.Path = Get-HashString -InString $group.Path + $group.FullName = Get-HashString -InString $group.FullName $group.FileList = ($group.FileList | Select-Object Type, @{Name = "LogicalName"; Expression = {Get-HashString -InString $_."LogicalName"}}, @{Name = "PhysicalName"; Expression = {Get-HashString -InString $_."PhysicalName"}}) } } - if ((Test-Bound -parameterName exportpath) -and $null -ne $ExportPath) { + if ((Test-Bound -parameterName ExportPath) -and $null -ne $ExportPath) { $groupResults | Export-CliXml -Path $ExportPath -Depth 5 -NoClobber:$NoClobber if ($true -ne $PassThru) { return diff --git a/functions/Get-DbaBuildReference.ps1 b/functions/Get-DbaBuildReference.ps1 index 6c5d0334af..b3d703a468 100644 --- a/functions/Get-DbaBuildReference.ps1 +++ b/functions/Get-DbaBuildReference.ps1 @@ -112,63 +112,7 @@ function Get-DbaBuildReference { ) begin { - #region verifying parameters - $ComplianceSpec = @() - $ComplianceSpecExclusiveParams = @('Build', 'Kb', @( 'MajorVersion', 'ServicePack', 'CumulativeUpdate'), 'SqlInstance') - foreach ($exclParamGroup in $ComplianceSpecExclusiveParams) { - foreach ($exclParam in $exclParamGroup) { - if (Test-Bound -Parameter $exclParam) { - $ComplianceSpec += $exclParam - break - } - } - } - if ($ComplianceSpec.Length -gt 1) { - Stop-Function -Category InvalidArgument -Message "$($ComplianceSpec -join ', ') are mutually exclusive. Please choose one or the other. Quitting." - return - } - if ($ComplianceSpec.Length -eq 0) { - Stop-Function -Category InvalidArgument -Message "You need to choose at least one parameter." - return - } - if (((Test-Bound -Parameter ServicePack) -or (Test-Bound -Parameter CumulativeUpdate)) -and (Test-Bound -Not -Parameter MajorVersion)) { - Stop-Function -Category InvalidArgument -Message "-MajorVersion is required when specifying SP or CU." - return - } - if ($MajorVersion) { - if ($MajorVersion -match '^(SQL)?(\d{4}(R2)?)$') { - $MajorVersion = $Matches[2] - } else { - Stop-Function -Message "Incorrect SQL Server version format: use SQL2XXX or just 2XXXX - SQL2012, SQL2008R2" - return - } - if (!$ServicePack) { - $ServicePack = 'RTM' - } - if ($ServicePack -match '^(SP)?\s*(\d+)$') { - if ($Matches[2] -eq '0') { - $ServicePack = 'RTM' - } else { - $ServicePack = 'SP' + $Matches[2] - } - } elseif ($ServicePack -notmatch '^RTM$') { - Stop-Function -Message "Incorrect SQL Server service pack format: use SPX, X or RTM, where X is a service pack number" - return - } - if ($CumulativeUpdate) { - if ($CumulativeUpdate -match '^(CU)?\s*(\d+)$') { - if ($Matches[2] -eq '0') { - $CumulativeUpdate = '' - } else { - $CumulativeUpdate = 'CU' + $Matches[2] - } - } else { - Stop-Function -Message "Incorrect SQL Server cumulative update format: use CUX or X, where X is a cumulative update number" - return - } - } - } - #endregion verifying parameters + #region Helper functions function Get-DbaBuildReferenceIndex { [CmdletBinding()] @@ -377,6 +321,65 @@ function Get-DbaBuildReference { process { if (Test-FunctionInterrupt) { return } + #region verifying parameters + $ComplianceSpec = @() + $ComplianceSpecExclusiveParams = @('Build', 'Kb', @( 'MajorVersion', 'ServicePack', 'CumulativeUpdate'), 'SqlInstance') + foreach ($exclParamGroup in $ComplianceSpecExclusiveParams) { + foreach ($exclParam in $exclParamGroup) { + if (Test-Bound -Parameter $exclParam) { + $ComplianceSpec += $exclParam + break + } + } + } + if ($ComplianceSpec.Length -gt 1) { + Stop-Function -Category InvalidArgument -Message "$($ComplianceSpec -join ', ') are mutually exclusive. Please choose one or the other. Quitting." + return + } + if ($ComplianceSpec.Length -eq 0) { + Stop-Function -Category InvalidArgument -Message "You need to choose at least one parameter." + return + } + if (((Test-Bound -Parameter ServicePack) -or (Test-Bound -Parameter CumulativeUpdate)) -and (Test-Bound -Not -Parameter MajorVersion)) { + Stop-Function -Category InvalidArgument -Message "-MajorVersion is required when specifying SP or CU." + return + } + if ($MajorVersion) { + if ($MajorVersion -match '^(SQL)?(\d{4}(R2)?)$') { + $MajorVersion = $Matches[2] + } else { + Stop-Function -Message "Incorrect SQL Server version format: use SQL2XXX or just 2XXXX - SQL2012, SQL2008R2" + return + } + if (!$ServicePack) { + $ServicePack = 'RTM' + } + if ($ServicePack -match '^(SP)?\s*(\d+)$') { + if ($Matches[2] -eq '0') { + $ServicePack = 'RTM' + } else { + $ServicePack = 'SP' + $Matches[2] + } + } elseif ($ServicePack -notmatch '^RTM$') { + Stop-Function -Message "Incorrect SQL Server service pack format: use SPX, X or RTM, where X is a service pack number" + return + } + if ($CumulativeUpdate) { + if ($CumulativeUpdate -match '^(CU)?\s*(\d+)$') { + if ($Matches[2] -eq '0') { + $CumulativeUpdate = '' + } else { + $CumulativeUpdate = 'CU' + $Matches[2] + } + } else { + Stop-Function -Message "Incorrect SQL Server cumulative update format: use CUX or X, where X is a cumulative update number" + return + } + } + } + #endregion verifying parameters + + foreach ($instance in $SqlInstance) { #region Ensure the connection is established try { diff --git a/functions/Get-DbaDatabase.ps1 b/functions/Get-DbaDatabase.ps1 index 9b7f983e28..b13e8c109a 100644 --- a/functions/Get-DbaDatabase.ps1 +++ b/functions/Get-DbaDatabase.ps1 @@ -9,7 +9,7 @@ function Get-DbaDatabase { SQL Server. If the name of the database is provided, the command will return only the specific database information. .PARAMETER SqlInstance - The target SQL Server instance or instances. Defaults to localhost. + The target SQL Server instance or instances. .PARAMETER SqlCredential Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) @@ -150,8 +150,8 @@ function Get-DbaDatabase { [DbaInstanceParameter[]]$SqlInstance, [PSCredential]$SqlCredential, [Alias("Databases")] - [object[]]$Database, - [object[]]$ExcludeDatabase, + [string[]]$Database, + [string[]]$ExcludeDatabase, [Alias("SystemDbOnly", "NoUserDb", "ExcludeAllUserDb")] [switch]$ExcludeUser, [Alias("UserDbOnly", "NoSystemDb", "ExcludeAllSystemDb")] @@ -276,7 +276,11 @@ function Get-DbaDatabase { $inputObject = @() foreach ($dt in $backed_info) { - $inputObject += $server.Databases | Where-Object Name -ceq $dt.name + if ($server.DatabaseEngineType -eq "SqlAzureDatabase") { + $inputObject += $server.Databases[$dt.name] + } else { + $inputObject += $server.Databases | Where-Object Name -ceq $dt.name + } } $inputobject = $inputObject | Where-Object { @@ -344,7 +348,6 @@ function Get-DbaDatabase { Add-Member -Force -InputObject $db -MemberType NoteProperty -Name LastRead -value $lastusedinfo.last_read Add-Member -Force -InputObject $db -MemberType NoteProperty -Name LastWrite -value $lastusedinfo.last_write Select-DefaultView -InputObject $db -Property $defaults - #try { $server.Databases.Refresh() } catch {} } } catch { Stop-Function -ErrorRecord $_ -Target $instance -Message "Failure. Collection may have been modified. If so, please use parens (Get-DbaDatabase ....) | when working with commands that modify the collection such as Remove-DbaDatabase." -Continue diff --git a/functions/Get-DbaDbDbccOpenTran.ps1 b/functions/Get-DbaDbDbccOpenTran.ps1 new file mode 100644 index 0000000000..e95f9d9238 --- /dev/null +++ b/functions/Get-DbaDbDbccOpenTran.ps1 @@ -0,0 +1,133 @@ +function Get-DbaDbDbccOpenTran { + <# + .SYNOPSIS + Execution of Database Console Command DBCC OPENTRAN + + .DESCRIPTION + Executes the command DBCC OPENTRAN against the requested databases + + Displays information about the oldest active transaction and + the oldest distributed and nondistributed replicated transactions, if any, + within the transaction log of the specified database + + Read more: + - https://docs.microsoft.com/en-us/sql/t-sql/database-console-commands/dbcc-opentran-transact-sql + + .PARAMETER SqlInstance + The target SQL Server instance or instances. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Database + The database(s) to process. If unspecified, all databases will be processed. + The Name or Id of a database can be specified + Database names must comply with the rules for identifiers. + + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: DBCC + Author: Patrick Flynn (@sqllensman) + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaDbDbccOpenTran + + .EXAMPLE + PS C:\> Get-DbaDbDbccOpenTran -SqlInstance SQLServer2017 + + Connects to instance SqlServer2017 using Windows Authentication and runs the command DBCC OPENTRAN WITH TABLERESULTS, NO_INFOMSGS against each database. + + .EXAMPLE + PS C:\> Get-DbaDbDbccOpenTran -SqlInstance SQLServer2017 -Database CurrentDB + + Connects to instance SqlServer2017 using Windows Authentication and runs the command DBCC OPENTRAN(CurrentDB) WITH TABLERESULTS, NO_INFOMSGS against the CurrentDB database. + + .EXAMPLE + PS C:\> $cred = Get-Credential sqladmin + PS C:\> 'Sql1','Sql2/sqlexpress' | Get-DbaDbDbccOpenTran -SqlCredential $cred + + Connects to instances Sql1 and Sql2/sqlexpress using sqladmin credential and runs the command DBCC OPENTRAN WITH TABLERESULTS, NO_INFOMSGS against each database. + #> + [CmdletBinding()] + param ( + [parameter(Mandatory, ValueFromPipeline)] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [string[]]$Database, + [switch]$EnableException + ) + begin { + $stringBuilder = New-Object System.Text.StringBuilder + $null = $stringBuilder.Append("DBCC OPENTRAN(#options#) WITH TABLERESULTS, NO_INFOMSGS") + } + process { + foreach ($instance in $SqlInstance) { + Write-Message -Message "Attempting Connection to $instance" -Level Verbose + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + $dbs = $server.Databases + + if (Test-Bound -ParameterName Database) { + $dbs = $dbs | Where-Object {($_.Name -In $Database) -or ($_.ID -In $Database) } + } + + foreach ($db in $dbs) { + Write-Message -Level Verbose -Message "Processing $db on $instance" + + if ($db.IsAccessible -eq $false) { + Stop-Function -Message "The database $db is not accessible. Skipping." -Continue + } + + try { + $query = $StringBuilder.ToString() + $query = $query.Replace('#options#', "'$($db.Name)'") + + Write-Message -Message "Query to run: $query" -Level Verbose + $results = $server.Query($query) + Write-Message -Message "Finshed" -Level Verbose + } catch { + Stop-Function -Message "Error capturing data on $db" -Target $instance -ErrorRecord $_ -Exception $_.Exception -Continue + } + + if ($null -eq $results) { + [PSCustomObject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + Database = $db.Name + Cmd = $query.ToString() + Output = 'No active open transactions.' + Field = $null + Data = $null + } + } else { + foreach ($row in $results) { + [PSCustomObject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + Database = $db.Name + Cmd = $query.ToString() + Output = 'Oldest active transaction' + Field = $row[0] + Data = $row[1] + } + } + } + } + } + } +} \ No newline at end of file diff --git a/functions/Get-DbaDbFile.ps1 b/functions/Get-DbaDbFile.ps1 index f7a14864f0..ac801e11ee 100644 --- a/functions/Get-DbaDbFile.ps1 +++ b/functions/Get-DbaDbFile.ps1 @@ -50,30 +50,26 @@ function Get-DbaDbFile { Will return an object containing all file groups and their contained files for the Impromptu and Trading databases on the sql2016 SQL Server instance + .EXAMPLE + PS C:\> Get-DbaDatabase -SqlInstance sql2016 -Database Impromptu, Trading | Get-DbaDbFile + + Will accept piped input from Get-DbaDatabase and return an object containing all file groups and their contained files for the Impromptu and Trading databases on the sql2016 SQL Server instance #> - [CmdletBinding(DefaultParameterSetName = "Default")] + [CmdletBinding()] param ( - [parameter(ParameterSetName = "Pipe", Mandatory, ValueFromPipeline)] + [parameter(ValueFromPipeline)] [DbaInstanceParameter[]]$SqlInstance, [PSCredential]$SqlCredential, [Alias("Databases")] [object[]]$Database, [object[]]$ExcludeDatabase, - [object[]]$InputObject, - [Alias('Silent')] + [parameter(ValueFromPipeline)] + [Microsoft.SqlServer.Management.Smo.Database[]]$InputObject, [switch]$EnableException ) - - process { - - foreach ($instance in $sqlInstance) { - try { - $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $sqlcredential - } catch { - Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue - } - - $sql = "select + begin { + #region Sql Query Generation + $sql = "select fg.name as FileGroupName, df.file_id as 'ID', df.Type, @@ -102,16 +98,16 @@ function Get-DbaDbFile { case fg.is_default When 1 then 'True' when 0 then 'False' end as FileGroupDefault, fg.is_read_only as FileGroupReadOnly" - $sqlfrom = "from sys.database_files df + $sqlfrom = "from sys.database_files df left outer join sys.filegroups fg on df.data_space_id=fg.data_space_id inner join sys.dm_io_virtual_file_stats(db_id(),NULL) vfs on df.file_id=vfs.file_id inner join sys.master_files mf on df.file_id = mf.file_id and mf.database_id = db_id()" - $sql2008 = ",vs.available_bytes as 'VolumeFreeSpace'" - $sql2008from = "cross apply sys.dm_os_volume_stats(db_id(),df.file_id) vs" + $sql2008 = ",vs.available_bytes as 'VolumeFreeSpace'" + $sql2008from = "cross apply sys.dm_os_volume_stats(db_id(),df.file_id) vs" - $sql2000 = "select + $sql2000 = "select fg.groupname as FileGroupName, df.fileid as ID, CONVERT(INT,df.status & 0x40) / 64 as Type, @@ -136,66 +132,64 @@ function Get-DbaDbFile { CAST(fg.status & 0x8 as BIT) as FileGroupReadOnly from sysfiles df left outer join sysfilegroups fg on df.groupid=fg.groupid" + #endregion Sql Query Generation + } - if ($Database) { - $InputObject = $server.Databases | Where-Object Name -in $database - } else { - $InputObject = $server.Databases + process { + if ($SqlInstance) { + $InputObject += Get-DbaDatabase -SqlInstance $SqlInstance -SqlCredential $SqlCredential -Database $Database -ExcludeDatabase $ExcludeDatabase + } + + foreach ($db in $InputObject) { + $server = $db.Parent + + Write-Message -Level Verbose -Message "Querying database $db" + + try { + $version = $server.Query("SELECT compatibility_level FROM sys.databases WHERE name = '$($db.Name)'") + $version = [int]($version.compatibility_level / 10) + } catch { + $version = 8 } - if ($ExcludeDatabase) { - $InputObject = $InputObject | Where-Object Name -NotIn $ExcludeDatabase + if ($version -ge 11) { + $query = ($sql, $sql2008, $sqlfrom, $sql2008from) -Join "`n" + } elseif ($version -ge 9) { + $query = ($sql, $sqlfrom) -Join "`n" + } else { + $query = $sql2000 } - foreach ($db in $InputObject) { + Write-Message -Level Debug -Message "SQL Statement: $query" - Write-Message -Level Verbose -Message "Querying database $db" + try { + $results = $server.Query($query, $db.Name) + } catch { + Stop-Function -Message "Failure" -ErrorRecord $_ -Continue + } - try { - $version = $server.Query("SELECT compatibility_level FROM sys.databases WHERE name = '$($db.Name)'") - $version = [int]($version.compatibility_level / 10) - } catch { - $version = 8 + foreach ($result in $results) { + $size = [dbasize]($result.Size * 8192) + $usedspace = [dbasize]($result.UsedSpace * 8192) + $maxsize = $result.MaxSize + # calculation is done here because for snapshots or sparse files size is not the "virtual" size + # (master_files.Size) but the currently allocated one (dm_io_virtual_file_stats.size_on_disk_bytes) + $AvailableSpace = $size - $usedspace + if ($result.size_on_disk_bytes) { + $size = [dbasize]($result.size_on_disk_bytes) } - - if ($version -ge 11) { - $query = ($sql, $sql2008, $sqlfrom, $sql2008from) -Join "`n" - } elseif ($version -ge 9) { - $query = ($sql, $sqlfrom) -Join "`n" + if ($maxsize -gt -1) { + $maxsize = [dbasize]($result.MaxSize * 8192) } else { - $query = $sql2000 + $maxsize = [dbasize]($result.MaxSize) } - Write-Message -Level Debug -Message "SQL Statement: $query" - - try { - $results = $server.Query($query, $db.Name) - } catch { - Stop-Function -Message "Failure" -ErrorRecord $_ -Continue - } - - foreach ($result in $results) { - $size = [dbasize]($result.Size * 8192) - $usedspace = [dbasize]($result.UsedSpace * 8192) - $maxsize = $result.MaxSize - # calculation is done here because for snapshots or sparse files size is not the "virtual" size - # (master_files.Size) but the currently allocated one (dm_io_virtual_file_stats.size_on_disk_bytes) - $AvailableSpace = $size - $usedspace - if ($result.size_on_disk_bytes) { - $size = [dbasize]($result.size_on_disk_bytes) - } - if ($maxsize -gt -1) { - $maxsize = [dbasize]($result.MaxSize * 8192) - } else { - $maxsize = [dbasize]($result.MaxSize) - } - - if ($result.VolumeFreeSpace) { - $VolumeFreeSpace = [dbasize]$result.VolumeFreeSpace - } else { - # to get drive free space for each drive that a database has files on - # when database compatibility lower than 110. Lets do this with query2 - $query2 = @' + if ($result.VolumeFreeSpace) { + $VolumeFreeSpace = [dbasize]$result.VolumeFreeSpace + } else { + # to get drive free space for each drive that a database has files on + # when database compatibility lower than 110. Lets do this with query2 + $query2 = @' -- to get drive free space for each drive that a database has files on DECLARE @FixedDrives TABLE(Drive CHAR(1), MB_Free BIGINT); INSERT @FixedDrives EXEC sys.xp_fixeddrives; @@ -205,60 +199,61 @@ FROM @FixedDrives AS fd INNER JOIN sys.database_files AS df ON fd.Drive = LEFT(df.physical_name, 1); '@ - # if the server has one drive xp_fixeddrives returns one row, but we still need $disks to be an array. - if ($server.VersionMajor -gt 8) { - $disks = @($server.Query($query2, $db.Name)) - $MbFreeColName = $disks[0].psobject.Properties.Name - # get the free MB value for the drive in question - $free = $disks | Where-Object { - $_.drive -eq $result.PhysicalName.Substring(0, 1) - } | Select-Object $MbFreeColName - - $VolumeFreeSpace = [dbasize](($free.MB_Free) * 1024 * 1024) - } - } - if ($result.GrowthType -eq "Percent") { - $nextgrowtheventadd = [dbasize]($result.size * ($result.Growth * 0.01) * 1024) - } else { - $nextgrowtheventadd = [dbasize]($result.Growth * 8 * 1024) - } - if ( ($nextgrowtheventadd.Byte -gt ($MaxSize.Byte - $size.Byte)) -and $maxsize -gt 0 ) { [dbasize]$nextgrowtheventadd = 0 } - - [PSCustomObject]@{ - ComputerName = $server.ComputerName - InstanceName = $server.ServiceName - SqlInstance = $server.DomainInstanceName - Database = $db.name - FileGroupName = $result.FileGroupName - ID = $result.ID - Type = $result.Type - TypeDescription = $result.TypeDescription - LogicalName = $result.LogicalName.Trim() - PhysicalName = $result.PhysicalName.Trim() - State = $result.State - MaxSize = $maxsize - Growth = $result.Growth - GrowthType = $result.GrowthType - NextGrowthEventSize = $nextgrowtheventadd - Size = $size - UsedSpace = $usedspace - AvailableSpace = $AvailableSpace - IsOffline = $result.IsOffline - IsReadOnly = $result.IsReadOnly - IsReadOnlyMedia = $result.IsReadOnlyMedia - IsSparse = $result.IsSparse - NumberOfDiskWrites = $result.NumberOfDiskWrites - NumberOfDiskReads = $result.NumberOfDiskReads - ReadFromDisk = [dbasize]$result.BytesReadFromDisk - WrittenToDisk = [dbasize]$result.BytesWrittenToDisk - VolumeFreeSpace = $VolumeFreeSpace - FileGroupDataSpaceId = $result.FileGroupDataSpaceId - FileGroupType = $result.FileGroupType - FileGroupTypeDescription = $result.FileGroupTypeDescription - FileGroupDefault = $result.FileGroupDefault - FileGroupReadOnly = $result.FileGroupReadOnly + # if the server has one drive xp_fixeddrives returns one row, but we still need $disks to be an array. + if ($server.VersionMajor -gt 8) { + $disks = @($server.Query($query2, $db.Name)) + $MbFreeColName = $disks[0].psobject.Properties.Name + # get the free MB value for the drive in question + $free = $disks | Where-Object { + $_.drive -eq $result.PhysicalName.Substring(0, 1) + } | Select-Object $MbFreeColName + + $VolumeFreeSpace = [dbasize](($free.MB_Free) * 1024 * 1024) } } + if ($result.GrowthType -eq "Percent") { + $nextgrowtheventadd = [dbasize]($result.size * 8 * ($result.Growth * 0.01) * 1024) + } else { + $nextgrowtheventadd = [dbasize]($result.Growth * 1024) + } + if (($nextgrowtheventadd.Byte -gt ($MaxSize.Byte - $size.Byte)) -and $maxsize -gt 0) { + [dbasize]$nextgrowtheventadd = 0 + } + + [PSCustomObject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + Database = $db.name + FileGroupName = $result.FileGroupName + ID = $result.ID + Type = $result.Type + TypeDescription = $result.TypeDescription + LogicalName = $result.LogicalName.Trim() + PhysicalName = $result.PhysicalName.Trim() + State = $result.State + MaxSize = $maxsize + Growth = $result.Growth + GrowthType = $result.GrowthType + NextGrowthEventSize = $nextgrowtheventadd + Size = $size + UsedSpace = $usedspace + AvailableSpace = $AvailableSpace + IsOffline = $result.IsOffline + IsReadOnly = $result.IsReadOnly + IsReadOnlyMedia = $result.IsReadOnlyMedia + IsSparse = $result.IsSparse + NumberOfDiskWrites = $result.NumberOfDiskWrites + NumberOfDiskReads = $result.NumberOfDiskReads + ReadFromDisk = [dbasize]$result.BytesReadFromDisk + WrittenToDisk = [dbasize]$result.BytesWrittenToDisk + VolumeFreeSpace = $VolumeFreeSpace + FileGroupDataSpaceId = $result.FileGroupDataSpaceId + FileGroupType = $result.FileGroupType + FileGroupTypeDescription = $result.FileGroupTypeDescription + FileGroupDefault = $result.FileGroupDefault + FileGroupReadOnly = $result.FileGroupReadOnly + } } } } diff --git a/functions/Get-DbaDbIdentity.ps1 b/functions/Get-DbaDbIdentity.ps1 new file mode 100644 index 0000000000..57eb5fd051 --- /dev/null +++ b/functions/Get-DbaDbIdentity.ps1 @@ -0,0 +1,140 @@ +function Get-DbaDbIdentity { + <# + .SYNOPSIS + Checks the current identity value via DBCC CHECKIDENT with NORESEED optuin + + .DESCRIPTION + Use the command DBCC CHECKIDENT with NORESEED option to checks the current identity value of a table and return results + + Read more: + - https://docs.microsoft.com/en-us/sql/t-sql/database-console-commands/dbcc-checkident-transact-sql + + .PARAMETER SqlInstance + The target SQL Server instance or instances. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Database + The database(s) to process - this list is auto-populated from the server. If unspecified, all databases will be processed. + + .PARAMETER Table + The table(s) for which to check the current identity value. + + .PARAMETER WhatIf + Shows what would happen if the cmdlet runs. The cmdlet is not run. + + .PARAMETER Confirm + Prompts you for confirmation before running the cmdlet. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: DBCC + Author: Patrick Flynn (@sqllensman) + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaDbIdentity + + .EXAMPLE + PS C:\> Get-DbaDbIdentity -SqlInstance SQLServer2017 -Database AdventureWorks2014 -Table 'Production.ScrapReason' + + Connects to AdventureWorks2014 on instance SqlServer2017 using Windows Authentication and runs the command DBCC CHECKIDENT('Production.ScrapReason', NORESEED) to return the current identity value. + + .EXAMPLE + PS C:\> $cred = Get-Credential sqladmin + PS C:\> 'Sql1','Sql2/sqlexpress' | Get-DbaDbIdentity -SqlCredential $cred -Database AdventureWorks2014 -Table 'Production.ScrapReason' + + Connects to AdventureWorks2014 on instances Sql1 and Sql2/sqlexpress using sqladmin credential and runs the command DBCC CHECKIDENT('Production.ScrapReason', NORESEED) to return the current identity value. + + .EXAMPLE + PS C:\> $query = "Select Quotename(Schema_Name(t.schema_id)) +'.' + QuoteName(t.name) as TableName from sys.columns c INNER JOIN sys.tables t on t.object_id = c.object_id WHERE is_identity = 1 and is_memory_optimized = 0" + PS C:\> $IdentityTables = Invoke-DbaQuery -SqlInstance SQLServer2017 -Database AdventureWorks2014 -Query $query -As SingleValue + PS C:\> Get-DbaDbIdentity -SqlInstance SQLServer2017 -Database AdventureWorks2014 -Table $IdentityTables + + Checks the current identity value for all non memory optimized tables with an Identity in the AdventureWorks2014 database on the SQLServer2017 instance. + #> + [CmdletBinding(SupportsShouldProcess, ConfirmImpact = 'Low')] + param ( + [parameter(Mandatory, ValueFromPipeline)] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [string[]]$Database, + [string[]]$Table, + [switch]$EnableException + ) + begin { + $stringBuilder = New-Object System.Text.StringBuilder + $null = $stringBuilder.Append("DBCC CHECKIDENT(#options#, NORESEED)") + } + process { + if (Test-Bound -Not -ParameterName Table) { + Stop-Function -Message "You must specify a table to execute against using -Table" + return + } + foreach ($instance in $SqlInstance) { + Write-Message -Message "Attempting Connection to $instance" -Level Verbose + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + $dbs = $server.Databases + + if ($Database) { + $dbs = $dbs | Where-Object Name -In $Database + } + + foreach ($db in $dbs) { + Write-Message -Level Verbose -Message "Processing $db on $instance" + + if ($db.IsAccessible -eq $false) { + Stop-Function -Message "The database $db is not accessible. Skipping." -Continue + } + + foreach ($tbl in $Table) { + try { + $query = $StringBuilder.ToString() + $query = $query.Replace('#options#', "'$($tbl)'") + + if ($Pscmdlet.ShouldProcess($server.Name, "Execute the command $query against $instance")) { + Write-Message -Message "Query to run: $query" -Level Verbose + $results = $server | Invoke-DbaQuery -Query $query -Database $db.Name -MessagesToOutput + if ($null -ne $results) { + $words = $results.Split(" ") + $identityValue = $words[6].Replace("'", "").Replace(",", "") + $columnValue = $words[10].Replace("'", "").Replace(".", "") + } else { + $identityValue = $null + $columnValue = $null + } + } + } catch { + Stop-Function -Message "Error running $query against $db" -Target $instance -ErrorRecord $_ -Exception $_.Exception -Continue + } + if ($Pscmdlet.ShouldProcess("console", "Outputting object")) { + [PSCustomObject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + Database = $db.Name + Table = $tbl + Cmd = $query.ToString() + IdentityValue = $identityValue + ColumnValue = $columnValue + Output = $results + } + } + } + } + } + } +} \ No newline at end of file diff --git a/functions/Get-DbaOrphanUser.ps1 b/functions/Get-DbaDbOrphanUser.ps1 similarity index 93% rename from functions/Get-DbaOrphanUser.ps1 rename to functions/Get-DbaDbOrphanUser.ps1 index 5d475fe869..5ecba14fe6 100644 --- a/functions/Get-DbaOrphanUser.ps1 +++ b/functions/Get-DbaDbOrphanUser.ps1 @@ -1,5 +1,5 @@ #ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# -function Get-DbaOrphanUser { +function Get-DbaDbOrphanUser { <# .SYNOPSIS Get orphaned users. @@ -39,20 +39,20 @@ function Get-DbaOrphanUser { License: MIT https://opensource.org/licenses/MIT .LINK - https://dbatools.io/Get-DbaOrphanUser + https://dbatools.io/Get-DbaDbOrphanUser .EXAMPLE - PS C:\> Get-DbaOrphanUser -SqlInstance localhost\sql2016 + PS C:\> Get-DbaDbOrphanUser -SqlInstance localhost\sql2016 Finds all orphan users without matching Logins in all databases present on server 'localhost\sql2016'. .EXAMPLE - PS C:\> Get-DbaOrphanUser -SqlInstance localhost\sql2016 -SqlCredential $cred + PS C:\> Get-DbaDbOrphanUser -SqlInstance localhost\sql2016 -SqlCredential $cred Finds all orphan users without matching Logins in all databases present on server 'localhost\sql2016'. SQL Server authentication will be used in connecting to the server. .EXAMPLE - PS C:\> Get-DbaOrphanUser -SqlInstance localhost\sql2016 -Database db1 + PS C:\> Get-DbaDbOrphanUser -SqlInstance localhost\sql2016 -Database db1 Finds orphan users without matching Logins in the db1 database present on server 'localhost\sql2016'. @@ -124,5 +124,7 @@ function Get-DbaOrphanUser { } } } - + end { + Test-DbaDeprecation -DeprecatedOn 1.0.0 -Alias Get-DbaOrphanUser + } } \ No newline at end of file diff --git a/functions/Get-DbaDbRoleMember.ps1 b/functions/Get-DbaDbRoleMember.ps1 index fe534d8b31..c80999fc27 100644 --- a/functions/Get-DbaDbRoleMember.ps1 +++ b/functions/Get-DbaDbRoleMember.ps1 @@ -106,6 +106,13 @@ function Get-DbaDbRoleMember { Stop-Function -Message 'Failure' -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue } + foreach ($item in $Database) { + Write-Message -Level Verbose -Message "Check if database: $item on $instance is accessible or not" + if ($server.Databases[$item].IsAccessible -eq $false) { + Stop-Function -Message "Database: $item is not accessible. Check your permissions or database state." -Category ResourceUnavailable -ErrorRecord $_ -Target $instance -Continue + } + } + $databases = $server.Databases | Where-Object { $_.IsAccessible -eq $true } if (Test-Bound -Parameter 'Database') { @@ -153,7 +160,7 @@ function Get-DbaDbRoleMember { Add-Member -Force -InputObject $user -MemberType NoteProperty -Name UserName -Value $user.Name # Select object because Select-DefaultView causes strange behaviors when assigned to a variable (??) - Select-Object -InputObject $user -Property 'ComputerName', 'InstanceName', 'SqlInstance', 'Database', 'Role', 'UserName', 'Login', 'IsSystemObject' + Select-Object -InputObject $user -Property 'ComputerName', 'InstanceName', 'SqlInstance', 'Database', 'Role', 'UserName', 'Login', 'IsSystemObject', 'LoginType' } } } @@ -163,4 +170,4 @@ function Get-DbaDbRoleMember { end { Test-DbaDeprecation -DeprecatedOn "1.0.0" -Alias Get-DbaRoleMember } -} \ No newline at end of file +} diff --git a/functions/Get-DbaDbSpace.ps1 b/functions/Get-DbaDbSpace.ps1 index 10ce60742a..c8eec750c8 100644 --- a/functions/Get-DbaDbSpace.ps1 +++ b/functions/Get-DbaDbSpace.ps1 @@ -1,3 +1,4 @@ +#ValidationTags#CodeStyle,Messaging,FlowControl,Pipeline# function Get-DbaDbSpace { <# .SYNOPSIS @@ -20,6 +21,9 @@ function Get-DbaDbSpace { .PARAMETER ExcludeDatabase Specifies the database(s) to exclude from processing. Options for this list are auto-populated from the server. + .PARAMETER InputObject + A piped collection of database objects from Get-DbaDatabase + .PARAMETER IncludeSystemDBs If this switch is enabled, system databases will be processed. By default, only user databases are processed. @@ -66,20 +70,19 @@ function Get-DbaDbSpace { #> [CmdletBinding()] - param ([parameter(ValueFromPipeline, Mandatory)] + param ([parameter(ValueFromPipeline)] [Alias("ServerInstance", "SqlServer")] [DbaInstanceParameter[]]$SqlInstance, - [System.Management.Automation.PSCredential]$SqlCredential, + [PSCredential]$SqlCredential, [Alias("Databases")] [string[]]$Database, [string[]]$ExcludeDatabase, [switch]$IncludeSystemDBs, + [parameter(ValueFromPipeline)] + [Microsoft.SqlServer.Management.Smo.Database[]]$InputObject, [switch]$EnableException ) - begin { - Write-Message -Level System -Message "Bound parameters: $($PSBoundParameters.Keys -join ", ")." - $sql = "SELECT SERVERPROPERTY('MachineName') AS ComputerName, ISNULL(SERVERPROPERTY('InstanceName'), 'MSSQLSERVER') AS InstanceName, SERVERPROPERTY('ServerName') AS SqlInstance, @@ -133,94 +136,76 @@ function Get-DbaDbSpace { } process { - foreach ($instance in $SqlInstance) { - try { - $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential - } catch { - Stop-Function -Message "Failed to process Instance $Instance." -ErrorRecord $_ -Target $instance -Continue - } + if ($IncludeSystemDBs) { + Stop-Function -Message "IncludeSystemDBs will be removed. Please pipe in filtered results from Get-DbaDatabase instead." + return + } + if ($SqlInstance) { + $InputObject += Get-DbaDatabase -SqlInstance $SqlInstance -SqlCredential $SqlCredential -Database $Database -ExcludeDatabase $ExcludeDatabase + } + foreach ($db in $InputObject) { + $server = $db.Parent if ($server.VersionMajor -lt 9) { - Write-Message -Level Warning -Message "SQL Server 2000 not supported. $server skipped." - continue + Stop-Function -Message "SQL Server 2000 not supported. $server skipped." -Continue } - #If IncludeSystemDBs is true, include systemdbs - #look at all databases, online/offline/accessible/inaccessible and tell user if a db can't be queried. try { - if (Test-Bound "Database") { - $dbs = $server.Databases | Where-Object Name -In $Database - } elseif ($IncludeSystemDBs) { - $dbs = $server.Databases | Where-Object IsAccessible - } else { - $dbs = $server.Databases | Where-Object { $_.IsAccessible -and $_.IsSystemObject -eq 0 } - } - - if (Test-Bound "ExcludeDatabase") { - $dbs = $dbs | Where-Object Name -NotIn $ExcludeDatabase + Write-Message -Level Verbose -Message "Querying $instance - $db." + If ($db.status -ne 'Normal' -or $db.IsAccessible -eq $false) { + Write-Message -Level Warning -Message "$db is not accessible." -Target $db + continue } - } catch { - Stop-Function -Message "Unable to gather databases for $instance." -ErrorRecord $_ -Continue - } - - foreach ($db in $dbs) { - try { - Write-Message -Level Verbose -Message "Querying $instance - $db." - If ($db.status -ne 'Normal' -or $db.IsAccessible -eq $false) { - Write-Message -Level Warning -Message "$db is not accessible." -Target $db - continue + #Execute query against individual database and add to output + foreach ($row in ($db.ExecuteWithResults($sql)).Tables.Rows) { + if ($row.UsedSpaceMB -is [System.DBNull]) { + $UsedMB = 0 + } else { + $UsedMB = [Math]::Round($row.UsedSpaceMB) + } + if ($row.FreeSpaceMB -is [System.DBNull]) { + $FreeMB = 0 + } else { + $FreeMB = [Math]::Round($row.FreeSpaceMB) + } + if ($row.PercentUsed -is [System.DBNull]) { + $PercentUsed = 0 + } else { + $PercentUsed = [Math]::Round($row.PercentUsed) } - #Execute query against individual database and add to output - foreach ($row in ($db.ExecuteWithResults($sql)).Tables.Rows) { - if ($row.UsedSpaceMB -is [System.DBNull]) { - $UsedMB = 0 - } else { - $UsedMB = [Math]::Round($row.UsedSpaceMB) - } - if ($row.FreeSpaceMB -is [System.DBNull]) { - $FreeMB = 0 - } else { - $FreeMB = [Math]::Round($row.FreeSpaceMB) - } - if ($row.PercentUsed -is [System.DBNull]) { - $PercentUsed = 0 - } else { - $PercentUsed = [Math]::Round($row.PercentUsed) - } - if ($row.SpaceBeforeMax -is [System.DBNull]) { - $SpaceUntilMax = 0 - } else { - $SpaceUntilMax = [Math]::Round($row.SpaceBeforeMax) - } - if ($row.UnusableSpaceMB -is [System.DBNull]) { - $UnusableSpace = 0 - } else { - $UnusableSpace = [Math]::Round($row.UnusableSpaceMB) - } - - [pscustomobject]@{ - ComputerName = $server.ComputerName - InstanceName = $server.ServiceName - SqlInstance = $server.DomainInstanceName - Database = $row.DBName - FileName = $row.FileName - FileGroup = $row.FileGroup - PhysicalName = $row.PhysicalName - FileType = $row.FileType - UsedSpace = [dbasize]($UsedMB * 1024 * 1024) - FreeSpace = [dbasize]($FreeMB * 1024 * 1024) - FileSize = [dbasize]($row.FileSizeMB * 1024 * 1024) - PercentUsed = $PercentUsed - AutoGrowth = [dbasize]($row.GrowthMB * 1024 * 1024) - AutoGrowType = $row.GrowthType - SpaceUntilMaxSize = [dbasize]($SpaceUntilMax * 1024 * 1024) - AutoGrowthPossible = [dbasize]($row.PossibleAutoGrowthMB * 1024 * 1024) - UnusableSpace = [dbasize]($UnusableSpace * 1024 * 1024) - } + if ($row.SpaceBeforeMax -is [System.DBNull]) { + $SpaceUntilMax = 0 + } else { + $SpaceUntilMax = [Math]::Round($row.SpaceBeforeMax) + } + if ($row.UnusableSpaceMB -is [System.DBNull]) { + $UnusableSpace = 0 + } else { + $UnusableSpace = [Math]::Round($row.UnusableSpaceMB) + } + + [pscustomobject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + Database = $row.DBName + FileName = $row.FileName + FileGroup = $row.FileGroup + PhysicalName = $row.PhysicalName + FileType = $row.FileType + UsedSpace = [dbasize]($UsedMB * 1024 * 1024) + FreeSpace = [dbasize]($FreeMB * 1024 * 1024) + FileSize = [dbasize]($row.FileSizeMB * 1024 * 1024) + PercentUsed = $PercentUsed + AutoGrowth = [dbasize]($row.GrowthMB * 1024 * 1024) + AutoGrowType = $row.GrowthType + SpaceUntilMaxSize = [dbasize]($SpaceUntilMax * 1024 * 1024) + AutoGrowthPossible = [dbasize]($row.PossibleAutoGrowthMB * 1024 * 1024) + UnusableSpace = [dbasize]($UnusableSpace * 1024 * 1024) } - } catch { - Stop-Function -Message "Unable to query $instance - $db." -Target $db -ErrorRecord $_ -Continue } + } catch { + Stop-Function -Message "Unable to query $instance - $db." -Target $db -ErrorRecord $_ -Continue } } } diff --git a/functions/Get-DbaDbccMemoryStatus.ps1 b/functions/Get-DbaDbccMemoryStatus.ps1 index f0468f1638..9ecf69709e 100644 --- a/functions/Get-DbaDbccMemoryStatus.ps1 +++ b/functions/Get-DbaDbccMemoryStatus.ps1 @@ -64,19 +64,13 @@ function Get-DbaDbccMemoryStatus { Write-Message -Level Verbose -Message "Collecting $query data from server: $instance" try { - $sqlconnection = New-Object System.Data.SqlClient.SqlConnection - $sqlconnection.ConnectionString = $server.ConnectionContext.ConnectionString - $sqlconnection.Open() - - $datatable = New-Object system.Data.DataSet - $dataadapter = New-Object system.Data.SqlClient.SqlDataAdapter($query, $sqlconnection) - $dataadapter.fill($datatable) | Out-Null + $datatable = $server.query($query, 'master', $true) $recordset = 0 $rowId = 0 $recordsetId = 0 - foreach ($dataset in $datatable.Tables) { + foreach ($dataset in $datatable) { $dataSection = $dataset.Columns[0].ColumnName $dataType = $dataset.Columns[1].ColumnName $recordset = $recordset + 1 diff --git a/functions/Get-DbaDbccProcCache.ps1 b/functions/Get-DbaDbccProcCache.ps1 index 4b625a6fc0..609d940bfb 100644 --- a/functions/Get-DbaDbccProcCache.ps1 +++ b/functions/Get-DbaDbccProcCache.ps1 @@ -45,7 +45,7 @@ function Get-DbaDbccProcCache { PS C:\> $cred = Get-Credential sqladmin PS C:\> Get-DbaDbccProcCache -SqlInstance Server1 -SqlCredential $cred - Connects using sqladmin credential and gets results of DBCC PROCCACHE for Instance Server1 using + Connects using sqladmin credential and gets results of DBCC PROCCACHE for Instance Server1 #> [CmdletBinding()] @@ -71,26 +71,22 @@ function Get-DbaDbccProcCache { } try { - if ($Pscmdlet.ShouldProcess($server.Name, "Execute the command $query")) { - Write-Message -Message "Query to run: $query" -Level Verbose - $results = $server.Query($query) - } + Write-Message -Message "Query to run: $query" -Level Verbose + $results = $server.Query($query) } catch { Stop-Function -Message "Failure" -ErrorRecord $_ -Target $server -Continue } - If ($Pscmdlet.ShouldProcess("console", "Outputting object")) { - foreach ($row in $results) { - [PSCustomObject]@{ - ComputerName = $server.ComputerName - InstanceName = $server.ServiceName - SqlInstance = $server.DomainInstanceName - Count = $row[0] - Used = $row[1] - Active = $row[2] - CacheSize = $row[3] - CacheUsed = $row[4] - CacheActive = $row[5] - } + foreach ($row in $results) { + [PSCustomObject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + Count = $row[0] + Used = $row[1] + Active = $row[2] + CacheSize = $row[3] + CacheUsed = $row[4] + CacheActive = $row[5] } } } diff --git a/functions/Get-DbaDbccSessionBuffer.ps1 b/functions/Get-DbaDbccSessionBuffer.ps1 new file mode 100644 index 0000000000..adddcebeee --- /dev/null +++ b/functions/Get-DbaDbccSessionBuffer.ps1 @@ -0,0 +1,229 @@ +function Get-DbaDbccSessionBuffer { + <# + .SYNOPSIS + Gets result of Database Console Command DBCC INPUTBUFFER or DBCC OUTPUTBUFFER + + .DESCRIPTION + Returns the results of DBCC INPUTBUFFER or DBCC OUTPUTBUFFER for input sessions + + Read more: + - https://docs.microsoft.com/en-us/sql/t-sql/database-console-commands/dbcc-inputbuffer-transact-sql + - https://docs.microsoft.com/en-us/sql/t-sql/database-console-commands/dbcc-outputbuffer-transact-sql + + .PARAMETER SqlInstance + The target SQL Server instance or instances. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Operation + DBCC Operation to execute - either InputBuffer or OutputBuffer + + .PARAMETER SessionId + The Session ID(s) to use to get current input or output buffer. + + .PARAMETER RequestId + Is the exact request (batch) to search for within the current session + The following query returns request_id: + + SELECT request_id + FROM sys.dm_exec_requests + WHERE session_id = @@spid; + + .PARAMETER All + If this switch is enabled, results for all User Sessions will be retreived + This overides any values for SessionId or RequestId + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: DBCC + Author: Patrick Flynn (@sqllensman) + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaDbccSessionBuffer + + .EXAMPLE + PS C:\> Get-DbaDbccSessionBuffer -SqlInstance Server1 -Operation InputBuffer -SessionId 51 + + Get results of DBCC INPUTBUFFER(51) for Instance Server1 + + .EXAMPLE + PS C:\> Get-DbaDbccSessionBuffer -SqlInstance Server1 -Operation OutputBuffer -SessionId 51, 52 + + Get results of DBCC OUTPUTBUFFER for SessionId's 51 and 52 for Instance Server1 + + .EXAMPLE + PS C:\> Get-DbaDbccSessionBuffer -SqlInstance Server1 -Operation InputBuffer -SessionId 51 -RequestId 0 + + Get results of DBCC INPUTBUFFER(51,0) for Instance Server1 + + .EXAMPLE + PS C:\> Get-DbaDbccSessionBuffer -SqlInstance Server1 -Operation OutputBuffer -SessionId 51 -RequestId 0 + + Get results of DBCC OUTPUTBUFFER(51,0) for Instance Server1 + + .EXAMPLE + PS C:\> 'Sql1','Sql2/sqlexpress' | Get-DbaDbccSessionBuffer -Operation InputBuffer -All + + Get results of DBCC INPUTBUFFER for all user sessions for the instances Sql1 and Sql2/sqlexpress + + .EXAMPLE + PS C:\> 'Sql1','Sql2/sqlexpress' | Get-DbaDbccSessionBuffer -Operation OutputBuffer -All + + Get results of DBCC OUTPUTBUFFER for all user sessions for the instances Sql1 and Sql2/sqlexpress + + .EXAMPLE + PS C:\> $cred = Get-Credential sqladmin + PS C:\> Get-DbaDbccSessionBuffer -SqlInstance Server1 -SqlCredential $cred -Operation InputBuffer -SessionId 51 -RequestId 0 + + Connects using sqladmin credential and gets results of DBCC INPUTBUFFER(51,0) for Instance Server1 + + .EXAMPLE + PS C:\> $cred = Get-Credential sqladmin + PS C:\> Get-DbaDbccSessionBuffer -SqlInstance Server1 -SqlCredential $cred -Operation OutputBuffer -SessionId 51 -RequestId 0 + + Connects using sqladmin credential and gets results of DBCC OUTPUTBUFFER(51,0) for Instance Server1 + + #> + [CmdletBinding()] + param ( + [parameter(Mandatory, ValueFromPipeline)] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [ValidateSet('InputBuffer', 'OutputBuffer')] + [string]$Operation = "InputBuffer", + [int[]]$SessionId, + [int]$RequestId, + [switch]$All, + [switch]$EnableException + ) + begin { + if (Test-Bound -Not -ParameterName All) { + if (Test-Bound -Not -ParameterName SessionId) { + Stop-Function -Message "You must specify either a SessionId or use the -All switch." + return + } + } + + if (Test-Bound -ParameterName Operation) { + $Operation = $Operation.ToUpper() + } + $stringBuilder = New-Object System.Text.StringBuilder + $null = $stringBuilder.Append("DBCC $Operation(#Operation#) WITH NO_INFOMSGS") + + } + process { + + foreach ($instance in $SqlInstance) { + Write-Message -Message "Attempting Connection to $instance" -Level Verbose + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + if (Test-Bound -Not -ParameterName All) { + foreach ($session_id in $SessionId) { + $query = $StringBuilder.ToString() + + if (Test-Bound -Not -ParameterName RequestId) { + Write-Message -Message "Query to run: $query" -Level Verbose + $query = $query.Replace('#Operation#', $session_id) + } else { + Write-Message -Message "Query to run: $query" -Level Verbose + $query = $query.Replace('#Operation#', "$($session_id), $($RequestId)") + } + + try { + Write-Message -Message "Query to run: $query" -Level Verbose + $results = $server.Query($query) + } catch { + Stop-Function -Message "Failure" -ErrorRecord $_ -Target $server -Continue + } + if ($Operation -eq 'INPUTBUFFER') { + foreach ($row in $results) { + [PSCustomObject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + SessionId = $session_id + EventType = $row[0] + Parameters = $row[1] + EventInfo = $row[2] + } + } + } else { + Write-Message -Message "Output Buffer" -Level Verbose + $hexStringBuilder = New-Object System.Text.StringBuilder + $asciiStringBuilder = New-Object System.Text.StringBuilder + + foreach ($row in $results) { + $str = $row[0].ToString() + $null = $hexStringBuilder.Append($str.Substring(11, 48)) + $null = $asciiStringBuilder.Append($str.Substring(61, 16)) + } + [PSCustomObject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + SessionId = $session_id + Buffer = $asciiStringBuilder.ToString().Replace('.', '').TrimEnd() + HexBuffer = $hexStringBuilder.ToString().Replace(' ', '') + } | Select-DefaultView -Property ComputerName, InstanceName, SqlInstance, SessionId, Buffer + } + } + } else { + $sessionQuery = 'Select session_id FROM sys.dm_exec_connections' + $sessionList = $server.Query($sessionQuery ) + foreach ($session in $sessionList) { + $query = $StringBuilder.ToString() + $query = $query.Replace('#Operation#', $session.session_id) + try { + Write-Message -Message "Query to run: $query" -Level Verbose + $results = $server.Query($query) + } catch { + Stop-Function -Message "Failure" -ErrorRecord $_ -Target $server -Continue + } + if ($Operation -eq 'INPUTBUFFER') { + foreach ($row in $results) { + [PSCustomObject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + SessionId = $session.session_id + EventType = $row[0] + Parameters = $row[1] + EventInfo = $row[2] + } + } + } else { + $hexStringBuilder = New-Object System.Text.StringBuilder + $asciiStringBuilder = New-Object System.Text.StringBuilder + + foreach ($row in $results) { + $str = $row[0].ToString() + $null = $hexStringBuilder.Append($str.Substring(11, 48)) + $null = $asciiStringBuilder.Append($str.Substring(61, 16)) + } + [PSCustomObject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + SessionId = $session.session_id + Buffer = $asciiStringBuilder.ToString().Replace('.', '').TrimEnd() + HexBuffer = $hexStringBuilder.ToString().Replace(' ', '') + } | Select-DefaultView -Property ComputerName, InstanceName, SqlInstance, SessionId, Buffer + } + } + } + } + } +} \ No newline at end of file diff --git a/functions/Get-DbaDbccStatistic.ps1 b/functions/Get-DbaDbccStatistic.ps1 new file mode 100644 index 0000000000..02f50947d8 --- /dev/null +++ b/functions/Get-DbaDbccStatistic.ps1 @@ -0,0 +1,262 @@ +function Get-DbaDbccStatistic { + <# + .SYNOPSIS + Execution of Database Console Command DBCC SHOW_STATISTICS + + .DESCRIPTION + Executes the command DBCC SHOW_STATISTICS against defined objects and returns results + + Reclaims space from dropped variable-length columns in tables or indexed views + + Read more: + - https://docs.microsoft.com/en-us/sql/t-sql/database-console-commands/dbcc-cleantable-transact-sql + + .PARAMETER SqlInstance + The target SQL Server instance or instances. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Database + The database(s) to process - this list is auto-populated from the server. If unspecified, all databases will be processed. + + .PARAMETER Object + The table or indexed view for which to display statistics information. + Any two part object name should be formatted as 'Schema.ObjectName' + + .PARAMETER Target + Name of the index, statistics, or column for which to display statistics information. + Target can be enclosed in brackets, single quotes, double quotes, or no quotes + + .PARAMETER Option + Used to limit the result sets returned by the statement to the specified option. + Options are 'StatHeader', 'DensityVector', 'Histogram', 'StatsStream' + Default of StatHeader + + .PARAMETER NoInformationalMessages + Suppresses all informational messages. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: DBCC, Statistics + Author: Patrick Flynn (@sqllensman) + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Get-DbaDbccStatistic + + .EXAMPLE + PS C:\> Get-DbaDbccStatistic -SqlInstance SQLServer2017 + + Will run the statement SHOW_STATISTICS WITH STAT_HEADER against all Statistics on all User Tables or views for every accessible database on instance SQLServer2017. Connects using Windows Authentication. + + .EXAMPLE + PS C:\> Get-DbaDbccStatistic -SqlInstance SQLServer2017 -Database MyDb -Option DensityVector + + Will run the statement SHOW_STATISTICS WITH DENSITY_VECTOR against all Statistics on all User Tables or views for database MyDb on instance SQLServer2017. Connects using Windows Authentication. + + .EXAMPLE + PS C:\> $cred = Get-Credential sqladmin + PS C:\> Get-DbaDbccStatistic -SqlInstance SQLServer2017 -SqlCredential $cred -Database MyDb -Object UserTable -Option Histogram + + Will run the statement SHOW_STATISTICS WITH HISTOGRAM against all Statistics on table UserTable for database MyDb on instance SQLServer2017. Connects using sqladmin credential. + + .EXAMPLE + PS C:\> 'Sql1','Sql2/sqlexpress' | Get-DbaDbccStatistic -SqlInstance SQLServer2017 -Database MyDb -Object 'dbo.UserTable' -Target MyStatistic -Option StatsStream + + Runs the statement SHOW_STATISTICS('dbo.UserTable', 'MyStatistic') WITH STATS_STREAM against database MyDb on instances Sql1 and Sql2/sqlexpress. Connects using Windows Authentication. + + #> + [CmdletBinding()] + param ( + [parameter(Mandatory, ValueFromPipeline)] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [string[]]$Database, + [string]$Object, + [string]$Target, + [ValidateSet('StatHeader', 'DensityVector', 'Histogram', 'StatsStream')] + [string]$Option = "StatHeader", + [switch]$NoInformationalMessages, + [switch]$EnableException + ) + begin { + $stringBuilder = New-Object System.Text.StringBuilder + $null = $stringBuilder.Append("DBCC SHOW_STATISTICS(#options#) WITH NO_INFOMSGS" ) + if ($Option -eq 'StatHeader') { + $null = $stringBuilder.Append(", STAT_HEADER") + } elseif ($Option -eq 'DensityVector') { + $null = $stringBuilder.Append(", DENSITY_VECTOR") + } elseif ($Option -eq 'Histogram') { + $null = $stringBuilder.Append(", HISTOGRAM") + } elseif ($Option -eq 'StatsStream') { + $null = $stringBuilder.Append(", STATS_STREAM") + } + + $statList = + "Select Object, Target, name FROM + ( + Select Schema_Name(o.SCHEMA_ID) + '.' + o.name as Object, st.name as Target, o.name + FROM sys.stats st + INNER JOIN sys.objects o + on o.object_id = st.object_id + WHERE o.type in ('U', 'V') + ) a + " + } + process { + foreach ($instance in $SqlInstance) { + Write-Message -Message "Attempting Connection to $instance" -Level Verbose + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + if ($server.VersionMajor -eq 8) { + if ((Test-Bound -Not -ParameterName Object) -or (Test-Bound -Not -ParameterName Target)) { + Write-Message -Level Warning -Message "You must specify an Object and a Target for SQL Server 2000" + continue + } + } + + $dbs = $server.Databases + + if ($Database) { + $dbs = $dbs | Where-Object Name -In $Database + } + + foreach ($db in $dbs) { + Write-Message -Level Verbose -Message "Processing $db on $instance" + $queryList = @() + if ($db.IsAccessible -eq $false) { + Stop-Function -Message "The database $db is not accessible. Skipping." -Continue + } + + if ((Test-Bound -ParameterName Object) -and (Test-Bound -ParameterName Target)) { + $query = $StringBuilder.ToString() + $query = $query.Replace('#options#', "'$Object', '$Target'") + + $queryList += New-Object -TypeName PSObject -Property @{Object = $Object; + Target = $Target; + Query = $query + } + } elseif (Test-Bound -ParameterName Object) { + $whereFilter = " WHERE (Object = '$object' or name = '$object')" + $statListFiltered = $statList + $whereFilter + Write-Message -Level Verbose -Message "Query to execute: $statListFiltered" + $statListData = $db.Query($statListFiltered) + foreach ($statisticObj in $statListData) { + $query = $StringBuilder.ToString() + $query = $query.Replace('#options#', "'$($statisticObj.Object)', '$($statisticObj.Target)'") + $queryList += New-Object -TypeName PSObject -Property @{Object = $statisticObj.Object; + Target = $statisticObj.Target; + Query = $query + } + } + } else { + $statListData = $db.Query($statList) + foreach ($statisticObj in $statListData) { + $query = $StringBuilder.ToString() + $query = $query.Replace('#options#', "'$($statisticObj.Object)', '$($statisticObj.Target)'") + $queryList += New-Object -TypeName PSObject -Property @{Object = $statisticObj.Object; + Target = $statisticObj.Target; + Query = $query + } + } + } + + try { + foreach ($queryObj in $queryList ) { + Write-Message -Message "Running statement $($queryObj.Query)" -Level Verbose + $results = $server | Invoke-DbaQuery -Query $queryObj.Query -Database $db.Name -MessagesToOutput + + if ($Option -eq 'StatHeader') { + foreach ($row in $results) { + [PSCustomObject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + Database = $db.Name + Object = $queryObj.Object + Target = $queryObj.Target + Cmd = $queryObj.Query + Name = $row[0] + Updated = $row[1] + Rows = $row[2] + RowsSampled = $row[3] + Steps = $row[4] + Density = $row[5] + AverageKeyLength = $row[6] + StringIndex = $row[7] + FilterExpression = $row[8] + UnfilteredRows = $row[9] + PersistedSamplePercent = $row[10] + } + } + } + if ($Option -eq 'DensityVector') { + foreach ($row in $results) { + [PSCustomObject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + Database = $db.Name + Object = $queryObj.Object + Target = $queryObj.Target + Cmd = $queryObj.Query + AllDensity = $row[0].ToString() + AverageLength = $row[1] + Columns = $row[2] + } + } + } + if ($Option -eq 'Histogram') { + foreach ($row in $results) { + [PSCustomObject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + Database = $db.Name + Object = $queryObj.Object + Target = $queryObj.Target + Cmd = $queryObj.Query + RangeHiKey = $row[0] + RangeRows = $row[1] + EqualRows = $row[2] + DistinctRangeRows = $row[3] + AverageRangeRows = $row[4] + } + } + } + if ($Option -eq 'StatsStream') { + foreach ($row in $results) { + [PSCustomObject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + Database = $db.Name + Object = $queryObj.Object + Target = $queryObj.Target + Cmd = $queryObj.Query + StatsStream = $row[0] + Rows = $row[1] + DataPages = $row[2] + } + } + } + } + } catch { + Stop-Function -Message "Error capturing data on $db" -Target $instance -ErrorRecord $_ -Exception $_.Exception -Continue + } + } + } + } +} \ No newline at end of file diff --git a/functions/Get-DbaDbccUserOption.ps1 b/functions/Get-DbaDbccUserOption.ps1 index 3de8866945..3e2d68f728 100644 --- a/functions/Get-DbaDbccUserOption.ps1 +++ b/functions/Get-DbaDbccUserOption.ps1 @@ -33,26 +33,26 @@ function Get-DbaDbccUserOption { License: MIT https://opensource.org/licenses/MIT .LINK - https://dbatools.io/Get-DbaDbccUserOptions + https://dbatools.io/Get-DbaDbccUserOption .EXAMPLE - PS C:\> Get-DbaDbccUserOptions -SqlInstance Server1 + PS C:\> Get-DbaDbccUserOption -SqlInstance Server1 Get results of DBCC USEROPTIONS for Instance Server1 .EXAMPLE - PS C:\> 'Sql1','Sql2/sqlexpress' | Get-DbaDbccUserOptions + PS C:\> 'Sql1','Sql2/sqlexpress' | Get-DbaDbccUserOption Get results of DBCC USEROPTIONS for Instances Sql1 and Sql2/sqlexpress .EXAMPLE PS C:\> $cred = Get-Credential sqladmin - PS C:\> Get-DbaDbccUserOptions -SqlInstance Server1 -SqlCredential $cred + PS C:\> Get-DbaDbccUserOption -SqlInstance Server1 -SqlCredential $cred Connects using sqladmin credential and gets results of DBCC USEROPTIONS for Instance Server1 .EXAMPLE - PS C:\> Get-DbaDbccUserOptions -SqlInstance Server1 -Option ansi_nulls, ansi_warnings, datefirst + PS C:\> Get-DbaDbccUserOption -SqlInstance Server1 -Option ansi_nulls, ansi_warnings, datefirst Gets results of DBCC USEROPTIONS for Instance Server1. Only display results for the options ansi_nulls, ansi_warnings, datefirst diff --git a/functions/Get-DbaDependency.ps1 b/functions/Get-DbaDependency.ps1 index 46f814a01c..019266856e 100644 --- a/functions/Get-DbaDependency.ps1 +++ b/functions/Get-DbaDependency.ps1 @@ -54,20 +54,11 @@ function Get-DbaDependency { #> [CmdletBinding()] param ( - [Parameter(ValueFromPipeline)] - $InputObject, - - [switch] - $AllowSystemObjects, - - [switch] - $Parents, - - [switch] - $IncludeSelf, - - [switch] - [Alias('Silent')]$EnableException + [Parameter(ValueFromPipeline)]$InputObject, + [switch]$AllowSystemObjects, + [switch]$Parents, + [switch]$IncludeSelf, + [switch]$EnableException ) begin { @@ -86,10 +77,7 @@ function Get-DbaDependency { $EnumParents, [string] - $FunctionName, - - [bool] - $EnableException + $FunctionName ) $scripter = New-Object Microsoft.SqlServer.Management.Smo.Scripter @@ -102,13 +90,13 @@ function Get-DbaDependency { $urnCollection = New-Object Microsoft.SqlServer.Management.Smo.UrnCollection - Write-Message -EnableException $EnableException -Level 5 -Message "Adding $Object which is a $($Object.urn.Type)" -FunctionName $FunctionName + Write-Message -Level 5 -Message "Adding $Object which is a $($Object.urn.Type)" -FunctionName $FunctionName $urnCollection.Add([Microsoft.SqlServer.Management.Sdk.Sfc.Urn]$Object.urn) - #now we set up an event listnenr go get progress reports + #now we set up an event listener go get progress reports $progressReportEventHandler = [Microsoft.SqlServer.Management.Smo.ProgressReportEventHandler] { $name = $_.Current.GetAttribute('Name'); - Write-Message -EnableException $EnableException -Level 5 -Message "Analysed $name" -FunctionName $FunctionName + Write-Message -Level 5 -Message "Analysed $name" -FunctionName $FunctionName } $scripter.add_DiscoveryProgress($progressReportEventHandler) @@ -219,9 +207,9 @@ function Get-DbaDependency { } process { foreach ($Item in $InputObject) { - Write-Message -EnableException $EnableException -Level Verbose -Message "Processing: $Item" + Write-Message -Level Verbose -Message "Processing: $Item" if ($null -eq $Item.urn) { - Stop-Function -Message "$Item is not a valid SMO object" -EnableException $EnableException -Category InvalidData -Continue -Target $Item + Stop-Function -Message "$Item is not a valid SMO object" -Category InvalidData -Continue -Target $Item } # Find the server object to pass on to the function @@ -231,12 +219,12 @@ function Get-DbaDependency { until (($parent.urn.type -eq "Server") -or (-not $parent)) if (-not $parent) { - Stop-Function -Message "Failed to find valid server object in input: $Item" -EnableException $EnableException -Category InvalidData -Continue -Target $Item + Stop-Function -Message "Failed to find valid server object in input: $Item" -Category InvalidData -Continue -Target $Item } $server = $parent - $tree = Get-DependencyTree -Object $Item -AllowSystemObjects $false -Server $server -FunctionName (Get-PSCallStack)[0].COmmand -EnableException $EnableException -EnumParents $Parents + $tree = Get-DependencyTree -Object $Item -AllowSystemObjects $false -Server $server -FunctionName (Get-PSCallStack)[0].COmmand -EnumParents $Parents $limitCount = 2 if ($IncludeSelf) { $limitCount = 1 } if ($tree.Count -lt $limitCount) { diff --git a/functions/Get-DbaLogin.ps1 b/functions/Get-DbaLogin.ps1 index e9bfc39c67..a2f1fcefb5 100644 --- a/functions/Get-DbaLogin.ps1 +++ b/functions/Get-DbaLogin.ps1 @@ -183,7 +183,7 @@ function Get-DbaLogin { } if ($Type -eq 'Windows') { - $serverLogins = $serverLogins | Where-Object LoginType -eq 'WindowsUser' + $serverLogins = $serverLogins | Where-Object LoginType -in @('WindowsUser', 'WindowsGroup') } if ($Type -eq 'SQL') { diff --git a/functions/Get-DbaPowerPlan.ps1 b/functions/Get-DbaPowerPlan.ps1 index 800dfbe8f8..68e6bd9fe6 100644 --- a/functions/Get-DbaPowerPlan.ps1 +++ b/functions/Get-DbaPowerPlan.ps1 @@ -49,6 +49,8 @@ function Get-DbaPowerPlan { process { foreach ($computer in $ComputerName) { + $null = Test-ElevationRequirement -ComputerName $computer -Continue + $server = Resolve-DbaNetworkName -ComputerName $computer -Credential $Credential $computerResolved = $server.FullComputerName diff --git a/functions/Get-DbaProductKey.ps1 b/functions/Get-DbaProductKey.ps1 index 9ba54b5ce4..d608c57aca 100644 --- a/functions/Get-DbaProductKey.ps1 +++ b/functions/Get-DbaProductKey.ps1 @@ -167,7 +167,7 @@ function Get-DbaProductKey { process { foreach ($computer in $ComputerName) { try { - $registryroot = Get-DbaRegistryRoot -ComputerName $computer.ComputerName -EnableException + $registryroot = Get-DbaRegistryRoot -ComputerName $computer.ComputerName -Credential $Credential -EnableException } catch { Stop-Function -Message "Can't access registry for $($computer.ComputerName). Is the Remote Registry service started?" -Continue } diff --git a/functions/Get-DbaServerRoleMember.ps1 b/functions/Get-DbaServerRoleMember.ps1 index 8e2f2ba9dd..4a7c340f0d 100644 --- a/functions/Get-DbaServerRoleMember.ps1 +++ b/functions/Get-DbaServerRoleMember.ps1 @@ -81,7 +81,7 @@ function Get-DbaServerRoleMember { param ( [parameter(Position = 0, Mandatory, ValueFromPipeline)] [Alias('ServerInstance', 'SqlServer')] - [DbaInstance[]]$SqlInstance, + [DbaInstanceParameter[]]$SqlInstance, [Alias('Credential')] [PSCredential]$SqlCredential, [string[]]$ServerRole, @@ -105,9 +105,12 @@ function Get-DbaServerRoleMember { $roles = $server.Roles if (Test-Bound -ParameterName 'Login') { - $logins = Get-DbaLogin -SqlInstance $instance -Login $Login + try { + $logins = Get-DbaLogin -SqlInstance $server -Login $Login -EnableException + } catch { + Stop-Function -Message "Issue gathering login details" -ErrorRecord $_ -Target $instance + } Write-Message -Level 'Verbose' -Message "Filtering by logins: $($logins -join ', ')" - foreach ($l in $logins) { $loginRoles += $l.ListMembers() } diff --git a/functions/Get-DbaSsisExecutionHistory.ps1 b/functions/Get-DbaSsisExecutionHistory.ps1 index 5ea7206c2c..c0576c6fd6 100644 --- a/functions/Get-DbaSsisExecutionHistory.ps1 +++ b/functions/Get-DbaSsisExecutionHistory.ps1 @@ -63,7 +63,7 @@ function Get-DbaSsisExecutionHistory { Gets all failed or canceled executions for SMTQ01. .EXAMPLE - PS C:\> Get-DbaSsisExecutionHistory -SqlInstance SMTQ01,SMTQ02 -Status Failed,Cancelled -Whatif + PS C:\> Get-DbaSsisExecutionHistory -SqlInstance SMTQ01,SMTQ02 -Status Failed,Cancelled Shows what would happen if the command were executed and would return the SQL statement that would be executed per instance. diff --git a/functions/Get-DbaTraceFlag.ps1 b/functions/Get-DbaTraceFlag.ps1 index 2f46ea192e..ad2c49e8eb 100644 --- a/functions/Get-DbaTraceFlag.ps1 +++ b/functions/Get-DbaTraceFlag.ps1 @@ -21,7 +21,7 @@ function Get-DbaTraceFlag { Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. .NOTES - Tags: TraceFlag + Tags: TraceFlag, DBCC Author: Kevin Bullen (@sqlpadawan) Website: https://dbatools.io diff --git a/functions/Get-DbaUserPermission.ps1 b/functions/Get-DbaUserPermission.ps1 index d692858e0d..9fe5192e01 100644 --- a/functions/Get-DbaUserPermission.ps1 +++ b/functions/Get-DbaUserPermission.ps1 @@ -4,7 +4,7 @@ function Get-DbaUserPermission { Displays detailed permissions information for the server and database roles and securables. .DESCRIPTION - This command will display all server logins, server level securable, database logins and database securables. + This command will display all server logins, server level securables, database logins and database securables. DISA STIG implementators will find this command useful as it uses Permissions.sql provided by DISA. @@ -82,9 +82,6 @@ function Get-DbaUserPermission { ) begin { - - $sql = [System.IO.File]::ReadAllText("$script:PSModuleRoot\bin\stig.sql") - $endSQL = " BEGIN TRY DROP FUNCTION STIG.server_effective_permissions END TRY BEGIN CATCH END CATCH; GO BEGIN TRY DROP VIEW STIG.server_permissions END TRY BEGIN CATCH END CATCH; @@ -111,7 +108,7 @@ function Get-DbaUserPermission { $serverSQL = "SELECT 'SERVER LOGINS' AS Type , sl.name AS Member , - ISNULL(srm.role, 'None') AS [Role/Securable/Class] , + ISNULL(srm.Role, 'None') AS [Role/Securable/Class] , ' ' AS [Schema/Owner] , ' ' AS [Securable] , ' ' AS [Grantee Type] , @@ -122,7 +119,7 @@ function Get-DbaUserPermission { ' ' AS [Grantor Type] , ' ' AS [Source View] FROM master.sys.syslogins sl - LEFT JOIN tempdb.[STIG].[server_role_members] srm ON sl.name = srm.member + LEFT JOIN tempdb.[STIG].[server_role_members] srm ON sl.name = srm.Member WHERE sl.name NOT LIKE 'NT %' AND sl.name NOT LIKE '##%' UNION @@ -159,7 +156,7 @@ function Get-DbaUserPermission { UNION SELECT DISTINCT 'DB SECURABLES' AS Type , - drm.member , + drm.Member , dp.[Securable Type or Class] COLLATE SQL_Latin1_General_CP1_CI_AS , dp.[Schema/Owner] , dp.Securable , @@ -171,8 +168,8 @@ function Get-DbaUserPermission { dp.[Grantor Type] COLLATE SQL_Latin1_General_CP1_CI_AS , dp.[Source View] FROM tempdb.[STIG].[database_role_members] drm - LEFT JOIN tempdb.[STIG].[database_permissions] dp ON ( drm.member = dp.grantee - OR drm.role = dp.grantee + LEFT JOIN tempdb.[STIG].[database_permissions] dp ON ( drm.Member = dp.Grantee + OR drm.Role = dp.Grantee ) WHERE dp.Grantor IS NOT NULL AND [Schema/Owner] <> 'sys'" @@ -192,6 +189,7 @@ function Get-DbaUserPermission { } $dbs = $server.Databases + $tempdb = $server.Databases['tempdb'] if ($Database) { $dbs = $dbs | Where-Object { $Database -contains $_.Name } @@ -211,10 +209,13 @@ function Get-DbaUserPermission { foreach ($db in $dbs) { Write-Message -Level Verbose -Message "Processing $db on $instance" + $db.ExecuteNonQuery($endSQL) + if ($db.IsAccessible -eq $false) { Stop-Function -Message "The database $db is not accessible" -Continue } + $sql = [System.IO.File]::ReadAllText("$script:PSModuleRoot\bin\stig.sql") $sql = $sql.Replace("", $db.Name) #Create objects in active database @@ -291,13 +292,11 @@ function Get-DbaUserPermission { #Delete objects Write-Message -Level Verbose -Message "Deleting objects" try { - $db.ExecuteNonQuery($endSQL) + $tempdb.ExecuteNonQuery($endSQL) } catch { # here to avoid an empty catch $null = 1 } - $sql = $sql.Replace($db.Name, "") - #Sashay Away } } diff --git a/functions/Import-DbaCsv.ps1 b/functions/Import-DbaCsv.ps1 index 70ddf1b3de..f16d52ddf8 100644 --- a/functions/Import-DbaCsv.ps1 +++ b/functions/Import-DbaCsv.ps1 @@ -8,7 +8,9 @@ function Import-DbaCsv { The entire import is performed within a transaction, so if a failure occurs or the script is aborted, no changes will persist. - If the table or view specified does not exist and -AutoCreateTable, it will be automatically created using slow and efficient but accomodating data types. + If the table or view specified does not exist and -AutoCreateTable, it will be automatically created using slow and inefficient but accommodating data types. + + This importer supports fields spanning multiple lines. The only restriction is that they must be quoted, otherwise it would not be possible to distinguish between malformed data and multi-line values. .PARAMETER Path Specifies path to the CSV file(s) to be imported. Multiple files may be imported at once. @@ -47,7 +49,7 @@ function Import-DbaCsv { If a table name is not specified, the table name will be automatically determined from the filename. - If the table specified does not exist and -AutoCreateTable, it will be automatically created using slow and efficient but accomodating data types. + If the table specified does not exist and -AutoCreateTable, it will be automatically created using slow and inefficient but accommodating data types. If the automatically generated table datatypes do not work for you, please create the table prior to import. @@ -100,6 +102,52 @@ function Import-DbaCsv { .PARAMETER NoProgress The progress bar is pretty but can slow down imports. Use this parameter to quietly import. + .PARAMETER Quote + Defines the default quote character wrapping every field. + + .PARAMETER Escape + Defines the default escape character letting insert quotation characters inside a quoted field. + + The escape character can be the same as the quote character. + + .PARAMETER Comment + Defines the default comment character indicating that a line is commented out. Default is #. + + .PARAMETER TrimmingOption + Determines which values should be trimmed. Default is "None". Options are All, None, UnquotedOnly and QuotedOnly. + + .PARAMETER BufferSize + Defines the default buffer size. The default BufferSize is 4096. + + .PARAMETER ParseErrorAction + By default, the parse error action throws an exception and ends the import. + + You can also choose AdvanceToNextLine which basically ignores parse errors. + + .PARAMETER Encoding + The encoding of the file. + + .PARAMETER NullValue + The value which denotes a DbNull-value. + + .PARAMETER Threshold + Defines the default value for Threshold indicating when the CsvReader should replace/remove consecutive null bytes. + + .PARAMETER MaxQuotedFieldLength + The axmimum length (in bytes) for any quoted field. + + .PARAMETER SkipEmptyLine + Skip empty lines. + + .PARAMETER SupportsMultiline + Indicates if the importer should support multiline fields. + + .PARAMETER UseColumnDefault + Use the column default values if the field is not in the record. + + .PARAMETER NoTransaction + Do not use a transaction when performing the import. + .PARAMETER WhatIf Shows what would happen if the command were to run. No actions are actually performed. @@ -183,7 +231,7 @@ function Import-DbaCsv { [string]$Table, [string]$Schema = "dbo", [switch]$Truncate, - [string]$Delimiter = ",", + [char]$Delimiter = ",", [switch]$SingleColumn, [int]$BatchSize = 50000, [int]$NotifyAfter = 50000, @@ -197,6 +245,22 @@ function Import-DbaCsv { [switch]$AutoCreateTable, [switch]$NoProgress, [switch]$NoHeaderRow, + [char]$Quote = '"', + [char]$Escape = '"', + [char]$Comment = '#', + [ValidateSet('All', 'None', 'UnquotedOnly', 'QuotedOnly')] + [string]$TrimmingOption = "None", + [int]$BufferSize = 4096, + [ValidateSet('AdvanceToNextLine', 'ThrowException')] + [string]$ParseErrorAction = 'ThrowException', + [System.Text.Encoding]$Encoding, + [string]$NullValue, + [int]$Threshold = 60, + [int]$MaxQuotedFieldLength, + [switch]$SkipEmptyLine, + [switch]$SupportsMultiline, + [switch]$UseColumnDefault, + [switch]$NoTransaction, [switch]$EnableException ) begin { @@ -235,7 +299,17 @@ function Import-DbaCsv { [System.Data.SqlClient.SqlConnection]$sqlconn, [System.Data.SqlClient.SqlTransaction]$transaction ) - $reader = New-Object LumenWorks.Framework.IO.Csv.CsvReader((New-Object System.IO.StreamReader($Path)), $FirstRowHeader, $Delimiter, 1) + $reader = New-Object LumenWorks.Framework.IO.Csv.CsvReader( + (New-Object System.IO.StreamReader($Path)), + $FirstRowHeader, + $Delimiter, + $Quote, + $Escape, + $Comment, + [LumenWorks.Framework.IO.Csv.ValueTrimmingOptions]::$TrimmingOption, + $BufferSize, + $NullValue + ) $columns = $reader.GetFieldHeaders() $reader.Close() $reader.Dispose() @@ -336,10 +410,12 @@ function Import-DbaCsv { Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue } - if ($PSCmdlet.ShouldProcess($instance, "Starting transaction in $Database")) { - # Everything will be contained within 1 transaction, even creating a new table if required - # and truncating the table, if specified. - $transaction = $sqlconn.BeginTransaction() + if (-not $NoTransaction) { + if ($PSCmdlet.ShouldProcess($instance, "Starting transaction in $Database")) { + # Everything will be contained within 1 transaction, even creating a new table if required + # and truncating the table, if specified. + $transaction = $sqlconn.BeginTransaction() + } } # Ensure database exists @@ -387,7 +463,11 @@ function Import-DbaCsv { } Write-Message -Level Verbose -Message "Table does not exist" if ($PSCmdlet.ShouldProcess($instance, "Creating table $table")) { - New-SqlTable -Path $file -Delimiter $Delimiter -FirstRowHeader $FirstRowHeader -SqlConn $sqlconn -Transaction $transaction + try { + New-SqlTable -Path $file -Delimiter $Delimiter -FirstRowHeader $FirstRowHeader -SqlConn $sqlconn -Transaction $transaction + } catch { + Stop-Function -Continue -Message "Failure" -ErrorRecord $_ + } } } else { Write-Message -Level Verbose -Message "Table exists" @@ -411,23 +491,22 @@ function Import-DbaCsv { Write-Message -Level Verbose -Message "Starting bulk copy for $(Split-Path $file -Leaf)" # Setup bulk copy options - $bulkCopyOptions = @() - $options = "TableLock", "CheckConstraints", "FireTriggers", "KeepIdentity", "KeepNulls", "Default" + [int]$bulkCopyOptions = ([System.Data.SqlClient.SqlBulkCopyOptions]::Default) + $options = "TableLock", "CheckConstraints", "FireTriggers", "KeepIdentity", "KeepNulls" foreach ($option in $options) { $optionValue = Get-Variable $option -ValueOnly -ErrorAction SilentlyContinue if ($optionValue -eq $true) { - $bulkCopyOptions += "$option" + $bulkCopyOptions = $bulkCopyOptions -bor (Invoke-Expression "[System.Data.SqlClient.SqlBulkCopyOptions]::$option") } } - $bulkCopyOptions = $bulkCopyOptions -join " & " if ($PSCmdlet.ShouldProcess($instance, "Performing import from $file")) { try { # Create SqlBulkCopy using default options, or options specified in command line. if ($bulkCopyOptions) { - $bulkcopy = New-Object Data.SqlClient.SqlBulkCopy($oleconnstring, $bulkCopyOptions, $transaction) + $bulkcopy = New-Object Data.SqlClient.SqlBulkCopy($sqlconn, $bulkCopyOptions, $transaction) } else { - $bulkcopy = New-Object Data.SqlClient.SqlBulkCopy($sqlconn, "Default", $transaction) + $bulkcopy = New-Object Data.SqlClient.SqlBulkCopy($sqlconn, ([System.Data.SqlClient.SqlBulkCopyOptions]::Default), $transaction) } $bulkcopy.DestinationTableName = "[$schema].[$table]" @@ -455,10 +534,39 @@ function Import-DbaCsv { # Write to server :D try { - # Open the text file from disk - # // or using (CsvReader csv = new CsvReader(File.OpenRead(path), false, Encoding.UTF8, addMark)) - # When addMark is true, consecutive null bytes will be replaced by [removed x null bytes] to indicate the removal - $reader = New-Object LumenWorks.Framework.IO.Csv.CsvReader((New-Object System.IO.StreamReader($file)), $FirstRowHeader, $Delimiter, 1) + $reader = New-Object LumenWorks.Framework.IO.Csv.CsvReader( + (New-Object System.IO.StreamReader($file)), + $FirstRowHeader, + $Delimiter, + $Quote, + $Escape, + $Comment, + [LumenWorks.Framework.IO.Csv.ValueTrimmingOptions]::$TrimmingOption, + $BufferSize, + $NullValue + ) + + if (Test-Bound -ParameterName Encoding) { + $reader.Encoding = $Encoding + } + if (Test-Bound -ParameterName Threshold) { + $reader.Threshold = $Threshold + } + if (Test-Bound -ParameterName MaxQuotedFieldLength) { + $reader.MaxQuotedFieldLength = $MaxQuotedFieldLength + } + if (Test-Bound -ParameterName SkipEmptyLine) { + $reader.SkipEmptyLines = $SkipEmptyLine + } + if (Test-Bound -ParameterName SupportsMultiline) { + $reader.SupportsMultiline = $SupportsMultiline + } + if (Test-Bound -ParameterName UseColumnDefault) { + $reader.UseColumnDefaults = $UseColumnDefault + } + if (Test-Bound -ParameterName ParseErrorAction) { + $reader.DefaultParseErrorAction = $ParseErrorAction + } # Add rowcount output $bulkCopy.Add_SqlRowsCopied( { @@ -487,28 +595,33 @@ function Import-DbaCsv { Stop-Function -Continue -Message "Failure" -ErrorRecord $_ } } - if ($PSCmdlet.ShouldProcess($instance, "Committing transaction")) { + if ($PSCmdlet.ShouldProcess($instance, "Finalizing import")) { if ($completed) { # "Note: This count does not take into consideration the number of rows actually inserted when Ignore Duplicates is set to ON." - $null = $transaction.Commit() + if (-not $NoTransaction) { + $null = $transaction.Commit() + } if ($script:core) { $rowscopied = "Unsupported in Core" + $rps = $null } else { $rowscopied = [System.Data.SqlClient.SqlBulkCopyExtension]::RowsCopiedCount($bulkcopy) + $rps = [int]($rowscopied / $elapsed.Elapsed.TotalSeconds) } Write-Message -Level Verbose -Message "$rowscopied total rows copied" [pscustomobject]@{ - ComputerName = $server.ComputerName - InstanceName = $server.ServiceName - SqlInstance = $server.DomainInstanceName - Database = $Database - Table = $table - Schema = $schema - RowsCopied = $rowscopied - Elapsed = [prettytimespan]$elapsed.Elapsed - Path = $file + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + Database = $Database + Table = $table + Schema = $schema + RowsCopied = $rowscopied + Elapsed = [prettytimespan]$elapsed.Elapsed + RowsPerSecond = $rps + Path = $file } } else { Stop-Function -Message "Transaction rolled back. Was the proper delimiter specified? Is the first row the column name?" -ErrorRecord $_ @@ -546,4 +659,4 @@ function Import-DbaCsv { Test-DbaDeprecation -DeprecatedOn "1.0.0" -Alias Import-DbaCsvtoSql Test-DbaDeprecation -DeprecatedOn "1.0.0" -EnableException:$false -Alias Import-CsvToSql } -} \ No newline at end of file +} diff --git a/functions/Import-DbaXESessionTemplate.ps1 b/functions/Import-DbaXESessionTemplate.ps1 index e8f18f48e8..d007111c9e 100644 --- a/functions/Import-DbaXESessionTemplate.ps1 +++ b/functions/Import-DbaXESessionTemplate.ps1 @@ -61,10 +61,10 @@ function Import-DbaXESessionTemplate { Creates a new XESession named "Query Wait Stats" using the db_query_wait_stats template. .EXAMPLE - PS C:\> Get-DbaXESession -SqlInstance sql2017 -Session db_ola_health | Remove-DbaXESession - PS C:\> Import-DbaXESessionTemplate -SqlInstance sql2017 -Template db_ola_health | Start-DbaXESession + PS C:\> Get-DbaXESession -SqlInstance sql2017 -Session 'Database Health 2014' | Remove-DbaXESession + PS C:\> Import-DbaXESessionTemplate -SqlInstance sql2017 -Template 'Database Health 2014' | Start-DbaXESession - Imports a session if it exists, then recreates it using a template. + Removes a session if it exists, then recreates it using a template. .EXAMPLE PS C:\> Get-DbaXESessionTemplate | Out-GridView -PassThru | Import-DbaXESessionTemplate -SqlInstance sql2017 @@ -95,8 +95,9 @@ function Import-DbaXESessionTemplate { Stop-Function -Message "You must specify Path or Template." } - if (($Path.Count -gt 1 -or $Template.Count -gt 1) -and (Test-Bound -ParameterName Template)) { + if (($Path.Count -gt 1 -or $Template.Count -gt 1) -and (Test-Bound -ParameterName Name)) { Stop-Function -Message "Name cannot be specified with multiple files or templates because the Session will already exist." + return } foreach ($instance in $SqlInstance) { @@ -191,7 +192,7 @@ function Import-DbaXESessionTemplate { } try { - Write-Message -Level Verbose -Message "Importing $file as $name " + Write-Message -Level Verbose -Message "Importing $file as $Name " $session = $store.CreateSessionFromTemplate($Name, $file) $session.Create() if ($file -eq $tempfile) { @@ -204,4 +205,4 @@ function Import-DbaXESessionTemplate { } } } -} \ No newline at end of file +} diff --git a/functions/Install-DbaMaintenanceSolution.ps1 b/functions/Install-DbaMaintenanceSolution.ps1 index 5c4fff082c..a9a9c14121 100644 --- a/functions/Install-DbaMaintenanceSolution.ps1 +++ b/functions/Install-DbaMaintenanceSolution.ps1 @@ -78,6 +78,22 @@ function Install-DbaMaintenanceSolution { This will create the Ola Hallengren's Solution objects. Existing objects are not affected in any way. + + .EXAMPLE + PS C:\> $params = @{ + >> SqlInstance = 'MyServer' + >> Database = 'maintenance' + >> ReplaceExisting = $true + >> InstallJobs = $true + >> LogToTable = $true + >> BackupLocation = 'C:\Data\Backup' + >> CleanupTime = 65 + >> Verbose = $true + >> } + >> Install-DbaMaintenanceSolution @params + + Installs Maintenance Solution to myserver in database. Adds Agent Jobs, and if any currently exist, they'll be replaced. + .EXAMPLE PS C:\> Install-DbaMaintenanceSolution -SqlInstance RES14224 -Database DBA -BackupLocation "Z:\SQLBackup" -CleanupTime 72 -ReplaceExisting @@ -234,7 +250,7 @@ function Install-DbaMaintenanceSolution { } # OutputFileDirectory - if (-not $OutputFileDirectory) { + if ($OutputFileDirectory) { $findOutputFileDirectory = 'SET @OutputFileDirectory = NULL' $replaceOutputFileDirectory = 'SET @OutputFileDirectory = N''' + $OutputFileDirectory + '''' $fileContents[$file] = $fileContents[$file].Replace($findOutputFileDirectory, $replaceOutputFileDirectory) @@ -288,8 +304,9 @@ function Install-DbaMaintenanceSolution { $db = $server.Databases[$Database] - # Required - $required = @('CommandExecute.sql') + if (-not ($Solution -match 'All')) { + $required = @('CommandExecute.sql') + } if ($LogToTable) { $required += 'CommandLog.sql' @@ -314,7 +331,6 @@ function Install-DbaMaintenanceSolution { $temp = ([System.IO.Path]::GetTempPath()).TrimEnd("\") $zipfile = "$temp\ola.zip" - $listOfFiles = Get-ChildItem -Filter "*.sql" -Path $LocalCachedCopy -Recurse | Select-Object -ExpandProperty FullName $fileContents = Get-DbaOlaWithParameters -listOfFiles $listOfFiles @@ -334,15 +350,21 @@ function Install-DbaMaintenanceSolution { DROP PROCEDURE [dbo].[IndexOptimize]; ") - Write-Message -Level Output -Message "Dropping objects created by Ola's Maintenance Solution" - $null = $db.Query($CleanupQuery) + if ($Pscmdlet.ShouldProcess($instance, "Dropping all objects created by Ola's Maintenance Solution")) { + Write-Message -Level Output -Message "Dropping objects created by Ola's Maintenance Solution" + $null = $db.Query($CleanupQuery) + } # Remove Ola's Jobs if ($InstallJobs -and $ReplaceExisting) { Write-Message -Level Output -Message "Removing existing SQL Agent Jobs created by Ola's Maintenance Solution." $jobs = Get-DbaAgentJob -SqlInstance $server | Where-Object Description -match "hallengren" if ($jobs) { - $jobs | ForEach-Object { Remove-DbaAgentJob -SqlInstance $instance -Job $_.name } + $jobs | ForEach-Object { + if ($Pscmdlet.ShouldProcess($instance, "Dropping job $_.name")) { + Remove-DbaAgentJob -SqlInstance $server -Job $_.name + } + } } } } @@ -353,14 +375,16 @@ function Install-DbaMaintenanceSolution { foreach ($file in $fileContents.Keys) { $shortFileName = Split-Path $file -Leaf if ($required.Contains($shortFileName)) { - Write-Message -Level Output -Message "Installing $shortFileName." - $sql = $fileContents[$file] - try { - foreach ($query in ($sql -Split "\nGO\b")) { - $null = $db.Query($query) + if ($Pscmdlet.ShouldProcess($instance, "Installing $shortFileName")) { + Write-Message -Level Output -Message "Installing $shortFileName." + $sql = $fileContents[$file] + try { + foreach ($query in ($sql -Split "\nGO\b")) { + $null = $db.Query($query) + } + } catch { + Stop-Function -Message "Could not execute $shortFileName in $Database on $instance." -ErrorRecord $_ -Target $db -Continue } - } catch { - Stop-Function -Message "Could not execute $shortFileName in $Database on $instance." -ErrorRecord $_ -Target $db -Continue } } } @@ -378,4 +402,4 @@ function Install-DbaMaintenanceSolution { Write-Message -Level Output -Message "Installation complete." } -} \ No newline at end of file +} diff --git a/functions/Invoke-DbaAdvancedRestore.ps1 b/functions/Invoke-DbaAdvancedRestore.ps1 index ef81d39066..01d96737a4 100644 --- a/functions/Invoke-DbaAdvancedRestore.ps1 +++ b/functions/Invoke-DbaAdvancedRestore.ps1 @@ -172,8 +172,8 @@ function Invoke-DbaAdvancedRestore { } } } elseif (-not $WithReplace -and (-not $VerifyOnly)) { - Stop-Function -Message "$Database exists and WithReplace not specified, stopping" -EnableException $EnableException - return + Write-Message -Level verbose -Message "$Database exists and WithReplace not specified, stopping" + continue } } Write-Message -Message "WithReplace = $WithReplace" -Level Debug diff --git a/functions/Invoke-DbaAdvancedUpdate.ps1 b/functions/Invoke-DbaAdvancedUpdate.ps1 new file mode 100644 index 0000000000..7727bf6746 --- /dev/null +++ b/functions/Invoke-DbaAdvancedUpdate.ps1 @@ -0,0 +1,200 @@ +Function Invoke-DbaAdvancedUpdate { + <# + .SYNOPSIS + Designed for internal use, implements parallel execution for Update-DbaInstance. + + .DESCRIPTION + Invokes an update process for a single computer and restarts it if needed + + .PARAMETER ComputerName + Target computer with SQL instance or instances. + + .PARAMETER Action + An object containing the action plan + + .PARAMETER Restart + Restart computer automatically after a successful installation of a patch and wait until it comes back online. + Using this parameter is the only way to chain-install more than 1 patch on a computer, since every single patch will require a restart of said computer. + + .PARAMETER Credential + Windows Credential with permission to log on to the remote server. + Must be specified for any remote connection if update Repository is located on a network folder. + + .PARAMETER Authentication + Chooses an authentication protocol for remote connections. + If the protocol fails to establish a connection + + Defaults: + * CredSSP when -Credential is specified - due to the fact that repository Path is usually a network share and credentials need to be passed to the remote host + to avoid the double-hop issue. + * Default when -Credential is not specified. Will likely fail if a network path is specified. + + .PARAMETER WhatIf + Shows what would happen if the command were to run. No actions are actually performed. + + .PARAMETER Confirm + Prompts you for confirmation before executing any changing operations within the command. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .EXAMPLE + PS C:\> Invoke-DbaAdvancedUpdate -ComputerName SQL1 -Action $actions + + Invokes update actions on SQL1 after restarting it. + #> + [CmdletBinding(SupportsShouldProcess)] + Param ( + [string]$ComputerName, + [object[]]$Action, + [bool]$Restart, + [ValidateSet('Default', 'Basic', 'Negotiate', 'NegotiateWithImplicitCredential', 'Credssp', 'Digest', 'Kerberos')] + [string]$Authentication = 'Credssp', + [pscredential]$Credential, + [switch]$EnableException + ) + $computer = $ComputerName + $activity = "Updating SQL Server components on $computer" + $restarted = $false + $restartParams = @{ + ComputerName = $computer + ErrorAction = 'Stop' + For = 'WinRM' + Wait = $true + Force = $true + } + if ($Credential) { + $restartParams.Credential = $Credential + } + try { + $restartNeeded = Test-PendingReboot -ComputerName $computer -Credential $Credential + } catch { + $restartNeeded = $false + Stop-Function -Message "Failed to get reboot status from $computer" -ErrorRecord $_ + } + if ($restartNeeded -and $Restart) { + # Restart the computer prior to doing anything + Write-ProgressHelper -ExcludePercent -Activity $activity -Message "Restarting computer $($computer) due to pending restart" + Write-Message -Level Verbose "Restarting computer $($computer) due to pending restart" + try { + $null = Restart-Computer @restartParams + $restarted = $true + } catch { + Stop-Function -Message "Failed to restart computer" -ErrorRecord $_ + } + } + Write-Message -Level Debug -Message "Processing $($computer) with $(($Actions | Measure-Object).Count) actions" + #foreach action passed to the script for this particular computer + foreach ($currentAction in $Action) { + $output = $currentAction + $output.Successful = $false + $output.Restarted = $restarted + ## Start the installation sequence + Write-ProgressHelper -ExcludePercent -Activity $activity -Message "Launching installation of $($currentAction.TargetLevel) KB$($currentAction.KB) ($($currentAction.Installer)) for SQL$($currentAction.MajorVersion) ($($currentAction.Build))" + $execParams = @{ + ComputerName = $computer + ErrorAction = 'Stop' + Authentication = $Authentication + } + if ($Credential) { + $execParams.Credential = $Credential + } else { + if (Test-Bound -Not Authentication) { + # Use Default authentication instead of CredSSP when Authentication is not specified and Credential is null + $execParams.Authentication = "Default" + } + } + # Find a temporary folder to extract to - the drive that has most free space + try { + $chosenDrive = (Get-DbaDiskSpace -ComputerName $computer -Credential $Credential -EnableException:$true | Sort-Object -Property Free -Descending | Select-Object -First 1).Name + if (!$chosenDrive) { + # Fall back to the system drive + $chosenDrive = Invoke-Command2 -ComputerName $computer -Credential $Credential -ScriptBlock { $env:SystemDrive } -Raw -ErrorAction Stop + } + } catch { + $msg = "Failed to retrieve a disk drive to extract the update" + $output.Notes += $msg + Stop-Function -Message $msg -ErrorRecord $_ + return $output + } + $spExtractPath = $chosenDrive.TrimEnd('\') + "\dbatools_KB$($currentAction.KB)_Extract" + $output.ExtractPath = $spExtractPath + try { + # Extract file + Write-ProgressHelper -ExcludePercent -Activity $activity -Message "Extracting $($currentAction.Installer) to $spExtractPath" + Write-Message -Level Verbose -Message "Extracting $($currentAction.Installer) to $spExtractPath" + $extractResult = Invoke-Program @execParams -Path $currentAction.Installer -ArgumentList "/x`:`"$spExtractPath`" /quiet" -Fallback + if (-not $extractResult.Successful) { + $msg = "Extraction failed with exit code $($extractResult.ExitCode)" + $output.Notes += $msg + Stop-Function -Message $msg + return $output + } + # Install the patch + if ($currentAction.InstanceName) { + $instanceClause = "/instancename=$($currentAction.InstanceName)" + } else { + $instanceClause = '/allinstances' + } + Write-ProgressHelper -ExcludePercent -Activity $activity -Message "Now installing update SQL$($currentAction.MajorVersion)$($currentAction.TargetLevel) from $spExtractPath" + Write-Message -Level Verbose -Message "Starting installation from $spExtractPath" + $updateResult = Invoke-Program @execParams -Path "$spExtractPath\setup.exe" -ArgumentList @('/quiet', $instanceClause, '/IAcceptSQLServerLicenseTerms') -WorkingDirectory $spExtractPath -Fallback + $output.ExitCode = $updateResult.ExitCode + if ($updateResult.Successful) { + $output.Successful = $true + } else { + $msg = "Update failed with exit code $($updateResult.ExitCode)" + $output.Notes += $msg + Stop-Function -Message $msg + return $output + } + $output.Log = $updateResult.stdout + } catch { + Stop-Function -Message "Upgrade failed" -ErrorRecord $_ + $output.Notes += $_.Exception.Message + return $output + } finally { + ## Cleanup temp + Write-ProgressHelper -ExcludePercent -Activity $activity -Message "Cleaning up extracted files from $spExtractPath" + try { + Write-ProgressHelper -ExcludePercent -Activity $activity -Message "Removing temporary files" + $null = Invoke-CommandWithFallBack @execParams -ScriptBlock { + if ($args[0] -like '*\dbatools_KB*_Extract' -and (Test-Path $args[0])) { + Remove-Item -Recurse -Force -LiteralPath $args[0] -ErrorAction Stop + } + } -Raw -ArgumentList $spExtractPath + } catch { + $message = "Failed to cleanup temp folder on computer $($computer)`: $($_.Exception.Message)" + Write-Message -Level Verbose -Message $message + $output.Notes += $message + } + } + #double check if restart is needed + try { + $restartNeeded = Test-PendingReboot -ComputerName $computer -Credential $Credential + } catch { + $restartNeeded = $false + Stop-Function -Message "Failed to get reboot status from $computer" -ErrorRecord $_ + } + if ($updateResult.ExitCode -eq 3010 -or $restartNeeded) { + if ($Restart) { + # Restart the computer + Write-ProgressHelper -ExcludePercent -Activity $activity -Message "Restarting computer $($computer) and waiting for it to come back online" + Write-Message -Level Verbose "Restarting computer $($computer) and waiting for it to come back online" + try { + $null = Restart-Computer @restartParams + $output.Restarted = $true + } catch { + Stop-Function -Message "Failed to restart computer" -ErrorRecord $_ + return $output + } + } else { + $output.Notes += "Restart is required for computer $($computer) to finish the installation of SQL$($currentAction.MajorVersion)$($currentAction.TargetLevel)" + } + } + $output + Write-Progress -Activity $activity -Completed + } +} \ No newline at end of file diff --git a/functions/Invoke-DbaDbClone.ps1 b/functions/Invoke-DbaDbClone.ps1 index 6e7aa78736..d6b13cc038 100644 --- a/functions/Invoke-DbaDbClone.ps1 +++ b/functions/Invoke-DbaDbClone.ps1 @@ -154,12 +154,17 @@ function Invoke-DbaDbClone { if (Test-FunctionInterrupt) { return } if ($SqlInstance) { - $InputObject += Get-DbaDatabase -SqlInstance $SqlInstance -SqlCredential $SqlCredential + $InputObject += Get-DbaDatabase -SqlInstance $SqlInstance -SqlCredential $SqlCredential -Database $Database } foreach ($db in $InputObject) { $server = $db.Parent - + $instance = $server.Name + + if (-not (Test-Bound -ParameterName CloneDatabase)) { + $CloneDatabase = "$($db.Name)_clone" + } + if ($server.VersionMajor -eq 11 -and $server.Version -lt $sql2012min) { Stop-Function -Message "Unsupported version for $instance. SQL Server 2012 SP4 and above required." -Target $server -Continue } @@ -203,7 +208,7 @@ function Invoke-DbaDbClone { } $dbName = $db.Name - + foreach ($clonedb in $CloneDatabase) { Write-Message -Level Verbose -Message "Cloning $clonedb from $db" if ($server.Databases[$clonedb]) { @@ -214,6 +219,7 @@ function Invoke-DbaDbClone { $sql = "DBCC CLONEDATABASE('$dbName','$clonedb') $sqlWith" Write-Message -Level Debug -Message "Sql Statement: $sql" $null = $db.Query($sql) + $server.Databases.Refresh() Get-DbaDatabase -SqlInstance $server -Database $clonedb } catch { Stop-Function -Message "Failure" -ErrorRecord $_ -Target $server -Continue diff --git a/functions/Invoke-DbaDbDataMasking.ps1 b/functions/Invoke-DbaDbDataMasking.ps1 new file mode 100644 index 0000000000..eb330fb684 --- /dev/null +++ b/functions/Invoke-DbaDbDataMasking.ps1 @@ -0,0 +1,657 @@ +function Invoke-DbaDbDataMasking { + <# + .SYNOPSIS + Masks data by using randomized values determined by a configuration file and a randomizer framework + + .DESCRIPTION + TMasks data by using randomized values determined by a configuration file and a randomizer framework + + It will use a configuration file that can be made manually or generated using New-DbaDbMaskingConfig + + Note that the following column and data types are not currently supported: + Identity + ForeignKey + Computed + Hierarchyid + Geography + Geometry + Xml + + .PARAMETER SqlInstance + The target SQL Server instance or instances. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Database + Databases to process through + + .PARAMETER Table + Tables to process. By default all the tables will be processed + + .PARAMETER Column + Columns to process. By default all the columns will be processed + + .PARAMETER FilePath + Configuration file that contains the which tables and columns need to be masked + + .PARAMETER Query + If you would like to mask only a subset of a table, use the Query parameter, otherwise all data will be masked. + + .PARAMETER Locale + Set the local to enable certain settings in the masking + + .PARAMETER CharacterString + The characters to use in string data. 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789' by default + + .PARAMETER ExcludeTable + Exclude specific tables even if it's listed in the config file. + + .PARAMETER ExcludeColumn + Exclude specific columns even if it's listed in the config file. + + .PARAMETER MaxValue + Force a max length of strings instead of relying on datatype maxes. Note if a string datatype has a lower MaxValue, that will be used instead. + + Useful for adhoc updates and testing, otherwise, the config file should be used. + + .PARAMETER ModulusFactor + Calculating the next nullable by using the remainder from the modulus. Default is every 10. + + .PARAMETER ExactLength + Mask string values to the same length. So 'Tate' will be replaced with 4 random characters. + + .PARAMETER Force + Forcefully execute commands when needed + + .PARAMETER WhatIf + If this switch is enabled, no actions are performed but informational messages will be displayed that explain what would happen if the command were to run. + + .PARAMETER Confirm + If this switch is enabled, you will be prompted for confirmation before executing any operations that change state. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: DataMasking, Database + Author: Sander Stad (@sqlstad, sqlstad.nl) | Chrissy LeMaire (@cl, netnerds.net) + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Invoke-DbaDbDataMasking + + .EXAMPLE + Invoke-DbaDbDataMasking -SqlInstance SQLDB2 -Database DB1 -FilePath C:\Temp\sqldb1.db1.tables.json + + Apply the data masking configuration from the file "sqldb1.db1.tables.json" to the db1 database on sqldb2. Prompt for confirmation for each table. + + .EXAMPLE + Get-ChildItem -Path C:\Temp\sqldb1.db1.tables.json | Invoke-DbaDbDataMasking -SqlInstance SQLDB2 -Database DB1 -Confirm:$false + + Apply the data masking configuration from the file "sqldb1.db1.tables.json" to the db1 database on sqldb2. Do not prompt for confirmation. + + .EXAMPLE + New-DbaDbMaskingConfig -SqlInstance SQLDB1 -Database DB1 -Path C:\Temp\clone -OutVariable file + $file | Invoke-DbaDbDataMasking -SqlInstance SQLDB2 -Database DB1 -Confirm:$false + + Create the data masking configuration file "sqldb1.db1.tables.json", then use it to mask the db1 database on sqldb2. Do not prompt for confirmation. + + .EXAMPLE + Get-ChildItem -Path C:\Temp\sqldb1.db1.tables.json | Invoke-DbaDbDataMasking -SqlInstance SQLDB2, sqldb3 -Database DB1 -Confirm:$false + + See what would happen if you the data masking configuration from the file "sqldb1.db1.tables.json" to the db1 database on sqldb2 and sqldb3. Do not prompt for confirmation. + + #> + [CmdLetBinding(SupportsShouldProcess, ConfirmImpact = "High")] + param ( + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [string[]]$Database, + [parameter(Mandatory, ValueFromPipeline)] + [Alias('Path', 'FullName')] + [object]$FilePath, + [string]$Locale = 'en', + [string]$CharacterString = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', + [string[]]$Table, + [string[]]$Column, + [string[]]$ExcludeTable, + [string[]]$ExcludeColumn, + [string]$Query, + [int]$MaxValue, + [int]$ModulusFactor = 10, + [switch]$ExactLength, + [switch]$EnableException + ) + begin { + # Create the faker objects + Add-Type -Path (Resolve-Path -Path "$script:PSModuleRoot\bin\datamasking\Bogus.dll") + $faker = New-Object Bogus.Faker($Locale) + + $supportedDataTypes = 'bit', 'bool', 'char', 'date', 'datetime', 'datetime2', 'decimal', 'int', 'money', 'nchar', 'ntext', 'nvarchar', 'smalldatetime', 'text', 'time', 'uniqueidentifier', 'userdefineddatatype', 'varchar' + + $supportedFakerMaskingTypes = ($faker | Get-Member -MemberType Property | Select-Object Name -ExpandProperty Name) + + $supportedFakerSubTypes = ($faker | Get-Member -MemberType Property) | ForEach-Object { ($faker.$($_.Name)) | Get-Member -MemberType Method | Where-Object {$_.Name -notlike 'To*' -and $_.Name -notlike 'Get*' -and $_.Name -notlike 'Trim*' -and $_.Name -notin 'Add', 'Equals', 'CompareTo', 'Clone', 'Contains', 'CopyTo', 'EndsWith', 'IndexOf', 'IndexOfAny', 'Insert', 'IsNormalized', 'LastIndexOf', 'LastIndexOfAny', 'Normalize', 'PadLeft', 'PadRight', 'Remove', 'Replace', 'Split', 'StartsWith', 'Substring', 'Letter', 'Lines', 'Paragraph', 'Paragraphs', 'Sentence', 'Sentences'} | Select-Object name -ExpandProperty Name } + + $supportedFakerSubTypes += "Date" + } + + process { + if (Test-FunctionInterrupt) { + return + } + + if ($FilePath.ToString().StartsWith('http')) { + $tables = Invoke-RestMethod -Uri $FilePath + } else { + # Check if the destination is accessible + if (-not (Test-Path -Path $FilePath)) { + Stop-Function -Message "Could not find masking config file $FilePath" -Target $FilePath + return + } + + # Get all the items that should be processed + try { + $tables = Get-Content -Path $FilePath -ErrorAction Stop | ConvertFrom-Json -ErrorAction Stop + } catch { + Stop-Function -Message "Could not parse masking config file" -ErrorRecord $_ -Target $FilePath + return + } + } + + foreach ($tabletest in $tables.Tables) { + if ($Table -and $tabletest.Name -notin $Table) { + continue + } + foreach ($columntest in $tabletest.Columns) { + if ($columntest.ColumnType -in 'hierarchyid', 'geography', 'xml', 'geometry' -and $columntest.Name -notin $Column) { + Stop-Function -Message "$($columntest.ColumnType) is not supported, please remove the column $($columntest.Name) from the $($tabletest.Name) table" -Target $tables -Continue + } + } + } + + $dictionary = @{} + + foreach ($instance in $SqlInstance) { + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $sqlcredential -MinimumVersion 9 + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + if (-not $Database) { + $Database = $tables.Name + } + + foreach ($dbname in $Database) { + if ($server.VersionMajor -lt 9) { + Stop-Function -Message "SQL Server version must be 2005 or greater" -Continue + } + $db = $server.Databases[$($dbName)] + + $connstring = New-DbaConnectionString -SqlInstance $instance -SqlCredential $SqlCredential -Database $dbName + $sqlconn = New-Object System.Data.SqlClient.SqlConnection $connstring + $sqlconn.Open() + $stepcounter = $nullmod = 0 + + foreach ($tableobject in $tables.Tables) { + $uniqueValues = @() + $uniqueValueColumns = @() + + if ($tableobject.Name -in $ExcludeTable) { + Write-Message -Level Verbose -Message "Skipping $($tableobject.Name) because it is explicitly excluded" + continue + } + + if ($tableobject.Name -notin $db.Tables.Name) { + Stop-Function -Message "Table $($tableobject.Name) is not present in $db" -Target $db -Continue + } + + $dbTable = $db.Tables | Where-Object {$_.Schema -eq $tableobject.Schema -and $_.Name -eq $tableobject.Name} + + try { + if (-not (Test-Bound -ParameterName Query)) { + $columnString = "[" + (($dbTable.Columns | Where-Object DataType -in $supportedDataTypes | Select-Object Name -ExpandProperty Name) -join "],[") + "]" + $query = "SELECT $($columnString) FROM [$($tableobject.Schema)].[$($tableobject.Name)]" + } + $data = $db.Query($query) | ConvertTo-DbaDataTable + } catch { + Stop-Function -Message "Failure retrieving the data from table $($tableobject.Name)" -Target $Database -ErrorRecord $_ -Continue + } + + # Check if the table contains unique indexes + if ($tableobject.HasUniqueIndex) { + + # Loop through the rows and generate a unique value for each row + Write-Message -Level Verbose -Message "Generating unique values for $($tableobject.Name)" + + for ($i = 0; $i -lt $data.Rows.Count; $i++) { + $rowValue = New-Object PSCustomObject + + # Loop through each of the unique indexes + foreach ($index in ($db.Tables[$($tableobject.Name)].Indexes | Where-Object IsUnique -eq $true )) { + + # Loop through the index columns + foreach ($indexColumn in $index.IndexedColumns) { + # Get the column mask info + $columnMaskInfo = $tableobject.Columns | Where-Object Name -eq $indexColumn.Name + + if ($columnMaskInfo) { + # Generate a new value + $newValue = $faker.$($columnMaskInfo.MaskingType).$($columnMaskInfo.SubType)() + + # Check if the value is already present as a property + if (($rowValue | Get-Member -MemberType NoteProperty).Name -notcontains $indexColumn.Name) { + $rowValue | Add-Member -Name $indexColumn.Name -Type NoteProperty -Value $newValue + } + } + } + + # To be sure the values are unique, loop as long as long as needed to generate a unique value + while (($uniqueValues | Select-Object -Property ($rowValue | Get-Member -MemberType NoteProperty | Select-Object -ExpandProperty Name)) -match $rowValue) { + + $rowValue = New-Object PSCustomObject + + # Loop through the index columns + foreach ($indexColumn in $index.IndexedColumns) { + # Get the column mask info + $columnMaskInfo = $tableobject.Columns | Where-Object Name -eq $indexColumn.Name + + # Generate a new value + $newValue = $faker.$($columnMaskInfo.MaskingType).$($columnMaskInfo.SubType)() + + # Check if the value is already present as a property + if (($rowValue | Get-Member -MemberType NoteProperty).Name -notcontains $indexColumn.Name) { + $rowValue | Add-Member -Name $indexColumn.Name -Type NoteProperty -Value $newValue + $uniqueValueColumns += $indexColumn.Name + } + + } + } + + } + + # Add the row value to the array + $uniqueValues += $rowValue + + } + + } + + $uniqueValueColumns = $uniqueValueColumns | Select-Object -Unique + + $deterministicColumns = $tables.Tables.Columns | Where-Object Deterministic -eq $true + $tablecolumns = $tableobject.Columns + + if ($Column) { + $tablecolumns = $tablecolumns | Where-Object Name -in $Column + } + + if ($ExcludeColumn) { + if ([string]$uniqueIndex.Columns -match ($ExcludeColumn -join "|")) { + Stop-Function -Message "Column present in -ExcludeColumn cannot be excluded because it's part of an unique index" -Target $ExcludeColumn -Continue + } + + $tablecolumns = $tablecolumns | Where-Object Name -notin $ExcludeColumn + } + + if (-not $tablecolumns) { + Write-Message -Level Verbose "No columns to process in $($dbName).$($tableobject.Schema).$($tableobject.Name), moving on" + continue + } + + if ($Pscmdlet.ShouldProcess($instance, "Masking $($tablecolumns.Name -join ', ') in $($data.Rows.Count) rows in $($dbName).$($tableobject.Schema).$($tableobject.Name)")) { + + $transaction = $sqlconn.BeginTransaction() + $elapsed = [System.Diagnostics.Stopwatch]::StartNew() + Write-ProgressHelper -StepNumber ($stepcounter++) -TotalSteps $tables.Tables.Count -Activity "Masking data" -Message "Updating $($data.Rows.Count) rows in $($tableobject.Schema).$($tableobject.Name) in $($dbName) on $instance" + + # Loop through each of the rows and change them + $rowNumber = 0 + + foreach ($row in $data.Rows) { + $updates = $wheres = @() + $newValue = $null + + foreach ($columnobject in $tablecolumns) { + + if ($columnobject.ColumnType -notin $supportedDataTypes) { + Stop-Function -Message "Unsupported data type '$($columnobject.ColumnType)' for column $($columnobject.Name)" -Target $columnobject -Continue + } + + if ($columnobject.MaskingType -notin $supportedFakerMaskingTypes) { + Stop-Function -Message "Unsupported masking type '$($columnobject.MaskingType)' for column $($columnobject.Name)" -Target $columnobject -Continue + } + + if ($columnobject.SubType -notin $supportedFakerSubTypes) { + Stop-Function -Message "Unsupported masking sub type '$($columnobject.SubType)' for column $($columnobject.Name)" -Target $columnobject -Continue + } + + if ($columnobject.Nullable -and (($nullmod++) % $ModulusFactor -eq 0)) { + $newValue = $null + } elseif ($tableobject.HasUniqueIndex -and $columnobject.Name -in $uniqueValueColumns) { + + if ($uniqueValues.Count -lt 1) { + Stop-Function -Message "Could not find any unique values in dictionary" -Target $tableobject + return + } + + $newValue = $uniqueValues[$rowNumber].$($columnobject.Name) + + } else { + + # make sure max is good + if ($MaxValue) { + if ($columnobject.MaxValue -le $MaxValue) { + $max = $columnobject.MaxValue + } else { + $max = $MaxValue + } + } else { + $max = $columnobject.MaxValue + } + + if (-not $columnobject.MaxValue -and -not (Test-Bound -ParameterName MaxValue)) { + $max = 10 + } + + if ($columnobject.CharacterString) { + $charstring = $columnobject.CharacterString + } else { + $charstring = $CharacterString + } + + # make sure min is good + if ($columnobject.MinValue) { + $min = $columnobject.MinValue + } else { + if ($columnobject.CharacterString) { + $min = 1 + } else { + $min = 0 + } + } + + if (($columnobject.MinValue -or $columnobject.MaxValue) -and ($columnobject.ColumnType -match 'date')) { + $nowmin = $columnobject.MinValue + $nowmax = $columnobject.MaxValue + if (-not $nowmin) { + $nowmin = (Get-Date -Date $nowmax).AddDays(-365) + } + if (-not $nowmax) { + $nowmax = (Get-Date -Date $nowmin).AddDays(365) + } + } + + try { + $newValue = $null + + if ($columnobject.Deterministic -and ($row.$($columnobject.Name) -in $dictionary.Keys)) { + $newValue = $dictionary.$($row.$($columnobject.Name)) + } + + if (-not $newValue) { + $newValue = switch ($columnobject.ColumnType) { + { + $psitem -in 'bit', 'bool' + } { + $faker.System.Random.Bool() + } + { + $psitem -match 'date' + } { + if ($columnobject.MinValue -or $columnobject.MaxValue) { + ($faker.Date.Between($nowmin, $nowmax)).ToString("yyyyMMdd") + } else { + ($faker.Date.Past()).ToString("yyyyMMdd") + } + } + { + $psitem -match 'int' + } { + if ($columnobject.MinValue -or $columnobject.MaxValue) { + $faker.System.Random.Int($columnobject.MinValue, $columnobject.MaxValue) + } else { + $faker.System.Random.Int(0, $max) + } + } + 'money' { + if ($columnobject.MinValue -or $columnobject.MaxValue) { + $faker.Finance.Amount($columnobject.MinValue, $columnobject.MaxValue) + } else { + $faker.Finance.Amount(0, $max) + } + } + 'time' { + ($faker.Date.Past()).ToString("h:mm tt zzz") + } + 'uniqueidentifier' { + $faker.System.Random.Guid().Guid + } + 'userdefineddatatype' { + if ($columnobject.MaxValue -eq 1) { + $faker.System.Random.Bool() + } else { + $null + } + } + default { + $null + } + } + } + + if (-not $newValue) { + $newValue = switch ($columnobject.SubType.ToLower()) { + 'number' { + $faker.$($columnobject.MaskingType).$($columnobject.SubType)($columnobject.MaxValue) + } + { + $psitem -in 'bit', 'bool' + } { + $faker.System.Random.Bool() + } + { + $psitem -in 'date', 'datetime', 'datetime2', 'smalldatetime' + } { + if ($columnobject.MinValue -or $columnobject.MaxValue) { + ($faker.Date.Between($nowmin, $nowmax)).ToString("yyyyMMdd") + } else { + ($faker.Date.Past()).ToString("yyyyMMdd") + } + } + 'shuffle' { + ($row.($columnobject.Name) -split '' | Sort-Object { + Get-Random + }) -join '' + } + 'string' { + if ($max -eq -1) { + $max = 1024 + } + + if ($columnobject.SubType -eq "String" -and (Test-Bound -ParameterName ExactLength)) { + $max = ($row.$($columnobject.Name)).Length + } + + if ($columnobject.ColumnType -eq 'xml') { + $null + } else { + $faker.$($columnobject.MaskingType).String2($max, $charstring) + } + } + default { + $null + } + } + } + + if (-not $newValue) { + $newValue = switch ($columnobject.MaskingType.ToLower()) { + { + $psitem -in 'bit', 'bool' + } { + $faker.System.Random.Bool() + } + { + $psitem -in 'address', 'commerce', 'company', 'context', 'database', 'date', 'finance', 'hacker', 'hashids', 'image', 'internet', 'lorem', 'name', 'person', 'phone', 'random', 'rant', 'system' + } { + if ($columnobject.Format) { + $faker.$($columnobject.MaskingType).$($columnobject.SubType)("$($columnobject.Format)") + } else { + $faker.$($columnobject.MaskingType).$($columnobject.SubType)() + } + } + default { + if ($max -eq -1) { + $max = 1024 + } + if ((Test-Bound -ParameterName ExactLength)) { + $max = ($row.$($columnobject.Name)).ToString().Length + } + if ($max -eq 1) { + $faker.System.Random.Bool() + } else { + try { + if ($columnobject.Format) { + $faker.$($columnobject.MaskingType).$($columnobject.SubType)("$($columnobject.Format)") + } else { + $faker.$($columnobject.MaskingType).$($columnobject.SubType)() + } + } catch { + $faker.Random.String2($max, $charstring) + } + } + } + } + } + } catch { + Stop-Function -Message "Failure" -Target $faker -Continue -ErrorRecord $_ + } + } + + if ($columnobject.ColumnType -eq 'xml') { + # nothing, unsure how i'll handle this + } elseif ($columnobject.ColumnType -in 'uniqueidentifier') { + if ($null -eq $newValue -and $columnobject.Nullable) { + $updates += "[$($columnobject.Name)] = NULL" + } else { + $updates += "[$($columnobject.Name)] = '$newValue'" + } + } elseif ($columnobject.ColumnType -match 'int') { + if ($null -eq $newValue -and $columnobject.Nullable) { + $updates += "[$($columnobject.Name)] = NULL" + } else { + $updates += "[$($columnobject.Name)] = $newValue" + } + } elseif ($columnobject.ColumnType -in 'bit', 'bool') { + if ($null -eq $newValue -and $columnobject.Nullable) { + $updates += "[$($columnobject.Name)] = NULL" + } else { + if ($newValue) { + $updates += "[$($columnobject.Name)] = 1" + } else { + $updates += "[$($columnobject.Name)] = 0" + } + } + } else { + if ($null -eq $newValue -and $columnobject.Nullable) { + $updates += "[$($columnobject.Name)] = NULL" + } else { + $newValue = ($newValue).Tostring().Replace("'", "''") + $updates += "[$($columnobject.Name)] = '$newValue'" + } + } + + if ($columnobject.Deterministic -and ($row.$($columnobject.Name) -notin $dictionary.Keys)) { + $dictionary.Add($row.$($columnobject.Name), $newValue) + } + } + + $rowItems = $row | Get-Member -MemberType Properties | Select-Object Name -ExpandProperty Name + foreach ($item in $rowItems) { + $itemColumnType = $dbTable.Columns[$item].DataType.SqlDataType.ToString().ToLower() + + if (($row.$($item)).GetType().Name -match 'DBNull') { + $wheres += "[$item] IS NULL" + } elseif ($itemColumnType -in 'bit', 'bool') { + if ($row.$item) { + $wheres += "[$item] = 1" + } else { + $wheres += "[$item] = 0" + } + } elseif ($itemColumnType -like '*int*' -or $itemColumnType -in 'decimal') { + $oldValue = $row.$item + $wheres += "[$item] = $oldValue" + } elseif ($itemColumnType -in 'text', 'ntext') { + $oldValue = ($row.$item).Tostring().Replace("'", "''") + $wheres += "CAST([$item] AS VARCHAR(MAX)) = '$oldValue'" + } elseif ($itemColumnType -like 'datetime') { + $oldValue = ($row.$item).Tostring("yyyy-MM-dd HH:mm:ss.fff") + $wheres += "[$item] = '$oldValue'" + } elseif ($itemColumnType -like 'datetime2') { + $oldValue = ($row.$item).Tostring("yyyy-MM-dd HH:mm:ss.fffffff") + $wheres += "[$item] = '$oldValue'" + } elseif ($itemColumnType -like 'date') { + $oldValue = ($row.$item).Tostring("yyyy-MM-dd") + $wheres += "[$item] = '$oldValue'" + } elseif ($itemColumnType -like '*date*') { + $oldValue = ($row.$item).Tostring("yyyy-MM-dd HH:mm:ss") + $wheres += "[$item] = '$oldValue'" + } else { + $oldValue = ($row.$item).Tostring().Replace("'", "''") + $wheres += "[$item] = '$oldValue'" + } + } + + $updatequery = "UPDATE [$($tableobject.Schema)].[$($tableobject.Name)] SET $($updates -join ', ') WHERE $($wheres -join ' AND ')" + + try { + $sqlcmd = New-Object System.Data.SqlClient.SqlCommand($updatequery, $sqlconn, $transaction) + $null = $sqlcmd.ExecuteNonQuery() + } catch { + Write-Message -Level VeryVerbose -Message "$updatequery" + $errormessage = $_.Exception.Message.ToString() + Stop-Function -Message "Error updating $($tableobject.Schema).$($tableobject.Name): $errormessage" -Target $updatequery -Continue -ErrorRecord $_ + } + + # Increase the row number + $rowNumber++ + } + try { + $null = $transaction.Commit() + [pscustomobject]@{ + ComputerName = $db.Parent.ComputerName + InstanceName = $db.Parent.ServiceName + SqlInstance = $db.Parent.DomainInstanceName + Database = $dbName + Schema = $tableobject.Schema + Table = $tableobject.Name + Columns = $tableobject.Columns.Name + Rows = $($data.Rows.Count) + Elapsed = [prettytimespan]$elapsed.Elapsed + Status = "Masked" + } + } catch { + Stop-Function -Message "Error updating $($tableobject.Schema).$($tableobject.Name)" -Target $updatequery -Continue -ErrorRecord $_ + } + } + + # Empty the unique values array + $uniqueValues = $null + } + try { + $sqlconn.Close() + } catch { + Stop-Function -Message "Failure" -Continue -ErrorRecord $_ + } + } + } + } +} \ No newline at end of file diff --git a/functions/Invoke-DbaDbDbccCheckConstraint.ps1 b/functions/Invoke-DbaDbDbccCheckConstraint.ps1 new file mode 100644 index 0000000000..30f820b013 --- /dev/null +++ b/functions/Invoke-DbaDbDbccCheckConstraint.ps1 @@ -0,0 +1,213 @@ +function Invoke-DbaDbDbccCheckConstraint { + <# + .SYNOPSIS + Execution of Database Console Command DBCC CHECKCONSTRAINTS + + .DESCRIPTION + Executes the command DBCC CHECKCONSTRAINTS and returns results + + Reports and corrects pages and row count inaccuracies in the catalog views. + These inaccuracies may cause incorrect space usage reports returned by the sp_spaceused system stored procedure. + + Read more: + - https://docs.microsoft.com/en-us/sql/t-sql/database-console-commands/dbcc-checkconstraints-transact-sql + + .PARAMETER SqlInstance + The target SQL Server instance or instances. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Database + The database(s) to process - this list is auto-populated from the server. If unspecified, all databases will be processed. + + .PARAMETER Object + The table or constraint to be checked. + When table_name or table_id is specified, all enabled constraints on that table are checked. + When constraint_name or constraint_id is specified, only that constraint is checked. + If neither a table identifier nor a constraint identifier is specified, all enabled constraints on all tables in the current database are checked. + + .PARAMETER AllConstraints + Checks all enabled and disabled constraints on the table if the table name is specified or if all tables are checked; + Otherwise, checks only the enabled constraint. + Has no effect when a constraint is specified + + .PARAMETER AllErrorMessages + Returns all rows that violate constraints in the table that is checked. + The default is the first 200 rows. + + .PARAMETER NoInformationalMessages + Suppresses all informational messages. + + .PARAMETER WhatIf + Shows what would happen if the cmdlet runs. The cmdlet is not run. + + .PARAMETER Confirm + Prompts you for confirmation before running the cmdlet. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: DBCC + Author: Patrick Flynn (@sqllensman) + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Invoke-DbaDbDbccCheckConstraint + + .EXAMPLE + PS C:\> Invoke-DbaDbDbccCheckConstraint -SqlInstance SqlServer2017 + + Runs the command DBCC CHECKCONSTRAINTS to check all enabled constraints on all tables for all databases for the instance SqlServer2017. Connect using Windows Authentication + + .EXAMPLE + PS C:\> Invoke-DbaDbDbccCheckConstraint -SqlInstance SqlServer2017 -Database CurrentDB + + Connect to instance SqlServer2017 using Windows Authentication and run the command DBCC CHECKCONSTRAINTS to check all enabled constraints on all tables in the CurrentDB database. + + .EXAMPLE + PS C:\> Invoke-DbaDbDbccCheckConstraint -SqlInstance SqlServer2017 -Database CurrentDB -Object Sometable + + Connects to CurrentDB on instance SqlServer2017 using Windows Authentication and runs the command DBCC CHECKCONSTRAINTS(SometableId) to check all enabled constraints in the table. + + .EXAMPLE + PS C:\> Invoke-DbaDbDbccCheckConstraint -SqlInstance SqlServer2017 -Database CurrentDB -Object ConstraintId + + Connects to CurrentDB on instance SqlServer2017 using Windows Authentication and runs the command DBCC CHECKCONSTRAINTS(ConstraintId) to check the constraint with constraint_id = ConstraintId. + + .EXAMPLE + PS C:\> $cred = Get-Credential sqladmin + PS C:\> Invoke-DbaDbDbccCheckConstraint -SqlInstance SqlServer2017 -SqlCredential $cred -Database CurrentDB -Object TableId -AllConstraints -AllErrorMessages -NoInformationalMessages + + Connects to CurrentDB on instance SqlServer2017 using sqladmin credential and runs the command DBCC CHECKCONSTRAINTS(TableId) WITH ALL_CONSTRAINTS, ALL_ERRORMSGS, NO_INFOMSGS to check all enabled and disabled constraints on the table with able_id = TableId. Returns all rows that violate constraints. + + .EXAMPLE + PS C:\> 'Sql1','Sql2/sqlexpress' | Invoke-DbaDbDbccCheckConstraint -WhatIf + + Displays what will happen if command DBCC CHECKCONSTRAINTS is called against all databses on Sql1 and Sql2/sqlexpress + + #> + [CmdletBinding(SupportsShouldProcess, ConfirmImpact = 'Low')] + param ( + [parameter(Mandatory, ValueFromPipeline)] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [string[]]$Database, + [string]$Object, + [switch]$AllConstraints, + [switch]$AllErrorMessages, + [switch]$NoInformationalMessages, + [switch]$EnableException + ) + begin { + $withCount = 0 + $stringBuilder = New-Object System.Text.StringBuilder + $null = $stringBuilder.Append("DBCC CHECKCONSTRAINTS(#options#)") + if (Test-Bound -ParameterName AllConstraints) { + $null = $stringBuilder.Append(" WITH ALL_CONSTRAINTS") + $withCount++ + } + if (Test-Bound -ParameterName AllErrorMessages) { + if ($withCount -eq 0) { + $null = $stringBuilder.Append(" WITH ALL_ERRORMSGS") + } else { + $null = $stringBuilder.Append(", ALL_ERRORMSGS") + } + $withCount++ + } + if (Test-Bound -ParameterName NoInformationalMessages) { + if ($withCount -eq 0) { + $null = $stringBuilder.Append(" WITH NO_INFOMSGS") + } else { + $null = $stringBuilder.Append(", NO_INFOMSGS") + } + } + + } + process { + foreach ($instance in $SqlInstance) { + Write-Message -Message "Attempting Connection to $instance" -Level Verbose + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + $dbs = $server.Databases + + if ($Database) { + $dbs = $dbs | Where-Object Name -In $Database + } + + foreach ($db in $dbs) { + Write-Message -Level Verbose -Message "Processing $db on $instance" + + if ($db.IsAccessible -eq $false) { + Stop-Function -Message "The database $db is not accessible. Skipping." -Continue + } + + try { + $query = $StringBuilder.ToString() + if (Test-Bound -ParameterName Object) { + if ($object -match '^\d+$') { + $query = $query.Replace('#options#', "$Object") + } else { + $query = $query.Replace('#options#', "'$Object'") + } + } else { + $query = $query.Replace('(#options#)', "") + } + + if ($Pscmdlet.ShouldProcess($server.Name, "Execute the command $query against $instance")) { + Write-Message -Message "Query to run: $query" -Level Verbose + $results = $server | Invoke-DbaQuery -Query $query -Database $db.Name -MessagesToOutput + } + } catch { + Stop-Function -Message "Error capturing data on $db" -Target $instance -ErrorRecord $_ -Exception $_.Exception -Continue + } + + if ($Pscmdlet.ShouldProcess("console", "Outputting object")) { + $output = $null + if (($null -eq $results) -or ($results.GetType().Name -eq 'String') ) { + [PSCustomObject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + Database = $db.Name + Cmd = $query.ToString() + Output = $results + Table = $null + Constraint = $null + Where = $null + } + } elseif (($results.GetType().Name -eq 'Object[]') -or ($results.GetType().Name -eq 'DataRow')) { + foreach ($row in $results) { + if ($row.GetType().Name -eq 'String') { + $output = $row.ToString() + } else { + [PSCustomObject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + Database = $db.Name + Cmd = $query.ToString() + Output = $output + Table = $row[0] + Constraint = $row[1] + Where = $row[2] + + } + } + } + } + } + } + } + } +} \ No newline at end of file diff --git a/functions/Invoke-DbaDbDbccCleanTable.ps1 b/functions/Invoke-DbaDbDbccCleanTable.ps1 new file mode 100644 index 0000000000..ca4a94b4a5 --- /dev/null +++ b/functions/Invoke-DbaDbDbccCleanTable.ps1 @@ -0,0 +1,161 @@ +function Invoke-DbaDbDbccCleanTable { + <# + .SYNOPSIS + Execution of Database Console Command DBCC CLEANTABLE + + .DESCRIPTION + Executes the command DBCC CLEANTABLE against defined objects and returns results + + Reclaims space from dropped variable-length columns in tables or indexed views + + Read more: + - https://docs.microsoft.com/en-us/sql/t-sql/database-console-commands/dbcc-cleantable-transact-sql + + .PARAMETER SqlInstance + The target SQL Server instance or instances. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Database + The database(s) to process. If unspecified, all databases will be processed. + + .PARAMETER Object + The table(s) or indexed view(s) to be cleaned. + + .PARAMETER BatchSize + Is the number of rows processed per transaction. + If not specified, or if 0 is specified, the statement processes the whole table in one transaction. + + .PARAMETER NoInformationalMessages + Suppresses all informational messages. + + .PARAMETER WhatIf + Shows what would happen if the cmdlet runs. The cmdlet is not run. + + .PARAMETER Confirm + Prompts you for confirmation before running the cmdlet. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: DBCC + Author: Patrick Flynn (@sqllensman) + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Invoke-DbaDbDbccCleanTable + + .EXAMPLE + PS C:\> Invoke-DbaDbDbccCleanTable -SqlInstance SqlServer2017 -Database CurrentDB -Object 'dbo.SomeTable' + + Connects to CurrentDB on instance SqlServer2017 using Windows Authentication and runs the command DBCC CLEANTABLE('CurrentDB', 'dbo.SomeTable') to reclaim space after variable-length columns have been dropped. + + .EXAMPLE + PS C:\> Invoke-DbaDbDbccCleanTable -SqlInstance SqlServer2017 -Database CurrentDB -Object 34636372 -BatchSize 5000 + + Connects to CurrentDB on instance SqlServer2017 using Windows Authentication and runs the command DBCC CLEANTABLE('CurrentDB', 34636372, 5000) to reclaim space from table with Table_Id = 34636372 after variable-length columns have been dropped. + + .EXAMPLE + PS C:\> $cred = Get-Credential sqladmin + PS C:\> Invoke-DbaDbDbccCleanTable -SqlInstance SqlServer2017 -SqlCredential $cred -Database CurrentDB -Object 'dbo.SomeTable' -NoInformationalMessages + + Connects to CurrentDB on instance SqlServer2017 using sqladmin credential and runs the command DBCC CLEANTABLE('CurrentDB', 'dbo.SomeTable') WITH NO_INFOMSGS to reclaim space after variable-length columns have been dropped. + + .EXAMPLE + PS C:\> 'Sql1','Sql2/sqlexpress' | Invoke-DbaDbDbccCleanTable -Object 'dbo.SomeTable' -BatchSize 5000 + + Runs the command DBCC CLEANTABLE('DatabaseName', 'dbo.SomeTable', 5000) against all databses on Sql1 and Sql2/sqlexpress + + #> + [CmdletBinding(SupportsShouldProcess, ConfirmImpact = 'High')] + param ( + [parameter(Mandatory, ValueFromPipeline)] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [string[]]$Database, + [string[]]$Object, + [int]$BatchSize, + [switch]$NoInformationalMessages, + [switch]$EnableException + ) + begin { + $stringBuilder = New-Object System.Text.StringBuilder + $null = $stringBuilder.Append("DBCC CLEANTABLE(#options#)") + if (Test-Bound -ParameterName NoInformationalMessages) { + $null = $stringBuilder.Append(" WITH NO_INFOMSGS") + } + } + process { + if (Test-Bound -Not -ParameterName Object) { + Stop-Function -Message "You must specify a table or indexed view to execute against using -Object" + return + } + foreach ($instance in $SqlInstance) { + Write-Message -Message "Attempting Connection to $instance" -Level Verbose + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + $dbs = $server.Databases + + if ($Database) { + $dbs = $dbs | Where-Object Name -In $Database + } + + foreach ($db in $dbs) { + Write-Message -Level Verbose -Message "Processing $db on $instance" + + if ($db.IsAccessible -eq $false) { + Stop-Function -Message "The database $db is not accessible. Skipping." -Continue + } + + foreach ($obj in $Object) { + try { + $query = $StringBuilder.ToString() + $options = New-Object System.Text.StringBuilder + if ($obj -match '^\d+$') { + $null = $options.Append("'$($db.Name)', $($obj)") + } else { + $null = $options.Append("'$($db.Name)', '$($obj)'") + } + if (Test-Bound -ParameterName BatchSize) { + $null = $options.Append(", $($BatchSize)") + } + + $query = $query.Replace('#options#', "$($options.ToString())") + Write-Message -Message "Query to run: $query" -Level Verbose + + if ($Pscmdlet.ShouldProcess($server.Name, "Execute the command $query against $instance")) { + Write-Message -Message "Query to run: $query" -Level Verbose + $results = $server | Invoke-DbaQuery -Query $query -Database $db.Name -MessagesToOutput + } + } catch { + Stop-Function -Message "Error running $query against $db" -Target $instance -ErrorRecord $_ -Exception $_.Exception -Continue + } + if ($Pscmdlet.ShouldProcess("console", "Outputting object")) { + if (($null -eq $results) -or ($results.GetType().Name -eq 'String') ) { + [PSCustomObject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + Database = $db.Name + Object = $obj + Cmd = $query.ToString() + Output = $results + } + } + } + } + } + } + } +} \ No newline at end of file diff --git a/functions/Invoke-DbaDbDbccUpdateUsage.ps1 b/functions/Invoke-DbaDbDbccUpdateUsage.ps1 new file mode 100644 index 0000000000..9baa5091bc --- /dev/null +++ b/functions/Invoke-DbaDbDbccUpdateUsage.ps1 @@ -0,0 +1,195 @@ +function Invoke-DbaDbDbccUpdateUsage { + <# + .SYNOPSIS + Execution of Database Console Command DBCC UPDATEUSAGE + + .DESCRIPTION + Executes the command DBCC UPDATEUSAGE and returns results + + Reports and corrects pages and row count inaccuracies in the catalog views. + These inaccuracies may cause incorrect space usage reports returned by the sp_spaceused system stored procedure. + + Read more: + - https://docs.microsoft.com/en-us/sql/t-sql/database-console-commands/dbcc-updateusage-transact-sql + + .PARAMETER SqlInstance + The target SQL Server instance or instances. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Database + The database(s) to process. If unspecified, all databases will be processed. + The Name or Id of a database can be specified + Database names must comply with the rules for identifiers. + + .PARAMETER Table + The table or indexed view to process. + Table and view names must comply with the rules for identifiers + The Id of Table or View can be specified + If not specified, all tables or indexed views will be processed + + .PARAMETER Index + The Index to process. + The Id of Index can be specified + If not specified, all indexes for the specified table or view will be processed. + + .PARAMETER NoInformationalMessages + Suppresses all informational messages. + + .PARAMETER CountRows + Specifies that the row count column is updated with the current count of the number of rows in the table or view. + + .PARAMETER WhatIf + Shows what would happen if the cmdlet runs. The cmdlet is not run. + + .PARAMETER Confirm + Prompts you for confirmation before running the cmdlet. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: DBCC + Author: Patrick Flynn (@sqllensman) + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Invoke-DbaDbDbccUpdateUsage + + .EXAMPLE + PS C:\> Invoke-DbaDbDbccUpdateUsage -SqlInstance SqlServer2017 + + Runs the command DBCC UPDATEUSAGE to update the page or row counts or both for all objects in all databases for the instance SqlServer2017. Connect using Windows Authentication + + .EXAMPLE + PS C:\> Invoke-DbaDbDbccUpdateUsage -SqlInstance SqlServer2017 -Database CurrentDB + + Runs the command DBCC UPDATEUSAGE to update the page or row counts or both for all objects in the CurrentDB database for the instance SqlServer2017. Connect using Windows Authentication + + .EXAMPLE + PS C:\> Invoke-DbaDbDbccUpdateUsage -SqlInstance SqlServer2017 -Database CurrentDB -Table Sometable + + Connects to CurrentDB on instance SqlServer2017 using Windows Authentication and runs the command DBCC UPDATEUSAGE(SometableId) to update the page or row counts for all indexes in the table. + + .EXAMPLE + PS C:\> $cred = Get-Credential sqladmin + PS C:\> Invoke-DbaDbDbccUpdateUsage -SqlInstance SqlServer2017 -SqlCredential $cred -Database CurrentDB -Table 'SometableId -Index IndexName -NoInformationalMessages -CountRows + + Connects to CurrentDB on instance SqlServer2017 using sqladmin credential and runs the command DBCC UPDATEUSAGE(SometableId, IndexName) WITH NO_INFOMSGS, COUNT_ROWS to update the page or row counts. + + .EXAMPLE + PS C:\> 'Sql1','Sql2/sqlexpress' | Invoke-DbaDbDbccUpdateUsage -WhatIf + + Displays what will happen if command DBCC UPDATEUSAGE is called against all databses on Sql1 and Sql2/sqlexpress + + #> + [CmdletBinding(SupportsShouldProcess, ConfirmImpact = 'High')] + param ( + [parameter(Mandatory, ValueFromPipeline)] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [string[]]$Database, + [string]$Table, + [string]$Index, + [switch]$NoInformationalMessages, + [switch]$CountRows, + [switch]$EnableException + ) + begin { + + $stringBuilder = New-Object System.Text.StringBuilder + $null = $stringBuilder.Append("DBCC UPDATEUSAGE(#options#)") + if (Test-Bound -ParameterName NoInformationalMessages) { + $null = $stringBuilder.Append(" WITH NO_INFOMSGS") + if (Test-Bound -ParameterName CountRows) { + $null = $stringBuilder.Append(", COUNT_ROWS") + } + } else { + if (Test-Bound -ParameterName CountRows) { + $null = $stringBuilder.Append(" WITH COUNT_ROWS") + } + } + Write-Message -Message "$($StringBuilder.ToString())" -Level Verbose + + } + process { + foreach ($instance in $SqlInstance) { + Write-Message -Message "Attempting Connection to $instance" -Level Verbose + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + $dbs = $server.Databases + + if (Test-Bound -ParameterName Database) { + $dbs = $dbs | Where-Object {($_.Name -In $Database) -or ($_.ID -In $Database) } + } + + foreach ($db in $dbs) { + Write-Message -Level Verbose -Message "Processing $db on $instance" + + if ($db.IsAccessible -eq $false) { + Stop-Function -Message "The database $db is not accessible. Skipping." -Continue + } + + try { + $query = $StringBuilder.ToString() + if (Test-Bound -ParameterName Table) { + if (Test-Bound -ParameterName Index) { + if ($Table -match '^\d+$') { + if ($Index -match '^\d+$') { + $query = $query.Replace('#options#', "'$($db.name)', $Table, $Index") + } else { + $query = $query.Replace('#options#', "'$($db.name)', $Table, '$Index'") + } + } else { + if ($Index -match '^\d+$') { + $query = $query.Replace('#options#', "'$($db.name)', '$Table', $Index") + } else { + $query = $query.Replace('#options#', "'$($db.name)', '$Table', '$Index'") + } + } + } else { + if ($Table -match '^\d+$') { + $query = $query.Replace('#options#', "'$($db.name)', $Table") + } else { + $query = $query.Replace('#options#', "'$($db.name)', '$Table'") + } + } + } else { + $query = $query.Replace('#options#', "'$($db.name)'") + } + + if ($Pscmdlet.ShouldProcess($server.Name, "Execute the command $query against $instance")) { + Write-Message -Message "Query to run: $query" -Level Verbose + $results = $server | Invoke-DbaQuery -Query $query -MessagesToOutput + Write-Message -Message "$($results.Count)" -Level Verbose + } + } catch { + Stop-Function -Message "Error capturing data on $db" -Target $instance -ErrorRecord $_ -Exception $_.Exception -Continue + } + + foreach ($row in $results) { + if ($Pscmdlet.ShouldProcess("console", "Outputting object")) { + [PSCustomObject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + Database = $db.name + Cmd = $query.ToString() + Output = $results + } + } + } + } + } + } +} \ No newline at end of file diff --git a/functions/Invoke-DbaDbLogShipping.ps1 b/functions/Invoke-DbaDbLogShipping.ps1 index b71cf7acfe..886ae99915 100644 --- a/functions/Invoke-DbaDbLogShipping.ps1 +++ b/functions/Invoke-DbaDbLogShipping.ps1 @@ -1165,7 +1165,7 @@ function Invoke-DbaDbLogShipping { # Check if the backup job name is set if ($BackupJob) { - $DatabaseBackupJob = "$BackupJob_$($db.Name)" + $DatabaseBackupJob = "$($BackupJob)$($db.Name)" } else { $DatabaseBackupJob = "LSBackup_$($db.Name)" } @@ -1173,7 +1173,7 @@ function Invoke-DbaDbLogShipping { # Check if the backup job schedule name is set if ($BackupSchedule) { - $DatabaseBackupSchedule = "$BackupSchedule_$($db.Name)" + $DatabaseBackupSchedule = "$($BackupSchedule)$($db.Name)" } else { $DatabaseBackupSchedule = "LSBackupSchedule_$($db.Name)" } @@ -1187,11 +1187,11 @@ function Invoke-DbaDbLogShipping { Stop-Function -Message "Secondary database already exists on instance $destInstance." -ErrorRecord $_ -Target $destInstance -Continue } - # Check if the secondary database needs tobe initialized + # Check if the secondary database needs to be initialized if ($setupResult -ne 'Failed') { if (-not $NoInitialization) { # Check if the secondary database exists on the secondary instance - if ($DestiationServer.Databases.Name -notcontains $SecondaryDatabase) { + if ($DestinationServer.Databases.Name -notcontains $SecondaryDatabase) { # Check if force is being used and no option to generate the full backup is set if ($Force -and -not ($GenerateFullBackup -or $UseExistingFullBackup)) { # Set the option to generate a full backup @@ -1355,17 +1355,17 @@ function Invoke-DbaDbLogShipping { # Check if the copy job name is set if ($CopyJob) { - $DatabaseCopyJob = "$CopyJob_$SourceServerName_$($db.Name)" + $DatabaseCopyJob = "$($CopyJob)$($db.Name))" } else { - $DatabaseCopyJob = "LSCopy_$SourceServerName_$($db.Name)" + $DatabaseCopyJob = "LSCopy_$($SourceServerName)_$($db.Name)" } Write-Message -Message "Copy job name set to $DatabaseCopyJob" -Level Verbose # Check if the copy job schedule name is set if ($CopySchedule) { - $DatabaseCopySchedule = "$CopySchedule_$($db.Name)" + $DatabaseCopySchedule = "$($CopySchedule)$($db.Name)" } else { - $DatabaseCopySchedule = "LSCopySchedule_$($db.Name)" + $DatabaseCopySchedule = "LSCopySchedule_$($SourceServerName)_$($db.Name)" Write-Message -Message "Copy job schedule name set to $DatabaseCopySchedule" -Level Verbose } @@ -1390,17 +1390,17 @@ function Invoke-DbaDbLogShipping { # Check if the restore job name is set if ($RestoreJob) { - $DatabaseRestoreJob = "$RestoreJob_$SourceServerName_$($db.Name)" + $DatabaseRestoreJob = "$($RestoreJob)$($db.Name)" } else { - $DatabaseRestoreJob = "LSRestore_$DestinationServerName_$($db.Name)" + $DatabaseRestoreJob = "LSRestore_$($SourceServerName)_$($db.Name)" } Write-Message -Message "Restore job name set to $DatabaseRestoreJob" -Level Verbose # Check if the restore job schedule name is set if ($RestoreSchedule) { - $DatabaseRestoreSchedule = "$RestoreSchedule_$($db.Name)" + $DatabaseRestoreSchedule = "$($RestoreSchedule)$($db.Name)" } else { - $DatabaseRestoreSchedule = "LSRestoreSchedule_$($db.Name)" + $DatabaseRestoreSchedule = "LSRestoreSchedule_$($SourceServerName)_$($db.Name)" } Write-Message -Message "Restore job schedule name set to $DatabaseRestoreSchedule" -Level Verbose @@ -1709,7 +1709,10 @@ function Invoke-DbaDbLogShipping { -DisconnectUsers:$DisconnectUsers ` -RestoreThreshold $RestoreThreshold ` -ThresholdAlertEnabled:$SecondaryThresholdAlertEnabled ` - -HistoryRetention $HistoryRetention + -HistoryRetention $HistoryRetention ` + -MonitorServer $PrimaryMonitorServer ` + -MonitorServerSecurityMode $PrimaryMonitorServerSecurityMode ` + -MonitorCredential $PrimaryMonitorCredential # Check if the copy job needs to be enabled or disabled if ($CopyScheduleDisabled) { diff --git a/functions/Invoke-DbaDbMirroring.ps1 b/functions/Invoke-DbaDbMirroring.ps1 index 0ee741feea..bdb14275cd 100644 --- a/functions/Invoke-DbaDbMirroring.ps1 +++ b/functions/Invoke-DbaDbMirroring.ps1 @@ -88,7 +88,7 @@ function Invoke-DbaDbMirroring { >> SharedPath = '\\nas\sql\share' >> } >> - PS C:\> Invoke-DbaDbMirror @params + PS C:\> Invoke-DbaDbMirroring @params Performs a bunch of checks to ensure the pubs database on sql2017a can be mirrored from sql2017a to sql2017b. Logs in to sql2019 and sql2017a @@ -109,7 +109,7 @@ function Invoke-DbaDbMirroring { >> Confirm = $false >> } >> - PS C:\> Invoke-DbaDbMirror @params + PS C:\> Invoke-DbaDbMirroring @params Performs a bunch of checks to ensure the pubs database on sql2017a can be mirrored from sql2017a to sql2017b. Logs in to sql2019 and sql2017a diff --git a/functions/Invoke-DbaDbShrink.ps1 b/functions/Invoke-DbaDbShrink.ps1 index 60b9a4d6d6..9a7b14c8c1 100644 --- a/functions/Invoke-DbaDbShrink.ps1 +++ b/functions/Invoke-DbaDbShrink.ps1 @@ -118,7 +118,7 @@ function Invoke-DbaDbShrink { .EXAMPLE PS C:\> Invoke-DbaDbShrink -SqlInstance sql2012 -AllUserDatabases - Shrinks all databases on SQL2012 (not ideal for production) + Shrinks all user databases on SQL2012 (not ideal for production) #> [CmdletBinding(SupportsShouldProcess, ConfirmImpact = 'Low')] @@ -157,13 +157,13 @@ function Invoke-DbaDbShrink { return } - if ((Test-Bound -ParameterName StepSize) -and $stepsize -lt 1024) { + if ((Test-Bound -ParameterName StepSize) -and $StepSize -lt 1024) { Stop-Function -Message "StepSize is measured in bits. Did you mean $StepSize bits? If so, please use 1024 or above. If not, then use the PowerShell bit notation like $($StepSize)MB or $($StepSize)GB" return } - if ($stepsize) { - $StepSizeKB = ([dbasize]($StepSize)).Kilobyte + if ($StepSize) { + $stepSizeKB = ([dbasize]($StepSize)).Kilobyte } $StatementTimeoutSeconds = $StatementTimeout * 60 @@ -190,6 +190,10 @@ function Invoke-DbaDbShrink { $dbs = $server.Databases | Where-Object {$_.IsAccessible} + if ($AllUserDatabases) { + $dbs = $dbs | Where-Object { $_.IsSystemObject -eq $false } + } + if ($Database) { $dbs = $dbs | Where-Object Name -In $Database } @@ -248,12 +252,12 @@ function Invoke-DbaDbShrink { $shrinkGap = ($startingSize - $desiredFileSize) Write-Message -Level Verbose -Message "ShrinkGap: $([int]$shrinkGap) KB" - Write-Message -Level Verbose -Message "Step Size: $(([dbasize]$StepSize).Megabyte) MB" + Write-Message -Level Verbose -Message "Step Size: $($stepSizeKB) KB" - if ($StepSizeKB -and ($shrinkGap -gt $stepSizeKB)) { + if ($stepSizeKB -and ($shrinkGap -ge $stepSizeKB)) { for ($i = 1; $i -le [int](($shrinkGap) / $stepSizeKB); $i++) { - Write-Message -Level Verbose -Message "Step: $i" - $shrinkSize = $startingSize - (($StepSizeKB * 1024 * 1024) * $i) + Write-Message -Level Verbose -Message "Step: $i / $([int](($shrinkGap) / $stepSizeKB))" + $shrinkSize = $startingSize - ($stepSizeKB * $i) if ($shrinkSize -lt $desiredFileSize) { $shrinkSize = $desiredFileSize } diff --git a/functions/Invoke-DbaDbUpgrade.ps1 b/functions/Invoke-DbaDbUpgrade.ps1 index 8287fad7eb..01e5d391e3 100644 --- a/functions/Invoke-DbaDbUpgrade.ps1 +++ b/functions/Invoke-DbaDbUpgrade.ps1 @@ -134,10 +134,10 @@ function Invoke-DbaDbUpgrade { $InputObject = $InputObject | Where-Object { $_.IsSystemObject -eq $false } if ($Database) { - $InputObject = $InputObject | Where-Object { $_.Name -contains $Database } + $InputObject = $InputObject | Where-Object Name -In $Database } if ($ExcludeDatabase) { - $InputObject = $InputObject | Where-Object { $_.Name -notcontains $ExcludeDatabase } + $InputObject = $InputObject | Where-Object Name -NotIn $ExcludeDatabase } foreach ($db in $InputObject) { diff --git a/functions/Invoke-DbaDbccDropCleanBuffer.ps1 b/functions/Invoke-DbaDbccDropCleanBuffer.ps1 new file mode 100644 index 0000000000..02f9e58ecf --- /dev/null +++ b/functions/Invoke-DbaDbccDropCleanBuffer.ps1 @@ -0,0 +1,113 @@ +function Invoke-DbaDbccDropCleanBuffer { + <# + .SYNOPSIS + Execution of Database Console Command DBCC DROPCLEANBUFFERS + + .DESCRIPTION + Allows execution of Database Console Command DBCC DROPCLEANBUFFERS + + Removes all clean buffers from the buffer pool, and columnstore objects from the columnstore object pool. + + Read more: + - https://docs.microsoft.com/en-us/sql/t-sql/database-console-commands/dbcc-dropcleanbuffers-transact-sql + + .PARAMETER SqlInstance + The target SQL Server instance or instances. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER NoInformationalMessages + Suppresses all informational messages. + + .PARAMETER WhatIf + Shows what would happen if the cmdlet runs. The cmdlet is not run. + + .PARAMETER Confirm + Prompts you for confirmation before running the cmdlet. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: DBCC + Author: Patrick Flynn (@sqllensman) + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Invoke-DbaDbccDropCleanBuffer + + .EXAMPLE + PS C:\> Invoke-DbaDbccDropCleanBuffer -SqlInstance SqlServer2017 + + Runs the command DBCC DROPCLEANBUFFERS against the instance SqlServer2017 using Windows Authentication + + .EXAMPLE + PS C:\> Invoke-DbaDbccDropCleanBuffer -SqlInstance SqlServer2017 -NoInformationalMessages + + Runs the command DBCC DROPCLEANBUFFERS WITH NO_INFOMSGS against the instance SqlServer2017 using Windows Authentication + + .EXAMPLE + PS C:\> 'Sql1','Sql2/sqlexpress' | Invoke-DbaDbccDropCleanBuffer -WhatIf + + Displays what will happen if command DBCC DROPCLEANBUFFERS is called against Sql1 and Sql2/sqlexpress + + .EXAMPLE + PS C:\> $cred = Get-Credential sqladmin + PS C:\> Invoke-DbaDbccDropCleanBuffer -SqlInstance Server1 -SqlCredential $cred + + Connects using sqladmin credential and executes command DBCC DROPCLEANBUFFERS for instance Server1 + + #> + [CmdletBinding(SupportsShouldProcess, ConfirmImpact = 'High')] + param ( + [parameter(Mandatory, ValueFromPipeline)] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [switch]$NoInformationalMessages, + [switch]$EnableException + ) + begin { + + $stringBuilder = New-Object System.Text.StringBuilder + $null = $stringBuilder.Append("DBCC DROPCLEANBUFFERS") + if (Test-Bound -ParameterName NoInformationalMessages) { + $null = $stringBuilder.Append(" WITH NO_INFOMSGS") + } + } + process { + $query = $StringBuilder.ToString() + + foreach ($instance in $SqlInstance) { + Write-Message -Message "Attempting Connection to $instance" -Level Verbose + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + try { + if ($Pscmdlet.ShouldProcess($server.Name, "Execute the command $query against $instance")) { + Write-Message -Message "Query to run: $query" -Level Verbose + $results = $server | Invoke-DbaQuery -Query $query -MessagesToOutput + } + } catch { + Stop-Function -Message "Failure running DBCC DROPCLEANBUFFERS" -ErrorRecord $_ -Target $server -Continue + } + If ($Pscmdlet.ShouldProcess("console", "Outputting object")) { + [PSCustomObject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + Cmd = $query.ToString() + Output = $results + } + } + } + } +} \ No newline at end of file diff --git a/functions/Invoke-DbaDbccFreeCache.ps1 b/functions/Invoke-DbaDbccFreeCache.ps1 index 78e862215f..8236eb3982 100644 --- a/functions/Invoke-DbaDbccFreeCache.ps1 +++ b/functions/Invoke-DbaDbccFreeCache.ps1 @@ -183,7 +183,7 @@ function Invoke-DbaDbccFreeCache { } catch { Stop-Function -Message "Failure" -ErrorRecord $_ -Target $server -Continue } - If ($Pscmdlet.ShouldProcess("console", "Outputting object")) { + if ($Pscmdlet.ShouldProcess("console", "Outputting object")) { [PSCustomObject]@{ ComputerName = $server.ComputerName InstanceName = $server.ServiceName diff --git a/functions/Invoke-DbaDiagnosticQuery.ps1 b/functions/Invoke-DbaDiagnosticQuery.ps1 index 90ef2296d7..a8264875d8 100644 --- a/functions/Invoke-DbaDiagnosticQuery.ps1 +++ b/functions/Invoke-DbaDiagnosticQuery.ps1 @@ -93,27 +93,27 @@ function Invoke-DbaDiagnosticQuery { Then it will export the results to Export-DbaDiagnosticQuery. .EXAMPLE - PS C:\> Invoke-DbaDiagnosticQuery -sqlinstance localhost -ExportQueries -outputpath "C:\temp\DiagnosticQueries" + PS C:\> Invoke-DbaDiagnosticQuery -SqlInstance localhost -ExportQueries -OutputPath "C:\temp\DiagnosticQueries" Export All Queries to Disk .EXAMPLE - PS C:\> Invoke-DbaDiagnosticQuery -sqlinstance localhost -DatabaseSpecific -DatabaseName 'tempdb' -ExportQueries -outputpath "C:\temp\DiagnosticQueries" + PS C:\> Invoke-DbaDiagnosticQuery -SqlInstance localhost -DatabaseSpecific -ExportQueries -OutputPath "C:\temp\DiagnosticQueries" Export Database Specific Queries for all User Dbs .EXAMPLE - PS C:\> Invoke-DbaDiagnosticQuery -sqlinstance localhost -DatabaseSpecific -DatabaseName 'tempdb' -ExportQueries -outputpath "C:\temp\DiagnosticQueries" + PS C:\> Invoke-DbaDiagnosticQuery -SqlInstance localhost -DatabaseSpecific -DatabaseName 'tempdb' -ExportQueries -OutputPath "C:\temp\DiagnosticQueries" Export Database Specific Queries For One Target Database .EXAMPLE - PS C:\> Invoke-DbaDiagnosticQuery -sqlinstance localhost -DatabaseSpecific -DatabaseName 'tempdb' -ExportQueries -outputpath "C:\temp\DiagnosticQueries" -queryname 'Database-scoped Configurations' + PS C:\> Invoke-DbaDiagnosticQuery -SqlInstance localhost -DatabaseSpecific -DatabaseName 'tempdb' -ExportQueries -OutputPath "C:\temp\DiagnosticQueries" -queryname 'Database-scoped Configurations' Export Database Specific Queries For One Target Database and One Specific Query .EXAMPLE - PS C:\> Invoke-DbaDiagnosticQuery -sqlinstance localhost -UseSelectionHelper + PS C:\> Invoke-DbaDiagnosticQuery -SqlInstance localhost -UseSelectionHelper Choose Queries To Export diff --git a/functions/Invoke-DbaQuery.ps1 b/functions/Invoke-DbaQuery.ps1 index 349a5b493e..ece2153dca 100644 --- a/functions/Invoke-DbaQuery.ps1 +++ b/functions/Invoke-DbaQuery.ps1 @@ -55,6 +55,9 @@ function Invoke-DbaQuery { This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + .PARAMETER ReadOnly + Execute the query with ReadOnly application intent. + .NOTES Tags: Database, Query Author: Friedrich Weinmann (@FredWeinmann) @@ -86,6 +89,18 @@ function Invoke-DbaQuery { Runs the sql commands stored in rebuild.sql against all accessible databases of the instances "server1", "server1\nordwind" and "server2" + .EXAMPLE + PS C:\> Invoke-DbaQuery -SqlInstance . -Query 'SELECT * FROM users WHERE Givenname = @name' -SqlParameters @{ Name = "Maria" } + + Executes a simple query against the users table using SQL Parameters. + This avoids accidental SQL Injection and is the safest way to execute queries with dynamic content. + Keep in mind the limitations inherent in parameters - it is quite impossible to use them for content references. + While it is possible to parameterize a where condition, it is impossible to use this to select which columns to select. + The inserted text will always be treated as string content, and not as a reference to any SQL entity (such as columns, tables or databases). + .EXAMPLE + PS C:\> Invoke-DbaQuery -SqlInstance aglistener1 -ReadOnly -Query "select something from readonlydb.dbo.atable" + + Executes a query with ReadOnly application intent on aglistener1. #> [CmdletBinding(DefaultParameterSetName = "Query")] param ( @@ -110,6 +125,7 @@ function Invoke-DbaQuery { [switch]$MessagesToOutput, [parameter(ValueFromPipeline)] [Microsoft.SqlServer.Management.Smo.Database[]]$InputObject, + [switch]$ReadOnly, [switch]$EnableException ) @@ -281,7 +297,15 @@ function Invoke-DbaQuery { } foreach ($instance in $SqlInstance) { try { - $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential + $connDbaInstanceParams = @{ + SqlInstance = $instance + SqlCredential = $SqlCredential + Database = $Database + } + if ($ReadOnly) { + $connDbaInstanceParams.ApplicationIntent = "ReadOnly" + } + $server = Connect-DbaInstance @connDbaInstanceParams } catch { Stop-Function -Message "Failure" -ErrorRecord $_ -Target $instance -Continue } diff --git a/functions/Invoke-SqlCmd2.ps1 b/functions/Invoke-SqlCmd2.ps1 deleted file mode 100644 index f82291bbea..0000000000 --- a/functions/Invoke-SqlCmd2.ps1 +++ /dev/null @@ -1,283 +0,0 @@ -function Invoke-Sqlcmd2 { - <# - .SYNOPSIS - Runs a T-SQL script. - - .DESCRIPTION - Runs a T-SQL script. Invoke-Sqlcmd2 runs the whole script and only captures the first selected result set, such as the output of PRINT statements when -verbose parameter is specified. - Parameterized queries are supported. - - Help details below borrowed from Invoke-Sqlcmd - - .PARAMETER ServerInstance - Specifies the SQL Server instance(s) to execute the query against. - - .PARAMETER Database - Specifies the name of the database to execute the query against. If specified, this database will be used in the ConnectionString when establishing the connection to SQL Server. - - If a SQLConnection is provided, the default database for that connection is overridden with this database. - - .PARAMETER Query - Specifies one or more queries to be run. The queries can be Transact-SQL, XQuery statements, or sqlcmd commands. Multiple queries in a single batch may be separated by a semicolon. - - Do not specify the sqlcmd GO separator (or, use the ParseGo parameter). Escape any double quotation marks included in the string. - - Consider using bracketed identifiers such as [MyTable] instead of quoted identifiers such as "MyTable". - - .PARAMETER InputFile - Specifies the full path to a file to be used as the query input to Invoke-Sqlcmd2. The file can contain Transact-SQL statements, XQuery statements, sqlcmd commands and scripting variables. - - .PARAMETER Credential - Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) - - SECURITY NOTE: If you use the -Debug switch, the connectionstring including plain text password will be sent to the debug stream. - - .PARAMETER Encrypt - If this switch is enabled, the connection to SQL Server will be made using SSL. - - This requires that the SQL Server has been set up to accept SSL requests. For information regarding setting up SSL on SQL Server, see https://technet.microsoft.com/en-us/library/ms189067(v=sql.105).aspx - - .PARAMETER QueryTimeout - Specifies the number of seconds before the queries time out. - - .PARAMETER ConnectionTimeout - Specifies the number of seconds before Invoke-Sqlcmd2 times out if it cannot successfully connect to an instance of the Database Engine. The timeout value must be an integer between 0 and 65534. If 0 is specified, connection attempts do not time out. - - .PARAMETER As - Specifies output type. Valid options for this parameter are 'DataSet', 'DataTable', 'DataRow', 'PSObject', and 'SingleValue' - - PSObject output introduces overhead but adds flexibility for working with results: http://powershell.org/wp/forums/topic/dealing-with-dbnull/ - - .PARAMETER SqlParameters - Specifies a hashtable of parameters for parameterized SQL queries. http://blog.codinghorror.com/give-me-parameterized-sql-or-give-me-death/ - - Example: - - .PARAMETER AppendServerInstance - If this switch is enabled, the SQL Server instance will be appended to PSObject and DataRow output. - - .PARAMETER ParseGo - If this switch is enabled, "GO" statements will be handled automatically. - Every "GO" will effectively run in a separate query, like if you issued multiple Invoke-SqlCmd2 commands. - "GO"s will be recognized if they are on a single line, as this covers - the 95% of the cases "GO" parsing is needed - Note: - Queries will always target that database, e.g. if you have this Query: - USE DATABASE [dbname] - GO - SELECT * from sys.tables - and you call it via - Invoke-SqlCmd2 -ServerInstance instance -Database msdb -Query ... - you'll get back tables from msdb, not dbname. - - - .PARAMETER SQLConnection - Specifies an existing SQLConnection object to use in connecting to SQL Server. If the connection is closed, an attempt will be made to open it. - - .INPUTS - None - You cannot pipe objects to Invoke-Sqlcmd2 - - .OUTPUTS - As PSObject: System.Management.Automation.PSCustomObject - As DataRow: System.Data.DataRow - As DataTable: System.Data.DataTable - As DataSet: System.Data.DataTableCollectionSystem.Data.DataSet - As SingleValue: Dependent on data type in first column. - - .EXAMPLE - Invoke-Sqlcmd2 -ServerInstance "MyComputer\MyInstance" -Query "SELECT login_time AS 'StartTime' FROM sysprocesses WHERE spid = 1" - - Connects to a named instance of the Database Engine on a computer and runs a basic T-SQL query. - - StartTime - ----------- - 2010-08-12 21:21:03.593 - - .EXAMPLE - Invoke-Sqlcmd2 -ServerInstance "MyComputer\MyInstance" -InputFile "C:\MyFolder\tsqlscript.sql" | Out-File -filePath "C:\MyFolder\tsqlscript.rpt" - - Reads a file containing T-SQL statements, runs the file, and writes the output to another file. - - .EXAMPLE - Invoke-Sqlcmd2 -ServerInstance "MyComputer\MyInstance" -Query "PRINT 'hello world'" -Verbose - - Uses the PowerShell -Verbose parameter to return the message output of the PRINT command. - VERBOSE: hello world - - .EXAMPLE - Invoke-Sqlcmd2 -ServerInstance MyServer\MyInstance -Query "SELECT ServerName, VCNumCPU FROM tblServerInfo" -as PSObject | ?{$_.VCNumCPU -gt 8} - Invoke-Sqlcmd2 -ServerInstance MyServer\MyInstance -Query "SELECT ServerName, VCNumCPU FROM tblServerInfo" -as PSObject | ?{$_.VCNumCPU} - - This example uses the PSObject output type to allow more flexibility when working with results. - - If we used DataRow rather than PSObject, we would see the following behavior: - Each row where VCNumCPU does not exist would produce an error in the first example - Results would include rows where VCNumCPU has DBNull value in the second example - - .EXAMPLE - 'Instance1', 'Server1/Instance1', 'Server2' | Invoke-Sqlcmd2 -query "Sp_databases" -as psobject -AppendServerInstance - - This example lists databases for each instance. It includes a column for the ServerInstance in question. - DATABASE_NAME DATABASE_SIZE REMARKS ServerInstance - ------------- ------------- ------- -------------- - REDACTED 88320 Instance1 - master 17920 Instance1 - ... - msdb 618112 Server1/Instance1 - tempdb 563200 Server1/Instance1 - ... - OperationsManager 20480000 Server2 - - .EXAMPLE - #Construct a query using SQL parameters - $Query = "SELECT ServerName, VCServerClass, VCServerContact FROM tblServerInfo WHERE VCServerContact LIKE @VCServerContact AND VCServerClass LIKE @VCServerClass" - - #Run the query, specifying values for SQL parameters - Invoke-Sqlcmd2 -ServerInstance SomeServer\NamedInstance -Database ServerDB -query $query -SqlParameters @{ VCServerContact="%cookiemonster%"; VCServerClass="Prod" } - - ServerName VCServerClass VCServerContact - ---------- ------------- --------------- - SomeServer1 Prod cookiemonster, blah - SomeServer2 Prod cookiemonster - SomeServer3 Prod blah, cookiemonster - - .EXAMPLE - Invoke-Sqlcmd2 -SQLConnection $Conn -Query "SELECT login_time AS 'StartTime' FROM sysprocesses WHERE spid = 1" - - Uses an existing SQLConnection and runs a basic T-SQL query against it - - StartTime - ----------- - 2010-08-12 21:21:03.593 - - .EXAMPLE - Invoke-SqlCmd -SQLConnection $Conn -Query "SELECT ServerName FROM tblServerInfo WHERE ServerName LIKE @ServerName" -SqlParameters @{"ServerName = "c-is-hyperv-1"} - - Executes a parameterized query against the existing SQLConnection, with a collection of one parameter to be passed to the query when executed. - - .NOTES - Changelog moved to CHANGELOG.md: - - https://github.com/sqlcollaborative/Invoke-SqlCmd2/blob/master/CHANGELOG.md - - .LINK - https://github.com/sqlcollaborative/Invoke-SqlCmd2 - - .LINK - https://github.com/RamblingCookieMonster/PowerShell - - .FUNCTIONALITY - SQL - -#> - - [CmdletBinding(DefaultParameterSetName = 'Ins-Que')] - [OutputType([System.Management.Automation.PSCustomObject], [System.Data.DataRow], [System.Data.DataTable], [System.Data.DataTableCollection], [System.Data.DataSet])] - param ( - [Parameter(ParameterSetName = 'Ins-Que', - Position = 0, - Mandatory, - ValueFromPipeline, - ValueFromPipelineByPropertyName = $true, - ValueFromRemainingArguments = $false, - HelpMessage = 'SQL Server Instance required...')] - [Parameter(ParameterSetName = 'Ins-Fil', - Position = 0, - Mandatory, - ValueFromPipeline, - ValueFromPipelineByPropertyName = $true, - ValueFromRemainingArguments = $false, - HelpMessage = 'SQL Server Instance required...')] - [Alias('Instance', 'Instances', 'ComputerName', 'Server', 'Servers', 'SqlInstance')] - [ValidateNotNullOrEmpty()] - [string[]]$ServerInstance, - [Parameter(Position = 1, - ValueFromPipelineByPropertyName = $true, - ValueFromRemainingArguments = $false)] - [string]$Database, - [Parameter(ParameterSetName = 'Ins-Que', - Position = 2, - Mandatory, - ValueFromPipelineByPropertyName = $true, - ValueFromRemainingArguments = $false)] - [Parameter(ParameterSetName = 'Con-Que', - Position = 2, - Mandatory, - ValueFromPipelineByPropertyName = $true, - ValueFromRemainingArguments = $false)] - [string]$Query, - [Parameter(ParameterSetName = 'Ins-Fil', - Position = 2, - Mandatory, - ValueFromPipelineByPropertyName = $true, - ValueFromRemainingArguments = $false)] - [Parameter(ParameterSetName = 'Con-Fil', - Position = 2, - Mandatory, - ValueFromPipelineByPropertyName = $true, - ValueFromRemainingArguments = $false)] - [ValidateScript( { Test-Path -LiteralPath $_ })] - [string]$InputFile, - [Parameter(ParameterSetName = 'Ins-Que', - Position = 3, - ValueFromPipelineByPropertyName = $true, - ValueFromRemainingArguments = $false)] - [Parameter(ParameterSetName = 'Ins-Fil', - Position = 3, - ValueFromPipelineByPropertyName = $true, - ValueFromRemainingArguments = $false)] - [Alias('SqlCredential')] - [System.Management.Automation.PSCredential]$Credential, - [Parameter(ParameterSetName = 'Ins-Que', - Position = 4, - ValueFromRemainingArguments = $false)] - [Parameter(ParameterSetName = 'Ins-Fil', - Position = 4, - ValueFromRemainingArguments = $false)] - [switch]$Encrypt, - [Parameter(Position = 5, - ValueFromPipelineByPropertyName = $true, - ValueFromRemainingArguments = $false)] - [Int32]$QueryTimeout = 600, - [Parameter(ParameterSetName = 'Ins-Fil', - Position = 6, - ValueFromPipelineByPropertyName = $true, - ValueFromRemainingArguments = $false)] - [Parameter(ParameterSetName = 'Ins-Que', - Position = 6, - ValueFromPipelineByPropertyName = $true, - ValueFromRemainingArguments = $false)] - [Int32]$ConnectionTimeout = 15, - [Parameter(Position = 7, - ValueFromPipelineByPropertyName = $true, - ValueFromRemainingArguments = $false)] - [ValidateSet("DataSet", "DataTable", "DataRow", "PSObject", "SingleValue")] - [string]$As = "DataRow", - [Parameter(Position = 8, - ValueFromPipelineByPropertyName = $true, - ValueFromRemainingArguments = $false)] - [System.Collections.IDictionary]$SqlParameters, - [Parameter(Position = 9)] - [switch]$AppendServerInstance, - [Parameter(Position = 10)] - [switch]$ParseGO, - [Parameter(ParameterSetName = 'Con-Que', - Position = 11, - ValueFromPipeline = $false, - ValueFromPipelineByPropertyName = $false, - ValueFromRemainingArguments = $false)] - [Parameter(ParameterSetName = 'Con-Fil', - Position = 11, - ValueFromPipeline = $false, - ValueFromPipelineByPropertyName = $false, - ValueFromRemainingArguments = $false)] - [Alias('Connection', 'Conn')] - [ValidateNotNullOrEmpty()] - [System.Data.SqlClient.SQLConnection]$SQLConnection - ) - - process { - Write-Message -Level Warning -Message "This command is no longer supported. Please use Invoke-DbaQuery instead." - } -} \ No newline at end of file diff --git a/functions/New-DbaAgentJobCategory.ps1 b/functions/New-DbaAgentJobCategory.ps1 index 1bd1fdc28e..1f0b8ecc8f 100644 --- a/functions/New-DbaAgentJobCategory.ps1 +++ b/functions/New-DbaAgentJobCategory.ps1 @@ -114,7 +114,7 @@ function New-DbaAgentJobCategory { } # end else category exists # Return the job category - Get-DbaAgentJobCategory -SqlInstance $instance -Category $cat + Get-DbaAgentJobCategory -SqlInstance $server -Category $cat } # for each category diff --git a/functions/New-DbaAgentProxy.ps1 b/functions/New-DbaAgentProxy.ps1 index a5c6883588..0b579e6ae2 100644 --- a/functions/New-DbaAgentProxy.ps1 +++ b/functions/New-DbaAgentProxy.ps1 @@ -152,7 +152,7 @@ function New-DbaAgentProxy { if ($Pscmdlet.ShouldProcess($instance, "Adding $proxyname with the $ProxyCredential credential")) { # the new-object is stubborn and $true/$false has to be forced in - switch (Test-Bound $disabled) { + switch (Test-Bound -ParameterName Disabled) { $false { $proxy = New-Object Microsoft.SqlServer.Management.Smo.Agent.ProxyAccount -ArgumentList $jobServer, $ProxyName, $ProxyCredential, $true, $Description } diff --git a/functions/New-DbaAvailabilityGroup.ps1 b/functions/New-DbaAvailabilityGroup.ps1 index 3166fd329d..9284ac1f19 100644 --- a/functions/New-DbaAvailabilityGroup.ps1 +++ b/functions/New-DbaAvailabilityGroup.ps1 @@ -162,7 +162,7 @@ function New-DbaAvailabilityGroup { .EXAMPLE PS C:\> New-DbaAvailabilityGroup -Primary sql2016a -Name SharePoint -Secondary sql2016b - Creates a new availability group on sql2016b named SharePoint with a secondary replica, sql2016b + Creates a new availability group on sql2016a named SharePoint with a secondary replica, sql2016b .EXAMPLE PS C:\> New-DbaAvailabilityGroup -Primary sql2016std -Name BAG1 -Basic -Confirm:$false diff --git a/functions/New-DbaConnectionString.ps1 b/functions/New-DbaConnectionString.ps1 index ba8ffc6396..a6b06bbc39 100644 --- a/functions/New-DbaConnectionString.ps1 +++ b/functions/New-DbaConnectionString.ps1 @@ -31,6 +31,9 @@ function New-DbaConnectionString { .PARAMETER ClientName By default, this command sets the client to "dbatools PowerShell module - dbatools.io - custom connection" if you're doing anything that requires profiling, you can look for this client name. Using -ClientName allows you to set your own custom client. + .PARAMETER Database + Database name + .PARAMETER ConnectTimeout The length of time (in seconds) to wait for a connection to the server before terminating the attempt and generating an error. @@ -173,6 +176,7 @@ function New-DbaConnectionString { [string]$BatchSeparator, [string]$ClientName = "custom connection", [int]$ConnectTimeout, + [string]$Database, [switch]$EncryptConnection, [string]$FailoverPartner, [switch]$IsActiveDirectoryUniversalAuth, @@ -197,6 +201,32 @@ function New-DbaConnectionString { process { foreach ($instance in $sqlinstance) { if ($Pscmdlet.ShouldProcess($instance, "Making a new Connection String")) { + if ($instance.ComputerName -match "database\.windows\.net") { + if ($instance.InputObject.GetType() -eq [Microsoft.SqlServer.Management.Smo.Server]) { + $connstring = $instance.InputObject.ConnectionContext.ConnectionString + if ($Database) { + $olddb = $connstring -split ';' | Where { $_.StartsWith("Initial Catalog")} + $newdb = "Initial Catalog=$Database" + $connstring = $connstring.Replace($olddb, $newdb) + } + $connstring + continue + } else { + $isAzure = $true + + if (-not (Test-Bound -ParameterName ConnectTimeout)) { + $ConnectTimeout = 30 + } + + if (-not (Test-Bound -ParameterName ClientName)) { + $ClientName = "dbatools PowerShell module - dbatools.io" + + } + $EncryptConnection = $true + $instance = [DbaInstanceParameter]"tcp:$($instance.ComputerName),$($instance.Port)" + } + } + if ($instance.GetType() -eq [Microsoft.SqlServer.Management.Smo.Server]) { return $instance.ConnectionContext.ConnectionString } else { @@ -230,14 +260,6 @@ function New-DbaConnectionString { if ($TrustServerCertificate) { $server.ConnectionContext.TrustServerCertificate = $true } if ($WorkstationId) { $server.ConnectionContext.WorkstationId = $WorkstationId } - $connstring = $server.ConnectionContext.ConnectionString - if ($MultiSubnetFailover) { $connstring = "$connstring;MultiSubnetFailover=True" } - if ($FailoverPartner) { $connstring = "$connstring;Failover Partner=$FailoverPartner" } - if ($ApplicationIntent) { $connstring = "$connstring;ApplicationIntent=$ApplicationIntent;" } - - if ($connstring -ne $server.ConnectionContext.ConnectionString) { - $server.ConnectionContext.ConnectionString = $connstring - } if ($null -ne $Credential.username) { $username = ($Credential.username).TrimStart("\") @@ -258,7 +280,32 @@ function New-DbaConnectionString { } } - ($server.ConnectionContext.ConnectionString).Replace($guid, $SqlInstance) + $connstring = $server.ConnectionContext.ConnectionString + if ($MultiSubnetFailover) { $connstring = "$connstring;MultiSubnetFailover=True" } + if ($FailoverPartner) { $connstring = "$connstring;Failover Partner=$FailoverPartner" } + if ($ApplicationIntent) { $connstring = "$connstring;ApplicationIntent=$ApplicationIntent;" } + + if ($isAzure) { + if ($Credential) { + if ($Credential.UserName -like "*\*" -or $Credential.UserName -like "*@*") { + $connstring = "$connstring;Authentication=`"Active Directory Password`"" + } else { + $username = ($Credential.username).TrimStart("\") + $server.ConnectionContext.LoginSecure = $false + $server.ConnectionContext.set_Login($username) + $server.ConnectionContext.set_SecurePassword($Credential.Password) + } + } else { + $connstring = $connstring.Replace("Integrated Security=True;", "") + $connstring = "$connstring;Authentication=`"Active Directory Integrated`"" + } + } + + if ($connstring -ne $server.ConnectionContext.ConnectionString) { + $server.ConnectionContext.ConnectionString = $connstring + } + + ($server.ConnectionContext.ConnectionString).Replace($guid, $instance) } } } diff --git a/functions/New-DbaDatabase.ps1 b/functions/New-DbaDatabase.ps1 index f5ff37fbde..68f7c95037 100644 --- a/functions/New-DbaDatabase.ps1 +++ b/functions/New-DbaDatabase.ps1 @@ -114,6 +114,7 @@ function New-DbaDatabase { [parameter(Mandatory, ValueFromPipeline)] [DbaInstanceParameter[]]$SqlInstance, [PSCredential]$SqlCredential, + [Alias('Database')] [string[]]$Name, [string]$Collation, [string]$Recoverymodel, diff --git a/functions/New-DbaDbMailProfile.ps1 b/functions/New-DbaDbMailProfile.ps1 new file mode 100644 index 0000000000..bd0c70db86 --- /dev/null +++ b/functions/New-DbaDbMailProfile.ps1 @@ -0,0 +1,101 @@ +#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# +function New-DbaDbMailProfile { + <# + .SYNOPSIS + Creates a new database mail profile + + .DESCRIPTION + Creates a new database mail profile, and optionally associates it to a database mail account + + .PARAMETER SqlInstance + The target SQL Server instance or instances. You must have sysadmin access and server version must be SQL Server version 2008 or higher. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Name + The Name of the profile to be created. + + .PARAMETER Description + Sets the description of the purpose of the mail profile. + + .PARAMETER MailAccountName + Associates a db mail account to link to this db mail profile. + + .PARAMETER MailAccountPriority + Sets the priority of the linked db mail account when linking to this db mail profile. + + .PARAMETER WhatIf + If this switch is enabled, no actions are performed but informational messages will be displayed that explain what would happen if the command were to run. + + .PARAMETER Confirm + If this switch is enabled, you will be prompted for confirmation before executing any operations that change state. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: DbMail + Author: Ian Lanham (@ilanham) + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/New-DbaDbMailProfile + + .EXAMPLE + PS C:\> $profile = New-DbaDbMailProfile -SqlInstance sql2017 -Name 'The DBA Team' + + Creates a new db mail profile + + #> + [CmdletBinding(SupportsShouldProcess, ConfirmImpact = "Low")] + param ( + [parameter(Mandatory, ValueFromPipeline)] + [Alias("ServerInstance", "SqlServer")] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [parameter(Mandatory)] + [string]$Name, + [string]$Description, + [string]$MailAccountName, + [int]$MailAccountPriority, + [switch]$EnableException + ) + process { + foreach ($instance in $SqlInstance) { + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential -MinimumVersion 11 + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + if ($Pscmdlet.ShouldProcess($instance, "Creating new db mail profile called $Name")) { + try { + $profile = New-Object Microsoft.SqlServer.Management.SMO.Mail.MailProfile $server.Mail, $Name + if (Test-Bound -ParameterName 'Description') { + $profile.Description = $Description + } + $profile.Create() + if (Test-Bound -ParameterName 'MailAccountName') { + if (!$MailAccountPriority) { + $MailAccountPriority = 1 + } + $profile.AddAccount($MailAccountName, $MailAccountPriority) # sequenceNumber correlates to "Priority" when associating a db mail Account to a db mail Profile + } + Add-Member -Force -InputObject $profile -MemberType NoteProperty -Name ComputerName -value $server.ComputerName + Add-Member -Force -InputObject $profile -MemberType NoteProperty -Name InstanceName -value $server.ServiceName + Add-Member -Force -InputObject $profile -MemberType NoteProperty -Name SqlInstance -value $server.DomainInstanceName + + $profile | Select-DefaultView -Property ComputerName, InstanceName, SqlInstance, Id, Name, Description, IsBusyProfile + } catch { + Stop-Function -Message "Failure" -ErrorRecord $_ -Continue + } + } + } + } +} \ No newline at end of file diff --git a/functions/New-DbaDbMaskingConfig.ps1 b/functions/New-DbaDbMaskingConfig.ps1 new file mode 100644 index 0000000000..7be71ca900 --- /dev/null +++ b/functions/New-DbaDbMaskingConfig.ps1 @@ -0,0 +1,660 @@ +function New-DbaDbMaskingConfig { + <# + .SYNOPSIS + Generates a new data masking configuration file to be used with Invoke-DbaDbDataMasking + + .DESCRIPTION + Generates a new data masking configuration file. This file is important to apply any data masking to the data in a database. + + Note that the following column and data types are not currently supported: + Identity + ForeignKey + Computed + Hierarchyid + Geography + Geometry + Xml + + Read more here: + https://sachabarbs.wordpress.com/2018/06/11/bogus-simple-fake-data-tool/ + https://github.com/bchavez/Bogus + + .PARAMETER SqlInstance + The target SQL Server instance or instances. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Database + Databases to process through + + .PARAMETER Table + Tables to process. By default all the tables will be processed + + .PARAMETER Column + Columns to process. By default all the columns will be processed + + .PARAMETER Path + Path where to save the generated JSON files. + Th naming convention will be "servername.databasename.tables.json" + + .PARAMETER Locale + Set the local to enable certain settings in the masking + + .PARAMETER Force + Forcefully execute commands when needed + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: DataMasking, Database + Author: Sander Stad (@sqlstad, sqlstad.nl) | Chrissy LeMaire (@cl, netnerds.net) + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/New-DbaDbMaskingConfig + + .EXAMPLE + New-DbaDbMaskingConfig -SqlInstance SQLDB1 -Database DB1 -Path C:\Temp\clone + + Process all tables and columns for database DB1 on instance SQLDB1 + + .EXAMPLE + New-DbaDbMaskingConfig -SqlInstance SQLDB1 -Database DB1 -Table Customer -Path C:\Temp\clone + + Process only table Customer with all the columns + + .EXAMPLE + New-DbaDbMaskingConfig -SqlInstance SQLDB1 -Database DB1 -Table Customer -Column City -Path C:\Temp\clone + + Process only table Customer and only the column named "City" + + #> + [CmdLetBinding()] + param ( + [parameter(Mandatory)] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [string[]]$Database, + [string[]]$Table, + [string[]]$Column, + [parameter(Mandatory)] + [string]$Path, + [string]$Locale = 'en', + [switch]$Force, + [switch]$EnableException + ) + begin { + + # Get all the different column types + try { + $columnTypes = Get-Content -Path "$script:PSModuleRoot\bin\datamasking\columntypes.json" | ConvertFrom-Json + } catch { + Stop-Function -Message "Something went wrong importing the column types" -ErrorRecord $_ -Continue + } + # Check if the Path is accessible + if (-not (Test-Path -Path $Path)) { + try { + $null = New-Item -Path $Path -ItemType Directory -Force:$Force + } catch { + Stop-Function -Message "Could not create Path directory" -ErrorRecord $_ -Target $Path + } + } else { + if ((Get-Item $path) -isnot [System.IO.DirectoryInfo]) { + Stop-Function -Message "$Path is not a directory" + } + } + + $supportedDataTypes = 'bit', 'bool', 'char', 'date', 'datetime', 'datetime2', 'decimal', 'int', 'money', 'nchar', 'ntext', 'nvarchar', 'smalldatetime', 'text', 'time', 'uniqueidentifier', 'userdefineddatatype', 'varchar' + } + + process { + if (Test-FunctionInterrupt) { + return + } + + if ($SqlInstance) { + $InputObject += Get-DbaDatabase -SqlInstance $SqlInstance -SqlCredential $SqlCredential -Database $Database + } + + $results = @() + foreach ($db in $InputObject) { + $server = $db.Parent + $tables = @() + + # Get the tables + if ($Table) { + $tablecollection = $db.Tables | Where-Object Name -in $Table + } else { + $tablecollection = $db.Tables + } + + if ($tablecollection.Count -lt 1) { + Stop-Function -Message "The database does not contain any tables" -Target $db -Continue + } + + # Loop through the tables + foreach ($tableobject in $tablecollection) { + Write-Message -Message "Processing table $($tableobject.Name)" -Level Verbose + + $hasUniqueIndex = $false + + if ($tableobject.Indexes.IsUnique) { + $hasUniqueIndex = $true + } + + $columns = @() + + # Get the columns + if ($Column) { + [array]$columncollection = $tableobject.Columns | Where-Object Name -in $Column + } else { + [array]$columncollection = $tableobject.Columns + } + + foreach ($columnobject in $columncollection) { + # Skip incompatible columns + if ($columnobject.Identity) { + Write-Message -Level Verbose -Message "Skipping $columnobject because it is an identity column" + continue + } + + if ($columnobject.IsForeignKey) { + Write-Message -Level Verbose -Message "Skipping $columnobject because it is a foreign key" + continue + } + + if ($columnobject.Computed) { + Write-Message -Level Verbose -Message "Skipping $columnobject because it is a computed column" + continue + } + + if ($server.VersionMajor -ge 13 -and $columnobject.GeneratedAlwaysType -ne 'None') { + Write-Message -Level Verbose -Message "Skipping $columnobject because it is a computed column for temporal tables" + continue + } + + if ($columnobject.DataType.Name -notin $supportedDataTypes) { + Write-Message -Level Verbose -Message "Skipping $columnobject because it is not a supported data type" + continue + } + + if ($columnobject.DataType.SqlDataType.ToString().ToLower() -eq 'xml') { + Write-Message -Level Verbose -Message "Skipping $columnobject because it is a xml column" + continue + } + + $maskingType = $min = $null + $columnLength = $columnobject.Datatype.MaximumLength + $columnType = $columnobject.DataType.SqlDataType.ToString().ToLower() + + if ($columnobject.InPrimaryKey -and $columnobject.DataType.SqlDataType.ToString().ToLower() -notmatch 'date') { + $min = 2 + } + if (-not $columnType) { + $columnType = $columnobject.DataType.Name.ToLower() + } + + # Get the masking type with the synonym + $maskingType = $columnTypes | Where-Object { + $columnobject.Name -in $_.Synonym + } + + if ($maskingType) { + # Make it easier to get the type name + $maskingType = $maskingType | Select-Object TypeName -ExpandProperty TypeName + + switch ($maskingType.ToLower()) { + "address" { + $columns += [PSCustomObject]@{ + Name = $columnobject.Name + ColumnType = $columnType + CharacterString = $null + MinValue = $min + MaxValue = $columnLength + MaskingType = "Address" + SubType = "StreetAddress" + Format = $null + Deterministic = $false + Nullable = $columnobject.Nullable + } + } + "bic" { + $columns += [PSCustomObject]@{ + Name = $columnobject.Name + ColumnType = $columnType + CharacterString = $null + MinValue = $min + MaxValue = $columnLength + MaskingType = "Finance" + SubType = "Bic" + Format = $null + Deterministic = $false + Nullable = $columnobject.Nullable + } + } + "bitcoin" { + $columns += [PSCustomObject]@{ + Name = $columnobject.Name + ColumnType = $columnType + CharacterString = $null + MinValue = $min + MaxValue = $columnLength + MaskingType = "Finance" + SubType = "BitcoinAddress" + Format = $null + Deterministic = $false + Nullable = $columnobject.Nullable + } + } + "country" { + $columns += [PSCustomObject]@{ + Name = $columnobject.Name + ColumnType = $columnType + CharacterString = $null + MinValue = $min + MaxValue = $columnLength + MaskingType = "Address" + SubType = "Country" + Format = $null + Deterministic = $false + Nullable = $columnobject.Nullable + } + } + "countrycode" { + $columns += [PSCustomObject]@{ + Name = $columnobject.Name + ColumnType = $columnType + CharacterString = $null + MinValue = $min + MaxValue = $columnLength + MaskingType = "Address" + SubType = "CountryCode" + Format = $null + Deterministic = $false + Nullable = $columnobject.Nullable + } + } + "ethereum" { + $columns += [PSCustomObject]@{ + Name = $columnobject.Name + ColumnType = $columnType + CharacterString = $null + MinValue = $min + MaxValue = $columnLength + MaskingType = "Finance" + SubType = "EthereumAddress" + Format = $null + Deterministic = $false + Nullable = $columnobject.Nullable + } + } + "city" { + $columns += [PSCustomObject]@{ + Name = $columnobject.Name + ColumnType = $columnType + CharacterString = $null + MinValue = $min + MaxValue = $columnLength + MaskingType = "Address" + SubType = "City" + Format = $null + Deterministic = $false + Nullable = $columnobject.Nullable + } + } + "creditcardcvv" { + $columns += [PSCustomObject]@{ + Name = $columnobject.Name + ColumnType = $columnType + CharacterString = $null + MinValue = $min + MaxValue = $columnLength + MaskingType = "Finance" + SubType = "CreditCardCvv" + Format = $null + Deterministic = $false + Nullable = $columnobject.Nullable + } + } + "company" { + $columns += [PSCustomObject]@{ + Name = $columnobject.Name + ColumnType = $columnType + CharacterString = $null + MinValue = $min + MaxValue = $columnLength + MaskingType = "Company" + SubType = "CompanyName" + Format = $null + Deterministic = $false + Nullable = $columnobject.Nullable + } + } + "creditcard" { + $columns += [PSCustomObject]@{ + Name = $columnobject.Name + ColumnType = $columnType + CharacterString = $null + MinValue = $min + MaxValue = $columnLength + MaskingType = "Finance" + SubType = "CreditcardNumber" + Format = $null + Deterministic = $false + Nullable = $columnobject.Nullable + } + } + "email" { + $columns += [PSCustomObject]@{ + Name = $columnobject.Name + ColumnType = $columnType + CharacterString = $null + MinValue = $min + MaxValue = $columnLength + MaskingType = "Internet" + SubType = "Email" + Format = $null + Deterministic = $false + Nullable = $columnobject.Nullable + } + } + "firstname" { + $columns += [PSCustomObject]@{ + Name = $columnobject.Name + ColumnType = $columnType + CharacterString = $null + MinValue = $min + MaxValue = $columnLength + MaskingType = "Name" + SubType = "Firstname" + Format = $null + Deterministic = $false + Nullable = $columnobject.Nullable + } + } + "fullname" { + $columns += [PSCustomObject]@{ + Name = $columnobject.Name + ColumnType = $columnType + CharacterString = $null + MinValue = $min + MaxValue = $columnLength + MaskingType = "Name" + SubType = "FullName" + Format = $null + Deterministic = $false + Nullable = $columnobject.Nullable + } + } + "iban" { + $columns += [PSCustomObject]@{ + Name = $columnobject.Name + ColumnType = $columnType + CharacterString = $null + MinValue = $min + MaxValue = $columnLength + MaskingType = "Finance" + SubType = "Iban" + Format = $null + Deterministic = $false + Nullable = $columnobject.Nullable + } + } + "lastname" { + $columns += [PSCustomObject]@{ + Name = $columnobject.Name + ColumnType = $columnType + CharacterString = $null + MinValue = $min + MaxValue = $columnLength + MaskingType = "Name" + SubType = "Lastname" + Format = $null + Deterministic = $false + Nullable = $columnobject.Nullable + } + } + "latitude" { + $columns += [PSCustomObject]@{ + Name = $columnobject.Name + ColumnType = $columnType + CharacterString = $null + MinValue = $min + MaxValue = $columnLength + MaskingType = "Address" + SubType = "Latitude" + Format = $null + Deterministic = $false + Nullable = $columnobject.Nullable + } + } + "longitude" { + $columns += [PSCustomObject]@{ + Name = $columnobject.Name + ColumnType = $columnType + CharacterString = $null + MinValue = $min + MaxValue = $columnLength + MaskingType = "Address" + SubType = "Longitude" + Format = $null + Deterministic = $false + Nullable = $columnobject.Nullable + } + } + "phone" { + $columns += [PSCustomObject]@{ + Name = $columnobject.Name + ColumnType = $columnType + CharacterString = $null + MinValue = $min + MaxValue = $columnLength + MaskingType = "Phone" + SubType = "PhoneNumber" + Format = $null + Deterministic = $false + Nullable = $columnobject.Nullable + } + } + "state" { + $columns += [PSCustomObject]@{ + Name = $columnobject.Name + ColumnType = $columnType + CharacterString = $null + MinValue = $min + MaxValue = $columnLength + MaskingType = "Address" + SubType = "State" + Format = $null + Deterministic = $false + Nullable = $columnobject.Nullable + } + } + "stateabbr" { + $columns += [PSCustomObject]@{ + Name = $columnobject.Name + ColumnType = $columnType + CharacterString = $null + MinValue = $min + MaxValue = $columnLength + MaskingType = "Address" + SubType = "StateAbbr" + Format = $null + Deterministic = $false + Nullable = $columnobject.Nullable + } + } + "zipcode" { + $columns += [PSCustomObject]@{ + Name = $columnobject.Name + ColumnType = $columnType + CharacterString = $null + MinValue = $min + MaxValue = $columnLength + MaskingType = "Address" + SubType = "Zipcode" + Format = $null + Deterministic = $false + Nullable = $columnobject.Nullable + } + } + "username" { + $columns += [PSCustomObject]@{ + Name = $columnobject.Name + ColumnType = $columnType + CharacterString = $null + MinValue = $min + MaxValue = $columnLength + MaskingType = "Internet" + SubType = "UserName" + Format = $null + Deterministic = $false + Nullable = $columnobject.Nullable + } + } + } + } else { + $type = "Random" + + switch ($columnType) { + { + $_ -in "bit", "bool" + } { + $subType = "Bool" + $MaxValue = $null + } + "bigint" { + $subType = "Number" + $MaxValue = 9223372036854775807 + } + "int" { + $subType = "Number" + $MaxValue = 2147483647 + } + "date" { + $subType = "Date" + $MaxValue = $null + } + "datetime" { + $subType = "Date" + $MaxValue = $null + } + "datetime2" { + $subType = "Date" + $MaxValue = $null + } + "decimal" { + $subType = "Decimal" + $MaxValue = $null + } + "float" { + $subType = "Float" + $MaxValue = $null + } + "money" { + $type = "Commerce" + $subType = "Price" + $min = -922337203685477.5808 + $MaxValue = 922337203685477.5807 + } + "smallint" { + $subType = "Number" + $MaxValue = 32767 + } + "smalldatetime" { + $subType = "Date" + $MaxValue = $null + } + "text" { + $subType = "String" + $maxValue = 2147483647 + } + "tinyint" { + $subType = "Number" + $MaxValue = 255 + } + "varbinary" { + $subType = "Byte" + $MaxValue = $columnLength + } + "userdefineddatatype" { + if ($columnLength -eq 1) { + $subType = "Bool" + $MaxValue = $columnLength + } else { + $subType = "String" + $MaxValue = $columnLength + } + } + default { + $subType = "String" + $MaxValue = $columnLength + } + } + + $columns += [PSCustomObject]@{ + Name = $columnobject.Name + ColumnType = $columnType + CharacterString = $null + MinValue = $min + MaxValue = $MaxValue + MaskingType = $type + SubType = $subType + Format = $null + Deterministic = $false + Nullable = $columnobject.Nullable + } + } + } + + + # Check if something needs to be generated + if ($columns) { + $tables += [PSCustomObject]@{ + Name = $tableobject.Name + Schema = $tableobject.Schema + Columns = $columns + HasUniqueIndex = $hasUniqueIndex + } + } else { + Write-Message -Message "No columns match for masking in table $($tableobject.Name)" -Level Verbose + } + } + + # Check if something needs to be generated + if ($tables) { + $results += [PSCustomObject]@{ + Name = $db.Name + Tables = $tables + } + } else { + Write-Message -Message "No columns match for masking in table $($tableobject.Name)" -Level Verbose + } + } + + # Write the data to the Path + if ($results) { + try { + $filenamepart = $server.Name.Replace('\', '$').Replace('TCP:', '').Replace(',', '.') + $temppath = "$Path\$($filenamepart).$($db.Name).tables.json" + + if (-not $script:isWindows) { + $temppath = $temppath.Replace("\", "/") + } + Set-Content -Path $temppath -Value ($results | ConvertTo-Json -Depth 5) + Get-ChildItem -Path $temppath + } catch { + Stop-Function -Message "Something went wrong writing the results to the $Path" -Target $Path -Continue -ErrorRecord $_ + } + } else { + Write-Message -Message "No tables to save for database $($db.Name) on $($server.Name)" -Level Verbose + } + } +} \ No newline at end of file diff --git a/functions/New-DbaLogin.ps1 b/functions/New-DbaLogin.ps1 index 3afe876b6b..89307605c6 100644 --- a/functions/New-DbaLogin.ps1 +++ b/functions/New-DbaLogin.ps1 @@ -142,7 +142,7 @@ function New-DbaLogin { [string]$MapToAsymmetricKey, [string]$MapToCredential, [object]$Sid, - [Alias("DefaulDB")] + [Alias("DefaultDB")] [parameter(ParameterSetName = "Password")] [parameter(ParameterSetName = "PasswordHash")] [string]$DefaultDatabase, @@ -419,7 +419,11 @@ function New-DbaLogin { try { if ($loginType -eq 'AsymmetricKey') { $sql = "CREATE LOGIN [$loginName] FROM ASYMMETRIC KEY [$currentAsymmetricKey]" } elseif ($loginType -eq 'Certificate') { $sql = "CREATE LOGIN [$loginName] FROM CERTIFICATE [$currentCertificate]" } - elseif ($loginType -eq "SqlLogin") { $sql = "CREATE LOGIN [$loginName] WITH PASSWORD = $currentHashedPassword HASHED" + $withParams } + elseif ($loginType -eq 'SqlLogin' -and $server.DatabaseEngineType -eq 'SqlAzureDatabase') { + $BSTR = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($SecurePassword) # Azure SQL doesn't support HASHED so we have to dump out the plain text password :( + $unsecurePassword = [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($BSTR) + $sql = "CREATE LOGIN [$loginName] WITH PASSWORD = '$unsecurePassword'" + } elseif ($loginType -eq 'SqlLogin' ) { $sql = "CREATE LOGIN [$loginName] WITH PASSWORD = $currentHashedPassword HASHED" + $withParams } else { $sql = "CREATE LOGIN [$loginName] FROM WINDOWS" + $withParams } $null = $server.Query($sql) diff --git a/functions/New-DbaXESession.ps1 b/functions/New-DbaXESession.ps1 index 072bfa692b..cb68a07cae 100644 --- a/functions/New-DbaXESession.ps1 +++ b/functions/New-DbaXESession.ps1 @@ -5,7 +5,7 @@ function New-DbaXESession { Creates a new XESession object - for the dogged. .DESCRIPTION - Creates a new XESession object - for the dogged (very manual, Import-DbaXESession is recommended). See the following for more info: + Creates a new XESession object - for the dogged (very manual, Import-DbaXESessionTemplate is recommended). See the following for more info: https://docs.microsoft.com/en-us/sql/relational-databases/extended-events/use-the-powershell-provider-for-extended-events diff --git a/functions/New-DbaXESmartCsvWriter.ps1 b/functions/New-DbaXESmartCsvWriter.ps1 index b9c6ec807d..e04c5e768d 100644 --- a/functions/New-DbaXESmartCsvWriter.ps1 +++ b/functions/New-DbaXESmartCsvWriter.ps1 @@ -40,7 +40,7 @@ function New-DbaXESmartCsvWriter { Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. .NOTES - Tags: ExtendedEvent, XE, XEvent + Tags: ExtendedEvent, XE, XEvent, SmartTarget Author: Chrissy LeMaire (@cl) | SmartTarget by Gianluca Sartori (@spaghettidba) Website: https://dbatools.io diff --git a/functions/New-DbaXESmartEmail.ps1 b/functions/New-DbaXESmartEmail.ps1 index 1b3c8456b8..5a6672c613 100644 --- a/functions/New-DbaXESmartEmail.ps1 +++ b/functions/New-DbaXESmartEmail.ps1 @@ -62,7 +62,7 @@ function New-DbaXESmartEmail { Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. .NOTES - Tags: ExtendedEvent, XE, XEvent + Tags: ExtendedEvent, XE, XEvent, SmartTarget Author: Chrissy LeMaire (@cl) | SmartTarget by Gianluca Sartori (@spaghettidba) Website: https://dbatools.io diff --git a/functions/New-DbaXESmartQueryExec.ps1 b/functions/New-DbaXESmartQueryExec.ps1 index 347879ecd8..450e39e51a 100644 --- a/functions/New-DbaXESmartQueryExec.ps1 +++ b/functions/New-DbaXESmartQueryExec.ps1 @@ -39,7 +39,7 @@ function New-DbaXESmartQueryExec { Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. .NOTES - Tags: ExtendedEvent, XE, XEvent + Tags: ExtendedEvent, XE, XEvent, SmartTarget Author: Chrissy LeMaire (@cl) | SmartTarget by Gianluca Sartori (@spaghettidba) Website: https://dbatools.io diff --git a/functions/New-DbaXESmartReplay.ps1 b/functions/New-DbaXESmartReplay.ps1 index ad0ea0b688..4ce63fd25e 100644 --- a/functions/New-DbaXESmartReplay.ps1 +++ b/functions/New-DbaXESmartReplay.ps1 @@ -45,7 +45,7 @@ function New-DbaXESmartReplay { Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. .NOTES - Tags: ExtendedEvent, XE, XEvent + Tags: ExtendedEvent, XE, XEvent, SmartTarget Author: Chrissy LeMaire (@cl) | SmartTarget by Gianluca Sartori (@spaghettidba) Website: https://dbatools.io diff --git a/functions/New-DbaXESmartTableWriter.ps1 b/functions/New-DbaXESmartTableWriter.ps1 index bc3ca0903b..1419cd5f48 100644 --- a/functions/New-DbaXESmartTableWriter.ps1 +++ b/functions/New-DbaXESmartTableWriter.ps1 @@ -58,7 +58,7 @@ function New-DbaXESmartTableWriter { Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. .NOTES - Tags: ExtendedEvent, XE, XEvent + Tags: ExtendedEvent, XE, XEvent, SmartTarget Author: Chrissy LeMaire (@cl) | SmartTarget by Gianluca Sartori (@spaghettidba) Website: https://dbatools.io diff --git a/functions/New-DbatoolsSupportPackage.ps1 b/functions/New-DbatoolsSupportPackage.ps1 index 8a5472546f..44cb4b5ef2 100644 --- a/functions/New-DbatoolsSupportPackage.ps1 +++ b/functions/New-DbatoolsSupportPackage.ps1 @@ -23,6 +23,9 @@ function New-DbatoolsSupportPackage { Name of additional variables to attach. This allows you to add the content of variables to the support package, if you believe them to be relevant to the case. + .PARAMETER PassThru + Returns file object that was created during execution. + .PARAMETER WhatIf If this switch is enabled, no actions are performed but informational messages will be displayed that explain what would happen if the command were to run. @@ -59,6 +62,9 @@ function New-DbatoolsSupportPackage { [string[]] $Variables, + [switch] + $PassThru, + [switch] [Alias('Silent')]$EnableException ) @@ -161,8 +167,11 @@ This will make it easier for us to troubleshoot and you won't be sending us the $hash["History"] = Get-History Write-Message -Level Output -Message "Collecting list of loaded modules (Get-Module)" $hash["Modules"] = Get-Module - Write-Message -Level Output -Message "Collecting list of loaded snapins (Get-PSSnapin)" - $hash["SnapIns"] = Get-PSSnapin + # Snapins not supported in Core: https://github.com/PowerShell/PowerShell/issues/6135 + if ($PSVersionTable.PSEdition -ne 'Core') { + Write-Message -Level Output -Message "Collecting list of loaded snapins (Get-PSSnapin)" + $hash["SnapIns"] = Get-PSSnapin + } Write-Message -Level Output -Message "Collecting list of loaded assemblies (Name, Version, and Location)" $hash["Assemblies"] = [appdomain]::CurrentDomain.GetAssemblies() | Select-Object CodeBase, FullName, Location, ImageRuntimeVersion, GlobalAssemblyCache, IsDynamic @@ -186,6 +195,9 @@ This will make it easier for us to troubleshoot and you won't be sending us the } Remove-Item -Path $filePathXml -ErrorAction Ignore + if ($PassThru) { + Get-Item $filePathZip + } } } end { diff --git a/functions/Publish-DbaDacPackage.ps1 b/functions/Publish-DbaDacPackage.ps1 index f4511d5da5..af884ee73c 100644 --- a/functions/Publish-DbaDacPackage.ps1 +++ b/functions/Publish-DbaDacPackage.ps1 @@ -45,6 +45,12 @@ function Publish-DbaDacPackage { .PARAMETER IncludeSqlCmdVars If this switch is enabled, SqlCmdVars in publish.xml will have their values overwritten. + .PARAMETER WhatIf + Shows what would happen if the command were to run. No actions are actually performed. + + .PARAMETER Confirm + Prompts you for confirmation before executing any changing operations within the command. + .PARAMETER EnableException By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. @@ -69,23 +75,25 @@ function Publish-DbaDacPackage { PS C:\> $options.DeployOptions.DropObjectsNotInSource = $true PS C:\> Publish-DbaDacPackage -SqlInstance sql2016 -Database DB1 -DacOption $options -Path c:\temp\db.dacpac - Uses DacOption object to set Deployment Options and updates DB1 database on sql2016 from the db.dacpac dacpac file, dropping objects that are missing from source + Uses DacOption object to set Deployment Options and updates DB1 database on sql2016 from the db.dacpac dacpac file, dropping objects that are missing from source. .EXAMPLE - PS C:\> Publish-DbaDacPackage -SqlInstance sql2017 -Database WideWorldImporters -Path C:\temp\sql2016-WideWorldImporters.dacpac -PublishXml C:\temp\sql2016-WideWorldImporters-publish.xml + PS C:\> Publish-DbaDacPackage -SqlInstance sql2017 -Database WideWorldImporters -Path C:\temp\sql2016-WideWorldImporters.dacpac -PublishXml C:\temp\sql2016-WideWorldImporters-publish.xml -Confirm - Updates WideWorldImporters on sql2017 from the sql2016-WideWorldImporters.dacpac using the sql2016-WideWorldImporters-publish.xml publish profile + Updates WideWorldImporters on sql2017 from the sql2016-WideWorldImporters.dacpac using the sql2016-WideWorldImporters-publish.xml publish profile. Prompts for confirmation. .EXAMPLE PS C:\> New-DbaDacProfile -SqlInstance sql2016 -Database db2 -Path C:\temp PS C:\> Export-DbaDacPackage -SqlInstance sql2016 -Database db2 | Publish-DbaDacPackage -PublishXml C:\temp\sql2016-db2-publish.xml -Database db1, db2 -SqlInstance sql2017 - Creates a publish profile at C:\temp\sql2016-db2-publish.xml, exports the .dacpac to $home\Documents\sql2016-db2.dacpac + Creates a publish profile at C:\temp\sql2016-db2-publish.xml, exports the .dacpac to $home\Documents\sql2016-db2.dacpac. Does not prompt for confirmation. then publishes it to the sql2017 server database db2 .EXAMPLE PS C:\> $loc = "C:\Users\bob\source\repos\Microsoft.Data.Tools.Msbuild\lib\net46\Microsoft.SqlServer.Dac.dll" - PS C:\> Publish-DbaDacPackage -SqlInstance "local" -Database WideWorldImporters -Path C:\temp\WideWorldImporters.dacpac -PublishXml C:\temp\WideWorldImporters.publish.xml -DacFxPath $loc + PS C:\> Publish-DbaDacPackage -SqlInstance "local" -Database WideWorldImporters -Path C:\temp\WideWorldImporters.dacpac -PublishXml C:\temp\WideWorldImporters.publish.xml -DacFxPath $loc -Confirm + + Publishes the dacpac using a specific dacfx library. Prompts for confirmation. .EXAMPLE PS C:\> Publish-DbaDacPackage -SqlInstance sql2017 -Database WideWorldImporters -Path C:\temp\sql2016-WideWorldImporters.dacpac -PublishXml C:\temp\sql2016-WideWorldImporters-publish.xml -GenerateDeploymentScript -ScriptOnly @@ -97,7 +105,7 @@ function Publish-DbaDacPackage { Does not deploy the changes, but will generate the deployment report that would be executed against WideWorldImporters. #> - [CmdletBinding(DefaultParameterSetName = 'Obj')] + [CmdletBinding(DefaultParameterSetName = 'Obj', SupportsShouldProcess, ConfirmImpact = 'Medium')] param ( [Alias("ServerInstance", "SqlServer")] [DbaInstance[]]$SqlInstance, @@ -161,10 +169,10 @@ function Publish-DbaDacPackage { return $instance.ToString().Replace('\', '-').Replace('(', '').Replace(')', '') } - + if ((Test-Bound -Not -ParameterName 'DacfxPath') -and (-not $script:core)) { $dacfxPath = "$script:PSModuleRoot\bin\smo\Microsoft.SqlServer.Dac.dll" - + if ((Test-Path $dacfxPath) -eq $false) { Stop-Function -Message 'No usable version of Dac Fx found.' -EnableException $EnableException return @@ -177,7 +185,7 @@ function Publish-DbaDacPackage { } } } - + #Check Option object types - should have a specific type if ($Type -eq 'Dacpac') { if ($DacOption -and $DacOption -isnot [Microsoft.SqlServer.Dac.PublishOptions]) { @@ -193,7 +201,9 @@ function Publish-DbaDacPackage { } process { - if (Test-FunctionInterrupt) { return } + if (Test-FunctionInterrupt) { + return + } if (-not (Test-Path -Path $Path)) { Stop-Function -Message "$Path not found!" @@ -282,8 +292,11 @@ function Publish-DbaDacPackage { } catch { Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $server -Continue } + try { - $null = $output = Register-ObjectEvent -InputObject $dacServices -EventName "Message" -SourceIdentifier "msg" -Action { $EventArgs.Message.Message } + $null = $output = Register-ObjectEvent -InputObject $dacServices -EventName "Message" -SourceIdentifier "msg" -ErrorAction SilentlyContinue -Action { + $EventArgs.Message.Message + } #Perform proper action depending on the Type if ($Type -eq 'Dacpac') { if ($ScriptOnly) { @@ -293,65 +306,70 @@ function Publish-DbaDacPackage { if (!$options.DatabaseScriptPath) { Stop-Function -Message "DatabaseScriptPath option should be specified when running with -ScriptOnly" -EnableException $true } - Write-Message -Level Verbose -Message "Generating script." - $result = $dacServices.Script($dacPackage, $dbname, $options) + if ($Pscmdlet.ShouldProcess($instance, "Generating script")) { + $result = $dacServices.Script($dacPackage, $dbname, $options) + } } else { - Write-Message -Level Verbose -Message "Executing Dacpac publish." - $result = $dacServices.Publish($dacPackage, $dbname, $options) + if ($Pscmdlet.ShouldProcess($instance, "Executing Dacpac publish")) { + $result = $dacServices.Publish($dacPackage, $dbname, $options) + } } } elseif ($Type -eq 'Bacpac') { - Write-Message -Level Verbose -Message "Executing Bacpac import." - $dacServices.ImportBacpac($bacPackage, $dbname, $options, $null) + if ($Pscmdlet.ShouldProcess($instance, "Executing Bacpac import")) { + $dacServices.ImportBacpac($bacPackage, $dbname, $options, $null) + } } } catch [Microsoft.SqlServer.Dac.DacServicesException] { Stop-Function -Message "Deployment failed" -ErrorRecord $_ -Continue } finally { Unregister-Event -SourceIdentifier "msg" - if ($options.GenerateDeploymentReport) { - $deploymentReport = Join-Path $OutputPath "$cleaninstance-$dbname`_Result.DeploymentReport_$timeStamp.xml" - $result.DeploymentReport | Out-File $deploymentReport - Write-Message -Level Verbose -Message "Deployment Report - $deploymentReport." - } - if ($options.GenerateDeploymentScript) { - Write-Message -Level Verbose -Message "Database change script - $($options.DatabaseScriptPath)." - if ((Test-Path $options.MasterDbScriptPath)) { - Write-Message -Level Verbose -Message "Master database change script - $($result.MasterDbScript)." + if ($Pscmdlet.ShouldProcess($instance, "Generating deployment report and output")) { + if ($options.GenerateDeploymentReport) { + $deploymentReport = Join-Path $OutputPath "$cleaninstance-$dbname`_Result.DeploymentReport_$timeStamp.xml" + $result.DeploymentReport | Out-File $deploymentReport + Write-Message -Level Verbose -Message "Deployment Report - $deploymentReport." } - } - $resultoutput = ($output.output -join "`r`n" | Out-String).Trim() - if ($resultoutput -match "Failed" -and ($options.GenerateDeploymentReport -or $options.GenerateDeploymentScript)) { - Write-Message -Level Warning -Message "Seems like the attempt to publish/script may have failed. If scripts have not generated load dacpac into Visual Studio to check SQL is valid." - } - $server = [dbainstance]$instance - if ($Type -eq 'Dacpac') { - $output = [pscustomobject]@{ - ComputerName = $server.ComputerName - InstanceName = $server.InstanceName - SqlInstance = $server.FullName - Database = $dbname - Result = $resultoutput - Dacpac = $Path - PublishXml = $PublishXml - ConnectionString = $connstring - DatabaseScriptPath = $options.DatabaseScriptPath - MasterDbScriptPath = $options.MasterDbScriptPath - DeploymentReport = $DeploymentReport - DeployOptions = $options.DeployOptions | Select-Object -Property * -ExcludeProperty "SqlCommandVariableValues" - SqlCmdVariableValues = $options.DeployOptions.SqlCommandVariableValues.Keys + if ($options.GenerateDeploymentScript) { + Write-Message -Level Verbose -Message "Database change script - $($options.DatabaseScriptPath)." + if ((Test-Path $options.MasterDbScriptPath)) { + Write-Message -Level Verbose -Message "Master database change script - $($result.MasterDbScript)." + } } - } elseif ($Type -eq 'Bacpac') { - $output = [pscustomobject]@{ - ComputerName = $server.ComputerName - InstanceName = $server.InstanceName - SqlInstance = $server.FullName - Database = $dbname - Result = $resultoutput - Bacpac = $Path - ConnectionString = $connstring - DeployOptions = $options + $resultoutput = ($output.output -join "`r`n" | Out-String).Trim() + if ($resultoutput -match "Failed" -and ($options.GenerateDeploymentReport -or $options.GenerateDeploymentScript)) { + Write-Message -Level Warning -Message "Seems like the attempt to publish/script may have failed. If scripts have not generated load dacpac into Visual Studio to check SQL is valid." + } + $server = [dbainstance]$instance + if ($Type -eq 'Dacpac') { + $output = [pscustomobject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.InstanceName + SqlInstance = $server.FullName + Database = $dbname + Result = $resultoutput + Dacpac = $Path + PublishXml = $PublishXml + ConnectionString = $connstring + DatabaseScriptPath = $options.DatabaseScriptPath + MasterDbScriptPath = $options.MasterDbScriptPath + DeploymentReport = $DeploymentReport + DeployOptions = $options.DeployOptions | Select-Object -Property * -ExcludeProperty "SqlCommandVariableValues" + SqlCmdVariableValues = $options.DeployOptions.SqlCommandVariableValues.Keys + } + } elseif ($Type -eq 'Bacpac') { + $output = [pscustomobject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.InstanceName + SqlInstance = $server.FullName + Database = $dbname + Result = $resultoutput + Bacpac = $Path + ConnectionString = $connstring + DeployOptions = $options + } } + $output | Select-DefaultView -Property $defaultcolumns } - $output | Select-DefaultView -Property $defaultcolumns } } } diff --git a/functions/Read-DbaBackupHeader.ps1 b/functions/Read-DbaBackupHeader.ps1 index 3598fe051e..89fd18f8ac 100644 --- a/functions/Read-DbaBackupHeader.ps1 +++ b/functions/Read-DbaBackupHeader.ps1 @@ -79,7 +79,7 @@ function Read-DbaBackupHeader { Gets a list of all .bak files on the \\nas\sql share and reads the headers using the server named "sql2016". This means that the server, sql2016, must have read access to the \\nas\sql share. .EXAMPLE - PS C:\> Read-DbaBackupHeader -Path https://dbatoolsaz.blob.core.windows.net/azbackups/restoretime/restoretime_201705131850.bak -AzureCredential AzureBackupUser + PS C:\> Read-DbaBackupHeader -SqlInstance sql2016 -Path https://dbatoolsaz.blob.core.windows.net/azbackups/restoretime/restoretime_201705131850.bak -AzureCredential AzureBackupUser Gets the backup header information from the SQL Server backup file stored at https://dbatoolsaz.blob.core.windows.net/azbackups/restoretime/restoretime_201705131850.bak on Azure diff --git a/functions/Remove-DbaAgReplica.ps1 b/functions/Remove-DbaAgReplica.ps1 index 88669ca186..5fdbbfcd55 100644 --- a/functions/Remove-DbaAgReplica.ps1 +++ b/functions/Remove-DbaAgReplica.ps1 @@ -78,7 +78,7 @@ function Remove-DbaAgReplica { foreach ($agreplica in $InputObject) { if ($Pscmdlet.ShouldProcess($agreplica.Parent.Parent.Name, "Removing availability group replica $agreplica")) { try { - $agreplica.Parent.AvailabilityGroupReplicas[$agreplica.Name].Drop() + $agreplica.Drop() [pscustomobject]@{ ComputerName = $agreplica.ComputerName InstanceName = $agreplica.InstanceName diff --git a/functions/Remove-DbaDatabaseSafely.ps1 b/functions/Remove-DbaDatabaseSafely.ps1 index 6f91fd831e..50d9cc0a04 100644 --- a/functions/Remove-DbaDatabaseSafely.ps1 +++ b/functions/Remove-DbaDatabaseSafely.ps1 @@ -143,7 +143,7 @@ function Remove-DbaDatabaseSafely { return } - $sourceserver = Connect-SqlInstance -SqlInstance $SqlInstance -SqlCredential $sqlCredential -ParameterConnection + $sourceserver = Connect-SqlInstance -SqlInstance $SqlInstance -SqlCredential $sqlCredential if (-not $destination) { $destination = $sqlinstance diff --git a/functions/Remove-DbaOrphanUser.ps1 b/functions/Remove-DbaDbOrphanUser.ps1 similarity index 94% rename from functions/Remove-DbaOrphanUser.ps1 rename to functions/Remove-DbaDbOrphanUser.ps1 index 8c2037318b..4d9661ecfd 100644 --- a/functions/Remove-DbaOrphanUser.ps1 +++ b/functions/Remove-DbaDbOrphanUser.ps1 @@ -1,5 +1,5 @@ #ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# -function Remove-DbaOrphanUser { +function Remove-DbaDbOrphanUser { <# .SYNOPSIS Drop orphan users with no existing login to map @@ -11,7 +11,7 @@ function Remove-DbaOrphanUser { If user owns more than one schema, the owner of the schemas that does not have the same name as the user, will be changed to 'dbo'. If schemas have underlying objects, you must specify the -Force parameter so the user can be dropped. - If exists a login to map the drop will not be performed unless you specify the -Force parameter (only when calling from Repair-DbaOrphanUser. + If exists a login to map the drop will not be performed unless you specify the -Force parameter (only when calling from Repair-DbaDbOrphanUser. .PARAMETER SqlInstance The target SQL Server instance or instances. @@ -53,35 +53,35 @@ function Remove-DbaOrphanUser { License: MIT https://opensource.org/licenses/MIT .LINK - https://dbatools.io/Remove-DbaOrphanUser + https://dbatools.io/Remove-DbaDbOrphanUser .EXAMPLE - PS C:\> Remove-DbaOrphanUser -SqlInstance sql2005 + PS C:\> Remove-DbaDbOrphanUser -SqlInstance sql2005 Finds and drops all orphan users without matching Logins in all databases present on server 'sql2005'. .EXAMPLE - PS C:\> Remove-DbaOrphanUser -SqlInstance sqlserver2014a -SqlCredential $cred + PS C:\> Remove-DbaDbOrphanUser -SqlInstance sqlserver2014a -SqlCredential $cred Finds and drops all orphan users without matching Logins in all databases present on server 'sqlserver2014a'. SQL Server authentication will be used in connecting to the server. .EXAMPLE - PS C:\> Remove-DbaOrphanUser -SqlInstance sqlserver2014a -Database db1, db2 -Force + PS C:\> Remove-DbaDbOrphanUser -SqlInstance sqlserver2014a -Database db1, db2 -Force Finds and drops orphan users even if they have a matching Login on both db1 and db2 databases. .EXAMPLE - PS C:\> Remove-DbaOrphanUser -SqlInstance sqlserver2014a -ExcludeDatabase db1, db2 -Force + PS C:\> Remove-DbaDbOrphanUser -SqlInstance sqlserver2014a -ExcludeDatabase db1, db2 -Force Finds and drops orphan users even if they have a matching Login from all databases except db1 and db2. .EXAMPLE - PS C:\> Remove-DbaOrphanUser -SqlInstance sqlserver2014a -User OrphanUser + PS C:\> Remove-DbaDbOrphanUser -SqlInstance sqlserver2014a -User OrphanUser Removes user OrphanUser from all databases only if there is no matching login. .EXAMPLE - PS C:\> Remove-DbaOrphanUser -SqlInstance sqlserver2014a -User OrphanUser -Force + PS C:\> Remove-DbaDbOrphanUser -SqlInstance sqlserver2014a -User OrphanUser -Force Removes user OrphanUser from all databases even if they have a matching Login. Any schema that the user owns will change ownership to dbo. @@ -103,9 +103,7 @@ function Remove-DbaOrphanUser { [Alias('Silent')] [switch]$EnableException ) - process { - foreach ($Instance in $SqlInstance) { try { $server = Connect-SqlInstance -SqlInstance $Instance -SqlCredential $SqlCredential @@ -142,8 +140,8 @@ function Remove-DbaOrphanUser { } } - if ($StackSource -eq "Repair-DbaOrphanUser") { - Write-Message -Level Verbose -Message "Call origin: Repair-DbaOrphanUser." + if ($StackSource -eq "Repair-DbaDbOrphanUser") { + Write-Message -Level Verbose -Message "Call origin: Repair-DbaDbOrphanUser." #Will use collection from parameter ($User) } else { Write-Message -Level Verbose -Message "Validating users on database $db." @@ -164,8 +162,8 @@ function Remove-DbaOrphanUser { $ExistLogin = $null - if ($StackSource -ne "Repair-DbaOrphanUser") { - #Need to validate Existing Login because the call does not came from Repair-DbaOrphanUser + if ($StackSource -ne "Repair-DbaDbOrphanUser") { + #Need to validate Existing Login because the call does not came from Repair-DbaDbOrphanUser $ExistLogin = $server.logins | Where-Object { $_.Isdisabled -eq $False -and $_.IsSystemObject -eq $False -and @@ -310,6 +308,7 @@ function Remove-DbaOrphanUser { } } end { - Test-DbaDeprecation -DeprecatedOn "1.0.0" -EnableException:$false -Alias Remove-SqlOrphanUser + Test-DbaDeprecation -DeprecatedOn 1.0.0 -Alias Remove-SqlOrphanUser + Test-DbaDeprecation -DeprecatedOn 1.0.0 -Alias Remove-DbaOrphanUser } } \ No newline at end of file diff --git a/functions/Remove-DbaTrace.ps1 b/functions/Remove-DbaTrace.ps1 index dd2d4fb650..86b298112c 100644 --- a/functions/Remove-DbaTrace.ps1 +++ b/functions/Remove-DbaTrace.ps1 @@ -86,7 +86,7 @@ function Remove-DbaTrace { $stopsql = "sp_trace_setstatus $traceid, 0" $removesql = "sp_trace_setstatus $traceid, 2" - if ($Pscmdlet.ShouldProcess($traceid, "Removing the trace flag")) { + if ($Pscmdlet.ShouldProcess($traceid, "Removing the trace")) { try { $server.Query($stopsql) if (Get-DbaTrace -SqlInstance $server -Id $traceid) { @@ -106,4 +106,4 @@ function Remove-DbaTrace { } } } -} \ No newline at end of file +} diff --git a/functions/Repair-DbaOrphanUser.ps1 b/functions/Repair-DbaDbOrphanUser.ps1 similarity index 89% rename from functions/Repair-DbaOrphanUser.ps1 rename to functions/Repair-DbaDbOrphanUser.ps1 index 6853f94140..9c4fef3585 100644 --- a/functions/Repair-DbaOrphanUser.ps1 +++ b/functions/Repair-DbaDbOrphanUser.ps1 @@ -1,5 +1,5 @@ #ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# -function Repair-DbaOrphanUser { +function Repair-DbaDbOrphanUser { <# .SYNOPSIS Finds orphan users with existing login and remaps them. @@ -56,35 +56,35 @@ function Repair-DbaOrphanUser { License: MIT https://opensource.org/licenses/MIT .LINK - https://dbatools.io/Repair-DbaOrphanUser + https://dbatools.io/Repair-DbaDbOrphanUser .EXAMPLE - PS C:\> Repair-DbaOrphanUser -SqlInstance sql2005 + PS C:\> Repair-DbaDbOrphanUser -SqlInstance sql2005 Finds and repairs all orphan users of all databases present on server 'sql2005' .EXAMPLE - PS C:\> Repair-DbaOrphanUser -SqlInstance sqlserver2014a -SqlCredential $cred + PS C:\> Repair-DbaDbOrphanUser -SqlInstance sqlserver2014a -SqlCredential $cred Finds and repair all orphan users in all databases present on server 'sqlserver2014a'. SQL credentials are used to authenticate to the server. .EXAMPLE - PS C:\> Repair-DbaOrphanUser -SqlInstance sqlserver2014a -Database db1, db2 + PS C:\> Repair-DbaDbOrphanUser -SqlInstance sqlserver2014a -Database db1, db2 Finds and repairs all orphan users in both db1 and db2 databases. .EXAMPLE - PS C:\> Repair-DbaOrphanUser -SqlInstance sqlserver2014a -Database db1 -Users OrphanUser + PS C:\> Repair-DbaDbOrphanUser -SqlInstance sqlserver2014a -Database db1 -Users OrphanUser Finds and repairs user 'OrphanUser' in 'db1' database. .EXAMPLE - PS C:\> Repair-DbaOrphanUser -SqlInstance sqlserver2014a -Users OrphanUser + PS C:\> Repair-DbaDbOrphanUser -SqlInstance sqlserver2014a -Users OrphanUser Finds and repairs user 'OrphanUser' on all databases .EXAMPLE - PS C:\> Repair-DbaOrphanUser -SqlInstance sqlserver2014a -RemoveNotExisting + PS C:\> Repair-DbaDbOrphanUser -SqlInstance sqlserver2014a -RemoveNotExisting Finds all orphan users of all databases present on server 'sqlserver2014a'. Removes all users that do not have matching Logins. @@ -199,14 +199,14 @@ function Repair-DbaOrphanUser { #With the collection complete invoke remove. if ($RemoveNotExisting) { if ($Force) { - if ($Pscmdlet.ShouldProcess($db.Name, "Remove-DbaOrphanUser")) { - Write-Message -Level Verbose -Message "Calling 'Remove-DbaOrphanUser' with -Force." - Remove-DbaOrphanUser -SqlInstance $server -Database $db.Name -User $UsersToRemove -Force + if ($Pscmdlet.ShouldProcess($db.Name, "Remove-DbaDbOrphanUser")) { + Write-Message -Level Verbose -Message "Calling 'Remove-DbaDbOrphanUser' with -Force." + Remove-DbaDbOrphanUser -SqlInstance $server -Database $db.Name -User $UsersToRemove -Force } } else { - if ($Pscmdlet.ShouldProcess($db.Name, "Remove-DbaOrphanUser")) { - Write-Message -Level Verbose -Message "Calling 'Remove-DbaOrphanUser'." - Remove-DbaOrphanUser -SqlInstance $server -Database $db.Name -User $UsersToRemove + if ($Pscmdlet.ShouldProcess($db.Name, "Remove-DbaDbOrphanUser")) { + Write-Message -Level Verbose -Message "Calling 'Remove-DbaDbOrphanUser'." + Remove-DbaDbOrphanUser -SqlInstance $server -Database $db.Name -User $UsersToRemove } } } @@ -225,6 +225,7 @@ function Repair-DbaOrphanUser { } } end { - Test-DbaDeprecation -DeprecatedOn "1.0.0" -EnableException:$false -Alias Repair-SqlOrphanUser + Test-DbaDeprecation -DeprecatedOn 1.0.0 -Alias Repair-DbaOrphanUser + Test-DbaDeprecation -DeprecatedOn 1.0.0 -Alias Repair-SqlOrphanUser } } \ No newline at end of file diff --git a/functions/Reset-DbaAdmin.ps1 b/functions/Reset-DbaAdmin.ps1 index 7e048b6bfd..414e7f991f 100644 --- a/functions/Reset-DbaAdmin.ps1 +++ b/functions/Reset-DbaAdmin.ps1 @@ -182,11 +182,12 @@ function Reset-DbaAdmin { Stop-Function -Continue -Message "Remote PowerShell access not enabled on on $instance or access denied. Quitting." } - # Test Connection first using Test-Connection which requires ICMP access then failback to tcp if pings are blocked + # Test Connection first using ping class which requires ICMP access then failback to tcp if pings are blocked Write-Message -Level Verbose -Message "Testing connection to $baseaddress" - $testconnect = Test-Connection -ComputerName $baseaddress -Count 1 -Quiet - - if ($testconnect -eq $false) { + $ping = New-Object System.Net.NetworkInformation.Ping + $timeout = 1000 #milliseconds + $reply = $ping.Send($baseaddress, $timeout) + if ($reply.Status -ne 'Success') { Write-Message -Level Verbose -Message "First attempt using ICMP failed. Trying to connect using sockets. This may take up to 20 seconds." $tcp = New-Object System.Net.Sockets.TcpClient try { diff --git a/functions/Resolve-DbaNetworkName.ps1 b/functions/Resolve-DbaNetworkName.ps1 index c672cb1660..6a55fb0236 100644 --- a/functions/Resolve-DbaNetworkName.ps1 +++ b/functions/Resolve-DbaNetworkName.ps1 @@ -94,189 +94,165 @@ function Resolve-DbaNetworkName { [Alias('Silent')] [switch]$EnableException ) - + begin { + Function Get-ComputerDomainName { + Param ( + $FQDN, + $ComputerName + ) + # deduce the domain name based on resolved name + original request + if ($fqdn -notmatch "\.") { + if ($ComputerName -match "\.") { + return $ComputerName.Substring($ComputerName.IndexOf(".") + 1) + } else { + return "$env:USERDNSDOMAIN".ToLower() + } + } else { + return $fqdn.Substring($fqdn.IndexOf(".") + 1) + } + } + } process { if (-not (Test-Windows -NoWarn)) { Write-Message -Level Verbose -Message "Non-Windows client detected. Turbo (DNS resolution only) set to $true" $Turbo = $true } - foreach ($Computer in $ComputerName) { - $conn = $ipaddress = $null + foreach ($computer in $ComputerName) { + if ($computer.IsLocalhost) { + $cName = $env:COMPUTERNAME + } else { + $cName = $computer.ComputerName + } - $OGComputer = $Computer + # resolve IP address + try { + Write-Message -Level VeryVerbose -Message "Resolving $cName using .NET.Dns GetHostEntry" + $resolved = [System.Net.Dns]::GetHostEntry($cName) + $ipaddresses = $resolved.AddressList | Sort-Object -Property AddressFamily # prioritize IPv4 + $ipaddress = $ipaddresses[0].IPAddressToString + } catch { + Stop-Function -Message "DNS name $cName not found" -Continue -ErrorRecord $_ + } - if ($Computer.IsLocalhost) { - $Computer = $env:COMPUTERNAME - } else { - $Computer = $Computer.ComputerName + # try to resolve IP into a hostname + try { + Write-Message -Level VeryVerbose -Message "Resolving $ipaddress using .NET.Dns GetHostByAddress" + $fqdn = [System.Net.Dns]::GetHostByAddress($ipaddress).HostName + } catch { + Write-Message -Level Debug -Message "Failed to resolve $ipaddress using .NET.Dns GetHostByAddress" + $fqdn = $resolved.HostName } + $dnsDomain = Get-ComputerDomainName -FQDN $fqdn -ComputerName $cName + # augment fqdn if needed + if ($fqdn -notmatch "\." -and $dnsDomain) { + $fqdn = "$fqdn.$dnsdomain" + } + $hostname = $fqdn.Split(".")[0] + + # create an output object with some preliminary data gathered so far + $result = [PSCustomObject]@{ + InputName = $computer + ComputerName = $hostname.ToUpper() + IPAddress = $ipaddress + DNSHostname = $hostname + DNSDomain = $dnsdomain + Domain = $dnsdomain + DNSHostEntry = $fqdn + FQDN = $fqdn + FullComputerName = $cName + } if ($Turbo) { - try { - Write-Message -Level VeryVerbose -Message "Resolving $Computer using .NET.Dns GetHostEntry" - $ipaddress = ([System.Net.Dns]::GetHostEntry($Computer)).AddressList[0].IPAddressToString - Write-Message -Level VeryVerbose -Message "Resolving $ipaddress using .NET.Dns GetHostByAddress" - $fqdn = [System.Net.Dns]::GetHostByAddress($ipaddress).HostName - } catch { - try { - Write-Message -Level VeryVerbose -Message "Resolving $Computer and IP using .NET.Dns GetHostEntry" - $resolved = [System.Net.Dns]::GetHostEntry($Computer) - $ipaddress = $resolved.AddressList[0].IPAddressToString - $fqdn = $resolved.HostName - } catch { - Stop-Function -Message "DNS name not found" -Continue -ErrorRecord $_ - } - } - - if ($fqdn -notmatch "\.") { - if ($computer.ComputerName -match "\.") { - $dnsdomain = $computer.ComputerName.Substring($computer.ComputerName.IndexOf(".") + 1) - $fqdn = "$resolved.$dnsdomain" - } else { - $dnsdomain = "$env:USERDNSDOMAIN".ToLower() - if ($dnsdomain -match "\.") { - $fqdn = "$fqdn.$dnsdomain" - } - } - } + # that's a finish line for a Turbo mode + return $result + } - $hostname = $fqdn.Split(".")[0] - - [PSCustomObject]@{ - InputName = $OGComputer - ComputerName = $hostname.ToUpper() - IPAddress = $ipaddress - DNSHostname = $hostname - DNSDomain = $fqdn.Replace("$hostname.", "") - Domain = $fqdn.Replace("$hostname.", "") - DNSHostEntry = $fqdn - FQDN = $fqdn - FullComputerName = $fqdn + # finding out which IP to use by pinging all of them. The first to respond is the one. + $ping = New-Object System.Net.NetworkInformation.Ping + $timeout = 1000 #milliseconds + foreach ($ip in $ipaddresses) { + $reply = $ping.Send($ip, $timeout) + if ($reply.Status -eq 'Success') { + $ipaddress = $ip.IPAddressToString + break } + } + $result.IPAddress = $ipaddress - } else { - - + # re-try DNS reverse zone lookup if the IP to use is not the first one + if ($ipaddresses[0].IPAddressToString -ne $ipaddress) { try { - $ipaddress = ((Test-Connection -ComputerName $Computer -Count 1 -ErrorAction Stop).Ipv4Address).IPAddressToString - } catch { - try { - if ($env:USERDNSDOMAIN) { - $ipaddress = ((Test-Connection -ComputerName "$Computer.$env:USERDNSDOMAIN" -Count 1 -ErrorAction SilentlyContinue).Ipv4Address).IPAddressToString - if ($ipaddress) { - $Computer = "$Computer.$env:USERDNSDOMAIN" - Write-Message -Level VeryVerbose -Message "IP Address from $Computer is $ipaddress" - } else { - Write-Message -Level VeryVerbose -Message "No IP Address returned from $Computer" - Write-Message -Level VeryVerbose -Message "Using .NET.Dns to resolve IP Address" - Resolve-DbaNetworkName -ComputerName $Computer -Turbo - continue - } - } - } catch { - $Computer = $OGComputer - $ipaddress = ([System.Net.Dns]::GetHostEntry($Computer)).AddressList[0].IPAddressToString + Write-Message -Level VeryVerbose -Message "Resolving $ipaddress using .NET.Dns GetHostByAddress" + $fqdn = [System.Net.Dns]::GetHostByAddress($ipaddress).HostName + # re-adjust DNS domain again + $dnsDomain = Get-ComputerDomainName -FQDN $fqdn -ComputerName $cName + # augment fqdn if needed + if ($fqdn -notmatch "\." -and $dnsDomain) { + $fqdn = "$fqdn.$dnsdomain" } + $hostname = $fqdn.Split(".")[0] + + # update result fields accordingly + $result.ComputerName = $hostname.ToUpper() + $result.DNSHostname = $hostname + $result.DNSDomain = $dnsdomain + $result.Domain = $dnsdomain + $result.DNSHostEntry = $fqdn + $result.FQDN = $fqdn + } catch { + Write-Message -Level VeryVerbose -Message "Failed to obtain a new name from $ipaddress, re-using $fqdn" } + } - if ($ipaddress) { - Write-Message -Level VeryVerbose -Message "IP Address from $Computer is $ipaddress" - } else { - Write-Message -Level VeryVerbose -Message "No IP Address returned from $Computer" - Write-Message -Level VeryVerbose -Message "Using .NET.Dns to resolve IP Address" - return (Resolve-DbaNetworkName -ComputerName $Computer -Turbo) - } - - if ($PSVersionTable.PSVersion.Major -gt 2) { - Write-Message -Level System -Message "Your PowerShell Version is $($PSVersionTable.PSVersion.Major)" - try { - try { - # if an alias (CNAME) is passed we should try to connect to the A name via CIM or WinRM - $ComputerNameIP = ([System.Net.Dns]::GetHostEntry($Computer)).AddressList[0].IPAddressToString - $RemoteComputer = [System.Net.Dns]::GetHostByAddress($ComputerNameIP).HostName - } catch { - $RemoteComputer = $Computer - } - Write-Message -Level VeryVerbose -Message "Getting computer information from $RemoteComputer" - $ScBlock = { - $IPGProps = [System.Net.NetworkInformation.IPGlobalProperties]::GetIPGlobalProperties() - return [pscustomobject]@{ - 'DNSDomain' = $IPGProps.DomainName - } - } - if (Test-Bound "Credential") { - $conn = Get-DbaCmObject -ClassName win32_ComputerSystem -ComputerName $RemoteComputer -Credential $Credential -EnableException - $DNSSuffix = Invoke-Command2 -ComputerName $RemoteComputer -ScriptBlock $ScBlock -Credential $Credential -ErrorAction Stop - } else { - $conn = Get-DbaCmObject -ClassName win32_ComputerSystem -ComputerName $RemoteComputer -EnableException - $DNSSuffix = Invoke-Command2 -ComputerName $RemoteComputer -ScriptBlock $ScBlock -ErrorAction Stop - } - } catch { - Write-Message -Level Verbose -Message "Unable to get computer information from $Computer" - } - if (!$conn) { - Write-Message -Level Verbose -Message "No WMI/CIM from $Computer. Getting HostName via .NET.Dns" - try { - $fqdn = ([System.Net.Dns]::GetHostEntry($Computer)).HostName - $hostname = $fqdn.Split(".")[0] - $suffix = $fqdn.Replace("$hostname.", "") - if ($hostname -eq $fqdn) { - $suffix = "" - } - $conn = [PSCustomObject]@{ - Name = $Computer - DNSHostname = $hostname - Domain = $suffix - } - $DNSSuffix = [PSCustomObject]@{ - DNSDomain = $suffix - } - } catch { - Stop-Function -Message "No .NET.Dns information from $Computer" -ErrorRecord $_ -Continue - } - } + Write-Message -Level Debug -Message "Getting domain name from the remote host $fqdn" + try { + $ScBlock = { + return [System.Net.NetworkInformation.IPGlobalProperties]::GetIPGlobalProperties().DomainName } - if ($DNSSuffix.DNSDomain.Length -eq 0) { - $FullComputerName = $conn.DNSHostname - } else { - $FullComputerName = $conn.DNSHostname + "." + $DNSSuffix.DNSDomain + $cParams = @{ + ComputerName = $cName + } + if ($Credential) { $cParams.Credential = $Credential } + + $conn = Get-DbaCmObject @cParams -ClassName win32_ComputerSystem -EnableException + if ($conn) { + # update results accordingly + $result.ComputerName = $conn.Name + $dnsHostname = $conn.DNSHostname + $dnsDomain = $conn.Domain + $result.FQDN = "$dnsHostname.$dnsDomain".TrimEnd('.') + $result.DNSHostName = $dnsHostname + $result.Domain = $dnsDomain } try { - Write-Message -Level VeryVerbose -Message "Resolving $FullComputerName using .NET.Dns GetHostEntry" - $hostentry = ([System.Net.Dns]::GetHostEntry($FullComputerName)).HostName + Write-Message -Level Debug -Message "Getting DNS domain from the remote host $($cParams.ComputerName)" + $dnsSuffix = Invoke-Command2 @cParams -ScriptBlock $ScBlock -ErrorAction Stop -Raw + $result.DNSDomain = $dnsSuffix + if ($dnsSuffix) { + $fullComputerName = $result.DNSHostName + "." + $dnsSuffix + } else { + $fullComputerName = $result.DNSHostName + } + $result.FullComputerName = $fullComputerName } catch { - Stop-Function -Message ".NET.Dns GetHostEntry failed for $FullComputerName" -ErrorRecord $_ - } - - $fqdn = "$($conn.DNSHostname).$($conn.Domain)" - if ($fqdn -eq ".") { - Write-Message -Level VeryVerbose -Message "No full FQDN found. Setting to null" - $fqdn = $null - } - if ($FullComputerName -eq ".") { - Write-Message -Level VeryVerbose -Message "No DNS FQDN found. Setting to null" - $FullComputerName = $null - } - - if ($FullComputerName -ne "." -and $FullComputerName -notmatch "\." -and $conn.Domain -match "\.") { - $d = $conn.Domain - $FullComputerName = "$FullComputerName.$d" + Write-Message -Level Verbose -Message "Unable to get DNS domain information from $($cParams.ComputerName)" } + } catch { + Write-Message -Level Verbose -Message "Unable to get domain name from $($cParams.ComputerName)" + } - [PSCustomObject]@{ - InputName = $OGComputer - ComputerName = $conn.Name - IPAddress = $ipaddress - DNSHostName = $conn.DNSHostname - DNSDomain = $DNSSuffix.DNSDomain - Domain = $conn.Domain - DNSHostEntry = $hostentry - FQDN = $fqdn.TrimEnd(".") - FullComputerName = $FullComputerName - } + # getting a DNS host entry for the full name + try { + Write-Message -Level VeryVerbose -Message "Resolving $($result.FullComputerName) using .NET.Dns GetHostEntry" + $result.DNSHostEntry = ([System.Net.Dns]::GetHostEntry($result.FullComputerName)).HostName + } catch { + Write-Message -Level Verbose -Message ".NET.Dns GetHostEntry failed for $($result.FullComputerName)" } + + # returning the final result + return $result } } } \ No newline at end of file diff --git a/functions/Restart-DbaService.ps1 b/functions/Restart-DbaService.ps1 index df06f84e9e..7b2e3b6926 100644 --- a/functions/Restart-DbaService.ps1 +++ b/functions/Restart-DbaService.ps1 @@ -65,7 +65,7 @@ function Restart-DbaService { Gets the SQL Server related services on computers sql1, sql2 and sql3 and restarts them. .EXAMPLE - PS C:\> Restart-DbaService -ComputerName sql1,sql2 -Instance MSSQLSERVER + PS C:\> Restart-DbaService -ComputerName sql1,sql2 -InstanceName MSSQLSERVER Restarts the SQL Server services related to the default instance MSSQLSERVER on computers sql1 and sql2. diff --git a/functions/Restore-DbaDatabase.ps1 b/functions/Restore-DbaDatabase.ps1 index 12c0d1a490..6dca60d50c 100644 --- a/functions/Restore-DbaDatabase.ps1 +++ b/functions/Restore-DbaDatabase.ps1 @@ -139,10 +139,6 @@ function Restore-DbaDatabase { .PARAMETER Recover If set will perform recovery on the indicated database - .PARAMETER AllowContinue - By default, Restore-DbaDatabase will stop restoring any databases if it comes across an error. - Use this switch to enable it to restore all databases without issues. - .PARAMETER GetBackupInformation Passing a string value into this parameter will cause a global variable to be created holding the output of Get-DbaBackupInformation @@ -181,6 +177,9 @@ function Restore-DbaDatabase { .PARAMETER PageRestoreTailFolder This parameter passes in a location for the tail log backup required for page level restore + .PARAMETER AllowContinue + This parameter has been deprecated and will be removed in v1.0 + .PARAMETER EnableException By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. @@ -262,19 +261,22 @@ function Restore-DbaDatabase { .EXAMPLE PS C:\> $files = Get-ChildItem C:\dbatools\db1 - PS C:\> $files | Restore-DbaDatabase -SqlInstance server\instance1 ` - >> -DestinationFilePrefix prefix -DatabaseName Restored ` - >> -RestoreTime (get-date "14:58:30 22/05/2017") ` - >> -NoRecovery -WithReplace -StandbyDirectory C:\dbatools\standby + PS C:\> $params = @{ + >> SqlInstance = 'server\instance1' + >> DestinationFilePrefix = 'prefix' + >> DatabaseName ='Restored' + >> RestoreTime = (get-date "14:58:30 22/05/2017") + >> NoRecovery = $true + >> WithReplace = $true + >> StandbyDirectory = 'C:\dbatools\standby' + >> } >> - PS C:\> #It's in standby so we can peek at it + PS C:\> $files | Restore-DbaDatabase @params PS C:\> Invoke-DbaQuery -SQLInstance server\instance1 -Query "select top 1 * from Restored.dbo.steps order by dt desc" - PS C:\> #Not quite there so let's roll on a bit: - PS C:\> $files | Restore-DbaDatabase -SqlInstance server\instance1 ` - >> -DestinationFilePrefix prefix -DatabaseName Restored ` - >> -continue -WithReplace -RestoreTime (get-date "15:09:30 22/05/2017") ` - >> -StandbyDirectory C:\dbatools\standby - >> + PS C:\> $params.RestoredTime = (get-date "15:09:30 22/05/2017") + PS C:\> $params.NoRecovery = $false + PS C:\> $params.Add("Continue",$true) + PS C:\> $files | Restore-DbaDatabase @params PS C:\> Invoke-DbaQuery -SQLInstance server\instance1 -Query "select top 1 * from restored.dbo.steps order by dt desc" PS C:\> Restore-DbaDatabase -SqlInstance server\instance1 -DestinationFilePrefix prefix -DatabaseName Restored -Continue -WithReplace @@ -292,11 +294,10 @@ function Restore-DbaDatabase { .EXAMPLE PS C:\> Get-DbaBackupHistory - SqlInstance server\instance1 -Database ProdFinance -Last | Restore-DbaDatabase -PageRestore - PS C:\> $SuspectPage -PageRestoreTailFolder c:\temp -TrustDbBackupHistory -AllowContinues + PS C:\> $SuspectPage -PageRestoreTailFolder c:\temp -TrustDbBackupHistory Gets a list of Suspect Pages using Get-DbaSuspectPage. The uses Get-DbaBackupHistory and Restore-DbaDatabase to perform a restore of the suspect pages and bring them up to date If server\instance1 is Enterprise edition this will be done online, if not it will be performed offline - AllowContinue is required to make sure we cope with existing files .EXAMPLE PS C:\> $BackupHistory = Get-DbaBackupInformation -SqlInstance sql2005 -Path \\backups\sql2000\ProdDb @@ -359,7 +360,6 @@ function Restore-DbaDatabase { [parameter(ParameterSetName = "Restore")][string]$DestinationFileSuffix, [parameter(ParameterSetName = "Recovery")][switch]$Recover, [parameter(ParameterSetName = "Restore")][switch]$KeepCDC, - [switch]$AllowContinue, [string]$GetBackupInformation, [switch]$StopAfterGetBackupInformation, [string]$SelectBackupInformation, @@ -370,7 +370,8 @@ function Restore-DbaDatabase { [switch]$StopAfterTestBackupInformation, [parameter(Mandatory, ParameterSetName = "RestorePage")][object]$PageRestore, [parameter(Mandatory, ParameterSetName = "RestorePage")][string]$PageRestoreTailFolder, - [int]$StatementTimeout = 0 + [int]$StatementTimeout = 0, + [switch]$AllowContinue ) begin { Write-Message -Level InternalComment -Message "Starting" @@ -387,8 +388,8 @@ function Restore-DbaDatabase { $UseDestinationDefaultDirectories = $true $paramCount = 0 - if (!(Test-Bound "AllowContinue") -and $true -ne $AllowContinue) { - $AllowContinue = $false + if (Test-Bound "AllowContinue") { + Write-Message -Level Warning -Message "AllowContinue is deprecated and will be removed in v1.0" } if (Test-Bound "FileMapping") { $paramCount += 1 @@ -424,6 +425,11 @@ function Restore-DbaDatabase { Stop-Function -Category InvalidArgument -Message "The parameter DestinationFileStreamDirectory can only be specified together with DestinationDataDirectory" return } + if ((Test-Bound "ReuseSourceFolderStructure") -and (Test-Bound "UseDestinationDefaultDirectories")) { + Stop-Function -Category InvalidArgument -Message "The parameters UseDestinationDefaultDirectories and ReuseSourceFolderStructure cannot both be applied " + return + } + if (($null -ne $FileMapping) -or $ReuseSourceFolderStructure -or ($DestinationDataDirectory -ne '')) { $UseDestinationDefaultDirectories = $false } @@ -640,9 +646,11 @@ function Restore-DbaDatabase { if ($StopAfterFormatBackupInformation) { return } - - $FilteredBackupHistory = $BackupHistory | Select-DbaBackupInformation -RestoreTime $RestoreTime -IgnoreLogs:$IgnoreLogBackups -ContinuePoints $ContinuePoints -LastRestoreType $LastRestoreType -DatabaseName $DatabaseName - + if ($VerifyOnly) { + $FilteredBackupHistory = $BackupHistory + } else { + $FilteredBackupHistory = $BackupHistory | Select-DbaBackupInformation -RestoreTime $RestoreTime -IgnoreLogs:$IgnoreLogBackups -ContinuePoints $ContinuePoints -LastRestoreType $LastRestoreType -DatabaseName $DatabaseName + } if (Test-Bound -ParameterName SelectBackupInformation) { Write-Message -Message "Setting $SelectBackupInformation to FilteredBackupHistory" -Level Verbose Set-Variable -Name $SelectBackupInformation -Value $FilteredBackupHistory -Scope Global @@ -667,18 +675,13 @@ function Restore-DbaDatabase { $_.IsVerified -eq $True } | Select-Object -Property Database -Unique).Database -join ',' Write-Message -Message "$DbVerfied passed testing" -Level Verbose - if (($FilteredBackupHistory | Where-Object { - $_.IsVerified -eq $True - }).count -lt $FilteredBackupHistory.count) { + if ((@($FilteredBackupHistory | Where-Object { + $_.IsVerified -eq $True + })).count -lt $FilteredBackupHistory.count) { $DbUnVerified = ($FilteredBackupHistory | Where-Object { $_.IsVerified -eq $False } | Select-Object -Property Database -Unique).Database -join ',' - if ($AllowContinue) { - Write-Message -Message "$DbUnverified failed testing, AllowContinue set" -Level Verbose - } else { - Stop-Function -Message "Database $DbUnverified failed testing, AllowContinue not set, exiting" - return - } + Write-Message -Level Warning -Message "Database $DbUnverified failed testing, skipping" } If ($PSCmdlet.ParameterSetName -eq "RestorePage") { if (($FilteredBackupHistory.Database | select-Object -unique | Measure-Object).count -ne 1) { diff --git a/functions/Save-DbaDiagnosticQueryScript.ps1 b/functions/Save-DbaDiagnosticQueryScript.ps1 index 39e5e5727e..4328988210 100644 --- a/functions/Save-DbaDiagnosticQueryScript.ps1 +++ b/functions/Save-DbaDiagnosticQueryScript.ps1 @@ -66,7 +66,7 @@ function Save-DbaDiagnosticQueryScript { $glenberryrss = "http://www.sqlskills.com/blogs/glenn/feed/" $glenberrysql = @() - Write-Message -Level Output -Message "Downloading RSS Feed" + Write-Message -Level Verbose -Message "Downloading RSS Feed" $rss = [xml](get-webdata -uri $glenberryrss) $Feed = $rss.rss.Channel @@ -90,12 +90,15 @@ function Save-DbaDiagnosticQueryScript { break } } - Write-Message -Level Output -Message "Found $($glenberrysql.Count) documents to download" + Write-Message -Level Verbose -Message "Found $($glenberrysql.Count) documents to download" foreach ($doc in $glenberrysql) { try { - Write-Message -Level Output -Message "Downloading $($doc.URL)" + $link = $doc.URL.ToString().Replace('dl=0', 'dl=1') + Write-Message -Level Verbose -Message "Downloading $link)" + Write-ProgressHelper -Activity "Downloading Glenn Berry's most recent DMVs" -ExcludePercent -Message "Downloading $link" -StepNumber 1 $filename = "{0}\SQLServerDiagnosticQueries_{1}_{2}.sql" -f $Path, $doc.SQLVersion, "$($doc.FileYear)$($doc.FileMonth)" - Invoke-TlsWebRequest -Uri $doc.URL -OutFile $filename -ErrorAction Stop + Invoke-TlsWebRequest -Uri $link -OutFile $filename -ErrorAction Stop + Get-ChildItem -Path $filename } catch { Stop-Function -Message "Requesting and writing file failed: $_" -Target $filename -ErrorRecord $_ return diff --git a/functions/Select-DbaBackupInformation.ps1 b/functions/Select-DbaBackupInformation.ps1 index c5e67d8f61..fed647a31e 100644 --- a/functions/Select-DbaBackupInformation.ps1 +++ b/functions/Select-DbaBackupInformation.ps1 @@ -216,7 +216,7 @@ function Select-DbaBackupInformation { } if ($false -eq $IgnoreLogs) { - $FilteredLogs = $DatabaseHistory | Where-Object {$_.Type -in ('Log', 'Transaction Log') -and $_.Start -le $RestoreTime -and $_.LastLSN.ToString() -ge $LogBaseLsn -and $_.FirstLSN -ne $_.LastLSN} | Sort-Object -Property LastLsn, FirstLsn + $FilteredLogs = $DatabaseHistory | Where-Object {$_.Type -in ('Log', 'Transaction Log') -and $_.Start -le $RestoreTime -and $_.LastLSN -ge $LogBaseLsn -and $_.FirstLSN -ne $_.LastLSN} | Sort-Object -Property LastLsn, FirstLsn $GroupedLogs = $FilteredLogs | Group-Object -Property LastLSN, FirstLSN ForEach ($Group in $GroupedLogs) { $Log = $DatabaseHistory | Where-Object { $_.BackupSetID -eq $Group.group[0].BackupSetID } | select-object -First 1 @@ -235,4 +235,4 @@ function Select-DbaBackupInformation { $dbhistory } } -} \ No newline at end of file +} diff --git a/functions/Set-DbaAgentAlert.ps1 b/functions/Set-DbaAgentAlert.ps1 index 9dfaead2be..19e3297bc4 100644 --- a/functions/Set-DbaAgentAlert.ps1 +++ b/functions/Set-DbaAgentAlert.ps1 @@ -2,7 +2,7 @@ function Set-DbaAgentAlert { <# .SYNOPSIS - Set-DbaAgentAlert updates a the status of a SQL Agent Alert. + Set-DbaAgentAlert updates the status of a SQL Agent Alert. .DESCRIPTION Set-DbaAgentAlert updates an alert in the SQL Server Agent with parameters supplied. @@ -162,4 +162,4 @@ function Set-DbaAgentAlert { } } } -} \ No newline at end of file +} diff --git a/functions/Set-DbaAgentJob.ps1 b/functions/Set-DbaAgentJob.ps1 index 04b16ff1e9..c4da80c552 100644 --- a/functions/Set-DbaAgentJob.ps1 +++ b/functions/Set-DbaAgentJob.ps1 @@ -379,12 +379,12 @@ function Set-DbaAgentJob { } } - if ($EventLogLevel) { + if (Test-Bound -ParameterName EventLogLevel) { Write-Message -Message "Setting job event log level to $EventlogLevel" -Level Verbose $currentjob.EventLogLevel = $EventLogLevel } - if ($EmailLevel) { + if (Test-Bound -ParameterName EmailLevel) { # Check if the notifiction needs to be removed if ($EmailLevel -eq 0) { # Remove the operator @@ -403,7 +403,7 @@ function Set-DbaAgentJob { } } - if ($NetsendLevel) { + if (Test-Bound -ParameterName NetsendLevel) { # Check if the notifiction needs to be removed if ($NetsendLevel -eq 0) { # Remove the operator @@ -422,7 +422,7 @@ function Set-DbaAgentJob { } } - if ($PageLevel) { + if (Test-Bound -ParameterName PageLevel) { # Check if the notifiction needs to be removed if ($PageLevel -eq 0) { # Remove the operator @@ -472,7 +472,7 @@ function Set-DbaAgentJob { } } - if ($DeleteLevel) { + if (Test-Bound -ParameterName DeleteLevel) { Write-Message -Message "Setting job delete level to $DeleteLevel" -Level Verbose $currentjob.DeleteLevel = $DeleteLevel } diff --git a/functions/Set-DbaAgentJobOwner.ps1 b/functions/Set-DbaAgentJobOwner.ps1 index 30df42dd56..11a4b59db8 100644 --- a/functions/Set-DbaAgentJobOwner.ps1 +++ b/functions/Set-DbaAgentJobOwner.ps1 @@ -152,7 +152,7 @@ function Set-DbaAgentJobOwner { #Set job owner to $TargetLogin (default 'sa') $agentJob.OwnerLoginName = $newLogin $agentJob.Alter() - $status = 'Succesful' + $status = 'Successful' $notes = '' } catch { Stop-Function -Message "Issue setting job owner on $jobName." -Target $jobName -InnerErrorRecord $_ -Category InvalidOperation diff --git a/functions/Set-DbaAgentJobStep.ps1 b/functions/Set-DbaAgentJobStep.ps1 index ca38d27f22..7035923bbe 100644 --- a/functions/Set-DbaAgentJobStep.ps1 +++ b/functions/Set-DbaAgentJobStep.ps1 @@ -26,6 +26,9 @@ function Set-DbaAgentJobStep { The subsystem used by the SQL Server Agent service to execute command. Allowed values 'ActiveScripting','AnalysisCommand','AnalysisQuery','CmdExec','Distribution','LogReader','Merge','PowerShell','QueueReader','Snapshot','Ssis','TransactSql' + .PARAMETER SubSystemServer + The subsystems AnalysisScripting, AnalysisCommand, AnalysisQuery ned the server property to be able to apply + .PARAMETER Command The commands to be executed by SQLServerAgent service through subsystem. @@ -85,6 +88,9 @@ function Set-DbaAgentJobStep { .PARAMETER Confirm Prompts you for confirmation before executing any changing operations within the command. + .PARAMETER InputObject + Enables piping job objects + .PARAMETER EnableException By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. @@ -137,19 +143,15 @@ function Set-DbaAgentJobStep { #> [CmdletBinding(SupportsShouldProcess, ConfirmImpact = "Low")] param ( - [parameter(Mandatory, ValueFromPipeline)] - [Alias("ServerInstance", "SqlServer")] + [parameter(Mandatory)] [DbaInstanceParameter[]]$SqlInstance, [PSCredential]$SqlCredential, - [Parameter(Mandatory)] - [ValidateNotNullOrEmpty()] [object[]]$Job, - [Parameter(Mandatory)] - [ValidateNotNullOrEmpty()] [string]$StepName, [string]$NewName, [ValidateSet('ActiveScripting', 'AnalysisCommand', 'AnalysisQuery', 'CmdExec', 'Distribution', 'LogReader', 'Merge', 'PowerShell', 'QueueReader', 'Snapshot', 'Ssis', 'TransactSql')] [string]$Subsystem, + [string]$SubsystemServer, [string]$Command, [int]$CmdExecSuccessCode, [ValidateSet('QuitWithSuccess', 'QuitWithFailure', 'GoToNextStep', 'GoToStep')] @@ -166,7 +168,8 @@ function Set-DbaAgentJobStep { [ValidateSet('AppendAllCmdExecOutputToJobHistory', 'AppendToJobHistory', 'AppendToLogFile', 'LogToTableWithOverwrite', 'None', 'ProvideStopProcessEvent')] [string[]]$Flag, [string]$ProxyName, - [Alias('Silent')] + [parameter(ValueFromPipeline)] + [Microsoft.SqlServer.Management.Smo.Agent.JobStep[]]$InputObject, [switch]$EnableException, [switch]$Force ) @@ -189,11 +192,20 @@ function Set-DbaAgentJobStep { if (Test-FunctionInterrupt) { return } - foreach ($instance in $sqlinstance) { + if ((-not $InputObject) -and (-not $Job)) { + Stop-Function -Message "You must specify a job name or pipe in results from another command" -Target $sqlinstance + return + } + if ((-not $InputObject) -and (-not $StepName)) { + Stop-Function -Message "You must specify a job step name or pipe in results from another command" -Target $sqlinstance + return + } + + foreach ($instance in $sqlinstance) { # Try connecting to the instance try { - $Server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential } catch { Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue } @@ -201,128 +213,250 @@ function Set-DbaAgentJobStep { foreach ($j in $Job) { # Check if the job exists - if ($Server.JobServer.Jobs.Name -notcontains $j) { - Stop-Function -Message "Job $j doesn't exists on $instance" -Target $instance -Continue + if ($server.JobServer.Jobs.Name -notcontains $j) { + Stop-Function -Message "Job $j doesn't exists on $instance" -Target $instance } else { - # Check if the job step exists - if ($Server.JobServer.Jobs[$j].JobSteps.Name -notcontains $StepName) { - Stop-Function -Message "Step $StepName doesn't exists for job $j" -Target $instance -Continue + # Get the job step + try { + $InputObject += $server.JobServer.Jobs[$j].JobSteps | Where-Object Name -in $StepName + + # Refresh the object + $InputObject.Refresh() + } catch { + Stop-Function -Message "Something went wrong retrieving the job step(s)" -Target $j -ErrorRecord $_ -Continue + } + } + } + } + + if ($Job) { + $InputObject = $InputObject | Where-Object {$_.Parent.Name -in $Job} + } + + if ($StepName) { + $InputObject = $InputObject | Where-Object Name -in $StepName + } + + foreach ($instance in $sqlinstance) { + + # Try connecting to the instance + try { + $Server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + foreach ($currentJobStep in $InputObject) { + if (-not $Force -and ($Server.JobServer.Jobs[$currentJobStep.Parent.Name].JobSteps.Name -notcontains $currentJobStep.Name)) { + Stop-Function -Message "Step $StepName doesn't exists for job $j" -Target $instance -Continue + } elseif ($Force -and ($Server.JobServer.Jobs[$currentJobStep.Parent.Name].JobSteps.Name -notcontains $currentJobStep.Name)) { + Write-Message -Message "Adding job step $($currentJobStep.Name) to $($currentJobStep.Parent.Name) on $instance" -Level Verbose + + try { + New-DbaAgentJobStep -SqlInstance $instance -SqlCredential $SqlCredential ` + -Job $currentJobStep.Parent.Name ` + -StepId $currentJobStep.ID ` + -StepName $currentJobStep.Name ` + -Subsystem $currentJobStep.SubSystem ` + -SubsystemServer $currentJobStep.Server ` + -Command $currentJobStep.Command ` + -CmdExecSuccessCode $currentJobStep.CmdExecSuccessCode ` + -OnFailAction $currentJobStep.OnFailAction ` + -OnSuccessAction $currentJobStep.OnSuccessAction ` + -OnSuccessStepId $currentJobStep..OnSuccessStepId ` + -OnFailStepId $currentJobStep.OnFailStepId ` + -Database $currentJobStep.Database ` + -DatabaseUser $currentJobStep.DatabaseUser ` + -RetryAttempts $currentJobStep.RetryAttempts ` + -RetryInterval $currentJobStep.RetryInterval ` + -OutputFileName $currentJobStep.OutputFileName ` + -Flag $currentJobStep.Flag ` + -ProxyName $currentJobStep.ProxyName ` + -EnableException + } catch { + Stop-Function -Message "Something went wrong creating the job step" -Target $instance -ErrorRecord $_ -Continue + } + + } else { + $JobStep = $server.JobServer.Jobs[$currentJobStep.Parent.Name].JobSteps[$currentJobStep.Name] + + Write-Message -Message "Modifying job $j on $instance" -Level Verbose + + #region job step options + # Setting the options for the job step + if ($NewName) { + Write-Message -Message "Setting job step name to $NewName" -Level Verbose + $JobStep.Rename($NewName) + } + + if ($Subsystem) { + Write-Message -Message "Setting job step subsystem to $Subsystem" -Level Verbose + $JobStep.Subsystem = $Subsystem } else { + Write-Message -Message "Setting job step subsystem to $($currentJobStep.SubSystem)" -Level Verbose + $JobStep.Subsystem = $currentJobStep.Subsystem + } - # Get the job step - $JobStep = $Server.JobServer.Jobs[$j].JobSteps[$StepName] + if ($SubsystemServer) { + Write-Message -Message "Setting job step subsystem server to $SubsystemServer" -Level Verbose + $JobStep.Server = $SubsystemServer + } elseif ($currentJobStep.Server) { + Write-Message -Message "Setting job step subsystem server to $($currentJobStep.Server)" -Level Verbose + $JobStep.Server = $currentJobStep.Server + } - Write-Message -Message "Modifying job $j on $instance" -Level Verbose + if ($Command) { + Write-Message -Message "Setting job step command to $Command" -Level Verbose + $JobStep.Command = $Command + } else { + Write-Message -Message "Setting job step command to $($currentJobStep.Command)" -Level Verbose + $JobStep.Command = $currentJobStep.Command + } - #region job step options - # Setting the options for the job step - if ($NewName) { - Write-Message -Message "Setting job step name to $NewName" -Level Verbose - $JobStep.Rename($NewName) - } + if ($CmdExecSuccessCode) { + Write-Message -Message "Setting job step command exec success code to $CmdExecSuccessCode" -Level Verbose + $JobStep.CommandExecutionSuccessCode = $CmdExecSuccessCode + } else { + Write-Message -Message "Setting job step command exec success code to $($currentJobStep.CommandExecutionSuccessCode)" -Level Verbose + $JobStep.CommandExecutionSuccessCode = $currentJobStep.CommandExecutionSuccessCode + } - if ($Subsystem) { - Write-Message -Message "Setting job step subsystem to $Subsystem" -Level Verbose - $JobStep.Subsystem = $Subsystem - } + if ($OnSuccessAction) { + Write-Message -Message "Setting job step success action to $OnSuccessAction" -Level Verbose + $JobStep.OnSuccessAction = $OnSuccessAction + } else { + Write-Message -Message "Setting job step success action to $($currentJobStep.OnSuccessAction)" -Level Verbose + $JobStep.OnSuccessAction = $currentJobStep.OnSuccessAction + } - if ($Command) { - Write-Message -Message "Setting job step command to $Command" -Level Verbose - $JobStep.Command = $Command - } + if ($OnSuccessStepId) { + Write-Message -Message "Setting job step success step id to $OnSuccessStepId" -Level Verbose + $JobStep.OnSuccessStep = $OnSuccessStepId + } else { + Write-Message -Message "Setting job step success step id to $($currentJobStep.OnSuccessStep)" -Level Verbose + $JobStep.OnSuccessStep = $currentJobStep.OnSuccessStep + } - if ($CmdExecSuccessCode) { - Write-Message -Message "Setting job step command exec success code to $CmdExecSuccessCode" -Level Verbose - $JobStep.CommandExecutionSuccessCode = $CmdExecSuccessCode - } + if ($OnFailAction) { + Write-Message -Message "Setting job step fail action to $OnFailAction" -Level Verbose + $JobStep.OnFailAction = $OnFailAction + } else { + Write-Message -Message "Setting job step fail action to $($currentJobStep.OnFailAction)" -Level Verbose + $JobStep.OnFailAction = $currentJobStep.OnFailAction + } - if ($OnSuccessAction) { - Write-Message -Message "Setting job step success action to $OnSuccessAction" -Level Verbose - $JobStep.OnSuccessAction = $OnSuccessAction - } + if ($OnFailStepId) { + Write-Message -Message "Setting job step fail step id to $OnFailStepId" -Level Verbose + $JobStep.OnFailStep = $OnFailStepId + } else { + Write-Message -Message "Setting job step fail step id to $($currentJobStep.OnFailStep)" -Level Verbose + $JobStep.OnFailStep = $currentJobStep.OnFailStep + } - if ($OnSuccessStepId) { - Write-Message -Message "Setting job step success step id to $OnSuccessStepId" -Level Verbose - $JobStep.OnSuccessStep = $OnSuccessStepId + if ($Database) { + # Check if the database is present on the server + if ($server.Databases.Name -contains $Database) { + Write-Message -Message "Setting job step database name to $Database" -Level Verbose + $JobStep.DatabaseName = $Database + } else { + Stop-Function -Message "The database is not present on instance $instance." -Target $instance -Continue } - - if ($OnFailAction) { - Write-Message -Message "Setting job step fail action to $OnFailAction" -Level Verbose - $JobStep.OnFailAction = $OnFailAction + } else { + # Check if the database is present on the server + if ($server.Databases.Name -contains $currentJobStep.DatabaseName) { + Write-Message -Message "Setting job step database name to $($currentJobStep.DatabaseName)" -Level Verbose + $JobStep.DatabaseName = $currentJobStep.DatabaseName + } else { + Stop-Function -Message "The database is not present on instance $instance." -Target $instance -Continue } + } - if ($OnFailStepId) { - Write-Message -Message "Setting job step fail step id to $OnFailStepId" -Level Verbose - $JobStep.OnFailStep = $OnFailStepId + if (($DatabaseUser) -and ($Database)) { + # Check if the username is present in the database + if ($Server.Databases[$currentJobStep.DatabaseName].Users.Name -contains $DatabaseUser) { + Write-Message -Message "Setting job step database username to $DatabaseUser" -Level Verbose + $JobStep.DatabaseUserName = $DatabaseUser + } else { + Stop-Function -Message "The database user is not present in the database $($currentJobStep.DatabaseName) on instance $instance." -Target $instance -Continue } - - if ($Database) { - # Check if the database is present on the server - if ($Server.Databases.Name -contains $Database) { - Write-Message -Message "Setting job step database name to $Database" -Level Verbose - $JobStep.DatabaseName = $Database - } else { - Stop-Function -Message "The database is not present on instance $instance." -Target $instance -Continue - } + } elseif ($currentJobStep.DatabaseUserName) { + # Check if the username is present in the database + if ($Server.Databases[$currentJobStep.DatabaseName].Users.Name -contains $currentJobStep.DatabaseUserName) { + Write-Message -Message "Setting job step database username to $($currentJobStep.DatabaseUserName)" -Level Verbose + $JobStep.DatabaseUserName = $currentJobStep.DatabaseUserName + } else { + Stop-Function -Message "The database user is not present in the database $($currentJobStep.DatabaseName) on instance $instance." -Target $instance -Continue } + } - if (($DatabaseUser) -and ($Database)) { - # Check if the username is present in the database - if ($Server.Databases[$Database].Users.Name -contains $DatabaseUser) { - Write-Message -Message "Setting job step database username to $DatabaseUser" -Level Verbose - $JobStep.DatabaseUserName = $DatabaseUser - } else { - Stop-Function -Message "The database user is not present in the database $Database on instance $instance." -Target $instance -Continue - } - } + if ($RetryAttempts) { + Write-Message -Message "Setting job step retry attempts to $RetryAttempts" -Level Verbose + $JobStep.RetryAttempts = $RetryAttempts + } else { + Write-Message -Message "Setting job step retry attempts to $($currentJobStep.RetryAttempts)" -Level Verbose + $JobStep.RetryAttempts = $currentJobStep.RetryAttempts + } - if ($RetryAttempts) { - Write-Message -Message "Setting job step retry attempts to $RetryAttempts" -Level Verbose - $JobStep.RetryAttempts = $RetryAttempts - } + if ($RetryInterval) { + Write-Message -Message "Setting job step retry interval to $RetryInterval" -Level Verbose + $JobStep.RetryInterval = $RetryInterval + } else { + Write-Message -Message "Setting job step retry interval to $($currentJobStep.RetryInterval)" -Level Verbose + $JobStep.RetryInterval = $currentJobStep.RetryInterval + } - if ($RetryInterval) { - Write-Message -Message "Setting job step retry interval to $RetryInterval" -Level Verbose - $JobStep.RetryInterval = $RetryInterval - } + if ($OutputFileName) { + Write-Message -Message "Setting job step output file name to $OutputFileName" -Level Verbose + $JobStep.OutputFileName = $OutputFileName + } else { + Write-Message -Message "Setting job step output file name to $($currentJobStep.OutputFileName)" -Level Verbose + $JobStep.OutputFileName = $currentJobStep.OutputFileName + } - if ($OutputFileName) { - Write-Message -Message "Setting job step output file name to $OutputFileName" -Level Verbose - $JobStep.OutputFileName = $OutputFileName + if ($ProxyName) { + # Check if the proxy exists + if ($Server.JobServer.ProxyAccounts.Name -contains $ProxyName) { + Write-Message -Message "Setting job step proxy name to $ProxyName" -Level Verbose + $JobStep.ProxyName = $ProxyName + } else { + Stop-Function -Message "The proxy name $ProxyName doesn't exist on instance $instance." -Target $instance -Continue } - - if ($ProxyName) { - # Check if the proxy exists - if ($Server.JobServer.ProxyAccounts.Name -contains $ProxyName) { - Write-Message -Message "Setting job step proxy name to $ProxyName" -Level Verbose - $JobStep.ProxyName = $ProxyName - } else { - Stop-Function -Message "The proxy name $ProxyName doesn't exist on instance $instance." -Target $instance -Continue - } + } elseif ($currentJobStep.ProxyName) { + # Check if the proxy exists + if ($Server.JobServer.ProxyAccounts.Name -contains $currentJobStep.ProxyName) { + Write-Message -Message "Setting job step proxy name to $($currentJobStep.ProxyName)" -Level Verbose + $JobStep.ProxyName = $ProxyName + } else { + Stop-Function -Message "The proxy name $($currentJobStep.ProxyName) doesn't exist on instance $instance." -Target $instance -Continue } + } - if ($Flag.Count -ge 1) { - Write-Message -Message "Setting job step flag(s) to $($Flags -join ',')" -Level Verbose - $JobStep.JobStepFlags = $Flag - } - #region job step options - - # Execute - if ($PSCmdlet.ShouldProcess($instance, "Changing the job step $StepName for job $j")) { - try { - Write-Message -Message "Changing the job step $StepName for job $j" -Level Verbose - - # Change the job step - $JobStep.Alter() - } catch { - Stop-Function -Message "Something went wrong changing the job step" -ErrorRecord $_ -Target $instance -Continue - } + if ($Flag.Count -ge 1) { + Write-Message -Message "Setting job step flag(s) to $($Flags -join ',')" -Level Verbose + $JobStep.JobStepFlags = $Flag + } else { + Write-Message -Message "Setting job step flag(s) to $($currentJobStep.JobStepFlags -join ',')" -Level Verbose + $JobStep.JobStepFlags = $currentJobStep.JobStepFlags + } + #region job step options + + # Execute + if ($PSCmdlet.ShouldProcess($instance, "Changing the job step $StepName for job $j")) { + try { + Write-Message -Message "Changing the job step $StepName for job $j" -Level Verbose + + # Change the job step + $JobStep.Alter() + } catch { + Stop-Function -Message "Something went wrong changing the job step" -ErrorRecord $_ -Target $instance -Continue } } } - } # foreach object job - } # foreach object intance + } # end for each job step + + } # end for each instance + } # process end { diff --git a/functions/Set-DbaAgentSchedule.ps1 b/functions/Set-DbaAgentSchedule.ps1 index e539eac023..12f17e89b2 100644 --- a/functions/Set-DbaAgentSchedule.ps1 +++ b/functions/Set-DbaAgentSchedule.ps1 @@ -392,12 +392,12 @@ function Set-DbaAgentSchedule { if ($StartDate) { Write-Message -Message "Setting job schedule start date to $StartDate for schedule $ScheduleName" -Level Verbose - $JobSchedule.StartDate = $StartDate + $JobSchedule.ActiveStartDate = $StartDate } if ($EndDate) { Write-Message -Message "Setting job schedule end date to $EndDate for schedule $ScheduleName" -Level Verbose - $JobSchedule.EndDate = $EndDate + $JobSchedule.ActiveEndDate = $EndDate } if ($StartTime) { diff --git a/functions/Set-DbaDbIdentity.ps1 b/functions/Set-DbaDbIdentity.ps1 new file mode 100644 index 0000000000..fc41020a5f --- /dev/null +++ b/functions/Set-DbaDbIdentity.ps1 @@ -0,0 +1,168 @@ +function Set-DbaDbIdentity { + <# + .SYNOPSIS + Checks and updates the current identity value via DBCC CHECKIDENT + + .DESCRIPTION + Use the command DBCC CHECKIDENT to check and if necessary update the current identity value of a table and return results + Can update an individual table via the ReSeedValue and RESEED option of DBCC CHECKIDENT + + Read more: + - https://docs.microsoft.com/en-us/sql/t-sql/database-console-commands/dbcc-checkident-transact-sql + + .PARAMETER SqlInstance + The target SQL Server instance or instances. + + .PARAMETER SqlCredential + Login to the target instance using alternative credentials. Windows and SQL Authentication supported. Accepts credential objects (Get-Credential) + + .PARAMETER Database + The database(s) to process - this list is auto-populated from the server. If unspecified, all databases will be processed. + Only one database should be specified when using a RESEED value + + .PARAMETER Table + The table(s) for which to check the current identity value. + Only one table should be specified when using a RESEED value + + .PARAMETER ReSeedValue + The new reseed value to be used to set as the current identity value. + + .PARAMETER WhatIf + Shows what would happen if the cmdlet runs. The cmdlet is not run. + + .PARAMETER Confirm + Prompts you for confirmation before running the cmdlet. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: DBCC + Author: Patrick Flynn (@sqllensman) + + Website: https://dbatools.io + Copyright: (c) 2018 by dbatools, licensed under MIT + License: MIT https://opensource.org/licenses/MIT + + .LINK + https://dbatools.io/Set-DbaDbIdentity + + .EXAMPLE + PS C:\> Set-DbaDbIdentity -SqlInstance SQLServer2017 -Database AdventureWorks2014 -Table 'Production.ScrapReason' + + Connects to AdventureWorks2014 on instance SqlServer2017 using Windows Authentication and runs the command DBCC CHECKIDENT('Production.ScrapReason') to return the current identity value. + + .EXAMPLE + PS C:\> $cred = Get-Credential sqladmin + PS C:\> 'Sql1','Sql2/sqlexpress' | Set-DbaDbIdentity -SqlCredential $cred -Database AdventureWorks2014 -Table 'Production.ScrapReason' + + Connects to AdventureWorks2014 on instances Sql1 and Sql2/sqlexpress using sqladmin credential and runs the command DBCC CHECKIDENT('Production.ScrapReason') to return the current identity value. + + .EXAMPLE + PS C:\> $query = "Select Schema_Name(t.schema_id) +'.' + t.name as TableName from sys.columns c INNER JOIN sys.tables t on t.object_id = c.object_id WHERE is_identity = 1" + PS C:\> $IdentityTables = Invoke-DbaQuery -SqlInstance SQLServer2017 -Database AdventureWorks2014 -Query $query + PS C:\> foreach ($tbl in $IdentityTables) { + PS C:\> Set-DbaDbIdentity -SqlInstance SQLServer2017 -Database AdventureWorks2014 -Table $tbl.TableName + PS C:\> } + + Checks the current identity value for all tables with an Identity in the AdventureWorks2014 database on the SQLServer2017 and, if it is needed, changes the identity value. + + + #> + [CmdletBinding(SupportsShouldProcess, ConfirmImpact = 'High')] + param ( + [parameter(Mandatory, ValueFromPipeline)] + [DbaInstanceParameter[]]$SqlInstance, + [PSCredential]$SqlCredential, + [string[]]$Database, + [string[]]$Table, + [int]$ReSeedValue, + [switch]$EnableException + ) + begin { + $stringBuilder = New-Object System.Text.StringBuilder + $null = $stringBuilder.Append("DBCC CHECKIDENT(#options#)") + } + process { + if (Test-Bound -ParameterName ReSeedValue) { + if ((Test-Bound -Not -ParameterName Database) -or (Test-Bound -Not -ParameterName Table)) { + Stop-Function -Message "When using a reseed value you must specify a database and a table to execute against." + return + } + + if (($Database.Count -gt 1) -or ($Table.Count -gt 1)) { + Stop-Function -Message "When using a reseed value you must specify a single database and a single table to execute against." + return + } + } + + foreach ($instance in $SqlInstance) { + Write-Message -Message "Attempting Connection to $instance" -Level Verbose + try { + $server = Connect-SqlInstance -SqlInstance $instance -SqlCredential $SqlCredential + } catch { + Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $instance -Continue + } + + $dbs = $server.Databases + + if ($Database) { + $dbs = $dbs | Where-Object Name -In $Database + } + + foreach ($db in $dbs) { + Write-Message -Level Verbose -Message "Processing $db on $instance" + + if ($db.IsAccessible -eq $false) { + Stop-Function -Message "The database $db is not accessible. Skipping." -Continue + } + + foreach ($tbl in $Table) { + try { + $query = $StringBuilder.ToString() + if (Test-Bound -Not -ParameterName ReSeedValue) { + $query = $query.Replace('#options#', "'$($tbl)'") + } else { + $query = $query.Replace('#options#', "'$($tbl)', RESEED, $($ReSeedValue)") + } + + if ($Pscmdlet.ShouldProcess($server.Name, "Execute the command $query against $instance")) { + Write-Message -Message "Query to run: $query" -Level Verbose + $results = $server | Invoke-DbaQuery -Query $query -Database $db.Name -MessagesToOutput + if ($null -ne $results) { + $words = $results.Split(" ") + $identityValue = $words[6].Replace("'", "").Replace(",", "") + if (Test-Bound -Not -ParameterName ReSeedValue) { + $columnValue = $words[10].Replace("'", "").Replace(".", "") + } else { + $columnValue = '' + } + + } else { + $identityValue = $null + $columnValue = $null + } + } + } catch { + Stop-Function -Message "Error running $query against $db" -Target $instance -ErrorRecord $_ -Exception $_.Exception -Continue + } + if ($Pscmdlet.ShouldProcess("console", "Outputting object")) { + [PSCustomObject]@{ + ComputerName = $server.ComputerName + InstanceName = $server.ServiceName + SqlInstance = $server.DomainInstanceName + Database = $db.Name + Table = $tbl + Cmd = $query.ToString() + IdentityValue = $identityValue + ColumnValue = $columnValue + Output = $results + } + } + } + } + } + } +} \ No newline at end of file diff --git a/functions/Set-DbaDbState.ps1 b/functions/Set-DbaDbState.ps1 index d5632bc98d..109ba3ef0b 100644 --- a/functions/Set-DbaDbState.ps1 +++ b/functions/Set-DbaDbState.ps1 @@ -481,7 +481,7 @@ function Set-DbaDbState { # we avoid reenumerating properties $newstate = $db_status } else { - $newstate = Get-DbState -databaseName $db.Name -dbStatuses $stateCache[$server] + $newstate = Get-DbState -databaseName $db.Name -dbStatuses $dbStatuses[$server] } [PSCustomObject]@{ diff --git a/functions/Set-DbaLogin.ps1 b/functions/Set-DbaLogin.ps1 index 383db0f388..5182bc6e92 100644 --- a/functions/Set-DbaLogin.ps1 +++ b/functions/Set-DbaLogin.ps1 @@ -18,6 +18,9 @@ function Set-DbaLogin { .PARAMETER SecurePassword The new password for the login This can be either a credential or a secure string. + .PARAMETER DefaultDatabase + Default database for the login + .PARAMETER Unlock Switch to unlock an account. This will only be used in conjunction with the -SecurePassword parameter. The default is false. @@ -141,6 +144,11 @@ function Set-DbaLogin { Disable the login from the pipeline + .EXAMPLE + PS C:\> Set-DbaLogin -SqlInstance sql1 -Login login1 -DefaultDatabase master + + Set the default database to master on a login + #> [CmdletBinding(SupportsShouldProcess)] @@ -152,6 +160,8 @@ function Set-DbaLogin { [string[]]$Login, [Alias("Password")] [object]$SecurePassword, #object so that it can accept credential or securestring + [Alias("DefaultDB")] + [string]$DefaultDatabase, [switch]$Unlock, [switch]$MustChange, [string]$NewName, @@ -330,6 +340,15 @@ function Set-DbaLogin { } } } + + # Set the default database + if (Test-Bound -ParameterName 'DefaultDatabase') { + if ($l.DefaultDatabase -eq $DefaultDatabase) { + Write-Message -Message "Login $l default database is already set to $($l.DefaultDatabase)" -Level Verbose + } else { + $l.DefaultDatabase = $DefaultDatabase + } + } # Alter the login to make the changes $l.Alter() diff --git a/functions/Set-DbaSpn.ps1 b/functions/Set-DbaSpn.ps1 index 610c4c89a0..49d3ac0627 100644 --- a/functions/Set-DbaSpn.ps1 +++ b/functions/Set-DbaSpn.ps1 @@ -44,19 +44,19 @@ function Set-DbaSpn { https://dbatools.io/Set-DbaSpn .EXAMPLE - PS C:\> Set-DbaSpn -SPN MSSQLSvc\SQLSERVERA.domain.something -ServiceAccount domain\account - PS C:\> Set-DbaSpn -SPN MSSQLSvc\SQLSERVERA.domain.something -ServiceAccount domain\account -EnableException + PS C:\> Set-DbaSpn -SPN MSSQLSvc/SQLSERVERA.domain.something -ServiceAccount domain\account + PS C:\> Set-DbaSpn -SPN MSSQLSvc/SQLSERVERA.domain.something -ServiceAccount domain\account -EnableException Connects to Active Directory and adds a provided SPN to the given account. Connects to Active Directory and adds a provided SPN to the given account, suppressing all error messages and throw exceptions that can be caught instead .EXAMPLE - PS C:\> Set-DbaSpn -SPN MSSQLSvc\SQLSERVERA.domain.something -ServiceAccount domain\account -Credential ad\sqldba + PS C:\> Set-DbaSpn -SPN MSSQLSvc/SQLSERVERA.domain.something -ServiceAccount domain\account -Credential ad\sqldba Connects to Active Directory and adds a provided SPN to the given account. Uses alternative account to connect to AD. .EXAMPLE - PS C:\> Set-DbaSpn -SPN MSSQLSvc\SQLSERVERA.domain.something -ServiceAccount domain\account -NoDelegation + PS C:\> Set-DbaSpn -SPN MSSQLSvc/SQLSERVERA.domain.something -ServiceAccount domain\account -NoDelegation Connects to Active Directory and adds a provided SPN to the given account, without the delegation. diff --git a/functions/Start-DbaMigration.ps1 b/functions/Start-DbaMigration.ps1 index cdbe595858..f35c4bc654 100644 --- a/functions/Start-DbaMigration.ps1 +++ b/functions/Start-DbaMigration.ps1 @@ -217,16 +217,16 @@ function Start-DbaMigration { Test-DbaDeprecation -DeprecatedOn 1.0.0 -Parameter NetworkShare -CustomMessage "Using the parameter NetworkShare is deprecated. This parameter will be removed in version 1.0.0 or before. Use SharedPath instead." if ($Exclude -notcontains "Databases") { - if (-not $BackupRestore -and -not $DetachAttach) { + if (-not $BackupRestore -and -not $DetachAttach -and -not $UseLastBackup) { Stop-Function -Message "You must specify a database migration method (-BackupRestore or -DetachAttach) or -Exclude Databases" return } } - - $elapsed = [System.Diagnostics.Stopwatch]::StartNew() - $started = Get-Date - $sourceserver = Connect-SqlInstance -SqlInstance $Source -SqlCredential $SourceSqlCredential + if ($DetachAttach -and ($BackupRestore -or $UseLastBackup)) { + Stop-Function -Message "-DetachAttach cannot be used with -BackupRestore or -UseLastBackup" + return + } if ($BackupRestore -and (-not $SharedPath -and -not $UseLastBackup)) { Stop-Function -Message "When using -BackupRestore, you must specify -SharedPath or -UseLastBackup" return @@ -243,12 +243,30 @@ function Start-DbaMigration { Stop-Function -Message "-Continue cannot be used without -UseLastBackup" return } + if ($UseLastBackup -and -not $BackupRestore) { + $BackupRestore = $true + } + + $elapsed = [System.Diagnostics.Stopwatch]::StartNew() + $started = Get-Date + $sourceserver = Connect-SqlInstance -SqlInstance $Source -SqlCredential $SourceSqlCredential } process { if (Test-FunctionInterrupt) { return } # testing twice for whatif reasons + if ($Exclude -notcontains "Databases") { + if (-not $BackupRestore -and -not $DetachAttach -and -not $UseLastBackup) { + Stop-Function -Message "You must specify a database migration method (-BackupRestore or -DetachAttach) or -Exclude Databases" + return + } + } + + if ($DetachAttach -and ($BackupRestore -or $UseLastBackup)) { + Stop-Function -Message "-DetachAttach cannot be used with -BackupRestore or -UseLastBackup" + return + } if ($BackupRestore -and (-not $SharedPath -and -not $UseLastBackup)) { Stop-Function -Message "When using -BackupRestore, you must specify -SharedPath or -UseLastBackup" return @@ -261,6 +279,13 @@ function Start-DbaMigration { Stop-Function -Message "When using -DetachAttach with multiple servers, you must specify -Reattach to reattach database at source" return } + if ($Continue -and -not $UseLastBackup) { + Stop-Function -Message "-Continue cannot be used without -UseLastBackup" + return + } + if ($UseLastBackup -and -not $BackupRestore) { + $BackupRestore = $true + } if ($Exclude -notcontains 'SpConfigure') { Write-Message -Level Verbose -Message "Migrating SQL Server Configuration" Copy-DbaSpConfigure -Source $sourceserver -Destination $Destination -DestinationSqlCredential $DestinationSqlCredential @@ -383,4 +408,4 @@ function Start-DbaMigration { Write-Message -Level Verbose -Message "Migration completed: $(Get-Date)" Write-Message -Level Verbose -Message "Total Elapsed time: $totaltime" } -} \ No newline at end of file +} diff --git a/functions/Start-DbaXESmartTarget.ps1 b/functions/Start-DbaXESmartTarget.ps1 index 0a362624b6..142b2f044b 100644 --- a/functions/Start-DbaXESmartTarget.ps1 +++ b/functions/Start-DbaXESmartTarget.ps1 @@ -47,7 +47,7 @@ function Start-DbaXESmartTarget { Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. .NOTES - Tags: ExtendedEvent, XE, XEvent + Tags: ExtendedEvent, XE, XEvent, SmartTarget Author: Chrissy LeMaire (@cl) | SmartTarget by Gianluca Sartori (@spaghettidba) Website: https://dbatools.io diff --git a/functions/Sync-DbaAvailabilityGroup.ps1 b/functions/Sync-DbaAvailabilityGroup.ps1 index 2d306f80e4..4ecdc17934 100644 --- a/functions/Sync-DbaAvailabilityGroup.ps1 +++ b/functions/Sync-DbaAvailabilityGroup.ps1 @@ -68,10 +68,10 @@ function Sync-DbaAvailabilityGroup { Specific logins to exclude when performing the sync. If unspecified, all logins will be processed. .PARAMETER Job - Specific jobs to sync. If unspecified, all logins will be processed. + Specific jobs to sync. If unspecified, all jobs will be processed. .PARAMETER ExcludeJob - Specific jobs to exclude when performing the sync. If unspecified, all logins will be processed. + Specific jobs to exclude when performing the sync. If unspecified, all jobs will be processed. .PARAMETER InputObject Enables piping from Get-DbaAvailabilityGroup. @@ -106,15 +106,15 @@ function Sync-DbaAvailabilityGroup { Syncs the following on all replicas found in the db3 AG: SpConfigure, CustomErrors, Credentials, DatabaseMail, LinkedServers Logins, LoginPermissions, SystemTriggers, DatabaseOwner, AgentCategory, - AgentOperator, AgentAlert, AgentProxy, AgentScheduleAgentJob + AgentOperator, AgentAlert, AgentProxy, AgentSchedule, AgentJob .EXAMPLE PS C:\> Get-DbaAvailabilityGroup -SqlInstance sql2016a | Sync-DbaAvailabilityGroup -ExcludeType LoginPermissions, LinkedServers -ExcludeLogin login1, login2 -Job job1, job2 - Syncs the following on all replicas found in the db3 AG: + Syncs the following on all replicas found in all AGs on the specified instance: SpConfigure, CustomErrors, Credentials, DatabaseMail, Logins, SystemTriggers, DatabaseOwner, AgentCategory, AgentOperator - AgentAlert, AgentProxy, AgentScheduleAgentJob. + AgentAlert, AgentProxy, AgentSchedule, AgentJob. Copies all logins except for login1 and login2 and only syncs job1 and job2 @@ -232,7 +232,7 @@ function Sync-DbaAvailabilityGroup { if ($Exclude -notcontains "Logins") { if ($PSCmdlet.ShouldProcess("Syncing logins from $primaryserver to $secondaryservers")) { Write-ProgressHelper -Activity $activity -StepNumber ($stepCounter++) -Message "Syncing logins" - Copy-DbaLogin -Source $server -Destination $secondaries -ExcludeLogin $ExcludeLogin -Force:$Force + Copy-DbaLogin -Source $server -Destination $secondaries -Login $Login -ExcludeLogin $ExcludeLogin -Force:$Force } } @@ -339,4 +339,4 @@ function Sync-DbaAvailabilityGroup { } } } -} \ No newline at end of file +} diff --git a/functions/Test-DbaJobOwner.ps1 b/functions/Test-DbaAgentJobOwner.ps1 similarity index 100% rename from functions/Test-DbaJobOwner.ps1 rename to functions/Test-DbaAgentJobOwner.ps1 diff --git a/functions/Test-DbaBackupInformation.ps1 b/functions/Test-DbaBackupInformation.ps1 index 45e6a47b7b..505b01362d 100644 --- a/functions/Test-DbaBackupInformation.ps1 +++ b/functions/Test-DbaBackupInformation.ps1 @@ -112,7 +112,7 @@ function Test-DbaBackupInformation { Write-Message -Level Verbose -Message "VerifyOnly = $VerifyOnly" If ($VerifyOnly -ne $true) { if ($null -ne $DbCheck -and ($WithReplace -ne $true -and $Continue -ne $true)) { - Stop-Function -Message "Database $Database exists, so WithReplace must be specified" -Target $database + Write-Message -Level Warning -Message "Database $Database exists, so WithReplace must be specified" -Target $database $VerificationErrors++ } @@ -164,6 +164,13 @@ function Test-DbaBackupInformation { } } } + #Test for LSN chain + if ($true -ne $Continue) { + if (!($DbHistory | Test-DbaLsnChain)) { + Write-Message -Message "LSN Check failed" -Level Verbose + $VerificationErrors++ + } + } } #Test all backups readable @@ -175,13 +182,7 @@ function Test-DbaBackupInformation { $VerificationErrors++ } } - #Test for LSN chain - if ($true -ne $Continue) { - if (!($DbHistory | Test-DbaLsnChain)) { - Write-Message -Message "LSN Check failed" -Level Verbose - $VerificationErrors++ - } - } + if ($VerificationErrors -eq 0) { Write-Message -Message "Marking $Database as verified" -Level Verbose $InternalHistory | Where-Object {$_.Database -eq $Database} | Foreach-Object {$_.IsVerified = $True} diff --git a/functions/Test-DbaBuild.ps1 b/functions/Test-DbaBuild.ps1 index 1d5bbe38b2..3dc553de50 100644 --- a/functions/Test-DbaBuild.ps1 +++ b/functions/Test-DbaBuild.ps1 @@ -242,7 +242,7 @@ function Test-DbaBuild { $targetedBuild = $SPsAndCUs | Where-Object SP -eq $targetSPName | Select-Object -First 1 } if ($ParsedMaxBehind.ContainsKey('CU')) { - $AllCUs = ($SPsAndCUs | Where-Object VersionObject -gt $targetedBuild.VersionObject).CU | Select-Object -Unique + [string[]]$AllCUs = ($SPsAndCUs | Where-Object VersionObject -gt $targetedBuild.VersionObject).CU | Select-Object -Unique if ($AllCUs.Length -gt 0) { #CU after the targeted build available $targetCU = $AllCUs.Length - $ParsedMaxBehind['CU'] - 1 diff --git a/functions/Test-DbaConnection.ps1 b/functions/Test-DbaConnection.ps1 index a4f5199150..64809f0641 100644 --- a/functions/Test-DbaConnection.ps1 +++ b/functions/Test-DbaConnection.ps1 @@ -76,8 +76,9 @@ function Test-DbaConnection { Write-Message -Level Verbose -Message "Getting local environment information" $localInfo = [pscustomobject]@{ Windows = [environment]::OSVersion.Version.ToString() + Edition = $PSVersionTable.PSEdition PowerShell = $PSVersionTable.PSversion.ToString() - CLR = $PSVersionTable.CLRVersion.ToString() + CLR = [string]$PSVersionTable.CLRVersion SMO = ((([AppDomain]::CurrentDomain.GetAssemblies() | Where-Object { $_.Fullname -like "Microsoft.SqlServer.SMO,*" }).FullName -Split ", ")[1]).TrimStart("Version=") DomainUser = $env:computername -ne $env:USERDOMAIN RunAsAdmin = ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator") @@ -110,32 +111,39 @@ function Test-DbaConnection { $remoting = $_ } - # Test Connection first using Test-Connection which requires ICMP access then failback to tcp if pings are blocked + # Test Connection first using Ping class which requires ICMP access then failback to tcp if pings are blocked Write-Message -Level Verbose -Message "Testing ping to $($instance.ComputerName)" - $pingable = Test-Connection -ComputerName $instance.ComputerName -Count 1 -Quiet + $ping = New-Object System.Net.NetworkInformation.Ping + $timeout = 1000 #milliseconds + $reply = $ping.Send($instance.ComputerName, $timeout) + $pingable = $reply.Status -eq 'Success' + # this whole section does nothing and returns errors for default instances with a non-default port - baseaddress not defined + # commenting it all out # SQL Server connection - if ($instance.InstanceName -ne "MSSQLSERVER") { - #Variable marked as unused by PSScriptAnalyzer, need to be in PSCustomObject? - #$sqlport = "N/A" - } else { - Write-Message -Level Verbose -Message "Testing raw socket connection to default SQL port" - $tcp = New-Object System.Net.Sockets.TcpClient - try { - $tcp.Connect($baseaddress, 1433) - $tcp.Close() - $tcp.Dispose() - } catch { - # here to avoid an empty catch - $null = 1 - } - } + # if ($instance.InstanceName -ne "MSSQLSERVER") { + # #Variable marked as unused by PSScriptAnalyzer, need to be in PSCustomObject? + # #$sqlport = "N/A" + # } else { + # Write-Message -Level Verbose -Message "Testing raw socket connection to default SQL port" + # $tcp = New-Object System.Net.Sockets.TcpClient + # try { + # $tcp.Connect($baseaddress, 1433) + # $tcp.Close() + # $tcp.Dispose() + # } catch { + # # here to avoid an empty catch + # $null = 1 + # } + # } try { $server = Connect-SqlInstance -SqlInstance $instance.FullSmoName -SqlCredential $SqlCredential $connectSuccess = $true + $instanceName = $server.InstanceName } catch { $connectSuccess = $false + $instanceName = $instance.InstanceName Stop-Function -Message "Issue connection to SQL Server on $instance" -Category ConnectionError -Target $instance -ErrorRecord $_ -Continue } @@ -166,7 +174,7 @@ function Test-DbaConnection { [pscustomobject]@{ ComputerName = $resolved.ComputerName - InstanceName = $instance.InstanceName + InstanceName = $instanceName SqlInstance = $instance.FullSmoName SqlVersion = $server.Version ConnectingAsUser = $username @@ -185,6 +193,7 @@ function Test-DbaConnection { LocalSMOVersion = $localInfo.SMO LocalDomainUser = $localInfo.DomainUser LocalRunAsAdmin = $localInfo.RunAsAdmin + LocalEdition = $localInfo.Edition } } } diff --git a/functions/Test-DbaDbOwner.ps1 b/functions/Test-DbaDbOwner.ps1 index 87a40aecae..405809e4e1 100644 --- a/functions/Test-DbaDbOwner.ps1 +++ b/functions/Test-DbaDbOwner.ps1 @@ -57,10 +57,14 @@ function Test-DbaDbOwner { Returns all databases where the owner does not match 'DOMAIN\account'. + .EXAMPLE + PS C:\> Get-DbaDatabase -SqlInstance localhost -OnlyAccessible | Test-DbaDbOwner + + Gets only accessible databases and checks where the owner does not match 'sa'. #> [CmdletBinding()] param ( - [parameter(Mandatory)] + [parameter(Position = 0)] [Alias("ServerInstance", "SqlServer")] [DbaInstanceParameter[]]$SqlInstance, [PSCredential]$SqlCredential, @@ -78,8 +82,12 @@ function Test-DbaDbOwner { Test-DbaDeprecation -DeprecatedOn "1.0.0" -Parameter "Detailed" } process { + if (-not $InputObject -and -not $Sqlinstance) { + Stop-Function -Message 'You must specify a $SqlInstance parameter' + } + if ($SqlInstance) { - $InputObject += Get-DbaDatabase -SqlInstance $SqlInstance -SqlCredential $SqlCredential -Database $Database -ExcludeDatabase $ExcludeDatabase | Where-Object IsAccessible + $InputObject += Get-DbaDatabase -SqlInstance $SqlInstance -SqlCredential $SqlCredential -Database $Database -ExcludeDatabase $ExcludeDatabase } #for each database, create custom object for return set. @@ -98,10 +106,6 @@ function Test-DbaDbOwner { Write-Message -Level Verbose -Message "$TargetLogin is not a login on $instance" -Target $instance } - if ($db.IsAccessible -eq $false) { - Stop-Function -Message "The database $db is not accessible. Skipping database." -Continue -Target $db - } - Write-Message -Level Verbose -Message "Checking $db" [pscustomobject]@{ ComputerName = $server.ComputerName diff --git a/functions/Test-DbaDiskSpeed.ps1 b/functions/Test-DbaDiskSpeed.ps1 index b14cbd067e..ccbfc0eb37 100644 --- a/functions/Test-DbaDiskSpeed.ps1 +++ b/functions/Test-DbaDiskSpeed.ps1 @@ -6,8 +6,7 @@ function Test-DbaDiskSpeed { .DESCRIPTION Tests how disks are performing. - This command uses a query from Rich Benner which was adapted from David Pless's article: - https://blogs.msdn.microsoft.com/dpless/2010/12/01/leveraging-sys-dm_io_virtual_file_stats/ + This command uses a query from Rich Benner https://github.com/RichBenner/PersonalCode/blob/master/Disk_Speed_Check.sql .PARAMETER SqlInstance diff --git a/functions/Test-DbaLastBackup.ps1 b/functions/Test-DbaLastBackup.ps1 index abe6250844..bc7d12039d 100644 --- a/functions/Test-DbaLastBackup.ps1 +++ b/functions/Test-DbaLastBackup.ps1 @@ -61,7 +61,7 @@ function Test-DbaLastBackup { The name of the SQL Server credential on the destination instance that holds the key to the azure storage account. .PARAMETER IncludeCopyOnly - If this switch is enabled, copy only backups will not be counted as a last backup. + If this switch is enabled, copy only backups will be counted as a last backup. .PARAMETER IgnoreLogBackup If this switch is enabled, transaction log backups will be ignored. The restore will stop at the latest full or differential backup point. @@ -184,6 +184,7 @@ function Test-DbaLastBackup { $instance = [DbaInstanceParameter]$source $copysuccess = $true $dbname = $db.Name + $restoreresult = $null if (-not (Test-Bound -ParameterName Destination)) { $destination = $sourceserver.Name @@ -347,7 +348,9 @@ function Test-DbaLastBackup { $ogdbname = $dbname $restorelist = Read-DbaBackupHeader -SqlInstance $destserver -Path $lastbackup[0].Path -AzureCredential $AzureCredential - if ($MaxSize -and $MaxSize -lt $restorelist.BackupSize.Megabyte) { + $totalsize = ($restorelist.BackupSize.Megabyte |Measure-Object -sum ).Sum + + if ($MaxSize -and $MaxSize -lt $totalsize) { $success = "The backup size for $dbname ($mb MB) exceeds the specified maximum size ($MaxSize MB)." $dbccresult = "Skipped" } else { diff --git a/functions/Update-DbaInstance.ps1 b/functions/Update-DbaInstance.ps1 index 7cc36cb967..61298a4743 100644 --- a/functions/Update-DbaInstance.ps1 +++ b/functions/Update-DbaInstance.ps1 @@ -28,10 +28,11 @@ function Update-DbaInstance { Always backup databases and configurations prior to upgrade. .PARAMETER ComputerName - Target computer with SQL instance or instsances. + Target computer with SQL instance or instances. .PARAMETER Credential - Windows Credential with permission to log on to the remote server. Must be specified for any remote connection. + Windows Credential with permission to log on to the remote server. + Must be specified for any remote connection if update Repository is located on a network folder. .PARAMETER Type Type of the update: All | ServicePack | CumulativeUpdate. @@ -44,7 +45,7 @@ function Update-DbaInstance { .PARAMETER Version A target version of the installation you want to reach. If not specified, a latest available version would be used by default. Can be defined using the following general pattern: . - Any part of the pattern can be ommitted if needed: + Any part of the pattern can be omitted if needed: 2008R2SP1 - will update SQL 2008R2 to SP1 2016CU3 - will update SQL 2016 to CU3 of current Service Pack installed SP0CU3 - will update all existing SQL Server versions to RTM CU3 without installing any service packs @@ -65,9 +66,22 @@ function Update-DbaInstance { .PARAMETER Continue Continues a failed installation attempt when specified. Will abort a previously failed installation otherwise. + .PARAMETER Authentication + Chooses an authentication protocol for remote connections. + If the protocol fails to establish a connection + + Defaults: + * CredSSP when -Credential is specified - due to the fact that repository Path is usually a network share and credentials need to be passed to the remote host + to avoid the double-hop issue. + * Default when -Credential is not specified. Will likely fail if a network path is specified. + .PARAMETER InstanceName Only updates a specific instance(s). + .PARAMETER Throttle + Maximum number of computers updated in parallel. Once reached, the update operations will queue up. + Default: 50 + .PARAMETER WhatIf Shows what would happen if the command were to run. No actions are actually performed. @@ -94,29 +108,38 @@ function Update-DbaInstance { Updates all applicable SQL Server installations on SQL1 to SP3. Binary files for the update will be searched among all files and folders recursively in \\network\share. + Prompts for confirmation before the update. .EXAMPLE - PS C:\> Update-DbaInstance -ComputerName SQL1, SQL2 -Restart -Path \\network\share + PS C:\> Update-DbaInstance -ComputerName SQL1, SQL2 -Restart -Path \\network\share -Confirm:$false Updates all applicable SQL Server installations on SQL1 and SQL2 with the most recent patch. It will install latest ServicePack, restart the computers, install latest Cumulative Update, and finally restart the computer once again. Binary files for the update will be searched among all files and folders recursively in \\network\share. + Does not prompt for confirmation. .EXAMPLE PS C:\> Update-DbaInstance -ComputerName SQL1 -Version 2012 -Type ServicePack -Path \\network\share Updates SQL Server 2012 on SQL1 with the most recent ServicePack found in your patch repository. Binary files for the update will be searched among all files and folders recursively in \\network\share. + Prompts for confirmation before the update. .EXAMPLE - PS C:\> Update-DbaInstance -ComputerName SQL1 -KB 123456 -Restart -Path \\network\share + PS C:\> Update-DbaInstance -ComputerName SQL1 -KB 123456 -Restart -Path \\network\share -Confirm:$false Installs KB 123456 on SQL1 and restarts the computer. Binary files for the update will be searched among all files and folders recursively in \\network\share. + Does not prompt for confirmation. + + .EXAMPLE + PS C:\> Update-DbaInstance -ComputerName Server1 -Version SQL2012SP3, SQL2016SP2CU3 -Path \\network\share -Restart -Confirm:$false + + Updates SQL 2012 to SP3 and SQL 2016 to SP2CU3 on Server1. Each update will be followed by a restart. + Binary files for the update will be searched among all files and folders recursively in \\network\share. + Does not prompt for confirmation. #> - [Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSShouldProcess", "")] - # Shouldprocess is handled by internal function Install-SqlServerUpdate [CmdletBinding(SupportsShouldProcess, ConfirmImpact = 'High', DefaultParameterSetName = 'Version')] Param ( [parameter(ValueFromPipeline, Position = 1)] @@ -134,12 +157,18 @@ function Update-DbaInstance { [string[]]$KB, [Alias("Instance")] [string]$InstanceName, - [string[]]$Path, + [string[]]$Path = (Get-DbatoolsConfigValue -Name 'Path.SQLServerUpdates'), [switch]$Restart, [switch]$Continue, + [ValidateNotNull()] + [int]$Throttle = 50, + [ValidateSet('Default', 'Basic', 'Negotiate', 'NegotiateWithImplicitCredential', 'Credssp', 'Digest', 'Kerberos')] + [string]$Authentication = 'Credssp', [switch]$EnableException ) begin { + $notifiedCredentials = $false + $notifiedUnsecure = $false #Validating parameters if ($PSCmdlet.ParameterSetName -eq 'Version') { foreach ($v in $Version) { @@ -225,38 +254,160 @@ function Update-DbaInstance { foreach ($a in $actions) { Write-Message -Level Debug -Message "Added installation action $($a | ConvertTo-Json -Depth 1 -Compress)" } + # defining how to process the final results + $outputHandler = { + $_ | Select-DefaultView -Property ComputerName, MajorVersion, TargetLevel, KB, Successful, Restarted, InstanceName, Installer, Notes + if ($_.Successful -eq $false) { + Write-Message -Level Warning -Message "Update failed: $($_.Notes -join ' | ')" + } + } } process { if (Test-FunctionInterrupt) { return } #Resolve all the provided names $resolvedComputers = @() + $pathIsNetwork = $Path | Foreach-Object -Begin { $o = @() } -Process { $o += $_ -like '\\*'} -End { $o -contains $true } foreach ($computer in $ComputerName) { $null = Test-ElevationRequirement -ComputerName $computer -Continue + if (!$computer.IsLocalHost -and -not $notifiedCredentials -and -not $Credential -and $pathIsNetwork) { + Write-Message -Level Warning -Message "Explicit -Credential might be required when running agains remote hosts and -Path is a network folder" + $notifiedCredentials = $true + } if ($resolvedComputer = Resolve-DbaNetworkName -ComputerName $computer.ComputerName) { $resolvedComputers += $resolvedComputer.FullComputerName } } - #Initialize installations for each computer + #Leave only unique computer names + $resolvedComputers = $resolvedComputers | Sort-Object -Unique + #Process planned actions and gather installation actions + $installActions = @() :computers foreach ($resolvedName in $resolvedComputers) { - :actions foreach ($actionParam in $actions) { - if (Test-PendingReboot -ComputerName $resolvedName) { - #Exit the actions loop altogether - nothing can be installed here anyways - Stop-Function -Message "$resolvedName is pending a reboot. Reboot the computer before proceeding." -Continue -ContinueLabel computers + $activity = "Preparing to update SQL Server on $resolvedName" + ## Find the current version on the computer + Write-ProgressHelper -ExcludePercent -Activity $activity -StepNumber 0 -Message "Gathering all SQL Server instance versions" + try { + $components = Get-SQLInstanceComponent -ComputerName $resolvedName -Credential $Credential + } catch { + Stop-Function -Message "Error while looking for SQL Server installations on $resolvedName" -Continue -ErrorRecord $_ + } + if (!$components) { + Stop-Function -Message "No SQL Server installations found on $resolvedName" -Continue + } + Write-Message -Level Debug -Message "Found $(($components | Measure-Object).Count) existing SQL Server instance components: $(($components | Foreach-Object { "$($_.InstanceName)($($_.InstanceType) $($_.Version.NameLevel))" }) -join ',')" + # Filter for specific instance name + if ($InstanceName) { + $components = $components | Where-Object {$_.InstanceName -eq $InstanceName } + } + try { + $restartNeeded = Test-PendingReboot -ComputerName $resolvedName -Credential $Credential + } catch { + Stop-Function -Message "Failed to get reboot status from $resolvedName" -Continue -ErrorRecord $_ + } + if ($restartNeeded -and (-not $Restart -or ([DbaInstanceParameter]$resolvedName).IsLocalHost)) { + #Exit the actions loop altogether - nothing can be installed here anyways + Stop-Function -Message "$resolvedName is pending a reboot. Reboot the computer before proceeding." -Continue + } + $upgrades = @() + :actions foreach ($currentAction in $actions) { + # Attempt to configure CredSSP for the remote host when credentials are defined + if ($Credential -and -not ([DbaInstanceParameter]$resolvedName).IsLocalHost -and $Authentication -eq 'Credssp') { + Write-Message -Level Verbose -Message "Attempting to configure CredSSP for remote connections" + Initialize-CredSSP -ComputerName $resolvedName -Credential $Credential -EnableException $false + # Verify remote connection and confirm using unsecure credentials + try { + $secureProtocol = Invoke-Command2 -ComputerName $resolvedName -Credential $Credential -Authentication $Authentication -ScriptBlock { $true } -Raw + } catch { + $secureProtocol = $false + } + # only ask once about using unsecure protocol + if (-not $secureProtocol -and -not $notifiedUnsecure) { + if ($PSCmdlet.ShouldProcess($resolvedName, "Primary protocol ($Authentication) failed, sending credentials via potentially unsecure protocol")) { + $notifiedUnsecure = $true + } else { + Stop-Function -Message "Failed to connect to $resolvedName through $Authentication protocol. No actions will be performed on that computer." -Continue -ContinueLabel computers + } + } + } + # Pass only relevant components + if ($currentAction.MajorVersion) { + Write-Message -Level Debug -Message "Limiting components to version $($currentAction.MajorVersion)" + $selectedComponents = $components | Where-Object { $_.Version.NameLevel -contains $currentAction.MajorVersion } + $currentAction.Remove('MajorVersion') + } else { + $selectedComponents = $components } - Write-Message -Level Verbose -Message "Launching installation on $resolvedName with following params: $($actionParam | ConvertTo-Json -Depth 1 -Compress)" - $install = Install-SqlServerUpdate @actionParam -ComputerName $resolvedName -Credential $Credential -Restart $Restart -Path $Path - if ($install) { - $install - if ($install.Successful -contains $false) { - #Exit the actions loop altogether - upgrade failed - Stop-Function -Message "Update failed to install on $resolvedName" -Continue -ContinueLabel computers + Write-ProgressHelper -ExcludePercent -Activity $activity -Message "Looking for a KB file for a chosen version" + Write-Message -Level Debug -Message "Looking for appropriate KB file on $resolvedName with following params: $($currentAction | ConvertTo-Json -Depth 1 -Compress)" + # get upgrade details for each component + $upgradeDetails = Get-SqlServerUpdate @currentAction -ComputerName $resolvedName -Credential $Credential -Component $selectedComponents + if ($upgradeDetails.Successful -contains $false) { + #Exit the actions loop altogether - upgrade cannot be performed + $upgradeDetails + Stop-Function -Message "Update cannot be applied to $resolvedName | $($upgradeDetails.Notes -join ' | ')" -Continue -ContinueLabel computers + } + + foreach ($detail in $upgradeDetails) { + # search for installer for each target upgrade + $kbLookupParams = @{ + ComputerName = $resolvedName + Credential = $Credential + Authentication = $Authentication + Architecture = $detail.Architecture + MajorVersion = $detail.MajorVersion + Path = $Path + KB = $detail.KB } - if ($install.Restarted -contains $false) { - Stop-Function -Message "Please restart $($install.ComputerName) to complete the installation of SQL$($install.MajorVersion)$($install.TargetLevel). No further updates will be installed on this computer." -EnableException $false -Continue -ContinueLabel computers + try { + $installer = Find-SqlServerUpdate @kbLookupParams + } catch { + Stop-Function -Message "Failed to enumerate files in -Path" -ErrorRecord $_ -Continue + } + if ($installer) { + $detail.Installer = $installer.FullName + } else { + Stop-Function -Message "Could not find installer for the SQL$($detail.MajorVersion) update KB$($detail.KB)" -Continue + } + # update components to mirror the updated version - will be used for multi-step upgrades + foreach ($component in $components) { + if ($component.Version.NameLevel -eq $detail.TargetVersion.NameLevel) { + $component.Version = $detail.TargetVersion + } + } + # finally, add the upgrade details to the upgrade list + $upgrades += $detail + } + } + if ($upgrades) { + Write-ProgressHelper -ExcludePercent -Activity $activity -Message "Preparing installation" + $chosenVersions = ($upgrades | ForEach-Object { "$($_.MajorVersion) to $($_.TargetLevel) (KB$($_.KB))" }) -join ', ' + if ($PSCmdlet.ShouldProcess($resolvedName, "Update $chosenVersions")) { + $installActions += [pscustomobject]@{ + ComputerName = $resolvedName + Actions = $upgrades } } } + Write-Progress -Activity $activity -Completed + } + $explicitAuth = Test-Bound -Parameter Authentication + # Declare the installation script + $installScript = { + $updateSplat = @{ + ComputerName = $_.ComputerName + Action = $_.Actions + Restart = $Restart + Credential = $Credential + EnableException = $EnableException + } + if ($explicitAuth) { $updateSplat.Authentication = $Authentication } + Invoke-DbaAdvancedUpdate @updateSplat + } + # check how many computers we are looking at and decide upon parallelism + if ($installActions.Count -eq 1) { + $installActions | ForEach-Object -Process $installScript | ForEach-Object -Process $outputHandler + } elseif ($installActions.Count -ge 2) { + $installActions | Invoke-Parallel -ImportModules -ImportVariables -ScriptBlock $installScript -Throttle $Throttle | ForEach-Object -Process $outputHandler } } -} \ No newline at end of file +} diff --git a/functions/Write-DbaDataTable.ps1 b/functions/Write-DbaDataTable.ps1 index 88955960e7..7f8636be95 100644 --- a/functions/Write-DbaDataTable.ps1 +++ b/functions/Write-DbaDataTable.ps1 @@ -71,9 +71,6 @@ function Write-DbaDataTable { .PARAMETER BulkCopyTimeOut Value in seconds for the BulkCopy operations timeout. The default is 30 seconds. - .PARAMETER RegularUser - Deprecated - now all connections are regular user (don't require admin) - .PARAMETER WhatIf If this switch is enabled, no actions are performed but informational messages will be displayed that explain what would happen if the command were to run. @@ -107,11 +104,12 @@ function Write-DbaDataTable { Performs a bulk insert of all the data in customers.csv into database mydb, schema dbo, table customers. A progress bar will be shown as rows are inserted. If the destination table does not exist, the import will be halted. .EXAMPLE - PS C:\> $DataTable = Import-Csv C:\temp\customers.csv - PS C:\> $DataTable | Write-DbaDataTable -SqlInstance sql2014 -Table mydb.dbo.customers + PS C:\> $tableName = "MyTestData" + PS C:\> $query = "SELECT name, create_date, owner_sid FROM sys.databases" + PS C:\> $dataset = Invoke-DbaQuery -SqlInstance 'localhost,1417' -SqlCredential $containerCred -Database master -Query $query + PS C:\> $dataset | Select-Object name, create_date, @{L="owner_sid";E={$_."owner_sid"}} | Write-DbaDataTable -SqlInstance 'localhost,1417' -SqlCredential $containerCred -Database tempdb -Table myTestData -Schema dbo -AutoCreateTable - Performs a row by row insert of the data in customers.csv. This is significantly slower than a bulk insert and will not show a progress bar. - This method is not recommended. Use -InputObject instead. + Pulls data from a SQL Server instance and then performs a bulk insert of the dataset to a new, auto-generated table tempdb.dbo.MyTestData. .EXAMPLE PS C:\> $DataTable = Import-Csv C:\temp\customers.csv @@ -189,7 +187,6 @@ function Write-DbaDataTable { [switch]$Truncate, [ValidateNotNull()] [int]$bulkCopyTimeOut = 5000, - [switch]$RegularUser, [Alias('Silent')] [switch]$EnableException, [switch]$UseDynamicStringLength @@ -671,6 +668,5 @@ function Write-DbaDataTable { $bulkCopy.Close() $bulkCopy.Dispose() } - Test-DbaDeprecation -DeprecatedOn 1.0.0 -Parameter RegularUser } } \ No newline at end of file diff --git a/internal/configurations/settings/remoting.ps1 b/internal/configurations/settings/remoting.ps1 index b8d65df05d..ed056456fb 100644 --- a/internal/configurations/settings/remoting.ps1 +++ b/internal/configurations/settings/remoting.ps1 @@ -2,7 +2,4 @@ Set-DbatoolsConfig -FullName 'PSRemoting.Sessions.ExpirationTimeout' -Value (New-TimeSpan -Minutes 5) -Initialize -Validation timespan -Handler { [Sqlcollaborative.Dbatools.Connection.ConnectionHost]::PSSessionTimeout = $args[0] } -Description 'The timeout interval for PowerShell remote sessions. Dbatools will kill sessions that have been idle for this amount of time.' # Disables session caching -Set-DbatoolsConfig -FullName 'PSRemoting.Sessions.Enable' -Value $true -Initialize -Validation bool -Handler { [Sqlcollaborative.Dbatools.Connection.ConnectionHost]::PSSessionCacheEnabled = $args[0] } -Description 'Globally enables session caching for PowerShell remoting' - -# Prefer CredSSP failback in Invoke-Program -Set-DbatoolsConfig -FullName 'PSRemoting.Sessions.UsePSSessionConfiguration' -Value $false -Initialize -Validation bool -Description 'Skip CredSSP connection attempt and use a PSSessionConfiguration workaround when executing Invoke-Program' \ No newline at end of file +Set-DbatoolsConfig -FullName 'PSRemoting.Sessions.Enable' -Value $true -Initialize -Validation bool -Handler { [Sqlcollaborative.Dbatools.Connection.ConnectionHost]::PSSessionCacheEnabled = $args[0] } -Description 'Globally enables session caching for PowerShell remoting' \ No newline at end of file diff --git a/internal/functions/Connect-SqlInstance.ps1 b/internal/functions/Connect-SqlInstance.ps1 index d41a8ea1af..60d68ca690 100644 --- a/internal/functions/Connect-SqlInstance.ps1 +++ b/internal/functions/Connect-SqlInstance.ps1 @@ -43,10 +43,6 @@ function Connect-SqlInstance { .PARAMETER AzureUnsupported Throw if Azure is detected but not supported - .PARAMETER RegularUser - The connection doesn't require SA privileges. - By default, the assumption is that SA is no longer required. - .PARAMETER MinimumVersion The minimum version that the calling command will support @@ -59,307 +55,19 @@ function Connect-SqlInstance { Connect to the Server sql2014 with native credentials. #> [CmdletBinding()] - [Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSAvoidDefaultValueSwitchParameter", "")] - [Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSAvoidUsingEmptyCatchBlock", "")] param ( [Parameter(Mandatory)] - [object]$SqlInstance, - [object]$SqlCredential, - [switch]$ParameterConnection, - [switch]$RegularUser = $true, + [DbaInstanceParameter]$SqlInstance, + [PSCredential]$SqlCredential, [int]$StatementTimeout, [int]$MinimumVersion, [switch]$AzureUnsupported, [switch]$NonPooled ) - - #region Utility functions - function Invoke-TEPPCacheUpdate { - [CmdletBinding()] - param ( - [System.Management.Automation.ScriptBlock]$ScriptBlock - ) - - try { - [ScriptBlock]::Create($scriptBlock).Invoke() - } catch { - # If the SQL Server version doesn't support the feature, we ignore it and silently continue - if ($_.Exception.InnerException.InnerException.GetType().FullName -eq "Microsoft.SqlServer.Management.Sdk.Sfc.InvalidVersionEnumeratorException") { - return - } - - if ($ENV:APPVEYOR_BUILD_FOLDER -or ([Sqlcollaborative.Dbatools.Message.MEssageHost]::DeveloperMode)) { throw } - else { - Write-Message -Level Warning -Message "Failed TEPP Caching: $($scriptBlock.ToString() | Select-String '"(.*?)"' | ForEach-Object { $_.Matches[0].Groups[1].Value })" -ErrorRecord $_ 3>$null - } - } - } - #endregion Utility functions - - #region Ensure Credential integrity - <# - Usually, the parameter type should have been not object but off the PSCredential type. - When binding null to a PSCredential type parameter on PS3-4, it'd then show a prompt, asking for username and password. - - In order to avoid that and having to refactor lots of functions (and to avoid making regular scripts harder to read), we created this workaround. - #> - if ($SqlCredential) { - if ($SqlCredential.GetType() -ne [System.Management.Automation.PSCredential]) { - throw "The credential parameter was of a non-supported type. Only specify PSCredentials such as generated from Get-Credential. Input was of type $($SqlCredential.GetType().FullName)" - } - } - #endregion Ensure Credential integrity - - #region Safely convert input into instance parameters - <# - This is a bit ugly, but: - In some cases functions would directly pass their own input through when the parameter on the calling function was typed as [object[]]. - This would break the base parameter class, as it'd automatically be an array and the parameterclass is not designed to handle arrays (Shouldn't have to). - - Note: Multiple servers in one call were never supported, those old functions were liable to break anyway and should be fixed soonest. - #> - if ($SqlInstance.GetType() -eq [Sqlcollaborative.Dbatools.Parameter.DbaInstanceParameter]) { - [DbaInstanceParameter]$ConvertedSqlInstance = $SqlInstance - if ($ConvertedSqlInstance.Type -like "SqlConnection") { - [DbaInstanceParameter]$ConvertedSqlInstance = New-Object Microsoft.SqlServer.Management.Smo.Server($ConvertedSqlInstance.InputObject) - } + if ($SqlInstance.InputObject.GetType().Name -eq 'Server') { + $SqlInstance.InputObject.Refresh() + return $SqlInstance.InputObject } else { - [DbaInstanceParameter]$ConvertedSqlInstance = [DbaInstanceParameter]($SqlInstance | Select-Object -First 1) - - if ($SqlInstance.Count -gt 1) { - Write-Message -Level Warning -EnableException $true -Message "More than on server was specified when calling Connect-SqlInstance from $((Get-PSCallStack)[1].Command)" - } - } - #endregion Safely convert input into instance parameters - - #region Input Object was a server object - if ($ConvertedSqlInstance.InputObject.GetType() -eq [Microsoft.SqlServer.Management.Smo.Server]) { - $server = $ConvertedSqlInstance.InputObject - $authtypeSMO = $SqlCredential.UserName -like '*\*' - if ($server.ConnectionContext.IsOpen -eq $false) { - if ($NonPooled) { - # When the Connect method is called, the connection is not automatically released. - # The Disconnect method must be called explicitly to release the connection to the connection pool. - # https://docs.microsoft.com/en-us/sql/relational-databases/server-management-objects-smo/create-program/disconnecting-from-an-instance-of-sql-server - $server.ConnectionContext.Connect() - } elseif ($authtypeSMO -eq "Windows Authentication with Credential") { - # Make it connect in a natural way, hard to explain. - # See https://docs.microsoft.com/en-us/sql/relational-databases/server-management-objects-smo/create-program/connecting-to-an-instance-of-sql-server - $null = $server.Information.Version - - # Sometimes, however, the above may not connect as promised. Force it. - # See https://github.com/sqlcollaborative/dbatools/pull/4426 - if ($server.ConnectionContext.IsOpen -eq $false) { - $server.ConnectionContext.Connect() - } - } else { - # SqlConnectionObject.Open() enables connection pooling does not support - # alternative Windows Credentials and passes default credentials - # See https://github.com/sqlcollaborative/dbatools/pull/3809 - $server.ConnectionContext.SqlConnectionObject.Open() - } - } - - # Register the connected instance, so that the TEPP updater knows it's been connected to and starts building the cache - [Sqlcollaborative.Dbatools.TabExpansion.TabExpansionHost]::SetInstance($ConvertedSqlInstance.FullSmoName.ToLower(), $server.ConnectionContext.Copy(), ($server.ConnectionContext.FixedServerRoles -match "SysAdmin")) - - # Update cache for instance names - if ([Sqlcollaborative.Dbatools.TabExpansion.TabExpansionHost]::Cache["sqlinstance"] -notcontains $ConvertedSqlInstance.FullSmoName.ToLower()) { - [Sqlcollaborative.Dbatools.TabExpansion.TabExpansionHost]::Cache["sqlinstance"] += $ConvertedSqlInstance.FullSmoName.ToLower() - } - - # Update lots of registered stuff - if (-not [Sqlcollaborative.Dbatools.TabExpansion.TabExpansionHost]::TeppSyncDisabled) { - $FullSmoName = $ConvertedSqlInstance.FullSmoName.ToLower() - foreach ($scriptBlock in ([Sqlcollaborative.Dbatools.TabExpansion.TabExpansionHost]::TeppGatherScriptsFast)) { - Invoke-TEPPCacheUpdate -ScriptBlock $scriptBlock - } - } - - # Make ComputerName easily available in the server object - if (-not $server.ComputerName) { - if (-not $server.NetName -or $SqlInstance -match '\.') { - $parsedcomputername = $ConvertedSqlInstance.ComputerName - } else { - $parsedcomputername = $server.NetName - } - Add-Member -InputObject $server -NotePropertyName ComputerName -NotePropertyValue $parsedcomputername -Force - } - return $server - } - #endregion Input Object was a server object - - #region Input Object was anything else - - $server = New-Object Microsoft.SqlServer.Management.Smo.Server $ConvertedSqlInstance.FullSmoName - $server.ConnectionContext.ApplicationName = "dbatools PowerShell module - dbatools.io" - if ($ConvertedSqlInstance.IsConnectionString) { $server.ConnectionContext.ConnectionString = $ConvertedSqlInstance.InputObject } - - try { - if (Test-Bound -ParameterName 'StatementTimeout') { - $server.ConnectionContext.StatementTimeout = $StatementTimeout - } - $server.ConnectionContext.ConnectTimeout = [Sqlcollaborative.Dbatools.Connection.ConnectionHost]::SqlConnectionTimeout - - if ($null -ne $SqlCredential.UserName) { - $username = ($SqlCredential.UserName).TrimStart("\") - - # support both ad\username and username@ad - if ($username -like "*\*" -or $username -like "*@*") { - if ($username -like "*\*") { - $domain, $login = $username.Split("\") - $authtype = "Windows Authentication with Credential" - if ($domain) { - $formatteduser = "$login@$domain" - } else { - $formatteduser = $username.Split("\")[1] - } - } else { - $formatteduser = $SqlCredential.UserName - } - - $server.ConnectionContext.LoginSecure = $true - $server.ConnectionContext.ConnectAsUser = $true - $server.ConnectionContext.ConnectAsUserName = $formatteduser - $server.ConnectionContext.ConnectAsUserPassword = ($SqlCredential).GetNetworkCredential().Password - } else { - $authtype = "SQL Authentication" - $server.ConnectionContext.LoginSecure = $false - $server.ConnectionContext.set_Login($username) - $server.ConnectionContext.set_SecurePassword($SqlCredential.Password) - } - } - } catch { } - - try { - if ($NonPooled) { - # When the Connect method is called, the connection is not automatically released. - # The Disconnect method must be called explicitly to release the connection to the connection pool. - # https://docs.microsoft.com/en-us/sql/relational-databases/server-management-objects-smo/create-program/disconnecting-from-an-instance-of-sql-server - $server.ConnectionContext.Connect() - } elseif ($authtype -eq "Windows Authentication with Credential") { - # Make it connect in a natural way, hard to explain. - # See https://docs.microsoft.com/en-us/sql/relational-databases/server-management-objects-smo/create-program/connecting-to-an-instance-of-sql-server - $null = $server.Information.Version - - # Sometimes, however, the above may not connect as promised. Force it. - # See https://github.com/sqlcollaborative/dbatools/pull/4426 - if ($server.ConnectionContext.IsOpen -eq $false) { - $server.ConnectionContext.Connect() - } - } else { - # SqlConnectionObject.Open() enables connection pooling does not support - # alternative Windows Credentials and passes default credentials - # See https://github.com/sqlcollaborative/dbatools/pull/3809 - $server.ConnectionContext.SqlConnectionObject.Open() - } - } catch { - $message = $_.Exception.InnerException.InnerException - if ($message) { - # This is messy but it works to provide users with straightforward & detailed errors - $message = $message.ToString() - $message = ($message -Split '-->')[0] - $message = ($message -Split 'at System.Data.SqlClient')[0] - $message = ($message -Split 'at System.Data.ProviderBase')[0] - - if ($message -match "network path was not found") { - $message = "Can't connect to $sqlinstance`: System.Data.SqlClient.SqlException (0x80131904): A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections." - } - - throw "Can't connect to $ConvertedSqlInstance`: $message " - } else { - throw $_ - } - } - - if ($MinimumVersion -and $server.VersionMajor) { - if ($server.versionMajor -lt $MinimumVersion) { - throw "SQL Server version $MinimumVersion required - $server not supported." - } - } - - if ($AzureUnsupported -and $server.DatabaseEngineType -eq "SqlAzureDatabase") { - throw "Azure SQL Database not supported" - } - - if (-not $RegularUser) { - if ($server.ConnectionContext.FixedServerRoles -notmatch "SysAdmin") { - throw "Not a sysadmin on $ConvertedSqlInstance. Quitting." - } - } - #'PrimaryFilePath' seems the culprit for slow SMO on databases - $Fields2000_Db = 'Collation', 'CompatibilityLevel', 'CreateDate', 'ID', 'IsAccessible', 'IsFullTextEnabled', 'IsSystemObject', 'IsUpdateable', 'LastBackupDate', 'LastDifferentialBackupDate', 'LastLogBackupDate', 'Name', 'Owner', 'ReadOnly', 'RecoveryModel', 'ReplicationOptions', 'Status', 'Version' - $Fields200x_Db = $Fields2000_Db + @('BrokerEnabled', 'DatabaseSnapshotBaseName', 'IsMirroringEnabled', 'Trustworthy') - $Fields201x_Db = $Fields200x_Db + @('ActiveConnections', 'AvailabilityDatabaseSynchronizationState', 'AvailabilityGroupName', 'ContainmentType', 'EncryptionEnabled') - - $Fields2000_Login = 'CreateDate', 'DateLastModified', 'DefaultDatabase', 'DenyWindowsLogin', 'IsSystemObject', 'Language', 'LanguageAlias', 'LoginType', 'Name', 'Sid', 'WindowsLoginAccessType' - $Fields200x_Login = $Fields2000_Login + @('AsymmetricKey', 'Certificate', 'Credential', 'ID', 'IsDisabled', 'IsLocked', 'IsPasswordExpired', 'MustChangePassword', 'PasswordExpirationEnabled', 'PasswordPolicyEnforced') - $Fields201x_Login = $Fields200x_Login + @('PasswordHashAlgorithm') - - try { - if ($Server.ServerType -ne 'SqlAzureDatabase') { - $server.SetDefaultInitFields([Microsoft.SqlServer.Management.Smo.Trigger], 'IsSystemObject') - $server.SetDefaultInitFields([Microsoft.SqlServer.Management.Smo.Schema], 'IsSystemObject') - $server.SetDefaultInitFields([Microsoft.SqlServer.Management.Smo.SqlAssembly], 'IsSystemObject') - $server.SetDefaultInitFields([Microsoft.SqlServer.Management.Smo.Table], 'IsSystemObject') - $server.SetDefaultInitFields([Microsoft.SqlServer.Management.Smo.View], 'IsSystemObject') - $server.SetDefaultInitFields([Microsoft.SqlServer.Management.Smo.StoredProcedure], 'IsSystemObject') - $server.SetDefaultInitFields([Microsoft.SqlServer.Management.Smo.UserDefinedFunction], 'IsSystemObject') - - if ($server.VersionMajor -eq 8) { - # 2000 - $initFieldsDb = New-Object System.Collections.Specialized.StringCollection - [void]$initFieldsDb.AddRange($Fields2000_Db) - $initFieldsLogin = New-Object System.Collections.Specialized.StringCollection - [void]$initFieldsLogin.AddRange($Fields2000_Login) - $server.SetDefaultInitFields([Microsoft.SqlServer.Management.Smo.Database], $initFieldsDb) - $server.SetDefaultInitFields([Microsoft.SqlServer.Management.Smo.Login], $initFieldsLogin) - } elseif ($server.VersionMajor -eq 9 -or $server.VersionMajor -eq 10) { - # 2005 and 2008 - $initFieldsDb = New-Object System.Collections.Specialized.StringCollection - [void]$initFieldsDb.AddRange($Fields200x_Db) - $initFieldsLogin = New-Object System.Collections.Specialized.StringCollection - [void]$initFieldsLogin.AddRange($Fields200x_Login) - $server.SetDefaultInitFields([Microsoft.SqlServer.Management.Smo.Database], $initFieldsDb) - $server.SetDefaultInitFields([Microsoft.SqlServer.Management.Smo.Login], $initFieldsLogin) - } else { - # 2012 and above - $initFieldsDb = New-Object System.Collections.Specialized.StringCollection - [void]$initFieldsDb.AddRange($Fields201x_Db) - $initFieldsLogin = New-Object System.Collections.Specialized.StringCollection - [void]$initFieldsLogin.AddRange($Fields201x_Login) - $server.SetDefaultInitFields([Microsoft.SqlServer.Management.Smo.Database], $initFieldsDb) - $server.SetDefaultInitFields([Microsoft.SqlServer.Management.Smo.Login], $initFieldsLogin) - } - } - } catch { - # perhaps a DLL issue, continue going - } - - # Register the connected instance, so that the TEPP updater knows it's been connected to and starts building the cache - [Sqlcollaborative.Dbatools.TabExpansion.TabExpansionHost]::SetInstance($ConvertedSqlInstance.FullSmoName.ToLower(), $server.ConnectionContext.Copy(), ($server.ConnectionContext.FixedServerRoles -match "SysAdmin")) - - # Update cache for instance names - if ([Sqlcollaborative.Dbatools.TabExpansion.TabExpansionHost]::Cache["sqlinstance"] -notcontains $ConvertedSqlInstance.FullSmoName.ToLower()) { - [Sqlcollaborative.Dbatools.TabExpansion.TabExpansionHost]::Cache["sqlinstance"] += $ConvertedSqlInstance.FullSmoName.ToLower() - } - - # Update lots of registered stuff - if (-not [Sqlcollaborative.Dbatools.TabExpansion.TabExpansionHost]::TeppSyncDisabled) { - $FullSmoName = $ConvertedSqlInstance.FullSmoName.ToLower() - foreach ($scriptBlock in ([Sqlcollaborative.Dbatools.TabExpansion.TabExpansionHost]::TeppGatherScriptsFast)) { - Invoke-TEPPCacheUpdate -ScriptBlock $scriptBlock - } - } - - if (-not $server.ComputerName) { - if (-not $server.NetName -or $SqlInstance -match '\.') { - $parsedcomputername = $ConvertedSqlInstance.ComputerName - } else { - $parsedcomputername = $server.NetName - } - Add-Member -InputObject $server -NotePropertyName ComputerName -NotePropertyValue $parsedcomputername -Force + Connect-DbaInstance @PSBoundParameters -ClientName "dbatools PowerShell module - dbatools.io" } - return $server - #endregion Input Object was anything else } \ No newline at end of file diff --git a/internal/functions/Find-SqlServerUpdate.ps1 b/internal/functions/Find-SqlServerUpdate.ps1 index a23baeecbf..6aac179b89 100644 --- a/internal/functions/Find-SqlServerUpdate.ps1 +++ b/internal/functions/Find-SqlServerUpdate.ps1 @@ -15,6 +15,10 @@ function Find-SqlServerUpdate { [CmdletBinding()] Param ( + [DbaInstanceParameter]$ComputerName, + [pscredential]$Credential, + [ValidateSet('Default', 'Basic', 'Negotiate', 'NegotiateWithImplicitCredential', 'Credssp', 'Digest', 'Kerberos')] + [string]$Authentication = 'Default', [Parameter(Mandatory)] [ValidateNotNullOrEmpty()] [string]$MajorVersion, @@ -23,29 +27,38 @@ function Find-SqlServerUpdate { [string]$KB, [ValidateSet('x86', 'x64')] [string]$Architecture = 'x64', - [string[]]$Path = (Get-DbatoolsConfigValue -Name 'Path.SQLServerUpdates'), - [bool]$EnableException = $EnableException + [string[]]$Path = (Get-DbatoolsConfigValue -Name 'Path.SQLServerUpdates') ) begin { } process { if (!$Path) { - Stop-Function -Message "Path to SQL Server updates folder is not set. Consider running Set-DbatoolsConfig -Name Path.SQLServerUpdates -Value '\\path\to\updates' or specify the path in the original command" - return + throw "Path to SQL Server updates folder is not set. Consider running Set-DbatoolsConfig -Name Path.SQLServerUpdates -Value '\\path\to\updates' or specify the path in the original command" } $filter = "SQLServer$MajorVersion*-KB$KB-*$Architecture*.exe" Write-Message -Level Verbose -Message "Using filter [$filter] to check for updates in $Path" - try { + $getFileScript = { + Param ( + $Path, + $Filter + ) foreach ($folder in (Get-Item -Path $Path -ErrorAction Stop)) { $file = Get-ChildItem -Path $folder -Filter $filter -File -Recurse -ErrorAction Stop if ($file) { return $file | Select-Object -First 1 } } - } catch { - Stop-Function -Message "Failed to enumerate files in $Path" -ErrorRecord $_ - return } + $params = @{ + ComputerName = $ComputerName + Credential = $Credential + Authentication = $Authentication + ScriptBlock = $getFileScript + ArgumentList = @($Path, $filter) + ErrorAction = 'Stop' + Raw = $true + } + Invoke-CommandWithFallback @params } } \ No newline at end of file diff --git a/internal/functions/Get-DecryptedObject.ps1 b/internal/functions/Get-DecryptedObject.ps1 index 2d4d885397..8a65c254aa 100644 --- a/internal/functions/Get-DecryptedObject.ps1 +++ b/internal/functions/Get-DecryptedObject.ps1 @@ -112,7 +112,7 @@ function Get-DecryptedObject { $sql = switch ($Type) { "LinkedServer" { "SELECT sysservers.srvname, - syslnklgns.Name, + syslnklgns.name, substring(syslnklgns.pwdhash,5,$ivlen) iv, substring(syslnklgns.pwdhash,$($ivlen + 5), len(syslnklgns.pwdhash)-$($ivlen + 4)) pass @@ -122,7 +122,7 @@ function Get-DecryptedObject { WHERE len(pwdhash) > 0" } "Credential" { - "SELECT QUOTENAME(name) AS name,credential_identity,substring(imageval,5,$ivlen) iv, substring(imageval,$($ivlen + 5),len(imageval)-$($ivlen + 4)) pass from sys.Credentials cred inner join sys.sysobjvalues obj on cred.credential_id = obj.objid where valclass=28 and valnum=2" + "SELECT QUOTENAME(name) AS name,credential_identity,substring(imageval,5,$ivlen) iv, substring(imageval,$($ivlen + 5),len(imageval)-$($ivlen + 4)) pass from sys.credentials cred inner join sys.sysobjvalues obj on cred.credential_id = obj.objid where valclass=28 and valnum=2" } } diff --git a/internal/functions/Get-SqlInstanceComponent.ps1 b/internal/functions/Get-SqlInstanceComponent.ps1 index e72aa37e10..0758e22828 100644 --- a/internal/functions/Get-SqlInstanceComponent.ps1 +++ b/internal/functions/Get-SqlInstanceComponent.ps1 @@ -69,8 +69,7 @@ function Get-SQLInstanceComponent { [DbaInstanceParameter[]]$ComputerName = $Env:COMPUTERNAME, [ValidateSet('SSDS', 'SSAS', 'SSRS')] [string[]]$Component = @('SSDS', 'SSAS', 'SSRS'), - [pscredential]$Credential, - [bool]$EnableException = $EnableException + [pscredential]$Credential ) begin { @@ -207,12 +206,7 @@ function Get-SQLInstanceComponent { # attempt to recover a real version of a sqlservr.exe by getting file properties from a remote machine # not sure how to support SSRS/SSAS, as SSDS is the only one that has binary path in the Setup node if ($binRoot = $instanceRegSetup.GetValue("SQLBinRoot")) { - $fileVersion = Invoke-Command2 -ArgumentList $binRoot -Raw -Credential $Credential -ComputerName $computer -ScriptBlock { - Param ( - $Path - ) - (Get-Item -Path (Join-Path $Path "sqlservr.exe") -ErrorAction Stop).VersionInfo.ProductVersion - } + $fileVersion = (Get-Item -Path (Join-Path $binRoot "sqlservr.exe") -ErrorAction Stop).VersionInfo.ProductVersion if ($fileVersion) { $version = $fileVersion $log += "New version from the binary file: $version" @@ -228,10 +222,6 @@ function Get-SQLInstanceComponent { #region Generate return object [pscustomobject]@{ ComputerName = $computer.ToUpper(); - InstanceType = { - $componentNameMap | Where-Object { $_.ComponentName -eq $componentName } | - Select-Object -ExpandProperty DisplayName - }.InvokeReturnAsIs(); InstanceName = $sqlInstance; InstanceID = $instanceValue; InstanceDir = $instanceDir; @@ -289,7 +279,8 @@ function Get-SQLInstanceComponent { foreach ($regValueName in $regKey.GetValueNames()) { if ($componentRegKeyName -eq 'RS' -and $regValueName -eq 'PBIRS') { continue } #filtering out Power BI - not supported if ($componentRegKeyName -eq 'RS' -and $regValueName -eq 'SSRS') { continue } #filtering out SSRS2017+ - not supported - Get-SQLInstanceDetail -RegPath $regPath -Reg $reg -RegKey $regKey -Instance $regValueName; + $result = Get-SQLInstanceDetail -RegPath $regPath -Reg $reg -RegKey $regKey -Instance $regValueName; + $result | Add-Member -Type NoteProperty -Name InstanceType -Value ($componentNameMap | Where-Object { $_.ComponentName -eq $componentName }).DisplayName -PassThru } } } @@ -305,11 +296,8 @@ function Get-SQLInstanceComponent { } process { foreach ($computer in $ComputerName) { - try { - $results = Invoke-Command2 -ComputerName $computer -ScriptBlock $regScript -Credential $Credential -ErrorAction Stop -Raw -ArgumentList @($Component) - } catch { - Stop-Function -Message "Failed to get instance components from $computer" -ErrorRecord $_ -Continue - } + $results = Invoke-Command2 -ComputerName $computer -ScriptBlock $regScript -Credential $Credential -ErrorAction Stop -Raw -ArgumentList @($Component) -RequiredPSVersion 3.0 + # Log is stored in the log property, pile it all into the debug log foreach ($logEntry in $results.Log) { Write-Message -Level Debug -Message $logEntry @@ -322,7 +310,7 @@ function Get-SQLInstanceComponent { $newVersion = New-Object -TypeName System.Version -ArgumentList ($newVersion.Major , ($newVersion.Minor - $newVersion.Minor % 10), $newVersion.Build) Write-Message -Level Debug -Message "Converted version $($result.Version) to $newVersion" #Find a proper build reference and replace Version property - $result.Version = Get-DbaBuildReference -Build $newVersion + $result.Version = Get-DbaBuildReference -Build $newVersion -EnableException $result | Select-Object -ExcludeProperty Log } } diff --git a/internal/functions/Get-SqlServerUpdate.ps1 b/internal/functions/Get-SqlServerUpdate.ps1 new file mode 100644 index 0000000000..61ad02050e --- /dev/null +++ b/internal/functions/Get-SqlServerUpdate.ps1 @@ -0,0 +1,175 @@ +function Get-SqlServerUpdate { + <# + Originally based on https://github.com/adbertram/PSSqlUpdater + Internal function. Provides information on the target update version for a specific set of SQL Server instances based on current and target SQL Server levels. + Component parameter is using the output object of Get-SqlInstanceComponent. + #> + [CmdletBinding(DefaultParameterSetName = 'Latest')] + param + ( + [Parameter(Mandatory)] + [ValidateNotNullOrEmpty()] + [DbaInstanceParameter]$ComputerName, + [pscredential]$Credential, + [Parameter(Mandatory, ParameterSetName = 'Latest')] + [ValidateSet('ServicePack', 'CumulativeUpdate')] + [string]$Type, + [object[]]$Component, + [Parameter(ParameterSetName = 'Number')] + [int]$ServicePack, + [Parameter(ParameterSetName = 'Number')] + [int]$CumulativeUpdate, + [Parameter(Mandatory, ParameterSetName = 'KB')] + [ValidateNotNullOrEmpty()] + [string]$KB, + [string]$InstanceName, + [bool]$EnableException = $EnableException, + [bool]$Continue + ) + process { + + # check if any type of the update was specified + if ($PSCmdlet.ParameterSetName -eq 'Number' -and -not ((Test-Bound ServicePack) -or (Test-Bound CumulativeUpdate))) { + Stop-Function -Message "No update was specified, provide at least one value for either SP/CU" + return + } + $computer = $ComputerName.ComputerName + $verCount = ($Component | Measure-Object).Count + $verDesc = ($Component | Foreach-Object { "$($_.Version.NameLevel) ($($_.Version.Build))" }) -join ', ' + Write-Message -Level Debug -Message "Selected $verCount existing SQL Server version(s): $verDesc" + + # Group by version + $currentVersionGroups = $Component | Group-Object -Property { $_.Version.NameLevel } + #Check if more than one version is found + if (($currentVersionGroups | Measure-Object ).Count -gt 1 -and ($CumulativeUpdate -or $ServicePack) -and !$MajorVersion) { + Stop-Function -Message "Updating multiple different versions of SQL Server to a specific SP/CU is not supported. Please specify a version of SQL Server on $computer that you want to update." + return + } + ## Find the architecture of the computer + if ($arch = (Get-DbaCmObject -ComputerName $computer -ClassName 'Win32_ComputerSystem').SystemType) { + if ($arch -eq 'x64-based PC') { + $arch = 'x64' + } else { + $arch = 'x86' + } + } else { + Write-Message -Level Warning -Message "Failed to determine the arch of $computer, using x64 by default" + $arch = 'x64' + } + $targetLevel = '' + # Launch a setup sequence for each version found + foreach ($currentGroup in $currentVersionGroups) { + $currentMajorVersion = "SQL" + $currentGroup.Name + $currentMajorNumber = $currentGroup.Name + + # Use the earliest version in case specifics are needed + $currentVersion = $currentGroup.Group | Sort-Object -Property { $_.Version.BuildLevel } | Select-Object -ExpandProperty Version -First 1 + + #create output object + $output = [pscustomobject]@{ + ComputerName = $ComputerName + MajorVersion = $currentMajorNumber + Build = $currentVersion.Build + Architecture = $arch + TargetVersion = $null + TargetLevel = $null + KB = $null + Successful = $false + Restarted = $false + InstanceName = $InstanceName + Installer = $null + ExtractPath = $null + Notes = @() + ExitCode = $null + Log = $null + } + + # Find target KB number based on provided SP/CU levels or KB numbers + if ($CumulativeUpdate -gt 0) { + #Cumulative update is present - installing CU + if (Test-Bound -Parameter ServicePack) { + #Service pack is present - using it as a reference + $targetKB = Get-DbaBuildReference -MajorVersion $currentMajorNumber -ServicePack $ServicePack -CumulativeUpdate $CumulativeUpdate + } else { + #Service pack not present - using current SP level + $targetSP = $currentVersion.SPLevel | Where-Object { $_ -ne 'LATEST' } | Select-Object -First 1 + $targetKB = Get-DbaBuildReference -MajorVersion $currentMajorNumber -ServicePack $targetSP -CumulativeUpdate $CumulativeUpdate + } + } elseif ($ServicePack -gt 0) { + #Service pack number was passed without CU - installing service pack + $targetKB = Get-DbaBuildReference -MajorVersion $currentMajorNumber -ServicePack $ServicePack + } elseif ($KB) { + $targetKB = Get-DbaBuildReference -KB $KB + if ($targetKB -and $currentMajorNumber -ne $targetKB.NameLevel) { + Write-Message -Level Debug -Message "$($targetKB.NameLevel) is not a target Major version $($currentMajorNumber), skipping" + continue + } + } else { + #No parameters = latest patch. Find latest SQL Server build and corresponding SP and CU KBs + $latestCU = Test-DbaBuild -Build $currentVersion.BuildLevel -MaxBehind '0CU' + if (!$latestCU.Compliant) { + #more recent build is found, get KB number depending on what is the current upgrade $Type + $targetKB = Get-DbaBuildReference -Build $latestCU.BuildTarget + $targetSP = $targetKB.SPLevel | Where-Object { $_ -ne 'LATEST' } | Select-Object -First 1 + if ($Type -eq 'CumulativeUpdate') { + if ($currentVersion.SPLevel -notcontains 'LATEST') { + $currentSP = $currentVersion.SPLevel | Where-Object { $_ -ne 'LATEST' } | Select-Object -First 1 + Stop-Function -Message "Current SP version $currentMajorVersion$currentSP is not the latest available. Make sure to upgade to latest SP level before applying latest CU." -Continue + } + $targetLevel = "$($targetKB.SPLevel | Where-Object { $_ -ne 'LATEST' })$($targetKB.CULevel)" + Write-Message -Level Debug -Message "Found a latest Cumulative Update $targetLevel (KB$($targetKB.KBLevel))" + } elseif ($Type -eq 'ServicePack') { + $targetKB = Get-DbaBuildReference -MajorVersion $targetKB.NameLevel -ServicePack $targetSP + $targetLevel = $targetKB.SPLevel | Where-Object { $_ -ne 'LATEST' } + if ($currentVersion.SPLevel -contains 'LATEST') { + Write-Message -Message "No need to update $currentMajorVersion to $targetLevel - it's already on the latest SP version" -Level Verbose + continue + } + Write-Message -Level Debug -Message "Found a latest Service Pack $targetLevel (KB$($targetKB.KBLevel))" + } + } else { + Write-Message -Message "$($currentVersion.Build) on computer [$($computer)] is already the latest available." -Level Verbose + continue + } + } + if ($targetKB.KBLevel) { + if ($targetKB.MatchType -ne 'Exact') { + Stop-Function -Message "Couldn't find an exact build match with specified parameters while updating $currentMajorVersion" -Continue + } + $output.TargetVersion = $targetKB + $targetLevel = "$($targetKB.SPLevel | Where-Object { $_ -ne 'LATEST' })$($targetKB.CULevel)" + $targetKBLevel = $targetKB.KBLevel | Select-Object -First 1 + Write-Message -Level Verbose -Message "Found applicable upgrade for SQL$($targetKB.NameLevel) to $targetLevel (KB$($targetKBLevel))" + $output.KB = $targetKBLevel + } else { + $msg = "Could not find a KB$KB reference for $currentMajorVersion SP $ServicePack CU $CumulativeUpdate" + $output.Notes += $msg + $output + Stop-Function -Message $msg -Continue + } + + # Compare versions - whether to proceed with the installation + $needsUpgrade = $false + foreach ($currentComponent in $currentGroup.Group) { + $groupVersion = $currentComponent.Version + #target version is less than requested + if ($groupVersion.BuildLevel -lt $targetKB.BuildLevel) { + $needsUpgrade = $true + } + #target version is the same but installation has failed last time + elseif ($groupVersion.BuildLevel -eq $targetKB.BuildLevel -and $Continue -and $currentComponent.Resume) { + $needsUpgrade = $true + } + } + if (!$needsUpgrade) { + Write-Message -Message "Current $currentMajorVersion version $($currentVersion.BuildLevel) on computer [$($computer)] matches or already higher than target version $($targetKB.BuildLevel)" -Level Verbose + continue + } + + $output.TargetLevel = $targetLevel + $output.Successful = $true + #Return the object for further processing + $output + } + } +} \ No newline at end of file diff --git a/internal/functions/Get-XpDirTreeRestoreFile.ps1 b/internal/functions/Get-XpDirTreeRestoreFile.ps1 index 8972d7f174..c65cecebb7 100644 --- a/internal/functions/Get-XpDirTreeRestoreFile.ps1 +++ b/internal/functions/Get-XpDirTreeRestoreFile.ps1 @@ -49,10 +49,10 @@ function Get-XpDirTreeRestoreFile { } if (!(Test-DbaPath -SqlInstance $server -path $path)) { - Stop-Function -Message "SqlInstance $SqlInstance cannot access $path" -EnableException $true + Stop-Function -Message "SqlInstance $SqlInstance cannot access $path" } if (!(Test-DbaPath -SqlInstance $server -path $Path)) { - Stop-Function -Message "SqlInstance $SqlInstance cannot access $Path" -EnableException $true + Stop-Function -Message "SqlInstance $SqlInstance cannot access $Path" } if ($server.VersionMajor -ge 14) { # this is all kinds of cool, api could be expanded sooo much here @@ -79,4 +79,4 @@ function Get-XpDirTreeRestoreFile { } } return $Results -} \ No newline at end of file +} diff --git a/internal/functions/Initialize-CredSSP.ps1 b/internal/functions/Initialize-CredSSP.ps1 index 01c5774238..6311950cc8 100644 --- a/internal/functions/Initialize-CredSSP.ps1 +++ b/internal/functions/Initialize-CredSSP.ps1 @@ -63,12 +63,11 @@ function Initialize-CredSSP { # Configure remote machine Write-Message -Level Verbose -Message "Configuring remote host to use CredSSP" try { - Invoke-Command2 -ComputerName $ComputerName -Credential $Credential -Raw -ScriptBlock { + Invoke-Command2 -ComputerName $ComputerName -Credential $Credential -Raw -RequiredPSVersion 3.0 -ScriptBlock { $sspList = Get-WSManCredSSP -ErrorAction Stop if ($sspList[1] -ne 'This computer is configured to receive credentials from a remote client computer.') { $null = Enable-WSManCredSSP -Role Server -Force -ErrorAction Stop } - # netsh http add iplisten 127.0.0.1 - whaattt? } } catch { Stop-Function -Message "Failed to configure remote CredSSP on $ComputerName as a server" -ErrorRecord $_ diff --git a/internal/functions/Install-SqlServerUpdate.ps1 b/internal/functions/Install-SqlServerUpdate.ps1 deleted file mode 100644 index db94e2a426..0000000000 --- a/internal/functions/Install-SqlServerUpdate.ps1 +++ /dev/null @@ -1,260 +0,0 @@ -function Install-SqlServerUpdate { - <# - Originally based on https://github.com/adbertram/PSSqlUpdater - Internal function. Invokes installation of a single SQL Server KB based on provided parameters. - #> - [CmdletBinding(SupportsShouldProcess, ConfirmImpact = 'High', DefaultParameterSetName = 'Latest')] - param - ( - [Parameter(Mandatory)] - [ValidateNotNullOrEmpty()] - [DbaInstanceParameter]$ComputerName, - [pscredential]$Credential, - [Parameter(Mandatory, ParameterSetName = 'Latest')] - [ValidateSet('ServicePack', 'CumulativeUpdate')] - [string]$Type, - [string[]]$MajorVersion, - [Parameter(ParameterSetName = 'Number')] - [int]$ServicePack, - [Parameter(ParameterSetName = 'Number')] - [int]$CumulativeUpdate, - [Parameter(Mandatory, ParameterSetName = 'KB')] - [ValidateNotNullOrEmpty()] - [string]$KB, - [bool]$Restart, - [string]$InstanceName, - [string[]]$Path, - [bool]$EnableException = $EnableException, - [bool]$Continue - ) - process { - # check if any type of the update was specified - if ($PSCmdlet.ParameterSetName -eq 'Number' -and -not ((Test-Bound ServicePack) -or (Test-Bound CumulativeUpdate))) { - Stop-Function -Message "No update was specified, provide at least one value for either SP/CU" - return - } - $computer = $ComputerName.ComputerName - $activity = "Updating SQL instance builds on $computer" - - ## Find the current version on the computer - Write-ProgressHelper -ExcludePercent -Activity $activity -StepNumber 0 -Message "Gathering all SQL Server instance versions" - $components = Get-SQLInstanceComponent -ComputerName $computer -Credential $Credential - if (!$components) { - Stop-Function -Message "No SQL Server installations found on $computer" - return - } - Write-Message -Level Debug -Message "Found $(($components | Measure-Object).Count) existing SQL Server instance components: $(($components | Foreach-Object { "$($_.InstanceName)($($_.InstanceType))" }) -join ',')" - # Filter for specific instances - if ($InstanceName) { - $components = $components | Where-Object {$_.InstanceName -eq $InstanceName } - } - if ($MajorVersion) { - $components = $components | Where-Object { $_.Version.NameLevel -in $MajorVersion } - } - $verCount = ($components | Measure-Object).Count - $verDesc = ($components | Foreach-Object { "$($_.Version.NameLevel) ($($_.Version.Build))" }) -join ', ' - Write-Message -Level Debug -Message "Selected $verCount existing SQL Server version(s): $verDesc" - # Group by version - $currentVersionGroups = $components | Group-Object -Property { $_.Version.NameLevel } - #Check if more than one version is found - if (($currentVersionGroups | Measure-Object ).Count -gt 1 -and ($CumulativeUpdate -or $ServicePack) -and !$MajorVersion) { - Stop-Function -Message "Updating multiple different versions of SQL Server to a specific SP/CU is not supported. Please specify a version of SQL Server on $computer that you want to update." - return - } - ## Find the architecture of the computer - if ($arch = (Get-DbaCmObject -ComputerName $computer -ClassName 'Win32_ComputerSystem').SystemType) { - if ($arch -eq 'x64-based PC') { - $arch = 'x64' - } else { - $arch = 'x86' - } - } else { - Write-Message -Level Warning -Message "Failed to determine the arch of $computer, using x64 by default" - $arch = 'x64' - } - $targetLevel = '' - # Launch a setup sequence for each version found - foreach ($currentGroup in $currentVersionGroups) { - $currentMajorVersion = "SQL" + $currentGroup.Name - $currentMajorNumber = $currentGroup.Name - - # Use the earliest version in case specifics are needed - $currentVersion = $currentGroup.Group | Sort-Object -Property { $_.Version.BuildLevel } | Select-Object -ExpandProperty Version -First 1 - - Write-ProgressHelper -ExcludePercent -Activity $activity -Message "Parsing versions" - # create a parameter set for Find-SqlServerUpdate - $kbLookupParams = @{ - Architecture = $arch - MajorVersion = $currentGroup.Name - Path = $Path - } - # Find target KB number based on provided SP/CU levels or KB numbers - if ($CumulativeUpdate -gt 0) { - #Cumulative update is present - installing CU - if (Test-Bound -Parameter ServicePack) { - #Service pack is present - using it as a reference - $targetKB = Get-DbaBuildReference -MajorVersion $currentMajorNumber -ServicePack $ServicePack -CumulativeUpdate $CumulativeUpdate - } else { - #Service pack not present - using current SP level - $targetSP = $currentVersion.SPLevel | Where-Object { $_ -ne 'LATEST' } | Select-Object -First 1 - $targetKB = Get-DbaBuildReference -MajorVersion $currentMajorNumber -ServicePack $targetSP -CumulativeUpdate $CumulativeUpdate - } - } elseif ($ServicePack -gt 0) { - #Service pack number was passed without CU - installing service pack - $targetKB = Get-DbaBuildReference -MajorVersion $currentMajorNumber -ServicePack $ServicePack - } elseif ($KB) { - $targetKB = Get-DbaBuildReference -KB $KB - if ($targetKB -and $currentMajorNumber -ne $targetKB.NameLevel) { - Write-Message -Level Debug -Message "$($targetKB.NameLevel) is not a target Major version $($currentMajorNumber), skipping" - continue - } - } else { - #No parameters = latest patch. Find latest SQL Server build and corresponding SP and CU KBs - $latestCU = Test-DbaBuild -Build $currentVersion.BuildLevel -MaxBehind '0CU' - if (!$latestCU.Compliant) { - #more recent build is found, get KB number depending on what is the current upgrade $Type - $targetKB = Get-DbaBuildReference -Build $latestCU.BuildTarget - $targetSP = $targetKB.SPLevel | Where-Object { $_ -ne 'LATEST' } | Select-Object -First 1 - if ($Type -eq 'CumulativeUpdate') { - if ($currentVersion.SPLevel -notcontains 'LATEST') { - $currentSP = $currentVersion.SPLevel | Where-Object { $_ -ne 'LATEST' } | Select-Object -First 1 - Stop-Function -Message "Current SP version $currentMajorVersion$currentSP is not the latest available. Make sure to upgade to latest SP level before applying latest CU." -Continue - } - $targetLevel = "$($targetKB.SPLevel | Where-Object { $_ -ne 'LATEST' })$($targetKB.CULevel)" - Write-Message -Level Debug -Message "Found a latest Cumulative Update $targetLevel (KB$($targetKB.KBLevel))" - } elseif ($Type -eq 'ServicePack') { - $targetKB = Get-DbaBuildReference -MajorVersion $targetKB.NameLevel -ServicePack $targetSP - $targetLevel = $targetKB.SPLevel | Where-Object { $_ -ne 'LATEST' } - Write-Message -Level Debug -Message "Found a latest Service Pack $targetLevel (KB$($targetKB.KBLevel))" - } - } else { - Write-Message -Message "$($currentVersion.Build) on computer [$($computer)] is already the latest available." -Level Verbose - continue - } - } - if ($targetKB.KBLevel) { - if ($targetKB.MatchType -ne 'Exact') { - Stop-Function -Message "Couldn't find an exact build match with specified parameters while updating $currentMajorVersion" -Continue - } - $targetLevel = "$($targetKB.SPLevel | Where-Object { $_ -ne 'LATEST' })$($targetKB.CULevel)" - $targetKBLevel = $targetKB.KBLevel | Select-Object -First 1 - Write-Message -Level Verbose -Message "Upgrading SQL$($targetKB.NameLevel) to $targetLevel (KB$($targetKBLevel))" - $kbLookupParams.KB = $targetKBLevel - } else { - Stop-Function -Message "Could not find a KB$KB reference for $currentMajorVersion SP $ServicePack CU $CumulativeUpdate" -Continue - } - - # Compare versions - whether to proceed with the installation - $needsUpgrade = $false - foreach ($currentComponent in $currentGroup.Group) { - $groupVersion = $currentComponent.Version - #target version is less than requested - if ($groupVersion.BuildLevel -lt $targetKB.BuildLevel) { - $needsUpgrade = $true - } - #target version is the same but installation has failed last time - elseif ($groupVersion.BuildLevel -eq $targetKB.BuildLevel -and $Continue -and $currentComponent.Resume) { - $needsUpgrade = $true - } - } - if (!$needsUpgrade) { - Write-Message -Message "Current $currentMajorVersion version $($currentVersion.BuildLevel) on computer [$($computer)] matches or already higher than target version $($targetKB.BuildLevel)" -Level Verbose - continue - } - ## Find the installer to use - Write-ProgressHelper -ExcludePercent -Activity $activity -Message "Searching for update binaries" - $installer = Find-SqlServerUpdate @kbLookupParams - if (!$installer) { - Stop-Function -Message "Could not find installer for the $currentMajorVersion update KB$($kbLookupParams.KB)" -Continue - } - ## Apply patch - Write-ProgressHelper -ExcludePercent -Activity $activity -Message "Installing $targetLevel KB$($targetKB.KBLevel) ($($installer.Name)) for $currentMajorVersion ($($currentVersion.BuildLevel))" - if ($PSCmdlet.ShouldProcess($computer, "Install $targetLevel KB$($targetKB.KBLevel) ($($installer.Name)) for $currentMajorVersion ($($currentVersion.BuildLevel))")) { - $invProgParams = @{ - ComputerName = $computer - Credential = $Credential - ErrorAction = 'Stop' - } - # Find a temporary folder to extract to - the drive that has most free space - $chosenDrive = (Get-DbaDiskSpace -ComputerName $computer -Credential $Credential | Sort-Object -Property Free -Descending | Select-Object -First 1).Name - if (!$chosenDrive) { - # Fall back to the system drive - $chosenDrive = Invoke-Command2 -ComputerName $computer -Credential $Credential -ScriptBlock { $env:SystemDrive } -Raw -ErrorAction Stop - } - $spExtractPath = $chosenDrive.TrimEnd('\') + "\dbatools_KB$($targetKB.KBLevel)_Extract" - if ($spExtractPath) { - try { - # Extract file - Write-ProgressHelper -ExcludePercent -Activity $activity -Message "Extracting $installer to $spExtractPath" - Write-Message -Level Verbose -Message "Extracting $installer to $spExtractPath" - $null = Invoke-Program @invProgParams -Path $installer.FullName -ArgumentList "/x`:`"$spExtractPath`" /quiet" - # Install the patch - if ($InstanceName) { - $instanceClause = "/instancename=$InstanceName" - } else { - $instanceClause = '/allinstances' - } - Write-ProgressHelper -ExcludePercent -Activity $activity -Message "Now installing update from $spExtractPath" - Write-Message -Level Verbose -Message "Starting installation from $spExtractPath" - $log = Invoke-Program @invProgParams -Path "$spExtractPath\setup.exe" -ArgumentList @('/quiet', $instanceClause, '/IAcceptSQLServerLicenseTerms') -WorkingDirectory $spExtractPath - $success = $true - } catch { - Stop-Function -Message "Upgrade failed" -ErrorRecord $_ - return - } finally { - ## Cleanup temp - try { - Write-ProgressHelper -ExcludePercent -Activity $activity -Message "Removing temporary files" - $null = Invoke-Command2 -ComputerName $computer -Credential $Credential -ScriptBlock { - if ($args[0] -like '*\dbatools_KB*_Extract' -and (Test-Path $args[0])) { - Remove-Item -Recurse -Force -LiteralPath $args[0] -ErrorAction Stop - } - } -Raw -ArgumentList $spExtractPath -ErrorAction Stop - } catch { - Write-Message -Level Warning -Message "Failed to cleanup temp folder on computer $computer`: $($_.Exception.Message) " - } - } - } - if ($Restart) { - Write-ProgressHelper -ExcludePercent -Activity $activity -Message "Restarting computer $computer and waiting for it to come back online" - Write-Message -Level Verbose "Restarting computer $computer and waiting for it to come back online" - try { - $restartParams = @{ - ComputerName = $computer - } - if ($Credential) { $restartParams += @{ Credential = $Credential } - } - $null = Restart-Computer @restartParams -Wait -For WinRm -Force -ErrorAction Stop - $restarted = $true - } catch { - Stop-Function -Message "Failed to restart computer" -ErrorRecord $_ - return - } - } else { - $message = "Restart is required for computer $computer to finish the installation of $currentMajorVersion$targetLevel" - } - } else { - $message = 'The installation was not performed - running in WhatIf mode' - $success = $true - } - # return resulting object. This function throws, so all results here are expected to be shown only in a positive light - [psobject]@{ - ComputerName = $ComputerName - MajorVersion = $kbLookupParams.MajorVersion - TargetLevel = $targetLevel - KB = $kbLookupParams.KB - Successful = [bool]$success - Restarted = [bool]$restarted - InstanceName = $InstanceName - Installer = $installer.FullName - ExtractPath = $spExtractPath - Message = $message - Log = $log - } - if (-not $restarted) { - Write-Message -Level Verbose "No more installations for other versions on $computer - restart is pending" - return - } - } - } -} \ No newline at end of file diff --git a/internal/functions/Invoke-Command2.ps1 b/internal/functions/Invoke-Command2.ps1 index 51542adab1..32a74b119a 100644 --- a/internal/functions/Invoke-Command2.ps1 +++ b/internal/functions/Invoke-Command2.ps1 @@ -37,6 +37,9 @@ function Invoke-Command2 { .PARAMETER Raw Passes through the raw return data, rather than prettifying stuff. + .PARAMETER RequiredPSVersion + Verifies that remote Powershell version is meeting specified requirements. + .EXAMPLE PS C:\> Invoke-Command2 -ComputerName sql2014 -Credential $Credential -ScriptBlock { dir } @@ -56,13 +59,12 @@ function Invoke-Command2 { [ValidateSet('Default', 'Basic', 'Negotiate', 'NegotiateWithImplicitCredential', 'Credssp', 'Digest', 'Kerberos')] [string]$Authentication = 'Default', [string]$ConfigurationName, - [switch]$Raw + [switch]$Raw, + [version]$RequiredPSVersion ) <# Note: Credential stays as an object type for legacy reasons. #> - $InvokeCommandSplat = @{ - ScriptBlock = $ScriptBlock - } + $InvokeCommandSplat = @{} if ($ArgumentList) { $InvokeCommandSplat["ArgumentList"] = $ArgumentList } @@ -111,7 +113,14 @@ function Invoke-Command2 { [Sqlcollaborative.Dbatools.Connection.ConnectionHost]::PSSessionSet($runspaceId, $ComputerName.ComputerName, $currentSession) } } + if ($RequiredPSVersion) { + $remoteVersion = Invoke-Command @InvokeCommandSplat -ScriptBlock { $PSVersionTable } + if ($remoteVersion.PSVersion -and $remoteVersion.PSVersion -lt $RequiredPSVersion) { + throw "Remote PS version $($remoteVersion.PSVersion) is less than defined requirement ($RequiredPSVersion)" + } + } + $InvokeCommandSplat.ScriptBlock = $ScriptBlock if ($Raw) { Invoke-Command @InvokeCommandSplat } else { diff --git a/internal/functions/Invoke-CommandWithFallback.ps1 b/internal/functions/Invoke-CommandWithFallback.ps1 new file mode 100644 index 0000000000..f4f77d8198 --- /dev/null +++ b/internal/functions/Invoke-CommandWithFallback.ps1 @@ -0,0 +1,52 @@ +function Invoke-CommandWithFallback { + <# + When credentials are specified, it is possible that the chosen protocol would fail to connect with them. + Fallback will use PSSessionConfiguration to create a session configuration on a remote machine that uses + provided set of credentials by default. A new session will be created that uses this custom configuration + and performs remote execution under defined set of credentials without relying on delegation or CredSSP. + #> + param ( + [DbaInstanceParameter]$ComputerName = $env:COMPUTERNAME, + [object]$Credential, + [scriptblock]$ScriptBlock, + [object[]]$ArgumentList, + [parameter(ValueFromPipeline)] + [object[]]$InputObject, + [ValidateSet('Default', 'Basic', 'Negotiate', 'NegotiateWithImplicitCredential', 'Credssp', 'Digest', 'Kerberos')] + [string]$Authentication = 'Default', + [switch]$Raw, + [version]$RequiredPSVersion + ) + try { + Invoke-Command2 @PSBoundParameters + } catch [System.Management.Automation.Remoting.PSRemotingTransportException] { + # This implements a fallback scenario, when both credentials and fallback are specified, but the original session has failed + # Credentials will be passed on through a default session and used as a default PSSessionConfiguration + if ($Credential) { + Write-Message -Level Verbose -Message "Initial connection to $($ComputerName.ComputerName) through $Authentication protocol unsuccessful, falling back to PSSession configurations | $($_.Exception.Message)" + $configuration = Register-RemoteSessionConfiguration -Computer $ComputerName.ComputerName -Credential $Credential -Name dbatoolsInvokeCommandWithFailback -Confirm:$false + if ($configuration.Successful) { + $PSBoundParameters.ConfigurationName = $configuration.Name + $PSBoundParameters.Authentication = 'Default' + try { + Invoke-Command2 @PSBoundParameters + } catch { + throw $_ + } finally { + # Unregister PSRemote configurations once completed. It's slow, but necessary - otherwise we're gonna have leftover junk with credentials on a remote + $unreg = Unregister-RemoteSessionConfiguration -ComputerName $ComputerName.ComputerName -Credential $Credential -Name $configuration.Name -Confirm:$false + if (-not $unreg.Successful) { + Write-Warning -Message "Failed to unregister PSSession Configurations on $($ComputerName.ComputerName) | $($configuration.Status)" + } + } + } else { + Stop-Function -Message "Both $Authentication and failback connections failed | $($configuration.Status)" -ErrorRecord $_ -EnableException $true + } + } else { + #default behavior + throw $_ + } + } catch { + throw $_ + } +} \ No newline at end of file diff --git a/internal/functions/Invoke-DbaDatabaseCorruption.ps1 b/internal/functions/Invoke-DbaDbCorruption.ps1 similarity index 91% rename from internal/functions/Invoke-DbaDatabaseCorruption.ps1 rename to internal/functions/Invoke-DbaDbCorruption.ps1 index 67cb3131ac..8733d7f472 100644 --- a/internal/functions/Invoke-DbaDatabaseCorruption.ps1 +++ b/internal/functions/Invoke-DbaDbCorruption.ps1 @@ -113,20 +113,20 @@ function Invoke-DbaDbCorruption { } if ("master", "tempdb", "model", "msdb" -contains $Database) { - Stop-Function -Message "You may not corrupt system databases." + Stop-Function -EnableException:$EnableException -Message "You may not corrupt system databases." return } try { $Server = Connect-SqlInstance -SqlInstance $SqlInstance -SqlCredential $SqlCredential -MinimumVersion 9 } catch { - Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $SqlInstance + Stop-Function -EnableException:$EnableException -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $SqlInstance return } $db = $Server.Databases | Where-Object { $_.Name -eq $Database } if (!$db) { - Stop-Function -Message "The database specified does not exist." + Stop-Function -EnableException:$EnableException -Message "The database specified does not exist." return } if ($Table) { @@ -136,13 +136,13 @@ function Invoke-DbaDbCorruption { } if (-not $tb) { - Stop-Function -Message "There are no accessible tables in $Database on $SqlInstance." -Target $Database + Stop-Function -EnableException:$EnableException -Message "There are no accessible tables in $Database on $SqlInstance." -Target $Database return } $RowCount = $db.Query("select top 1 * from $($tb.name)") if ($RowCount.count -eq 0) { - Stop-Function -Message "The table $tb has no rows" -Target $table + Stop-Function -EnableException:$EnableException -Message "The table $tb has no rows" -Target $table return } @@ -162,7 +162,7 @@ function Invoke-DbaDbCorruption { $Server.ConnectionContext.Disconnect() $Server.ConnectionContext.Connect() $null = Set-DbaDbState -SqlServer $Server -Database $Database -MultiUser -Force - Stop-Function -Message "Failed to write page" -Category WriteError -ErrorRecord $_ -Target $instance + Stop-Function -EnableException:$EnableException -Message "Failed to write page" -Category WriteError -ErrorRecord $_ -Target $instance return } diff --git a/internal/functions/Invoke-ManagedComputerCommand.ps1 b/internal/functions/Invoke-ManagedComputerCommand.ps1 index 5f5bab5fdd..89d2371e67 100644 --- a/internal/functions/Invoke-ManagedComputerCommand.ps1 +++ b/internal/functions/Invoke-ManagedComputerCommand.ps1 @@ -69,6 +69,6 @@ function Invoke-ManagedComputerCommand { # For surely resolve stuff, and going by default with kerberos, this needs to match FullComputerName $hostname = $resolved.FullComputerName - Invoke-Command2 -ScriptBlock $ScriptBlock -ArgumentList $ArgumentList -ComputerName $hostname -ErrorAction Stop + Invoke-Command2 -ScriptBlock $ScriptBlock -ArgumentList $ArgumentList -ComputerName $hostname -Credential $Credential -ErrorAction Stop } -} \ No newline at end of file +} diff --git a/internal/functions/Invoke-Program.ps1 b/internal/functions/Invoke-Program.ps1 index 955fde77c0..6db29d76cd 100644 --- a/internal/functions/Invoke-Program.ps1 +++ b/internal/functions/Invoke-Program.ps1 @@ -35,14 +35,37 @@ function Invoke-Program { .PARAMETER WorkingDirectory Working directory for the process - .PARAMETER UsePSSessionConfiguration - Skips the CredSSP attempts and proceeds directly to PSSessionConfiguration connections + .PARAMETER Authentication + Choose authentication mechanism to use + + .PARAMETER Raw + Return plain stdout without any additional information + + .PARAMETER Fallback + When credentials are specified, it is possible that the chosen protocol would fail to connect with them. + Fallback will use PSSessionConfiguration to create a session configuration on a remote machine that uses + provided set of credentials by default. + Not a default option since it transfers credentials over a potentially unsecure network. + + .PARAMETER EnableException + By default, when something goes wrong we try to catch it, interpret it and give you a friendly warning message. + This avoids overwhelming you with "sea of red" exceptions, but is inconvenient because it basically disables advanced scripting. + Using this switch turns this "nice by default" feature off and enables you to catch exceptions with your own try/catch. + + .NOTES + Tags: Invoke, Program, Process, Session, PSSession, Authentication + Author: Kirill Kravtsov (@nvarscar) https://nvarscar.wordpress.com/ .EXAMPLE PS C:\> Invoke-Program -ComputerName ServerA -Credentials $cred -Path "C:\temp\setup.exe" -ArgumentList '/quiet' -WorkingDirectory 'C:' Starts "setup.exe /quiet" on ServerA under provided credentials. C:\ will be set as a working directory. + .EXAMPLE + PS C:\> Invoke-Program -ComputerName ServerA -Credentials $cred -Authentication Credssp -Path "C:\temp\setup.exe" -Fallback + + Starts "setup.exe" on ServerA under provided credentials. Will use CredSSP as a fisrt attempted protocol and then fallback to the PSSessionConfiguration workaround. + #> [CmdletBinding()] [OutputType([System.Management.Automation.PSObject])] @@ -55,12 +78,16 @@ function Invoke-Program { [pscredential]$Credential, [ValidateNotNullOrEmpty()] [string[]]$ArgumentList, + [ValidateSet('Default', 'Basic', 'Negotiate', 'NegotiateWithImplicitCredential', 'Credssp', 'Digest', 'Kerberos')] + [string]$Authentication = 'Default', [bool]$ExpandStrings = $false, [ValidateNotNullOrEmpty()] [string]$WorkingDirectory, [ValidateNotNullOrEmpty()] [uint32[]]$SuccessReturnCode = @(0, 3010), - [bool]$UsePSSessionConfiguration = (Get-DbatoolsConfigValue -Name 'psremoting.Sessions.UsePSSessionConfiguration' -Fallback $false) + [switch]$Raw, + [switch]$Fallback, + [bool]$EnableException = $EnableException ) process { $startProcess = { @@ -71,6 +98,16 @@ function Invoke-Program { $WorkingDirectory, $SuccessReturnCode ) + $output = [pscustomobject]@{ + ComputerName = $env:COMPUTERNAME + Path = $Path + ArgumentList = $ArgumentList + WorkingDirectory = $WorkingDirectory + Successful = $false + stdout = $null + stderr = $null + ExitCode = $null + } $processStartInfo = New-Object System.Diagnostics.ProcessStartInfo $processStartInfo.FileName = $Path if ($ArgumentList) { @@ -96,12 +133,15 @@ function Invoke-Program { $stdOut = $ps.StandardOutput.ReadToEnd() $stdErr = $ps.StandardError.ReadToEnd() $ps.WaitForExit() + # assign output object values + $output.stdout = $stdOut + $output.stderr = $stdErr + $output.ExitCode = $ps.ExitCode # Check the exit code of the process to see if it succeeded. - if ($ps.ExitCode -notin $SuccessReturnCode) { - throw "Error running program: exited with errorcode $($ps.ExitCode)`:`n$stdErr`n$stdOut" - } else { - $stdOut + if ($ps.ExitCode -in $SuccessReturnCode) { + $output.Successful = $true } + $output } } @@ -114,57 +154,39 @@ function Invoke-Program { ) $params = @{ - ScriptBlock = $startProcess - ArgumentList = $argList - ComputerName = $ComputerName - Credential = $Credential + ScriptBlock = $startProcess + ArgumentList = $argList + ComputerName = $ComputerName + Credential = $Credential + Authentication = $Authentication + ErrorAction = 'Stop' + Raw = $true } Write-Message -Level Debug -Message "Acceptable success return codes are [$($SuccessReturnCode -join ',')]" - - if (!$ComputerName.IsLocalHost) { - if (!$Credential) { - Stop-Function -Message "Explicit credentials are required when running agains remote hosts. Make sure to define the -Credential parameter" -EnableException $true - } - # Try to use CredSSP first, otherwise fall back to PSSession configurations with custom user/password - if (!$UsePSSessionConfiguration) { - Write-Message -Level Verbose -Message "Attempting to configure CredSSP for remote connections" - Initialize-CredSSP -ComputerName $ComputerName -Credential $Credential -EnableException $false - $sspSuccessful = $true - Write-Message -Level Verbose -Message "Starting process [$Path] with arguments [$ArgumentList] on $ComputerName through CredSSP" - try { - Invoke-Command2 @params -Authentication CredSSP -Raw -ErrorAction Stop - } catch [System.Management.Automation.Remoting.PSRemotingTransportException] { - Write-Message -Level Warning -Message "CredSSP to $ComputerName unsuccessful, falling back to PSSession configurations | $($_.Exception.Message)" - $sspSuccessful = $false - } catch { - Stop-Function -Message "Remote execution failed" -ErrorRecord $_ -EnableException $true - } + Write-Message -Level Verbose -Message "Starting process [$Path] with arguments [$ArgumentList] on $ComputerName through $Authentication protocol" + try { + if ($Fallback) { + $output = Invoke-CommandWithFallback @params + } else { + $output = Invoke-Command2 @params } - if ($UsePSSessionConfiguration -or !$sspSuccessful) { - $configuration = Register-RemoteSessionConfiguration -Computer $ComputerName -Credential $Credential -Name dbatoolsInvokeProgram - if ($configuration.Successful) { - Write-Message -Level Debug -Message "RemoteSessionConfiguration ($($configuration.Name)) was successful, using it." - Write-Message -Level Verbose -Message "Starting process [$Path] with arguments [$ArgumentList] on $ComputerName using PS session configuration" - try { - Invoke-Command2 @params -ConfigurationName $configuration.Name -Raw -ErrorAction Stop - } catch { - throw $_ - } finally { - # Unregister PSRemote configurations once completed. It's slow, but necessary - otherwise we're gonna leave unnesessary junk on a remote - Write-Message -Level Verbose -Message "Unregistering any leftover PSSession Configurations on $ComputerName" - $unreg = Unregister-RemoteSessionConfiguration -ComputerName $ComputerName -Credential $Credential -Name dbatoolsInvokeProgram - if (!$unreg.Successful) { - Stop-Function -Message "Failed to unregister PSSession Configurations on $ComputerName | $($configuration.Status)" -EnableException $false - } - } - } else { - Stop-Function -Message "RemoteSession configuration unsuccessful, no valid connection options found | $($configuration.Status)" -EnableException $true - } + } catch { + Stop-Function -Message "Remote execution failed" -ErrorRecord $_ + return + } + + Write-Message -Level Debug -Message "Process [$Path] returned exit code $($output.ExitCode)" + if ($Raw) { + if ($output.Successful) { + return $output.stdout + } else { + $message = "Error running [$Path]: exited with errorcode $($output.ExitCode)`:`n$($output.StdErr)`n$($output.StdOut)" + Stop-Function -Message "Program execution failed | $message" } } else { - Write-Message -Level Verbose -Message "Starting process [$Path] with arguments [$ArgumentList] locally" - Invoke-Command2 @params -Raw -ErrorAction Stop + # Select * to ensure that the object is a generic object and not a de-serialized one from a remote session + return $output | Select-Object -Property * -ExcludeProperty PSComputerName, RunspaceId | Select-DefaultView -Property ComputerName, Path, Successful, ExitCode, stdout } } } \ No newline at end of file diff --git a/internal/functions/New-DbaLogShippingPrimaryDatabase.ps1 b/internal/functions/New-DbaLogShippingPrimaryDatabase.ps1 index 2d9efebf5b..e83e341575 100644 --- a/internal/functions/New-DbaLogShippingPrimaryDatabase.ps1 +++ b/internal/functions/New-DbaLogShippingPrimaryDatabase.ps1 @@ -207,32 +207,40 @@ function New-DbaLogShippingPrimaryDatabase { ,@backup_directory = N'$BackupDirectory' ,@backup_share = N'$BackupShare' ,@backup_job_name = N'$BackupJob' - ,@backup_retention_period = $BackupRetention" + ,@backup_retention_period = $BackupRetention + ,@backup_threshold = $BackupThreshold + ,@history_retention_period = $HistoryRetention + ,@backup_job_id = @LS_BackupJobId OUTPUT + ,@primary_id = @LS_PrimaryId OUTPUT " if ($SqlInstance.Version.Major -gt 9) { $Query += ",@backup_compression = $BackupCompression" } if ($MonitorServer) { - $Query += ",@monitor_server = N'$MonitorServer' + $Query += " + ,@monitor_server = N'$MonitorServer' ,@monitor_server_security_mode = $MonitorServerSecurityMode ,@threshold_alert = $ThresholdAlert ,@threshold_alert_enabled = $ThresholdAlertEnabled" - } - $Query += ",@backup_threshold = $BackupThreshold - ,@history_retention_period = $HistoryRetention - ,@backup_job_id = @LS_BackupJobId OUTPUT - ,@primary_id = @LS_PrimaryId OUTPUT " - - # Check the MonitorServerSecurityMode if it's SQL Server authentication - if ($MonitorServer -and $MonitorServerSecurityMode -eq 0 ) { - $Query += ",@monitor_server_login = N'$MonitorLogin' - ,@monitor_server_password = N'$MonitorPassword' " + #if ($MonitorServer -and ($SqlInstance.Version.Major -ge 16)) { + if ($server.Version.Major -ge 12) { + # Check the MonitorServerSecurityMode if it's SQL Server authentication + if ($MonitorServer -and $MonitorServerSecurityMode -eq 0 ) { + $Query += " + ,@monitor_server_login = N'$MonitorLogin' + ,@monitor_server_password = N'$MonitorPassword' " + } + } else { + $Query += " + ,@ignoreremotemonitor = 1" + } } - if ($server.Version.Major -gt 9) { - $Query += ",@overwrite = 1;" + if ($Force -or ($server.Version.Major -gt 9)) { + $Query += " + ,@overwrite = 1;" } else { $Query += ";" } @@ -243,6 +251,49 @@ function New-DbaLogShippingPrimaryDatabase { Write-Message -Message "Configuring logshipping for primary database $Database." -Level Verbose Write-Message -Message "Executing query:`n$Query" -Level Verbose $server.Query($Query) + + # For versions prior to SQL Server 2014, adding a monitor works in a different way. + # The next section makes sure the settings are being synchronized with earlier versions + if ($MonitorServer -and ($server.Version.Major -lt 12)) { + # Get the details of the primary database + $query = "SELECT * FROM msdb.dbo.log_shipping_monitor_primary WHERE primary_database = '$Database'" + $lsDetails = $server.Query($query) + + # Setup the procedure script for adding the monitor for the primary + $query = "EXEC msdb.dbo.sp_processlogshippingmonitorprimary @mode = $MonitorServerSecurityMode + ,@primary_id = '$($lsDetails.primary_id)' + ,@primary_server = '$($lsDetails.primary_server)' + ,@monitor_server = '$MonitorServer' " + + # Check the MonitorServerSecurityMode if it's SQL Server authentication + if ($MonitorServer -and $MonitorServerSecurityMode -eq 0 ) { + $query += " + ,@monitor_server_login = N'$MonitorLogin' + ,@monitor_server_password = N'$MonitorPassword' " + } + + $query += " + ,@monitor_server_security_mode = 1 + ,@primary_database = '$($lsDetails.primary_database)' + ,@backup_threshold = $($lsDetails.backup_threshold) + ,@threshold_alert = $($lsDetails.threshold_alert) + ,@threshold_alert_enabled = $([int]$lsDetails.threshold_alert_enabled) + ,@history_retention_period = $($lsDetails.history_retention_period) + " + + Write-Message -Message "Configuring monitor server for primary database $Database." -Level Verbose + Write-Message -Message "Executing query:`n$query" -Level Verbose + Invoke-DbaQuery -SqlInstance $MonitorServer -SqlCredential $MonitorCredential -Database msdb -Query $query + + $query = " + UPDATE msdb.dbo.log_shipping_primary_databases + SET monitor_server = '$MonitorServer', user_specified_monitor = 1 + WHERE primary_id = '$($lsDetails.primary_id)' + " + Write-Message -Message "Updating monitor information for the primary database $Database." -Level Verbose + Write-Message -Message "Executing query:`n$query" -Level Verbose + $server.Query($query) + } } catch { Write-Message -Message "$($_.Exception.InnerException.InnerException.InnerException.InnerException.Message)" -Level Warning Stop-Function -Message "Error executing the query.`n$($_.Exception.Message)`n$($Query)" -ErrorRecord $_ -Target $SqlInstance -Continue diff --git a/internal/functions/New-DbaLogShippingSecondaryDatabase.ps1 b/internal/functions/New-DbaLogShippingSecondaryDatabase.ps1 index 0dff35bb42..e976086183 100644 --- a/internal/functions/New-DbaLogShippingSecondaryDatabase.ps1 +++ b/internal/functions/New-DbaLogShippingSecondaryDatabase.ps1 @@ -64,6 +64,19 @@ function New-DbaLogShippingSecondaryDatabase { .PARAMETER ThresholdAlertEnabled Specifies whether an alert is raised when backup_threshold is exceeded. + .PARAMETER MonitorServer + Is the name of the monitor server. + The default is the name of the primary server. + + .PARAMETER MonitorCredential + Allows you to login to enter a secure credential. + This is only needed in combination with MonitorServerSecurityMode having either a 0 or 'sqlserver' value. + To use: $scred = Get-Credential, then pass $scred object to the -MonitorCredential parameter. + + .PARAMETER MonitorServerSecurityMode + The security mode used to connect to the monitor server. Allowed values are 0, "sqlserver", 1, "windows" + The default is 1 or Windows. + .PARAMETER WhatIf Shows what would happen if the command were to run. No actions are actually performed. @@ -120,6 +133,10 @@ function New-DbaLogShippingSecondaryDatabase { [object]$SecondaryDatabase, [int]$ThresholdAlert = 14420, [switch]$ThresholdAlertEnabled, + [string]$MonitorServer, + [ValidateSet(0, "sqlserver", 1, "windows")] + [object]$MonitorServerSecurityMode = 1, + [System.Management.Automation.PSCredential]$MonitorCredential, [Alias('Silent')] [switch]$EnableException, [switch]$Force @@ -197,7 +214,13 @@ function New-DbaLogShippingSecondaryDatabase { ,@threshold_alert_enabled = $ThresholdAlertEnabled ,@history_retention_period = $HistoryRetention " - # Addinf extra options to the query when needed + + if ($ServerSecondary.Version.Major -le 12) { + $Query += " + ,@ignoreremotemonitor = 1" + } + + # Add inf extra options to the query when needed if ($BlockSize -ne -1) { $Query += ",@block_size = $BlockSize" } @@ -210,7 +233,7 @@ function New-DbaLogShippingSecondaryDatabase { $Query += ",@max_transfer_size = $MaxTransferSize" } - if ($ServerSecondary.Version.Major -gt 9) { + if ($Force -and ($ServerSecondary.Version.Major -gt 9)) { $Query += ",@overwrite = 1;" } else { $Query += ";" @@ -222,6 +245,49 @@ function New-DbaLogShippingSecondaryDatabase { Write-Message -Message "Configuring logshipping for secondary database $SecondaryDatabase on $SqlInstance." -Level Verbose Write-Message -Message "Executing query:`n$Query" -Level Verbose $ServerSecondary.Query($Query) + + # For versions prior to SQL Server 2014, adding a monitor works in a different way. + # The next section makes sure the settings are being synchronized with earlier versions + if ($MonitorServer -and ($SqlInstance.Version.Major -lt 12)) { + # Get the details of the primary database + $query = "SELECT * FROM msdb.dbo.log_shipping_monitor_secondary WHERE primary_database = '$PrimaryDatabase' AND primary_server = '$PrimaryServer'" + $lsDetails = $ServerSecondary.Query($query) + + # Setup the procedure script for adding the monitor for the primary + $query = "EXEC msdb.dbo.sp_processlogshippingmonitorsecondary @mode = $MonitorServerSecurityMode + ,@secondary_server = '$SqlInstance' + ,@secondary_database = '$SecondaryDatabase' + ,@secondary_id = '$($lsDetails.secondary_id)' + ,@primary_server = '$($lsDetails.primary_server)' + ,@primary_database = '$($lsDetails.primary_database)' + ,@restore_threshold = $($lsDetails.restore_threshold) + ,@threshold_alert = $([int]$lsDetails.threshold_alert) + ,@threshold_alert_enabled = $([int]$lsDetails.threshold_alert_enabled) + ,@history_retention_period = $([int]$lsDetails.history_retention_period) + ,@monitor_server = '$MonitorServer' + ,@monitor_server_security_mode = $MonitorServerSecurityMode " + + # Check the MonitorServerSecurityMode if it's SQL Server authentication + if ($MonitorServer -and $MonitorServerSecurityMode -eq 0 ) { + $query += ",@monitor_server_login = N'$MonitorLogin' + ,@monitor_server_password = N'$MonitorPassword' " + } + + Write-Message -Message "Configuring monitor server for secondary database $SecondaryDatabase." -Level Verbose + Write-Message -Message "Executing query:`n$query" -Level Verbose + Invoke-DbaQuery -SqlInstance $MonitorServer -SqlCredential $MonitorCredential -Database msdb -Query $query + + $query = " + UPDATE msdb.dbo.log_shipping_secondary + SET monitor_server = '$MonitorServer', user_specified_monitor = 1 + WHERE secondary_id = '$($lsDetails.secondary_id)' + " + + Write-Message -Message "Updating monitor information for the secondary database $Database." -Level Verbose + Write-Message -Message "Executing query:`n$query" -Level Verbose + $ServerSecondary.Query($query) + + } } catch { Write-Message -Message "$($_.Exception.InnerException.InnerException.InnerException.InnerException.Message)" -Level Warning Stop-Function -Message "Error executing the query.`n$($_.Exception.Message)`n$Query" -ErrorRecord $_ -Target $SqlInstance -Continue diff --git a/internal/functions/Register-RemoteSessionConfiguration.ps1 b/internal/functions/Register-RemoteSessionConfiguration.ps1 index caece36e66..65906a4a1f 100644 --- a/internal/functions/Register-RemoteSessionConfiguration.ps1 +++ b/internal/functions/Register-RemoteSessionConfiguration.ps1 @@ -7,7 +7,7 @@ function Register-RemoteSessionConfiguration { Designed to overcome the double-hop issue and as an alternative to CredSSP protocol. #> [Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSAvoidUsingConvertToSecureStringWithPlainText", "")] - [CmdletBinding()] + [CmdletBinding(SupportsShouldProcess)] Param ( [Parameter(Mandatory)] $ComputerName, @@ -28,10 +28,6 @@ function Register-RemoteSessionConfiguration { $pwd ) $output = [pscustomobject]@{ 'Name' = $Name; 'Status' = $null ; Successful = $false } - if ($PSVersionTable.PSVersion -le '2.0') { - $output.Status = "Current version of Powershell $($PSVersionTable.PSVersion) does not support SessionConfiguration with custom credentials. Minimum requirement is 3.0" - return $output - } $credential = New-Object System.Management.Automation.PSCredential @($user, (ConvertTo-SecureString -Force -AsPlainText $pwd)) try { $existing = Get-PSSessionConfiguration -Name $Name -ErrorAction Stop 2>$null @@ -40,12 +36,12 @@ function Register-RemoteSessionConfiguration { } try { if ($null -eq $existing) { - $null = Register-PSSessionConfiguration -Name $Name -RunAsCredential $credential -Force -ErrorAction Stop -NoServiceRestart 3>$null + $null = Register-PSSessionConfiguration -Name $Name -RunAsCredential $credential -ErrorAction Stop -NoServiceRestart -Confirm:$false 3>$null $output.Status = 'Created' $output.Successful = $true return $output } else { - Set-PSSessionConfiguration -Name $Name -RunAsCredential $credential -Force -ErrorAction Stop -NoServiceRestart 3>$null + Set-PSSessionConfiguration -Name $Name -RunAsCredential $credential -ErrorAction Stop -NoServiceRestart -Confirm:$false 3>$null $output.Status = 'Updated' $output.Successful = $true return $output @@ -55,14 +51,17 @@ function Register-RemoteSessionConfiguration { return $output } } - try { - $registerIt = Invoke-Command2 -ComputerName $ComputerName -Credential $Credential -ScriptBlock $createRunasSession -ArgumentList @( - $Name, - $RunAsCredential.UserName, - $RunAsCredential.GetNetworkCredential().Password - ) -Raw - } catch { - Stop-Function -Message "Failure during remote session configuration execution" -ErrorRecord $_ -EnableException $true + Write-Message -Level Debug -Message "Registering new session configuration $Name on $ComputerName" + if ($PSCmdlet.ShouldProcess($ComputerName, "Registering new session configuration $Name")) { + try { + $registerIt = Invoke-Command2 -ComputerName $ComputerName -Credential $Credential -ScriptBlock $createRunasSession -ArgumentList @( + $Name, + $RunAsCredential.UserName, + $RunAsCredential.GetNetworkCredential().Password + ) -Raw -RequiredPSVersion 3.0 -ErrorAction Stop + } catch { + Stop-Function -Message "Failure during remote session configuration execution" -ErrorRecord $_ -EnableException $true + } } if ($registerIt) { Write-Message -Level Debug -Message "Configuration attempt returned the following status`: $($registerIt.Status)" diff --git a/internal/functions/Resolve-IpAddress.ps1 b/internal/functions/Resolve-IpAddress.ps1 index 993b621efe..319001be2a 100644 --- a/internal/functions/Resolve-IpAddress.ps1 +++ b/internal/functions/Resolve-IpAddress.ps1 @@ -6,10 +6,11 @@ function Resolve-IpAddress { [Alias("ServerInstance", "SqlInstance", "ComputerName", "SqlServer")] [object]$Server ) - + $ping = New-Object System.Net.NetworkInformation.Ping + $timeout = 1000 #milliseconds if ($Server.GetType() -eq [Microsoft.SqlServer.Management.Smo.Server]) { - return $ipaddress = ((Test-Connection $Server.ComputerName -Count 1 -ErrorAction SilentlyContinue).Ipv4Address).IPAddressToString + return $ping.Send($Server.ComputerName, $timeout).Address.IPAddressToString } else { - return $ipaddress = ((Test-Connection $server.Split('\')[0] -Count 1 -ErrorAction SilentlyContinue).Ipv4Address).IPAddressToString + return $ping.Send($server.Split('\')[0], $timeout).Address.IPAddressToString } } \ No newline at end of file diff --git a/internal/functions/Resolve-SqlIpAddress.ps1 b/internal/functions/Resolve-SqlIpAddress.ps1 index f96a93c4dc..45a85ebccb 100644 --- a/internal/functions/Resolve-SqlIpAddress.ps1 +++ b/internal/functions/Resolve-SqlIpAddress.ps1 @@ -9,6 +9,6 @@ function Resolve-SqlIpAddress { $server = Connect-SqlInstance -SqlInstance $SqlInstance -SqlCredential $SqlCredential $servernetbios = $server.ComputerNamePhysicalNetBIOS - $ipaddr = (Test-Connection $servernetbios -count 1).Ipv4Address + $ipaddr = (Resolve-DbaNetworkName -ComputerName $servernetbios -Turbo).IPAddress return $ipaddr } \ No newline at end of file diff --git a/internal/functions/Restart-WinRMService.ps1 b/internal/functions/Restart-WinRMService.ps1 index 844089ee35..88a6a203df 100644 --- a/internal/functions/Restart-WinRMService.ps1 +++ b/internal/functions/Restart-WinRMService.ps1 @@ -31,7 +31,8 @@ function Restart-WinRMService { Write-Message -Level Debug "Removing existing local sessions to $ComputerName - they are no longer valid" $runspaceId = [System.Management.Automation.Runspaces.Runspace]::DefaultRunspace.InstanceId # Retrieve a session from the session cache, if available (it's unique per runspace) - $currentSessions = [Sqlcollaborative.Dbatools.Connection.ConnectionHost]::PSSessionGet($runspaceId, $ComputerName) + [array]$currentSessions = [Sqlcollaborative.Dbatools.Connection.ConnectionHost]::PSSessionGet($runspaceId, $ComputerName) + Write-Message -Level Debug -Message "Removing $($currentSessions.Count) sessions from $ComputerName in runspace $runspaceId" $currentSessions | Remove-PSSession Write-Message -Level Debug "Waiting for the WinRM service to restart on $ComputerName" $waitCounter = 0 @@ -46,5 +47,6 @@ function Restart-WinRMService { $waitCounter++ } } + Write-Message -Level Debug -Message "WinRM restart comlete on $ComputerName" } } \ No newline at end of file diff --git a/internal/functions/Test-PSRemoting.ps1 b/internal/functions/Test-PSRemoting.ps1 index effc808e13..d9b232b3f4 100644 --- a/internal/functions/Test-PSRemoting.ps1 +++ b/internal/functions/Test-PSRemoting.ps1 @@ -22,7 +22,7 @@ function Test-PSRemoting { $true } catch { $false - Stop-Function -Message "Testing $($ComputerName.Computername)" -Target $ComputerName -ErrorRecord $_ + Stop-Function -Message "Testing $($ComputerName.Computername)" -Target $ComputerName -ErrorRecord $_ -EnableException:$EnableException } } #process diff --git a/internal/functions/Test-PendingReboot.ps1 b/internal/functions/Test-PendingReboot.ps1 index 12ff2c42c6..be3affc1f7 100644 --- a/internal/functions/Test-PendingReboot.ps1 +++ b/internal/functions/Test-PendingReboot.ps1 @@ -17,48 +17,42 @@ function Test-PendingReboot { [Parameter(Mandatory)] [ValidateNotNullOrEmpty()] [DbaInstanceParameter]$ComputerName, - - [Parameter()] - [ValidateNotNullOrEmpty()] [pscredential]$Credential ) process { - try { - $icmParams = @{ - ComputerName = $ComputerName - Raw = $true - } - if ($PSBoundParameters.ContainsKey('Credential')) { - $icmParams.Credential = $Credential - } + $icmParams = @{ + ComputerName = $ComputerName.ComputerName + Raw = $true + ErrorAction = 'Stop' + } + if (Test-Bound -ParameterName Credential) { + $icmParams.Credential = $Credential + } - $OperatingSystem = Get-DbaCmObject -ComputerName $ComputerName -ClassName Win32_OperatingSystem + $OperatingSystem = Get-DbaCmObject -ComputerName $ComputerName.ComputerName -ClassName Win32_OperatingSystem -EnableException - # If Vista/2008 & Above query the CBS Reg Key - If ($OperatingSystem.BuildNumber -ge 6001) { - $PendingReboot = Invoke-Command2 @icmParams -ScriptBlock { Get-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Component Based Servicing' -Name 'RebootPending' -ErrorAction SilentlyContinue } - if ($PendingReboot) { - Write-Message -Level Verbose -Message 'Reboot pending detected in the Component Based Servicing registry key' - return $true - } - } - - # Query WUAU from the registry - $PendingReboot = Invoke-Command2 @icmParams -ScriptBlock { Get-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Auto Update' -Name 'RebootRequired' -ErrorAction SilentlyContinue } + # If Vista/2008 & Above query the CBS Reg Key + If ($OperatingSystem.BuildNumber -ge 6001) { + $PendingReboot = Invoke-Command2 @icmParams -ScriptBlock { Get-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Component Based Servicing' -Name 'RebootPending' -ErrorAction SilentlyContinue } if ($PendingReboot) { - Write-Message -Level Verbose -Message 'WUAU has a reboot pending' + Write-Message -Level Verbose -Message 'Reboot pending detected in the Component Based Servicing registry key' return $true } + } - # Query PendingFileRenameOperations from the registry - $PendingReboot = Invoke-Command2 @icmParams -ScriptBlock { Get-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager' -Name 'PendingFileRenameOperations' -ErrorAction SilentlyContinue } - if ($PendingReboot -and $PendingReboot.PendingFileRenameOperations) { - Write-Message -Level Verbose -Message 'Reboot pending in the PendingFileRenameOperations registry value' - return $true - } - return $false - } catch { - Stop-Function -Message "Failed to obtain any intormation from remote registry on $ComputerName" -ErrorRecord $_ + # Query WUAU from the registry + $PendingReboot = Invoke-Command2 @icmParams -ScriptBlock { Get-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Auto Update' -Name 'RebootRequired' -ErrorAction SilentlyContinue } + if ($PendingReboot) { + Write-Message -Level Verbose -Message 'WUAU has a reboot pending' + return $true + } + + # Query PendingFileRenameOperations from the registry + $PendingReboot = Invoke-Command2 @icmParams -ScriptBlock { Get-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager' -Name 'PendingFileRenameOperations' -ErrorAction SilentlyContinue } + if ($PendingReboot -and $PendingReboot.PendingFileRenameOperations) { + Write-Message -Level Verbose -Message 'Reboot pending in the PendingFileRenameOperations registry value' + return $true } + return $false } } \ No newline at end of file diff --git a/internal/functions/Unregister-RemoteSessionConfiguration.ps1 b/internal/functions/Unregister-RemoteSessionConfiguration.ps1 index 2003035e1e..7b64599d5c 100644 --- a/internal/functions/Unregister-RemoteSessionConfiguration.ps1 +++ b/internal/functions/Unregister-RemoteSessionConfiguration.ps1 @@ -5,7 +5,7 @@ function Unregister-RemoteSessionConfiguration { .DESCRIPTION Unregisters a session previously created with Register-RemoteSessionConfiguration through WinRM. #> - [CmdletBinding()] + [CmdletBinding(SupportsShouldProcess)] Param ( [parameter(Mandatory)] [ValidateNotNullOrEmpty()] @@ -28,18 +28,19 @@ function Unregister-RemoteSessionConfiguration { return [pscustomobject]@{ 'Name' = $Name ; 'Status' = 'Not found'; Successful = $true } } else { try { - Unregister-PSSessionConfiguration -Name $Name -Force -ErrorAction Stop -NoServiceRestart 3>$null + Unregister-PSSessionConfiguration -Name $Name -ErrorAction Stop -NoServiceRestart -Confirm:$false 3>$null [pscustomobject]@{ 'Name' = $Name; 'Status' = 'Unregistered' ; Successful = $true } } catch { return [pscustomobject]@{ 'Name' = $Name ; 'Status' = $_ ; Successful = $false} } } } - - try { - $unregisterIt = Invoke-Command2 -ComputerName $ComputerName -Credential $Credential -ScriptBlock $removeRunasSession -ArgumentList @($Name) -Raw - } catch { - Stop-Function -Message "Failure during remote session configuration execution" -ErrorRecord $_ -EnableException $true + if ($PSCmdlet.ShouldProcess($ComputerName, "Unregistering session configuration $Name")) { + try { + $unregisterIt = Invoke-Command2 -ComputerName $ComputerName -Credential $Credential -ScriptBlock $removeRunasSession -ArgumentList @($Name) -Raw -RequiredPSVersion 3.0 + } catch { + Stop-Function -Message "Failure during remote session configuration execution" -ErrorRecord $_ -EnableException $true + } } if ($unregisterIt) { Write-Message -Level Debug -Message "Configuration attempt returned the following status`: $($unregisterIt.Status)" diff --git a/internal/functions/Write-ProgressHelper.ps1 b/internal/functions/Write-ProgressHelper.ps1 index c38728db14..798fe24a45 100644 --- a/internal/functions/Write-ProgressHelper.ps1 +++ b/internal/functions/Write-ProgressHelper.ps1 @@ -8,9 +8,9 @@ function Write-ProgressHelper { [int]$TotalSteps, [switch]$ExcludePercent ) - + $caller = (Get-PSCallStack)[1].Command - + if (-not $Activity) { $Activity = switch ($caller) { "Export-DbaInstance" { @@ -42,13 +42,18 @@ function Write-ProgressHelper { } } } - - if (-not $TotalSteps) { - $TotalSteps = ([regex]::Matches((Get-Command -Module dbatools -Name $caller).Definition, "Write-ProgressHelper")).Count - } + if ($ExcludePercent) { Write-Progress -Activity $Activity -Status $Message } else { - Write-Progress -Activity $Activity -Status $Message -PercentComplete (($StepNumber / $TotalSteps) * 100) + if (-not $TotalSteps -and $caller -ne '') { + $TotalSteps = ([regex]::Matches((Get-Command -Module dbatools -Name $caller).Definition, "Write-ProgressHelper")).Count + } + if (-not $TotalSteps) { + $percentComplete = 0 + } else { + $percentComplete = ($StepNumber / $TotalSteps) * 100 + } + Write-Progress -Activity $Activity -Status $Message -PercentComplete $percentComplete } } \ No newline at end of file diff --git a/internal/functions/flowcontrol/Test-ElevationRequirement.ps1 b/internal/functions/flowcontrol/Test-ElevationRequirement.ps1 index a082e3bcc9..d6aed1769b 100644 --- a/internal/functions/flowcontrol/Test-ElevationRequirement.ps1 +++ b/internal/functions/flowcontrol/Test-ElevationRequirement.ps1 @@ -36,7 +36,7 @@ function Test-ElevationRequirement { This will test whether the currently processed instance is localhost and the process is running elevated. If it should have elevation but is not running with elevation: - - In silent mode it will termiante with an exception + - In silent mode it will terminate with an exception - In default mode, it will continue with the next instance .EXAMPLE diff --git a/internal/scripts/smoLibraryImport.ps1 b/internal/scripts/smoLibraryImport.ps1 index 2ac179aa2e..bb9e27d404 100644 --- a/internal/scripts/smoLibraryImport.ps1 +++ b/internal/scripts/smoLibraryImport.ps1 @@ -16,7 +16,7 @@ $scriptBlock = { [string]$Name ) $DllRoot = (Resolve-Path -Path $DllRoot) - + if (-not $DoCopy) { return } @@ -30,7 +30,7 @@ $scriptBlock = { Copy-Item -Path (Resolve-Path -Path "$ModuleRoot\bin\smo\$Name.dll") -Destination $DllRoot } - + #region Names if ($PSVersionTable.PSEdition -eq "Core") { $names = @( @@ -53,7 +53,11 @@ $scriptBlock = { 'Microsoft.SqlServer.Dac', 'Microsoft.SqlServer.Dac.Extensions', 'Microsoft.SqlServer.TransactSql.ScriptDom', - 'Microsoft.SqlServer.Types' + 'Microsoft.SqlServer.Types', + 'Microsoft.SqlServer.Management.RegisteredServers', + 'Microsoft.SqlTools.Hosting', + 'Microsoft.SqlTools.ManagedBatchParser', + 'System.Data.SqlClient' ) } else { $names = @( @@ -74,34 +78,17 @@ $scriptBlock = { 'Microsoft.SqlServer.Management.UtilityEnum', 'Microsoft.SqlServer.Management.HadrDMF', 'Microsoft.SqlServer.VulnerabilityAssessment.Model', - 'Microsoft.SqlServer.BatchParser', 'Microsoft.SqlServer.BatchParserClient', 'Microsoft.SqlServer.BulkInsertTaskConnections', - 'Microsoft.SqlServer.DTSRuntimeWrap', 'Microsoft.SqlServer.DtsServer.Interop', - 'Microsoft.SqlServer.DTSUtilities', - 'Microsoft.SqlServer.ForEachFileEnumeratorWrap', - 'Microsoft.SqlServer.ManagedDTS', - 'Microsoft.SqlServer.IntegrationServices.ODataConnectionManager', - 'Microsoft.SqlServer.IntegrationServices.ODataSrc', - 'Microsoft.SqlServer.PipelineHost', - 'Microsoft.SqlServer.PackageFormatUpdate', 'Microsoft.SqlServer.Replication', - 'Microsoft.SqlServer.SqlCEDest', - 'Microsoft.SqlServer.SQLTask', - 'Microsoft.SqlServer.TxScript', 'Microsoft.SqlServer.XE.Core', 'Microsoft.SqlServer.XEvent.Configuration', 'Microsoft.SqlServer.XEvent', 'Microsoft.SqlServer.XEvent.Linq', - 'Microsoft.SqlServer.XmlSrc', 'Microsoft.SqlServer.Rmo', - 'Microsoft.SqlServer.DTSPipelineWrap', - 'Microsoft.SqlServer.ScriptTask', - 'Accessibility', - 'EnvDTE', 'Microsoft.AnalysisServices.AppLocal.Core', 'Microsoft.AnalysisServices.AppLocal', 'Microsoft.Azure.KeyVault.Core', @@ -109,76 +96,38 @@ $scriptBlock = { 'Microsoft.Data.OData', 'Microsoft.Practices.TransientFaultHandling.Core', 'Microsoft.DataTransfer.Common.Utils', - 'Microsoft.SqlServer.ASTasks', 'Microsoft.SqlServer.ConnectionInfoExtended', - 'Microsoft.SqlServer.DataProfiler', - 'Microsoft.SqlServer.DataProfilingTask', 'Microsoft.SqlServer.Diagnostics.STrace', 'Microsoft.SqlServer.Dmf.Common', - - 'Microsoft.SqlServer.DMQueryTask', - 'Microsoft.SqlServer.DTEnum', - 'Microsoft.SqlServer.Dts.Design', - 'Microsoft.SqlServer.Dts.DtsClient', - 'Microsoft.SqlServer.DtsMsg', - 'Microsoft.SqlServer.Edition', - 'Microsoft.SqlServer.ExecProcTask', - 'Microsoft.SqlServer.ExpressionTask', - 'Microsoft.SqlServer.FileSystemTask', - 'Microsoft.SqlServer.ForEachADOEnumerator', - 'Microsoft.SqlServer.ForEachFromVarEnumerator', - 'Microsoft.SqlServer.ForEachNodeListEnumerator', - 'Microsoft.SqlServer.ForEachSMOEnumerator', - 'Microsoft.SqlServer.FtpTask', - 'Microsoft.SqlServer.GridControl', - 'Microsoft.SqlServer.Instapi', + 'Microsoft.Build.Utilities.Core', + 'Microsoft.Build.Framework', + 'System.Collections.Immutable', + 'Microsoft.Data.Tools.Schema.Tasks.Sql', + 'Microsoft.SqlServer.TransactSql', + 'Microsoft.Data.Tools.Schema.Sql', 'Microsoft.SqlServer.IntegrationServices.ClusterManagement', - 'Microsoft.SqlServer.IntegrationServices.Common.ObjectModel', 'Microsoft.SqlServer.IntegrationServices.ISServerDBUpgrade', 'Microsoft.SqlServer.IntegrationServices.Server.Common', 'Microsoft.SqlServer.IntegrationServices.Server', 'Microsoft.SqlServer.IntegrationServices.Server.IPC', 'Microsoft.SqlServer.IntegrationServices.server.shared', 'Microsoft.SqlServer.IntegrationServices.TaskScheduler', - 'Microsoft.SqlServer.ManagedConnections', - 'Microsoft.SqlServer.Management.CollectorTasks', - 'Microsoft.SqlServer.Management.HelpViewer', 'Microsoft.SqlServer.Management.IntegrationServices', 'Microsoft.SqlServer.Management.IntegrationServicesEnum', 'Microsoft.SqlServer.Management.Sdk.Scripting', - 'Microsoft.SqlServer.Management.Sdk.SqlStudio', 'Microsoft.SqlServer.Management.SmartAdminPolicies', - 'Microsoft.SqlServer.Management.SqlParser', - 'Microsoft.SqlServer.Management.SystemMetadataProvider', 'Microsoft.SqlServer.Management.XEvent', 'Microsoft.SqlServer.Management.XEventDbScoped', 'Microsoft.SqlServer.Management.XEventDbScopedEnum', 'Microsoft.SqlServer.Management.XEventEnum', - 'Microsoft.SqlServer.MSMQTask', - 'Microsoft.SqlServer.PipelineXML', 'Microsoft.SqlServer.PolicyEnum', 'Microsoft.SqlServer.Replication.BusinessLogicSupport', - 'Microsoft.SqlServer.SendMailTask', 'Microsoft.SqlServer.SqlClrProvider', - 'Microsoft.SqlServer.SQLTaskConnectionsWrap', 'Microsoft.SqlServer.SqlTDiagm', 'Microsoft.SqlServer.SString', - 'Microsoft.SqlServer.TransferDatabasesTask', - 'Microsoft.SqlServer.TransferErrorMessagesTask', - 'Microsoft.SqlServer.TransferJobsTask', - 'Microsoft.SqlServer.TransferLoginsTask', - 'Microsoft.SqlServer.TransferObjectsTask', - 'Microsoft.SqlServer.TransferSqlServerObjectsTask', - 'Microsoft.SqlServer.TransferStoredProceduresTask', - 'Microsoft.SqlServer.Types', - 'Microsoft.SqlServer.Types.resources', - 'Microsoft.SqlServer.VSTAScriptingLib', - 'Microsoft.SqlServer.WebServiceTask', - 'Microsoft.SqlServer.WMIDRTask', - 'Microsoft.SqlServer.WMIEWTask', - 'Microsoft.SqlServer.XMLTask', - 'Microsoft.SqlServer.Dmf.Adapters', - 'Microsoft.SqlServer.DmfSqlClrWrapper' + 'Microsoft.SqlServer.DmfSqlClrWrapper', + 'Microsoft.SqlServer.Dac', + 'Microsoft.SqlServer.Dac.Extensions' ) } #endregion Names @@ -200,7 +149,7 @@ $scriptBlock = { $smo = (Resolve-Path -Path "$script:DllRoot\smo") if ($script:serialImport) { - $scriptBlock.Invoke($script:PSModuleRoot, "$script:DllRoot\smo", (-not $script:strictSecurityMode)) + $scriptBlock.Invoke($script:PSModuleRoot, "$script:DllRoot\smo", $script:copyDllMode) } else { $script:smoRunspace = [System.Management.Automation.PowerShell]::Create() if ($script:smoRunspace.Runspace.Name) { diff --git a/readme.md b/readme.md index 1c1beb631a..7bb401d73e 100644 --- a/readme.md +++ b/readme.md @@ -1,39 +1,47 @@ -# dbatools +dbatools logo dbatools is PowerShell module that you may think of like a command-line SQL Server Management Studio. The project initially started out as just `Start-SqlMigration.ps1`, but has now grown into a collection of [over 500 commands](https://dbatools.io/commands) that help automate SQL Server tasks and encourage best practices. -dbatools logo dbatools is sort of like a command-line SQL Server Management Studio. The project initially started out as Start-SqlMigration.ps1, but has now grown into a collection of [over 500 commands](https://dbatools.io/commands) that help automate SQL Server tasks and encourage best practices. +Want to contribute to the project? We'd love to have you! Visit our [contributing.md](contributing.md) for a jump start. -Got ideas for new commands? Please propose them as [issues](https://dbatools.io/issues) and let us know what you'd like to see. Bug reports should also be filed under this repository's [issues](https://github.com/sqlcollaborative/dbatools/issues) section. +## Key links for reference: -There's also over 1500 of us on the [SQL Server Community Slack](https://sqlcommunity.slack.com) in the #dbatools channel. Need an invite? Check out the [self-invite page](https://dbatools.io/slack/). Drop by if you'd like to chat about dbatools or even [join the team](https://dbatools.io/team)! +- [dbatools Slack channel](https://sqlcommunity.slack.com/messages/C1M2WEASG/) for general discussion on the module and asking questions +- [dbatools-dev Slack channel](https://sqlcommunity.slack.com/messages/C3EJ852JD/) for discussion around contributing to the project +- [dbatools documentation](https://docs.dbatools.io) + +_Need an invite to the SQL Community Slack workspace? Check out the [self-invite page](https://dbatools.io/slack/). Drop by if you'd like to chat about dbatools or even [join the team](https://dbatools.io/team)!_ ## Installer -dbatools now works on PowerShell Core (aka PowerShell 6+). This means that you can run a large majority of our commands on Linux and macoS 🤩👠+dbatools now works on PowerShell Core (aka PowerShell 6+). This means that you can run a large majority of our commands on Linux and macOS 🤩👠+ +Run the following to install dbatools from the PowerShell Gallery (to install on a server or for all users, remove the `-Scope` parameter and run in an elevated session): -Run the following from an administrative prompt to install dbatools from the PowerShell Gallery: ```powershell -Install-Module dbatools +Install-Module dbatools -Scope CurrentUser ``` -Or if you don't have a version of PowerShell that supports the Gallery, you can install it manually: +If you don't have a version of PowerShell that supports the PowerShell Gallery, you can install it manually: + ```powershell Invoke-Expression (Invoke-WebRequest https://dbatools.io/in) ``` -Note: please only use `Invoke-Expression (Invoke-WebRequest..)` from sources you trust, like us 👠+> Note: please only use `Invoke-Expression (Invoke-WebRequest..)` from sources you trust, like us 👠## Usage scenarios -In addition to the simple things you can do in SSMS (like starting a job), we've also read a whole bunch of docs and came up with commands that do nifty things quickly. +In addition to the simple things you can do in SSMS (e.g. starting a job, backing up a database), we've also read a whole bunch of docs and came up with commands that do nifty things quickly. -* Lost sysadmin access and need to regain entry to your SQL Server? Use [Reset-DbaAdmin](http://dbatools.io/Reset-DbaAdmin). -* Need to easily test your backups? Use [Test-DbaLastBackup](http://dbatools.io/Test-DbaLastBackup). -* SPN management got you down? Use [our suite of SPN commands](http://dbatools.io/schwifty) to find which SPNs are missing and easily add them. -* Got so many databases you can't keep track? Congrats on your big ol' environment! Use [Find-DbaDatabase](http://dbatools.io/Find-DbaDatabase) to easily find your database. +- Lost sysadmin access and need to regain entry to your SQL Server? Use [Reset-DbaAdmin](http://dbatools.io/Reset-DbaAdmin). +- Need to easily test your backups? Use [Test-DbaLastBackup](http://dbatools.io/Test-DbaLastBackup). +- SPN management got you down? Use [our suite of SPN commands](http://dbatools.io/schwifty) to find which SPNs are missing and easily add them. +- Got so many databases you can't keep track? Congrats on your big ol' environment! Use [Find-DbaDatabase](http://dbatools.io/Find-DbaDatabase) to easily find your database. ## Usage examples -As previously mentioned, dbatools now offers [over 400 commands](https://dbatools.io/commands)! [Here are some of the ones we highlight at conferences](https://gist.github.com/potatoqualitee/e8932b64aeb6ef404e252d656b6318a2) - PowerShell v3 and above required. (See below for important information about alternative logins and specifying SQL Server ports). +As previously mentioned, dbatools now offers [over 500 commands](https://dbatools.io/commands)! [Here are some of the ones we highlight at conferences](https://gist.github.com/potatoqualitee/e8932b64aeb6ef404e252d656b6318a2). + +PowerShell v3 and above required. (See below for important information about alternative logins and specifying SQL Server ports). ```powershell # Set some vars @@ -77,10 +85,7 @@ $startDbaMigrationSplat = @{ Destination = $new BackupRestore = $true SharedPath = 'C:\temp' - NoSysDbUserObjects = $true - NoCredentials = $true - NoBackupDevices = $true - NoEndPoints = $true + Exclude = 'BackupDevice','SysDbUserObjects','Credentials' } Start-DbaMigration @startDbaMigrationSplat -Force | Select * | Out-GridView @@ -190,7 +195,6 @@ $servers | Test-DbaSpn | Out-GridView -PassThru | Set-DbaSpn -WhatIf # Get Virtual Log File information Get-DbaDbVirtualLogFile -SqlInstance $new -Database db1 Get-DbaDbVirtualLogFile -SqlInstance $new -Database db1 | Measure-Object - ``` ## Important Note @@ -229,6 +233,17 @@ If you use non-default ports and SQL Browser is disabled, you can access servers Note that PowerShell sees commas as arrays, so you must surround the host name with quotes. +#### Using Start-Transcript + +Due to an [issue](https://github.com/sqlcollaborative/dbatools/issues/2722) in the way PowerShell 5.1 works you need to use `Import-Module dbatools` before you run `Start-Transcript`. If this isn't done then your transcript will stop when the module is imported: + +```powershell +Import-Module dbatools +Start-Transcript +Get-DbaDatabase -SqlInstance sql2017 +Stop-Transcript +``` + ## Support dbatools aims to support as many configurations as possible, including @@ -243,8 +258,4 @@ dbatools aims to support as many configurations as possible, including * Multiple instances on one server * Auto-populated parameters for command-line completion (think -Database and -Login) -Read more at our website at [dbatools.io](https://dbatools.io) - -## Contributing - -Want to contribute to the project? We'd love to have you! Visit our [contributing.md](https://github.com/sqlcollaborative/dbatools/blob/master/contributing.md) for a jump start. +Read more at our website at [dbatools.io](https://dbatools.io) \ No newline at end of file diff --git a/tests/Add-DbaAgDatabase.Tests.ps1 b/tests/Add-DbaAgDatabase.Tests.ps1 index c85acbc784..8bb789a1ad 100644 --- a/tests/Add-DbaAgDatabase.Tests.ps1 +++ b/tests/Add-DbaAgDatabase.Tests.ps1 @@ -4,19 +4,11 @@ Write-Host -Object "Running $PSCommandpath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - <# - Get commands, Default count = 11 - Commands with SupportShouldProcess = 13 - #> - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Add-DbaAgDatabase).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'AvailabilityGroup', 'Database', 'InputObject', 'EnableException', 'SeedingMode', 'SharedPath', 'UseLastBackup', 'Secondary', 'SecondarySqlCredential' - $paramCount = $knownParameters.Count - It "Should contain our specific parameters" { - ((Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','AvailabilityGroup','Database','Secondary','SecondarySqlCredential','InputObject','SeedingMode','SharedPath','UseLastBackup','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Add-DbaAgListener.Tests.ps1 b/tests/Add-DbaAgListener.Tests.ps1 index f84ff6a501..e8bc42d087 100644 --- a/tests/Add-DbaAgListener.Tests.ps1 +++ b/tests/Add-DbaAgListener.Tests.ps1 @@ -4,19 +4,11 @@ Write-Host -Object "Running $PSCommandpath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - <# - Get commands, Default count = 11 - Commands with SupportShouldProcess = 13 - #> - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Add-DbaAgListener).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'AvailabilityGroup', 'IPAddress', 'SubnetMask', 'Port', 'Dhcp', 'Passthru', 'InputObject', 'EnableException' - $paramCount = $knownParameters.Count - It "Should contain our specific parameters" { - ((Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','AvailabilityGroup','IPAddress','SubnetMask','Port','Dhcp','Passthru','InputObject','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Add-DbaAgReplica.Tests.ps1 b/tests/Add-DbaAgReplica.Tests.ps1 index 80fbb76626..fde8d6a2b8 100644 --- a/tests/Add-DbaAgReplica.Tests.ps1 +++ b/tests/Add-DbaAgReplica.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandpath" -ForegroundColor Cyan Describe "$commandname Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - <# - Get commands, Default count = 11 - Commands with SupportShouldProcess = 13 - #> - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Add-DbaAgReplica).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Name', 'AvailabilityMode', 'FailoverMode', 'BackupPriority', 'ConnectionModeInPrimaryRole', 'ConnectionModeInSecondaryRole', 'SeedingMode', 'Endpoint', 'Passthru', 'ReadonlyRoutingConnectionUrl', 'Certificate', 'InputObject', 'EnableException' - It "Should contain our specific parameters" { - ((Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count) | Should Be $knownParameters.Count + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Name','AvailabilityMode','FailoverMode','BackupPriority','ConnectionModeInPrimaryRole','ConnectionModeInSecondaryRole','SeedingMode','Endpoint','Passthru','ReadonlyRoutingConnectionUrl','Certificate','InputObject','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Add-DbaCmsRegServer.Tests.ps1 b/tests/Add-DbaCmsRegServer.Tests.ps1 index 42fbff5fd5..3c8039969c 100644 --- a/tests/Add-DbaCmsRegServer.Tests.ps1 +++ b/tests/Add-DbaCmsRegServer.Tests.ps1 @@ -4,23 +4,11 @@ Write-Host -Object "Running $PSCommandpath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tags "UnitTests" { Context "Validate parameters" { - $knownParameters = 'SqlInstance', 'SqlCredential', 'ServerName', 'Name', 'Description', 'Group', 'InputObject', 'EnableException' - $SupportShouldProcess = $true - $paramCount = $knownParameters.Count - if ($SupportShouldProcess) { - $defaultParamCount = 13 - } else { - $defaultParamCount = 11 - } - $command = Get-Command -Name $CommandName - [object[]]$params = $command.Parameters.Keys - - It "Should contain our specific parameters" { - ((Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count) | Should Be $paramCount - } - - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','ServerName','Name','Description','Group','InputObject','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Add-DbaCmsRegServerGroup.Tests.ps1 b/tests/Add-DbaCmsRegServerGroup.Tests.ps1 index 433fe3c916..64fa20ce0c 100644 --- a/tests/Add-DbaCmsRegServerGroup.Tests.ps1 +++ b/tests/Add-DbaCmsRegServerGroup.Tests.ps1 @@ -4,23 +4,11 @@ Write-Host -Object "Running $PSCommandpath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tags "UnitTests" { Context "Validate parameters" { - $knownParameters = 'SqlInstance', 'SqlCredential', 'Name', 'Description', 'Group', 'InputObject', 'EnableException' - $SupportShouldProcess = $true - $paramCount = $knownParameters.Count - if ($SupportShouldProcess) { - $defaultParamCount = 13 - } else { - $defaultParamCount = 11 - } - $command = Get-Command -Name $CommandName - [object[]]$params = $command.Parameters.Keys - - It "Should contain our specific parameters" { - ((Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count) | Should Be $paramCount - } - - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Name','Description','Group','InputObject','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Add-DbaComputerCertificate.Tests.ps1 b/tests/Add-DbaComputerCertificate.Tests.ps1 index 258e3d7366..6e31278adb 100644 --- a/tests/Add-DbaComputerCertificate.Tests.ps1 +++ b/tests/Add-DbaComputerCertificate.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 8 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Add-DbaComputerCertificate).Parameters.Keys - $knownParameters = 'ComputerName', 'Credential', 'SecurePassword', 'Certificate', 'Path', 'Store', 'Folder', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'ComputerName','Credential','SecurePassword','Certificate','Path','Store','Folder','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Add-DbaDbMirrorMonitor.Tests.ps1 b/tests/Add-DbaDbMirrorMonitor.Tests.ps1 index eabde7ca17..e07d8ca938 100644 --- a/tests/Add-DbaDbMirrorMonitor.Tests.ps1 +++ b/tests/Add-DbaDbMirrorMonitor.Tests.ps1 @@ -4,23 +4,11 @@ Write-Host -Object "Running $PSCommandpath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tags "UnitTests" { Context "Validate parameters" { - $knownParameters = 'SqlInstance', 'SqlCredential', 'EnableException' - $SupportShouldProcess = $true - $paramCount = $knownParameters.Count - if ($SupportShouldProcess) { - $defaultParamCount = 13 - } else { - $defaultParamCount = 11 - } - $command = Get-Command -Name $CommandName - [object[]]$params = $command.Parameters.Keys - - It "Should contain our specific parameters" { - ((Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count) | Should Be $paramCount - } - - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Add-DbaPfDataCollectorCounter.Tests.ps1 b/tests/Add-DbaPfDataCollectorCounter.Tests.ps1 index 33078ac7da..1910722fbd 100644 --- a/tests/Add-DbaPfDataCollectorCounter.Tests.ps1 +++ b/tests/Add-DbaPfDataCollectorCounter.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 7 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Add-DbaPfDataCollectorCounter).Parameters.Keys - $knownParameters = 'ComputerName', 'Credential', 'CollectorSet', 'Collector', 'Counter', 'InputObject', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'ComputerName','Credential','CollectorSet','Collector','Counter','InputObject','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Backup-DbaDatabase.Tests.ps1 b/tests/Backup-DbaDatabase.Tests.ps1 index 3a29ff822b..628c7a23ca 100644 --- a/tests/Backup-DbaDatabase.Tests.ps1 +++ b/tests/Backup-DbaDatabase.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 29 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Backup-DbaDatabase).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Database', 'ExcludeDatabase', 'BackupDirectory', 'BackupFileName', 'ReplaceInName', 'CopyOnly', 'Type', 'InputObject', 'CreateFolder', 'FileCount', 'CompressBackup', 'Checksum', 'Verify', 'MaxTransferSize', 'BlockSize', 'BufferCount', 'AzureBaseUrl', 'AzureCredential', 'NoRecovery', 'BuildPath', 'WithFormat', 'Initialize', 'SkipTapeHeader', 'TimeStampFormat', 'IgnoreFileChecks', 'OutputScriptOnly', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance', 'SqlCredential', 'Database', 'ExcludeDatabase', 'BackupDirectory', 'BackupFileName', 'ReplaceInName', 'CopyOnly', 'Type', 'InputObject', 'CreateFolder', 'FileCount', 'CompressBackup', 'Checksum', 'Verify', 'MaxTransferSize', 'BlockSize', 'BufferCount', 'AzureBaseUrl', 'AzureCredential', 'NoRecovery', 'BuildPath', 'WithFormat', 'Initialize', 'SkipTapeHeader', 'TimeStampFormat', 'IgnoreFileChecks', 'OutputScriptOnly', 'EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } @@ -79,6 +75,26 @@ Describe "$commandname Integration Tests" -Tags "IntegrationTests" { } } + Context "Database parameter works when using pipes (fixes #5044)" { + $results = Get-DbaDatabase -SqlInstance $script:instance1 | Backup-DbaDatabase -Database master -BackupFileName PesterTest.bak -BackupDirectory $DestBackupDir + It "Should report it has backed up to the path with the correct name" { + $results.Fullname | Should -BeLike "$DestBackupDir*PesterTest.bak" + } + It "Should have backed up to the path with the correct name" { + Test-Path "$DestBackupDir\PesterTest.bak" | Should -Be $true + } + } + + Context "ExcludeDatabase parameter works when using pipes (fixes #5044)" { + $results = Get-DbaDatabase -SqlInstance $script:instance1 | Backup-DbaDatabase -ExcludeDatabase master, tempdb, msdb, model + It "Should report it has backed up to the path with the correct name" { + $results.DatabaseName | Should -Not -Contain master + $results.DatabaseName | Should -Not -Contain tempdb + $results.DatabaseName | Should -Not -Contain msdb + $results.DatabaseName | Should -Not -Contain model + } + } + Context "Handling backup paths that don't exist" { $MissingPathTrailing = "$DestBackupDir\Missing1\Awol2\" $MissingPath = "$DestBackupDir\Missing1\Awol2" @@ -157,9 +173,11 @@ Describe "$commandname Integration Tests" -Tags "IntegrationTests" { } } - It "Should have 1 period in file extension" { - foreach ($path in $results.BackupFile) { - [IO.Path]::GetExtension($path) | Should -Not -BeLike '*..*' + Context "Should build filenames properly" { + It "Should have 1 period in file extension" { + foreach ($path in $results.BackupFile) { + [IO.Path]::GetExtension($path) | Should -Not -BeLike '*..*' + } } } @@ -174,6 +192,27 @@ Describe "$commandname Integration Tests" -Tags "IntegrationTests" { } } + Context "Test backup verification" { + $null = Invoke-DbaQuery -SqlInstance $script:instance1 -Database master -Query "CREATE DATABASE [backuptest]" + $null = Invoke-DbaQuery -SqlInstance $script:instance1 -Database master -Query "ALTER DATABASE [backuptest] SET RECOVERY FULL WITH NO_WAIT" + It -Skip "Should perform a full backup and verify it" { + $b = Backup-DbaDatabase -SqlInstance $script:instance1 -Database backuptest -Type full -Verify + $b.BackupComplete | Should -Be $True + $b.Verified | Should -Be $True + } + It -Skip "Should perform a diff backup and verify it" { + $b = Backup-DbaDatabase -SqlInstance $script:instance1 -Database backuptest -Type diff -Verify + $b.BackupComplete | Should -Be $True + $b.Verified | Should -Be $True + } + It -Skip "Should perform a log backup and verify it" { + $b = Backup-DbaDatabase -SqlInstance $script:instance1 -Database backuptest -Type log -Verify + $b.BackupComplete | Should -Be $True + $b.Verified | Should -Be $True + } + $null = Invoke-DbaQuery -SqlInstance $script:instance1 -Database master -Query "DROP DATABASE [backuptest]" + } + Context "Backup can pipe to restore" { $null = Restore-DbaDatabase -SqlServer $script:instance1 -Path $script:appveyorlabrepo\singlerestore\singlerestore.bak -DatabaseName "dbatoolsci_singlerestore" $results = Backup-DbaDatabase -SqlInstance $script:instance1 -BackupDirectory $DestBackupDir -Database "dbatoolsci_singlerestore" | Restore-DbaDatabase -SqlInstance $script:instance2 -DatabaseName $DestDbRandom -TrustDbBackupHistory -ReplaceDbNameInFile diff --git a/tests/Backup-DbaDbCertificate.Tests.ps1 b/tests/Backup-DbaDbCertificate.Tests.ps1 index 6d141e69c1..cd15a4f6c9 100644 --- a/tests/Backup-DbaDbCertificate.Tests.ps1 +++ b/tests/Backup-DbaDbCertificate.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 11 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Backup-DbaDbCertificate).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Certificate', 'Database', 'ExcludeDatabase', 'EncryptionPassword', 'DecryptionPassword', 'Path', 'Suffix', 'InputObject', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Certificate','Database','ExcludeDatabase','EncryptionPassword','DecryptionPassword','Path','Suffix','InputObject','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Backup-DbaDbMasterKey.Tests.ps1 b/tests/Backup-DbaDbMasterKey.Tests.ps1 index 3c18c8c09f..277b4d2a17 100644 --- a/tests/Backup-DbaDbMasterKey.Tests.ps1 +++ b/tests/Backup-DbaDbMasterKey.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 9 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Backup-DbaDbMasterKey).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Credential', 'Database', 'ExcludeDatabase', 'SecurePassword', 'Path', 'InputObject', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Credential','Database','ExcludeDatabase','SecurePassword','Path','InputObject','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Clear-DbaConnectionPool.Tests.ps1 b/tests/Clear-DbaConnectionPool.Tests.ps1 index 66f60c7413..a917c20f77 100644 --- a/tests/Clear-DbaConnectionPool.Tests.ps1 +++ b/tests/Clear-DbaConnectionPool.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 3 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Clear-DbaConnectionPool).Parameters.Keys - $knownParameters = 'ComputerName', 'Credential', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'ComputerName','Credential','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Clear-DbaLatchStatistics.Tests.ps1 b/tests/Clear-DbaLatchStatistics.Tests.ps1 index 4e4d529fcb..5babaa8748 100644 --- a/tests/Clear-DbaLatchStatistics.Tests.ps1 +++ b/tests/Clear-DbaLatchStatistics.Tests.ps1 @@ -4,23 +4,11 @@ Write-Host -Object "Running $PSCommandpath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tags "UnitTests" { Context "Validate parameters" { - $knownParameters = 'SqlInstance', 'SqlCredential', 'EnableException' - $paramCount = $knownParameters.Count - $SupportShouldProcess = $true - if ($SupportShouldProcess) { - $defaultParamCount = 13 - } else { - $defaultParamCount = 11 - } - $command = Get-Command -Name $CommandName - [object[]]$params = $command.Parameters.Keys - - It "Should contain our specific parameters" { - ((Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count) | Should Be $paramCount - } - - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Clear-DbaPlanCache.Tests.ps1 b/tests/Clear-DbaPlanCache.Tests.ps1 index 16509deb97..1cd3a6fa2a 100644 --- a/tests/Clear-DbaPlanCache.Tests.ps1 +++ b/tests/Clear-DbaPlanCache.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 5 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Clear-DbaPlanCache).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Threshold', 'InputObject', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Threshold','InputObject','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Clear-DbaWaitStatistics.Tests.ps1 b/tests/Clear-DbaWaitStatistics.Tests.ps1 index 6c8e6e1370..dad08e1183 100644 --- a/tests/Clear-DbaWaitStatistics.Tests.ps1 +++ b/tests/Clear-DbaWaitStatistics.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 3 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Clear-DbaWaitStatistics).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Connect-DbaInstance.Tests.ps1 b/tests/Connect-DbaInstance.Tests.ps1 index e304a376ea..f804a1e381 100644 --- a/tests/Connect-DbaInstance.Tests.ps1 +++ b/tests/Connect-DbaInstance.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Connect-DbaInstance).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Database', 'AccessToken', 'ApplicationIntent', 'BatchSeparator', 'ClientName', 'ConnectTimeout', 'EncryptConnection', 'FailoverPartner', 'LockTimeout', 'MaxPoolSize', 'MinPoolSize', 'MultipleActiveResultSets', 'MultiSubnetFailover', 'NetworkProtocol', 'NonPooledConnection', 'PacketSize', 'PooledConnectionLifetime', 'SqlExecutionModes', 'StatementTimeout', 'TrustServerCertificate', 'WorkstationId', 'AppendConnectionString', 'SqlConnectionOnly', 'DisableException' - $paramCount = $knownParameters.Count - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Database','AccessToken','ApplicationIntent','AzureUnsupported','BatchSeparator','ClientName','ConnectTimeout','EncryptConnection','FailoverPartner','LockTimeout','MaxPoolSize','MinPoolSize','MinimumVersion','MultipleActiveResultSets','MultiSubnetFailover','NetworkProtocol','NonPooledConnection','PacketSize','PooledConnectionLifetime','SqlExecutionModes','StatementTimeout','TrustServerCertificate','WorkstationId','AppendConnectionString','SqlConnectionOnly','DisableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Connect-SqlInstance.Tests.ps1 b/tests/Connect-SqlInstance.Tests.ps1 index 1207e0bd6a..58cfc9e1b5 100644 --- a/tests/Connect-SqlInstance.Tests.ps1 +++ b/tests/Connect-SqlInstance.Tests.ps1 @@ -3,6 +3,18 @@ Write-Host -Object "Running $PSCommandpath" -ForegroundColor Cyan . "$PSScriptRoot\constants.ps1" . "$PSScriptRoot\..\internal\functions\Connect-SqlInstance.ps1" +Describe "$commandname Unit Tests" -Tags "UnitTests" { + Context "Validate parameters" { + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','StatementTimeout','MinimumVersion','AzureUnsupported','NonPooled' + + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 + } + } +} + Describe "$commandname Integration Tests" -Tags "IntegrationTests" { $password = 'MyV3ry$ecur3P@ssw0rd' $securePassword = ConvertTo-SecureString $password -AsPlainText -Force diff --git a/tests/ConvertTo-DbaDataTable.Tests.ps1 b/tests/ConvertTo-DbaDataTable.Tests.ps1 index 233d0a453b..f8f1f4b79f 100644 --- a/tests/ConvertTo-DbaDataTable.Tests.ps1 +++ b/tests/ConvertTo-DbaDataTable.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 6 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\ConvertTo-DbaDataTable).Parameters.Keys - $knownParameters = 'InputObject', 'TimeSpanType', 'SizeType', 'IgnoreNull', 'Raw', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'InputObject','TimeSpanType','SizeType','IgnoreNull','Raw','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/ConvertTo-DbaTimeline.Tests.ps1 b/tests/ConvertTo-DbaTimeline.Tests.ps1 index fa151c0d6b..afd171ab05 100644 --- a/tests/ConvertTo-DbaTimeline.Tests.ps1 +++ b/tests/ConvertTo-DbaTimeline.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 2 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\ConvertTo-DbaTimeline).Parameters.Keys - $knownParameters = 'InputObject', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'InputObject','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/ConvertTo-DbaXESession.Tests.ps1 b/tests/ConvertTo-DbaXESession.Tests.ps1 index 00044e0b67..816344a2ce 100644 --- a/tests/ConvertTo-DbaXESession.Tests.ps1 +++ b/tests/ConvertTo-DbaXESession.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 4 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\ConvertTo-DbaXESession).Parameters.Keys - $knownParameters = 'InputObject', 'Name', 'OutputScriptOnly', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'InputObject','Name','OutputScriptOnly','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Copy-DbaAgentAlert.Tests.ps1 b/tests/Copy-DbaAgentAlert.Tests.ps1 index 06c1b4272a..bea925fb23 100644 --- a/tests/Copy-DbaAgentAlert.Tests.ps1 +++ b/tests/Copy-DbaAgentAlert.Tests.ps1 @@ -4,51 +4,76 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 9 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Copy-DbaAgentAlert).Parameters.Keys - $knownParameters = 'Source', 'SourceSqlCredential', 'Destination', 'DestinationSqlCredential', 'Alert', 'ExcludeAlert', 'IncludeDefaults', 'Force', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'Source', 'SourceSqlCredential', 'Destination', 'DestinationSqlCredential', 'Alert', 'ExcludeAlert', 'IncludeDefaults', 'Force', 'EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } Describe "$commandname Integration Tests" -Tag "IntegrationTests" { BeforeAll { + $alert1 = 'dbatoolsci test alert' + $alert2 = 'dbatoolsci test alert 2' + $operatorName = 'Dan the man Levitan' + $operatorEmail = 'levitan@dbatools.io' $server = Connect-DbaInstance -SqlInstance $script:instance2 -Database master - $server.Query("EXEC msdb.dbo.sp_add_alert @name=N'dbatoolsci test alert', + + $server.Query("EXEC msdb.dbo.sp_add_alert @name=N'$($alert1)', @message_id=0, @severity=6, @enabled=1, @delay_between_responses=0, @include_event_description_in=0, @category_name=N'[Uncategorized]', - @job_id=N'00000000-0000-0000-0000-000000000000'") + @job_id=N'00000000-0000-0000-0000-000000000000';") + + $server.Query("EXEC msdb.dbo.sp_add_alert @name=N'$($alert2)', + @message_id=0, + @severity=10, + @enabled=1, + @delay_between_responses=0, + @include_event_description_in=0, + @job_id=N'00000000-0000-0000-0000-000000000000';") + + $server.Query("EXEC msdb.dbo.sp_add_operator + @name = N'$operatorName', + @enabled = 1, + @email_address = N'$operatorEmail' ;") + $server.Query("EXEC msdb.dbo.sp_add_notification @alert_name = N'$($alert2)', + @operator_name = N'$operatorName', + @notification_method = 1 ;") } AfterAll { $server = Connect-DbaInstance -SqlInstance $script:instance2 -Database master - $server.Query("EXEC msdb.dbo.sp_delete_alert @name=N'dbatoolsci test alert'") + $server.Query("EXEC msdb.dbo.sp_delete_alert @name=N'$($alert1)'") + $server.Query("EXEC msdb.dbo.sp_delete_alert @name=N'$($alert2)'") + $server.Query("EXEC msdb.dbo.sp_delete_operator @name = '$($operatorName)'") + $server = Connect-DbaInstance -SqlInstance $script:instance3 -Database master - $server.Query("EXEC msdb.dbo.sp_delete_alert @name=N'dbatoolsci test alert'") + $server.Query("EXEC msdb.dbo.sp_delete_alert @name=N'$($alert1)'") } - It "copies the sample alert" { - $results = Copy-DbaAgentAlert -Source $script:instance2 -Destination $script:instance3 -Alert 'dbatoolsci test alert' + It "Copies the sample alert" { + $results = Copy-DbaAgentAlert -Source $script:instance2 -Destination $script:instance3 -Alert $alert1 $results.Name -eq 'dbatoolsci test alert', 'dbatoolsci test alert' $results.Status -eq 'Successful', 'Successful' } - It "doesn't overwrite existing alerts" { - $results = Copy-DbaAgentAlert -Source $script:instance2 -Destination $script:instance3 -Alert 'dbatoolsci test alert' + It "Skips alerts where destination is missing the operator" { + $results = Copy-DbaAgentAlert -Source $script:instance2 -Destination $script:instance3 -Alert $alert2 -WarningVariable warningInfo -WarningAction SilentlyContinue + $results.Status -eq 'Skipped', 'Skipped' + } + + It "Doesn't overwrite existing alerts" { + $results = Copy-DbaAgentAlert -Source $script:instance2 -Destination $script:instance3 -Alert $alert1 $results.Name -eq 'dbatoolsci test alert' $results.Status -eq 'Skipped' } - It "the newly copied alert exists" { + It "The newly copied alert exists" { $results = Get-DbaAgentAlert -SqlInstance $script:instance2 $results.Name -contains 'dbatoolsci test alert' } diff --git a/tests/Copy-DbaAgentJob.Tests.ps1 b/tests/Copy-DbaAgentJob.Tests.ps1 index c08e24cf86..548bfffbb3 100644 --- a/tests/Copy-DbaAgentJob.Tests.ps1 +++ b/tests/Copy-DbaAgentJob.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 10 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Copy-DbaAgentJob).Parameters.Keys - $knownParameters = 'Source', 'SourceSqlCredential', 'Destination', 'DestinationSqlCredential', 'Job', 'ExcludeJob', 'DisableOnSource', 'DisableOnDestination', 'Force', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'Source','SourceSqlCredential','Destination','DestinationSqlCredential','Job','ExcludeJob','DisableOnSource','DisableOnDestination','Force','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Copy-DbaAgentJobCategory.Tests.ps1 b/tests/Copy-DbaAgentJobCategory.Tests.ps1 index 31fbc77ca9..d74d5ec5f8 100644 --- a/tests/Copy-DbaAgentJobCategory.Tests.ps1 +++ b/tests/Copy-DbaAgentJobCategory.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 10 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Copy-DbaAgentJobCategory).Parameters.Keys - $knownParameters = 'Source', 'SourceSqlCredential', 'Destination', 'DestinationSqlCredential', 'CategoryType', 'JobCategory', 'AgentCategory', 'OperatorCategory', 'Force', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'Source','SourceSqlCredential','Destination','DestinationSqlCredential','CategoryType','JobCategory','AgentCategory','OperatorCategory','Force','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Copy-DbaAgentOperator.Tests.ps1 b/tests/Copy-DbaAgentOperator.Tests.ps1 index d73c224162..e310c4c011 100644 --- a/tests/Copy-DbaAgentOperator.Tests.ps1 +++ b/tests/Copy-DbaAgentOperator.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 8 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Copy-DbaAgentOperator).Parameters.Keys - $knownParameters = 'Source', 'SourceSqlCredential', 'Destination', 'DestinationSqlCredential', 'Operator', 'ExcludeOperator', 'Force', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'Source','SourceSqlCredential','Destination','DestinationSqlCredential','Operator','ExcludeOperator','Force','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Copy-DbaAgentProxy.Tests.ps1 b/tests/Copy-DbaAgentProxy.Tests.ps1 index c561af0c77..41c9eb4d1c 100644 --- a/tests/Copy-DbaAgentProxy.Tests.ps1 +++ b/tests/Copy-DbaAgentProxy.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 8 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Copy-DbaAgentProxy).Parameters.Keys - $knownParameters = 'Source', 'SourceSqlCredential', 'Destination', 'DestinationSqlCredential', 'ProxyAccount', 'ExcludeProxyAccount', 'Force', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'Source','SourceSqlCredential','Destination','DestinationSqlCredential','ProxyAccount','ExcludeProxyAccount','Force','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Copy-DbaAgentSchedule.Tests.ps1 b/tests/Copy-DbaAgentSchedule.Tests.ps1 index 7252aab89d..f5d079ac56 100644 --- a/tests/Copy-DbaAgentSchedule.Tests.ps1 +++ b/tests/Copy-DbaAgentSchedule.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 6 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Copy-DbaAgentSchedule).Parameters.Keys - $knownParameters = 'Source', 'SourceSqlCredential', 'Destination', 'DestinationSqlCredential', 'Force', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'Source','SourceSqlCredential','Destination','DestinationSqlCredential','Force','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Copy-DbaAgentServer.Tests.ps1 b/tests/Copy-DbaAgentServer.Tests.ps1 index 3daa896aaa..83fb422a70 100644 --- a/tests/Copy-DbaAgentServer.Tests.ps1 +++ b/tests/Copy-DbaAgentServer.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 8 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Copy-DbaAgentServer).Parameters.Keys - $knownParameters = 'Source', 'SourceSqlCredential', 'Destination', 'DestinationSqlCredential', 'DisableJobsOnDestination', 'DisableJobsOnSource', 'Force', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'Source','SourceSqlCredential','Destination','DestinationSqlCredential','DisableJobsOnDestination','DisableJobsOnSource','Force','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Copy-DbaBackupDevice.Tests.ps1 b/tests/Copy-DbaBackupDevice.Tests.ps1 index ea09408a6a..25b39c4e95 100644 --- a/tests/Copy-DbaBackupDevice.Tests.ps1 +++ b/tests/Copy-DbaBackupDevice.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 7 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Copy-DbaBackupDevice).Parameters.Keys - $knownParameters = 'Source', 'SourceSqlCredential', 'Destination', 'DestinationSqlCredential', 'BackupDevice', 'Force', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'Source','SourceSqlCredential','Destination','DestinationSqlCredential','BackupDevice','Force','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Copy-DbaCmsRegServer.Tests.ps1 b/tests/Copy-DbaCmsRegServer.Tests.ps1 index d27453c900..3f3997c457 100644 --- a/tests/Copy-DbaCmsRegServer.Tests.ps1 +++ b/tests/Copy-DbaCmsRegServer.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 8 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Copy-DbaCmsRegServer).Parameters.Keys - $knownParameters = 'Source', 'SourceSqlCredential', 'Destination', 'DestinationSqlCredential', 'Group', 'SwitchServerName', 'Force', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'Source','SourceSqlCredential','Destination','DestinationSqlCredential','Group','SwitchServerName','Force','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Copy-DbaCredential.Tests.ps1 b/tests/Copy-DbaCredential.Tests.ps1 index edca1f29d2..70c8f84b17 100644 --- a/tests/Copy-DbaCredential.Tests.ps1 +++ b/tests/Copy-DbaCredential.Tests.ps1 @@ -5,15 +5,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 11 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Copy-DbaCredential).Parameters.Keys - $knownParameters = 'Source', 'SourceSqlCredential', 'Credential', 'Destination', 'DestinationSqlCredential', 'Name', 'ExcludeName', 'Identity', 'ExcludeIdentity', 'Force', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'Source','SourceSqlCredential','Credential','Destination','DestinationSqlCredential','Name','ExcludeName','Identity','ExcludeIdentity','Force','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Copy-DbaCustomError.Tests.ps1 b/tests/Copy-DbaCustomError.Tests.ps1 index 6dfd5517fc..7a98338976 100644 --- a/tests/Copy-DbaCustomError.Tests.ps1 +++ b/tests/Copy-DbaCustomError.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 8 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Copy-DbaCustomError).Parameters.Keys - $knownParameters = 'Source', 'SourceSqlCredential', 'Destination', 'DestinationSqlCredential', 'CustomError', 'ExcludeCustomError', 'Force', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'Source','SourceSqlCredential','Destination','DestinationSqlCredential','CustomError','ExcludeCustomError','Force','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Copy-DbaDataCollector.Tests.ps1 b/tests/Copy-DbaDataCollector.Tests.ps1 index 41db513cc8..50fb20b731 100644 --- a/tests/Copy-DbaDataCollector.Tests.ps1 +++ b/tests/Copy-DbaDataCollector.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 9 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Copy-DbaDataCollector).Parameters.Keys - $knownParameters = 'Source', 'SourceSqlCredential', 'Destination', 'DestinationSqlCredential', 'CollectionSet', 'ExcludeCollectionSet', 'NoServerReconfig', 'Force', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'Source','SourceSqlCredential','Destination','DestinationSqlCredential','CollectionSet','ExcludeCollectionSet','NoServerReconfig','Force','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Copy-DbaDatabase.Tests.ps1 b/tests/Copy-DbaDatabase.Tests.ps1 index ac4aef1311..acca84d416 100644 --- a/tests/Copy-DbaDatabase.Tests.ps1 +++ b/tests/Copy-DbaDatabase.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 27 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Copy-DbaDatabase).Parameters.Keys - $knownParameters = 'Source', 'SourceSqlCredential', 'Destination', 'DestinationSqlCredential', 'Database', 'ExcludeDatabase', 'AllDatabases', 'BackupRestore', 'SharedPath', 'WithReplace', 'NoRecovery', 'NoBackupCleanup', 'NumberFiles', 'DetachAttach', 'Reattach', 'SetSourceReadOnly', 'ReuseSourceFolderStructure', 'IncludeSupportDbs', 'UseLastBackup', 'Continue', 'InputObject', 'NoCopyOnly', 'SetSourceOffline', 'NewName', 'Prefix', 'Force', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'Source','SourceSqlCredential','Destination','DestinationSqlCredential','Database','ExcludeDatabase','AllDatabases','BackupRestore','SharedPath','WithReplace','NoRecovery','NoBackupCleanup','NumberFiles','DetachAttach','Reattach','SetSourceReadOnly','ReuseSourceFolderStructure','IncludeSupportDbs','UseLastBackup','Continue','InputObject','NoCopyOnly','SetSourceOffline','NewName','Prefix','Force','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Copy-DbaDbAssembly.Tests.ps1 b/tests/Copy-DbaDbAssembly.Tests.ps1 index 64a03f2931..d8723e09bb 100644 --- a/tests/Copy-DbaDbAssembly.Tests.ps1 +++ b/tests/Copy-DbaDbAssembly.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 8 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Copy-DbaDbAssembly).Parameters.Keys - $knownParameters = 'Source', 'SourceSqlCredential', 'Destination', 'DestinationSqlCredential', 'Assembly', 'ExcludeAssembly', 'Force', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'Source','SourceSqlCredential','Destination','DestinationSqlCredential','Assembly','ExcludeAssembly','Force','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Copy-DbaDbMail.Tests.ps1 b/tests/Copy-DbaDbMail.Tests.ps1 index 5223b6face..01b29b9ce7 100644 --- a/tests/Copy-DbaDbMail.Tests.ps1 +++ b/tests/Copy-DbaDbMail.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 7 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Copy-DbaDbMail).Parameters.Keys - $knownParameters = 'Source', 'Destination', 'Type', 'SourceSqlCredential', 'DestinationSqlCredential', 'Force', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'Source','Destination','Type','SourceSqlCredential','DestinationSqlCredential','Force','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Copy-DbaDbQueryStoreOption.Tests.ps1 b/tests/Copy-DbaDbQueryStoreOption.Tests.ps1 index c9dfcd32ad..a76f9dfd1c 100644 --- a/tests/Copy-DbaDbQueryStoreOption.Tests.ps1 +++ b/tests/Copy-DbaDbQueryStoreOption.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 9 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Copy-DbaDbQueryStoreOption).Parameters.Keys - $knownParameters = 'Source', 'SourceSqlCredential', 'SourceDatabase', 'Destination', 'DestinationSqlCredential', 'DestinationDatabase', 'Exclude', 'AllDatabases', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'Source','SourceSqlCredential','SourceDatabase','Destination','DestinationSqlCredential','DestinationDatabase','Exclude','AllDatabases','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Copy-DbaDbTableData.Tests.ps1 b/tests/Copy-DbaDbTableData.Tests.ps1 index 41cf1eeab9..a922905010 100644 --- a/tests/Copy-DbaDbTableData.Tests.ps1 +++ b/tests/Copy-DbaDbTableData.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 21 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Copy-DbaDbTableData).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Destination', 'DestinationSqlCredential', 'Database', 'DestinationDatabase', 'Table', 'Query', 'BatchSize', 'NotifyAfter', 'DestinationTable', 'NoTableLock', 'CheckConstraints', 'FireTriggers', 'KeepIdentity', 'KeepNulls', 'Truncate', 'bulkCopyTimeOut', 'InputObject', 'EnableException', 'AutoCreateTable' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Destination','DestinationSqlCredential','Database','DestinationDatabase','Table','Query','AutoCreateTable','BatchSize','NotifyAfter','DestinationTable','NoTableLock','CheckConstraints','FireTriggers','KeepIdentity','KeepNulls','Truncate','bulkCopyTimeOut','InputObject','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Copy-DbaEndpoint.Tests.ps1 b/tests/Copy-DbaEndpoint.Tests.ps1 index 1b3dbe5b0e..ee22a43ab1 100644 --- a/tests/Copy-DbaEndpoint.Tests.ps1 +++ b/tests/Copy-DbaEndpoint.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 8 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Copy-DbaEndpoint).Parameters.Keys - $knownParameters = 'Source', 'SourceSqlCredential', 'Destination', 'DestinationSqlCredential', 'Endpoint', 'ExcludeEndpoint', 'Force', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'Source','SourceSqlCredential','Destination','DestinationSqlCredential','Endpoint','ExcludeEndpoint','Force','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Copy-DbaLinkedServer.Tests.ps1 b/tests/Copy-DbaLinkedServer.Tests.ps1 index 2bb2c04dd7..8871f12e5d 100644 --- a/tests/Copy-DbaLinkedServer.Tests.ps1 +++ b/tests/Copy-DbaLinkedServer.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 9 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Copy-DbaLinkedServer).Parameters.Keys - $knownParameters = 'Source', 'SourceSqlCredential', 'Destination', 'DestinationSqlCredential', 'LinkedServer', 'ExcludeLinkedServer', 'UpgradeSqlClient', 'Force', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'Source','SourceSqlCredential','Destination','DestinationSqlCredential','LinkedServer','ExcludeLinkedServer','UpgradeSqlClient','Force','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Copy-DbaLogin.Tests.ps1 b/tests/Copy-DbaLogin.Tests.ps1 index 470c0b19bf..05fae7c466 100644 --- a/tests/Copy-DbaLogin.Tests.ps1 +++ b/tests/Copy-DbaLogin.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 16 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Copy-DbaLogin).Parameters.Keys - $knownParameters = 'Source', 'SourceSqlCredential', 'Destination', 'DestinationSqlCredential', 'Login', 'ExcludeLogin', 'ExcludeSystemLogins', 'SyncOnly', 'SyncSaName', 'OutFile', 'InputObject', 'LoginRenameHashtable', 'KillActiveConnection', 'Force', 'EnableException', 'ExcludePermissionSync' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'Source','SourceSqlCredential','Destination','DestinationSqlCredential','Login','ExcludeLogin','ExcludeSystemLogins','SyncOnly','SyncSaName','OutFile','InputObject','LoginRenameHashtable','KillActiveConnection','Force','ExcludePermissionSync','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Copy-DbaPolicyManagement.Tests.ps1 b/tests/Copy-DbaPolicyManagement.Tests.ps1 index b55c956666..51c99fc689 100644 --- a/tests/Copy-DbaPolicyManagement.Tests.ps1 +++ b/tests/Copy-DbaPolicyManagement.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 10 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Copy-DbaPolicyManagement).Parameters.Keys - $knownParameters = 'Source', 'SourceSqlCredential', 'Destination', 'DestinationSqlCredential', 'Policy', 'ExcludePolicy', 'Condition', 'ExcludeCondition', 'Force', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'Source','SourceSqlCredential','Destination','DestinationSqlCredential','Policy','ExcludePolicy','Condition','ExcludeCondition','Force','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Copy-DbaResourceGovernor.Tests.ps1 b/tests/Copy-DbaResourceGovernor.Tests.ps1 index 0a807807ec..e705382932 100644 --- a/tests/Copy-DbaResourceGovernor.Tests.ps1 +++ b/tests/Copy-DbaResourceGovernor.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 8 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Copy-DbaResourceGovernor).Parameters.Keys - $knownParameters = 'Source', 'SourceSqlCredential', 'Destination', 'DestinationSqlCredential', 'ResourcePool', 'ExcludeResourcePool', 'Force', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'Source','SourceSqlCredential','Destination','DestinationSqlCredential','ResourcePool','ExcludeResourcePool','Force','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Copy-DbaServerAudit.Tests.ps1 b/tests/Copy-DbaServerAudit.Tests.ps1 index 6638f6df07..2b125fd4ac 100644 --- a/tests/Copy-DbaServerAudit.Tests.ps1 +++ b/tests/Copy-DbaServerAudit.Tests.ps1 @@ -4,11 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - [object[]]$params = (Get-ChildItem function:\Copy-DbaServerAudit).Parameters.Keys - $knownParameters = 'Source', 'SourceSqlCredential', 'Destination', 'DestinationSqlCredential', 'Audit', 'ExcludeAudit', 'Path', 'Force', 'EnableException' - $paramCount = $knownParameters.Count - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'Source','SourceSqlCredential','Destination','DestinationSqlCredential','Audit','ExcludeAudit','Path','Force','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Copy-DbaServerAuditSpecification.Tests.ps1 b/tests/Copy-DbaServerAuditSpecification.Tests.ps1 index 16508d38bb..afbbe3722e 100644 --- a/tests/Copy-DbaServerAuditSpecification.Tests.ps1 +++ b/tests/Copy-DbaServerAuditSpecification.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 8 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Copy-DbaServerAuditSpecification).Parameters.Keys - $knownParameters = 'Source', 'SourceSqlCredential', 'Destination', 'DestinationSqlCredential', 'AuditSpecification', 'ExcludeAuditSpecification', 'Force', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'Source','SourceSqlCredential','Destination','DestinationSqlCredential','AuditSpecification','ExcludeAuditSpecification','Force','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Copy-DbaServerTrigger.Tests.ps1 b/tests/Copy-DbaServerTrigger.Tests.ps1 index a0b828051e..ebd8437534 100644 --- a/tests/Copy-DbaServerTrigger.Tests.ps1 +++ b/tests/Copy-DbaServerTrigger.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 8 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Copy-DbaServerTrigger).Parameters.Keys - $knownParameters = 'Source', 'SourceSqlCredential', 'Destination', 'DestinationSqlCredential', 'ServerTrigger', 'ExcludeServerTrigger', 'Force', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'Source','SourceSqlCredential','Destination','DestinationSqlCredential','ServerTrigger','ExcludeServerTrigger','Force','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Copy-DbaSpConfigure.Tests.ps1 b/tests/Copy-DbaSpConfigure.Tests.ps1 index bbe5b6893d..f4fa815e34 100644 --- a/tests/Copy-DbaSpConfigure.Tests.ps1 +++ b/tests/Copy-DbaSpConfigure.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 7 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Copy-DbaSpConfigure).Parameters.Keys - $knownParameters = 'Source', 'SourceSqlCredential', 'Destination', 'DestinationSqlCredential', 'ConfigName', 'ExcludeConfigName', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'Source','SourceSqlCredential','Destination','DestinationSqlCredential','ConfigName','ExcludeConfigName','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Copy-DbaSsisCatalog.Tests.ps1 b/tests/Copy-DbaSsisCatalog.Tests.ps1 index 7536ed04fe..bcbe360bed 100644 --- a/tests/Copy-DbaSsisCatalog.Tests.ps1 +++ b/tests/Copy-DbaSsisCatalog.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 11 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Copy-DbaSsisCatalog).Parameters.Keys - $knownParameters = 'Source', 'Destination', 'SourceSqlCredential', 'DestinationSqlCredential', 'Project', 'Folder', 'Environment', 'CreateCatalogPassword', 'EnableSqlClr', 'Force', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'Source','Destination','SourceSqlCredential','DestinationSqlCredential','Project','Folder','Environment','CreateCatalogPassword','EnableSqlClr','Force','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Copy-DbaSysDbUserObject.Tests.ps1 b/tests/Copy-DbaSysDbUserObject.Tests.ps1 index 2236d44e11..a973e1446f 100644 --- a/tests/Copy-DbaSysDbUserObject.Tests.ps1 +++ b/tests/Copy-DbaSysDbUserObject.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 7 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Copy-DbaSysDbUserObject).Parameters.Keys - $knownParameters = 'Source', 'SourceSqlCredential', 'Destination', 'DestinationSqlCredential', 'Force', 'Classic', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'Source','SourceSqlCredential','Destination','DestinationSqlCredential','Force','Classic','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Copy-DbaXESession.Tests.ps1 b/tests/Copy-DbaXESession.Tests.ps1 index 7cb0999f2b..06e8b5c9c6 100644 --- a/tests/Copy-DbaXESession.Tests.ps1 +++ b/tests/Copy-DbaXESession.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 8 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Copy-DbaXESession).Parameters.Keys - $knownParameters = 'Source', 'Destination', 'SourceSqlCredential', 'DestinationSqlCredential', 'XeSession', 'ExcludeXeSession', 'Force', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'Source','Destination','SourceSqlCredential','DestinationSqlCredential','XeSession','ExcludeXeSession','Force','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Copy-DbaXESessionTemplate.Tests.ps1 b/tests/Copy-DbaXESessionTemplate.Tests.ps1 index 5fbf6e1b49..84d12b9a45 100644 --- a/tests/Copy-DbaXESessionTemplate.Tests.ps1 +++ b/tests/Copy-DbaXESessionTemplate.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 3 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Copy-DbaXESessionTemplate).Parameters.Keys - $knownParameters = 'Path', 'Destination', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'Path','Destination','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Disable-DbaAgHadr.Tests.ps1 b/tests/Disable-DbaAgHadr.Tests.ps1 index d36044ecd3..adb2d8dd90 100644 --- a/tests/Disable-DbaAgHadr.Tests.ps1 +++ b/tests/Disable-DbaAgHadr.Tests.ps1 @@ -4,19 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag "UnitTests" { Context "Validate parameters" { - $paramCount = 4 - <# - Get commands, Default count = 11 - Commands with SupportShouldProcess = 13 - #> - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Disable-DbaAgHadr).Parameters.Keys - $knownParameters = 'SqlInstance', 'Credential', 'Force', 'EnableException' - It "Should contian our specifc parameters" { - ((Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','Credential','Force','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Disable-DbaFilestream.Tests.ps1 b/tests/Disable-DbaFilestream.Tests.ps1 index 31f2e133f8..b5749bb45c 100644 --- a/tests/Disable-DbaFilestream.Tests.ps1 +++ b/tests/Disable-DbaFilestream.Tests.ps1 @@ -5,22 +5,11 @@ Write-Host -Object "Running $PSCommandpath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - <# - The $paramCount is adjusted based on the parameters your command will have. - - The $defaultParamCount is adjusted based on what type of command you are writing the test for: - - Commands that *do not* include SupportShouldProcess, set defaultParamCount = 11 - - Commands that *do* include SupportShouldProcess, set defaultParamCount = 13 - #> - $paramCount = 5 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Disable-DbaFilestream).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Credential', 'Force', 'EnableException' - It "Should contain our specific parameters" { - ((Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Credential','Force','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Disable-DbaForceNetworkEncryption.Tests.ps1 b/tests/Disable-DbaForceNetworkEncryption.Tests.ps1 index 47f223586e..913ad53c7a 100644 --- a/tests/Disable-DbaForceNetworkEncryption.Tests.ps1 +++ b/tests/Disable-DbaForceNetworkEncryption.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 3 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Disable-DbaForceNetworkEncryption).Parameters.Keys - $knownParameters = 'SqlInstance', 'Credential', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','Credential','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Disable-DbaTraceFlag.Tests.ps1 b/tests/Disable-DbaTraceFlag.Tests.ps1 index a42a702aa8..a75b318dc8 100644 --- a/tests/Disable-DbaTraceFlag.Tests.ps1 +++ b/tests/Disable-DbaTraceFlag.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 4 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Disable-DbaTraceFlag).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'TraceFlag', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','TraceFlag','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Dismount-DbaDatabase.Tests.ps1 b/tests/Dismount-DbaDatabase.Tests.ps1 index 869de71469..fc941ffd56 100644 --- a/tests/Dismount-DbaDatabase.Tests.ps1 +++ b/tests/Dismount-DbaDatabase.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 7 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Dismount-DbaDatabase).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Database', 'InputObject', 'UpdateStatistics', 'Force', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Database','InputObject','UpdateStatistics','Force','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Enable-DbaAgHadr.Tests.ps1 b/tests/Enable-DbaAgHadr.Tests.ps1 index 1a406bfa10..d8cddb8eac 100644 --- a/tests/Enable-DbaAgHadr.Tests.ps1 +++ b/tests/Enable-DbaAgHadr.Tests.ps1 @@ -4,19 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag "UnitTests" { Context "Validate parameters" { - $paramCount = 4 - <# - Get commands, Default count = 11 - Commands with SupportShouldProcess = 13 - #> - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Enable-DbaAgHadr).Parameters.Keys - $knownParameters = 'SqlInstance', 'Credential', 'Force', 'EnableException' - it "Should contian our specifc parameters" { - ((Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','Credential','Force','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Enable-DbaFilestream.Tests.ps1 b/tests/Enable-DbaFilestream.Tests.ps1 index d5a516503c..f9833da117 100644 --- a/tests/Enable-DbaFilestream.Tests.ps1 +++ b/tests/Enable-DbaFilestream.Tests.ps1 @@ -5,22 +5,11 @@ Write-Host -Object "Running $PSCommandpath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - <# - The $paramCount is adjusted based on the parameters your command will have. - - The $defaultParamCount is adjusted based on what type of command you are writing the test for: - - Commands that *do not* include SupportShouldProcess, set defaultParamCount = 11 - - Commands that *do* include SupportShouldProcess, set defaultParamCount = 13 - #> - $paramCount = 7 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Enable-DbaFilestream).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Credential', 'FileStreamLevel', 'ShareName', 'Force', 'EnableException' - It "Should contain our specific parameters" { - ((Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Credential','FileStreamLevel','ShareName','Force','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Enable-DbaForceNetworkEncryption.Tests.ps1 b/tests/Enable-DbaForceNetworkEncryption.Tests.ps1 index 5f7dbd33f4..80dbdb5a16 100644 --- a/tests/Enable-DbaForceNetworkEncryption.Tests.ps1 +++ b/tests/Enable-DbaForceNetworkEncryption.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 3 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Enable-DbaForceNetworkEncryption).Parameters.Keys - $knownParameters = 'SqlInstance', 'Credential', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','Credential','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Enable-DbaTraceFlag.Tests.ps1 b/tests/Enable-DbaTraceFlag.Tests.ps1 index e2699c937a..57466aa8fe 100644 --- a/tests/Enable-DbaTraceFlag.Tests.ps1 +++ b/tests/Enable-DbaTraceFlag.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 4 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Enable-DbaTraceFlag).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'TraceFlag', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','TraceFlag','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Expand-DbaDbLogFile.Tests.ps1 b/tests/Expand-DbaDbLogFile.Tests.ps1 index a62a8a5f0e..1ee4f895e1 100644 --- a/tests/Expand-DbaDbLogFile.Tests.ps1 +++ b/tests/Expand-DbaDbLogFile.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 12 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Expand-DbaDbLogFile).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Database', 'ExcludeDatabase', 'TargetLogSize', 'IncrementSize', 'LogFileId', 'ShrinkLogFile', 'ShrinkSize', 'BackupDirectory', 'ExcludeDiskSpaceValidation', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Database','ExcludeDatabase','TargetLogSize','IncrementSize','LogFileId','ShrinkLogFile','ShrinkSize','BackupDirectory','ExcludeDiskSpaceValidation','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Export-DbaAvailabilityGroup.Tests.ps1 b/tests/Export-DbaAvailabilityGroup.Tests.ps1 index e14f805cf6..a2ba81347b 100644 --- a/tests/Export-DbaAvailabilityGroup.Tests.ps1 +++ b/tests/Export-DbaAvailabilityGroup.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 7 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Export-DbaAvailabilityGroup).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'AvailabilityGroup', 'ExcludeAvailabilityGroup', 'Path', 'NoClobber', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','AvailabilityGroup','ExcludeAvailabilityGroup','Path','NoClobber','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Export-DbaCmsRegServer.Tests.ps1 b/tests/Export-DbaCmsRegServer.Tests.ps1 index fc34bc0f90..fbec9cb643 100644 --- a/tests/Export-DbaCmsRegServer.Tests.ps1 +++ b/tests/Export-DbaCmsRegServer.Tests.ps1 @@ -4,23 +4,11 @@ Write-Host -Object "Running $PSCommandpath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tags "UnitTests" { Context "Validate parameters" { - $knownParameters = 'SqlInstance', 'SqlCredential', 'InputObject', 'Path', 'CredentialPersistenceType', 'EnableException' - $SupportShouldProcess = $false - $paramCount = $knownParameters.Count - if ($SupportShouldProcess) { - $defaultParamCount = 13 - } else { - $defaultParamCount = 11 - } - $command = Get-Command -Name $CommandName - [object[]]$params = $command.Parameters.Keys - - It "Should contain our specific parameters" { - ((Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count) | Should Be $paramCount - } - - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','InputObject','Path','CredentialPersistenceType','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Export-DbaCredential.Tests.ps1 b/tests/Export-DbaCredential.Tests.ps1 index 09d1d7452d..164df5fc86 100644 --- a/tests/Export-DbaCredential.Tests.ps1 +++ b/tests/Export-DbaCredential.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 9 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Export-DbaCredential).Parameters.Keys - $knownParameters = 'SqlInstance', 'Identity', 'SqlCredential', 'Credential', 'Path', 'ExcludePassword', 'Append', 'InputObject', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','Identity','SqlCredential','Credential','Path','ExcludePassword','Append','InputObject','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Export-DbaDacPackage.Tests.ps1 b/tests/Export-DbaDacPackage.Tests.ps1 index f700dc2c97..b1cccd6eff 100644 --- a/tests/Export-DbaDacPackage.Tests.ps1 +++ b/tests/Export-DbaDacPackage.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 12 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Export-DbaDacPackage).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Database', 'ExcludeDatabase', 'AllUserDatabases', 'Path', 'ExtendedParameters', 'ExtendedProperties', 'EnableException', 'Type', 'DacOption', 'Table' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Database','ExcludeDatabase','AllUserDatabases','Path','DacOption','ExtendedParameters','ExtendedProperties','Type','Table','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Export-DbaDiagnosticQuery.Tests.ps1 b/tests/Export-DbaDiagnosticQuery.Tests.ps1 index e1894c725e..87d9e7a494 100644 --- a/tests/Export-DbaDiagnosticQuery.Tests.ps1 +++ b/tests/Export-DbaDiagnosticQuery.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 7 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Export-DbaDiagnosticQuery).Parameters.Keys - $knownParameters = 'InputObject', 'ConvertTo', 'Path', 'Suffix', 'NoPlanExport', 'NoQueryExport', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'InputObject','ConvertTo','Path','Suffix','NoPlanExport','NoQueryExport','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Export-DbaExecutionPlan.Tests.ps1 b/tests/Export-DbaExecutionPlan.Tests.ps1 index 41e44a14f7..cf08b2dd87 100644 --- a/tests/Export-DbaExecutionPlan.Tests.ps1 +++ b/tests/Export-DbaExecutionPlan.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 9 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Export-DbaExecutionPlan).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Database', 'ExcludeDatabase', 'Path', 'SinceCreation', 'SinceLastExecution', 'PipedObject', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Database','ExcludeDatabase','Path','SinceCreation','SinceLastExecution','PipedObject','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Export-DbaInstance.Tests.ps1 b/tests/Export-DbaInstance.Tests.ps1 index a50cfcfe14..d8d470c7ae 100644 --- a/tests/Export-DbaInstance.Tests.ps1 +++ b/tests/Export-DbaInstance.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 10 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Export-DbaInstance).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Credential', 'Path', 'NoRecovery', 'IncludeDbMasterKey', 'Exclude', 'BatchSeparator', 'ScriptingOption', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Credential','Path','NoRecovery','IncludeDbMasterKey','Exclude','BatchSeparator','ScriptingOption','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Export-DbaLinkedServer.Tests.ps1 b/tests/Export-DbaLinkedServer.Tests.ps1 index 51ceb9d7df..48f93fabc7 100644 --- a/tests/Export-DbaLinkedServer.Tests.ps1 +++ b/tests/Export-DbaLinkedServer.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 9 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Export-DbaLinkedServer).Parameters.Keys - $knownParameters = 'SqlInstance', 'LinkedServer', 'SqlCredential', 'Credential', 'Path', 'ExcludePassword', 'Append', 'InputObject', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','LinkedServer','SqlCredential','Credential','Path','ExcludePassword','Append','InputObject','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Export-DbaLogin.Tests.ps1 b/tests/Export-DbaLogin.Tests.ps1 index 3fb3f65712..38b1957141 100644 --- a/tests/Export-DbaLogin.Tests.ps1 +++ b/tests/Export-DbaLogin.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 13 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Export-DbaLogin).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Login', 'ExcludeLogin', 'Database', 'Path', 'NoClobber', 'Append', 'ExcludeDatabases', 'ExcludeJobs', 'EnableException', 'ExcludeGoBatchSeparator', 'DestinationVersion' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Login','ExcludeLogin','Database','Path','NoClobber','Append','ExcludeDatabases','ExcludeJobs','EnableException','ExcludeGoBatchSeparator','DestinationVersion' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Export-DbaPfDataCollectorSetTemplate.Tests.ps1 b/tests/Export-DbaPfDataCollectorSetTemplate.Tests.ps1 index 944768492f..b1ead8dc40 100644 --- a/tests/Export-DbaPfDataCollectorSetTemplate.Tests.ps1 +++ b/tests/Export-DbaPfDataCollectorSetTemplate.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 6 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Export-DbaPfDataCollectorSetTemplate).Parameters.Keys - $knownParameters = 'ComputerName', 'Credential', 'CollectorSet', 'Path', 'InputObject', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'ComputerName','Credential','CollectorSet','Path','InputObject','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Export-DbaRepServerSetting.Tests.ps1 b/tests/Export-DbaRepServerSetting.Tests.ps1 index 13dca33d07..0e8e37f5a7 100644 --- a/tests/Export-DbaRepServerSetting.Tests.ps1 +++ b/tests/Export-DbaRepServerSetting.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 10 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Export-DbaRepServerSetting).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Path', 'ScriptOption', 'InputObject', 'Encoding', 'Passthru', 'NoClobber', 'Append', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Path','ScriptOption','InputObject','Encoding','Passthru','NoClobber','Append','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Export-DbaScript.Tests.ps1 b/tests/Export-DbaScript.Tests.ps1 index 8de587df6b..441ac8183c 100644 --- a/tests/Export-DbaScript.Tests.ps1 +++ b/tests/Export-DbaScript.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 10 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Export-DbaScript).Parameters.Keys - $knownParameters = 'InputObject', 'ScriptingOptionsObject', 'Path', 'Encoding', 'BatchSeparator', 'NoPrefix', 'Passthru', 'NoClobber', 'Append', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'InputObject','ScriptingOptionsObject','Path','Encoding','BatchSeparator','NoPrefix','Passthru','NoClobber','Append','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Export-DbaSpConfigure.Tests.ps1 b/tests/Export-DbaSpConfigure.Tests.ps1 index 44df8019fd..36cedf85a8 100644 --- a/tests/Export-DbaSpConfigure.Tests.ps1 +++ b/tests/Export-DbaSpConfigure.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 4 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Export-DbaSpConfigure).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Path', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Path','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Export-DbaUser.Tests.ps1 b/tests/Export-DbaUser.Tests.ps1 index 839fb7912b..02ae311e52 100644 --- a/tests/Export-DbaUser.Tests.ps1 +++ b/tests/Export-DbaUser.Tests.ps1 @@ -5,15 +5,11 @@ $outputFile = "$env:temp\dbatoolsci_user.sql" Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 12 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Export-DbaUser).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Database', 'ExcludeDatabase', 'User', 'DestinationVersion', 'Path', 'NoClobber', 'Append', 'EnableException', 'ScriptingOptionsObject', 'ExcludeGoBatchSeparator' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Database','ExcludeDatabase','User','DestinationVersion','Path','NoClobber','Append','EnableException','ScriptingOptionsObject','ExcludeGoBatchSeparator' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Export-DbaXECsv.Tests.ps1 b/tests/Export-DbaXECsv.Tests.ps1 index c3a258c224..f234a75605 100644 --- a/tests/Export-DbaXECsv.Tests.ps1 +++ b/tests/Export-DbaXECsv.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 3 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Export-DbaXECsv).Parameters.Keys - $knownParameters = 'InputObject', 'Path', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'InputObject','Path','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Export-DbaXESessionTemplate.Tests.ps1 b/tests/Export-DbaXESessionTemplate.Tests.ps1 index 9100cfc6e4..7b78e6364d 100644 --- a/tests/Export-DbaXESessionTemplate.Tests.ps1 +++ b/tests/Export-DbaXESessionTemplate.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 6 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Export-DbaXESessionTemplate).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Session', 'Path', 'InputObject', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Session','Path','InputObject','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Export-DbatoolsConfig.Tests.ps1 b/tests/Export-DbatoolsConfig.Tests.ps1 new file mode 100644 index 0000000000..ce8056cb4e --- /dev/null +++ b/tests/Export-DbatoolsConfig.Tests.ps1 @@ -0,0 +1,19 @@ +$CommandName = $MyInvocation.MyCommand.Name.Replace(".Tests.ps1", "") +Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan +. "$PSScriptRoot\constants.ps1" + +Describe "$CommandName Unit Tests" -Tag 'UnitTests' { + Context "Validate parameters" { + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'FullName', 'Module', 'Name', 'Config', 'ModuleName', 'ModuleVersion', 'Scope', 'OutPath', 'SkipUnchanged', 'EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 + } + } +} +<# + Integration test are custom to the command you are writing for. + Read https://github.com/sqlcollaborative/dbatools/blob/development/contributing.md#tests + for more guidence +#> \ No newline at end of file diff --git a/tests/Find-DbaAgentJob.Tests.ps1 b/tests/Find-DbaAgentJob.Tests.ps1 index c251948288..4eb5d8927a 100644 --- a/tests/Find-DbaAgentJob.Tests.ps1 +++ b/tests/Find-DbaAgentJob.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 14 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Find-DbaAgentJob).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'JobName', 'ExcludeJobName', 'StepName', 'LastUsed', 'IsDisabled', 'IsFailed', 'IsNotScheduled', 'IsNoEmailNotification', 'Category', 'Owner', 'Since', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','JobName','ExcludeJobName','StepName','LastUsed','IsDisabled','IsFailed','IsNotScheduled','IsNoEmailNotification','Category','Owner','Since','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Find-DbaBackup.Tests.ps1 b/tests/Find-DbaBackup.Tests.ps1 index ba2e3b9008..f4d5d3f814 100644 --- a/tests/Find-DbaBackup.Tests.ps1 +++ b/tests/Find-DbaBackup.Tests.ps1 @@ -4,11 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 5 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Find-DbaBackup).Parameters.Keys - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'Path','BackupFileExtension','RetentionPeriod','CheckArchiveBit','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Find-DbaCommand.Tests.ps1 b/tests/Find-DbaCommand.Tests.ps1 index 750f57da67..f032ef6026 100644 --- a/tests/Find-DbaCommand.Tests.ps1 +++ b/tests/Find-DbaCommand.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 7 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Find-DbaCommand).Parameters.Keys - $knownParameters = 'Pattern', 'Tag', 'Author', 'MinimumVersion', 'MaximumVersion', 'Rebuild', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'Pattern','Tag','Author','MinimumVersion','MaximumVersion','Rebuild','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Find-DbaDatabase.Tests.ps1 b/tests/Find-DbaDatabase.Tests.ps1 index 48f7e1b70a..6f489ddb31 100644 --- a/tests/Find-DbaDatabase.Tests.ps1 +++ b/tests/Find-DbaDatabase.Tests.ps1 @@ -10,22 +10,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan #> Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - <# - The $paramCount is adjusted based on the parameters your command will have. - - The $defaultParamCount is adjusted based on what type of command you are writing the test for: - - Commands that *do not* include SupportShouldProcess, set defaultParamCount = 11 - - Commands that *do* include SupportShouldProcess, set defaultParamCount = 13 - #> - $paramCount = 7 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\$CommandName).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Property', 'Pattern', 'Exact', 'EnableException', 'Detailed' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Property','Pattern','Exact','Detailed','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Find-DbaDbGrowthEvent.Tests.ps1 b/tests/Find-DbaDbGrowthEvent.Tests.ps1 index 2440852534..89b9c57093 100644 --- a/tests/Find-DbaDbGrowthEvent.Tests.ps1 +++ b/tests/Find-DbaDbGrowthEvent.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 8 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Find-DbaDbGrowthEvent).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Database', 'ExcludeDatabase', 'EventType', 'FileType', 'UseLocalTime', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Database','ExcludeDatabase','EventType','FileType','UseLocalTime','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Find-DbaDbUnusedIndex.Tests.ps1 b/tests/Find-DbaDbUnusedIndex.Tests.ps1 index 2c8ed6f605..433a31e229 100644 --- a/tests/Find-DbaDbUnusedIndex.Tests.ps1 +++ b/tests/Find-DbaDbUnusedIndex.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Find-DbaDbUnusedIndex).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Database', 'ExcludeDatabase', 'IgnoreUptime', 'InputObject', 'EnableException' - $paramCount = $knownParameters.Count - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Database','ExcludeDatabase','IgnoreUptime','InputObject','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Find-DbaDisabledIndex.Tests.ps1 b/tests/Find-DbaDisabledIndex.Tests.ps1 index d1443dae2a..e4fda7c7fa 100644 --- a/tests/Find-DbaDisabledIndex.Tests.ps1 +++ b/tests/Find-DbaDisabledIndex.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 7 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Find-DbaDisabledIndex).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Database', 'ExcludeDatabase', 'NoClobber', 'Append', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Database','ExcludeDatabase','NoClobber','Append','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Find-DbaDuplicateIndex.Tests.ps1 b/tests/Find-DbaDuplicateIndex.Tests.ps1 index 6df8025dda..d5db9257f4 100644 --- a/tests/Find-DbaDuplicateIndex.Tests.ps1 +++ b/tests/Find-DbaDuplicateIndex.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 5 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Find-DbaDuplicateIndex).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Database', 'IncludeOverlapping', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Database','IncludeOverlapping','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Find-DbaInstance.Tests.ps1 b/tests/Find-DbaInstance.Tests.ps1 index b6a56057ab..129cfe443b 100644 --- a/tests/Find-DbaInstance.Tests.ps1 +++ b/tests/Find-DbaInstance.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 10 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Find-DbaInstance).Parameters.Keys - $knownParameters = 'ComputerName', 'DiscoveryType', 'Credential', 'SqlCredential', 'ScanType', 'IpAddress', 'DomainController', 'TCPPort', 'MinimumConfidence', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'ComputerName','DiscoveryType','Credential','SqlCredential','ScanType','IpAddress','DomainController','TCPPort','MinimumConfidence','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Find-DbaLoginInGroup.Tests.ps1 b/tests/Find-DbaLoginInGroup.Tests.ps1 index 8c6f627e5a..3c781e6d55 100644 --- a/tests/Find-DbaLoginInGroup.Tests.ps1 +++ b/tests/Find-DbaLoginInGroup.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 4 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Find-DbaLoginInGroup).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Login', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Login','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Find-DbaOrphanedFile.Tests.ps1 b/tests/Find-DbaOrphanedFile.Tests.ps1 index 6692a9e9fd..6a61b9bdd6 100644 --- a/tests/Find-DbaOrphanedFile.Tests.ps1 +++ b/tests/Find-DbaOrphanedFile.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 7 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Find-DbaOrphanedFile).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Path', 'FileType', 'LocalOnly', 'RemoteOnly', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Path','FileType','LocalOnly','RemoteOnly','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Find-DbaSimilarTable.Tests.ps1 b/tests/Find-DbaSimilarTable.Tests.ps1 index 238e080cd8..dd770f6a89 100644 --- a/tests/Find-DbaSimilarTable.Tests.ps1 +++ b/tests/Find-DbaSimilarTable.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 10 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Find-DbaSimilarTable).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Database', 'ExcludeDatabase', 'SchemaName', 'TableName', 'ExcludeViews', 'IncludeSystemDatabases', 'MatchPercentThreshold', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Database','ExcludeDatabase','SchemaName','TableName','ExcludeViews','IncludeSystemDatabases','MatchPercentThreshold','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Find-DbaStoredProcedure.Tests.ps1 b/tests/Find-DbaStoredProcedure.Tests.ps1 index abca884fcc..857dfad513 100644 --- a/tests/Find-DbaStoredProcedure.Tests.ps1 +++ b/tests/Find-DbaStoredProcedure.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 8 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Find-DbaStoredProcedure).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Database', 'ExcludeDatabase', 'Pattern', 'IncludeSystemObjects', 'IncludeSystemDatabases', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Database','ExcludeDatabase','Pattern','IncludeSystemObjects','IncludeSystemDatabases','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Find-DbaTrigger.Tests.ps1 b/tests/Find-DbaTrigger.Tests.ps1 index e64f24e55a..c921ce3f32 100644 --- a/tests/Find-DbaTrigger.Tests.ps1 +++ b/tests/Find-DbaTrigger.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 9 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Find-DbaTrigger).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Database', 'ExcludeDatabase', 'Pattern', 'TriggerLevel', 'IncludeSystemObjects', 'IncludeSystemDatabases', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Database','ExcludeDatabase','Pattern','TriggerLevel','IncludeSystemObjects','IncludeSystemDatabases','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Find-DbaUserObject.Tests.ps1 b/tests/Find-DbaUserObject.Tests.ps1 index 3bd5e4f0b3..e222eb6df9 100644 --- a/tests/Find-DbaUserObject.Tests.ps1 +++ b/tests/Find-DbaUserObject.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 4 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Find-DbaUserObject).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Pattern', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Pattern','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Find-DbaView.Tests.ps1 b/tests/Find-DbaView.Tests.ps1 index bb10c78875..857dfad513 100644 --- a/tests/Find-DbaView.Tests.ps1 +++ b/tests/Find-DbaView.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 8 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Find-DbaView).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Database', 'ExcludeDatabase', 'Pattern', 'IncludeSystemObjects', 'IncludeSystemDatabases', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Database','ExcludeDatabase','Pattern','IncludeSystemObjects','IncludeSystemDatabases','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Format-DbaBackupInformation.Tests.ps1 b/tests/Format-DbaBackupInformation.Tests.ps1 index 6ad605bdad..0eb7ae11f3 100644 --- a/tests/Format-DbaBackupInformation.Tests.ps1 +++ b/tests/Format-DbaBackupInformation.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 14 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Format-DbaBackupInformation).Parameters.Keys - $knownParameters = 'BackupHistory', 'ReplaceDatabaseName', 'ReplaceDbNameInFile', 'DataFileDirectory', 'LogFileDirectory', 'DestinationFileStreamDirectory', 'DatabaseNamePrefix', 'DatabaseFilePrefix', 'DatabaseFileSuffix', 'RebaseBackupFolder', 'Continue', 'FileMapping', 'PathSep', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'BackupHistory','ReplaceDatabaseName','ReplaceDbNameInFile','DataFileDirectory','LogFileDirectory','DestinationFileStreamDirectory','DatabaseNamePrefix','DatabaseFilePrefix','DatabaseFileSuffix','RebaseBackupFolder','Continue','FileMapping','PathSep','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaAgDatabase.Tests.ps1 b/tests/Get-DbaAgDatabase.Tests.ps1 index cb6d98736d..bf6d3cf26f 100644 --- a/tests/Get-DbaAgDatabase.Tests.ps1 +++ b/tests/Get-DbaAgDatabase.Tests.ps1 @@ -4,19 +4,11 @@ Write-Host -Object "Running $PSCommandpath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - <# - Get commands, Default count = 11 - Commands with SupportShouldProcess = 13 - #> - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaAgDatabase).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'AvailabilityGroup', 'Database', 'InputObject', 'EnableException' - $paramCount = $knownParameters.Count - It "Should contain our specific parameters" { - ((Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','AvailabilityGroup','Database','InputObject','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaAgHadr.Tests.ps1 b/tests/Get-DbaAgHadr.Tests.ps1 index 833dd01895..47f07f29b2 100644 --- a/tests/Get-DbaAgHadr.Tests.ps1 +++ b/tests/Get-DbaAgHadr.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag "UnitTests" { Context "Validate parameters" { - $paramCount = 3 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaAgHadr).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'EnableException' - It "Should contian our specifc parameters" { - ((Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaAgListener.Tests.ps1 b/tests/Get-DbaAgListener.Tests.ps1 index 2c2a18d60d..1e04da91c5 100644 --- a/tests/Get-DbaAgListener.Tests.ps1 +++ b/tests/Get-DbaAgListener.Tests.ps1 @@ -4,19 +4,11 @@ Write-Host -Object "Running $PSCommandpath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - <# - Get commands, Default count = 11 - Commands with SupportShouldProcess = 13 - #> - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaAgListener).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'AvailabilityGroup', 'Listener', 'InputObject', 'EnableException' - $paramCount = $knownParameters.Count - It "Should contain our specific parameters" { - ((Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','AvailabilityGroup','Listener','InputObject','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaAgReplica.Tests.ps1 b/tests/Get-DbaAgReplica.Tests.ps1 index 5bcbf34145..6b2c84c95e 100644 --- a/tests/Get-DbaAgReplica.Tests.ps1 +++ b/tests/Get-DbaAgReplica.Tests.ps1 @@ -4,19 +4,11 @@ Write-Host -Object "Running $PSCommandpath" -ForegroundColor Cyan Describe "$commandname Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - <# - Get commands, Default count = 11 - Commands with SupportShouldProcess = 13 - #> - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaAgReplica).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'AvailabilityGroup', 'Replica', 'EnableException', 'InputObject' - $paramCount = $knownParameters.Count - It "Should contain our specific parameters" { - ((Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','AvailabilityGroup','Replica','InputObject','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaAgentAlert.Tests.ps1 b/tests/Get-DbaAgentAlert.Tests.ps1 index 46d37c6f2f..d1520ff74a 100644 --- a/tests/Get-DbaAgentAlert.Tests.ps1 +++ b/tests/Get-DbaAgentAlert.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 3 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaAgentAlert).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaAgentJob.Tests.ps1 b/tests/Get-DbaAgentJob.Tests.ps1 index 0379a1b223..13a95a16fd 100644 --- a/tests/Get-DbaAgentJob.Tests.ps1 +++ b/tests/Get-DbaAgentJob.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandpath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 8 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaAgentJob).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Job', 'ExcludeJob', 'ExcludeDisabledJobs', 'EnableException', 'Database', 'Category' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Job','ExcludeJob','Database','Category','ExcludeDisabledJobs','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaAgentJobCategory.Tests.ps1 b/tests/Get-DbaAgentJobCategory.Tests.ps1 index c56a520eb0..3b2e020903 100644 --- a/tests/Get-DbaAgentJobCategory.Tests.ps1 +++ b/tests/Get-DbaAgentJobCategory.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandpath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 6 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaAgentJobCategory).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Category', 'CategoryType', 'Force', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Category','CategoryType','Force','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaAgentJobHistory.Tests.ps1 b/tests/Get-DbaAgentJobHistory.Tests.ps1 index 8cc387b097..e351f953ec 100644 --- a/tests/Get-DbaAgentJobHistory.Tests.ps1 +++ b/tests/Get-DbaAgentJobHistory.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandpath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 10 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaAgentJobHistory).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Job', 'ExcludeJob', 'StartDate', 'EndDate', 'ExcludeJobSteps', 'WithOutputFile', 'JobCollection', 'EnableException' - It "Contains our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Contains $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Job','ExcludeJob','StartDate','EndDate','ExcludeJobSteps','WithOutputFile','JobCollection','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaAgentJobOutputFile.Tests.ps1 b/tests/Get-DbaAgentJobOutputFile.Tests.ps1 index e2102d83f8..82b1cb5098 100644 --- a/tests/Get-DbaAgentJobOutputFile.Tests.ps1 +++ b/tests/Get-DbaAgentJobOutputFile.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandpath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 5 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaAgentJobOutputFile).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Job', 'ExcludeJob', 'EnableException' - It "Contains our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Contains $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Job','ExcludeJob','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaAgentJobStep.Tests.ps1 b/tests/Get-DbaAgentJobStep.Tests.ps1 index fed01b6955..da460cafb6 100644 --- a/tests/Get-DbaAgentJobStep.Tests.ps1 +++ b/tests/Get-DbaAgentJobStep.Tests.ps1 @@ -4,11 +4,11 @@ Write-Host -Object "Running $PSCommandpath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 5 - [object[]]$params = (Get-ChildItem function:\Get-DbaAgentJobStep).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Job', 'ExcludeJob', 'EnableException' - It "Contains our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Job','ExcludeJob','ExcludeDisabledJobs','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaAgentLog.Tests.ps1 b/tests/Get-DbaAgentLog.Tests.ps1 index 09a440f38b..0ff85390b7 100644 --- a/tests/Get-DbaAgentLog.Tests.ps1 +++ b/tests/Get-DbaAgentLog.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandpath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 4 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaAgentLog).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'LogNumber', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','LogNumber','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaAgentOperator.Tests.ps1 b/tests/Get-DbaAgentOperator.Tests.ps1 index 429abbccb5..906ae0b285 100644 --- a/tests/Get-DbaAgentOperator.Tests.ps1 +++ b/tests/Get-DbaAgentOperator.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 5 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaAgentOperator).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Operator', 'ExcludeOperator', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Operator','ExcludeOperator','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaAgentProxy.Tests.ps1 b/tests/Get-DbaAgentProxy.Tests.ps1 index 5828808cc4..57b4222dc3 100644 --- a/tests/Get-DbaAgentProxy.Tests.ps1 +++ b/tests/Get-DbaAgentProxy.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 4 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaAgentProxy).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Proxy', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Proxy','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaAgentSchedule.Tests.ps1 b/tests/Get-DbaAgentSchedule.Tests.ps1 index 4f3302362e..e7fe6edb68 100644 --- a/tests/Get-DbaAgentSchedule.Tests.ps1 +++ b/tests/Get-DbaAgentSchedule.Tests.ps1 @@ -4,47 +4,57 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 4 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaAgentSchedule).Parameters.Keys - $knownParameters = 'SqlInstance', 'Schedule', 'SqlCredential', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance', 'Schedule', 'SqlCredential', 'EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } Describe "$commandname Integration Tests" -Tags "IntegrationTests" { - BeforeAll{ - $schedule = New-DbaAgentSchedule -SqlInstance $script:instance2 -Schedule dbatoolsci_MonthlyTest -FrequencyType Monthly -FrequencyInterval 10 -FrequencyRecurrenceFactor 1 -Force + BeforeAll { + $null = New-DbaAgentSchedule -SqlInstance $script:instance2 -Schedule dbatoolsci_MonthlyTest -FrequencyType Monthly -FrequencyInterval 10 -FrequencyRecurrenceFactor 1 -Force + $null = New-DbaAgentSchedule -SqlInstance $script:instance2 -Schedule dbatoolsci_WeeklyTest -FrequencyType Weekly -FrequencyInterval 2 -FrequencyRecurrenceFactor 1 -StartTime 020000 -Force } - Afterall{ - $schedule = Get-DbaAgentSchedule -SqlInstance $script:instance2 -schedule dbatoolsci_MonthlyTest - $Schedule.DROP() + Afterall { + $schedules = Get-DbaAgentSchedule -SqlInstance $script:instance2 -schedule dbatoolsci_WeeklyTest, dbatoolsci_MonthlyTest + $Schedules.DROP() } Context "Gets the list of Schedules" { $results = Get-DbaAgentSchedule -SqlInstance $script:instance2 It "Results are not empty" { - $results | Should Not Be $Null + $results | Should Not BeNullOrEmpty } } - Context "Gets a single Schedule" { + + Context "Monthly schedule is correct" { $results = Get-DbaAgentSchedule -SqlInstance $script:instance2 -Schedule dbatoolsci_MonthlyTest + It "Should get one schedule" { + $results.count | Should Be 1 + } It "Results are not empty" { - $results | Should Not Be $Null + $results | Should Not BeNullOrEmpty } It "Should have the name MonthlyTest" { - $results.schedulename | Should Be "dbatoolsci_MonthlyTest" + $results.ScheduleName | Should Be "dbatoolsci_MonthlyTest" } It "Should have a frequency of 10" { $results.FrequencyInterval | Should Be 10 } It "Should be enabled" { - $results.isenabled | Should Be $true + $results.IsEnabled | Should Be $true + } + It "SqlInstance should not be null" { + $results.SqlInstance | Should Not BeNullOrEmpty + } + It "Should have correct description" { + $datetimeFormat = (Get-culture).DateTimeFormat + $startDate = Get-Date $results.ActiveStartDate -format $datetimeFormat.ShortDatePattern + $results.Description | Should Be "Occurs every month on day 10 of that month at 12:00:00 AM. Schedule will be used starting on $startDate." } } + } \ No newline at end of file diff --git a/tests/Get-DbaAgentServer.Tests.ps1 b/tests/Get-DbaAgentServer.Tests.ps1 index edc65fb219..86d298d57e 100644 --- a/tests/Get-DbaAgentServer.Tests.ps1 +++ b/tests/Get-DbaAgentServer.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandpath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 3 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaAgentServer).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaAvailabilityGroup.Tests.ps1 b/tests/Get-DbaAvailabilityGroup.Tests.ps1 index 7e058fa452..3754c25a23 100644 --- a/tests/Get-DbaAvailabilityGroup.Tests.ps1 +++ b/tests/Get-DbaAvailabilityGroup.Tests.ps1 @@ -4,19 +4,11 @@ Write-Host -Object "Running $PSCommandpath" -ForegroundColor Cyan Describe "$commandname Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 5 - <# - Get commands, Default count = 11 - Commands with SupportShouldProcess = 13 - #> - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaAvailabilityGroup).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'AvailabilityGroup', 'IsPrimary', 'EnableException' - it "Should contain our specific parameters" { - ((Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count) | Should Be $paramCount - } - it "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','AvailabilityGroup','IsPrimary','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaAvailableCollation.Tests.ps1 b/tests/Get-DbaAvailableCollation.Tests.ps1 index 4c312017aa..1491b5d063 100644 --- a/tests/Get-DbaAvailableCollation.Tests.ps1 +++ b/tests/Get-DbaAvailableCollation.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 3 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaAvailableCollation).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaBackupDevice.Tests.ps1 b/tests/Get-DbaBackupDevice.Tests.ps1 index 6846dad030..696c5bc3d2 100644 --- a/tests/Get-DbaBackupDevice.Tests.ps1 +++ b/tests/Get-DbaBackupDevice.Tests.ps1 @@ -4,26 +4,22 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 3 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaBackupDevice).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } Describe "$commandname Integration Tests" -Tags "IntegrationTests" { - BeforeAll{ + BeforeAll { $server = Connect-DbaInstance -SqlInstance $script:instance2 $sql = "EXEC sp_addumpdevice 'tape', 'dbatoolsci_tape', '\\.\tape0';" $server.Query($sql) } - Afterall{ + Afterall { $server = Connect-DbaInstance -SqlInstance $script:instance2 $sql = "EXEC sp_dropdevice 'dbatoolsci_tape';" $server.Query($sql) diff --git a/tests/Get-DbaBackupHistory.Tests.ps1 b/tests/Get-DbaBackupHistory.Tests.ps1 index 922df8d174..9eaa5b2417 100644 --- a/tests/Get-DbaBackupHistory.Tests.ps1 +++ b/tests/Get-DbaBackupHistory.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 17 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaBackupHistory).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Database', 'ExcludeDatabase', 'IncludeCopyOnly', 'Force', 'Since', 'Last', 'LastFull', 'LastDiff', 'LastLog', 'DeviceType', 'Raw', 'LastLsn', 'Type', 'EnableException', 'RecoveryFork' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Database','ExcludeDatabase','IncludeCopyOnly','Force','Since','RecoveryFork','Last','LastFull','LastDiff','LastLog','DeviceType','Raw','LastLsn','Type','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } @@ -63,6 +59,21 @@ Describe "$CommandName Integration Tests" -Tag "IntegrationTests" { } } + Context "ExcludeDatabase is honored" { + $results = Get-DbaBackupHistory -SqlInstance $script:instance1 -ExcludeDatabase 'master' + It "Should not report about excluded database master" { + ($results | Where-Object Database -match "master").Count | Should Be 0 + } + $results = Get-DbaBackupHistory -SqlInstance $script:instance1 -ExcludeDatabase 'master' -Type Full + It "Should not report about excluded database master" { + ($results | Where-Object Database -match "master").Count | Should Be 0 + } + $results = Get-DbaBackupHistory -SqlInstance $script:instance1 -ExcludeDatabase 'master' -LastFull + It "Should not report about excluded database master" { + ($results | Where-Object Database -match "master").Count | Should Be 0 + } + } + Context "LastFull should work with multiple databases" { $results = Get-DbaBackupHistory -SqlInstance $script:instance1 -Database $dbname, master -lastfull It "Should return 2 records" { diff --git a/tests/Get-DbaBackupInformation.Tests.ps1 b/tests/Get-DbaBackupInformation.Tests.ps1 index 3313ea1908..8e2e6de667 100644 --- a/tests/Get-DbaBackupInformation.Tests.ps1 +++ b/tests/Get-DbaBackupInformation.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 16 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaBackupInformation).Parameters.Keys - $knownParameters = 'Path', 'SqlInstance', 'SqlCredential', 'DatabaseName', 'SourceInstance', 'NoXpDirTree', 'DirectoryRecurse', 'EnableException', 'MaintenanceSolution', 'IgnoreLogBackup', 'ExportPath', 'AzureCredential', 'Import', 'Anonymise', 'NoClobber', 'PassThru' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'Path','SqlInstance','SqlCredential','DatabaseName','SourceInstance','NoXpDirTree','DirectoryRecurse','EnableException','MaintenanceSolution','IgnoreLogBackup','ExportPath','AzureCredential','Import','Anonymise','NoClobber','PassThru' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaBuildReference.Tests.ps1 b/tests/Get-DbaBuildReference.Tests.ps1 index 805136f30f..3e09ed4d5e 100644 --- a/tests/Get-DbaBuildReference.Tests.ps1 +++ b/tests/Get-DbaBuildReference.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 9 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaBuildReference).Parameters.Keys - $knownParameters = 'Build', 'SqlInstance', 'SqlCredential', 'Update', 'EnableException','KB','MajorVersion','ServicePack','CumulativeUpdate' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'Build','Kb','MajorVersion','ServicePack','CumulativeUpdate','SqlInstance','SqlCredential','Update','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaClientAlias.Tests.ps1 b/tests/Get-DbaClientAlias.Tests.ps1 index 1d2fcde39b..9b201a40de 100644 --- a/tests/Get-DbaClientAlias.Tests.ps1 +++ b/tests/Get-DbaClientAlias.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 3 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaClientAlias).Parameters.Keys - $knownParameters = 'ComputerName', 'Credential', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'ComputerName','Credential','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaClientProtocol.Tests.ps1 b/tests/Get-DbaClientProtocol.Tests.ps1 index 902e2e55e0..8deb241256 100644 --- a/tests/Get-DbaClientProtocol.Tests.ps1 +++ b/tests/Get-DbaClientProtocol.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 3 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaClientProtocol).Parameters.Keys - $knownParameters = 'ComputerName', 'Credential', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'ComputerName','Credential','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaClusterAvailableDisk.Tests.ps1 b/tests/Get-DbaClusterAvailableDisk.Tests.ps1 deleted file mode 100644 index da493e5b98..0000000000 --- a/tests/Get-DbaClusterAvailableDisk.Tests.ps1 +++ /dev/null @@ -1,27 +0,0 @@ -$CommandName = $MyInvocation.MyCommand.Name.Replace(".Tests.ps1", "") -Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan -. "$PSScriptRoot\constants.ps1" - -Describe "$CommandName Unit Tests" -Tag 'UnitTests' { - Context "Validate parameters" { - <# - The $paramCount is adjusted based on the parameters your command will have. - - The $defaultParamCount is adjusted based on what type of command you are writing the test for: - - Commands that *do not* include SupportShouldProcess, set defaultParamCount = 11 - - Commands that *do* include SupportShouldProcess, set defaultParamCount = 13 - #> - $defaultParamCount = 11 - - $knownParameters = 'ComputerName', 'Credential', 'EnableException' - $paramCount = $knownParameters.Count - - [object[]]$params = (Get-ChildItem function:\Get-DbaWsfcAvailableDisk).Parameters.Keys - It "Should contain our specific parameters" { - ((Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount - } - } -} \ No newline at end of file diff --git a/tests/Get-DbaCmConnection.Tests.ps1 b/tests/Get-DbaCmConnection.Tests.ps1 index fccd9c339f..6dbebed4ae 100644 --- a/tests/Get-DbaCmConnection.Tests.ps1 +++ b/tests/Get-DbaCmConnection.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 3 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaCmConnection).Parameters.Keys - $knownParameters = 'ComputerName', 'UserName', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'ComputerName','UserName','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaCmObject.Tests.ps1 b/tests/Get-DbaCmObject.Tests.ps1 index 8174c0c9e7..9e705a6a73 100644 --- a/tests/Get-DbaCmObject.Tests.ps1 +++ b/tests/Get-DbaCmObject.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 9 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaCmObject).Parameters.Keys - $knownParameters = 'ClassName', 'Query', 'ComputerName', 'Credential', 'Namespace', 'DoNotUse', 'Force', 'SilentlyContinue', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'ClassName','Query','ComputerName','Credential','Namespace','DoNotUse','Force','SilentlyContinue','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaCmsRegServer.Tests.ps1 b/tests/Get-DbaCmsRegServer.Tests.ps1 index 002ed83c30..06445fcc02 100644 --- a/tests/Get-DbaCmsRegServer.Tests.ps1 +++ b/tests/Get-DbaCmsRegServer.Tests.ps1 @@ -4,23 +4,11 @@ Write-Host -Object "Running $PSCommandpath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tags "UnitTests" { Context "Validate parameters" { - $knownParameters = 'SqlInstance', 'SqlCredential', 'Name', 'ServerName', 'Group', 'ExcludeGroup', 'Id', 'IncludeSelf', 'ExcludeCmsServer', 'ResolveNetworkName', 'EnableException' - $SupportShouldProcess = $false - $paramCount = $knownParameters.Count - if ($SupportShouldProcess) { - $defaultParamCount = 13 - } else { - $defaultParamCount = 11 - } - $command = Get-Command -Name $CommandName - [object[]]$params = $command.Parameters.Keys - - It "Should contain our specific parameters" { - ((Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count) | Should Be $paramCount - } - - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Name','ServerName','Group','ExcludeGroup','Id','IncludeSelf','ExcludeCmsServer','ResolveNetworkName','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaCmsRegServerGroup.Tests.ps1 b/tests/Get-DbaCmsRegServerGroup.Tests.ps1 index 7b2621c141..241ebc04f4 100644 --- a/tests/Get-DbaCmsRegServerGroup.Tests.ps1 +++ b/tests/Get-DbaCmsRegServerGroup.Tests.ps1 @@ -4,23 +4,11 @@ Write-Host -Object "Running $PSCommandpath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tags "UnitTests" { Context "Validate parameters" { - $knownParameters = 'SqlInstance', 'SqlCredential', 'Group', 'ExcludeGroup', 'Id', 'EnableException' - $SupportShouldProcess = $false - $paramCount = $knownParameters.Count - if ($SupportShouldProcess) { - $defaultParamCount = 13 - } else { - $defaultParamCount = 11 - } - $command = Get-Command -Name $CommandName - [object[]]$params = $command.Parameters.Keys - - It "Should contain our specific parameters" { - ((Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count) | Should Be $paramCount - } - - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Group','ExcludeGroup','Id','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaCmsRegServerStore.Tests.ps1 b/tests/Get-DbaCmsRegServerStore.Tests.ps1 index 5086e32a71..8ada6809d9 100644 --- a/tests/Get-DbaCmsRegServerStore.Tests.ps1 +++ b/tests/Get-DbaCmsRegServerStore.Tests.ps1 @@ -4,23 +4,11 @@ Write-Host -Object "Running $PSCommandpath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tags "UnitTests" { Context "Validate parameters" { - $knownParameters = 'SqlInstance', 'SqlCredential', 'EnableException' - $SupportShouldProcess = $false - $paramCount = $knownParameters.Count - if ($SupportShouldProcess) { - $defaultParamCount = 13 - } else { - $defaultParamCount = 11 - } - $command = Get-Command -Name $CommandName - [object[]]$params = $command.Parameters.Keys - - It "Should contain our specific parameters" { - ((Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count) | Should Be $paramCount - } - - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaComputerCertificate.Tests.ps1 b/tests/Get-DbaComputerCertificate.Tests.ps1 index 3d63ed219d..b6e7742ea1 100644 --- a/tests/Get-DbaComputerCertificate.Tests.ps1 +++ b/tests/Get-DbaComputerCertificate.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 7 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaComputerCertificate).Parameters.Keys - $knownParameters = 'ComputerName', 'Credential', 'Store', 'Folder', 'Path', 'Thumbprint', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'ComputerName','Credential','Store','Folder','Path','Thumbprint','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaComputerSystem.Tests.ps1 b/tests/Get-DbaComputerSystem.Tests.ps1 index c074f3cd09..a120f1204e 100644 --- a/tests/Get-DbaComputerSystem.Tests.ps1 +++ b/tests/Get-DbaComputerSystem.Tests.ps1 @@ -1,25 +1,20 @@ $CommandName = $MyInvocation.MyCommand.Name.Replace(".Tests.ps1", "") Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan . "$PSScriptRoot\constants.ps1" + Describe "Get-DbaComputerSystem Unit Tests" -Tag "UnitTests" { - InModuleScope dbatools { - Context "Validate parameters" { - $params = (Get-ChildItem function:\Get-DbaComputerSystem).Parameters - it "should have a parameter named ComputerName" { - $params.ContainsKey("ComputerName") | Should Be $true - } - it "should have a parameter named Credential" { - $params.ContainsKey("Credential") | Should Be $true - } - it "should have a parameter named EnableException" { - $params.ContainsKey("EnableException") | Should Be $true - } + Context "Validate parameters" { + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'ComputerName','Credential','IncludeAws','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } - Context "Validate input" { - it "Cannot resolve hostname of computer" { - mock Resolve-DbaNetworkName {$null} - {Get-DbaComputerSystem -ComputerName 'DoesNotExist142' -WarningAction Stop 3> $null} | Should Throw - } + } + Context "Validate input" { + it "Cannot resolve hostname of computer" { + mock Resolve-DbaNetworkName {$null} + {Get-DbaComputerSystem -ComputerName 'DoesNotExist142' -WarningAction Stop 3> $null} | Should Throw } } } diff --git a/tests/Get-DbaConnection.Tests.ps1 b/tests/Get-DbaConnection.Tests.ps1 index 24f23b00b5..9477e2a532 100644 --- a/tests/Get-DbaConnection.Tests.ps1 +++ b/tests/Get-DbaConnection.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 3 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaConnection).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaCpuRingBuffer.Tests.ps1 b/tests/Get-DbaCpuRingBuffer.Tests.ps1 index ae9f5e3260..41e9b30633 100644 --- a/tests/Get-DbaCpuRingBuffer.Tests.ps1 +++ b/tests/Get-DbaCpuRingBuffer.Tests.ps1 @@ -4,23 +4,11 @@ Write-Host -Object "Running $PSCommandpath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tags "UnitTests" { Context "Validate parameters" { - $knownParameters = 'SqlInstance', 'SqlCredential', 'CollectionMinutes', 'EnableException' - $paramCount = $knownParameters.Count - $SupportShouldProcess = $false - if ($SupportShouldProcess) { - $defaultParamCount = 13 - } else { - $defaultParamCount = 11 - } - $command = Get-Command -Name $CommandName - [object[]]$params = $command.Parameters.Keys - - It "Should contain our specific parameters" { - ((Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count) | Should Be $paramCount - } - - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','CollectionMinutes','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaCpuUsage.Tests.ps1 b/tests/Get-DbaCpuUsage.Tests.ps1 index ccfc0611bc..69c77d4cd5 100644 --- a/tests/Get-DbaCpuUsage.Tests.ps1 +++ b/tests/Get-DbaCpuUsage.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 5 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaCpuUsage).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Credential', 'Threshold', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Credential','Threshold','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaCredential.Tests.ps1 b/tests/Get-DbaCredential.Tests.ps1 index c14bdc7ba3..387b230605 100644 --- a/tests/Get-DbaCredential.Tests.ps1 +++ b/tests/Get-DbaCredential.Tests.ps1 @@ -6,15 +6,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 7 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaCredential).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Name', 'ExcludeName', 'Identity', 'ExcludeIdentity', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Name','ExcludeName','Identity','ExcludeIdentity','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaCustomError.Tests.ps1 b/tests/Get-DbaCustomError.Tests.ps1 index a1e5d24263..32b994f471 100644 --- a/tests/Get-DbaCustomError.Tests.ps1 +++ b/tests/Get-DbaCustomError.Tests.ps1 @@ -4,44 +4,22 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 3 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaCustomError).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount - } - } -} -$CommandName = $MyInvocation.MyCommand.Name.Replace(".Tests.ps1", "") -Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan -. "$PSScriptRoot\constants.ps1" - -Describe "$CommandName Unit Tests" -Tag 'UnitTests' { - Context "Validate parameters" { - $paramCount = 3 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaCustomError).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } Describe "$commandname Integration Tests" -Tags "IntegrationTests" { - BeforeAll{ + BeforeAll { $server = Connect-DbaInstance -SqlInstance $script:instance1 $sql = "EXEC msdb.dbo.sp_addmessage 54321, 9, N'Dbatools is Awesome!';" $server.Query($sql) } - Afterall{ + Afterall { $server = Connect-DbaInstance -SqlInstance $script:instance1 $sql = "EXEC msdb.dbo.sp_dropmessage 54321;" $server.Query($sql) diff --git a/tests/Get-DbaDatabase.Tests.ps1 b/tests/Get-DbaDatabase.Tests.ps1 index c377e45c38..8475c6459f 100644 --- a/tests/Get-DbaDatabase.Tests.ps1 +++ b/tests/Get-DbaDatabase.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 18 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaDatabase).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Database', 'ExcludeDatabase', 'ExcludeUser', 'ExcludeSystem', 'Owner', 'Encrypted', 'Status', 'Access', 'RecoveryModel', 'NoFullBackup', 'NoFullBackupSince', 'NoLogBackup', 'NoLogBackupSince', 'EnableException', 'IncludeLastUsed', 'OnlyAccessible' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Database','ExcludeDatabase','ExcludeUser','ExcludeSystem','Owner','Encrypted','Status','Access','RecoveryModel','NoFullBackup','NoFullBackupSince','NoLogBackup','NoLogBackupSince','EnableException','IncludeLastUsed','OnlyAccessible' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaDbAssembly.Tests.ps1 b/tests/Get-DbaDbAssembly.Tests.ps1 index 46b45e5f1f..d7a0c4d95c 100644 --- a/tests/Get-DbaDbAssembly.Tests.ps1 +++ b/tests/Get-DbaDbAssembly.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 3 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaDbAssembly).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaDbCertificate.Tests.ps1 b/tests/Get-DbaDbCertificate.Tests.ps1 index c0ac19d301..a12c689530 100644 --- a/tests/Get-DbaDbCertificate.Tests.ps1 +++ b/tests/Get-DbaDbCertificate.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 8 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaDbCertificate).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Database', 'ExcludeDatabase', 'Certificate', 'InputObject', 'Subject', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Database','ExcludeDatabase','Certificate','Subject','InputObject','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaDbCheckConstraint.Tests.ps1 b/tests/Get-DbaDbCheckConstraint.Tests.ps1 index 20f5034ab7..b83558d47b 100644 --- a/tests/Get-DbaDbCheckConstraint.Tests.ps1 +++ b/tests/Get-DbaDbCheckConstraint.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 6 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaDbCheckConstraint).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Database', 'ExcludeDatabase', 'ExcludeSystemTable', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Database','ExcludeDatabase','ExcludeSystemTable','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaDbCompatibility.Tests.ps1 b/tests/Get-DbaDbCompatibility.Tests.ps1 index 2979d605f4..b66ae02e74 100644 --- a/tests/Get-DbaDbCompatibility.Tests.ps1 +++ b/tests/Get-DbaDbCompatibility.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandpath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 5 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaDbCompatibility).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Database', 'InputObject', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Database','InputObject','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaDbCompression.Tests.ps1 b/tests/Get-DbaDbCompression.Tests.ps1 index 861bda9fbb..a5415cb3f0 100644 --- a/tests/Get-DbaDbCompression.Tests.ps1 +++ b/tests/Get-DbaDbCompression.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandpath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 5 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaDbCompression).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Database', 'ExcludeDatabase', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Database','ExcludeDatabase','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaDbDbccOpenTran.Tests.ps1 b/tests/Get-DbaDbDbccOpenTran.Tests.ps1 new file mode 100644 index 0000000000..bb8445305f --- /dev/null +++ b/tests/Get-DbaDbDbccOpenTran.Tests.ps1 @@ -0,0 +1,41 @@ +$CommandName = $MyInvocation.MyCommand.Name.Replace(".Tests.ps1", "") +Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan +. "$PSScriptRoot\constants.ps1" + +Describe "$CommandName Unit Tests" -Tag 'UnitTests' { + Context "Validate parameters" { + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Database','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 + } + } +} +Describe "$commandname Integration Test" -Tag "IntegrationTests" { + Context "Gets results for Open Transactions" { + $props = 'ComputerName', 'InstanceName', 'SqlInstance', 'Database', 'Cmd', 'Output', 'Field', 'Data' + $result = Get-DbaDbDbccOpenTran -SqlInstance $script:instance1 + + It "returns results for DBCC OPENTRAN" { + $result | Should Not Be $null + } + + It "returns multiple results" { + $result.Count -gt 0 | Should Be $true + } + + foreach ($prop in $props) { + $p = $result[0].PSObject.Properties[$prop] + It "Should return property: $prop" { + $p.Name | Should Be $prop + } + } + + $result = Get-DbaDbDbccOpenTran -SqlInstance $script:instance1 -Database tempDB + + It "returns results for a database" { + $result | Should Not Be $null + } + } +} diff --git a/tests/Get-DbaDbEncryption.Tests.ps1 b/tests/Get-DbaDbEncryption.Tests.ps1 index 69322f2cac..dd6364da41 100644 --- a/tests/Get-DbaDbEncryption.Tests.ps1 +++ b/tests/Get-DbaDbEncryption.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 6 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaDbEncryption).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Database', 'ExcludeDatabase', 'IncludeSystemDBs', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Database','ExcludeDatabase','IncludeSystemDBs','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaDbExtentDiff.Tests.ps1 b/tests/Get-DbaDbExtentDiff.Tests.ps1 index 4a15278d60..5370762095 100644 --- a/tests/Get-DbaDbExtentDiff.Tests.ps1 +++ b/tests/Get-DbaDbExtentDiff.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 5 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaDbExtentDiff).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Database', 'ExcludeDatabase', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Database','ExcludeDatabase','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaDbFeatureUsage.Tests.ps1 b/tests/Get-DbaDbFeatureUsage.Tests.ps1 index 345b8d752e..a058a98197 100644 --- a/tests/Get-DbaDbFeatureUsage.Tests.ps1 +++ b/tests/Get-DbaDbFeatureUsage.Tests.ps1 @@ -4,20 +4,48 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 6 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaDbFeatureUsage).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Database', 'ExcludeDatabase', 'InputObject', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Database','ExcludeDatabase','InputObject','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } -<# - Integration test should appear below and are custom to the command you are writing. - Read https://github.com/sqlcollaborative/dbatools/blob/development/contributing.md#tests - for more guidence. -#> \ No newline at end of file + +Describe "$commandname Integration Tests" -Tags "IntegrationTests" { + BeforeAll { + $dbname = "dbatoolsci_test_$(get-random)" + $server = Connect-DbaInstance -SqlInstance $script:instance2 + $server.Query("Create Database [$dbname]") + $server.Query("Create Table [$dbname].dbo.TestCompression + (Column1 nvarchar(10), + Column2 int PRIMARY KEY, + Column3 nvarchar(18));") + $server.Query("ALTER TABLE [$dbname].dbo.TestCompression REBUILD PARTITION = ALL WITH (DATA_COMPRESSION = ROW);") + } + AfterAll { + $server.Query("DROP Database [$dbname]") + } + Context "Gets Feature Usage" { + $results = Get-DbaDbFeatureUsage -SqlInstance $script:instance2 + It "Gets results" { + $results | Should Not Be $null + } + } + Context "Gets Feature Usage using -Database" { + $results = Get-DbaDbFeatureUsage -SqlInstance $script:instance2 -Database $dbname + It "Gets results" { + $results | Should Not Be $null + } + It "Has the Feature Compression" { + $results.Feature | Should Be "Compression" + } + } + Context "Gets Feature Usage using -ExcludeDatabase" { + $results = Get-DbaDbFeatureUsage -SqlInstance $script:instance2 -ExcludeDatabase $dbname + It "Gets results" { + $results.database | Should Not Contain $dbname + } + } +} \ No newline at end of file diff --git a/tests/Get-DbaDbFile.Tests.ps1 b/tests/Get-DbaDbFile.Tests.ps1 index 176ffe6068..442ba45a5c 100644 --- a/tests/Get-DbaDbFile.Tests.ps1 +++ b/tests/Get-DbaDbFile.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 6 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaDbFile).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Database', 'ExcludeDatabase', 'InputObject', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Database','ExcludeDatabase','InputObject','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaDbForeignKey.Tests.ps1 b/tests/Get-DbaDbForeignKey.Tests.ps1 index 25f8f5c12d..58eba571fe 100644 --- a/tests/Get-DbaDbForeignKey.Tests.ps1 +++ b/tests/Get-DbaDbForeignKey.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 6 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaDbForeignKey).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Database', 'ExcludeDatabase', 'ExcludeSystemTable', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Database','ExcludeDatabase','ExcludeSystemTable','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaDbIdentity.Tests.ps1 b/tests/Get-DbaDbIdentity.Tests.ps1 new file mode 100644 index 0000000000..c7aa60fcd0 --- /dev/null +++ b/tests/Get-DbaDbIdentity.Tests.ps1 @@ -0,0 +1,53 @@ +$CommandName = $MyInvocation.MyCommand.Name.Replace(".Tests.ps1", "") +Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan +. "$PSScriptRoot\constants.ps1" + +Describe "$CommandName Unit Tests" -Tag 'UnitTests' { + Context "Validate parameters" { + [object[]]$params = (Get-Command -Name $CommandName).Parameters.Keys + $knownParameters = 'SqlInstance', 'SqlCredential', 'Database', 'Table', 'EnableException' + + It "Should contain our specific parameters" { + ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $knownParameters.Count + } + } +} +Describe "$commandname Integration Test" -Tag "IntegrationTests" { + BeforeAll { + $db = Get-DbaDatabase -SqlInstance $script:instance1 -Database tempdb + $null = $db.Query("CREATE TABLE dbo.dbatoolsci_example (Id int NOT NULL IDENTITY (125, 1), Value varchar(5)); + INSERT INTO dbo.dbatoolsci_example(Value) Select 1; + CREATE TABLE dbo.dbatoolsci_example2 (Id int NOT NULL IDENTITY (5, 1), Value varchar(5)); + INSERT INTO dbo.dbatoolsci_example2(Value) Select 1;") + } + AfterAll { + try { + $null = $db.Query("DROP TABLE dbo.dbatoolsci_example; + DROP TABLE dbo.dbatoolsci_example2") + } catch { + $null = 1 + } + } + + Context "Validate standard output " { + $props = 'ComputerName', 'InstanceName', 'SqlInstance', 'Database', 'Table', 'Cmd', 'IdentityValue', 'ColumnValue', 'Output' + $result = Get-DbaDbIdentity -SqlInstance $script:instance1 -Database tempdb -Table 'dbo.dbatoolsci_example', 'dbo.dbatoolsci_example2' + + foreach ($prop in $props) { + $p = $result[0].PSObject.Properties[$prop] + It "Should return property: $prop" { + $p.Name | Should Be $prop + } + } + + It "returns results for each table" { + $result.Count -eq 2 | Should Be $true + } + + It "returns correct results" { + $result[0].IdentityValue -eq 125 | Should Be $true + } + } +} + + diff --git a/tests/Get-DbaDbLogShipError.Tests.ps1 b/tests/Get-DbaDbLogShipError.Tests.ps1 index 50c7e2cbfe..fb043a8776 100644 --- a/tests/Get-DbaDbLogShipError.Tests.ps1 +++ b/tests/Get-DbaDbLogShipError.Tests.ps1 @@ -4,16 +4,16 @@ Write-Host -Object "Running $PSCommandpath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 5 - [object[]]$params = (Get-ChildItem function:\Get-DbaAgentJobStep).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Job', 'ExcludeJob', 'EnableException' - It "Contains our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Database','ExcludeDatabase','Action','DateTimeFrom','DateTimeTo','Primary','Secondary','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } -Describe "$CommandName Unittests" -Tag 'UnitTests' { +Describe "$CommandName Integration Tests" -Tag "IntegrationTests" { Context "Return values" { It "Get the log shipping errors" { $Results = @() diff --git a/tests/Get-DbaDbMail.Tests.ps1 b/tests/Get-DbaDbMail.Tests.ps1 index 69e16b01d3..c5b69228ef 100644 --- a/tests/Get-DbaDbMail.Tests.ps1 +++ b/tests/Get-DbaDbMail.Tests.ps1 @@ -4,32 +4,28 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 3 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaDbMail).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } Describe "$commandname Integration Tests" -Tags "IntegrationTests" { - BeforeAll{ + BeforeAll { $server = Connect-DbaInstance -SqlInstance $script:instance2 $mailSettings = @{ - AccountRetryAttempts='1' - AccountRetryDelay='60' - DatabaseMailExeMinimumLifeTime='600' - DefaultAttachmentEncoding ='MIME' - LoggingLevel='2' - MaxFileSize='1000' - ProhibitedExtensions = 'exe,dll,vbs,js' + AccountRetryAttempts = '1' + AccountRetryDelay = '60' + DatabaseMailExeMinimumLifeTime = '600' + DefaultAttachmentEncoding = 'MIME' + LoggingLevel = '2' + MaxFileSize = '1000' + ProhibitedExtensions = 'exe,dll,vbs,js' } - foreach($m in $mailSettings.GetEnumerator()){ + foreach ($m in $mailSettings.GetEnumerator()) { $server.query("exec msdb.dbo.sysmail_configure_sp '$($m.key)','$($m.value)';") } } diff --git a/tests/Get-DbaDbMailAccount.Tests.ps1 b/tests/Get-DbaDbMailAccount.Tests.ps1 index f86a9d0272..d7c65bea01 100644 --- a/tests/Get-DbaDbMailAccount.Tests.ps1 +++ b/tests/Get-DbaDbMailAccount.Tests.ps1 @@ -4,21 +4,17 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 6 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaDbMailAccount).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Account', 'ExcludeAccount', 'InputObject', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Account','ExcludeAccount','InputObject','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } Describe "$commandname Integration Tests" -Tags "IntegrationTests" { - BeforeAll{ + BeforeAll { $accountname = "dbatoolsci_test_$(get-random)" $server = Connect-DbaInstance -SqlInstance $script:instance2 $mailAccountSettings = "EXEC msdb.dbo.sysmail_add_account_sp @@ -30,7 +26,7 @@ Describe "$commandname Integration Tests" -Tags "IntegrationTests" { @replyto_address='no-reply@dbatools.io';" $server.query($mailAccountSettings) } - AfterAll{ + AfterAll { $server = Connect-DbaInstance -SqlInstance $script:instance2 $mailAccountSettings = "EXEC msdb.dbo.sysmail_delete_account_sp @account_name = '$accountname';" diff --git a/tests/Get-DbaDbMailConfig.Tests.ps1 b/tests/Get-DbaDbMailConfig.Tests.ps1 index e63e447548..979441cc8c 100644 --- a/tests/Get-DbaDbMailConfig.Tests.ps1 +++ b/tests/Get-DbaDbMailConfig.Tests.ps1 @@ -4,32 +4,28 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 5 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaDbMailConfig).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Name', 'InputObject', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Name','InputObject','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } Describe "$commandname Integration Tests" -Tags "IntegrationTests" { - BeforeAll{ + BeforeAll { $server = Connect-DbaInstance -SqlInstance $script:instance2 $mailSettings = @{ - AccountRetryAttempts='1' - AccountRetryDelay='60' - DatabaseMailExeMinimumLifeTime='600' - DefaultAttachmentEncoding ='MIME' - LoggingLevel='2' - MaxFileSize='1000' - ProhibitedExtensions = 'exe,dll,vbs,js' - } - foreach($m in $mailSettings.GetEnumerator()){ + AccountRetryAttempts = '1' + AccountRetryDelay = '60' + DatabaseMailExeMinimumLifeTime = '600' + DefaultAttachmentEncoding = 'MIME' + LoggingLevel = '2' + MaxFileSize = '1000' + ProhibitedExtensions = 'exe,dll,vbs,js' + } + foreach ($m in $mailSettings.GetEnumerator()) { $server.query("exec msdb.dbo.sysmail_configure_sp '$($m.key)','$($m.value)';") } } diff --git a/tests/Get-DbaDbMailHistory.Tests.ps1 b/tests/Get-DbaDbMailHistory.Tests.ps1 index 541d6c2b07..b344cc59f7 100644 --- a/tests/Get-DbaDbMailHistory.Tests.ps1 +++ b/tests/Get-DbaDbMailHistory.Tests.ps1 @@ -4,20 +4,104 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 5 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaDbMailHistory).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Since', 'Status', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Since','Status','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } -<# - Integration test should appear below and are custom to the command you are writing. - Read https://github.com/sqlcollaborative/dbatools/blob/development/contributing.md#tests - for more guidence. -#> \ No newline at end of file + +Describe "$commandname Integration Tests" -Tags "IntegrationTests" { + BeforeAll { + $server = Connect-DbaInstance -SqlInstance $script:instance2 + $server.Query("INSERT INTO msdb.[dbo].[sysmail_profile] + ([name] + ,[description] + ,[last_mod_datetime] + ,[last_mod_user]) + VALUES + ('DbaToolsMail','Used to send Database Alerts and Notifications' + ,'2018-12-9 08:00:32.700' + ,'sa')") + $profile_id = $($server.Query("SELECT profile_id FROM msdb.[dbo].[sysmail_profile] WHERE name = 'DbaToolsMail'")).profile_id + $server.Query("INSERT INTO msdb.[dbo].[sysmail_mailitems] + ([profile_id] + ,[recipients] + ,[copy_recipients] + ,[blind_copy_recipients] + ,[subject] + ,[from_address] + ,[reply_to] + ,[body] + ,[body_format] + ,[importance] + ,[sensitivity] + ,[file_attachments] + ,[attachment_encoding] + ,[query] + ,[execute_query_database] + ,[attach_query_result_as_file] + ,[query_result_header] + ,[query_result_width] + ,[query_result_separator] + ,[exclude_query_output] + ,[append_query_error] + ,[send_request_date] + ,[send_request_user] + ,[sent_account_id] + ,[sent_status] + ,[sent_date] + ,[last_mod_date] + ,[last_mod_user]) + VALUES + ($profile_id,'dbatoolssci@dbatools.io',NULL,NULL,'Test Job',NULL,NULL,'A Test Job failed to run','TEXT','Normal','Normal',NULL,'MIME',NULL,NULL, + 0,1,256,'',0,0,'2018-12-9 11:44:32.600','dbatools\dbatoolssci',1,1,'2018-12-9 11:44:33.000','2018-12-9 11:44:33.273','sa')" + ) + } + AfterAll { + $server.Query("DELETE FROM msdb.dbo.sysmail_profile WHERE profile_id = '$profile_id'") + $server.Query("DELETE FROM msdb.dbo.sysmail_mailitems WHERE profile_id = '$profile_id'") + } + + Context "Gets Db Mail History" { + $results = Get-DbaDbMailHistory -SqlInstance $script:instance2 | Where-Object {$_.Subject -eq 'Test Job'} + It "Gets results" { + $results | Should Not Be $null + } + It "Should have created subject" { + $results.subject | Should be 'Test Job' + } + It "Should have recipient of dbatoolssci@dbatools.io" { + $results.recipients | Should be 'dbatoolssci@dbatools.io' + } + } + Context "Gets Db Mail History using -Status" { + $results = Get-DbaDbMailHistory -SqlInstance $script:instance2 -Status Sent + It "Gets results" { + $results | Should Not Be $null + } + It "Should have a Normal Importance" { + $results.Importance | Should be 'Normal' + } + It "Should have a Normal Sensitivity" { + $results.sensitivity | Should be 'Normal' + } + It "Should have SentStatus of Sent" { + $results.SentStatus | Should be 'Sent' + } + } + Context "Gets Db Mail History using -Since" { + $results = Get-DbaDbMailHistory -SqlInstance $script:instance2 -Since '2018-01-01' + It "Gets results" { + $results | Should Not Be $null + } + It "Should have a SentDate greater than 2018-01-01" { + $results.SentDate | Should Begreaterthan '2018-01-01' + } + It "Should have a SendRequestDate greater than 2018-01-01" { + $results.SendRequestDate | Should Begreaterthan '2018-01-01' + } + } +} \ No newline at end of file diff --git a/tests/Get-DbaDbMailLog.Tests.ps1 b/tests/Get-DbaDbMailLog.Tests.ps1 index 4f6b4f6884..6518ae234f 100644 --- a/tests/Get-DbaDbMailLog.Tests.ps1 +++ b/tests/Get-DbaDbMailLog.Tests.ps1 @@ -4,20 +4,68 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 5 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaDbMailLog).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Since', 'Type', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Since','Type','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } -<# - Integration test should appear below and are custom to the command you are writing. - Read https://github.com/sqlcollaborative/dbatools/blob/development/contributing.md#tests - for more guidence. -#> \ No newline at end of file + +Describe "$commandname Integration Tests" -Tags "IntegrationTests" { + BeforeAll { + $server = Connect-DbaInstance -SqlInstance $script:instance2 + $server.Query("INSERT INTO msdb.[dbo].[sysmail_log] + ([event_type] + ,[log_date] + ,[description] + ,[process_id] + ,[mailitem_id] + ,[account_id] + ,[last_mod_date] + ,[last_mod_user]) + VALUES + (1,'2018-12-09 12:18:14.920','DatabaseMail process is started',4890,NULL,NULL,'2018-12-09 12:18:14.920','dbatools\dbatoolssci')") + } + AfterAll { + $server.Query("DELETE FROM msdb.[dbo].[sysmail_log] WHERE last_mod_user = 'dbatools\dbatoolssci'") + } + + Context "Gets Db Mail Log" { + $results = Get-DbaDbMailLog -SqlInstance $script:instance2 | Where-Object {$_.Login -eq 'dbatools\dbatoolssci'} + It "Gets results" { + $results | Should Not Be $null + } + It "Should have created Description" { + $results.description | Should be 'DatabaseMail process is started' + } + It "Should have last modified user of dbatools\dbatoolssci " { + $results.lastmoduser | Should be 'dbatools\dbatoolssci' + } + } + Context "Gets Db Mail Log using -Type" { + $results = Get-DbaDbMailLog -SqlInstance $script:instance2 -Type Information + It "Gets results" { + $results | Should Not Be $null + } + It "Should have Log Id" { + $results.logid | Should not be $null + } + It "Should have an Event Type of Information" { + $results.eventtype | Should be 'Information' + } + } + Context "Gets Db Mail History using -Since" { + $results = Get-DbaDbMailLog -SqlInstance $script:instance2 -Since '2018-01-01' + It "Gets results" { + $results | Should Not Be $null + } + It "Should have a LogDate greater than 2018-01-01" { + $results.LogDate | Should Begreaterthan '2018-01-01' + } + It "Should have a LastModDate greater than 2018-01-01" { + $results.LastModDate | Should Begreaterthan '2018-01-01' + } + } +} \ No newline at end of file diff --git a/tests/Get-DbaDbMailProfile.Tests.ps1 b/tests/Get-DbaDbMailProfile.Tests.ps1 index fe3d2fd9fe..934ff07771 100644 --- a/tests/Get-DbaDbMailProfile.Tests.ps1 +++ b/tests/Get-DbaDbMailProfile.Tests.ps1 @@ -4,21 +4,17 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 6 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaDbMailProfile).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Profile', 'ExcludeProfile', 'InputObject', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Profile','ExcludeProfile','InputObject','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } Describe "$commandname Integration Tests" -Tags "IntegrationTests" { - BeforeAll{ + BeforeAll { $profilename = "dbatoolsci_test_$(get-random)" $server = Connect-DbaInstance -SqlInstance $script:instance2 $mailProfile = "EXEC msdb.dbo.sysmail_add_profile_sp @@ -26,7 +22,7 @@ Describe "$commandname Integration Tests" -Tags "IntegrationTests" { @description='Profile for system email';" $server.query($mailProfile) } - AfterAll{ + AfterAll { $server = Connect-DbaInstance -SqlInstance $script:instance2 $mailProfile = "EXEC msdb.dbo.sysmail_delete_profile_sp @profile_name='$profilename';" diff --git a/tests/Get-DbaDbMailServer.Tests.ps1 b/tests/Get-DbaDbMailServer.Tests.ps1 index 22d40fe89d..a4e2c0f68a 100644 --- a/tests/Get-DbaDbMailServer.Tests.ps1 +++ b/tests/Get-DbaDbMailServer.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 6 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaDbMailServer).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Server', 'Account', 'InputObject', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Server','Account','InputObject','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaDbMasterKey.Tests.ps1 b/tests/Get-DbaDbMasterKey.Tests.ps1 index de86d41384..fd4cea80e3 100644 --- a/tests/Get-DbaDbMasterKey.Tests.ps1 +++ b/tests/Get-DbaDbMasterKey.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 6 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaDbMasterKey).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Database', 'ExcludeDatabase', 'InputObject', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Database','ExcludeDatabase','InputObject','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaDbMemoryUsage.Tests.ps1 b/tests/Get-DbaDbMemoryUsage.Tests.ps1 index 38008fc0aa..6a8875e8cf 100644 --- a/tests/Get-DbaDbMemoryUsage.Tests.ps1 +++ b/tests/Get-DbaDbMemoryUsage.Tests.ps1 @@ -4,18 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tags "UnitTests" { Context "Validate parameters" { - $defaultParamCount = 11 - $command = Get-Command -Name $CommandName - [object[]]$params = $command.Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'EnableException', 'IncludeSystemDb', 'Database', 'ExcludeDatabase' - $paramCount = $knownParameters.Count - - It "Should contain our specific parameters" { - ((Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count) | Should Be $paramCount - } - - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Database','ExcludeDatabase','IncludeSystemDb','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaDbMirror.Tests.ps1 b/tests/Get-DbaDbMirror.Tests.ps1 index e6ee1f99f3..a323cc8501 100644 --- a/tests/Get-DbaDbMirror.Tests.ps1 +++ b/tests/Get-DbaDbMirror.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 3 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaDbMirror).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaDbMirrorMonitor.Tests.ps1 b/tests/Get-DbaDbMirrorMonitor.Tests.ps1 index 4e15f418ff..bb467725bd 100644 --- a/tests/Get-DbaDbMirrorMonitor.Tests.ps1 +++ b/tests/Get-DbaDbMirrorMonitor.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 7 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaDbMirrorMonitor).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Database', 'InputObject', 'Update', 'LimitResults', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Database','InputObject','Update','LimitResults','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaOrphanUser.Tests.ps1 b/tests/Get-DbaDbOrphanUser.Tests.ps1 similarity index 76% rename from tests/Get-DbaOrphanUser.Tests.ps1 rename to tests/Get-DbaDbOrphanUser.Tests.ps1 index 8da6902d8e..5eaca98a6b 100644 --- a/tests/Get-DbaOrphanUser.Tests.ps1 +++ b/tests/Get-DbaDbOrphanUser.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandpath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 5 - $commonParamCount = ([System.Management.Automation.PSCmdlet]::CommonParameters).Count - [object[]]$params = (Get-ChildItem function:\Get-DbaOrphanUser).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Database', 'ExcludeDatabase', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $commonParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Database','ExcludeDatabase','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } @@ -47,7 +43,7 @@ CREATE USER [dbatoolsci_orphan3] FROM LOGIN [dbatoolsci_orphan3]; It "shows time taken for preparation" { 1 | Should -Be 1 } - $results = Get-DbaOrphanUser -SqlInstance $script:instance1 -Database dbatoolsci_orphan + $results = Get-DbaDbOrphanUser -SqlInstance $script:instance1 -Database dbatoolsci_orphan It "Finds two orphans" { $results.Count | Should -Be 2 foreach ($user in $Users) { diff --git a/tests/Get-DbaDbPageInfo.Tests.ps1 b/tests/Get-DbaDbPageInfo.Tests.ps1 index 531a477ba4..11d53e583c 100644 --- a/tests/Get-DbaDbPageInfo.Tests.ps1 +++ b/tests/Get-DbaDbPageInfo.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandpath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 7 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaDbPageInfo).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Database', 'Schema', 'Table', 'InputObject', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Database','Schema','Table','InputObject','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaDbPartitionFunction.Tests.ps1 b/tests/Get-DbaDbPartitionFunction.Tests.ps1 index 25e884a74b..540c681608 100644 --- a/tests/Get-DbaDbPartitionFunction.Tests.ps1 +++ b/tests/Get-DbaDbPartitionFunction.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 5 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaDbPartitionFunction).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Database', 'ExcludeDatabase', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Database','ExcludeDatabase','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaDbPartitionScheme.Tests.ps1 b/tests/Get-DbaDbPartitionScheme.Tests.ps1 index 13a8ddf9fc..562b886049 100644 --- a/tests/Get-DbaDbPartitionScheme.Tests.ps1 +++ b/tests/Get-DbaDbPartitionScheme.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 5 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaDbPartitionScheme).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Database', 'ExcludeDatabase', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Database','ExcludeDatabase','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaDbQueryStoreOption.Tests.ps1 b/tests/Get-DbaDbQueryStoreOption.Tests.ps1 index 5fd3dacf9b..d57274dd02 100644 --- a/tests/Get-DbaDbQueryStoreOption.Tests.ps1 +++ b/tests/Get-DbaDbQueryStoreOption.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 5 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaDbQueryStoreOption).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Database', 'ExcludeDatabase', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Database','ExcludeDatabase','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaDbRecoveryModel.Tests.ps1 b/tests/Get-DbaDbRecoveryModel.Tests.ps1 index b41a62f756..a7bc7750e5 100644 --- a/tests/Get-DbaDbRecoveryModel.Tests.ps1 +++ b/tests/Get-DbaDbRecoveryModel.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 6 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaDbRecoveryModel).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'RecoveryModel', 'Database', 'ExcludeDatabase', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','RecoveryModel','Database','ExcludeDatabase','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaDbRestoreHistory.Tests.ps1 b/tests/Get-DbaDbRestoreHistory.Tests.ps1 index 6e41bd7410..8203e1b61c 100644 --- a/tests/Get-DbaDbRestoreHistory.Tests.ps1 +++ b/tests/Get-DbaDbRestoreHistory.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandpath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 8 - $commonParamCount = ([System.Management.Automation.PSCmdlet]::CommonParameters).Count - [object[]]$params = (Get-ChildItem function:\Get-DbaDbRestoreHistory).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Database', 'ExcludeDatabase', 'Since', 'Last', 'Force', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $commonParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Database','ExcludeDatabase','Since','Force','Last','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } diff --git a/tests/Get-DbaDbRoleMember.Tests.ps1 b/tests/Get-DbaDbRoleMember.Tests.ps1 index 31adbac8a4..eb9faaafb5 100644 --- a/tests/Get-DbaDbRoleMember.Tests.ps1 +++ b/tests/Get-DbaDbRoleMember.Tests.ps1 @@ -4,18 +4,11 @@ Write-Host -Object "Running $PSCommandpath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tags "UnitTests" { Context "Validate parameters" { - $defaultParamCount = 11 - $command = Get-Command -Name $CommandName - [object[]]$params = $command.Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'EnableException', 'Database', 'ExcludeDatabase', 'ExcludeFixedRole', 'Role', 'ExcludeRole', 'IncludeSystemUser' - $paramCount = $knownParameters.Count - - It "Should contain our specific parameters" { - ((Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count) | Should Be $paramCount - } - - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Database','ExcludeDatabase','Role','ExcludeRole','ExcludeFixedRole','IncludeSystemUser','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaDbSharePoint.Tests.ps1 b/tests/Get-DbaDbSharePoint.Tests.ps1 index 9542985096..bd8711d7ce 100644 --- a/tests/Get-DbaDbSharePoint.Tests.ps1 +++ b/tests/Get-DbaDbSharePoint.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandpath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaDbSharePoint).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'ConfigDatabase', 'InputObject', 'EnableException' - $paramCount = $knownParameters.Count - It "Should contain our specific parameters" { - ((Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','ConfigDatabase','InputObject','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaDbSnapshot.Tests.ps1 b/tests/Get-DbaDbSnapshot.Tests.ps1 index bef24a7ae6..1dd284c3a1 100644 --- a/tests/Get-DbaDbSnapshot.Tests.ps1 +++ b/tests/Get-DbaDbSnapshot.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 7 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaDbSnapshot).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Database', 'ExcludeDatabase', 'Snapshot', 'ExcludeSnapshot', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Database','ExcludeDatabase','Snapshot','ExcludeSnapshot','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaDbSpace.Tests.ps1 b/tests/Get-DbaDbSpace.Tests.ps1 index 893c85c888..a001d5c161 100644 --- a/tests/Get-DbaDbSpace.Tests.ps1 +++ b/tests/Get-DbaDbSpace.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 6 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaDbSpace).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Database', 'ExcludeDatabase', 'IncludeSystemDBs', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Database','ExcludeDatabase','IncludeSystemDBs','InputObject','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } @@ -62,10 +58,4 @@ Describe "$commandname Integration Tests" -Tags "IntegrationTests" { $results.database | Should Not Contain $dbname } } - Context "Gets DbSpace for system databases when using -IncludeSystemDBs" { - $results = Get-DbaDbSpace -SqlInstance $script:instance2 -IncludeSystemDBs - It "Gets results" { - $results.database | Should Contain 'Master' - } - } } \ No newline at end of file diff --git a/tests/Get-DbaDbState.Tests.ps1 b/tests/Get-DbaDbState.Tests.ps1 index 584b29114a..141e18e64f 100644 --- a/tests/Get-DbaDbState.Tests.ps1 +++ b/tests/Get-DbaDbState.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 5 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaDbState).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Database', 'ExcludeDatabase', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Database','ExcludeDatabase','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaDbStoredProcedure.Tests.ps1 b/tests/Get-DbaDbStoredProcedure.Tests.ps1 index 9fe41c4f78..f5ac4f20e8 100644 --- a/tests/Get-DbaDbStoredProcedure.Tests.ps1 +++ b/tests/Get-DbaDbStoredProcedure.Tests.ps1 @@ -10,22 +10,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan #> Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - <# - The $paramCount is adjusted based on the parameters your command will have. - - The $defaultParamCount is adjusted based on what type of command you are writing the test for: - - Commands that *do not* include SupportShouldProcess, set defaultParamCount = 11 - - Commands that *do* include SupportShouldProcess, set defaultParamCount = 13 - #> - $paramCount = 6 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaDbStoredProcedure).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Database', 'ExcludeDatabase', 'ExcludeSystemSp', 'EnableException' - it "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - it "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Database','ExcludeDatabase','ExcludeSystemSp','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaDbTable.Tests.ps1 b/tests/Get-DbaDbTable.Tests.ps1 index 4de7fa8b7f..1446c8905d 100644 --- a/tests/Get-DbaDbTable.Tests.ps1 +++ b/tests/Get-DbaDbTable.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 7 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaDbTable).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Database', 'ExcludeDatabase', 'IncludeSystemDBs', 'Table', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Database','ExcludeDatabase','IncludeSystemDBs','Table','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaDbTrigger.Tests.ps1 b/tests/Get-DbaDbTrigger.Tests.ps1 index 2309907d46..0fac453c4f 100644 --- a/tests/Get-DbaDbTrigger.Tests.ps1 +++ b/tests/Get-DbaDbTrigger.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 6 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaDbTrigger).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Database', 'ExcludeDatabase', 'InputObject', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Database','ExcludeDatabase','InputObject','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaDbUdf.Tests.ps1 b/tests/Get-DbaDbUdf.Tests.ps1 index 57d3b00f64..23b4354fb1 100644 --- a/tests/Get-DbaDbUdf.Tests.ps1 +++ b/tests/Get-DbaDbUdf.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 6 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaDbUdf).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Database', 'ExcludeDatabase', 'ExcludeSystemUdf', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Database','ExcludeDatabase','ExcludeSystemUdf','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaDbUser.Tests.ps1 b/tests/Get-DbaDbUser.Tests.ps1 index b9d04c5664..26c90cd3ac 100644 --- a/tests/Get-DbaDbUser.Tests.ps1 +++ b/tests/Get-DbaDbUser.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 6 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaDbUser).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Database', 'ExcludeDatabase', 'ExcludeSystemUser', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Database','ExcludeDatabase','ExcludeSystemUser','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaDbView.Tests.ps1 b/tests/Get-DbaDbView.Tests.ps1 index 50e764fdf4..d12ee92ee8 100644 --- a/tests/Get-DbaDbView.Tests.ps1 +++ b/tests/Get-DbaDbView.Tests.ps1 @@ -4,16 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - - $paramCount = 6 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaDbView).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Database', 'ExcludeDatabase', 'ExcludeSystemView', 'EnableException' - it "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - it "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Database','ExcludeDatabase','ExcludeSystemView','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaDbVirtualLogFile.Tests.ps1 b/tests/Get-DbaDbVirtualLogFile.Tests.ps1 index 10245db746..23dd2488c0 100644 --- a/tests/Get-DbaDbVirtualLogFile.Tests.ps1 +++ b/tests/Get-DbaDbVirtualLogFile.Tests.ps1 @@ -10,22 +10,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan #> Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - <# - The $paramCount is adjusted based on the parameters your command will have. - - The $defaultParamCount is adjusted based on what type of command you are writing the test for: - - Commands that *do not* include SupportShouldProcess, set defaultParamCount = 11 - - Commands that *do* include SupportShouldProcess, set defaultParamCount = 13 - #> - $paramCount = 6 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaDbVirtualLogFile).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Database', 'ExcludeDatabase', 'IncludeSystemDbs', 'EnableException' - it "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - it "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Database','ExcludeDatabase','IncludeSystemDBs','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaDbccHelp.Tests.ps1 b/tests/Get-DbaDbccHelp.Tests.ps1 index 704e033055..95c67715f0 100644 --- a/tests/Get-DbaDbccHelp.Tests.ps1 +++ b/tests/Get-DbaDbccHelp.Tests.ps1 @@ -4,22 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $knownParameters = 'SqlInstance', 'SqlCredential', 'Statement', 'IncludeUndocumented', 'EnableException' - $paramCount = $knownParameters.Count - $SupportShouldProcess = $false - if ($SupportShouldProcess) { - $defaultParamCount = 13 - } else { - $defaultParamCount = 11 - } - $command = Get-Command -Name $CommandName - [object[]]$params = $command.Parameters.Keys - - it "Should contain our specific parameters" { - ((Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count) | Should Be $paramCount - } - it "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Statement','IncludeUndocumented','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaDbccMemoryStatus.Tests.ps1 b/tests/Get-DbaDbccMemoryStatus.Tests.ps1 index df93ea2d77..c76fef7520 100644 --- a/tests/Get-DbaDbccMemoryStatus.Tests.ps1 +++ b/tests/Get-DbaDbccMemoryStatus.Tests.ps1 @@ -4,22 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $knownParameters = 'SqlInstance', 'SqlCredential', 'EnableException' - $paramCount = $knownParameters.Count - $SupportShouldProcess = $false - if ($SupportShouldProcess) { - $defaultParamCount = 13 - } else { - $defaultParamCount = 11 - } - $command = Get-Command -Name $CommandName - [object[]]$params = $command.Parameters.Keys - - it "Should contain our specific parameters" { - ((Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count) | Should Be $paramCount - } - it "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaDbccProcCache.Tests.ps1 b/tests/Get-DbaDbccProcCache.Tests.ps1 index 4d9011a2c9..f5abc507df 100644 --- a/tests/Get-DbaDbccProcCache.Tests.ps1 +++ b/tests/Get-DbaDbccProcCache.Tests.ps1 @@ -4,22 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $knownParameters = 'SqlInstance', 'SqlCredential', 'EnableException' - $paramCount = $knownParameters.Count - $SupportShouldProcess = $false - if ($SupportShouldProcess) { - $defaultParamCount = 13 - } else { - $defaultParamCount = 11 - } - $command = Get-Command -Name $CommandName - [object[]]$params = $command.Parameters.Keys - - it "Should contain our specific parameters" { - ((Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count) | Should Be $paramCount - } - it "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaDbccSessionBuffer.Tests.ps1 b/tests/Get-DbaDbccSessionBuffer.Tests.ps1 new file mode 100644 index 0000000000..57b19bc908 --- /dev/null +++ b/tests/Get-DbaDbccSessionBuffer.Tests.ps1 @@ -0,0 +1,71 @@ +$CommandName = $MyInvocation.MyCommand.Name.Replace(".Tests.ps1", "") +Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan +. "$PSScriptRoot\constants.ps1" + +Describe "$CommandName Unit Tests" -Tag 'UnitTests' { + Context "Validate parameters" { + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Operation','SessionId','RequestId','All','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 + } + } +} +Describe "$commandname Integration Test" -Tag "IntegrationTests" { + BeforeAll { + $db = Get-DbaDatabase -SqlInstance $script:instance1 -Database tempdb + $queryResult = $db.Query('SELECT top 10 object_id, @@Spid as MySpid FROM sys.objects') + } + AfterAll { + } + + Context "Validate standard output for all databases " { + $props = 'ComputerName', 'InstanceName', 'SqlInstance', 'SessionId', 'EventType', 'Parameters', 'EventInfo' + $result = Get-DbaDbccSessionBuffer -SqlInstance $script:instance1 -Operation InputBuffer -All + + It "returns results" { + $result.Count -gt 0 | Should Be $true + } + + foreach ($prop in $props) { + $p = $result[0].PSObject.Properties[$prop] + It "Should return property: $prop" { + $p.Name | Should Be $prop + } + } + + $props = 'ComputerName', 'InstanceName', 'SqlInstance', 'SessionId', 'Buffer', 'HexBuffer' + $result = Get-DbaDbccSessionBuffer -SqlInstance $script:instance1 -Operation OutputBuffer -All + + It "returns results" { + $result.Count -gt 0 | Should Be $true + } + + foreach ($prop in $props) { + $p = $result[0].PSObject.Properties[$prop] + It "Should return property: $prop" { + $p.Name | Should Be $prop + } + + } + } + + Context "Validate returns results for SessionId " { + $spid = $queryResult[0].MySpid + $result = Get-DbaDbccSessionBuffer -SqlInstance $script:instance1 -Operation InputBuffer -SessionId $spid + + It "returns results for InputBuffer" { + $result.SessionId -eq $spid | Should Be $true + } + + $result = Get-DbaDbccSessionBuffer -SqlInstance $script:instance1 -Operation OutputBuffer -SessionId $spid + + It "returns results for OutputBuffer" { + $result.SessionId -eq $spid | Should Be $true + } + } + +} + + diff --git a/tests/Get-DbaDbccStatistic.Tests.ps1 b/tests/Get-DbaDbccStatistic.Tests.ps1 new file mode 100644 index 0000000000..184c06e3cd --- /dev/null +++ b/tests/Get-DbaDbccStatistic.Tests.ps1 @@ -0,0 +1,120 @@ +$CommandName = $MyInvocation.MyCommand.Name.Replace(".Tests.ps1", "") +Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan +. "$PSScriptRoot\constants.ps1" + +Describe "$CommandName Unit Tests" -Tag 'UnitTests' { + Context "Validate parameters" { + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Database','Object','Target','Option','NoInformationalMessages','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 + } + } +} +Describe "$commandname Integration Test" -Tag "IntegrationTests" { + BeforeAll { + $server = Connect-DbaInstance -SqlInstance $script:instance2 + $random = Get-Random + $tableName = "dbatools_getdbtbl1" + $tableName2 = "dbatools_getdbtbl2" + + $dbname = "dbatoolsci_dbccstat$random" + $null = $server.Query("CREATE DATABASE $dbname") + $null = $server.Query("CREATE TABLE $tableName (idTbl1 INT PRIMARY KEY)", $dbname) + $null = $server.Query("CREATE TABLE $tableName2 (idTbl2 INT, idTbl1 INT, id3 INT)", $dbname) + + $null = $server.Query("INSERT $tableName(idTbl1) SELECT object_id FROM sys.objects", $dbname) + $null = $server.Query("INSERT $tableName2(idTbl2, idTbl1, id3) SELECT object_id, parent_object_id, schema_id from sys.all_objects", $dbname) + + $null = $server.Query("CREATE STATISTICS [TestStat1] ON $tableName2([idTbl2], [idTbl1], [id3])", $dbname) + $null = $server.Query("CREATE STATISTICS [TestStat2] ON $tableName2([idTbl1], [idTbl2])", $dbname) + $null = $server.Query("UPDATE STATISTICS $tableName", $dbname) + } + AfterAll { + $null = Get-DbaDatabase -SqlInstance $script:instance2 -Database $dbname | Remove-DbaDatabase -Confirm:$false + } + + Context "Validate standard output for StatHeader option " { + $props = 'ComputerName', 'InstanceName', 'SqlInstance', 'Database', 'Object', 'Target', 'Cmd', 'Name', 'Updated', 'Rows', 'RowsSampled', 'Steps', 'Density', 'AverageKeyLength', 'StringIndex', 'FilterExpression', 'UnfilteredRows', 'PersistedSamplePercent' + $result = Get-DbaDbccStatistic -SqlInstance $script:instance2 -Database $dbname -Option StatHeader + + It "returns correct results" { + $result.Count -eq 3 | Should Be $true + } + + foreach ($prop in $props) { + $p = $result[0].PSObject.Properties[$prop] + It "Should return property: $prop" { + $p.Name | Should Be $prop + } + } + } + + Context "Validate standard output for DensityVector option " { + $props = 'ComputerName', 'InstanceName', 'SqlInstance', 'Database', 'Object', 'Target', 'Cmd', 'AllDensity', 'AverageLength', 'Columns' + $result = Get-DbaDbccStatistic -SqlInstance $script:instance2 -Database $dbname -Option DensityVector + + It "returns results" { + $result.Count -gt 0 | Should Be $true + } + + foreach ($prop in $props) { + $p = $result[0].PSObject.Properties[$prop] + It "Should return property: $prop" { + $p.Name | Should Be $prop + } + + } + } + + Context "Validate standard output for Histogram option " { + $props = 'ComputerName', 'InstanceName', 'SqlInstance', 'Database', 'Object', 'Target', 'Cmd', 'RangeHiKey', 'RangeRows', 'EqualRows', 'DistinctRangeRows', 'AverageRangeRows' + $result = Get-DbaDbccStatistic -SqlInstance $script:instance2 -Database $dbname -Option Histogram + + It "returns results" { + $result.Count -gt 0 | Should Be $true + } + + foreach ($prop in $props) { + $p = $result[0].PSObject.Properties[$prop] + It "Should return property: $prop" { + $p.Name | Should Be $prop + } + + } + } + + Context "Validate standard output for StatsStream option " { + $props = 'ComputerName', 'InstanceName', 'SqlInstance', 'Database', 'Object', 'Target', 'Cmd', 'StatsStream', 'Rows', 'DataPages' + $result = Get-DbaDbccStatistic -SqlInstance $script:instance2 -Database $dbname -Option StatsStream + + It "returns results" { + $result.Count -gt 0 | Should Be $true + } + + foreach ($prop in $props) { + $p = $result[0].PSObject.Properties[$prop] + It "Should return property: $prop" { + $p.Name | Should Be $prop + } + + } + } + + Context "Validate returns results for single Object " { + $result = Get-DbaDbccStatistic -SqlInstance $script:instance2 -Database $dbname -Object $tableName2 -Option StatsStream + + It "returns results" { + $result.Count -gt 0 | Should Be $true + } + } + + Context "Validate returns results for single Object and Target " { + $result = Get-DbaDbccStatistic -SqlInstance $script:instance2 -Database $dbname -Object $tableName2 -Target 'TestStat2' -Option DensityVector + + It "returns results" { + $result.Count -gt 0 | Should Be $true + } + } +} \ No newline at end of file diff --git a/tests/Get-DbaDbccUserOption.Tests.ps1 b/tests/Get-DbaDbccUserOption.Tests.ps1 index 2d7dcaa759..18d0b034e5 100644 --- a/tests/Get-DbaDbccUserOption.Tests.ps1 +++ b/tests/Get-DbaDbccUserOption.Tests.ps1 @@ -4,22 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $knownParameters = 'SqlInstance', 'SqlCredential', 'Option', 'EnableException' - $paramCount = $knownParameters.Count - $SupportShouldProcess = $false - if ($SupportShouldProcess) { - $defaultParamCount = 13 - } else { - $defaultParamCount = 11 - } - $command = Get-Command -Name $CommandName - [object[]]$params = $command.Parameters.Keys - - it "Should contain our specific parameters" { - ((Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count) | Should Be $paramCount - } - it "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Option','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaDefaultPath.Tests.ps1 b/tests/Get-DbaDefaultPath.Tests.ps1 index 9eab937ed0..3e29ed5927 100644 --- a/tests/Get-DbaDefaultPath.Tests.ps1 +++ b/tests/Get-DbaDefaultPath.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 3 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaDefaultPath).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaDependency.Tests.ps1 b/tests/Get-DbaDependency.Tests.ps1 index a342d08a5c..33c284b660 100644 --- a/tests/Get-DbaDependency.Tests.ps1 +++ b/tests/Get-DbaDependency.Tests.ps1 @@ -4,20 +4,16 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 5 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaDependency).Parameters.Keys - $knownParameters = 'InputObject', 'AllowSystemObjects', 'Parents', 'IncludeSelf', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'InputObject', 'AllowSystemObjects', 'Parents', 'IncludeSelf', 'EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } <# Integration test should appear below and are custom to the command you are writing. Read https://github.com/sqlcollaborative/dbatools/blob/development/contributing.md#tests - for more guidence. + for more guidance. #> \ No newline at end of file diff --git a/tests/Get-DbaDeprecatedFeature.Tests.ps1 b/tests/Get-DbaDeprecatedFeature.Tests.ps1 index 08b05ed17e..8609d60742 100644 --- a/tests/Get-DbaDeprecatedFeature.Tests.ps1 +++ b/tests/Get-DbaDeprecatedFeature.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 3 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaDeprecatedFeature).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaDetachedDatabaseInfo.Tests.ps1 b/tests/Get-DbaDetachedDatabaseInfo.Tests.ps1 index 4c62c4cd50..6a89111eac 100644 --- a/tests/Get-DbaDetachedDatabaseInfo.Tests.ps1 +++ b/tests/Get-DbaDetachedDatabaseInfo.Tests.ps1 @@ -4,20 +4,48 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 3 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaDetachedDatabaseInfo).Parameters.Keys - $knownParameters = 'SqlInstance', 'Path', 'SqlCredential' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','Path','SqlCredential' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } -<# - Integration test should appear below and are custom to the command you are writing. - Read https://github.com/sqlcollaborative/dbatools/blob/development/contributing.md#tests - for more guidence. -#> \ No newline at end of file + +Describe "$CommandName Integration Tests" -Tags "IntegrationTests" { + BeforeAll { + $server = Connect-DbaInstance -SqlInstance $script:instance2 + $random = Get-Random + $dbname = "dbatoolsci_detatch_$random" + $server.Query("CREATE DATABASE $dbname") + $path = (Get-DbadbFile -SqlInstance $script:instance2 -Database $dbname | Where-object {$_.PhysicalName -like '*.mdf'}).physicalname + Detach-DbaDatabase -SqlInstance $script:instance2 -Database $dbname -Force + } + + AfterAll { + $server.Query("CREATE DATABASE $dbname + ON (FILENAME = '$path') + FOR ATTACH") + Remove-DbaDatabase -SqlInstance $script:Instance2 -Database $dbname -Confirm:$false + } + + Context "Command actually works" { + $results = Get-DbaDetachedDatabaseInfo -SqlInstance $script:Instance2 -Path $path + it "Gets Results" { + $results | Should Not Be $null + } + It "Should be created database" { + $results.name | Should Be $dbname + } + It "Should be 2016" { + $results.version | Should Be 'SQL Server 2016' + } + It "Should have Data files" { + $results.DataFiles | Should Not Be $null + } + It "Should have Log files" { + $results.LogFiles | Should Not Be $null + } + } +} \ No newline at end of file diff --git a/tests/Get-DbaDiskSpace.Tests.ps1 b/tests/Get-DbaDiskSpace.Tests.ps1 index c765c53285..5a3cda5616 100644 --- a/tests/Get-DbaDiskSpace.Tests.ps1 +++ b/tests/Get-DbaDiskSpace.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 9 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaDiskSpace).Parameters.Keys - $knownParameters = 'ComputerName', 'Credential', 'Unit', 'CheckForSql', 'SqlCredential', 'ExcludeDrive', 'CheckFragmentation', 'Force', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'ComputerName','Credential','Unit','CheckForSql','SqlCredential','ExcludeDrive','CheckFragmentation','Force','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaDump.Tests.ps1 b/tests/Get-DbaDump.Tests.ps1 index 156afd8e3d..45538439c1 100644 --- a/tests/Get-DbaDump.Tests.ps1 +++ b/tests/Get-DbaDump.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 3 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaDump).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaEndpoint.Tests.ps1 b/tests/Get-DbaEndpoint.Tests.ps1 index ec860fc852..da1c5141a2 100644 --- a/tests/Get-DbaEndpoint.Tests.ps1 +++ b/tests/Get-DbaEndpoint.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 5 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaEndpoint).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Endpoint', 'EnableException', 'Type' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Endpoint','Type','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaErrorLog.Tests.ps1 b/tests/Get-DbaErrorLog.Tests.ps1 index 136e064690..98fc1525b4 100644 --- a/tests/Get-DbaErrorLog.Tests.ps1 +++ b/tests/Get-DbaErrorLog.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 8 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaErrorLog).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'LogNumber', 'Source', 'Text', 'After', 'Before', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','LogNumber','Source','Text','After','Before','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaErrorLogConfig.Tests.ps1 b/tests/Get-DbaErrorLogConfig.Tests.ps1 index 361086ec1e..53c1226d16 100644 --- a/tests/Get-DbaErrorLogConfig.Tests.ps1 +++ b/tests/Get-DbaErrorLogConfig.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag "UnitTests" { Context "Validate parameters" { - $paramCount = 3 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaErrorLogConfig).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'EnableException' - It "Should contain our specific parameters" { - ((Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count) | Should -Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should -Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaEstimatedCompletionTime.Tests.ps1 b/tests/Get-DbaEstimatedCompletionTime.Tests.ps1 index 66f3d88720..0082fc21c9 100644 --- a/tests/Get-DbaEstimatedCompletionTime.Tests.ps1 +++ b/tests/Get-DbaEstimatedCompletionTime.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 5 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaEstimatedCompletionTime).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Database', 'ExcludeDatabase', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Database','ExcludeDatabase','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaExecutionPlan.Tests.ps1 b/tests/Get-DbaExecutionPlan.Tests.ps1 index 0dc0d688f3..c94e07386b 100644 --- a/tests/Get-DbaExecutionPlan.Tests.ps1 +++ b/tests/Get-DbaExecutionPlan.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 9 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaExecutionPlan).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Database', 'ExcludeDatabase', 'SinceCreation', 'SinceLastExecution', 'ExcludeEmptyQueryPlan', 'Force', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Database','ExcludeDatabase','SinceCreation','SinceLastExecution','ExcludeEmptyQueryPlan','Force','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaFeature.Tests.ps1 b/tests/Get-DbaFeature.Tests.ps1 index b02cc68ce3..08a19ea48f 100644 --- a/tests/Get-DbaFeature.Tests.ps1 +++ b/tests/Get-DbaFeature.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 3 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaFeature).Parameters.Keys - $knownParameters = 'ComputerName', 'Credential', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'ComputerName','Credential','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaFile.Tests.ps1 b/tests/Get-DbaFile.Tests.ps1 index 447b1b9e1a..e0101b8477 100644 --- a/tests/Get-DbaFile.Tests.ps1 +++ b/tests/Get-DbaFile.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 6 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaFile).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Path', 'FileType', 'Depth', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Path','FileType','Depth','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaFilestream.Tests.ps1 b/tests/Get-DbaFilestream.Tests.ps1 index 008e9ad467..3dd0188872 100644 --- a/tests/Get-DbaFilestream.Tests.ps1 +++ b/tests/Get-DbaFilestream.Tests.ps1 @@ -10,22 +10,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan #> Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - <# - The $paramCount is adjusted based on the parameters your command will have. - - The $defaultParamCount is adjusted based on what type of command you are writing the test for: - - Commands that *do not* include SupportShouldProcess, set defaultParamCount = 11 - - Commands that *do* include SupportShouldProcess, set defaultParamCount = 13 - #> - $paramCount = 4 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaFilestream).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Credential', 'EnableException' - It "Should contain our specific parameters" { - ((Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Credential','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaForceNetworkEncryption.Tests.ps1 b/tests/Get-DbaForceNetworkEncryption.Tests.ps1 index a7ca310188..cb51c19527 100644 --- a/tests/Get-DbaForceNetworkEncryption.Tests.ps1 +++ b/tests/Get-DbaForceNetworkEncryption.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 3 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaForceNetworkEncryption).Parameters.Keys - $knownParameters = 'SqlInstance', 'Credential', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','Credential','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaHelpIndex.Tests.ps1 b/tests/Get-DbaHelpIndex.Tests.ps1 index ef9139e653..91dfd0e2f1 100644 --- a/tests/Get-DbaHelpIndex.Tests.ps1 +++ b/tests/Get-DbaHelpIndex.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 11 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\$CommandName).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Database', 'ExcludeDatabase', 'InputObject', 'ObjectName', 'IncludeStats', 'IncludeDataTypes', 'Raw', 'IncludeFragmentation', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Database','ExcludeDatabase','InputObject','ObjectName','IncludeStats','IncludeDataTypes','Raw','IncludeFragmentation','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaInstanceProperty.Tests.ps1 b/tests/Get-DbaInstanceProperty.Tests.ps1 index a997d68382..5ed20a5002 100644 --- a/tests/Get-DbaInstanceProperty.Tests.ps1 +++ b/tests/Get-DbaInstanceProperty.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 5 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaInstanceProperty).Parameters.Keys - $knownParameters = 'Computer', 'SqlInstance', 'SqlCredential', 'InstanceProperty', 'ExcludeInstanceProperty', 'Credential', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','InstanceProperty','ExcludeInstanceProperty','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaInstanceUserOption.Tests.ps1 b/tests/Get-DbaInstanceUserOption.Tests.ps1 index a681f3452b..ba58e4e91c 100644 --- a/tests/Get-DbaInstanceUserOption.Tests.ps1 +++ b/tests/Get-DbaInstanceUserOption.Tests.ps1 @@ -4,20 +4,27 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 3 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaInstanceUserOption).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } -<# - Integration test should appear below and are custom to the command you are writing. - Read https://github.com/sqlcollaborative/dbatools/blob/development/contributing.md#tests - for more guidence. -#> \ No newline at end of file + +Describe "$commandname Integration Tests" -Tags "IntegrationTests" { + + Context "Gets UserOptions for the Instance" { + $results = Get-DbaInstanceUserOption -SqlInstance $script:instance2 | Where-Object {$_.name -eq 'AnsiNullDefaultOff'} + It "Gets results" { + $results | Should Not Be $null + } + It "Should return AnsiNullDefaultOff UserOption" { + $results.Name | Should Be 'AnsiNullDefaultOff' + } + It "Should be set to false" { + $results.Value | Should Be $false + } + } +} \ No newline at end of file diff --git a/tests/Get-DbaIoLatency.Tests.ps1 b/tests/Get-DbaIoLatency.Tests.ps1 index da24067eb1..64a8eb11f0 100644 --- a/tests/Get-DbaIoLatency.Tests.ps1 +++ b/tests/Get-DbaIoLatency.Tests.ps1 @@ -4,23 +4,11 @@ Write-Host -Object "Running $PSCommandpath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tags "UnitTests" { Context "Validate parameters" { - $knownParameters = 'SqlInstance', 'SqlCredential', 'EnableException' - $paramCount = $knownParameters.Count - $SupportShouldProcess = $false - if ($SupportShouldProcess) { - $defaultParamCount = 13 - } else { - $defaultParamCount = 11 - } - $command = Get-Command -Name $CommandName - [object[]]$params = $command.Parameters.Keys - - It "Should contain our specific parameters" { - ((Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count) | Should Be $paramCount - } - - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaLastBackup.Tests.ps1 b/tests/Get-DbaLastBackup.Tests.ps1 index 6b0d1fc505..bcf8453e71 100644 --- a/tests/Get-DbaLastBackup.Tests.ps1 +++ b/tests/Get-DbaLastBackup.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 5 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaLastBackup).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Database', 'ExcludeDatabase', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Database','ExcludeDatabase','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaLastGoodCheckDb.Tests.ps1 b/tests/Get-DbaLastGoodCheckDb.Tests.ps1 index 6bb7bd8ddb..03227bbc77 100644 --- a/tests/Get-DbaLastGoodCheckDb.Tests.ps1 +++ b/tests/Get-DbaLastGoodCheckDb.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 5 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaLastGoodCheckDb).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Database', 'ExcludeDatabase', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Database','ExcludeDatabase','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaLatchStatistic.Tests.ps1 b/tests/Get-DbaLatchStatistic.Tests.ps1 index 8f9f8bae3b..32cd69bc92 100644 --- a/tests/Get-DbaLatchStatistic.Tests.ps1 +++ b/tests/Get-DbaLatchStatistic.Tests.ps1 @@ -4,23 +4,11 @@ Write-Host -Object "Running $PSCommandpath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tags "UnitTests" { Context "Validate parameters" { - $knownParameters = 'SqlInstance', 'SqlCredential', 'Threshold', 'EnableException' - $paramCount = $knownParameters.Count - $SupportShouldProcess = $false - if ($SupportShouldProcess) { - $defaultParamCount = 13 - } else { - $defaultParamCount = 11 - } - $command = Get-Command -Name $CommandName - [object[]]$params = $command.Parameters.Keys - - It "Should contain our specific parameters" { - ((Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count) | Should Be $paramCount - } - - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Threshold','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaLinkedServer.Tests.ps1 b/tests/Get-DbaLinkedServer.Tests.ps1 index 08737dfbe7..5c0bcb3475 100644 --- a/tests/Get-DbaLinkedServer.Tests.ps1 +++ b/tests/Get-DbaLinkedServer.Tests.ps1 @@ -4,20 +4,60 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 5 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaLinkedServer).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'LinkedServer', 'ExcludeLinkedServer', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','LinkedServer','ExcludeLinkedServer','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } -<# - Integration test should appear below and are custom to the command you are writing. - Read https://github.com/sqlcollaborative/dbatools/blob/development/contributing.md#tests - for more guidence. -#> \ No newline at end of file + +Describe "$commandname Integration Tests" -Tags "IntegrationTests" { + BeforeAll { + $server = Connect-DbaInstance -SqlInstance $script:instance2 + $null = $server.Query("EXEC master.dbo.sp_addlinkedserver + @server = N'$script:instance3', + @srvproduct=N'SQL Server' ;") + } + AfterAll { + $null = $server.Query("EXEC master.dbo.sp_dropserver '$script:instance3', 'droplogins'; ") + } + + Context "Gets Linked Servers" { + $results = Get-DbaLinkedServer -SqlInstance $script:instance2 | Where-Object {$_.name -eq "$script:Instance3"} + It "Gets results" { + $results | Should Not Be $null + } + It "Should have Remote Server of $script:Instance3" { + $results.RemoteServer | Should Be "$script:Instance3" + } + It "Should have a product name of SQL Server" { + $results.productname | Should Be 'SQL Server' + } + It "Should have Impersonate for authentication" { + $results.Impersonate | Should Be $true + } + } + Context "Gets Linked Servers using -LinkedServer" { + $results = Get-DbaLinkedServer -SqlInstance $script:instance2 -LinkedServer "$script:Instance3" + It "Gets results" { + $results | Should Not Be $null + } + It "Should have Remote Server of $script:Instance3" { + $results.RemoteServer | Should Be "$script:Instance3" + } + It "Should have a product name of SQL Server" { + $results.productname | Should Be 'SQL Server' + } + It "Should have Impersonate for authentication" { + $results.Impersonate | Should Be $true + } + } + Context "Gets Linked Servers using -ExcludeLinkedServer" { + $results = Get-DbaLinkedServer -SqlInstance $script:instance2 -ExcludeLinkedServer "$script:Instance3" + It "Gets results" { + $results | Should Be $null + } + } +} \ No newline at end of file diff --git a/tests/Get-DbaLocaleSetting.Tests.ps1 b/tests/Get-DbaLocaleSetting.Tests.ps1 index 6c1593f7dc..c3d2147a9d 100644 --- a/tests/Get-DbaLocaleSetting.Tests.ps1 +++ b/tests/Get-DbaLocaleSetting.Tests.ps1 @@ -4,20 +4,21 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 3 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaLocaleSetting).Parameters.Keys - $knownParameters = 'ComputerName', 'Credential', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'ComputerName','Credential','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } -<# - Integration test should appear below and are custom to the command you are writing. - Read https://github.com/sqlcollaborative/dbatools/blob/development/contributing.md#tests - for more guidence. -#> \ No newline at end of file + +Describe "$commandname Integration Tests" -Tags "IntegrationTests" { + + Context "Gets LocaleSettings" { + $results = Get-DbaLocaleSetting -ComputerName $env:ComputerName + It "Gets results" { + $results | Should Not Be $null + } + } +} \ No newline at end of file diff --git a/tests/Get-DbaLogin.Tests.ps1 b/tests/Get-DbaLogin.Tests.ps1 index 66fb51412b..c5723b0525 100644 --- a/tests/Get-DbaLogin.Tests.ps1 +++ b/tests/Get-DbaLogin.Tests.ps1 @@ -4,11 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - [object[]]$params = (Get-ChildItem function:\Get-DbaLogin).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'SQLLogins', 'WindowsLogins', 'Login', 'IncludeFilter', 'ExcludeLogin', 'ExcludeFilter', 'ExcludeSystemLogin', 'Type', 'HasAccess', 'Locked', 'Disabled', 'EnableException' - $paramCount = $knownParameters.Count - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Login','IncludeFilter','ExcludeLogin','ExcludeFilter','ExcludeSystemLogin','Type','HasAccess','SqlLogins','WindowsLogins','Locked','Disabled','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaMaintenanceSolutionLog.Tests.ps1 b/tests/Get-DbaMaintenanceSolutionLog.Tests.ps1 index 2708ab155b..00efc7b7c2 100644 --- a/tests/Get-DbaMaintenanceSolutionLog.Tests.ps1 +++ b/tests/Get-DbaMaintenanceSolutionLog.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 6 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaMaintenanceSolutionLog).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'LogType', 'Since', 'Path', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','LogType','Since','Path','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaManagementObject.Tests.ps1 b/tests/Get-DbaManagementObject.Tests.ps1 index 1e84a7c9d9..1eecd6de96 100644 --- a/tests/Get-DbaManagementObject.Tests.ps1 +++ b/tests/Get-DbaManagementObject.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 4 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaManagementObject).Parameters.Keys - $knownParameters = 'ComputerName', 'Credential', 'VersionNumber', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'ComputerName','Credential','VersionNumber','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaMaxMemory.Tests.ps1 b/tests/Get-DbaMaxMemory.Tests.ps1 index 3ebde64f97..c81c0f8582 100644 --- a/tests/Get-DbaMaxMemory.Tests.ps1 +++ b/tests/Get-DbaMaxMemory.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 3 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaMaxMemory).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaMemoryCondition.Tests.ps1 b/tests/Get-DbaMemoryCondition.Tests.ps1 new file mode 100644 index 0000000000..945ec08f6e --- /dev/null +++ b/tests/Get-DbaMemoryCondition.Tests.ps1 @@ -0,0 +1,34 @@ +$CommandName = $MyInvocation.MyCommand.Name.Replace(".Tests.ps1", "") +Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan +. "$PSScriptRoot\constants.ps1" + +Describe "$CommandName Unit Tests" -Tag 'UnitTests' { + Context "Validate parameters" { + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 + } + } +} + +<# + Integration test should appear below and are custom to the command you are writing. + Read https://github.com/sqlcollaborative/dbatools/blob/development/contributing.md#tests + for more guidence. +#> +Describe "Get-DbaMemoryCondition Integration Test" -Tag "IntegrationTests" { + Context "Command actually works" { + $results = Get-DbaMemoryCondition -SqlInstance $script:instance1 + + It "returns results" { + $($results | Measure-Object).Count -gt 0 | Should Be $true + } + It "has the correct properties" { + $result = $results[0] + $ExpectedProps = 'ComputerName,InstanceName,SqlInstance,Runtime,NotificationTime,NotificationType,MemoryUtilizationPercent,TotalPhysicalMemory,AvailablePhysicalMemory,TotalPageFile,AvailablePageFile,TotalVirtualAddressSpace,AvailableVirtualAddressSpace,NodeId,SQLReservedMemory,SQLCommittedMemory,RecordId,Type,Indicators,RecordTime,CurrentTime'.Split(',') + ($result.PsObject.Properties.Name | Sort-Object) | Should Be ($ExpectedProps | Sort-Object) + } + } +} \ No newline at end of file diff --git a/tests/Get-DbaMemoryUsage.Tests.ps1 b/tests/Get-DbaMemoryUsage.Tests.ps1 index 2f1f1d6fe9..8e7bd7b7bb 100644 --- a/tests/Get-DbaMemoryUsage.Tests.ps1 +++ b/tests/Get-DbaMemoryUsage.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaMemoryUsage).Parameters.Keys - $knownParameters = 'ComputerName', 'Credential', 'EnableException' - $paramCount = $knownParameters.Count - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'ComputerName','Credential','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaModule.Tests.ps1 b/tests/Get-DbaModule.Tests.ps1 index f9fd6d3448..4fa094fa86 100644 --- a/tests/Get-DbaModule.Tests.ps1 +++ b/tests/Get-DbaModule.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 9 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaModule).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Database', 'ExcludeDatabase', 'ModifiedSince', 'Type', 'ExcludeSystemDatabases', 'ExcludeSystemObjects', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Database','ExcludeDatabase','ModifiedSince','Type','ExcludeSystemDatabases','ExcludeSystemObjects','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaMsdtc.Tests.ps1 b/tests/Get-DbaMsdtc.Tests.ps1 index 227d6fef73..ee71be7e53 100644 --- a/tests/Get-DbaMsdtc.Tests.ps1 +++ b/tests/Get-DbaMsdtc.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 1 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaMsdtc).Parameters.Keys - $knownParameters = 'ComputerName' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==" | Measure-Object ).Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'ComputerName' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaNetworkActivity.Tests.ps1 b/tests/Get-DbaNetworkActivity.Tests.ps1 index f33bd0ba8b..1a8e816eda 100644 --- a/tests/Get-DbaNetworkActivity.Tests.ps1 +++ b/tests/Get-DbaNetworkActivity.Tests.ps1 @@ -4,20 +4,21 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 3 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaNetworkActivity).Parameters.Keys - $knownParameters = 'ComputerName', 'Credential', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'ComputerName','Credential','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } -<# - Integration test should appear below and are custom to the command you are writing. - Read https://github.com/sqlcollaborative/dbatools/blob/development/contributing.md#tests - for more guidence. -#> \ No newline at end of file + +Describe "$commandname Integration Tests" -Tags "IntegrationTests" { + + Context "Gets Network Activity" { + $results = Get-DbaNetworkActivity -ComputerName $env:ComputerName + It "Gets results" { + $results | Should Not Be $null + } + } +} \ No newline at end of file diff --git a/tests/Get-DbaNetworkCertificate.Tests.ps1 b/tests/Get-DbaNetworkCertificate.Tests.ps1 index f45790231f..0c3d42c1d6 100644 --- a/tests/Get-DbaNetworkCertificate.Tests.ps1 +++ b/tests/Get-DbaNetworkCertificate.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 3 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaNetworkCertificate).Parameters.Keys - $knownParameters = 'ComputerName', 'Credential', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'ComputerName','Credential','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaOpenTransaction.Tests.ps1 b/tests/Get-DbaOpenTransaction.Tests.ps1 index 2ac103204b..973f4b929d 100644 --- a/tests/Get-DbaOpenTransaction.Tests.ps1 +++ b/tests/Get-DbaOpenTransaction.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 3 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaOpenTransaction).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaOperatingSystem.Tests.ps1 b/tests/Get-DbaOperatingSystem.Tests.ps1 index 3c0386fe25..4db5e2bc35 100644 --- a/tests/Get-DbaOperatingSystem.Tests.ps1 +++ b/tests/Get-DbaOperatingSystem.Tests.ps1 @@ -4,22 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $knownParameters = 'ComputerName', 'Credential', 'EnableException' - $paramCount = $knownParameters.Count - $SupportShouldProcess = $false - if ($SupportShouldProcess) { - $defaultParamCount = 13 - } else { - $defaultParamCount = 11 - } - $command = Get-Command -Name $CommandName - [object[]]$params = $command.Parameters.Keys - - it "Should contain our specific parameters" { - ((Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count) | Should Be $paramCount - } - it "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'ComputerName','Credential','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } Context "Validate input" { diff --git a/tests/Get-DbaPageFileSetting.Tests.ps1 b/tests/Get-DbaPageFileSetting.Tests.ps1 index e2ac5fd846..4d4498a6f6 100644 --- a/tests/Get-DbaPageFileSetting.Tests.ps1 +++ b/tests/Get-DbaPageFileSetting.Tests.ps1 @@ -4,20 +4,21 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 3 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaPageFileSetting).Parameters.Keys - $knownParameters = 'ComputerName', 'Credential', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'ComputerName','Credential','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } -<# - Integration test should appear below and are custom to the command you are writing. - Read https://github.com/sqlcollaborative/dbatools/blob/development/contributing.md#tests - for more guidence. -#> \ No newline at end of file + +Describe "$commandname Integration Tests" -Tags "IntegrationTests" { + + Context "Gets PageFile Settings" { + $results = Get-DbaPageFileSetting -ComputerName $env:ComputerName + It "Gets results" { + $results | Should Not Be $null + } + } +} \ No newline at end of file diff --git a/tests/Get-DbaPbmCategory.Tests.ps1 b/tests/Get-DbaPbmCategory.Tests.ps1 index fcd15d4c62..c8789af7e8 100644 --- a/tests/Get-DbaPbmCategory.Tests.ps1 +++ b/tests/Get-DbaPbmCategory.Tests.ps1 @@ -4,20 +4,32 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 6 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaPbmCategory).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Category', 'InputObject', 'ExcludeSystemObject', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Category','InputObject','ExcludeSystemObject','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } -<# - Integration test should appear below and are custom to the command you are writing. - Read https://github.com/sqlcollaborative/dbatools/blob/development/contributing.md#tests - for more guidence. -#> \ No newline at end of file + +Describe "$CommandName Integration Tests" -Tags "IntegrationTests" { + Context "Command actually works" { + $results = Get-DbaPbmCategory -SqlInstance $script:Instance2 + it "Gets Results" { + $results | Should Not Be $null + } + } + Context "Command actually works using -Category" { + $results = Get-DbaPbmCategory -SqlInstance $script:Instance2 -Category 'Availability database errors' + it "Gets Results" { + $results | Should Not Be $null + } + } + Context "Command actually works using -ExcludeSystemObject" { + $results = Get-DbaPbmCategory -SqlInstance $script:Instance2 -ExcludeSystemObject + it "Gets Results" { + $results | Should Not Be $null + } + } +} \ No newline at end of file diff --git a/tests/Get-DbaPbmCategorySubscription.Tests.ps1 b/tests/Get-DbaPbmCategorySubscription.Tests.ps1 index 06c879fdb4..b1a1cb7bfb 100644 --- a/tests/Get-DbaPbmCategorySubscription.Tests.ps1 +++ b/tests/Get-DbaPbmCategorySubscription.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 4 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaPbmCategorySubscription).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'InputObject', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','InputObject','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaPbmCondition.Tests.ps1 b/tests/Get-DbaPbmCondition.Tests.ps1 index 0a11689636..fd966da42d 100644 --- a/tests/Get-DbaPbmCondition.Tests.ps1 +++ b/tests/Get-DbaPbmCondition.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 6 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaPbmCondition).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Condition', 'InputObject', 'IncludeSystemObject', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Condition','InputObject','IncludeSystemObject','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaPbmObjectSet.Tests.ps1 b/tests/Get-DbaPbmObjectSet.Tests.ps1 index bf8521dc39..0984e96f01 100644 --- a/tests/Get-DbaPbmObjectSet.Tests.ps1 +++ b/tests/Get-DbaPbmObjectSet.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 6 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaPbmObjectSet).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'ObjectSet', 'InputObject', 'IncludeSystemObject', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','ObjectSet','InputObject','IncludeSystemObject','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaPbmPolicy.Tests.ps1 b/tests/Get-DbaPbmPolicy.Tests.ps1 index 26f4bc112c..fa75c9cd4f 100644 --- a/tests/Get-DbaPbmPolicy.Tests.ps1 +++ b/tests/Get-DbaPbmPolicy.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 7 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaPbmPolicy).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Policy', 'Category', 'InputObject', 'IncludeSystemObject', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Policy','Category','InputObject','IncludeSystemObject','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaPbmStore.Tests.ps1 b/tests/Get-DbaPbmStore.Tests.ps1 index 3ef078730c..a323cc8501 100644 --- a/tests/Get-DbaPbmStore.Tests.ps1 +++ b/tests/Get-DbaPbmStore.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 3 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaPbmStore).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaPermission.Tests.ps1 b/tests/Get-DbaPermission.Tests.ps1 index e782599b92..0911596cd6 100644 --- a/tests/Get-DbaPermission.Tests.ps1 +++ b/tests/Get-DbaPermission.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 7 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaPermission).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Database', 'ExcludeDatabase', 'IncludeServerLevel', 'ExcludeSystemObjects', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Database','ExcludeDatabase','IncludeServerLevel','ExcludeSystemObjects','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaPfAvailableCounter.Tests.ps1 b/tests/Get-DbaPfAvailableCounter.Tests.ps1 index 15ec00f9d9..01e2f87849 100644 --- a/tests/Get-DbaPfAvailableCounter.Tests.ps1 +++ b/tests/Get-DbaPfAvailableCounter.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 4 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaPfAvailableCounter).Parameters.Keys - $knownParameters = 'ComputerName', 'Credential', 'Pattern', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'ComputerName','Credential','Pattern','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaPfDataCollector.Tests.ps1 b/tests/Get-DbaPfDataCollector.Tests.ps1 index 03d014c89c..4e510ea185 100644 --- a/tests/Get-DbaPfDataCollector.Tests.ps1 +++ b/tests/Get-DbaPfDataCollector.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 6 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaPfDataCollector).Parameters.Keys - $knownParameters = 'ComputerName', 'Credential', 'CollectorSet', 'Collector', 'InputObject', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'ComputerName','Credential','CollectorSet','Collector','InputObject','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaPfDataCollectorCounter.Tests.ps1 b/tests/Get-DbaPfDataCollectorCounter.Tests.ps1 index 5cb5754223..909cd24a2b 100644 --- a/tests/Get-DbaPfDataCollectorCounter.Tests.ps1 +++ b/tests/Get-DbaPfDataCollectorCounter.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 7 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaPfDataCollectorCounter).Parameters.Keys - $knownParameters = 'ComputerName', 'Credential', 'CollectorSet', 'Collector', 'Counter', 'InputObject', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'ComputerName','Credential','CollectorSet','Collector','Counter','InputObject','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaPfDataCollectorCounterSample.Tests.ps1 b/tests/Get-DbaPfDataCollectorCounterSample.Tests.ps1 index fc87d9f6f0..41999f1359 100644 --- a/tests/Get-DbaPfDataCollectorCounterSample.Tests.ps1 +++ b/tests/Get-DbaPfDataCollectorCounterSample.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 11 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaPfDataCollectorCounterSample).Parameters.Keys - $knownParameters = 'ComputerName', 'Credential', 'CollectorSet', 'Collector', 'Counter', 'Continuous', 'ListSet', 'MaxSamples', 'SampleInterval', 'InputObject', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'ComputerName','Credential','CollectorSet','Collector','Counter','Continuous','ListSet','MaxSamples','SampleInterval','InputObject','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaPfDataCollectorSet.Tests.ps1 b/tests/Get-DbaPfDataCollectorSet.Tests.ps1 index 834552d119..3a36dcaf43 100644 --- a/tests/Get-DbaPfDataCollectorSet.Tests.ps1 +++ b/tests/Get-DbaPfDataCollectorSet.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 4 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaPfDataCollectorSet).Parameters.Keys - $knownParameters = 'ComputerName', 'Credential', 'CollectorSet', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'ComputerName','Credential','CollectorSet','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaPfDataCollectorSetTemplate.Tests.ps1 b/tests/Get-DbaPfDataCollectorSetTemplate.Tests.ps1 index 8fe4162051..6593dec705 100644 --- a/tests/Get-DbaPfDataCollectorSetTemplate.Tests.ps1 +++ b/tests/Get-DbaPfDataCollectorSetTemplate.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 4 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaPfDataCollectorSetTemplate).Parameters.Keys - $knownParameters = 'Path', 'Pattern', 'Template', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'Path','Pattern','Template','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaPlanCache.Tests.ps1 b/tests/Get-DbaPlanCache.Tests.ps1 index 00b33ae17c..7e89e11232 100644 --- a/tests/Get-DbaPlanCache.Tests.ps1 +++ b/tests/Get-DbaPlanCache.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 3 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaPlanCache).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaPowerPlan.Tests.ps1 b/tests/Get-DbaPowerPlan.Tests.ps1 index 177fb3b07d..654ae76992 100644 --- a/tests/Get-DbaPowerPlan.Tests.ps1 +++ b/tests/Get-DbaPowerPlan.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 3 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaPowerPlan).Parameters.Keys - $knownParameters = 'ComputerName', 'Credential', 'EnableException' - It "Should contain our specific parameters" { - ((Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'ComputerName','Credential','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaPrivilege.Tests.ps1 b/tests/Get-DbaPrivilege.Tests.ps1 index e5a91cbb4a..a4b8af3e9b 100644 --- a/tests/Get-DbaPrivilege.Tests.ps1 +++ b/tests/Get-DbaPrivilege.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 3 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaPrivilege).Parameters.Keys - $knownParameters = 'ComputerName', 'Credential', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'ComputerName','Credential','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaProcess.Tests.ps1 b/tests/Get-DbaProcess.Tests.ps1 index 2134fd927a..13e8ce5cc0 100644 --- a/tests/Get-DbaProcess.Tests.ps1 +++ b/tests/Get-DbaProcess.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 10 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaProcess).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Spid', 'ExcludeSpid', 'Database', 'Login', 'Hostname', 'Program', 'ExcludeSystemSpids', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Spid','ExcludeSpid','Database','Login','Hostname','Program','ExcludeSystemSpids','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaProductKey.Tests.ps1 b/tests/Get-DbaProductKey.Tests.ps1 index 908fe71a3d..c44561efa0 100644 --- a/tests/Get-DbaProductKey.Tests.ps1 +++ b/tests/Get-DbaProductKey.Tests.ps1 @@ -4,20 +4,32 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaProductKey).Parameters.Keys - $knownParameters = 'ComputerName', 'SqlCredential', 'Credential', 'EnableException' - $paramCount = $knownParameters.Count - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'ComputerName','SqlCredential','Credential','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } -<# - Integration test should appear below and are custom to the command you are writing. - Read https://github.com/sqlcollaborative/dbatools/blob/development/contributing.md#tests - for more guidence. -#> \ No newline at end of file + +Describe "$commandname Integration Tests" -Tags "IntegrationTests" { + + Context "Gets ProductKey for Instances on $($env:ComputerName)" { + $results = Get-DbaProductKey -ComputerName $env:ComputerName + It "Gets results" { + $results | Should Not Be $null + } + Foreach ($row in $results) { + It "Should have Version $($row.Version)" { + $row.Version | Should not be $null + } + It "Should have Edition $($row.Edition)" { + $row.Edition | Should not be $null + } + It "Should have Key $($row.key)" { + $row.key | Should not be $null + } + } + } +} \ No newline at end of file diff --git a/tests/Get-DbaQueryExecutionTime.Tests.ps1 b/tests/Get-DbaQueryExecutionTime.Tests.ps1 index fa69313fe1..a21b24fc71 100644 --- a/tests/Get-DbaQueryExecutionTime.Tests.ps1 +++ b/tests/Get-DbaQueryExecutionTime.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 9 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaQueryExecutionTime).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Database', 'ExcludeDatabase', 'MaxResultsPerDb', 'MinExecs', 'MinExecMs', 'ExcludeSystem', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Database','ExcludeDatabase','MaxResultsPerDb','MinExecs','MinExecMs','ExcludeSystem','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaRegistryRoot.Tests.ps1 b/tests/Get-DbaRegistryRoot.Tests.ps1 index 04c4bdca31..31f0124424 100644 --- a/tests/Get-DbaRegistryRoot.Tests.ps1 +++ b/tests/Get-DbaRegistryRoot.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 3 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaRegistryRoot).Parameters.Keys - $knownParameters = 'ComputerName', 'Credential', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'ComputerName','Credential','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaRepDistributor.Tests.ps1 b/tests/Get-DbaRepDistributor.Tests.ps1 index a3490ff08b..fb273fcb20 100644 --- a/tests/Get-DbaRepDistributor.Tests.ps1 +++ b/tests/Get-DbaRepDistributor.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 3 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaRepDistributor).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaRepPublication.Tests.ps1 b/tests/Get-DbaRepPublication.Tests.ps1 index e0f7421ec0..a5c70428d2 100644 --- a/tests/Get-DbaRepPublication.Tests.ps1 +++ b/tests/Get-DbaRepPublication.Tests.ps1 @@ -4,26 +4,16 @@ Write-Host -Object "Running $PSCommandpath" -ForegroundColor Cyan . "$PSScriptRoot\..\internal\functions\Connect-SqlInstance.ps1" Describe "$commandname Unit Tests" -Tag 'UnitTests' { - - InModuleScope dbatools { - - Context "Parameter Validation" { - - [object[]]$params = (Get-ChildItem function:\Get-DbaRepPublication).Parameters.Keys - $knownParameters = 'SqlInstance', 'Database', 'SqlCredential', 'PublicationType', 'EnableException' - $paramCount = $knownParameters.Count - $defaultParamCount = $params.Count - $paramCount - - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount - } - + Context "Validate parameters" { + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance', 'Database', 'SqlCredential', 'PublicationType', 'EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } + } + InModuleScope dbatools { Context "Code Validation" { Mock Connect-ReplicationDB -MockWith { @@ -81,14 +71,6 @@ Describe "$commandname Unit Tests" -Tag 'UnitTests' { $Results.PublicationType | Should Be "Snapshot" } - It "Stops if the SqlInstance does not exist" { - - Mock Connect-SqlInstance -MockWith { Throw } - - { Get-DbaRepPublication -sqlinstance MockServerName -EnableException} | should Throw - - } - It "Stops if validate set for PublicationType is not met" { { Get-DbaRepPublication -SqlInstance MockServerName -PublicationType NotAPubType } | should Throw diff --git a/tests/Get-DbaRepServer.Tests.ps1 b/tests/Get-DbaRepServer.Tests.ps1 index 47b0afc303..a323cc8501 100644 --- a/tests/Get-DbaRepServer.Tests.ps1 +++ b/tests/Get-DbaRepServer.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 3 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaRepServer).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaResourceGovernor.Tests.ps1 b/tests/Get-DbaResourceGovernor.Tests.ps1 index a1671a33ba..a323cc8501 100644 --- a/tests/Get-DbaResourceGovernor.Tests.ps1 +++ b/tests/Get-DbaResourceGovernor.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 3 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaResourceGovernor).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaRgClassifierFunction.Tests.ps1 b/tests/Get-DbaRgClassifierFunction.Tests.ps1 index 46b70e4273..7e07203e79 100644 --- a/tests/Get-DbaRgClassifierFunction.Tests.ps1 +++ b/tests/Get-DbaRgClassifierFunction.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 4 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaRgClassifierFunction).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'InputObject', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','InputObject','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaRgResourcePool.Tests.ps1 b/tests/Get-DbaRgResourcePool.Tests.ps1 index 756c4c757c..5f1480eed8 100644 --- a/tests/Get-DbaRgResourcePool.Tests.ps1 +++ b/tests/Get-DbaRgResourcePool.Tests.ps1 @@ -4,20 +4,26 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 5 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaRgResourcePool).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Type', 'InputObject', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Type','InputObject','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } -<# - Integration test should appear below and are custom to the command you are writing. - Read https://github.com/sqlcollaborative/dbatools/blob/development/contributing.md#tests - for more guidence. -#> \ No newline at end of file + +Describe "$CommandName Integration Tests" -Tags "IntegrationTests" { + Context "Command actually works" { + $results = Get-DbaRgResourcePool -SqlInstance $script:Instance2 + it "Gets Results" { + $results | Should Not Be $null + } + } + Context "Command actually works using -Type" { + $results = Get-DbaRgResourcePool -SqlInstance $script:Instance2 -Type Internal + it "Gets Results" { + $results | Should Not Be $null + } + } +} \ No newline at end of file diff --git a/tests/Get-DbaRgWorkloadGroup.Tests.ps1 b/tests/Get-DbaRgWorkloadGroup.Tests.ps1 index bdddb7ec51..b1a1cb7bfb 100644 --- a/tests/Get-DbaRgWorkloadGroup.Tests.ps1 +++ b/tests/Get-DbaRgWorkloadGroup.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 4 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaRgWorkloadGroup).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'InputObject', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','InputObject','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaRunningJob.Tests.ps1 b/tests/Get-DbaRunningJob.Tests.ps1 index 081d85f1b7..b1a1cb7bfb 100644 --- a/tests/Get-DbaRunningJob.Tests.ps1 +++ b/tests/Get-DbaRunningJob.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 4 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaRunningJob).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'InputObject', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','InputObject','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaSchemaChangeHistory.Tests.ps1 b/tests/Get-DbaSchemaChangeHistory.Tests.ps1 index 561256c456..9f2a34bcd6 100644 --- a/tests/Get-DbaSchemaChangeHistory.Tests.ps1 +++ b/tests/Get-DbaSchemaChangeHistory.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 7 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaSchemaChangeHistory).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Database', 'ExcludeDatabase', 'Since', 'Object', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Database','ExcludeDatabase','Since','Object','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaServerAudit.Tests.ps1 b/tests/Get-DbaServerAudit.Tests.ps1 index 8eef49eac9..68df9104e4 100644 --- a/tests/Get-DbaServerAudit.Tests.ps1 +++ b/tests/Get-DbaServerAudit.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 5 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaServerAudit).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Audit', 'ExcludeAudit', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Audit','ExcludeAudit','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaServerAuditSpecification.Tests.ps1 b/tests/Get-DbaServerAuditSpecification.Tests.ps1 index aac1c93ca0..a323cc8501 100644 --- a/tests/Get-DbaServerAuditSpecification.Tests.ps1 +++ b/tests/Get-DbaServerAuditSpecification.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 3 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaServerAuditSpecification).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaServerInstallDate.Tests.ps1 b/tests/Get-DbaServerInstallDate.Tests.ps1 index 73a8fb8316..0b12b91354 100644 --- a/tests/Get-DbaServerInstallDate.Tests.ps1 +++ b/tests/Get-DbaServerInstallDate.Tests.ps1 @@ -4,20 +4,27 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 5 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaServerInstallDate).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Credential', 'IncludeWindows', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Credential','IncludeWindows','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } -<# - Integration test should appear below and are custom to the command you are writing. - Read https://github.com/sqlcollaborative/dbatools/blob/development/contributing.md#tests - for more guidence. -#> \ No newline at end of file + +Describe "$commandname Integration Tests" -Tags "IntegrationTests" { + + Context "Gets SQL Server Install Date" { + $results = Get-DbaServerInstallDate -SqlInstance $script:instance2 + It "Gets results" { + $results | Should Not Be $null + } + } + Context "Gets SQL Server Install Date and Windows Install Date" { + $results = Get-DbaServerInstallDate -SqlInstance $script:instance2 -IncludeWindows + It "Gets results" { + $results | Should Not Be $null + } + } +} \ No newline at end of file diff --git a/tests/Get-DbaServerProtocol.Tests.ps1 b/tests/Get-DbaServerProtocol.Tests.ps1 index 485a689fbd..91a4b24133 100644 --- a/tests/Get-DbaServerProtocol.Tests.ps1 +++ b/tests/Get-DbaServerProtocol.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 3 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaServerProtocol).Parameters.Keys - $knownParameters = 'ComputerName', 'Credential', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'ComputerName','Credential','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaServerRole.Tests.ps1 b/tests/Get-DbaServerRole.Tests.ps1 index c8f3f0ab66..34df377ce3 100644 --- a/tests/Get-DbaServerRole.Tests.ps1 +++ b/tests/Get-DbaServerRole.Tests.ps1 @@ -10,40 +10,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan #> Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - <# - The $paramCount is adjusted based on the parameters your command will have. - - The $defaultParamCount is adjusted based on what type of command you are writing the test for: - - Commands that *do not* include SupportShouldProcess, set defaultParamCount = 11 - - Commands that *do* include SupportShouldProcess, set defaultParamCount = 13 - #> - $paramCount = 6 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaServerRole).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'EnableException', 'ServerRole', 'ExcludeServerRole', 'ExcludeFixedRole' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount - } - } - Context "Input validation" { - BeforeAll { - Mock Stop-Function { } -ModuleName dbatools - } - It "Should Call Stop-Function if instance does not exist or connection failure" { - Set-DbatoolsConfig -FullName sql.connection.timeout -Value 1 - Get-DbaServerRole -SqlInstance Dummy | Should Be - } - It "Validates that Stop Function Mock has been called" { - $assertMockParams = @{ - 'CommandName' = 'Stop-Function' - 'Times' = 1 - 'Exactly' = $true - 'Module' = 'dbatools' - } - Assert-MockCalled @assertMockParams + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance', 'SqlCredential', 'ServerRole', 'ExcludeServerRole', 'ExcludeFixedRole', 'EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaServerRoleMember.Tests.ps1 b/tests/Get-DbaServerRoleMember.Tests.ps1 index c21544165e..519aec24c3 100644 --- a/tests/Get-DbaServerRoleMember.Tests.ps1 +++ b/tests/Get-DbaServerRoleMember.Tests.ps1 @@ -4,18 +4,11 @@ Write-Host -Object "Running $PSCommandpath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tags "UnitTests" { Context "Validate parameters" { - $defaultParamCount = 11 - $command = Get-Command -Name $CommandName - [object[]]$params = $command.Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'EnableException', 'ExcludeFixedRole', 'ServerRole', 'ExcludeServerRole', 'Login' - $paramCount = $knownParameters.Count - - It "Should contain our specific parameters" { - ((Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count) | Should Be $paramCount - } - - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','ServerRole','ExcludeServerRole','Login','ExcludeFixedRole','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaServerTrigger.Tests.ps1 b/tests/Get-DbaServerTrigger.Tests.ps1 index 1d55767002..a323cc8501 100644 --- a/tests/Get-DbaServerTrigger.Tests.ps1 +++ b/tests/Get-DbaServerTrigger.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 3 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaServerTrigger).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaService.Tests.ps1 b/tests/Get-DbaService.Tests.ps1 index f349029b38..2e0971b622 100644 --- a/tests/Get-DbaService.Tests.ps1 +++ b/tests/Get-DbaService.Tests.ps1 @@ -5,21 +5,11 @@ Write-Host -Object "Running $PSCommandpath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $knownParameters = 'ComputerName', 'InstanceName', 'Credential', 'Type', 'ServiceName', 'AdvancedProperties', 'EnableException' - $paramCount = $knownParameters.Count - $SupportShouldProcess = $false - if ($SupportShouldProcess) { - $defaultParamCount = 13 - } else { - $defaultParamCount = 11 - } - [object[]]$params = (Get-ChildItem function:\Get-DbaService).Parameters.Keys - - it "Should contain our specific parameters" { - ((Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count) | Should Be $paramCount - } - it "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'ComputerName','InstanceName','Credential','Type','ServiceName','AdvancedProperties','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } diff --git a/tests/Get-DbaSpConfigure.Tests.ps1 b/tests/Get-DbaSpConfigure.Tests.ps1 index 7e3430a356..a0ddf3db5b 100644 --- a/tests/Get-DbaSpConfigure.Tests.ps1 +++ b/tests/Get-DbaSpConfigure.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandpath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 5 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaSpConfigure).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Name', 'ExcludeName', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Name','ExcludeName','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaSpinLockStatistic.Tests.ps1 b/tests/Get-DbaSpinLockStatistic.Tests.ps1 index 938d4a80f1..86f8752c3a 100644 --- a/tests/Get-DbaSpinLockStatistic.Tests.ps1 +++ b/tests/Get-DbaSpinLockStatistic.Tests.ps1 @@ -4,23 +4,11 @@ Write-Host -Object "Running $PSCommandpath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tags "UnitTests" { Context "Validate parameters" { - $knownParameters = 'SqlInstance', 'SqlCredential', 'EnableException' - $paramCount = $knownParameters.Count - $SupportShouldProcess = $false - if ($SupportShouldProcess) { - $defaultParamCount = 13 - } else { - $defaultParamCount = 11 - } - $command = Get-Command -Name $CommandName - [object[]]$params = $command.Parameters.Keys - - It "Should contain our specific parameters" { - ((Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count) | Should Be $paramCount - } - - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaSpn.Tests.ps1 b/tests/Get-DbaSpn.Tests.ps1 index 6955490218..40cb1feb62 100644 --- a/tests/Get-DbaSpn.Tests.ps1 +++ b/tests/Get-DbaSpn.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 4 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaSpn).Parameters.Keys - $knownParameters = 'ComputerName', 'AccountName', 'Credential', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'ComputerName','AccountName','Credential','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaSsisEnvironmentVariable.Tests.ps1 b/tests/Get-DbaSsisEnvironmentVariable.Tests.ps1 index 445d34c366..1be6117f03 100644 --- a/tests/Get-DbaSsisEnvironmentVariable.Tests.ps1 +++ b/tests/Get-DbaSsisEnvironmentVariable.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 7 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaSsisEnvironmentVariable).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Environment', 'EnvironmentExclude', 'Folder', 'FolderExclude', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Environment','EnvironmentExclude','Folder','FolderExclude','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaSsisExecutionHistory.Tests.ps1 b/tests/Get-DbaSsisExecutionHistory.Tests.ps1 index 1720d33dcc..c4e319bc18 100644 --- a/tests/Get-DbaSsisExecutionHistory.Tests.ps1 +++ b/tests/Get-DbaSsisExecutionHistory.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 8 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaSsisExecutionHistory).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Since', 'Status', 'Project', 'Folder', 'Environment', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Since','Status','Project','Folder','Environment','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaStartupParameter.Tests.ps1 b/tests/Get-DbaStartupParameter.Tests.ps1 index 3873ff85bb..b6533ca12e 100644 --- a/tests/Get-DbaStartupParameter.Tests.ps1 +++ b/tests/Get-DbaStartupParameter.Tests.ps1 @@ -4,20 +4,20 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 4 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaStartupParameter).Parameters.Keys - $knownParameters = 'SqlInstance', 'Credential', 'Simple', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','Credential','Simple','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } -<# - Integration test should appear below and are custom to the command you are writing. - Read https://github.com/sqlcollaborative/dbatools/blob/development/contributing.md#tests - for more guidence. -#> \ No newline at end of file + +Describe "$CommandName Integration Tests" -Tags "IntegrationTests" { + Context "Command actually works" { + $results = Get-DbaStartupParameter -SqlInstance $script:Instance2 + it "Gets Results" { + $results | Should Not Be $null + } + } +} \ No newline at end of file diff --git a/tests/Get-DbaSuspectPage.Tests.ps1 b/tests/Get-DbaSuspectPage.Tests.ps1 index 14b91b45f2..87f52d123d 100644 --- a/tests/Get-DbaSuspectPage.Tests.ps1 +++ b/tests/Get-DbaSuspectPage.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 4 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaSuspectPage).Parameters.Keys - $knownParameters = 'SqlInstance', 'Database', 'SqlCredential', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','Database','SqlCredential','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaTcpPort.Tests.ps1 b/tests/Get-DbaTcpPort.Tests.ps1 index 1705e7cd68..0b01b2e093 100644 --- a/tests/Get-DbaTcpPort.Tests.ps1 +++ b/tests/Get-DbaTcpPort.Tests.ps1 @@ -4,22 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - <# - The $paramCount is adjusted based on the parameters your command will have. - - The $defaultParamCount is adjusted based on what type of command you are writing the test for: - - Commands that *do not* include SupportShouldProcess, set defaultParamCount = 11 - - Commands that *do* include SupportShouldProcess, set defaultParamCount = 13 - #> - $paramCount = 6 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaTcpPort).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'All', 'ExcludeIpv6', 'EnableException', 'Detailed' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Detailed','All','ExcludeIpv6','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaTempdbUsage.Tests.ps1 b/tests/Get-DbaTempdbUsage.Tests.ps1 index 87fb48b1d4..a323cc8501 100644 --- a/tests/Get-DbaTempdbUsage.Tests.ps1 +++ b/tests/Get-DbaTempdbUsage.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 3 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaTempdbUsage).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaTopResourceUsage.Tests.ps1 b/tests/Get-DbaTopResourceUsage.Tests.ps1 index dcc99f215b..b530603dbd 100644 --- a/tests/Get-DbaTopResourceUsage.Tests.ps1 +++ b/tests/Get-DbaTopResourceUsage.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 8 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaTopResourceUsage).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Database', 'ExcludeDatabase', 'Type', 'Limit', 'EnableException', 'ExcludeSystem' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Database','ExcludeDatabase','Type','Limit','EnableException','ExcludeSystem' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaTrace.Tests.ps1 b/tests/Get-DbaTrace.Tests.ps1 index 8e3cc3a831..e675bda4dc 100644 --- a/tests/Get-DbaTrace.Tests.ps1 +++ b/tests/Get-DbaTrace.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 5 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaTrace).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Id', 'Default', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Id','Default','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaTraceFlag.Tests.ps1 b/tests/Get-DbaTraceFlag.Tests.ps1 index 313c605f06..cd7f627a44 100644 --- a/tests/Get-DbaTraceFlag.Tests.ps1 +++ b/tests/Get-DbaTraceFlag.Tests.ps1 @@ -4,19 +4,14 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 4 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaTraceFlag).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'TraceFlag', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','TraceFlag','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } - Describe "$CommandName Integration Tests" -Tags "IntegrationTests" { Context "Verifying TraceFlag output" { BeforeAll { diff --git a/tests/Get-DbaUpTime.Tests.ps1 b/tests/Get-DbaUpTime.Tests.ps1 index da78af0ce2..3d96bb9bd3 100644 --- a/tests/Get-DbaUpTime.Tests.ps1 +++ b/tests/Get-DbaUpTime.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 4 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaUptime).Parameters.Keys - $knownParameters = 'Computer', 'SqlInstance', 'SqlCredential', 'Credential', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Credential','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaUserPermission.Tests.ps1 b/tests/Get-DbaUserPermission.Tests.ps1 index feacd3964e..2596f5b952 100644 --- a/tests/Get-DbaUserPermission.Tests.ps1 +++ b/tests/Get-DbaUserPermission.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 8 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaUserPermission).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Database', 'ExcludeDatabase', 'ExcludeSystemDatabase', 'IncludePublicGuest', 'IncludeSystemObjects', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Database','ExcludeDatabase','ExcludeSystemDatabase','IncludePublicGuest','IncludeSystemObjects','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaWaitResource.Tests.ps1 b/tests/Get-DbaWaitResource.Tests.ps1 index c515986768..68a6821aeb 100644 --- a/tests/Get-DbaWaitResource.Tests.ps1 +++ b/tests/Get-DbaWaitResource.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 5 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaWaitResource).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'WaitResource', 'Row', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','WaitResource','Row','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaWaitStatistic.Tests.ps1 b/tests/Get-DbaWaitStatistic.Tests.ps1 index 1c27eaad72..c9e22c509e 100644 --- a/tests/Get-DbaWaitStatistic.Tests.ps1 +++ b/tests/Get-DbaWaitStatistic.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 5 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaWaitStatistic).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Threshold', 'IncludeIgnorable', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Threshold','IncludeIgnorable','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaWaitingTask.Tests.ps1 b/tests/Get-DbaWaitingTask.Tests.ps1 index df8f9c2472..2177a66082 100644 --- a/tests/Get-DbaWaitingTask.Tests.ps1 +++ b/tests/Get-DbaWaitingTask.Tests.ps1 @@ -10,16 +10,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan #> Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - - $paramCount = 5 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaWaitingTask).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'EnableException', 'Spid', 'IncludeSystemSpid' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Spid','IncludeSystemSpid','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaWindowsLog.Tests.ps1 b/tests/Get-DbaWindowsLog.Tests.ps1 index 0e22ef98d4..616438548d 100644 --- a/tests/Get-DbaWindowsLog.Tests.ps1 +++ b/tests/Get-DbaWindowsLog.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 7 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaWindowsLog).Parameters.Keys - $knownParameters = 'SqlInstance', 'Start', 'End', 'Credential', 'MaxThreads', 'MaxRemoteThreads', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','Start','End','Credential','MaxThreads','MaxRemoteThreads','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaWsfcAvailableDisk.Tests.ps1 b/tests/Get-DbaWsfcAvailableDisk.Tests.ps1 index da493e5b98..37a09c7680 100644 --- a/tests/Get-DbaWsfcAvailableDisk.Tests.ps1 +++ b/tests/Get-DbaWsfcAvailableDisk.Tests.ps1 @@ -4,24 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - <# - The $paramCount is adjusted based on the parameters your command will have. - - The $defaultParamCount is adjusted based on what type of command you are writing the test for: - - Commands that *do not* include SupportShouldProcess, set defaultParamCount = 11 - - Commands that *do* include SupportShouldProcess, set defaultParamCount = 13 - #> - $defaultParamCount = 11 - - $knownParameters = 'ComputerName', 'Credential', 'EnableException' - $paramCount = $knownParameters.Count - - [object[]]$params = (Get-ChildItem function:\Get-DbaWsfcAvailableDisk).Parameters.Keys - It "Should contain our specific parameters" { - ((Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'ComputerName','Credential','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } \ No newline at end of file diff --git a/tests/Get-DbaWsfcCluster.Tests.ps1 b/tests/Get-DbaWsfcCluster.Tests.ps1 index 4263846857..37a09c7680 100644 --- a/tests/Get-DbaWsfcCluster.Tests.ps1 +++ b/tests/Get-DbaWsfcCluster.Tests.ps1 @@ -4,24 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - <# - The $paramCount is adjusted based on the parameters your command will have. - - The $defaultParamCount is adjusted based on what type of command you are writing the test for: - - Commands that *do not* include SupportShouldProcess, set defaultParamCount = 11 - - Commands that *do* include SupportShouldProcess, set defaultParamCount = 13 - #> - $defaultParamCount = 11 - - $knownParameters = 'ComputerName', 'Credential', 'EnableException' - $paramCount = $knownParameters.Count - - [object[]]$params = (Get-ChildItem function:\Get-DbaWsfcCluster).Parameters.Keys - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'ComputerName','Credential','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } \ No newline at end of file diff --git a/tests/Get-DbaWsfcDisk.Tests.ps1 b/tests/Get-DbaWsfcDisk.Tests.ps1 index 96a143fe61..37a09c7680 100644 --- a/tests/Get-DbaWsfcDisk.Tests.ps1 +++ b/tests/Get-DbaWsfcDisk.Tests.ps1 @@ -4,24 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - <# - The $paramCount is adjusted based on the parameters your command will have. - - The $defaultParamCount is adjusted based on what type of command you are writing the test for: - - Commands that *do not* include SupportShouldProcess, set defaultParamCount = 11 - - Commands that *do* include SupportShouldProcess, set defaultParamCount = 13 - #> - $defaultParamCount = 11 - - $knownParameters = 'ComputerName', 'Credential', 'EnableException' - $paramCount = $knownParameters.Count - - [object[]]$params = (Get-ChildItem function:\Get-DbaWsfcDisk).Parameters.Keys - It "Should contain our specific parameters" { - ((Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'ComputerName','Credential','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } \ No newline at end of file diff --git a/tests/Get-DbaWsfcNetwork.Tests.ps1 b/tests/Get-DbaWsfcNetwork.Tests.ps1 index 41b16b33cf..37a09c7680 100644 --- a/tests/Get-DbaWsfcNetwork.Tests.ps1 +++ b/tests/Get-DbaWsfcNetwork.Tests.ps1 @@ -4,24 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - <# - The $paramCount is adjusted based on the parameters your command will have. - - The $defaultParamCount is adjusted based on what type of command you are writing the test for: - - Commands that *do not* include SupportShouldProcess, set defaultParamCount = 11 - - Commands that *do* include SupportShouldProcess, set defaultParamCount = 13 - #> - $defaultParamCount = 11 - - $knownParameters = 'ComputerName', 'Credential', 'EnableException' - $paramCount = $knownParameters.Count - - [object[]]$params = (Get-ChildItem function:\Get-DbaWsfcNetwork).Parameters.Keys - It "Should contain our specific parameters" { - ((Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'ComputerName','Credential','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } \ No newline at end of file diff --git a/tests/Get-DbaWsfcNetworkInterface.Tests.ps1 b/tests/Get-DbaWsfcNetworkInterface.Tests.ps1 index 40737756d0..37a09c7680 100644 --- a/tests/Get-DbaWsfcNetworkInterface.Tests.ps1 +++ b/tests/Get-DbaWsfcNetworkInterface.Tests.ps1 @@ -4,24 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - <# - The $paramCount is adjusted based on the parameters your command will have. - - The $defaultParamCount is adjusted based on what type of command you are writing the test for: - - Commands that *do not* include SupportShouldProcess, set defaultParamCount = 11 - - Commands that *do* include SupportShouldProcess, set defaultParamCount = 13 - #> - $defaultParamCount = 11 - - $knownParameters = 'ComputerName', 'Credential', 'EnableException' - $paramCount = $knownParameters.Count - - [object[]]$params = (Get-ChildItem function:\Get-DbaWsfcNetworkInterface).Parameters.Keys - It "Should contain our specific parameters" { - ((Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'ComputerName','Credential','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } \ No newline at end of file diff --git a/tests/Get-DbaWsfcNode.Tests.ps1 b/tests/Get-DbaWsfcNode.Tests.ps1 index 3334dfe369..37a09c7680 100644 --- a/tests/Get-DbaWsfcNode.Tests.ps1 +++ b/tests/Get-DbaWsfcNode.Tests.ps1 @@ -4,24 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - <# - The $paramCount is adjusted based on the parameters your command will have. - - The $defaultParamCount is adjusted based on what type of command you are writing the test for: - - Commands that *do not* include SupportShouldProcess, set defaultParamCount = 11 - - Commands that *do* include SupportShouldProcess, set defaultParamCount = 13 - #> - $defaultParamCount = 11 - - $knownParameters = 'ComputerName', 'Credential', 'EnableException' - $paramCount = $knownParameters.Count - - [object[]]$params = (Get-ChildItem function:\Get-DbaWsfcNode).Parameters.Keys - It "Should contain our specific parameters" { - ((Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'ComputerName','Credential','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } \ No newline at end of file diff --git a/tests/Get-DbaWsfcResource.Tests.ps1 b/tests/Get-DbaWsfcResource.Tests.ps1 index ff96ed0a3f..37a09c7680 100644 --- a/tests/Get-DbaWsfcResource.Tests.ps1 +++ b/tests/Get-DbaWsfcResource.Tests.ps1 @@ -4,24 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - <# - The $paramCount is adjusted based on the parameters your command will have. - - The $defaultParamCount is adjusted based on what type of command you are writing the test for: - - Commands that *do not* include SupportShouldProcess, set defaultParamCount = 11 - - Commands that *do* include SupportShouldProcess, set defaultParamCount = 13 - #> - $defaultParamCount = 11 - - $knownParameters = 'ComputerName', 'Credential', 'EnableException' - $paramCount = $knownParameters.Count - - [object[]]$params = (Get-ChildItem function:\Get-DbaWsfcResource).Parameters.Keys - It "Should contain our specific parameters" { - ((Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'ComputerName','Credential','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } \ No newline at end of file diff --git a/tests/Get-DbaWsfcResourceType.Tests.ps1 b/tests/Get-DbaWsfcResourceType.Tests.ps1 index bfd394869b..37a09c7680 100644 --- a/tests/Get-DbaWsfcResourceType.Tests.ps1 +++ b/tests/Get-DbaWsfcResourceType.Tests.ps1 @@ -4,24 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - <# - The $paramCount is adjusted based on the parameters your command will have. - - The $defaultParamCount is adjusted based on what type of command you are writing the test for: - - Commands that *do not* include SupportShouldProcess, set defaultParamCount = 11 - - Commands that *do* include SupportShouldProcess, set defaultParamCount = 13 - #> - $defaultParamCount = 11 - - $knownParameters = 'ComputerName', 'Credential', 'EnableException' - $paramCount = $knownParameters.Count - - [object[]]$params = (Get-ChildItem function:\Get-DbaWsfcResourceType).Parameters.Keys - It "Should contain our specific parameters" { - ((Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'ComputerName','Credential','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } \ No newline at end of file diff --git a/tests/Get-DbaWsfcRole.Tests.ps1 b/tests/Get-DbaWsfcRole.Tests.ps1 index e575168263..37a09c7680 100644 --- a/tests/Get-DbaWsfcRole.Tests.ps1 +++ b/tests/Get-DbaWsfcRole.Tests.ps1 @@ -4,24 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - <# - The $paramCount is adjusted based on the parameters your command will have. - - The $defaultParamCount is adjusted based on what type of command you are writing the test for: - - Commands that *do not* include SupportShouldProcess, set defaultParamCount = 11 - - Commands that *do* include SupportShouldProcess, set defaultParamCount = 13 - #> - $defaultParamCount = 11 - - $knownParameters = 'ComputerName', 'Credential', 'EnableException' - $paramCount = $knownParameters.Count - - [object[]]$params = (Get-ChildItem function:\Get-DbaWsfcRole).Parameters.Keys - It "Should contain our specific parameters" { - ((Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'ComputerName','Credential','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } \ No newline at end of file diff --git a/tests/Get-DbaWsfcSharedVolume.Tests.ps1 b/tests/Get-DbaWsfcSharedVolume.Tests.ps1 index 8c4cb91ae6..37a09c7680 100644 --- a/tests/Get-DbaWsfcSharedVolume.Tests.ps1 +++ b/tests/Get-DbaWsfcSharedVolume.Tests.ps1 @@ -4,24 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - <# - The $paramCount is adjusted based on the parameters your command will have. - - The $defaultParamCount is adjusted based on what type of command you are writing the test for: - - Commands that *do not* include SupportShouldProcess, set defaultParamCount = 11 - - Commands that *do* include SupportShouldProcess, set defaultParamCount = 13 - #> - $defaultParamCount = 11 - - $knownParameters = 'ComputerName', 'Credential', 'EnableException' - $paramCount = $knownParameters.Count - - [object[]]$params = (Get-ChildItem function:\Get-DbaWsfcSharedVolume).Parameters.Keys - It "Should contain our specific parameters" { - ((Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'ComputerName','Credential','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } \ No newline at end of file diff --git a/tests/Get-DbaXEObject.Tests.ps1 b/tests/Get-DbaXEObject.Tests.ps1 index 896ee875f7..5a614559dd 100644 --- a/tests/Get-DbaXEObject.Tests.ps1 +++ b/tests/Get-DbaXEObject.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 4 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaXEObject).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Type', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Type','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaXESession.Tests.ps1 b/tests/Get-DbaXESession.Tests.ps1 index d0f39c79e2..08d398a7b7 100644 --- a/tests/Get-DbaXESession.Tests.ps1 +++ b/tests/Get-DbaXESession.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 4 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaXESession).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Session', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Session','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaXESessionTarget.Tests.ps1 b/tests/Get-DbaXESessionTarget.Tests.ps1 index 108a6e99bd..9b8814e003 100644 --- a/tests/Get-DbaXESessionTarget.Tests.ps1 +++ b/tests/Get-DbaXESessionTarget.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 6 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaXESessionTarget).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Session', 'Target', 'InputObject', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Session','Target','InputObject','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaXESessionTemplate.Tests.ps1 b/tests/Get-DbaXESessionTemplate.Tests.ps1 index fc5d80be6b..dcc2c47764 100644 --- a/tests/Get-DbaXESessionTemplate.Tests.ps1 +++ b/tests/Get-DbaXESessionTemplate.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 4 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaXESessionTemplate).Parameters.Keys - $knownParameters = 'Path', 'Pattern', 'Template', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'Path','Pattern','Template','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaXESmartTarget.Tests.ps1 b/tests/Get-DbaXESmartTarget.Tests.ps1 index 5011504816..4ee0be1275 100644 --- a/tests/Get-DbaXESmartTarget.Tests.ps1 +++ b/tests/Get-DbaXESmartTarget.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 1 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaXESmartTarget).Parameters.Keys - $knownParameters = 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==" | Measure-Object ).Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbaXEStore.Tests.ps1 b/tests/Get-DbaXEStore.Tests.ps1 index b544f658b1..a323cc8501 100644 --- a/tests/Get-DbaXEStore.Tests.ps1 +++ b/tests/Get-DbaXEStore.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 3 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbaXEStore).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbatoolsConfig.Tests.ps1 b/tests/Get-DbatoolsConfig.Tests.ps1 index cd4c0bc171..93d39ef21a 100644 --- a/tests/Get-DbatoolsConfig.Tests.ps1 +++ b/tests/Get-DbatoolsConfig.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 4 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbatoolsConfig).Parameters.Keys - $knownParameters = 'FullName', 'Name', 'Module', 'Force' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'FullName','Name','Module','Force' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbatoolsConfigValue.Tests.ps1 b/tests/Get-DbatoolsConfigValue.Tests.ps1 index 9fab6e2971..08af9875cd 100644 --- a/tests/Get-DbatoolsConfigValue.Tests.ps1 +++ b/tests/Get-DbatoolsConfigValue.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 3 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbatoolsConfigValue).Parameters.Keys - $knownParameters = 'FullName', 'Fallback', 'NotNull' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'FullName','Fallback','NotNull' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DbatoolsLog.Tests.ps1 b/tests/Get-DbatoolsLog.Tests.ps1 index 45a48a73e1..6257756818 100644 --- a/tests/Get-DbatoolsLog.Tests.ps1 +++ b/tests/Get-DbatoolsLog.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 10 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DbatoolsLog).Parameters.Keys - $knownParameters = 'FunctionName', 'ModuleName', 'Target', 'Tag', 'Last', 'Skip', 'Runspace', 'Level', 'Errors', 'Raw' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'FunctionName','ModuleName','Target','Tag','Last','Skip','Runspace','Level','Raw','Errors' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Get-DirectoryRestoreFile.Tests.ps1 b/tests/Get-DirectoryRestoreFile.Tests.ps1 index 8705bcfe9b..e2c94c14fc 100644 --- a/tests/Get-DirectoryRestoreFile.Tests.ps1 +++ b/tests/Get-DirectoryRestoreFile.Tests.ps1 @@ -5,19 +5,17 @@ Write-Host -Object "Running $PSCommandpath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 3 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Get-DirectoryRestoreFile).Parameters.Keys - $knownParameters = 'Path', 'Recurse', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'Path', 'Recurse', 'EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } +} - Context "Test Path handling" { +Describe "$CommandName Integration Tests" -Tag 'IntegrationTests' { + Context "Test Path handling" { It "Should throw on an invalid Path" { { Get-DirectoryRestoreFile -Path TestDrive:\foo\bar\does\not\exist\ -EnableException } | Should Throw } diff --git a/tests/Grant-DbaAgPermission.Tests.p1.ps1 b/tests/Grant-DbaAgPermission.Tests.ps1 similarity index 59% rename from tests/Grant-DbaAgPermission.Tests.p1.ps1 rename to tests/Grant-DbaAgPermission.Tests.ps1 index d9ac7f012a..b0c1b57e23 100644 --- a/tests/Grant-DbaAgPermission.Tests.p1.ps1 +++ b/tests/Grant-DbaAgPermission.Tests.ps1 @@ -4,19 +4,11 @@ Write-Host -Object "Running $PSCommandpath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - <# - Get commands, Default count = 11 - Commands with SupportShouldProcess = 13 - #> - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Grant-DbaAgPermission).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Login', 'AvailabilityGroup', 'Type', 'Permission', 'InputObject', 'EnableException' - $paramCount = $knownParameters.Count - It "Should contain our specific parameters" { - ((Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Login','AvailabilityGroup','Type','Permission','InputObject','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Import-DbaCmsRegServer.Tests.ps1 b/tests/Import-DbaCmsRegServer.Tests.ps1 index 3646b218b9..8efad6304f 100644 --- a/tests/Import-DbaCmsRegServer.Tests.ps1 +++ b/tests/Import-DbaCmsRegServer.Tests.ps1 @@ -4,23 +4,11 @@ Write-Host -Object "Running $PSCommandpath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tags "UnitTests" { Context "Validate parameters" { - $knownParameters = 'SqlInstance', 'SqlCredential', 'Path', 'InputObject', 'Group', 'EnableException' - $SupportShouldProcess = $false - $paramCount = $knownParameters.Count - if ($SupportShouldProcess) { - $defaultParamCount = 13 - } else { - $defaultParamCount = 11 - } - $command = Get-Command -Name $CommandName - [object[]]$params = $command.Parameters.Keys - - It "Should contain our specific parameters" { - ((Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count) | Should Be $paramCount - } - - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Path','InputObject','Group','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Import-DbaCsv.Tests.ps1 b/tests/Import-DbaCsv.Tests.ps1 index b8fc0ff70a..24c92dcd9d 100644 --- a/tests/Import-DbaCsv.Tests.ps1 +++ b/tests/Import-DbaCsv.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Import-DbaCsv).Parameters.Keys - $knownParameters = 'Path', 'SqlInstance', 'SqlCredential', 'ColumnMap', 'Database', 'Table', 'Column', 'Schema', 'Truncate', 'Delimiter', 'SingleColumn', 'NoHeaderRow', 'BatchSize', 'NotifyAfter', 'TableLock', 'CheckConstraints', 'FireTriggers', 'KeepIdentity', 'KeepNulls', 'AutoCreateTable', 'NoProgress', 'EnableException' - $paramCount = $knownParameters.Count - It "Should contain our specific parameters" { - ((Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'Path', 'SqlInstance', 'SqlCredential', 'Database', 'Table', 'Schema', 'Truncate', 'Delimiter', 'SingleColumn', 'BatchSize', 'NotifyAfter', 'TableLock', 'CheckConstraints', 'FireTriggers', 'KeepIdentity', 'KeepNulls', 'Column', 'ColumnMap', 'AutoCreateTable', 'NoProgress', 'NoHeaderRow', 'Quote', 'Escape', 'Comment', 'TrimmingOption', 'BufferSize', 'ParseErrorAction', 'Encoding', 'NullValue', 'Threshold', 'MaxQuotedFieldLength', 'SkipEmptyLine', 'SupportsMultiline', 'UseColumnDefault', 'EnableException', 'NoTransaction' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } @@ -57,6 +53,13 @@ Describe "$CommandName Integration Tests" -Tag "IntegrationTests" { $result.Database | Should -Be tempdb $result.Table | Should -Be SuperSmall } + + $result = Import-DbaCsv -Path $path -SqlInstance $script:instance1 -Database tempdb -Delimiter `t -Table SuperSmall -Truncate -NoTransaction + It "works with NoTransaction" { + $result.RowsCopied | Should -Be 999 + $result.Database | Should -Be tempdb + $result.Table | Should -Be SuperSmall + } } } } \ No newline at end of file diff --git a/tests/Import-DbaPfDataCollectorSetTemplate.Tests.ps1 b/tests/Import-DbaPfDataCollectorSetTemplate.Tests.ps1 index 30c178cc4b..29136d60ea 100644 --- a/tests/Import-DbaPfDataCollectorSetTemplate.Tests.ps1 +++ b/tests/Import-DbaPfDataCollectorSetTemplate.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 20 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Import-DbaPfDataCollectorSetTemplate).Parameters.Keys - $knownParameters = 'ComputerName', 'Credential', 'DisplayName', 'SchedulesEnabled', 'RootPath', 'Segment', 'SegmentMaxDuration', 'SegmentMaxSize', 'Subdirectory', 'SubdirectoryFormat', 'SubdirectoryFormatPattern', 'Task', 'TaskRunAsSelf', 'TaskArguments', 'TaskUserTextArguments', 'StopOnCompletion', 'Path', 'Template', 'Instance', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'ComputerName','Credential','DisplayName','SchedulesEnabled','RootPath','Segment','SegmentMaxDuration','SegmentMaxSize','Subdirectory','SubdirectoryFormat','SubdirectoryFormatPattern','Task','TaskRunAsSelf','TaskArguments','TaskUserTextArguments','StopOnCompletion','Path','Template','Instance','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Import-DbaSpConfigure.Tests.ps1 b/tests/Import-DbaSpConfigure.Tests.ps1 index b8605d57b9..c2003d99ed 100644 --- a/tests/Import-DbaSpConfigure.Tests.ps1 +++ b/tests/Import-DbaSpConfigure.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 9 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Import-DbaSpConfigure).Parameters.Keys - $knownParameters = 'Source', 'Destination', 'SourceSqlCredential', 'DestinationSqlCredential', 'SqlInstance', 'Path', 'SqlCredential', 'Force', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'Source','Destination','SourceSqlCredential','DestinationSqlCredential','SqlInstance','Path','SqlCredential','Force','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Import-DbaXESessionTemplate.Tests.ps1 b/tests/Import-DbaXESessionTemplate.Tests.ps1 index 1dedcb4757..21a23a8e91 100644 --- a/tests/Import-DbaXESessionTemplate.Tests.ps1 +++ b/tests/Import-DbaXESessionTemplate.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 8 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Import-DbaXESessionTemplate).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Name', 'Path', 'Template', 'TargetFilePath', 'TargetFileMetadataPath', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Name','Path','Template','TargetFilePath','TargetFileMetadataPath','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Import-DbatoolsConfig.Tests.ps1 b/tests/Import-DbatoolsConfig.Tests.ps1 new file mode 100644 index 0000000000..41253efd7f --- /dev/null +++ b/tests/Import-DbatoolsConfig.Tests.ps1 @@ -0,0 +1,19 @@ +$CommandName = $MyInvocation.MyCommand.Name.Replace(".Tests.ps1", "") +Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan +. "$PSScriptRoot\constants.ps1" + +Describe "$CommandName Unit Tests" -Tag 'UnitTests' { + Context "Validate parameters" { + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'Path', 'ModuleName', 'ModuleVersion', 'Scope', 'IncludeFilter', 'ExcludeFilter', 'Peek', 'EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 + } + } +} +<# + Integration test are custom to the command you are writing for. + Read https://github.com/sqlcollaborative/dbatools/blob/development/contributing.md#tests + for more guidence +#> \ No newline at end of file diff --git a/tests/Install-DbaFirstResponderKit.Tests.ps1 b/tests/Install-DbaFirstResponderKit.Tests.ps1 index fcbb7bebe9..424c0d5ed2 100644 --- a/tests/Install-DbaFirstResponderKit.Tests.ps1 +++ b/tests/Install-DbaFirstResponderKit.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandpath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 7 - $commonParamCount = ([System.Management.Automation.PSCmdlet]::CommonParameters).Count + 2 - [object[]]$params = (Get-ChildItem function:\Install-DbaFirstResponderKit).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Branch', 'Database', 'Force', 'LocalFile', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $commonParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Branch','Database','LocalFile','Force','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Install-DbaMaintenanceSolution.Tests.ps1 b/tests/Install-DbaMaintenanceSolution.Tests.ps1 index fd0bc0dbbb..5004cf02e0 100644 --- a/tests/Install-DbaMaintenanceSolution.Tests.ps1 +++ b/tests/Install-DbaMaintenanceSolution.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 13 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Install-DbaMaintenanceSolution).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Database', 'BackupLocation', 'CleanupTime', 'OutputFileDirectory', 'ReplaceExisting', 'LogToTable', 'Solution', 'InstallJobs', 'LocalFile', 'Force', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Database','BackupLocation','CleanupTime','OutputFileDirectory','ReplaceExisting','LogToTable','Solution','InstallJobs','LocalFile','Force','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Install-DbaSqlWatch.Tests.ps1 b/tests/Install-DbaSqlWatch.Tests.ps1 index 9012cb08eb..f46e80fc21 100644 --- a/tests/Install-DbaSqlWatch.Tests.ps1 +++ b/tests/Install-DbaSqlWatch.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandpath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 6 - $commonParamCount = ([System.Management.Automation.PSCmdlet]::CommonParameters).Count + 2 - [object[]]$params = (Get-ChildItem function:\Install-DbaSqlWatch).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Database', 'Force', 'LocalFile', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $commonParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Database','LocalFile','Force','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Install-DbaWatchUpdate.Tests.ps1 b/tests/Install-DbaWatchUpdate.Tests.ps1 index 41bceee52a..9772fe3a3b 100644 --- a/tests/Install-DbaWatchUpdate.Tests.ps1 +++ b/tests/Install-DbaWatchUpdate.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 2 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Install-DbaWatchUpdate).Parameters.Keys - $knownParameters = 'TaskName', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'TaskName','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Install-DbaWhoIsActive.Tests.ps1 b/tests/Install-DbaWhoIsActive.Tests.ps1 index 2b14c3bccf..a00ab9c773 100644 --- a/tests/Install-DbaWhoIsActive.Tests.ps1 +++ b/tests/Install-DbaWhoIsActive.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 6 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Install-DbaWhoIsActive).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'LocalFile', 'Database', 'EnableException', 'Force' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','LocalFile','Database','EnableException','Force' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Invoke-DbaAdvancedRestore.Tests.ps1 b/tests/Invoke-DbaAdvancedRestore.Tests.ps1 index 324cb38500..7d6e2c2fbc 100644 --- a/tests/Invoke-DbaAdvancedRestore.Tests.ps1 +++ b/tests/Invoke-DbaAdvancedRestore.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 17 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Invoke-DbaAdvancedRestore).Parameters.Keys - $knownParameters = 'BackupHistory', 'SqlInstance', 'SqlCredential', 'OutputScriptOnly', 'VerifyOnly', 'RestoreTime', 'StandbyDirectory', 'NoRecovery', 'MaxTransferSize', 'BlockSize', 'BufferCount', 'Continue', 'AzureCredential', 'WithReplace', 'KeepCDC', 'PageRestore', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'BackupHistory','SqlInstance','SqlCredential','OutputScriptOnly','VerifyOnly','RestoreTime','StandbyDirectory','NoRecovery','MaxTransferSize','BlockSize','BufferCount','Continue','AzureCredential','WithReplace','KeepCDC','PageRestore','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Invoke-DbaAdvancedUpdate.Tests.ps1 b/tests/Invoke-DbaAdvancedUpdate.Tests.ps1 new file mode 100644 index 0000000000..ad1ae4a1d5 --- /dev/null +++ b/tests/Invoke-DbaAdvancedUpdate.Tests.ps1 @@ -0,0 +1,177 @@ +$CommandName = $MyInvocation.MyCommand.Name.Replace(".Tests.ps1", "") +Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan +. "$PSScriptRoot\constants.ps1" + +$exeDir = "C:\Temp\dbatools_$CommandName" + +Describe "$CommandName Unit Tests" -Tag 'UnitTests' { + BeforeAll { + # Prevent the functions from executing dangerous stuff and getting right responses where needed + Mock -CommandName Invoke-Program -MockWith { [pscustomobject]@{ Successful = $true; ExitCode = [uint32[]]3010 } } -ModuleName dbatools + Mock -CommandName Test-PendingReboot -MockWith { $false } -ModuleName dbatools + Mock -CommandName Test-ElevationRequirement -MockWith { $null } -ModuleName dbatools + Mock -CommandName Restart-Computer -MockWith { $null } -ModuleName dbatools + Mock -CommandName Register-RemoteSessionConfiguration -ModuleName dbatools -MockWith { + [pscustomobject]@{ 'Name' = 'dbatoolsInstallSqlServerUpdate' ; Successful = $true ; Status = 'Dummy' } + } + Mock -CommandName Unregister-RemoteSessionConfiguration -ModuleName dbatools -MockWith { + [pscustomobject]@{ 'Name' = 'dbatoolsInstallSqlServerUpdate' ; Successful = $true ; Status = 'Dummy' } + } + Mock -CommandName Get-DbaDiskSpace -MockWith { [pscustomobject]@{ Name = 'C:\'; Free = 1 } } -ModuleName dbatools + } + BeforeEach { + $singleAction = [pscustomobject]@{ + ComputerName = $env:COMPUTERNAME + MajorVersion = "2017" + Build = "14.0.3038" + Architecture = 'x64' + TargetVersion = [pscustomobject]@{ + "SqlInstance" = $null + "Build" = "14.0.3045" + "NameLevel" = "2017" + "SPLevel" = "RTM", "LATEST" + "CULevel" = 'CU12' + "KBLevel" = "4464082" + "BuildLevel" = [version]'14.0.3045' + "MatchType" = "Exact" + } + TargetLevel = 'RTMCU12' + KB = '4464082' + Successful = $true + Restarted = $false + InstanceName = "" + Installer = "dummy" + ExtractPath = $null + Notes = @() + ExitCode = $null + Log = $null + } + $doubleAction = @( + [pscustomobject]@{ + ComputerName = $env:COMPUTERNAME + MajorVersion = "2008" + Build = "10.0.4279" + Architecture = 'x64' + TargetVersion = [pscustomobject]@{ + "SqlInstance" = $null + "Build" = "10.0.5500" + "NameLevel" = "2008" + "SPLevel" = "SP3" + "CULevel" = '' + "KBLevel" = "2546951" + "BuildLevel" = [version]'10.0.5500' + "MatchType" = "Exact" + } + TargetLevel = 'SP3' + KB = '2546951' + Successful = $true + Restarted = $false + InstanceName = "" + Installer = "dummy" + ExtractPath = $null + Notes = @() + ExitCode = $null + Log = $null + }, + [pscustomobject]@{ + ComputerName = $env:COMPUTERNAME + MajorVersion = "2008" + Build = "10.0.5500" + Architecture = 'x64' + TargetVersion = [pscustomobject]@{ + "SqlInstance" = $null + "Build" = "10.0.5794" + "NameLevel" = "2008" + "SPLevel" = "SP3" + "CULevel" = 'CU7' + "KBLevel" = "2738350" + "BuildLevel" = [version]'10.0.5794' + "MatchType" = "Exact" + } + TargetLevel = 'SP3CU7' + KB = '2738350' + Successful = $true + Restarted = $false + InstanceName = "" + Installer = "dummy" + ExtractPath = $null + Notes = @() + ExitCode = $null + Log = $null + } + ) + } + Context "Validate parameters" { + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'ComputerName', 'Action', 'Credential', 'Restart', 'Authentication', 'EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 + } + } + Context "Validate upgrades to a latest version" { + It "Should mock-upgrade SQL2017\LAB0 to SP0CU12 thinking it's latest" { + $result = Invoke-DbaAdvancedUpdate -ComputerName $env:COMPUTERNAME -EnableException -Action $singleAction + Assert-MockCalled -CommandName Invoke-Program -Exactly 2 -Scope It -ModuleName dbatools + Assert-MockCalled -CommandName Restart-Computer -Exactly 0 -Scope It -ModuleName dbatools + + $result | Should -Not -BeNullOrEmpty + $result.MajorVersion | Should -Be 2017 + $result.TargetLevel | Should -Be RTMCU12 + $result.KB | Should -Be 4464082 + $result.Successful | Should -Be $true + $result.Restarted | Should -Be $false + $result.Installer | Should -Be 'dummy' + $result.Notes | Should -BeLike 'Restart is required for computer * to finish the installation of SQL2017RTMCU12' + $result.ExtractPath | Should -BeLike '*\dbatools_KB*Extract' + } + It "Should mock-upgrade 2008 to SP3CU7" { + $results = Invoke-DbaAdvancedUpdate -ComputerName $env:COMPUTERNAME -Restart $true -EnableException -Action $doubleAction + Assert-MockCalled -CommandName Invoke-Program -Exactly 4 -Scope It -ModuleName dbatools + Assert-MockCalled -CommandName Restart-Computer -Exactly 2 -Scope It -ModuleName dbatools + + ($results | Measure-Object).Count | Should -Be 2 + #2008SP3 + $result = $results | Select-Object -First 1 + $result.MajorVersion | Should -Be 2008 + $result.TargetLevel | Should -Be SP3 + $result.KB | Should -Be 2546951 + $result.Successful | Should -Be $true + $result.Restarted | Should -Be $true + $result.Installer | Should -Be 'dummy' + $result.Notes | Should -BeNullOrEmpty + $result.ExtractPath | Should -BeLike '*\dbatools_KB*Extract' + + #2008SP3CU7 + $result = $results | Select-Object -First 1 -Skip 1 + $result.MajorVersion | Should -Be 2008 + $result.TargetLevel | Should -Be SP3CU7 + $result.KB | Should -Be 2738350 + $result.Successful | Should -Be $true + $result.Restarted | Should -Be $true + $result.Installer | Should -Be 'dummy' + $result.Notes | Should -BeNullOrEmpty + $result.ExtractPath | Should -BeLike '*\dbatools_KB*Extract' + } + } + Context "Negative tests" { + It "fails when update execution has failed" { + #override default mock + Mock -CommandName Invoke-Program -MockWith { [pscustomobject]@{ Successful = $false; ExitCode = 12345 } } -ModuleName dbatools + { Invoke-DbaAdvancedUpdate -ComputerName $env:COMPUTERNAME -EnableException -Action $singleAction } | Should throw 'failed with exit code 12345' + $result = Invoke-DbaAdvancedUpdate -ComputerName $env:COMPUTERNAME -Action $singleAction -WarningVariable warVar 3>$null + $result | Should -Not -BeNullOrEmpty + $result.MajorVersion | Should -Be 2017 + $result.TargetLevel | Should -Be RTMCU12 + $result.KB | Should -Be 4464082 + $result.Successful | Should -Be $false + $result.Restarted | Should -Be $false + $result.Installer | Should -Be 'dummy' + $result.Notes | Should -BeLike '*failed with exit code 12345' + $result.ExtractPath | Should -BeLike '*\dbatools_KB*Extract' + $warVar | Should -BeLike '*failed with exit code 12345' + #revert default mock + Mock -CommandName Invoke-Program -MockWith { [pscustomobject]@{ Successful = $true } } -ModuleName dbatools + } + } +} \ No newline at end of file diff --git a/tests/Invoke-DbaAgFailover.Tests.ps1 b/tests/Invoke-DbaAgFailover.Tests.ps1 new file mode 100644 index 0000000000..0634ae2f69 --- /dev/null +++ b/tests/Invoke-DbaAgFailover.Tests.ps1 @@ -0,0 +1,19 @@ +$CommandName = $MyInvocation.MyCommand.Name.Replace(".Tests.ps1", "") +Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan +. "$PSScriptRoot\constants.ps1" + +Describe "$CommandName Unit Tests" -Tag 'UnitTests' { + Context "Validate parameters" { + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance', 'SqlCredential', 'AvailabilityGroup', 'InputObject', 'Force', 'EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 + } + } +} +<# + Integration test are custom to the command you are writing for. + Read https://github.com/sqlcollaborative/dbatools/blob/development/contributing.md#tests + for more guidence +#> \ No newline at end of file diff --git a/tests/Invoke-DbaBalanceDataFiles.Tests.ps1 b/tests/Invoke-DbaBalanceDataFiles.Tests.ps1 index 94874a2d86..814326a184 100644 --- a/tests/Invoke-DbaBalanceDataFiles.Tests.ps1 +++ b/tests/Invoke-DbaBalanceDataFiles.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 7 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Invoke-DbaBalanceDataFiles).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Database', 'Table', 'RebuildOffline', 'EnableException', 'Force' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Database','Table','RebuildOffline','EnableException','Force' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Invoke-DbaCycleErrorLog.Tests.ps1 b/tests/Invoke-DbaCycleErrorLog.Tests.ps1 index c682809742..016c3662ae 100644 --- a/tests/Invoke-DbaCycleErrorLog.Tests.ps1 +++ b/tests/Invoke-DbaCycleErrorLog.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag "UnitTests" { Context "Validate parameters" { - $paramCount = 4 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Invoke-DbaCycleErrorLog).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Type', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Type','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Invoke-DbaDbClone.Tests.ps1 b/tests/Invoke-DbaDbClone.Tests.ps1 index 2158e50b71..17a9cc429a 100644 --- a/tests/Invoke-DbaDbClone.Tests.ps1 +++ b/tests/Invoke-DbaDbClone.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 9 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Invoke-DbaDbClone).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Database', 'CloneDatabase', 'ExcludeStatistics', 'ExcludeQueryStore', 'UpdateStatistics', 'EnableException', 'InputObject' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Database','InputObject','CloneDatabase','ExcludeStatistics','ExcludeQueryStore','UpdateStatistics','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Invoke-DbaDbCorruption.Tests.ps1 b/tests/Invoke-DbaDbCorruption.Tests.ps1 index 8e4f7d64b8..530f62bdc0 100644 --- a/tests/Invoke-DbaDbCorruption.Tests.ps1 +++ b/tests/Invoke-DbaDbCorruption.Tests.ps1 @@ -1,22 +1,23 @@ $CommandName = $MyInvocation.MyCommand.Name.Replace(".Tests.ps1", "") Write-Host -Object "Running $PSCommandpath" -ForegroundColor Cyan . "$PSScriptRoot\constants.ps1" +. "$PSScriptRoot\..\internal\functions\Invoke-DbaDbCorruption.ps1" Describe "$commandname Unit Tests" -Tags "UnitTests" { - Context "Validating Database Input" { - Invoke-DbaDbCorruption -SqlInstance $script:instance2 -Database "master" -WarningAction SilentlyContinue -WarningVariable systemwarn - It "Should not allow you to corrupt system databases." { - $systemwarn -match 'may not corrupt system databases' | Should Be $true - } - It "Should fail if more than one database is specified" { - { Invoke-DbaDbCorruption -SqlInstance $script:instance2 -Database "Database1", "Database2" -EnableException } | Should Throw + + Context "Validate parameters" { + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Database','Table','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } - - Context "It's Confirm impact should be high" { - $command = Get-Command Invoke-DbaDbCorruption - $metadata = [System.Management.Automation.CommandMetadata]$command - $metadata.ConfirmImpact | Should Be 'High' + Context "Validate Confirm impact" { + It "Confirm Impact should be high" { + $metadata = [System.Management.Automation.CommandMetadata](Get-Command $CommandName) + $metadata.ConfirmImpact | Should Be 'High' + } } } @@ -27,21 +28,31 @@ Describe "$commandname Integration Tests" -Tags "IntegrationTests" { $TableName = "Example" # Need a clean empty database $null = $Server.Query("Create Database [$dbname]") - $db = Get-DbaDatabase -SqlInstance $Server -Database $dbname + $db = Get-DbaDatabase -SqlInstance $script:instance2 -Database $dbname } AfterAll { # Cleanup - Remove-DbaDatabase -SqlInstance $Server -Database $dbname -Confirm:$false + Remove-DbaDatabase -SqlInstance $script:instance2 -Database $dbname -Confirm:$false + } + + Context "Validating Database Input" { + Invoke-DbaDbCorruption -SqlInstance $script:instance2 -Database "master" -WarningAction SilentlyContinue -WarningVariable systemwarn + It "Should not allow you to corrupt system databases." { + $systemwarn -match 'may not corrupt system databases' | Should Be $true + } + It "Should fail if more than one database is specified" { + { Invoke-DbaDbCorruption -SqlInstance $script:instance2 -Database "Database1", "Database2" -EnableException } | Should Throw + } } It "Require at least a single table in the database specified" { - { Invoke-DbaDbCorruption -SqlInstance $server -Database $dbname -EnableException } | Should Throw + { Invoke-DbaDbCorruption -SqlInstance $script:instance2 -Database $dbname -EnableException } | Should Throw } # Creating a table to make sure these are failing for different reasons It "Fail if the specified table does not exist" { - { Invoke-DbaDbCorruption -SqlInstance $server -Database $dbname -Table "DoesntExist$(New-Guid)" -EnableException } | Should Throw + { Invoke-DbaDbCorruption -SqlInstance $script:instance2 -Database $dbname -Table "DoesntExist$(New-Guid)" -EnableException } | Should Throw } $null = $db.Query(" @@ -55,7 +66,7 @@ Describe "$commandname Integration Tests" -Tags "IntegrationTests" { } It "Causes DBCC CHECKDB to fail" { - $result = Start-DbccCheck -Server $Server -dbname $dbname + $result = Start-DbccCheck -Server $server -dbname $dbname $result | Should Not Be 'Success' } } \ No newline at end of file diff --git a/tests/Invoke-DbaDbDataMasking.Tests.ps1 b/tests/Invoke-DbaDbDataMasking.Tests.ps1 new file mode 100644 index 0000000000..ca797a03f5 --- /dev/null +++ b/tests/Invoke-DbaDbDataMasking.Tests.ps1 @@ -0,0 +1,65 @@ +$CommandName = $MyInvocation.MyCommand.Name.Replace(".Tests.ps1", "") +Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan +. "$PSScriptRoot\constants.ps1" + +Describe "$CommandName Unit Tests" -Tag 'UnitTests' { + Context "Validate parameters" { + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance', 'SqlCredential', 'Database', 'FilePath', 'Locale', 'CharacterString', 'Table', 'Column', 'ExcludeTable', 'ExcludeColumn', 'Query', 'MaxValue', 'ModulusFactor', 'ExactLength', 'EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 + } + } +} + +Describe "$CommandName Integration Tests" -Tag "IntegrationTests" { + BeforeAll { + $db = "dbatoolsci_masker" + $sql = "CREATE TABLE [dbo].[people]( + [fname] [varchar](50) NULL, + [lname] [varchar](50) NULL, + [dob] [datetime] NULL + ) ON [PRIMARY] + GO + INSERT INTO people (fname, lname, dob) VALUES ('Joe','Schmoe','2/2/2000') + INSERT INTO people (fname, lname, dob) VALUES ('Jane','Schmee','2/2/1950') + GO + CREATE TABLE [dbo].[people2]( + [fname] [varchar](50) NULL, + [lname] [varchar](50) NULL, + [dob] [datetime] NULL + ) ON [PRIMARY] + GO + INSERT INTO people2 (fname, lname, dob) VALUES ('Layla','Schmoe','2/2/2000') + INSERT INTO people2 (fname, lname, dob) VALUES ('Eric','Schmee','2/2/1950')" + New-DbaDatabase -SqlInstance $script:instance2 -Name $db + Invoke-DbaQuery -SqlInstance $script:instance2 -Database $db -Query $sql + } + + AfterAll { + Remove-DbaDatabase -SqlInstance $script:instance2 -Database $db -Confirm:$false + $file | Remove-Item -Confirm:$false -ErrorAction Ignore + } + + Context "Command works" { + It "starts with the right data" { + Invoke-DbaQuery -SqlInstance $script:instance2 -Database $db -Query "select * from people where fname = 'Joe'" | Should -Not -Be $null + Invoke-DbaQuery -SqlInstance $script:instance2 -Database $db -Query "select * from people where lname = 'Schmee'" | Should -Not -Be $null + } + It "returns the proper output" { + $file = New-DbaDbMaskingConfig -SqlInstance $script:instance2 -Database $db -Path C:\temp + $results = $file | Invoke-DbaDbDataMasking -SqlInstance $script:instance2 -Database $db -Confirm:$false + foreach ($result in $results) { + $result.Rows | Should -Be 2 + $result.Database | Should -Contain $db + } + + } + It "masks the data and does not delete it" { + Invoke-DbaQuery -SqlInstance $script:instance2 -Database $db -Query "select * from people" | Should -Not -Be $null + Invoke-DbaQuery -SqlInstance $script:instance2 -Database $db -Query "select * from people where fname = 'Joe'" | Should -Be $null + Invoke-DbaQuery -SqlInstance $script:instance2 -Database $db -Query "select * from people where lname = 'Schmee'" | Should -Be $null + } + } +} \ No newline at end of file diff --git a/tests/Invoke-DbaDbDbccCheckConstraint.Tests.ps1 b/tests/Invoke-DbaDbDbccCheckConstraint.Tests.ps1 new file mode 100644 index 0000000000..a3d9c0413c --- /dev/null +++ b/tests/Invoke-DbaDbDbccCheckConstraint.Tests.ps1 @@ -0,0 +1,50 @@ +$CommandName = $MyInvocation.MyCommand.Name.Replace(".Tests.ps1", "") +Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan +. "$PSScriptRoot\constants.ps1" + +Describe "$CommandName Unit Tests" -Tag 'UnitTests' { + Context "Validate parameters" { + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Database','Object','AllConstraints','AllErrorMessages','NoInformationalMessages','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 + } + } +} +Describe "$commandname Integration Test" -Tag "IntegrationTests" { + BeforeAll { + $server = Connect-DbaInstance -SqlInstance $script:instance2 + $random = Get-Random + $tableName = "dbatools_CheckConstraintTbl1" + $check1 = "chkTab1" + $dbname = "dbatoolsci_dbccCheckConstraint$random" + + $null = $server.Query("CREATE DATABASE $dbname") + $null = $server.Query("CREATE TABLE $tableName (Col1 int, Col2 char (30))", $dbname) + $null = $server.Query("INSERT $tableName(Col1, Col2) VALUES (100, 'Hello')", $dbname) + $null = $server.Query("ALTER TABLE $tableName WITH NOCHECK ADD CONSTRAINT $check1 CHECK (Col1 > 100); ", $dbname) + } + AfterAll { + $null = Get-DbaDatabase -SqlInstance $script:instance2 -Database $dbname | Remove-DbaDatabase -Confirm:$false + } + + Context "Validate standard output" { + $props = 'ComputerName', 'InstanceName', 'SqlInstance', 'Database', 'Cmd', 'Output', 'Table', 'Constraint', 'Where' + $result = Invoke-DbaDbDbccCheckConstraint -SqlInstance $script:instance2 -Database $dbname -Object $tableName -Confirm:$false + + foreach ($prop in $props) { + $p = $result[0].PSObject.Properties[$prop] + It "Should return property: $prop" { + $p.Name | Should Be $prop + } + } + + It "returns correct results" { + $result.Database -match $dbname | Should Be $true + $result.Table -match $tableName | Should Be $true + $result.Constraint -match $check1 | Should Be $true + $result.Output.Substring(0, 25) -eq 'DBCC execution completed.' | Should Be $true + } + } +} \ No newline at end of file diff --git a/tests/Invoke-DbaDbDbccCleanTable.Tests.ps1 b/tests/Invoke-DbaDbDbccCleanTable.Tests.ps1 new file mode 100644 index 0000000000..bf0b7dfcf7 --- /dev/null +++ b/tests/Invoke-DbaDbDbccCleanTable.Tests.ps1 @@ -0,0 +1,67 @@ +$CommandName = $MyInvocation.MyCommand.Name.Replace(".Tests.ps1", "") +Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan +. "$PSScriptRoot\constants.ps1" + +Describe "$CommandName Unit Tests" -Tag 'UnitTests' { + Context "Validate parameters" { + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Database','Object','BatchSize','NoInformationalMessages','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 + } + } +} +Describe "$commandname Integration Test" -Tag "IntegrationTests" { + BeforeAll { + $db = Get-DbaDatabase -SqlInstance $script:instance1 -Database tempdb + $null = $db.Query("CREATE TABLE dbo.dbatoolct_example (object_id int, [definition] nvarchar(max),Document varchar(2000)); + INSERT INTO dbo.dbatoolct_example([object_id], [definition], Document) Select [object_id], [definition], REPLICATE('ab', 800) from master.sys.sql_modules; + ALTER TABLE dbo.dbatoolct_example DROP COLUMN Definition, Document;") + } + AfterAll { + try { + $null = $db.Query("DROP TABLE dbo.dbatoolct_example") + } catch { + $null = 1 + } + } + + Context "Validate standard output" { + $props = 'ComputerName', 'InstanceName', 'SqlInstance', 'Database', 'Object', 'Cmd', 'Output' + $result = Invoke-DbaDbDbccCleanTable -SqlInstance $script:instance1 -Database 'tempdb' -Object 'dbo.dbatoolct_example' -Confirm:$false + + foreach ($prop in $props) { + $p = $result[0].PSObject.Properties[$prop] + It "Should return property: $prop" { + $p.Name | Should Be $prop + } + } + + It "returns correct results" { + $result.Database -eq 'tempdb' | Should Be $true + $result.Object -eq 'dbo.dbatoolct_example' | Should Be $true + $result.Output.Substring(0,25) -eq 'DBCC execution completed.' | Should Be $true + } + } + + Context "Validate BatchSize parameter " { + $result = Invoke-DbaDbDbccCleanTable -SqlInstance $script:instance1 -Database 'tempdb' -Object 'dbo.dbatoolct_example' -BatchSize 1000 -Confirm:$false + + It "returns results for table" { + $result.Cmd -eq "DBCC CLEANTABLE('tempdb', 'dbo.dbatoolct_example', 1000)" | Should Be $true + $result.Output.Substring(0,25) -eq 'DBCC execution completed.' | Should Be $true + } + } + + Context "Validate NoInformationalMessages parameter " { + $result = Invoke-DbaDbDbccCleanTable -SqlInstance $script:instance1 -Database 'tempdb' -Object 'dbo.dbatoolct_example' -NoInformationalMessages -Confirm:$false + + It "returns results for table" { + $result.Cmd -eq "DBCC CLEANTABLE('tempdb', 'dbo.dbatoolct_example') WITH NO_INFOMSGS" | Should Be $true + $result.Output -eq $null | Should Be $true + } + } +} + + diff --git a/tests/Invoke-DbaDbDbccUpdateUsage.Tests.ps1 b/tests/Invoke-DbaDbDbccUpdateUsage.Tests.ps1 new file mode 100644 index 0000000000..71ed8def36 --- /dev/null +++ b/tests/Invoke-DbaDbDbccUpdateUsage.Tests.ps1 @@ -0,0 +1,63 @@ +$CommandName = $MyInvocation.MyCommand.Name.Replace(".Tests.ps1", "") +Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan +. "$PSScriptRoot\constants.ps1" + +Describe "$CommandName Unit Tests" -Tag 'UnitTests' { + Context "Validate parameters" { + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance', 'SqlCredential', 'Database', 'Table', 'Index', 'NoInformationalMessages', 'CountRows', 'EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 + } + } +} +Describe "$commandname Integration Test" -Tag "IntegrationTests" { + BeforeAll { + $server = Connect-DbaInstance -SqlInstance $script:instance1 + $random = Get-Random + $tableName = "dbatools_getdbtbl1" + + $dbname = "dbatoolsci_getdbUsage$random" + $db = New-DbaDatabase -SqlInstance $script:instance1 -Name $dbname + $null = $db.Query("CREATE TABLE $tableName (id int)", $dbname) + $null = $db.Query("CREATE CLUSTERED INDEX [PK_Id] ON $tableName ([id] ASC)", $dbname) + $null = $db.Query("INSERT $tableName(id) SELECT object_id FROM sys.objects", $dbname) + } + AfterAll { + $null = Get-DbaDatabase -SqlInstance $script:instance1 -Database $dbname | Remove-DbaDatabase -Confirm:$false + } + + Context "Validate standard output" { + $props = 'ComputerName', 'InstanceName', 'SqlInstance', 'Database', 'Cmd', 'Output' + $result = Invoke-DbaDbDbccUpdateUsage -SqlInstance $script:instance1 -Confirm:$false + + It "returns results" { + $result.Count -gt 0 | Should Be $true + } + + foreach ($prop in $props) { + $p = $result[0].PSObject.Properties[$prop] + It "Should return property: $prop" { + $p.Name | Should Be $prop + } + } + } + + Context "Validate returns results " { + $result = Invoke-DbaDbDbccUpdateUsage -SqlInstance $script:instance1 -Database $dbname -Table $tableName -Confirm:$false + + It "returns results for table" { + $result.Output -match 'DBCC execution completed. If DBCC printed error messages, contact your system administrator.' | Should Be $true + } + + $result = Invoke-DbaDbDbccUpdateUsage -SqlInstance $script:instance1 -Database $dbname -Table $tableName -Index 1 -Confirm:$false + + It "returns results for index by id" { + $result.Output -match 'DBCC execution completed. If DBCC printed error messages, contact your system administrator.' | Should Be $true + } + } + +} + + diff --git a/tests/Invoke-DbaDbDecryptObject.Tests.ps1 b/tests/Invoke-DbaDbDecryptObject.Tests.ps1 index fa5b74f611..581f9922c8 100644 --- a/tests/Invoke-DbaDbDecryptObject.Tests.ps1 +++ b/tests/Invoke-DbaDbDecryptObject.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 7 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Invoke-DbaDbDecryptObject).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Database', 'ObjectName', 'EncodingType', 'ExportDestination', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance', 'SqlCredential', 'Database', 'ObjectName', 'EncodingType', 'ExportDestination', 'EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } @@ -28,12 +24,8 @@ Describe "$CommandName Integration Tests" -Tags "UnitTests" { # Remove the database if it exists Remove-DbaDatabase -SqlInstance $script:instance1 -Database $dbname -Confirm:$false - # Get a server object - $server = Connect-DbaInstance -SqlInstance $script:instance1 - # Create the database - $server = Connect-DbaInstance -SqlInstance $script:instance1 - $server.Query("CREATE DATABASE $dbname;") + $db = New-DbaDatabase -SqlInstance $script:instance1 -Name $dbname # Setup the code for the encrypted function $queryFunction = " @@ -61,7 +53,7 @@ BEGIN END " # Create the encrypted function - $server.Databases[$dbname].Query($queryFunction) + $db.Query($queryFunction) # Setup the query for the encrypted stored procedure $queryStoredProcedure = " @@ -84,7 +76,7 @@ END " # Create the encrypted stored procedure - $server.Databases[$dbname].Query($queryStoredProcedure) + $db.Query($queryStoredProcedure) # Check if DAC is enabled $config = Get-DbaSpConfigure -SqlInstance $script:instance1 -ConfigName RemoteDacConnectionsEnabled diff --git a/tests/Invoke-DbaDbLogShipRecovery.Tests.ps1 b/tests/Invoke-DbaDbLogShipRecovery.Tests.ps1 index 2c7cfda77b..aa669cb743 100644 --- a/tests/Invoke-DbaDbLogShipRecovery.Tests.ps1 +++ b/tests/Invoke-DbaDbLogShipRecovery.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 8 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Invoke-DbaDbLogShipRecovery).Parameters.Keys - $knownParameters = 'SqlInstance', 'Database', 'SqlCredential', 'NoRecovery', 'EnableException', 'Force', 'InputObject', 'Delay' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','Database','SqlCredential','NoRecovery','EnableException','Force','InputObject','Delay' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Invoke-DbaDbLogShipping.Tests.ps1 b/tests/Invoke-DbaDbLogShipping.Tests.ps1 index 8bb492ff20..b2ec672667 100644 --- a/tests/Invoke-DbaDbLogShipping.Tests.ps1 +++ b/tests/Invoke-DbaDbLogShipping.Tests.ps1 @@ -4,23 +4,11 @@ Write-Host -Object "Running $PSCommandpath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tags "UnitTests" { Context "Validate parameters" { - $knownParameters = 'SourceSqlInstance', 'DestinationSqlInstance', 'SourceSqlCredential', 'SourceCredential', 'DestinationSqlCredential', 'DestinationCredential', 'Database', 'BackupNetworkPath', 'BackupLocalPath', 'BackupJob', 'BackupRetention', 'BackupSchedule', 'BackupScheduleDisabled', 'BackupScheduleFrequencyType', 'BackupScheduleFrequencyInterval', 'BackupScheduleFrequencySubdayType', 'BackupScheduleFrequencySubdayInterval', 'BackupScheduleFrequencyRelativeInterval', 'BackupScheduleFrequencyRecurrenceFactor', 'BackupScheduleStartDate', 'BackupScheduleEndDate', 'BackupScheduleStartTime', 'BackupScheduleEndTime', 'BackupThreshold', 'CompressBackup', 'CopyDestinationFolder', 'CopyJob', 'CopyRetention', 'CopySchedule', 'CopyScheduleDisabled', 'CopyScheduleFrequencyType', 'CopyScheduleFrequencyInterval', 'CopyScheduleFrequencySubdayType', 'CopyScheduleFrequencySubdayInterval', 'CopyScheduleFrequencyRelativeInterval', 'CopyScheduleFrequencyRecurrenceFactor', 'CopyScheduleStartDate', 'CopyScheduleEndDate', 'CopyScheduleStartTime', 'CopyScheduleEndTime', 'DisconnectUsers', 'FullBackupPath', 'GenerateFullBackup', 'HistoryRetention', 'NoRecovery', 'NoInitialization', 'PrimaryMonitorServer', 'PrimaryMonitorCredential', 'PrimaryMonitorServerSecurityMode', 'PrimaryThresholdAlertEnabled', 'RestoreDataFolder', 'RestoreLogFolder', 'RestoreDelay', 'RestoreAlertThreshold', 'RestoreJob', 'RestoreRetention', 'RestoreSchedule', 'RestoreScheduleDisabled', 'RestoreScheduleFrequencyType', 'RestoreScheduleFrequencyInterval', 'RestoreScheduleFrequencySubdayType', 'RestoreScheduleFrequencySubdayInterval', 'RestoreScheduleFrequencyRelativeInterval', 'RestoreScheduleFrequencyRecurrenceFactor', 'RestoreScheduleStartDate', 'RestoreScheduleEndDate', 'RestoreScheduleStartTime', 'RestoreScheduleEndTime', 'RestoreThreshold', 'SecondaryDatabasePrefix', 'SecondaryDatabaseSuffix', 'SecondaryMonitorServer', 'SecondaryMonitorCredential', 'SecondaryMonitorServerSecurityMode', 'SecondaryThresholdAlertEnabled', 'Standby', 'StandbyDirectory', 'UseExistingFullBackup', 'UseBackupFolder', 'Force', 'EnableException' - $SupportShouldProcess = $true - $paramCount = $knownParameters.Count - if ($SupportShouldProcess) { - $defaultParamCount = 13 - } else { - $defaultParamCount = 11 - } - $command = Get-Command -Name $CommandName - [object[]]$params = $command.Parameters.Keys - - It "Should contain our specific parameters" { - ((Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count) | Should Be $paramCount - } - - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SourceSqlInstance','DestinationSqlInstance','SourceSqlCredential','SourceCredential','DestinationSqlCredential','DestinationCredential','Database','BackupNetworkPath','BackupLocalPath','BackupJob','BackupRetention','BackupSchedule','BackupScheduleDisabled','BackupScheduleFrequencyType','BackupScheduleFrequencyInterval','BackupScheduleFrequencySubdayType','BackupScheduleFrequencySubdayInterval','BackupScheduleFrequencyRelativeInterval','BackupScheduleFrequencyRecurrenceFactor','BackupScheduleStartDate','BackupScheduleEndDate','BackupScheduleStartTime','BackupScheduleEndTime','BackupThreshold','CompressBackup','CopyDestinationFolder','CopyJob','CopyRetention','CopySchedule','CopyScheduleDisabled','CopyScheduleFrequencyType','CopyScheduleFrequencyInterval','CopyScheduleFrequencySubdayType','CopyScheduleFrequencySubdayInterval','CopyScheduleFrequencyRelativeInterval','CopyScheduleFrequencyRecurrenceFactor','CopyScheduleStartDate','CopyScheduleEndDate','CopyScheduleStartTime','CopyScheduleEndTime','DisconnectUsers','FullBackupPath','GenerateFullBackup','HistoryRetention','NoRecovery','NoInitialization','PrimaryMonitorServer','PrimaryMonitorCredential','PrimaryMonitorServerSecurityMode','PrimaryThresholdAlertEnabled','RestoreDataFolder','RestoreLogFolder','RestoreDelay','RestoreAlertThreshold','RestoreJob','RestoreRetention','RestoreSchedule','RestoreScheduleDisabled','RestoreScheduleFrequencyType','RestoreScheduleFrequencyInterval','RestoreScheduleFrequencySubdayType','RestoreScheduleFrequencySubdayInterval','RestoreScheduleFrequencyRelativeInterval','RestoreScheduleFrequencyRecurrenceFactor','RestoreScheduleStartDate','RestoreScheduleEndDate','RestoreScheduleStartTime','RestoreScheduleEndTime','RestoreThreshold','SecondaryDatabasePrefix','SecondaryDatabaseSuffix','SecondaryMonitorServer','SecondaryMonitorCredential','SecondaryMonitorServerSecurityMode','SecondaryThresholdAlertEnabled','Standby','StandbyDirectory','UseExistingFullBackup','UseBackupFolder','Force','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Invoke-DbaDbMirrorFailover.Tests.ps1 b/tests/Invoke-DbaDbMirrorFailover.Tests.ps1 index 47d82e95b4..fa0381caf1 100644 --- a/tests/Invoke-DbaDbMirrorFailover.Tests.ps1 +++ b/tests/Invoke-DbaDbMirrorFailover.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 6 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Invoke-DbaDbMirrorFailover).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Database', 'InputObject', 'Force', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Database','InputObject','Force','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Invoke-DbaDbMirroring.Tests.ps1 b/tests/Invoke-DbaDbMirroring.Tests.ps1 index 9b9337adcd..a738e98f9e 100644 --- a/tests/Invoke-DbaDbMirroring.Tests.ps1 +++ b/tests/Invoke-DbaDbMirroring.Tests.ps1 @@ -2,6 +2,17 @@ $commandname = $MyInvocation.MyCommand.Name.Replace(".Tests.ps1", "") Write-Host -Object "Running $PSCommandpath" -ForegroundColor Cyan . "$PSScriptRoot\constants.ps1" +Describe "$commandname Unit Tests" -Tag "UnitTests" { + Context "Validate parameters" { + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'Primary','PrimarySqlCredential','Mirror','MirrorSqlCredential','Witness','WitnessSqlCredential','Database','SharedPath','InputObject','UseLastBackup','Force','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 + } + } +} + Describe "$commandname Integration Tests" -Tag "IntegrationTests" { BeforeAll { $null = Get-DbaProcess -SqlInstance $script:instance2 | Where-Object Program -match dbatools | Stop-DbaProcess -Confirm:$false -WarningAction SilentlyContinue diff --git a/tests/Invoke-DbaDbShrink.Tests.ps1 b/tests/Invoke-DbaDbShrink.Tests.ps1 index a1f8ec3d36..5e77a0176b 100644 --- a/tests/Invoke-DbaDbShrink.Tests.ps1 +++ b/tests/Invoke-DbaDbShrink.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandpath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 14 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Invoke-DbaDbShrink).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Database', 'ExcludeDatabase', 'AllUserDatabases', 'PercentFreeSpace', 'ShrinkMethod', 'StatementTimeout', 'LogsOnly', 'FileType', 'StepSize', 'ExcludeIndexStats', 'ExcludeUpdateUsage', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Database','ExcludeDatabase','AllUserDatabases','PercentFreeSpace','ShrinkMethod','FileType','StepSize','StatementTimeout','LogsOnly','ExcludeIndexStats','ExcludeUpdateUsage','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Invoke-DbaDbUpgrade.Tests.ps1 b/tests/Invoke-DbaDbUpgrade.Tests.ps1 index d447650855..f4ed2b33a1 100644 --- a/tests/Invoke-DbaDbUpgrade.Tests.ps1 +++ b/tests/Invoke-DbaDbUpgrade.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 12 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Invoke-DbaDbUpgrade).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Database', 'ExcludeDatabase', 'NoCheckDb', 'NoUpdateUsage', 'NoUpdateStats', 'NoRefreshView', 'AllUserDatabases', 'Force', 'InputObject', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Database','ExcludeDatabase','NoCheckDb','NoUpdateUsage','NoUpdateStats','NoRefreshView','AllUserDatabases','Force','InputObject','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Invoke-DbaDbccDropCleanBuffer.Tests.ps1 b/tests/Invoke-DbaDbccDropCleanBuffer.Tests.ps1 new file mode 100644 index 0000000000..a974e4f1e5 --- /dev/null +++ b/tests/Invoke-DbaDbccDropCleanBuffer.Tests.ps1 @@ -0,0 +1,41 @@ +$CommandName = $MyInvocation.MyCommand.Name.Replace(".Tests.ps1", "") +Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan +. "$PSScriptRoot\constants.ps1" + +Describe "$CommandName Unit Tests" -Tag 'UnitTests' { + Context "Validate parameters" { + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','NoInformationalMessages','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 + } + } +} +Describe "$commandname Integration Test" -Tag "IntegrationTests" { + $props = 'ComputerName', 'InstanceName', 'SqlInstance', 'Cmd', 'Output' + $result = Invoke-DbaDbccDropCleanBuffer -SqlInstance $script:instance1 -Confirm:$false + + Context "Validate standard output" { + foreach ($prop in $props) { + $p = $result.PSObject.Properties[$prop] + It "Should return property: $prop" { + $p.Name | Should Be $prop + } + } + } + + Context "Works correctly" { + It "returns results" { + $result.Output -match 'DBCC execution completed. If DBCC printed error messages, contact your system administrator.' | Should Be $true + } + + It "returns the right results for -NoInformationalMessages" { + $result = Invoke-DbaDbccDropCleanBuffer -SqlInstance $script:instance1 -NoInformationalMessages -Confirm:$false + $result.Cmd -match 'DBCC DROPCLEANBUFFERS WITH NO_INFOMSGS' | Should Be $true + $result.Output -eq $null | Should Be $true + } + + } + +} \ No newline at end of file diff --git a/tests/Invoke-DbaDbccFreeCache.Tests.ps1 b/tests/Invoke-DbaDbccFreeCache.Tests.ps1 index 604ed17a4b..495f5e6176 100644 --- a/tests/Invoke-DbaDbccFreeCache.Tests.ps1 +++ b/tests/Invoke-DbaDbccFreeCache.Tests.ps1 @@ -4,22 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $knownParameters = 'SqlInstance', 'SqlCredential', 'Operation', 'InputValue', 'NoInformationalMessages', 'MarkInUseForRemoval', 'EnableException' - $paramCount = $knownParameters.Count - $SupportShouldProcess = $true - if ($SupportShouldProcess) { - $defaultParamCount = 13 - } else { - $defaultParamCount = 11 - } - $command = Get-Command -Name $CommandName - [object[]]$params = $command.Parameters.Keys - - it "Should contain our specific parameters" { - ((Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count) | Should Be $paramCount - } - it "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Operation','InputValue','NoInformationalMessages','MarkInUseForRemoval','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Invoke-DbaDiagnosticQuery.Tests.ps1 b/tests/Invoke-DbaDiagnosticQuery.Tests.ps1 index f13b062f94..9bdcb0c0c2 100644 --- a/tests/Invoke-DbaDiagnosticQuery.Tests.ps1 +++ b/tests/Invoke-DbaDiagnosticQuery.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 16 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Invoke-DbaDiagnosticQuery).Parameters.Keys - $knownParameters = 'SqlInstance', 'Database', 'ExcludeDatabase', 'ExcludeQuery', 'SqlCredential', 'Path', 'QueryName', 'UseSelectionHelper', 'InstanceOnly', 'DatabaseSpecific', 'ExcludeQueryTextColumn', 'ExcludePlanColumn', 'NoColumnParsing', 'OutputPath', 'ExportQueries', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','Database','ExcludeDatabase','ExcludeQuery','SqlCredential','Path','QueryName','UseSelectionHelper','InstanceOnly','DatabaseSpecific','ExcludeQueryTextColumn','ExcludePlanColumn','NoColumnParsing','OutputPath','ExportQueries','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Invoke-DbaPfRelog.Tests.ps1 b/tests/Invoke-DbaPfRelog.Tests.ps1 index 188d4fb939..5ef0c0ff80 100644 --- a/tests/Invoke-DbaPfRelog.Tests.ps1 +++ b/tests/Invoke-DbaPfRelog.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 17 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Invoke-DbaPfRelog).Parameters.Keys - $knownParameters = 'Path', 'Destination', 'Type', 'Append', 'AllowClobber', 'PerformanceCounter', 'PerformanceCounterPath', 'Interval', 'BeginTime', 'EndTime', 'ConfigPath', 'Summary', 'InputObject', 'Multithread', 'AllTime', 'Raw', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'Path','Destination','Type','Append','AllowClobber','PerformanceCounter','PerformanceCounterPath','Interval','BeginTime','EndTime','ConfigPath','Summary','InputObject','Multithread','AllTime','Raw','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Invoke-DbaQuery.Tests.ps1 b/tests/Invoke-DbaQuery.Tests.ps1 index 7e7accb094..2afc79b15a 100644 --- a/tests/Invoke-DbaQuery.Tests.ps1 +++ b/tests/Invoke-DbaQuery.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 13 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Invoke-DbaQuery).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Database', 'Query', 'QueryTimeout', 'File', 'SqlObject', 'As', 'SqlParameters', 'AppendServerInstance', 'MessagesToOutput', 'InputObject', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Database','Query','QueryTimeout','File','SqlObject','As','SqlParameters','AppendServerInstance','MessagesToOutput','InputObject','ReadOnly','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Invoke-DbaWhoisActive.Tests.ps1 b/tests/Invoke-DbaWhoisActive.Tests.ps1 index 1866bde34f..2ca40ee951 100644 --- a/tests/Invoke-DbaWhoisActive.Tests.ps1 +++ b/tests/Invoke-DbaWhoisActive.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 28 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Invoke-DbaWhoisActive).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Database', 'Filter', 'FilterType', 'NotFilter', 'NotFilterType', 'ShowOwnSpid', 'ShowSystemSpids', 'ShowSleepingSpids', 'GetFullInnerText', 'GetPlans', 'GetOuterCommand', 'GetTransactionInfo', 'GetTaskInfo', 'GetLocks', 'GetAverageTime', 'GetAdditonalInfo', 'FindBlockLeaders', 'DeltaInterval', 'OutputColumnList', 'SortOrder', 'FormatOutput', 'DestinationTable', 'ReturnSchema', 'Schema', 'Help', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Database','Filter','FilterType','NotFilter','NotFilterType','ShowOwnSpid','ShowSystemSpids','ShowSleepingSpids','GetFullInnerText','GetPlans','GetOuterCommand','GetTransactionInfo','GetTaskInfo','GetLocks','GetAverageTime','GetAdditonalInfo','FindBlockLeaders','DeltaInterval','OutputColumnList','SortOrder','FormatOutput','DestinationTable','ReturnSchema','Schema','Help','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Invoke-DbaXEReplay.Tests.ps1 b/tests/Invoke-DbaXEReplay.Tests.ps1 index 8edd36bec2..f7b8f573dc 100644 --- a/tests/Invoke-DbaXEReplay.Tests.ps1 +++ b/tests/Invoke-DbaXEReplay.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 7 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Invoke-DbaXEReplay).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Database', 'Event', 'InputObject', 'Raw', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Database','Event','InputObject','Raw','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Invoke-DbatoolsFormatter.Tests.ps1 b/tests/Invoke-DbatoolsFormatter.Tests.ps1 index b5a9a7c448..516ca434d2 100644 --- a/tests/Invoke-DbatoolsFormatter.Tests.ps1 +++ b/tests/Invoke-DbatoolsFormatter.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 2 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Invoke-DbatoolsFormatter).Parameters.Keys - $knownParameters = 'Path','EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should -Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'Path','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Invoke-DbatoolsRenameHelper.Tests.ps1 b/tests/Invoke-DbatoolsRenameHelper.Tests.ps1 index d980655aae..4b7cd4ae04 100644 --- a/tests/Invoke-DbatoolsRenameHelper.Tests.ps1 +++ b/tests/Invoke-DbatoolsRenameHelper.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 3 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Invoke-DbatoolsRenameHelper).Parameters.Keys - $knownParameters = 'InputObject', 'Encoding', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'InputObject','Encoding','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Join-DbaAvailabilityGroup.Tests.ps1 b/tests/Join-DbaAvailabilityGroup.Tests.ps1 new file mode 100644 index 0000000000..4581d22614 --- /dev/null +++ b/tests/Join-DbaAvailabilityGroup.Tests.ps1 @@ -0,0 +1,19 @@ +$CommandName = $MyInvocation.MyCommand.Name.Replace(".Tests.ps1", "") +Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan +. "$PSScriptRoot\constants.ps1" + +Describe "$CommandName Unit Tests" -Tag 'UnitTests' { + Context "Validate parameters" { + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance', 'SqlCredential', 'AvailabilityGroup', 'ClusterType', 'InputObject', 'EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 + } + } +} +<# + Integration test are custom to the command you are writing for. + Read https://github.com/sqlcollaborative/dbatools/blob/development/contributing.md#tests + for more guidence +#> \ No newline at end of file diff --git a/tests/Measure-DbaBackupThroughput.Tests.ps1 b/tests/Measure-DbaBackupThroughput.Tests.ps1 index 0008945a97..c5d28ed539 100644 --- a/tests/Measure-DbaBackupThroughput.Tests.ps1 +++ b/tests/Measure-DbaBackupThroughput.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 9 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Measure-DbaBackupThroughput).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Database', 'ExcludeDatabase', 'Since', 'Last', 'Type', 'DeviceType', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Database','ExcludeDatabase','Since','Last','Type','DeviceType','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Measure-DbaDiskSpaceRequirement.Tests.ps1 b/tests/Measure-DbaDiskSpaceRequirement.Tests.ps1 index 99b5e30706..9ff7b78d30 100644 --- a/tests/Measure-DbaDiskSpaceRequirement.Tests.ps1 +++ b/tests/Measure-DbaDiskSpaceRequirement.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 8 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Measure-DbaDiskSpaceRequirement).Parameters.Keys - $knownParameters = 'Source', 'Database', 'SourceSqlCredential', 'Destination', 'DestinationDatabase', 'DestinationSqlCredential', 'Credential', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'Source','Database','SourceSqlCredential','Destination','DestinationDatabase','DestinationSqlCredential','Credential','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Measure-DbatoolsImport.Tests.ps1 b/tests/Measure-DbatoolsImport.Tests.ps1 index c4d8993bdf..294adae443 100644 --- a/tests/Measure-DbatoolsImport.Tests.ps1 +++ b/tests/Measure-DbatoolsImport.Tests.ps1 @@ -4,18 +4,15 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 0 - $defaultParamCount = 0 - [object[]]$params = (Get-ChildItem function:\Measure-DbatoolsImport).Parameters.Keys - $knownParameters = '' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = $null + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It -Skip "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } + <# Integration test should appear below and are custom to the command you are writing. Read https://github.com/sqlcollaborative/dbatools/blob/development/contributing.md#tests diff --git a/tests/Mount-DbaDatabase.Tests.ps1 b/tests/Mount-DbaDatabase.Tests.ps1 index f77d520368..3cf0e99986 100644 --- a/tests/Mount-DbaDatabase.Tests.ps1 +++ b/tests/Mount-DbaDatabase.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 7 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Mount-DbaDatabase).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Database', 'FileStructure', 'DatabaseOwner', 'AttachOption', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Database','FileStructure','DatabaseOwner','AttachOption','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Move-DbaCmsRegServer.Tests.ps1 b/tests/Move-DbaCmsRegServer.Tests.ps1 index fc5a6554c8..32edae6571 100644 --- a/tests/Move-DbaCmsRegServer.Tests.ps1 +++ b/tests/Move-DbaCmsRegServer.Tests.ps1 @@ -4,23 +4,11 @@ Write-Host -Object "Running $PSCommandpath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tags "UnitTests" { Context "Validate parameters" { - $knownParameters = 'SqlInstance', 'SqlCredential', 'Name', 'ServerName', 'NewGroup', 'InputObject', 'EnableException' - $SupportShouldProcess = $true - $paramCount = $knownParameters.Count - if ($SupportShouldProcess) { - $defaultParamCount = 13 - } else { - $defaultParamCount = 11 - } - $command = Get-Command -Name $CommandName - [object[]]$params = $command.Parameters.Keys - - It "Should contain our specific parameters" { - ((Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count) | Should Be $paramCount - } - - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Name','ServerName','NewGroup','InputObject','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Move-DbaCmsRegServerGroup.Tests.ps1 b/tests/Move-DbaCmsRegServerGroup.Tests.ps1 index 6821756411..5bcd0fb003 100644 --- a/tests/Move-DbaCmsRegServerGroup.Tests.ps1 +++ b/tests/Move-DbaCmsRegServerGroup.Tests.ps1 @@ -4,23 +4,11 @@ Write-Host -Object "Running $PSCommandpath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tags "UnitTests" { Context "Validate parameters" { - $knownParameters = 'SqlInstance', 'SqlCredential', 'Group', 'NewGroup', 'InputObject', 'EnableException' - $SupportShouldProcess = $true - $paramCount = $knownParameters.Count - if ($SupportShouldProcess) { - $defaultParamCount = 13 - } else { - $defaultParamCount = 11 - } - $command = Get-Command -Name $CommandName - [object[]]$params = $command.Parameters.Keys - - It "Should contain our specific parameters" { - ((Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count) | Should Be $paramCount - } - - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Group','NewGroup','InputObject','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/New-DbaAgentJob.Tests.ps1 b/tests/New-DbaAgentJob.Tests.ps1 index 37a658b1ae..fe5418f14b 100644 --- a/tests/New-DbaAgentJob.Tests.ps1 +++ b/tests/New-DbaAgentJob.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 19 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\New-DbaAgentJob).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Job', 'Schedule', 'ScheduleId', 'Disabled', 'Description', 'StartStepId', 'Category', 'OwnerLogin', 'EventLogLevel', 'EmailLevel', 'PageLevel', 'EmailOperator', 'NetsendOperator', 'PageOperator', 'DeleteLevel', 'Force', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Job','Schedule','ScheduleId','Disabled','Description','StartStepId','Category','OwnerLogin','EventLogLevel','EmailLevel','PageLevel','EmailOperator','NetsendOperator','PageOperator','DeleteLevel','Force','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/New-DbaAgentJobCategory.Tests.ps1 b/tests/New-DbaAgentJobCategory.Tests.ps1 index 681312c1a1..07716b3916 100644 --- a/tests/New-DbaAgentJobCategory.Tests.ps1 +++ b/tests/New-DbaAgentJobCategory.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 6 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\New-DbaAgentJobCategory).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Category', 'CategoryType', 'Force', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Category','CategoryType','Force','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/New-DbaAgentJobStep.Tests.ps1 b/tests/New-DbaAgentJobStep.Tests.ps1 index 6a78e3393e..b0327059ce 100644 --- a/tests/New-DbaAgentJobStep.Tests.ps1 +++ b/tests/New-DbaAgentJobStep.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 22 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\New-DbaAgentJobStep).Parameters.Keys - $knownParameters = 'SubSystemServer','SqlInstance', 'SqlCredential', 'Job', 'StepId', 'StepName', 'Subsystem', 'Command', 'CmdExecSuccessCode', 'OnSuccessAction', 'OnSuccessStepId', 'OnFailAction', 'OnFailStepId', 'Database', 'DatabaseUser', 'RetryAttempts', 'RetryInterval', 'OutputFileName', 'Flag', 'ProxyName', 'Force', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Job','StepId','StepName','Subsystem','SubsystemServer','Command','CmdExecSuccessCode','OnSuccessAction','OnSuccessStepId','OnFailAction','OnFailStepId','Database','DatabaseUser','RetryAttempts','RetryInterval','OutputFileName','Flag','ProxyName','Force','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/New-DbaAgentProxy.Tests.ps1 b/tests/New-DbaAgentProxy.Tests.ps1 index a1bc65ab56..f97bedc618 100644 --- a/tests/New-DbaAgentProxy.Tests.ps1 +++ b/tests/New-DbaAgentProxy.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 12 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\New-DbaAgentProxy).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Name', 'ProxyCredential', 'SubSystem', 'Description', 'Login', 'ServerRole', 'MsdbRole', 'Disabled', 'Force', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Name','ProxyCredential','SubSystem','Description','Login','ServerRole','MsdbRole','Disabled','Force','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/New-DbaAgentSchedule.Tests.ps1 b/tests/New-DbaAgentSchedule.Tests.ps1 index d950d3faa3..c4c6e19498 100644 --- a/tests/New-DbaAgentSchedule.Tests.ps1 +++ b/tests/New-DbaAgentSchedule.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 17 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\New-DbaAgentSchedule).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Job', 'Schedule', 'Disabled', 'FrequencyType', 'FrequencyInterval', 'FrequencySubdayType', 'FrequencySubdayInterval', 'FrequencyRelativeInterval', 'FrequencyRecurrenceFactor', 'StartDate', 'EndDate', 'StartTime', 'EndTime', 'Force', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Job','Schedule','Disabled','FrequencyType','FrequencyInterval','FrequencySubdayType','FrequencySubdayInterval','FrequencyRelativeInterval','FrequencyRecurrenceFactor','StartDate','EndDate','StartTime','EndTime','Force','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/New-DbaAvailabilityGroup.Tests.ps1 b/tests/New-DbaAvailabilityGroup.Tests.ps1 index f53b9a0ee1..5f934f270a 100644 --- a/tests/New-DbaAvailabilityGroup.Tests.ps1 +++ b/tests/New-DbaAvailabilityGroup.Tests.ps1 @@ -4,19 +4,11 @@ Write-Host -Object "Running $PSCommandpath" -ForegroundColor Cyan Describe "$commandname Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 31 - <# - Get commands, Default count = 11 - Commands with SupportShouldProcess = 13 - #> - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\New-DbaAvailabilityGroup).Parameters.Keys - $knownParameters = 'Primary', 'PrimarySqlCredential', 'Secondary', 'SecondarySqlCredential', 'Name', 'DtcSupport', 'ClusterType', 'AutomatedBackupPreference', 'FailureConditionLevel', 'HealthCheckTimeout', 'Basic', 'DatabaseHealthTrigger', 'Passthru', 'Database', 'SharedPath', 'UseLastBackup', 'Force', 'AvailabilityMode', 'FailoverMode', 'BackupPriority', 'ConnectionModeInPrimaryRole', 'ConnectionModeInSecondaryRole', 'SeedingMode', 'Endpoint', 'ReadonlyRoutingConnectionUrl', 'Certificate', 'IPAddress', 'SubnetMask', 'Port', 'Dhcp', 'EnableException' - it "Should contain our specific parameters" { - ((Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count) | Should Be $paramCount - } - it "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'Primary','PrimarySqlCredential','Secondary','SecondarySqlCredential','Name','DtcSupport','ClusterType','AutomatedBackupPreference','FailureConditionLevel','HealthCheckTimeout','Basic','DatabaseHealthTrigger','Passthru','Database','SharedPath','UseLastBackup','Force','AvailabilityMode','FailoverMode','BackupPriority','ConnectionModeInPrimaryRole','ConnectionModeInSecondaryRole','SeedingMode','Endpoint','ReadonlyRoutingConnectionUrl','Certificate','IPAddress','SubnetMask','Port','Dhcp','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/New-DbaClientAlias.Tests.ps1 b/tests/New-DbaClientAlias.Tests.ps1 index 7fdb7763a4..96c46e9d14 100644 --- a/tests/New-DbaClientAlias.Tests.ps1 +++ b/tests/New-DbaClientAlias.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 6 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\New-DbaClientAlias).Parameters.Keys - $knownParameters = 'ComputerName', 'Credential', 'ServerName', 'Alias', 'Protocol', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'ComputerName','Credential','ServerName','Alias','Protocol','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/New-DbaCmConnection.Tests.ps1 b/tests/New-DbaCmConnection.Tests.ps1 index 1bbe8d5eae..500af1be1f 100644 --- a/tests/New-DbaCmConnection.Tests.ps1 +++ b/tests/New-DbaCmConnection.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 13 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\New-DbaCmConnection).Parameters.Keys - $knownParameters = 'ComputerName', 'Credential', 'UseWindowsCredentials', 'OverrideExplicitCredential', 'DisabledConnectionTypes', 'DisableBadCredentialCache', 'DisableCimPersistence', 'DisableCredentialAutoRegister', 'EnableCredentialFailover', 'WindowsCredentialsAreBad', 'CimWinRMOptions', 'CimDCOMOptions', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'ComputerName','Credential','UseWindowsCredentials','OverrideExplicitCredential','DisabledConnectionTypes','DisableBadCredentialCache','DisableCimPersistence','DisableCredentialAutoRegister','EnableCredentialFailover','WindowsCredentialsAreBad','CimWinRMOptions','CimDCOMOptions','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/New-DbaComputerCertificate.Tests.ps1 b/tests/New-DbaComputerCertificate.Tests.ps1 index 505b786d54..c94c1e7c56 100644 --- a/tests/New-DbaComputerCertificate.Tests.ps1 +++ b/tests/New-DbaComputerCertificate.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 14 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\New-DbaComputerCertificate).Parameters.Keys - $knownParameters = 'ComputerName', 'Credential', 'CaServer', 'CaName', 'ClusterInstanceName', 'SecurePassword', 'FriendlyName', 'CertificateTemplate', 'KeyLength', 'Store', 'Folder', 'Dns', 'SelfSigned', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'ComputerName','Credential','CaServer','CaName','ClusterInstanceName','SecurePassword','FriendlyName','CertificateTemplate','KeyLength','Store','Folder','Dns','SelfSigned','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/New-DbaConnectionString.Tests.ps1 b/tests/New-DbaConnectionString.Tests.ps1 index 8580b38af5..09e45d9197 100644 --- a/tests/New-DbaConnectionString.Tests.ps1 +++ b/tests/New-DbaConnectionString.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 24 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\New-DbaConnectionString).Parameters.Keys - $knownParameters = 'SqlInstance', 'Credential', 'AccessToken', 'ApplicationIntent', 'BatchSeparator', 'ClientName', 'ConnectTimeout', 'EncryptConnection', 'FailoverPartner', 'IsActiveDirectoryUniversalAuth', 'LockTimeout', 'MaxPoolSize', 'MinPoolSize', 'MultipleActiveResultSets', 'MultiSubnetFailover', 'NetworkProtocol', 'NonPooledConnection', 'PacketSize', 'PooledConnectionLifetime', 'SqlExecutionModes', 'StatementTimeout', 'TrustServerCertificate', 'WorkstationId', 'AppendConnectionString' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance', 'Credential', 'AccessToken', 'ApplicationIntent', 'BatchSeparator', 'ClientName', 'ConnectTimeout', 'Database', 'EncryptConnection', 'FailoverPartner', 'IsActiveDirectoryUniversalAuth', 'LockTimeout', 'MaxPoolSize', 'MinPoolSize', 'MultipleActiveResultSets', 'MultiSubnetFailover', 'NetworkProtocol', 'NonPooledConnection', 'PacketSize', 'PooledConnectionLifetime', 'SqlExecutionModes', 'StatementTimeout', 'TrustServerCertificate', 'WorkstationId', 'AppendConnectionString' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/New-DbaConnectionStringBuilder.Tests.ps1 b/tests/New-DbaConnectionStringBuilder.Tests.ps1 index 1e9117ca74..95be5d3714 100644 --- a/tests/New-DbaConnectionStringBuilder.Tests.ps1 +++ b/tests/New-DbaConnectionStringBuilder.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 10 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\New-DbaConnectionStringBuilder).Parameters.Keys - $knownParameters = 'ConnectionString', 'ApplicationName', 'DataSource', 'InitialCatalog', 'IntegratedSecurity', 'UserName', 'Password', 'MultipleActiveResultSets', 'ColumnEncryptionSetting', 'WorkstationId' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'ConnectionString','ApplicationName','DataSource','InitialCatalog','IntegratedSecurity','UserName','Password','MultipleActiveResultSets','ColumnEncryptionSetting','WorkstationId' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/New-DbaCredential.Tests.ps1 b/tests/New-DbaCredential.Tests.ps1 index f904ea4143..fcd829e8d0 100644 --- a/tests/New-DbaCredential.Tests.ps1 +++ b/tests/New-DbaCredential.Tests.ps1 @@ -5,15 +5,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 9 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\New-DbaCredential).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Name', 'Identity', 'SecurePassword', 'MappedClassType', 'ProviderName', 'Force', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Name','Identity','SecurePassword','MappedClassType','ProviderName','Force','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/New-DbaDacOption.Tests.ps1 b/tests/New-DbaDacOption.Tests.ps1 index be283f41b3..3fb8b44a4a 100644 --- a/tests/New-DbaDacOption.Tests.ps1 +++ b/tests/New-DbaDacOption.Tests.ps1 @@ -3,6 +3,16 @@ Write-Host -Object "Running $PSCommandpath" -ForegroundColor Cyan . "$PSScriptRoot\constants.ps1" Describe "$commandname Unit Tests" -Tag "UnitTests" { + Context "Validate parameters" { + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'Type','Action','PublishXml','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 + } + } +} +Describe "$commandname Integration Tests" -Tag "IntegrationTests" { BeforeAll { $publishprofile = New-DbaDacProfile -SqlInstance $script:instance1 -Database whatever -Path C:\temp } diff --git a/tests/New-DbaDacProfile.Tests.ps1 b/tests/New-DbaDacProfile.Tests.ps1 index 80f1211ab1..6b7f4b52fe 100644 --- a/tests/New-DbaDacProfile.Tests.ps1 +++ b/tests/New-DbaDacProfile.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 7 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\New-DbaDacProfile).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Database', 'Path', 'ConnectionString', 'PublishOptions', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance', 'SqlCredential', 'Database', 'Path', 'ConnectionString', 'PublishOptions', 'EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } @@ -20,9 +16,7 @@ Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Describe "$CommandName Integration Tests" -Tags "IntegrationTests" { BeforeAll { $dbname = "dbatoolsci_publishprofile" - $server = Connect-DbaInstance -SqlInstance $script:instance1 - $null = $server.Query("Create Database [$dbname]") - $db = Get-DbaDatabase -SqlInstance $script:instance1 -Database $dbname + $db = New-DbaDatabase -SqlInstance $script:instance1 -Name $dbname $null = $db.Query("CREATE TABLE dbo.example (id int); INSERT dbo.example SELECT top 100 1 diff --git a/tests/New-DbaDatabase.Tests.ps1 b/tests/New-DbaDatabase.Tests.ps1 index f011ce9fd5..2fe3f760c5 100644 --- a/tests/New-DbaDatabase.Tests.ps1 +++ b/tests/New-DbaDatabase.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\New-DbaDatabase).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Name', 'Collation', 'Recoverymodel', 'Owner', 'DataFilePath', 'LogFilePath', 'PrimaryFilesize', 'PrimaryFileGrowth', 'PrimaryFileMaxSize', 'LogSize', 'LogGrowth', 'SecondaryFilesize', 'SecondaryFileGrowth', 'SecondaryFileMaxSize', 'SecondaryFileCount', 'DefaultFileGroup', 'EnableException' - $paramCount = $knownParameters.Count - It "Should contain our specific parameters" { - ((Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Name','Collation','Recoverymodel','Owner','DataFilePath','LogFilePath','PrimaryFilesize','PrimaryFileGrowth','PrimaryFileMaxSize','LogSize','LogGrowth','SecondaryFilesize','SecondaryFileGrowth','SecondaryFileMaxSize','SecondaryFileCount','DefaultFileGroup','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/New-DbaDbCertificate.Tests.ps1 b/tests/New-DbaDbCertificate.Tests.ps1 index 3114b83c37..0a72ec3dee 100644 --- a/tests/New-DbaDbCertificate.Tests.ps1 +++ b/tests/New-DbaDbCertificate.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 11 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\New-DbaDbCertificate).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Name', 'Database', 'Subject', 'StartDate', 'ExpirationDate', 'ActiveForServiceBrokerDialog', 'SecurePassword', 'InputObject', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Name','Database','Subject','StartDate','ExpirationDate','ActiveForServiceBrokerDialog','SecurePassword','InputObject','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/New-DbaDbMailProfile.Tests.ps1 b/tests/New-DbaDbMailProfile.Tests.ps1 new file mode 100644 index 0000000000..318ada3e8f --- /dev/null +++ b/tests/New-DbaDbMailProfile.Tests.ps1 @@ -0,0 +1,61 @@ +$CommandName = $MyInvocation.MyCommand.Name.Replace(".Tests.ps1", "") +Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan +. "$PSScriptRoot\constants.ps1" + +Describe "$CommandName Unit Tests" -Tag 'UnitTests' { + Context "Validate parameters" { + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance', 'SqlCredential', 'Name', 'Description', 'MailAccountName', 'MailAccountPriority', 'EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 + } + } +} + +Describe "$commandname Integration Tests" -Tags "IntegrationTests" { + BeforeAll { + $profilename = "dbatoolsci_test_$(get-random)" + $server = Connect-DbaInstance -SqlInstance $script:instance2 + $description = 'Mail account for email alerts' + $mailaccountname = 'dbatoolssci@dbatools.io' + $mailaccountpriority = 1 + + $sql = "EXECUTE msdb.dbo.sysmail_add_account_sp + @account_name = '$mailaccountname', + @description = 'Mail account for administrative e-mail.', + @email_address = 'dba@ad.local', + @display_name = 'Automated Mailer', + @mailserver_name = 'smtp.ad.local'" + $server.Query($sql) + } + AfterAll { + $server = Connect-DbaInstance -SqlInstance $script:instance2 + $mailAccountSettings = "EXEC msdb.dbo.sysmail_delete_profile_sp @profile_name = '$profilename';" + $server.query($mailAccountSettings) + $regularaccountsettings = "EXEC msdb.dbo.sysmail_delete_account_sp @account_name = '$mailaccountname';" + $server.query($regularaccountsettings) + } + + Context "Sets DbMail Profile" { + + $splat = @{ + SqlInstance = $script:instance2 + Name = $profilename + Description = $description + MailAccountName = $mailaccountname + MailAccountPriority = $mailaccountpriority + } + $results = New-DbaDbMailProfile @splat + + It "Gets results" { + $results | Should Not Be $null + } + It "Should have Name of $profilename" { + $results.name | Should Be $profilename + } + It "Should have Description of $description " { + $results.description | Should Be $description + } + } +} \ No newline at end of file diff --git a/tests/New-DbaDbMaskingConfig.Tests.ps1 b/tests/New-DbaDbMaskingConfig.Tests.ps1 new file mode 100644 index 0000000000..1bdce50401 --- /dev/null +++ b/tests/New-DbaDbMaskingConfig.Tests.ps1 @@ -0,0 +1,44 @@ +$CommandName = $MyInvocation.MyCommand.Name.Replace(".Tests.ps1", "") +Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan +. "$PSScriptRoot\constants.ps1" + +Describe "$CommandName Unit Tests" -Tag 'UnitTests' { + Context "Validate parameters" { + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance', 'SqlCredential', 'Database', 'Table', 'Column', 'Path', 'Locale', 'Force', 'EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 + } + } +} + +Describe "$CommandName Integration Tests" -Tag "IntegrationTests" { + BeforeAll { + $dbname = "dbatoolsci_maskconfig" + $sql = "CREATE TABLE [dbo].[people]( + [fname] [varchar](50) NULL, + [lname] [varchar](50) NULL, + [dob] [datetime] NULL + ) ON [PRIMARY]" + $db = New-DbaDatabase -SqlInstance $script:instance1 -Name $dbname + $db.Query($sql) + $sql = "INSERT INTO people (fname, lname, dob) VALUES ('Joe','Schmoe','2/2/2000') + INSERT INTO people (fname, lname, dob) VALUES ('Jane','Schmee','2/2/1950')" + $db.Query($sql) + } + AfterAll { + Remove-DbaDatabase -SqlInstance $script:instance1 -Database $dbname -Confirm:$false + $results | Remove-Item -Confirm:$false -ErrorAction Ignore + } + + Context "Command works" { + + It "Should output a file with specific content" { + $results = New-DbaDbMaskingConfig -SqlInstance $script:instance1 -Database $dbname -Path C:\temp + $results.Directory.Name | Should -Be temp + $results.FullName | Should -FileContentMatch $dbname + $results.FullName | Should -FileContentMatch fname + } + } +} \ No newline at end of file diff --git a/tests/New-DbaDbMasterKey.Tests.ps1 b/tests/New-DbaDbMasterKey.Tests.ps1 index 61b777d6ae..e01c0331e9 100644 --- a/tests/New-DbaDbMasterKey.Tests.ps1 +++ b/tests/New-DbaDbMasterKey.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 7 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\New-DbaDbMasterKey).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Database', 'Credential', 'SecurePassword', 'InputObject', 'EnableException' - It "Should contain our specific parameters" { - ((Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Credential','Database','SecurePassword','InputObject','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/New-DbaDbSnapshot.Tests.ps1 b/tests/New-DbaDbSnapshot.Tests.ps1 index dd3e02497a..150495c410 100644 --- a/tests/New-DbaDbSnapshot.Tests.ps1 +++ b/tests/New-DbaDbSnapshot.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 11 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\New-DbaDbSnapshot).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Database', 'ExcludeDatabase', 'AllDatabases', 'Name', 'NameSuffix', 'Path', 'Force', 'InputObject', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Database','ExcludeDatabase','AllDatabases','Name','NameSuffix','Path','Force','InputObject','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/New-DbaDbUser.Tests.ps1 b/tests/New-DbaDbUser.Tests.ps1 index 6a1cf02348..13c905bba0 100644 --- a/tests/New-DbaDbUser.Tests.ps1 +++ b/tests/New-DbaDbUser.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 9 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\New-DbaDbUser).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Database', 'ExcludeDatabase', 'IncludeSystem', 'Login', 'Username', 'Force', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Database','ExcludeDatabase','IncludeSystem','Login','Username','Force','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/New-DbaDirectory.Tests.ps1 b/tests/New-DbaDirectory.Tests.ps1 index d2225f5f50..a66c58b145 100644 --- a/tests/New-DbaDirectory.Tests.ps1 +++ b/tests/New-DbaDirectory.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 4 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\New-DbaDirectory).Parameters.Keys - $knownParameters = 'SqlInstance', 'Path', 'SqlCredential', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','Path','SqlCredential','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/New-DbaEndpoint.Tests.ps1 b/tests/New-DbaEndpoint.Tests.ps1 index 35f4780ad0..ae2719ddec 100644 --- a/tests/New-DbaEndpoint.Tests.ps1 +++ b/tests/New-DbaEndpoint.Tests.ps1 @@ -4,23 +4,11 @@ Write-Host -Object "Running $PSCommandpath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tags "UnitTests" { Context "Validate parameters" { - $knownParameters = 'SqlInstance', 'SqlCredential', 'Name', 'Type', 'Protocol', 'Role', 'EndpointEncryption', 'EncryptionAlgorithm', 'Certificate', 'Port', 'SslPort', 'Owner', 'EnableException' - $SupportShouldProcess = $true - $paramCount = $knownParameters.Count - if ($SupportShouldProcess) { - $defaultParamCount = 13 - } else { - $defaultParamCount = 11 - } - $command = Get-Command -Name $CommandName - [object[]]$params = $command.Parameters.Keys - - It "Should contain our specific parameters" { - ((Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count) | Should Be $paramCount - } - - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Name','Type','Protocol','Role','EndpointEncryption','EncryptionAlgorithm','Certificate','Port','SslPort','Owner','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/New-DbaLogin.Tests.ps1 b/tests/New-DbaLogin.Tests.ps1 index 220ceb183f..458827f714 100644 --- a/tests/New-DbaLogin.Tests.ps1 +++ b/tests/New-DbaLogin.Tests.ps1 @@ -7,15 +7,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 19 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\New-DbaLogin).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Login', 'InputObject', 'LoginRenameHashtable', 'SecurePassword', 'HashedPassword', 'MapToCertificate', 'MapToAsymmetricKey', 'MapToCredential', 'Sid', 'DefaultDatabase', 'Language', 'PasswordExpiration', 'PasswordPolicy', 'Disabled', 'NewSid', 'Force', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Login','InputObject','LoginRenameHashtable','SecurePassword','HashedPassword','MapToCertificate','MapToAsymmetricKey','MapToCredential','Sid','DefaultDatabase','Language','PasswordExpiration','PasswordPolicy','Disabled','NewSid','Force','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/New-DbaScriptingOption.Tests.ps1 b/tests/New-DbaScriptingOption.Tests.ps1 index ea82c5d41c..d3f33db929 100644 --- a/tests/New-DbaScriptingOption.Tests.ps1 +++ b/tests/New-DbaScriptingOption.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 0 - $defaultParamCount = 0 - [object[]]$params = (Get-ChildItem function:\New-DbaScriptingOption).Parameters.Keys - $knownParameters = '' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = $null + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It -Skip "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/New-DbaServiceMasterKey.Tests.ps1 b/tests/New-DbaServiceMasterKey.Tests.ps1 index 984cfdc60d..678b064eaf 100644 --- a/tests/New-DbaServiceMasterKey.Tests.ps1 +++ b/tests/New-DbaServiceMasterKey.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 5 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\New-DbaServiceMasterKey).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'SecurePassword', 'Credential', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Credential','SecurePassword','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/New-DbaSsisCatalog.Tests.ps1 b/tests/New-DbaSsisCatalog.Tests.ps1 index 1fe8a7b680..28bf77d58a 100644 --- a/tests/New-DbaSsisCatalog.Tests.ps1 +++ b/tests/New-DbaSsisCatalog.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\New-DbaSsisCatalog).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'SecurePassword', 'Credential', 'SsisCatalog', 'EnableException' - $paramCount = $knownParameters.Count - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Credential','SecurePassword','SsisCatalog','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/New-DbaXESession.Tests.ps1 b/tests/New-DbaXESession.Tests.ps1 index eb21bb5f9c..20a87e3705 100644 --- a/tests/New-DbaXESession.Tests.ps1 +++ b/tests/New-DbaXESession.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 4 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\New-DbaXESession).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Name', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Name','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/New-DbaXESmartCsvWriter.Tests.ps1 b/tests/New-DbaXESmartCsvWriter.Tests.ps1 index e2f8985977..70b38cdfdf 100644 --- a/tests/New-DbaXESmartCsvWriter.Tests.ps1 +++ b/tests/New-DbaXESmartCsvWriter.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 6 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\New-DbaXESmartCsvWriter).Parameters.Keys - $knownParameters = 'OutputFile', 'Overwrite', 'Event', 'OutputColumn', 'Filter', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'OutputFile','Overwrite','Event','OutputColumn','Filter','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/New-DbaXESmartEmail.Tests.ps1 b/tests/New-DbaXESmartEmail.Tests.ps1 index 4bd69bcdb8..5d0e5c0a87 100644 --- a/tests/New-DbaXESmartEmail.Tests.ps1 +++ b/tests/New-DbaXESmartEmail.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 14 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\New-DbaXESmartEmail).Parameters.Keys - $knownParameters = 'SmtpServer', 'Sender', 'To', 'Cc', 'Bcc', 'Credential', 'Subject', 'Body', 'Attachment', 'AttachmentFileName', 'PlainText', 'Event', 'Filter', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SmtpServer','Sender','To','Cc','Bcc','Credential','Subject','Body','Attachment','AttachmentFileName','PlainText','Event','Filter','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/New-DbaXESmartQueryExec.Tests.ps1 b/tests/New-DbaXESmartQueryExec.Tests.ps1 index 38718cc6c7..f160c3336d 100644 --- a/tests/New-DbaXESmartQueryExec.Tests.ps1 +++ b/tests/New-DbaXESmartQueryExec.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 7 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\New-DbaXESmartQueryExec).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Database', 'Query', 'EnableException', 'Event', 'Filter' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Database','Query','EnableException','Event','Filter' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/New-DbaXESmartReplay.Tests.ps1 b/tests/New-DbaXESmartReplay.Tests.ps1 index 2f76980d75..934cc67794 100644 --- a/tests/New-DbaXESmartReplay.Tests.ps1 +++ b/tests/New-DbaXESmartReplay.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 9 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\New-DbaXESmartReplay).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Database', 'Event', 'Filter', 'DelaySeconds', 'StopOnError', 'ReplayIntervalSeconds', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Database','Event','Filter','DelaySeconds','StopOnError','ReplayIntervalSeconds','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/New-DbaXESmartTableWriter.Tests.ps1 b/tests/New-DbaXESmartTableWriter.Tests.ps1 index 1954fa50bc..ca0bd3dc44 100644 --- a/tests/New-DbaXESmartTableWriter.Tests.ps1 +++ b/tests/New-DbaXESmartTableWriter.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 10 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\New-DbaXESmartTableWriter).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Database', 'Table', 'AutoCreateTargetTable', 'UploadIntervalSeconds', 'Event', 'OutputColumn', 'Filter', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Database','Table','AutoCreateTargetTable','UploadIntervalSeconds','Event','OutputColumn','Filter','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/New-DbatoolsSupportPackage.Tests.ps1 b/tests/New-DbatoolsSupportPackage.Tests.ps1 index 7c605c0063..456bfdf751 100644 --- a/tests/New-DbatoolsSupportPackage.Tests.ps1 +++ b/tests/New-DbatoolsSupportPackage.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 3 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\New-DbatoolsSupportPackage).Parameters.Keys - $knownParameters = 'Path', 'Variables', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'Path','Variables','PassThru','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Publish-DbaDacPackage.Tests.ps1 b/tests/Publish-DbaDacPackage.Tests.ps1 index 6e05bc5be6..fa8f46eeb6 100644 --- a/tests/Publish-DbaDacPackage.Tests.ps1 +++ b/tests/Publish-DbaDacPackage.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 15 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Publish-DbaDacPackage).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Path', 'PublishXml', 'Database', 'ConnectionString', 'GenerateDeploymentScript', 'GenerateDeploymentReport', 'ScriptOnly', 'OutputPath', 'IncludeSqlCmdVars', 'EnableException', 'DacFxPath', 'Type', 'DacOption' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Path','PublishXml','Database','ConnectionString','GenerateDeploymentScript','GenerateDeploymentReport','ScriptOnly','Type','OutputPath','IncludeSqlCmdVars','DacOption','EnableException','DacFxPath' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } @@ -50,20 +46,20 @@ if (-not $env:appveyor) { Remove-Item -Confirm:$false -Path $outputScript -ErrorAction SilentlyContinue } It "Performs an xml-based deployment" { - $results = $dacpac | Publish-DbaDacPackage -PublishXml $publishprofile.FileName -Database $dbname -SqlInstance $script:instance2 + $results = $dacpac | Publish-DbaDacPackage -PublishXml $publishprofile.FileName -Database $dbname -SqlInstance $script:instance2 -Confirm:$false $results.Result | Should -BeLike '*Update complete.*' $ids = Invoke-DbaQuery -Database $dbname -SqlInstance $script:instance2 -Query 'SELECT id FROM dbo.example' $ids.id | Should -Not -BeNullOrEmpty } It "Performs an SMO-based deployment" { $options = New-DbaDacOption -Action Publish - $results = $dacpac | Publish-DbaDacPackage -DacOption $options -Database $dbname -SqlInstance $script:instance2 + $results = $dacpac | Publish-DbaDacPackage -DacOption $options -Database $dbname -SqlInstance $script:instance2 -Confirm:$false $results.Result | Should -BeLike '*Update complete.*' $ids = Invoke-DbaQuery -Database $dbname -SqlInstance $script:instance2 -Query 'SELECT id FROM dbo.example' $ids.id | Should -Not -BeNullOrEmpty } It "Performs a script generation without deployment" { - $results = $dacpac | Publish-DbaDacPackage -Database $dbname -SqlInstance $script:instance2 -ScriptOnly -GenerateDeploymentScript -PublishXml $publishprofile.FileName + $results = $dacpac | Publish-DbaDacPackage -Database $dbname -SqlInstance $script:instance2 -ScriptOnly -GenerateDeploymentScript -PublishXml $publishprofile.FileName -Confirm:$false $results.Result | Should -BeLike '*Reporting and scripting deployment plan (Complete)*' $results.DatabaseScriptPath | Should -Not -BeNullOrEmpty Test-Path ($results.DatabaseScriptPath) | Should -Be $true @@ -73,10 +69,10 @@ if (-not $env:appveyor) { It "Should throw when the script output is not specified" { $opts = New-DbaDacOption -Action Publish # GenerateDeploymentScript is false - { $dacpac | Publish-DbaDacPackage -DacOption $opts -Database $dbname -SqlInstance $script:instance2 -ScriptOnly -EnableException } | Should -Throw + { $dacpac | Publish-DbaDacPackage -DacOption $opts -Database $dbname -SqlInstance $script:instance2 -ScriptOnly -EnableException -Confirm:$false} | Should -Throw $opts.GenerateDeploymentScript = $true # GenerateDeploymentScript is true, but no path specified - { $dacpac | Publish-DbaDacPackage -DacOption $opts -Database $dbname -SqlInstance $script:instance2 -ScriptOnly -EnableException } | Should -Throw + { $dacpac | Publish-DbaDacPackage -DacOption $opts -Database $dbname -SqlInstance $script:instance2 -ScriptOnly -EnableException -Confirm:$false } | Should -Throw } } Context "Bacpac tests" { @@ -89,13 +85,13 @@ if (-not $env:appveyor) { } It "Performs an SMO-based deployment" { $options = New-DbaDacOption -Action Publish -Type Bacpac - $results = $bacpac | Publish-DbaDacPackage -Type Bacpac -DacOption $options -Database $dbname -SqlInstance $script:instance2 + $results = $bacpac | Publish-DbaDacPackage -Type Bacpac -DacOption $options -Database $dbname -SqlInstance $script:instance2 -Confirm:$false $results.Result | Should -BeLike '*Updating database (Complete)*' $ids = Invoke-DbaQuery -Database $dbname -SqlInstance $script:instance2 -Query 'SELECT id FROM dbo.example' $ids.id | Should -Not -BeNullOrEmpty } It "Should throw when ScriptOnly is used" { - { $bacpac | Publish-DbaDacPackage -Database $dbname -SqlInstance $script:instance2 -ScriptOnly -Type Bacpac -EnableException } | Should -Throw + { $bacpac | Publish-DbaDacPackage -Database $dbname -SqlInstance $script:instance2 -ScriptOnly -Type Bacpac -EnableException -Confirm:$false } | Should -Throw } } } diff --git a/tests/Read-DbaAuditFile.Tests.ps1 b/tests/Read-DbaAuditFile.Tests.ps1 index b1287a19d2..b4aeed8a09 100644 --- a/tests/Read-DbaAuditFile.Tests.ps1 +++ b/tests/Read-DbaAuditFile.Tests.ps1 @@ -10,15 +10,11 @@ $base = (Get-Module -Name dbatools).ModuleBase Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 4 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Read-DbaAuditFile).Parameters.Keys - $knownParameters = 'Path', 'Exact', 'Raw', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'Path','Exact','Raw','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Read-DbaBackupHeader.Tests.ps1 b/tests/Read-DbaBackupHeader.Tests.ps1 index aa4e291b3a..6524f72541 100644 --- a/tests/Read-DbaBackupHeader.Tests.ps1 +++ b/tests/Read-DbaBackupHeader.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 7 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Read-DbaBackupHeader).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Path', 'Simple', 'FileList', 'AzureCredential', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Path','Simple','FileList','AzureCredential','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Read-DbaTraceFile.Tests.ps1 b/tests/Read-DbaTraceFile.Tests.ps1 index 74451b552b..a230396b8d 100644 --- a/tests/Read-DbaTraceFile.Tests.ps1 +++ b/tests/Read-DbaTraceFile.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 15 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Read-DbaTraceFile).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Path', 'Database', 'Login', 'Spid', 'EventClass', 'ObjectType', 'ErrorId', 'EventSequence', 'TextData', 'ApplicationName', 'ObjectName', 'Where', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Path','Database','Login','Spid','EventClass','ObjectType','ErrorId','EventSequence','TextData','ApplicationName','ObjectName','Where','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Read-DbaTransactionLog.Tests.ps1 b/tests/Read-DbaTransactionLog.Tests.ps1 index 5dec9b12de..ff8c94f954 100644 --- a/tests/Read-DbaTransactionLog.Tests.ps1 +++ b/tests/Read-DbaTransactionLog.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 6 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Read-DbaTransactionLog).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Database', 'IgnoreLimit', 'EnableException', 'RowLimit' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Database','IgnoreLimit','RowLimit','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Read-DbaXEFile.Tests.ps1 b/tests/Read-DbaXEFile.Tests.ps1 index 3c44c42808..09691afb1d 100644 --- a/tests/Read-DbaXEFile.Tests.ps1 +++ b/tests/Read-DbaXEFile.Tests.ps1 @@ -10,15 +10,11 @@ $base = (Get-Module -Name dbatools).ModuleBase Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 4 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Read-DbaXEFile).Parameters.Keys - $knownParameters = 'Path', 'Exact', 'Raw', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'Path','Exact','Raw','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Register-DbatoolsConfig.Tests.ps1 b/tests/Register-DbatoolsConfig.Tests.ps1 index 5157c35c81..d7b8c2ce16 100644 --- a/tests/Register-DbatoolsConfig.Tests.ps1 +++ b/tests/Register-DbatoolsConfig.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 6 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Register-DbatoolsConfig).Parameters.Keys - $knownParameters = 'Config', 'FullName', 'Module', 'Name', 'Scope', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'Config','FullName','Module','Name','Scope','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Remove-DbaAgDatabase.Tests.ps1 b/tests/Remove-DbaAgDatabase.Tests.ps1 index c6f5c463bf..08dab2952f 100644 --- a/tests/Remove-DbaAgDatabase.Tests.ps1 +++ b/tests/Remove-DbaAgDatabase.Tests.ps1 @@ -4,19 +4,11 @@ Write-Host -Object "Running $PSCommandpath" -ForegroundColor Cyan Describe "$commandname Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 6 - <# - Get commands, Default count = 11 - Commands with SupportShouldProcess = 13 - #> - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Remove-DbaAvailabilityGroup).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'AvailabilityGroup', 'AllAvailabilityGroups', 'InputObject', 'EnableException' - it "Should contain our specific parameters" { - ((Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count) | Should Be $paramCount - } - it "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Database','AvailabilityGroup','InputObject','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Remove-DbaAgListener.Tests.ps1 b/tests/Remove-DbaAgListener.Tests.ps1 index 6bb9373127..b2a75e7d1f 100644 --- a/tests/Remove-DbaAgListener.Tests.ps1 +++ b/tests/Remove-DbaAgListener.Tests.ps1 @@ -4,19 +4,11 @@ Write-Host -Object "Running $PSCommandpath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - <# - Get commands, Default count = 11 - Commands with SupportShouldProcess = 13 - #> - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Remove-DbaAgListener).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'AvailabilityGroup', 'Listener', 'InputObject', 'EnableException' - $paramCount = $knownParameters.Count - It "Should contain our specific parameters" { - ((Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Listener','AvailabilityGroup','InputObject','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Remove-DbaAgReplica.Tests.ps1 b/tests/Remove-DbaAgReplica.Tests.ps1 index a1ead80bbd..9eb510f672 100644 --- a/tests/Remove-DbaAgReplica.Tests.ps1 +++ b/tests/Remove-DbaAgReplica.Tests.ps1 @@ -4,19 +4,11 @@ Write-Host -Object "Running $PSCommandpath" -ForegroundColor Cyan Describe "$commandname Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 6 - <# - Get commands, Default count = 11 - Commands with SupportShouldProcess = 13 - #> - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Remove-DbaAgReplica).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'AvailabilityGroup', 'Replica', 'InputObject', 'EnableException' - it "Should contain our specific parameters" { - ((Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count) | Should Be $paramCount - } - it "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','AvailabilityGroup','Replica','InputObject','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Remove-DbaAgentJob.Tests.ps1 b/tests/Remove-DbaAgentJob.Tests.ps1 index eb48adc4a8..22bf23753a 100644 --- a/tests/Remove-DbaAgentJob.Tests.ps1 +++ b/tests/Remove-DbaAgentJob.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 8 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Remove-DbaAgentJob).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Job', 'KeepHistory', 'KeepUnusedSchedule', 'Mode', 'InputObject', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Job','KeepHistory','KeepUnusedSchedule','Mode','InputObject','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Remove-DbaAgentJobCategory.Tests.ps1 b/tests/Remove-DbaAgentJobCategory.Tests.ps1 index 23db2e0d69..6f7730b945 100644 --- a/tests/Remove-DbaAgentJobCategory.Tests.ps1 +++ b/tests/Remove-DbaAgentJobCategory.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 5 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Remove-DbaAgentJobCategory).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Category', 'Force', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Category','Force','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Remove-DbaAgentJobStep.Tests.ps1 b/tests/Remove-DbaAgentJobStep.Tests.ps1 index f9457ed2d8..c5ad4c687c 100644 --- a/tests/Remove-DbaAgentJobStep.Tests.ps1 +++ b/tests/Remove-DbaAgentJobStep.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 6 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Remove-DbaAgentJobStep).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Job', 'StepName', 'Mode', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Job','StepName','Mode','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Remove-DbaAgentSchedule.Tests.ps1 b/tests/Remove-DbaAgentSchedule.Tests.ps1 index a5412cd218..b624d2857a 100644 --- a/tests/Remove-DbaAgentSchedule.Tests.ps1 +++ b/tests/Remove-DbaAgentSchedule.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 6 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Remove-DbaAgentSchedule).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Schedule', 'InputObject', 'EnableException', 'Force' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Schedule','InputObject','EnableException','Force' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Remove-DbaAvailabilityGroup.Tests.ps1 b/tests/Remove-DbaAvailabilityGroup.Tests.ps1 index 5f6459061a..b0e635d9f8 100644 --- a/tests/Remove-DbaAvailabilityGroup.Tests.ps1 +++ b/tests/Remove-DbaAvailabilityGroup.Tests.ps1 @@ -4,19 +4,11 @@ Write-Host -Object "Running $PSCommandpath" -ForegroundColor Cyan Describe "$commandname Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 6 - <# - Get commands, Default count = 11 - Commands with SupportShouldProcess = 13 - #> - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Remove-DbaAvailabilityGroup).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'AvailabilityGroup', 'AllAvailabilityGroups', 'InputObject', 'EnableException' - it "Should contain our specific parameters" { - ((Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count) | Should Be $paramCount - } - it "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','AvailabilityGroup','AllAvailabilityGroups','InputObject','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Remove-DbaBackup.Tests.ps1 b/tests/Remove-DbaBackup.Tests.ps1 index 46ccc83fc6..bffd75ea26 100644 --- a/tests/Remove-DbaBackup.Tests.ps1 +++ b/tests/Remove-DbaBackup.Tests.ps1 @@ -5,11 +5,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 6 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Remove-DbaBackup).Parameters.Keys - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'Path','BackupFileExtension','RetentionPeriod','CheckArchiveBit','RemoveEmptyBackupFolder','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } Context "It's Confirm impact should be medium" { diff --git a/tests/Remove-DbaClientAlias.Tests.ps1 b/tests/Remove-DbaClientAlias.Tests.ps1 index a1d6dfb6ea..2196ecc690 100644 --- a/tests/Remove-DbaClientAlias.Tests.ps1 +++ b/tests/Remove-DbaClientAlias.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 4 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Remove-DbaClientAlias).Parameters.Keys - $knownParameters = 'ComputerName', 'Credential', 'Alias', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'ComputerName','Credential','Alias','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Remove-DbaCmConnection.Tests.ps1 b/tests/Remove-DbaCmConnection.Tests.ps1 index f41dc1fa45..d84401a383 100644 --- a/tests/Remove-DbaCmConnection.Tests.ps1 +++ b/tests/Remove-DbaCmConnection.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 2 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Remove-DbaCmConnection).Parameters.Keys - $knownParameters = 'ComputerName', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'ComputerName','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Remove-DbaCmsRegServer.Tests.ps1 b/tests/Remove-DbaCmsRegServer.Tests.ps1 index 9dd5357abb..e9f788ceb3 100644 --- a/tests/Remove-DbaCmsRegServer.Tests.ps1 +++ b/tests/Remove-DbaCmsRegServer.Tests.ps1 @@ -4,23 +4,11 @@ Write-Host -Object "Running $PSCommandpath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tags "UnitTests" { Context "Validate parameters" { - $knownParameters = 'SqlInstance', 'SqlCredential', 'Name', 'ServerName', 'Group', 'InputObject', 'EnableException' - $SupportShouldProcess = $true - $paramCount = $knownParameters.Count - if ($SupportShouldProcess) { - $defaultParamCount = 13 - } else { - $defaultParamCount = 11 - } - $command = Get-Command -Name $CommandName - [object[]]$params = $command.Parameters.Keys - - It "Should contain our specific parameters" { - ((Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count) | Should Be $paramCount - } - - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Name','ServerName','Group','InputObject','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Remove-DbaCmsRegServerGroup.Tests.ps1 b/tests/Remove-DbaCmsRegServerGroup.Tests.ps1 index 0955621e2d..5ff97e8c1f 100644 --- a/tests/Remove-DbaCmsRegServerGroup.Tests.ps1 +++ b/tests/Remove-DbaCmsRegServerGroup.Tests.ps1 @@ -4,23 +4,11 @@ Write-Host -Object "Running $PSCommandpath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tags "UnitTests" { Context "Validate parameters" { - $knownParameters = 'SqlInstance', 'SqlCredential', 'Name', 'InputObject', 'EnableException' - $SupportShouldProcess = $true - $paramCount = $knownParameters.Count - if ($SupportShouldProcess) { - $defaultParamCount = 13 - } else { - $defaultParamCount = 11 - } - $command = Get-Command -Name $CommandName - [object[]]$params = $command.Parameters.Keys - - It "Should contain our specific parameters" { - ((Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count) | Should Be $paramCount - } - - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Name','InputObject','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Remove-DbaComputerCertificate.Tests.ps1 b/tests/Remove-DbaComputerCertificate.Tests.ps1 index 3ff80f2ec6..f3eaebca2d 100644 --- a/tests/Remove-DbaComputerCertificate.Tests.ps1 +++ b/tests/Remove-DbaComputerCertificate.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 6 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Remove-DbaComputerCertificate).Parameters.Keys - $knownParameters = 'ComputerName', 'Credential', 'Thumbprint', 'Store', 'Folder', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'ComputerName','Credential','Thumbprint','Store','Folder','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Remove-DbaDatabase.Tests.ps1 b/tests/Remove-DbaDatabase.Tests.ps1 index 1aa23196bd..7125f4a9ef 100644 --- a/tests/Remove-DbaDatabase.Tests.ps1 +++ b/tests/Remove-DbaDatabase.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 6 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Remove-DbaDatabase).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Database', 'InputObject', 'IncludeSystemDb', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Database','InputObject','IncludeSystemDb','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Remove-DbaDatabaseSafely.Tests.ps1 b/tests/Remove-DbaDatabaseSafely.Tests.ps1 index ea1e7a6117..535c0c12c0 100644 --- a/tests/Remove-DbaDatabaseSafely.Tests.ps1 +++ b/tests/Remove-DbaDatabaseSafely.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 14 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Remove-DbaDatabaseSafely).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Database', 'Destination', 'DestinationCredential', 'NoDbccCheckDb', 'BackupFolder', 'CategoryName', 'JobOwner', 'AllDatabases', 'BackupCompression', 'ReuseSourceFolderStructure', 'Force', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Database','Destination','DestinationCredential','NoDbccCheckDb','BackupFolder','CategoryName','JobOwner','AllDatabases','BackupCompression','ReuseSourceFolderStructure','Force','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Remove-DbaDbBackupRestoreHistory.Tests.ps1 b/tests/Remove-DbaDbBackupRestoreHistory.Tests.ps1 new file mode 100644 index 0000000000..00fa67bbba --- /dev/null +++ b/tests/Remove-DbaDbBackupRestoreHistory.Tests.ps1 @@ -0,0 +1,19 @@ +$CommandName = $MyInvocation.MyCommand.Name.Replace(".Tests.ps1", "") +Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan +. "$PSScriptRoot\constants.ps1" + +Describe "$CommandName Unit Tests" -Tag 'UnitTests' { + Context "Validate parameters" { + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance', 'SqlCredential', 'KeepDays', 'Database', 'InputObject', 'EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 + } + } +} +<# + Integration test are custom to the command you are writing for. + Read https://github.com/sqlcollaborative/dbatools/blob/development/contributing.md#tests + for more guidence +#> \ No newline at end of file diff --git a/tests/Remove-DbaDbCertificate.Tests.ps1 b/tests/Remove-DbaDbCertificate.Tests.ps1 index 16aa076183..f88804f7e4 100644 --- a/tests/Remove-DbaDbCertificate.Tests.ps1 +++ b/tests/Remove-DbaDbCertificate.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 6 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Remove-DbaDbCertificate).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Database', 'Certificate', 'InputObject', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Database','Certificate','InputObject','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Remove-DbaDbMasterKey.Tests.ps1 b/tests/Remove-DbaDbMasterKey.Tests.ps1 index 027f38237f..3066c868ec 100644 --- a/tests/Remove-DbaDbMasterKey.Tests.ps1 +++ b/tests/Remove-DbaDbMasterKey.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 7 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Remove-DbaDbMasterKey).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Database', 'ExcludeDatabase', 'All', 'InputObject', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Database','ExcludeDatabase','All','InputObject','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Remove-DbaDbMirror.Tests.ps1 b/tests/Remove-DbaDbMirror.Tests.ps1 index 47402d0a03..b7df21331c 100644 --- a/tests/Remove-DbaDbMirror.Tests.ps1 +++ b/tests/Remove-DbaDbMirror.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 5 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Remove-DbaDbMirror).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Database', 'InputObject', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Database','InputObject','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Remove-DbaDbMirrorMonitor.Tests.ps1 b/tests/Remove-DbaDbMirrorMonitor.Tests.ps1 index f350d3a3e6..4ed662e6bc 100644 --- a/tests/Remove-DbaDbMirrorMonitor.Tests.ps1 +++ b/tests/Remove-DbaDbMirrorMonitor.Tests.ps1 @@ -4,23 +4,11 @@ Write-Host -Object "Running $PSCommandpath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tags "UnitTests" { Context "Validate parameters" { - $knownParameters = 'SqlInstance', 'SqlCredential', 'EnableException' - $SupportShouldProcess = $true - $paramCount = $knownParameters.Count - if ($SupportShouldProcess) { - $defaultParamCount = 13 - } else { - $defaultParamCount = 11 - } - $command = Get-Command -Name $CommandName - [object[]]$params = $command.Parameters.Keys - - It "Should contain our specific parameters" { - ((Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count) | Should Be $paramCount - } - - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Remove-DbaDbOrphanUser.Tests.ps1 b/tests/Remove-DbaDbOrphanUser.Tests.ps1 new file mode 100644 index 0000000000..5fe1565ece --- /dev/null +++ b/tests/Remove-DbaDbOrphanUser.Tests.ps1 @@ -0,0 +1,19 @@ +$CommandName = $MyInvocation.MyCommand.Name.Replace(".Tests.ps1", "") +Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan +. "$PSScriptRoot\constants.ps1" + +Describe "$CommandName Unit Tests" -Tag 'UnitTests' { + Context "Validate parameters" { + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Database','ExcludeDatabase','User','Force','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 + } + } +} +<# + Integration test should appear below and are custom to the command you are writing. + Read https://github.com/sqlcollaborative/dbatools/blob/development/contributing.md#tests + for more guidence. +#> \ No newline at end of file diff --git a/tests/Remove-DbaDbSnapshot.Tests.ps1 b/tests/Remove-DbaDbSnapshot.Tests.ps1 index 80a252b118..68e487d1e2 100644 --- a/tests/Remove-DbaDbSnapshot.Tests.ps1 +++ b/tests/Remove-DbaDbSnapshot.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 9 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Remove-DbaDbSnapshot).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Database', 'ExcludeDatabase', 'Snapshot', 'InputObject', 'AllSnapshots', 'Force', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Database','ExcludeDatabase','Snapshot','InputObject','AllSnapshots','Force','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Remove-DbaDbUser.Tests.ps1 b/tests/Remove-DbaDbUser.Tests.ps1 index 6e3e1d2dfd..98a692fc79 100644 --- a/tests/Remove-DbaDbUser.Tests.ps1 +++ b/tests/Remove-DbaDbUser.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 8 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Remove-DbaDbUser).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Database', 'ExcludeDatabase', 'User', 'InputObject', 'Force', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Database','ExcludeDatabase','User','InputObject','Force','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Remove-DbaEndpoint.Tests.ps1 b/tests/Remove-DbaEndpoint.Tests.ps1 index 6c74aea4e9..46a413d474 100644 --- a/tests/Remove-DbaEndpoint.Tests.ps1 +++ b/tests/Remove-DbaEndpoint.Tests.ps1 @@ -4,23 +4,11 @@ Write-Host -Object "Running $PSCommandpath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tags "UnitTests" { Context "Validate parameters" { - $knownParameters = 'SqlInstance', 'SqlCredential', 'EndPoint', 'AllEndpoints', 'InputObject', 'EnableException' - $SupportShouldProcess = $true - $paramCount = $knownParameters.Count - if ($SupportShouldProcess) { - $defaultParamCount = 13 - } else { - $defaultParamCount = 11 - } - $command = Get-Command -Name $CommandName - [object[]]$params = $command.Parameters.Keys - - It "Should contain our specific parameters" { - ((Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count) | Should Be $paramCount - } - - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','EndPoint','AllEndpoints','InputObject','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Remove-DbaLogin.Tests.ps1 b/tests/Remove-DbaLogin.Tests.ps1 index 6de704fa65..fe83410ca4 100644 --- a/tests/Remove-DbaLogin.Tests.ps1 +++ b/tests/Remove-DbaLogin.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 6 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Remove-DbaLogin).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Login', 'InputObject', 'Force', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Login','InputObject','Force','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Remove-DbaNetworkCertificate.Tests.ps1 b/tests/Remove-DbaNetworkCertificate.Tests.ps1 index d6eca07089..9c88b904d5 100644 --- a/tests/Remove-DbaNetworkCertificate.Tests.ps1 +++ b/tests/Remove-DbaNetworkCertificate.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 3 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Remove-DbaNetworkCertificate).Parameters.Keys - $knownParameters = 'SqlInstance', 'Credential', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','Credential','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Remove-DbaOrphanUser.Tests.ps1 b/tests/Remove-DbaOrphanUser.Tests.ps1 deleted file mode 100644 index 9b521086f0..0000000000 --- a/tests/Remove-DbaOrphanUser.Tests.ps1 +++ /dev/null @@ -1,23 +0,0 @@ -$CommandName = $MyInvocation.MyCommand.Name.Replace(".Tests.ps1", "") -Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan -. "$PSScriptRoot\constants.ps1" - -Describe "$CommandName Unit Tests" -Tag 'UnitTests' { - Context "Validate parameters" { - $paramCount = 7 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Remove-DbaOrphanUser).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Database', 'ExcludeDatabase', 'User', 'Force', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount - } - } -} -<# - Integration test should appear below and are custom to the command you are writing. - Read https://github.com/sqlcollaborative/dbatools/blob/development/contributing.md#tests - for more guidence. -#> \ No newline at end of file diff --git a/tests/Remove-DbaPfDataCollectorCounter.Tests.ps1 b/tests/Remove-DbaPfDataCollectorCounter.Tests.ps1 index 3e1a6dcc1a..b7682379d7 100644 --- a/tests/Remove-DbaPfDataCollectorCounter.Tests.ps1 +++ b/tests/Remove-DbaPfDataCollectorCounter.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 7 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Remove-DbaPfDataCollectorCounter).Parameters.Keys - $knownParameters = 'ComputerName', 'Credential', 'CollectorSet', 'Collector', 'Counter', 'InputObject', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'ComputerName','Credential','CollectorSet','Collector','Counter','InputObject','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Remove-DbaPfDataCollectorSet.Tests.ps1 b/tests/Remove-DbaPfDataCollectorSet.Tests.ps1 index 4a9c4fd093..bd6cb3bba6 100644 --- a/tests/Remove-DbaPfDataCollectorSet.Tests.ps1 +++ b/tests/Remove-DbaPfDataCollectorSet.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 5 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Remove-DbaPfDataCollectorSet).Parameters.Keys - $knownParameters = 'ComputerName', 'Credential', 'CollectorSet', 'InputObject', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'ComputerName','Credential','CollectorSet','InputObject','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Remove-DbaSpn.Tests.ps1 b/tests/Remove-DbaSpn.Tests.ps1 index d1c649c0af..03371192ce 100644 --- a/tests/Remove-DbaSpn.Tests.ps1 +++ b/tests/Remove-DbaSpn.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 4 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Remove-DbaSpn).Parameters.Keys - $knownParameters = 'SPN', 'ServiceAccount', 'Credential', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SPN','ServiceAccount','Credential','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Remove-DbaTrace.Tests.ps1 b/tests/Remove-DbaTrace.Tests.ps1 index 556a5e7941..3e05578cf3 100644 --- a/tests/Remove-DbaTrace.Tests.ps1 +++ b/tests/Remove-DbaTrace.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 5 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Remove-DbaTrace).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Id', 'InputObject', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Id','InputObject','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Remove-DbaXESession.Tests.ps1 b/tests/Remove-DbaXESession.Tests.ps1 index f5ba99af75..71b1a51110 100644 --- a/tests/Remove-DbaXESession.Tests.ps1 +++ b/tests/Remove-DbaXESession.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 6 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Remove-DbaXESession).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Session', 'AllSessions', 'InputObject', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Session','AllSessions','InputObject','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Remove-DbaXESmartTarget.Tests.ps1 b/tests/Remove-DbaXESmartTarget.Tests.ps1 index d88d8ee184..afd171ab05 100644 --- a/tests/Remove-DbaXESmartTarget.Tests.ps1 +++ b/tests/Remove-DbaXESmartTarget.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 2 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Remove-DbaXESmartTarget).Parameters.Keys - $knownParameters = 'InputObject', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'InputObject','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Rename-DbaDatabase.Tests.ps1 b/tests/Rename-DbaDatabase.Tests.ps1 index 95b450d327..034a0aa550 100644 --- a/tests/Rename-DbaDatabase.Tests.ps1 +++ b/tests/Rename-DbaDatabase.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 16 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Rename-DbaDatabase).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Database', 'ExcludeDatabase', 'AllDatabases', 'DatabaseName', 'FileGroupName', 'LogicalName', 'FileName', 'ReplaceBefore', 'Force', 'Move', 'SetOffline', 'Preview', 'InputObject', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Database','ExcludeDatabase','AllDatabases','DatabaseName','FileGroupName','LogicalName','FileName','ReplaceBefore','Force','Move','SetOffline','Preview','InputObject','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Rename-DbaLogin.Tests.ps1 b/tests/Rename-DbaLogin.Tests.ps1 index d5dc7ac198..594db1c72c 100644 --- a/tests/Rename-DbaLogin.Tests.ps1 +++ b/tests/Rename-DbaLogin.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 5 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Rename-DbaLogin).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Login', 'NewLogin', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Login','NewLogin','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Repair-DbaDbMirror.Tests.ps1 b/tests/Repair-DbaDbMirror.Tests.ps1 index 85e211327c..b7df21331c 100644 --- a/tests/Repair-DbaDbMirror.Tests.ps1 +++ b/tests/Repair-DbaDbMirror.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 5 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Repair-DbaDbMirror).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Database', 'InputObject', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Database','InputObject','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Repair-DbaOrphanUser.Tests.ps1 b/tests/Repair-DbaDbOrphanUser.Tests.ps1 similarity index 77% rename from tests/Repair-DbaOrphanUser.Tests.ps1 rename to tests/Repair-DbaDbOrphanUser.Tests.ps1 index 2060dbaceb..1e7c42dd6c 100644 --- a/tests/Repair-DbaOrphanUser.Tests.ps1 +++ b/tests/Repair-DbaDbOrphanUser.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandpath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 8 - $commonParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Repair-DbaOrphanUser).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Database', 'ExcludeDatabase', 'Users', 'RemoveNotExisting', 'Force', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $commonParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Database','ExcludeDatabase','Users','RemoveNotExisting','Force','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } @@ -52,7 +48,7 @@ CREATE LOGIN [dbatoolsci_orphan2] WITH PASSWORD = N'password2', CHECK_EXPIRATION It "shows time taken for preparation" { 1 | Should -Be 1 } - $results = Repair-DbaOrphanUser -SqlInstance $script:instance1 -Database dbatoolsci_orphan + $results = Repair-DbaDbOrphanUser -SqlInstance $script:instance1 -Database dbatoolsci_orphan It "Finds two orphans" { $results.Count | Should -Be 2 foreach ($user in $Users) { @@ -66,7 +62,7 @@ CREATE LOGIN [dbatoolsci_orphan2] WITH PASSWORD = N'password2', CHECK_EXPIRATION $ExpectedProps = 'ComputerName,InstanceName,SqlInstance,DatabaseName,User,Status'.Split(',') ($result.PsObject.Properties.Name | Sort-Object) | Should Be ($ExpectedProps | Sort-Object) } - $results = Repair-DbaOrphanUser -SqlInstance $script:instance1 -Database dbatoolsci_orphan + $results = Repair-DbaDbOrphanUser -SqlInstance $script:instance1 -Database dbatoolsci_orphan It "does not find any other orphan" { $results | Should -BeNullOrEmpty } diff --git a/tests/Repair-DbaServerName.Tests.ps1 b/tests/Repair-DbaServerName.Tests.ps1 index 704add148d..1b54478e7e 100644 --- a/tests/Repair-DbaServerName.Tests.ps1 +++ b/tests/Repair-DbaServerName.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 5 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Repair-DbaServerName).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'AutoFix', 'Force', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','AutoFix','Force','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Reset-DbaAdmin.Tests.ps1 b/tests/Reset-DbaAdmin.Tests.ps1 index df5f3991fa..c6dec0f39a 100644 --- a/tests/Reset-DbaAdmin.Tests.ps1 +++ b/tests/Reset-DbaAdmin.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Reset-DbaAdmin).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Login', 'SecurePassword', 'Force', 'EnableException' - $paramCount = $knownParameters.Count - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Login','SecurePassword','Force','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Reset-DbatoolsConfig.Tests.ps1 b/tests/Reset-DbatoolsConfig.Tests.ps1 new file mode 100644 index 0000000000..2d8047c7a3 --- /dev/null +++ b/tests/Reset-DbatoolsConfig.Tests.ps1 @@ -0,0 +1,19 @@ +$CommandName = $MyInvocation.MyCommand.Name.Replace(".Tests.ps1", "") +Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan +. "$PSScriptRoot\constants.ps1" + +Describe "$CommandName Unit Tests" -Tag 'UnitTests' { + Context "Validate parameters" { + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'ConfigurationItem', 'FullName', 'Module', 'Name', 'EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 + } + } +} +<# + Integration test are custom to the command you are writing for. + Read https://github.com/sqlcollaborative/dbatools/blob/development/contributing.md#tests + for more guidence +#> \ No newline at end of file diff --git a/tests/Resolve-DbaNetworkName.Tests.ps1 b/tests/Resolve-DbaNetworkName.Tests.ps1 index 49d046d97c..5f61d93bfd 100644 --- a/tests/Resolve-DbaNetworkName.Tests.ps1 +++ b/tests/Resolve-DbaNetworkName.Tests.ps1 @@ -4,15 +4,63 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 4 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Resolve-DbaNetworkName).Parameters.Keys - $knownParameters = 'ComputerName', 'Credential', 'Turbo', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'ComputerName','Credential','Turbo','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + } + Context "Testing basic name resolution" { + It "should test env:computername" { + $result = Resolve-DbaNetworkName $env:computername -EnableException + $result.InputName | Should -Be $env:computername + $result.ComputerName | Should -Be $env:computername + $result.IPAddress | Should -Not -BeNullOrEmpty + $result.DNSHostName | Should -Be $env:computername + if ($result.DNSDomain) { + $result.FullComputerName | Should -Be ($result.ComputerName + "." + $result.DNSDomain) + } else { + $result.FullComputerName | Should -Be $env:computername + } + } + It "should test localhost" { + $result = Resolve-DbaNetworkName localhost -EnableException + $result.InputName | Should -Be localhost + $result.ComputerName | Should -Be $env:computername + $result.IPAddress | Should -Not -BeNullOrEmpty + $result.DNSHostName | Should -Be $env:computername + if ($result.DNSDomain) { + $result.FullComputerName | Should -Be ($result.ComputerName + "." + $result.DNSDomain) + } else { + $result.FullComputerName | Should -Be $env:computername + } + } + It "should test 127.0.0.1" { + $result = Resolve-DbaNetworkName 127.0.0.1 -EnableException + $result.InputName | Should -Be 127.0.0.1 + $result.ComputerName | Should -Be $env:computername + $result.IPAddress | Should -Not -BeNullOrEmpty + $result.DNSHostName | Should -Be $env:computername + if ($result.DNSDomain) { + $result.FullComputerName | Should -Be ($result.ComputerName + "." + $result.DNSDomain) + } else { + $result.FullComputerName | Should -Be $env:computername + } + } + foreach ($turbo in $true, $false) { + It "should test 8.8.8.8 with Turbo = $turbo" { + $result = Resolve-DbaNetworkName 8.8.8.8 -EnableException -Turbo:$turbo + $result.InputName | Should -Be 8.8.8.8 + $result.ComputerName | Should -Be google-public-dns-a + $result.IPAddress | Should -Be 8.8.8.8 + $result.DNSHostName | Should -Be google-public-dns-a + $result.DNSDomain | Should -Be google.com + $result.Domain | Should -Be google.com + $result.DNSHostEntry | Should -Be google-public-dns-a.google.com + $result.FQDN | Should -Be google-public-dns-a.google.com + $result.FullComputerName | Should -Be 8.8.8.8 + } } } } diff --git a/tests/Restart-DbaService.Tests.ps1 b/tests/Restart-DbaService.Tests.ps1 index 13d345c481..2ad6e506e8 100644 --- a/tests/Restart-DbaService.Tests.ps1 +++ b/tests/Restart-DbaService.Tests.ps1 @@ -5,15 +5,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 8 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Restart-DbaService).Parameters.Keys - $knownParameters = 'ComputerName', 'InstanceName', 'Type', 'InputObject', 'Timeout', 'Credential', 'Force', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'ComputerName','InstanceName','Type','InputObject','Timeout','Credential','Force','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Restore-DbaBackupFromDirectory.Tests.ps1 b/tests/Restore-DbaBackupFromDirectory.Tests.ps1 index 58dc20a2d1..4091b4416a 100644 --- a/tests/Restore-DbaBackupFromDirectory.Tests.ps1 +++ b/tests/Restore-DbaBackupFromDirectory.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 6 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Restore-DbaBackupFromDirectory).Parameters.Keys - $knownParameters = 'SqlInstance', 'Path', 'NoRecovery', 'ReuseSourceFolderStructure', 'SqlCredential', 'Force' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','Path','NoRecovery','ReuseSourceFolderStructure','SqlCredential','Force' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Restore-DbaDatabase.Tests.ps1 b/tests/Restore-DbaDatabase.Tests.ps1 index e3249b028d..ed96aedb56 100644 --- a/tests/Restore-DbaDatabase.Tests.ps1 +++ b/tests/Restore-DbaDatabase.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 45 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Restore-DbaDatabase).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Path', 'DatabaseName', 'DestinationDataDirectory', 'DestinationLogDirectory', 'DestinationFileStreamDirectory', 'RestoreTime', 'NoRecovery', 'WithReplace', 'XpDirTree', 'OutputScriptOnly', 'VerifyOnly', 'MaintenanceSolutionBackup', 'FileMapping', 'IgnoreLogBackup', 'useDestinationDefaultDirectories', 'ReuseSourceFolderStructure', 'DestinationFilePrefix', 'RestoredDatabaseNamePrefix', 'TrustDbBackupHistory', 'MaxTransferSize', 'BlockSize', 'BufferCount', 'DirectoryRecurse', 'EnableException', 'StandbyDirectory', 'Continue', 'AzureCredential', 'ReplaceDbNameInFile', 'DestinationFileSuffix', 'Recover', 'KeepCDC', 'AllowContinue', 'GetBackupInformation', 'StopAfterGetBackupInformation', 'SelectBackupInformation', 'StopAfterSelectBackupInformation', 'FormatBackupInformation', 'StopAfterFormatBackupInformation', 'TestBackupInformation', 'StopAfterTestBackupInformation', 'PageRestore', 'PageRestoreTailFolder', 'StatementTimeout' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance', 'SqlCredential', 'Path', 'DatabaseName', 'DestinationDataDirectory', 'DestinationLogDirectory', 'DestinationFileStreamDirectory', 'RestoreTime', 'NoRecovery', 'WithReplace', 'XpDirTree', 'OutputScriptOnly', 'VerifyOnly', 'MaintenanceSolutionBackup', 'FileMapping', 'IgnoreLogBackup', 'UseDestinationDefaultDirectories', 'ReuseSourceFolderStructure', 'DestinationFilePrefix', 'RestoredDatabaseNamePrefix', 'TrustDbBackupHistory', 'MaxTransferSize', 'BlockSize', 'BufferCount', 'DirectoryRecurse', 'EnableException', 'StandbyDirectory', 'Continue', 'AzureCredential', 'ReplaceDbNameInFile', 'DestinationFileSuffix', 'Recover', 'KeepCDC', 'AllowContinue', 'GetBackupInformation', 'StopAfterGetBackupInformation', 'SelectBackupInformation', 'StopAfterSelectBackupInformation', 'FormatBackupInformation', 'StopAfterFormatBackupInformation', 'TestBackupInformation', 'StopAfterTestBackupInformation', 'PageRestore', 'PageRestoreTailFolder', 'StatementTimeout' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } @@ -39,7 +35,7 @@ Describe "$CommandName Integration Tests" -Tag "IntegrationTests" { Context "Ensuring warning is thrown if database already exists" { $results = Restore-DbaDatabase -SqlInstance $script:instance2 -Path $script:appveyorlabrepo\singlerestore\singlerestore.bak -WarningVariable warning -WarningAction SilentlyContinue It "Should warn" { - $warning | Where-Object { $_ -like '*Test-DbaBackupInformation*Database*' } | Should Match "exists and WithReplace not specified, stopping" + $warning | Where-Object { $_ -like '*Test-DbaBackupInformation*Database*' } | Should Match "exists, so WithReplace must be specified" } It "Should not return object" { $results | Should Be $null @@ -831,7 +827,7 @@ Describe "$CommandName Integration Tests" -Tag "IntegrationTests" { } } - if ($env:azurepasswd) { + if ($env:azurepasswd -and -not $env:appveyor) { Context "Restores Striped backup From Azure using SAS" { BeforeAll { $server = Connect-DbaInstance -SqlInstance $script:instance2 diff --git a/tests/Restore-DbaDbCertificate.Tests.ps1 b/tests/Restore-DbaDbCertificate.Tests.ps1 index 7d4dc90388..b6510ac90b 100644 --- a/tests/Restore-DbaDbCertificate.Tests.ps1 +++ b/tests/Restore-DbaDbCertificate.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 7 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Restore-DbaDbCertificate).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Path', 'Database', 'SecurePassword', 'EncryptionPassword', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Path','EncryptionPassword','Database','SecurePassword','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Restore-DbaDbSnapshot.Tests.ps1 b/tests/Restore-DbaDbSnapshot.Tests.ps1 index b8f0817b45..22ba0d2a1c 100644 --- a/tests/Restore-DbaDbSnapshot.Tests.ps1 +++ b/tests/Restore-DbaDbSnapshot.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 8 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Restore-DbaDbSnapshot).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Database', 'ExcludeDatabase', 'Snapshot', 'InputObject', 'Force', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Database','ExcludeDatabase','Snapshot','InputObject','Force','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Resume-DbaAgDbDataMovement.Tests.ps1 b/tests/Resume-DbaAgDbDataMovement.Tests.ps1 index 094c762b17..18d7a3bfc8 100644 --- a/tests/Resume-DbaAgDbDataMovement.Tests.ps1 +++ b/tests/Resume-DbaAgDbDataMovement.Tests.ps1 @@ -4,19 +4,11 @@ Write-Host -Object "Running $PSCommandpath" -ForegroundColor Cyan Describe "$commandname Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 6 - <# - Get commands, Default count = 11 - Commands with SupportShouldProcess = 13 - #> - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Resume-DbaAgDbDataMovement).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'AvailabilityGroup', 'Database', 'InputObject', 'EnableException' - it "Should contain our specific parameters" { - ((Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count) | Should Be $paramCount - } - it "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','AvailabilityGroup','Database','InputObject','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Revoke-DbaAgPermission.Tests.ps1 b/tests/Revoke-DbaAgPermission.Tests.ps1 index e0423cd638..c9bd3c6fae 100644 --- a/tests/Revoke-DbaAgPermission.Tests.ps1 +++ b/tests/Revoke-DbaAgPermission.Tests.ps1 @@ -4,19 +4,11 @@ Write-Host -Object "Running $PSCommandpath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - <# - Get commands, Default count = 11 - Commands with SupportShouldProcess = 13 - #> - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Revoke-DbaAgPermission).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Login', 'AvailabilityGroup', 'Type', 'Permission', 'InputObject', 'EnableException' - $paramCount = $knownParameters.Count - It "Should contain our specific parameters" { - ((Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Login','AvailabilityGroup','Type','Permission','InputObject','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Save-DbaDiagnosticQueryScript.Tests.ps1 b/tests/Save-DbaDiagnosticQueryScript.Tests.ps1 index 88b5092561..4a6cb25174 100644 --- a/tests/Save-DbaDiagnosticQueryScript.Tests.ps1 +++ b/tests/Save-DbaDiagnosticQueryScript.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 2 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Save-DbaDiagnosticQueryScript).Parameters.Keys - $knownParameters = 'Path', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'Path','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Select-DbaBackupInformation.Tests.ps1 b/tests/Select-DbaBackupInformation.Tests.ps1 index 6fd0c61310..1512c2786c 100644 --- a/tests/Select-DbaBackupInformation.Tests.ps1 +++ b/tests/Select-DbaBackupInformation.Tests.ps1 @@ -3,26 +3,18 @@ Write-Host -Object "Running $PSCommandpath" -ForegroundColor Cyan . "$PSScriptRoot\constants.ps1" Describe "$commandname Unit Tests" -Tag 'UnitTests' { - InModuleScope dbatools { - Context "Empty TLog Backup Issues" { - $Header = ConvertFrom-Json -InputObject (Get-Content $PSScriptRoot\..\tests\ObjectDefinitions\BackupRestore\RawInput\EmptyTlogData.json -raw) - $header | Add-Member -Type NoteProperty -Name FullName -Value 1 - $Output = Select-DbaBackupInformation -BackupHistory $header #-EnableException:$true - - It "Should return an array of 3 items" { - $Output.count | Should be 2 - } - It "Should return 1 Full backups" { - ($Output | Where-Object { $_.BackupTypeDescription -eq 'Database' } | Measure-Object).count | Should Be 1 - } - It "Should return 0 Diff backups" { - ($Output | Where-Object { $_.BackupTypeDescription -eq 'Database Differential' } | Measure-Object).count | Should Be 0 - } - It "Should return 2 log backups" { - ($Output | Where-Object { $_.BackupTypeDescription -eq 'Transaction Log' } | Measure-Object).count | Should Be 1 - } + Context "Validate parameters" { + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'BackupHistory','RestoreTime','IgnoreLogs','IgnoreDiffs','DatabaseName','ServerName','ContinuePoints','LastRestoreType','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } - Context "General Diff Restore" { + } +} +Describe "$commandname Integration Tests" -Tag 'IntegrationTests' { + InModuleScope dbatools { + Context "General Diff Restore" { $Header = ConvertFrom-Json -InputObject (Get-Content $PSScriptRoot\..\tests\ObjectDefinitions\BackupRestore\RawInput\DiffRestore.json -raw) $header | Add-Member -Type NoteProperty -Name FullName -Value 1 $Output = Select-DbaBackupInformation -BackupHistory $header -EnableException:$true diff --git a/tests/Select-DbaObject.Tests.ps1 b/tests/Select-DbaObject.Tests.ps1 index 674d02ea82..6f794abe8d 100644 --- a/tests/Select-DbaObject.Tests.ps1 +++ b/tests/Select-DbaObject.Tests.ps1 @@ -3,6 +3,17 @@ Write-Host -Object "Running $PSCommandpath" -ForegroundColor Cyan . "$PSScriptRoot\constants.ps1" Describe "$commandname Unit Tests" -Tag "UnitTests" { + Context "Validate parameters" { + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'InputObject','Property','ExcludeProperty','ExpandProperty','Unique','Last','First','Skip','SkipLast','Wait','Index','ShowProperty','ShowExcludeProperty','TypeName','KeepInputObject' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 + } + } +} + +Describe "$commandname Integration Tests" -Tag "IntegrationTests" { $global:object = [PSCustomObject]@{ Foo = 42 Bar = 18 diff --git a/tests/Set-DbaAgListener.Tests.ps1 b/tests/Set-DbaAgListener.Tests.ps1 index 4d9dc01282..b443d01afa 100644 --- a/tests/Set-DbaAgListener.Tests.ps1 +++ b/tests/Set-DbaAgListener.Tests.ps1 @@ -4,19 +4,11 @@ Write-Host -Object "Running $PSCommandpath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - <# - Get commands, Default count = 11 - Commands with SupportShouldProcess = 13 - #> - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Set-DbaAgListener).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'AvailabilityGroup', 'Listener', 'Port', 'InputObject', 'EnableException' - $paramCount = $knownParameters.Count - It "Should contain our specific parameters" { - ((Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','AvailabilityGroup','Listener','Port','InputObject','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } \ No newline at end of file diff --git a/tests/Set-DbaAgReplica.Tests.ps1 b/tests/Set-DbaAgReplica.Tests.ps1 index 94804b70c0..3230579019 100644 --- a/tests/Set-DbaAgReplica.Tests.ps1 +++ b/tests/Set-DbaAgReplica.Tests.ps1 @@ -4,19 +4,11 @@ Write-Host -Object "Running $PSCommandpath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - <# - Get commands, Default count = 11 - Commands with SupportShouldProcess = 13 - #> - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Set-DbaAgReplica).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'AvailabilityGroup', 'Replica', 'AvailabilityMode', 'InputObject', 'EnableException', 'FailoverMode', 'BackupPriority', 'EndpointUrl', 'ConnectionModeInPrimaryRole', 'ConnectionModeInSecondaryRole', 'ReadonlyRoutingConnectionUrl', 'SeedingMode' - $paramCount = $knownParameters.Count - It "Should contain our specific parameters" { - ((Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','AvailabilityGroup','Replica','AvailabilityMode','FailoverMode','BackupPriority','ConnectionModeInPrimaryRole','ConnectionModeInSecondaryRole','SeedingMode','EndpointUrl','ReadonlyRoutingConnectionUrl','InputObject','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Set-DbaAgentAlert.Tests.ps1 b/tests/Set-DbaAgentAlert.Tests.ps1 index 97b430fbe4..c5fa3e40df 100644 --- a/tests/Set-DbaAgentAlert.Tests.ps1 +++ b/tests/Set-DbaAgentAlert.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 9 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Set-DbaAgentAlert).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Alert', 'NewName', 'Enabled', 'Disabled', 'Force', 'InputObject', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Alert','NewName','Enabled','Disabled','Force','InputObject','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Set-DbaAgentJob.Tests.ps1 b/tests/Set-DbaAgentJob.Tests.ps1 index 771e084cc1..0a98f561fb 100644 --- a/tests/Set-DbaAgentJob.Tests.ps1 +++ b/tests/Set-DbaAgentJob.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 23 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Set-DbaAgentJob).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Job', 'Schedule', 'ScheduleId', 'NewName', 'Enabled', 'Disabled', 'Description', 'StartStepId', 'Category', 'OwnerLogin', 'EventLogLevel', 'EmailLevel', 'NetsendLevel', 'PageLevel', 'EmailOperator', 'NetsendOperator', 'PageOperator', 'DeleteLevel', 'Force', 'InputObject', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Job','Schedule','ScheduleId','NewName','Enabled','Disabled','Description','StartStepId','Category','OwnerLogin','EventLogLevel','EmailLevel','NetsendLevel','PageLevel','EmailOperator','NetsendOperator','PageOperator','DeleteLevel','Force','InputObject','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Set-DbaAgentJobCategory.Tests.ps1 b/tests/Set-DbaAgentJobCategory.Tests.ps1 index ae34d611fe..7633cd334e 100644 --- a/tests/Set-DbaAgentJobCategory.Tests.ps1 +++ b/tests/Set-DbaAgentJobCategory.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 6 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Set-DbaAgentJobCategory).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Category', 'NewName', 'Force', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Category','NewName','Force','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Set-DbaAgentJobOutputFile.Tests.ps1 b/tests/Set-DbaAgentJobOutputFile.Tests.ps1 index 666c6bab8a..ecc258e209 100644 --- a/tests/Set-DbaAgentJobOutputFile.Tests.ps1 +++ b/tests/Set-DbaAgentJobOutputFile.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 6 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Set-DbaAgentJobOutputFile).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Job', 'Step', 'OutputFile', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Job','Step','OutputFile','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Set-DbaAgentJobOwner.Tests.ps1 b/tests/Set-DbaAgentJobOwner.Tests.ps1 index 25acac72cf..41d7b4966a 100644 --- a/tests/Set-DbaAgentJobOwner.Tests.ps1 +++ b/tests/Set-DbaAgentJobOwner.Tests.ps1 @@ -4,10 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - [object[]]$params = (Get-ChildItem function:\Set-DbaAgentJobOwner).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Job', 'ExcludeJob', 'InputObject', 'Login', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $knownParameters.Count + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Job','ExcludeJob','InputObject','Login','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Set-DbaAgentJobStep.Tests.ps1 b/tests/Set-DbaAgentJobStep.Tests.ps1 index 1f1e374701..b8ca53b434 100644 --- a/tests/Set-DbaAgentJobStep.Tests.ps1 +++ b/tests/Set-DbaAgentJobStep.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 21 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Set-DbaAgentJobStep).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Job', 'StepName', 'NewName', 'Subsystem', 'Command', 'CmdExecSuccessCode', 'OnSuccessAction', 'OnSuccessStepId', 'OnFailAction', 'OnFailStepId', 'Database', 'DatabaseUser', 'RetryAttempts', 'RetryInterval', 'OutputFileName', 'Flag', 'ProxyName', 'EnableException', 'Force' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance', 'SqlCredential', 'Job', 'StepName', 'NewName', 'Subsystem', 'SubSystemServer', 'Command', 'CmdExecSuccessCode', 'OnSuccessAction', 'OnSuccessStepId', 'OnFailAction', 'OnFailStepId', 'Database', 'DatabaseUser', 'RetryAttempts', 'RetryInterval', 'OutputFileName', 'Flag', 'ProxyName', 'EnableException', 'InputObject', 'Force' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Set-DbaAgentSchedule.Tests.ps1 b/tests/Set-DbaAgentSchedule.Tests.ps1 index 8be84a4fdd..1150aa4914 100644 --- a/tests/Set-DbaAgentSchedule.Tests.ps1 +++ b/tests/Set-DbaAgentSchedule.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 19 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Set-DbaAgentSchedule).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Job', 'ScheduleName', 'NewName', 'Enabled', 'Disabled', 'FrequencyType', 'FrequencyInterval', 'FrequencySubdayType', 'FrequencySubdayInterval', 'FrequencyRelativeInterval', 'FrequencyRecurrenceFactor', 'StartDate', 'EndDate', 'StartTime', 'EndTime', 'EnableException', 'Force' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Job','ScheduleName','NewName','Enabled','Disabled','FrequencyType','FrequencyInterval','FrequencySubdayType','FrequencySubdayInterval','FrequencyRelativeInterval','FrequencyRecurrenceFactor','StartDate','EndDate','StartTime','EndTime','EnableException','Force' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Set-DbaAgentServer.Tests.ps1 b/tests/Set-DbaAgentServer.Tests.ps1 index fdd01609a5..47151a9003 100644 --- a/tests/Set-DbaAgentServer.Tests.ps1 +++ b/tests/Set-DbaAgentServer.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Set-DbaAgentServer).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'InputObject', 'AgentLogLevel', 'AgentMailType', 'AgentShutdownWaitTime', 'DatabaseMailProfile', 'ErrorLogFile', 'IdleCpuDuration', 'IdleCpuPercentage', 'CpuPolling', 'LocalHostAlias', 'LoginTimeout', 'MaximumHistoryRows', 'MaximumJobHistoryRows', 'NetSendRecipient', 'ReplaceAlertTokens', 'SaveInSentFolder', 'SqlAgentAutoStart', 'SqlAgentMailProfile', 'SqlAgentRestart', 'SqlServerRestart', 'WriteOemErrorLog', 'EnableException' - $paramCount = $knownParameters.Count - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','InputObject','AgentLogLevel','AgentMailType','AgentShutdownWaitTime','DatabaseMailProfile','ErrorLogFile','IdleCpuDuration','IdleCpuPercentage','CpuPolling','LocalHostAlias','LoginTimeout','MaximumHistoryRows','MaximumJobHistoryRows','NetSendRecipient','ReplaceAlertTokens','SaveInSentFolder','SqlAgentAutoStart','SqlAgentMailProfile','SqlAgentRestart','SqlServerRestart','WriteOemErrorLog','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Set-DbaAvailabilityGroup.Tests.ps1 b/tests/Set-DbaAvailabilityGroup.Tests.ps1 index 4d78498490..0329a7e6a0 100644 --- a/tests/Set-DbaAvailabilityGroup.Tests.ps1 +++ b/tests/Set-DbaAvailabilityGroup.Tests.ps1 @@ -4,19 +4,11 @@ Write-Host -Object "Running $PSCommandpath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - <# - Get commands, Default count = 11 - Commands with SupportShouldProcess = 13 - #> - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Set-DbaAvailabilityGroup).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'AvailabilityGroup', 'AllAvailabilityGroups', 'DtcSupportEnabled', 'ClusterType', 'AutomatedBackupPreference', 'FailureConditionLevel', 'HealthCheckTimeout', 'BasicAvailabilityGroup', 'DatabaseHealthTrigger', 'IsDistributedAvailabilityGroup', 'InputObject', 'EnableException' - $paramCount = $knownParameters.Count - It "Should contain our specific parameters" { - ((Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','AvailabilityGroup','AllAvailabilityGroups','DtcSupportEnabled','ClusterType','AutomatedBackupPreference','FailureConditionLevel','HealthCheckTimeout','BasicAvailabilityGroup','DatabaseHealthTrigger','IsDistributedAvailabilityGroup','InputObject','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Set-DbaCmConnection.Tests.ps1 b/tests/Set-DbaCmConnection.Tests.ps1 index 81842084a7..ce4cfcbb0d 100644 --- a/tests/Set-DbaCmConnection.Tests.ps1 +++ b/tests/Set-DbaCmConnection.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 21 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Set-DbaCmConnection).Parameters.Keys - $knownParameters = 'ComputerName', 'Credential', 'UseWindowsCredentials', 'OverrideExplicitCredential', 'OverrideConnectionPolicy', 'DisabledConnectionTypes', 'DisableBadCredentialCache', 'DisableCimPersistence', 'DisableCredentialAutoRegister', 'EnableCredentialFailover', 'WindowsCredentialsAreBad', 'CimWinRMOptions', 'CimDCOMOptions', 'AddBadCredential', 'RemoveBadCredential', 'ClearBadCredential', 'ClearCredential', 'ResetCredential', 'ResetConnectionStatus', 'ResetConfiguration', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'ComputerName','Credential','UseWindowsCredentials','OverrideExplicitCredential','OverrideConnectionPolicy','DisabledConnectionTypes','DisableBadCredentialCache','DisableCimPersistence','DisableCredentialAutoRegister','EnableCredentialFailover','WindowsCredentialsAreBad','CimWinRMOptions','CimDCOMOptions','AddBadCredential','RemoveBadCredential','ClearBadCredential','ClearCredential','ResetCredential','ResetConnectionStatus','ResetConfiguration','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Set-DbaDbCompatibility.Tests.ps1 b/tests/Set-DbaDbCompatibility.Tests.ps1 new file mode 100644 index 0000000000..c4d88cc487 --- /dev/null +++ b/tests/Set-DbaDbCompatibility.Tests.ps1 @@ -0,0 +1,19 @@ +$CommandName = $MyInvocation.MyCommand.Name.Replace(".Tests.ps1", "") +Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan +. "$PSScriptRoot\constants.ps1" + +Describe "$CommandName Unit Tests" -Tag 'UnitTests' { + Context "Validate parameters" { + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance', 'SqlCredential', 'Database', 'TargetCompatibility', 'InputObject', 'EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 + } + } +} +<# + Integration test are custom to the command you are writing for. + Read https://github.com/sqlcollaborative/dbatools/blob/development/contributing.md#tests + for more guidence +#> \ No newline at end of file diff --git a/tests/Set-DbaDbCompression.Tests.ps1 b/tests/Set-DbaDbCompression.Tests.ps1 index 0802106cb2..ac3304ea6f 100644 --- a/tests/Set-DbaDbCompression.Tests.ps1 +++ b/tests/Set-DbaDbCompression.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandpath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 9 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Set-DbaDbCompression).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Database', 'ExcludeDatabase', 'CompressionType', 'MaxRunTime', 'PercentCompression', 'InputObject', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Database','ExcludeDatabase','CompressionType','MaxRunTime','PercentCompression','InputObject','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Set-DbaDbIdentity.Tests.ps1 b/tests/Set-DbaDbIdentity.Tests.ps1 new file mode 100644 index 0000000000..5fb62dec9f --- /dev/null +++ b/tests/Set-DbaDbIdentity.Tests.ps1 @@ -0,0 +1,66 @@ +$CommandName = $MyInvocation.MyCommand.Name.Replace(".Tests.ps1", "") +Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan +. "$PSScriptRoot\constants.ps1" + +Describe "$CommandName Unit Tests" -Tag 'UnitTests' { + Context "Validate parameters" { + Context "Validate parameters" { + [object[]]$params = (Get-Command -Name $CommandName).Parameters.Keys + $knownParameters = 'SqlInstance', 'SqlCredential', 'Database', 'Table', 'ReSeedValue', 'EnableException' + + It "Should contain our specific parameters" { + ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $knownParameters.Count + } + } + } +} +Describe "$commandname Integration Test" -Tag "IntegrationTests" { + BeforeAll { + $server = Connect-SqlInstance -SqlInstance $script:instance2 + $random = Get-Random + $tableName1 = "dbatools_getdbtbl1" + $tableName2 = "dbatools_getdbtbl2" + + $dbname = "dbatoolsci_getdbUsage$random" + $null = $server.Query("CREATE DATABASE $dbname") + $null = $server.Query("CREATE TABLE $tableName1 (Id int NOT NULL IDENTITY (125, 1), Value varchar(5))", $dbname) + $null = $server.Query("CREATE TABLE $tableName2 (Id int NOT NULL IDENTITY ( 5, 1), Value varchar(5))", $dbname) + + $null = $server.Query("INSERT $tableName1(Value) SELECT 1", $dbname) + $null = $server.Query("INSERT $tableName2(Value) SELECT 2", $dbname) + } + AfterAll { + $null = Get-DbaDatabase -SqlInstance $script:instance2 -Database $dbname | Remove-DbaDatabase -Confirm:$false + } + + Context "Validate standard output " { + $props = 'ComputerName', 'InstanceName', 'SqlInstance', 'Database', 'Table', 'Cmd', 'IdentityValue', 'ColumnValue', 'Output' + $result = Set-DbaDbIdentity -SqlInstance $script:instance2 -Database $dbname -Table $tableName1, $tableName2 -Confirm:$false + + foreach ($prop in $props) { + $p = $result[0].PSObject.Properties[$prop] + It "Should return property: $prop" { + $p.Name | Should Be $prop + } + } + + It "returns results for each table" { + $result.Count -eq 2 | Should Be $true + } + + It "returns correct results" { + $result[1].IdentityValue -eq 5 | Should Be $true + } + } + + Context "Reseed option returns correct results " { + $result = Set-DbaDbIdentity -SqlInstance $script:instance2 -Database $dbname -Table $tableName2 -ReSeedValue 400 -Confirm:$false + + It "returns correct results" { + $result.cmd -eq "DBCC CHECKIDENT('$tableName2', RESEED, 400)" | Should Be $true + $result.IdentityValue -eq '5.' | Should Be $true + } + } +} + + diff --git a/tests/Set-DbaDbMirror.Tests.ps1 b/tests/Set-DbaDbMirror.Tests.ps1 index c6e3e7b175..26756ff005 100644 --- a/tests/Set-DbaDbMirror.Tests.ps1 +++ b/tests/Set-DbaDbMirror.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 9 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Set-DbaDbMirror).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Database', 'Partner', 'Witness', 'SafetyLevel', 'State', 'InputObject', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Database','Partner','Witness','SafetyLevel','State','InputObject','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Set-DbaDbOwner.Tests.ps1 b/tests/Set-DbaDbOwner.Tests.ps1 index 7acf8e8c27..98ae2ad3ea 100644 --- a/tests/Set-DbaDbOwner.Tests.ps1 +++ b/tests/Set-DbaDbOwner.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 6 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Set-DbaDbOwner).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Database', 'ExcludeDatabase', 'TargetLogin', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Database','ExcludeDatabase','TargetLogin','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Set-DbaDbQueryStoreOption.Tests.ps1 b/tests/Set-DbaDbQueryStoreOption.Tests.ps1 index 6f71365507..8eb8b0178a 100644 --- a/tests/Set-DbaDbQueryStoreOption.Tests.ps1 +++ b/tests/Set-DbaDbQueryStoreOption.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 13 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Set-DbaDbQueryStoreOption).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Database', 'ExcludeDatabase', 'AllDatabases', 'State', 'FlushInterval', 'CollectionInterval', 'MaxSize', 'CaptureMode', 'CleanupMode', 'StaleQueryThreshold', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Database','ExcludeDatabase','AllDatabases','State','FlushInterval','CollectionInterval','MaxSize','CaptureMode','CleanupMode','StaleQueryThreshold','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Set-DbaDbRecoveryModel.Tests.ps1 b/tests/Set-DbaDbRecoveryModel.Tests.ps1 index bf17b7c076..451ba77b7f 100644 --- a/tests/Set-DbaDbRecoveryModel.Tests.ps1 +++ b/tests/Set-DbaDbRecoveryModel.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 8 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Set-DbaDbRecoveryModel).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'RecoveryModel', 'Database', 'ExcludeDatabase', 'AllDatabases', 'EnableException', 'InputObject' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','RecoveryModel','Database','ExcludeDatabase','AllDatabases','EnableException','InputObject' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Set-DbaDbState.Tests.ps1 b/tests/Set-DbaDbState.Tests.ps1 index c1d0a7bd6a..4bdfbfe1ad 100644 --- a/tests/Set-DbaDbState.Tests.ps1 +++ b/tests/Set-DbaDbState.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 17 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Set-DbaDbState).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Database', 'ExcludeDatabase', 'AllDatabases', 'ReadOnly', 'ReadWrite', 'Online', 'Offline', 'Emergency', 'Detached', 'SingleUser', 'RestrictedUser', 'MultiUser', 'Force', 'EnableException', 'InputObject' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Database','ExcludeDatabase','AllDatabases','ReadOnly','ReadWrite','Online','Offline','Emergency','Detached','SingleUser','RestrictedUser','MultiUser','Force','EnableException','InputObject' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Set-DbaEndpoint.Tests.ps1 b/tests/Set-DbaEndpoint.Tests.ps1 index 7da22720ea..15c40e95a1 100644 --- a/tests/Set-DbaEndpoint.Tests.ps1 +++ b/tests/Set-DbaEndpoint.Tests.ps1 @@ -4,19 +4,11 @@ Write-Host -Object "Running $PSCommandpath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - <# - Get commands, Default count = 11 - Commands with SupportShouldProcess = 13 - #> - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Set-DbaEndpoint).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Owner', 'Type', 'Endpoint', 'AllEndpoints', 'InputObject', 'EnableException' - $paramCount = $knownParameters.Count - It "Should contain our specific parameters" { - ((Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','EndPoint','Owner','Type','AllEndpoints','InputObject','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } \ No newline at end of file diff --git a/tests/Set-DbaErrorLogConfig.Tests.ps1 b/tests/Set-DbaErrorLogConfig.Tests.ps1 index 3b3d6129f7..0eaba628cb 100644 --- a/tests/Set-DbaErrorLogConfig.Tests.ps1 +++ b/tests/Set-DbaErrorLogConfig.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag "UnitTests" { Context "Validate parameters" { - $paramCount = 5 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Set-DbaErrorLogConfig).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'LogSize', 'LogCount', 'EnableException' - It "Should contain our specific parameters" { - ((Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','LogCount','LogSize','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Set-DbaLogin.Tests.ps1 b/tests/Set-DbaLogin.Tests.ps1 index 63becdf716..4ed810f047 100644 --- a/tests/Set-DbaLogin.Tests.ps1 +++ b/tests/Set-DbaLogin.Tests.ps1 @@ -4,12 +4,11 @@ Write-Host -Object "Running $PSCommandpath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $command = Get-Command $CommandName - [object[]]$params = $command.Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Login', 'SecurePassword', 'Unlock', 'MustChange', 'NewName', 'Disable', 'Enable', 'DenyLogin', 'GrantLogin', 'AddRole', 'RemoveRole', 'EnableException', 'InputObject' - $paramCount = $knownParameters.Count - It "Contains our specific parameters" { - ((Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count) | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Login','SecurePassword','DefaultDatabase','Unlock','MustChange','NewName','Disable','Enable','DenyLogin','GrantLogin','PasswordPolicyEnforced','AddRole','RemoveRole','InputObject','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } $systemRoles = @( @@ -24,6 +23,8 @@ Describe "$CommandName Unit Tests" -Tag 'UnitTests' { @{role = 'sysadmin'} ) + $command = Get-Command $CommandName + It "Validates -AddRole contains " -TestCases $systemRoles { param ($role) diff --git a/tests/Set-DbaMaxDop.Tests.ps1 b/tests/Set-DbaMaxDop.Tests.ps1 index 1c3a078d3f..6c3529fd00 100644 --- a/tests/Set-DbaMaxDop.Tests.ps1 +++ b/tests/Set-DbaMaxDop.Tests.ps1 @@ -4,23 +4,11 @@ Write-Host -Object "Running $PSCommandpath" -ForegroundColor Cyan Describe "$commandname Unit Tests" -Tag "UnitTests", Set-DbaMaxDop { Context "Validate parameters" { - $knownParameters = 'SqlInstance', 'SqlCredential', 'Database', 'ExcludeDatabase', 'MaxDop', 'InputObject', 'AllDatabases', 'EnableException' - $SupportShouldProcess = $true - $paramCount = $knownParameters.Count - if ($SupportShouldProcess) { - $defaultParamCount = 13 - } else { - $defaultParamCount = 11 - } - $command = Get-Command -Name $CommandName - [object[]]$params = $command.Parameters.Keys - - It "Should contain our specific parameters" { - ((Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count) | Should Be $paramCount - } - - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Database','ExcludeDatabase','MaxDop','InputObject','AllDatabases','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } diff --git a/tests/Set-DbaMaxMemory.Tests.ps1 b/tests/Set-DbaMaxMemory.Tests.ps1 index af2bd44c3a..1359232715 100644 --- a/tests/Set-DbaMaxMemory.Tests.ps1 +++ b/tests/Set-DbaMaxMemory.Tests.ps1 @@ -4,23 +4,11 @@ Write-Host -Object "Running $PSCommandpath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tags "UnitTests" { Context "Validate parameters" { - $knownParameters = 'SqlInstance', 'SqlCredential', 'Max', 'InputObject', 'EnableException' - $SupportShouldProcess = $true - $paramCount = $knownParameters.Count - if ($SupportShouldProcess) { - $defaultParamCount = 13 - } else { - $defaultParamCount = 11 - } - $command = Get-Command -Name $CommandName - [object[]]$params = $command.Parameters.Keys - - It "Should contain our specific parameters" { - ((Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count) | Should Be $paramCount - } - - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance', 'SqlCredential', 'Max', 'InputObject', 'EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } @@ -42,9 +30,4 @@ Describe "$CommandName Integration Tests" -Tags "IntegrationTests" { } } } - Context 'Validate input arguments' { - It 'SqlInstance parameter host cannot be found' { - Set-DbaMaxMemory -SqlInstance 'ABC' 3> $null | Should be $null - } - } } \ No newline at end of file diff --git a/tests/Set-DbaNetworkCertificate.Tests.ps1 b/tests/Set-DbaNetworkCertificate.Tests.ps1 index b490f852c9..71f0a0a066 100644 --- a/tests/Set-DbaNetworkCertificate.Tests.ps1 +++ b/tests/Set-DbaNetworkCertificate.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 5 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Set-DbaNetworkCertificate).Parameters.Keys - $knownParameters = 'SqlInstance', 'Credential', 'Certificate', 'Thumbprint', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','Credential','Certificate','Thumbprint','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Set-DbaPowerPlan.Tests.ps1 b/tests/Set-DbaPowerPlan.Tests.ps1 index e1b9ccd7e4..92a86d6b03 100644 --- a/tests/Set-DbaPowerPlan.Tests.ps1 +++ b/tests/Set-DbaPowerPlan.Tests.ps1 @@ -4,16 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $knownParameters = 'ComputerName', 'Credential', 'PowerPlan', 'CustomPowerPlan', 'EnableException', 'InputObject' - $paramCount = $knownParameters.Count - $defaultParamCount = 13 - $command = Get-Command -Name $CommandName - [object[]]$params = $command.Parameters.Keys - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'ComputerName','Credential','PowerPlan','CustomPowerPlan','InputObject','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Set-DbaPrivilege.Tests.ps1 b/tests/Set-DbaPrivilege.Tests.ps1 index eebe6041e5..0a7897c395 100644 --- a/tests/Set-DbaPrivilege.Tests.ps1 +++ b/tests/Set-DbaPrivilege.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 4 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Set-DbaPrivilege).Parameters.Keys - $knownParameters = 'ComputerName', 'Credential', 'Type', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'ComputerName','Credential','Type','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Set-DbaSpConfigure.Tests.ps1 b/tests/Set-DbaSpConfigure.Tests.ps1 index aa8874c22e..37193d473d 100644 --- a/tests/Set-DbaSpConfigure.Tests.ps1 +++ b/tests/Set-DbaSpConfigure.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 6 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Set-DbaSpConfigure).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Value', 'Name', 'InputObject', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Value','Name','InputObject','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Set-DbaSpn.Tests.ps1 b/tests/Set-DbaSpn.Tests.ps1 index 2d0c79393a..5c8676eb2e 100644 --- a/tests/Set-DbaSpn.Tests.ps1 +++ b/tests/Set-DbaSpn.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 5 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Set-DbaSpn).Parameters.Keys - $knownParameters = 'SPN', 'ServiceAccount', 'Credential', 'NoDelegation', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SPN','ServiceAccount','Credential','NoDelegation','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Set-DbaStartupParameter.Tests.ps1 b/tests/Set-DbaStartupParameter.Tests.ps1 index 5f3d1f8623..f801124dce 100644 --- a/tests/Set-DbaStartupParameter.Tests.ps1 +++ b/tests/Set-DbaStartupParameter.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 21 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Set-DbaStartupParameter).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Credential', 'MasterData', 'MasterLog', 'ErrorLog', 'TraceFlags', 'CommandPromptStart', 'MinimalStart', 'MemoryToReserve', 'SingleUser', 'SingleUserDetails', 'NoLoggingToWinEvents', 'StartAsNamedInstance', 'DisableMonitoring', 'IncreasedExtents', 'TraceFlagsOverride', 'StartUpConfig', 'Offline', 'Force', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Credential','MasterData','MasterLog','ErrorLog','TraceFlags','CommandPromptStart','MinimalStart','MemoryToReserve','SingleUser','SingleUserDetails','NoLoggingToWinEvents','StartAsNamedInstance','DisableMonitoring','IncreasedExtents','TraceFlagsOverride','StartUpConfig','Offline','Force','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Set-DbaTcpPort.Tests.ps1 b/tests/Set-DbaTcpPort.Tests.ps1 index c998419ee2..2ae1d6d347 100644 --- a/tests/Set-DbaTcpPort.Tests.ps1 +++ b/tests/Set-DbaTcpPort.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 5 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Set-DbaTcpPort).Parameters.Keys - $knownParameters = 'SqlInstance', 'Credential', 'Port', 'IpAddress', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','Credential','Port','IpAddress','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Set-DbaTempDbConfig.Tests.ps1 b/tests/Set-DbaTempDbConfig.Tests.ps1 index 70144835ff..c9eb34846b 100644 --- a/tests/Set-DbaTempDbConfig.Tests.ps1 +++ b/tests/Set-DbaTempDbConfig.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 13 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Set-DbaTempDbConfig).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'DataFileCount', 'DataFileSize', 'LogFileSize', 'DataFileGrowth', 'LogFileGrowth', 'DataPath', 'LogPath', 'OutFile', 'OutputScriptOnly', 'DisableGrowth', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','DataFileCount','DataFileSize','LogFileSize','DataFileGrowth','LogFileGrowth','DataPath','LogPath','OutFile','OutputScriptOnly','DisableGrowth','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Show-DbaDbList.Tests.ps1 b/tests/Show-DbaDbList.Tests.ps1 index c46f0de4f9..9af82002be 100644 --- a/tests/Show-DbaDbList.Tests.ps1 +++ b/tests/Show-DbaDbList.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 5 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Show-DbaDbList).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Title', 'Header', 'DefaultDb' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Title','Header','DefaultDb' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Show-DbaServerFileSystem.Tests.ps1 b/tests/Show-DbaServerFileSystem.Tests.ps1 index 8a6767e548..a323cc8501 100644 --- a/tests/Show-DbaServerFileSystem.Tests.ps1 +++ b/tests/Show-DbaServerFileSystem.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 3 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Show-DbaServerFileSystem).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Start-DbaAgentJob.Tests.ps1 b/tests/Start-DbaAgentJob.Tests.ps1 index f4f7ea7309..b565265fbc 100644 --- a/tests/Start-DbaAgentJob.Tests.ps1 +++ b/tests/Start-DbaAgentJob.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 10 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Start-DbaAgentJob).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Job', 'ExcludeJob', 'InputObject', 'AllJobs', 'Wait', 'WaitPeriod', 'SleepPeriod', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Job','ExcludeJob','InputObject','AllJobs','Wait','WaitPeriod','SleepPeriod','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Start-DbaEndpoint.Tests.ps1 b/tests/Start-DbaEndpoint.Tests.ps1 index 809792d3aa..d7f8c4f6af 100644 --- a/tests/Start-DbaEndpoint.Tests.ps1 +++ b/tests/Start-DbaEndpoint.Tests.ps1 @@ -4,23 +4,11 @@ Write-Host -Object "Running $PSCommandpath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tags "UnitTests" { Context "Validate parameters" { - $knownParameters = 'SqlInstance', 'SqlCredential', 'EndPoint', 'AllEndpoints', 'InputObject', 'EnableException' - $SupportShouldProcess = $true - $paramCount = $knownParameters.Count - if ($SupportShouldProcess) { - $defaultParamCount = 13 - } else { - $defaultParamCount = 11 - } - $command = Get-Command -Name $CommandName - [object[]]$params = $command.Parameters.Keys - - It "Should contain our specific parameters" { - ((Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count) | Should Be $paramCount - } - - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','EndPoint','AllEndpoints','InputObject','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Start-DbaMigration.Tests.ps1 b/tests/Start-DbaMigration.Tests.ps1 index 8245015456..9f14a2285b 100644 --- a/tests/Start-DbaMigration.Tests.ps1 +++ b/tests/Start-DbaMigration.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $knownParameters = 'Source', 'Destination', 'DetachAttach', 'Reattach', 'BackupRestore', 'SharedPath', 'WithReplace', 'NoRecovery', 'SetSourceReadOnly', 'ReuseSourceFolderStructure', 'IncludeSupportDbs', 'SourceSqlCredential', 'DestinationSqlCredential', 'Exclude', 'DisableJobsOnDestination', 'DisableJobsOnSource', 'ExcludeSaRename', 'UseLastBackup', 'Continue', 'Force', 'EnableException' - $paramCount = $knownParameters.Count - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Start-DbaMigration).Parameters.Keys - It "Should contain our specific parameters" { - ((Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'Source','Destination','DetachAttach','Reattach','BackupRestore','SharedPath','WithReplace','NoRecovery','SetSourceReadOnly','ReuseSourceFolderStructure','IncludeSupportDbs','SourceSqlCredential','DestinationSqlCredential','Exclude','DisableJobsOnDestination','DisableJobsOnSource','ExcludeSaRename','UseLastBackup','Continue','Force','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } @@ -69,4 +65,30 @@ Describe "$commandname Integration Tests" -Tag "IntegrationTests" { $dbs[0].Owner -eq $dbs[1].Owner } } + + Context "Backup restore" { + $quickbackup = Get-DbaDatabase -SqlInstance $script:instance2 -ExcludeSystem | Backup-DbaDatabase -BackupDirectory C:\temp + $results = Start-DbaMigration -Force -Source $script:instance2 -Destination $script:instance3 -UseLastBackup -Exclude Logins, SpConfigure, SysDbUserObjects, AgentServer, CentralManagementServer, ExtendedEvents, PolicyManagement, ResourceGovernor, Endpoints, ServerAuditSpecifications, Audits, LinkedServers, SystemTriggers, DataCollector, DatabaseMail, BackupDevices, Credentials + + It "returns at least one result" { + $results | Should -Not -Be $null + } + + foreach ($result in $results) { + It "copies a database successfully" { + $result.Type -eq "Database" + $result.Status -eq "Successful" + } + } + + It "retains its name, recovery model, and status." { + $dbs = Get-DbaDatabase -SqlInstance $script:instance2, $script:instance3 -Database $startmigrationrestoredb2 + $dbs[0].Name -ne $null + # Compare its variables + $dbs[0].Name -eq $dbs[1].Name + $dbs[0].RecoveryModel -eq $dbs[1].RecoveryModel + $dbs[0].Status -eq $dbs[1].Status + $dbs[0].Owner -eq $dbs[1].Owner + } + } } \ No newline at end of file diff --git a/tests/Start-DbaPfDataCollectorSet.Tests.ps1 b/tests/Start-DbaPfDataCollectorSet.Tests.ps1 index 62796e200e..f4c88a43ec 100644 --- a/tests/Start-DbaPfDataCollectorSet.Tests.ps1 +++ b/tests/Start-DbaPfDataCollectorSet.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 6 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Start-DbaPfDataCollectorSet).Parameters.Keys - $knownParameters = 'ComputerName', 'Credential', 'CollectorSet', 'InputObject', 'NoWait', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'ComputerName','Credential','CollectorSet','InputObject','NoWait','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Start-DbaService.Tests.ps1 b/tests/Start-DbaService.Tests.ps1 index f9178f7f48..641b6128bd 100644 --- a/tests/Start-DbaService.Tests.ps1 +++ b/tests/Start-DbaService.Tests.ps1 @@ -5,15 +5,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 7 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Start-DbaService).Parameters.Keys - $knownParameters = 'ComputerName', 'InstanceName', 'Type', 'InputObject', 'Timeout', 'Credential', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'ComputerName','InstanceName','Type','InputObject','Timeout','Credential','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Start-DbaTrace.Tests.ps1 b/tests/Start-DbaTrace.Tests.ps1 index 644aef95fd..65f5e24cd6 100644 --- a/tests/Start-DbaTrace.Tests.ps1 +++ b/tests/Start-DbaTrace.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 5 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Start-DbaTrace).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Id', 'InputObject', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Id','InputObject','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Start-DbaXESession.Tests.ps1 b/tests/Start-DbaXESession.Tests.ps1 index 20d8456528..a978751c77 100644 --- a/tests/Start-DbaXESession.Tests.ps1 +++ b/tests/Start-DbaXESession.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 7 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Start-DbaXESession).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Session', 'StopAt', 'AllSessions', 'InputObject', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Session','StopAt','AllSessions','InputObject','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Start-DbaXESmartTarget.Tests.ps1 b/tests/Start-DbaXESmartTarget.Tests.ps1 index 27b5361136..6a62f1198a 100644 --- a/tests/Start-DbaXESmartTarget.Tests.ps1 +++ b/tests/Start-DbaXESmartTarget.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 9 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Start-DbaXESmartTarget).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Database', 'Session', 'FailOnProcessingError', 'Responder', 'Template', 'NotAsJob', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Database','Session','FailOnProcessingError','Responder','Template','NotAsJob','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Stop-DbaAgentJob.Tests.ps1 b/tests/Stop-DbaAgentJob.Tests.ps1 index 81be3d6512..33efaf0771 100644 --- a/tests/Stop-DbaAgentJob.Tests.ps1 +++ b/tests/Stop-DbaAgentJob.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 7 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Stop-DbaAgentJob).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Job', 'ExcludeJob', 'InputObject', 'Wait', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Job','ExcludeJob','InputObject','Wait','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Stop-DbaEndpoint.Tests.ps1 b/tests/Stop-DbaEndpoint.Tests.ps1 index 7580aad1a8..3eeac98ed6 100644 --- a/tests/Stop-DbaEndpoint.Tests.ps1 +++ b/tests/Stop-DbaEndpoint.Tests.ps1 @@ -4,23 +4,11 @@ Write-Host -Object "Running $PSCommandpath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tags "UnitTests" { Context "Validate parameters" { - $knownParameters = 'SqlInstance', 'SqlCredential', 'EndPoint', 'AllEndpoints', 'InputObject', 'EnableException' - $SupportShouldProcess = $true - $paramCount = $knownParameters.Count - if ($SupportShouldProcess) { - $defaultParamCount = 13 - } else { - $defaultParamCount = 11 - } - $command = Get-Command -Name $CommandName - [object[]]$params = $command.Parameters.Keys - - It "Should contain our specific parameters" { - ((Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count) | Should Be $paramCount - } - - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','EndPoint','AllEndpoints','InputObject','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Stop-DbaPfDataCollectorSet.Tests.ps1 b/tests/Stop-DbaPfDataCollectorSet.Tests.ps1 index c7ba5973d6..7d5143c6a2 100644 --- a/tests/Stop-DbaPfDataCollectorSet.Tests.ps1 +++ b/tests/Stop-DbaPfDataCollectorSet.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 6 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Stop-DbaPfDataCollectorSet).Parameters.Keys - $knownParameters = 'ComputerName', 'Credential', 'CollectorSet', 'InputObject', 'NoWait', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'ComputerName','Credential','CollectorSet','InputObject','NoWait','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Stop-DbaProcess.Tests.ps1 b/tests/Stop-DbaProcess.Tests.ps1 index bc7599e4a3..dae504b877 100644 --- a/tests/Stop-DbaProcess.Tests.ps1 +++ b/tests/Stop-DbaProcess.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 10 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Stop-DbaProcess).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Spid', 'ExcludeSpid', 'Database', 'Login', 'Hostname', 'Program', 'InputObject', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Spid','ExcludeSpid','Database','Login','Hostname','Program','InputObject','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Stop-DbaService.Tests.ps1 b/tests/Stop-DbaService.Tests.ps1 index c72a489b45..df38a718d8 100644 --- a/tests/Stop-DbaService.Tests.ps1 +++ b/tests/Stop-DbaService.Tests.ps1 @@ -5,15 +5,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 8 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Stop-DbaService).Parameters.Keys - $knownParameters = 'ComputerName', 'InstanceName', 'Type', 'InputObject', 'Timeout', 'Credential', 'Force', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'ComputerName','InstanceName','Type','InputObject','Timeout','Credential','Force','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Stop-DbaTrace.Tests.ps1 b/tests/Stop-DbaTrace.Tests.ps1 index d9fb2f5ce4..24533d5d7d 100644 --- a/tests/Stop-DbaTrace.Tests.ps1 +++ b/tests/Stop-DbaTrace.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 5 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Stop-DbaTrace).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Id', 'InputObject', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Id','InputObject','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Stop-DbaXESession.Tests.ps1 b/tests/Stop-DbaXESession.Tests.ps1 index 1a433f44a4..a04696ed58 100644 --- a/tests/Stop-DbaXESession.Tests.ps1 +++ b/tests/Stop-DbaXESession.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 6 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Stop-DbaXESession).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Session', 'AllSessions', 'InputObject', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance', 'SqlCredential', 'Session', 'AllSessions', 'InputObject', 'EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } @@ -20,20 +16,17 @@ Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Describe "$CommandName Integration Tests" -Tags "IntegrationTests" { BeforeAll { $server = Connect-DbaInstance -SqlInstance $script:instance2 - $conn = $server.ConnectionContext - # Get the systemhealth session - $systemhealth = Get-DbaXESession -SqlInstance $server -Session system_health # Create a valid session and start it - $conn.ExecuteNonQuery("CREATE EVENT SESSION [dbatoolsci_session_valid] ON SERVER ADD EVENT sqlserver.lock_acquired;") - $dbatoolsciValid = Get-DbaXESession -SqlInstance $server -Session dbatoolsci_session_valid + $server.Query("CREATE EVENT SESSION [dbatoolsci_session_valid] ON SERVER ADD EVENT sqlserver.lock_acquired;") + $dbatoolsciValid = Get-DbaXESession -SqlInstance $script:instance2 -Session dbatoolsci_session_valid $dbatoolsciValid.Start() # Record the Status of all sessions - $allSessions = Get-DbaXESession -SqlInstance $server + $allSessions = Get-DbaXESession -SqlInstance $script:instance2 } BeforeEach { - $systemhealth.Refresh() - if (-Not $systemhealth.IsRunning) { - $systemhealth.Start() + $dbatoolsciValid.Refresh() + if (-Not $dbatoolsciValid.IsRunning) { + $dbatoolsciValid.Start() } } AfterAll { @@ -42,40 +35,40 @@ Describe "$CommandName Integration Tests" -Tags "IntegrationTests" { $session.Refresh() if ($session.Status -eq "Stopped") { if ($session.IsRunning) { - $session.Stop() + $session | Stop-DbaXESession } } else { if (-Not $session.IsRunning) { - $session.Start() + $session | Start-DbaXESession } } } # Drop created objects - $conn.ExecuteNonQuery("IF EXISTS(SELECT * FROM sys.server_event_sessions WHERE name = 'dbatoolsci_session_valid') DROP EVENT SESSION [dbatoolsci_session_valid] ON SERVER;") + $server = Connect-DbaInstance -SqlInstance $script:instance2 + $server.Query("IF EXISTS(SELECT * FROM sys.server_event_sessions WHERE name = 'dbatoolsci_session_valid') DROP EVENT SESSION [dbatoolsci_session_valid] ON SERVER;") } Context "Verifying command works" { + $server = Connect-DbaInstance -SqlInstance $script:instance2 It "stops the system_health session" { - $systemhealth | Stop-DbaXESession - $systemhealth.Refresh() - $systemhealth.IsRunning | Should Be $false + $dbatoolsciValid | Stop-DbaXESession + $dbatoolsciValid.Refresh() + $dbatoolsciValid.IsRunning | Should Be $false } It "does not change state if XE session is already stopped" { - if ($systemhealth.IsRunning) { - $systemhealth.Stop() + if ($dbatoolsciValid.IsRunning) { + $dbatoolsciValid.Stop() } - Stop-DbaXESession $server -Session $systemhealth.Name -WarningAction SilentlyContinue - $systemhealth.Refresh() - $systemhealth.IsRunning | Should Be $false + Stop-DbaXESession -SqlInstance $server -Session $dbatoolsciValid.Name -WarningAction SilentlyContinue + $dbatoolsciValid.Refresh() + $dbatoolsciValid.IsRunning | Should Be $false } It "stops all XE Sessions except the system ones if -AllSessions is used" { Stop-DbaXESession $server -AllSessions -WarningAction SilentlyContinue - $systemhealth.Refresh() $dbatoolsciValid.Refresh() - $systemhealth.IsRunning | Should Be $true $dbatoolsciValid.IsRunning | Should Be $false } } diff --git a/tests/Stop-DbaXESmartTarget.Tests.ps1 b/tests/Stop-DbaXESmartTarget.Tests.ps1 index 33f7200aec..afd171ab05 100644 --- a/tests/Stop-DbaXESmartTarget.Tests.ps1 +++ b/tests/Stop-DbaXESmartTarget.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 2 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Stop-DbaXESmartTarget).Parameters.Keys - $knownParameters = 'InputObject', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'InputObject','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Stop-Function.Tests.ps1 b/tests/Stop-Function.Tests.ps1 index ce6d692a15..9a97eb97df 100644 --- a/tests/Stop-Function.Tests.ps1 +++ b/tests/Stop-Function.Tests.ps1 @@ -6,15 +6,11 @@ $PSDefaultParameterValues.Remove('*:WarningAction') Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 14 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Stop-Function).Parameters.Keys - $knownParameters = 'Message', 'Category', 'ErrorRecord', 'Tag', 'FunctionName', 'File', 'Line', 'Target', 'Exception', 'OverrideExceptionMessage', 'Continue', 'SilentlyContinue', 'ContinueLabel', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'Message', 'Category', 'ErrorRecord', 'Tag', 'FunctionName', 'File', 'Line', 'Target', 'Exception', 'OverrideExceptionMessage', 'Continue', 'SilentlyContinue', 'ContinueLabel', 'EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } diff --git a/tests/Suspend-DbaAgDbDataMovement.Tests.ps1 b/tests/Suspend-DbaAgDbDataMovement.Tests.ps1 index c376b86d7c..e1f5349f3c 100644 --- a/tests/Suspend-DbaAgDbDataMovement.Tests.ps1 +++ b/tests/Suspend-DbaAgDbDataMovement.Tests.ps1 @@ -4,19 +4,11 @@ Write-Host -Object "Running $PSCommandpath" -ForegroundColor Cyan Describe "$commandname Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 6 - <# - Get commands, Default count = 11 - Commands with SupportShouldProcess = 13 - #> - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Suspend-DbaAgDbDataMovement).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'AvailabilityGroup', 'Database', 'InputObject', 'EnableException' - it "Should contain our specific parameters" { - ((Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count) | Should Be $paramCount - } - it "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','AvailabilityGroup','Database','InputObject','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Sync-DbaAvailabilityGroup.Tests.ps1 b/tests/Sync-DbaAvailabilityGroup.Tests.ps1 new file mode 100644 index 0000000000..50e527cecc --- /dev/null +++ b/tests/Sync-DbaAvailabilityGroup.Tests.ps1 @@ -0,0 +1,19 @@ +$CommandName = $MyInvocation.MyCommand.Name.Replace(".Tests.ps1", "") +Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan +. "$PSScriptRoot\constants.ps1" + +Describe "$CommandName Unit Tests" -Tag 'UnitTests' { + Context "Validate parameters" { + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'Primary', 'PrimarySqlCredential', 'Secondary', 'SecondarySqlCredential', 'AvailabilityGroup', 'Exclude', 'Login', 'ExcludeLogin', 'Job', 'ExcludeJob', 'InputObject', 'Force', 'EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 + } + } +} +<# + Integration test are custom to the command you are writing for. + Read https://github.com/sqlcollaborative/dbatools/blob/development/contributing.md#tests + for more guidence +#> \ No newline at end of file diff --git a/tests/Sync-DbaLoginPermission.Tests.ps1 b/tests/Sync-DbaLoginPermission.Tests.ps1 index 603561c4f9..43d0cd9ae3 100644 --- a/tests/Sync-DbaLoginPermission.Tests.ps1 +++ b/tests/Sync-DbaLoginPermission.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 7 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Sync-DbaLoginPermission).Parameters.Keys - $knownParameters = 'Source', 'SourceSqlCredential', 'Destination', 'DestinationSqlCredential', 'Login', 'ExcludeLogin', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'Source','SourceSqlCredential','Destination','DestinationSqlCredential','Login','ExcludeLogin','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Test-DbaJobOwner.Tests.ps1 b/tests/Test-DbaAgentJobOwner.Tests.ps1 similarity index 73% rename from tests/Test-DbaJobOwner.Tests.ps1 rename to tests/Test-DbaAgentJobOwner.Tests.ps1 index ec28091f78..b319666e72 100644 --- a/tests/Test-DbaJobOwner.Tests.ps1 +++ b/tests/Test-DbaAgentJobOwner.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 7 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Test-DbaAgentJobOwner).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Job', 'ExcludeJob', 'Login', 'EnableException', 'Detailed' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Job','ExcludeJob','Login','Detailed','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Test-DbaBackupInformation.Tests.ps1 b/tests/Test-DbaBackupInformation.Tests.ps1 index d71ed0e7ef..89d11c51fa 100644 --- a/tests/Test-DbaBackupInformation.Tests.ps1 +++ b/tests/Test-DbaBackupInformation.Tests.ps1 @@ -3,53 +3,64 @@ Write-Host -Object "Running $PSCommandpath" -ForegroundColor Cyan . "$PSScriptRoot\constants.ps1" Describe "$commandname Unit Tests" -Tag 'UnitTests' { - InModuleScope dbatools { - Context "Everything as it should" { - $BackupHistory = Import-CliXml $PSScriptRoot\..\tests\ObjectDefinitions\BackupRestore\RawInput\CleanFormatDbaInformation.xml - $BackupHistory = $BackupHistory | Format-DbaBackupInformation - Mock Connect-SqlInstance -MockWith { - $obj = [PSCustomObject]@{ - Name = 'BASEName' - NetName = 'BASENetName' - InstanceName = 'BASEInstanceName' - DomainInstanceName = 'BASEDomainInstanceName' - InstallDataDirectory = 'BASEInstallDataDirectory' - ErrorLogPath = 'BASEErrorLog_{0}_{1}_{2}_Path' -f "'", '"', ']' - ServiceName = 'BASEServiceName' - VersionMajor = 9 - ConnectionContext = New-Object PSObject - } - Add-Member -InputObject $obj.ConnectionContext -Name ConnectionString -MemberType NoteProperty -Value 'put=an=equal=in=it' - Add-Member -InputObject $obj -Name Query -MemberType ScriptMethod -Value { - param($query) - if ($query -eq "SELECT DB_NAME(database_id) AS Name, physical_name AS PhysicalName FROM sys.master_files") { - return @( - @{ "Name" = "master" - "PhysicalName" = "C:\temp\master.mdf" - } - ) - } - } - $obj.PSObject.TypeNames.Clear() - $obj.PSObject.TypeNames.Add("Microsoft.SqlServer.Management.Smo.Server") - return $obj - } - Mock Get-DbaDatabase { $null } + Context "Validate parameters" { + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'BackupHistory','SqlInstance','SqlCredential','WithReplace','Continue','VerifyOnly','OutputScriptOnly','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 + } + } +} - Mock New-DbaDirectory {$true} - Mock Test-DbaPath { [pscustomobject]@{ - FilePath = 'does\exists' - FileExists = $true +Describe "$commandname Integration Tests" -Tag 'IntegrationTests' { +InModuleScope dbatools { + Context "Everything as it should" { + $BackupHistory = Import-CliXml $PSScriptRoot\..\tests\ObjectDefinitions\BackupRestore\RawInput\CleanFormatDbaInformation.xml + $BackupHistory = $BackupHistory | Format-DbaBackupInformation + Mock Connect-SqlInstance -MockWith { + $obj = [PSCustomObject]@{ + Name = 'BASEName' + NetName = 'BASENetName' + InstanceName = 'BASEInstanceName' + DomainInstanceName = 'BASEDomainInstanceName' + InstallDataDirectory = 'BASEInstallDataDirectory' + ErrorLogPath = 'BASEErrorLog_{0}_{1}_{2}_Path' -f "'", '"', ']' + ServiceName = 'BASEServiceName' + VersionMajor = 9 + ConnectionContext = New-Object PSObject + } + Add-Member -InputObject $obj.ConnectionContext -Name ConnectionString -MemberType NoteProperty -Value 'put=an=equal=in=it' + Add-Member -InputObject $obj -Name Query -MemberType ScriptMethod -Value { + param($query) + if ($query -eq "SELECT DB_NAME(database_id) AS Name, physical_name AS PhysicalName FROM sys.master_files") { + return @( + @{ "Name" = "master" + "PhysicalName" = "C:\temp\master.mdf" + } + ) } } - Mock New-DbaDirectory {$True} - It "Should pass as all systems Green" { - $output = $BackupHistory | Test-DbaBackupInformation -SqlServer NotExist -WarningVariable warnvar -WarningAction SilentlyContinue - ($output.Count) -gt 0 | Should be $true - $false -in ($Output.IsVerified) | Should be $False - ($null -ne $WarnVar) | Should be $True + $obj.PSObject.TypeNames.Clear() + $obj.PSObject.TypeNames.Add("Microsoft.SqlServer.Management.Smo.Server") + return $obj + } + Mock Get-DbaDatabase { $null } + + Mock New-DbaDirectory {$true} + Mock Test-DbaPath { [pscustomobject]@{ + FilePath = 'does\exists' + FileExists = $true } } + Mock New-DbaDirectory {$True} + It "Should pass as all systems Green" { + $output = $BackupHistory | Test-DbaBackupInformation -SqlServer NotExist -WarningVariable warnvar -WarningAction SilentlyContinue + ($output.Count) -gt 0 | Should be $true + $false -in ($Output.IsVerified) | Should be $False + ($null -ne $WarnVar) | Should be $True + } + } Context "Not being able to see backups is bad" { $BackupHistory = Import-CliXml $PSScriptRoot\..\tests\ObjectDefinitions\BackupRestore\RawInput\CleanFormatDbaInformation.xml $BackupHistory = $BackupHistory | Format-DbaBackupInformation diff --git a/tests/Test-DbaBuild.Tests.ps1 b/tests/Test-DbaBuild.Tests.ps1 index 42af41df9f..1e3e9c047f 100644 --- a/tests/Test-DbaBuild.Tests.ps1 +++ b/tests/Test-DbaBuild.Tests.ps1 @@ -4,22 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - <# - The $paramCount is adjusted based on the parameters your command will have. - - The $defaultParamCount is adjusted based on what type of command you are writing the test for: - - Commands that *do not* include SupportShouldProcess, set defaultParamCount = 11 - - Commands that *do* include SupportShouldProcess, set defaultParamCount = 13 - #> - $paramCount = 9 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Test-DbaBuild).Parameters.Keys - $knownParameters = 'Build', 'MinimumBuild', 'MaxBehind', 'Latest', 'SqlInstance', 'SqlCredential', 'Update', 'Quiet', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'Build','MinimumBuild','MaxBehind','Latest','SqlInstance','SqlCredential','Update','Quiet','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Test-DbaCmConnection.Tests.ps1 b/tests/Test-DbaCmConnection.Tests.ps1 index 0d35ba8495..1f71ebdd9b 100644 --- a/tests/Test-DbaCmConnection.Tests.ps1 +++ b/tests/Test-DbaCmConnection.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 5 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Test-DbaCmConnection).Parameters.Keys - $knownParameters = 'ComputerName', 'Credential', 'Type', 'Force', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'ComputerName','Credential','Type','Force','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Test-DbaConnection.Tests.ps1 b/tests/Test-DbaConnection.Tests.ps1 index 47d8fa4660..ed8f47504a 100644 --- a/tests/Test-DbaConnection.Tests.ps1 +++ b/tests/Test-DbaConnection.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 4 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Test-DbaConnection).Parameters.Keys - $knownParameters = 'SqlInstance', 'Credential', 'SqlCredential', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','Credential','SqlCredential','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Test-DbaConnectionAuthScheme.Tests.ps1 b/tests/Test-DbaConnectionAuthScheme.Tests.ps1 index 48a13f679d..99ab15fb90 100644 --- a/tests/Test-DbaConnectionAuthScheme.Tests.ps1 +++ b/tests/Test-DbaConnectionAuthScheme.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 6 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Test-DbaConnectionAuthScheme).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Kerberos', 'Ntlm', 'Detailed', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Kerberos','Ntlm','Detailed','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Test-DbaDbCollation.Tests.ps1 b/tests/Test-DbaDbCollation.Tests.ps1 index eb1524d974..68cc6be4a2 100644 --- a/tests/Test-DbaDbCollation.Tests.ps1 +++ b/tests/Test-DbaDbCollation.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 6 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Test-DbaDbCollation).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Database', 'ExcludeDatabase', 'Detailed', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Database','ExcludeDatabase','Detailed','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Test-DbaDbCompatibility.Tests.ps1 b/tests/Test-DbaDbCompatibility.Tests.ps1 index 0cf5b2bdad..f7269215e3 100644 --- a/tests/Test-DbaDbCompatibility.Tests.ps1 +++ b/tests/Test-DbaDbCompatibility.Tests.ps1 @@ -4,22 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - <# - The $paramCount is adjusted based on the parameters your command will have. - - The $defaultParamCount is adjusted based on what type of command you are writing the test for: - - Commands that *do not* include SupportShouldProcess, set defaultParamCount = 11 - - Commands that *do* include SupportShouldProcess, set defaultParamCount = 13 - #> - $paramCount = 6 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Test-DbaDbCompatibility).Parameters.Keys - $knownParameters = 'SqlInstance', 'Credential', 'Database', 'ExcludeDatabase', 'Detailed', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','Credential','Database','ExcludeDatabase','Detailed','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Test-DbaDbCompression.Tests.ps1 b/tests/Test-DbaDbCompression.Tests.ps1 index b73e784098..8a4fce5231 100644 --- a/tests/Test-DbaDbCompression.Tests.ps1 +++ b/tests/Test-DbaDbCompression.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandpath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 10 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Test-DbaDbCompression).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Database', 'ExcludeDatabase', 'Schema', 'Table', 'ResultSize', 'Rank', 'FilterBy', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Database','ExcludeDatabase','Schema','Table','ResultSize','Rank','FilterBy','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Test-DbaDbLogShipStatus.Tests.ps1 b/tests/Test-DbaDbLogShipStatus.Tests.ps1 index c8a66a0aeb..3a23a18ee4 100644 --- a/tests/Test-DbaDbLogShipStatus.Tests.ps1 +++ b/tests/Test-DbaDbLogShipStatus.Tests.ps1 @@ -4,23 +4,11 @@ Write-Host -Object "Running $PSCommandpath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tags "UnitTests" { Context "Validate parameters" { - $knownParameters = 'SqlInstance', 'SqlCredential', 'Database', 'ExcludeDatabase', 'Simple', 'Primary', 'Secondary', 'EnableException' - $SupportShouldProcess = $false - $paramCount = $knownParameters.Count - if ($SupportShouldProcess) { - $defaultParamCount = 13 - } else { - $defaultParamCount = 11 - } - $command = Get-Command -Name $CommandName - [object[]]$params = $command.Parameters.Keys - - It "Should contain our specific parameters" { - ((Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count) | Should Be $paramCount - } - - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Database','ExcludeDatabase','Simple','Primary','Secondary','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Test-DbaDbOwner.Tests.ps1 b/tests/Test-DbaDbOwner.Tests.ps1 index 24f4f40489..f089b2ea03 100644 --- a/tests/Test-DbaDbOwner.Tests.ps1 +++ b/tests/Test-DbaDbOwner.Tests.ps1 @@ -4,18 +4,11 @@ Write-Host -Object "Running $PSCommandpath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag "UnitTests" { Context "Validate parameters" { - <# - The $paramCount is adjusted based on the parameters your command will have. - - The $defaultParamCount is adjusted based on what type of command you are writing the test for: - - Commands that *do not* include SupportShouldProcess, set defaultParamCount = 11 - - Commands that *do* include SupportShouldProcess, set defaultParamCount = 13 - #> - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Test-DbaDbOwner).Parameters.Keys - $knownParameters = 'InputObject', 'SqlInstance', 'SqlCredential', 'Database', 'ExcludeDatabase', 'TargetLogin', 'EnableException', 'Detailed' - It "Should contain our specific parameters" { - ((Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count) | Should Be $knownParameters.Count + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Database','ExcludeDatabase','TargetLogin','Detailed','InputObject','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } InModuleScope 'dbatools' { diff --git a/tests/Test-DbaDbRecoveryModel.Tests.ps1 b/tests/Test-DbaDbRecoveryModel.Tests.ps1 index e30775191c..9c046b7a0e 100644 --- a/tests/Test-DbaDbRecoveryModel.Tests.ps1 +++ b/tests/Test-DbaDbRecoveryModel.Tests.ps1 @@ -4,22 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - <# - The $paramCount is adjusted based on the parameters your command will have. - - The $defaultParamCount is adjusted based on what type of command you are writing the test for: - - Commands that *do not* include SupportShouldProcess, set defaultParamCount = 11 - - Commands that *do* include SupportShouldProcess, set defaultParamCount = 13 - #> - $paramCount = 7 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Test-DbaDbRecoveryModel).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'RecoveryModel', 'Database', 'ExcludeDatabase', 'EnableException', 'Detailed' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','Database','ExcludeDatabase','SqlCredential','RecoveryModel','Detailed','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Test-DbaDbVirtualLogFile.Tests.ps1 b/tests/Test-DbaDbVirtualLogFile.Tests.ps1 index e190b377f1..c78712104e 100644 --- a/tests/Test-DbaDbVirtualLogFile.Tests.ps1 +++ b/tests/Test-DbaDbVirtualLogFile.Tests.ps1 @@ -7,22 +7,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan #> Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - <# - The $paramCount is adjusted based on the parameters your command will have. - - The $defaultParamCount is adjusted based on what type of command you are writing the test for: - - Commands that *do not* include SupportShouldProcess, set defaultParamCount = 11 - - Commands that *do* include SupportShouldProcess, set defaultParamCount = 13 - #> - $paramCount = 6 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Test-DbaDbVirtualLogFile).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Database', 'ExcludeDatabase', 'IncludeSystemDbs', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Database','ExcludeDatabase','IncludeSystemDBs','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Test-DbaDeprecatedFeature.Tests.ps1 b/tests/Test-DbaDeprecatedFeature.Tests.ps1 index 405c9299fc..2948c37bc9 100644 --- a/tests/Test-DbaDeprecatedFeature.Tests.ps1 +++ b/tests/Test-DbaDeprecatedFeature.Tests.ps1 @@ -5,22 +5,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - <# - The $paramCount is adjusted based on the parameters your command will have. - - The $defaultParamCount is adjusted based on what type of command you are writing the test for: - - Commands that *do not* include SupportShouldProcess, set defaultParamCount = 11 - - Commands that *do* include SupportShouldProcess, set defaultParamCount = 13 - #> - $paramCount = 6 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Test-DbaDeprecatedFeature).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Database', 'ExcludeDatabase', 'InputObject', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Database','ExcludeDatabase','InputObject','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Test-DbaDiskAlignment.Tests.ps1 b/tests/Test-DbaDiskAlignment.Tests.ps1 index df81a18066..1f79b1862e 100644 --- a/tests/Test-DbaDiskAlignment.Tests.ps1 +++ b/tests/Test-DbaDiskAlignment.Tests.ps1 @@ -4,22 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - <# - The $paramCount is adjusted based on the parameters your command will have. - - The $defaultParamCount is adjusted based on what type of command you are writing the test for: - - Commands that *do not* include SupportShouldProcess, set defaultParamCount = 11 - - Commands that *do* include SupportShouldProcess, set defaultParamCount = 13 - #> - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Test-DbaDiskAlignment).Parameters.Keys - $knownParameters = 'ComputerName', 'SqlCredential', 'Credential', 'NoSqlCheck', 'EnableException' - $paramCount = $knownParameters.Count - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'ComputerName','Credential','SqlCredential','NoSqlCheck','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } \ No newline at end of file diff --git a/tests/Test-DbaDiskAllocation.Tests.ps1 b/tests/Test-DbaDiskAllocation.Tests.ps1 index ff356ac4f9..6cd02f99fe 100644 --- a/tests/Test-DbaDiskAllocation.Tests.ps1 +++ b/tests/Test-DbaDiskAllocation.Tests.ps1 @@ -4,22 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - <# - The $paramCount is adjusted based on the parameters your command will have. - - The $defaultParamCount is adjusted based on what type of command you are writing the test for: - - Commands that *do not* include SupportShouldProcess, set defaultParamCount = 11 - - Commands that *do* include SupportShouldProcess, set defaultParamCount = 13 - #> - $paramCount = 6 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Test-DbaDiskAllocation).Parameters.Keys - $knownParameters = 'ComputerName', 'NoSqlCheck', 'SqlCredential', 'Credential', 'Detailed', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'ComputerName','NoSqlCheck','SqlCredential','Credential','Detailed','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Test-DbaDiskSpeed.Tests.ps1 b/tests/Test-DbaDiskSpeed.Tests.ps1 index b539c2f03b..144f639a35 100644 --- a/tests/Test-DbaDiskSpeed.Tests.ps1 +++ b/tests/Test-DbaDiskSpeed.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 5 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Test-DbaDiskSpeed).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Database', 'ExcludeDatabase', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Database','ExcludeDatabase','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Test-DbaEndpoint.Tests.ps1 b/tests/Test-DbaEndpoint.Tests.ps1 index bd7114b8ef..d307c9fa80 100644 --- a/tests/Test-DbaEndpoint.Tests.ps1 +++ b/tests/Test-DbaEndpoint.Tests.ps1 @@ -4,23 +4,11 @@ Write-Host -Object "Running $PSCommandpath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tags "UnitTests" { Context "Validate parameters" { - $knownParameters = 'SqlInstance', 'SqlCredential', 'Endpoint', 'InputObject', 'EnableException' - $SupportShouldProcess = $false - $paramCount = $knownParameters.Count - if ($SupportShouldProcess) { - $defaultParamCount = 13 - } else { - $defaultParamCount = 11 - } - $command = Get-Command -Name $CommandName - [object[]]$params = $command.Parameters.Keys - - It "Should contain our specific parameters" { - ((Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count) | Should Be $paramCount - } - - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Endpoint','InputObject','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Test-DbaIdentityUsage.Tests.ps1 b/tests/Test-DbaIdentityUsage.Tests.ps1 index b01e0fdcb5..a66f4a0e38 100644 --- a/tests/Test-DbaIdentityUsage.Tests.ps1 +++ b/tests/Test-DbaIdentityUsage.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 7 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Test-DbaIdentityUsage).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Database', 'ExcludeDatabase', 'Threshold', 'ExcludeSystem', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Database','ExcludeDatabase','Threshold','ExcludeSystem','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Test-DbaLastBackup.Tests.ps1 b/tests/Test-DbaLastBackup.Tests.ps1 index e04472e8cc..ffcef13263 100644 --- a/tests/Test-DbaLastBackup.Tests.ps1 +++ b/tests/Test-DbaLastBackup.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Test-DbaLastBackup).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Database', 'ExcludeDatabase', 'Destination', 'DestinationCredential', 'DataDirectory', 'LogDirectory', 'Prefix', 'VerifyOnly', 'NoCheck', 'NoDrop', 'CopyFile', 'CopyPath', 'MaxSize', 'IncludeCopyOnly', 'IgnoreLogBackup', 'AzureCredential', 'InputObject', 'EnableException' - $paramCount = $knownParameters.Count - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Database','ExcludeDatabase','Destination','DestinationCredential','DataDirectory','LogDirectory','Prefix','VerifyOnly','NoCheck','NoDrop','CopyFile','CopyPath','MaxSize','IncludeCopyOnly','IgnoreLogBackup','AzureCredential','InputObject','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Test-DbaLinkedServerConnection.Tests.ps1 b/tests/Test-DbaLinkedServerConnection.Tests.ps1 index 732c70bc0d..2e3e8bbc1a 100644 --- a/tests/Test-DbaLinkedServerConnection.Tests.ps1 +++ b/tests/Test-DbaLinkedServerConnection.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 3 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Test-DbaLinkedServerConnection).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Test-DbaLoginPassword.Tests.ps1 b/tests/Test-DbaLoginPassword.Tests.ps1 index e77be13c92..0b6849c2b6 100644 --- a/tests/Test-DbaLoginPassword.Tests.ps1 +++ b/tests/Test-DbaLoginPassword.Tests.ps1 @@ -5,15 +5,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag UnitTests, Get-DbaLogin { Context "Validate parameters" { - $paramCount = 6 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Test-DbaLoginPassword).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Dictionary', 'Login', 'InputObject', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Login','Dictionary','InputObject','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Test-DbaLsnChain.Tests.ps1 b/tests/Test-DbaLsnChain.Tests.ps1 index 0a95c4ddb1..0de723c779 100644 --- a/tests/Test-DbaLsnChain.Tests.ps1 +++ b/tests/Test-DbaLsnChain.Tests.ps1 @@ -1,8 +1,20 @@ $CommandName = $MyInvocation.MyCommand.Name.Replace(".Tests.ps1", "") Write-Host -Object "Running $PSCommandpath" -ForegroundColor Cyan . "$PSScriptRoot\constants.ps1" +. "$PSScriptRoot\..\internal\functions\Test-DbaLsnChain.ps1" Describe "$commandname Unit Tests" -Tag 'UnitTests' { + Context "Validate parameters" { + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'FilteredRestoreFiles','Continue','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 + } + } +} + +Describe "$commandname Integration Tests" -Tag 'IntegrationTests' { InModuleScope dbatools { Context "General Diff restore" { $Header = ConvertFrom-Json -InputObject (Get-Content $PSScriptRoot\..\tests\ObjectDefinitions\BackupRestore\RawInput\DiffRestore.json -raw) diff --git a/tests/Test-DbaManagementObject.Tests.ps1 b/tests/Test-DbaManagementObject.Tests.ps1 index 52e382ae81..371c2bfb4d 100644 --- a/tests/Test-DbaManagementObject.Tests.ps1 +++ b/tests/Test-DbaManagementObject.Tests.ps1 @@ -10,22 +10,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan #> Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - <# - The $paramCount is adjusted based on the parameters your command will have. - - The $defaultParamCount is adjusted based on what type of command you are writing the test for: - - Commands that *do not* include SupportShouldProcess, set defaultParamCount = 11 - - Commands that *do* include SupportShouldProcess, set defaultParamCount = 13 - #> - $paramCount = 4 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem Function:\Test-DbaManagementObject).Parameters.Keys - $knownParameters = 'ComputerName', 'Credential', 'VersionNumber', 'EnableException' - it "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - it "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'ComputerName','Credential','VersionNumber','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Test-DbaMaxDop.Tests.ps1 b/tests/Test-DbaMaxDop.Tests.ps1 index bd9f6baa03..28f9973e1f 100644 --- a/tests/Test-DbaMaxDop.Tests.ps1 +++ b/tests/Test-DbaMaxDop.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 4 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Test-DbaMaxDop).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Detailed', 'EnableException' - It "Should contain our specific parameters" { - ((Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Detailed','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Test-DbaMaxMemory.Tests.ps1 b/tests/Test-DbaMaxMemory.Tests.ps1 index b06228f274..011ff7d2e9 100644 --- a/tests/Test-DbaMaxMemory.Tests.ps1 +++ b/tests/Test-DbaMaxMemory.Tests.ps1 @@ -3,10 +3,12 @@ Write-Host -Object "Running $PSCommandpath" -ForegroundColor Cyan . "$PSScriptRoot\constants.ps1" Describe "$commandname Integration Tests" -Tags "IntegrationTests" { - Context "Connects to multiple instances" { - It 'Returns multiple objects' { - $results = Test-DbaMaxMemory -SqlInstance $script:instance1, $script:instance2 - $results.Count | Should BeGreaterThan 1 # and ultimately not throw an exception + Context "Validate parameters" { + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance', 'SqlCredential', 'Credential', 'EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } @@ -22,12 +24,6 @@ Describe "$commandname Unit Tests" -Tag 'UnitTests' { Mock Get-DbaMaxMemory -MockWith { return $null } { Test-DbaMaxMemory -SqlInstance '' } | Should Throw } - - It 'SqlInstance parameter host cannot be found' { - Mock Get-DbaMaxMemory -MockWith { return $null } - Test-DbaMaxMemory -SqlInstance 'ABC' 3> $null | Should be $null - } - } Context 'Validate functionality - Single Instance' { diff --git a/tests/Test-DbaMigrationConstraint.Tests.ps1 b/tests/Test-DbaMigrationConstraint.Tests.ps1 index 3cbb0c2a78..558c8bb380 100644 --- a/tests/Test-DbaMigrationConstraint.Tests.ps1 +++ b/tests/Test-DbaMigrationConstraint.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 7 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Test-DbaMigrationConstraint).Parameters.Keys - $knownParameters = 'Source', 'SourceSqlCredential', 'Destination', 'DestinationSqlCredential', 'Database', 'ExcludeDatabase', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'Source','SourceSqlCredential','Destination','DestinationSqlCredential','Database','ExcludeDatabase','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Test-DbaNetworkLatency.Tests.ps1 b/tests/Test-DbaNetworkLatency.Tests.ps1 index b0bced783b..905f66787a 100644 --- a/tests/Test-DbaNetworkLatency.Tests.ps1 +++ b/tests/Test-DbaNetworkLatency.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 5 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Test-DbaNetworkLatency).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Query', 'Count', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Query','Count','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Test-DbaOptimizeForAdHoc.Tests.ps1 b/tests/Test-DbaOptimizeForAdHoc.Tests.ps1 index f0d51d78ba..f146908006 100644 --- a/tests/Test-DbaOptimizeForAdHoc.Tests.ps1 +++ b/tests/Test-DbaOptimizeForAdHoc.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 3 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Test-DbaOptimizeForAdHoc).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Test-DbaPath.Tests.ps1 b/tests/Test-DbaPath.Tests.ps1 index 5d38f65f5d..6398323d3d 100644 --- a/tests/Test-DbaPath.Tests.ps1 +++ b/tests/Test-DbaPath.Tests.ps1 @@ -10,22 +10,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan #> Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - <# - The $paramCount is adjusted based on the parameters your command will have. - - The $defaultParamCount is adjusted based on what type of command you are writing the test for: - - Commands that *do not* include SupportShouldProcess, set defaultParamCount = 11 - - Commands that *do* include SupportShouldProcess, set defaultParamCount = 13 - #> - $paramCount = 4 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Test-DbaPath).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Path', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Path','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Test-DbaPowerPlan.Tests.ps1 b/tests/Test-DbaPowerPlan.Tests.ps1 index 4fa9ff3377..bf4c81f94c 100644 --- a/tests/Test-DbaPowerPlan.Tests.ps1 +++ b/tests/Test-DbaPowerPlan.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 6 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Test-DbaPowerPlan).Parameters.Keys - $knownParameters = 'ComputerName', 'Credential', 'CustomPowerPlan', 'Detailed', 'EnableException', 'InputObject' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'ComputerName','Credential','CustomPowerPlan','InputObject','Detailed','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Test-DbaRepLatency.Tests.ps1 b/tests/Test-DbaRepLatency.Tests.ps1 index 5da90305af..602e2c2808 100644 --- a/tests/Test-DbaRepLatency.Tests.ps1 +++ b/tests/Test-DbaRepLatency.Tests.ps1 @@ -4,24 +4,12 @@ Write-Host -Object "Running $PSCommandpath" -ForegroundColor Cyan . "$PSScriptRoot\..\internal\functions\Connect-SqlInstance.ps1" Describe "$commandname Unit Tests" -Tag 'UnitTests' { - - InModuleScope dbatools { - - Context "Parameter Validation" { - - [object[]]$params = (Get-ChildItem function:\Test-DbaRepLatency).Parameters.Keys - $knownParameters = 'SqlInstance', 'Database', 'SqlCredential', 'PublicationName', 'TimeToLive', 'RetainToken', 'DisplayTokenHistory', 'EnableException' - $paramCount = $knownParameters.Count - $defaultParamCount = $params.Count - $paramCount - - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount - } - + Context "Validate parameters" { + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','Database','SqlCredential','PublicationName','TimeToLive','RetainToken','DisplayTokenHistory','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } \ No newline at end of file diff --git a/tests/Test-DbaServerName.Tests.ps1 b/tests/Test-DbaServerName.Tests.ps1 index f2166f7e5d..2d94f8722b 100644 --- a/tests/Test-DbaServerName.Tests.ps1 +++ b/tests/Test-DbaServerName.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 5 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Test-DbaServerName).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Detailed', 'ExcludeSsrs', 'EnableException' - it "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - it "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Detailed','ExcludeSsrs','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Test-DbaSpn.Tests.ps1 b/tests/Test-DbaSpn.Tests.ps1 index 9964479a93..4beef3119a 100644 --- a/tests/Test-DbaSpn.Tests.ps1 +++ b/tests/Test-DbaSpn.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 3 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Test-DbaSpn).Parameters.Keys - $knownParameters = 'ComputerName', 'Credential', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'ComputerName','Credential','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Test-DbaTempDbConfig.Tests.ps1 b/tests/Test-DbaTempDbConfig.Tests.ps1 index 483af9ba2c..6a10e467e1 100644 --- a/tests/Test-DbaTempDbConfig.Tests.ps1 +++ b/tests/Test-DbaTempDbConfig.Tests.ps1 @@ -10,22 +10,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan #> Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - <# - The $paramCount is adjusted based on the parameters your command will have. - - The $defaultParamCount is adjusted based on what type of command you are writing the test for: - - Commands that *do not* include SupportShouldProcess, set defaultParamCount = 11 - - Commands that *do* include SupportShouldProcess, set defaultParamCount = 13 - #> - $paramCount = 4 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Test-DbaTempdbConfig).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'EnableException', 'Detailed' - It "Should contain our specific parameters" { - ((Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Detailed','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Test-DbaWindowsLogin.Tests.ps1 b/tests/Test-DbaWindowsLogin.Tests.ps1 index 09c6c1eaeb..4203c19209 100644 --- a/tests/Test-DbaWindowsLogin.Tests.ps1 +++ b/tests/Test-DbaWindowsLogin.Tests.ps1 @@ -10,22 +10,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan #> Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - <# - The $paramCount is adjusted based on the parameters your command will have. - - The $defaultParamCount is adjusted based on what type of command you are writing the test for: - - Commands that *do not* include SupportShouldProcess, set defaultParamCount = 11 - - Commands that *do* include SupportShouldProcess, set defaultParamCount = 13 - #> - $paramCount = 8 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Test-DbaWindowsLogin).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Login', 'ExcludeLogin', 'FilterBy', 'IgnoreDomains', 'EnableException', 'Detailed' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Login','ExcludeLogin','FilterBy','IgnoreDomains','Detailed','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Test-PSRemoting.Tests.ps1 b/tests/Test-PSRemoting.Tests.ps1 index d7fe713870..9c06883acc 100644 --- a/tests/Test-PSRemoting.Tests.ps1 +++ b/tests/Test-PSRemoting.Tests.ps1 @@ -1,22 +1,16 @@ $CommandName = $MyInvocation.MyCommand.Name.Replace(".Tests.ps1", "") Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan . "$PSScriptRoot\constants.ps1" +. "$PSScriptRoot\..\internal\functions\Test-PSRemoting.ps1" + Describe "$CommandName Unit Tests" -Tag "UnitTests" { Context "Validate parameters" { - $paramCount = 3 - <# - Get commands, Default count = 11 - Commands with SupportShouldProcess = 13 - #> - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Test-PSRemoting).Parameters.Keys - $knownParameters = 'ComputerName', 'Credential', 'EnableException' - It "Contains our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Contains $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'ComputerName', 'Credential', 'EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Uninstall-DbaSqlWatch.Tests.ps1 b/tests/Uninstall-DbaSqlWatch.Tests.ps1 index 8ace60b9e0..9e768cebc5 100644 --- a/tests/Uninstall-DbaSqlWatch.Tests.ps1 +++ b/tests/Uninstall-DbaSqlWatch.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandpath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 4 - $commonParamCount = ([System.Management.Automation.PSCmdlet]::CommonParameters).Count + 2 - [object[]]$params = (Get-ChildItem function:\Uninstall-DbaSqlWatch).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Database', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $commonParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Database','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Uninstall-DbaWatchUpdate.Tests.ps1 b/tests/Uninstall-DbaWatchUpdate.Tests.ps1 index 52d62719de..d3f33db929 100644 --- a/tests/Uninstall-DbaWatchUpdate.Tests.ps1 +++ b/tests/Uninstall-DbaWatchUpdate.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 0 - $defaultParamCount = 0 - [object[]]$params = (Get-ChildItem function:\Uninstall-DbaWatchUpdate).Parameters.Keys - $knownParameters = '' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = $null + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It -Skip "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Unregister-DbatoolsConfig.Tests.ps1 b/tests/Unregister-DbatoolsConfig.Tests.ps1 new file mode 100644 index 0000000000..3848d27959 --- /dev/null +++ b/tests/Unregister-DbatoolsConfig.Tests.ps1 @@ -0,0 +1,19 @@ +$CommandName = $MyInvocation.MyCommand.Name.Replace(".Tests.ps1", "") +Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan +. "$PSScriptRoot\constants.ps1" + +Describe "$CommandName Unit Tests" -Tag 'UnitTests' { + Context "Validate parameters" { + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'ConfigurationItem', 'FullName', 'Module', 'Name', 'Scope' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 + } + } +} +<# + Integration test are custom to the command you are writing for. + Read https://github.com/sqlcollaborative/dbatools/blob/development/contributing.md#tests + for more guidence +#> \ No newline at end of file diff --git a/tests/Update-DbaInstance.Tests.ps1 b/tests/Update-DbaInstance.Tests.ps1 index eb3c8eaa97..87f00779d2 100644 --- a/tests/Update-DbaInstance.Tests.ps1 +++ b/tests/Update-DbaInstance.Tests.ps1 @@ -7,7 +7,7 @@ $exeDir = "C:\Temp\dbatools_$CommandName" Describe "$CommandName Unit Tests" -Tag 'UnitTests' { BeforeAll { # Prevent the functions from executing dangerous stuff and getting right responses where needed - Mock -CommandName Invoke-Program -MockWith { $null } -ModuleName dbatools + Mock -CommandName Invoke-Program -MockWith { [pscustomobject]@{ Successful = $true; ExitCode = [uint32[]]3010 } } -ModuleName dbatools Mock -CommandName Test-PendingReboot -MockWith { $false } -ModuleName dbatools Mock -CommandName Test-ElevationRequirement -MockWith { $null } -ModuleName dbatools Mock -CommandName Restart-Computer -MockWith { $null } -ModuleName dbatools @@ -20,15 +20,11 @@ Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Mock -CommandName Get-DbaDiskSpace -MockWith { [pscustomobject]@{ Name = 'C:\'; Free = 1 } } -ModuleName dbatools } Context "Validate parameters" { - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\$CommandName).Parameters.Keys - $knownParameters = 'ComputerName', 'Credential', 'Version', 'Type', 'Path', 'Restart', 'EnableException', 'Kb', 'InstanceName', 'Continue' - $paramCount = $knownParameters.Count - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'ComputerName','Credential','Version','Type','KB','InstanceName','Path','Restart','Continue','Throttle','Authentication','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } Context "Validate upgrades to a latest version" { @@ -36,6 +32,17 @@ Describe "$CommandName Unit Tests" -Tag 'UnitTests' { #this is our 'currently installed' versions Mock -CommandName Get-SQLInstanceComponent -ModuleName dbatools -MockWith { @( + [pscustomobject]@{InstanceName = 'LAB0'; Version = [pscustomobject]@{ + "SqlInstance" = $null + "Build" = "14.0.3038" + "NameLevel" = "2017" + "SPLevel" = "RTM", "LATEST" + "CULevel" = 'CU11' + "KBLevel" = "4462262" + "BuildLevel" = [version]'14.0.3038' + "MatchType" = "Exact" + } + } [pscustomobject]@{InstanceName = 'LAB'; Version = [pscustomobject]@{ "SqlInstance" = $null "Build" = "11.0.5058" @@ -60,6 +67,22 @@ Describe "$CommandName Unit Tests" -Tag 'UnitTests' { } ) } + #Mock 2017 to think CU12 is the latest patch available + Mock -CommandName Test-DbaBuild -ModuleName dbatools -MockWith { + [pscustomobject]@{ + "Build" = "14.0.3038" + "BuildTarget" = [version]"14.0.3045" + "Compliant" = $false + "NameLevel" = "2017" + "SPLevel" = "RTM", "LATEST" + "SPTarget" = "RTM" + "CULevel" = 'CU11' + "CUTarget" = 'CU12' + "KBLevel" = "4462262" + "BuildLevel" = [version]'14.0.3038' + "MatchType" = "Exact" + } + } -ParameterFilter { $Build -eq [version]'14.0.3038' -and $MaxBehind -eq '0CU' } if (-Not(Test-Path $exeDir)) { $null = New-Item -ItemType Directory -Path $exeDir } @@ -67,6 +90,7 @@ Describe "$CommandName Unit Tests" -Tag 'UnitTests' { $kbs = @( 'SQLServer2008SP4-KB2979596-x64-ENU.exe' 'SQLServer2012-KB4018073-x64-ENU.exe' + 'SQLServer2017-KB4464082-x64-ENU.exe' ) foreach ($kb in $kbs) { $null = New-Item -ItemType File -Path (Join-Path $exeDir $kb) -Force @@ -77,14 +101,29 @@ Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Remove-Item $exeDir -Force -Recurse } } + It "Should mock-upgrade SQL2017\LAB0 to SP0CU12 thinking it's latest" { + $result = Update-DbaInstance -Version 2017 -Path $exeDir -Restart -EnableException -Confirm:$false + Assert-MockCalled -CommandName Get-SQLInstanceComponent -Exactly 1 -Scope It -ModuleName dbatools + Assert-MockCalled -CommandName Test-DbaBuild -Exactly 2 -Scope It -ModuleName dbatools + Assert-MockCalled -CommandName Invoke-Program -Exactly 2 -Scope It -ModuleName dbatools + Assert-MockCalled -CommandName Restart-Computer -Exactly 1 -Scope It -ModuleName dbatools + + $result | Should -Not -BeNullOrEmpty + $result.MajorVersion | Should -Be 2017 + $result.TargetLevel | Should -Be RTMCU12 + $result.KB | Should -Be 4464082 + $result.Successful | Should -Be $true + $result.Restarted | Should -Be $true + $result.Installer | Should -Be (Join-Path $exeDir 'SQLServer2017-KB4464082-x64-ENU.exe') + $result.Notes | Should -BeNullOrEmpty + $result.ExtractPath | Should -BeLike '*\dbatools_KB*Extract' + } It "Should mock-upgrade SQL2008\LAB2 to latest SP" { $result = Update-DbaInstance -Version 2008 -InstanceName LAB2 -Type ServicePack -Path $exeDir -Restart -EnableException -Confirm:$false + Assert-MockCalled -CommandName Test-DbaBuild -Exactly 0 -Scope It -ModuleName dbatools Assert-MockCalled -CommandName Get-SQLInstanceComponent -Exactly 1 -Scope It -ModuleName dbatools Assert-MockCalled -CommandName Invoke-Program -Exactly 2 -Scope It -ModuleName dbatools Assert-MockCalled -CommandName Restart-Computer -Exactly 1 -Scope It -ModuleName dbatools - #no remote execution in tests - #Assert-MockCalled -CommandName Register-RemoteSessionConfiguration -Exactly 0 -Scope It -ModuleName dbatools - #Assert-MockCalled -CommandName Unregister-RemoteSessionConfiguration -Exactly 1 -Scope It -ModuleName dbatools $result | Should -Not -BeNullOrEmpty $result.MajorVersion | Should -Be 2008 @@ -94,17 +133,15 @@ Describe "$CommandName Unit Tests" -Tag 'UnitTests' { $result.Restarted | Should -Be $true $result.InstanceName | Should -Be LAB2 $result.Installer | Should -Be (Join-Path $exeDir 'SQLServer2008SP4-KB2979596-x64-ENU.exe') - $result.Message | Should -BeNullOrEmpty + $result.Notes | Should -BeNullOrEmpty $result.ExtractPath | Should -BeLike '*\dbatools_KB*Extract' } - It "Should mock-upgrade both versions to latest SPs" { - $results = Update-DbaInstance -Type ServicePack -Path $exeDir -Restart -EnableException -Confirm:$false + It "Should mock-upgrade two versions to latest SPs" { + $results = Update-DbaInstance -Version 2008, 2012 -Type ServicePack -Path $exeDir -Restart -EnableException -Confirm:$false + Assert-MockCalled -CommandName Test-DbaBuild -Exactly 0 -Scope It -ModuleName dbatools Assert-MockCalled -CommandName Get-SQLInstanceComponent -Exactly 1 -Scope It -ModuleName dbatools Assert-MockCalled -CommandName Invoke-Program -Exactly 4 -Scope It -ModuleName dbatools Assert-MockCalled -CommandName Restart-Computer -Exactly 2 -Scope It -ModuleName dbatools - #no remote execution in tests - #Assert-MockCalled -CommandName Register-RemoteSessionConfiguration -Exactly 0 -Scope It -ModuleName dbatools - #Assert-MockCalled -CommandName Unregister-RemoteSessionConfiguration -Exactly 1 -Scope It -ModuleName dbatools ($results | Measure-Object).Count | Should -Be 2 @@ -117,7 +154,7 @@ Describe "$CommandName Unit Tests" -Tag 'UnitTests' { $result.Successful | Should -Be $true $result.Restarted | Should -Be $true $result.Installer | Should -Be (Join-Path $exeDir 'SQLServer2008SP4-KB2979596-x64-ENU.exe') - $result.Message | Should -BeNullOrEmpty + $result.Notes | Should -BeNullOrEmpty $result.ExtractPath | Should -BeLike '*\dbatools_KB*Extract' #2012SP4 @@ -129,7 +166,7 @@ Describe "$CommandName Unit Tests" -Tag 'UnitTests' { $result.Successful | Should -Be $true $result.Restarted | Should -Be $true $result.Installer | Should -Be (Join-Path $exeDir 'SQLServer2012-KB4018073-x64-ENU.exe') - $result.Message | Should -BeNullOrEmpty + $result.Notes | Should -BeNullOrEmpty $result.ExtractPath | Should -BeLike '*\dbatools_KB*Extract' } } @@ -188,9 +225,6 @@ Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Assert-MockCalled -CommandName Get-SQLInstanceComponent -Exactly 1 -Scope It -ModuleName dbatools Assert-MockCalled -CommandName Invoke-Program -Exactly 2 -Scope It -ModuleName dbatools Assert-MockCalled -CommandName Restart-Computer -Exactly 1 -Scope It -ModuleName dbatools - #no remote execution in tests - #Assert-MockCalled -CommandName Register-RemoteSessionConfiguration -Exactly 0 -Scope It -ModuleName dbatools - #Assert-MockCalled -CommandName Unregister-RemoteSessionConfiguration -Exactly 1 -Scope It -ModuleName dbatools $result | Should -Not -BeNullOrEmpty $result.MajorVersion | Should -Be 2008 @@ -199,17 +233,14 @@ Describe "$CommandName Unit Tests" -Tag 'UnitTests' { $result.Successful | Should -Be $true $result.Restarted | Should -Be $true $result.Installer | Should -Be (Join-Path $exeDir 'SQLServer2008SP3-KB2546951-x64-ENU.exe') - $result.Message | Should -BeNullOrEmpty + $result.Notes | Should -BeNullOrEmpty $result.ExtractPath | Should -BeLike '*\dbatools_KB*Extract' } It "Should mock-upgrade SQL2016 to SP1CU4 (KB3182545 + KB4024305) " { $result = Update-DbaInstance -Kb 3182545, 4024305 -Path $exeDir -Restart -EnableException -Confirm:$false - Assert-MockCalled -CommandName Get-SQLInstanceComponent -Exactly 2 -Scope It -ModuleName dbatools + Assert-MockCalled -CommandName Get-SQLInstanceComponent -Exactly 1 -Scope It -ModuleName dbatools Assert-MockCalled -CommandName Invoke-Program -Exactly 2 -Scope It -ModuleName dbatools Assert-MockCalled -CommandName Restart-Computer -Exactly 1 -Scope It -ModuleName dbatools - #no remote execution in tests - #Assert-MockCalled -CommandName Register-RemoteSessionConfiguration -Exactly 0 -Scope It -ModuleName dbatools - #Assert-MockCalled -CommandName Unregister-RemoteSessionConfiguration -Exactly 1 -Scope It -ModuleName dbatools $result | Should -Not -BeNullOrEmpty $result.MajorVersion | Should -Be 2016 @@ -218,17 +249,14 @@ Describe "$CommandName Unit Tests" -Tag 'UnitTests' { $result.Successful | Should -Be $true $result.Restarted | Should -Be $true $result.Installer | Should -Be (Join-Path $exeDir 'SQLServer2016-KB4024305-x64-ENU.exe') - $result.Message | Should -BeNullOrEmpty + $result.Notes | Should -BeNullOrEmpty $result.ExtractPath | Should -BeLike '*\dbatools_KB*Extract' } It "Should mock-upgrade both versions to different KBs" { $results = Update-DbaInstance -Kb 3182545, 4040714, KB2546951, KB2738350 -Path $exeDir -Restart -EnableException -Confirm:$false - Assert-MockCalled -CommandName Get-SQLInstanceComponent -Exactly 4 -Scope It -ModuleName dbatools + Assert-MockCalled -CommandName Get-SQLInstanceComponent -Exactly 1 -Scope It -ModuleName dbatools Assert-MockCalled -CommandName Invoke-Program -Exactly 6 -Scope It -ModuleName dbatools Assert-MockCalled -CommandName Restart-Computer -Exactly 3 -Scope It -ModuleName dbatools - #no remote execution in tests - #Assert-MockCalled -CommandName Register-RemoteSessionConfiguration -Exactly 0 -Scope It -ModuleName dbatools - #Assert-MockCalled -CommandName Unregister-RemoteSessionConfiguration -Exactly 1 -Scope It -ModuleName dbatools ($results | Measure-Object).Count | Should -Be 3 @@ -240,7 +268,7 @@ Describe "$CommandName Unit Tests" -Tag 'UnitTests' { $result.Successful | Should -Be $true $result.Restarted | Should -Be $true $result.Installer | Should -Be (Join-Path $exeDir 'SQLServer2016-KB4040714-x64.exe') - $result.Message | Should -BeNullOrEmpty + $result.Notes | Should -BeNullOrEmpty $result.ExtractPath | Should -BeLike '*\dbatools_KB*Extract' #2008SP3 @@ -251,7 +279,7 @@ Describe "$CommandName Unit Tests" -Tag 'UnitTests' { $result.Successful | Should -Be $true $result.Restarted | Should -Be $true $result.Installer | Should -Be (Join-Path $exeDir 'SQLServer2008SP3-KB2546951-x64-ENU.exe') - $result.Message | Should -BeNullOrEmpty + $result.Notes | Should -BeNullOrEmpty $result.ExtractPath | Should -BeLike '*\dbatools_KB*Extract' #2008SP3CU7 @@ -262,7 +290,7 @@ Describe "$CommandName Unit Tests" -Tag 'UnitTests' { $result.Successful | Should -Be $true $result.Restarted | Should -Be $true $result.Installer | Should -Be (Join-Path $exeDir 'SQLServer2008-KB2738350-x64-ENU.exe') - $result.Message | Should -BeNullOrEmpty + $result.Notes | Should -BeNullOrEmpty $result.ExtractPath | Should -BeLike '*\dbatools_KB*Extract' } } @@ -282,7 +310,7 @@ Describe "$CommandName Unit Tests" -Tag 'UnitTests' { "BuildLevel" = [version]'11.0.5058' "MatchType" = "Exact" } - Resume = $true + Resume = $true } } #Mock Get-Item and Get-ChildItem with a dummy file @@ -298,9 +326,6 @@ Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Assert-MockCalled -CommandName Get-SQLInstanceComponent -Exactly 1 -Scope It -ModuleName dbatools Assert-MockCalled -CommandName Invoke-Program -Exactly 2 -Scope It -ModuleName dbatools Assert-MockCalled -CommandName Restart-Computer -Exactly 1 -Scope It -ModuleName dbatools - #no remote execution in tests - #Assert-MockCalled -CommandName Register-RemoteSessionConfiguration -Exactly 0 -Scope It -ModuleName dbatools - #Assert-MockCalled -CommandName Unregister-RemoteSessionConfiguration -Exactly 1 -Scope It -ModuleName dbatools $result | Should -Not -BeNullOrEmpty $result.MajorVersion | Should -Be 2012 @@ -310,7 +335,7 @@ Describe "$CommandName Unit Tests" -Tag 'UnitTests' { $result.Restarted | Should -Be $true $result.InstanceName | Should -Be LAB $result.Installer | Should -Be 'c:\mocked\filename.exe' - $result.Message | Should -BeNullOrEmpty + $result.Notes | Should -BeNullOrEmpty $result.ExtractPath | Should -BeLike '*\dbatools_KB*Extract' } } @@ -484,7 +509,7 @@ Describe "$CommandName Unit Tests" -Tag 'UnitTests' { } It "$v to $cuLevel" { $results = Update-DbaInstance -Version "$v$cuLevel" -Path 'mocked' -Restart -EnableException -Confirm:$false - Assert-MockCalled -CommandName Get-SQLInstanceComponent -Exactly $steps -Scope It -ModuleName dbatools + Assert-MockCalled -CommandName Get-SQLInstanceComponent -Exactly 1 -Scope It -ModuleName dbatools Assert-MockCalled -CommandName Invoke-Program -Exactly ($steps * 2) -Scope It -ModuleName dbatools Assert-MockCalled -CommandName Restart-Computer -Exactly $steps -Scope It -ModuleName dbatools for ($i = 0; $i -lt $steps; $i++) { @@ -497,7 +522,7 @@ Describe "$CommandName Unit Tests" -Tag 'UnitTests' { $result.Successful | Should -Be $true $result.Restarted | Should -Be $true $result.Installer | Should -Be 'c:\mocked\filename.exe' - $result.Message | Should -BeNullOrEmpty + $result.Notes | Should -BeNullOrEmpty $result.ExtractPath | Should -BeLike '*\dbatools_KB*Extract' } } @@ -556,6 +581,31 @@ Describe "$CommandName Unit Tests" -Tag 'UnitTests' { { Update-DbaInstance -Version 2008SP3CU7 -Path .\NonExistingFolder -EnableException } | Should throw 'Cannot find path' { Update-DbaInstance -Version 2008SP3CU7 -EnableException } | Should throw 'Path to SQL Server updates folder is not set' } + It "fails when update execution has failed" { + #Mock Get-Item and Get-ChildItem with a dummy file + Mock -CommandName Get-ChildItem -ModuleName dbatools -MockWith { + [pscustomobject]@{ + FullName = 'c:\mocked\filename.exe' + } + } + Mock -CommandName Get-Item -ModuleName dbatools -MockWith { 'c:\mocked' } + #override default mock + Mock -CommandName Invoke-Program -MockWith { [pscustomobject]@{ Successful = $false; ExitCode = 12345 } } -ModuleName dbatools + { Update-DbaInstance -Version 2008SP3 -EnableException -Path 'mocked' -Confirm:$false } | Should throw 'failed with exit code 12345' + $result = Update-DbaInstance -Version 2008SP3 -Path 'mocked' -Confirm:$false -WarningVariable warVar 3>$null + $result | Should -Not -BeNullOrEmpty + $result.MajorVersion | Should -Be 2008 + $result.TargetLevel | Should -Be SP3 + $result.KB | Should -Be 2546951 + $result.Successful | Should -Be $false + $result.Restarted | Should -Be $false + $result.Installer | Should -Be 'c:\mocked\filename.exe' + $result.Notes | Should -BeLike '*failed with exit code 12345' + $result.ExtractPath | Should -BeLike '*\dbatools_KB*Extract' + $warVar | Should -BeLike '*failed with exit code 12345' + #revert default mock + Mock -CommandName Invoke-Program -MockWith { [pscustomobject]@{ Successful = $true } } -ModuleName dbatools + } } } @@ -567,25 +617,23 @@ Describe "$CommandName Integration Tests" -Tag 'IntegrationTests' { Mock -CommandName Test-ElevationRequirement -MockWith { $null } -ModuleName dbatools #no restarts Mock -CommandName Restart-Computer -MockWith { $null } -ModuleName dbatools - #Mock Get-Item and Get-ChildItem with a dummy file - Mock -CommandName Get-ChildItem -ModuleName dbatools -MockWith { + # mock whole Find-SqlServerUpdate because it's executed remotely + Mock -CommandName Find-SqlServerUpdate -ModuleName dbatools -MockWith { [pscustomobject]@{ FullName = 'c:\mocked\filename.exe' } } - Mock -CommandName Get-Item -ModuleName dbatools -MockWith { 'c:\mocked' } } - Context "WhatIf upgrade all local versions to latest SPCU" { + Context "WhatIf upgrade target instance to latest SPCU" { It "Should whatif-upgrade to latest SPCU" { - $results = Update-DbaInstance -ComputerName $script:instance1 -Type ServicePack -Path $exeDir -Restart -EnableException -WhatIf 3>$null - foreach ($result in $results) { - $result.MajorVersion | Should -BeLike 20* - $result.TargetLevel | Should -BeLike 'SP*' - $result.KB | Should -Not -BeNullOrEmpty - $result.Successful | Should -Be $true - $result.Restarted | Should -Be $false - $result.Installer | Should -Be 'c:\mocked\filename.exe' - $result.Message | Should -Be 'The installation was not performed - running in WhatIf mode' + $server = Connect-DbaInstance -SqlInstance $script:instance1 + $instance = $server.ServiceName + $null = Update-DbaInstance -ComputerName $script:instance1 -Path $exeDir -Restart -EnableException -WhatIf -InstanceName $instance 3>$null + $testBuild = Test-DbaBuild -SqlInstance $server -MaxBehind 0CU + Assert-MockCalled -CommandName Test-PendingReboot -Scope It -ModuleName dbatools + Assert-MockCalled -CommandName Test-ElevationRequirement -Scope It -ModuleName dbatools + if ($testBuild.Compliant -eq $false) { + Assert-MockCalled -CommandName Find-SqlServerUpdate -Scope It -ModuleName dbatools } } } diff --git a/tests/Update-DbaServiceAccount.Tests.ps1 b/tests/Update-DbaServiceAccount.Tests.ps1 index 0c9c7b11be..9f967bc3c5 100644 --- a/tests/Update-DbaServiceAccount.Tests.ps1 +++ b/tests/Update-DbaServiceAccount.Tests.ps1 @@ -5,15 +5,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 9 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Update-DbaServiceAccount).Parameters.Keys - $knownParameters = 'ComputerName', 'Credential', 'InputObject', 'ServiceName', 'Username', 'ServiceCredential', 'PreviousPassword', 'SecurePassword', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'ComputerName','Credential','InputObject','ServiceName','Username','ServiceCredential','PreviousPassword','SecurePassword','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Update-dbatools.Tests.ps1 b/tests/Update-dbatools.Tests.ps1 index 83e0f22e71..d25eaf1ff5 100644 --- a/tests/Update-dbatools.Tests.ps1 +++ b/tests/Update-dbatools.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 2 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Update-dbatools).Parameters.Keys - $knownParameters = 'Development', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'Development', 'EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Watch-DbaDbLogin.Tests.ps1 b/tests/Watch-DbaDbLogin.Tests.ps1 index 7e84872b52..6682f5a728 100644 --- a/tests/Watch-DbaDbLogin.Tests.ps1 +++ b/tests/Watch-DbaDbLogin.Tests.ps1 @@ -10,22 +10,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan #> Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - <# - The $paramCount is adjusted based on the parameters your command will have. - - The $defaultParamCount is adjusted based on what type of command you are writing the test for: - - Commands that *do not* include SupportShouldProcess, set defaultParamCount = 11 - - Commands that *do* include SupportShouldProcess, set defaultParamCount = 13 - #> - $paramCount = 7 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Watch-DbaDbLogin).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'EnableException', 'Database', 'Table', 'SqlCms', 'ServersFromFile' - it "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - it "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','Database','Table','SqlCredential','SqlCms','ServersFromFile','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Watch-DbaUpdate.Tests.ps1 b/tests/Watch-DbaUpdate.Tests.ps1 index d932657613..9fb0f83897 100644 --- a/tests/Watch-DbaUpdate.Tests.ps1 +++ b/tests/Watch-DbaUpdate.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 0 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Watch-DbaUpdate).Parameters.Keys - $knownParameters = '' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = '' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Watch-DbaXESession.Tests.ps1 b/tests/Watch-DbaXESession.Tests.ps1 index 05ede355cf..5fe45411aa 100644 --- a/tests/Watch-DbaXESession.Tests.ps1 +++ b/tests/Watch-DbaXESession.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 6 - $defaultParamCount = 11 - [object[]]$params = (Get-ChildItem function:\Watch-DbaXESession).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Session', 'InputObject', 'Raw', 'EnableException' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance','SqlCredential','Session','InputObject','Raw','EnableException' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/Write-DbaDataTable.Tests.ps1 b/tests/Write-DbaDataTable.Tests.ps1 index c8ac05f9f3..0cc0756f42 100644 --- a/tests/Write-DbaDataTable.Tests.ps1 +++ b/tests/Write-DbaDataTable.Tests.ps1 @@ -4,15 +4,11 @@ Write-Host -Object "Running $PSCommandPath" -ForegroundColor Cyan Describe "$CommandName Unit Tests" -Tag 'UnitTests' { Context "Validate parameters" { - $paramCount = 19 - $defaultParamCount = 13 - [object[]]$params = (Get-ChildItem function:\Write-DbaDataTable).Parameters.Keys - $knownParameters = 'SqlInstance', 'SqlCredential', 'Database', 'InputObject', 'Table', 'Schema', 'BatchSize', 'NotifyAfter', 'AutoCreateTable', 'NoTableLock', 'CheckConstraints', 'FireTriggers', 'KeepIdentity', 'KeepNulls', 'Truncate', 'bulkCopyTimeOut', 'RegularUser', 'EnableException', 'UseDynamicStringLength' - It "Should contain our specific parameters" { - ( (Compare-Object -ReferenceObject $knownParameters -DifferenceObject $params -IncludeEqual | Where-Object SideIndicator -eq "==").Count ) | Should Be $paramCount - } - It "Should only contain $paramCount parameters" { - $params.Count - $defaultParamCount | Should Be $paramCount + [object[]]$params = (Get-Command $CommandName).Parameters.Keys | Where-Object {$_ -notin ('whatif', 'confirm')} + [object[]]$knownParameters = 'SqlInstance', 'SqlCredential', 'Database', 'InputObject', 'Table', 'Schema', 'BatchSize', 'NotifyAfter', 'AutoCreateTable', 'NoTableLock', 'CheckConstraints', 'FireTriggers', 'KeepIdentity', 'KeepNulls', 'Truncate', 'bulkCopyTimeOut', 'EnableException', 'UseDynamicStringLength' + $knownParameters += [System.Management.Automation.PSCmdlet]::CommonParameters + It "Should only contain our specific parameters" { + (@(Compare-Object -ReferenceObject ($knownParameters | Where-Object {$_}) -DifferenceObject $params).Count ) | Should Be 0 } } } diff --git a/tests/appveyor.SQL2017.ps1 b/tests/appveyor.SQL2017.ps1 index 3816cec106..b9e9720843 100644 --- a/tests/appveyor.SQL2017.ps1 +++ b/tests/appveyor.SQL2017.ps1 @@ -28,7 +28,6 @@ Write-Host -Object "$indent Starting $instance" -ForegroundColor DarkGreen #Restart-Service "SQLAgent`$$instance" -WarningAction SilentlyContinue -Force $null = Enable-DbaAgHadr -SqlInstance $sqlinstance -Confirm:$false -Force -Restart-Service "SQLAgent`$$instance" -WarningAction SilentlyContinue -Force do { Start-Sleep 1 diff --git a/tests/appveyor.pester.ps1 b/tests/appveyor.pester.ps1 index bf1551bba5..6ccc66f64c 100644 --- a/tests/appveyor.pester.ps1 +++ b/tests/appveyor.pester.ps1 @@ -333,6 +333,17 @@ if (-not $Finalize) { $PesterRun | Export-Clixml -Path "$ModuleBase\PesterResults$PSVersion$Counter.xml" Update-AppveyorTest -Name $f.Name -Framework NUnit -FileName $f.FullName -Outcome Passed -Duration $PesterRun.Time.TotalMilliseconds } + # Gather support package as an artifact + # New-DbatoolsSupportPackage -Path $ModuleBase - turns out to be too heavy + try { + $msgFile = "$ModuleBase\dbatools_messages.xml" + Write-Host -ForegroundColor DarkGreen "Dumping message log into $msgFile" + Get-DbatoolsLog | Select-Object FunctionName, Level, TimeStamp, Message | Export-Clixml -Path $msgFile -ErrorAction Stop + Compress-Archive -Path $msgFile -DestinationPath "$msgFile.zip" -ErrorAction Stop + Remove-Item $msgFile + } catch { + Write-Host -ForegroundColor Red "Message collection failed: $($_.Exception.Message)" + } } else { # Unsure why we're uploading so I removed it for now <# @@ -351,6 +362,8 @@ if (-not $Finalize) { #> #What failed? How many tests did we run ? $results = @(Get-ChildItem -Path "$ModuleBase\PesterResults*.xml" | Import-Clixml) + #Publish the support package regardless of the outcome + Get-ChildItem $ModuleBase\dbatools_messages.xml.zip | ForEach-Object { Push-AppveyorArtifact $_.FullName -FileName $_.Name } #$totalcount = $results | Select-Object -ExpandProperty TotalCount | Measure-Object -Sum | Select-Object -ExpandProperty Sum $failedcount = $results | Select-Object -ExpandProperty FailedCount | Measure-Object -Sum | Select-Object -ExpandProperty Sum if ($failedcount -gt 0) { diff --git a/tests/dbatools.Tests.ps1 b/tests/dbatools.Tests.ps1 index 5080bbb84d..7445f15175 100644 --- a/tests/dbatools.Tests.ps1 +++ b/tests/dbatools.Tests.ps1 @@ -137,7 +137,21 @@ Describe "$ModuleName ScriptAnalyzerErrors" -Tag 'Compliance' { } } - +Describe "$ModuleName Tests missing" -Tag 'Tests' { + $functions = Get-ChildItem .\functions\ -Recurse -Include *.ps1 + Context "Every function should have tests" { + foreach ($f in $functions) { + It "$($f.basename) has a tests.ps1 file" { + Test-Path "tests\$($f.basename).tests.ps1" | Should Be $true + } + If (Test-Path "tests\$($f.basename).tests.ps1") { + It "$($f.basename) has validate parameters unit test" { + "tests\$($f.basename).tests.ps1" | should FileContentMatch 'Context "Validate parameters"' + } + } + } + } +} # test the module manifest - exports the right functions, processes the right formats, and is generally correct <# diff --git a/tests/pester.groups.ps1 b/tests/pester.groups.ps1 index 3d3346f0f6..0c26e2fc3a 100644 --- a/tests/pester.groups.ps1 +++ b/tests/pester.groups.ps1 @@ -49,7 +49,10 @@ $TestsRunGroups = @{ 'Test-DbaTempDbConfig', 'Test-DbaDbVirtualLogFile', 'Test-DbaAgentJobOwner', - 'Resume-DbaAgDbDataMovement' + 'Resume-DbaAgDbDataMovement', + 'Get-DbaDbMasterKey', + 'Test-DbaAgentJobOwner', + 'Stop-DbaXESession' ) # do not run everywhere "disabled" = @() diff --git a/xml/dbatools.Types.ps1xml b/xml/dbatools.Types.ps1xml index 466eb2ae6b..af60ef0b3c 100644 --- a/xml/dbatools.Types.ps1xml +++ b/xml/dbatools.Types.ps1xml @@ -1,66 +1,88 @@ - - - Microsoft.SqlServer.Management.Smo.Database - - - Query - - - - Invoke - + + +Invoke + - - - - - - - Microsoft.SqlServer.Management.Smo.Server - - - Query - + + + - $Database = "master", + + +Microsoft.SqlServer.Management.Smo.Server + + +Query + - - - Invoke - + + +Invoke + - - - - +if (-not $Database) { + if ($this.ConnectionContext.DatabaseEngineType -eq "SqlAzureDatabase") { + $Database = $this.ConnectionContext.CurrentDatabase + if (-not $Database) { + $Database = $this.ConnectionContext.SqlConnectionObject.Database + } + } + if (-not $Database) { + $Database = "master" + } +} + +$this.Databases[$Database].ExecuteNonQuery($Command) + + + + + \ No newline at end of file

    gw{t(j>jdrnGs3k#E1g`+J#PV2b= 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

    orv}?+~(Q$yi0fCG1(w1iVJriD*$=ItqXV2 zKm^SF3%4%7RRZqo%`QjM{R?*hI63cMc*@_-g8LU9YqcyKE<9E$pq3BAUATK8C}eEk zzp$@wixFy~BDg?sQvsZhkz9BP&Fr~6)I439k%t$a-qn>kdFU0hfG;ZM=HZ3CH)thZ z**msQ{vc$Bim|0yc&^qVvU8|Kktm0EIfd_y_LJMQ^$PjYoizAvym6aoN73~wmRlj!~T-!3bz{GHIXsD8qRO7 zjycw_zf^f~%(I3sTe(*)N_;O?`z17ygQaqRs`BD^R22NF${+s5Wj-CdLWUImYbex^ z73-0z^>NOEtk}?>Yc^=CAGVJFoo$20Is!Bu5nQz@ea~U7v96ePc?25k3y}Y*J+C#E z7?A(DH-pCN1XSPPl`cjSqb5$@`c9o^t+@l`zyKS|ta&>l*jQ-6c1N(W)PniDcwTQT zwqX8Jt6^ig1-m?=ITl>7`Y^G?8%zEflIj2c*MHalpWowEEWaC#j-%mgy#FH~Q}^db zGauasD_j5EhQgsDhwzC{eL*XawN!mvIR5{Z3Ine4w$l9UjOSB|W`6MF@0q63#cYcv zn_4lErg--=s0wnpI9Lke&vCw-A8zruH-`|BRz^N0^ixmhwusBZ7j&GS>z21`?4R)v zvl#K+Nt*75zdomdr=yflG<*|B*e+iVXY|~nh2)gSr-Joe4EDToDYX-fp_pTyd_MUw z`TOh~l%lF{@6~}0$<)1}94U40kQ)8R=Lyd}o-DRzTRe!mB|Tlf_z%C^ z(zo>Ji5(vQNb+i@@1ZR|^0_tN;&ZRhmnwE#Ve)c!Xp(_EVC*5h5B`>aPhTelnkOIb zXG2^f<@sVyBXRB8Xz$xOpH%b9$AmU1g%_Zy-&7~Kz~ox>H`gxOd2^R9!tv1$s;4~H ziA}y~syY5B>2;d#y3-f8b+VVot(k)bX3V3V?$ms%lcrshkJoAqVpH&dQA2J5l3eWi zYaTEVI9cS&aM8^m^5~n}*N=G)N&4c=oNxJ9qVGHqdt{UA$7ebrp#vh$AB%zI&*o=a zcTZJFZvF83u`Z84%+P;6O?;iYoUbn82p1>XlTXWb$1>aDug^|iEZ%X{IXK?pI7}&w zSOgytzkAA|f9uQn39pCqeNs$5<6Z?_D=_@ovj2y?cMGojy3+hmZKo=E$s{kCBvYxN z$C>eT+|-z$QXK$?HriS5T@3j~mlR z&dOUj&VDD?i7~!1RLCIgNc*rDD#G44qZbk3EtEby-dgPnLfw&op(3RqP>;7h&n7RK z`-gO0{|uL9&(ANj1co`2D?(}ykFvB`5;Rs0#qqO>_N~1kT~$dU3MD&aDwbR7)j?}` zu`|pKfq$Y4%dlSbR7F33yt~j{AN~i&+HxqLVJh%53Mb?2_2z0=>=}{9ICri3irjKF zjw|Md)tDfK8c0_+U}DaAxO&N9c*ffaSTujjZ76H;qoe0pkE$H18(-^+xsa|AcrDci z(s*Z8ObDY!ca87CjW#MUZ^Y{k!cX9n&I$4lcjn_>$RoT16}e6g8VNQld|?9Iz+PY{ z@qbL5>1>EKV(W;7O)SHUmd{s_i1EWcJmjrm)wKUfGf=S%6Hp%)|B(*mOu+rkEHHY6 z$_b93u4=rPJZe73!z$2?WSBj>^n9qbyp+{~!(OXvof)baw?iE{pDV!OP-jKu)F{qN zb#jRPd;7BSTnclCbrUWmt!(bvp6;D*ffx{M0e`go{!;9#}T~ zMDRE_Mesi5DG*{3A8sQA4N^?v!wL#9B5-d?YOv!cTE)F7f?>uw%VO8c$~gtf zQ;0eYhWg{g@zB&!ThrzqhtGfB{tkLbs=BZsw)tFwOQW+HFB;O-QqAMWvN$$A@? zV);8Wvm|rfZ<71QI&cj<WgMTV2ScA}BMyg)(TUkjEfAvCT5j@S z*my;yGqF#;@mJT3)>AkKAWEo?O)&xX8Sa|I1*5|8m5^~}_?Uy3@ROU4FcRn((n z`=XCytqUyBpn z7GSjttzqh(Vf$OZMTZ<<8B!W1TNboPW5LTtVf^~Fp*Bgs4nRQ?3wJpBx@?Zq8e-TP z9d5Vsa1g|QTO~SNowG7LN^sV&c5jId!=&VN?S-@4YPi19wiZynze$2~3NHw0 zt%^zH8AqRbRycLsU*n!4z{R~+$Xsio&D^K|=o3?{6K-!=kQb=geS^!iK*UOM znP!s)RRYc}**L}8^v!PN9wd!&X-E*ThEBJUai_K8MUk^j9yjsfjHL5AD$2mR3u&r` z(7k|~&`DMefmugXsZxf3+Z4{HnJ>|L99+~co~H6R7chJ8ZNHy)kd}(xI($NllW|fH z@hX~hj@m)4isc{gG3eoO=CGN11gtFM{D9BDmN%kS_&&~z5RT@1P0NXRyn|}476ZGJ z2DL)Lk9T^S47`YHH}ieGyLP&}j3S^NKPekzY`~^ghCvTXTdO#urWJXsbxVo!ZHo%s zMEFyj{gDe0;k7)kZT>vCsxHCy7ySG}?^-Pu?m9%N-;FcnFNM6H#Eh!v$wGk&6^ zm-X62b2YB>q#ZdgYxa-uQ486%RXEeeM=R;7I}1eoGdj~`?AMhA92UvyM4pNOX1pUo z1thBUE$mU5G8@w6bb?S9;|d`1H$FOnbtqy%w(2%Z&Rnc)zyvoo)`umsjuRWD8A8m8 z$>irrHe_8VdU7(enpN}xt1ii%?yxr6ZfdIYCq3QAsv@5l`u%=uMC~u2;JOS1G8|DZ zZA2xr$yPR?E<-5DO+{w428n<@h!ROHB#6OwTEnv~{O@K?h-_h#+t&!_ z)WSk)3wzuWon?q@c3%j)7xCpJBtB4*;>)=db9J%hJC=^PLMAyzaYV0uXjeBH9J*TuZm=Djfoy z<8WWI;+s1d=2|NkLjKw$)uN}C`b|TTg&cM1uIb^)x6Jf8@YK$ zb05PT?B1}%3oxe`1MV;f$#Z(%gmt648C;bG8PmFi`dn{~&2m*nsEa7(+~h@#&L+#dd3SHf|mP#tGS0Q&*Dxo#Z~Ce zA9Ed+C=4}0_+|s#i(QvSh(sSGh`KfZ*)~3`d#?YrC!!pDe#t8r`0CZIk^ZY&cz4?E zjpnVwvouHz^+Qn51uKJym*G1qUVb@V@`w}+sQ8-TLDs{GgfkAfPii8(V)NIm>zT`nfLhsb&yf1Xr_eMin%?>2w%DjDa5hR=7Eqi!5k z!O{gAK(piY1+-7vii33gEQ>~qG02tshC~#JaSn9BOi7n-XRVD)QaXGNhYS=42W7EK z*&4@lM(tAhCssVi@gE+-rq@qd%%s-5>R8KK+=nq^B-h#c!4(==w z2xUvP{Gb!bd>N=47bDnks42x^ZXLwdtQLuD7KOzDBEeb7PBh`uhgO~I1w z`VK#^%_HDY(*3i)5PiqC$8w8oY@M5_{7s=)71tW8$-h$5=OoIx@R^gcz>_qrQ=@yX4TKwxW zvlRPBKFYVIvhtDBR_{=~HQ<@7N|bI*)r_tk1p5`UCk3BG@Hm4zUCKvuhDUf54p5=h z?G(p})hm;M8mIiM?O8vOrZ%&7W?SdIv{9DTKMJg1M>iJYbP#C4gKLyx#ED(A=)@W< zae|^yDwLW69csPTDIPq80>7g8=2(}41Ql3#J|Q-UU{rU34NkpkUXAXn;p^cKH(u)1 znrsdlXs(h(6^kY(|CFFVSz*Z)y?v?$FJ@Ubr+BP7XbR+-lAVu!BDc)G@!oo;yYB?N z){GwgR-@-vJuJ!q*NDf00nR57Ex(Vfye5@}rY**?b*`q2=oYydz&TEX;fnrt*n=%|UAU;?00h`D<(x zoaT#Pk$mc8jHVHK{-kYOV*XUu>1XT+pXq3fE|G68@F1V*YHXIz^fd+~xVBVaoX(JB z{uK1-ZG4Q+ddq-z(R5v4g3t6e4rE9t=h6jY$)BI$Grf%i0|Lppbc`(WCmkb(^m&X= zB#?83tn@aa&-8X^iqG_Rh>j6DDticUkT?Eh@TiRb9OpB=9a6jL?Xaq)x5Ju+^mdp6 zh!RyhLKjF8e*z=|M4z(?BC09-BRuSMG795DxE83c%g{ zNyo5ueV(9Q7`i_hJgi)w(+BxXZ_{cay-lk?dYgtK;oU9^s$tvyq+K|*KLHXZ?N7!A zd-f;r!kqm{$M9u;GGZ9AKOq>rApQhi7_mNQ=mO7&KLH2+>rdK+<@%G};Isau3z)1w zX%`0TPi7PL>QCB*wd!-0#^9>@JO!#@q|Vi6dYje4OK-EZ3-fdV@BrKNCyl`|^*Kjl zFiU>|4vf;DDx2QsR5rbxU_h`&7l5MRiv9#%d;$KXV=+U21CRKizV&8^y!84$MTcU5 z{-#IqK7TX)^2qxe9Er#I8&JgG{O$JB?I}hke&+l+Sef318G4-_umJR8O1%{Go1bJM zKFV*&^j{F!UoX!)_czyL!B;_Cp?h8@e_x9S>^^$mli>H36CbugW{1Xu8N+|(G3>F_ ze$$KSANegs2V=jQZW`z3; z-tq=dJ0$2rUd}Q*YYT?pwB|*cH~&LPr@SZgk5W)E`m#&8TMkGN;(UaHLHKQ{4N4eGofoRWId^W^- zpe1Zbhlu7qiZ8n~QY)FG?33Xws!9p(!jjc?_yxS7ZPtD4(N*?^7i0z_6Q!Mw$`!ML ziRCjMIT-A`^D2Xk^u9NKd?Y@GEIP4vAx`VSk2kNPVT_`A%MD!c6P&Z5Bi(dcPA38; z76=VqlYhIhy;k+4pK(yx5#qY7#c{p;RXHN{W^=|z5Q z^#Bb;BR=HO^$7-fuI8t$^`*z!Mq-m%en>>S^vKgneYPu%BjH7Khk9IE7y~i>gvx+& zJPn9^ZLV?-v(4?P5J_v8lL!I0f;Bh*z~x5_a1tI7RzUJ zw>ye~^lxlTUi(8aY(|ZipvgV50=%r~UJ+vLARQ4_u_CGM_X(W1cEJt0g0fwlW!0WH_pVoEX(JZFzLjVKlLWOMRFNQS2E(sS*A; zLZ%J=WYZ!FjP?KtU1Qf3u;zXUrY{z%FC~n(y z6yC~suwp#l=v%JcjL>SAJLs9ygQI4%se678;iHJ996S9Ectjm@2HZ4ZAt+@c9ImTc z+IPB(Ek;`jge9EClQqm#QroyjS!*ECvSX;|Y+6Sr*$*8ULxpv4u&_JKb6OM&d&SuV z&tJwI#!DvQxxOH#MbyvH7-|9z@2sXq%-g`WxB?kjBt~ag&q+dxILQh0nA;ff%g)KV zZuPi+gQYGZMzQQ~>lmTpag-CVS&5)IvX0C+?k%l16bK_^czC!}k;@3RWPaM@j0bpq zecvkGf;b%Gh&M5%MIMCM(<=6$Py~sy_tozU>89m~*OHZwULv3nZ(6de#6rYK&Z=gr zU>oPMSDzUGam(1#Mp9g&y2NfpE|Ln4kkRhs2aW(+QiANXJlAHR8Y|LGAjz|L0b%AD zuRWDcpVJCXq??GQvm%#ZrV1G+$`A*H1-VcpGdT>-kX8g^XXQMBCTb>-p8-@4A460? zbrpDbrr|vZH}!>Y)GW#^2Y5u{MrYpwTg(C;`6eEdOy&e8=j;gQF7JfzTko<}q@sxs zB@ajq8B)$8R~&FdGbQH;pTb=tF^fH`Le%0~FPv3khDbT*Fyiy z1&{-7xFa-Fgotxp`Iq-G*86cWKvon5Lz(usmN zxCg&e(fELQP?+FXrNc|PV89w0QcZx-4iP2z&jT28O?^^fWpSTgFlL|#H0OPmE%&oE z0L*CB#!;+rk7oEtG!36zv6ynaN-gC&eoqM^O*6_~mFYmURGwF~ptXH$yK*ztGMpZv zrj}d^{-Sbm8lC6zJO-_ds7Hbwr;%KLyvnusaC?Dy&UD=KLnx#LhvLFS=8Rbgfskdy zkr5i7Z!Ihl-a>>c#;2)yzO#=jsx5*%Tv&`SGT#xaHZ8zhG%xcKZ|C-jMBo5n@(W#_ zdNq|6Um>GdMi47Thnrt?fgeiSlk5S62!>nB!$n<47nEob92yIQF4ZL<{*Uowp0H|!vF zhY7xpIt9NGOeiH)3RT(}=enXLdWX%3>^pd*Wr@IJ%rto^o241<5p_po5H(i)7n>1< z@p5vpiV%^wD=e#cR@|e`aGa1qTFr7>szrxvqeeMq@DGGiKuA z*oKvY0YChjQ?CSjpCLEMUm2(xLuRF|%f!6o!{}FdnKFx3kIBFZviZ-R!oKrxI zyY0@4BkV)4X+5yI;5Qlti-w40l9>l5g%VFr@fzu-!6m##)C6x{-lt(uFAG@#vha4{ zt#oIuDQkv~?yRB1;R&|P@*(NVbDaPGmDe6;;KkEJLwQ5seN;3RddJMy=ogacBV41_R3h-@6Uz=Zl$i9dF zDW@AnN7~+ob8@TRDjtVy_rg~ch#+G;mk`XHI09t`wlbDb9ZR{{2h%@~GoR|QSdg}O z5d?>kve8~xvE@TfU^ioe!$|#%1nS|O`20Qu6L*k`cM3Cqu78R8Li3+-ZA!JVXD`F%_x#-*0axswRh(=o#vs~a`U1=rD1Aa)-z38A2d z?;;w;C=_|U7j8YfAZ&i<-~K&IO<`w1?bA376?m5t3ww_mB?cswj{@0^%&OWw1J!0d ziXl@V^eKvl8{3#P9BV|^Dn7tjB^Y zOmS%(`*RG!w~>YuGft|66N|KpHXDBf((eOx$#$0efG&kk8eK{j&b^EQ!jS3>@mNSS z!w-2hYA_Hc%myYS!jGM{#=d>LCy1|xJ{rbIMp!`K&>$z|0iJDDkWol(=98Ro+`+{H zb$qZmgGA(~i#`Zxh~-8TpdH9U9;dMpdGYg7+1QA@_#tD6p6g2ucX=60FICknc`{g; zBqP>zH4X}lRy6Bg3zf?nM6g-pad6pQX8J|W7VZ}Kn&9{p*V~_iMr-<|GVViN_VnK) zomk}N1*hd-)k^W~tI%oG^^K|)!fnh@h+D;?>=(IdwUQS(j2(ump$rrtfw>D`Crmofqkws|&Q zt`Lu&>r%Si`;e1Rk7t8>RrMBDvLY3dWXoM1#lK$%w6&Mo8cL?0oGgX@$Cr zyved?9fOs|SYuB^DBsCAK_DNDMk> zZCCJOC(2it2ghn*gQ7^2{HUlAVo^|71~`gu1MMc<}rF65Af_s2e%%{;FAvXzjk50pZSQ=FE zfHsE4b5@o#IYIuIcn>Nk8QDi6ZVxltT_kvjpvi=&n~#pSTsdJbIyZ71jd_b6eb1$ZTT336_aP_?>(Z=`Ze=emxYQy zh30fuXyfovr#UaE3gQ2U3G;#(kb$2^kdoo|>`X{ygeh;C@cd8;{vNRhWlE(|)tK+f z5kIVAVf}|YU6Y}PP$n2zI)|o=f?7xHlTl~cw5O1a9GmBGiHH>AOSopEiSzJHeBF`O zLU)xPF}j4HBNE|CM!X*J=-HZ3#UpsE^i$5n9!1!aNI*L;+(A)nMo51++SR!^Oe-~b zl*rCiU9XeNLyxsoE|Gr6h#8i2V#7ftCtL6ea8GoGdYk0T5xo(hA?;u18-kgNq2sU` zi%kVWeUqAN>EY}yxI&MhKhqzZ3(A=ChK{WAI=n)pBjl=d76zwAg0(ukLYf1v@SA|g zCe(&FQ-#gxc$iXQbe!=z%aKFULDdvHtok*uO=0`^z6Ev+G_)!0knw9``?y|RFXpjJ zAS`f^rI!MG1i~dJpujSr9!_+1UlPF{YUBjuP9wy7h`pcC%+#@w6KLi_Btajlb;4I0 zSA5)bYu+V;B;PM-Scv}+{pySi!IA8^s<}8Nl*bOD4(V!4#Dr+QDVL-1UOvQz2y{-m zB#N2%5T*a9?v+rCh*r-Z^@`6m$2n)%+%Okt!sTXgF2nm^u!M}Li5X%8?K>lEM1!8G z!)!#3B$-o0b%=9@=YbNVtwWp|`%F*QJS&JqB%p^@!VYwTQ|)t@$1F>io~l8eLsIt$ z39ZuEw!C~$g|afU>~A^14=JHB&4L0iHJ#sd3yje%gzDzN+Zq;+8VKW?!`I*fp}INF zhnTMP=(1Xz!vxK!kQIWFm_+n08YpRTvJrD7E>13o&+6t=K|pk%MG_{EiN?}Zr!dtz zC!ElK)qe>K4lbZwDjoX!CossQgTX)cc@rJK6b2uJ8)=zP9&sV)MtR^9Cl7}TENZ6ER#M^;zOq> zRRSeIB0{GpHHRnxK@2iOs{}2;-ZK{|Jwb1AI$er_S#xu5>I8dy(F=82QaC^x2+wKG zN>1RxH)6{}hf1)~LLYORk!sQaoD6BA0F?OG8A%aqN4w;+ga# z#imNkAiXX2b&OF{i~#pYku-wmXcvvr+A`8c@F2#|`WP14@;~z_nM$|ajW3yO&WulSWm|SA1I*h0S zNNP=MbJ9?PT!Ya`L%~kkGET<~lV*|1MnT93b5kvB?dB0@Npfoix?yWZk;3~ z5X2{hnoCx7F*UQGOI9`g$34)LC_Ci1WWQ)xX9>-bt(NE%p;KMy4b3&HCv+czl40H_ z&guNEjtvTw6KkiXfi&j^Ppsp65;f}FpzuD8Hi~=0Igu{YaLxtkIL%|ui0uu{!$=t- z$ZWAqofZ`Mh-@}O{4j-%3aV3tw8&1!0+a0O?rfb3bTUd;b0}~|aXF`5JX${o2+aO; z4p1N>q9IJr4t^Dlf2No6(IF7g`L)E0&XXEm#EbglFoAE4#U2q|&HA{R`a{0>_b6J; z!_E@Vpuh#{T1E3x9otj!IXS>pyOGW7MleD}ty?yqm0?vatUp0%0-Z%gpupv>07yJduHJB=(bzbpfvYMN9L?jLFYl;{a*UkX{yB) zQv~jWZn;&3tQQ`z@Fv_y87YS_dwsTV1Yx4dKGczV=n*1IoFkhy<3XBe6(2(B;0UVQ zMV?qJ@xqC28B$k`NMY$V^@2=EGt60+2{P-63q1p^t`Jj*ku(zew4ACrF41z>=BN6J zrNDJI#MQ9q-EP^STmhzJNtYvvxOKX$&=t;h%8iS75t5F;b2UG8=I02PpnFY~QFDX` zj9fcb{SnR=rFd}4BN0Iu;zd(<)P9H&q>D+Cqt{sn$QN~XtmW4l^eD7`muQ24a8A^b z9~q|frYE6Qylx=Si_j7#lbT#T2<_jp!t@@rI-c|)FuevXWXfX2kazJc7v*@l94PaJ zwi)(;GG9n3`au;CEpE^Ujhh#td80w6>GdMC+Lu%e;WuwWOE9`XHo=@^JJYAZ^fI&v z#hL6^x?E#9Q_a^y>2+w~M1|UlDQKRDR)$AXo_wW+H7z^65?z&gzD!>aMJI#JGjT$_ z6m7xWW`HmUJrwN`Xh#v#Svk?jrVw8St;`wh?2vH(v1n!BV(mW`jZe=oWU`Uo1TZ-x zlYP9!s-Sp@o8#OVY={sy!UpEIu5Ndih#bx7@y?20F)o2~ylZ}>m!dU<_jug<)lA>JYY-8RkFgTq4i~WwHnC^=TtH(rNbtWJL(3p&At#NO6ttC z=kX{yBV2MOGg!8a4P#vgsHdU@mNG&M<%uVwYD6KM;W7sm4}-)^_6pNe(dvGd%Ek#M zjL3v`8EmVf)$3q+)ny6}(|`K->s~*@g@2$!HPt+*!woAaR7|IU<7vFeZ$e zJIR~fsU5+63QvK5&XPVwB!~(JJWl85L@+`|baaaQ_ah_@AZ64!$K!O91XarK#nm&~ zTO9guf6HO$-vx}u!%a*9Qa@Y1oc5l_M3xXTXr!&PMY$Y9fs(@2IFX?pojSz(=8kn3 z97_ium=V{AcQT?Ml}nj)bl)+^djY3QDl6el*yz2wKu}(O?xDTVb~)4Fv|i-;wyuFF7UHLK-GXaf#J zQ!M9!463u7U0zpIkqW}F(aPA-4-`Psd6-I zF0X{tniJqrDbWRmFuP!7@-+v*nR`S9=}0yluq-AtK?@$)cZwM&C(Hw}f({WUT=^R2 zC_!&^2pspQe^-@&b}E7ieNe-+Xn@(3Q`^Z7f+42`haR8^Qb8D)?VPy}Cg|ZEB+iFK zBD@Z+@fo3ZWQ8*QV{WQdo8A8^?fgCd`pBQ|o(YvY06)doAptGFNA53NARxRU=p;^X@F&;MS6*0Mclspjdxyq{k@AAf98w`;9p<zUDU;X@t?|tzthLe5LcVB$|_KT0*e*L*r48-qz{pLGweLFb? z@{cbAb#e;kZ~wGkD?l@fU;X@Q$^>evyz`wvjdEl3U48w%e-`AFf^++or`~(|S=TDB z*?Z4DbNiL+$tkceee2zCznGjL`B!gz`MrPkL~;t|zkK}HKYb)QfjJ|+{qtv;s=$2v zg_quY`UlAg%(uVv+U=j;NUehT#m9dA(dik9n^@oqb5m6Ny(T0@stGAwNP=rRLocFH2e*4v;)xiAjqhERF+0Yf% zj>>?v+mAi!zEF&u1BExW62JJ~o4>gIrKcLO%h~qMD_?*2jZ3On3oF-V{GZ`j1cGwv zoK>Zd5v?YD91tJU$Nl0w`glOBMjxL*Bk%{OEBKF`PlwhJpY(#p?oawbUH2!QLCpGuf~BVWlina-e`+x4 z4TW4vxpV0atJ|OSh9d4ydV@CosY4^_4V_zhw{z(Yom-y}p0sU$(i>FgPkO_Y_NS1S z-XJb1*UqIk^lE?78ydAg=?z-)C%vIe`;*?F9(_VG&21UbN^@HVs!nW z)!upY>!JsLzVYLx`8xlu+YFlK-}pk){O!v>Z<>GiYka2pcb@z6sy+0JRQregwf8QB z3ThkB72ban!tcA5gWrBjxsjm++YKP&pS~|-?%u`^3=Qu#zN@0#Q%s9&_fCX=LJd&x zk==@WpsJz+L4bdEx8z_K_Y}NW8(E-MUmH1@J{8=JIG0q7TxEKjJTfXTS58q*>B@^p z`goGbqeHpf9}I_GH%UJD(iPq;;u&L*Imp4EQQO z8Wtt}RXp<>FNlPcdhfAU5yPS)r*1s`&dZOBkd#8k|LTn&iBy$(=Z)*Xej6f-<@l>x zUvVq3&LkF}{h_#+N>WKQ2rE|;LTublq0^NS<%k%;;fkwi`$*^uf z{ofz?lHn^a1qBc;lrNaR{%2_|K)v(a+Xe%6XE=U-^;d6vg~9=gb_^D5&x=ez!S^z@ zFTHc~RZV-DcTtAGc=s1yqqHmj`pRGQ@%5b_-+ti-{e}1aHydP0#C#QvDsa8` z%v-J>u-<#-jd#9I-+_wyzk1`523e?PE*Y?X{ncCVz6{C{0D}14U)U^jHB;P2$zgrQ2-#h5SShtBYST+i*Mm-}y;x+_`ym=UW<_;k)z7TX)`oxI){cw!Z+S z2SZBz>|!%rcV7MTo$rF&plJK@BX?ednu8%yJJ&8X)3yDxM|QqIo59b{rDu1(`9?$A zeEK)0OTg?r_r}gEnxa5MBksRuOi2MyGq!W>Swm2Sz4Nn|Q#cSQ>B0eN=h7QH-}zF5 zfG8pVKgNPZPYKGuA7T*Idk(W?cOGXRB8Tt1b`!+8iplnw-DM8-Y=7^|4fX7N{m=QY zp&m`80zsORP*ZY9g>?xU~mJk6vR_1t{R)SAV0=O;IJ zZfYfldhY!6+Ri1khlYB9Ms!!ybLY);Qq&^|eheKp)bsSk5K|x$b-Qk~ixAc)%~C>D z0Y^O=fP&|>o32%homvJKolwNR{p2${&kH+QT-z@_cK1n8P!8LjN3Y+#4Ew8HnVoOG zoTmC1y89$}t_U;Ge)k!;YXz9?JodB(Ubi`YH1ip*(w{XnjDbnl%|a#BdCg{H=*sSt z?tJm$ou9IJ12o;-`RR3f%KCi#+RnAB4fEdq!OIOd*m?fi&f`ePg7)QC{aY=)@7~(E z`dGsa`1I^XqU^i?LV`RR-g$<$o5^H;t`D#Rdj6K=NdfYWV7ev~7Gv}5CV)p9B@neBOL{`=*#@lA-pU$FJRa16o7jS1)(J{$+AV7QJ77B!vSKWODb5mv-mp z{i}56xhDWI#Q5^7w3E*#pV_VCb^5Uo!hgzN{fnwJ+mOQV(CGe%Dt#4eJk40eidNRB zYJHVXDp#pprD0V%nbO}l3eI!TL;qSW*O2DZu&l|QZ`@=-?mWr@h*5gymCHNNU)uQ| zbW^hE^*6S^i?R>|BMNq&f2yIr?H}IqVu|g%^VZkkEjw3*!}2iJl8^$*D&Kkhxx3%I zyz>PXUlIA$XYaiBBZ?bsQvpktqYt_fkE0{rHz=2>oHFvq`wpcJUZk?kn3b-8JWj2kMLqL(}oyb3^|J{<9Brb<^Vd(7Sxn zt%d|b@7#Q3`zzJ~m9hQG)$JFr?L23K^_*Y3diUznE|E#yzWKGCZ+KGu^K(!0^UgPz zr95-B^ZXBYo_T|Iw|{(V=Q);T93$I5ef93sZ`{4gf{I^c=eei1fB5S5i?<{+r2Xu? zbZPtX7w{ivRd4^```cG24WlVQ-QXkSg!WjRJFmP-Gvq|8hSpf>ZW4~89RkMIZx*go z4fRJ{5MR55_}c#A8*tGy7sn_ZXy+?${`1$jZ$1kl-}xz!qD;#3DoC#XWUxj&J8-n^ z$A4(-z?)q1OK)sndodW=xk?K#DGm1S)n_wUxRkD&mi&DDn)-Sf5o0J|SZV%YD7Bdq&&t7U~to9J^UcI#Q z&94Cx;MG9B@WZ=Tf3)))*v6%y?m`#l^>{XfTO>h$6y;aD`;E(#^Z0Re7|LDpz~7;f zGG}*Qx%tmuzw^`A5Ukrz(P{bDcCO#tx%!sJh!@0Tf9}@y&8K&+UEF#0R=TbseC18l zmekFRKyPRBC_n&VJ|SGag#`+U|by`^=H?hX3SVvZ*ad zW^4PU%YVrFi}U^N)0Yqs+pj<|OafA)9B!!JJKwyy^9-1)tw?6T=*PjLReWIkODqaD zB7>e+5lEiI+KjyWbnwS!q-OB$)mOJ4f0Oz0pen*(=ew6oF(DUFME<2@AlJArTYEB>i3?LN(KU74*jq(X<)u_Yx~*@EDkD`7=HdSqopo5*uHw1 zxlL2Mbn>lBo^W<2-3S^Q64whqD|hFWA0afn^4X!Z;FqMY{mGr@AIm~ufASB2b?4e6 zs9&sPuRA0z@Q7G$-M#vZ7QtiJw918Eb})sZou?loQwv?3pkm+d{OmHq#gMX*>7`)4 z1`+K%fg-_frUYfflxi)qr>X53O#$@(wOi5~HM{DpM)&MBknf(@<c#vWoc|b#dNUM>AtUCzVqhgotMIA+3r*^n4jiR$`c!&f@bGuUvtHRhJ8;@UhzTp zJXNh>tiZ&Ur%41o<=IPO6GA{mUT3*_V%YsuMSg9TeFe*jc#D$Q1XWWK?w5X|VlUA? zd!foiL~lR-SVMwriF%Ok)X=jl>SB*xW&qnyRo$FA->v)dP1X)uq#imd_H#@qLuZfF zIR?exvQO%q%a8QItyTMzo7-1#+OS*d{$6={`<2VvH@{_A*)lZ>3)Vs*8>eauoHZ<; z-BU3Z)X<$TK6mFeM^}}Y5QiFxNeeF)}Y8D%Fb2a{JvIw4NND7K44@zHxv#jDcTH#Nz?fu zwIcF@vlQRd<+FRnp&Mxb&6b<)sWo_e)|-wS83VfuPG^n`!JZYTb4MSrj;t&XeA;7zQp-}G}A#O;bi+>nX6ai_KqGouJ#7x)qZRXWeqG7olE)+ z5=$@1x%95c(jleH$UQPkkI1>~uF%qfC6#@j)Y^|JBHZm2TROrtD7SQi$>8q_E*)aJ zM{=S0Sy6s?ufuek=28B{hq1LGn6Tt1e9GOv**6_`USo-tu_l8u>Lz9_3^CQNV`xR$ z+#W8&tsf@x;|N4Oue(8rUdh?Z!dn-Hs?Qnjr_Ry@jLOIE@9$)r_a03V8k+w zE-y2c8T9v~SiR-<+rg1{rUN_{IyG zhO$;)dgSi6gt7uhNsYGbsTUq;5Ts6l)Zmo^RFcq51*AJac{RTlOceI70ZRQokJ8@Q z(C92L(Qnz%z$-t?{|g7`{k)g0KLhV}Px^hvm7(9`JS;bQ>gPE=;p1>?{;M9 zFme9f86-1vqk30?RN{3=ZN1%om~`;uG^wCzl(2UFmRP#cm96WUxE#LY+2Kjbbe zQAz!n;IOgo=B+kQI2)h@VvMbIw;t_O9+Rm`2RARCp%VN_0FmN2pVA>QrM zvXT|GzX-S*4lGEuCl)!{>e_*C0_64dbC5T2X7k3fk}>Hfnt8*BaP1DLR%@6LPA{L! zykb8H857`6)$5E4X9&_crh|(McdlNz`|4U}NyQ6yU)8A~rNizI_lj!RJ^goRee*kn zRIhEQKqhzdJ6s^BWM=os@|gk$!$AEVX~4rQ5O_zbJxl_zU!HJX>ukQR3Bf2(55zn* zEd;`&n-_U(h~EPt$qVgOr4zt*w0-_eoB0xj)ftzgn^%@v^GXMWM|*1!v(iD~(XAWH zE{`oB7>|KK?gxOj1LLt}=2yu?obp8N8WgIG?AVc^b2}SBBteRj8jkeu0ISO7kSAGN z*B>tM%N%f?iUgkulngBstf=7=iMaV)P6<<@300(@b<$0!BEWL;opgYmBJE^uGEj1( zv-Ri}JRNhuO@d(Ee?UeeJqb^&1%#@v6307BHDok>&C&^=77TR^{{(A9QUQ;4@zxb36H6WMuGyHT2V6y1QawPQq*;~!vW%c)4}V5 zoii|Hb2fq-g*I}kojU8X^%jw*>kX&xZ=?&-}oGDf*uAhZ)UzxfD9We8`?QX|FjyZoMeO`X$_TNWE9o4NRq7IQ1p zSbOsp%#~;IV7XEFh*HN3XrN&D!o?WqYdS7Jl(RB3rMQlDcFP3s%Hhbr*cYr{GcmS# zgEeR3hxvn(G|OFd@uqSC3WAK$3SOs3Pj?L>4-5iY+Ik;^;1n4GNd~8N@X=ZH zgHZ5jIaE>z#YdE$w{Dzk>V)MU>n#_(R3Q6giz~~j+06fBYh|%16TUmiS*|J)3LvB5 zyNCzP?__JesS_^7nYRK4@u1nA+`MS4ARGkSWc$p8hDHz%8UU|_H^7yzhn%M83T~g= zypdL-7?50S3HL|{t^CQZ7cJt!K*5v(cS(my$qSVZj9k#dTV3Ldhz7wp)n4@CK`tao zK)QYneNMHPyy_7OYJI8=Gq=1$Bxp!v@Cs{|3Nk@Mn(A<T+7=y_*t2B%+-o?Lri88ke!G&nU`CGu`bo7CC7Ish%95 zj&5_23uBri5KFsDQXU$&CH7nVMD7`lYPz@idOs^{b-K6FEM|FSv`%Iu2b!fN&x|v< zxSo5}8|f2*o$10B=UZB`^1NvJ$m;hHIWPmomV^p-l$a@MZEH) zXkNCiA(m=vwZFS{joZOoBqv?Au5EA~sWYPCNZ%?}&|C^L*X}Gt(bJ_cYIv^0)y4%T zl1#&!qpJv}{RlJB(_GK1ySW)=>j$w%o10-!$wKP;kz~T?DV?knBp5cLv{T${eXf~@ z3Nt~B^BPUdIkgL_xPrD-UxbH{0nf#IU z5%>E)5snNCY8o!9XQtI(cbGk*iG%H0GIdaEOiws?kabdPmW*yPf@Ai-OA*_T<)faD z_WC&pH&ND94-38N8wsb`9BY+9rORVfX!B>ASNbdr38$tuf7b4B&xwXr63&N1oi3t4 zK(}Ow?nlO{T`-Ega7LKhDM?mtL3LJ%D z;79DK+;q!=qB0SD!WBoD7mI7uNiW{_TFm-D_Nj=#EGj|%xsuOsn?WG~&1X>>lP($E z-nzcD72i{x_?qc%y)6JV;@Ya)CtFC;qvmzMw%0Di5W#pQp=a1Oi-ix!uW? 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

    7b8EWt68^WdrPzW1 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

    F)dOPbPL-A-_N8^=6(>Ih=%@WprxUB#xK3(g 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

    QJmV0_z$?qJ64;scRF<-%WF?L;~HG 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%0DRjAhywu1x?qR{05%N)h=c25Ymqnq z;VCIJt!yc)j;@8b2yiWc^Hz&fXu~w$v|`+KB#?GM&{7{`OI-t^{gxU8X8VtI9^YVS z-|kjLTWOHK+YB+3m1NZyy=s=d7HOC~g^Fv@%p}Kb`PXc=8s=Y(wkMuD0n{qR=#sKN7$|>IeKZS0CWVeF;3W+!yf+q2WB` zG%^(bZ0ApSDcF4ugz_vf z<4!bji8DMdD*7R$Bo!@=!|^W5%~+YmyDUHC=DS^e5Fgxjdkl8iaprw|`41@O3iFXQ zj#F)%%YjVV&RzRZ2)jqW{;RLfIX%{W&gZW`V9wlF_t4B|$IZ#cx)<&C-PGVxs7D12 zzKeqAW8KlmCLJ)?D`3VD41f=E4?2pmx^CL*$ie$1n4rN{I1&8D`G=oA_!v@%bst*2 z=<|ax|A&)Vmrh0Sv7?{5drp6>d#?+BbSG13{r%0i4)V4f1r7d7^FDX)o9`+uQS`wF z6n4gIEl)Gb(1e?QI+&3t1P%6S#_c;?_d=-$^ey?;n}a_S0zUSutKKagn#W}G0&Fm_ zLz>U4cK~?uLLYz?2m*F|)(32@fSv&#(4zo*&FLn5KXQm-zrk0hfK=2TWJM z?=JTNc?G<6i4Q0!U|xWMt0bAr^;h^9Qcl}@-<3X~q!>TPUYizfh64J&-~*uTn8t+x zfP2XRY!&1(TLCiy0B>)>UYWEKk!E)<$ZS1i?_rRAhe7rm2HAfYoV{?|mJ{?Qx0 zPT>t-2yEUX2nPADW8SJ-=;kMR zWi3)D$zx5qA009DIEGG-d4C%*^mr4uW6yvsn@`T-hDd`}UF|H4dDRAt&8ol8G(_r7 z)+KvnU8R471=tI#E`B7`zwg|V+WKchqzA{=WqMFurdanZ6j8kXz1{=Yc4>(8WP4ps z)9Z5jD09lhya)b*ITRa0%=>sP{&4ZW$`6#aQjW!N5%d4w=D@`NBW

    t~z;EeML$$ zL`4S8Fy{S7+T8#9a(d|KCg*i%bN5g9u__Nk@2UFX&z?S2OG*&`a=O11Akd9 z;7~py==_so*P%y%S!GI```U6pc_-&MN*^C$3?#fV6iheHfh$>ijm#}^(Z^@=iFQKhjn(U zij@ODe-6b={v3oE=k$vLCr4ri$}yO6a`a`K9CsNfM_k6qv6gXilx3V8Ul}JyR>sLO zm2q-3Wt<#G87D_j#>ughadOmToQ1FMqk_+--I7Gb$%Mq(~!5(>DNVgLg|YZ?ThLXjy>&@Teqzk(2i zmRk|(rtp(rWZ5zfVVoEN>%tkfH)dEEV<16}SlqT5uhi{q6^X2*=wX|MviQ8n;-dhF zEL!EivG#vVgds~uogagKhs9)2DBO~I0zeFxLFkF0aOQ~clNioN2@G8N1wkE&@ zt+o3=8pZI(0RP0%(yzIryD6-!zryqI$FQ>FzKS>+#U3^z8!;(^?MjZnMQpjt1s!x` zEZUy!&O&{q3Okucnn-6lem*}QGt9UxC|F-dRAH{HHvb(AE3`E?g3Rv39V6{ds4T@J z`-S!gKL{HBZ?^vu)jfQ^^t(Du{vXbdxgS&kUIz7%O^u3* z;2!|BE#Y3+@5bCu zK~j5`!xGC%FW(WrE%D;QxY#z!E@W$>*qw0i#--ol?Jze+{SM{AOO9e2oEK9Q?-`8I zlFqdlq#3~Uy|EK$JIyGDg1HXMb!JF`xeM2J-v(vrLJ(G3FW%feGzMsvONx|AnWazi@Rx3zB;G&#?xx%Js)Q@>Jk###!s`;!4LY4 zvG{TU^Cv{+0;V_sc+3Zg1AxbUfH(kH>jQj;Q*TW@9!ZC+sY`ew97~%wgA39J*kUV; z=_}g9Bfms(#AX`T6Z&qmxS5gAVJ6c(x*(Ym{9&Q7@)*^7T)){ZLHt#F>;$cI)jZhA0SZ=6 z!6*MU-5~iXm^H*7EuZcwiC@Yte%8YiK2ya3z>_{e99O8EKF;RpkS=N2mP0zksjYgv zWR-u$;M@Y9_u)c#!J?6_eL(G7G(K)6<-f*~ib>B!_*2R30n5#8i;79#?Eq z0P-f@*nZfWhme#`Y*jZ=VzHs^SaA3!Gk(TG!@}}^@TG;N(}$$0^eIejJzmDxbRzYU zji?|tijVtuv=kAI`S&5%0Mq^$%lO%x=3%Vthtuy~#Zf~o5qH)U=qY7vh>qQF?&+2P5(5fOMZo_rIGtv4ObKSV_f6D|!4(el;cgI# ziOa|DLYVh3e&jh0Cq`Dig+wH^x8ZQ#@qO#*d)N2H#c$TFPDRFdo;gduv)Eg>C(QpgDs3VpvX$L0RQ6Hfd$TF=rG$z47P-*>f!JV5>AV$K?z~ zRDNg1J=h*CEwsed@7{x%pT-p1o0MuuxKGO(oBkr?}&~`$9 zL1?u4JU^iMgGjpi96V9CjN#m}BF077x8qw0S@#V5TIePPX&qx^s;}@v8!1fK2Uz8C z9g3{Cs=s1Tg}=oLz~E-8`VwKX3+BB923Qs5rD3AesxQEAdk<}o9&Hq@I`NeJc_@Ez zl8Kes7cVGS73QuHU?CmNo4_MS3|wJVegmXpQoj@XW91GM9pGOx?k0lK4w@q?v3?DU z?KaH%#~uRFQQ|o?=LazitM8Tvt5-c55WknpkCa?U9TFE5g*ky-3rlkoU!s zDf>CA(J}!p$cRj1WlgNC#yVGGz06p6%J**6hxbWvOe?|3B1>hd>9_bBHp#_SSA)Ro*Q?UVu!QOudUmEjZ;Mp zwKbtW$7di=8>oIL;4L9$Cr)fa#K1&Yh$)!zZs46 zo46ltlD!c;HjNH#(Q+0-rm#fxEv~EqdjL3!O_yRL7-!B?`3n>qnMzwR>L*iWbwU}j zjbIokDT>`*0<|^;?bep35)O#!hcjUJIcOIdHlzn00y~W{7di{8CDH6YgdGiBL^Thj zC3qQbEH}24NVvzsg|<_ny43BZ^Pv;xeG&;I!b`xXC0rcYi4~XPz9z~;;rM3vIAFSu z;HNk`;hx6OI6_HztZ%%%zjw{+(0LbuH@(rYCzG=G*S5+7hY6jZQcQhZkclhi&HFmW zG^`|+vBM8n={#^!FDiHfd%OXUX@AO)9nL zW4X@KF0tHX+`7I)EVotv{#J#3jvp7=35U-}(>NqxRoF|_g#AjTpmjDa@|8z* z$i_N58Rgsxe39~*DoV$5Z8OvHiKPxWN}~$f#dF=ITs*h+;&F3k)+9)IEhMH2C52y# zjO*Z;k@3ymQY>-}dc3WJ{FRfoI|(d<0%Yab*~8q)@Tzs{E@-tc2k$A)nFPn)s}i|EKD%dtgSbsT zGVsT!01lgD6>HlcW@#hWxRS`+m;5$S-QxT8&#`90j*$-Hg?7eT0bk8~Bf$Ihj)2IXv-a*n1 zQuK#Dvg)Bh&c6_2`B|U-@!&1$W-@~VM9eGV+b5j!oFsSOWmBFRyhC#*aPT5x!BUG! zEScH=f>?sUz277IzgSuU$Lw$P{bP{U6a(upcu9DB?GLpowjXB@_=o_XPx-*B2*fkl zz$TTmh~M zfaKo56ajuY0PaK}rU#(&_5ipifgEflyzd3Tj}Qn`OaQM6O7uwraZM6{v(QwPAtw`f zmqz~s`eotLYXsu`O<>*;0G}cdD~14e?&MpSEP{XF;{tpo9h0J0v)OL zl(*FZ;MfjOg3eX|C7iR+3#A4wlPECL!6lU%CE;w%DCzceC`wN#$}xx%?nKXKuef(o zHS5kw+cacWUqZQ*!4y-emWi6IkD{naU5iW&M1%5u3~89jh1}237)y?nqy}j9J&c@$ zl2h!_ubS?8pQ}$%)M!VtFiB~?r#>_(!|9Hs29lVzr2pXEHQ=3|YKI=dr1!wa8VOxN zkt%Ex3SEZz<^*Q}s=-tm?psF#NO^A|gM?62z6)utkhSob%uaejx>|dAc5mr8?wUkj z8QB_tKSi735w^D=Yk!6NMsV>h_+j!OVZ<54Uj<>|zb^vz5^()+KR*4R11{6z{D@!v zF(3XBkAJVieLMb`=7C7(V8B-4?|%GEz@HzVY4C60bs%c55p{b}ik5cEnTD^hBsGAu zHbF2uB!9RkEkUml}Ai5nEbB46R8TL%cm6l594H z)WDUEQM5(0o5qmDP3yJx!^V&r_z0qiCcqepy`0DnA|M?NBD{va#>7}1BRs!8^o|75aMkxK0kkgQK*0n~^hd7XK2{^_8% zO*#L>gi6Rx4IC0g%pEjB#6tiaIU-gvO^(%(B7Sv)5!nqZsV|QdF@Erda=a;sI0-m@ z8H+3=6t z+^EC)CTPJvj;xa5#9l``(x7XCAb%uIBVy58DOpX`c&UN!B8p$epjkge!z*~KK*>j>pukZNsOLTSZ9kyP5@x-?7L%iwv9kfrZy9)nRpGZUi^WQbRAHR*Y*eHmXz=EuonnrsX+MNr4fkT)V;j;mpIf65C;3SPWx~}z%3vO8AoO9IX@Hsbe=3X|Q zZEHorrsD4lp)cK7HH&<(0Y*Ik&&JBaBs({;)HQG(z;|Ni%oKCX^cQH?rGA3NmdZ7dtH=h%5O z@c@>9@bj1cY<_aK zyqge~n{FIkR(W?qCXX|K@jhUp0(vLeR(TJimydBjr2N>gdh2 zn6#(nT7A%{05sZ1ALBdPd`G+Q=F(7o3=G2>;9Ds6u=H2R;pPLenorl-txNG3-iMpTFx|r(6-r7&O z$E4hw>kVAfj0=nJ=P(}RhwWo;d{4s|%XZ}`bt$Qi@%=eTqpx(BYT} z{fNo8-bC(|SC&s?XP*!jYhgG&G};`&?J4 z6Au-G>YP);OpI+IH?IHvP-#q7b1QztkJgVRVrHwBL^mzMppl0gl?L}}IME(z2s1}S zIGve<2dd+1<=YdN+JKm%og0Icv}LmY9c%jEwKDjnA&{-(V4P1+&3g%D_LXqBQ&U>z z{gT02w64LM=rJW8ys8#5ZV=lKKpTmAjV$93DWpkkG+cSyakS5Yv1-Xi z7MXB9qawF9;ZctkOKu}keQtRl+b*)yxNGCShJI^ejcKS$>L6e4hRFbpn%|oY$aqs& zvLP8bcke(3h&)^d7Wo`dA`QYY8JJL49O_N!6AnV1@E>ZIFlAkFr=SAn1r>mknIgQo z5^fHuRbo&9R)q=FYC+Ft?WM_^dM{#5QHy$#Pr01e#m4Fe!}NAROVoS*DbPwiZ)mNf zCP-3oL)4%S*%?S|I!20pkx!7~*2l(8QW~3%kz#+RR#QYd|3psFrOAQ^)K@SPjbKVC z?~0O@*i-44xhS43?GvA*gW5J=@Gob+zMFpk&xiTAg-P*Trj&|9(#+}w@=Hg-BoEhZUkzRi)y)D4FqF8`Hxh34q# zbkF8To45=T;HFv@g$DPh>87m0&3!tlEV#KZS0!0+e}--mLZr+2@-Lu&us#8ML+UhX zlrBJpllEwf!#QMlUlsQWA05INMAu zN!0}Q@?)4@JAx_G85ir31#J|zN4YW(5k1?ZtQZK(6pI^MCGUIK4v2|o-t8zH=EI`s zW6l>?X4boDNTd3341hey%uHIj(Gp~Ia&BT>*rd9!$#r45y09q=FJYdx$F3t(LLtHS zs7yjo(LT0E!Ogg+m6siyymu;AEAk%qybvnC+(OEGFBXaUxcq)vaJaFR_qdalm(8QR zce~(o&nPcDM|s(4%6r_{%6r_&%6r_p%6m5o<~5Q6_pS1>Rg{-Xt^4)3F_iZ%lN{Ck zJ%Q-&EdqzI0EZHr_Z}3;>*D^W{ASaDYs#X(I5%8~s8o=kfZML^pRn7i|L}N_2BWbrI`2(H*-ywe6f865SV{b7FqZgoJM0 z?utci1r4^rIj|R!PssM}Ag{#KScBXR7~lno3EculY}wo8?x%tVFJkOgL3!oM?T#39 z5hc+rd%I)ADOsRYS>@M%J{YzLo*QVv`$Slkk3LT~(H$IlGHtR4|%mv}XaFAK`(qjtYy@Fj_T z+0?IpS@xrqU4sV_YahY7=)_llyyyzy*$(^u`W_Pb%|&nB%Cu!48KXa>P0--?Nn}=H zZS}LWZX3k9EQ0anJ)!CNTIHru}E3zyGU0e1HjkA@-Xe4B`SD%vkfn>=(Hty|2I6;GZkgRP5h1=SLACn;K>CgOb zkepBG9`_pN)dsA%G<@B?l@f8!CoXzGfiSW|{R^Rx+5;!D4wpj)KfWRdJWaCxfw+N)L#YGP&@J0d`2#`ui zfnOvL+c&_ZzEU8Jj3NUp7Rnx^c_x7o0oJz2PbQEhhmH-P0da>t8|Mb)V zI;lu5pBnfKzlGGmS@@zmIb(9FP{}1zg;R3a;XXN+P8CkbwWJEi=UP*RV{)TXg(KMi z9F`lCDjbw+OBMFbwWkVuZI=RH%K(&cyeVAOKBuZkui$mXnDl@ z;`=N!n8w3_DQ6yj)^PPi$N2h^rw+CmZkCljt`&r!W(a=Ob4><1pSUs=*I9?+3N$qH z2tj2syOxtpIlraD`C1N27lUPRZ@YuYfOGR`PS61*#QLCwRID1p9!L zyFGriR65@?02W9meFng?=nM}RI_p*0CWNynof9^OTqGf!AvT6^a#AauRg|5jD(DpzhT;fynu6bf)?t#8tbv&{w zrXvNkUBm5E?d@!s7np*yM%@#@9QS$r%s&BLxADJ7KZggVLRP?ET&(TH`v(f$ecBkD z)auO0>0Du#yuYygHd-~saK7bus`E@bi~Gcdw4rDUODZC{+M*~Y zl84AbUwmj=AmG`ix%jvkRHS-w@*9JSlnO{Z<6`8IN(AXO*U}T(-dlQET&JrOI zdpe>jy&vjA8{%z+Yd}sDOlzFl>Q!>a1ZlnoMmn7_T)VxH+Y6Z>)u;ScqJlKWTm3VP z+eZhOmiv9Qf%#v;NWCT-9cV8i5+VXmLIm*WcdS@6f^ZrIAs4rz-jpV^!Edq=!8Q$t z*}R+Hfp!sh^Dan|dO!vceCwsKq%EP1>J?xOCBVO=i-A$9w{U!2NHP?%k7^OGpy*~4}?eFMJ4c4^%7?1bCSV|OSef!mVS6vu&4@5bg4fe#F4mG_x)9ic+RnyTDEAAf7W^fZNGv3y+Ap(*J)4WI0eR&xVoqz@*`}QZ%fyXIM z1FJEZzYMg5yqD8E*MvHk)CXP^_GTKRUQieH9QtZepW7Va zl(vZej&@-mfdr{t7%a)W(*s{KeCG!~P1uaJw5K>ViJro}6UC}Ms-~Slc_~yv+7hFW z;;4A&NGgu#iZ3GvR7F5rn$2rys`S2sEN$m)q>3jenfAp{eJzEl8hSrMn+0Bn!|_Cm zwft}n-g;t+`g@?_C@T-ZNshr{jck6P3rCUFYrRxq`Ccm zM=Eaf59&O^zfSlu7i*f2k(w0Hc>o$l&+(@a{z8-T{a$3Pe18wT4fAx%?)NpHC6LD9-!z|rY#Ci_4Btjfa40}J|Z-3MG18RJG*zgV0 zYw)e_zbCI!P3g^$!}MmzVcKweoMGD4V468*CbJWsKU>s;@$0V}0!HT6iA2%G)>pb0j}1lyvKiGo4)HUqi7WY~U?cO;}_@nLds zZtR<=S$+B^v8`2*B9W`_V`N;}8%$ z{1A#E2YWi2V+p*l*P=u6wq_w;F1=Z;?;*_pFb^PhCiR|(y7Py)7-L;eTytPyFK^A$8RRY}uf_b3bu|ynYF#e9yctEE$2( ze@BXOmkb`6SAfa|cYJiH#z9d`n`B_$g`35_*^S%-GoaHg?9wm)QH^aczZ}VuPpk2A z=1lbGMjk8YruEjA@~yZGq)MM9F!r{xU;>_YfVW(x#+rCr-C{>=B9Ssv%yf9Lc^2Y^ z<`;dZSh1+J9P?NUjgof@LQ%_&&o8mB)DzA!<=97CrVgRArTEZlbkvx!U5k%QMdH#Q z25Eix12Qo$Uxgv*Jz#Y&Qmc)BYg9s7*Fhr}#~7-fLnlA4k;(;T?()K^Shn)1^)!cx zOPf&NGL@+tVkf+}Kj06(LmcQE3>Uw(K1$sXxqtz9v@?^Hfu0V`!s+yf)9DSfYFx}a z9khi9=rR~CwBjhaOloC}j(ar3Bl;VIy2iyUspGd;Uuaf!b*zF?<6%(Kn_HQOYBf%p zvC&#(zr97ZYLxd~DEvsZ6y{OVrywrfB&2S?ZIPRbNnxJY)IWva5cM z*=A2BG})Ux8w*xHhFBGvIm$#}lO z`R@*^LEB1XRC}e?eHkUdnG3v}CvO+wi4HY-6bFo@Bmh>tim?boL+3?CX?A{#4+>ks zJ9`>M9HKWYIa7Z%b+Y>s(Bv&;+-t+l`*gf}@70seo-+{d{^C==nKq{@-aYQAgPKaq z)jxPHQW)T}X}tT1*Zy!wX@TO43E{x?0{{C1sfXu`jd#x*DqK|BJKjxy=@_x)k9W(} z^yA{)mE)g%we*3)X)$m5r!l`nimAROg(bMa*}smy@9@ImF|W+iP!hUV0XIGGk@vmZ z6}F3c)^B}pU!gDNUHlc_JGn49=Iw?@VKnaO0 zlg{g8hw$WcSk3CgGH?tJ)H>GJ^I;)J-r#03F03U&Y2s{PIK$oR0C&D{(*>U{A1xSKaDu)Olx6k z982T}A#gcvXlRn^H2`-hM29zHV1+IqVfI=)dnen_al0*gh5I2SBQbepM-dyDaU_m= zIbbZo1#9|*nzrcnm!US40*T3cJ#q0{Of9r|#jKmaf^+epI#94?TpS!3u8WG3B}w+w z&co~sM6M4GS z-Pmpt0I9irD$AF40#2b#lv@y(#|9{Z=Ay@v$P`h+jEvH5t{-v({dSth*0$DSi;_!7 zjX1vrn~OL>&D3$-9SDkL7pDq~GU>uhACc`Lt^&bEs&Pgoq@CcxRDcTY@$6ygxPnwj z?l;OaAbY{7-~fo3rQ~jq7~BZR;wUk`3J$7!_I+IFT8a8V$A?#3qxt*ozUHW$Zz=Md z&C_4B#==mO;r6oaFvyO|uS>-qijOyZX=826v9xW#s|_V(FQW{nqVmD1Oh#0V6<57g zmvCnl?*a2Dq|h0hL%0ZXA&WC*J%?aBTeB9?=mq`E0CCmXP4$SH9uV=guxbZ!0D$L( z6(9}(@WikJ!~sB`4-m&kEoUoaie)&-?w8Xq z7qDx9T)Mjpn zBuu#HVyd&c&`GD%W8&F3pL?ffzvo9&X z53MhS%WV(C7jvw|_=KXy+&z$R+K!vd%4sCp(Tur1^rO!8Pm$TGd3v+0*?+Sg7eL&o z^V7MOQ(%GIcR@Fp-!U^8S%5xifaOg^T^oU|19?EKq-Yjr01$m=PGTxlf8F&+Bmy7^XXcCnL( zd*E_ZhYB&?cEK197eoXohdB=18fplRbCa3_zk*3U>AnIVJWWKE$eK%eI{@7A_({4J zez|p?YKysTs&nzp|K}wbdSOB8r1tlzTR6n3>LaS34OK1utyf1i}y{A%JMNWXu;SAVeYX= zl$H6U5jBooH`Xo7`lW~s+Xmcrn=kS)pX9n^V+T5+yw!N_YC-K~Wk(Xv{V51lk z)7l2x7j?)XgT&4Oh+)PpMy{QUxaPPos!_(ElThwqmfLcUBvq?3F9Jwg-eW9jr+Xq2 zH;>4m(3wyLn3`};LX2%EL-~a}MW;Ew!Dj%rJIR3g*8D}SB(f^zP#_ywmRc!f!BHVd zCNO%=WAHAkG9ND9fU_zDl*Nd1);WO6y5BggU=gh%G4k-p$P-lL2ig&tXcdW(_ZS(u zTSW#YUL{&ZQe%Q8_YU@8TM}NpJDqLLFtG8#lu1kn|ckqdR}-{Y05x;Paj zX5tH7-V4yYy!Q|J%^XMnZ2sdFm!#J>Fu` zi38<#nf#t9zZdg&CmbR*=iTpuyNEJzmVr4uKRN)7If5*!HPWD}Ku?YZCZs3M37ixC z0N`~(Z(q>kKMUvC&SEREt5=5AeLK6AS+rf_wIZTR*Pq1#a#}# zRzHF$TzaO%D z2jzdIKK(WCEd9Xpu>1;#zk|%Z`o!JaZic3)Nslaz*G_iXfum5Cx6eabAu(~w8GlQn z6i?3MrJbGWr%oW9;w{w6m?D>PRzrw%2un5e5QtgMnjefzg@Bdpw(S5u)l7Bb7xM%+Sl8%qb$4h#7QG zVPF-{^xRq>(_KN_f#^^r=BWtT&PnL0crL|?%m&YUqmNSOdn|cmrnxXCAur6dV1*I- zjB|@(8@Ke#_H?2Md%Ea%(vQUR%I0k=>>Mgv{-n1I^l&k#y?h3;z=TdRg$X@8qO&U= z#=*_1bW3t=A0&&@xhZ_0orQP>WV8m7oamm35TdO_w9+>9e$I7->l~46EM-0}GF!iq zgGusfEX)$Cd);fj$_Od{D+3D% zXMqd`Q?iMpIL@kCZ~?ci+*-Jw;nfI(s(UtE?ce_U)-59~<`;u;+IH(tB)7Dt)}nPa6*H1DwT1zA4Pr_9 zyl=Yg{``Q%sE};_9L>~vFy-BVA6t$uxNDKnQU~$5)>T1IhkMNJflXRGtS!Y!pM+L> z4x-ChZPii5z1f7yoG0!L!LK7P4M&!Jy)pQ3<0yXeV&F-M76qbbsm6}Vh_ z@Q%2bL|UDwmt<-&g<&-(%k}08?s%r_A2CG6v#Yedq&8iSKqFg@> zlxqUpx-H-I?9;?fW4}t*>3k92@5RNs+(L@?H#Aiq+{di~_6B^mQP6~`Gt>Kq1*B^h za$>xioNf-wNrC}6N%(GGPG?h2(W*x$RxQ&BN{#&k*3=r+xumqc^eILOgof=+^8uum zf5qqn8mq$i8o)GGh4I6ZO?N|cE0U8$S8<&EAc_3fl`*KQV3qO;2g)lY@fLut zZVZqUV^Xgejjr(Lx3|wxZUI3__$rl&(mA`j1}R6%=OXM_ic*diK^obJMnhtGzqv3} zSNMtfi&Z7dw?<|LR&yB3c@K-PtAC4@f^gPZT}uW#tLM=1E((=ivO}pEg{5blx_;qY zCUd^hs9y-6uJx6t1{^7r#${%TTA3LNml<8eH)~v{CviT$(I3 zRVZPsCa*y>+{)vxT|JM5j8@O56RWPHgLPqiQ8%dB#)Tk-S|Jz;7vf1>Cz6v=N6Afj zB}e6zOuc{93fu5ORT&juQL{|eKtC5i3L24LHV{Y7GSlD9D^w6L4$F@;rOY!Qb_VO5ybm5dk`QhG8> zxT@IlC5`)DGEym+wVug>HrDoM;Wuc>3QJj43U3ke)s5U2%Kc%XNH8E2jW$BrfV}dz z2MT`?%Zh2D{@9TLfx)W8M4M#mx*U@OECOFk^XFH7Ncg;o?g$P<#n5^L63^6azZ3kx~e% z0PjDj@m*rr-j7EUizK}h->|%AP+@GX0!(35hz`rCEtm2uQ;2s;_LlcVtuznnQBv?i z!;Fns@D`GCyx}%1rG@7WOu)WExZ12$=0X5h*pJ>!WD-Ox)&(j-r91sNo|XrBpgsXxjY(~$Zl;H!Qt-Tl1tE$)AT8sUeQDSPH3P!ziw5WPI9*k>hx1NDoMc3+8 zI1465Z>1`em~dsvJoQX=RQNXvKXMNyralqus&EjkevrivWD-(He(v%Ob2Yp?0_j9+ zb*(;zsWWR-w(mS&jMnvqe5d)h43Xu#xO^WYRfi(=c_e|p*Ghw13)kIw`i2&`>g*N7vl!kLELuibYu<35c z>Ly2+y7h1s+NGI+;uDi|3%TFNS#VyKLikCkd~90zwp^>)yNX3#G4-CCpzkI+-aL7o z*(r8Y89j=w~lQ zlQ8{23|%Py!AQ@4gMPpa)mjo>chIZ5kWhr~-5F2n!?ko(j<1 z?%t+eALD3@1<;&{)_O+s7Ly0w)pRZZch2LOb?4Q|OYHKu@U$LwDSnP|!Kq*f$#>#z z#^(_#!P27Bf&LKhn7kV#HeLc^wFz1W`^DO#o&*CEv|3nA&?Jlr+VY@4#?;772$Pdw zfLtxC$VnLFE)J6GsFBNs$w@Fkt`=70Bn)zQ1PQoC!BuK8aMsD{oISB^H)xwIL zghB4|Ai421a(jl!NiaaJ7FOgW403k|$z|kQWe(a3zg2ASH6YywcxEjr8yT?3W_xdr z09rP#c|@H-sx>A%SK)mbEI!J6np->;wMz&vN)Oj{AP354%XO;Nb4eOH-0AS zUW%CReGp9VJ~${ckhLmTLi8Gb8IiKD8#+$Di8bnA?JB)y4^XKxEXT9F04@1^}wA}kZ(9Qrf-DlT-z z-Dly!afK@(pM;v2W0M*;5T0Yl`*IM?AbyY^)%TeHdWB(};nO0EtpDt3w z)aIZ=Vt$G%R0?(eX#l+J$NDON5?NI#Noz-Z3F4QpL_7>$apzE`79nG)iZR3jN5(k} z@caOVw^-I$Mn7n=d>Abv?*`3IoU>NB;9Is*r(=*;9vErn7aRS~y2E`)o z+t8IYiZVZS){%F$|9(KE`3N!PjJwTJv?EwFmg_;pd5)ZDA!H%$HK z3o2SLvf}V!G_1U)TmH|KA11_f`HzcC-54tWQ7r#CR;GLnvaeE)DVMfr`8*)p^NGcW zVpb|g`T*{YQ@^bWTNj@wr)zEaDAK#v;^)6W@v~9)W1s}hH+=U-rY%;wFWekQzPvEk zotY6#FK4u8M>dwxSXb3-Bm3(ld+Non!NU^hg(_Bap(`Qn8ShE3Jtu4JIpMeG5f5W) zy6(q8RdfrpE?>7gqOj>zIISJ8LT{0KWq+sEeHlNS7NGbYu(swB)DAmkTR@;a(UFAF zu7cB^Y)@^0jVg^!yVnEj2X0_g+=A;!wWr#Xn@=Cyh6@Zw@U~k!rksNxW`kC3qSmj7 zY)_)lHjEUSG&-E$p`IcwW%C}b3;zXG?tVg%9l_JO(KvB$loYg8uoQgYtY>>*VEYsY zHXMeQ-s9UC5|0-Xqj(WU&5mzEVpVq*&OXW5+#os+WC{gXQIqksN&0uJCFxGcJqx69 zn0vnEEQZ`%v18cm9L{s2w;&B}KS}ylf7n+kG#J*our6vcxev7bz*gpHFrQ@LDxK(7 z1WMy|;5Gzoxp<)LHJTLPhsOBHZ)ft?)WJvhQsm;nn6{o%CA{xIRAZY0vYUEAq&9g` z^8wx)|0v5~S3k<;9<5#rheIEObR|4jbskxVy$6oitJ#-b{g_H~9i3S9<8-h*xJBGp z^?JDZ+tpV}vvUAtC*3y2s&$}Kz60!+VHrE^ewqcL?!_Wl+lt^7WLe85!6Kdkk!&iG zOGPrNNEQ`l;BpYd@%T_AL2%sZ>MXB;lit2p^Mr)<&TW~H)ZT(h7I)u=NXqXX1TVWk zW-0;qGvKcO5w>J1=b zxxYeyvSbLZvmROGyS=q%;I#AYR^|057W=TPz-U(G6Npr5v8?j%5v($#V4TJNnlU;B z2zF%s_;R@Kg}fAX^?tN|rfl%g<6*V>%s9U!V+rRX7EIOSm$ANp`7!RcWiYQIjhek1 z+}K?UG;Ae8TVH}rD7PHxMz<1y-3Qv{ zk$-HXu$vMoqI|Z?CuAp2=bfX?Ac_hSb5iRebfx9C7(LTQ8g1tTD7MU>n+p^4c&m~m znp%a2*O^Rc>a8`$&}O``G`izXc%YZj3^u zGckj^2c9ZHR)qvytT$q3Ll&iAoU>$i!UnLyz$7Ucxu=&>Doz2P=vr~rIN`2`o88e= zXbMm(jP)KvRXOKjIiUPUegx=@(P_x(J;mNuvgb4V$x!IlQ0TT$=yrxSXvVhi-iIo< z%4Em*!%%7b{*FeDL7U(|^qPM8OzEnWjzO?^&e@oZZ20pyJdsq&_HTFso*nV~@G(>V zEXJ0;jl?(}CoEDZBxjvEo_q>+(M9uaBd$VeBC zh_qp3qzgtwS~oIMg&-r5Q&?2A2^I`z%Na5#D}=IxC^iB=-q!_VJD=mE4JVZ`X=9)B zCA5Qs*ssF)v$uoI6Qe~ui%-U04vq^rr_%y$jzPpT=b)_@PDrTXe-@DLvz&Ag-cl$e z6}%ttR@}9I9fff20@EE)*v)X`Xz0a6Cd~`!3zF&{z|XgLCL7qN)3*dZw!Kr0B>W7+ zFsFOHcwX+U%UHKhWcT&T#u|Ijv$iNd76zS|JO`t^Wpn}<^t^Rv z@kIAn1iZW8m2(lwj^43=>5}uc?YPXSY7?R6!n?H)I0y2!A+bz>dZ{S!qS&0c^a!%_VA`g7OzlcfRaVdS+DF3_;rOcQ72c!J*2*D z>6-S<)Pmm!TGnDE-Mw10miZFKT@WQGSL;RR=N-S~!b0QCc zhuRk$%vyqc84le4-^5_w zm)yI{)QG48d`uj}qY8-f;4^(A`#-z-d6xBmf;*801VyFkrhdksxyvLG2a{>>CX17Yy_U1DRkT8w{j_fhEB}PcVR9zs5mZFfcY4 zm=O#d6b$5ofoL#bGq6gR`{M|>hxOxUAN)9<=en6!kF%XSIX~MEF~SKi-$_E^f(efb zQguzjaApMC&j0c=3#D1#I1RzUG#nq7sO~4?{am^>sYWSjl{EInPmmb_O7Yj=W2qqq zuLCJP@u}EK9BR$%zbe10{UV0)BUtAbs<+Eb^ak}tTu}U>gop1WA#uTkl;@E~p3l|E zvqD0Yr*IIIkzjnCa@N*KHjEBy0dYYNl#G2In$G5MRjboeM&&^;qw^3(hj}0_$U{gI zuVRj*8&(T~8&%T>P4ouUL|ibRP&Hk+lZ3>Ln(+PMgdyfVg9|fHa3kiIo9GRgCoafC zD4#P;!f-wWH_GP&CVGQ>hzsTu64K_KBqVOsgvakBA#uTkp^~jI3Bx5LSeGmm{kX=_ z32r2aYfSV8f*>x)R;aHl)wPSGNvOWB6ChRBsqgD9Hu;82MQ|fFFEP;@ut{8yO_}rh zedJFZzWP>czweMwzXV}E32r3)j~YJ1(Ftx8{o2OS32qeqV~wK|+$j2WjiVFXDEgMh z(Ftx8{o{?J6Wl2JX^o>3tfNc4`Tg#Zb^3Ka(^J1h1A;Xw7*R6LCr0%BVRX3PB`%~o zVcpqO$HS3^hhX*sY^dWtCaequH!ZwUhk+Y%LzsD7WSllM`iRbRgXY$$IZ6XulQMx0)- z6HbW>aT=P_y;aBO>4wh{?OHIxY{PaPMu*!qaX}VBm9o+B9xf`ujdbO_#?c9G6n$;u z=ma;4zN~R{f_3z|`RGJ1JRd!l1RC~>f*DyEe}4x;({!Mct2?;yc0KS z!Yg-@khoD3ZrVvg;zmulVJ8WR3nmOTkyA~=u<8=*cL(8q|KoM_as(;V_xl2rDyg4` z`&hS?&xQ9d6r(HrDLTri)IPF=B+gv5=S z@W!1aBrcfHtoq5ypkDRMx|efdj7#<$AC_liP0q_MgRfINw0OlCv1-KPXdObG^@U|@DIFh3YLI2c&UfS)19k!WNJ%9_C07@grhh|=dBG&iz( zqWeXB`M{d$5$?CJ-N`!QIj8&JF5?~|kJ+cauc4=CkrPfy*{#XSIjfBP%2Qyq!*tks zkuq`9H&wUk3q#X|;L$fcAl4qMJ5-kFXMg)+gWM{H3m8QN-s74%@K|28zUeeBgE*zV%D7O;m-AS^OJdB1M3(F z=&G-a+wK1Ce5i+ev5`n`WZYoHz5(Yo1L`33_XqZH)Gyz2k?Oh;S?kjYIG-km6Y*o= zZ2%avh)3`d4Q^@ODysf1hL-tTiQiBH`Z^rOc>q|e z^371_TcOamL!o;^q3?u3-wlPn7Ycnp6#4-}2U-;}qsE9#RXF1JDUOgtj%594{CFC1 zCx-@*B7jWl2>l479q^=y+=|F7xC0~7L@f-liPS&x5{DxdU+Vi;sN^Q zFqFjv^vy7o#RW9KCPbIT2K2lzl*I@1_Ar!UK>L)E04=HHLl4A0fTtq%ryct4J&aPRcV*^a`mxS-z61(5*L@rhu+An3=Gda{ zbD)CTA+OFxo`LXR>%xCycyE;hj!)awUouOab$^=7qGBgvu7R^Qk)xyylTr7}9CHhk zadqP>@bLok-EfO7+T;EMG=aQ_d_4@?tC1a<>p{qzXfpjoOCʉ`c7vnnjQ?Y)Gu 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 z

    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%0Dk7&8`FN^LG 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

    JA`^(Lnv*yX*=dWMP)AzZUaV6wd-}L=-+j!;h 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
    b&lQUdZlz`98&M@mL-NvY_71Ff5e%B6HPCS{;g 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᧼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

    Uk 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

    OB|| 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≧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